aboutsummaryrefslogtreecommitdiff
path: root/src/api/demo/lib/api.ts
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2021-05-07 14:12:56 -0700
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2021-05-07 14:12:56 -0700
commitcaa747ba717e28791089d2db22ee9300f11b4d25 (patch)
tree0cc00b1815befb269132c26cdbe73a3a507b4d94 /src/api/demo/lib/api.ts
parentfad34bb4abfe1715d4febec6e7de2809bfffb4e2 (diff)
downloadbun-caa747ba717e28791089d2db22ee9300f11b4d25.tar.gz
bun-caa747ba717e28791089d2db22ee9300f11b4d25.tar.zst
bun-caa747ba717e28791089d2db22ee9300f11b4d25.zip
wip
Former-commit-id: f4267e2d1fee0d885630dc2a87be0a5699bf526f
Diffstat (limited to 'src/api/demo/lib/api.ts')
-rw-r--r--src/api/demo/lib/api.ts73
1 files changed, 49 insertions, 24 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;