diff options
author | 2021-05-07 01:26:26 -0700 | |
---|---|---|
committer | 2021-05-07 01:26:26 -0700 | |
commit | fad34bb4abfe1715d4febec6e7de2809bfffb4e2 (patch) | |
tree | 6616f92155a3473c228e46f3c5693c47548761e9 /src/api/demo/lib/api.ts | |
parent | dd9e7de689dafb29ed3e79e2b7af54ea097f75e9 (diff) | |
download | bun-fad34bb4abfe1715d4febec6e7de2809bfffb4e2.tar.gz bun-fad34bb4abfe1715d4febec6e7de2809bfffb4e2.tar.zst bun-fad34bb4abfe1715d4febec6e7de2809bfffb4e2.zip |
cool
Former-commit-id: 96ff169e46fcb43d5afbc9a6e2fde039e27e9d5f
Diffstat (limited to 'src/api/demo/lib/api.ts')
-rw-r--r-- | src/api/demo/lib/api.ts | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/api/demo/lib/api.ts b/src/api/demo/lib/api.ts new file mode 100644 index 000000000..e09eec51b --- /dev/null +++ b/src/api/demo/lib/api.ts @@ -0,0 +1,77 @@ +import * as Schema from "../../schema"; +import { ByteBuffer } from "peechy"; + +export interface WebAssemblyModule { + init(): number; + transform(a: number): number; + malloc(a: number): number; + calloc(a: number): number; + realloc(a: number): number; + free(a: number): number; +} + +export class ESDev { + static has_initialized = false; + static wasm_source: WebAssembly.WebAssemblyInstantiatedSource = null; + static wasm_exports: WebAssemblyModule; + static memory: 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, + }); + } + ESDev.memory_array = new Uint8Array(ESDev.memory.buffer); + ESDev.wasm_source = await globalThis.WebAssembly.instantiateStreaming( + fetch(url), + { + js: { + mem: ESDev.memory, + }, + } + ); + + ESDev.wasm_exports = ESDev.wasm_source.instance.exports as any; + ESDev.wasm_exports.init(); + console.log("WASM loaded."); + ESDev.has_initialized = true; + } + + static transform(content: string, file_name: string) { + if (!ESDev.has_initialized) { + throw "Please run await ESDev.init(wasm_url) before using this."; + } + + const bb = new ByteBuffer( + new Uint8Array(content.length + file_name.length) + ); + bb.length = 0; + + Schema.encodeTransform( + { + contents: content, + path: file_name, + }, + bb + ); + const data = bb.toUint8Array(); + const ptr = ESDev.wasm_exports.malloc(data.byteLength); + ESDev.memory_array.set(data, ptr); + debugger; + const resp_ptr = ESDev.wasm_exports.transform(ptr); + var _bb = new ByteBuffer(ESDev.memory_array.subarray(resp_ptr)); + const response = Schema.decodeTransformResponse(_bb); + ESDev.wasm_exports.free(resp_ptr); + return response; + } +} + +globalThis.ESDev = ESDev; |