mirror of
https://github.com/syumai/workers.git
synced 2025-03-10 17:29:11 +00:00
split internal/jsutil
This commit is contained in:
parent
555b3e54bc
commit
890096fce9
4
env.go
4
env.go
@ -1,8 +1,10 @@
|
||||
package workers
|
||||
|
||||
import "github.com/syumai/workers/internal/jsutil"
|
||||
|
||||
// Getenv gets a value of an environment variable.
|
||||
// - https://developers.cloudflare.com/workers/platform/environment-variables/
|
||||
// - Technically, this function is just an alias for js.Global().Get(env_name).String().
|
||||
func Getenv(name string) string {
|
||||
return Global.Get(name).String()
|
||||
return jsutil.Global.Get(name).String()
|
||||
}
|
||||
|
@ -5,6 +5,8 @@ import (
|
||||
"io"
|
||||
"net/http"
|
||||
"syscall/js"
|
||||
|
||||
"github.com/syumai/workers/internal/jsutil"
|
||||
)
|
||||
|
||||
var httpHandler http.Handler
|
||||
@ -28,9 +30,9 @@ func init() {
|
||||
}()
|
||||
return js.Undefined()
|
||||
})
|
||||
return NewPromise(cb)
|
||||
return jsutil.NewPromise(cb)
|
||||
})
|
||||
Global.Set("handleRequest", handleRequestCallback)
|
||||
jsutil.Global.Set("handleRequest", handleRequestCallback)
|
||||
}
|
||||
|
||||
// handleRequest accepts a Request object and returns Response object.
|
||||
|
@ -1,4 +1,4 @@
|
||||
package workers
|
||||
package jsutil
|
||||
|
||||
import (
|
||||
"fmt"
|
@ -1,4 +1,4 @@
|
||||
package workers
|
||||
package jsutil
|
||||
|
||||
import (
|
||||
"bytes"
|
26
kv.go
26
kv.go
@ -4,6 +4,8 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"syscall/js"
|
||||
|
||||
"github.com/syumai/workers/internal/jsutil"
|
||||
)
|
||||
|
||||
// KVNamespace represents interface of Cloudflare Worker's KV namespace instance.
|
||||
@ -31,7 +33,7 @@ type KVNamespaceGetOptions struct {
|
||||
}
|
||||
|
||||
func (opts *KVNamespaceGetOptions) toJS(type_ string) js.Value {
|
||||
obj := NewObject()
|
||||
obj := jsutil.NewObject()
|
||||
obj.Set("type", type_)
|
||||
if opts == nil {
|
||||
return obj
|
||||
@ -46,7 +48,7 @@ func (opts *KVNamespaceGetOptions) toJS(type_ string) js.Value {
|
||||
// - if a network error happens, returns error.
|
||||
func (kv *KVNamespace) GetString(key string, opts *KVNamespaceGetOptions) (string, error) {
|
||||
p := kv.instance.Call("get", key, opts.toJS("text"))
|
||||
v, err := AwaitPromise(p)
|
||||
v, err := jsutil.AwaitPromise(p)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
@ -57,12 +59,12 @@ func (kv *KVNamespace) GetString(key string, opts *KVNamespaceGetOptions) (strin
|
||||
// - if a network error happens, returns error.
|
||||
func (kv *KVNamespace) GetReader(key string, opts *KVNamespaceGetOptions) (io.Reader, error) {
|
||||
p := kv.instance.Call("get", key, opts.toJS("stream"))
|
||||
v, err := AwaitPromise(p)
|
||||
v, err := jsutil.AwaitPromise(p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
Global.Get("console").Call("log", v)
|
||||
return ConvertStreamReaderToReader(v.Call("getReader")), nil
|
||||
jsutil.Global.Get("console").Call("log", v)
|
||||
return jsutil.ConvertStreamReaderToReader(v.Call("getReader")), nil
|
||||
}
|
||||
|
||||
// KVNamespaceListOptions represents Cloudflare KV namespace list options.
|
||||
@ -77,7 +79,7 @@ func (opts *KVNamespaceListOptions) toJS() js.Value {
|
||||
if opts == nil {
|
||||
return js.Undefined()
|
||||
}
|
||||
obj := NewObject()
|
||||
obj := jsutil.NewObject()
|
||||
if opts.Limit != 0 {
|
||||
obj.Set("limit", opts.Limit)
|
||||
}
|
||||
@ -151,7 +153,7 @@ func toKVNamespaceListResult(v js.Value) (*KVNamespaceListResult, error) {
|
||||
// List lists keys stored into the KV namespace.
|
||||
func (kv *KVNamespace) List(opts *KVNamespaceListOptions) (*KVNamespaceListResult, error) {
|
||||
p := kv.instance.Call("list", opts.toJS())
|
||||
v, err := AwaitPromise(p)
|
||||
v, err := jsutil.AwaitPromise(p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -170,7 +172,7 @@ func (opts *KVNamespacePutOptions) toJS() js.Value {
|
||||
if opts == nil {
|
||||
return js.Undefined()
|
||||
}
|
||||
obj := NewObject()
|
||||
obj := jsutil.NewObject()
|
||||
if opts.Expiration != 0 {
|
||||
obj.Set("expiration", opts.Expiration)
|
||||
}
|
||||
@ -184,7 +186,7 @@ func (opts *KVNamespacePutOptions) toJS() js.Value {
|
||||
// - if a network error happens, returns error.
|
||||
func (kv *KVNamespace) PutString(key string, value string, opts *KVNamespacePutOptions) error {
|
||||
p := kv.instance.Call("put", key, value, opts.toJS())
|
||||
_, err := AwaitPromise(p)
|
||||
_, err := jsutil.AwaitPromise(p)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -200,10 +202,10 @@ func (kv *KVNamespace) PutReader(key string, value io.Reader, opts *KVNamespaceP
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
ua := NewUint8Array(len(b))
|
||||
ua := jsutil.NewUint8Array(len(b))
|
||||
js.CopyBytesToJS(ua, b)
|
||||
p := kv.instance.Call("put", key, ua.Get("buffer"), opts.toJS())
|
||||
_, err = AwaitPromise(p)
|
||||
_, err = jsutil.AwaitPromise(p)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -214,7 +216,7 @@ func (kv *KVNamespace) PutReader(key string, value io.Reader, opts *KVNamespaceP
|
||||
// - if a network error happens, returns error.
|
||||
func (kv *KVNamespace) Delete(key string) error {
|
||||
p := kv.instance.Call("delete", key)
|
||||
_, err := AwaitPromise(p)
|
||||
_, err := jsutil.AwaitPromise(p)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
16
r2bucket.go
16
r2bucket.go
@ -4,6 +4,8 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"syscall/js"
|
||||
|
||||
"github.com/syumai/workers/internal/jsutil"
|
||||
)
|
||||
|
||||
// R2Bucket represents interface of Cloudflare Worker's R2 Bucket instance.
|
||||
@ -31,7 +33,7 @@ func NewR2Bucket(varName string) (*R2Bucket, error) {
|
||||
// - if a network error happens, returns error.
|
||||
func (r *R2Bucket) Head(key string) (*R2Object, error) {
|
||||
p := r.instance.Call("head", key)
|
||||
v, err := AwaitPromise(p)
|
||||
v, err := jsutil.AwaitPromise(p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -46,7 +48,7 @@ func (r *R2Bucket) Head(key string) (*R2Object, error) {
|
||||
// - if a network error happens, returns error.
|
||||
func (r *R2Bucket) Get(key string) (*R2Object, error) {
|
||||
p := r.instance.Call("get", key)
|
||||
v, err := AwaitPromise(p)
|
||||
v, err := jsutil.AwaitPromise(p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -68,7 +70,7 @@ func (opts *R2PutOptions) toJS() js.Value {
|
||||
if opts == nil {
|
||||
return js.Undefined()
|
||||
}
|
||||
obj := NewObject()
|
||||
obj := jsutil.NewObject()
|
||||
if opts.HTTPMetadata != (R2HTTPMetadata{}) {
|
||||
obj.Set("httpMetadata", opts.HTTPMetadata.toJS())
|
||||
}
|
||||
@ -99,10 +101,10 @@ func (r *R2Bucket) Put(key string, value io.ReadCloser, opts *R2PutOptions) (*R2
|
||||
return nil, err
|
||||
}
|
||||
defer value.Close()
|
||||
ua := NewUint8Array(len(b))
|
||||
ua := jsutil.NewUint8Array(len(b))
|
||||
js.CopyBytesToJS(ua, b)
|
||||
p := r.instance.Call("put", key, ua.Get("buffer"), opts.toJS())
|
||||
v, err := AwaitPromise(p)
|
||||
v, err := jsutil.AwaitPromise(p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -113,7 +115,7 @@ func (r *R2Bucket) Put(key string, value io.ReadCloser, opts *R2PutOptions) (*R2
|
||||
// - if a network error happens, returns error.
|
||||
func (r *R2Bucket) Delete(key string) error {
|
||||
p := r.instance.Call("delete", key)
|
||||
if _, err := AwaitPromise(p); err != nil {
|
||||
if _, err := jsutil.AwaitPromise(p); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
@ -123,7 +125,7 @@ func (r *R2Bucket) Delete(key string) error {
|
||||
// - if a network error happens, returns error.
|
||||
func (r *R2Bucket) List() (*R2Objects, error) {
|
||||
p := r.instance.Call("list")
|
||||
v, err := AwaitPromise(p)
|
||||
v, err := jsutil.AwaitPromise(p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
24
r2object.go
24
r2object.go
@ -6,6 +6,8 @@ import (
|
||||
"io"
|
||||
"syscall/js"
|
||||
"time"
|
||||
|
||||
"github.com/syumai/workers/internal/jsutil"
|
||||
)
|
||||
|
||||
// R2Object represents Cloudflare R2 object.
|
||||
@ -41,7 +43,7 @@ func (o *R2Object) BodyUsed() (bool, error) {
|
||||
// toR2Object converts JavaScript side's R2Object to *R2Object.
|
||||
// - https://github.com/cloudflare/workers-types/blob/3012f263fb1239825e5f0061b267c8650d01b717/index.d.ts#L1094
|
||||
func toR2Object(v js.Value) (*R2Object, error) {
|
||||
uploaded, err := DateToTime(v.Get("uploaded"))
|
||||
uploaded, err := jsutil.DateToTime(v.Get("uploaded"))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error converting uploaded: %w", err)
|
||||
}
|
||||
@ -52,7 +54,7 @@ func toR2Object(v js.Value) (*R2Object, error) {
|
||||
bodyVal := v.Get("body")
|
||||
var body io.Reader
|
||||
if !bodyVal.IsUndefined() {
|
||||
body = ConvertStreamReaderToReader(v.Get("body").Call("getReader"))
|
||||
body = jsutil.ConvertStreamReaderToReader(v.Get("body").Call("getReader"))
|
||||
}
|
||||
return &R2Object{
|
||||
instance: v,
|
||||
@ -63,7 +65,7 @@ func toR2Object(v js.Value) (*R2Object, error) {
|
||||
HTTPETag: v.Get("httpEtag").String(),
|
||||
Uploaded: uploaded,
|
||||
HTTPMetadata: r2Meta,
|
||||
CustomMetadata: StrRecordToMap(v.Get("customMetadata")),
|
||||
CustomMetadata: jsutil.StrRecordToMap(v.Get("customMetadata")),
|
||||
Body: body,
|
||||
}, nil
|
||||
}
|
||||
@ -80,22 +82,22 @@ type R2HTTPMetadata struct {
|
||||
}
|
||||
|
||||
func toR2HTTPMetadata(v js.Value) (R2HTTPMetadata, error) {
|
||||
cacheExpiry, err := MaybeDate(v.Get("cacheExpiry"))
|
||||
cacheExpiry, err := jsutil.MaybeDate(v.Get("cacheExpiry"))
|
||||
if err != nil {
|
||||
return R2HTTPMetadata{}, fmt.Errorf("error converting cacheExpiry: %w", err)
|
||||
}
|
||||
return R2HTTPMetadata{
|
||||
ContentType: MaybeString(v.Get("contentType")),
|
||||
ContentLanguage: MaybeString(v.Get("contentLanguage")),
|
||||
ContentDisposition: MaybeString(v.Get("contentDisposition")),
|
||||
ContentEncoding: MaybeString(v.Get("contentEncoding")),
|
||||
CacheControl: MaybeString(v.Get("cacheControl")),
|
||||
ContentType: jsutil.MaybeString(v.Get("contentType")),
|
||||
ContentLanguage: jsutil.MaybeString(v.Get("contentLanguage")),
|
||||
ContentDisposition: jsutil.MaybeString(v.Get("contentDisposition")),
|
||||
ContentEncoding: jsutil.MaybeString(v.Get("contentEncoding")),
|
||||
CacheControl: jsutil.MaybeString(v.Get("cacheControl")),
|
||||
CacheExpiry: cacheExpiry,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (md *R2HTTPMetadata) toJS() js.Value {
|
||||
obj := NewObject()
|
||||
obj := jsutil.NewObject()
|
||||
kv := map[string]string{
|
||||
"contentType": md.ContentType,
|
||||
"contentLanguage": md.ContentLanguage,
|
||||
@ -109,7 +111,7 @@ func (md *R2HTTPMetadata) toJS() js.Value {
|
||||
}
|
||||
}
|
||||
if !md.CacheExpiry.IsZero() {
|
||||
obj.Set("cacheExpiry", TimeToDate(md.CacheExpiry))
|
||||
obj.Set("cacheExpiry", jsutil.TimeToDate(md.CacheExpiry))
|
||||
}
|
||||
return obj
|
||||
}
|
||||
|
@ -3,6 +3,8 @@ package workers
|
||||
import (
|
||||
"fmt"
|
||||
"syscall/js"
|
||||
|
||||
"github.com/syumai/workers/internal/jsutil"
|
||||
)
|
||||
|
||||
// R2Objects represents Cloudflare R2 objects.
|
||||
@ -36,7 +38,7 @@ func toR2Objects(v js.Value) (*R2Objects, error) {
|
||||
return &R2Objects{
|
||||
Objects: objects,
|
||||
Truncated: v.Get("truncated").Bool(),
|
||||
Cursor: MaybeString(v.Get("cursor")),
|
||||
Cursor: jsutil.MaybeString(v.Get("cursor")),
|
||||
DelimitedPrefixes: prefixes,
|
||||
}, nil
|
||||
}
|
||||
|
@ -7,6 +7,8 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall/js"
|
||||
|
||||
"github.com/syumai/workers/internal/jsutil"
|
||||
)
|
||||
|
||||
// toBody converts JavaScripts sides ReadableStream (can be null) to io.ReadCloser.
|
||||
@ -16,13 +18,13 @@ func toBody(streamOrNull js.Value) io.ReadCloser {
|
||||
return nil
|
||||
}
|
||||
sr := streamOrNull.Call("getReader")
|
||||
return io.NopCloser(ConvertStreamReaderToReader(sr))
|
||||
return io.NopCloser(jsutil.ConvertStreamReaderToReader(sr))
|
||||
}
|
||||
|
||||
// toHeader converts JavaScript sides Headers to http.Header.
|
||||
// - Headers: https://developer.mozilla.org/ja/docs/Web/API/Headers
|
||||
func toHeader(headers js.Value) http.Header {
|
||||
entries := ArrayFrom(headers.Call("entries"))
|
||||
entries := jsutil.ArrayFrom(headers.Call("entries"))
|
||||
headerLen := entries.Length()
|
||||
h := http.Header{}
|
||||
for i := 0; i < headerLen; i++ {
|
||||
|
10
response.go
10
response.go
@ -3,10 +3,12 @@ package workers
|
||||
import (
|
||||
"net/http"
|
||||
"syscall/js"
|
||||
|
||||
"github.com/syumai/workers/internal/jsutil"
|
||||
)
|
||||
|
||||
func toJSHeader(header http.Header) js.Value {
|
||||
h := HeadersClass.New()
|
||||
h := jsutil.HeadersClass.New()
|
||||
for key, values := range header {
|
||||
for _, value := range values {
|
||||
h.Call("append", key, value)
|
||||
@ -21,10 +23,10 @@ func toJSResponse(w *responseWriterBuffer) (js.Value, error) {
|
||||
if status == 0 {
|
||||
status = http.StatusOK
|
||||
}
|
||||
respInit := NewObject()
|
||||
respInit := jsutil.NewObject()
|
||||
respInit.Set("status", status)
|
||||
respInit.Set("statusText", http.StatusText(status))
|
||||
respInit.Set("headers", toJSHeader(w.Header()))
|
||||
readableStream := ConvertReaderToReadableStream(w.reader)
|
||||
return ResponseClass.New(readableStream, respInit), nil
|
||||
readableStream := jsutil.ConvertReaderToReadableStream(w.reader)
|
||||
return jsutil.ResponseClass.New(readableStream, respInit), nil
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user