63 lines
1.6 KiB
JavaScript
63 lines
1.6 KiB
JavaScript
const g = global || window || self;
|
|
if (!g.__go_wasm__) {
|
|
g.__go_wasm__ = {};
|
|
}
|
|
|
|
const maxTime = 3 * 1000;
|
|
|
|
const bridge = g.__go_wasm__;
|
|
|
|
function sleep() {
|
|
return new Promise(requestAnimationFrame);
|
|
}
|
|
export default function (getBytes) {
|
|
let proxy;
|
|
|
|
async function init() {
|
|
const go = new g.Go();
|
|
let bytes = await getBytes;
|
|
let result = await WebAssembly.instantiate(bytes, go.importObject);
|
|
go.run(result.instance);
|
|
bridge.__proxy__ = proxy
|
|
setTimeout(() => {
|
|
if (bridge.__ready__ !== true) {
|
|
console.warn("Golang Wasm Bridge (__go_wasm__.__ready__) still not true after max time");
|
|
}
|
|
}, maxTime);
|
|
}
|
|
|
|
init();
|
|
|
|
|
|
proxy = new Proxy(
|
|
{},
|
|
{
|
|
get: (_, key) => {
|
|
return (...args) => {
|
|
return new Promise(async (res, rej) => {
|
|
while (bridge.__ready__ !== true) {
|
|
await sleep();
|
|
}
|
|
|
|
if (typeof bridge[key] !== 'function') {
|
|
res(bridge[key]);
|
|
return;
|
|
}
|
|
|
|
const returnObj = bridge[key].apply(undefined, args);
|
|
if (returnObj.error instanceof Error) {
|
|
return rej(returnObj.error)
|
|
}
|
|
|
|
if (returnObj.result) return res(returnObj.result);
|
|
|
|
return res(returnObj)
|
|
})
|
|
};
|
|
}
|
|
}
|
|
);
|
|
|
|
return proxy;
|
|
}
|