163 lines
4.9 KiB
JavaScript
163 lines
4.9 KiB
JavaScript
// load the Wiregasm library
|
|
importScripts(
|
|
'wiregasm_new.js', // self-compilation es5
|
|
'wiregasm_load.js'
|
|
// 'https://cdn.jsdelivr.net/npm/@goodtools/wiregasm/dist/wiregasm.js'
|
|
);
|
|
|
|
const wg = new Wiregasm();
|
|
|
|
const inflateRemoteBuffer = async url => {
|
|
const res = await fetch(url);
|
|
return await res.arrayBuffer();
|
|
};
|
|
|
|
const fetchPackages = async () => {
|
|
console.log('Fetching packages');
|
|
let [wasmBuffer, dataBuffer] = await Promise.all([
|
|
await inflateRemoteBuffer(
|
|
'wiregasm.wasm'
|
|
// 'https://cdn.jsdelivr.net/npm/@goodtools/wiregasm/dist/wiregasm.wasm'
|
|
),
|
|
await inflateRemoteBuffer(
|
|
'wiregasm.data'
|
|
// 'https://cdn.jsdelivr.net/npm/@goodtools/wiregasm/dist/wiregasm.data'
|
|
),
|
|
]);
|
|
|
|
return { wasmBuffer, dataBuffer };
|
|
};
|
|
|
|
// Load the Wiregasm Wasm data
|
|
fetchPackages()
|
|
.then(({ wasmBuffer, dataBuffer }) => {
|
|
return wg.init(loadWiregasm, {
|
|
wasmBinary: wasmBuffer,
|
|
getPreloadedPackage() {
|
|
return dataBuffer;
|
|
},
|
|
handleStatus: (type, status) => {
|
|
postMessage({ type: 'status', code: type, status: status });
|
|
},
|
|
printErr: error => {
|
|
postMessage({ type: 'error', error: error });
|
|
},
|
|
});
|
|
})
|
|
.then(() => {
|
|
postMessage({ type: 'init' });
|
|
})
|
|
.catch(e => {
|
|
postMessage({ type: 'error', error: e });
|
|
});
|
|
|
|
/**Converts a Vector to a JS array */
|
|
function replacer(key, value) {
|
|
if (value.constructor.name.startsWith('Vector')) {
|
|
return vectorToArray(value);
|
|
}
|
|
return value;
|
|
}
|
|
|
|
// Event listener to receive messages from the main script
|
|
this.onmessage = ev => {
|
|
const data = ev.data;
|
|
switch (data.type) {
|
|
case 'close':
|
|
wg.destroy();
|
|
break;
|
|
case 'columns':
|
|
const columns = wg.columns();
|
|
if (Array.isArray(columns)) {
|
|
this.postMessage({ type: 'columns', data: columns });
|
|
}
|
|
break;
|
|
case 'select': // select a frame
|
|
const number = data.number;
|
|
const frameData = wg.frame(number);
|
|
const frameDataToJSON = JSON.parse(JSON.stringify(frameData, replacer));
|
|
this.postMessage({
|
|
type: 'selected',
|
|
data: frameDataToJSON,
|
|
});
|
|
break;
|
|
case 'frames': // get frames list
|
|
const skip = data.skip;
|
|
const limit = data.limit;
|
|
const filter = data.filter;
|
|
const framesData = wg.frames(filter, skip, limit);
|
|
const framesDataToJSON = JSON.parse(JSON.stringify(framesData, replacer));
|
|
this.postMessage({
|
|
type: 'frames',
|
|
data: framesDataToJSON,
|
|
});
|
|
break;
|
|
case 'process-data':
|
|
const loadData = wg.load(data.name, new Uint8Array(data.data));
|
|
this.postMessage({ type: 'processed', data: loadData });
|
|
break;
|
|
case 'process':
|
|
const f = data.file;
|
|
const reader = new FileReader();
|
|
reader.addEventListener('load', event => {
|
|
// XXX: this blocks the worker thread
|
|
const loadData = wg.load(f.name, new Uint8Array(event.target.result));
|
|
postMessage({ type: 'processed', data: loadData });
|
|
});
|
|
reader.readAsArrayBuffer(f);
|
|
break;
|
|
case 'check-filter':
|
|
const filterStr = data.filter;
|
|
const checkFilterRes = wg.lib.checkFilter(filterStr);
|
|
this.postMessage({ type: 'filter', data: checkFilterRes });
|
|
break;
|
|
}
|
|
|
|
if (data.type === 'reload-quick') {
|
|
if (wg.session) {
|
|
// TODO: this is a hack, we should be able to reload the session
|
|
const name = data.name;
|
|
const res = wg.session.load();
|
|
|
|
postMessage({ type: 'processed', name: name, data: res });
|
|
}
|
|
} else if (data.type === 'module-tree') {
|
|
const res = wg.list_modules();
|
|
// send it to the correct port
|
|
event.ports[0].postMessage({
|
|
result: JSON.parse(JSON.stringify(res, replacer)),
|
|
});
|
|
} else if (data.type === 'module-prefs') {
|
|
const res = wg.list_prefs(data.name);
|
|
// send it to the correct port
|
|
event.ports[0].postMessage({
|
|
result: JSON.parse(JSON.stringify(res, replacer)),
|
|
});
|
|
} else if (data.type === 'upload-file') {
|
|
const f = data.file;
|
|
const reader = new FileReader();
|
|
reader.addEventListener('load', e => {
|
|
// XXX: this blocks the worker thread
|
|
const path = '/uploads/' + f.name;
|
|
wg.lib.FS.writeFile(path, Buffer.from(e.target.result));
|
|
event.ports[0].postMessage({ result: path });
|
|
});
|
|
reader.readAsArrayBuffer(f);
|
|
} else if (data.type === 'update-pref') {
|
|
try {
|
|
console.log(`set_pref(${data.module}, ${data.key}, ${data.value})`);
|
|
wg.set_pref(data.module, data.key, data.value);
|
|
event.ports[0].postMessage({ result: 'ok' });
|
|
} catch (e) {
|
|
console.error(
|
|
`set_pref(${data.module}, ${data.key}, ${data.value}) failed: ${e.message}`
|
|
);
|
|
event.ports[0].postMessage({ error: e.message });
|
|
}
|
|
} else if (data.type === 'apply-prefs') {
|
|
console.log(`apply_prefs()`);
|
|
wg.apply_prefs();
|
|
event.ports[0].postMessage({ result: 'ok' });
|
|
}
|
|
};
|