@spinajs/http-socket-client 0.0.0-stage → 3.0.1

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 (134) hide show
  1. package/README.md +129 -2
  2. package/lib/cjs/browser.d.ts +4 -0
  3. package/lib/cjs/browser.d.ts.map +1 -0
  4. package/lib/cjs/browser.js +21 -0
  5. package/lib/cjs/browser.js.map +1 -0
  6. package/lib/cjs/client.d.ts +94 -0
  7. package/lib/cjs/client.d.ts.map +1 -0
  8. package/lib/cjs/client.js +139 -0
  9. package/lib/cjs/client.js.map +1 -0
  10. package/lib/cjs/commands.d.ts +30 -0
  11. package/lib/cjs/commands.d.ts.map +1 -0
  12. package/lib/cjs/commands.js +132 -0
  13. package/lib/cjs/commands.js.map +1 -0
  14. package/lib/cjs/connection.d.ts +71 -0
  15. package/lib/cjs/connection.d.ts.map +1 -0
  16. package/lib/cjs/connection.js +233 -0
  17. package/lib/cjs/connection.js.map +1 -0
  18. package/lib/cjs/contract.d.ts +27 -0
  19. package/lib/cjs/contract.d.ts.map +1 -0
  20. package/lib/cjs/contract.js +3 -0
  21. package/lib/cjs/contract.js.map +1 -0
  22. package/lib/cjs/durable.d.ts +122 -0
  23. package/lib/cjs/durable.d.ts.map +1 -0
  24. package/lib/cjs/durable.js +396 -0
  25. package/lib/cjs/durable.js.map +1 -0
  26. package/lib/cjs/emitter.d.ts +22 -0
  27. package/lib/cjs/emitter.d.ts.map +1 -0
  28. package/lib/cjs/emitter.js +82 -0
  29. package/lib/cjs/emitter.js.map +1 -0
  30. package/lib/cjs/ids.d.ts +7 -0
  31. package/lib/cjs/ids.d.ts.map +1 -0
  32. package/lib/cjs/ids.js +11 -0
  33. package/lib/cjs/ids.js.map +1 -0
  34. package/lib/cjs/index.d.ts +17 -0
  35. package/lib/cjs/index.d.ts.map +1 -0
  36. package/lib/cjs/index.js +36 -0
  37. package/lib/cjs/index.js.map +1 -0
  38. package/lib/cjs/node/file-outbox.d.ts +40 -0
  39. package/lib/cjs/node/file-outbox.d.ts.map +1 -0
  40. package/lib/cjs/node/file-outbox.js +234 -0
  41. package/lib/cjs/node/file-outbox.js.map +1 -0
  42. package/lib/cjs/node/index.d.ts +4 -0
  43. package/lib/cjs/node/index.d.ts.map +1 -0
  44. package/lib/cjs/node/index.js +21 -0
  45. package/lib/cjs/node/index.js.map +1 -0
  46. package/lib/cjs/outbox-indexeddb.d.ts +38 -0
  47. package/lib/cjs/outbox-indexeddb.d.ts.map +1 -0
  48. package/lib/cjs/outbox-indexeddb.js +212 -0
  49. package/lib/cjs/outbox-indexeddb.js.map +1 -0
  50. package/lib/cjs/outbox.d.ts +53 -0
  51. package/lib/cjs/outbox.d.ts.map +1 -0
  52. package/lib/cjs/outbox.js +41 -0
  53. package/lib/cjs/outbox.js.map +1 -0
  54. package/lib/cjs/package.json +1 -0
  55. package/lib/cjs/reconnect.d.ts +21 -0
  56. package/lib/cjs/reconnect.d.ts.map +1 -0
  57. package/lib/cjs/reconnect.js +37 -0
  58. package/lib/cjs/reconnect.js.map +1 -0
  59. package/lib/cjs/streams.d.ts +91 -0
  60. package/lib/cjs/streams.d.ts.map +1 -0
  61. package/lib/cjs/streams.js +302 -0
  62. package/lib/cjs/streams.js.map +1 -0
  63. package/lib/cjs/timeout.d.ts +4 -0
  64. package/lib/cjs/timeout.d.ts.map +1 -0
  65. package/lib/cjs/timeout.js +13 -0
  66. package/lib/cjs/timeout.js.map +1 -0
  67. package/lib/mjs/browser.d.ts +4 -0
  68. package/lib/mjs/browser.d.ts.map +1 -0
  69. package/lib/mjs/browser.js +3 -0
  70. package/lib/mjs/browser.js.map +1 -0
  71. package/lib/mjs/client.d.ts +94 -0
  72. package/lib/mjs/client.d.ts.map +1 -0
  73. package/lib/mjs/client.js +135 -0
  74. package/lib/mjs/client.js.map +1 -0
  75. package/lib/mjs/commands.d.ts +30 -0
  76. package/lib/mjs/commands.d.ts.map +1 -0
  77. package/lib/mjs/commands.js +128 -0
  78. package/lib/mjs/commands.js.map +1 -0
  79. package/lib/mjs/connection.d.ts +71 -0
  80. package/lib/mjs/connection.d.ts.map +1 -0
  81. package/lib/mjs/connection.js +229 -0
  82. package/lib/mjs/connection.js.map +1 -0
  83. package/lib/mjs/contract.d.ts +27 -0
  84. package/lib/mjs/contract.d.ts.map +1 -0
  85. package/lib/mjs/contract.js +2 -0
  86. package/lib/mjs/contract.js.map +1 -0
  87. package/lib/mjs/durable.d.ts +122 -0
  88. package/lib/mjs/durable.d.ts.map +1 -0
  89. package/lib/mjs/durable.js +392 -0
  90. package/lib/mjs/durable.js.map +1 -0
  91. package/lib/mjs/emitter.d.ts +22 -0
  92. package/lib/mjs/emitter.d.ts.map +1 -0
  93. package/lib/mjs/emitter.js +77 -0
  94. package/lib/mjs/emitter.js.map +1 -0
  95. package/lib/mjs/ids.d.ts +7 -0
  96. package/lib/mjs/ids.d.ts.map +1 -0
  97. package/lib/mjs/ids.js +8 -0
  98. package/lib/mjs/ids.js.map +1 -0
  99. package/lib/mjs/index.d.ts +17 -0
  100. package/lib/mjs/index.d.ts.map +1 -0
  101. package/lib/mjs/index.js +9 -0
  102. package/lib/mjs/index.js.map +1 -0
  103. package/lib/mjs/node/file-outbox.d.ts +40 -0
  104. package/lib/mjs/node/file-outbox.d.ts.map +1 -0
  105. package/lib/mjs/node/file-outbox.js +230 -0
  106. package/lib/mjs/node/file-outbox.js.map +1 -0
  107. package/lib/mjs/node/index.d.ts +4 -0
  108. package/lib/mjs/node/index.d.ts.map +1 -0
  109. package/lib/mjs/node/index.js +3 -0
  110. package/lib/mjs/node/index.js.map +1 -0
  111. package/lib/mjs/outbox-indexeddb.d.ts +38 -0
  112. package/lib/mjs/outbox-indexeddb.d.ts.map +1 -0
  113. package/lib/mjs/outbox-indexeddb.js +208 -0
  114. package/lib/mjs/outbox-indexeddb.js.map +1 -0
  115. package/lib/mjs/outbox.d.ts +53 -0
  116. package/lib/mjs/outbox.d.ts.map +1 -0
  117. package/lib/mjs/outbox.js +37 -0
  118. package/lib/mjs/outbox.js.map +1 -0
  119. package/lib/mjs/package.json +1 -0
  120. package/lib/mjs/reconnect.d.ts +21 -0
  121. package/lib/mjs/reconnect.d.ts.map +1 -0
  122. package/lib/mjs/reconnect.js +33 -0
  123. package/lib/mjs/reconnect.js.map +1 -0
  124. package/lib/mjs/streams.d.ts +91 -0
  125. package/lib/mjs/streams.d.ts.map +1 -0
  126. package/lib/mjs/streams.js +297 -0
  127. package/lib/mjs/streams.js.map +1 -0
  128. package/lib/mjs/timeout.d.ts +4 -0
  129. package/lib/mjs/timeout.d.ts.map +1 -0
  130. package/lib/mjs/timeout.js +9 -0
  131. package/lib/mjs/timeout.js.map +1 -0
  132. package/lib/tsconfig.cjs.tsbuildinfo +1 -0
  133. package/lib/tsconfig.mjs.tsbuildinfo +1 -0
  134. package/package.json +67 -4
@@ -0,0 +1,392 @@
1
+ import { MAX_ID_LENGTH, MAX_KEY_LENGTH, SocketException, WIRE_EVENTS, isId, isKey, isSocketError } from '@spinajs/http-socket-common';
2
+ import { Emitter, rethrowAsync } from './emitter.js';
3
+ import { randomId } from './ids.js';
4
+ import { ReconnectPolicy } from './reconnect.js';
5
+ import { assertTimeoutMs } from './timeout.js';
6
+ export const DEFAULT_DURABLE = Object.freeze({ window: 16, ackTimeoutMs: 60_000, maxPayloadBytes: 1024 * 1024 });
7
+ const CLOSED = { code: 'unavailable', message: 'the client is closed; the command stays in the outbox', retryable: false };
8
+ const STREAM_REPLY = { code: 'failed_precondition', message: 'a durable command cannot reply with a stream', retryable: false };
9
+ const MALFORMED_REPLY = { code: 'internal', message: 'malformed reply', retryable: false };
10
+ const UNENCODABLE = { code: 'invalid_argument', message: 'the payload cannot be serialized', retryable: false };
11
+ /** A fenced command whose predecessor already answered waits this long; the server may still be finishing it. */
12
+ const FENCE_FLOOR_MS = 50;
13
+ /**
14
+ * Durable commands ( spec §6 ): persisted before they are sent, sent in order up to a window, sent
15
+ * again after any drop, and settled in send order. The server runs each key once and runs a command
16
+ * only after the one named in its `after`, so a resend never runs twice and never overtakes.
17
+ */
18
+ export class DurableQueue {
19
+ constructor(options) {
20
+ this.options = options;
21
+ this.items = [];
22
+ this.adding = Promise.resolve();
23
+ this.attempt = 0;
24
+ this.pausedUntil = 0;
25
+ // after a retryable refusal only the head goes out: its successors would only be fenced
26
+ this.probing = false;
27
+ // the credentials ran out: nothing goes out before the next connection, which a re-login opens
28
+ this.heldUntilOnline = false;
29
+ this.closed = false;
30
+ const { window, ackTimeoutMs, maxPayloadBytes } = { ...DEFAULT_DURABLE, ...options.durable };
31
+ if (!(Number.isInteger(window) && window >= 1)) {
32
+ throw new RangeError(`durable.window must be an integer of at least 1, got ${window}`);
33
+ }
34
+ if (!(Number.isInteger(maxPayloadBytes) && maxPayloadBytes >= 1)) {
35
+ throw new RangeError(`durable.maxPayloadBytes must be an integer of at least 1, got ${maxPayloadBytes}`);
36
+ }
37
+ // `${clientId}:${nonce}` must stay a key the server accepts
38
+ if (!isId(options.clientId)) {
39
+ throw new RangeError(`clientId must be 1-${MAX_ID_LENGTH} printable ASCII characters`);
40
+ }
41
+ this.keyPrefix = `${options.clientId}:`;
42
+ this.window = window;
43
+ this.maxPayloadBytes = maxPayloadBytes;
44
+ this.ackTimeoutMs = assertTimeoutMs('durable.ackTimeoutMs', ackTimeoutMs);
45
+ this.policy = new ReconnectPolicy(options.reconnect);
46
+ const onListenerError = options.onListenerError ?? rethrowAsync;
47
+ this.onStoreError = (error) => {
48
+ try {
49
+ onListenerError(error);
50
+ }
51
+ catch {
52
+ // a throwing handler must not stop the queue from settling, nor leave a rejection unhandled
53
+ }
54
+ };
55
+ this.events = new Emitter(options.onListenerError);
56
+ this.unsubscribe = options.connection.events.on('state', (state, previous) => this.onState(state, previous));
57
+ this.load().catch(this.onStoreError);
58
+ }
59
+ /** Commands not yet settled to their callers, resumed ones included. */
60
+ get size() {
61
+ return this.items.length;
62
+ }
63
+ /**
64
+ * Persists the command, then sends it in order. Resolves with its result once it and every earlier
65
+ * command have settled. Rejects when the server refuses it for good ( it is then in the store's
66
+ * failed list ) or when the queue closes ( it stays in the outbox ). A caller that does not await
67
+ * it attaches a catch, or follows the `acked` and `failed` events instead.
68
+ */
69
+ submit(name, payload, options = {}) {
70
+ if (this.closed) {
71
+ return Promise.reject(SocketException.fromWire(CLOSED));
72
+ }
73
+ if (options.key !== undefined && (!isKey(options.key) || options.key.startsWith(this.keyPrefix))) {
74
+ return Promise.reject(new RangeError(`a durable command key must be 1-${MAX_KEY_LENGTH} printable ASCII characters and must not start with '${this.keyPrefix}'`));
75
+ }
76
+ let size;
77
+ try {
78
+ size = payloadSize(payload);
79
+ }
80
+ catch {
81
+ return Promise.reject(SocketException.fromWire(UNENCODABLE));
82
+ }
83
+ if (size > this.maxPayloadBytes) {
84
+ return Promise.reject(SocketException.fromWire({ code: 'invalid_argument', message: `payload of ${size} bytes exceeds the limit of ${this.maxPayloadBytes} bytes`, retryable: false, details: { size, limit: this.maxPayloadBytes } }));
85
+ }
86
+ let resolve;
87
+ let reject;
88
+ const settled = new Promise((res, rej) => {
89
+ resolve = res;
90
+ reject = rej;
91
+ });
92
+ // one add at a time, and the item joins the queue inside that turn: items stay in seq order
93
+ const queued = this.adding.then(async () => {
94
+ await this.load();
95
+ // not the seq: a store that starts over ( wiped, or in memory ) reuses seqs, and the server would
96
+ // replay an old command's stored reply to a new one
97
+ const entry = await this.options.store.add({ name, payload, key: options.key ?? `${this.keyPrefix}${randomId()}` });
98
+ // persisted already: it resumes on the next start
99
+ if (this.closed) {
100
+ throw SocketException.fromWire(CLOSED);
101
+ }
102
+ const item = this.item(entry);
103
+ item.resolve = resolve;
104
+ item.reject = reject;
105
+ this.items.push(item);
106
+ this.pump();
107
+ });
108
+ queued.catch(reject);
109
+ this.adding = queued.catch(() => undefined);
110
+ return settled;
111
+ }
112
+ /**
113
+ * Rejects the callers still waiting for an answer; their entries stay in the store for the next start.
114
+ * Answered commands settle in send order once the store has applied their outcome, also after close.
115
+ * Resolves once the store has no write of this queue in flight and every answered command has been
116
+ * reported: only then may the next queue open the same store, and the listeners be dropped.
117
+ */
118
+ close() {
119
+ if (this.closing) {
120
+ return this.closing;
121
+ }
122
+ this.closed = true;
123
+ this.unsubscribe();
124
+ clearTimeout(this.pauseTimer);
125
+ const unanswered = [];
126
+ for (const item of this.items) {
127
+ clearTimeout(item.timer);
128
+ // a late reply must not touch the store: the entry is left for the next start, which replays it
129
+ item.outstanding.clear();
130
+ if (!item.outcome) {
131
+ unanswered.push(item);
132
+ }
133
+ }
134
+ // An answered command's store write may land after close: rejecting it as left in the outbox would
135
+ // lose its outcome, as the next start would not find the entry. settle() reports it once the write is done.
136
+ this.items.splice(0, this.items.length, ...this.items.filter((item) => item.outcome));
137
+ const reported = new Promise((resolve) => (this.onReported = resolve));
138
+ // an add begun before close still writes its entry, for the next start
139
+ this.closing = Promise.all([reported, this.adding]).then(() => undefined);
140
+ for (const item of unanswered) {
141
+ item.reject?.(SocketException.fromWire(CLOSED));
142
+ }
143
+ this.settle();
144
+ return this.closing;
145
+ }
146
+ /** Reads the store once; a failed read is tried again by the next submit() or the next time the connection comes online. */
147
+ load() {
148
+ if (this.loading === undefined) {
149
+ this.loading = this.options.store.pending().then((entries) => {
150
+ if (!this.closed) {
151
+ this.items.push(...entries.map((entry) => this.item(entry)));
152
+ this.pump();
153
+ }
154
+ }, (error) => {
155
+ this.loading = undefined;
156
+ throw error;
157
+ });
158
+ }
159
+ return this.loading;
160
+ }
161
+ item(entry) {
162
+ // only an entry another writer added has no key; createdAt keeps it apart from a reused seq
163
+ return { entry, key: entry.key ?? `${this.keyPrefix}${entry.seq}.${entry.createdAt}`, state: 'queued', probe: false, parkedOn: undefined, notBefore: 0, outstanding: new Set(), timer: undefined, stored: false };
164
+ }
165
+ onState(state, previous) {
166
+ if (state === 'closed') {
167
+ void this.close();
168
+ return;
169
+ }
170
+ // their replies can no longer arrive; the server joins or replays the resend
171
+ if (previous === 'online') {
172
+ for (const item of this.items) {
173
+ if (item.state !== 'done') {
174
+ item.outstanding.clear();
175
+ // the new connection resends in order, so the fences start over
176
+ item.parkedOn = undefined;
177
+ item.notBefore = 0;
178
+ this.requeue(item);
179
+ }
180
+ }
181
+ }
182
+ if (state === 'online') {
183
+ this.heldUntilOnline = false;
184
+ if (this.loading === undefined) {
185
+ this.load().catch(this.onStoreError);
186
+ }
187
+ this.pump();
188
+ }
189
+ }
190
+ pump() {
191
+ if (this.closed || this.heldUntilOnline || !this.options.connection.connected || Date.now() < this.pausedUntil) {
192
+ return;
193
+ }
194
+ const window = this.probing ? 1 : this.window;
195
+ let unanswered = this.items.filter((item) => item.state === 'sent').length;
196
+ let previous;
197
+ for (const item of this.items) {
198
+ if (item.state === 'done') {
199
+ continue;
200
+ }
201
+ if (item.state === 'queued') {
202
+ if (unanswered >= window || item.parkedOn !== undefined || Date.now() < item.notBefore || !this.transmit(item, previous)) {
203
+ return;
204
+ }
205
+ unanswered++;
206
+ }
207
+ previous = item;
208
+ }
209
+ }
210
+ transmit(item, previous) {
211
+ const request = { id: this.options.commands.nextId(), name: item.entry.name, payload: item.entry.payload, idempotencyKey: item.key };
212
+ // the server runs it only once its predecessor completed, so neither a resend nor a refusal lets it overtake
213
+ if (previous) {
214
+ request.after = previous.key;
215
+ }
216
+ clearTimeout(item.timer);
217
+ item.state = 'sent';
218
+ item.probe = this.probing;
219
+ item.outstanding.add(request.id);
220
+ item.timer = setTimeout(() => this.onAckTimeout(item, request.id), this.ackTimeoutMs);
221
+ if (this.options.connection.request(WIRE_EVENTS.command, request, (reply) => this.onReply(item, request.id, reply))) {
222
+ return true;
223
+ }
224
+ item.outstanding.delete(request.id);
225
+ this.requeue(item);
226
+ return false;
227
+ }
228
+ onReply(item, id, reply) {
229
+ // the connection dropped first, the queue closed, or another request for it was answered
230
+ if (!item.outstanding.has(id)) {
231
+ return;
232
+ }
233
+ const error = replyError(reply);
234
+ if (error === undefined) {
235
+ return this.succeed(item, reply.result);
236
+ }
237
+ if (!error.retryable && error.code !== 'unauthenticated') {
238
+ return this.fail(item, error);
239
+ }
240
+ item.outstanding.delete(id);
241
+ // a later request for it is still out and answers for it
242
+ if (item.outstanding.size > 0) {
243
+ return;
244
+ }
245
+ // the credentials ran out, not the command
246
+ if (error.code === 'unauthenticated') {
247
+ this.requeue(item);
248
+ const alreadyHeld = this.heldUntilOnline;
249
+ this.heldUntilOnline = true;
250
+ if (!alreadyHeld)
251
+ this.events.emit('held', { entry: item.entry, error });
252
+ return;
253
+ }
254
+ this.retry(item, error);
255
+ }
256
+ onAckTimeout(item, id) {
257
+ if (item.state !== 'sent' || !item.outstanding.has(id)) {
258
+ return;
259
+ }
260
+ // the request stays outstanding: whichever reply comes first counts
261
+ this.requeue(item);
262
+ this.pump();
263
+ }
264
+ requeue(item) {
265
+ clearTimeout(item.timer);
266
+ item.timer = undefined;
267
+ item.state = 'queued';
268
+ }
269
+ /** One backoff for the whole queue: its commands are refused for shared reasons ( overload, shutdown ). */
270
+ retry(item, error) {
271
+ this.requeue(item);
272
+ // fenced: its predecessor had not completed, and may have lost its queue place while it still runs
273
+ const after = fencedBehind(error);
274
+ if (after !== undefined) {
275
+ const predecessor = this.items.find((other) => other.key === after && other.state !== 'done');
276
+ if (predecessor) {
277
+ item.parkedOn = predecessor;
278
+ // its answer freed a window slot
279
+ this.pump();
280
+ return;
281
+ }
282
+ // no backoff step: nothing is overloaded
283
+ item.notBefore = Date.now() + FENCE_FLOOR_MS;
284
+ item.timer = setTimeout(() => {
285
+ item.timer = undefined;
286
+ this.pump();
287
+ }, FENCE_FLOOR_MS);
288
+ return;
289
+ }
290
+ this.probing = true;
291
+ const now = Date.now();
292
+ if (now < this.pausedUntil) {
293
+ return;
294
+ }
295
+ clearTimeout(this.pauseTimer);
296
+ this.pausedUntil = now + this.policy.delay(this.attempt++, error.retryAfterMs);
297
+ this.pauseTimer = setTimeout(() => {
298
+ this.pauseTimer = undefined;
299
+ this.pausedUntil = 0;
300
+ this.pump();
301
+ }, this.pausedUntil - now);
302
+ }
303
+ succeed(item, result) {
304
+ this.finish(item, { ok: true, result });
305
+ if (!this.probing) {
306
+ this.attempt = 0;
307
+ }
308
+ this.record(item, () => this.options.store.remove(item.entry.seq));
309
+ }
310
+ fail(item, error) {
311
+ const failed = { ...item.entry, error, failedAt: Date.now() };
312
+ this.finish(item, { ok: false, failed });
313
+ this.record(item, () => this.options.store.fail(failed));
314
+ }
315
+ finish(item, outcome) {
316
+ clearTimeout(item.timer);
317
+ item.timer = undefined;
318
+ item.outstanding.clear();
319
+ // the probed head has its final answer: the window opens again
320
+ if (item.probe) {
321
+ this.probing = false;
322
+ }
323
+ item.state = 'done';
324
+ item.outcome = outcome;
325
+ for (const other of this.items) {
326
+ if (other.parkedOn === item) {
327
+ other.parkedOn = undefined;
328
+ }
329
+ }
330
+ }
331
+ /** The caller hears of an outcome only once the store holds it, so a reload cannot undo what it was told. */
332
+ record(item, write) {
333
+ Promise.resolve()
334
+ .then(write)
335
+ .catch(this.onStoreError)
336
+ .then(() => {
337
+ item.stored = true;
338
+ this.settle();
339
+ });
340
+ this.pump();
341
+ }
342
+ /** Callers and listeners hear about commands in send order, whatever order their replies came in. */
343
+ settle() {
344
+ while (this.items[0]?.state === 'done' && this.items[0].stored) {
345
+ const item = this.items.shift();
346
+ this.report(item, item.outcome);
347
+ }
348
+ if (this.closed && this.items.length === 0) {
349
+ this.onReported?.();
350
+ }
351
+ }
352
+ report(item, outcome) {
353
+ if (outcome.ok) {
354
+ item.resolve?.(outcome.result);
355
+ this.events.emit('acked', { entry: item.entry, result: outcome.result });
356
+ }
357
+ else {
358
+ item.reject?.(SocketException.fromWire(outcome.failed.error));
359
+ this.events.emit('failed', { entry: outcome.failed, error: outcome.failed.error });
360
+ }
361
+ }
362
+ }
363
+ /** undefined for a result */
364
+ function replyError(reply) {
365
+ if (typeof reply !== 'object' || reply === null || typeof reply.ok !== 'boolean') {
366
+ return MALFORMED_REPLY;
367
+ }
368
+ if (!reply.ok) {
369
+ return isSocketError(reply.error) ? reply.error : MALFORMED_REPLY;
370
+ }
371
+ return 'stream' in reply ? STREAM_REPLY : undefined;
372
+ }
373
+ /** The predecessor's key of a fence refusal; undefined for any other refusal. */
374
+ function fencedBehind(error) {
375
+ const details = error.details;
376
+ return typeof details === 'object' && details !== null && typeof details.after === 'string' ? details.after : undefined;
377
+ }
378
+ /** What the server's size limit measures: the JSON text in UTF-8, binary parts by their length. */
379
+ function payloadSize(payload) {
380
+ let binary = 0;
381
+ const json = JSON.stringify(payload, function (key, value) {
382
+ // `value` has been through toJSON already; binary parts are detected on the raw holder value
383
+ const raw = this[key];
384
+ if (raw instanceof ArrayBuffer || ArrayBuffer.isView(raw)) {
385
+ binary += raw.byteLength;
386
+ return null;
387
+ }
388
+ return value;
389
+ });
390
+ return binary + (json === undefined ? 0 : new TextEncoder().encode(json).length);
391
+ }
392
+ //# sourceMappingURL=durable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable.js","sourceRoot":"","sources":["../../src/durable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ type Args<F> = F extends (...args: infer A) => void ? A : never;
2
+ export type ListenerMap<E> = {
3
+ [K in keyof E]: (...args: any[]) => void;
4
+ };
5
+ /** A minimal typed emitter; `node:events` is not available in browsers. */
6
+ export declare class Emitter<E extends ListenerMap<E>> {
7
+ private readonly onListenerError;
8
+ private readonly listeners;
9
+ constructor(onListenerError?: (error: unknown) => void);
10
+ on<K extends keyof E>(event: K, listener: E[K]): () => void;
11
+ once<K extends keyof E>(event: K, listener: E[K]): () => void;
12
+ off<K extends keyof E>(event: K, listener: E[K]): void;
13
+ emit<K extends keyof E>(event: K, ...args: Args<E[K]>): void;
14
+ listenerCount(event: keyof E): number;
15
+ clear(): void;
16
+ private add;
17
+ private remove;
18
+ }
19
+ /** Surfaces a listener error as an uncaught error without breaking the code path that emitted. */
20
+ export declare function rethrowAsync(error: unknown): void;
21
+ export {};
22
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/emitter.ts"],"names":[],"mappings":"AAEA,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC;AAEhE,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI;CAAE,CAAC;AAE1E,2EAA2E;AAC3E,qBAAa,OAAO,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC;IAG/B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAF5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IAEjE,YAA6B,eAAe,GAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAmB,EAAI;IAElF,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAEjE;IAEM,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAOnE;IAEM,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAO5D;IAEM,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAclE;IAEM,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,MAAM,CAE3C;IAEM,KAAK,IAAI,IAAI,CAEnB;IAED,OAAO,CAAC,GAAG;IAUX,OAAO,CAAC,MAAM;CAMf;AAED,kGAAkG;AAClG,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAIjD"}
@@ -0,0 +1,77 @@
1
+ /** A minimal typed emitter; `node:events` is not available in browsers. */
2
+ export class Emitter {
3
+ constructor(onListenerError = rethrowAsync) {
4
+ this.onListenerError = onListenerError;
5
+ this.listeners = new Map();
6
+ }
7
+ on(event, listener) {
8
+ return this.add(event, listener);
9
+ }
10
+ once(event, listener) {
11
+ const wrapper = (...args) => {
12
+ this.remove(event, wrapper);
13
+ listener(...args);
14
+ };
15
+ wrapper.original = listener;
16
+ return this.add(event, wrapper);
17
+ }
18
+ off(event, listener) {
19
+ const set = this.listeners.get(event);
20
+ if (!set)
21
+ return;
22
+ for (const registered of set) {
23
+ if (registered === listener || registered.original === listener)
24
+ set.delete(registered);
25
+ }
26
+ if (set.size === 0)
27
+ this.listeners.delete(event);
28
+ }
29
+ emit(event, ...args) {
30
+ const set = this.listeners.get(event);
31
+ if (!set)
32
+ return;
33
+ for (const listener of [...set]) {
34
+ try {
35
+ listener(...args);
36
+ }
37
+ catch (error) {
38
+ try {
39
+ this.onListenerError(error);
40
+ }
41
+ catch {
42
+ // a faulty error handler must not stop the remaining listeners or the emitting code path
43
+ }
44
+ }
45
+ }
46
+ }
47
+ listenerCount(event) {
48
+ return this.listeners.get(event)?.size ?? 0;
49
+ }
50
+ clear() {
51
+ this.listeners.clear();
52
+ }
53
+ add(event, listener) {
54
+ let set = this.listeners.get(event);
55
+ if (!set) {
56
+ set = new Set();
57
+ this.listeners.set(event, set);
58
+ }
59
+ set.add(listener);
60
+ return () => this.remove(event, listener);
61
+ }
62
+ remove(event, listener) {
63
+ const set = this.listeners.get(event);
64
+ if (!set)
65
+ return;
66
+ set.delete(listener);
67
+ if (set.size === 0)
68
+ this.listeners.delete(event);
69
+ }
70
+ }
71
+ /** Surfaces a listener error as an uncaught error without breaking the code path that emitted. */
72
+ export function rethrowAsync(error) {
73
+ setTimeout(() => {
74
+ throw error;
75
+ }, 0);
76
+ }
77
+ //# sourceMappingURL=emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface UuidSource {
2
+ randomUUID?: () => string;
3
+ }
4
+ /** crypto.randomUUID is missing in insecure (plain http) browser contexts, hence the fallback. */
5
+ export declare function randomId(source?: UuidSource | undefined): string;
6
+ export {};
7
+ //# sourceMappingURL=ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../src/ids.ts"],"names":[],"mappings":"AAAA,UAAU,UAAU;IAClB,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;CAC3B;AAED,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,MAAM,GAAE,UAAU,GAAG,SAA0D,GAAG,MAAM,CAIhH"}
package/lib/mjs/ids.js ADDED
@@ -0,0 +1,8 @@
1
+ /** crypto.randomUUID is missing in insecure (plain http) browser contexts, hence the fallback. */
2
+ export function randomId(source = globalThis.crypto) {
3
+ if (source?.randomUUID)
4
+ return source.randomUUID();
5
+ const part = () => Math.random().toString(36).slice(2, 10);
6
+ return `${Date.now().toString(36)}-${part()}-${part()}-${part()}`;
7
+ }
8
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.js","sourceRoot":"","sources":["../../src/ids.ts"],"names":[],"mappings":"AAIA,kGAAkG;AAClG,MAAM,UAAU,QAAQ,CAAC,MAAM,GAA4B,UAAsC,CAAC,MAAM;IACtG,IAAI,MAAM,EAAE,UAAU;QAAE,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IACnD,MAAM,IAAI,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnE,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;AACpE,CAAC"}
@@ -0,0 +1,17 @@
1
+ export * from '@spinajs/http-socket-common';
2
+ export { SocketClient, LIFECYCLE_EVENTS } from './client.js';
3
+ export type { ClientLifecycleEvents, LifecycleEventName, ServerEventListener, SocketClientOptions, Unsubscribe } from './client.js';
4
+ export { DEFAULT_TIMEOUT_MS } from './commands.js';
5
+ export type { CommandOptions, WhenOffline } from './commands.js';
6
+ export { DEFAULT_CONNECT_TIMEOUT_MS } from './connection.js';
7
+ export type { AuthPayload, AuthProvider, ConnectionState, IoOptions } from './connection.js';
8
+ export type { StreamItem, TypedSocketClient } from './contract.js';
9
+ export { DEFAULT_DURABLE } from './durable.js';
10
+ export type { AckedCommand, DurableCommandOptions, DurableOptions, FailedCommand, HeldCommand } from './durable.js';
11
+ export { MemoryOutboxStore } from './outbox.js';
12
+ export type { FailedOutboxEntry, OutboxEntry, OutboxInput, OutboxStore } from './outbox.js';
13
+ export { DEFAULT_STREAM_CREDITS } from './streams.js';
14
+ export type { StreamOptions } from './streams.js';
15
+ export { DEFAULT_RECONNECT, MAX_SERVER_HINT_MS, ReconnectPolicy } from './reconnect.js';
16
+ export type { ReconnectOptions } from './reconnect.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC7D,YAAY,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACpI,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC7F,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACpH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxF,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export * from '@spinajs/http-socket-common';
2
+ export { SocketClient, LIFECYCLE_EVENTS } from './client.js';
3
+ export { DEFAULT_TIMEOUT_MS } from './commands.js';
4
+ export { DEFAULT_CONNECT_TIMEOUT_MS } from './connection.js';
5
+ export { DEFAULT_DURABLE } from './durable.js';
6
+ export { MemoryOutboxStore } from './outbox.js';
7
+ export { DEFAULT_STREAM_CREDITS } from './streams.js';
8
+ export { DEFAULT_RECONNECT, MAX_SERVER_HINT_MS, ReconnectPolicy } from './reconnect.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { FailedOutboxEntry, OutboxEntry, OutboxInput, OutboxStore } from '../outbox.js';
2
+ export interface FileOutboxOptions {
3
+ /** Test seam: the rename that publishes the temp file. */
4
+ rename?: (from: string, to: string) => Promise<void>;
5
+ /** Base of the backoff between rename retries (grows linearly, capped at 5x). Default 10. */
6
+ retryDelayMs?: number;
7
+ }
8
+ /**
9
+ * The outbox of a Node service, in one JSON file. Every write goes through a temp file, fsync and rename,
10
+ * so a crash leaves the old queue or the new one, never a torn one. Changes that queue up while a write
11
+ * is in flight are committed together by the next one. Payloads must survive a JSON round trip unchanged:
12
+ * `add` refuses binary, Dates, Maps, class instances and non-finite numbers. One process at a time per file.
13
+ *
14
+ * The whole queue is rewritten on every commit, so the cost of a write grows with the queue size: meant
15
+ * for queues of up to some thousands of entries.
16
+ */
17
+ export declare class FileOutboxStore implements OutboxStore {
18
+ readonly path: string;
19
+ private cache;
20
+ private queue;
21
+ private flushing;
22
+ private readonly renameFile;
23
+ private readonly retryDelayMs;
24
+ constructor(path: string, options?: FileOutboxOptions);
25
+ add<P>(input: OutboxInput<P>): Promise<OutboxEntry<P>>;
26
+ pending(): Promise<OutboxEntry[]>;
27
+ remove(seq: number): Promise<void>;
28
+ fail(entry: FailedOutboxEntry): Promise<void>;
29
+ failed(): Promise<FailedOutboxEntry[]>;
30
+ clearFailed(seqs?: readonly number[]): Promise<void>;
31
+ private submit;
32
+ private flush;
33
+ private load;
34
+ private write;
35
+ /** Windows and antivirus scanners briefly hold the target open, which fails the rename with EPERM/EBUSY/EACCES. */
36
+ private publish;
37
+ /** Makes the rename itself durable. Windows cannot open a directory for fsync, so it is skipped there. */
38
+ private syncDirectory;
39
+ }
40
+ //# sourceMappingURL=file-outbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-outbox.d.ts","sourceRoot":"","sources":["../../../src/node/file-outbox.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAU7F,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA0DD;;;;;;;;GAQG;AACH,qBAAa,eAAgB,YAAW,WAAW;aAQ/B,IAAI,EAAE,MAAM;IAP9B,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8C;IACzE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IAEtC,YACkB,IAAI,EAAE,MAAM,EAC5B,OAAO,GAAE,iBAAsB,EAIhC;IAEM,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAkB5D;IAEM,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAEvC;IAEM,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxC;IAEM,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWnD;IAEM,MAAM,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAE5C;IAEM,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1D;IAED,OAAO,CAAC,MAAM;YAUA,KAAK;YAwBL,IAAI;YAqCJ,KAAK;IAuBnB,mHAAmH;YACrG,OAAO;IAarB,0GAA0G;YAC5F,aAAa;CAkB5B"}