2023-02-23 23:20:21 +09:00
|
|
|
package jshttp
|
2023-02-22 19:10:47 +09:00
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
|
|
|
"net/http"
|
|
|
|
"sync"
|
2023-04-29 11:56:21 +09:00
|
|
|
"syscall/js"
|
2023-02-22 19:10:47 +09:00
|
|
|
)
|
|
|
|
|
2023-04-29 12:18:34 +09:00
|
|
|
type ResponseWriter struct {
|
2023-02-22 19:23:56 +09:00
|
|
|
HeaderValue http.Header
|
|
|
|
StatusCode int
|
|
|
|
Reader *io.PipeReader
|
|
|
|
Writer *io.PipeWriter
|
|
|
|
ReadyCh chan struct{}
|
|
|
|
Once sync.Once
|
2023-02-22 19:10:47 +09:00
|
|
|
}
|
|
|
|
|
2023-04-29 12:18:34 +09:00
|
|
|
var _ http.ResponseWriter = &ResponseWriter{}
|
2023-02-22 19:10:47 +09:00
|
|
|
|
2023-04-29 12:18:34 +09:00
|
|
|
// 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)
|
2023-02-22 19:10:47 +09:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2023-04-29 12:18:34 +09:00
|
|
|
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)
|
2023-02-22 19:10:47 +09:00
|
|
|
}
|
|
|
|
|
2023-04-29 12:18:34 +09:00
|
|
|
func (w *ResponseWriter) Header() http.Header {
|
2023-02-22 19:23:56 +09:00
|
|
|
return w.HeaderValue
|
2023-02-22 19:10:47 +09:00
|
|
|
}
|
|
|
|
|
2023-04-29 12:18:34 +09:00
|
|
|
func (w *ResponseWriter) WriteHeader(statusCode int) {
|
2023-02-22 19:23:56 +09:00
|
|
|
w.StatusCode = statusCode
|
2023-02-22 19:10:47 +09:00
|
|
|
}
|
2023-04-29 11:56:21 +09:00
|
|
|
|
2023-04-29 12:18:34 +09:00
|
|
|
// ToJSResponse converts *ResponseWriter to JavaScript sides Response.
|
2023-04-29 11:56:21 +09:00
|
|
|
// - Response: https://developer.mozilla.org/docs/Web/API/Response
|
2023-04-29 12:18:34 +09:00
|
|
|
func (w *ResponseWriter) ToJSResponse() js.Value {
|
2023-04-29 11:56:21 +09:00
|
|
|
return newJSResponse(w.StatusCode, w.HeaderValue, w.Reader)
|
|
|
|
}
|