mirror of
https://github.com/syumai/workers.git
synced 2025-03-10 17:29:11 +00:00
R: refactor cron with new runtimecontext
This commit is contained in:
parent
2eb402014f
commit
a067e8e0b8
@ -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
|
||||
}
|
||||
|
||||
|
@ -3,9 +3,6 @@ main = "./build/worker.mjs"
|
||||
compatibility_date = "2023-02-24"
|
||||
workers_dev = false
|
||||
|
||||
[vars]
|
||||
HELLO = "hello, world!"
|
||||
|
||||
[triggers]
|
||||
crons = ["* * * * *"]
|
||||
|
||||
|
@ -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
28
cloudflare/cron/event.go
Normal 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
|
||||
}
|
58
cloudflare/cron/scheduler.go
Normal file
58
cloudflare/cron/scheduler.go
Normal 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 {}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user