branch: main
put_raw.rs
2135 bytesRaw
use std::convert::TryFrom;
use worker::{
durable_object,
js_sys::{self, Uint8Array},
wasm_bindgen::{self, JsValue},
DurableObject, Env, Request, Response, Result, State,
};
use crate::SomeSharedData;
#[durable_object]
pub struct PutRawTestObject {
state: State,
}
impl PutRawTestObject {
async fn put_raw(&self) -> Result<()> {
let storage = self.state.storage();
let bytes = Uint8Array::new_with_length(3);
bytes.copy_from(b"123");
storage.put_raw("bytes", bytes).await?;
let bytes = storage
.get::<Vec<u8>>("bytes")
.await?
.expect("get after put yielded nothing");
storage.delete("bytes").await?;
assert_eq!(
bytes, b"123",
"eficient serialization of bytes is not preserved"
);
Ok(())
}
async fn put_multiple_raw(&self) -> Result<()> {
const BAR: &[u8] = b"bar";
let storage = self.state.storage();
let obj = js_sys::Object::new();
let value = Uint8Array::new_with_length(u32::try_from(BAR.len()).unwrap());
value.copy_from(BAR);
js_sys::Reflect::set(&obj, &JsValue::from_str("foo"), &value.into())?;
storage.put_multiple_raw(obj).await?;
assert_eq!(
storage
.get::<Vec<u8>>("foo")
.await?
.expect("get('foo') yielded nothing"),
BAR,
"Didn't get the right thing with put_multiple_raw"
);
Ok(())
}
}
impl DurableObject for PutRawTestObject {
fn new(state: State, _env: Env) -> Self {
Self { state }
}
async fn fetch(&self, _: Request) -> Result<Response> {
self.put_raw().await?;
self.put_multiple_raw().await?;
Response::ok("ok")
}
}
#[worker::send]
pub(crate) async fn handle_put_raw(
req: Request,
env: Env,
_data: SomeSharedData,
) -> Result<Response> {
let namespace = env.durable_object("PUT_RAW_TEST_OBJECT")?;
let id = namespace.unique_id()?;
let stub = id.get_stub()?;
stub.fetch_with_request(req).await
}