mirror of
https://github.com/syumai/workers.git
synced 2025-03-11 01:39: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 (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/syumai/workers/cloudflare"
|
|
||||||
"github.com/syumai/workers/cloudflare/cron"
|
"github.com/syumai/workers/cloudflare/cron"
|
||||||
)
|
)
|
||||||
|
|
||||||
func task(ctx context.Context, event *cron.Event) error {
|
func task(ctx context.Context) error {
|
||||||
fmt.Println(cloudflare.Getenv(ctx, "HELLO"))
|
e, err := cron.NewEvent(ctx)
|
||||||
|
if err != nil {
|
||||||
if event.ScheduledTime.Minute()%2 == 0 {
|
return err
|
||||||
return errors.New("even numbers cause errors")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fmt.Println(e.ScheduledTime.Unix())
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,9 +3,6 @@ main = "./build/worker.mjs"
|
|||||||
compatibility_date = "2023-02-24"
|
compatibility_date = "2023-02-24"
|
||||||
workers_dev = false
|
workers_dev = false
|
||||||
|
|
||||||
[vars]
|
|
||||||
HELLO = "hello, world!"
|
|
||||||
|
|
||||||
[triggers]
|
[triggers]
|
||||||
crons = ["* * * * *"]
|
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