2024-04-17 00:59:25 +09:00

65 lines
1.3 KiB
Go

package hono
import (
"context"
"io"
"net/http"
"sync"
"syscall/js"
"github.com/syumai/workers/internal/jshttp"
"github.com/syumai/workers/internal/jsutil"
"github.com/syumai/workers/internal/runtimecontext"
)
type Context struct {
ctxObj js.Value
reqFunc func() *http.Request
}
func newContext(ctxObj js.Value) *Context {
return &Context{
ctxObj: ctxObj,
reqFunc: sync.OnceValue(func() *http.Request {
reqObj := ctxObj.Get("req").Get("raw")
req, err := jshttp.ToRequest(reqObj)
if err != nil {
panic(err)
}
ctx := runtimecontext.New(context.Background(), reqObj)
req = req.WithContext(ctx)
return req
}),
}
}
func (c *Context) Request() *http.Request {
return c.reqFunc()
}
func (c *Context) SetHeader(key, value string) {
c.ctxObj.Call("header", key, value)
}
func (c *Context) SetStatus(statusCode int) {
c.ctxObj.Call("status", statusCode)
}
func (c *Context) RawResponse() js.Value {
return c.ctxObj.Get("res")
}
func (c *Context) ResponseBody() io.ReadCloser {
return jsutil.ConvertReadableStreamToReadCloser(c.ctxObj.Get("res").Get("body"))
}
func (c *Context) SetBody(body io.ReadCloser) {
bodyObj := convertBodyToJS(body)
respObj := c.ctxObj.Call("body", bodyObj)
c.ctxObj.Set("res", respObj)
}
func (c *Context) SetResponse(respObj js.Value) {
c.ctxObj.Set("res", respObj)
}