@@ -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.
3450func ToJSResponse (res * http.Response ) js.Value {
3551 return newJSResponse (res .StatusCode , res .Header , res .Body , nil )
0 commit comments