cloudflare-workers/internal/jshttp/responsewriter.go

56 lines
1.2 KiB
Go
Raw Normal View History

2023-02-23 23:20:21 +09:00
package jshttp
import (
"io"
"net/http"
"sync"
2023-04-29 11:56:21 +09:00
"syscall/js"
"github.com/syumai/workers/internal/jsutil"
)
type ResponseWriter struct {
2023-02-22 19:23:56 +09:00
HeaderValue http.Header
StatusCode int
2024-01-24 22:05:49 +09:00
Reader io.ReadCloser
2023-02-22 19:23:56 +09:00
Writer *io.PipeWriter
ReadyCh chan struct{}
Once sync.Once
RawJSBody *js.Value
}
var (
_ http.ResponseWriter = (*ResponseWriter)(nil)
_ jsutil.RawJSBodyWriter = (*ResponseWriter)(nil)
)
// Ready indicates that ResponseWriter is ready to be converted to Response.
func (w *ResponseWriter) Ready() {
2023-02-22 19:23:56 +09:00
w.Once.Do(func() {
close(w.ReadyCh)
})
}
func (w *ResponseWriter) Write(data []byte) (n int, err error) {
2023-02-22 19:23:56 +09:00
w.Ready()
return w.Writer.Write(data)
}
func (w *ResponseWriter) Header() http.Header {
2023-02-22 19:23:56 +09:00
return w.HeaderValue
}
func (w *ResponseWriter) WriteHeader(statusCode int) {
2023-02-22 19:23:56 +09:00
w.StatusCode = statusCode
}
2023-04-29 11:56:21 +09:00
func (w *ResponseWriter) WriteRawJSBody(body js.Value) {
w.RawJSBody = &body
}
// ToJSResponse converts *ResponseWriter to JavaScript sides Response.
2023-04-29 11:56:21 +09:00
// - Response: https://developer.mozilla.org/docs/Web/API/Response
func (w *ResponseWriter) ToJSResponse() js.Value {
return newJSResponse(w.StatusCode, w.HeaderValue, w.Reader, w.RawJSBody)
2023-04-29 11:56:21 +09:00
}