promise-worker-bi 5.0.1 → 6.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,10 @@
1
- # promise-worker-bi [![Build Status](https://travis-ci.org/dumbmatter/promise-worker-bi.svg?branch=master)](https://travis-ci.org/dumbmatter/promise-worker-bi)
1
+ # promise-worker-bi
2
+
3
+ [![Build Status](https://github.com/dumbmatter/promise-worker-bi/actions/workflows/nodejs.yml/badge.svg)](https://github.com/dumbmatter/promise-worker-bi/actions/workflows/nodejs.yml)
4
+ [![GitHub Repo stars](https://img.shields.io/github/stars/dumbmatter/promise-worker-bi)](https://github.com/dumbmatter/promise-worker-bi)
5
+ [![GitHub](https://img.shields.io/github/license/dumbmatter/promise-worker-bi)](https://github.com/dumbmatter/promise-worker-bi)
6
+ [![npm](https://img.shields.io/npm/v/promise-worker-bi)](https://www.npmjs.com/package/promise-worker-bi)
7
+ [![npm](https://img.shields.io/npm/dm/promise-worker-bi)](https://www.npmjs.com/package/promise-worker-bi)
2
8
 
3
9
  A small (~2 kB min+gz) and performant library for communicating with web workers and shared workers, using promises. Post a message from the browser to the worker, get a promise that resolves to the response. Post a message from the worker to the browser, get a promise that resolves to the response. And with shared workers, you can either broadcast to all browser tabs or send a message to a specific tab.
4
10
 
@@ -21,14 +27,14 @@ const promiseWorker = new PWBHost(worker);
21
27
 
22
28
  // Only needed if you send messages from the worker to the host
23
29
  promiseWorker.register((message) => {
24
- return "pong2";
30
+ return "pong2";
25
31
  });
26
32
 
27
33
  try {
28
- const response = await promiseWorker.postMessage("ping");
29
- // handle response 'pong'
34
+ const response = await promiseWorker.postMessage("ping");
35
+ // handle response 'pong'
30
36
  } catch (error) {
31
- // handle error
37
+ // handle error
32
38
  }
33
39
  ```
34
40
 
@@ -42,14 +48,14 @@ const promiseWorker = new PWBWorker();
42
48
 
43
49
  // Only needed if you send messages from the host to the worker
44
50
  promiseWorker.register((message) => {
45
- return "pong";
51
+ return "pong";
46
52
  });
47
53
 
48
54
  try {
49
- const response = await promiseWorker.postMessage("ping2");
50
- // handle response 'pong2'
55
+ const response = await promiseWorker.postMessage("ping2");
56
+ // handle response 'pong2'
51
57
  } catch (error) {
52
- // handle error
58
+ // handle error
53
59
  }
54
60
  ```
55
61
 
@@ -61,15 +67,15 @@ The message you send can be any object, array, string, number, etc. - anything t
61
67
 
62
68
  ```js
63
69
  await promiseWorker.postMessage({
64
- hello: "world",
65
- answer: 42,
66
- "this is fun": true,
70
+ hello: "world",
71
+ answer: 42,
72
+ "this is fun": true,
67
73
  });
68
74
  ```
69
75
 
70
76
  ```js
71
77
  promiseWorker.register((message) => {
72
- console.log(message); // { hello: 'world', answer: 42, 'this is fun': true }
78
+ console.log(message); // { hello: 'world', answer: 42, 'this is fun': true }
73
79
  });
74
80
  ```
75
81
 
@@ -79,7 +85,7 @@ The registered handler can return either a Promise or a normal value:
79
85
 
80
86
  ```js
81
87
  promiseWorker.register(async () => {
82
- "much async, very promise";
88
+ "much async, very promise";
83
89
  });
84
90
  ```
85
91
 
@@ -94,15 +100,15 @@ Any thrown errors or asynchronous rejections during a response will be propagate
94
100
 
95
101
  ```js
96
102
  promiseWorker.register((message) => {
97
- throw new Error("naughty!");
103
+ throw new Error("naughty!");
98
104
  });
99
105
  ```
100
106
 
101
107
  ```js
102
108
  try {
103
- await promiseWorker.postMessage("whoops");
109
+ await promiseWorker.postMessage("whoops");
104
110
  } catch (error) {
105
- console.log(error.message); // 'naughty!'
111
+ console.log(error.message); // 'naughty!'
106
112
  }
107
113
  ```
108
114
 
@@ -114,7 +120,7 @@ Therefore, promise-worker-bi includes a unified API that works in Web Workers an
114
120
 
115
121
  ```js
116
122
  promiseWorker.registerError((error) => {
117
- console.log("Error inside worker!", err);
123
+ console.log("Error inside worker!", err);
118
124
  });
119
125
  ```
120
126
 
@@ -130,21 +136,21 @@ If you need to send messages of multiple types to the worker, just add some type
130
136
 
131
137
  ```js
132
138
  const response1 = await promiseWorker.postMessage({
133
- type: "en",
139
+ type: "en",
134
140
  });
135
141
 
136
142
  const response2 = await promiseWorker.postMessage({
137
- type: "en",
143
+ type: "en",
138
144
  });
139
145
  ```
140
146
 
141
147
  ```js
142
148
  promiseWorker.register((message) => {
143
- if (message.type === "en") {
144
- return "Hello!";
145
- } else if (message.type === "fr") {
146
- return "Bonjour!";
147
- }
149
+ if (message.type === "en") {
150
+ return "Hello!";
151
+ } else if (message.type === "fr") {
152
+ return "Bonjour!";
153
+ }
148
154
  });
149
155
  ```
150
156
 
@@ -162,14 +168,14 @@ const worker = new SharedWorker("worker.js");
162
168
  const promiseWorker = new PWBHost(worker);
163
169
 
164
170
  promiseWorker.register((message) => {
165
- console.log(message);
171
+ console.log(message);
166
172
  });
167
173
 
168
174
  // setTimeout is just to give you enough time to open main.js and main2.js in
169
175
  // two separate tabs.
170
176
  setTimeout(async () => {
171
- const response = await promiseWorker.postMessage("broadcast");
172
- console.log("Echoed response:", response);
177
+ const response = await promiseWorker.postMessage("broadcast");
178
+ console.log("Echoed response:", response);
173
179
  }, 1000);
174
180
  ```
175
181
 
@@ -199,13 +205,13 @@ import { PWBWorker } from "promise-worker-bi";
199
205
  const promiseWorker = new PWBWorker();
200
206
 
201
207
  promiseWorker.register((message, hostID) => {
202
- if (message === "broadcast") {
203
- promiseWorker.postMessage("to all tabs");
204
- } else {
205
- promiseWorker.postMessage(`hello host ${hostID}`, hostID);
206
- }
208
+ if (message === "broadcast") {
209
+ promiseWorker.postMessage("to all tabs");
210
+ } else {
211
+ promiseWorker.postMessage(`hello host ${hostID}`, hostID);
212
+ }
207
213
 
208
- return message;
214
+ return message;
209
215
  });
210
216
  ```
211
217
 
@@ -244,12 +250,12 @@ If you want to respond to a message by sending a transferable object back, such
244
250
 
245
251
  ```js
246
252
  promiseWorker.register(async (message) => {
247
- const processedMessage = await processMessage(message);
253
+ const processedMessage = await processMessage(message);
248
254
 
249
- return {
250
- message: processedMessage,
251
- _PWB_TRANSFER: [processedMessage.someTransferableProprty],
252
- };
255
+ return {
256
+ message: processedMessage,
257
+ _PWB_TRANSFER: [processedMessage.someTransferableProprty],
258
+ };
253
259
  });
254
260
  ```
255
261
 
package/dist/index.d.ts CHANGED
@@ -1,38 +1,58 @@
1
- type ErrorCallback = (a: Error) => void;
2
- type QueryCallback = (a: any[], b: number | undefined) => any;
1
+ //#region src/fakeError.d.ts
2
+ type FakeError = {
3
+ name: string;
4
+ message: string;
5
+ stack?: string;
6
+ };
7
+ //#endregion
8
+ //#region src/message.d.ts
9
+ declare const MSGTYPE_QUERY = 0;
10
+ declare const MSGTYPE_RESPONSE = 1;
11
+ declare const MSGTYPE_HOST_ID = 2;
12
+ declare const MSGTYPE_HOST_LOCK = 3;
13
+ declare const MSGTYPE_WORKER_ERROR = 4;
14
+ type QueryMessage = [typeof MSGTYPE_QUERY, number, unknown] | [typeof MSGTYPE_QUERY, number, unknown, number | undefined];
15
+ type ResponseMessage = [typeof MSGTYPE_RESPONSE, number, FakeError] | [typeof MSGTYPE_RESPONSE, number, null, unknown];
16
+ type HostIdMessage = [typeof MSGTYPE_HOST_ID, number];
17
+ type HostLockMessage = [typeof MSGTYPE_HOST_LOCK, number, string];
18
+ type WorkerErrorMessage = [typeof MSGTYPE_WORKER_ERROR, FakeError];
19
+ type Message = QueryMessage | ResponseMessage | HostIdMessage | HostLockMessage | WorkerErrorMessage;
20
+ //#endregion
21
+ //#region src/PWBBase.d.ts
22
+ type QueryCallback = (a: unknown, b: number | undefined) => any;
3
23
  declare abstract class PWBBase {
4
- _callbacks: Map<number, (a: Error | null, b: any) => void>;
5
- _queryCallback: QueryCallback;
6
- _workerType: "SharedWorker" | "Worker" | undefined;
7
- constructor();
8
- register(cb: QueryCallback): void;
9
- abstract _postMessage(obj: any[], hostID?: number | undefined, transfer?: Transferable[] | undefined): void;
10
- _postResponse(messageID: number, error: Error | null, result?: any, hostID?: number | undefined): void;
11
- _handleQuery(messageID: number, query: any, hostID: number | undefined): void;
12
- _onMessageCommon(e: MessageEvent): {
13
- message: any;
14
- type: number;
15
- } | void;
24
+ protected _callbacks: Map<number, (a: Error | null, b: unknown) => void>;
25
+ protected _queryCallback: QueryCallback;
26
+ constructor();
27
+ register(cb: QueryCallback): void;
28
+ protected abstract _postMessage(obj: Message, hostID?: number | undefined, transfer?: Transferable[] | undefined): void;
29
+ private _postResponse;
30
+ private _handleQuery;
31
+ protected _onMessageCommon(e: MessageEvent): HostIdMessage | HostLockMessage | WorkerErrorMessage | undefined;
16
32
  }
17
- declare class PWBHost extends PWBBase {
18
- _errorCallback: ErrorCallback | undefined;
19
- _hostID: number | undefined;
20
- _hostIDQueue: (() => void)[] | undefined;
21
- _worker: SharedWorker | Worker;
22
- constructor(worker: SharedWorker | Worker);
23
- registerError(cb: ErrorCallback): void;
24
- _postMessage(obj: any[], _hostID?: unknown, transfer?: Transferable[] | undefined): void;
25
- postMessage(userMessage: any, _hostID?: undefined, transfer?: Transferable[] | undefined): Promise<any>;
26
- _onMessage(e: MessageEvent): void;
33
+ //#endregion
34
+ //#region src/PWBHost.d.ts
35
+ type ErrorCallback = (a: Error) => void;
36
+ export declare class PWBHost extends PWBBase {
37
+ private _errorCallback;
38
+ private _hostID;
39
+ private _hostIDQueue;
40
+ private _worker;
41
+ constructor(worker: SharedWorker | Worker);
42
+ registerError(cb: ErrorCallback): void;
43
+ protected _postMessage(obj: QueryMessage | ResponseMessage | HostLockMessage, _hostID?: unknown, transfer?: Transferable[] | undefined): void;
44
+ postMessage(userMessage: unknown, _hostID?: undefined, transfer?: Transferable[] | undefined): Promise<any>;
45
+ private _onMessage;
27
46
  }
28
- declare class PWBWorker extends PWBBase {
29
- _hosts: Map<number, {
30
- port: MessagePort;
31
- }>;
32
- _maxHostID: number;
33
- constructor();
34
- _postMessage(obj: any[], targetHostID?: number | undefined, transfer?: Transferable[] | undefined): void;
35
- postMessage(userMessage: any, targetHostID?: number | undefined, transfer?: Transferable[] | undefined): Promise<any>;
36
- _onMessage(e: MessageEvent): void;
47
+ //#endregion
48
+ //#region src/PWBWorker.d.ts
49
+ export declare class PWBWorker extends PWBBase {
50
+ private _hosts;
51
+ private _maxHostID;
52
+ private _sharedWorker;
53
+ constructor();
54
+ protected _postMessage(message: QueryMessage | ResponseMessage | HostIdMessage | WorkerErrorMessage, targetHostID?: number | undefined, transfer?: Transferable[] | undefined): void;
55
+ postMessage(userMessage: unknown, targetHostID?: number | undefined, transfer?: Transferable[] | undefined): Promise<unknown>;
56
+ private _onMessage;
37
57
  }
38
- export { PWBHost, PWBWorker };
58
+ //#endregion