update implementation of R2 example

This commit is contained in:
syumai 2022-05-29 09:30:15 +09:00
parent a95ca1de25
commit 78dc0e3ad8
6 changed files with 23 additions and 10 deletions

View File

@ -5,7 +5,7 @@ dev:
.PHONY: build
build:
mkdir -p dist
tinygo build -o ./dist/app.wasm -target wasm ./main.go
tinygo build -o ./dist/app.wasm -target wasm ./...
.PHONY: publish
publish:

View File

@ -29,6 +29,8 @@ func newPromise(fn js.Func) js.Value {
}
func awaitPromise(promiseVal js.Value) (js.Value, error) {
fmt.Println("await promise")
fmt.Println(promiseVal.Call("toString").String())
resultCh := make(chan js.Value)
errCh := make(chan error)
var then, catch js.Func
@ -47,8 +49,10 @@ func awaitPromise(promiseVal js.Value) (js.Value, error) {
promiseVal.Call("then", then).Call("catch", catch)
select {
case result := <-resultCh:
fmt.Println("got result of promise")
return result, nil
case err := <-errCh:
fmt.Println("got error of promise")
return js.Value{}, err
}
}

View File

@ -3,6 +3,7 @@ package main
import (
"fmt"
"io"
"log"
"net/http"
"github.com/syumai/workers"
@ -11,7 +12,8 @@ import (
// bucketName is R2 bucket name defined in wrangler.toml.
const bucketName = "BUCKET"
func handleErr(w http.ResponseWriter, msg string) {
func handleErr(w http.ResponseWriter, msg string, err error) {
log.Println(err)
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(msg))
}
@ -19,15 +21,17 @@ func handleErr(w http.ResponseWriter, msg string) {
// This example is based on implementation in syumai/workers-playground
// * https://github.com/syumai/workers-playground/blob/e32881648ccc055e3690a0d9c750a834261c333e/r2-image-viewer/src/index.ts#L30
func handler(w http.ResponseWriter, req *http.Request) {
fmt.Println("new R2Bucket")
bucket, err := NewR2Bucket(bucketName)
if err != nil {
handleErr(w, "failed to get R2Bucket\n")
handleErr(w, "failed to get R2Bucket\n", err)
return
}
imgPath := req.URL.Path
fmt.Println("bucket.get")
imgObj, err := bucket.Get(imgPath)
if err != nil {
handleErr(w, "failed to get R2Object\n")
handleErr(w, "failed to get R2Object\n", err)
return
}
w.Header().Set("Cache-Control", "public, max-age=14400")
@ -37,6 +41,7 @@ func handler(w http.ResponseWriter, req *http.Request) {
contentType = *imgObj.HTTPMetadata.ContentType
}
w.Header().Set("Content-Type", contentType)
fmt.Println("return result")
io.Copy(w, imgObj.Body)
}

View File

@ -41,6 +41,7 @@ func (r *r2Bucket) Get(key string) (*R2Object, error) {
if err != nil {
return nil, err
}
fmt.Println(v)
if v.IsNull() {
return nil, nil
}

View File

@ -41,6 +41,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) {
fmt.Println("toR2Object")
uploaded, err := dateToTime(v.Get("uploaded"))
if err != nil {
return nil, fmt.Errorf("error converting uploaded: %w", err)

View File

@ -9,9 +9,11 @@ const load = WebAssembly.instantiate(mod, go.importObject).then((instance) => {
return instance;
});
export default {
async fetch(req) {
await load;
return handleRequest(req);
},
};
async function processRequest(event) {
const req = event.request;
await load;
console.log("finished loading");
return handleRequest(req);
}
addEventListener("fetch", (event) => event.respondWith(processRequest(event)))