branch: main
auto_response.rs
1695 bytesRaw
use worker::{
durable_object, DurableObject, Env, Request, Response, Result, State,
WebSocketRequestResponsePair,
};
#[durable_object]
pub struct AutoResponseObject {
state: State,
}
impl DurableObject for AutoResponseObject {
fn new(state: State, _env: Env) -> Self {
Self { state }
}
async fn fetch(&self, req: Request) -> Result<Response> {
match req.path().as_str() {
"/set" => {
// Configure ping -> pong auto-response for all websockets bound to this DO.
let pair = WebSocketRequestResponsePair::new("ping", "pong")?;
self.state.set_websocket_auto_response(&pair);
Response::ok("ok")
}
"/get" => {
if let Some(pair) = self.state.get_websocket_auto_response() {
let request_str = pair.request();
let response_str = pair.response();
Response::ok(format!("{request_str}:{response_str}"))
} else {
Response::ok("none")
}
}
_ => Response::error("Not Found", 404),
}
}
}
// Route handler to exercise the Durable Object from tests.
#[worker::send]
pub async fn handle_auto_response(
_req: Request,
env: Env,
_data: crate::SomeSharedData,
) -> Result<Response> {
let namespace = env.durable_object("AUTO")?;
let stub = namespace.id_from_name("singleton")?.get_stub()?;
// Ensure auto-response is configured
stub.fetch_with_str("https://fake-host/set").await?;
// Retrieve and return it for assertion
stub.fetch_with_str("https://fake-host/get").await
}