diff --git a/index.d.ts b/index.d.ts index 6ced750..00541f9 100644 --- a/index.d.ts +++ b/index.d.ts @@ -13,6 +13,7 @@ declare interface CloudworkerInit { declare class Cloudworker { constructor (script: string, opts?: CloudworkerInit) + triggerCronJob (): Promise dispatch (request: Request): Promise listen (...args: any[]): http.Server } diff --git a/lib/__tests__/cloudworker.test.js b/lib/__tests__/cloudworker.test.js index 0032933..c00b15b 100644 --- a/lib/__tests__/cloudworker.test.js +++ b/lib/__tests__/cloudworker.test.js @@ -1,6 +1,7 @@ const Cloudworker = require('../cloudworker') const runtime = require('../runtime') const httpMocks = require('node-mocks-http') +const { KeyValueStore } = require('../kv') const simpleScript = `addEventListener('fetch', event => { event.respondWith(new Response('hello', {status: 200})) }) @@ -165,4 +166,20 @@ describe('cloudworker', () => { expect(res.headers.get('x-colo')).toEqual('YYZ') done() }) + + test('triggerCronJob sends scheduled event to worker', async done => { + const store = new KeyValueStore() + store.put('hello', 'world') + const bindings = {TestNamespace: store} + const scheduleScript = ` + addEventListener('scheduled', async(event) => { + await TestNamespace.put("hello", "test"); + }) + ` + const cw = new Cloudworker(scheduleScript, {bindings}) + await cw.triggerCronJob() + const valueTest = await store.get('hello', 'text') + expect(valueTest).toEqual('test') + done() + }) }) diff --git a/lib/__tests__/runtime.test.js b/lib/__tests__/runtime.test.js index 3de5317..94db2c1 100644 --- a/lib/__tests__/runtime.test.js +++ b/lib/__tests__/runtime.test.js @@ -46,6 +46,7 @@ describe('runtime', () => { 'RegExp', 'Request', 'Response', + 'ScheduleEvent', 'Set', 'SharedArrayBuffer', 'String', diff --git a/lib/cloudworker.js b/lib/cloudworker.js index 09a3e26..5f5cf6b 100644 --- a/lib/cloudworker.js +++ b/lib/cloudworker.js @@ -27,6 +27,23 @@ class Cloudworker { this._load(workerScript, this.context) } + async triggerCronJob () { + const promise = new Promise((resolve, reject) => { + setTimeout(() => { + resolve() + }, 1000) + + const error = async (error) => { + reject(error) + } + + const event = new runtime.ScheduleEvent('scheduled', {scheduledTime: 0}) + event.onError = error + this.dispatcher.emit('scheduled', event) + }) + return promise + } + async dispatch (request) { if (!(request instanceof runtime.Request)) { throw new TypeError('argument must be a Request') diff --git a/lib/runtime.js b/lib/runtime.js index cfb1e0f..f53e6cb 100644 --- a/lib/runtime.js +++ b/lib/runtime.js @@ -2,6 +2,7 @@ const { Request, Response, fetch, Headers, freezeHeaders, bindCfProperty } = req const { URL, URLSearchParams } = require('./runtime/url') const { ReadableStream, WritableStream, TransformStream } = require('./runtime/stream') const { FetchEvent } = require('./runtime/fetch-event') +const { ScheduleEvent } = require('./runtime/schedule-event') const { crypto } = require('./runtime/crypto') const { TextDecoder, TextEncoder } = require('./runtime/text-encoder') const { atob, btoa } = require('./runtime/base64') @@ -23,6 +24,7 @@ class Context { this.WritableStream = WritableStream this.TransformStream = TransformStream this.FetchEvent = FetchEvent + this.ScheduleEvent = ScheduleEvent this.caches = cacheFactory this.crypto = crypto this.TextDecoder = TextDecoder @@ -98,6 +100,7 @@ module.exports = { Context, fetch, FetchEvent, + ScheduleEvent, freezeHeaders, bindCfProperty, Headers, diff --git a/lib/runtime/schedule-event.js b/lib/runtime/schedule-event.js new file mode 100644 index 0000000..a54d14c --- /dev/null +++ b/lib/runtime/schedule-event.js @@ -0,0 +1,15 @@ +class ScheduleEvent { + constructor (type, init) { + this.scheduledTime = init.scheduledTime + } + + waitUntil (promise) { + + } + + passThroughOnException () { + + } +} + +module.exports.ScheduleEvent = ScheduleEvent