Skip to content

Commit 94f29eb

Browse files
committed
move fetch's stream logic to jshttp.ToStreamResponse
1 parent d31baa3 commit 94f29eb

File tree

2 files changed

+26
-24
lines changed

2 files changed

+26
-24
lines changed

cloudflare/fetch/bind.go

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package fetch
33
import (
44
"errors"
55
"net/http"
6-
"strconv"
76
"syscall/js"
87

98
"github.com/syumai/workers/internal/jshttp"
@@ -31,18 +30,5 @@ func fetch(namespace js.Value, req *http.Request, init *RequestInit) (*http.Resp
3130
return nil, err
3231
}
3332

34-
// Create TransformStream
35-
ts := js.Global().Get("IdentityTransformStream").New()
36-
readable := ts.Get("readable")
37-
writable := ts.Get("writable")
38-
jsRes.Get("body").Call("pipeTo", writable)
39-
40-
// Create response
41-
res := new(http.Response)
42-
res.StatusCode = jsRes.Get("status").Int()
43-
res.Status = strconv.Itoa(res.StatusCode) + " " + jsRes.Get("statusText").String()
44-
res.Header = jshttp.ToHeader(jsRes.Get("headers"))
45-
res.Body = jsutil.ConvertReadableStreamToReadCloser(readable)
46-
47-
return res, nil
33+
return jshttp.ToStreamResponse(jsRes)
4834
}

internal/jshttp/response.go

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,43 @@ import (
99
"github.com/syumai/workers/internal/jsutil"
1010
)
1111

12-
// ToResponse converts JavaScript sides Response to *http.Response.
13-
// - Response: https://developer.mozilla.org/docs/Web/API/Response
14-
func ToResponse(res js.Value) (*http.Response, error) {
12+
func toResponse(res js.Value, body io.ReadCloser) (*http.Response, error) {
1513
status := res.Get("status").Int()
16-
promise := res.Call("blob")
17-
blob, err := jsutil.AwaitPromise(promise)
18-
if err != nil {
19-
return nil, err
20-
}
2114
header := ToHeader(res.Get("headers"))
2215
contentLength, _ := strconv.ParseInt(header.Get("Content-Length"), 10, 64)
2316

2417
return &http.Response{
2518
Status: strconv.Itoa(status) + " " + res.Get("statusText").String(),
2619
StatusCode: status,
2720
Header: header,
28-
Body: jsutil.ConvertReadableStreamToReadCloser(blob.Call("stream")),
21+
Body: body,
2922
ContentLength: contentLength,
3023
}, nil
3124
}
3225

26+
// ToResponse converts JavaScript sides Response to *http.Response.
27+
// - Response: https://developer.mozilla.org/docs/Web/API/Response
28+
func ToResponse(res js.Value) (*http.Response, error) {
29+
promise := res.Call("blob")
30+
blob, err := jsutil.AwaitPromise(promise)
31+
if err != nil {
32+
return nil, err
33+
}
34+
body := jsutil.ConvertReadableStreamToReadCloser(blob.Call("stream"))
35+
return toResponse(res, body)
36+
}
37+
38+
// ToStreamResponse pipes JavaScript sides Response to TransformStream and converts to *http.Response.
39+
// - see: https://developers.cloudflare.com/workers/runtime-apis/streams/
40+
func ToStreamResponse(res js.Value) (*http.Response, error) {
41+
ts := js.Global().Get("IdentityTransformStream").New()
42+
readable := ts.Get("readable")
43+
writable := ts.Get("writable")
44+
res.Get("body").Call("pipeTo", writable)
45+
body := jsutil.ConvertReadableStreamToReadCloser(readable)
46+
return toResponse(res, body)
47+
}
48+
3349
// ToJSResponse converts *http.Response to JavaScript sides Response class object.
3450
func ToJSResponse(res *http.Response) js.Value {
3551
return newJSResponse(res.StatusCode, res.Header, res.Body, nil)

0 commit comments

Comments
 (0)