Files
windows-user-space-emulator/page/public/emulator-worker.js
2025-04-29 15:48:18 +02:00

74 lines
1.5 KiB
JavaScript

var logLines = [];
var lastFlush = new Date().getTime();
var msgQueue = [];
onmessage = async (event) => {
const data = event.data;
if (data.message == "run") {
const payload = data.data;
runEmulation(payload.file, payload.options);
} else if (data.message == "event") {
const payload = data.data;
msgQueue.push(payload);
}
};
function flushLines() {
const lines = logLines;
logLines = [];
lastFlush = new Date().getTime();
postMessage({ message: "log", data: lines });
}
function logLine(text) {
logLines.push(text);
const now = new Date().getTime();
if (lastFlush + 15 < now) {
flushLines();
}
}
function notifyExit(code) {
flushLines();
postMessage({ message: "end", data: code });
self.close();
}
function handleMessage(message) {
postMessage({ message: "event", data: message });
}
function getMessageFromQueue() {
if (msgQueue.length == 0) {
return "";
}
return msgQueue.shift();
}
function runEmulation(file, options) {
const mainArguments = [...options, "-e", "./root", file];
globalThis.Module = {
arguments: mainArguments,
noInitialRun: true,
onRuntimeInitialized: function () {
FS.mkdir("/root");
FS.mount(IDBFS, {}, "/root");
FS.syncfs(true, function (err) {
Module.callMain(mainArguments);
});
},
print: logLine,
printErr: logLine,
onAbort: () => notifyExit(null),
onExit: notifyExit,
postRun: flushLines,
};
importScripts("./analyzer.js");
}