Files
test-repo/website/playground/composables/prettier-worker.js
T
d9bd8abfeb Add playground for current version (#18830)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: fisker <lionkay@gmail.com>
2026-02-05 22:29:59 +08:00

75 lines
1.7 KiB
JavaScript

/**
@import {PlaygroundSettings} from "./playground-settings.js"
@import {FormatMessage, MetaMessage} from "../../static/worker.mjs"
*/
class WorkerApi {
#workers = {};
#counter = 0;
#handlers = {};
#initWorker(version) {
if (this.#workers[version]) {
return this.#workers[version];
}
const worker = new Worker(`/worker.mjs?version=${version}`, {
type: "module",
});
this.#workers[version] = 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);
}
});
return worker;
}
#postMessage(message) {
const worker = this.#initWorker(message.version);
const uid = ++this.#counter;
return new Promise((resolve, reject) => {
this.#handlers[uid] = [resolve, reject];
worker.postMessage({ uid, message });
});
}
/**
* @param {MetaMessage["version"]} version
*/
getMetadata(version) {
/** @type {MetaMessage} */
const message = { type: "meta", version };
return this.#postMessage(message);
}
/**
* @param {FormatMessage["code"]} code
* @param {FormatMessage["options"]} options
* @param {FormatMessage["settings"]} settings
* @param {FormatMessage["version"]} version
*/
format(code, options, settings, version) {
/** @type {FormatMessage} */
const message = { type: "format", version, code, options, settings };
return this.#postMessage(message);
}
}
const worker = new WorkerApi();
export { worker };