summaryrefslogtreecommitdiff
path: root/wasmjsbridge.js
blob: 67ad5123c5d4912ce20294b111bbabb639c7aee6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
export class Wasmjsbridge {
	constructor() {
		const decoder = new TextDecoder();
		this.bridgeImport = {
			get_js_objectname_method(ob, osz, nb, nsz) {
				const buffer = globalThis.wasmjsbridge_exports.memory.buffer;
				const objname = decoder.decode(new Uint8Array(buffer, ob, osz));
				const funcname = decoder.decode(new Uint8Array(buffer, nb, nsz));
				const func = function (...args) { return globalThis[objname][funcname](...args) };
				const n = globalThis.wasmjsbridge_counter + 1;
				globalThis.wasmjsbridge_counter = n;
				globalThis.wasmjsbridge_functionmap.set(n, func);
				return n;
			},
			get_js_objectid_method(obn, nb, nsz) {
				const buffer = globalThis.wasmjsbridge_exports.memory.buffer;
				const funcname = decoder.decode(new Uint8Array(buffer, nb, nsz));
				const obj = globalThis.wasmjsbridge_objectmap.get(obn);
				const func = function (...args) { return obj[funcname](...args) };
				const n = globalThis.wasmjsbridge_counter + 1;
				globalThis.wasmjsbridge_counter = n;
				globalThis.wasmjsbridge_functionmap.set(n, func);
				return n;
			},
			call_js_function_void(n) {
				const fn = globalThis.wasmjsbridge_functionmap.get(n);
				fn();
			},
			call_js_function_string_void(n, b, sz) {
				const fn = globalThis.wasmjsbridge_functionmap.get(n);
				const buffer = globalThis.wasmjsbridge_exports.memory.buffer;
				fn(decoder.decode(new Uint8Array(buffer, b, sz)));
			},
			call_js_function_string_int(n, b, sz) {
				const fn = globalThis.wasmjsbridge_functionmap.get(n);
				const buffer = globalThis.wasmjsbridge_exports.memory.buffer;
				return fn(decoder.decode(new Uint8Array(buffer, b, sz)));
			},
			call_js_function_string_object(n, b, sz) {
				const fn = globalThis.wasmjsbridge_functionmap.get(n);
				const buffer = globalThis.wasmjsbridge_exports.memory.buffer;
				const s = decoder.decode(new Uint8Array(buffer, b, sz))
				const obj = fn(s);
				const obn = globalThis.wasmjsbridge_counter + 1;
				globalThis.wasmjsbridge_counter = obn;
				globalThis.wasmjsbridge_objectmap.set(obn, obj);
				return obn
			},
			call_js_function_int_int_void(n, x, y) {
				const fn = globalThis.wasmjsbridge_functionmap.get(n);
				return fn(x, y);
			},
		};
	}

	init(exports, argv, argc) {
		globalThis.wasmjsbridge_exports = exports;
		globalThis.wasmjsbridge_counter = 0;
		globalThis.wasmjsbridge_functionmap = new Map();
		globalThis.wasmjsbridge_objectmap = new Map();
		exports.hs_init(argv, argc);
	}
}