@pollen-robotics/reachy-mini-sdk 1.13.0-dev.0.main.55a68f6 → 1.13.0-dev.0.main.5b43130
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/lib/ice-grace.test.js +1 -0
- package/dist/lib/ice-grace.test.js.map +1 -1
- package/dist/lib/peer-link-liveness.test.d.ts +2 -0
- package/dist/lib/peer-link-liveness.test.d.ts.map +1 -0
- package/dist/lib/peer-link-liveness.test.js +97 -0
- package/dist/lib/peer-link-liveness.test.js.map +1 -0
- package/dist/lib/reachy-mini.d.ts +48 -0
- package/dist/lib/reachy-mini.d.ts.map +1 -1
- package/dist/lib/reachy-mini.js +220 -20
- package/dist/lib/reachy-mini.js.map +1 -1
- package/dist/lib/redial.test.js +59 -0
- package/dist/lib/redial.test.js.map +1 -1
- package/dist/lib/session-supervisor.d.ts +10 -0
- package/dist/lib/session-supervisor.d.ts.map +1 -1
- package/dist/lib/session-supervisor.js +12 -1
- package/dist/lib/session-supervisor.js.map +1 -1
- package/dist/lib/types.d.ts +21 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.js +1 -1
- package/host/dist/chunks/{centralRest-Bf6BR9KA.js → centralRest-DC7tdRoU.js} +733 -630
- package/host/dist/chunks/{index-B5svCSPt.js → index-anGuuiyy.js} +1 -1
- package/host/dist/chunks/{mountHost-B2Eh6aMK.js → mountHost-BwwcWpXd.js} +1 -1
- package/host/dist/entry/auto.js +2 -2
- package/host/dist/entry/embed.js +2 -2
- package/host/dist/index.js +3 -3
- package/package.json +1 -1
|
@@ -31,6 +31,7 @@ function makeSupervisor(overrides = {}, options = { autoReconnect: true }) {
|
|
|
31
31
|
rejectPendingSession: vi.fn().mockReturnValue(false),
|
|
32
32
|
reconnectSignaling: vi.fn().mockResolvedValue(undefined),
|
|
33
33
|
dial: vi.fn().mockResolvedValue(undefined),
|
|
34
|
+
redialTargetResolver: vi.fn((id) => () => id),
|
|
34
35
|
teardownForRedial: vi.fn(),
|
|
35
36
|
nudgeState: vi.fn(),
|
|
36
37
|
emit: vi.fn(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ice-grace.test.js","sourceRoot":"","sources":["../../lib/ice-grace.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ice-grace.test.js","sourceRoot":"","sources":["../../lib/ice-grace.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-link-liveness.test.d.ts","sourceRoot":"","sources":["../../lib/peer-link-liveness.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session liveness follows the peer-to-peer link, not central's signaling.
|
|
3
|
+
*
|
|
4
|
+
* The properties that must hold:
|
|
5
|
+
* - a reason-less endSession from central (its own eviction after our
|
|
6
|
+
* signaling timed out) is advisory while the peer link is live;
|
|
7
|
+
* - an endSession with a reason, or one arriving on an idle link, still
|
|
8
|
+
* ends the session;
|
|
9
|
+
* - losing signaling while streaming keeps the session (state stays
|
|
10
|
+
* `streaming`) and reconnects signaling in the background.
|
|
11
|
+
*/
|
|
12
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
13
|
+
import { ReachyMini } from './reachy-mini.js';
|
|
14
|
+
function liveSession() {
|
|
15
|
+
const r = new ReachyMini();
|
|
16
|
+
const s = r;
|
|
17
|
+
s._state = 'streaming';
|
|
18
|
+
s._sessionId = 'central-1';
|
|
19
|
+
s._dcOpen = true;
|
|
20
|
+
s._dc = { readyState: 'open', close: vi.fn() };
|
|
21
|
+
s._pc = { iceConnectionState: 'connected', close: vi.fn() };
|
|
22
|
+
s._token = 'hf_test';
|
|
23
|
+
s._sendToServer = vi.fn().mockResolvedValue(null);
|
|
24
|
+
s._supervisor.stampDcInbound();
|
|
25
|
+
return { r, s };
|
|
26
|
+
}
|
|
27
|
+
function events(r, name) {
|
|
28
|
+
const seen = [];
|
|
29
|
+
r.addEventListener(name, (e) => seen.push(e.detail));
|
|
30
|
+
return seen;
|
|
31
|
+
}
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
vi.useFakeTimers();
|
|
34
|
+
});
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
vi.useRealTimers();
|
|
37
|
+
vi.unstubAllGlobals();
|
|
38
|
+
});
|
|
39
|
+
describe('central endSession on a streaming session', () => {
|
|
40
|
+
it('is advisory without a reason while the peer link is live', () => {
|
|
41
|
+
const { r, s } = liveSession();
|
|
42
|
+
const stopped = events(r, 'sessionStopped');
|
|
43
|
+
const advisory = events(r, 'signalingSessionEnded');
|
|
44
|
+
s._handleEndSession({ type: 'endSession', sessionId: 'central-1' });
|
|
45
|
+
expect(stopped).toEqual([]);
|
|
46
|
+
expect(advisory).toEqual([{ reason: null }]);
|
|
47
|
+
expect(s._state).toBe('streaming');
|
|
48
|
+
expect(s._sessionId).toBeNull(); // stale on central now
|
|
49
|
+
});
|
|
50
|
+
it('ends the session when it carries a reason', () => {
|
|
51
|
+
const { r, s } = liveSession();
|
|
52
|
+
const stopped = events(r, 'sessionStopped');
|
|
53
|
+
s._handleEndSession({ type: 'endSession', sessionId: 'central-1', reason: 'local_app_started' });
|
|
54
|
+
// Exactly one event, with the robot's reason (no extra `user` one).
|
|
55
|
+
expect(stopped).toEqual([{ reason: 'local_app_started', message: 'Disconnected: a local Python app started on the robot' }]);
|
|
56
|
+
expect(s._state).toBe('connected');
|
|
57
|
+
});
|
|
58
|
+
it('ends the session when the peer link has gone quiet', () => {
|
|
59
|
+
const { r, s } = liveSession();
|
|
60
|
+
const stopped = events(r, 'sessionStopped');
|
|
61
|
+
vi.advanceTimersByTime(10_000); // nothing heard from the robot
|
|
62
|
+
s._handleEndSession({ type: 'endSession', sessionId: 'central-1' });
|
|
63
|
+
expect(stopped[0]).toMatchObject({ reason: 'remote_end' });
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('signaling loss while streaming', () => {
|
|
67
|
+
function sseResponse(lines) {
|
|
68
|
+
const body = new ReadableStream({
|
|
69
|
+
start(controller) {
|
|
70
|
+
for (const l of lines)
|
|
71
|
+
controller.enqueue(new TextEncoder().encode(l));
|
|
72
|
+
controller.close();
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
return new Response(body, { status: 200 });
|
|
76
|
+
}
|
|
77
|
+
it('keeps the session and reconnects signaling in the background', async () => {
|
|
78
|
+
const { r, s } = liveSession();
|
|
79
|
+
const lost = events(r, 'signalingLost');
|
|
80
|
+
const restored = events(r, 'signalingRestored');
|
|
81
|
+
const disconnected = events(r, 'disconnected');
|
|
82
|
+
const fetchMock = vi.fn().mockResolvedValue(sseResponse(['data: {"type":"welcome","peerId":"me"}\n']));
|
|
83
|
+
vi.stubGlobal('fetch', fetchMock);
|
|
84
|
+
// A stream that welcomes us and then ends: the drop happens mid-session.
|
|
85
|
+
await s._openSignaling();
|
|
86
|
+
await vi.advanceTimersByTimeAsync(0);
|
|
87
|
+
expect(restored).toEqual([{ peerId: 'me' }]);
|
|
88
|
+
expect(lost).toEqual([{ reason: 'SSE closed' }]);
|
|
89
|
+
expect(disconnected).toEqual([]);
|
|
90
|
+
expect(s._state).toBe('streaming');
|
|
91
|
+
expect(s._signalingDown).toBe(true);
|
|
92
|
+
// The background retry dials central again after a short backoff.
|
|
93
|
+
await vi.advanceTimersByTimeAsync(1_000);
|
|
94
|
+
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=peer-link-liveness.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-link-liveness.test.js","sourceRoot":"","sources":["../../lib/peer-link-liveness.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,15 @@ export declare class ReachyMini extends EventTarget implements ReachyMiniInstanc
|
|
|
31
31
|
_micStream: MediaStream | null;
|
|
32
32
|
private _robotAudioTrack;
|
|
33
33
|
private _outgoingAudioTrack;
|
|
34
|
+
/** Context driving the silent placeholder track; closed with it. */
|
|
35
|
+
private _micCtx;
|
|
36
|
+
/** Robot dialed last and its stable identity (see `_redialTargetResolver`). */
|
|
37
|
+
private _dialedRobotId;
|
|
38
|
+
private _dialedRobotIdentity;
|
|
39
|
+
/** Signaling (SSE) dropped while streaming; reconnecting in the background. */
|
|
40
|
+
private _signalingDown;
|
|
41
|
+
private _signalingRetryTimer;
|
|
42
|
+
private _signalingRetryAttempt;
|
|
34
43
|
private _micMuted;
|
|
35
44
|
private _audioMuted;
|
|
36
45
|
private _micSupported;
|
|
@@ -94,6 +103,12 @@ export declare class ReachyMini extends EventTarget implements ReachyMiniInstanc
|
|
|
94
103
|
login(options?: LoginOptions): Promise<void>;
|
|
95
104
|
logout(): void;
|
|
96
105
|
connect(token?: string): Promise<void>;
|
|
106
|
+
/**
|
|
107
|
+
* Open the signaling SSE stream and resolve on central's `welcome`.
|
|
108
|
+
* Shared by `connect()` and the background reconnect that runs while a
|
|
109
|
+
* session keeps streaming without signaling (see `signalingLost`).
|
|
110
|
+
*/
|
|
111
|
+
private _openSignaling;
|
|
97
112
|
autoConnect(options?: AutoConnectOptions): Promise<AutoConnectResult>;
|
|
98
113
|
private _fetchOwnedRobots;
|
|
99
114
|
private _waitForRobotInList;
|
|
@@ -139,7 +154,40 @@ export declare class ReachyMini extends EventTarget implements ReachyMiniInstanc
|
|
|
139
154
|
* armed, and a late signaling reply could otherwise settle them
|
|
140
155
|
* against a closed pc).
|
|
141
156
|
*/
|
|
157
|
+
/**
|
|
158
|
+
* Resolver for the redial loop. Matches on the robot's stable
|
|
159
|
+
* identity (`install_id`, else `hardware_id`; never the name, which
|
|
160
|
+
* users often leave at the default and share across robots). A
|
|
161
|
+
* listed robot with that identity under a NEW id is the same robot,
|
|
162
|
+
* re-registered; otherwise keep dialing the original id.
|
|
163
|
+
*/
|
|
164
|
+
private _redialTargetResolver;
|
|
165
|
+
/**
|
|
166
|
+
* Stop the placeholder sender track AND close its AudioContext.
|
|
167
|
+
* Stopping the track alone left the context (and its oscillator)
|
|
168
|
+
* running: one leaked context per dial, and browsers cap open audio
|
|
169
|
+
* outputs (Chromium: 10 per page), so after a few re-dials every
|
|
170
|
+
* new AudioContext in the host app fails silently.
|
|
171
|
+
*/
|
|
172
|
+
private _releaseMicPlaceholder;
|
|
142
173
|
private _teardownForRedial;
|
|
174
|
+
/**
|
|
175
|
+
* The robot (or central on its behalf) ended a streaming session:
|
|
176
|
+
* tear our side down and emit ONE `sessionStopped` carrying the
|
|
177
|
+
* robot's reason (`stopSession()` would add a second, `user`, one).
|
|
178
|
+
* No endSession goes back: the other side already ended it.
|
|
179
|
+
*/
|
|
180
|
+
private _endedByRobot;
|
|
181
|
+
/** Session over while signaling is down: surface the real state. */
|
|
182
|
+
private _dropToDisconnectedIfSignalingDown;
|
|
183
|
+
private _clearSignalingRetry;
|
|
184
|
+
/** Background signaling reconnect while a session keeps streaming. */
|
|
185
|
+
private _scheduleSignalingRetry;
|
|
186
|
+
/**
|
|
187
|
+
* Liveness of the peer link itself: data channel open, ICE up, and the
|
|
188
|
+
* robot heard from recently (it answers the ~500 ms state poll).
|
|
189
|
+
*/
|
|
190
|
+
private _peerLinkLive;
|
|
143
191
|
/**
|
|
144
192
|
* Atomic raw-units pose update over the data channel. Channels you
|
|
145
193
|
* omit are held at their last commanded value (per-axis, independent).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reachy-mini.d.ts","sourceRoot":"","sources":["../../lib/reachy-mini.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoCH,OAAO,KAAK,EACR,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EAEjB,UAAU,EACV,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,cAAc,EACd,wBAAwB,EAExB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,UAAU,EAEV,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EACrB,MAAM,YAAY,CAAC;AASpB,YAAY,EAAE,mBAAmB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"reachy-mini.d.ts","sourceRoot":"","sources":["../../lib/reachy-mini.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/reachy-mini.js
CHANGED
|
@@ -32,6 +32,21 @@ const log = createLogger('sdk');
|
|
|
32
32
|
* flip it back and forth.
|
|
33
33
|
*/
|
|
34
34
|
const POSE_STREAM_FRESH_MS = 750;
|
|
35
|
+
/**
|
|
36
|
+
* A streaming peer link counts as live when the robot was heard from this
|
|
37
|
+
* recently (it answers the ~500 ms state poll). Past it, a reason-less
|
|
38
|
+
* endSession from central is believed again.
|
|
39
|
+
*/
|
|
40
|
+
const PEER_LINK_LIVE_MS = 2500;
|
|
41
|
+
/**
|
|
42
|
+
* A robot's stable identity across central re-registrations (its peer id
|
|
43
|
+
* changes each time): `install_id`, else `hardware_id`. Never the name,
|
|
44
|
+
* which users often leave at the default and share across robots.
|
|
45
|
+
*/
|
|
46
|
+
function robotIdentity(r) {
|
|
47
|
+
const meta = r?.meta;
|
|
48
|
+
return meta?.install_id ?? meta?.hardware_id ?? null;
|
|
49
|
+
}
|
|
35
50
|
/**
|
|
36
51
|
* Upper bound on how long `ensureAwake()` waits for the wake trajectory to
|
|
37
52
|
* complete. The emote itself takes ~2-3 s on hardware; the extra headroom
|
|
@@ -83,6 +98,15 @@ export class ReachyMini extends EventTarget {
|
|
|
83
98
|
_micStream = null;
|
|
84
99
|
_robotAudioTrack = null;
|
|
85
100
|
_outgoingAudioTrack = null;
|
|
101
|
+
/** Context driving the silent placeholder track; closed with it. */
|
|
102
|
+
_micCtx = null;
|
|
103
|
+
/** Robot dialed last and its stable identity (see `_redialTargetResolver`). */
|
|
104
|
+
_dialedRobotId = null;
|
|
105
|
+
_dialedRobotIdentity = null;
|
|
106
|
+
/** Signaling (SSE) dropped while streaming; reconnecting in the background. */
|
|
107
|
+
_signalingDown = false;
|
|
108
|
+
_signalingRetryTimer = null;
|
|
109
|
+
_signalingRetryAttempt = 0;
|
|
86
110
|
_micMuted = true;
|
|
87
111
|
_audioMuted = true;
|
|
88
112
|
_micSupported = false;
|
|
@@ -135,7 +159,7 @@ export class ReachyMini extends EventTarget {
|
|
|
135
159
|
hasPc: () => !!this._pc,
|
|
136
160
|
isStreaming: () => this._state === 'streaming',
|
|
137
161
|
isMidSetup: () => !!(this._sessionResolve || this._sessionReject),
|
|
138
|
-
isSignalingDown: () => this._state === 'disconnected',
|
|
162
|
+
isSignalingDown: () => this._state === 'disconnected' || this._signalingDown,
|
|
139
163
|
selectedRobotId: () => this._selectedRobotId,
|
|
140
164
|
rejectPendingSession: (err) => {
|
|
141
165
|
if (!this._sessionReject)
|
|
@@ -150,6 +174,7 @@ export class ReachyMini extends EventTarget {
|
|
|
150
174
|
// The private dial skips the public startSession()'s
|
|
151
175
|
// cancelRedial, so the loop's own attempts don't cancel it.
|
|
152
176
|
dial: (robotId) => this._startSessionInternal(robotId),
|
|
177
|
+
redialTargetResolver: (robotId) => this._redialTargetResolver(robotId),
|
|
153
178
|
teardownForRedial: () => this._teardownForRedial(),
|
|
154
179
|
nudgeState: () => { this.requestState(); },
|
|
155
180
|
emit: (name, detail) => this._emit(name, detail),
|
|
@@ -291,6 +316,14 @@ export class ReachyMini extends EventTarget {
|
|
|
291
316
|
this._token = token;
|
|
292
317
|
if (!this._token)
|
|
293
318
|
throw new Error('No token — call authenticate() first or pass a token');
|
|
319
|
+
return this._openSignaling();
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Open the signaling SSE stream and resolve on central's `welcome`.
|
|
323
|
+
* Shared by `connect()` and the background reconnect that runs while a
|
|
324
|
+
* session keeps streaming without signaling (see `signalingLost`).
|
|
325
|
+
*/
|
|
326
|
+
async _openSignaling() {
|
|
294
327
|
this._sseAbortController = new AbortController();
|
|
295
328
|
let res;
|
|
296
329
|
try {
|
|
@@ -328,13 +361,25 @@ export class ReachyMini extends EventTarget {
|
|
|
328
361
|
const msg = JSON.parse(line.slice(5).trim());
|
|
329
362
|
if (!welcomed && msg.type === 'welcome' && msg.peerId) {
|
|
330
363
|
welcomed = true;
|
|
331
|
-
|
|
364
|
+
// A background reconnect lands mid-session:
|
|
365
|
+
// the session state is left alone.
|
|
366
|
+
const restoring = this._state !== 'disconnected';
|
|
367
|
+
if (!restoring)
|
|
368
|
+
this._state = 'connected';
|
|
369
|
+
this._signalingDown = false;
|
|
370
|
+
this._signalingRetryAttempt = 0;
|
|
332
371
|
await this._sendToServer({
|
|
333
372
|
type: 'setPeerStatus',
|
|
334
373
|
roles: ['listener'],
|
|
335
374
|
meta: { name: this._appName },
|
|
336
375
|
});
|
|
337
|
-
|
|
376
|
+
if (restoring) {
|
|
377
|
+
log.info('signaling restored while streaming');
|
|
378
|
+
this._emit('signalingRestored', { peerId: msg.peerId });
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
this._emit('connected', { peerId: msg.peerId });
|
|
382
|
+
}
|
|
338
383
|
resolve();
|
|
339
384
|
}
|
|
340
385
|
this._handleSignalingMessage(msg);
|
|
@@ -352,7 +397,20 @@ export class ReachyMini extends EventTarget {
|
|
|
352
397
|
return;
|
|
353
398
|
}
|
|
354
399
|
}
|
|
355
|
-
if (this._state
|
|
400
|
+
if (this._state === 'streaming') {
|
|
401
|
+
// Signaling is only needed to SET UP a session: a live
|
|
402
|
+
// one is peer-to-peer. Keep it, reconnect in the
|
|
403
|
+
// background (same token: central's reconnect grace
|
|
404
|
+
// keeps our peer id).
|
|
405
|
+
this._sseAbortController = null;
|
|
406
|
+
if (!this._signalingDown) {
|
|
407
|
+
this._signalingDown = true;
|
|
408
|
+
log.warn('signaling lost while streaming; keeping the session');
|
|
409
|
+
this._emit('signalingLost', { reason: 'SSE closed' });
|
|
410
|
+
}
|
|
411
|
+
this._scheduleSignalingRetry();
|
|
412
|
+
}
|
|
413
|
+
else if (this._state !== 'disconnected') {
|
|
356
414
|
this._state = 'disconnected';
|
|
357
415
|
this._emit('disconnected', { reason: 'SSE closed' });
|
|
358
416
|
}
|
|
@@ -500,6 +558,15 @@ export class ReachyMini extends EventTarget {
|
|
|
500
558
|
if (this._state !== 'connected')
|
|
501
559
|
throw new Error('Not connected');
|
|
502
560
|
this._selectedRobotId = robotId;
|
|
561
|
+
// Remember who this is while it is surely listed (see
|
|
562
|
+
// `_redialTargetResolver`). Kept across redial attempts that dial
|
|
563
|
+
// the same robot under a fresh id.
|
|
564
|
+
const dialedIdentity = robotIdentity(this._robots.find((r) => r.id === robotId));
|
|
565
|
+
if (dialedIdentity)
|
|
566
|
+
this._dialedRobotIdentity = dialedIdentity;
|
|
567
|
+
else if (this._dialedRobotId !== robotId)
|
|
568
|
+
this._dialedRobotIdentity = null;
|
|
569
|
+
this._dialedRobotId = robotId;
|
|
503
570
|
this._iceConnected = false;
|
|
504
571
|
this._dcOpen = false;
|
|
505
572
|
this._micSupported = false;
|
|
@@ -522,7 +589,11 @@ export class ReachyMini extends EventTarget {
|
|
|
522
589
|
const Ctx = w.AudioContext ?? w.webkitAudioContext;
|
|
523
590
|
if (!Ctx)
|
|
524
591
|
throw new Error('AudioContext not supported');
|
|
592
|
+
// A dial can follow a teardown that skipped the release
|
|
593
|
+
// (e.g. a rejected attempt): never keep two contexts alive.
|
|
594
|
+
this._releaseMicPlaceholder();
|
|
525
595
|
const ctx = new Ctx();
|
|
596
|
+
this._micCtx = ctx;
|
|
526
597
|
const dst = ctx.createMediaStreamDestination();
|
|
527
598
|
const osc = ctx.createOscillator();
|
|
528
599
|
const gain = ctx.createGain();
|
|
@@ -647,6 +718,21 @@ export class ReachyMini extends EventTarget {
|
|
|
647
718
|
if (msg)
|
|
648
719
|
this._handleRobotMessage(msg);
|
|
649
720
|
};
|
|
721
|
+
// The robot ending the session closes the channel in an
|
|
722
|
+
// orderly way while ICE is still up: that, not central's
|
|
723
|
+
// signaling, is how a live session learns it is over. A dead
|
|
724
|
+
// network doesn't close it (ICE fails first and the
|
|
725
|
+
// supervisor re-dials), nor does our own teardown (the
|
|
726
|
+
// channel is no longer `this._dc` by then).
|
|
727
|
+
ch.onclose = () => {
|
|
728
|
+
if (this._dc !== ch || this._state !== 'streaming')
|
|
729
|
+
return;
|
|
730
|
+
const ice = this._pc?.iceConnectionState;
|
|
731
|
+
if (ice !== 'connected' && ice !== 'completed')
|
|
732
|
+
return;
|
|
733
|
+
log.info('robot closed the session');
|
|
734
|
+
this._endedByRobot('remote_end', null);
|
|
735
|
+
};
|
|
650
736
|
};
|
|
651
737
|
this._sendToServer({ type: 'startSession', peerId: robotId }).then((r) => {
|
|
652
738
|
if (r?.type === 'sessionRejected') {
|
|
@@ -691,10 +777,7 @@ export class ReachyMini extends EventTarget {
|
|
|
691
777
|
clearInterval(this._latencyMonitorId);
|
|
692
778
|
this._latencyMonitorId = null;
|
|
693
779
|
}
|
|
694
|
-
|
|
695
|
-
this._micStream.getTracks().forEach((t) => t.stop());
|
|
696
|
-
this._micStream = null;
|
|
697
|
-
}
|
|
780
|
+
this._releaseMicPlaceholder();
|
|
698
781
|
this._robotAudioTrack = null;
|
|
699
782
|
this._micMuted = true;
|
|
700
783
|
this._micSupported = false;
|
|
@@ -737,13 +820,17 @@ export class ReachyMini extends EventTarget {
|
|
|
737
820
|
this._outgoingAudioTrack = null;
|
|
738
821
|
const sessionId = this._closeTransport(new Error('Session stopped'));
|
|
739
822
|
if (sessionId) {
|
|
740
|
-
|
|
823
|
+
// A reason marks a deliberate hang-up: the robot ends the session
|
|
824
|
+
// on it, whereas a reason-less endSession (central's own
|
|
825
|
+
// eviction) is advisory while the peer link is live.
|
|
826
|
+
await this._sendToServer({ type: 'endSession', sessionId, reason: 'client_stop' });
|
|
741
827
|
}
|
|
742
828
|
const wasStreaming = this._state === 'streaming';
|
|
743
829
|
if (wasStreaming) {
|
|
744
830
|
this._state = 'connected';
|
|
745
831
|
this._emit('sessionStopped', { reason: 'user' });
|
|
746
832
|
}
|
|
833
|
+
this._dropToDisconnectedIfSignalingDown();
|
|
747
834
|
}
|
|
748
835
|
disconnect() {
|
|
749
836
|
this._supervisor.cancelRedial();
|
|
@@ -754,9 +841,11 @@ export class ReachyMini extends EventTarget {
|
|
|
754
841
|
this._logSubscribers.clear();
|
|
755
842
|
this._updateProgressSubscribers.clear();
|
|
756
843
|
this._outgoingAudioTrack = null;
|
|
844
|
+
this._clearSignalingRetry();
|
|
845
|
+
this._signalingDown = false;
|
|
757
846
|
const sessionId = this._closeTransport(new Error('Disconnected'));
|
|
758
847
|
if (sessionId && this._token) {
|
|
759
|
-
void this._sendToServer({ type: 'endSession', sessionId });
|
|
848
|
+
void this._sendToServer({ type: 'endSession', sessionId, reason: 'client_disconnect' });
|
|
760
849
|
}
|
|
761
850
|
this._robots = [];
|
|
762
851
|
this._state = 'disconnected';
|
|
@@ -793,6 +882,41 @@ export class ReachyMini extends EventTarget {
|
|
|
793
882
|
* armed, and a late signaling reply could otherwise settle them
|
|
794
883
|
* against a closed pc).
|
|
795
884
|
*/
|
|
885
|
+
/**
|
|
886
|
+
* Resolver for the redial loop. Matches on the robot's stable
|
|
887
|
+
* identity (`install_id`, else `hardware_id`; never the name, which
|
|
888
|
+
* users often leave at the default and share across robots). A
|
|
889
|
+
* listed robot with that identity under a NEW id is the same robot,
|
|
890
|
+
* re-registered; otherwise keep dialing the original id.
|
|
891
|
+
*/
|
|
892
|
+
_redialTargetResolver(robotId) {
|
|
893
|
+
// Prefer the identity recorded when the session was dialed: by the
|
|
894
|
+
// time a redial starts, central may already have dropped the old
|
|
895
|
+
// entry from the list (it evicts a robot whose signaling went
|
|
896
|
+
// silent), leaving nothing to match against.
|
|
897
|
+
const key = (this._dialedRobotId === robotId ? this._dialedRobotIdentity : null)
|
|
898
|
+
?? robotIdentity(this._robots.find((r) => r.id === robotId));
|
|
899
|
+
if (!key)
|
|
900
|
+
return () => robotId;
|
|
901
|
+
return () => this._robots.find((r) => r.id !== robotId && robotIdentity(r) === key)?.id ?? robotId;
|
|
902
|
+
}
|
|
903
|
+
/**
|
|
904
|
+
* Stop the placeholder sender track AND close its AudioContext.
|
|
905
|
+
* Stopping the track alone left the context (and its oscillator)
|
|
906
|
+
* running: one leaked context per dial, and browsers cap open audio
|
|
907
|
+
* outputs (Chromium: 10 per page), so after a few re-dials every
|
|
908
|
+
* new AudioContext in the host app fails silently.
|
|
909
|
+
*/
|
|
910
|
+
_releaseMicPlaceholder() {
|
|
911
|
+
if (this._micStream) {
|
|
912
|
+
this._micStream.getTracks().forEach((t) => t.stop());
|
|
913
|
+
this._micStream = null;
|
|
914
|
+
}
|
|
915
|
+
const ctx = this._micCtx;
|
|
916
|
+
this._micCtx = null;
|
|
917
|
+
if (ctx && ctx.state !== 'closed')
|
|
918
|
+
void ctx.close().catch(() => { });
|
|
919
|
+
}
|
|
796
920
|
_teardownForRedial() {
|
|
797
921
|
const sessionId = this._closeTransport(new Error('Session reconnecting'));
|
|
798
922
|
// Free the robot-side slot: the relay refuses a second session
|
|
@@ -800,10 +924,83 @@ export class ReachyMini extends EventTarget {
|
|
|
800
924
|
// own consent-freshness timeout, ~30 s) clears it. Fire and
|
|
801
925
|
// forget — _sendToServer never throws.
|
|
802
926
|
if (sessionId && this._token) {
|
|
803
|
-
void this._sendToServer({ type: 'endSession', sessionId });
|
|
927
|
+
void this._sendToServer({ type: 'endSession', sessionId, reason: 'client_redial' });
|
|
928
|
+
}
|
|
929
|
+
if (this._state === 'streaming')
|
|
930
|
+
this._state = 'connected';
|
|
931
|
+
// The redial loop reconnects signaling itself (isSignalingDown).
|
|
932
|
+
if (this._signalingDown) {
|
|
933
|
+
this._clearSignalingRetry();
|
|
934
|
+
this._signalingDown = false;
|
|
935
|
+
this._state = 'disconnected';
|
|
804
936
|
}
|
|
937
|
+
}
|
|
938
|
+
/**
|
|
939
|
+
* The robot (or central on its behalf) ended a streaming session:
|
|
940
|
+
* tear our side down and emit ONE `sessionStopped` carrying the
|
|
941
|
+
* robot's reason (`stopSession()` would add a second, `user`, one).
|
|
942
|
+
* No endSession goes back: the other side already ended it.
|
|
943
|
+
*/
|
|
944
|
+
_endedByRobot(reason, message) {
|
|
945
|
+
this._supervisor.cancelRedial();
|
|
946
|
+
this._logSubscribers.clear();
|
|
947
|
+
this._updateProgressSubscribers.clear();
|
|
948
|
+
this._outgoingAudioTrack = null;
|
|
949
|
+
this._closeTransport(new Error('Session ended by the robot'));
|
|
805
950
|
if (this._state === 'streaming')
|
|
806
951
|
this._state = 'connected';
|
|
952
|
+
this._emit('sessionStopped', { reason, message });
|
|
953
|
+
this._dropToDisconnectedIfSignalingDown();
|
|
954
|
+
}
|
|
955
|
+
/** Session over while signaling is down: surface the real state. */
|
|
956
|
+
_dropToDisconnectedIfSignalingDown() {
|
|
957
|
+
if (!this._signalingDown)
|
|
958
|
+
return;
|
|
959
|
+
this._clearSignalingRetry();
|
|
960
|
+
this._signalingDown = false;
|
|
961
|
+
if (this._state !== 'disconnected') {
|
|
962
|
+
this._state = 'disconnected';
|
|
963
|
+
this._emit('disconnected', { reason: 'SSE closed' });
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
_clearSignalingRetry() {
|
|
967
|
+
if (this._signalingRetryTimer !== null) {
|
|
968
|
+
clearTimeout(this._signalingRetryTimer);
|
|
969
|
+
this._signalingRetryTimer = null;
|
|
970
|
+
}
|
|
971
|
+
if (this._signalingDown && this._sseAbortController) {
|
|
972
|
+
this._sseAbortController.abort();
|
|
973
|
+
this._sseAbortController = null;
|
|
974
|
+
}
|
|
975
|
+
this._signalingRetryAttempt = 0;
|
|
976
|
+
}
|
|
977
|
+
/** Background signaling reconnect while a session keeps streaming. */
|
|
978
|
+
_scheduleSignalingRetry() {
|
|
979
|
+
if (this._signalingRetryTimer !== null)
|
|
980
|
+
return;
|
|
981
|
+
const delays = [1000, 2000, 4000, 8000, 15000];
|
|
982
|
+
const delay = delays[Math.min(this._signalingRetryAttempt, delays.length - 1)];
|
|
983
|
+
this._signalingRetryAttempt += 1;
|
|
984
|
+
this._signalingRetryTimer = setTimeout(() => {
|
|
985
|
+
this._signalingRetryTimer = null;
|
|
986
|
+
if (!this._signalingDown || this._state !== 'streaming')
|
|
987
|
+
return;
|
|
988
|
+
this._openSignaling().catch(() => {
|
|
989
|
+
if (this._signalingDown && this._state === 'streaming')
|
|
990
|
+
this._scheduleSignalingRetry();
|
|
991
|
+
});
|
|
992
|
+
}, delay);
|
|
993
|
+
}
|
|
994
|
+
/**
|
|
995
|
+
* Liveness of the peer link itself: data channel open, ICE up, and the
|
|
996
|
+
* robot heard from recently (it answers the ~500 ms state poll).
|
|
997
|
+
*/
|
|
998
|
+
_peerLinkLive() {
|
|
999
|
+
const ice = this._pc?.iceConnectionState;
|
|
1000
|
+
return this._dcOpen
|
|
1001
|
+
&& this._dc?.readyState === 'open'
|
|
1002
|
+
&& (ice === 'connected' || ice === 'completed')
|
|
1003
|
+
&& this._supervisor.dcInboundAgeMs < PEER_LINK_LIVE_MS;
|
|
807
1004
|
}
|
|
808
1005
|
// ─── Commands ────────────────────────────────────────────────────────
|
|
809
1006
|
/**
|
|
@@ -1715,10 +1912,7 @@ export class ReachyMini extends EventTarget {
|
|
|
1715
1912
|
this._pc.close();
|
|
1716
1913
|
this._pc = null;
|
|
1717
1914
|
}
|
|
1718
|
-
|
|
1719
|
-
this._micStream.getTracks().forEach((t) => t.stop());
|
|
1720
|
-
this._micStream = null;
|
|
1721
|
-
}
|
|
1915
|
+
this._releaseMicPlaceholder();
|
|
1722
1916
|
this._robotAudioTrack = null;
|
|
1723
1917
|
this._iceConnected = false;
|
|
1724
1918
|
this._dcOpen = false;
|
|
@@ -1731,11 +1925,17 @@ export class ReachyMini extends EventTarget {
|
|
|
1731
1925
|
return;
|
|
1732
1926
|
}
|
|
1733
1927
|
if (this._state === 'streaming') {
|
|
1734
|
-
this
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
this.
|
|
1928
|
+
// Without a reason this is central's own bookkeeping (our
|
|
1929
|
+
// signaling timed out and it evicted us), not the robot hanging
|
|
1930
|
+
// up: the robot gives a reason, or closes the data channel. The
|
|
1931
|
+
// session lives as long as the peer link does.
|
|
1932
|
+
if (!reason && this._peerLinkLive()) {
|
|
1933
|
+
log.info('central ended the session but the peer link is live; keeping it');
|
|
1934
|
+
this._sessionId = null; // stale on central
|
|
1935
|
+
this._emit('signalingSessionEnded', { reason: null });
|
|
1936
|
+
return;
|
|
1937
|
+
}
|
|
1938
|
+
this._endedByRobot(reason || 'remote_end', friendly);
|
|
1739
1939
|
}
|
|
1740
1940
|
}
|
|
1741
1941
|
async _handlePeerMessage(msg) {
|