From a067e8e0b81e5fe6cd46a955d5747500e66899dc Mon Sep 17 00:00:00 2001 From: aki-0421 <118268728+aki-0421@users.noreply.github.com> Date: Mon, 22 Jan 2024 22:06:54 +0900 Subject: [PATCH] R: refactor cron with new runtimecontext --- _examples/cron/main.go | 13 +++--- _examples/cron/wrangler.toml | 3 -- cloudflare/cron/cron.go | 82 ------------------------------------ cloudflare/cron/event.go | 28 ++++++++++++ cloudflare/cron/scheduler.go | 58 +++++++++++++++++++++++++ 5 files changed, 92 insertions(+), 92 deletions(-) delete mode 100644 cloudflare/cron/cron.go create mode 100644 cloudflare/cron/event.go create mode 100644 cloudflare/cron/scheduler.go diff --git a/_examples/cron/main.go b/_examples/cron/main.go index 0b01bf5..73c3ec9 100644 --- a/_examples/cron/main.go +++ b/_examples/cron/main.go @@ -2,20 +2,19 @@ package main import ( "context" - "errors" "fmt" - "github.com/syumai/workers/cloudflare" "github.com/syumai/workers/cloudflare/cron" ) -func task(ctx context.Context, event *cron.Event) error { - fmt.Println(cloudflare.Getenv(ctx, "HELLO")) - - if event.ScheduledTime.Minute()%2 == 0 { - return errors.New("even numbers cause errors") +func task(ctx context.Context) error { + e, err := cron.NewEvent(ctx) + if err != nil { + return err } + fmt.Println(e.ScheduledTime.Unix()) + return nil } diff --git a/_examples/cron/wrangler.toml b/_examples/cron/wrangler.toml index c6d714e..e09dddd 100644 --- a/_examples/cron/wrangler.toml +++ b/_examples/cron/wrangler.toml @@ -3,9 +3,6 @@ main = "./build/worker.mjs" compatibility_date = "2023-02-24" workers_dev = false -[vars] -HELLO = "hello, world!" - [triggers] crons = ["* * * * *"] diff --git a/cloudflare/cron/cron.go b/cloudflare/cron/cron.go deleted file mode 100644 index 923f62a..0000000 --- a/cloudflare/cron/cron.go +++ /dev/null @@ -1,82 +0,0 @@ -package cron - -import ( - "context" - "errors" - "fmt" - "syscall/js" - "time" - - "github.com/syumai/workers/internal/cfcontext" - "github.com/syumai/workers/internal/jsutil" -) - -// Event represents information about the Cron that invoked this worker. -type Event struct { - Cron string - ScheduledTime time.Time -} - -// toEvent converts JS Object to Go Event struct -func toEvent(obj js.Value) (*Event, error) { - if obj.IsUndefined() { - return nil, errors.New("event is null") - } - cronVal := obj.Get("cron").String() - scheduledTimeVal := obj.Get("scheduledTime").Float() - return &Event{ - Cron: cronVal, - ScheduledTime: time.Unix(int64(scheduledTimeVal)/1000, 0).UTC(), - }, nil -} - -type Task func(ctx context.Context, event *Event) error - -var scheduledTask Task - -// ScheduleTask sets the Task to be executed -func ScheduleTask(task Task) { - scheduledTask = task - js.Global().Call("ready") - select {} -} - -func runScheduler(eventObj js.Value, runtimeCtxObj js.Value) error { - ctx := cfcontext.New(context.Background(), runtimeCtxObj, js.Value{}) - event, err := toEvent(eventObj) - if err != nil { - return err - } - err = scheduledTask(ctx, event) - if err != nil { - return err - } - return nil -} - -func init() { - runSchedulerCallback := js.FuncOf(func(_ js.Value, args []js.Value) any { - if len(args) != 2 { - panic(fmt.Errorf("invalid number of arguments given to runScheduler: %d", len(args))) - } - event := args[0] - runtimeCtx := args[1] - - var cb js.Func - cb = js.FuncOf(func(_ js.Value, pArgs []js.Value) any { - defer cb.Release() - resolve := pArgs[0] - go func() { - err := runScheduler(event, runtimeCtx) - if err != nil { - panic(err) - } - resolve.Invoke(js.Undefined()) - }() - return js.Undefined() - }) - - return jsutil.NewPromise(cb) - }) - jsutil.Binding.Set("runScheduler", runSchedulerCallback) -} diff --git a/cloudflare/cron/event.go b/cloudflare/cron/event.go new file mode 100644 index 0000000..96d104f --- /dev/null +++ b/cloudflare/cron/event.go @@ -0,0 +1,28 @@ +package cron + +import ( + "context" + "errors" + "time" + + "github.com/syumai/workers/internal/runtimecontext" +) + +// Event represents information about the Cron that invoked this worker. +type Event struct { + Cron string + ScheduledTime time.Time +} + +func NewEvent(ctx context.Context) (*Event, error) { + obj := runtimecontext.MustExtractTriggerObj(ctx) + if obj.IsUndefined() { + return nil, errors.New("event is null") + } + + scheduledTimeVal := obj.Get("scheduledTime").Float() + return &Event{ + Cron: obj.Get("cron").String(), + ScheduledTime: time.Unix(int64(scheduledTimeVal)/1000, 0).UTC(), + }, nil +} diff --git a/cloudflare/cron/scheduler.go b/cloudflare/cron/scheduler.go new file mode 100644 index 0000000..d559568 --- /dev/null +++ b/cloudflare/cron/scheduler.go @@ -0,0 +1,58 @@ +package cron + +import ( + "context" + "fmt" + "syscall/js" + + "github.com/syumai/workers/internal/jsutil" + "github.com/syumai/workers/internal/runtimecontext" +) + +type Task func(ctx context.Context) error + +var scheduledTask Task + +func runScheduler(eventObj js.Value, runtimeCtxObj js.Value) error { + ctx := runtimecontext.New(context.Background(), eventObj, runtimeCtxObj) + if err := scheduledTask(ctx); err != nil { + return err + } + return nil +} + +func init() { + runSchedulerCallback := js.FuncOf(func(_ js.Value, args []js.Value) any { + if len(args) != 1 { + panic(fmt.Errorf("invalid number of arguments given to runScheduler: %d", len(args))) + } + eventObj := args[0] + runtimeCtxObj := jsutil.RuntimeContext + var cb js.Func + cb = js.FuncOf(func(_ js.Value, pArgs []js.Value) any { + defer cb.Release() + resolve := pArgs[0] + go func() { + err := runScheduler(eventObj, runtimeCtxObj) + if err != nil { + panic(err) + } + resolve.Invoke(js.Undefined()) + }() + return js.Undefined() + }) + + return jsutil.NewPromise(cb) + }) + jsutil.Binding.Set("runScheduler", runSchedulerCallback) +} + +//go:wasmimport workers ready +func ready() + +// ScheduleTask sets the Task to be executed +func ScheduleTask(task Task) { + scheduledTask = task + ready() + select {} +}