promise-worker-bi 6.0.0 → 6.0.2
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 +7 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +35 -21
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -85,7 +85,7 @@ The registered handler can return either a Promise or a normal value:
|
|
|
85
85
|
|
|
86
86
|
```js
|
|
87
87
|
promiseWorker.register(async () => {
|
|
88
|
-
"much async, very promise";
|
|
88
|
+
return "much async, very promise";
|
|
89
89
|
});
|
|
90
90
|
```
|
|
91
91
|
|
|
@@ -126,6 +126,8 @@ promiseWorker.addEventListener("error", (errorError) => {
|
|
|
126
126
|
|
|
127
127
|
That will work if `worker` is a Web Worker or a Shared Worker, but there is one important difference. For a Shared Worker, it will only fire in the first host, to prevent duplicate errors from reaching an error log (assuming you're logging these errors somewhere).
|
|
128
128
|
|
|
129
|
+
This also includes unhandled promise rejections inside the worker, which browsers otherwise only report in the worker's own console.
|
|
130
|
+
|
|
129
131
|
#### Source maps
|
|
130
132
|
|
|
131
133
|
If you use a source map for your worker script, this will not be reflected in the stack traces from promise-worker-bi (either in `promiseWorker.registerError` in response to `promiseWorker.postMessage`). However, you can still use your source map to translate the file/line/column numbers. Clever third-party error reporting services like [Bugsnag](https://www.bugsnag.com/) do this automatically!
|
|
@@ -287,7 +289,7 @@ Create a new instance of `PWBHost`, using the given worker.
|
|
|
287
289
|
|
|
288
290
|
#### `promiseWorker.addEventListener("error", (event: ErrorEvent) => void)`
|
|
289
291
|
|
|
290
|
-
When an error in your web/shared worker process occurs that is _not_ directly in response to a `promiseWorker.postMessage` call, you can see it by listening to the "error" event here.
|
|
292
|
+
When an error in your web/shared worker process occurs that is _not_ directly in response to a `promiseWorker.postMessage` call, you can see it by listening to the "error" event here. This includes both uncaught errors and unhandled promise rejections.
|
|
291
293
|
|
|
292
294
|
`promiseWorker` is EventTarget so you can use `addEventListener`, `removeEventListener`, and all their normal options.
|
|
293
295
|
|
|
@@ -309,7 +311,9 @@ Create a new instance of `PWBWorker`.
|
|
|
309
311
|
|
|
310
312
|
Register a message handler wherever you will be receiving messages: in the worker, in the browser, or both. Your handler consumes a message and returns a promise or value.
|
|
311
313
|
|
|
312
|
-
|
|
314
|
+
If a message arrives and no handler has been registered, the sender's `postMessage` promise rejects with a "No handler registered" error.
|
|
315
|
+
|
|
316
|
+
The `hostID` parameter is only meaningful inside a shared worker, in which case it is a unique number identifying the host that the message came from.
|
|
313
317
|
|
|
314
318
|
The return value of the callback function (shown above as `unknown`) must resolve to something [structured cloneable](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm).
|
|
315
319
|
|
package/dist/index.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ type QueryCallback = (a: unknown, b: number | undefined) => unknown;
|
|
|
18
18
|
type EventMap = Record<string, Event>;
|
|
19
19
|
declare abstract class PWBBase<Events extends EventMap> extends EventTarget {
|
|
20
20
|
protected _callbacks: Map<number, (a: Error | null, b: unknown) => void>;
|
|
21
|
-
protected _queryCallback: QueryCallback;
|
|
21
|
+
protected _queryCallback: QueryCallback | undefined;
|
|
22
22
|
constructor();
|
|
23
23
|
addEventListener<K extends keyof Events>(type: K, listener: ((event: Events[K]) => void) | {
|
|
24
24
|
handleEvent(object: Events[K]): void;
|
|
@@ -45,19 +45,20 @@ export declare class PWBHost extends PWBBase<HostEvents> {
|
|
|
45
45
|
private _worker;
|
|
46
46
|
constructor(worker: SharedWorker | Worker);
|
|
47
47
|
protected _postMessage(obj: QueryMessage | ResponseMessage | HostLockMessage, _hostID?: unknown, transfer?: Transferable[] | undefined): void;
|
|
48
|
-
postMessage(userMessage: unknown, _hostID?: undefined, transfer?: Transferable[] | undefined): Promise<
|
|
48
|
+
postMessage(userMessage: unknown, _hostID?: undefined, transfer?: Transferable[] | undefined): Promise<unknown>;
|
|
49
49
|
private handleWorkerLock;
|
|
50
50
|
private _onMessage;
|
|
51
51
|
}
|
|
52
52
|
//#endregion
|
|
53
53
|
//#region src/PWBWorker.d.ts
|
|
54
|
-
type WorkerEvents = Record<
|
|
54
|
+
type WorkerEvents = Record<never, never>;
|
|
55
55
|
export declare class PWBWorker extends PWBBase<WorkerEvents> {
|
|
56
56
|
private _hosts;
|
|
57
57
|
private _maxHostID;
|
|
58
58
|
private _sharedWorker;
|
|
59
59
|
private _workerLockAcquired;
|
|
60
60
|
constructor();
|
|
61
|
+
private _postWorkerError;
|
|
61
62
|
protected _postMessage(message: QueryMessage | ResponseMessage | HostIdMessage | WorkerLockMessage | WorkerErrorMessage, targetHostID?: number | undefined, transfer?: Transferable[] | undefined): void;
|
|
62
63
|
postMessage(userMessage: unknown, targetHostID?: number | undefined, transfer?: Transferable[] | undefined): Promise<unknown>;
|
|
63
64
|
private _onMessage;
|
package/dist/index.js
CHANGED
|
@@ -51,7 +51,6 @@ var PWBBase = class extends EventTarget {
|
|
|
51
51
|
constructor() {
|
|
52
52
|
super();
|
|
53
53
|
this._callbacks = /* @__PURE__ */ new Map();
|
|
54
|
-
this._queryCallback = () => {};
|
|
55
54
|
this._onMessage = this._onMessage.bind(this);
|
|
56
55
|
}
|
|
57
56
|
addEventListener(type, listener, options) {
|
|
@@ -91,6 +90,10 @@ var PWBBase = class extends EventTarget {
|
|
|
91
90
|
const messageID = message[1];
|
|
92
91
|
const query = message[2];
|
|
93
92
|
const hostID = message[3];
|
|
93
|
+
if (this._queryCallback === void 0) {
|
|
94
|
+
this._postResponse(messageID, /* @__PURE__ */ new Error("No handler registered to receive this message"), void 0, hostID);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
94
97
|
try {
|
|
95
98
|
const result = this._queryCallback(query, hostID);
|
|
96
99
|
if (!isPromise(result)) this._postResponse(messageID, null, result, hostID);
|
|
@@ -100,7 +103,7 @@ var PWBBase = class extends EventTarget {
|
|
|
100
103
|
this._postResponse(messageID, finalError, void 0, hostID);
|
|
101
104
|
});
|
|
102
105
|
} catch (err) {
|
|
103
|
-
this._postResponse(messageID, err);
|
|
106
|
+
this._postResponse(messageID, err, void 0, hostID);
|
|
104
107
|
}
|
|
105
108
|
}
|
|
106
109
|
_onMessageCommon(e) {
|
|
@@ -170,7 +173,7 @@ var PWBHost = class extends PWBBase {
|
|
|
170
173
|
});
|
|
171
174
|
}
|
|
172
175
|
handleWorkerLock(workerLockId) {
|
|
173
|
-
navigator.locks
|
|
176
|
+
navigator.locks?.request(workerLockId, { mode: "shared" }, async () => {
|
|
174
177
|
this.dispatchEvent(new Event("close"));
|
|
175
178
|
});
|
|
176
179
|
}
|
|
@@ -189,7 +192,7 @@ var PWBHost = class extends PWBBase {
|
|
|
189
192
|
}
|
|
190
193
|
if (message[2] !== void 0) this.handleWorkerLock(message[2]);
|
|
191
194
|
const hostLockId = `pwb-host-${Math.random()}`;
|
|
192
|
-
navigator.locks
|
|
195
|
+
navigator.locks?.request(hostLockId, async () => {
|
|
193
196
|
this._postMessage([
|
|
194
197
|
3,
|
|
195
198
|
hostID,
|
|
@@ -206,6 +209,17 @@ var PWBHost = class extends PWBBase {
|
|
|
206
209
|
//#endregion
|
|
207
210
|
//#region src/PWBWorker.ts
|
|
208
211
|
let nextMessageID = 0;
|
|
212
|
+
const toError = (value) => {
|
|
213
|
+
if (Error.isError ? Error.isError(value) : value instanceof Error) return value;
|
|
214
|
+
let message;
|
|
215
|
+
if (typeof value === "string") message = value;
|
|
216
|
+
else try {
|
|
217
|
+
message = JSON.stringify(value) ?? String(value);
|
|
218
|
+
} catch {
|
|
219
|
+
message = String(value);
|
|
220
|
+
}
|
|
221
|
+
return new Error(message);
|
|
222
|
+
};
|
|
209
223
|
var PWBWorker = class extends PWBBase {
|
|
210
224
|
_hosts = /* @__PURE__ */ new Map();
|
|
211
225
|
_maxHostID = -1;
|
|
@@ -214,15 +228,14 @@ var PWBWorker = class extends PWBBase {
|
|
|
214
228
|
constructor() {
|
|
215
229
|
super();
|
|
216
230
|
const workerLockId = `pwb-worker-${Math.random()}`;
|
|
217
|
-
navigator.locks
|
|
231
|
+
navigator.locks?.request(workerLockId, async () => {
|
|
218
232
|
this._workerLockAcquired = true;
|
|
219
233
|
this._postMessage([4, workerLockId]);
|
|
220
234
|
return new Promise(() => {});
|
|
221
235
|
});
|
|
222
236
|
if (typeof SharedWorkerGlobalScope !== "undefined" && self instanceof SharedWorkerGlobalScope) {
|
|
223
237
|
this._sharedWorker = true;
|
|
224
|
-
|
|
225
|
-
_self.addEventListener("connect", (e) => {
|
|
238
|
+
self.addEventListener("connect", (e) => {
|
|
226
239
|
const port = e.ports[0];
|
|
227
240
|
port.addEventListener("message", (e2) => this._onMessage(e2));
|
|
228
241
|
port.start();
|
|
@@ -238,23 +251,24 @@ var PWBWorker = class extends PWBBase {
|
|
|
238
251
|
else message = [2, hostID];
|
|
239
252
|
this._postMessage(message, hostID);
|
|
240
253
|
});
|
|
241
|
-
_self.addEventListener("error", (e) => {
|
|
242
|
-
logError(e.error);
|
|
243
|
-
e.preventDefault();
|
|
244
|
-
const hostID = this._hosts.keys().next().value;
|
|
245
|
-
if (hostID !== void 0) this._postMessage([5, e.error], hostID);
|
|
246
|
-
});
|
|
247
254
|
} else {
|
|
248
255
|
this._sharedWorker = false;
|
|
249
|
-
|
|
250
|
-
_self.addEventListener("message", this._onMessage);
|
|
256
|
+
self.addEventListener("message", this._onMessage);
|
|
251
257
|
this._postMessage([2, 0], 0);
|
|
252
|
-
_self.addEventListener("error", (e) => {
|
|
253
|
-
logError(e.error);
|
|
254
|
-
e.preventDefault();
|
|
255
|
-
this._postMessage([5, e.error]);
|
|
256
|
-
});
|
|
257
258
|
}
|
|
259
|
+
self.addEventListener("error", (e) => {
|
|
260
|
+
logError(e.error);
|
|
261
|
+
e.preventDefault();
|
|
262
|
+
this._postWorkerError(e.error ?? e.message);
|
|
263
|
+
});
|
|
264
|
+
self.addEventListener("unhandledrejection", (e) => {
|
|
265
|
+
this._postWorkerError(e.reason);
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
_postWorkerError(value) {
|
|
269
|
+
const hostID = this._sharedWorker ? this._hosts.keys().next().value : void 0;
|
|
270
|
+
if (this._sharedWorker && hostID === void 0) return;
|
|
271
|
+
this._postMessage([5, toError(value)], hostID);
|
|
258
272
|
}
|
|
259
273
|
_postMessage(message, targetHostID, transfer) {
|
|
260
274
|
if (this._sharedWorker) {
|
|
@@ -290,7 +304,7 @@ var PWBWorker = class extends PWBBase {
|
|
|
290
304
|
_onMessage(e) {
|
|
291
305
|
const message = this._onMessageCommon(e);
|
|
292
306
|
if (!message) return;
|
|
293
|
-
if (message[0] === 3) navigator.locks
|
|
307
|
+
if (message[0] === 3) navigator.locks?.request(message[2], () => {
|
|
294
308
|
if (this._hosts.size > 1) this._hosts.delete(message[1]);
|
|
295
309
|
});
|
|
296
310
|
}
|