From 069a25da662b4cf92f7589db4d35f65dde8ce9fd Mon Sep 17 00:00:00 2001 From: Alexandre Faria Date: Fri, 9 May 2025 20:45:20 +0100 Subject: [PATCH 1/7] Added RPC support to Durable Objects. --- worker-build/Cargo.toml | 2 ++ .../get_durable_object_class_names.rs | 29 +++++++++++++++++++ ..._durable_object_class_names_declaration.rs | 12 ++++++++ .../get_durable_object_class_names_exports.rs | 14 +++++++++ .../get_durable_objects_shim.rs | 23 +++++++++++++++ .../inject_durable_objects_shim.rs | 9 ++++++ worker-build/src/durable_object/mod.rs | 11 +++++++ worker-build/src/js/durable_objects_shim.js | 28 ++++++++++++++++++ worker-build/src/js/shim.js | 7 +++-- worker-build/src/main.rs | 5 ++++ .../wrangler_config/durable_object_binding.rs | 7 +++++ .../wrangler_config/durable_objects_config.rs | 8 +++++ .../src/wrangler_config/get_wangler_config.rs | 16 ++++++++++ .../get_wrangler_config_from_toml.rs | 13 +++++++++ worker-build/src/wrangler_config/mod.rs | 11 +++++++ .../src/wrangler_config/wrangler_config.rs | 17 +++++++++++ worker-sys/src/types/durable_object.rs | 4 +-- 17 files changed, 211 insertions(+), 5 deletions(-) create mode 100644 worker-build/src/durable_object/get_durable_object_class_names.rs create mode 100644 worker-build/src/durable_object/get_durable_object_class_names_declaration.rs create mode 100644 worker-build/src/durable_object/get_durable_object_class_names_exports.rs create mode 100644 worker-build/src/durable_object/get_durable_objects_shim.rs create mode 100644 worker-build/src/durable_object/inject_durable_objects_shim.rs create mode 100644 worker-build/src/durable_object/mod.rs create mode 100644 worker-build/src/js/durable_objects_shim.js create mode 100644 worker-build/src/wrangler_config/durable_object_binding.rs create mode 100644 worker-build/src/wrangler_config/durable_objects_config.rs create mode 100644 worker-build/src/wrangler_config/get_wangler_config.rs create mode 100644 worker-build/src/wrangler_config/get_wrangler_config_from_toml.rs create mode 100644 worker-build/src/wrangler_config/mod.rs create mode 100644 worker-build/src/wrangler_config/wrangler_config.rs diff --git a/worker-build/Cargo.toml b/worker-build/Cargo.toml index 154281aa..dbb193cf 100644 --- a/worker-build/Cargo.toml +++ b/worker-build/Cargo.toml @@ -18,6 +18,8 @@ flate2 = "1.1" tar = "0.4" ureq = { version = "3.0", features = ["gzip"] } clap = { version = "4.5", features = ['derive'] } +toml = "0.8" +serde = { version = "1.0", features = ["derive"] } worker-codegen = { path = "../worker-codegen", version = "0.1.0" } wasm-pack = "0.13" diff --git a/worker-build/src/durable_object/get_durable_object_class_names.rs b/worker-build/src/durable_object/get_durable_object_class_names.rs new file mode 100644 index 00000000..fed44b86 --- /dev/null +++ b/worker-build/src/durable_object/get_durable_object_class_names.rs @@ -0,0 +1,29 @@ +use crate::wrangler_config::{get_wrangler_config, WranglerConfig}; +use anyhow::Result; + +pub fn get_durable_object_class_names() -> Result> { + let config: WranglerConfig = get_wrangler_config()?; + + let mut names = Vec::new(); + + if let Some(do_config) = config.durable_objects { + for binding in do_config.bindings { + if !binding.class_name.is_empty() { + if !names.contains(&binding.class_name) { + names.push(binding.class_name); + } + } + } + } + + if !names.is_empty() { + println!( + "[worker-build] Found DO class names in wrangler.toml: {:?}", + names + ); + } else { + println!("[worker-build] No Durable Object class names found in wrangler.toml [durable_objects].bindings"); + } + + Ok(names) +} diff --git a/worker-build/src/durable_object/get_durable_object_class_names_declaration.rs b/worker-build/src/durable_object/get_durable_object_class_names_declaration.rs new file mode 100644 index 00000000..274842c8 --- /dev/null +++ b/worker-build/src/durable_object/get_durable_object_class_names_declaration.rs @@ -0,0 +1,12 @@ +use anyhow::Result; + +pub fn get_durable_object_class_names_declaration(names: &Vec) -> Result { + Ok(format!( + "const __WORKER_BUILD_DO_NAMES__ = [{}];", + names + .into_iter() + .map(|n| format!("\"{}\"", n)) + .collect::>() + .join(", ") + )) +} diff --git a/worker-build/src/durable_object/get_durable_object_class_names_exports.rs b/worker-build/src/durable_object/get_durable_object_class_names_exports.rs new file mode 100644 index 00000000..880dc92e --- /dev/null +++ b/worker-build/src/durable_object/get_durable_object_class_names_exports.rs @@ -0,0 +1,14 @@ +pub fn get_durable_object_class_names_exports(names: Vec) -> String { + let mut exports = String::new(); + + let prefix = "__DO_WRAPPED_"; + + for name in names { + exports.push_str(&format!( + "\nexport const {} = globalThis.{}{};", + name, prefix, name + )); + } + + exports +} diff --git a/worker-build/src/durable_object/get_durable_objects_shim.rs b/worker-build/src/durable_object/get_durable_objects_shim.rs new file mode 100644 index 00000000..3cd550c3 --- /dev/null +++ b/worker-build/src/durable_object/get_durable_objects_shim.rs @@ -0,0 +1,23 @@ +use super::{ + get_durable_object_class_names, get_durable_object_class_names_declaration, + get_durable_object_class_names_exports, +}; +use anyhow::Result; + +const SHIM_TEMPLATE: &str = include_str!("../js/durable_objects_shim.js"); + +pub fn get_durable_objects_shim() -> Result { + let names = get_durable_object_class_names()?; + + if names.is_empty() { + return Ok("const successfullyWrappedDONames = [];".to_string()); + } + + let mut shim = get_durable_object_class_names_declaration(&names)?; + + shim.push_str(SHIM_TEMPLATE); + + shim.push_str(&get_durable_object_class_names_exports(names)); + + Ok(shim) +} diff --git a/worker-build/src/durable_object/inject_durable_objects_shim.rs b/worker-build/src/durable_object/inject_durable_objects_shim.rs new file mode 100644 index 00000000..c965daba --- /dev/null +++ b/worker-build/src/durable_object/inject_durable_objects_shim.rs @@ -0,0 +1,9 @@ +use super::get_durable_objects_shim; +use anyhow::Result; + +pub fn inject_durable_objects_shim(shim: String) -> Result { + Ok(shim.replace( + "$DURABLE_OBJECTS_INJECTION_POINT", + &get_durable_objects_shim()?, + )) +} diff --git a/worker-build/src/durable_object/mod.rs b/worker-build/src/durable_object/mod.rs new file mode 100644 index 00000000..700e1e09 --- /dev/null +++ b/worker-build/src/durable_object/mod.rs @@ -0,0 +1,11 @@ +mod get_durable_object_class_names; +mod get_durable_object_class_names_declaration; +mod get_durable_object_class_names_exports; +mod get_durable_objects_shim; +mod inject_durable_objects_shim; + +pub use get_durable_object_class_names::get_durable_object_class_names; +pub use get_durable_object_class_names_declaration::get_durable_object_class_names_declaration; +pub use get_durable_object_class_names_exports::get_durable_object_class_names_exports; +pub use get_durable_objects_shim::get_durable_objects_shim; +pub use inject_durable_objects_shim::inject_durable_objects_shim; diff --git a/worker-build/src/js/durable_objects_shim.js b/worker-build/src/js/durable_objects_shim.js new file mode 100644 index 00000000..eb776a8e --- /dev/null +++ b/worker-build/src/js/durable_objects_shim.js @@ -0,0 +1,28 @@ +import { DurableObject } from "cloudflare:workers"; + +const successfullyWrappedDONames = []; +const globalStorePrefix = "__DO_WRAPPED_"; // For globalThis storage + +if (typeof __WORKER_BUILD_DO_NAMES__ !== 'undefined' && Array.isArray(__WORKER_BUILD_DO_NAMES__)) { + __WORKER_BUILD_DO_NAMES__.forEach(className => { + const OriginalClass = imports[className]; + if (typeof OriginalClass === 'function' && OriginalClass.prototype && typeof OriginalClass.prototype.fetch === 'function') { + console.log(`[shim.js] Wrapping DO (identified by worker-build): ${className}`); + successfullyWrappedDONames.push(className); + const WrappedClass = class extends DurableObject { + constructor(state, env) { super(state, env); this._inner = new OriginalClass(state, env); } + async fetch(request) { return this._inner.fetch(request); } + }; + Object.getOwnPropertyNames(OriginalClass.prototype).forEach(methodName => { + if (methodName !== 'constructor' && methodName !== 'fetch') { + if (typeof OriginalClass.prototype[methodName] === 'function') { + WrappedClass.prototype[methodName] = function(...args) { return this._inner[methodName](...args); }; + } + } + }); + globalThis[`${globalStorePrefix}${className}`] = WrappedClass; + } else { + console.warn(`[shim.js] DO '${className}' (from __WORKER_BUILD_DO_NAMES__) not found/invalid in wasm imports.`); + } + }); +} \ No newline at end of file diff --git a/worker-build/src/js/shim.js b/worker-build/src/js/shim.js index ed4c9fd1..35844e61 100644 --- a/worker-build/src/js/shim.js +++ b/worker-build/src/js/shim.js @@ -1,5 +1,4 @@ import * as imports from "./index_bg.js"; -export * from "./index_bg.js"; import wasmModule from "./index.wasm"; import { WorkerEntrypoint } from "cloudflare:workers"; @@ -12,7 +11,7 @@ imports.__wbg_set_wasm(instance.exports); // Run the worker's initialization function. instance.exports.__wbindgen_start?.(); -export { wasmModule }; +$DURABLE_OBJECTS_INJECTION_POINT class Entrypoint extends WorkerEntrypoint { async fetch(request) { @@ -31,6 +30,7 @@ class Entrypoint extends WorkerEntrypoint { } const EXCLUDE_EXPORT = [ + ...successfullyWrappedDONames, "IntoUnderlyingByteSource", "IntoUnderlyingSink", "IntoUnderlyingSource", @@ -44,10 +44,11 @@ const EXCLUDE_EXPORT = [ "getMemory", ]; -Object.keys(imports).map((k) => { +Object.keys(imports).forEach((k) => { if (!(EXCLUDE_EXPORT.includes(k) | k.startsWith("__"))) { Entrypoint.prototype[k] = imports[k]; } }); export default Entrypoint; +export { wasmModule }; diff --git a/worker-build/src/main.rs b/worker-build/src/main.rs index f96f7262..43d545cb 100644 --- a/worker-build/src/main.rs +++ b/worker-build/src/main.rs @@ -11,6 +11,7 @@ use std::{ use anyhow::Result; use clap::Parser; +use durable_object::inject_durable_objects_shim; use wasm_pack::command::build::{Build, BuildOptions}; const OUT_DIR: &str = "build"; @@ -19,7 +20,9 @@ const WORKER_SUBDIR: &str = "worker"; const SHIM_TEMPLATE: &str = include_str!("./js/shim.js"); +mod durable_object; mod install; +mod wrangler_config; pub fn main() -> Result<()> { // Our tests build the bundle ourselves. @@ -54,6 +57,8 @@ pub fn main() -> Result<()> { shim_template.replace("$WAIT_UNTIL_RESPONSE", "") }; + let shim = inject_durable_objects_shim(shim)?; + write_string_to_file(worker_path("shim.js"), shim)?; bundle(&esbuild_path)?; diff --git a/worker-build/src/wrangler_config/durable_object_binding.rs b/worker-build/src/wrangler_config/durable_object_binding.rs new file mode 100644 index 00000000..3789355d --- /dev/null +++ b/worker-build/src/wrangler_config/durable_object_binding.rs @@ -0,0 +1,7 @@ +use serde::Deserialize; + +#[derive(Deserialize, Debug, Clone)] +pub struct DurableObjectBinding { + // pub name: String, // The binding name, e.g., "DO_RPC_SERVER" - not strictly needed for this task + pub class_name: String, // The actual class name, e.g., "RPCServer" +} diff --git a/worker-build/src/wrangler_config/durable_objects_config.rs b/worker-build/src/wrangler_config/durable_objects_config.rs new file mode 100644 index 00000000..9d185105 --- /dev/null +++ b/worker-build/src/wrangler_config/durable_objects_config.rs @@ -0,0 +1,8 @@ +use super::DurableObjectBinding; +use serde::Deserialize; + +#[derive(Deserialize, Debug, Clone)] +pub struct DurableObjectsConfig { + #[serde(default)] // Handles case where 'bindings' might be missing + pub bindings: Vec, +} diff --git a/worker-build/src/wrangler_config/get_wangler_config.rs b/worker-build/src/wrangler_config/get_wangler_config.rs new file mode 100644 index 00000000..c247ea53 --- /dev/null +++ b/worker-build/src/wrangler_config/get_wangler_config.rs @@ -0,0 +1,16 @@ +use super::get_wrangler_config_from_toml; +use crate::wrangler_config::WranglerConfig; +use anyhow::Result; +use std::env::current_dir; + +pub fn get_wrangler_config() -> Result { + let root = current_dir()?; + + let toml = root.join("wrangler.toml"); + if toml.exists() { + get_wrangler_config_from_toml(&toml) + } else { + println!("[worker-build] wrangler.toml not found at {:?}", root); + Ok(WranglerConfig::default()) + } +} diff --git a/worker-build/src/wrangler_config/get_wrangler_config_from_toml.rs b/worker-build/src/wrangler_config/get_wrangler_config_from_toml.rs new file mode 100644 index 00000000..7dbe3ecc --- /dev/null +++ b/worker-build/src/wrangler_config/get_wrangler_config_from_toml.rs @@ -0,0 +1,13 @@ +use crate::wrangler_config::WranglerConfig; +use anyhow::{anyhow, Result}; +use std::{fs::read_to_string, path::Path}; + +pub fn get_wrangler_config_from_toml(path: &Path) -> Result { + let content = read_to_string(&path) + .map_err(|e| anyhow!("Failed to read wrangler.toml at {:?}: {}", path, e))?; + + let config: WranglerConfig = + toml::from_str(&content).map_err(|e| anyhow!("Failed to parse wrangler.toml: {}", e))?; + + Ok(config) +} diff --git a/worker-build/src/wrangler_config/mod.rs b/worker-build/src/wrangler_config/mod.rs new file mode 100644 index 00000000..93812b0f --- /dev/null +++ b/worker-build/src/wrangler_config/mod.rs @@ -0,0 +1,11 @@ +mod durable_object_binding; +mod durable_objects_config; +mod get_wangler_config; +mod get_wrangler_config_from_toml; +mod wrangler_config; + +pub use durable_object_binding::DurableObjectBinding; +pub use durable_objects_config::DurableObjectsConfig; +pub use get_wangler_config::get_wrangler_config; +pub use get_wrangler_config_from_toml::get_wrangler_config_from_toml; +pub use wrangler_config::WranglerConfig; diff --git a/worker-build/src/wrangler_config/wrangler_config.rs b/worker-build/src/wrangler_config/wrangler_config.rs new file mode 100644 index 00000000..f89e9cba --- /dev/null +++ b/worker-build/src/wrangler_config/wrangler_config.rs @@ -0,0 +1,17 @@ +use super::DurableObjectsConfig; +use serde::Deserialize; + +#[derive(Deserialize, Debug, Clone)] +pub struct WranglerConfig { + // name: Option, + // main: Option, + pub durable_objects: Option, +} + +impl Default for WranglerConfig { + fn default() -> Self { + WranglerConfig { + durable_objects: None, + } + } +} diff --git a/worker-sys/src/types/durable_object.rs b/worker-sys/src/types/durable_object.rs index d970b248..d6aadcd3 100644 --- a/worker-sys/src/types/durable_object.rs +++ b/worker-sys/src/types/durable_object.rs @@ -14,9 +14,9 @@ pub use state::*; pub use storage::*; pub use transaction::*; -#[wasm_bindgen] +#[wasm_bindgen(module = "cloudflare:workers")] extern "C" { - #[wasm_bindgen(extends=js_sys::Object)] + #[wasm_bindgen(js_name = "DurableObject")] #[derive(Clone)] pub type DurableObject; From 5ce5a89f679cbcca2085962cb40b0ee571253b56 Mon Sep 17 00:00:00 2001 From: Alexandre Faria Date: Fri, 9 May 2025 20:48:13 +0100 Subject: [PATCH 2/7] Added and example for Durable Object RPC Server and Client. --- examples/do-rpc-server-client/.gitignore | 3 + examples/do-rpc-server-client/Cargo.lock | 1085 +++++++++++++++++ examples/do-rpc-server-client/Cargo.toml | 28 + examples/do-rpc-server-client/build.rs | 13 + .../do-rpc-server-client/src/calculator.rs | 41 + examples/do-rpc-server-client/src/client.rs | 31 + examples/do-rpc-server-client/src/lib.rs | 2 + examples/do-rpc-server-client/src/server.rs | 47 + .../do-rpc-server-client/wit/calculator.wit | 6 + examples/do-rpc-server-client/wrangler.toml | 13 + 10 files changed, 1269 insertions(+) create mode 100644 examples/do-rpc-server-client/.gitignore create mode 100644 examples/do-rpc-server-client/Cargo.lock create mode 100644 examples/do-rpc-server-client/Cargo.toml create mode 100644 examples/do-rpc-server-client/build.rs create mode 100644 examples/do-rpc-server-client/src/calculator.rs create mode 100644 examples/do-rpc-server-client/src/client.rs create mode 100644 examples/do-rpc-server-client/src/lib.rs create mode 100644 examples/do-rpc-server-client/src/server.rs create mode 100644 examples/do-rpc-server-client/wit/calculator.wit create mode 100644 examples/do-rpc-server-client/wrangler.toml diff --git a/examples/do-rpc-server-client/.gitignore b/examples/do-rpc-server-client/.gitignore new file mode 100644 index 00000000..d27315f0 --- /dev/null +++ b/examples/do-rpc-server-client/.gitignore @@ -0,0 +1,3 @@ +target +node_modules +.wrangler diff --git a/examples/do-rpc-server-client/Cargo.lock b/examples/do-rpc-server-client/Cargo.lock new file mode 100644 index 00000000..a0fb5dd1 --- /dev/null +++ b/examples/do-rpc-server-client/Cargo.lock @@ -0,0 +1,1085 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "js-sys", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + +[[package]] +name = "prettyplease" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rpc-client" +version = "0.1.0" +dependencies = [ + "console_error_panic_hook", + "worker", + "worker-codegen", + "worker-macros", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "syn" +version = "2.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +dependencies = [ + "backtrace", + "pin-project-lite", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.205.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d457bb52804242e09d55a306e53ddbc65d1d29ed83db6a4eea3ed412ee0cfdf" +dependencies = [ + "bitflags", + "indexmap", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-parser" +version = "0.205.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3db34c7688c161ed7bd1b2f8055dca9fb2c15201db58754e9c48a0805f32e5f" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "worker" +version = "0.5.0" +dependencies = [ + "async-trait", + "bytes", + "chrono", + "futures-channel", + "futures-util", + "http", + "http-body", + "js-sys", + "matchit", + "pin-project", + "serde", + "serde-wasm-bindgen 0.6.5", + "serde_json", + "serde_urlencoded", + "tokio", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "worker-kv", + "worker-macros", + "worker-sys", +] + +[[package]] +name = "worker-codegen" +version = "0.1.0" +dependencies = [ + "anyhow", + "convert_case", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-macro-support", + "wit-parser", +] + +[[package]] +name = "worker-kv" +version = "0.7.0" +dependencies = [ + "js-sys", + "serde", + "serde-wasm-bindgen 0.5.0", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", +] + +[[package]] +name = "worker-macros" +version = "0.5.0" +dependencies = [ + "async-trait", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-macro-support", + "worker-sys", +] + +[[package]] +name = "worker-sys" +version = "0.5.0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/examples/do-rpc-server-client/Cargo.toml b/examples/do-rpc-server-client/Cargo.toml new file mode 100644 index 00000000..50c4c940 --- /dev/null +++ b/examples/do-rpc-server-client/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "do-rpc-server-client" +version = "0.1.0" +edition = "2021" +authors = ["Alexandre Faria "] + +[package.metadata.release] +release = false + +# https://github.com/rustwasm/wasm-pack/issues/1247 +[package.metadata.wasm-pack.profile.release] +wasm-opt = false + +[lib] +crate-type = ["cdylib"] + +[dependencies] +worker = { path = "../../worker" } +worker-macros = { path = "../../worker-macros" } +console_error_panic_hook = { version = "0.1.1" } + +# TODO: Remove the need for these +async-trait = "0.1" +wasm-bindgen = "0.2" +serde-wasm-bindgen = "0.6" + +[build-dependencies] +worker-codegen = { path = "../../worker-codegen" } diff --git a/examples/do-rpc-server-client/build.rs b/examples/do-rpc-server-client/build.rs new file mode 100644 index 00000000..cf7919b8 --- /dev/null +++ b/examples/do-rpc-server-client/build.rs @@ -0,0 +1,13 @@ +use std::env::var; + +use worker_codegen::wit::expand_wit_source; + +fn main() -> Result<(), Box> { + // Tell Cargo that if the given file changes, to rerun this build script. + println!("cargo::rerun-if-changed=wit/calculator.wit"); + let source = expand_wit_source("wit/calculator.wit")?; + let out_dir = var("OUT_DIR")?; + let dest = format!("{}/calculator.rs", out_dir); + std::fs::write(dest, source)?; + Ok(()) +} diff --git a/examples/do-rpc-server-client/src/calculator.rs b/examples/do-rpc-server-client/src/calculator.rs new file mode 100644 index 00000000..ad76ca94 --- /dev/null +++ b/examples/do-rpc-server-client/src/calculator.rs @@ -0,0 +1,41 @@ +//! This file is an example output generated by `worker-codegen` from `wit/calculator.wit`, +//! and is not used by this crate. + +mod sys { + use ::wasm_bindgen::prelude::*; + #[wasm_bindgen] + extern "C" { + #[wasm_bindgen(extends = ::worker::js_sys::Object)] + pub type CalculatorSys; + #[wasm_bindgen(method, catch, js_name = "add")] + pub fn add( + this: &CalculatorSys, + a: u32, + b: u32, + ) -> std::result::Result< + ::worker::js_sys::Promise, + ::worker::wasm_bindgen::JsValue, + >; + } +} +#[async_trait::async_trait] +pub trait Calculator { + async fn add(&self, a: u32, b: u32) -> ::worker::Result; +} +pub struct CalculatorService(::worker::send::SendWrapper); +#[async_trait::async_trait] +impl Calculator for CalculatorService { + async fn add(&self, a: u32, b: u32) -> ::worker::Result { + let promise = self.0.add(a, b)?; + let fut = ::worker::send::SendFuture::new( + ::worker::wasm_bindgen_futures::JsFuture::from(promise), + ); + let output = fut.await?; + Ok(::serde_wasm_bindgen::from_value(output)?) + } +} +impl From<::worker::Fetcher> for CalculatorService { + fn from(fetcher: ::worker::Fetcher) -> Self { + Self(::worker::send::SendWrapper::new(fetcher.into_rpc())) + } +} diff --git a/examples/do-rpc-server-client/src/client.rs b/examples/do-rpc-server-client/src/client.rs new file mode 100644 index 00000000..d2591d70 --- /dev/null +++ b/examples/do-rpc-server-client/src/client.rs @@ -0,0 +1,31 @@ +#![allow(clippy::empty_docs)] + +use worker::*; + +pub mod rpc { + include!(concat!(env!("OUT_DIR"), "/calculator.rs")); +} + +#[event(fetch)] +async fn main(_req: Request, env: Env, _ctx: Context) -> Result { + use rpc::Calculator; + + let namespace = env.durable_object("DO_RPC_SERVER")?; + let stub = namespace.id_from_name("A")?.get_stub()?; + + //stub.fetch_with_str("http://fake_url.com/3+4").await + + //let service: rpc::CalculatorService = env.durable_object("DO_RPC_SERVER")?.into(); + + //let num = service.add(1, 2).await?; + + //Response::ok(format!("Hello World {:?}", num)) + + let service: rpc::CalculatorService = stub.into(); + + let left = 8; + let right = 8; + + let result = service.add(left, right).await?; + Response::ok(&format!("{} + {} = {}", left, right, result)) +} diff --git a/examples/do-rpc-server-client/src/lib.rs b/examples/do-rpc-server-client/src/lib.rs new file mode 100644 index 00000000..ea1769af --- /dev/null +++ b/examples/do-rpc-server-client/src/lib.rs @@ -0,0 +1,2 @@ +mod client; +mod server; diff --git a/examples/do-rpc-server-client/src/server.rs b/examples/do-rpc-server-client/src/server.rs new file mode 100644 index 00000000..ea9386a2 --- /dev/null +++ b/examples/do-rpc-server-client/src/server.rs @@ -0,0 +1,47 @@ +use wasm_bindgen::prelude::wasm_bindgen; +use worker::*; + +#[durable_object] +pub struct RPCServer { + state: State, + counter: u32, +} + +#[wasm_bindgen] +impl RPCServer { + #[wasm_bindgen] + pub fn add(&mut self, a: u32, b: u32) -> u32 { + console_error_panic_hook::set_once(); + self.counter += 1; + a + b + self.counter + } +} + +#[durable_object] +impl DurableObject for RPCServer { + fn new(state: State, _env: Env) -> Self { + Self { state, counter: 0 } + } + + // URL /{left}+{right} + async fn fetch(&mut self, req: Request) -> Result { + console_error_panic_hook::set_once(); + let url = req.url()?; + let path = url.path(); + + let path = path.trim_start_matches('/'); + + let path_parts: Vec<&str> = path.split('+').collect(); + if path_parts.len() != 2 { + return Response::error("Invalid URL", 400); + } + + if let (Ok(left), Ok(right)) = (path_parts[0].parse::(), path_parts[1].parse::()) + { + let result = self.add(left, right); + Response::ok(&format!("{} + {} = {}", left, right, result)) + } else { + return Response::error("Invalid operands", 400); + } + } +} diff --git a/examples/do-rpc-server-client/wit/calculator.wit b/examples/do-rpc-server-client/wit/calculator.wit new file mode 100644 index 00000000..7d567c9b --- /dev/null +++ b/examples/do-rpc-server-client/wit/calculator.wit @@ -0,0 +1,6 @@ +package rpc:calculator; + +interface calculator { + // Add two unsigned integers + add: func(a: u32, b: u32) -> u32; +} \ No newline at end of file diff --git a/examples/do-rpc-server-client/wrangler.toml b/examples/do-rpc-server-client/wrangler.toml new file mode 100644 index 00000000..57f9a3ce --- /dev/null +++ b/examples/do-rpc-server-client/wrangler.toml @@ -0,0 +1,13 @@ +name = "do-rpc-server-client" +main = "build/worker/shim.mjs" +compatibility_date = "2025-05-08" + +[build] +command = "cargo install --path ../../worker-build && worker-build --release" + +[durable_objects] +bindings = [{ name = "DO_RPC_SERVER", class_name = "RPCServer" }] + +[[migrations]] +tag = "v1" +new_classes = ["RPCServer"] From d7cf375a160e3c98bfe222666d511baf79901bb9 Mon Sep 17 00:00:00 2001 From: Alexandre Faria Date: Fri, 9 May 2025 20:48:55 +0100 Subject: [PATCH 3/7] Added and example for Durable Object Server and Client. --- examples/do-server-client/.gitignore | 3 + examples/do-server-client/Cargo.lock | 1085 ++++++++++++++++++ examples/do-server-client/Cargo.toml | 23 + examples/do-server-client/build.rs | 13 + examples/do-server-client/src/client.rs | 9 + examples/do-server-client/src/lib.rs | 2 + examples/do-server-client/src/server.rs | 37 + examples/do-server-client/wit/calculator.wit | 6 + examples/do-server-client/wrangler.toml | 13 + 9 files changed, 1191 insertions(+) create mode 100644 examples/do-server-client/.gitignore create mode 100644 examples/do-server-client/Cargo.lock create mode 100644 examples/do-server-client/Cargo.toml create mode 100644 examples/do-server-client/build.rs create mode 100644 examples/do-server-client/src/client.rs create mode 100644 examples/do-server-client/src/lib.rs create mode 100644 examples/do-server-client/src/server.rs create mode 100644 examples/do-server-client/wit/calculator.wit create mode 100644 examples/do-server-client/wrangler.toml diff --git a/examples/do-server-client/.gitignore b/examples/do-server-client/.gitignore new file mode 100644 index 00000000..d27315f0 --- /dev/null +++ b/examples/do-server-client/.gitignore @@ -0,0 +1,3 @@ +target +node_modules +.wrangler diff --git a/examples/do-server-client/Cargo.lock b/examples/do-server-client/Cargo.lock new file mode 100644 index 00000000..a0fb5dd1 --- /dev/null +++ b/examples/do-server-client/Cargo.lock @@ -0,0 +1,1085 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "js-sys", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + +[[package]] +name = "prettyplease" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rpc-client" +version = "0.1.0" +dependencies = [ + "console_error_panic_hook", + "worker", + "worker-codegen", + "worker-macros", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "syn" +version = "2.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +dependencies = [ + "backtrace", + "pin-project-lite", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.205.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d457bb52804242e09d55a306e53ddbc65d1d29ed83db6a4eea3ed412ee0cfdf" +dependencies = [ + "bitflags", + "indexmap", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-parser" +version = "0.205.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3db34c7688c161ed7bd1b2f8055dca9fb2c15201db58754e9c48a0805f32e5f" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "worker" +version = "0.5.0" +dependencies = [ + "async-trait", + "bytes", + "chrono", + "futures-channel", + "futures-util", + "http", + "http-body", + "js-sys", + "matchit", + "pin-project", + "serde", + "serde-wasm-bindgen 0.6.5", + "serde_json", + "serde_urlencoded", + "tokio", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "worker-kv", + "worker-macros", + "worker-sys", +] + +[[package]] +name = "worker-codegen" +version = "0.1.0" +dependencies = [ + "anyhow", + "convert_case", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-macro-support", + "wit-parser", +] + +[[package]] +name = "worker-kv" +version = "0.7.0" +dependencies = [ + "js-sys", + "serde", + "serde-wasm-bindgen 0.5.0", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", +] + +[[package]] +name = "worker-macros" +version = "0.5.0" +dependencies = [ + "async-trait", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-macro-support", + "worker-sys", +] + +[[package]] +name = "worker-sys" +version = "0.5.0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/examples/do-server-client/Cargo.toml b/examples/do-server-client/Cargo.toml new file mode 100644 index 00000000..caa1ee04 --- /dev/null +++ b/examples/do-server-client/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "do-server-client" +version = "0.1.0" +edition = "2021" +authors = ["Alexandre Faria "] + +[package.metadata.release] +release = false + +# https://github.com/rustwasm/wasm-pack/issues/1247 +[package.metadata.wasm-pack.profile.release] +wasm-opt = false + +[lib] +crate-type = ["cdylib"] + +[dependencies] +worker = { path = "../../worker" } +worker-macros = { path = "../../worker-macros" } +console_error_panic_hook = { version = "0.1.1" } + +[build-dependencies] +worker-codegen = { path = "../../worker-codegen" } diff --git a/examples/do-server-client/build.rs b/examples/do-server-client/build.rs new file mode 100644 index 00000000..cf7919b8 --- /dev/null +++ b/examples/do-server-client/build.rs @@ -0,0 +1,13 @@ +use std::env::var; + +use worker_codegen::wit::expand_wit_source; + +fn main() -> Result<(), Box> { + // Tell Cargo that if the given file changes, to rerun this build script. + println!("cargo::rerun-if-changed=wit/calculator.wit"); + let source = expand_wit_source("wit/calculator.wit")?; + let out_dir = var("OUT_DIR")?; + let dest = format!("{}/calculator.rs", out_dir); + std::fs::write(dest, source)?; + Ok(()) +} diff --git a/examples/do-server-client/src/client.rs b/examples/do-server-client/src/client.rs new file mode 100644 index 00000000..4f55cb7b --- /dev/null +++ b/examples/do-server-client/src/client.rs @@ -0,0 +1,9 @@ +use worker::*; + +#[event(fetch)] +async fn main(_req: Request, env: Env, _ctx: Context) -> Result { + let namespace = env.durable_object("DO_SERVER")?; + let stub = namespace.id_from_name("A")?.get_stub()?; + + stub.fetch_with_str("http://fake_url.com/3+4").await +} diff --git a/examples/do-server-client/src/lib.rs b/examples/do-server-client/src/lib.rs new file mode 100644 index 00000000..ea1769af --- /dev/null +++ b/examples/do-server-client/src/lib.rs @@ -0,0 +1,2 @@ +mod client; +mod server; diff --git a/examples/do-server-client/src/server.rs b/examples/do-server-client/src/server.rs new file mode 100644 index 00000000..a3716ce2 --- /dev/null +++ b/examples/do-server-client/src/server.rs @@ -0,0 +1,37 @@ +use worker::*; + +#[durable_object] +pub struct Server { + state: State, + counter: u32, +} + +#[durable_object] +impl DurableObject for Server { + fn new(state: State, _env: Env) -> Self { + Self { state, counter: 0 } + } + + // URL /{left}+{right} + async fn fetch(&mut self, req: Request) -> Result { + console_error_panic_hook::set_once(); + let url = req.url()?; + let path = url.path(); + + let path = path.trim_start_matches('/'); + + let path_parts: Vec<&str> = path.split('+').collect(); + if path_parts.len() != 2 { + return Response::error("Invalid URL", 400); + } + + if let (Ok(left), Ok(right)) = (path_parts[0].parse::(), path_parts[1].parse::()) + { + let result = left + right + self.counter; + self.counter += 1; + Response::ok(&format!("{} + {} = {}", left, right, result)) + } else { + return Response::error("Invalid operands", 400); + } + } +} diff --git a/examples/do-server-client/wit/calculator.wit b/examples/do-server-client/wit/calculator.wit new file mode 100644 index 00000000..7d567c9b --- /dev/null +++ b/examples/do-server-client/wit/calculator.wit @@ -0,0 +1,6 @@ +package rpc:calculator; + +interface calculator { + // Add two unsigned integers + add: func(a: u32, b: u32) -> u32; +} \ No newline at end of file diff --git a/examples/do-server-client/wrangler.toml b/examples/do-server-client/wrangler.toml new file mode 100644 index 00000000..8a97d056 --- /dev/null +++ b/examples/do-server-client/wrangler.toml @@ -0,0 +1,13 @@ +name = "do-server-client" +main = "build/worker/shim.mjs" +compatibility_date = "2025-05-08" + +[build] +command = "cargo install --path ../../worker-build && worker-build --release" + +[durable_objects] +bindings = [{ name = "DO_SERVER", class_name = "Server" }] + +[[migrations]] +tag = "v1" +new_classes = ["Server"] From 374979e5f93e5d7b0b8408fb24b1dd50cd9914ea Mon Sep 17 00:00:00 2001 From: Alexandre Faria Date: Fri, 9 May 2025 21:25:37 +0100 Subject: [PATCH 4/7] Updated Durable Object fetch method to be optional. --- worker-build/src/js/durable_objects_shim.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/worker-build/src/js/durable_objects_shim.js b/worker-build/src/js/durable_objects_shim.js index eb776a8e..9db6187c 100644 --- a/worker-build/src/js/durable_objects_shim.js +++ b/worker-build/src/js/durable_objects_shim.js @@ -6,15 +6,14 @@ const globalStorePrefix = "__DO_WRAPPED_"; // For globalThis storage if (typeof __WORKER_BUILD_DO_NAMES__ !== 'undefined' && Array.isArray(__WORKER_BUILD_DO_NAMES__)) { __WORKER_BUILD_DO_NAMES__.forEach(className => { const OriginalClass = imports[className]; - if (typeof OriginalClass === 'function' && OriginalClass.prototype && typeof OriginalClass.prototype.fetch === 'function') { - console.log(`[shim.js] Wrapping DO (identified by worker-build): ${className}`); + if (typeof OriginalClass === 'function' && OriginalClass.prototype) { + console.log(`[shim.js] Wrapping DO: ${className}`); successfullyWrappedDONames.push(className); const WrappedClass = class extends DurableObject { constructor(state, env) { super(state, env); this._inner = new OriginalClass(state, env); } - async fetch(request) { return this._inner.fetch(request); } }; Object.getOwnPropertyNames(OriginalClass.prototype).forEach(methodName => { - if (methodName !== 'constructor' && methodName !== 'fetch') { + if (methodName !== 'constructor') { if (typeof OriginalClass.prototype[methodName] === 'function') { WrappedClass.prototype[methodName] = function(...args) { return this._inner[methodName](...args); }; } From e8a56ea2d40354acce56f4ce7cda7ca4ed17ccda Mon Sep 17 00:00:00 2001 From: Alexandre Faria Date: Fri, 9 May 2025 21:26:09 +0100 Subject: [PATCH 5/7] examples do-rpc-server-client: Clean up. --- examples/do-rpc-server-client/src/server.rs | 22 --------------------- 1 file changed, 22 deletions(-) diff --git a/examples/do-rpc-server-client/src/server.rs b/examples/do-rpc-server-client/src/server.rs index ea9386a2..7464c71c 100644 --- a/examples/do-rpc-server-client/src/server.rs +++ b/examples/do-rpc-server-client/src/server.rs @@ -22,26 +22,4 @@ impl DurableObject for RPCServer { fn new(state: State, _env: Env) -> Self { Self { state, counter: 0 } } - - // URL /{left}+{right} - async fn fetch(&mut self, req: Request) -> Result { - console_error_panic_hook::set_once(); - let url = req.url()?; - let path = url.path(); - - let path = path.trim_start_matches('/'); - - let path_parts: Vec<&str> = path.split('+').collect(); - if path_parts.len() != 2 { - return Response::error("Invalid URL", 400); - } - - if let (Ok(left), Ok(right)) = (path_parts[0].parse::(), path_parts[1].parse::()) - { - let result = self.add(left, right); - Response::ok(&format!("{} + {} = {}", left, right, result)) - } else { - return Response::error("Invalid operands", 400); - } - } } From a07445b5bcc18f37ce22551f06a44c6f4d29f956 Mon Sep 17 00:00:00 2001 From: Alexandre Faria Date: Fri, 9 May 2025 21:30:48 +0100 Subject: [PATCH 6/7] Simplified the do rpc server client example. --- examples/do-rpc-server-client/src/server.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/do-rpc-server-client/src/server.rs b/examples/do-rpc-server-client/src/server.rs index 7464c71c..3cca219b 100644 --- a/examples/do-rpc-server-client/src/server.rs +++ b/examples/do-rpc-server-client/src/server.rs @@ -3,7 +3,6 @@ use worker::*; #[durable_object] pub struct RPCServer { - state: State, counter: u32, } @@ -20,6 +19,6 @@ impl RPCServer { #[durable_object] impl DurableObject for RPCServer { fn new(state: State, _env: Env) -> Self { - Self { state, counter: 0 } + Self { counter: 0 } } } From 7dbabed7669eb0d6d1283a604bc50216c46af33b Mon Sep 17 00:00:00 2001 From: Alexandre Faria Date: Fri, 9 May 2025 21:32:01 +0100 Subject: [PATCH 7/7] Simplified the do server client example. --- examples/do-server-client/src/server.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/do-server-client/src/server.rs b/examples/do-server-client/src/server.rs index a3716ce2..116d6c1f 100644 --- a/examples/do-server-client/src/server.rs +++ b/examples/do-server-client/src/server.rs @@ -2,14 +2,13 @@ use worker::*; #[durable_object] pub struct Server { - state: State, counter: u32, } #[durable_object] impl DurableObject for Server { fn new(state: State, _env: Env) -> Self { - Self { state, counter: 0 } + Self { counter: 0 } } // URL /{left}+{right}