make public jsutil symbols

This commit is contained in:
syumai 2022-09-13 23:15:47 +09:00
parent 1d1d2a9093
commit c339993f96
10 changed files with 78 additions and 78 deletions

2
env.go
View File

@ -4,5 +4,5 @@ package workers
// - https://developers.cloudflare.com/workers/platform/environment-variables/ // - https://developers.cloudflare.com/workers/platform/environment-variables/
// - Technically, this function is just an alias for js.Global().Get(env_name).String(). // - Technically, this function is just an alias for js.Global().Get(env_name).String().
func Getenv(name string) string { func Getenv(name string) string {
return global.Get(name).String() return Global.Get(name).String()
} }

View File

@ -28,9 +28,9 @@ func init() {
}() }()
return js.Undefined() return js.Undefined()
}) })
return newPromise(cb) return NewPromise(cb)
}) })
global.Set("handleRequest", handleRequestCallback) Global.Set("handleRequest", handleRequestCallback)
} }
// handleRequest accepts a Request object and returns Response object. // handleRequest accepts a Request object and returns Response object.

View File

@ -7,36 +7,36 @@ import (
) )
var ( var (
global = js.Global() Global = js.Global()
objectClass = global.Get("Object") ObjectClass = Global.Get("Object")
promiseClass = global.Get("Promise") PromiseClass = Global.Get("Promise")
responseClass = global.Get("Response") ResponseClass = Global.Get("Response")
headersClass = global.Get("Headers") HeadersClass = Global.Get("Headers")
arrayClass = global.Get("Array") ArrayClass = Global.Get("Array")
uint8ArrayClass = global.Get("Uint8Array") Uint8ArrayClass = Global.Get("Uint8Array")
errorClass = global.Get("Error") ErrorClass = Global.Get("Error")
readableStreamClass = global.Get("ReadableStream") ReadableStreamClass = Global.Get("ReadableStream")
dateClass = global.Get("Date") DateClass = Global.Get("Date")
) )
func newObject() js.Value { func NewObject() js.Value {
return objectClass.New() return ObjectClass.New()
} }
func newUint8Array(size int) js.Value { func NewUint8Array(size int) js.Value {
return uint8ArrayClass.New(size) return Uint8ArrayClass.New(size)
} }
func newPromise(fn js.Func) js.Value { func NewPromise(fn js.Func) js.Value {
return promiseClass.New(fn) return PromiseClass.New(fn)
} }
// arrayFrom calls Array.from to given argument and returns result Array. // ArrayFrom calls Array.from to given argument and returns result Array.
func arrayFrom(v js.Value) js.Value { func ArrayFrom(v js.Value) js.Value {
return arrayClass.Call("from", v) return ArrayClass.Call("from", v)
} }
func awaitPromise(promiseVal js.Value) (js.Value, error) { func AwaitPromise(promiseVal js.Value) (js.Value, error) {
resultCh := make(chan js.Value) resultCh := make(chan js.Value)
errCh := make(chan error) errCh := make(chan error)
var then, catch js.Func var then, catch js.Func
@ -61,9 +61,9 @@ func awaitPromise(promiseVal js.Value) (js.Value, error) {
} }
} }
// strRecordToMap converts JavaScript side's Record<string, string> into map[string]string. // StrRecordToMap converts JavaScript side's Record<string, string> into map[string]string.
func strRecordToMap(v js.Value) map[string]string { func StrRecordToMap(v js.Value) map[string]string {
entries := objectClass.Call("entries", v) entries := ObjectClass.Call("entries", v)
entriesLen := entries.Get("length").Int() entriesLen := entries.Get("length").Int()
result := make(map[string]string, entriesLen) result := make(map[string]string, entriesLen)
for i := 0; i < entriesLen; i++ { for i := 0; i < entriesLen; i++ {
@ -75,29 +75,29 @@ func strRecordToMap(v js.Value) map[string]string {
return result return result
} }
// maybeString returns string value of given JavaScript value or returns nil if the value is undefined. // MaybeString returns string value of given JavaScript value or returns nil if the value is undefined.
func maybeString(v js.Value) string { func MaybeString(v js.Value) string {
if v.IsUndefined() { if v.IsUndefined() {
return "" return ""
} }
return v.String() return v.String()
} }
// maybeDate returns time.Time value of given JavaScript Date value or returns nil if the value is undefined. // MaybeDate returns time.Time value of given JavaScript Date value or returns nil if the value is undefined.
func maybeDate(v js.Value) (time.Time, error) { func MaybeDate(v js.Value) (time.Time, error) {
if v.IsUndefined() { if v.IsUndefined() {
return time.Time{}, nil return time.Time{}, nil
} }
return dateToTime(v) return DateToTime(v)
} }
// dateToTime converts JavaScript side's Data object into time.Time. // DateToTime converts JavaScript side's Data object into time.Time.
func dateToTime(v js.Value) (time.Time, error) { func DateToTime(v js.Value) (time.Time, error) {
milli := v.Call("getTime").Float() milli := v.Call("getTime").Float()
return time.UnixMilli(int64(milli)), nil return time.UnixMilli(int64(milli)), nil
} }
// timeToDate converts Go side's time.Time into Date object. // TimeToDate converts Go side's time.Time into Date object.
func timeToDate(t time.Time) js.Value { func TimeToDate(t time.Time) js.Value {
return dateClass.New(t.UnixMilli()) return DateClass.New(t.UnixMilli())
} }

24
kv.go
View File

@ -15,7 +15,7 @@ type KVNamespace struct {
// NewKVNamespace returns KVNamespace for given variable name. // NewKVNamespace returns KVNamespace for given variable name.
// - variable name must be defined in wrangler.toml as kv_namespace's binding. // - variable name must be defined in wrangler.toml as kv_namespace's binding.
// - if the given variable name doesn't exist on global object, returns error. // - if the given variable name doesn't exist on Global object, returns error.
func NewKVNamespace(varName string) (*KVNamespace, error) { func NewKVNamespace(varName string) (*KVNamespace, error) {
inst := js.Global().Get(varName) inst := js.Global().Get(varName)
if inst.IsUndefined() { if inst.IsUndefined() {
@ -31,7 +31,7 @@ type KVNamespaceGetOptions struct {
} }
func (opts *KVNamespaceGetOptions) toJS(type_ string) js.Value { func (opts *KVNamespaceGetOptions) toJS(type_ string) js.Value {
obj := newObject() obj := NewObject()
obj.Set("type", type_) obj.Set("type", type_)
if opts == nil { if opts == nil {
return obj return obj
@ -46,7 +46,7 @@ func (opts *KVNamespaceGetOptions) toJS(type_ string) js.Value {
// - if a network error happens, returns error. // - if a network error happens, returns error.
func (kv *KVNamespace) GetString(key string, opts *KVNamespaceGetOptions) (string, error) { func (kv *KVNamespace) GetString(key string, opts *KVNamespaceGetOptions) (string, error) {
p := kv.instance.Call("get", key, opts.toJS("text")) p := kv.instance.Call("get", key, opts.toJS("text"))
v, err := awaitPromise(p) v, err := AwaitPromise(p)
if err != nil { if err != nil {
return "", err return "", err
} }
@ -57,11 +57,11 @@ func (kv *KVNamespace) GetString(key string, opts *KVNamespaceGetOptions) (strin
// - if a network error happens, returns error. // - if a network error happens, returns error.
func (kv *KVNamespace) GetReader(key string, opts *KVNamespaceGetOptions) (io.Reader, error) { func (kv *KVNamespace) GetReader(key string, opts *KVNamespaceGetOptions) (io.Reader, error) {
p := kv.instance.Call("get", key, opts.toJS("stream")) p := kv.instance.Call("get", key, opts.toJS("stream"))
v, err := awaitPromise(p) v, err := AwaitPromise(p)
if err != nil { if err != nil {
return nil, err return nil, err
} }
global.Get("console").Call("log", v) Global.Get("console").Call("log", v)
return convertStreamReaderToReader(v.Call("getReader")), nil return convertStreamReaderToReader(v.Call("getReader")), nil
} }
@ -77,7 +77,7 @@ func (opts *KVNamespaceListOptions) toJS() js.Value {
if opts == nil { if opts == nil {
return js.Undefined() return js.Undefined()
} }
obj := newObject() obj := NewObject()
if opts.Limit != 0 { if opts.Limit != 0 {
obj.Set("limit", opts.Limit) obj.Set("limit", opts.Limit)
} }
@ -151,7 +151,7 @@ func toKVNamespaceListResult(v js.Value) (*KVNamespaceListResult, error) {
// List lists keys stored into the KV namespace. // List lists keys stored into the KV namespace.
func (kv *KVNamespace) List(opts *KVNamespaceListOptions) (*KVNamespaceListResult, error) { func (kv *KVNamespace) List(opts *KVNamespaceListOptions) (*KVNamespaceListResult, error) {
p := kv.instance.Call("list", opts.toJS()) p := kv.instance.Call("list", opts.toJS())
v, err := awaitPromise(p) v, err := AwaitPromise(p)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -170,7 +170,7 @@ func (opts *KVNamespacePutOptions) toJS() js.Value {
if opts == nil { if opts == nil {
return js.Undefined() return js.Undefined()
} }
obj := newObject() obj := NewObject()
if opts.Expiration != 0 { if opts.Expiration != 0 {
obj.Set("expiration", opts.Expiration) obj.Set("expiration", opts.Expiration)
} }
@ -184,7 +184,7 @@ func (opts *KVNamespacePutOptions) toJS() js.Value {
// - if a network error happens, returns error. // - if a network error happens, returns error.
func (kv *KVNamespace) PutString(key string, value string, opts *KVNamespacePutOptions) error { func (kv *KVNamespace) PutString(key string, value string, opts *KVNamespacePutOptions) error {
p := kv.instance.Call("put", key, value, opts.toJS()) p := kv.instance.Call("put", key, value, opts.toJS())
_, err := awaitPromise(p) _, err := AwaitPromise(p)
if err != nil { if err != nil {
return err return err
} }
@ -200,10 +200,10 @@ func (kv *KVNamespace) PutReader(key string, value io.Reader, opts *KVNamespaceP
if err != nil { if err != nil {
return err return err
} }
ua := newUint8Array(len(b)) ua := NewUint8Array(len(b))
js.CopyBytesToJS(ua, b) js.CopyBytesToJS(ua, b)
p := kv.instance.Call("put", key, ua.Get("buffer"), opts.toJS()) p := kv.instance.Call("put", key, ua.Get("buffer"), opts.toJS())
_, err = awaitPromise(p) _, err = AwaitPromise(p)
if err != nil { if err != nil {
return err return err
} }
@ -214,7 +214,7 @@ func (kv *KVNamespace) PutReader(key string, value io.Reader, opts *KVNamespaceP
// - if a network error happens, returns error. // - if a network error happens, returns error.
func (kv *KVNamespace) Delete(key string) error { func (kv *KVNamespace) Delete(key string) error {
p := kv.instance.Call("delete", key) p := kv.instance.Call("delete", key)
_, err := awaitPromise(p) _, err := AwaitPromise(p)
if err != nil { if err != nil {
return err return err
} }

View File

@ -15,8 +15,8 @@ type R2Bucket struct {
// NewR2Bucket returns R2Bucket for given variable name. // NewR2Bucket returns R2Bucket for given variable name.
// - variable name must be defined in wrangler.toml. // - variable name must be defined in wrangler.toml.
// - see example: https://github.com/syumai/workers/tree/main/examples/r2-image-viewer // - see example: https://github.com/syumai/workers/tree/main/examples/r2-image-viewer
// - if the given variable name doesn't exist on global object, returns error. // - if the given variable name doesn't exist on Global object, returns error.
func NewR2Bucket(varName string) (*R2Bucket, error) { func NewR2Bucket(varName string) (*R2Bucket, error) {
inst := js.Global().Get(varName) inst := js.Global().Get(varName)
if inst.IsUndefined() { if inst.IsUndefined() {
@ -31,7 +31,7 @@ func NewR2Bucket(varName string) (*R2Bucket, error) {
// - if a network error happens, returns error. // - if a network error happens, returns error.
func (r *R2Bucket) Head(key string) (*R2Object, error) { func (r *R2Bucket) Head(key string) (*R2Object, error) {
p := r.instance.Call("head", key) p := r.instance.Call("head", key)
v, err := awaitPromise(p) v, err := AwaitPromise(p)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -46,7 +46,7 @@ func (r *R2Bucket) Head(key string) (*R2Object, error) {
// - if a network error happens, returns error. // - if a network error happens, returns error.
func (r *R2Bucket) Get(key string) (*R2Object, error) { func (r *R2Bucket) Get(key string) (*R2Object, error) {
p := r.instance.Call("get", key) p := r.instance.Call("get", key)
v, err := awaitPromise(p) v, err := AwaitPromise(p)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -68,7 +68,7 @@ func (opts *R2PutOptions) toJS() js.Value {
if opts == nil { if opts == nil {
return js.Undefined() return js.Undefined()
} }
obj := newObject() obj := NewObject()
if opts.HTTPMetadata != (R2HTTPMetadata{}) { if opts.HTTPMetadata != (R2HTTPMetadata{}) {
obj.Set("httpMetadata", opts.HTTPMetadata.toJS()) obj.Set("httpMetadata", opts.HTTPMetadata.toJS())
} }
@ -99,10 +99,10 @@ func (r *R2Bucket) Put(key string, value io.ReadCloser, opts *R2PutOptions) (*R2
return nil, err return nil, err
} }
defer value.Close() defer value.Close()
ua := newUint8Array(len(b)) ua := NewUint8Array(len(b))
js.CopyBytesToJS(ua, b) js.CopyBytesToJS(ua, b)
p := r.instance.Call("put", key, ua.Get("buffer"), opts.toJS()) p := r.instance.Call("put", key, ua.Get("buffer"), opts.toJS())
v, err := awaitPromise(p) v, err := AwaitPromise(p)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -113,7 +113,7 @@ func (r *R2Bucket) Put(key string, value io.ReadCloser, opts *R2PutOptions) (*R2
// - if a network error happens, returns error. // - if a network error happens, returns error.
func (r *R2Bucket) Delete(key string) error { func (r *R2Bucket) Delete(key string) error {
p := r.instance.Call("delete", key) p := r.instance.Call("delete", key)
if _, err := awaitPromise(p); err != nil { if _, err := AwaitPromise(p); err != nil {
return err return err
} }
return nil return nil
@ -123,7 +123,7 @@ func (r *R2Bucket) Delete(key string) error {
// - if a network error happens, returns error. // - if a network error happens, returns error.
func (r *R2Bucket) List() (*R2Objects, error) { func (r *R2Bucket) List() (*R2Objects, error) {
p := r.instance.Call("list") p := r.instance.Call("list")
v, err := awaitPromise(p) v, err := AwaitPromise(p)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -41,7 +41,7 @@ func (o *R2Object) BodyUsed() (bool, error) {
// toR2Object converts JavaScript side's R2Object to *R2Object. // toR2Object converts JavaScript side's R2Object to *R2Object.
// - https://github.com/cloudflare/workers-types/blob/3012f263fb1239825e5f0061b267c8650d01b717/index.d.ts#L1094 // - https://github.com/cloudflare/workers-types/blob/3012f263fb1239825e5f0061b267c8650d01b717/index.d.ts#L1094
func toR2Object(v js.Value) (*R2Object, error) { func toR2Object(v js.Value) (*R2Object, error) {
uploaded, err := dateToTime(v.Get("uploaded")) uploaded, err := DateToTime(v.Get("uploaded"))
if err != nil { if err != nil {
return nil, fmt.Errorf("error converting uploaded: %w", err) return nil, fmt.Errorf("error converting uploaded: %w", err)
} }
@ -63,7 +63,7 @@ func toR2Object(v js.Value) (*R2Object, error) {
HTTPETag: v.Get("httpEtag").String(), HTTPETag: v.Get("httpEtag").String(),
Uploaded: uploaded, Uploaded: uploaded,
HTTPMetadata: r2Meta, HTTPMetadata: r2Meta,
CustomMetadata: strRecordToMap(v.Get("customMetadata")), CustomMetadata: StrRecordToMap(v.Get("customMetadata")),
Body: body, Body: body,
}, nil }, nil
} }
@ -80,22 +80,22 @@ type R2HTTPMetadata struct {
} }
func toR2HTTPMetadata(v js.Value) (R2HTTPMetadata, error) { func toR2HTTPMetadata(v js.Value) (R2HTTPMetadata, error) {
cacheExpiry, err := maybeDate(v.Get("cacheExpiry")) cacheExpiry, err := MaybeDate(v.Get("cacheExpiry"))
if err != nil { if err != nil {
return R2HTTPMetadata{}, fmt.Errorf("error converting cacheExpiry: %w", err) return R2HTTPMetadata{}, fmt.Errorf("error converting cacheExpiry: %w", err)
} }
return R2HTTPMetadata{ return R2HTTPMetadata{
ContentType: maybeString(v.Get("contentType")), ContentType: MaybeString(v.Get("contentType")),
ContentLanguage: maybeString(v.Get("contentLanguage")), ContentLanguage: MaybeString(v.Get("contentLanguage")),
ContentDisposition: maybeString(v.Get("contentDisposition")), ContentDisposition: MaybeString(v.Get("contentDisposition")),
ContentEncoding: maybeString(v.Get("contentEncoding")), ContentEncoding: MaybeString(v.Get("contentEncoding")),
CacheControl: maybeString(v.Get("cacheControl")), CacheControl: MaybeString(v.Get("cacheControl")),
CacheExpiry: cacheExpiry, CacheExpiry: cacheExpiry,
}, nil }, nil
} }
func (md *R2HTTPMetadata) toJS() js.Value { func (md *R2HTTPMetadata) toJS() js.Value {
obj := newObject() obj := NewObject()
kv := map[string]string{ kv := map[string]string{
"contentType": md.ContentType, "contentType": md.ContentType,
"contentLanguage": md.ContentLanguage, "contentLanguage": md.ContentLanguage,
@ -109,7 +109,7 @@ func (md *R2HTTPMetadata) toJS() js.Value {
} }
} }
if !md.CacheExpiry.IsZero() { if !md.CacheExpiry.IsZero() {
obj.Set("cacheExpiry", timeToDate(md.CacheExpiry)) obj.Set("cacheExpiry", TimeToDate(md.CacheExpiry))
} }
return obj return obj
} }

View File

@ -36,7 +36,7 @@ func toR2Objects(v js.Value) (*R2Objects, error) {
return &R2Objects{ return &R2Objects{
Objects: objects, Objects: objects,
Truncated: v.Get("truncated").Bool(), Truncated: v.Get("truncated").Bool(),
Cursor: maybeString(v.Get("cursor")), Cursor: MaybeString(v.Get("cursor")),
DelimitedPrefixes: prefixes, DelimitedPrefixes: prefixes,
}, nil }, nil
} }

View File

@ -22,7 +22,7 @@ func toBody(streamOrNull js.Value) io.ReadCloser {
// toHeader converts JavaScript sides Headers to http.Header. // toHeader converts JavaScript sides Headers to http.Header.
// - Headers: https://developer.mozilla.org/ja/docs/Web/API/Headers // - Headers: https://developer.mozilla.org/ja/docs/Web/API/Headers
func toHeader(headers js.Value) http.Header { func toHeader(headers js.Value) http.Header {
entries := arrayFrom(headers.Call("entries")) entries := ArrayFrom(headers.Call("entries"))
headerLen := entries.Length() headerLen := entries.Length()
h := http.Header{} h := http.Header{}
for i := 0; i < headerLen; i++ { for i := 0; i < headerLen; i++ {

View File

@ -6,7 +6,7 @@ import (
) )
func toJSHeader(header http.Header) js.Value { func toJSHeader(header http.Header) js.Value {
h := headersClass.New() h := HeadersClass.New()
for key, values := range header { for key, values := range header {
for _, value := range values { for _, value := range values {
h.Call("append", key, value) h.Call("append", key, value)
@ -21,10 +21,10 @@ func toJSResponse(w *responseWriterBuffer) (js.Value, error) {
if status == 0 { if status == 0 {
status = http.StatusOK status = http.StatusOK
} }
respInit := newObject() respInit := NewObject()
respInit.Set("status", status) respInit.Set("status", status)
respInit.Set("statusText", http.StatusText(status)) respInit.Set("statusText", http.StatusText(status))
respInit.Set("headers", toJSHeader(w.Header())) respInit.Set("headers", toJSHeader(w.Header()))
readableStream := convertReaderToReadableStream(w.reader) readableStream := convertReaderToReadableStream(w.reader)
return responseClass.New(readableStream, respInit), nil return ResponseClass.New(readableStream, respInit), nil
} }

View File

@ -83,14 +83,14 @@ func (rs *readerToReadableStream) Pull(controller js.Value) error {
return nil return nil
} }
if err != nil { if err != nil {
jsErr := errorClass.New(err.Error()) jsErr := ErrorClass.New(err.Error())
controller.Call("error", jsErr) controller.Call("error", jsErr)
if err := rs.reader.Close(); err != nil { if err := rs.reader.Close(); err != nil {
return err return err
} }
return err return err
} }
ua := newUint8Array(n) ua := NewUint8Array(n)
_ = js.CopyBytesToJS(ua, rs.chunkBuf[:n]) _ = js.CopyBytesToJS(ua, rs.chunkBuf[:n])
controller.Call("enqueue", ua) controller.Call("enqueue", ua)
return nil return nil
@ -111,7 +111,7 @@ func convertReaderToReadableStream(reader io.ReadCloser) js.Value {
reader: reader, reader: reader,
chunkBuf: make([]byte, defaultChunkSize), chunkBuf: make([]byte, defaultChunkSize),
} }
rsInit := newObject() rsInit := NewObject()
rsInit.Set("pull", js.FuncOf(func(_ js.Value, args []js.Value) any { rsInit.Set("pull", js.FuncOf(func(_ js.Value, args []js.Value) any {
var cb js.Func var cb js.Func
cb = js.FuncOf(func(this js.Value, pArgs []js.Value) any { cb = js.FuncOf(func(this js.Value, pArgs []js.Value) any {
@ -121,13 +121,13 @@ func convertReaderToReadableStream(reader io.ReadCloser) js.Value {
controller := args[0] controller := args[0]
err := stream.Pull(controller) err := stream.Pull(controller)
if err != nil { if err != nil {
reject.Invoke(errorClass.New(err.Error())) reject.Invoke(ErrorClass.New(err.Error()))
return js.Undefined() return js.Undefined()
} }
resolve.Invoke() resolve.Invoke()
return js.Undefined() return js.Undefined()
}) })
return newPromise(cb) return NewPromise(cb)
})) }))
rsInit.Set("cancel", js.FuncOf(func(js.Value, []js.Value) any { rsInit.Set("cancel", js.FuncOf(func(js.Value, []js.Value) any {
err := stream.Cancel() err := stream.Cancel()
@ -136,5 +136,5 @@ func convertReaderToReadableStream(reader io.ReadCloser) js.Value {
} }
return js.Undefined() return js.Undefined()
})) }))
return readableStreamClass.New(rsInit) return ReadableStreamClass.New(rsInit)
} }