diff --git a/_examples/hello/Makefile b/_examples/hello/Makefile index 019492c2..3140ac9c 100644 --- a/_examples/hello/Makefile +++ b/_examples/hello/Makefile @@ -4,8 +4,8 @@ dev: .PHONY: build build: - go run ../../cmd/workers-assets-gen - tinygo build -o ./build/app.wasm -target wasm -no-debug ./... + go run ../../cmd/workers-assets-gen -mode=go + GOOS=js GOARCH=wasm go build -o ./build/app.wasm . .PHONY: deploy deploy: diff --git a/_examples/hello/README.md b/_examples/hello/README.md index f81b3ac7..8133724d 100644 --- a/_examples/hello/README.md +++ b/_examples/hello/README.md @@ -15,7 +15,7 @@ This project requires these tools to be installed globally. * wrangler -* tinygo +* Go ### Commands diff --git a/internal/jshttp/response.go b/internal/jshttp/response.go index 93a33d9d..484c83d0 100644 --- a/internal/jshttp/response.go +++ b/internal/jshttp/response.go @@ -52,13 +52,14 @@ func newJSResponse(statusCode int, headers http.Header, contentLength int64, bod status == http.StatusNotModified { return jsutil.ResponseClass.New(jsutil.Null, respInit) } - var readableStream js.Value - if rawBody != nil { - readableStream = *rawBody - } else if contentLength > 0 { - readableStream = jsutil.ConvertReaderToFixedLengthStream(body, contentLength) - } else { - readableStream = jsutil.ConvertReaderToReadableStream(body) - } + readableStream := func() js.Value { + if rawBody != nil { + return *rawBody + } + if !jsutil.MaybeFixedLengthStreamClass.IsUndefined() && contentLength > 0 { + return jsutil.ConvertReaderToFixedLengthStream(body, contentLength) + } + return jsutil.ConvertReaderToReadableStream(body) + }() return jsutil.ResponseClass.New(readableStream, respInit) } diff --git a/internal/jsutil/jsutil.go b/internal/jsutil/jsutil.go index e5f169ba..17424ef7 100644 --- a/internal/jsutil/jsutil.go +++ b/internal/jsutil/jsutil.go @@ -19,9 +19,12 @@ var ( Uint8ClampedArrayClass = js.Global().Get("Uint8ClampedArray") ErrorClass = js.Global().Get("Error") ReadableStreamClass = js.Global().Get("ReadableStream") - FixedLengthStreamClass = js.Global().Get("FixedLengthStream") DateClass = js.Global().Get("Date") Null = js.ValueOf(nil) + // MaybeFixedLengthStreamClass is a class for FixedLengthStream. + // * This class is only available in Cloudflare Workers. + // * If this class is not available, the value will be undefined. + MaybeFixedLengthStreamClass = js.Global().Get("FixedLengthStream") ) func NewObject() js.Value { diff --git a/internal/jsutil/stream.go b/internal/jsutil/stream.go index 9c3439ef..a64492d8 100644 --- a/internal/jsutil/stream.go +++ b/internal/jsutil/stream.go @@ -208,11 +208,12 @@ func ConvertReaderToReadableStream(reader io.ReadCloser) js.Value { // ConvertReaderToFixedLengthStream converts io.ReadCloser to TransformStream. func ConvertReaderToFixedLengthStream(rc io.ReadCloser, size int64) js.Value { - stream := FixedLengthStreamClass.New(js.ValueOf(size)) + stream := MaybeFixedLengthStreamClass.New(js.ValueOf(size)) go func(writer js.Value) { defer rc.Close() chunk := make([]byte, min(size, defaultChunkSize)) + AwaitPromise(writer.Get("ready")) for { n, err := rc.Read(chunk) if n > 0 { @@ -221,6 +222,7 @@ func ConvertReaderToFixedLengthStream(rc io.ReadCloser, size int64) js.Value { writer.Call("write", b) } if err != nil { + AwaitPromise(writer.Get("ready")) writer.Call("close") return }