wasm-http-server/internal/whutil/response_writer.go

65 lines
1.4 KiB
Go
Raw Normal View History

2019-11-27 07:22:07 +01:00
package whutil
2019-11-26 23:35:43 +01:00
import (
"bytes"
"net/http"
"syscall/js"
)
// ResponseWriter implements http.ResponseWriter
type ResponseWriter struct {
header http.Header
buf *bytes.Buffer
statusCode int
}
// NewResponseWriter creates a new ResponseWriter
2020-05-28 23:44:27 +02:00
func NewResponseWriter() ResponseWriter {
return ResponseWriter{
2019-11-26 23:35:43 +01:00
header: http.Header{},
buf: bytes.NewBuffer(nil),
statusCode: 0,
}
}
2020-05-28 23:44:27 +02:00
var _ http.ResponseWriter = ResponseWriter{}
2019-11-26 23:35:43 +01:00
2019-11-26 23:50:43 +01:00
// Header implements http.ResponseWriter.Header
2020-05-28 23:44:27 +02:00
func (rw ResponseWriter) Header() http.Header {
2019-11-26 23:35:43 +01:00
return rw.header
}
2019-11-26 23:50:43 +01:00
// Write implements http.ResponseWriter.Write
2020-05-28 23:44:27 +02:00
func (rw ResponseWriter) Write(p []byte) (int, error) {
2019-11-26 23:35:43 +01:00
return rw.buf.Write(p)
}
2019-11-26 23:50:43 +01:00
// WriteHeader implements http.ResponseWriter.WriteHeader
2020-05-28 23:44:27 +02:00
func (rw ResponseWriter) WriteHeader(statusCode int) {
2019-11-26 23:35:43 +01:00
rw.statusCode = statusCode
}
2020-05-28 23:44:27 +02:00
var _ js.Wrapper = ResponseWriter{}
// JSValue builds and returns the equivalent JS Response (implementing js.Wrapper)
func (rw ResponseWriter) JSValue() js.Value {
2019-11-26 23:35:43 +01:00
init := js.Global().Get("Object").New()
if rw.statusCode != 0 {
init.Set("status", rw.statusCode)
}
2019-11-26 23:50:43 +01:00
if len(rw.header) != 0 {
2019-11-27 11:20:52 +01:00
headers := make(map[string]interface{}, len(rw.header))
for k := range rw.header {
headers[k] = rw.header.Get(k)
}
init.Set("headers", headers)
2019-11-26 23:50:43 +01:00
}
2019-11-26 23:35:43 +01:00
jsBody := js.Global().Get("Uint8Array").New(rw.buf.Len())
js.CopyBytesToJS(jsBody, rw.buf.Bytes())
return js.Global().Get("Response").New(jsBody, init)
}