diff --git a/cmd/workers-assets-gen/assets/common/shim.mjs b/cmd/workers-assets-gen/assets/common/shim.mjs index a3a483a..f632a07 100644 --- a/cmd/workers-assets-gen/assets/common/shim.mjs +++ b/cmd/workers-assets-gen/assets/common/shim.mjs @@ -1,8 +1,6 @@ import "./wasm_exec.js"; import { connect } from 'cloudflare:sockets'; -const go = new Go(); - let mod; globalThis.tryCatch = (fn) => { @@ -22,6 +20,8 @@ export function init(m) { } async function run(ctx) { + const go = new Go(); + let ready; const readyPromise = new Promise((resolve) => { ready = resolve; diff --git a/handler.go b/handler.go index 87398bb..8814f3b 100644 --- a/handler.go +++ b/handler.go @@ -12,7 +12,10 @@ import ( "github.com/syumai/workers/internal/runtimecontext" ) -var httpHandler http.Handler +var ( + httpHandler http.Handler + closeCh = make(chan struct{}) +) func init() { var handleRequestCallback js.Func @@ -40,6 +43,15 @@ func init() { jsutil.Binding.Set("handleRequest", handleRequestCallback) } +type appCloser struct { + io.ReadCloser +} + +func (c *appCloser) Close() error { + defer close(closeCh) + return c.ReadCloser.Close() +} + // handleRequest accepts a Request object and returns Response object. func handleRequest(reqObj js.Value, runtimeCtxObj js.Value) (js.Value, error) { if httpHandler == nil { @@ -55,7 +67,7 @@ func handleRequest(reqObj js.Value, runtimeCtxObj js.Value) (js.Value, error) { w := &jshttp.ResponseWriter{ HeaderValue: http.Header{}, StatusCode: http.StatusOK, - Reader: reader, + Reader: &appCloser{reader}, Writer: writer, ReadyCh: make(chan struct{}), } @@ -79,5 +91,7 @@ func Serve(handler http.Handler) { } httpHandler = handler ready() - select {} + select { + case <-closeCh: + } } diff --git a/internal/jshttp/responsewriter.go b/internal/jshttp/responsewriter.go index 90fd9d6..fe3dbac 100644 --- a/internal/jshttp/responsewriter.go +++ b/internal/jshttp/responsewriter.go @@ -10,7 +10,7 @@ import ( type ResponseWriter struct { HeaderValue http.Header StatusCode int - Reader *io.PipeReader + Reader io.ReadCloser Writer *io.PipeWriter ReadyCh chan struct{} Once sync.Once