R: refactor cron with new runtimecontext

This commit is contained in:
aki-0421 2024-01-22 22:06:54 +09:00
parent 2eb402014f
commit a067e8e0b8
No known key found for this signature in database
GPG Key ID: 64A8CF6D437D166A
5 changed files with 92 additions and 92 deletions

View File

@ -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
}

View File

@ -3,9 +3,6 @@ main = "./build/worker.mjs"
compatibility_date = "2023-02-24"
workers_dev = false
[vars]
HELLO = "hello, world!"
[triggers]
crons = ["* * * * *"]

View File

@ -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)
}

28
cloudflare/cron/event.go Normal file
View File

@ -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
}

View File

@ -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 {}
}