diff options
Diffstat (limited to 'src/api/demo/lib')
-rw-r--r-- | src/api/demo/lib/api.ts | 280 | ||||
-rw-r--r-- | src/api/demo/lib/run.ts | 70 | ||||
-rw-r--r-- | src/api/demo/lib/scan.ts | 44 |
3 files changed, 0 insertions, 394 deletions
diff --git a/src/api/demo/lib/api.ts b/src/api/demo/lib/api.ts deleted file mode 100644 index 88dd71001..000000000 --- a/src/api/demo/lib/api.ts +++ /dev/null @@ -1,280 +0,0 @@ -import * as Schema from "../../schema"; -import { ByteBuffer } from "peechy"; -import path from "path"; -import { Loader } from "../schema"; -// import { transform as sucraseTransform } from "sucrase"; - -export interface WebAssemblyModule { - init(): number; - transform(a: number): number; - bun_malloc(a: number): number; - bun_free(a: number): number; - scan(a: number): number; -} - -const wasm_imports_sym: symbol | string = - process.env.NODE_ENV === "development" ? "wasm_imports" : Symbol("wasm_imports"); - -const ptr_converter = new ArrayBuffer(16); -const ptr_float = new BigUint64Array(ptr_converter); -const slice = new Uint32Array(ptr_converter); - -const Wasi = { - clock_time_get(clk_id, tp) { - return Date.now(); - }, - environ_sizes_get() { - debugger; - return 0; - }, - environ_get(__environ, environ_buf) { - debugger; - return 0; - }, - - fd_close(fd) { - debugger; - return 0; - }, - proc_exit() {}, - - fd_seek(fd, offset_bigint, whence, newOffset) { - debugger; - }, - fd_write(fd, iov, iovcnt, pnum) { - debugger; - }, -}; - -var scratch: Uint8Array; -var scratch2: Uint8Array; - -export class Bun { - static has_initialized = false; - static wasm_source: WebAssembly.WebAssemblyInstantiatedSource = null; - static get wasm_exports(): WebAssemblyModule { - return Bun.wasm_source.instance.exports as any; - } - static get memory(): WebAssembly.Memory { - return Bun.wasm_source.instance.exports.memory as any; - } - - static memory_array: Uint8Array; - - static _decoder: TextDecoder; - - static _wasmPtrToSlice(offset: number | bigint) { - ptr_float[0] = typeof offset === "number" ? BigInt(offset) : offset; - return new Uint8Array(Bun.memory.buffer, slice[0], slice[1]); - } - - static _wasmPtrLenToString(slice: number) { - if (!Bun._decoder) { - Bun._decoder = new TextDecoder("utf8"); - } - - const region = this._wasmPtrToSlice(slice); - return Bun._decoder.decode(region); - } - - // We don't want people to be calling these manually - static [wasm_imports_sym] = { - console_log(slice: number) { - console.log(Bun._wasmPtrLenToString(slice)); - }, - console_error(slice: number) { - console.error(Bun._wasmPtrLenToString(slice)); - }, - console_warn(slice: number) { - console.warn(Bun._wasmPtrLenToString(slice)); - }, - console_info(slice: number) { - console.info(Bun._wasmPtrLenToString(slice)); - }, - - __indirect_function_table: new WebAssembly.Table({ - initial: 0, - element: "anyfunc", - }), - __stack_pointer: new WebAssembly.Global({ - mutable: true, - value: "i32", - }), - __multi3(one: number, two: number) { - return Math.imul(one | 0, two | 0); - }, - fmod(one: number, two: number) { - return one % two; - }, - memset(ptr: number, value: number, len: number) { - Bun.memory_array.fill(value, ptr, ptr + len); - }, - memcpy(ptr: number, value: number, len: number) { - Bun.memory_array.copyWithin(ptr, value, value + len); - }, - // These functions convert a to an unsigned long long, rounding toward zero. Negative values all become zero. - __fixunsdfti(a: number) { - return Math.floor(a); - }, - // These functions return the remainder of the unsigned division of a and b. - __umodti3(a: number, b: number) { - return (a | 0) % (b | 0); - }, - // These functions return the quotient of the unsigned division of a and b. - __udivti3(a: number, b: number) { - return (a | 0) / (b | 0); - }, - // These functions return the result of shifting a left by b bits. - __ashlti3(a: number, b: number) { - return (a | 0) >> (b | 0); - }, - /* Returns: convert a to a double, rounding toward even. */ - __floatuntidf(a: number) { - const mod = a % 2; - if (mod === 0) { - return Math.ceil(a); - } else if (mod === 1) { - return Math.floor(a); - } - }, - emscripten_notify_memory_growth() {}, - }; - - static async init(url) { - // globalThis.sucraseTransform = sucraseTransform; - scratch = new Uint8Array(8096); - - if (Bun.has_initialized) { - return; - } - - Bun.wasm_source = await globalThis.WebAssembly.instantiateStreaming(fetch(url), { - env: Bun[wasm_imports_sym], - wasi_snapshot_preview1: Wasi, - }); - - const res = Bun.wasm_exports.init(); - if (res < 0) { - throw `[Bun] Failed to initialize WASM module: code ${res}`; - } else { - console.log("WASM loaded."); - } - - Bun.has_initialized = true; - } - - static transformSync(content: Uint8Array | string, file_name: string) { - if (!Bun.has_initialized) { - throw "Please run await Bun.init(wasm_url) before using this."; - } - - // if (process.env.NODE_ENV === "development") { - // console.time("[Bun] Transform " + file_name); - // } - - const bb = new ByteBuffer(scratch); - bb.length = 0; - bb.index = 0; - var contents_buffer; - if (typeof content === "string") { - if (!scratch2) { - scratch2 = new Uint8Array(content.length * 2); - } - - let i = 0; - for (; i < content.length; i++) { - if (i > scratch2.length) { - var scratch3 = new Uint8Array(scratch2.length * 2); - scratch3.set(scratch2); - scratch2 = scratch3; - } - scratch2[i] = content.charCodeAt(i); - } - contents_buffer = scratch2.subarray(0, i); - } else { - contents_buffer = content; - } - - Schema.encodeTransform( - { - contents: contents_buffer, - path: file_name, - loader: { - ".jsx": Loader.jsx, - ".tsx": Loader.tsx, - ".ts": Loader.ts, - ".js": Loader.js, - ".json": Loader.json, - }[path.extname(file_name)], - }, - bb, - ); - const data = bb.toUint8Array(); - - const input_ptr = Bun.wasm_exports.bun_malloc(data.length); - var buffer = this._wasmPtrToSlice(input_ptr); - buffer.set(data); - - const resp_ptr = Bun.wasm_exports.transform(input_ptr); - var _bb = new ByteBuffer(this._wasmPtrToSlice(resp_ptr)); - const response = Schema.decodeTransformResponse(_bb); - Bun.wasm_exports.bun_free(input_ptr); - scratch = bb.data; - return response; - } - - static scan(content: Uint8Array | string, file_name: string, loader?: Loader) { - if (!Bun.has_initialized) { - throw "Please run await Bun.init(wasm_url) before using this."; - } - - // if (process.env.NODE_ENV === "development") { - // console.time("[Bun] Transform " + file_name); - // } - scratch.fill(0); - const bb = new ByteBuffer(scratch); - bb.length = 0; - bb.index = 0; - var contents_buffer; - if (typeof content === "string") { - if (!scratch2) { - scratch2 = new Uint8Array(content.length * 2); - } - const encode_into = new TextEncoder().encodeInto(content, scratch2); - contents_buffer = scratch2.subarray(0, encode_into.written); - } else { - contents_buffer = content; - } - - Schema.encodeScan( - { - contents: contents_buffer, - path: file_name, - loader: - loader || - { - ".jsx": Loader.jsx, - ".tsx": Loader.tsx, - ".ts": Loader.ts, - ".js": Loader.js, - ".json": Loader.json, - }[path.extname(file_name)], - }, - bb, - ); - const data = bb.toUint8Array(); - - const input_ptr = Bun.wasm_exports.bun_malloc(data.length); - var buffer = this._wasmPtrToSlice(input_ptr); - buffer.set(data); - - const resp_ptr = Bun.wasm_exports.scan(input_ptr); - var _bb = new ByteBuffer(this._wasmPtrToSlice(resp_ptr)); - const response = Schema.decodeScanResult(_bb); - Bun.wasm_exports.bun_free(input_ptr); - scratch = bb.data; - return response; - } -} - -globalThis.Bun = Bun; diff --git a/src/api/demo/lib/run.ts b/src/api/demo/lib/run.ts deleted file mode 100644 index 87d703556..000000000 --- a/src/api/demo/lib/run.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { transform as _transform, initialize } from "esbuild-wasm"; -import initSwc, { transformSync as transformSyncSWC } from "@swc/wasm-web"; -import { Bun } from "./api"; - -export async function start() { - await initialize({ - worker: false, - wasmURL: "/node_modules/esbuild-wasm/esbuild.wasm", - }); - await Bun.init("/bun-wasm.wasm"); - await initSwc("/node_modules/@swc/wasm-web/wasm_bg.wasm"); -} - -const swcOptions = { - sourceMaps: false, - inlineSourcesContent: false, - jsc: { - target: "es2022", - parser: { - jsx: true, - syntax: "typescript", - tsx: false, - decorators: false, - dynamicImport: false, - }, - }, -}; - -export async function transform(contents, file) { - var result: any = { - timings: { - esbuild: 0, - bun: 0, - swc: 0, - }, - }; - result.timings.esbuild = performance.now(); - result.esbuild = await _transform(contents, { - sourcefile: file, - loader: file.substring(file.lastIndexOf(".") + 1), - }); - result.timings.esbuild = performance.now() - result.timings.esbuild; - - result.timings.bun = performance.now(); - result.bun = Bun.transformSync(contents, file); - result.timings.bun = performance.now() - result.timings.bun; - - if (file.substring(file.lastIndexOf(".") + 1) === "tsx") { - swcOptions.jsc.parser.tsx = true; - swcOptions.jsc.parser.syntax = "typescript"; - } else if (file.substring(file.lastIndexOf(".") + 1) === "jsx") { - swcOptions.jsc.parser.tsx = false; - swcOptions.jsc.parser.jsx = true; - swcOptions.jsc.parser.syntax = "typescript"; - } else { - swcOptions.jsc.parser.tsx = false; - swcOptions.jsc.parser.jsx = false; - swcOptions.jsc.parser.syntax = "javascript"; - } - - result.timings.swc = performance.now(); - result.swc = transformSyncSWC(contents, swcOptions as any); - result.timings.swc = performance.now() - result.timings.swc; - - console.log("esbuild:", result.timings.esbuild, "ms"); - console.log("Bun:", result.timings.bun, "ms"); - console.log("SWC:", result.timings.swc, "ms"); - - return result; -} diff --git a/src/api/demo/lib/scan.ts b/src/api/demo/lib/scan.ts deleted file mode 100644 index c2fd7bb12..000000000 --- a/src/api/demo/lib/scan.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { init, parse } from "es-module-lexer"; - -import { Bun } from "./api"; - -export async function start() { - await init; - await Bun.init("/bun-wasm.wasm"); -} - -const swcOptions = { - sourceMaps: false, - inlineSourcesContent: false, - jsc: { - target: "es2022", - parser: { - jsx: true, - syntax: "typescript", - tsx: false, - decorators: false, - dynamicImport: false, - }, - }, -}; - -export async function transform(contents, file) { - var result: any = { - timings: { - lexer: 0, - bun: 0, - }, - }; - result.timings.lexer = performance.now(); - result.lexer = await parse(contents, file); - result.timings.lexer = performance.now() - result.timings.lexer; - - result.timings.bun = performance.now(); - result.bun = Bun.scan(contents, file); - result.timings.bun = performance.now() - result.timings.bun; - - console.log("lexer:", result.timings.lexer, "ms"); - console.log("Bun:", result.timings.bun, "ms"); - - return result; -} |