Skip to content

Commit

Permalink
allow web worker resource to be relative (#2086)
Browse files Browse the repository at this point in the history
* allow web worker resource to be relative

fixes #2056

* make backwards compatible with rust < 1.52

* fix clippy warning

* Apply suggestions from code review

Co-authored-by: mc1098 <m.cripps1@uni.brighton.ac.uk>

* do not reimplement stdlib function

* fixup previous

* improve docstring

Co-authored-by: mc1098 <m.cripps1@uni.brighton.ac.uk>
  • Loading branch information
astraw and mc1098 committed Nov 20, 2021
1 parent 2b1059b commit 916dc2e
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 6 deletions.
9 changes: 9 additions & 0 deletions packages/yew-agent/src/lib.rs
Expand Up @@ -55,6 +55,15 @@ pub trait Agent: Sized + 'static {
"main.js"
}

/// Indicates whether the name of the resource is relative.
///
/// The default implementation returns `false`, which will cause the result
/// returned by [`Self::name_of_resource`] to be interpreted as an absolute
/// URL. If `true` is returned, it will be interpreted as a relative URL.
fn resource_path_is_relative() -> bool {
false
}

/// Signifies if resource is a module.
/// This has pending browser support.
fn is_module() -> bool {
Expand Down
22 changes: 18 additions & 4 deletions packages/yew-agent/src/worker/mod.rs
Expand Up @@ -69,15 +69,29 @@ where
let msg = msg.pack();
worker.post_message_vec(msg);
}

fn worker_new(name_of_resource: &str, is_module: bool) -> Worker {
fn worker_new(name_of_resource: &str, resource_is_relative: bool, is_module: bool) -> Worker {
let origin = gloo_utils::document()
.location()
.unwrap_throw()
.origin()
.unwrap_throw();
let script_url = format!("{}/{}", origin, name_of_resource);
let wasm_url = format!("{}/{}", origin, name_of_resource.replace(".js", "_bg.wasm"));
let pathname = gloo_utils::window().location().pathname().unwrap_throw();

let prefix = if resource_is_relative {
pathname
.rfind(|c| c == '/')
.map(|i| &pathname[..i])
.unwrap_or_default()
} else {
""
};
let script_url = format!("{}{}/{}", origin, prefix, name_of_resource);
let wasm_url = format!(
"{}{}/{}",
origin,
prefix,
name_of_resource.replace(".js", "_bg.wasm")
);
let array = Array::new();
array.push(
&format!(
Expand Down
3 changes: 2 additions & 1 deletion packages/yew-agent/src/worker/private.rs
Expand Up @@ -54,11 +54,12 @@ where
};

let name_of_resource = AGN::name_of_resource();
let is_relative = AGN::resource_path_is_relative();
let handler_cell = Rc::new(RefCell::new(Some(handler)));

let worker = {
let handler_cell = handler_cell.clone();
let worker = worker_new(name_of_resource, AGN::is_module());
let worker = worker_new(name_of_resource, is_relative, AGN::is_module());
let worker_clone = worker.clone();
worker.set_onmessage_closure(move |data: Vec<u8>| {
if let Some(handler) = handler_cell.borrow().as_ref() {
Expand Down
3 changes: 2 additions & 1 deletion packages/yew-agent/src/worker/public.rs
Expand Up @@ -64,8 +64,9 @@ where
}
};
let name_of_resource = AGN::name_of_resource();
let is_relative = AGN::resource_path_is_relative();
let worker = {
let worker = worker_new(name_of_resource, AGN::is_module());
let worker = worker_new(name_of_resource, is_relative, AGN::is_module());
let worker_clone = worker.clone();
worker.set_onmessage_closure(move |data: Vec<u8>| {
handler(data, &worker_clone);
Expand Down

0 comments on commit 916dc2e

Please sign in to comment.