mirror of
https://github.com/syumai/workers.git
synced 2025-03-11 01:39:11 +00:00
move fetch's stream logic to jshttp.ToStreamResponse
This commit is contained in:
parent
d31baa38b5
commit
94f29ebdf1
@ -3,7 +3,6 @@ package fetch
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
|
||||||
"syscall/js"
|
"syscall/js"
|
||||||
|
|
||||||
"github.com/syumai/workers/internal/jshttp"
|
"github.com/syumai/workers/internal/jshttp"
|
||||||
@ -31,18 +30,5 @@ func fetch(namespace js.Value, req *http.Request, init *RequestInit) (*http.Resp
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create TransformStream
|
return jshttp.ToStreamResponse(jsRes)
|
||||||
ts := js.Global().Get("IdentityTransformStream").New()
|
|
||||||
readable := ts.Get("readable")
|
|
||||||
writable := ts.Get("writable")
|
|
||||||
jsRes.Get("body").Call("pipeTo", writable)
|
|
||||||
|
|
||||||
// Create response
|
|
||||||
res := new(http.Response)
|
|
||||||
res.StatusCode = jsRes.Get("status").Int()
|
|
||||||
res.Status = strconv.Itoa(res.StatusCode) + " " + jsRes.Get("statusText").String()
|
|
||||||
res.Header = jshttp.ToHeader(jsRes.Get("headers"))
|
|
||||||
res.Body = jsutil.ConvertReadableStreamToReadCloser(readable)
|
|
||||||
|
|
||||||
return res, nil
|
|
||||||
}
|
}
|
||||||
|
@ -9,15 +9,8 @@ import (
|
|||||||
"github.com/syumai/workers/internal/jsutil"
|
"github.com/syumai/workers/internal/jsutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ToResponse converts JavaScript sides Response to *http.Response.
|
func toResponse(res js.Value, body io.ReadCloser) (*http.Response, error) {
|
||||||
// - Response: https://developer.mozilla.org/docs/Web/API/Response
|
|
||||||
func ToResponse(res js.Value) (*http.Response, error) {
|
|
||||||
status := res.Get("status").Int()
|
status := res.Get("status").Int()
|
||||||
promise := res.Call("blob")
|
|
||||||
blob, err := jsutil.AwaitPromise(promise)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
header := ToHeader(res.Get("headers"))
|
header := ToHeader(res.Get("headers"))
|
||||||
contentLength, _ := strconv.ParseInt(header.Get("Content-Length"), 10, 64)
|
contentLength, _ := strconv.ParseInt(header.Get("Content-Length"), 10, 64)
|
||||||
|
|
||||||
@ -25,11 +18,34 @@ func ToResponse(res js.Value) (*http.Response, error) {
|
|||||||
Status: strconv.Itoa(status) + " " + res.Get("statusText").String(),
|
Status: strconv.Itoa(status) + " " + res.Get("statusText").String(),
|
||||||
StatusCode: status,
|
StatusCode: status,
|
||||||
Header: header,
|
Header: header,
|
||||||
Body: jsutil.ConvertReadableStreamToReadCloser(blob.Call("stream")),
|
Body: body,
|
||||||
ContentLength: contentLength,
|
ContentLength: contentLength,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ToResponse converts JavaScript sides Response to *http.Response.
|
||||||
|
// - Response: https://developer.mozilla.org/docs/Web/API/Response
|
||||||
|
func ToResponse(res js.Value) (*http.Response, error) {
|
||||||
|
promise := res.Call("blob")
|
||||||
|
blob, err := jsutil.AwaitPromise(promise)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
body := jsutil.ConvertReadableStreamToReadCloser(blob.Call("stream"))
|
||||||
|
return toResponse(res, body)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToStreamResponse pipes JavaScript sides Response to TransformStream and converts to *http.Response.
|
||||||
|
// - see: https://developers.cloudflare.com/workers/runtime-apis/streams/
|
||||||
|
func ToStreamResponse(res js.Value) (*http.Response, error) {
|
||||||
|
ts := js.Global().Get("IdentityTransformStream").New()
|
||||||
|
readable := ts.Get("readable")
|
||||||
|
writable := ts.Get("writable")
|
||||||
|
res.Get("body").Call("pipeTo", writable)
|
||||||
|
body := jsutil.ConvertReadableStreamToReadCloser(readable)
|
||||||
|
return toResponse(res, body)
|
||||||
|
}
|
||||||
|
|
||||||
// ToJSResponse converts *http.Response to JavaScript sides Response class object.
|
// ToJSResponse converts *http.Response to JavaScript sides Response class object.
|
||||||
func ToJSResponse(res *http.Response) js.Value {
|
func ToJSResponse(res *http.Response) js.Value {
|
||||||
return newJSResponse(res.StatusCode, res.Header, res.Body, nil)
|
return newJSResponse(res.StatusCode, res.Header, res.Body, nil)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user