From 18c12a5532fb8eb86b55af603e2f6b96ee077799 Mon Sep 17 00:00:00 2001 From: Ardis Lu Date: Wed, 26 Jul 2023 22:30:48 -0700 Subject: [PATCH 1/1] Initial commit --- README.md | 11 ++++ index.html | 122 +++++++++++++++++++++++++++++++++++++++++ worker-no-atomics.js | 15 +++++ worker-with-atomics.js | 17 ++++++ worker.js | 7 +++ 5 files changed, 172 insertions(+) create mode 100644 README.md create mode 100644 index.html create mode 100644 worker-no-atomics.js create mode 100644 worker-with-atomics.js create mode 100644 worker.js diff --git a/README.md b/README.md new file mode 100644 index 0000000..226e2ba --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# minimal-atomics + +Minimal web app demonstrating the usage of [`Atomics`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics) and [`SharedArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer) in JavaScript. + +## Local development + +The website must be served in a [secure context](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts) to use [`SharedArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer). You can use [`local-web-server`](https://www.npmjs.com/package/local-web-server) to locally host the website with the required headers: + +``` +ws --cors.opener-policy same-origin --cors.embedder-policy require-corp +``` diff --git a/index.html b/index.html new file mode 100644 index 0000000..d55c2d7 --- /dev/null +++ b/index.html @@ -0,0 +1,122 @@ + + + + + + + + Minimal Atomics + + + + +
+

Minimal Atomics

+
+ +
+ + + +
+ +

+
+ +
+ +

+
+ +
+ +

+
+ + +
+ + + + + \ No newline at end of file diff --git a/worker-no-atomics.js b/worker-no-atomics.js new file mode 100644 index 0000000..fdcab95 --- /dev/null +++ b/worker-no-atomics.js @@ -0,0 +1,15 @@ +async function hash(iterations) { + let seed = new Uint8Array(64); + crypto.getRandomValues(seed); + + for (let i = 0; i < iterations; i++) { + seed = await crypto.subtle.digest('SHA-512', seed); + } +} + +addEventListener('message', async e => { + const iterations = e.data; + await hash(iterations); + postMessage('done'); + close(); +}); diff --git a/worker-with-atomics.js b/worker-with-atomics.js new file mode 100644 index 0000000..f6bf7ab --- /dev/null +++ b/worker-with-atomics.js @@ -0,0 +1,17 @@ +async function hash(iterations) { + let seed = new Uint8Array(64); + crypto.getRandomValues(seed); + + for (let i = 0; i < iterations; i++) { + seed = await crypto.subtle.digest('SHA-512', seed); + } +} + +addEventListener('message', async e => { + const sab = e.data; + const arr = new BigInt64Array(sab); + await hash(arr[0]); + Atomics.store(arr, 0, 0n); + Atomics.notify(arr, 0); + close(); +}); diff --git a/worker.js b/worker.js new file mode 100644 index 0000000..7d1417e --- /dev/null +++ b/worker.js @@ -0,0 +1,7 @@ +addEventListener('message', async e => { + const sab = e.data; + const arr = new BigInt64Array(sab); + const wait = Atomics.wait(arr, 0, 100n); + console.log(wait); + close(); +}); -- 2.47.3