Skip to main content

pylon_workers/
noop_adapters.rs

1//! No-op adapters for router traits not yet supported on Workers.
2//!
3//! These implement the router's trait interfaces with stub responses.
4//! As Workers features are built out (Durable Object rooms, Queues jobs,
5//! etc.), these will be replaced with real implementations.
6
7use pylon_http::DataError;
8use pylon_router::{
9    CacheOps, FileOps, JobOps, OpenApiGenerator, PubSubOps, RoomOps, SchedulerOps, WorkflowOps,
10};
11
12/// Implements all router service traits with no-op stubs.
13pub struct NoopAll {
14    manifest: pylon_kernel::AppManifest,
15}
16
17impl NoopAll {
18    pub fn new(manifest: &pylon_kernel::AppManifest) -> Self {
19        Self {
20            manifest: manifest.clone(),
21        }
22    }
23}
24
25impl RoomOps for NoopAll {
26    fn join(
27        &self,
28        _room: &str,
29        _user_id: &str,
30        _data: Option<serde_json::Value>,
31    ) -> Result<(serde_json::Value, serde_json::Value), DataError> {
32        Err(DataError {
33            code: "NOT_AVAILABLE".into(),
34            message: "Rooms are not available on this platform".into(),
35        })
36    }
37
38    fn leave(&self, _room: &str, _user_id: &str) -> Option<serde_json::Value> {
39        None
40    }
41
42    fn set_presence(
43        &self,
44        _room: &str,
45        _user_id: &str,
46        _data: serde_json::Value,
47    ) -> Option<serde_json::Value> {
48        None
49    }
50
51    fn broadcast(
52        &self,
53        _room: &str,
54        _sender: Option<&str>,
55        _topic: &str,
56        _data: serde_json::Value,
57    ) -> Option<serde_json::Value> {
58        None
59    }
60
61    fn list_rooms(&self) -> Vec<String> {
62        vec![]
63    }
64
65    fn room_size(&self, _name: &str) -> usize {
66        0
67    }
68
69    fn members(&self, _name: &str) -> Vec<serde_json::Value> {
70        vec![]
71    }
72}
73
74impl CacheOps for NoopAll {
75    fn handle_command(&self, _body: &str) -> (u16, String) {
76        (
77            503,
78            pylon_router::json_error("NOT_AVAILABLE", "Cache not available on this platform"),
79        )
80    }
81
82    fn handle_get(&self, _key: &str) -> (u16, String) {
83        (
84            503,
85            pylon_router::json_error("NOT_AVAILABLE", "Cache not available on this platform"),
86        )
87    }
88
89    fn handle_delete(&self, _key: &str) -> (u16, String) {
90        (
91            503,
92            pylon_router::json_error("NOT_AVAILABLE", "Cache not available on this platform"),
93        )
94    }
95}
96
97impl PubSubOps for NoopAll {
98    fn handle_publish(&self, _body: &str) -> (u16, String) {
99        (
100            503,
101            pylon_router::json_error("NOT_AVAILABLE", "PubSub not available on this platform"),
102        )
103    }
104
105    fn handle_channels(&self) -> (u16, String) {
106        (200, "[]".into())
107    }
108
109    fn handle_history(&self, _channel: &str, _url: &str) -> (u16, String) {
110        (200, "[]".into())
111    }
112}
113
114impl JobOps for NoopAll {
115    fn enqueue(
116        &self,
117        _name: &str,
118        _payload: serde_json::Value,
119        _priority: &str,
120        _delay_secs: u64,
121        _max_retries: u32,
122        _queue: &str,
123    ) -> String {
124        String::new()
125    }
126
127    fn stats(&self) -> serde_json::Value {
128        serde_json::json!({})
129    }
130
131    fn dead_letters(&self) -> serde_json::Value {
132        serde_json::json!([])
133    }
134
135    fn retry_dead(&self, _id: &str) -> bool {
136        false
137    }
138
139    fn list_jobs(
140        &self,
141        _status: Option<&str>,
142        _queue: Option<&str>,
143        _limit: usize,
144    ) -> serde_json::Value {
145        serde_json::json!([])
146    }
147
148    fn get_job(&self, _id: &str) -> Option<serde_json::Value> {
149        None
150    }
151}
152
153impl SchedulerOps for NoopAll {
154    fn list_tasks(&self) -> serde_json::Value {
155        serde_json::json!([])
156    }
157
158    fn trigger(&self, _name: &str) -> bool {
159        false
160    }
161}
162
163impl WorkflowOps for NoopAll {
164    fn definitions(&self) -> serde_json::Value {
165        serde_json::json!([])
166    }
167
168    fn start(&self, _name: &str, _input: serde_json::Value) -> Result<String, String> {
169        Err("Workflows not available on this platform".into())
170    }
171
172    fn list(&self, _status_filter: Option<&str>) -> serde_json::Value {
173        serde_json::json!([])
174    }
175
176    fn get(&self, _id: &str) -> Option<serde_json::Value> {
177        None
178    }
179
180    fn advance(&self, _id: &str) -> Result<String, String> {
181        Err("Workflows not available on this platform".into())
182    }
183
184    fn send_event(&self, _id: &str, _event: &str, _data: serde_json::Value) -> Result<(), String> {
185        Err("Workflows not available on this platform".into())
186    }
187
188    fn cancel(&self, _id: &str) -> Result<(), String> {
189        Err("Workflows not available on this platform".into())
190    }
191}
192
193impl FileOps for NoopAll {
194    fn upload(&self, _body: &str) -> (u16, String) {
195        (
196            503,
197            pylon_router::json_error(
198                "NOT_AVAILABLE",
199                "File uploads not available on this platform",
200            ),
201        )
202    }
203
204    fn get_file(&self, _id: &str) -> (u16, String) {
205        (
206            503,
207            pylon_router::json_error(
208                "NOT_AVAILABLE",
209                "File storage not available on this platform",
210            ),
211        )
212    }
213}
214
215impl OpenApiGenerator for NoopAll {
216    fn generate(&self, _base_url: &str) -> String {
217        serde_json::json!({
218            "openapi": "3.0.3",
219            "info": {
220                "title": self.manifest.name,
221                "version": self.manifest.version,
222            },
223            "paths": {}
224        })
225        .to_string()
226    }
227}