Revela/src/client/worker.js
2022-11-18 20:00:58 -05:00

97 lines
3.1 KiB
JavaScript

import EventEmitter from './events.js';
import HookEvent from './hook.js';
class Workers extends EventEmitter {
constructor(ctx) {
super();
this.ctx = ctx;
this.window = ctx.window;
this.Worker = this.window.Worker || {};
this.Worklet = this.window.Worklet || {};
this.workletProto = this.Worklet.prototype || {};
this.workerProto = this.Worker.prototype || {};
this.postMessage = this.workerProto.postMessage;
this.terminate = this.workerProto.terminate;
this.addModule = this.workletProto.addModule;
}
overrideWorker() {
this.ctx.override(
this.window,
'Worker',
(target, that, args) => {
if (!args.length) return new target(...args);
let [url, options = {}] = args;
const event = new HookEvent({ url, options }, target, that);
this.emit('worker', event);
if (event.intercepted) return event.returnValue;
return new event.target(
...[event.data.url, event.data.options]
);
},
true
);
}
overrideAddModule() {
this.ctx.override(
this.workletProto,
'addModule',
(target, that, args) => {
if (!args.length) return target.apply(that, args);
let [url, options = {}] = args;
const event = new HookEvent({ url, options }, target, that);
this.emit('addModule', event);
if (event.intercepted) return event.returnValue;
return event.target.call(
event.that,
event.data.url,
event.data.options
);
}
);
}
overridePostMessage() {
this.ctx.override(
this.workerProto,
'postMessage',
(target, that, args) => {
if (!args.length) return target.apply(that, args);
let [message, transfer = []] = args;
const event = new HookEvent(
{ message, transfer },
target,
that
);
this.emit('postMessage', event);
if (event.intercepted) return event.returnValue;
return event.target.call(
event.that,
event.data.message,
event.data.transfer
);
}
);
}
overrideImportScripts() {
this.ctx.override(
this.window,
'importScripts',
(target, that, scripts) => {
if (!scripts.length) return target.apply(that, scripts);
const event = new HookEvent({ scripts }, target, that);
this.emit('importScripts', event);
if (event.intercepted) return event.returnValue;
return event.target.apply(event.that, event.data.scripts);
}
);
}
}
export default Workers;