[go: up one dir, main page]

worker/
schedule.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use std::future::Future;
use wasm_bindgen::prelude::*;
use wasm_bindgen_futures::future_to_promise;
use worker_sys::{ScheduleContext as EdgeScheduleContext, ScheduledEvent as EdgeScheduledEvent};

/// [Schedule](https://developers.cloudflare.com/workers/runtime-apis/scheduled-event#syntax-module-worker)
#[derive(Debug, Clone)]
pub struct ScheduledEvent {
    cron: String,
    scheduled_time: f64,
    ty: String,
}

impl From<EdgeScheduledEvent> for ScheduledEvent {
    fn from(schedule: EdgeScheduledEvent) -> Self {
        Self {
            cron: schedule.cron().unwrap(),
            scheduled_time: schedule.scheduled_time().unwrap(),
            ty: String::from("scheduled"),
        }
    }
}

impl ScheduledEvent {
    /// get cron trigger
    pub fn cron(&self) -> String {
        self.cron.clone()
    }

    /// get type
    pub fn ty(&self) -> String {
        self.ty.clone()
    }

    /// get trigger time as f64
    pub fn schedule(&self) -> f64 {
        self.scheduled_time
    }
}

#[derive(Clone)]
pub struct ScheduleContext {
    edge: EdgeScheduleContext,
}

impl From<EdgeScheduleContext> for ScheduleContext {
    fn from(edge: EdgeScheduleContext) -> Self {
        Self { edge }
    }
}

impl ScheduleContext {
    pub fn wait_until<T>(&self, handler: T)
    where
        T: Future<Output = ()> + 'static,
    {
        self.edge
            .wait_until(future_to_promise(async {
                handler.await;
                Ok(JsValue::null())
            }))
            .unwrap()
    }
}