Skip to content

Instantly share code, notes, and snippets.

@santaklouse
Created September 18, 2023 14:06
Show Gist options
  • Save santaklouse/1fa29d2d24abdb2ea7ca11b00de86609 to your computer and use it in GitHub Desktop.
Save santaklouse/1fa29d2d24abdb2ea7ca11b00de86609 to your computer and use it in GitHub Desktop.
class WorkerWrapper extends EventEmitter {
#worker;
#ee = new EventEmitter();
constructor(worker) {
super();
this.#worker = worker;
console.log(`worker.js `, worker);
this.#worker.onmessage = (ev) => {
console.log(`onmessage`);
console.log(ev.data);
const { data: { payload, eventName } } = ev;
this.#ee.emit('data', { eventName, payload });
};
this.#worker.onerror = (error) => {
console.log(`onerror`, error);
// this.#ee.emit('error', { eventName, payload });
}
this.#ee.on('data', (data) => {
console.log(`on data`, data);
const { eventName, payload } = data;
super.emit(eventName, payload);
});
this.#ee.on('request', (...data) => {
console.log(`on request`, data);
this.postMessage(...data);
});
}
postMessage(...args) {
return this.#worker.postMessage(...args);
}
set onmessage($val) {
this.#worker.onmessage = $val;
}
get onmessage() {
return this.#worker.onmessage
}
terminate() {
return this.#worker.terminate();
}
close() {
return this.#worker.close();
}
// addEventListener(event, fn)
// on(eventName, listener) {
//
//
// return super.on(eventName, listener);
// this.#worker.onmessage = function (ev) {
// console.log(ev.data);
// this.#worker.terminate();
// };
// return this;
// }
emit(eventName, ...payload) {
this.#ee.emit('request', { eventName, payload});
}
async emitAwait(eventName, ...payload) {
console.time('eventName')
this.#ee.emit('request', { eventName, payload, waitForResponse: true});
return new Promise(resolve => {
this.once(eventName+'.response', (...args) => {
console.time('eventName');
resolve(...args);
})
})
}
destroy() {
this.#worker.terminate();
}
}
export const createWorker = () => {
const worker = new WorkerWrapper(
new Worker("./worker.js", [], {esm: true})
);
return worker;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment