2026-01-27 19:36:56 +08:00
|
|
|
/**
|
|
|
|
|
@import {PlaygroundSettings} from "./playground-settings.js"
|
|
|
|
|
@import {FormatMessage, MetaMessage} from "../../static/worker.mjs"
|
|
|
|
|
*/
|
|
|
|
|
|
2026-01-05 17:51:47 +08:00
|
|
|
class WorkerApi {
|
|
|
|
|
#worker = new Worker("/worker.mjs", { type: "module" });
|
|
|
|
|
#counter = 0;
|
|
|
|
|
#handlers = {};
|
|
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
|
const worker = this.#worker;
|
|
|
|
|
const handlers = this.#handlers;
|
|
|
|
|
|
|
|
|
|
worker.addEventListener("message", (event) => {
|
|
|
|
|
const { uid, message, error } = event.data;
|
|
|
|
|
|
|
|
|
|
if (!handlers[uid]) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const [resolve, reject] = handlers[uid];
|
|
|
|
|
delete handlers[uid];
|
|
|
|
|
|
|
|
|
|
if (error) {
|
|
|
|
|
reject(error);
|
|
|
|
|
} else {
|
|
|
|
|
resolve(message);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#postMessage(message) {
|
|
|
|
|
const uid = ++this.#counter;
|
|
|
|
|
const worker = this.#worker;
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
this.#handlers[uid] = [resolve, reject];
|
|
|
|
|
worker.postMessage({ uid, message });
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getMetadata() {
|
2026-01-27 19:36:56 +08:00
|
|
|
/** @type {MetaMessage} */
|
|
|
|
|
const message = { type: "meta" };
|
|
|
|
|
return this.#postMessage(message);
|
2026-01-05 17:51:47 +08:00
|
|
|
}
|
|
|
|
|
|
2026-01-27 19:36:56 +08:00
|
|
|
/**
|
|
|
|
|
* @param {FormatMessage["code"]} code
|
|
|
|
|
* @param {FormatMessage["options"]} options
|
|
|
|
|
* @param {FormatMessage["settings"]} settings
|
|
|
|
|
*/
|
|
|
|
|
format(code, options, settings) {
|
|
|
|
|
/** @type {FormatMessage} */
|
|
|
|
|
const message = { type: "format", code, options, settings };
|
|
|
|
|
return this.#postMessage(message);
|
2026-01-05 17:51:47 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const worker = new WorkerApi();
|
|
|
|
|
|
|
|
|
|
export { worker };
|