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.
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.689";
1
+ export declare const CLI_VERSION = "0.1.690";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.689";
2
+ export const CLI_VERSION = "0.1.690";
3
3
  //# sourceMappingURL=version.js.map
@@ -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":"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"}
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.push(serialized);
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(JSON.stringify({ type: typeOrMsg, id, data }));
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, cb] of trackCallbacks) {
121
- // Re-send the subscription. The subId is encoded in the pending map key
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(JSON.stringify({ id, type, payload }));
294
+ enqueueOrSend(serialized);
251
295
  });
252
296
  }
253
- // ─── Visibility ────────────────────────────────────────────────────────────
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
- const wasVisible = isWindowFocused;
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
- for (const { reject, timeout } of pending.values()) {
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
- for (const { reject, timeout } of pending.values()) {
335
- clearTimeout(timeout);
336
- reject(new Error('WebSocket disconnected'));
337
- }
338
- pending.clear();
339
- if (reconnectAttempts < maxReconnectAttempts) {
340
- const delay = reconnectDelay * Math.pow(2, reconnectAttempts);
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.689",
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": [
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.689";
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
- { resolve: (v: unknown) => void; reject: (e: Error) => void; timeout: ReturnType<typeof setTimeout> }
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.push(serialized);
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(JSON.stringify({ type: typeOrMsg, id, data }));
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, cb] of trackCallbacks) {
285
- // Re-send the subscription. The subId is encoded in the pending map key
286
- // via the trackDoc/trackDocs closures; we re-send by using the subId directly.
287
- // Note: we stored the re-subscribe payload in subscriptionPayloads map.
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(JSON.stringify({ id, type, payload }));
511
+ enqueueOrSend(serialized);
443
512
  });
444
513
  }
445
514
 
446
- // ─── Visibility ────────────────────────────────────────────────────────────
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
- const wasVisible = isWindowFocused;
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
- for (const { reject, timeout } of pending.values()) {
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
- for (const { reject, timeout } of pending.values()) {
534
- clearTimeout(timeout);
535
- reject(new Error('WebSocket disconnected'));
536
- }
537
- pending.clear();
538
-
539
- if (reconnectAttempts < maxReconnectAttempts) {
540
- const delay = reconnectDelay * Math.pow(2, reconnectAttempts);
541
- initConnectionPromise();
542
- setTimeout(() => {
543
- reconnectAttempts++;
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();