feat: add boas wasn js engine

This commit is contained in:
2022-07-09 19:59:06 +08:00
parent d17c718ee8
commit a8a284163d
11 changed files with 1075 additions and 0 deletions

View File

@@ -0,0 +1,390 @@
// @generated file from wasmbuild -- do not edit
// deno-lint-ignore-file
// deno-fmt-ignore-file
// source-hash: 8da660663e79589e35cc62c575898459b04819a7
let wasm;
const heap = new Array(32).fill(undefined);
heap.push(undefined, null, true, false);
function getObject(idx) {
return heap[idx];
}
let heap_next = heap.length;
function dropObject(idx) {
if (idx < 36) return;
heap[idx] = heap_next;
heap_next = idx;
}
function takeObject(idx) {
const ret = getObject(idx);
dropObject(idx);
return ret;
}
function addHeapObject(obj) {
if (heap_next === heap.length) heap.push(heap.length + 1);
const idx = heap_next;
heap_next = heap[idx];
heap[idx] = obj;
return idx;
}
const cachedTextDecoder = new TextDecoder("utf-8", {
ignoreBOM: true,
fatal: true,
});
cachedTextDecoder.decode();
let cachedUint8Memory0;
function getUint8Memory0() {
if (cachedUint8Memory0.byteLength === 0) {
cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer);
}
return cachedUint8Memory0;
}
function getStringFromWasm0(ptr, len) {
return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));
}
let WASM_VECTOR_LEN = 0;
const cachedTextEncoder = new TextEncoder("utf-8");
const encodeString = function (arg, view) {
return cachedTextEncoder.encodeInto(arg, view);
};
function passStringToWasm0(arg, malloc, realloc) {
if (realloc === undefined) {
const buf = cachedTextEncoder.encode(arg);
const ptr = malloc(buf.length);
getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);
WASM_VECTOR_LEN = buf.length;
return ptr;
}
let len = arg.length;
let ptr = malloc(len);
const mem = getUint8Memory0();
let offset = 0;
for (; offset < len; offset++) {
const code = arg.charCodeAt(offset);
if (code > 0x7F) break;
mem[ptr + offset] = code;
}
if (offset !== len) {
if (offset !== 0) {
arg = arg.slice(offset);
}
ptr = realloc(ptr, len, len = offset + arg.length * 3);
const view = getUint8Memory0().subarray(ptr + offset, ptr + len);
const ret = encodeString(arg, view);
offset += ret.written;
}
WASM_VECTOR_LEN = offset;
return ptr;
}
let cachedInt32Memory0;
function getInt32Memory0() {
if (cachedInt32Memory0.byteLength === 0) {
cachedInt32Memory0 = new Int32Array(wasm.memory.buffer);
}
return cachedInt32Memory0;
}
/**
* @param {string} script
* @returns {string}
*/
export function run_js(script) {
try {
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
const ptr0 = passStringToWasm0(
script,
wasm.__wbindgen_malloc,
wasm.__wbindgen_realloc,
);
const len0 = WASM_VECTOR_LEN;
wasm.run_js(retptr, ptr0, len0);
var r0 = getInt32Memory0()[retptr / 4 + 0];
var r1 = getInt32Memory0()[retptr / 4 + 1];
return getStringFromWasm0(r0, r1);
} finally {
wasm.__wbindgen_add_to_stack_pointer(16);
wasm.__wbindgen_free(r0, r1);
}
}
function handleError(f, args) {
try {
return f.apply(this, args);
} catch (e) {
wasm.__wbindgen_exn_store(addHeapObject(e));
}
}
function getArrayU8FromWasm0(ptr, len) {
return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len);
}
const imports = {
__wbindgen_placeholder__: {
__wbg_proxyfetch_da79e6ec8542a0a7: function (arg0, arg1, arg2) {
const ret = proxy_fetch(getStringFromWasm0(arg1, arg2));
const ptr0 = passStringToWasm0(
ret,
wasm.__wbindgen_malloc,
wasm.__wbindgen_realloc,
);
const len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
},
__wbg_randomFillSync_91e2b39becca6147: function () {
return handleError(function (arg0, arg1, arg2) {
getObject(arg0).randomFillSync(getArrayU8FromWasm0(arg1, arg2));
}, arguments);
},
__wbindgen_object_drop_ref: function (arg0) {
takeObject(arg0);
},
__wbg_getRandomValues_b14734aa289bc356: function () {
return handleError(function (arg0, arg1) {
getObject(arg0).getRandomValues(getObject(arg1));
}, arguments);
},
__wbg_process_e56fd54cf6319b6c: function (arg0) {
const ret = getObject(arg0).process;
return addHeapObject(ret);
},
__wbindgen_is_object: function (arg0) {
const val = getObject(arg0);
const ret = typeof (val) === "object" && val !== null;
return ret;
},
__wbg_versions_77e21455908dad33: function (arg0) {
const ret = getObject(arg0).versions;
return addHeapObject(ret);
},
__wbg_node_0dd25d832e4785d5: function (arg0) {
const ret = getObject(arg0).node;
return addHeapObject(ret);
},
__wbindgen_is_string: function (arg0) {
const ret = typeof (getObject(arg0)) === "string";
return ret;
},
__wbg_static_accessor_NODE_MODULE_26b231378c1be7dd: function () {
const ret = module;
return addHeapObject(ret);
},
__wbg_require_0db1598d9ccecb30: function () {
return handleError(function (arg0, arg1, arg2) {
const ret = getObject(arg0).require(getStringFromWasm0(arg1, arg2));
return addHeapObject(ret);
}, arguments);
},
__wbg_crypto_b95d7173266618a9: function (arg0) {
const ret = getObject(arg0).crypto;
return addHeapObject(ret);
},
__wbg_msCrypto_5a86d77a66230f81: function (arg0) {
const ret = getObject(arg0).msCrypto;
return addHeapObject(ret);
},
__wbg_newnoargs_fc5356289219b93b: function (arg0, arg1) {
const ret = new Function(getStringFromWasm0(arg0, arg1));
return addHeapObject(ret);
},
__wbg_call_4573f605ca4b5f10: function () {
return handleError(function (arg0, arg1) {
const ret = getObject(arg0).call(getObject(arg1));
return addHeapObject(ret);
}, arguments);
},
__wbindgen_object_clone_ref: function (arg0) {
const ret = getObject(arg0);
return addHeapObject(ret);
},
__wbg_self_ba1ddafe9ea7a3a2: function () {
return handleError(function () {
const ret = self.self;
return addHeapObject(ret);
}, arguments);
},
__wbg_window_be3cc430364fd32c: function () {
return handleError(function () {
const ret = window.window;
return addHeapObject(ret);
}, arguments);
},
__wbg_globalThis_56d9c9f814daeeee: function () {
return handleError(function () {
const ret = globalThis.globalThis;
return addHeapObject(ret);
}, arguments);
},
__wbg_global_8c35aeee4ac77f2b: function () {
return handleError(function () {
const ret = global.global;
return addHeapObject(ret);
}, arguments);
},
__wbindgen_is_undefined: function (arg0) {
const ret = getObject(arg0) === undefined;
return ret;
},
__wbg_buffer_de1150f91b23aa89: function (arg0) {
const ret = getObject(arg0).buffer;
return addHeapObject(ret);
},
__wbg_new_97cf52648830a70d: function (arg0) {
const ret = new Uint8Array(getObject(arg0));
return addHeapObject(ret);
},
__wbg_set_a0172b213e2469e9: function (arg0, arg1, arg2) {
getObject(arg0).set(getObject(arg1), arg2 >>> 0);
},
__wbg_length_e09c0b925ab8de5d: function (arg0) {
const ret = getObject(arg0).length;
return ret;
},
__wbg_newwithlength_e833b89f9db02732: function (arg0) {
const ret = new Uint8Array(arg0 >>> 0);
return addHeapObject(ret);
},
__wbg_subarray_9482ae5cd5cd99d3: function (arg0, arg1, arg2) {
const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0);
return addHeapObject(ret);
},
__wbindgen_throw: function (arg0, arg1) {
throw new Error(getStringFromWasm0(arg0, arg1));
},
__wbindgen_memory: function () {
const ret = wasm.memory;
return addHeapObject(ret);
},
},
};
const wasm_url = new URL("boa_wasm_engine_bg.wasm", import.meta.url);
/**
* Decompression callback
*
* @callback decompressCallback
* @param {Uint8Array} compressed
* @return {Uint8Array} decompressed
*/
/** Instantiates an instance of the Wasm module returning its functions.
* @remarks It is safe to call this multiple times and once successfully
* loaded it will always return a reference to the same object.
* @param {decompressCallback=} transform
*/
export async function instantiate(transform) {
return (await instantiateWithInstance(transform)).exports;
}
let instanceWithExports;
let lastLoadPromise;
/** Instantiates an instance of the Wasm module along with its exports.
* @remarks It is safe to call this multiple times and once successfully
* loaded it will always return a reference to the same object.
* @param {decompressCallback=} transform
* @returns {Promise<{
* instance: WebAssembly.Instance;
* exports: { run_js: typeof run_js }
* }>}
*/
export function instantiateWithInstance(transform) {
if (instanceWithExports != null) {
return Promise.resolve(instanceWithExports);
}
if (lastLoadPromise == null) {
lastLoadPromise = (async () => {
try {
const instance = (await instantiateModule(transform)).instance;
wasm = instance.exports;
cachedInt32Memory0 = new Int32Array(wasm.memory.buffer);
cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer);
instanceWithExports = {
instance,
exports: getWasmInstanceExports(),
};
return instanceWithExports;
} finally {
lastLoadPromise = null;
}
})();
}
return lastLoadPromise;
}
function getWasmInstanceExports() {
return { run_js };
}
/** Gets if the Wasm module has been instantiated. */
export function isInstantiated() {
return instanceWithExports != null;
}
async function instantiateModule(transform) {
switch (wasm_url.protocol) {
case "file:": {
if (typeof Deno !== "object") {
throw new Error("file urls are not supported in this environment");
}
if ("permissions" in Deno) {
Deno.permissions.request({ name: "read", path: wasm_url });
}
const wasmCode = await Deno.readFile(wasm_url);
return WebAssembly.instantiate(
!transform ? wasmCode : transform(wasmCode),
imports,
);
}
case "https:":
case "http:": {
if (typeof Deno === "object" && "permissions" in Deno) {
Deno.permissions.request({ name: "net", host: wasm_url.host });
}
const wasmResponse = await fetch(wasm_url);
if (transform) {
const wasmCode = new Uint8Array(await wasmResponse.arrayBuffer());
return WebAssembly.instantiate(transform(wasmCode), imports);
}
if (
wasmResponse.headers.get("content-type")?.toLowerCase().startsWith(
"application/wasm",
)
) {
return WebAssembly.instantiateStreaming(wasmResponse, imports);
} else {
return WebAssembly.instantiate(
await wasmResponse.arrayBuffer(),
imports,
);
}
}
default:
throw new Error(`Unsupported protocol: ${wasm_url.protocol}`);
}
}