diff options
Diffstat (limited to 'src/api/demo')
-rw-r--r-- | src/api/demo/lib/api.ts | 73 | ||||
-rw-r--r-- | src/api/demo/package.json | 2 | ||||
-rw-r--r-- | src/api/demo/pnpm-lock.yaml | 8 |
3 files changed, 54 insertions, 29 deletions
diff --git a/src/api/demo/lib/api.ts b/src/api/demo/lib/api.ts index e09eec51b..1619e2c46 100644 --- a/src/api/demo/lib/api.ts +++ b/src/api/demo/lib/api.ts @@ -2,7 +2,7 @@ import * as Schema from "../../schema"; import { ByteBuffer } from "peechy"; export interface WebAssemblyModule { - init(): number; + init(starting_memory: number): number; transform(a: number): number; malloc(a: number): number; calloc(a: number): number; @@ -10,38 +10,62 @@ export interface WebAssemblyModule { free(a: number): number; } +const wasm_imports_sym: symbol | string = + process.env.NODE_ENV === "development" + ? "wasm_imports" + : Symbol("wasm_imports"); + export class ESDev { static has_initialized = false; static wasm_source: WebAssembly.WebAssemblyInstantiatedSource = null; - static wasm_exports: WebAssemblyModule; - static memory: WebAssembly.Memory; + static get wasm_exports(): WebAssemblyModule { + return ESDev.wasm_source.instance.exports as any; + } + static get memory() { + return ESDev.wasm_exports.memory as WebAssembly.Memory; + } static memory_array: Uint8Array; - static async init(url) { - if (typeof SharedArrayBuffer !== "undefined") { - ESDev.memory = new WebAssembly.Memory({ - initial: 1500, - maximum: 3000, - shared: true, - }); - } else { - ESDev.memory = new WebAssembly.Memory({ - initial: 1500, - maximum: 3000, - }); + + static _decoder: TextDecoder; + + static _wasmPtrLenToString(ptr: number, len: number) { + if (!ESDev._decoder) { + ESDev._decoder = new TextDecoder(); } - ESDev.memory_array = new Uint8Array(ESDev.memory.buffer); + const region = ESDev.memory_array.subarray(ptr, ptr + len + 1); + return ESDev._decoder.decode(region); + } + + // We don't want people to be calling these manually + static [wasm_imports_sym] = { + console_log(ptr: number, len: number) { + console.log(ESDev._wasmPtrLenToString(ptr, len)); + }, + console_error(ptr: number, len: number) { + console.error(ESDev._wasmPtrLenToString(ptr, len)); + }, + console_warn(ptr: number, len: number) { + console.warn(ESDev._wasmPtrLenToString(ptr, len)); + }, + console_info(ptr: number, len: number) { + console.info(ESDev._wasmPtrLenToString(ptr, len)); + }, + }; + + static async init(url) { ESDev.wasm_source = await globalThis.WebAssembly.instantiateStreaming( fetch(url), - { - js: { - mem: ESDev.memory, - }, - } + { env: ESDev[wasm_imports_sym] } ); - ESDev.wasm_exports = ESDev.wasm_source.instance.exports as any; - ESDev.wasm_exports.init(); - console.log("WASM loaded."); + const res = ESDev.wasm_exports.init(1500); + if (res < 0) { + throw `[ESDev] Failed to initialize WASM module: code ${res}`; + } else { + console.log("WASM loaded."); + } + ESDev.memory_array = new Uint8Array(ESDev.memory.buffer); + ESDev.has_initialized = true; } @@ -63,6 +87,7 @@ export class ESDev { bb ); const data = bb.toUint8Array(); + const ptr = ESDev.wasm_exports.malloc(data.byteLength); ESDev.memory_array.set(data, ptr); debugger; diff --git a/src/api/demo/package.json b/src/api/demo/package.json index 27c8c943e..8576b2bc9 100644 --- a/src/api/demo/package.json +++ b/src/api/demo/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "next": "10.2.0", - "peechy": "0.3.6", + "peechy": "0.4.0", "react": "17.0.2", "react-dom": "17.0.2" } diff --git a/src/api/demo/pnpm-lock.yaml b/src/api/demo/pnpm-lock.yaml index cd3dfa28b..3e6b4c6cc 100644 --- a/src/api/demo/pnpm-lock.yaml +++ b/src/api/demo/pnpm-lock.yaml @@ -2,13 +2,13 @@ lockfileVersion: 5.3 specifiers: next: 10.2.0 - peechy: 0.3.6 + peechy: 0.4.0 react: 17.0.2 react-dom: 17.0.2 dependencies: next: 10.2.0_react-dom@17.0.2+react@17.0.2 - peechy: 0.3.6 + peechy: 0.4.0 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 @@ -1327,8 +1327,8 @@ packages: sha.js: 2.4.11 dev: false - /peechy/0.3.6: - resolution: {integrity: sha512-CUtPbzX8W4wlhHwZhPWhD9iK8q9BX09JfmKzXFUsMkbi49MGPH2X/tnRQJQaCwHiPqYUijzLLcRYmZQOLmo7Nw==} + /peechy/0.4.0: + resolution: {integrity: sha512-dIOZl4mEZGN91WYxrBv1/QOA/R6tNf10FFo4rrCSPfPGPz3gzsvkrXIT8K46XBBlZbSNYS4xUJZ6TZMrptcJIA==} hasBin: true dependencies: change-case: 4.1.2 |