@pollen-robotics/reachy-mini-sdk 1.10.0-dev.0.main.b50d97e → 1.10.0-dev.0.main.c8367cd

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 (128) hide show
  1. package/APP_CREATION_GUIDE.md +98 -0
  2. package/dist/lib/central-listener.d.ts +71 -0
  3. package/dist/lib/central-listener.d.ts.map +1 -0
  4. package/dist/lib/central-listener.js +277 -0
  5. package/dist/lib/central-listener.js.map +1 -0
  6. package/dist/lib/central-listener.test.d.ts +2 -0
  7. package/dist/lib/central-listener.test.d.ts.map +1 -0
  8. package/dist/lib/central-listener.test.js +378 -0
  9. package/dist/lib/central-listener.test.js.map +1 -0
  10. package/dist/lib/dc-watchdog.test.d.ts +2 -0
  11. package/dist/lib/dc-watchdog.test.d.ts.map +1 -0
  12. package/dist/lib/dc-watchdog.test.js +154 -0
  13. package/dist/lib/dc-watchdog.test.js.map +1 -0
  14. package/dist/lib/ensure-awake.test.d.ts +2 -0
  15. package/dist/lib/ensure-awake.test.d.ts.map +1 -0
  16. package/dist/lib/ensure-awake.test.js +117 -0
  17. package/dist/lib/ensure-awake.test.js.map +1 -0
  18. package/dist/lib/ice-grace.test.d.ts +2 -0
  19. package/dist/lib/ice-grace.test.d.ts.map +1 -0
  20. package/dist/lib/ice-grace.test.js +211 -0
  21. package/dist/lib/ice-grace.test.js.map +1 -0
  22. package/dist/lib/imu.test.d.ts +2 -0
  23. package/dist/lib/imu.test.d.ts.map +1 -0
  24. package/dist/lib/imu.test.js +78 -0
  25. package/dist/lib/imu.test.js.map +1 -0
  26. package/dist/lib/logger.d.ts +38 -0
  27. package/dist/lib/logger.d.ts.map +1 -0
  28. package/dist/lib/logger.js +81 -0
  29. package/dist/lib/logger.js.map +1 -0
  30. package/dist/lib/pending-replies.d.ts +127 -0
  31. package/dist/lib/pending-replies.d.ts.map +1 -0
  32. package/dist/lib/pending-replies.js +255 -0
  33. package/dist/lib/pending-replies.js.map +1 -0
  34. package/dist/lib/pending-replies.test.d.ts +2 -0
  35. package/dist/lib/pending-replies.test.d.ts.map +1 -0
  36. package/dist/lib/pending-replies.test.js +217 -0
  37. package/dist/lib/pending-replies.test.js.map +1 -0
  38. package/dist/lib/reachy-mini.d.ts +202 -88
  39. package/dist/lib/reachy-mini.d.ts.map +1 -1
  40. package/dist/lib/reachy-mini.js +651 -566
  41. package/dist/lib/reachy-mini.js.map +1 -1
  42. package/dist/lib/redial.test.d.ts +2 -0
  43. package/dist/lib/redial.test.d.ts.map +1 -0
  44. package/dist/lib/redial.test.js +206 -0
  45. package/dist/lib/redial.test.js.map +1 -0
  46. package/dist/lib/request.test.d.ts +2 -0
  47. package/dist/lib/request.test.d.ts.map +1 -0
  48. package/dist/lib/request.test.js +90 -0
  49. package/dist/lib/request.test.js.map +1 -0
  50. package/dist/lib/session-supervisor.d.ts +201 -0
  51. package/dist/lib/session-supervisor.d.ts.map +1 -0
  52. package/dist/lib/session-supervisor.js +520 -0
  53. package/dist/lib/session-supervisor.js.map +1 -0
  54. package/dist/lib/token-store.d.ts +50 -0
  55. package/dist/lib/token-store.d.ts.map +1 -0
  56. package/dist/lib/token-store.js +120 -0
  57. package/dist/lib/token-store.js.map +1 -0
  58. package/dist/lib/token-store.test.d.ts +2 -0
  59. package/dist/lib/token-store.test.d.ts.map +1 -0
  60. package/dist/lib/token-store.test.js +82 -0
  61. package/dist/lib/token-store.test.js.map +1 -0
  62. package/dist/lib/types.d.ts +280 -6
  63. package/dist/lib/types.d.ts.map +1 -1
  64. package/dist/lib/url-helpers.d.ts.map +1 -1
  65. package/dist/lib/url-helpers.js +3 -1
  66. package/dist/lib/url-helpers.js.map +1 -1
  67. package/dist/lib/version.d.ts +2 -0
  68. package/dist/lib/version.d.ts.map +1 -0
  69. package/dist/lib/version.js +5 -0
  70. package/dist/lib/version.js.map +1 -0
  71. package/dist/reachy-mini-sdk.d.ts +15 -1
  72. package/dist/reachy-mini-sdk.d.ts.map +1 -1
  73. package/dist/reachy-mini-sdk.js +12 -0
  74. package/dist/reachy-mini-sdk.js.map +1 -1
  75. package/host/dist/ReachyHost.d.ts.map +1 -1
  76. package/host/dist/chunks/centralRest-uXNMidlL.js +2315 -0
  77. package/host/dist/chunks/index-Beu4GNzi.js +821 -0
  78. package/host/dist/chunks/{mountHost-DjE5zE9R.js → mountHost-BTTF4Uu9.js} +24933 -27488
  79. package/host/dist/components/ConnectingView.d.ts.map +1 -1
  80. package/host/dist/components/DaemonUpdateGate.d.ts +65 -0
  81. package/host/dist/components/DaemonUpdateGate.d.ts.map +1 -0
  82. package/host/dist/components/ErrorView.d.ts.map +1 -1
  83. package/host/dist/components/HostErrorBoundary.d.ts +30 -0
  84. package/host/dist/components/HostErrorBoundary.d.ts.map +1 -0
  85. package/host/dist/components/LeavingView.d.ts.map +1 -1
  86. package/host/dist/components/PickerView.d.ts +16 -14
  87. package/host/dist/components/PickerView.d.ts.map +1 -1
  88. package/host/dist/components/PostOAuthSplash.d.ts +14 -9
  89. package/host/dist/components/PostOAuthSplash.d.ts.map +1 -1
  90. package/host/dist/components/ReachyHostShell.d.ts.map +1 -1
  91. package/host/dist/components/SignInView.d.ts.map +1 -1
  92. package/host/dist/components/TopBar.d.ts +5 -6
  93. package/host/dist/components/TopBar.d.ts.map +1 -1
  94. package/host/dist/components/WelcomeBackOverlay.d.ts.map +1 -1
  95. package/host/dist/embed/index.d.ts +68 -5
  96. package/host/dist/embed/index.d.ts.map +1 -1
  97. package/host/dist/entry/auto.js +2 -2
  98. package/host/dist/entry/embed.d.ts +5 -4
  99. package/host/dist/entry/embed.d.ts.map +1 -1
  100. package/host/dist/entry/embed.js +5 -4
  101. package/host/dist/hooks/useHostBridge.d.ts +35 -1
  102. package/host/dist/hooks/useHostBridge.d.ts.map +1 -1
  103. package/host/dist/hooks/useLatestDaemonVersion.d.ts +7 -0
  104. package/host/dist/hooks/useLatestDaemonVersion.d.ts.map +1 -0
  105. package/host/dist/hooks/useOAuth.d.ts +18 -0
  106. package/host/dist/hooks/useOAuth.d.ts.map +1 -1
  107. package/host/dist/hooks/useRobots.d.ts +0 -2
  108. package/host/dist/hooks/useRobots.d.ts.map +1 -1
  109. package/host/dist/index.d.ts +2 -2
  110. package/host/dist/index.d.ts.map +1 -1
  111. package/host/dist/index.js +11 -10
  112. package/host/dist/lib/daemonRelease.d.ts +84 -0
  113. package/host/dist/lib/daemonRelease.d.ts.map +1 -0
  114. package/host/dist/lib/protocol.d.ts +141 -7
  115. package/host/dist/lib/protocol.d.ts.map +1 -1
  116. package/host/dist/lib/rebootWatch.d.ts +51 -0
  117. package/host/dist/lib/rebootWatch.d.ts.map +1 -0
  118. package/host/dist/lib/sdk-types.d.ts +1 -1
  119. package/host/dist/lib/sdk-types.d.ts.map +1 -1
  120. package/host/dist/lib/sdkStaleness.d.ts +78 -0
  121. package/host/dist/lib/sdkStaleness.d.ts.map +1 -0
  122. package/host/dist/lib/settings.d.ts +16 -5
  123. package/host/dist/lib/settings.d.ts.map +1 -1
  124. package/package.json +11 -4
  125. package/host/dist/chunks/index-lMs2sCXG.js +0 -439
  126. package/host/dist/chunks/reachy-mini-CdsdQLIU.js +0 -1523
  127. package/host/dist/lib/centralListener.d.ts +0 -73
  128. package/host/dist/lib/centralListener.d.ts.map +0 -1
@@ -0,0 +1,378 @@
1
+ /**
2
+ * Central-listener tests: the shared fleet-watching SSE channel
3
+ * (roles=["listener"]) consumed by the host picker and the mobile
4
+ * scan screen.
5
+ *
6
+ * Properties that must hold:
7
+ * - registration (`setPeerStatus`) lands BEFORE `onConnect` fires,
8
+ * so consumers can trust the listener slot exists when they react;
9
+ * - a silent server-side TTL eviction (heartbeat POST → 4xx) tears
10
+ * the half-open SSE down and reconnects - the regression that
11
+ * motivated moving this into the SDK;
12
+ * - transient failures retry with exponential backoff, fatal auth
13
+ * failures (401/403) do NOT retry;
14
+ * - `close()` is idempotent and no callback ever fires after it.
15
+ *
16
+ * The fetch mock distinguishes the two wire surfaces: GET /events
17
+ * (long-lived SSE stream, hand-rolled reader) and POST /send
18
+ * (registration + heartbeat).
19
+ */
20
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
21
+ import { openCentralListener, } from './central-listener.js';
22
+ const SIGNALING_URL = 'https://central.test';
23
+ let eventsConns;
24
+ let sendCalls;
25
+ /** Status served to the next GET /events (then reset to 200). */
26
+ let nextEventsStatus;
27
+ /** Status served to every POST /send. */
28
+ let sendStatus;
29
+ /** When set, /send responses are parked until the test releases them. */
30
+ let deferSend;
31
+ let releaseSend;
32
+ function makeEventsResponse(signal) {
33
+ const encoder = new TextEncoder();
34
+ const queue = [];
35
+ let waiter = null;
36
+ let rejecter = null;
37
+ signal.addEventListener('abort', () => {
38
+ rejecter?.(new DOMException('The operation was aborted.', 'AbortError'));
39
+ rejecter = null;
40
+ waiter = null;
41
+ });
42
+ const conn = {
43
+ push(msg) {
44
+ const item = {
45
+ done: false,
46
+ value: encoder.encode(`data: ${JSON.stringify(msg)}\n`),
47
+ };
48
+ if (waiter) {
49
+ const w = waiter;
50
+ waiter = null;
51
+ rejecter = null;
52
+ w(item);
53
+ }
54
+ else {
55
+ queue.push(item);
56
+ }
57
+ },
58
+ end() {
59
+ const item = { done: true, value: undefined };
60
+ if (waiter) {
61
+ const w = waiter;
62
+ waiter = null;
63
+ rejecter = null;
64
+ w(item);
65
+ }
66
+ else {
67
+ queue.push(item);
68
+ }
69
+ },
70
+ };
71
+ eventsConns.push(conn);
72
+ const reader = {
73
+ read() {
74
+ if (signal.aborted) {
75
+ return Promise.reject(new DOMException('The operation was aborted.', 'AbortError'));
76
+ }
77
+ const item = queue.shift();
78
+ if (item)
79
+ return Promise.resolve(item);
80
+ return new Promise((resolve, reject) => {
81
+ waiter = resolve;
82
+ rejecter = reject;
83
+ });
84
+ },
85
+ };
86
+ return {
87
+ ok: true,
88
+ status: 200,
89
+ body: { getReader: () => reader },
90
+ };
91
+ }
92
+ function installFetchMock() {
93
+ vi.stubGlobal('fetch', vi.fn(async (input, init) => {
94
+ const url = String(input);
95
+ if (url.endsWith('/events')) {
96
+ const status = nextEventsStatus;
97
+ nextEventsStatus = 200;
98
+ if (status !== 200) {
99
+ return { ok: false, status, body: null };
100
+ }
101
+ // openCentralListener always passes a signal for /events.
102
+ return makeEventsResponse(init.signal);
103
+ }
104
+ if (url.endsWith('/send')) {
105
+ sendCalls.push({ body: JSON.parse(String(init?.body)) });
106
+ const respond = () => ({ ok: sendStatus < 400, status: sendStatus });
107
+ if (deferSend) {
108
+ return new Promise((resolve) => {
109
+ releaseSend.push(() => resolve(respond()));
110
+ });
111
+ }
112
+ return respond();
113
+ }
114
+ throw new Error(`unexpected fetch: ${url}`);
115
+ }));
116
+ }
117
+ /** Flush pending microtasks (mock fetch resolves in microtasks). */
118
+ async function flush() {
119
+ for (let i = 0; i < 10; i++)
120
+ await Promise.resolve();
121
+ }
122
+ /** Strict accessor for the i-th /events connection. */
123
+ function conn(i) {
124
+ const c = eventsConns[i];
125
+ if (!c)
126
+ throw new Error(`no /events connection #${i}`);
127
+ return c;
128
+ }
129
+ /** Strict accessor for the i-th /send call. */
130
+ function sent(i) {
131
+ const c = sendCalls[i];
132
+ if (!c)
133
+ throw new Error(`no /send call #${i}`);
134
+ return c;
135
+ }
136
+ let handle = null;
137
+ beforeEach(() => {
138
+ vi.useFakeTimers();
139
+ // Kill backoff jitter: Math.random()=0.5 → jitter term is exactly 0,
140
+ // so reconnect delays equal the nominal backoff (1s, 2s, 4s, ...).
141
+ vi.spyOn(Math, 'random').mockReturnValue(0.5);
142
+ eventsConns = [];
143
+ sendCalls = [];
144
+ nextEventsStatus = 200;
145
+ sendStatus = 200;
146
+ deferSend = false;
147
+ releaseSend = [];
148
+ installFetchMock();
149
+ });
150
+ afterEach(() => {
151
+ handle?.close();
152
+ handle = null;
153
+ vi.useRealTimers();
154
+ vi.unstubAllGlobals();
155
+ vi.restoreAllMocks();
156
+ });
157
+ function open(callbacks = {}) {
158
+ handle = openCentralListener({
159
+ token: 'hf_test',
160
+ signalingUrl: SIGNALING_URL,
161
+ appName: 'Test Listener',
162
+ ...callbacks,
163
+ });
164
+ return handle;
165
+ }
166
+ // ─────────────────────────────────────────────────────────────────
167
+ // Registration & connect ordering
168
+ // ─────────────────────────────────────────────────────────────────
169
+ describe('registration', () => {
170
+ it('registers as listener after welcome, then reports connected', async () => {
171
+ const onConnect = vi.fn();
172
+ open({ onConnect });
173
+ await flush();
174
+ expect(eventsConns).toHaveLength(1);
175
+ expect(sendCalls).toHaveLength(0);
176
+ deferSend = true;
177
+ conn(0).push({ type: 'welcome' });
178
+ await flush();
179
+ // Registration POST is in flight; connect must NOT be reported yet.
180
+ expect(sendCalls).toHaveLength(1);
181
+ expect(sent(0).body).toMatchObject({
182
+ type: 'setPeerStatus',
183
+ roles: ['listener'],
184
+ meta: { name: 'Test Listener' },
185
+ });
186
+ expect(onConnect).not.toHaveBeenCalled();
187
+ releaseSend.shift()();
188
+ await flush();
189
+ expect(onConnect).toHaveBeenCalledTimes(1);
190
+ });
191
+ });
192
+ // ─────────────────────────────────────────────────────────────────
193
+ // Event dispatch
194
+ // ─────────────────────────────────────────────────────────────────
195
+ describe('event dispatch', () => {
196
+ it('parses list / peerStatusChanged / sessionStateChanged frames', async () => {
197
+ const onList = vi.fn();
198
+ const onPeerStatusChanged = vi.fn();
199
+ const onSessionStateChanged = vi.fn();
200
+ open({ onList, onPeerStatusChanged, onSessionStateChanged });
201
+ await flush();
202
+ const c = conn(0);
203
+ c.push({ type: 'welcome' });
204
+ c.push({
205
+ type: 'list',
206
+ producers: [{ id: 'robot-1', meta: { name: 'Reachy' }, busy: false }],
207
+ });
208
+ c.push({ type: 'peerStatusChanged', peerId: 'robot-1', roles: [] });
209
+ c.push({
210
+ type: 'sessionStateChanged',
211
+ peerId: 'robot-1',
212
+ busy: true,
213
+ activeApp: 'conversation',
214
+ });
215
+ await flush();
216
+ expect(onList).toHaveBeenCalledWith([
217
+ { id: 'robot-1', meta: { name: 'Reachy' }, busy: false },
218
+ ]);
219
+ expect(onPeerStatusChanged).toHaveBeenCalledWith(expect.objectContaining({ peerId: 'robot-1', roles: [] }));
220
+ expect(onSessionStateChanged).toHaveBeenCalledWith(expect.objectContaining({
221
+ peerId: 'robot-1',
222
+ busy: true,
223
+ activeApp: 'conversation',
224
+ }));
225
+ });
226
+ it('ignores unknown frame types and unparsable payloads', async () => {
227
+ const onError = vi.fn();
228
+ const onList = vi.fn();
229
+ open({ onError, onList });
230
+ await flush();
231
+ const c = conn(0);
232
+ c.push({ type: 'ping' });
233
+ await flush();
234
+ expect(onError).not.toHaveBeenCalled();
235
+ expect(onList).not.toHaveBeenCalled();
236
+ });
237
+ });
238
+ // ─────────────────────────────────────────────────────────────────
239
+ // Reconnect policy
240
+ // ─────────────────────────────────────────────────────────────────
241
+ describe('reconnect', () => {
242
+ it('reconnects after a clean EOF and resets backoff on welcome', async () => {
243
+ const onDisconnect = vi.fn();
244
+ open({ onDisconnect });
245
+ await flush();
246
+ conn(0).push({ type: 'welcome' });
247
+ await flush();
248
+ conn(0).end();
249
+ await flush();
250
+ expect(onDisconnect).toHaveBeenCalledWith('stream ended');
251
+ // Nominal first backoff: 1 s (jitter zeroed in beforeEach).
252
+ await vi.advanceTimersByTimeAsync(1_000);
253
+ await flush();
254
+ expect(eventsConns).toHaveLength(2);
255
+ // Welcome on the new stream resets backoff → next drop retries
256
+ // after 1 s again, not 2 s.
257
+ conn(1).push({ type: 'welcome' });
258
+ await flush();
259
+ conn(1).end();
260
+ await flush();
261
+ await vi.advanceTimersByTimeAsync(1_000);
262
+ await flush();
263
+ expect(eventsConns).toHaveLength(3);
264
+ });
265
+ it('doubles the backoff while central stays down', async () => {
266
+ nextEventsStatus = 503;
267
+ open({});
268
+ await flush();
269
+ expect(eventsConns).toHaveLength(0);
270
+ // Attempt 2 after 1 s - fails again (503).
271
+ nextEventsStatus = 503;
272
+ await vi.advanceTimersByTimeAsync(1_000);
273
+ await flush();
274
+ // Attempt 3 only after 2 more seconds.
275
+ await vi.advanceTimersByTimeAsync(1_999);
276
+ await flush();
277
+ expect(eventsConns).toHaveLength(0);
278
+ await vi.advanceTimersByTimeAsync(1);
279
+ await flush();
280
+ expect(eventsConns).toHaveLength(1);
281
+ });
282
+ it('treats 401 as fatal: no retry, auth_rejected surfaced', async () => {
283
+ const onError = vi.fn();
284
+ const onDisconnect = vi.fn();
285
+ nextEventsStatus = 401;
286
+ open({ onError, onDisconnect });
287
+ await flush();
288
+ expect(onError).toHaveBeenCalledTimes(1);
289
+ expect(String(onError.mock.calls[0]?.[0])).toContain('401');
290
+ expect(onDisconnect).toHaveBeenCalledWith('auth_rejected');
291
+ await vi.advanceTimersByTimeAsync(120_000);
292
+ await flush();
293
+ expect(eventsConns).toHaveLength(0);
294
+ });
295
+ });
296
+ // ─────────────────────────────────────────────────────────────────
297
+ // Heartbeat & TTL eviction
298
+ // ─────────────────────────────────────────────────────────────────
299
+ describe('heartbeat', () => {
300
+ it('re-emits setPeerStatus at the cadence negotiated in welcome', async () => {
301
+ open({});
302
+ await flush();
303
+ conn(0).push({
304
+ type: 'welcome',
305
+ recommended_heartbeat_interval_seconds: 5,
306
+ });
307
+ await flush();
308
+ expect(sendCalls).toHaveLength(1); // initial registration
309
+ await vi.advanceTimersByTimeAsync(5_000);
310
+ await flush();
311
+ expect(sendCalls).toHaveLength(2);
312
+ await vi.advanceTimersByTimeAsync(5_000);
313
+ await flush();
314
+ expect(sendCalls).toHaveLength(3);
315
+ });
316
+ it('falls back to lease_seconds / 3 when no explicit cadence', async () => {
317
+ open({});
318
+ await flush();
319
+ conn(0).push({ type: 'welcome', lease_seconds: 30 });
320
+ await flush();
321
+ expect(sendCalls).toHaveLength(1);
322
+ await vi.advanceTimersByTimeAsync(10_000);
323
+ await flush();
324
+ expect(sendCalls).toHaveLength(2);
325
+ });
326
+ it('reconnects when a heartbeat reveals a server-side eviction', async () => {
327
+ const onDisconnect = vi.fn();
328
+ open({ onDisconnect });
329
+ await flush();
330
+ conn(0).push({
331
+ type: 'welcome',
332
+ recommended_heartbeat_interval_seconds: 5,
333
+ });
334
+ await flush();
335
+ // TTL sweeper reaped us server-side: next heartbeat gets a 400.
336
+ sendStatus = 400;
337
+ await vi.advanceTimersByTimeAsync(5_000);
338
+ await flush();
339
+ expect(onDisconnect).toHaveBeenCalledWith('listener evicted (HTTP 400)');
340
+ // A fresh stream is minted after the backoff.
341
+ sendStatus = 200;
342
+ await vi.advanceTimersByTimeAsync(1_000);
343
+ await flush();
344
+ expect(eventsConns).toHaveLength(2);
345
+ conn(1).push({ type: 'welcome' });
346
+ await flush();
347
+ // Re-registration on the new stream.
348
+ expect(sendCalls.length).toBeGreaterThanOrEqual(3);
349
+ });
350
+ });
351
+ // ─────────────────────────────────────────────────────────────────
352
+ // close()
353
+ // ─────────────────────────────────────────────────────────────────
354
+ describe('close', () => {
355
+ it('is idempotent and silences every callback', async () => {
356
+ const onList = vi.fn();
357
+ const onDisconnect = vi.fn();
358
+ const h = open({ onList, onDisconnect });
359
+ await flush();
360
+ conn(0).push({
361
+ type: 'welcome',
362
+ recommended_heartbeat_interval_seconds: 5,
363
+ });
364
+ await flush();
365
+ const sendsBefore = sendCalls.length;
366
+ h.close();
367
+ h.close();
368
+ conn(0).push({ type: 'list', producers: [] });
369
+ await flush();
370
+ await vi.advanceTimersByTimeAsync(60_000);
371
+ await flush();
372
+ expect(onList).not.toHaveBeenCalled();
373
+ expect(onDisconnect).not.toHaveBeenCalled();
374
+ expect(sendCalls).toHaveLength(sendsBefore); // heartbeat stopped
375
+ expect(eventsConns).toHaveLength(1); // no reconnect
376
+ });
377
+ });
378
+ //# sourceMappingURL=central-listener.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"central-listener.test.js","sourceRoot":"","sources":["../../lib/central-listener.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dc-watchdog.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dc-watchdog.test.d.ts","sourceRoot":"","sources":["../../lib/dc-watchdog.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Data-channel silence watchdog tests.
3
+ *
4
+ * The properties that must hold:
5
+ * - inbound traffic keeps the watchdog quiet (no nudge, no escalation);
6
+ * - past DC_SILENCE_NUDGE_MS with no traffic, exactly one extra
7
+ * `get_state` nudge goes out; a reply resets the cycle;
8
+ * - past DC_SILENCE_FATAL_MS of TOTAL silence the transport is dead:
9
+ * hand over to the auto re-dial when enabled, else emit the fatal
10
+ * `error`;
11
+ * - a large gap between ticks (throttled / suspended timer) re-baselines
12
+ * instead of judging stale data;
13
+ * - stopSession() stops the watchdog.
14
+ *
15
+ * Same testing approach as redial.test.ts: private surface + stubbed
16
+ * network, fake timers (which also fake Date.now, so silence accrues
17
+ * exactly as fast as the advanced clock).
18
+ */
19
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
20
+ import { ReachyMini } from './reachy-mini.js';
21
+ function makeStreamingInstance(options = {}) {
22
+ const r = new ReachyMini(options);
23
+ const internals = r;
24
+ internals._state = 'streaming';
25
+ internals._selectedRobotId = 'robot-1';
26
+ internals._sessionId = 'session-1';
27
+ internals._sessionResolve = null;
28
+ internals._sessionReject = null;
29
+ internals._pc = { close: vi.fn() };
30
+ internals._token = 'hf_test';
31
+ internals._sendToServer = vi.fn().mockResolvedValue(null);
32
+ const nudges = vi.fn().mockReturnValue(true);
33
+ internals.requestState = nudges;
34
+ const dials = vi.fn().mockResolvedValue(undefined);
35
+ internals._startSessionInternal =
36
+ dials;
37
+ return { r, internals, nudges, dials };
38
+ }
39
+ function events(r, name) {
40
+ const seen = [];
41
+ r.addEventListener(name, (e) => {
42
+ seen.push(e.detail ?? {});
43
+ });
44
+ return seen;
45
+ }
46
+ beforeEach(() => {
47
+ vi.useFakeTimers();
48
+ });
49
+ afterEach(() => {
50
+ vi.useRealTimers();
51
+ });
52
+ describe('dc silence watchdog - quiet on a healthy link', () => {
53
+ it('never nudges nor escalates while traffic flows', async () => {
54
+ const { r, internals, nudges } = makeStreamingInstance();
55
+ const errors = events(r, 'error');
56
+ internals._supervisor.startDcWatchdog();
57
+ // 12 s of clock with a message every 500 ms, like the real poll.
58
+ for (let i = 0; i < 24; i++) {
59
+ await vi.advanceTimersByTimeAsync(500);
60
+ internals._handleRobotMessage({});
61
+ }
62
+ expect(nudges).not.toHaveBeenCalled();
63
+ expect(errors).toEqual([]);
64
+ expect(internals._supervisor.redialing).toBe(false);
65
+ internals._supervisor.stopDcWatchdog();
66
+ });
67
+ it('a reply to the nudge resets the cycle without escalating', async () => {
68
+ const { r, internals, nudges } = makeStreamingInstance();
69
+ const errors = events(r, 'error');
70
+ internals._supervisor.startDcWatchdog();
71
+ // Cross the nudge threshold in silence…
72
+ await vi.advanceTimersByTimeAsync(3000);
73
+ expect(nudges).toHaveBeenCalledTimes(1);
74
+ // …then the daemon answers.
75
+ internals._handleRobotMessage({});
76
+ // Well past the original fatal deadline: no escalation, and the
77
+ // next silent window starts a fresh nudge cycle.
78
+ await vi.advanceTimersByTimeAsync(3000);
79
+ expect(nudges).toHaveBeenCalledTimes(2);
80
+ expect(errors).toEqual([]);
81
+ expect(internals._supervisor.redialing).toBe(false);
82
+ internals._supervisor.stopDcWatchdog();
83
+ });
84
+ });
85
+ describe('dc silence watchdog - dead transport escalation', () => {
86
+ it('hands a silent transport over to the auto re-dial', async () => {
87
+ const { r, internals, nudges, dials } = makeStreamingInstance();
88
+ const reconnecting = events(r, 'sessionReconnecting');
89
+ const reconnected = events(r, 'sessionReconnected');
90
+ internals._supervisor.startDcWatchdog();
91
+ // Total silence past the fatal threshold, then let the re-dial
92
+ // loop run to completion (stubbed dial succeeds immediately).
93
+ await vi.advanceTimersByTimeAsync(20_000);
94
+ expect(nudges).toHaveBeenCalledTimes(1);
95
+ expect(dials).toHaveBeenCalledWith('robot-1');
96
+ expect(reconnecting).toHaveLength(1);
97
+ expect(String(reconnecting[0].cause)).toMatch(/No data-channel traffic/);
98
+ expect(reconnected).toEqual([{ attempt: 1 }]);
99
+ });
100
+ it('falls back to the fatal error when autoReconnect is off', async () => {
101
+ const { r, internals } = makeStreamingInstance({ autoReconnect: false });
102
+ const errors = events(r, 'error');
103
+ internals._supervisor.startDcWatchdog();
104
+ await vi.advanceTimersByTimeAsync(10_000);
105
+ expect(errors).toHaveLength(1);
106
+ expect(String(errors[0].error.message)).toMatch(/No data-channel traffic/);
107
+ expect(internals._supervisor.redialing).toBe(false);
108
+ // The fatal path stands the watchdog down: even a full extra
109
+ // escalation cycle (nudge at 2.5 s, fatal at 8 s) later, the
110
+ // error fired exactly once. Regression guard for the loop where
111
+ // the interval kept running and re-emitted every ~8 s forever.
112
+ await vi.advanceTimersByTimeAsync(10_000);
113
+ expect(errors).toHaveLength(1);
114
+ internals._supervisor.stopDcWatchdog();
115
+ });
116
+ });
117
+ describe('dc silence watchdog - throttled-timer awareness', () => {
118
+ it('re-baselines instead of judging after a large tick gap', async () => {
119
+ const { r, internals, nudges } = makeStreamingInstance();
120
+ const errors = events(r, 'error');
121
+ internals._supervisor.startDcWatchdog();
122
+ // Simulate a suspended tab: the interval did not fire for 30 s
123
+ // and no message was stamped either.
124
+ const clock = internals._supervisor;
125
+ clock._dcWatchdogLastTickAt -= 30_000;
126
+ clock._lastDcInboundAt -= 30_000;
127
+ await vi.advanceTimersByTimeAsync(1000);
128
+ // The gap tick re-baselined: no nudge, no error, and the silence
129
+ // clock restarts from the resume point.
130
+ expect(nudges).not.toHaveBeenCalled();
131
+ expect(errors).toEqual([]);
132
+ expect(internals._supervisor.redialing).toBe(false);
133
+ internals._supervisor.stopDcWatchdog();
134
+ });
135
+ });
136
+ describe('dc silence watchdog - lifecycle', () => {
137
+ it('stopSession() stops the watchdog', async () => {
138
+ const { r, internals, nudges } = makeStreamingInstance();
139
+ internals._supervisor.startDcWatchdog();
140
+ await r.stopSession();
141
+ await vi.advanceTimersByTimeAsync(20_000);
142
+ expect(nudges).not.toHaveBeenCalled();
143
+ expect(internals._supervisor.redialing).toBe(false);
144
+ });
145
+ it('ignores silence when the session is not streaming', async () => {
146
+ const { internals, nudges } = makeStreamingInstance();
147
+ internals._supervisor.startDcWatchdog();
148
+ internals._state = 'connected';
149
+ await vi.advanceTimersByTimeAsync(20_000);
150
+ expect(nudges).not.toHaveBeenCalled();
151
+ internals._supervisor.stopDcWatchdog();
152
+ });
153
+ });
154
+ //# sourceMappingURL=dc-watchdog.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dc-watchdog.test.js","sourceRoot":"","sources":["../../lib/dc-watchdog.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ensure-awake.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-awake.test.d.ts","sourceRoot":"","sources":["../../lib/ensure-awake.test.ts"],"names":[],"mappings":""}