Starting to work with web workers.
This commit is contained in:
parent
4b53b9d4ba
commit
9089b08c6e
|
@ -0,0 +1,28 @@
|
||||||
|
import dispatch, { init, worker } from './dispatcher-main';
|
||||||
|
|
||||||
|
describe('The dispatcher-main', () => {
|
||||||
|
var postMessage = jest.fn();
|
||||||
|
beforeEach(() => {
|
||||||
|
global.SharedWorker = jest.fn(function (source) {
|
||||||
|
this.source = source;
|
||||||
|
this.port = {
|
||||||
|
postMessage,
|
||||||
|
};
|
||||||
|
return this;
|
||||||
|
});
|
||||||
|
init();
|
||||||
|
});
|
||||||
|
test('should create a new shared web worker', () => {
|
||||||
|
expect(SharedWorker).toBeCalled();
|
||||||
|
});
|
||||||
|
test('should create a onmessage function', () => {
|
||||||
|
expect(worker.port.onmessage).toBeDefined();
|
||||||
|
});
|
||||||
|
test('should return a promise if no callback is provided', () => {
|
||||||
|
expect(dispatch('ping')).toBeInstanceOf(Promise);
|
||||||
|
});
|
||||||
|
test('should send back the message', () => {
|
||||||
|
dispatch('ping');
|
||||||
|
expect(postMessage).toBeCalledWith({ id: 0, payload: 'ping' });
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,47 @@
|
||||||
|
declare global {
|
||||||
|
var dispatcherQueue: { index: number; queue: Map<number, any> };
|
||||||
|
}
|
||||||
|
|
||||||
|
export var worker: any;
|
||||||
|
|
||||||
|
export const init = () => {
|
||||||
|
globalThis.dispatcherQueue = { index: 0, queue: new Map() };
|
||||||
|
|
||||||
|
worker = new SharedWorker('./dispatcher-worker');
|
||||||
|
|
||||||
|
worker.port.onmessage = (event: any) => {
|
||||||
|
const { id, payload } = event.data;
|
||||||
|
dispatcherQueue.queue.get(id)(null, payload);
|
||||||
|
dispatcherQueue.queue.delete(id);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const dispatch = (
|
||||||
|
payload: any,
|
||||||
|
callBack?: (error: any, result: any) => void
|
||||||
|
) => {
|
||||||
|
if (worker === undefined) {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
if (callBack === undefined) {
|
||||||
|
/** If a callback function is not provided, return a promise */
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
dispatch(payload, (error, result) => {
|
||||||
|
if (error) {
|
||||||
|
reject(error);
|
||||||
|
} else {
|
||||||
|
resolve(result);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/** Otherwise, use the callback function */
|
||||||
|
dispatcherQueue.queue.set(dispatcherQueue.index, callBack);
|
||||||
|
const message = {
|
||||||
|
id: dispatcherQueue.index++,
|
||||||
|
payload: payload,
|
||||||
|
};
|
||||||
|
worker.port.postMessage(message);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default dispatch;
|
|
@ -0,0 +1,19 @@
|
||||||
|
import worker from './dispatcher-worker';
|
||||||
|
|
||||||
|
describe('The dispatcher-worker ', () => {
|
||||||
|
let port;
|
||||||
|
beforeEach(() => {
|
||||||
|
port = {
|
||||||
|
postMessage: jest.fn(),
|
||||||
|
};
|
||||||
|
worker.onconnect({ ports: [port] });
|
||||||
|
});
|
||||||
|
test('creates a onmessage function', () => {
|
||||||
|
expect(port.onmessage).toBeDefined();
|
||||||
|
expect(port.postMessage).not.toBeCalled();
|
||||||
|
});
|
||||||
|
test('receives a ping and sends a pong', () => {
|
||||||
|
port.onmessage({ data: { id: 5, payload: 'ping' } });
|
||||||
|
expect(port.postMessage).toBeCalledWith({ id: 5, payload: '"ping" pong' });
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,13 @@
|
||||||
|
const self = globalThis as unknown as SharedWorkerGlobalScope;
|
||||||
|
|
||||||
|
self.onconnect = function (e) {
|
||||||
|
var port = e.ports[0];
|
||||||
|
|
||||||
|
port.onmessage = function (e) {
|
||||||
|
console.log(`Worker received ${JSON.stringify(e)}`);
|
||||||
|
const { id, payload } = e.data;
|
||||||
|
port.postMessage({ id: id, payload: `${JSON.stringify(payload)} pong` });
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export default self;
|
Loading…
Reference in New Issue