From e3163f30c6172fae201b45a6104801774660d365 Mon Sep 17 00:00:00 2001 From: syumai Date: Wed, 3 Aug 2022 00:22:33 +0900 Subject: [PATCH 1/3] remove KV interface type --- kv.go | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/kv.go b/kv.go index c8cd7ac..7fc5cc4 100644 --- a/kv.go +++ b/kv.go @@ -9,30 +9,19 @@ import ( // KVNamespace represents interface of Cloudflare Worker's KV namespace instance. // - https://developers.cloudflare.com/workers/runtime-apis/kv/ // - https://github.com/cloudflare/workers-types/blob/3012f263fb1239825e5f0061b267c8650d01b717/index.d.ts#L850 -type KVNamespace interface { - GetString(key string, opts *KVNamespaceGetOptions) (string, error) - GetReader(key string, opts *KVNamespaceGetOptions) (io.Reader, error) - List(opts *KVNamespaceListOptions) (*KVNamespaceListResult, error) - PutString(key string, value string, opts *KVNamespacePutOptions) error - PutReader(key string, value io.Reader, opts *KVNamespacePutOptions) error - Delete(key string) error -} - -type kvNamespace struct { +type KVNamespace struct { instance js.Value } -var _ KVNamespace = &kvNamespace{} - // NewKVNamespace returns KVNamespace for given variable name. // - 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. -func NewKVNamespace(varName string) (KVNamespace, error) { +func NewKVNamespace(varName string) (*KVNamespace, error) { inst := js.Global().Get(varName) if inst.IsUndefined() { return nil, fmt.Errorf("%s is undefined", varName) } - return &kvNamespace{instance: inst}, nil + return &KVNamespace{instance: inst}, nil } // KVNamespaceGetOptions represents Cloudflare KV namespace get options. @@ -55,7 +44,7 @@ func (opts *KVNamespaceGetOptions) toJS(type_ string) js.Value { // GetString gets string value by the specified key. // - 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")) v, err := awaitPromise(p) if err != nil { @@ -66,7 +55,7 @@ func (kv *kvNamespace) GetString(key string, opts *KVNamespaceGetOptions) (strin // GetReader gets stream value by the specified key. // - 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")) v, err := awaitPromise(p) if err != nil { @@ -160,7 +149,7 @@ func toKVNamespaceListResult(v js.Value) (*KVNamespaceListResult, error) { } // 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()) v, err := awaitPromise(p) if err != nil { @@ -193,7 +182,7 @@ func (opts *KVNamespacePutOptions) toJS() js.Value { // PutString puts string value into KV with key. // - 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()) _, err := awaitPromise(p) if err != nil { @@ -205,7 +194,7 @@ func (kv *kvNamespace) PutString(key string, value string, opts *KVNamespacePutO // PutReader puts stream value into KV with key. // - This method copies all bytes into memory for implementation restriction. // - if a network error happens, returns error. -func (kv *kvNamespace) PutReader(key string, value io.Reader, opts *KVNamespacePutOptions) error { +func (kv *KVNamespace) PutReader(key string, value io.Reader, opts *KVNamespacePutOptions) error { // fetch body cannot be ReadableStream. see: https://github.com/whatwg/fetch/issues/1438 b, err := io.ReadAll(value) if err != nil { @@ -223,7 +212,7 @@ func (kv *kvNamespace) PutReader(key string, value io.Reader, opts *KVNamespaceP // Delete deletes key-value pair specified by the key. // - 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) _, err := awaitPromise(p) if err != nil { From 474db9580265a4e2bb5639f1974c0e1ff4ef0191 Mon Sep 17 00:00:00 2001 From: syumai Date: Wed, 3 Aug 2022 00:23:22 +0900 Subject: [PATCH 2/3] remove R2Bucket interface type --- r2bucket.go | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/r2bucket.go b/r2bucket.go index 91fb232..359d021 100644 --- a/r2bucket.go +++ b/r2bucket.go @@ -9,37 +9,27 @@ import ( // R2Bucket represents interface of Cloudflare Worker's R2 Bucket instance. // - https://developers.cloudflare.com/r2/runtime-apis/#bucket-method-definitions // - https://github.com/cloudflare/workers-types/blob/3012f263fb1239825e5f0061b267c8650d01b717/index.d.ts#L1006 -type R2Bucket interface { - Head(key string) (*R2Object, error) - Get(key string) (*R2Object, error) - Put(key string, value io.ReadCloser, opts *R2PutOptions) (*R2Object, error) - Delete(key string) error - List() (*R2Objects, error) -} - -type r2Bucket struct { +type R2Bucket struct { instance js.Value } -var _ R2Bucket = &r2Bucket{} - // NewR2Bucket returns R2Bucket for given variable name. // - variable name must be defined in wrangler.toml. // - 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. -func NewR2Bucket(varName string) (R2Bucket, error) { +func NewR2Bucket(varName string) (*R2Bucket, error) { inst := js.Global().Get(varName) if inst.IsUndefined() { return nil, fmt.Errorf("%s is undefined", varName) } - return &r2Bucket{instance: inst}, nil + return &R2Bucket{instance: inst}, nil } // Head returns the result of `head` call to R2Bucket. // - Body field of *R2Object is always nil for Head call. // - if the object for given key doesn't exist, returns nil. // - 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) v, err := awaitPromise(p) if err != nil { @@ -54,7 +44,7 @@ func (r *r2Bucket) Head(key string) (*R2Object, error) { // Get returns the result of `get` call to R2Bucket. // - if the object for given key doesn't exist, returns nil. // - 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) v, err := awaitPromise(p) if err != nil { @@ -102,7 +92,7 @@ func (opts *R2PutOptions) toJS() js.Value { // * This method copies all bytes into memory for implementation restriction. // * Body field of *R2Object is always nil for Put call. // * if a network error happens, returns error. -func (r *r2Bucket) Put(key string, value io.ReadCloser, opts *R2PutOptions) (*R2Object, error) { +func (r *R2Bucket) Put(key string, value io.ReadCloser, opts *R2PutOptions) (*R2Object, error) { // fetch body cannot be ReadableStream. see: https://github.com/whatwg/fetch/issues/1438 b, err := io.ReadAll(value) if err != nil { @@ -121,7 +111,7 @@ func (r *r2Bucket) Put(key string, value io.ReadCloser, opts *R2PutOptions) (*R2 // Delete returns the result of `delete` call to R2Bucket. // * 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) if _, err := awaitPromise(p); err != nil { return err @@ -131,7 +121,7 @@ func (r *r2Bucket) Delete(key string) error { // List returns the result of `list` call to R2Bucket. // * if a network error happens, returns error. -func (r *r2Bucket) List() (*R2Objects, error) { +func (r *R2Bucket) List() (*R2Objects, error) { p := r.instance.Call("list") v, err := awaitPromise(p) if err != nil { From 311cc15b4eabce4291144f6071642f865c670107 Mon Sep 17 00:00:00 2001 From: syumai Date: Wed, 3 Aug 2022 00:24:44 +0900 Subject: [PATCH 3/3] fix r2-image-server example --- examples/r2-image-server/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/r2-image-server/main.go b/examples/r2-image-server/main.go index 60b2bd4..73e2d01 100644 --- a/examples/r2-image-server/main.go +++ b/examples/r2-image-server/main.go @@ -22,7 +22,7 @@ func handleErr(w http.ResponseWriter, msg string, err error) { } type server struct { - bucket workers.R2Bucket + bucket *workers.R2Bucket } func newServer() (*server, error) {