From c2373d9a598f107863f336856e371708c5394688 Mon Sep 17 00:00:00 2001 From: syumai Date: Sat, 12 Apr 2025 21:56:11 +0900 Subject: [PATCH 1/2] fix bug of FixedLengthTransformStream --- internal/jshttp/response.go | 17 +++++++++-------- internal/jsutil/jsutil.go | 5 ++++- internal/jsutil/stream.go | 4 +++- 3 files changed, 16 insertions(+), 10 deletions(-) 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 } From a755611e229792c8f65e4acc5f1ff6e3aa0ae9f1 Mon Sep 17 00:00:00 2001 From: syumai Date: Sat, 12 Apr 2025 22:49:29 +0900 Subject: [PATCH 2/2] change hello example to use go instead of tinygo --- _examples/hello/Makefile | 4 ++-- _examples/hello/README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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