export default function(source) { const worker = new Worker(source); let counter = 0; const 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); } }); function postMessage(message) { const uid = ++counter; return new Promise((resolve, reject) => { handlers[uid] = [resolve, reject]; worker.postMessage({ uid, message }); }); } return { getMetadata() { return postMessage({ type: "meta" }); }, format(code, options, debug) { return postMessage({ type: "format", code, options, debug }); }, postMessage }; }