diff --git a/packages/interpreter/src/lib.rs b/packages/interpreter/src/lib.rs index 52452350f..5e028a15e 100644 --- a/packages/interpreter/src/lib.rs +++ b/packages/interpreter/src/lib.rs @@ -38,7 +38,7 @@ pub mod minimal_bindings { pub fn setAttributeInner(node: JsValue, name: &str, value: JsValue, ns: Option<&str>); /// Roll up all the values from the node into a JS object that we can deserialize - pub fn collectFormValues(node: JsValue) -> JsValue; + pub fn retrieveFormValues(node: JsValue) -> JsValue; } #[wasm_bindgen(module = "/src/js/hydrate.js")] diff --git a/packages/web/src/document.rs b/packages/web/src/document.rs index 3eb253bd9..9ecf4ca97 100644 --- a/packages/web/src/document.rs +++ b/packages/web/src/document.rs @@ -32,6 +32,17 @@ impl JSOwner { } } +#[wasm_bindgen::prelude::wasm_bindgen(module = "/src/js/eval.js")] +extern "C" { + pub type WeakDioxusChannel; + + #[wasm_bindgen(method, js_name = "rustSend")] + pub fn rust_send(this: &WeakDioxusChannel, value: wasm_bindgen::JsValue); + + #[wasm_bindgen(method, js_name = "rustRecv")] + pub async fn rust_recv(this: &WeakDioxusChannel) -> wasm_bindgen::JsValue; +} + #[wasm_bindgen::prelude::wasm_bindgen(module = "/src/js/eval.js")] extern "C" { pub type WebDioxusChannel; @@ -54,13 +65,6 @@ extern "C" { #[wasm_bindgen(method)] pub fn weak(this: &WebDioxusChannel) -> WeakDioxusChannel; - pub type WeakDioxusChannel; - - #[wasm_bindgen(method, js_name = "rustSend")] - pub fn rust_send(this: &WeakDioxusChannel, value: wasm_bindgen::JsValue); - - #[wasm_bindgen(method, js_name = "rustRecv")] - pub async fn rust_recv(this: &WeakDioxusChannel) -> wasm_bindgen::JsValue; } /// Provides the Document through [`ScopeId::provide_context`]. @@ -136,7 +140,7 @@ impl Document for WebDocument { const PROMISE_WRAPPER: &str = r#" return (async function(){ {JS_CODE} - + dioxus.close(); })(); "#; diff --git a/packages/web/src/js/eval.js b/packages/web/src/js/eval.js index 7a0560351..ddca253b2 100644 --- a/packages/web/src/js/eval.js +++ b/packages/web/src/js/eval.js @@ -1 +1 @@ -class Channel{pending;waiting;constructor(){this.pending=[],this.waiting=[]}send(data){if(this.waiting.length>0){this.waiting.shift()(data);return}this.pending.push(data)}async recv(){return new Promise((resolve,_reject)=>{if(this.pending.length>0){resolve(this.pending.shift());return}this.waiting.push(resolve)})}}class WeakDioxusChannel{inner;constructor(channel){this.inner=new WeakRef(channel)}rustSend(data){let channel=this.inner.deref();if(channel)channel.rustSend(data)}async rustRecv(){let channel=this.inner.deref();if(channel)return await channel.rustRecv()}}class DioxusChannel{weak(){return new WeakDioxusChannel(this)}}window.__nextChannelId=0;window.__channels=[];class WebDioxusChannel extends DioxusChannel{js_to_rust;rust_to_js;owner;id;constructor(owner){super();this.owner=owner,this.js_to_rust=new Channel,this.rust_to_js=new Channel,this.id=window.__nextChannelId,window.__channels[this.id]=this,window.__nextChannelId+=1}weak(){return new WeakDioxusChannel(this)}async recv(){return await this.rust_to_js.recv()}send(data){this.js_to_rust.send(data)}rustSend(data){this.rust_to_js.send(data)}async rustRecv(){return await this.js_to_rust.recv()}close(){window.__channels[this.id]=null}}export{WebDioxusChannel}; +class Channel{pending;waiting;constructor(){this.pending=[],this.waiting=[]}send(data){if(this.waiting.length>0){this.waiting.shift()(data);return}this.pending.push(data)}async recv(){return new Promise((resolve,_reject)=>{if(this.pending.length>0){resolve(this.pending.shift());return}this.waiting.push(resolve)})}}class WeakDioxusChannel{inner;constructor(channel){this.inner=new WeakRef(channel)}rustSend(data){let channel=this.inner.deref();if(channel)channel.rustSend(data)}async rustRecv(){let channel=this.inner.deref();if(channel)return await channel.rustRecv()}}class DioxusChannel{weak(){return new WeakDioxusChannel(this)}}window.__nextChannelId=0;window.__channels=[];class WebDioxusChannel extends DioxusChannel{js_to_rust;rust_to_js;owner;id;constructor(owner){super();this.owner=owner,this.js_to_rust=new Channel,this.rust_to_js=new Channel,this.id=window.__nextChannelId,window.__channels[this.id]=this,window.__nextChannelId+=1}weak(){return new WeakDioxusChannel(this)}async recv(){return await this.rust_to_js.recv()}send(data){this.js_to_rust.send(data)}rustSend(data){this.rust_to_js.send(data)}async rustRecv(){return await this.js_to_rust.recv()}close(){window.__channels[this.id]=null}}export{WebDioxusChannel,WeakDioxusChannel}; diff --git a/packages/web/src/js/hash.txt b/packages/web/src/js/hash.txt index 8cbce7765..dd3eac632 100644 --- a/packages/web/src/js/hash.txt +++ b/packages/web/src/js/hash.txt @@ -1 +1 @@ -[857504888396904142] \ No newline at end of file +[460758788096589933] \ No newline at end of file diff --git a/packages/web/src/ts/eval.ts b/packages/web/src/ts/eval.ts index 8b67fcd34..5398f5783 100644 --- a/packages/web/src/ts/eval.ts +++ b/packages/web/src/ts/eval.ts @@ -7,6 +7,7 @@ import { window.__nextChannelId = 0; window.__channels = []; +export { WeakDioxusChannel }; export class WebDioxusChannel extends DioxusChannel { js_to_rust: Channel; rust_to_js: Channel;