Skip to main content

worker/
schedule.rs

1use std::future::Future;
2use std::panic::AssertUnwindSafe;
3use wasm_bindgen::prelude::*;
4use wasm_bindgen_futures::future_to_promise;
5use worker_sys::{ScheduleContext as EdgeScheduleContext, ScheduledEvent as EdgeScheduledEvent};
6
7/// [Schedule](https://developers.cloudflare.com/workers/runtime-apis/scheduled-event#syntax-module-worker)
8#[derive(Debug, Clone)]
9pub struct ScheduledEvent {
10    cron: String,
11    scheduled_time: f64,
12    ty: String,
13}
14
15impl From<EdgeScheduledEvent> for ScheduledEvent {
16    fn from(schedule: EdgeScheduledEvent) -> Self {
17        Self {
18            cron: schedule.cron().unwrap(),
19            scheduled_time: schedule.scheduled_time().unwrap(),
20            ty: String::from("scheduled"),
21        }
22    }
23}
24
25impl ScheduledEvent {
26    /// get cron trigger
27    pub fn cron(&self) -> String {
28        self.cron.clone()
29    }
30
31    /// get type
32    pub fn ty(&self) -> String {
33        self.ty.clone()
34    }
35
36    /// get trigger time as f64
37    pub fn schedule(&self) -> f64 {
38        self.scheduled_time
39    }
40}
41
42#[derive(Debug, Clone)]
43pub struct ScheduleContext {
44    edge: EdgeScheduleContext,
45}
46
47impl From<EdgeScheduleContext> for ScheduleContext {
48    fn from(edge: EdgeScheduleContext) -> Self {
49        Self { edge }
50    }
51}
52
53impl ScheduleContext {
54    pub fn wait_until<T>(&self, handler: T)
55    where
56        T: Future<Output = ()> + 'static,
57    {
58        self.edge
59            .wait_until(future_to_promise(AssertUnwindSafe(async {
60                handler.await;
61                Ok(JsValue::null())
62            })))
63            .unwrap()
64    }
65}