Spaces:
Sleeping
Sleeping
File size: 2,785 Bytes
11811dc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | // @flow
// This file is intended for use in the GL-JS test suite
// It implements a MessageBus main thread interface for use in Node environments
// In a browser environment, this file is replaced with ./src/util/browser/web_worker.js
// when Rollup builds the main bundle.
// See package.json#browser
import Worker from '../source/worker';
import type {WorkerSource} from '../source/worker_source';
type MessageListener = ({data: Object}) => mixed;
// The main thread interface. Provided by Worker in a browser environment,
// and MessageBus below in a node environment.
export interface WorkerInterface {
addEventListener(type: 'message', listener: MessageListener): void;
removeEventListener(type: 'message', listener: MessageListener): void;
postMessage(message: any): void;
terminate(): void;
}
export interface WorkerGlobalScopeInterface {
importScripts(...urls: Array<string>): void;
registerWorkerSource: (string, Class<WorkerSource>) => void,
registerRTLTextPlugin: (_: any) => void
}
class MessageBus implements WorkerInterface, WorkerGlobalScopeInterface {
addListeners: Array<MessageListener>;
postListeners: Array<MessageListener>;
target: MessageBus;
registerWorkerSource: *;
registerRTLTextPlugin: *;
constructor(addListeners: Array<MessageListener>, postListeners: Array<MessageListener>) {
this.addListeners = addListeners;
this.postListeners = postListeners;
}
addEventListener(event: 'message', callback: MessageListener) {
if (event === 'message') {
this.addListeners.push(callback);
}
}
removeEventListener(event: 'message', callback: MessageListener) {
const i = this.addListeners.indexOf(callback);
if (i >= 0) {
this.addListeners.splice(i, 1);
}
}
postMessage(data: Object) {
setImmediate(() => {
try {
for (const listener of this.postListeners) {
listener({data, target: this.target});
}
} catch (e) {
console.error(e);
}
});
}
terminate() {
this.addListeners.splice(0, this.addListeners.length);
this.postListeners.splice(0, this.postListeners.length);
}
importScripts() {}
}
export default function WebWorker(): WorkerInterface {
const parentListeners = [],
workerListeners = [],
parentBus = new MessageBus(workerListeners, parentListeners),
workerBus = new MessageBus(parentListeners, workerListeners);
parentBus.target = workerBus;
workerBus.target = parentBus;
new WebWorker.Worker(workerBus);
return parentBus;
}
// expose to allow stubbing in unit tests
WebWorker.Worker = Worker;
|