Skip to content

Commit 916dc2e

Browse files
astrawmc1098
andauthored
allow web worker resource to be relative (#2086)
* 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 <[email protected]> * do not reimplement stdlib function * fixup previous * improve docstring Co-authored-by: mc1098 <[email protected]>
1 parent 2b1059b commit 916dc2e

File tree

4 files changed

+31
-6
lines changed

4 files changed

+31
-6
lines changed

packages/yew-agent/src/lib.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ pub trait Agent: Sized + 'static {
5555
"main.js"
5656
}
5757

58+
/// Indicates whether the name of the resource is relative.
59+
///
60+
/// The default implementation returns `false`, which will cause the result
61+
/// returned by [`Self::name_of_resource`] to be interpreted as an absolute
62+
/// URL. If `true` is returned, it will be interpreted as a relative URL.
63+
fn resource_path_is_relative() -> bool {
64+
false
65+
}
66+
5867
/// Signifies if resource is a module.
5968
/// This has pending browser support.
6069
fn is_module() -> bool {

packages/yew-agent/src/worker/mod.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,29 @@ where
6969
let msg = msg.pack();
7070
worker.post_message_vec(msg);
7171
}
72-
73-
fn worker_new(name_of_resource: &str, is_module: bool) -> Worker {
72+
fn worker_new(name_of_resource: &str, resource_is_relative: bool, is_module: bool) -> Worker {
7473
let origin = gloo_utils::document()
7574
.location()
7675
.unwrap_throw()
7776
.origin()
7877
.unwrap_throw();
79-
let script_url = format!("{}/{}", origin, name_of_resource);
80-
let wasm_url = format!("{}/{}", origin, name_of_resource.replace(".js", "_bg.wasm"));
78+
let pathname = gloo_utils::window().location().pathname().unwrap_throw();
79+
80+
let prefix = if resource_is_relative {
81+
pathname
82+
.rfind(|c| c == '/')
83+
.map(|i| &pathname[..i])
84+
.unwrap_or_default()
85+
} else {
86+
""
87+
};
88+
let script_url = format!("{}{}/{}", origin, prefix, name_of_resource);
89+
let wasm_url = format!(
90+
"{}{}/{}",
91+
origin,
92+
prefix,
93+
name_of_resource.replace(".js", "_bg.wasm")
94+
);
8195
let array = Array::new();
8296
array.push(
8397
&format!(

packages/yew-agent/src/worker/private.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,12 @@ where
5454
};
5555

5656
let name_of_resource = AGN::name_of_resource();
57+
let is_relative = AGN::resource_path_is_relative();
5758
let handler_cell = Rc::new(RefCell::new(Some(handler)));
5859

5960
let worker = {
6061
let handler_cell = handler_cell.clone();
61-
let worker = worker_new(name_of_resource, AGN::is_module());
62+
let worker = worker_new(name_of_resource, is_relative, AGN::is_module());
6263
let worker_clone = worker.clone();
6364
worker.set_onmessage_closure(move |data: Vec<u8>| {
6465
if let Some(handler) = handler_cell.borrow().as_ref() {

packages/yew-agent/src/worker/public.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,9 @@ where
6464
}
6565
};
6666
let name_of_resource = AGN::name_of_resource();
67+
let is_relative = AGN::resource_path_is_relative();
6768
let worker = {
68-
let worker = worker_new(name_of_resource, AGN::is_module());
69+
let worker = worker_new(name_of_resource, is_relative, AGN::is_module());
6970
let worker_clone = worker.clone();
7071
worker.set_onmessage_closure(move |data: Vec<u8>| {
7172
handler(data, &worker_clone);

0 commit comments

Comments
 (0)