Skip to content

Commit af65c8d

Browse files
authored
Merge pull request #14 from syumai/split-cloudflare-package
split cloudflare package
2 parents 1d1d2a9 + 1701300 commit af65c8d

File tree

14 files changed

+187
-167
lines changed

14 files changed

+187
-167
lines changed

kv.go renamed to cloudflare/kv.go

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
package workers
1+
package cloudflare
22

33
import (
44
"fmt"
55
"io"
66
"syscall/js"
7+
8+
"github.com/syumai/workers/internal/jsutil"
79
)
810

911
// KVNamespace represents interface of Cloudflare Worker's KV namespace instance.
@@ -15,7 +17,7 @@ type KVNamespace struct {
1517

1618
// NewKVNamespace returns KVNamespace for given variable name.
1719
// - variable name must be defined in wrangler.toml as kv_namespace's binding.
18-
// - if the given variable name doesn't exist on global object, returns error.
20+
// - if the given variable name doesn't exist on Global object, returns error.
1921
func NewKVNamespace(varName string) (*KVNamespace, error) {
2022
inst := js.Global().Get(varName)
2123
if inst.IsUndefined() {
@@ -31,7 +33,7 @@ type KVNamespaceGetOptions struct {
3133
}
3234

3335
func (opts *KVNamespaceGetOptions) toJS(type_ string) js.Value {
34-
obj := newObject()
36+
obj := jsutil.NewObject()
3537
obj.Set("type", type_)
3638
if opts == nil {
3739
return obj
@@ -46,7 +48,7 @@ func (opts *KVNamespaceGetOptions) toJS(type_ string) js.Value {
4648
// - if a network error happens, returns error.
4749
func (kv *KVNamespace) GetString(key string, opts *KVNamespaceGetOptions) (string, error) {
4850
p := kv.instance.Call("get", key, opts.toJS("text"))
49-
v, err := awaitPromise(p)
51+
v, err := jsutil.AwaitPromise(p)
5052
if err != nil {
5153
return "", err
5254
}
@@ -57,12 +59,12 @@ func (kv *KVNamespace) GetString(key string, opts *KVNamespaceGetOptions) (strin
5759
// - if a network error happens, returns error.
5860
func (kv *KVNamespace) GetReader(key string, opts *KVNamespaceGetOptions) (io.Reader, error) {
5961
p := kv.instance.Call("get", key, opts.toJS("stream"))
60-
v, err := awaitPromise(p)
62+
v, err := jsutil.AwaitPromise(p)
6163
if err != nil {
6264
return nil, err
6365
}
64-
global.Get("console").Call("log", v)
65-
return convertStreamReaderToReader(v.Call("getReader")), nil
66+
jsutil.Global.Get("console").Call("log", v)
67+
return jsutil.ConvertStreamReaderToReader(v.Call("getReader")), nil
6668
}
6769

6870
// KVNamespaceListOptions represents Cloudflare KV namespace list options.
@@ -77,7 +79,7 @@ func (opts *KVNamespaceListOptions) toJS() js.Value {
7779
if opts == nil {
7880
return js.Undefined()
7981
}
80-
obj := newObject()
82+
obj := jsutil.NewObject()
8183
if opts.Limit != 0 {
8284
obj.Set("limit", opts.Limit)
8385
}
@@ -151,7 +153,7 @@ func toKVNamespaceListResult(v js.Value) (*KVNamespaceListResult, error) {
151153
// List lists keys stored into the KV namespace.
152154
func (kv *KVNamespace) List(opts *KVNamespaceListOptions) (*KVNamespaceListResult, error) {
153155
p := kv.instance.Call("list", opts.toJS())
154-
v, err := awaitPromise(p)
156+
v, err := jsutil.AwaitPromise(p)
155157
if err != nil {
156158
return nil, err
157159
}
@@ -170,7 +172,7 @@ func (opts *KVNamespacePutOptions) toJS() js.Value {
170172
if opts == nil {
171173
return js.Undefined()
172174
}
173-
obj := newObject()
175+
obj := jsutil.NewObject()
174176
if opts.Expiration != 0 {
175177
obj.Set("expiration", opts.Expiration)
176178
}
@@ -184,7 +186,7 @@ func (opts *KVNamespacePutOptions) toJS() js.Value {
184186
// - if a network error happens, returns error.
185187
func (kv *KVNamespace) PutString(key string, value string, opts *KVNamespacePutOptions) error {
186188
p := kv.instance.Call("put", key, value, opts.toJS())
187-
_, err := awaitPromise(p)
189+
_, err := jsutil.AwaitPromise(p)
188190
if err != nil {
189191
return err
190192
}
@@ -200,10 +202,10 @@ func (kv *KVNamespace) PutReader(key string, value io.Reader, opts *KVNamespaceP
200202
if err != nil {
201203
return err
202204
}
203-
ua := newUint8Array(len(b))
205+
ua := jsutil.NewUint8Array(len(b))
204206
js.CopyBytesToJS(ua, b)
205207
p := kv.instance.Call("put", key, ua.Get("buffer"), opts.toJS())
206-
_, err = awaitPromise(p)
208+
_, err = jsutil.AwaitPromise(p)
207209
if err != nil {
208210
return err
209211
}
@@ -214,7 +216,7 @@ func (kv *KVNamespace) PutReader(key string, value io.Reader, opts *KVNamespaceP
214216
// - if a network error happens, returns error.
215217
func (kv *KVNamespace) Delete(key string) error {
216218
p := kv.instance.Call("delete", key)
217-
_, err := awaitPromise(p)
219+
_, err := jsutil.AwaitPromise(p)
218220
if err != nil {
219221
return err
220222
}

r2bucket.go renamed to cloudflare/r2bucket.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
package workers
1+
package cloudflare
22

33
import (
44
"fmt"
55
"io"
66
"syscall/js"
7+
8+
"github.com/syumai/workers/internal/jsutil"
79
)
810

911
// R2Bucket represents interface of Cloudflare Worker's R2 Bucket instance.
@@ -15,8 +17,8 @@ type R2Bucket struct {
1517

1618
// NewR2Bucket returns R2Bucket for given variable name.
1719
// - variable name must be defined in wrangler.toml.
18-
// - see example: https://github.com/syumai/workers/tree/main/examples/r2-image-viewer
19-
// - if the given variable name doesn't exist on global object, returns error.
20+
// - see example: https://github.com/syumai/workers/tree/main/examples/r2-image-viewer
21+
// - if the given variable name doesn't exist on Global object, returns error.
2022
func NewR2Bucket(varName string) (*R2Bucket, error) {
2123
inst := js.Global().Get(varName)
2224
if inst.IsUndefined() {
@@ -31,7 +33,7 @@ func NewR2Bucket(varName string) (*R2Bucket, error) {
3133
// - if a network error happens, returns error.
3234
func (r *R2Bucket) Head(key string) (*R2Object, error) {
3335
p := r.instance.Call("head", key)
34-
v, err := awaitPromise(p)
36+
v, err := jsutil.AwaitPromise(p)
3537
if err != nil {
3638
return nil, err
3739
}
@@ -46,7 +48,7 @@ func (r *R2Bucket) Head(key string) (*R2Object, error) {
4648
// - if a network error happens, returns error.
4749
func (r *R2Bucket) Get(key string) (*R2Object, error) {
4850
p := r.instance.Call("get", key)
49-
v, err := awaitPromise(p)
51+
v, err := jsutil.AwaitPromise(p)
5052
if err != nil {
5153
return nil, err
5254
}
@@ -68,7 +70,7 @@ func (opts *R2PutOptions) toJS() js.Value {
6870
if opts == nil {
6971
return js.Undefined()
7072
}
71-
obj := newObject()
73+
obj := jsutil.NewObject()
7274
if opts.HTTPMetadata != (R2HTTPMetadata{}) {
7375
obj.Set("httpMetadata", opts.HTTPMetadata.toJS())
7476
}
@@ -99,10 +101,10 @@ func (r *R2Bucket) Put(key string, value io.ReadCloser, opts *R2PutOptions) (*R2
99101
return nil, err
100102
}
101103
defer value.Close()
102-
ua := newUint8Array(len(b))
104+
ua := jsutil.NewUint8Array(len(b))
103105
js.CopyBytesToJS(ua, b)
104106
p := r.instance.Call("put", key, ua.Get("buffer"), opts.toJS())
105-
v, err := awaitPromise(p)
107+
v, err := jsutil.AwaitPromise(p)
106108
if err != nil {
107109
return nil, err
108110
}
@@ -113,7 +115,7 @@ func (r *R2Bucket) Put(key string, value io.ReadCloser, opts *R2PutOptions) (*R2
113115
// - if a network error happens, returns error.
114116
func (r *R2Bucket) Delete(key string) error {
115117
p := r.instance.Call("delete", key)
116-
if _, err := awaitPromise(p); err != nil {
118+
if _, err := jsutil.AwaitPromise(p); err != nil {
117119
return err
118120
}
119121
return nil
@@ -123,7 +125,7 @@ func (r *R2Bucket) Delete(key string) error {
123125
// - if a network error happens, returns error.
124126
func (r *R2Bucket) List() (*R2Objects, error) {
125127
p := r.instance.Call("list")
126-
v, err := awaitPromise(p)
128+
v, err := jsutil.AwaitPromise(p)
127129
if err != nil {
128130
return nil, err
129131
}

r2object.go renamed to cloudflare/r2object.go

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
package workers
1+
package cloudflare
22

33
import (
44
"errors"
55
"fmt"
66
"io"
77
"syscall/js"
88
"time"
9+
10+
"github.com/syumai/workers/internal/jsutil"
911
)
1012

1113
// R2Object represents Cloudflare R2 object.
@@ -41,7 +43,7 @@ func (o *R2Object) BodyUsed() (bool, error) {
4143
// toR2Object converts JavaScript side's R2Object to *R2Object.
4244
// - https://github.com/cloudflare/workers-types/blob/3012f263fb1239825e5f0061b267c8650d01b717/index.d.ts#L1094
4345
func toR2Object(v js.Value) (*R2Object, error) {
44-
uploaded, err := dateToTime(v.Get("uploaded"))
46+
uploaded, err := jsutil.DateToTime(v.Get("uploaded"))
4547
if err != nil {
4648
return nil, fmt.Errorf("error converting uploaded: %w", err)
4749
}
@@ -52,7 +54,7 @@ func toR2Object(v js.Value) (*R2Object, error) {
5254
bodyVal := v.Get("body")
5355
var body io.Reader
5456
if !bodyVal.IsUndefined() {
55-
body = convertStreamReaderToReader(v.Get("body").Call("getReader"))
57+
body = jsutil.ConvertStreamReaderToReader(v.Get("body").Call("getReader"))
5658
}
5759
return &R2Object{
5860
instance: v,
@@ -63,7 +65,7 @@ func toR2Object(v js.Value) (*R2Object, error) {
6365
HTTPETag: v.Get("httpEtag").String(),
6466
Uploaded: uploaded,
6567
HTTPMetadata: r2Meta,
66-
CustomMetadata: strRecordToMap(v.Get("customMetadata")),
68+
CustomMetadata: jsutil.StrRecordToMap(v.Get("customMetadata")),
6769
Body: body,
6870
}, nil
6971
}
@@ -80,22 +82,22 @@ type R2HTTPMetadata struct {
8082
}
8183

8284
func toR2HTTPMetadata(v js.Value) (R2HTTPMetadata, error) {
83-
cacheExpiry, err := maybeDate(v.Get("cacheExpiry"))
85+
cacheExpiry, err := jsutil.MaybeDate(v.Get("cacheExpiry"))
8486
if err != nil {
8587
return R2HTTPMetadata{}, fmt.Errorf("error converting cacheExpiry: %w", err)
8688
}
8789
return R2HTTPMetadata{
88-
ContentType: maybeString(v.Get("contentType")),
89-
ContentLanguage: maybeString(v.Get("contentLanguage")),
90-
ContentDisposition: maybeString(v.Get("contentDisposition")),
91-
ContentEncoding: maybeString(v.Get("contentEncoding")),
92-
CacheControl: maybeString(v.Get("cacheControl")),
90+
ContentType: jsutil.MaybeString(v.Get("contentType")),
91+
ContentLanguage: jsutil.MaybeString(v.Get("contentLanguage")),
92+
ContentDisposition: jsutil.MaybeString(v.Get("contentDisposition")),
93+
ContentEncoding: jsutil.MaybeString(v.Get("contentEncoding")),
94+
CacheControl: jsutil.MaybeString(v.Get("cacheControl")),
9395
CacheExpiry: cacheExpiry,
9496
}, nil
9597
}
9698

9799
func (md *R2HTTPMetadata) toJS() js.Value {
98-
obj := newObject()
100+
obj := jsutil.NewObject()
99101
kv := map[string]string{
100102
"contentType": md.ContentType,
101103
"contentLanguage": md.ContentLanguage,
@@ -109,7 +111,7 @@ func (md *R2HTTPMetadata) toJS() js.Value {
109111
}
110112
}
111113
if !md.CacheExpiry.IsZero() {
112-
obj.Set("cacheExpiry", timeToDate(md.CacheExpiry))
114+
obj.Set("cacheExpiry", jsutil.TimeToDate(md.CacheExpiry))
113115
}
114116
return obj
115117
}

r2objects.go renamed to cloudflare/r2objects.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
package workers
1+
package cloudflare
22

33
import (
44
"fmt"
55
"syscall/js"
6+
7+
"github.com/syumai/workers/internal/jsutil"
68
)
79

810
// R2Objects represents Cloudflare R2 objects.
@@ -36,7 +38,7 @@ func toR2Objects(v js.Value) (*R2Objects, error) {
3638
return &R2Objects{
3739
Objects: objects,
3840
Truncated: v.Get("truncated").Bool(),
39-
Cursor: maybeString(v.Get("cursor")),
41+
Cursor: jsutil.MaybeString(v.Get("cursor")),
4042
DelimitedPrefixes: prefixes,
4143
}, nil
4244
}

env.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package workers
22

3+
import "github.com/syumai/workers/internal/jsutil"
4+
35
// Getenv gets a value of an environment variable.
46
// - https://developers.cloudflare.com/workers/platform/environment-variables/
57
// - Technically, this function is just an alias for js.Global().Get(env_name).String().
68
func Getenv(name string) string {
7-
return global.Get(name).String()
9+
return jsutil.Global.Get(name).String()
810
}

examples/kv-counter/main.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"os"
88
"strconv"
99

10+
"github.com/syumai/workers/cloudflare"
11+
1012
"github.com/syumai/workers"
1113
)
1214

@@ -24,7 +26,7 @@ func handleErr(w http.ResponseWriter, msg string, err error) {
2426

2527
func main() {
2628
// initialize KV namespace instance
27-
kv, err := workers.NewKVNamespace(counterNamespace)
29+
kv, err := cloudflare.NewKVNamespace(counterNamespace)
2830
if err != nil {
2931
fmt.Fprintf(os.Stderr, "failed to init KV: %v", err)
3032
os.Exit(1)

examples/r2-image-server/main.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strings"
1010

1111
"github.com/syumai/workers"
12+
"github.com/syumai/workers/cloudflare"
1213
)
1314

1415
// bucketName is R2 bucket name defined in wrangler.toml.
@@ -22,11 +23,11 @@ func handleErr(w http.ResponseWriter, msg string, err error) {
2223
}
2324

2425
type server struct {
25-
bucket *workers.R2Bucket
26+
bucket *cloudflare.R2Bucket
2627
}
2728

2829
func newServer() (*server, error) {
29-
bucket, err := workers.NewR2Bucket(bucketName)
30+
bucket, err := cloudflare.NewR2Bucket(bucketName)
3031
if err != nil {
3132
return nil, err
3233
}
@@ -46,8 +47,8 @@ func (s *server) post(w http.ResponseWriter, req *http.Request, key string) {
4647
return
4748
}
4849
}
49-
_, err = s.bucket.Put(key, req.Body, &workers.R2PutOptions{
50-
HTTPMetadata: workers.R2HTTPMetadata{
50+
_, err = s.bucket.Put(key, req.Body, &cloudflare.R2PutOptions{
51+
HTTPMetadata: cloudflare.R2HTTPMetadata{
5152
ContentType: req.Header.Get("Content-Type"),
5253
},
5354
CustomMetadata: map[string]string{"custom-key": "custom-value"},

examples/r2-image-viewer/main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"strings"
99

1010
"github.com/syumai/workers"
11+
"github.com/syumai/workers/cloudflare"
1112
)
1213

1314
// bucketName is R2 bucket name defined in wrangler.toml.
@@ -22,7 +23,7 @@ func handleErr(w http.ResponseWriter, msg string, err error) {
2223
// This example is based on implementation in syumai/workers-playground
2324
// - https://github.com/syumai/workers-playground/blob/e32881648ccc055e3690a0d9c750a834261c333e/r2-image-viewer/src/index.ts#L30
2425
func handler(w http.ResponseWriter, req *http.Request) {
25-
bucket, err := workers.NewR2Bucket(bucketName)
26+
bucket, err := cloudflare.NewR2Bucket(bucketName)
2627
if err != nil {
2728
handleErr(w, "failed to get R2Bucket\n", err)
2829
return

handler.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"io"
66
"net/http"
77
"syscall/js"
8+
9+
"github.com/syumai/workers/internal/jsutil"
810
)
911

1012
var httpHandler http.Handler
@@ -28,9 +30,9 @@ func init() {
2830
}()
2931
return js.Undefined()
3032
})
31-
return newPromise(cb)
33+
return jsutil.NewPromise(cb)
3234
})
33-
global.Set("handleRequest", handleRequestCallback)
35+
jsutil.Global.Set("handleRequest", handleRequestCallback)
3436
}
3537

3638
// handleRequest accepts a Request object and returns Response object.

0 commit comments

Comments
 (0)