promise-worker-bi 6.0.1 → 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 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
- The `hostID` parameter is only defined inside a shared worker, in which case it is a unique number identifying the host that the message came from.
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<any>;
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<string, Event>;
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) {
@@ -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;
@@ -221,8 +235,7 @@ var PWBWorker = class extends PWBBase {
221
235
  });
222
236
  if (typeof SharedWorkerGlobalScope !== "undefined" && self instanceof SharedWorkerGlobalScope) {
223
237
  this._sharedWorker = true;
224
- const _self = self;
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
- const _self = self;
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "promise-worker-bi",
3
- "version": "6.0.1",
3
+ "version": "6.0.2",
4
4
  "description": "Promise-based messaging for Web Workers and Shared Workers",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",