Skip to content

Commit

Permalink
Account for Firefox SharedArrayBuffer bug in shared workers
Browse files Browse the repository at this point in the history
  • Loading branch information
daxpedda committed Dec 5, 2024
1 parent d0b6d66 commit 391a841
Showing 1 changed file with 20 additions and 3 deletions.
23 changes: 20 additions & 3 deletions src/backends/wasm_js.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ pub use crate::util::{inner_u32, inner_u64};
#[cfg(not(all(target_arch = "wasm32", any(target_os = "unknown", target_os = "none"))))]
compile_error!("`wasm_js` backend can be enabled only for OS-less WASM targets!");

use js_sys::{SharedArrayBuffer, Uint8Array, WebAssembly::Memory};
use js_sys::{JsString, Object, SharedArrayBuffer, Uint8Array, WebAssembly::Memory};
use wasm_bindgen::{prelude::wasm_bindgen, JsCast, JsValue};

// Size of our temporary Uint8Array buffer used with WebCrypto methods
Expand All @@ -38,8 +38,19 @@ pub fn fill_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
MEMORY_KIND_NOT_SHARED => false,
MEMORY_KIND_SHARED => true,
MEMORY_KIND_UNINIT => {
let memory: Memory = wasm_bindgen::memory().unchecked_into();
let val = if memory.buffer().is_instance_of::<SharedArrayBuffer>() {
let buffer = wasm_bindgen::memory().unchecked_into::<Memory>().buffer();

// `SharedArrayBuffer` is only available with `crossOriginIsolated`. But even
// without its possible to create a shared `WebAssembly.Memory`, so we check
// for that via the constructor name.
let shared = if CROSS_ORIGIN_ISOLATED.with(bool::clone) {
buffer.is_instance_of::<SharedArrayBuffer>()
} else {
let constructor_name = Object::from(buffer).constructor().name();
SHARED_ARRAY_BUFFER_NAME.with(|name| &constructor_name == name)
};

let val = if shared {
MEMORY_KIND_SHARED
} else {
MEMORY_KIND_NOT_SHARED
Expand Down Expand Up @@ -87,6 +98,7 @@ pub fn fill_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
}

#[wasm_bindgen]
#[rustfmt::skip]
extern "C" {
// Web Crypto API: Crypto interface (https://www.w3.org/TR/WebCryptoAPI/)
type Crypto;
Expand All @@ -98,4 +110,9 @@ extern "C" {
fn get_random_values(this: &Crypto, buf: &Uint8Array) -> Result<(), JsValue>;
#[wasm_bindgen(method, js_name = getRandomValues, catch)]
fn get_random_values_ref(this: &Crypto, buf: &mut [u8]) -> Result<(), JsValue>;
/// Returns the [`crossOriginIsolated`](https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated) global property.
#[wasm_bindgen(thread_local_v2, js_name = crossOriginIsolated)]
static CROSS_ORIGIN_ISOLATED: bool;
#[wasm_bindgen(thread_local_v2, static_string)]
static SHARED_ARRAY_BUFFER_NAME: JsString = "SharedArrayBuffer";
}

0 comments on commit 391a841

Please sign in to comment.