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;