mirror of
https://github.com/fluencelabs/marine.git
synced 2025-03-15 05:50:49 +00:00
JS package (WIP)
This commit is contained in:
parent
50c809e60c
commit
79a2a89607
18
Cargo.lock
generated
18
Cargo.lock
generated
@ -869,9 +869,9 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "fluence-it-types"
|
||||
version = "0.3.1"
|
||||
source = "git+https://github.com/fluencelabs/interface-types?branch=marine_web_experiments#2e742a9fe1c857f622c4f0d3e105dec548bc53cd"
|
||||
source = "git+https://github.com/fluencelabs/interface-types/?branch=marine_web_experiments#2e742a9fe1c857f622c4f0d3e105dec548bc53cd"
|
||||
dependencies = [
|
||||
"it-to-bytes 0.1.0 (git+https://github.com/fluencelabs/interface-types?branch=marine_web_experiments)",
|
||||
"it-to-bytes 0.1.0 (git+https://github.com/fluencelabs/interface-types/?branch=marine_web_experiments)",
|
||||
"nom",
|
||||
"serde",
|
||||
"variant_count",
|
||||
@ -1361,9 +1361,9 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "it-lilo"
|
||||
version = "0.2.0"
|
||||
source = "git+https://github.com/fluencelabs/interface-types?branch=marine_web_experiments#2e742a9fe1c857f622c4f0d3e105dec548bc53cd"
|
||||
source = "git+https://github.com/fluencelabs/interface-types/?branch=marine_web_experiments#2e742a9fe1c857f622c4f0d3e105dec548bc53cd"
|
||||
dependencies = [
|
||||
"fluence-it-types 0.3.1 (git+https://github.com/fluencelabs/interface-types?branch=marine_web_experiments)",
|
||||
"fluence-it-types 0.3.1 (git+https://github.com/fluencelabs/interface-types/?branch=marine_web_experiments)",
|
||||
"it-traits",
|
||||
"log",
|
||||
"paste",
|
||||
@ -1379,12 +1379,12 @@ checksum = "729c74bb4236418898a219c6d96f14cba77456dd7c04a2e99e65e9c643709b56"
|
||||
[[package]]
|
||||
name = "it-to-bytes"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/fluencelabs/interface-types?branch=marine_web_experiments#2e742a9fe1c857f622c4f0d3e105dec548bc53cd"
|
||||
source = "git+https://github.com/fluencelabs/interface-types/?branch=marine_web_experiments#2e742a9fe1c857f622c4f0d3e105dec548bc53cd"
|
||||
|
||||
[[package]]
|
||||
name = "it-traits"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/fluencelabs/interface-types?branch=marine_web_experiments#2e742a9fe1c857f622c4f0d3e105dec548bc53cd"
|
||||
source = "git+https://github.com/fluencelabs/interface-types/?branch=marine_web_experiments#2e742a9fe1c857f622c4f0d3e105dec548bc53cd"
|
||||
dependencies = [
|
||||
"thiserror",
|
||||
]
|
||||
@ -3669,11 +3669,11 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "wasmer-interface-types-fl"
|
||||
version = "0.21.0"
|
||||
source = "git+https://github.com/fluencelabs/interface-types?branch=marine_web_experiments#2e742a9fe1c857f622c4f0d3e105dec548bc53cd"
|
||||
source = "git+https://github.com/fluencelabs/interface-types/?branch=marine_web_experiments#2e742a9fe1c857f622c4f0d3e105dec548bc53cd"
|
||||
dependencies = [
|
||||
"fluence-it-types 0.3.1 (git+https://github.com/fluencelabs/interface-types?branch=marine_web_experiments)",
|
||||
"fluence-it-types 0.3.1 (git+https://github.com/fluencelabs/interface-types/?branch=marine_web_experiments)",
|
||||
"it-lilo 0.2.0",
|
||||
"it-to-bytes 0.1.0 (git+https://github.com/fluencelabs/interface-types?branch=marine_web_experiments)",
|
||||
"it-to-bytes 0.1.0 (git+https://github.com/fluencelabs/interface-types/?branch=marine_web_experiments)",
|
||||
"it-traits",
|
||||
"itertools 0.10.3",
|
||||
"log",
|
||||
|
@ -1,3 +1,5 @@
|
||||
#! /bin/bash
|
||||
|
||||
wasm-pack build -d marine-web-pkg --target web
|
||||
wasm-pack build -d marine-node-pkg --target nodejs
|
||||
wasm-pack build --no-typescript --release -d marine-any-pkg
|
9
web-runtime/js-package/.gitignore
vendored
Normal file
9
web-runtime/js-package/.gitignore
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
dist
|
||||
node_modules
|
||||
wasm
|
||||
*.tgz
|
||||
|
||||
# this file is auto-generated
|
||||
src/wasm.js
|
||||
src/importObject.ts
|
||||
src/avm.wasm
|
8
web-runtime/js-package/.prettierrc.js
Normal file
8
web-runtime/js-package/.prettierrc.js
Normal file
@ -0,0 +1,8 @@
|
||||
module.exports = {
|
||||
semi: true,
|
||||
trailingComma: 'all',
|
||||
singleQuote: true,
|
||||
printWidth: 120,
|
||||
tabWidth: 4,
|
||||
useTabs: false,
|
||||
};
|
7161
web-runtime/js-package/package-lock.json
generated
Normal file
7161
web-runtime/js-package/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
29
web-runtime/js-package/package.json
Normal file
29
web-runtime/js-package/package.json
Normal file
@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "@fluencelabs/marine-js",
|
||||
"description": "Aquamarine VM",
|
||||
"version": "0.0.1-snapshot",
|
||||
"main": "./dist/index.js",
|
||||
"typings": "./dist/index.d.ts",
|
||||
"repository": "https://github.com/fluencelabs/air",
|
||||
"author": "Fluence Labs",
|
||||
"license": "Apache 2.0",
|
||||
"files": [
|
||||
"dist/*"
|
||||
],
|
||||
"bin": {
|
||||
"copy-avm": "./dist/copyAvm.js"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"postbuild": "cp ../marine-web-pkg/marine_web_runtime_bg.wasm ./dist/marine-js.wasm",
|
||||
"test": "jest"
|
||||
},
|
||||
"private": false,
|
||||
"devDependencies": {
|
||||
"@types/jest": "^27.4.0",
|
||||
"@types/node": "^14.0.0",
|
||||
"jest": "^27.2.4",
|
||||
"ts-jest": "^27.0.5",
|
||||
"typescript": "^4.0.0"
|
||||
}
|
||||
}
|
5
web-runtime/js-package/src/__test__/test.spec.ts
Normal file
5
web-runtime/js-package/src/__test__/test.spec.ts
Normal file
@ -0,0 +1,5 @@
|
||||
describe("Tests", () => {
|
||||
it("should work", async () => {
|
||||
expect(1 + 2).toBe(3);
|
||||
});
|
||||
});
|
1
web-runtime/js-package/src/index.ts
Normal file
1
web-runtime/js-package/src/index.ts
Normal file
@ -0,0 +1 @@
|
||||
export * from './marine_web_runtime';
|
@ -0,0 +1,90 @@
|
||||
/*
|
||||
module.exports.call_export = function (instance, export_name, args) {
|
||||
//console.log("JS: call_export called with: ", instance, export_name, args)
|
||||
let parsed_args = JSON.parse(args);
|
||||
//console.log("parsed args: ", args);
|
||||
let prepared_args = [];
|
||||
for (let i = 0; i < parsed_args.length; i++) {
|
||||
let arg = parsed_args[i];
|
||||
// console.log(arg)
|
||||
prepared_args.push(arg["I32"])
|
||||
}
|
||||
|
||||
//console.log("prepared args: ", prepared_args);
|
||||
let result = instance.exports[export_name](...prepared_args);
|
||||
//console.log("got result: ", result)
|
||||
let json_string = "[]";
|
||||
if (result !== undefined) {
|
||||
json_string = "[" + JSON.stringify(result) + "]"
|
||||
}
|
||||
|
||||
//console.log("got result_string: ", json_string)
|
||||
return json_string
|
||||
}
|
||||
|
||||
module.exports.get_memory_size = function (instance) {
|
||||
//console.log("called get_memory_size with name=", module_name);
|
||||
let buf = new Uint8Array(instance.exports.memory.buffer);
|
||||
//console.log("result=", buf.byteLength);
|
||||
return buf.byteLength
|
||||
}
|
||||
|
||||
module.exports.write_byte = function (instance, offset, value) {
|
||||
//console.log("write_byte called with args: module_name={}, offset={}, value={}", module_name, offset, value)
|
||||
let buf = new Uint8Array(instance.exports.memory.buffer);
|
||||
//console.log(buf)
|
||||
buf[offset] = value
|
||||
}
|
||||
|
||||
module.exports.read_byte = function (instance, offset) {
|
||||
//console.log("read_byte called with args: module_name={}, offset={}", module_name, offset)
|
||||
let buf = new Uint8Array(instance.exports.memory.buffer);
|
||||
//console.log(buf)
|
||||
//console.log("read_byte returns {}", buf[offset])
|
||||
return buf[offset];
|
||||
}
|
||||
*/
|
||||
export function call_export(instance, export_name, args) {
|
||||
//console.log("JS: call_export called with: ", instance, export_name, args)
|
||||
let parsed_args = JSON.parse(args);
|
||||
//console.log("parsed args: ", args);
|
||||
let prepared_args = [];
|
||||
for (let i = 0; i < parsed_args.length; i++) {
|
||||
let arg = parsed_args[i];
|
||||
// console.log(arg)
|
||||
prepared_args.push(arg["I32"])
|
||||
}
|
||||
|
||||
//console.log("prepared args: ", prepared_args);
|
||||
let result = instance.exports[export_name](...prepared_args);
|
||||
//console.log("got result: ", result)
|
||||
let json_string = "[]";
|
||||
if (result !== undefined) {
|
||||
json_string = "[" + JSON.stringify(result) + "]"
|
||||
}
|
||||
|
||||
//console.log("got result_string: ", json_string)
|
||||
return json_string
|
||||
}
|
||||
|
||||
export function get_memory_size(instance) {
|
||||
//console.log("called get_memory_size with name=", module_name);
|
||||
let buf = new Uint8Array(instance.exports.memory.buffer);
|
||||
//console.log("result=", buf.byteLength);
|
||||
return buf.byteLength
|
||||
}
|
||||
|
||||
export function write_byte(instance, offset, value) {
|
||||
//console.log("write_byte called with args: module_name={}, offset={}, value={}", module_name, offset, value)
|
||||
let buf = new Uint8Array(instance.exports.memory.buffer);
|
||||
//console.log(buf)
|
||||
buf[offset] = value
|
||||
}
|
||||
|
||||
export function read_byte(instance, offset) {
|
||||
//console.log("read_byte called with args: module_name={}, offset={}", module_name, offset)
|
||||
let buf = new Uint8Array(instance.exports.memory.buffer);
|
||||
//console.log(buf)
|
||||
//console.log("read_byte returns {}", buf[offset])
|
||||
return buf[offset];
|
||||
}
|
272
web-runtime/js-package/src/marine_web_runtime.js
Normal file
272
web-runtime/js-package/src/marine_web_runtime.js
Normal file
@ -0,0 +1,272 @@
|
||||
import {
|
||||
call_export,
|
||||
read_byte,
|
||||
write_byte,
|
||||
get_memory_size,
|
||||
} from './snippets/marine-web-runtime-6faa67b8af9cc173/marine-js.js';
|
||||
|
||||
async function init(module) {
|
||||
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;
|
||||
}
|
||||
|
||||
let cachedTextDecoder = new TextDecoder('utf-8', {
|
||||
ignoreBOM: true,
|
||||
fatal: true,
|
||||
});
|
||||
|
||||
cachedTextDecoder.decode();
|
||||
|
||||
let cachegetUint8Memory0 = null;
|
||||
function getUint8Memory0() {
|
||||
if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) {
|
||||
cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer);
|
||||
}
|
||||
return cachegetUint8Memory0;
|
||||
}
|
||||
|
||||
function getStringFromWasm0(ptr, len) {
|
||||
return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
let WASM_VECTOR_LEN = 0;
|
||||
|
||||
let cachedTextEncoder = new TextEncoder('utf-8');
|
||||
|
||||
const encodeString =
|
||||
typeof cachedTextEncoder.encodeInto === 'function'
|
||||
? function (arg, view) {
|
||||
return cachedTextEncoder.encodeInto(arg, view);
|
||||
}
|
||||
: function (arg, view) {
|
||||
const buf = cachedTextEncoder.encode(arg);
|
||||
view.set(buf);
|
||||
return {
|
||||
read: arg.length,
|
||||
written: buf.length,
|
||||
};
|
||||
};
|
||||
|
||||
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 cachegetInt32Memory0 = null;
|
||||
function getInt32Memory0() {
|
||||
if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) {
|
||||
cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer);
|
||||
}
|
||||
return cachegetInt32Memory0;
|
||||
}
|
||||
/**
|
||||
* @param {string} name
|
||||
*/
|
||||
function greet(name) {
|
||||
var ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||
var len0 = WASM_VECTOR_LEN;
|
||||
wasm.greet(ptr0, len0);
|
||||
}
|
||||
|
||||
function passArray8ToWasm0(arg, malloc) {
|
||||
const ptr = malloc(arg.length * 1);
|
||||
getUint8Memory0().set(arg, ptr / 1);
|
||||
WASM_VECTOR_LEN = arg.length;
|
||||
return ptr;
|
||||
}
|
||||
/**
|
||||
* @param {string} name
|
||||
* @param {Uint8Array} wit_section_bytes
|
||||
* @param {any} wasm_instance
|
||||
*/
|
||||
function register_module(name, wit_section_bytes, wasm_instance) {
|
||||
var ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||
var len0 = WASM_VECTOR_LEN;
|
||||
var ptr1 = passArray8ToWasm0(wit_section_bytes, wasm.__wbindgen_malloc);
|
||||
var len1 = WASM_VECTOR_LEN;
|
||||
wasm.register_module(ptr0, len0, ptr1, len1, addHeapObject(wasm_instance));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} module_name
|
||||
* @param {string} function_name
|
||||
* @param {string} args
|
||||
* @returns {string}
|
||||
*/
|
||||
function call_module(module_name, function_name, args) {
|
||||
try {
|
||||
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
||||
var ptr0 = passStringToWasm0(module_name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||
var len0 = WASM_VECTOR_LEN;
|
||||
var ptr1 = passStringToWasm0(function_name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||
var len1 = WASM_VECTOR_LEN;
|
||||
var ptr2 = passStringToWasm0(args, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||
var len2 = WASM_VECTOR_LEN;
|
||||
wasm.call_module(retptr, ptr0, len0, ptr1, len1, ptr2, len2);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
async function load(module, imports) {
|
||||
if (typeof Response === 'function' && module instanceof Response) {
|
||||
if (typeof WebAssembly.instantiateStreaming === 'function') {
|
||||
try {
|
||||
return await WebAssembly.instantiateStreaming(module, imports);
|
||||
} catch (e) {
|
||||
if (module.headers.get('Content-Type') != 'application/wasm') {
|
||||
console.warn(
|
||||
'`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n',
|
||||
e,
|
||||
);
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const bytes = await module.arrayBuffer();
|
||||
return await WebAssembly.instantiate(bytes, imports);
|
||||
} else {
|
||||
const instance = await WebAssembly.instantiate(module, imports);
|
||||
|
||||
if (instance instanceof WebAssembly.Instance) {
|
||||
return { instance, module };
|
||||
} else {
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function init(wasmModule) {
|
||||
const imports = {};
|
||||
imports.wbg = {};
|
||||
imports.wbg.__wbg_new_693216e109162396 = function () {
|
||||
var ret = new Error();
|
||||
return addHeapObject(ret);
|
||||
};
|
||||
imports.wbg.__wbg_stack_0ddaca5d1abfb52f = function (arg0, arg1) {
|
||||
var ret = getObject(arg1).stack;
|
||||
var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||
var len0 = WASM_VECTOR_LEN;
|
||||
getInt32Memory0()[arg0 / 4 + 1] = len0;
|
||||
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
|
||||
};
|
||||
imports.wbg.__wbg_error_09919627ac0992f5 = function (arg0, arg1) {
|
||||
try {
|
||||
console.error(getStringFromWasm0(arg0, arg1));
|
||||
} finally {
|
||||
wasm.__wbindgen_free(arg0, arg1);
|
||||
}
|
||||
};
|
||||
imports.wbg.__wbindgen_object_drop_ref = function (arg0) {
|
||||
takeObject(arg0);
|
||||
};
|
||||
imports.wbg.__wbg_writebyte_81064940ca9059c1 = function (arg0, arg1, arg2) {
|
||||
write_byte(getObject(arg0), arg1 >>> 0, arg2);
|
||||
};
|
||||
imports.wbg.__wbg_readbyte_63aea980ce35d833 = function (arg0, arg1) {
|
||||
var ret = read_byte(getObject(arg0), arg1 >>> 0);
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_getmemorysize_385fa0bd4e2d9ff6 = function (arg0) {
|
||||
var ret = get_memory_size(getObject(arg0));
|
||||
return ret;
|
||||
};
|
||||
imports.wbg.__wbg_callexport_cb1a6ee1197892bd = function (arg0, arg1, arg2, arg3, arg4, arg5) {
|
||||
var ret = call_export(getObject(arg1), getStringFromWasm0(arg2, arg3), getStringFromWasm0(arg4, arg5));
|
||||
var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||
var len0 = WASM_VECTOR_LEN;
|
||||
getInt32Memory0()[arg0 / 4 + 1] = len0;
|
||||
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
|
||||
};
|
||||
imports.wbg.__wbg_alert_607ccf701013ae06 = function (arg0, arg1) {
|
||||
console.log(getStringFromWasm0(arg0, arg1));
|
||||
};
|
||||
|
||||
const instance = await WebAssembly.instantiate(wasmModule, imports);
|
||||
wasm = instance.exports;
|
||||
|
||||
// strange line from autogenerated code. No idea why it's needed
|
||||
init.__wbindgen_wasm_module = module;
|
||||
|
||||
return wasm;
|
||||
}
|
||||
|
||||
await init(module);
|
||||
|
||||
return {
|
||||
register_module,
|
||||
call_module,
|
||||
greet,
|
||||
};
|
||||
}
|
||||
|
||||
export default init;
|
26
web-runtime/js-package/tsconfig.json
Normal file
26
web-runtime/js-package/tsconfig.json
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"lib": [
|
||||
"es2015",
|
||||
"dom"
|
||||
],
|
||||
"outDir": "./dist/",
|
||||
"target": "es5",
|
||||
"module": "commonjs",
|
||||
"allowJs": true,
|
||||
"strict": true,
|
||||
"esModuleInterop": true,
|
||||
"skipLibCheck": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"declaration": true,
|
||||
"declarationMap": false,
|
||||
"sourceMap": true,
|
||||
},
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"dist"
|
||||
],
|
||||
"include": [
|
||||
"src"
|
||||
],
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user