Skip to content

Instantly share code, notes, and snippets.

@bigmistqke
Last active November 29, 2024 13:34
Show Gist options
  • Select an option

  • Save bigmistqke/2ce209eb548c86d35b885116e8105d9a to your computer and use it in GitHub Desktop.

Select an option

Save bigmistqke/2ce209eb548c86d35b885116e8105d9a to your computer and use it in GitHub Desktop.
createSharedArrayBuffer
import { createSignal } from "solid-js";
const signal = (buffer: Int32Array, index: number) => {
const s = createSignal(undefined, { equals: false });
const read = (debug?: string) => {
s[0]();
return buffer[index];
};
const write = (value: any) => {
Atomics.store(buffer, index, value);
Atomics.notify(buffer, index);
};
const subscribe = () => {
const result = Atomics.waitAsync(buffer, index, buffer[index]);
if (result.async)
result.value.then(() => {
s[1]();
subscribe();
});
else console.error("result.async is false", result);
};
subscribe();
return [read, write] as const;
};
export const createBuffer = (buffer: Int32Array) => {
const cache = new Map();
return new Proxy(buffer, {
get(target, p, receiver) {
if (typeof p !== "string") return false;
if (isNaN(+p)) return false;
if (!cache.get(p)) cache.set(p, signal(target, +p));
return cache.get(p)[0]();
},
set(target, p, newValue) {
if (typeof p !== "string") return false;
if (isNaN(+p)) return false;
if (!cache.get(p)) cache.set(p, signal(target, +p));
cache.get(p)[1](newValue);
return true;
},
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment