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#[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 pub fn cron(&self) -> String {
28 self.cron.clone()
29 }
30
31 pub fn ty(&self) -> String {
33 self.ty.clone()
34 }
35
36 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}