ugly-app 0.1.689 → 0.1.690
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/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/client/createSocket.d.ts +14 -1
- package/dist/client/createSocket.d.ts.map +1 -1
- package/dist/client/createSocket.js +106 -59
- package/dist/client/createSocket.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/version.ts +1 -1
- package/src/client/createSocket.test.ts +207 -0
- package/src/client/createSocket.ts +134 -59
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.690";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
|
@@ -14,6 +14,15 @@ export interface RequestOptions {
|
|
|
14
14
|
* deadline.
|
|
15
15
|
*/
|
|
16
16
|
timeoutMs?: number | null;
|
|
17
|
+
/**
|
|
18
|
+
* Re-send this request automatically when the socket reconnects after a
|
|
19
|
+
* drop, instead of rejecting it. Defaults to `true`.
|
|
20
|
+
*
|
|
21
|
+
* Retry-all is robust but can RE-EXECUTE a request whose server ack was
|
|
22
|
+
* merely lost on the drop. Pass `false` for non-idempotent operations
|
|
23
|
+
* (payments, message-send, anything that must run exactly once).
|
|
24
|
+
*/
|
|
25
|
+
retry?: boolean;
|
|
17
26
|
}
|
|
18
27
|
export interface AppSocket<R extends AppRegistryBase> {
|
|
19
28
|
connect(token: string): Promise<{
|
|
@@ -59,10 +68,12 @@ export interface AppSocket<R extends AppRegistryBase> {
|
|
|
59
68
|
/** Fire-and-forget — typed by messages registry. */
|
|
60
69
|
emit<K extends keyof R['messages']>(type: K, data: MessageData<R['messages'][K]>): void;
|
|
61
70
|
/** RPC — typed. Returns typed response. */
|
|
62
|
-
send<K extends keyof R['messages']>(type: K, data: MessageData<R['messages'][K]>, timeout?: number): Promise<MessageResponse<R['messages'][K]>>;
|
|
71
|
+
send<K extends keyof R['messages']>(type: K, data: MessageData<R['messages'][K]>, timeout?: number, retry?: boolean): Promise<MessageResponse<R['messages'][K]>>;
|
|
63
72
|
/** Subscribe to a message type. Returns unsubscribe. */
|
|
64
73
|
on<K extends keyof R['messages']>(event: K, handler: (data: MessageData<R['messages'][K]>) => void): Unsubscribe;
|
|
65
74
|
waitForConnection(timeout?: number): Promise<void>;
|
|
75
|
+
/** Drive focus from a non-DOM host (Electron main) — mirrors browser visibility. */
|
|
76
|
+
setFocused(focused: boolean): void;
|
|
66
77
|
readonly connectionState: ConnectionState;
|
|
67
78
|
disconnect(): void;
|
|
68
79
|
}
|
|
@@ -73,6 +84,8 @@ export interface CreateSocketOptions<R extends AppRegistryBase> {
|
|
|
73
84
|
/** If provided, sends a 'buildId' check after connect and fires a
|
|
74
85
|
* 'version-mismatch' CustomEvent when the server returns a different value. */
|
|
75
86
|
buildId?: string;
|
|
87
|
+
/** Starting focus state for hosts without `document` (e.g. Electron main). Defaults to true. */
|
|
88
|
+
initialFocus?: boolean;
|
|
76
89
|
/** Called for any message type not handled by the framework. */
|
|
77
90
|
onCustomMessage?: (msg: {
|
|
78
91
|
type: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSocket.d.ts","sourceRoot":"","sources":["../../src/client/createSocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,eAAe,EACf,YAAY,EACZ,aAAa,EACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGpF,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,WAAW,GACX,cAAc,GACd,cAAc,GACd,mBAAmB,CAAC;AAExB,KAAK,WAAW,GAAG,MAAM,IAAI,CAAC;AAC9B,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"createSocket.d.ts","sourceRoot":"","sources":["../../src/client/createSocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,11 +20,14 @@ export function createSocket(opts) {
|
|
|
20
20
|
let reconnectAttempts = 0;
|
|
21
21
|
let pendingReconnect = false;
|
|
22
22
|
let wasIdleDisconnect = false;
|
|
23
|
-
let isWindowFocused = true;
|
|
23
|
+
let isWindowFocused = opts.initialFocus ?? true;
|
|
24
24
|
let pingInterval = null;
|
|
25
25
|
let state = 'connecting';
|
|
26
|
-
const maxReconnectAttempts = 10;
|
|
27
26
|
const reconnectDelay = 1000;
|
|
27
|
+
const maxReconnectDelay = 30_000;
|
|
28
|
+
const BACKOFF_CAP_EXP = 5; // delay caps at 1000 * 2**5 = 32s, clamped to 30s
|
|
29
|
+
const MAX_QUEUE = 1000;
|
|
30
|
+
let warnedOverflow = false;
|
|
28
31
|
const pingIntervalMs = 30000;
|
|
29
32
|
let connectionPromise = null;
|
|
30
33
|
let connectionResolve = null;
|
|
@@ -35,6 +38,9 @@ export function createSocket(opts) {
|
|
|
35
38
|
// Id of a pending auth message that was registered before the WS opened.
|
|
36
39
|
let _queuedAuthId = null;
|
|
37
40
|
const messageQueue = [];
|
|
41
|
+
// Ids of retryable requests that were in flight when the socket dropped; their
|
|
42
|
+
// promises stay alive in `pending` and are re-sent (by id) on the next flush.
|
|
43
|
+
const retryQueue = [];
|
|
38
44
|
const pending = new Map();
|
|
39
45
|
const trackCallbacks = new Map();
|
|
40
46
|
// Ephemeral streaming-frame callbacks, keyed by the SAME subId as the
|
|
@@ -68,19 +74,43 @@ export function createSocket(opts) {
|
|
|
68
74
|
trackCallbacks.clear();
|
|
69
75
|
frameCallbacks.clear();
|
|
70
76
|
}
|
|
77
|
+
// On a drop, keep retryable in-flight requests alive (re-sent on reconnect)
|
|
78
|
+
// and reject the rest. `idle` only changes the rejection message.
|
|
79
|
+
function requeueOrRejectPending(idle) {
|
|
80
|
+
for (const [id, p] of pending) {
|
|
81
|
+
clearTimeout(p.timeout);
|
|
82
|
+
if (p.retry) {
|
|
83
|
+
pushBounded(retryQueue, id);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
pending.delete(id);
|
|
87
|
+
p.reject(new Error(idle ? 'WebSocket disconnected (idle)' : 'WebSocket disconnected'));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
71
91
|
// ─── Raw send ──────────────────────────────────────────────────────────────
|
|
72
92
|
function sendRaw(msg) {
|
|
73
93
|
ws.send(JSON.stringify(msg));
|
|
74
94
|
}
|
|
95
|
+
function pushBounded(queue, item) {
|
|
96
|
+
if (queue.length >= MAX_QUEUE) {
|
|
97
|
+
queue.shift();
|
|
98
|
+
if (!warnedOverflow) {
|
|
99
|
+
console.warn(`[socket] queue exceeded ${MAX_QUEUE} — dropping oldest message(s)`);
|
|
100
|
+
warnedOverflow = true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
queue.push(item);
|
|
104
|
+
}
|
|
75
105
|
function enqueueOrSend(serialized) {
|
|
76
106
|
if (isServerReady && isConnected && ws?.readyState === WebSocket.OPEN) {
|
|
77
107
|
ws.send(serialized);
|
|
78
108
|
}
|
|
79
109
|
else {
|
|
80
|
-
messageQueue
|
|
110
|
+
pushBounded(messageQueue, serialized);
|
|
81
111
|
}
|
|
82
112
|
}
|
|
83
|
-
function socketSend(typeOrMsg, data, timeout = 60000) {
|
|
113
|
+
function socketSend(typeOrMsg, data, timeout = 60000, retry = true) {
|
|
84
114
|
// Fire-and-forget when called with a message object (used by audio streaming hooks)
|
|
85
115
|
if (typeof typeOrMsg === 'object' && typeOrMsg !== null) {
|
|
86
116
|
enqueueOrSend(JSON.stringify(typeOrMsg));
|
|
@@ -88,12 +118,13 @@ export function createSocket(opts) {
|
|
|
88
118
|
}
|
|
89
119
|
return new Promise((resolve, reject) => {
|
|
90
120
|
const id = nextId();
|
|
121
|
+
const serialized = JSON.stringify({ type: typeOrMsg, id, data });
|
|
91
122
|
const timeoutHandle = setTimeout(() => {
|
|
92
123
|
pending.delete(id);
|
|
93
124
|
reject(new Error(`Request timeout: ${typeOrMsg}`));
|
|
94
125
|
}, timeout);
|
|
95
|
-
pending.set(id, { resolve, reject, timeout: timeoutHandle });
|
|
96
|
-
enqueueOrSend(
|
|
126
|
+
pending.set(id, { resolve, reject, timeout: timeoutHandle, serialized, retry, timeoutMs: timeout });
|
|
127
|
+
enqueueOrSend(serialized);
|
|
97
128
|
});
|
|
98
129
|
}
|
|
99
130
|
function socketEmit(type, data) {
|
|
@@ -117,24 +148,33 @@ export function createSocket(opts) {
|
|
|
117
148
|
}
|
|
118
149
|
// ─── Resubscribe ───────────────────────────────────────────────────────────
|
|
119
150
|
function resubscribeAll() {
|
|
120
|
-
for (const [subId,
|
|
121
|
-
|
|
122
|
-
// via the trackDoc/trackDocs closures; we re-send by using the subId directly.
|
|
123
|
-
// Note: we stored the re-subscribe payload in subscriptionPayloads map.
|
|
124
|
-
const payload = subscriptionPayloads.get(subId);
|
|
125
|
-
if (payload) {
|
|
126
|
-
rpc(payload.type, { ...payload.params, subId }).catch(console.error);
|
|
127
|
-
}
|
|
128
|
-
void cb; // suppress unused warning
|
|
151
|
+
for (const [subId, payload] of subscriptionPayloads) {
|
|
152
|
+
rpc(payload.type, { ...payload.params, subId }).catch((err) => console.error('[resubscribe]', err));
|
|
129
153
|
}
|
|
130
154
|
}
|
|
131
155
|
// Map of subId → { type, params } for resubscription on reconnect
|
|
132
156
|
const subscriptionPayloads = new Map();
|
|
133
157
|
// ─── Flush queue ───────────────────────────────────────────────────────────
|
|
158
|
+
function flushRetryQueue() {
|
|
159
|
+
while (retryQueue.length > 0 && ws?.readyState === WebSocket.OPEN) {
|
|
160
|
+
const id = retryQueue.shift();
|
|
161
|
+
const p = pending.get(id);
|
|
162
|
+
if (!p)
|
|
163
|
+
continue; // unsubscribed / resolved meanwhile
|
|
164
|
+
ws.send(p.serialized);
|
|
165
|
+
if (p.timeoutMs !== null) {
|
|
166
|
+
p.timeout = setTimeout(() => {
|
|
167
|
+
pending.delete(id);
|
|
168
|
+
p.reject(new Error(`Timeout: retry ${id}`));
|
|
169
|
+
}, p.timeoutMs);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
134
173
|
function flushQueue() {
|
|
135
174
|
while (messageQueue.length > 0 && ws?.readyState === WebSocket.OPEN) {
|
|
136
175
|
ws.send(messageQueue.shift());
|
|
137
176
|
}
|
|
177
|
+
flushRetryQueue();
|
|
138
178
|
if (opts.buildId) {
|
|
139
179
|
socketSend('buildId', {})
|
|
140
180
|
.then((serverBuildId) => {
|
|
@@ -226,9 +266,10 @@ export function createSocket(opts) {
|
|
|
226
266
|
}
|
|
227
267
|
// ─── RPC helper (used internally for protocol messages) ────────────────────
|
|
228
268
|
// All RPCs except auth are queued until the server signals `ready`.
|
|
229
|
-
function rpc(type, payload, timeoutMs = 60000) {
|
|
269
|
+
function rpc(type, payload, timeoutMs = 60000, retry = false) {
|
|
230
270
|
return new Promise((resolve, reject) => {
|
|
231
271
|
const id = nextId();
|
|
272
|
+
const serialized = JSON.stringify({ id, type, payload });
|
|
232
273
|
// `timeoutMs === null` opts out of the wall-clock deadline. Used by
|
|
233
274
|
// RPCs whose duration is bounded by user/server-side cancellation
|
|
234
275
|
// rather than a fixed budget (e.g. project init, pnpm install).
|
|
@@ -246,29 +287,36 @@ export function createSocket(opts) {
|
|
|
246
287
|
// dummy via setTimeout(noop, 0) when the caller opted out so the
|
|
247
288
|
// existing drain logic can keep blindly calling clearTimeout.
|
|
248
289
|
timeout: timer ?? setTimeout(() => { }, 0),
|
|
290
|
+
serialized,
|
|
291
|
+
retry,
|
|
292
|
+
timeoutMs,
|
|
249
293
|
});
|
|
250
|
-
enqueueOrSend(
|
|
294
|
+
enqueueOrSend(serialized);
|
|
251
295
|
});
|
|
252
296
|
}
|
|
253
|
-
// ───
|
|
297
|
+
// ─── Focus (shared by DOM visibility + host-driven setFocused) ──────────────
|
|
298
|
+
function applyFocus(focused) {
|
|
299
|
+
if (focused === isWindowFocused)
|
|
300
|
+
return;
|
|
301
|
+
isWindowFocused = focused;
|
|
302
|
+
if (focused) {
|
|
303
|
+
if (!isConnected) {
|
|
304
|
+
reconnectAttempts = 0;
|
|
305
|
+
connect();
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
startPing();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
stopPing();
|
|
313
|
+
wasIdleDisconnect = true;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
254
316
|
if (typeof document !== 'undefined') {
|
|
255
317
|
isWindowFocused = document.visibilityState === 'visible';
|
|
256
318
|
document.addEventListener('visibilitychange', () => {
|
|
257
|
-
|
|
258
|
-
isWindowFocused = document.visibilityState === 'visible';
|
|
259
|
-
if (isWindowFocused && !wasVisible) {
|
|
260
|
-
if (!isConnected) {
|
|
261
|
-
reconnectAttempts = 0;
|
|
262
|
-
connect();
|
|
263
|
-
}
|
|
264
|
-
else {
|
|
265
|
-
startPing();
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
else if (!isWindowFocused && wasVisible) {
|
|
269
|
-
stopPing();
|
|
270
|
-
wasIdleDisconnect = true;
|
|
271
|
-
}
|
|
319
|
+
applyFocus(document.visibilityState === 'visible');
|
|
272
320
|
});
|
|
273
321
|
}
|
|
274
322
|
// ─── Connect ───────────────────────────────────────────────────────────────
|
|
@@ -292,6 +340,7 @@ export function createSocket(opts) {
|
|
|
292
340
|
isConnected = true;
|
|
293
341
|
pendingReconnect = isReconnect || wasIdle;
|
|
294
342
|
reconnectAttempts = 0;
|
|
343
|
+
warnedOverflow = false;
|
|
295
344
|
wasIdleDisconnect = false;
|
|
296
345
|
setState('connected', { wasReconnect: isReconnect, wasIdleReconnect: wasIdle });
|
|
297
346
|
connectionResolve?.();
|
|
@@ -310,6 +359,9 @@ export function createSocket(opts) {
|
|
|
310
359
|
resolve: () => { },
|
|
311
360
|
reject: () => { },
|
|
312
361
|
timeout: setTimeout(() => pending.delete(authId), 30000),
|
|
362
|
+
serialized: '',
|
|
363
|
+
retry: false,
|
|
364
|
+
timeoutMs: 30000,
|
|
313
365
|
});
|
|
314
366
|
}
|
|
315
367
|
_queuedAuthId = null;
|
|
@@ -323,31 +375,17 @@ export function createSocket(opts) {
|
|
|
323
375
|
if (!isWindowFocused) {
|
|
324
376
|
wasIdleDisconnect = true;
|
|
325
377
|
setState('idle-disconnected');
|
|
326
|
-
|
|
327
|
-
clearTimeout(timeout);
|
|
328
|
-
reject(new Error('WebSocket disconnected (idle)'));
|
|
329
|
-
}
|
|
330
|
-
pending.clear();
|
|
378
|
+
requeueOrRejectPending(true);
|
|
331
379
|
return;
|
|
332
380
|
}
|
|
333
381
|
setState('reconnecting', { attempt: reconnectAttempts + 1 });
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
initConnectionPromise();
|
|
342
|
-
setTimeout(() => {
|
|
343
|
-
reconnectAttempts++;
|
|
344
|
-
connect();
|
|
345
|
-
}, delay);
|
|
346
|
-
}
|
|
347
|
-
else {
|
|
348
|
-
setState('disconnected');
|
|
349
|
-
connectionReject?.(new Error('Max reconnect attempts reached'));
|
|
350
|
-
}
|
|
382
|
+
requeueOrRejectPending(false);
|
|
383
|
+
const delay = Math.min(maxReconnectDelay, reconnectDelay * Math.pow(2, Math.min(reconnectAttempts, BACKOFF_CAP_EXP)));
|
|
384
|
+
initConnectionPromise();
|
|
385
|
+
setTimeout(() => {
|
|
386
|
+
reconnectAttempts++;
|
|
387
|
+
connect();
|
|
388
|
+
}, delay);
|
|
351
389
|
});
|
|
352
390
|
ws.addEventListener('error', () => {
|
|
353
391
|
// onclose will fire next and handle reconnection
|
|
@@ -370,6 +408,9 @@ export function createSocket(opts) {
|
|
|
370
408
|
pending.delete(id);
|
|
371
409
|
reject(new Error('Auth timeout'));
|
|
372
410
|
}, 30000),
|
|
411
|
+
serialized: '', // auth is replayed on every open, never via retryQueue
|
|
412
|
+
retry: false,
|
|
413
|
+
timeoutMs: 30000,
|
|
373
414
|
});
|
|
374
415
|
});
|
|
375
416
|
if (ws?.readyState === WebSocket.OPEN) {
|
|
@@ -382,7 +423,7 @@ export function createSocket(opts) {
|
|
|
382
423
|
},
|
|
383
424
|
request(name, input, opts) {
|
|
384
425
|
const timeoutMs = opts?.timeoutMs === undefined ? 60000 : opts.timeoutMs;
|
|
385
|
-
return rpc('request', { name, input }, timeoutMs);
|
|
426
|
+
return rpc('request', { name, input }, timeoutMs, opts?.retry ?? true);
|
|
386
427
|
},
|
|
387
428
|
/**
|
|
388
429
|
* A STREAMED request over HTTP SSE (not the WS): used by `runAgent` so agent
|
|
@@ -460,8 +501,9 @@ export function createSocket(opts) {
|
|
|
460
501
|
trackCallbacks.set(subId, cb);
|
|
461
502
|
subscriptionPayloads.set(subId, { type: 'trackDoc', params: { collection, id } });
|
|
462
503
|
rpc('trackDoc', { collection, id, subId }).catch((err) => {
|
|
504
|
+
// A disconnect rejection is expected — resubscribeAll re-issues this on
|
|
505
|
+
// reconnect. Log only; rethrowing would surface as an unhandled rejection.
|
|
463
506
|
console.error('[trackDoc]', err);
|
|
464
|
-
throw err;
|
|
465
507
|
});
|
|
466
508
|
return () => {
|
|
467
509
|
trackCallbacks.delete(subId);
|
|
@@ -487,8 +529,9 @@ export function createSocket(opts) {
|
|
|
487
529
|
limit: params.limit,
|
|
488
530
|
skip: params.skip,
|
|
489
531
|
}).catch((err) => {
|
|
532
|
+
// A disconnect rejection is expected — resubscribeAll re-issues this on
|
|
533
|
+
// reconnect. Log only; rethrowing would surface as an unhandled rejection.
|
|
490
534
|
console.error('[trackDocs]', err);
|
|
491
|
-
throw err;
|
|
492
535
|
});
|
|
493
536
|
return () => {
|
|
494
537
|
trackCallbacks.delete(subId);
|
|
@@ -516,8 +559,9 @@ export function createSocket(opts) {
|
|
|
516
559
|
limit: params.limit,
|
|
517
560
|
skip: params.skip,
|
|
518
561
|
}).catch((err) => {
|
|
562
|
+
// A disconnect rejection is expected — resubscribeAll re-issues this on
|
|
563
|
+
// reconnect. Log only; rethrowing would surface as an unhandled rejection.
|
|
519
564
|
console.error('[trackQuery]', err);
|
|
520
|
-
throw err;
|
|
521
565
|
});
|
|
522
566
|
return () => {
|
|
523
567
|
trackCallbacks.delete(subId);
|
|
@@ -564,6 +608,9 @@ export function createSocket(opts) {
|
|
|
564
608
|
get connectionState() {
|
|
565
609
|
return state;
|
|
566
610
|
},
|
|
611
|
+
setFocused(focused) {
|
|
612
|
+
applyFocus(focused);
|
|
613
|
+
},
|
|
567
614
|
disconnect() {
|
|
568
615
|
drainPending('Disconnected');
|
|
569
616
|
stopPing();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSocket.js","sourceRoot":"","sources":["../../src/client/createSocket.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"createSocket.js","sourceRoot":"","sources":["../../src/client/createSocket.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ugly-app",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.690",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"comment:files": "Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.",
|
|
6
6
|
"files": [
|
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
2
|
+
export const CLI_VERSION = "0.1.690";
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { createSocket } from './createSocket.js';
|
|
3
|
+
|
|
4
|
+
// ─── Controllable fake WebSocket ───────────────────────────────────────────
|
|
5
|
+
// createSocket reads the global `WebSocket` at `new WebSocket(url)`. We swap a
|
|
6
|
+
// fake in so tests can drive open/close/message deterministically.
|
|
7
|
+
class FakeWebSocket {
|
|
8
|
+
static OPEN = 1;
|
|
9
|
+
static CLOSED = 3;
|
|
10
|
+
static instances: FakeWebSocket[] = [];
|
|
11
|
+
readyState = 0;
|
|
12
|
+
url: string;
|
|
13
|
+
sent: string[] = [];
|
|
14
|
+
private listeners: Record<string, ((ev: unknown) => void)[]> = {};
|
|
15
|
+
constructor(url: string) {
|
|
16
|
+
this.url = url;
|
|
17
|
+
FakeWebSocket.instances.push(this);
|
|
18
|
+
}
|
|
19
|
+
addEventListener(type: string, cb: (ev: unknown) => void) {
|
|
20
|
+
(this.listeners[type] ??= []).push(cb);
|
|
21
|
+
}
|
|
22
|
+
send(data: string) {
|
|
23
|
+
this.sent.push(data);
|
|
24
|
+
}
|
|
25
|
+
close() {
|
|
26
|
+
this.emit('close', {});
|
|
27
|
+
}
|
|
28
|
+
emit(type: string, ev: unknown) {
|
|
29
|
+
if (type === 'open') this.readyState = FakeWebSocket.OPEN;
|
|
30
|
+
if (type === 'close') this.readyState = FakeWebSocket.CLOSED;
|
|
31
|
+
for (const cb of this.listeners[type] ?? []) cb(ev);
|
|
32
|
+
}
|
|
33
|
+
/** Parse a frame this socket sent, by index from the end. */
|
|
34
|
+
sentFrame(fromEnd = 0): { id?: string; type?: string; payload?: unknown; data?: unknown } {
|
|
35
|
+
return JSON.parse(this.sent[this.sent.length - 1 - fromEnd]!);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function installFakeWebSocket() {
|
|
40
|
+
FakeWebSocket.instances = [];
|
|
41
|
+
const orig = (globalThis as { WebSocket?: unknown }).WebSocket;
|
|
42
|
+
(globalThis as { WebSocket?: unknown }).WebSocket = FakeWebSocket as unknown;
|
|
43
|
+
return {
|
|
44
|
+
last: () => FakeWebSocket.instances[FakeWebSocket.instances.length - 1]!,
|
|
45
|
+
count: () => FakeWebSocket.instances.length,
|
|
46
|
+
restore: () => {
|
|
47
|
+
(globalThis as { WebSocket?: unknown }).WebSocket = orig;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Bring a freshly-created socket to the "server ready" state. */
|
|
53
|
+
function handshake(ws: FakeWebSocket) {
|
|
54
|
+
ws.emit('open', {});
|
|
55
|
+
ws.emit('message', { data: JSON.stringify({ type: 'ready' }) });
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const OPTS = { url: 'ws://localhost:1/ws', requests: {}, messages: {} } as const;
|
|
59
|
+
|
|
60
|
+
describe('createSocket resilience', () => {
|
|
61
|
+
let fake: ReturnType<typeof installFakeWebSocket>;
|
|
62
|
+
beforeEach(() => {
|
|
63
|
+
vi.useFakeTimers();
|
|
64
|
+
fake = installFakeWebSocket();
|
|
65
|
+
});
|
|
66
|
+
afterEach(() => {
|
|
67
|
+
fake.restore();
|
|
68
|
+
vi.useRealTimers();
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('keeps reconnecting past the old 10-attempt cap', async () => {
|
|
72
|
+
const socket = createSocket(OPTS as never);
|
|
73
|
+
// Fail 12 consecutive connection attempts (close immediately after each).
|
|
74
|
+
for (let i = 0; i < 12; i++) {
|
|
75
|
+
fake.last().emit('close', {});
|
|
76
|
+
// Advance past the (capped) backoff so the next connect() fires.
|
|
77
|
+
await vi.advanceTimersByTimeAsync(30_000);
|
|
78
|
+
}
|
|
79
|
+
// Still trying — a 13th socket was created, state is not terminal.
|
|
80
|
+
expect(fake.count()).toBeGreaterThan(12);
|
|
81
|
+
expect(socket.connectionState).toBe('reconnecting');
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('retries an in-flight request after a drop+reconnect (default retry)', async () => {
|
|
85
|
+
const socket = createSocket(OPTS as never);
|
|
86
|
+
handshake(fake.last());
|
|
87
|
+
const p = socket.request('doThing' as never, { a: 1 } as never);
|
|
88
|
+
const sentId = fake.last().sentFrame().id; // the request frame's id
|
|
89
|
+
// Drop before the ack.
|
|
90
|
+
fake.last().emit('close', {});
|
|
91
|
+
await vi.advanceTimersByTimeAsync(1000); // let backoff fire the reconnect
|
|
92
|
+
handshake(fake.last()); // new socket, server ready → retryQueue flushes
|
|
93
|
+
// The new socket re-sent a frame carrying the SAME id.
|
|
94
|
+
const resent = fake.last().sent.map((s) => JSON.parse(s) as { id?: string });
|
|
95
|
+
expect(resent.some((f) => f.id === sentId)).toBe(true);
|
|
96
|
+
// Deliver the response for that id → original promise resolves.
|
|
97
|
+
fake.last().emit('message', {
|
|
98
|
+
data: JSON.stringify({ type: 'response', id: sentId, data: { ok: true } }),
|
|
99
|
+
});
|
|
100
|
+
await expect(p).resolves.toEqual({ ok: true });
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('does NOT retry a request marked { retry: false } — it rejects on drop', async () => {
|
|
104
|
+
const socket = createSocket(OPTS as never);
|
|
105
|
+
handshake(fake.last());
|
|
106
|
+
const p = socket.request('pay' as never, { cents: 100 } as never, { retry: false });
|
|
107
|
+
const expectRejection = expect(p).rejects.toThrow('WebSocket disconnected');
|
|
108
|
+
fake.last().emit('close', {});
|
|
109
|
+
await expectRejection;
|
|
110
|
+
await vi.advanceTimersByTimeAsync(1000);
|
|
111
|
+
handshake(fake.last());
|
|
112
|
+
// No frame for the rejected request was re-sent on the new socket.
|
|
113
|
+
const resent = fake.last().sent.map((s) => JSON.parse(s) as { payload?: { name?: string } });
|
|
114
|
+
expect(resent.some((f) => f.payload?.name === 'pay')).toBe(false);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it('caps the message queue and drops the oldest when offline', async () => {
|
|
118
|
+
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
119
|
+
const socket = createSocket(OPTS as never);
|
|
120
|
+
// Never hand it a ready socket → everything queues in messageQueue.
|
|
121
|
+
for (let i = 0; i < 1100; i++) {
|
|
122
|
+
void socket.request('q' as never, { i } as never).catch(() => {});
|
|
123
|
+
}
|
|
124
|
+
handshake(fake.last());
|
|
125
|
+
const sent = fake.last().sent.map((s) => JSON.parse(s) as { payload?: { input?: { i?: number } } });
|
|
126
|
+
const qFrames = sent.filter((f) => f.payload?.input?.i !== undefined);
|
|
127
|
+
expect(qFrames.length).toBeLessThanOrEqual(1000);
|
|
128
|
+
// Oldest (i=0) was dropped; newest (i=1099) survived.
|
|
129
|
+
expect(qFrames.some((f) => f.payload?.input?.i === 1099)).toBe(true);
|
|
130
|
+
expect(qFrames.some((f) => f.payload?.input?.i === 0)).toBe(false);
|
|
131
|
+
expect(warn).toHaveBeenCalled();
|
|
132
|
+
warn.mockRestore();
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('resubscribes trackDocs after a reconnect so the callback fires again', async () => {
|
|
136
|
+
const socket = createSocket(OPTS as never);
|
|
137
|
+
handshake(fake.last());
|
|
138
|
+
const seen: unknown[][] = [];
|
|
139
|
+
socket.trackDocs('dockApp', { keys: { userId: 'u1' } }, (docs) => seen.push(docs as unknown[]));
|
|
140
|
+
// The original subscribe frame carries a subId.
|
|
141
|
+
const subId = fake.last().sentFrame().payload as { subId?: string };
|
|
142
|
+
// First delivery.
|
|
143
|
+
fake.last().emit('message', {
|
|
144
|
+
data: JSON.stringify({ type: 'track', subId: subId.subId, data: [{ _id: 'a' }] }),
|
|
145
|
+
});
|
|
146
|
+
// Drop + reconnect.
|
|
147
|
+
fake.last().emit('close', {});
|
|
148
|
+
await vi.advanceTimersByTimeAsync(1000);
|
|
149
|
+
handshake(fake.last());
|
|
150
|
+
// The new socket re-sent a trackDocs frame for the SAME subId.
|
|
151
|
+
const resub = fake.last().sent
|
|
152
|
+
.map((s) => JSON.parse(s) as { type?: string; payload?: { subId?: string } })
|
|
153
|
+
.some((f) => f.type === 'trackDocs' && f.payload?.subId === subId.subId);
|
|
154
|
+
expect(resub).toBe(true);
|
|
155
|
+
// Server re-emits → callback fires again with the new set.
|
|
156
|
+
fake.last().emit('message', {
|
|
157
|
+
data: JSON.stringify({ type: 'track', subId: subId.subId, data: [{ _id: 'a' }, { _id: 'b' }] }),
|
|
158
|
+
});
|
|
159
|
+
expect(seen.at(-1)).toEqual([{ _id: 'a' }, { _id: 'b' }]);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('setFocused(false) stops pings; setFocused(true) reconnects when disconnected', async () => {
|
|
163
|
+
const socket = createSocket(OPTS as never);
|
|
164
|
+
handshake(fake.last());
|
|
165
|
+
const before = fake.count();
|
|
166
|
+
socket.setFocused(false); // blur
|
|
167
|
+
// A drop while blurred → idle-disconnected, no auto-reconnect scheduled.
|
|
168
|
+
fake.last().emit('close', {});
|
|
169
|
+
await vi.advanceTimersByTimeAsync(30_000);
|
|
170
|
+
expect(fake.count()).toBe(before); // no reconnect while blurred
|
|
171
|
+
expect(socket.connectionState).toBe('idle-disconnected');
|
|
172
|
+
// Refocus → reconnect now.
|
|
173
|
+
socket.setFocused(true);
|
|
174
|
+
expect(fake.count()).toBe(before + 1);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('idle disconnect preserves a retryable request, flushed on refocus', async () => {
|
|
178
|
+
const socket = createSocket(OPTS as never);
|
|
179
|
+
handshake(fake.last());
|
|
180
|
+
const p = socket.request('doThing' as never, { a: 1 } as never);
|
|
181
|
+
const sentId = fake.last().sentFrame().id;
|
|
182
|
+
socket.setFocused(false);
|
|
183
|
+
fake.last().emit('close', {}); // idle drop — must NOT reject p
|
|
184
|
+
socket.setFocused(true); // reconnect
|
|
185
|
+
handshake(fake.last());
|
|
186
|
+
const resent = fake.last().sent.map((s) => JSON.parse(s) as { id?: string });
|
|
187
|
+
expect(resent.some((f) => f.id === sentId)).toBe(true);
|
|
188
|
+
fake.last().emit('message', {
|
|
189
|
+
data: JSON.stringify({ type: 'response', id: sentId, data: { ok: 1 } }),
|
|
190
|
+
});
|
|
191
|
+
await expect(p).resolves.toEqual({ ok: 1 });
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
it('send() retries by default and resolves after reconnect', async () => {
|
|
195
|
+
const socket = createSocket(OPTS as never);
|
|
196
|
+
handshake(fake.last());
|
|
197
|
+
const p = socket.send('ctrl' as never, { x: 1 } as never);
|
|
198
|
+
const sentId = fake.last().sentFrame().id;
|
|
199
|
+
fake.last().emit('close', {});
|
|
200
|
+
await vi.advanceTimersByTimeAsync(1000);
|
|
201
|
+
handshake(fake.last());
|
|
202
|
+
fake.last().emit('message', {
|
|
203
|
+
data: JSON.stringify({ type: 'response', id: sentId, data: { done: true } }),
|
|
204
|
+
});
|
|
205
|
+
await expect(p).resolves.toEqual({ done: true });
|
|
206
|
+
});
|
|
207
|
+
});
|
|
@@ -29,6 +29,15 @@ export interface RequestOptions {
|
|
|
29
29
|
* deadline.
|
|
30
30
|
*/
|
|
31
31
|
timeoutMs?: number | null;
|
|
32
|
+
/**
|
|
33
|
+
* Re-send this request automatically when the socket reconnects after a
|
|
34
|
+
* drop, instead of rejecting it. Defaults to `true`.
|
|
35
|
+
*
|
|
36
|
+
* Retry-all is robust but can RE-EXECUTE a request whose server ack was
|
|
37
|
+
* merely lost on the drop. Pass `false` for non-idempotent operations
|
|
38
|
+
* (payments, message-send, anything that must run exactly once).
|
|
39
|
+
*/
|
|
40
|
+
retry?: boolean;
|
|
32
41
|
}
|
|
33
42
|
|
|
34
43
|
export interface AppSocket<R extends AppRegistryBase> {
|
|
@@ -98,6 +107,7 @@ export interface AppSocket<R extends AppRegistryBase> {
|
|
|
98
107
|
type: K,
|
|
99
108
|
data: MessageData<R['messages'][K]>,
|
|
100
109
|
timeout?: number,
|
|
110
|
+
retry?: boolean,
|
|
101
111
|
): Promise<MessageResponse<R['messages'][K]>>;
|
|
102
112
|
/** Subscribe to a message type. Returns unsubscribe. */
|
|
103
113
|
on<K extends keyof R['messages']>(
|
|
@@ -105,6 +115,8 @@ export interface AppSocket<R extends AppRegistryBase> {
|
|
|
105
115
|
handler: (data: MessageData<R['messages'][K]>) => void,
|
|
106
116
|
): Unsubscribe;
|
|
107
117
|
waitForConnection(timeout?: number): Promise<void>;
|
|
118
|
+
/** Drive focus from a non-DOM host (Electron main) — mirrors browser visibility. */
|
|
119
|
+
setFocused(focused: boolean): void;
|
|
108
120
|
readonly connectionState: ConnectionState;
|
|
109
121
|
disconnect(): void;
|
|
110
122
|
}
|
|
@@ -116,6 +128,8 @@ export interface CreateSocketOptions<R extends AppRegistryBase> {
|
|
|
116
128
|
/** If provided, sends a 'buildId' check after connect and fires a
|
|
117
129
|
* 'version-mismatch' CustomEvent when the server returns a different value. */
|
|
118
130
|
buildId?: string;
|
|
131
|
+
/** Starting focus state for hosts without `document` (e.g. Electron main). Defaults to true. */
|
|
132
|
+
initialFocus?: boolean;
|
|
119
133
|
/** Called for any message type not handled by the framework. */
|
|
120
134
|
onCustomMessage?: (msg: {
|
|
121
135
|
type: string;
|
|
@@ -158,12 +172,15 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
158
172
|
let reconnectAttempts = 0;
|
|
159
173
|
let pendingReconnect = false;
|
|
160
174
|
let wasIdleDisconnect = false;
|
|
161
|
-
let isWindowFocused = true;
|
|
175
|
+
let isWindowFocused = opts.initialFocus ?? true;
|
|
162
176
|
let pingInterval: ReturnType<typeof setInterval> | null = null;
|
|
163
177
|
let state: ConnectionState = 'connecting';
|
|
164
178
|
|
|
165
|
-
const maxReconnectAttempts = 10;
|
|
166
179
|
const reconnectDelay = 1000;
|
|
180
|
+
const maxReconnectDelay = 30_000;
|
|
181
|
+
const BACKOFF_CAP_EXP = 5; // delay caps at 1000 * 2**5 = 32s, clamped to 30s
|
|
182
|
+
const MAX_QUEUE = 1000;
|
|
183
|
+
let warnedOverflow = false;
|
|
167
184
|
const pingIntervalMs = 30000;
|
|
168
185
|
|
|
169
186
|
let connectionPromise: Promise<void> | null = null;
|
|
@@ -177,9 +194,19 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
177
194
|
let _queuedAuthId: string | null = null;
|
|
178
195
|
|
|
179
196
|
const messageQueue: string[] = [];
|
|
197
|
+
// Ids of retryable requests that were in flight when the socket dropped; their
|
|
198
|
+
// promises stay alive in `pending` and are re-sent (by id) on the next flush.
|
|
199
|
+
const retryQueue: string[] = [];
|
|
180
200
|
const pending = new Map<
|
|
181
201
|
string,
|
|
182
|
-
{
|
|
202
|
+
{
|
|
203
|
+
resolve: (v: unknown) => void;
|
|
204
|
+
reject: (e: Error) => void;
|
|
205
|
+
timeout: ReturnType<typeof setTimeout>;
|
|
206
|
+
serialized: string; // exact frame to re-send on retry ('' = never retried)
|
|
207
|
+
retry: boolean;
|
|
208
|
+
timeoutMs: number | null; // to re-arm the wall-clock timeout on resend
|
|
209
|
+
}
|
|
183
210
|
>();
|
|
184
211
|
const trackCallbacks = new Map<string, TrackCallback<unknown>>();
|
|
185
212
|
// Ephemeral streaming-frame callbacks, keyed by the SAME subId as the
|
|
@@ -222,25 +249,50 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
222
249
|
frameCallbacks.clear();
|
|
223
250
|
}
|
|
224
251
|
|
|
252
|
+
// On a drop, keep retryable in-flight requests alive (re-sent on reconnect)
|
|
253
|
+
// and reject the rest. `idle` only changes the rejection message.
|
|
254
|
+
function requeueOrRejectPending(idle: boolean) {
|
|
255
|
+
for (const [id, p] of pending) {
|
|
256
|
+
clearTimeout(p.timeout);
|
|
257
|
+
if (p.retry) {
|
|
258
|
+
pushBounded(retryQueue, id);
|
|
259
|
+
} else {
|
|
260
|
+
pending.delete(id);
|
|
261
|
+
p.reject(new Error(idle ? 'WebSocket disconnected (idle)' : 'WebSocket disconnected'));
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
225
266
|
// ─── Raw send ──────────────────────────────────────────────────────────────
|
|
226
267
|
|
|
227
268
|
function sendRaw(msg: object): void {
|
|
228
269
|
ws!.send(JSON.stringify(msg));
|
|
229
270
|
}
|
|
230
271
|
|
|
272
|
+
function pushBounded(queue: string[], item: string) {
|
|
273
|
+
if (queue.length >= MAX_QUEUE) {
|
|
274
|
+
queue.shift();
|
|
275
|
+
if (!warnedOverflow) {
|
|
276
|
+
console.warn(`[socket] queue exceeded ${MAX_QUEUE} — dropping oldest message(s)`);
|
|
277
|
+
warnedOverflow = true;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
queue.push(item);
|
|
281
|
+
}
|
|
282
|
+
|
|
231
283
|
function enqueueOrSend(serialized: string): void {
|
|
232
284
|
if (isServerReady && isConnected && ws?.readyState === WebSocket.OPEN) {
|
|
233
285
|
ws.send(serialized);
|
|
234
286
|
} else {
|
|
235
|
-
messageQueue
|
|
287
|
+
pushBounded(messageQueue, serialized);
|
|
236
288
|
}
|
|
237
289
|
}
|
|
238
290
|
|
|
239
291
|
// ─── Public send / emit ────────────────────────────────────────────────────
|
|
240
292
|
|
|
241
|
-
function socketSend(typeOrMsg: string, data: object, timeout?: number): Promise<unknown>;
|
|
293
|
+
function socketSend(typeOrMsg: string, data: object, timeout?: number, retry?: boolean): Promise<unknown>;
|
|
242
294
|
function socketSend(typeOrMsg: object): void;
|
|
243
|
-
function socketSend(typeOrMsg: string | object, data?: object, timeout = 60000): Promise<unknown> | void {
|
|
295
|
+
function socketSend(typeOrMsg: string | object, data?: object, timeout = 60000, retry = true): Promise<unknown> | void {
|
|
244
296
|
// Fire-and-forget when called with a message object (used by audio streaming hooks)
|
|
245
297
|
if (typeof typeOrMsg === 'object' && typeOrMsg !== null) {
|
|
246
298
|
enqueueOrSend(JSON.stringify(typeOrMsg));
|
|
@@ -248,12 +300,13 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
248
300
|
}
|
|
249
301
|
return new Promise((resolve, reject) => {
|
|
250
302
|
const id = nextId();
|
|
303
|
+
const serialized = JSON.stringify({ type: typeOrMsg, id, data });
|
|
251
304
|
const timeoutHandle = setTimeout(() => {
|
|
252
305
|
pending.delete(id);
|
|
253
306
|
reject(new Error(`Request timeout: ${typeOrMsg}`));
|
|
254
307
|
}, timeout);
|
|
255
|
-
pending.set(id, { resolve, reject, timeout: timeoutHandle });
|
|
256
|
-
enqueueOrSend(
|
|
308
|
+
pending.set(id, { resolve, reject, timeout: timeoutHandle, serialized, retry, timeoutMs: timeout });
|
|
309
|
+
enqueueOrSend(serialized);
|
|
257
310
|
});
|
|
258
311
|
}
|
|
259
312
|
|
|
@@ -281,15 +334,10 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
281
334
|
// ─── Resubscribe ───────────────────────────────────────────────────────────
|
|
282
335
|
|
|
283
336
|
function resubscribeAll() {
|
|
284
|
-
for (const [subId,
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
const payload = subscriptionPayloads.get(subId);
|
|
289
|
-
if (payload) {
|
|
290
|
-
rpc(payload.type, { ...payload.params, subId }).catch(console.error);
|
|
291
|
-
}
|
|
292
|
-
void cb; // suppress unused warning
|
|
337
|
+
for (const [subId, payload] of subscriptionPayloads) {
|
|
338
|
+
rpc(payload.type, { ...payload.params, subId }).catch((err: unknown) =>
|
|
339
|
+
console.error('[resubscribe]', err),
|
|
340
|
+
);
|
|
293
341
|
}
|
|
294
342
|
}
|
|
295
343
|
|
|
@@ -298,10 +346,26 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
298
346
|
|
|
299
347
|
// ─── Flush queue ───────────────────────────────────────────────────────────
|
|
300
348
|
|
|
349
|
+
function flushRetryQueue() {
|
|
350
|
+
while (retryQueue.length > 0 && ws?.readyState === WebSocket.OPEN) {
|
|
351
|
+
const id = retryQueue.shift()!;
|
|
352
|
+
const p = pending.get(id);
|
|
353
|
+
if (!p) continue; // unsubscribed / resolved meanwhile
|
|
354
|
+
ws.send(p.serialized);
|
|
355
|
+
if (p.timeoutMs !== null) {
|
|
356
|
+
p.timeout = setTimeout(() => {
|
|
357
|
+
pending.delete(id);
|
|
358
|
+
p.reject(new Error(`Timeout: retry ${id}`));
|
|
359
|
+
}, p.timeoutMs);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
301
364
|
function flushQueue() {
|
|
302
365
|
while (messageQueue.length > 0 && ws?.readyState === WebSocket.OPEN) {
|
|
303
366
|
ws.send(messageQueue.shift()!);
|
|
304
367
|
}
|
|
368
|
+
flushRetryQueue();
|
|
305
369
|
if (opts.buildId) {
|
|
306
370
|
socketSend('buildId', {})
|
|
307
371
|
.then((serverBuildId) => {
|
|
@@ -417,9 +481,11 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
417
481
|
type: string,
|
|
418
482
|
payload: unknown,
|
|
419
483
|
timeoutMs: number | null = 60000,
|
|
484
|
+
retry = false,
|
|
420
485
|
): Promise<unknown> {
|
|
421
486
|
return new Promise((resolve, reject) => {
|
|
422
487
|
const id = nextId();
|
|
488
|
+
const serialized = JSON.stringify({ id, type, payload });
|
|
423
489
|
// `timeoutMs === null` opts out of the wall-clock deadline. Used by
|
|
424
490
|
// RPCs whose duration is bounded by user/server-side cancellation
|
|
425
491
|
// rather than a fixed budget (e.g. project init, pnpm install).
|
|
@@ -438,30 +504,35 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
438
504
|
// dummy via setTimeout(noop, 0) when the caller opted out so the
|
|
439
505
|
// existing drain logic can keep blindly calling clearTimeout.
|
|
440
506
|
timeout: timer ?? setTimeout(() => {}, 0),
|
|
507
|
+
serialized,
|
|
508
|
+
retry,
|
|
509
|
+
timeoutMs,
|
|
441
510
|
});
|
|
442
|
-
enqueueOrSend(
|
|
511
|
+
enqueueOrSend(serialized);
|
|
443
512
|
});
|
|
444
513
|
}
|
|
445
514
|
|
|
446
|
-
// ───
|
|
515
|
+
// ─── Focus (shared by DOM visibility + host-driven setFocused) ──────────────
|
|
516
|
+
function applyFocus(focused: boolean) {
|
|
517
|
+
if (focused === isWindowFocused) return;
|
|
518
|
+
isWindowFocused = focused;
|
|
519
|
+
if (focused) {
|
|
520
|
+
if (!isConnected) {
|
|
521
|
+
reconnectAttempts = 0;
|
|
522
|
+
connect();
|
|
523
|
+
} else {
|
|
524
|
+
startPing();
|
|
525
|
+
}
|
|
526
|
+
} else {
|
|
527
|
+
stopPing();
|
|
528
|
+
wasIdleDisconnect = true;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
447
531
|
|
|
448
532
|
if (typeof document !== 'undefined') {
|
|
449
533
|
isWindowFocused = document.visibilityState === 'visible';
|
|
450
534
|
document.addEventListener('visibilitychange', () => {
|
|
451
|
-
|
|
452
|
-
isWindowFocused = document.visibilityState === 'visible';
|
|
453
|
-
|
|
454
|
-
if (isWindowFocused && !wasVisible) {
|
|
455
|
-
if (!isConnected) {
|
|
456
|
-
reconnectAttempts = 0;
|
|
457
|
-
connect();
|
|
458
|
-
} else {
|
|
459
|
-
startPing();
|
|
460
|
-
}
|
|
461
|
-
} else if (!isWindowFocused && wasVisible) {
|
|
462
|
-
stopPing();
|
|
463
|
-
wasIdleDisconnect = true;
|
|
464
|
-
}
|
|
535
|
+
applyFocus(document.visibilityState === 'visible');
|
|
465
536
|
});
|
|
466
537
|
}
|
|
467
538
|
|
|
@@ -489,6 +560,7 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
489
560
|
isConnected = true;
|
|
490
561
|
pendingReconnect = isReconnect || wasIdle;
|
|
491
562
|
reconnectAttempts = 0;
|
|
563
|
+
warnedOverflow = false;
|
|
492
564
|
wasIdleDisconnect = false;
|
|
493
565
|
setState('connected', { wasReconnect: isReconnect, wasIdleReconnect: wasIdle });
|
|
494
566
|
connectionResolve?.();
|
|
@@ -506,6 +578,9 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
506
578
|
resolve: () => {},
|
|
507
579
|
reject: () => {},
|
|
508
580
|
timeout: setTimeout(() => pending.delete(authId), 30000),
|
|
581
|
+
serialized: '',
|
|
582
|
+
retry: false,
|
|
583
|
+
timeoutMs: 30000,
|
|
509
584
|
});
|
|
510
585
|
}
|
|
511
586
|
_queuedAuthId = null;
|
|
@@ -521,32 +596,22 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
521
596
|
if (!isWindowFocused) {
|
|
522
597
|
wasIdleDisconnect = true;
|
|
523
598
|
setState('idle-disconnected');
|
|
524
|
-
|
|
525
|
-
clearTimeout(timeout);
|
|
526
|
-
reject(new Error('WebSocket disconnected (idle)'));
|
|
527
|
-
}
|
|
528
|
-
pending.clear();
|
|
599
|
+
requeueOrRejectPending(true);
|
|
529
600
|
return;
|
|
530
601
|
}
|
|
531
602
|
|
|
532
603
|
setState('reconnecting', { attempt: reconnectAttempts + 1 });
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
connect();
|
|
545
|
-
}, delay);
|
|
546
|
-
} else {
|
|
547
|
-
setState('disconnected');
|
|
548
|
-
connectionReject?.(new Error('Max reconnect attempts reached'));
|
|
549
|
-
}
|
|
604
|
+
requeueOrRejectPending(false);
|
|
605
|
+
|
|
606
|
+
const delay = Math.min(
|
|
607
|
+
maxReconnectDelay,
|
|
608
|
+
reconnectDelay * Math.pow(2, Math.min(reconnectAttempts, BACKOFF_CAP_EXP)),
|
|
609
|
+
);
|
|
610
|
+
initConnectionPromise();
|
|
611
|
+
setTimeout(() => {
|
|
612
|
+
reconnectAttempts++;
|
|
613
|
+
connect();
|
|
614
|
+
}, delay);
|
|
550
615
|
});
|
|
551
616
|
|
|
552
617
|
ws.addEventListener('error', () => {
|
|
@@ -573,6 +638,9 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
573
638
|
pending.delete(id);
|
|
574
639
|
reject(new Error('Auth timeout'));
|
|
575
640
|
}, 30000),
|
|
641
|
+
serialized: '', // auth is replayed on every open, never via retryQueue
|
|
642
|
+
retry: false,
|
|
643
|
+
timeoutMs: 30000,
|
|
576
644
|
});
|
|
577
645
|
});
|
|
578
646
|
if (ws?.readyState === WebSocket.OPEN) {
|
|
@@ -585,7 +653,7 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
585
653
|
|
|
586
654
|
request(name: string, input: unknown, opts?: RequestOptions) {
|
|
587
655
|
const timeoutMs = opts?.timeoutMs === undefined ? 60000 : opts.timeoutMs;
|
|
588
|
-
return rpc('request', { name, input }, timeoutMs) as Promise<
|
|
656
|
+
return rpc('request', { name, input }, timeoutMs, opts?.retry ?? true) as Promise<
|
|
589
657
|
RequestOutput<R['requests'][typeof name]>
|
|
590
658
|
>;
|
|
591
659
|
},
|
|
@@ -688,8 +756,9 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
688
756
|
trackCallbacks.set(subId, cb as TrackCallback<unknown>);
|
|
689
757
|
subscriptionPayloads.set(subId, { type: 'trackDoc', params: { collection, id } });
|
|
690
758
|
rpc('trackDoc', { collection, id, subId }).catch((err: unknown) => {
|
|
759
|
+
// A disconnect rejection is expected — resubscribeAll re-issues this on
|
|
760
|
+
// reconnect. Log only; rethrowing would surface as an unhandled rejection.
|
|
691
761
|
console.error('[trackDoc]', err);
|
|
692
|
-
throw err;
|
|
693
762
|
});
|
|
694
763
|
return () => {
|
|
695
764
|
trackCallbacks.delete(subId);
|
|
@@ -726,8 +795,9 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
726
795
|
limit: params.limit,
|
|
727
796
|
skip: params.skip,
|
|
728
797
|
}).catch((err: unknown) => {
|
|
798
|
+
// A disconnect rejection is expected — resubscribeAll re-issues this on
|
|
799
|
+
// reconnect. Log only; rethrowing would surface as an unhandled rejection.
|
|
729
800
|
console.error('[trackDocs]', err);
|
|
730
|
-
throw err;
|
|
731
801
|
});
|
|
732
802
|
return () => {
|
|
733
803
|
trackCallbacks.delete(subId);
|
|
@@ -773,8 +843,9 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
773
843
|
limit: params.limit,
|
|
774
844
|
skip: params.skip,
|
|
775
845
|
}).catch((err: unknown) => {
|
|
846
|
+
// A disconnect rejection is expected — resubscribeAll re-issues this on
|
|
847
|
+
// reconnect. Log only; rethrowing would surface as an unhandled rejection.
|
|
776
848
|
console.error('[trackQuery]', err);
|
|
777
|
-
throw err;
|
|
778
849
|
});
|
|
779
850
|
return () => {
|
|
780
851
|
trackCallbacks.delete(subId);
|
|
@@ -828,6 +899,10 @@ export function createSocket<R extends AppRegistryBase>(
|
|
|
828
899
|
return state;
|
|
829
900
|
},
|
|
830
901
|
|
|
902
|
+
setFocused(focused: boolean) {
|
|
903
|
+
applyFocus(focused);
|
|
904
|
+
},
|
|
905
|
+
|
|
831
906
|
disconnect() {
|
|
832
907
|
drainPending('Disconnected');
|
|
833
908
|
stopPing();
|