@venizia/ignis-worker 0.2.0-2 → 0.2.0-21

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.
Files changed (103) hide show
  1. package/dist/cjs/envelope/common/index.d.ts +2 -0
  2. package/dist/cjs/envelope/common/index.d.ts.map +1 -0
  3. package/dist/cjs/envelope/common/index.js +18 -0
  4. package/dist/cjs/envelope/common/index.js.map +1 -0
  5. package/dist/cjs/envelope/common/types.d.ts.map +1 -0
  6. package/dist/{esm/envelope → cjs/envelope/common}/types.js.map +1 -1
  7. package/dist/cjs/envelope/encode.d.ts +1 -1
  8. package/dist/cjs/envelope/encode.d.ts.map +1 -1
  9. package/dist/cjs/envelope/index.d.ts +1 -1
  10. package/dist/cjs/envelope/index.d.ts.map +1 -1
  11. package/dist/cjs/envelope/index.js +1 -1
  12. package/dist/cjs/envelope/index.js.map +1 -1
  13. package/dist/cjs/transport/fetch-bridge.d.ts +35 -0
  14. package/dist/cjs/transport/fetch-bridge.d.ts.map +1 -0
  15. package/dist/cjs/transport/fetch-bridge.js +95 -0
  16. package/dist/cjs/transport/fetch-bridge.js.map +1 -0
  17. package/dist/cjs/transport/in-process.d.ts +2 -1
  18. package/dist/cjs/transport/in-process.d.ts.map +1 -1
  19. package/dist/cjs/transport/in-process.js +3 -1
  20. package/dist/cjs/transport/in-process.js.map +1 -1
  21. package/dist/cjs/transport/index.d.ts +2 -0
  22. package/dist/cjs/transport/index.d.ts.map +1 -1
  23. package/dist/cjs/transport/index.js +2 -0
  24. package/dist/cjs/transport/index.js.map +1 -1
  25. package/dist/cjs/transport/shared/common/constants.d.ts +14 -0
  26. package/dist/cjs/transport/shared/common/constants.d.ts.map +1 -0
  27. package/dist/cjs/transport/shared/common/constants.js +19 -0
  28. package/dist/cjs/transport/shared/common/constants.js.map +1 -0
  29. package/dist/cjs/transport/shared/common/index.d.ts +3 -0
  30. package/dist/cjs/transport/shared/common/index.d.ts.map +1 -0
  31. package/dist/cjs/transport/shared/common/index.js +19 -0
  32. package/dist/cjs/transport/shared/common/index.js.map +1 -0
  33. package/dist/cjs/transport/shared/common/types.d.ts +35 -0
  34. package/dist/cjs/transport/shared/common/types.d.ts.map +1 -0
  35. package/dist/cjs/transport/shared/common/types.js +3 -0
  36. package/dist/cjs/transport/shared/common/types.js.map +1 -0
  37. package/dist/cjs/transport/shared/index.d.ts +4 -0
  38. package/dist/cjs/transport/shared/index.d.ts.map +1 -0
  39. package/dist/cjs/transport/shared/index.js +11 -0
  40. package/dist/cjs/transport/shared/index.js.map +1 -0
  41. package/dist/cjs/transport/shared/transport.d.ts +87 -0
  42. package/dist/cjs/transport/shared/transport.d.ts.map +1 -0
  43. package/dist/cjs/transport/shared/transport.js +383 -0
  44. package/dist/cjs/transport/shared/transport.js.map +1 -0
  45. package/dist/cjs/transport/worker.d.ts +16 -2
  46. package/dist/cjs/transport/worker.d.ts.map +1 -1
  47. package/dist/cjs/transport/worker.js +65 -7
  48. package/dist/cjs/transport/worker.js.map +1 -1
  49. package/dist/esm/envelope/common/index.d.ts +2 -0
  50. package/dist/esm/envelope/common/index.d.ts.map +1 -0
  51. package/dist/esm/envelope/common/index.js +2 -0
  52. package/dist/esm/envelope/common/index.js.map +1 -0
  53. package/dist/esm/envelope/common/types.d.ts.map +1 -0
  54. package/dist/{cjs/envelope → esm/envelope/common}/types.js.map +1 -1
  55. package/dist/esm/envelope/encode.d.ts +1 -1
  56. package/dist/esm/envelope/encode.d.ts.map +1 -1
  57. package/dist/esm/envelope/index.d.ts +1 -1
  58. package/dist/esm/envelope/index.d.ts.map +1 -1
  59. package/dist/esm/envelope/index.js +1 -1
  60. package/dist/esm/envelope/index.js.map +1 -1
  61. package/dist/esm/transport/fetch-bridge.d.ts +35 -0
  62. package/dist/esm/transport/fetch-bridge.d.ts.map +1 -0
  63. package/dist/esm/transport/fetch-bridge.js +91 -0
  64. package/dist/esm/transport/fetch-bridge.js.map +1 -0
  65. package/dist/esm/transport/in-process.d.ts +2 -1
  66. package/dist/esm/transport/in-process.d.ts.map +1 -1
  67. package/dist/esm/transport/in-process.js +4 -2
  68. package/dist/esm/transport/in-process.js.map +1 -1
  69. package/dist/esm/transport/index.d.ts +2 -0
  70. package/dist/esm/transport/index.d.ts.map +1 -1
  71. package/dist/esm/transport/index.js +2 -0
  72. package/dist/esm/transport/index.js.map +1 -1
  73. package/dist/esm/transport/shared/common/constants.d.ts +14 -0
  74. package/dist/esm/transport/shared/common/constants.d.ts.map +1 -0
  75. package/dist/esm/transport/shared/common/constants.js +14 -0
  76. package/dist/esm/transport/shared/common/constants.js.map +1 -0
  77. package/dist/esm/transport/shared/common/index.d.ts +3 -0
  78. package/dist/esm/transport/shared/common/index.d.ts.map +1 -0
  79. package/dist/esm/transport/shared/common/index.js +3 -0
  80. package/dist/esm/transport/shared/common/index.js.map +1 -0
  81. package/dist/esm/transport/shared/common/types.d.ts +35 -0
  82. package/dist/esm/transport/shared/common/types.d.ts.map +1 -0
  83. package/dist/esm/transport/shared/common/types.js +2 -0
  84. package/dist/esm/transport/shared/common/types.js.map +1 -0
  85. package/dist/esm/transport/shared/index.d.ts +4 -0
  86. package/dist/esm/transport/shared/index.d.ts.map +1 -0
  87. package/dist/esm/transport/shared/index.js +6 -0
  88. package/dist/esm/transport/shared/index.js.map +1 -0
  89. package/dist/esm/transport/shared/transport.d.ts +87 -0
  90. package/dist/esm/transport/shared/transport.d.ts.map +1 -0
  91. package/dist/esm/transport/shared/transport.js +379 -0
  92. package/dist/esm/transport/shared/transport.js.map +1 -0
  93. package/dist/esm/transport/worker.d.ts +16 -2
  94. package/dist/esm/transport/worker.d.ts.map +1 -1
  95. package/dist/esm/transport/worker.js +65 -7
  96. package/dist/esm/transport/worker.js.map +1 -1
  97. package/package.json +9 -9
  98. package/dist/cjs/envelope/types.d.ts.map +0 -1
  99. package/dist/esm/envelope/types.d.ts.map +0 -1
  100. /package/dist/cjs/envelope/{types.d.ts → common/types.d.ts} +0 -0
  101. /package/dist/cjs/envelope/{types.js → common/types.js} +0 -0
  102. /package/dist/esm/envelope/{types.d.ts → common/types.d.ts} +0 -0
  103. /package/dist/esm/envelope/{types.js → common/types.js} +0 -0
@@ -0,0 +1,379 @@
1
+ import { BaseHelper, getError, RequestIdGenerator } from '@venizia/ignis-helpers/core';
2
+ import { BffEnvelope } from '../../envelope/encode.js';
3
+ import { WorkerBffTransport } from '../worker.js';
4
+ import { BffRoles, ChannelMessageKinds, DEFAULT_CHANNEL_NAME, DEFAULT_TIMEOUT_MS } from './common/index.js';
5
+ /**
6
+ * One BFF for every tab of an origin, instead of one per tab.
7
+ *
8
+ * The problem it solves is not a framework limitation, it is a storage one. PGlite in
9
+ * `opfs-ahp://` mode holds an exclusive access handle on the database file, and OPFS access handles
10
+ * are exclusive PER ORIGIN. Measured in Chromium with two tabs of the same page: the first tab
11
+ * works, and the second never boots its database -
12
+ * `Failed to execute 'createSyncAccessHandle' on 'FileSystemFileHandle': Access Handles cannot be
13
+ * created if there is another open Access Handle or Writable stream associated with the same file`.
14
+ * The first tab is unaffected, and closing it lets the second recover on reload - so the failure is
15
+ * contained and self-healing, but the second tab is simply dead until then.
16
+ *
17
+ * So exactly one tab may own the database. This transport elects that tab with the Web Locks API,
18
+ * gives it the Worker, and forwards every other tab's request to it over a `BroadcastChannel`,
19
+ * carried in the same envelope the Worker itself speaks. When the leader's tab closes, the lock is
20
+ * released by the browser and a follower is promoted automatically - no heartbeat, no timeout, no
21
+ * stale-leader window to reason about.
22
+ *
23
+ * A host with no `navigator.locks` runs single-tab, exactly as before. That is not a compromise:
24
+ * measured on a plain-http origin, `navigator.locks` and `navigator.storage.getDirectory` are BOTH
25
+ * undefined, because both are secure-context only. Wherever OPFS works the lock exists, and where it
26
+ * does not the database could not have started either.
27
+ */
28
+ export class SharedBffTransport extends BaseHelper {
29
+ constructor(opts) {
30
+ super({ scope: opts.scope ?? SharedBffTransport.name });
31
+ this.pendingRequests = new Map();
32
+ this.role = BffRoles.ELECTING;
33
+ this.isClosed = false;
34
+ /** Drops this tab out of the lock QUEUE on close, so a closed transport cannot be promoted. */
35
+ this.leadershipQueueAbort = new AbortController();
36
+ /** Callers parked in `fetch()` while the election is still running. */
37
+ this.roleWaiters = [];
38
+ /**
39
+ * A `BroadcastChannel` never delivers a message to the instance that sent it, so a leader does not
40
+ * hear its own answers and a follower does not hear its own requests. Every tab does hear every
41
+ * OTHER tab, which is why a response is matched by id and silently ignored when it belongs to
42
+ * someone else.
43
+ */
44
+ this.handleChannelMessage = (event) => {
45
+ const message = event.data;
46
+ switch (message?.kind) {
47
+ case ChannelMessageKinds.REQUEST: {
48
+ if (this.role !== BffRoles.LEADER) {
49
+ return;
50
+ }
51
+ // `serveAsLeader` answers its own failures on the channel; this catch is for the one case
52
+ // it cannot - the channel itself refusing the message, e.g. a body that will not clone.
53
+ this.serveAsLeader({ envelope: message.envelope }).catch((error) => {
54
+ this.logger
55
+ .for(this.serveAsLeader.name)
56
+ .error('Could not answer a follower at all | id: %s | error: %s', message.envelope.id, error);
57
+ });
58
+ return;
59
+ }
60
+ // Both decodes are guarded. The channel is origin-wide and its name is the application's, not
61
+ // a secret, and version skew is the realistic trigger: a long-lived tab on v1 and a new tab
62
+ // on v2 share the same channel and lock BY DESIGN. An envelope this build cannot read must
63
+ // fail its caller, never leave the promise unsettled for the full timeout.
64
+ case ChannelMessageKinds.RESPONSE: {
65
+ const pending = this.takePending({ id: message.envelope.id });
66
+ if (!pending) {
67
+ return;
68
+ }
69
+ try {
70
+ pending.resolve(BffEnvelope.decodeResponse({ envelope: message.envelope }));
71
+ }
72
+ catch (error) {
73
+ this.logger
74
+ .for(this.handleChannelMessage.name)
75
+ .error('Undecodable response envelope | id: %s | error: %s', message.envelope.id, error);
76
+ pending.reject(getError({
77
+ message: `[SharedBffTransport] The leader's response could not be decoded | id: ${message.envelope.id}`,
78
+ cause: error,
79
+ }));
80
+ }
81
+ return;
82
+ }
83
+ case ChannelMessageKinds.ERROR: {
84
+ const pending = this.takePending({ id: message.envelope.id });
85
+ if (!pending) {
86
+ return;
87
+ }
88
+ try {
89
+ pending.reject(BffEnvelope.decodeError({ envelope: message.envelope }));
90
+ }
91
+ catch (error) {
92
+ pending.reject(getError({
93
+ message: `[SharedBffTransport] The leader's error envelope could not be decoded | id: ${message.envelope.id}`,
94
+ cause: error,
95
+ }));
96
+ }
97
+ return;
98
+ }
99
+ default: {
100
+ return;
101
+ }
102
+ }
103
+ };
104
+ const channelName = opts.channelName ?? DEFAULT_CHANNEL_NAME;
105
+ this.createWorker = opts.createWorker;
106
+ this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
107
+ this.lockName = `${channelName}.leader`;
108
+ this.requestIdGenerator = new RequestIdGenerator({ scope: SharedBffTransport.name });
109
+ // Attached BEFORE the election starts: a tab that becomes leader a moment later must not miss a
110
+ // request a follower posted while it was still deciding.
111
+ this.channel = new BroadcastChannel(channelName);
112
+ this.channel.addEventListener('message', this.handleChannelMessage);
113
+ // A failed election must not leave `fetch()` parked forever waiting for a role that never
114
+ // arrives: this tab falls back to serving itself, which is the pre-election behaviour.
115
+ this.elect().catch((error) => {
116
+ // `close()` aborts the queued lock request, and the rejection that produces is the expected
117
+ // end of the election - not a failure to report.
118
+ if (this.isClosed) {
119
+ return;
120
+ }
121
+ this.logger
122
+ .for(this.elect.name)
123
+ .error('Leader election failed, falling back to single-tab | error: %s', error);
124
+ if (this.role === BffRoles.ELECTING) {
125
+ this.becomeLeader();
126
+ }
127
+ });
128
+ }
129
+ getRole() {
130
+ return this.role;
131
+ }
132
+ async fetch(opts) {
133
+ if (this.isClosed) {
134
+ throw getError({
135
+ message: '[SharedBffTransport] The transport is closed | open a new one to make requests',
136
+ });
137
+ }
138
+ await this.whenRoleSettled();
139
+ // Re-checked AFTER the await: `close()` can land while the election is still running, and
140
+ // posting then reaches a channel that is already closed - the caller would get a raw
141
+ // `DOMException` instead of this error, and a pending entry plus a live timer would be left
142
+ // behind on a transport nothing can settle.
143
+ if (this.isClosed) {
144
+ throw getError({
145
+ message: '[SharedBffTransport] The transport is closed | open a new one to make requests',
146
+ });
147
+ }
148
+ if (this.leaderStartupError) {
149
+ throw getError({
150
+ message: '[SharedBffTransport] This tab leads but its BFF worker never started | reload the page',
151
+ cause: this.leaderStartupError,
152
+ });
153
+ }
154
+ if (this.role === BffRoles.LEADER && this.leaderTransport) {
155
+ return this.leaderTransport.fetch(opts);
156
+ }
157
+ return this.fetchViaLeader(opts);
158
+ }
159
+ close() {
160
+ this.isClosed = true;
161
+ // A follower is parked in the lock QUEUE rather than holding anything. Without this it stays
162
+ // queued after close, and the browser would eventually hand leadership to a dead transport -
163
+ // which returns straight away, but only after the tab that could have served was skipped.
164
+ this.leadershipQueueAbort.abort();
165
+ // ORDER IS THE POINT, and it is the opposite of the obvious one. The worker has to be GONE
166
+ // before the lock is released: releasing first promotes another tab, which opens the same OPFS
167
+ // database while this worker still holds the exclusive access handle - the exact failure this
168
+ // transport exists to prevent, reintroduced by its own teardown.
169
+ //
170
+ // `terminate()` is abrupt by design. It is no worse than the tab-close path the browser already
171
+ // takes on every leader, and leaving the worker alive is strictly worse than an abrupt stop.
172
+ this.leaderTransport?.close();
173
+ this.leaderTransport = undefined;
174
+ this.leaderWorker?.terminate();
175
+ this.leaderWorker = undefined;
176
+ // Only now: the next tab may open the database.
177
+ this.releaseLeadership?.();
178
+ this.releaseLeadership = undefined;
179
+ this.channel.removeEventListener('message', this.handleChannelMessage);
180
+ this.channel.close();
181
+ this.rejectAllPending({ reason: 'the transport was closed' });
182
+ this.settleRoleWaiters();
183
+ }
184
+ async elect() {
185
+ const locks = globalThis.navigator?.locks;
186
+ if (!locks) {
187
+ this.logger
188
+ .for(this.elect.name)
189
+ .warn('navigator.locks is unavailable - running single-tab | a second tab cannot open the same OPFS database');
190
+ this.becomeLeader();
191
+ return;
192
+ }
193
+ // `ifAvailable` answers NOW instead of queueing, which is what lets this tab find out it is a
194
+ // follower rather than hanging until the current leader goes away.
195
+ const hasWon = await locks.request(this.lockName, { ifAvailable: true }, async (lock) => {
196
+ if (!lock) {
197
+ return false;
198
+ }
199
+ // Symmetric with the queued branch below, and not defensive padding. A real `LockManager`
200
+ // grants from a queued task - it never runs this callback synchronously inside `request()` -
201
+ // so `close()` can land between the constructor and this line. Without the guard a CLOSED
202
+ // transport starts a worker, reports itself leader, and then holds the lock for the lifetime
203
+ // of the page: `close()` has already read and cleared `releaseLeadership`, so the assignment
204
+ // `heldUntilClosed()` makes below can never be resolved by anything. No other tab is ever
205
+ // promoted, and this one answers nobody - its channel listener is already detached.
206
+ //
207
+ // Returning true, not false: this tab DID hold the lock. Returning releases it immediately,
208
+ // which is exactly what a closed transport should do with it.
209
+ if (this.isClosed) {
210
+ return true;
211
+ }
212
+ this.becomeLeader();
213
+ await this.heldUntilClosed();
214
+ return true;
215
+ });
216
+ if (hasWon || this.isClosed) {
217
+ return;
218
+ }
219
+ this.becomeFollower();
220
+ // Queues behind the current leader. The browser releases its lock when that tab goes away - a
221
+ // crash included - so this resolves without anything having to detect the death.
222
+ await locks.request(this.lockName, { signal: this.leadershipQueueAbort.signal }, async () => {
223
+ if (this.isClosed) {
224
+ return;
225
+ }
226
+ this.logger
227
+ .for(this.elect.name)
228
+ .info('Promoted to leader | previous leader released the lock');
229
+ this.becomeLeader();
230
+ await this.heldUntilClosed();
231
+ });
232
+ }
233
+ becomeLeader() {
234
+ // Anything this tab had in flight was addressed to the leader that just went away. It cannot be
235
+ // replayed - a write may well have been applied - so it is failed explicitly rather than left
236
+ // to run out its timeout under a leader that will never answer it.
237
+ this.rejectAllPending({
238
+ reason: 'the leader serving it went away before this tab was promoted',
239
+ });
240
+ try {
241
+ this.leaderWorker = this.createWorker();
242
+ this.leaderTransport = new WorkerBffTransport({
243
+ worker: this.leaderWorker,
244
+ timeoutMs: this.timeoutMs,
245
+ });
246
+ }
247
+ catch (error) {
248
+ // A CSP refusal or a bad worker URL must still SETTLE the role. `whenRoleSettled()` has no
249
+ // timeout of its own and the per-request timer is armed only inside `fetchViaLeader()`, which
250
+ // this tab never reaches - so leaving the role unsettled hangs every caller forever, with no
251
+ // error and no log per request.
252
+ this.leaderStartupError = error;
253
+ this.logger
254
+ .for(this.becomeLeader.name)
255
+ .error('Could not start the BFF worker | error: %s', error);
256
+ }
257
+ this.role = BffRoles.LEADER;
258
+ this.settleRoleWaiters();
259
+ }
260
+ becomeFollower() {
261
+ this.role = BffRoles.FOLLOWER;
262
+ this.settleRoleWaiters();
263
+ }
264
+ heldUntilClosed() {
265
+ return new Promise(resolve => {
266
+ this.releaseLeadership = resolve;
267
+ });
268
+ }
269
+ whenRoleSettled() {
270
+ if (this.role !== BffRoles.ELECTING) {
271
+ return Promise.resolve();
272
+ }
273
+ return new Promise(resolve => {
274
+ this.roleWaiters.push(resolve);
275
+ });
276
+ }
277
+ settleRoleWaiters() {
278
+ const waiters = this.roleWaiters;
279
+ this.roleWaiters = [];
280
+ for (const waiter of waiters) {
281
+ waiter();
282
+ }
283
+ }
284
+ /**
285
+ * The caller's `AbortSignal` is honoured HERE as well as in `WorkerBffTransport`. Without it the
286
+ * same page code behaves differently depending on which tab won the lock: abort works in the
287
+ * leader and silently does nothing in every follower, so a data provider that aborts on unmount
288
+ * leaves promises pending for the full timeout in every tab but one.
289
+ *
290
+ * Aborting settles the CALLER. It does not cancel the leader's work - there is no cancel message,
291
+ * and a write already dispatched cannot be taken back.
292
+ */
293
+ async fetchViaLeader(opts) {
294
+ const { signal } = opts.request;
295
+ if (signal?.aborted) {
296
+ throw this.toAbortError({ signal });
297
+ }
298
+ const id = this.requestIdGenerator.nextId();
299
+ const envelope = await BffEnvelope.encodeRequest({
300
+ request: opts.request,
301
+ id,
302
+ url: BffEnvelope.toSyntheticUrl({ url: opts.request.url }),
303
+ });
304
+ return new Promise((resolve, reject) => {
305
+ const timer = setTimeout(() => {
306
+ this.takePending({ id })?.reject(getError({
307
+ message: `[SharedBffTransport] Timed out waiting for the leader tab | id: ${id} | timeoutMs: ${this.timeoutMs}`,
308
+ }));
309
+ }, this.timeoutMs);
310
+ const handleAbort = () => {
311
+ this.takePending({ id })?.reject(this.toAbortError({ signal }));
312
+ };
313
+ signal?.addEventListener('abort', handleAbort);
314
+ this.pendingRequests.set(id, {
315
+ resolve,
316
+ reject,
317
+ release: () => {
318
+ clearTimeout(timer);
319
+ signal?.removeEventListener('abort', handleAbort);
320
+ },
321
+ });
322
+ // Buffering the body took an await, and `addEventListener('abort')` never fires on a signal
323
+ // that aborted before it was attached - without this re-read that window loses the abort.
324
+ if (signal?.aborted) {
325
+ handleAbort();
326
+ return;
327
+ }
328
+ this.channel.postMessage({
329
+ kind: ChannelMessageKinds.REQUEST,
330
+ envelope,
331
+ });
332
+ });
333
+ }
334
+ /** `signal.reason` first, the way `globalThis.fetch` rejects, so a custom abort reason survives. */
335
+ toAbortError(opts) {
336
+ return (opts.signal?.reason ??
337
+ getError({ message: '[SharedBffTransport] The request was aborted by its caller' }));
338
+ }
339
+ takePending(opts) {
340
+ const pending = this.pendingRequests.get(opts.id);
341
+ if (!pending) {
342
+ return undefined;
343
+ }
344
+ this.pendingRequests.delete(opts.id);
345
+ pending.release();
346
+ return pending;
347
+ }
348
+ rejectAllPending(opts) {
349
+ for (const id of [...this.pendingRequests.keys()]) {
350
+ this.takePending({ id })?.reject(getError({
351
+ message: `[SharedBffTransport] Request abandoned | id: ${id} | reason: ${opts.reason}`,
352
+ }));
353
+ }
354
+ }
355
+ async serveAsLeader(opts) {
356
+ const { envelope } = opts;
357
+ try {
358
+ const response = await this.leaderTransport.fetch({
359
+ request: BffEnvelope.decodeRequest({ envelope }),
360
+ });
361
+ this.channel.postMessage({
362
+ kind: ChannelMessageKinds.RESPONSE,
363
+ envelope: await BffEnvelope.encodeResponse({ response, id: envelope.id }),
364
+ });
365
+ }
366
+ catch (error) {
367
+ // The follower gets the failure as a failure, rather than waiting out a timeout that would
368
+ // tell it nothing about what went wrong.
369
+ this.logger
370
+ .for(this.serveAsLeader.name)
371
+ .error('Failed to serve a follower request | id: %s | error: %s', envelope.id, error);
372
+ this.channel.postMessage({
373
+ kind: ChannelMessageKinds.ERROR,
374
+ envelope: BffEnvelope.encodeError({ id: envelope.id, error }),
375
+ });
376
+ }
377
+ }
378
+ }
379
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/transport/shared/transport.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,10 @@ export declare class WorkerBffTransport extends BaseHelper implements IBffTransp
15
15
  private readonly timeoutMs;
16
16
  private readonly requestIdGenerator;
17
17
  private readonly pendingRequests;
18
+ /** Set by `close()`, so a later `fetch()` is refused instead of reaching a worker nothing listens to. */
19
+ private isClosed;
20
+ /** Outstanding `handleWorkerError` grace timers, cleared by `close()` so none outlives the transport. */
21
+ private readonly graceTimers;
18
22
  constructor(opts: {
19
23
  worker: Worker;
20
24
  timeoutMs?: number;
@@ -23,10 +27,20 @@ export declare class WorkerBffTransport extends BaseHelper implements IBffTransp
23
27
  private readonly takePending;
24
28
  private readonly handleMessage;
25
29
  /**
26
- * A dead or crashed worker never posts anything back, so every in-flight request is lost - this
27
- * is the one event that legitimately settles all of them, instead of leaving each to time out.
30
+ * An `error` event does NOT mean the worker is dead.
31
+ *
32
+ * Measured in Chromium: a synchronous uncaught throw anywhere in the worker - a third-party timer,
33
+ * say - fires this event while the worker keeps serving, and the genuine responses to the
34
+ * in-flight requests arrive a moment later. Rejecting immediately reported a committed POST as
35
+ * failed and then dropped its real 200 on the floor, because nothing was left waiting for it.
36
+ *
37
+ * So the event is logged at once and the requests are given a grace window. Whatever the worker
38
+ * still answers inside it settles normally; whatever is left after it really is lost, and is
39
+ * rejected with the diagnostics rather than left to run out its own timeout.
28
40
  */
29
41
  private readonly handleWorkerError;
42
+ /** `ErrorEvent` carries the useful fields; a plain `Event` does not, so both shapes are handled. */
43
+ private describeErrorEvent;
30
44
  /**
31
45
  * `messageerror` means exactly ONE posted message failed to deserialise, and the event carries
32
46
  * nothing that says which. With a single request in flight that is unambiguous, so it settles
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/transport/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAY,MAAM,6BAA6B,CAAC;AAInE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAiBpD;;;;;;;;;GASG;AACH,qBAAa,kBAAmB,SAAQ,UAAW,YAAW,aAAa;IACzE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAEhC;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsC;gBAE1D,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAWxD,wHAAwH;IACxH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAS1B;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAgC5B;IAEF;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAQhC;IAEF;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAkBjC;IAEI,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IAqD1D,2HAA2H;IAC3H,OAAO,CAAC,YAAY;IAOpB;;;OAGG;IACH,KAAK,IAAI,IAAI;CAad"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/transport/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAY,MAAM,6BAA6B,CAAC;AAInE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAoBpD;;;;;;;;;GASG;AACH,qBAAa,kBAAmB,SAAQ,UAAW,YAAW,aAAa;IACzE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAEhC;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsC;IAEtE,yGAAyG;IACzG,OAAO,CAAC,QAAQ,CAAS;IAEzB,yGAAyG;IACzG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4C;gBAE5D,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAWxD,wHAAwH;IACxH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAS1B;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAgC5B;IAEF;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CA+BhC;IAEF,oGAAoG;IACpG,OAAO,CAAC,kBAAkB;IAe1B;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAkBjC;IAEI,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IA0E1D,2HAA2H;IAC3H,OAAO,CAAC,YAAY;IAOpB;;;OAGG;IACH,KAAK,IAAI,IAAI;CAmBd"}
@@ -2,6 +2,8 @@ import { BaseHelper, getError } from '@venizia/ignis-helpers/core';
2
2
  import { RequestIdGenerator } from '@venizia/ignis-helpers/core';
3
3
  import { BffEnvelope } from '../envelope/encode.js';
4
4
  const DEFAULT_TIMEOUT_MS = 30_000;
5
+ /** How long a still-serving worker gets to answer after it reports an error - see `handleWorkerError`. */
6
+ const WORKER_ERROR_GRACE_MS = 250;
5
7
  const isErrorEnvelope = (data) => {
6
8
  return 'error' in data;
7
9
  };
@@ -22,6 +24,10 @@ export class WorkerBffTransport extends BaseHelper {
22
24
  scope: WorkerBffTransport.name,
23
25
  });
24
26
  this.pendingRequests = new Map();
27
+ /** Set by `close()`, so a later `fetch()` is refused instead of reaching a worker nothing listens to. */
28
+ this.isClosed = false;
29
+ /** Outstanding `handleWorkerError` grace timers, cleared by `close()` so none outlives the transport. */
30
+ this.graceTimers = new Set();
25
31
  /** Removes a pending request from the map and releases its timer and abort listener, so nothing can settle it twice. */
26
32
  this.takePending = (opts) => {
27
33
  const pending = this.pendingRequests.get(opts.id);
@@ -62,15 +68,37 @@ export class WorkerBffTransport extends BaseHelper {
62
68
  }
63
69
  };
64
70
  /**
65
- * A dead or crashed worker never posts anything back, so every in-flight request is lost - this
66
- * is the one event that legitimately settles all of them, instead of leaving each to time out.
71
+ * An `error` event does NOT mean the worker is dead.
72
+ *
73
+ * Measured in Chromium: a synchronous uncaught throw anywhere in the worker - a third-party timer,
74
+ * say - fires this event while the worker keeps serving, and the genuine responses to the
75
+ * in-flight requests arrive a moment later. Rejecting immediately reported a committed POST as
76
+ * failed and then dropped its real 200 on the floor, because nothing was left waiting for it.
77
+ *
78
+ * So the event is logged at once and the requests are given a grace window. Whatever the worker
79
+ * still answers inside it settles normally; whatever is left after it really is lost, and is
80
+ * rejected with the diagnostics rather than left to run out its own timeout.
67
81
  */
68
82
  this.handleWorkerError = (event) => {
69
- for (const id of [...this.pendingRequests.keys()]) {
70
- this.takePending({ id })?.reject(getError({
71
- message: `[WorkerBffTransport] Worker failed while awaiting a response | id: ${id} | event: ${String(event)}`,
72
- }));
73
- }
83
+ // `String(event)` is always `[object ErrorEvent]` - it says nothing. Read the fields a browser
84
+ // actually populates, so the log names the file and line that failed.
85
+ const detail = this.describeErrorEvent(event);
86
+ this.logger
87
+ .for('handleWorkerError')
88
+ .error('Worker reported an error | pending: %s | detail: %s', this.pendingRequests.size, detail);
89
+ const affected = [...this.pendingRequests.keys()];
90
+ // Held so `close()` can clear it. A grace timer that outlives the transport keeps the process
91
+ // (or a test runner) awake and fires against a map nobody is watching any more.
92
+ const timer = setTimeout(() => {
93
+ this.graceTimers.delete(timer);
94
+ for (const id of affected) {
95
+ // `takePending` answers undefined for anything the worker managed to settle in the window.
96
+ this.takePending({ id })?.reject(getError({
97
+ message: `[WorkerBffTransport] Worker failed while awaiting a response | id: ${id} | detail: ${detail}`,
98
+ }));
99
+ }
100
+ }, WORKER_ERROR_GRACE_MS);
101
+ this.graceTimers.add(timer);
74
102
  };
75
103
  /**
76
104
  * `messageerror` means exactly ONE posted message failed to deserialise, and the event carries
@@ -96,9 +124,25 @@ export class WorkerBffTransport extends BaseHelper {
96
124
  this.worker.addEventListener('error', this.handleWorkerError);
97
125
  this.worker.addEventListener('messageerror', this.handleMessageError);
98
126
  }
127
+ /** `ErrorEvent` carries the useful fields; a plain `Event` does not, so both shapes are handled. */
128
+ describeErrorEvent(event) {
129
+ const candidate = event;
130
+ if (!candidate.message) {
131
+ return event.type;
132
+ }
133
+ return `${candidate.message} (${candidate.filename ?? 'unknown'}:${candidate.lineno ?? 0}:${candidate.colno ?? 0})`;
134
+ }
99
135
  async fetch(opts) {
100
136
  const { request } = opts;
101
137
  const { signal } = request;
138
+ // Refused, not queued. `close()` detaches the message listener, so a request posted after it
139
+ // still reached the worker - which EXECUTED it, writes included - while the answer had nowhere
140
+ // to land and the caller waited out the full timeout.
141
+ if (this.isClosed) {
142
+ throw getError({
143
+ message: '[WorkerBffTransport] The transport is closed | open a new one to make requests',
144
+ });
145
+ }
102
146
  if (signal?.aborted) {
103
147
  throw this.toAbortError({ signal });
104
148
  }
@@ -135,6 +179,15 @@ export class WorkerBffTransport extends BaseHelper {
135
179
  handleAbort();
136
180
  return;
137
181
  }
182
+ // `close()` can land during that same await. The entry guard above is then stale, and posting
183
+ // reaches a worker that EXECUTES the request - writes included - while the answer has nowhere
184
+ // to land, because `close()` already detached the listener.
185
+ if (this.isClosed) {
186
+ this.takePending({ id })?.reject(getError({
187
+ message: `[WorkerBffTransport] The transport closed while the request was being encoded | id: ${id}`,
188
+ }));
189
+ return;
190
+ }
138
191
  this.worker.postMessage(requestEnvelope, requestEnvelope.body ? [requestEnvelope.body] : []);
139
192
  });
140
193
  }
@@ -148,6 +201,11 @@ export class WorkerBffTransport extends BaseHelper {
148
201
  * left alone - this transport did not create it, and a page may hand the same one to another.
149
202
  */
150
203
  close() {
204
+ this.isClosed = true;
205
+ for (const timer of this.graceTimers) {
206
+ clearTimeout(timer);
207
+ }
208
+ this.graceTimers.clear();
151
209
  this.worker.removeEventListener('message', this.handleMessage);
152
210
  this.worker.removeEventListener('error', this.handleWorkerError);
153
211
  this.worker.removeEventListener('messageerror', this.handleMessageError);
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/transport/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/transport/worker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@venizia/ignis-worker",
3
- "version": "0.2.0-2",
3
+ "version": "0.2.0-21",
4
4
  "description": "Browser Web Worker host for the IGNIS framework: the request/response envelope, the transport contract, and WorkerApplication - the layer that listens on `onmessage` instead of a socket, so a RestApplication can serve its controllers with no server anywhere.",
5
5
  "keywords": [
6
6
  "browser",
@@ -74,9 +74,9 @@
74
74
  "prepublishOnly": "bun run rebuild"
75
75
  },
76
76
  "dependencies": {
77
- "@venizia/ignis-helpers": "^0.2.0-1",
78
- "@venizia/ignis-inversion": "^0.2.0-0",
79
- "@venizia/ignis-kernel": "^0.2.0-1",
77
+ "@venizia/ignis-helpers": "^0.2.0-14",
78
+ "@venizia/ignis-inversion": "^0.2.0-5",
79
+ "@venizia/ignis-kernel": "^0.2.0-20",
80
80
  "reflect-metadata": "^0.2.2"
81
81
  },
82
82
  "peerDependencies": {
@@ -84,11 +84,11 @@
84
84
  "hono": "^4.12.30"
85
85
  },
86
86
  "devDependencies": {
87
- "@types/bun": "^1.3.14",
88
- "@venizia/dev-configs": "^0.2.0-0",
89
- "eslint": "^10.7.0",
90
- "prettier": "^3.9.5",
91
- "tsc-alias": "^1.9.1",
87
+ "@types/bun": "^1.4.1",
88
+ "@venizia/dev-configs": "^0.2.0-3",
89
+ "eslint": "^10.10.0",
90
+ "prettier": "^3.9.6",
91
+ "tsc-alias": "^1.9.4",
92
92
  "typescript": "^6.0.3"
93
93
  }
94
94
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/envelope/types.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,gBAAgB,CAAC;IAC1B,+EAA+E;IAC/E,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACxD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/envelope/types.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,gBAAgB,CAAC;IAC1B,+EAA+E;IAC/E,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACxD"}
File without changes
File without changes