@mentra/engine 3.2.0-dev.217 → 3.2.0-dev.222
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/build/generated/releaseMetadata.js +5 -5
- package/build/generated/releaseMetadata.js.map +1 -1
- package/build/index.d.ts +3 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -1
- package/build/index.js.map +1 -1
- package/build/react/MentraLiveOtaFlow.d.ts.map +1 -1
- package/build/react/MentraLiveOtaFlow.js +19 -3
- package/build/react/MentraLiveOtaFlow.js.map +1 -1
- package/build/react/useMentraLiveOta.d.ts +12 -0
- package/build/react/useMentraLiveOta.d.ts.map +1 -1
- package/build/react/useMentraLiveOta.js +31 -5
- package/build/react/useMentraLiveOta.js.map +1 -1
- package/build/services/AcsMeetingService.d.ts +360 -10
- package/build/services/AcsMeetingService.d.ts.map +1 -1
- package/build/services/AcsMeetingService.js +836 -19
- package/build/services/AcsMeetingService.js.map +1 -1
- package/build/services/AudioPlaybackService.d.ts +6 -0
- package/build/services/AudioPlaybackService.d.ts.map +1 -1
- package/build/services/AudioPlaybackService.js +4 -3
- package/build/services/AudioPlaybackService.js.map +1 -1
- package/build/services/GlassesMicProbe.d.ts +78 -0
- package/build/services/GlassesMicProbe.d.ts.map +1 -0
- package/build/services/GlassesMicProbe.js +258 -0
- package/build/services/GlassesMicProbe.js.map +1 -0
- package/build/services/LocalMiniappRuntime.d.ts +83 -0
- package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
- package/build/services/LocalMiniappRuntime.js +714 -39
- package/build/services/LocalMiniappRuntime.js.map +1 -1
- package/build/services/MentraJSLogPipeline.d.ts +39 -0
- package/build/services/MentraJSLogPipeline.d.ts.map +1 -1
- package/build/services/MentraJSLogPipeline.js +59 -3
- package/build/services/MentraJSLogPipeline.js.map +1 -1
- package/build/services/MentraJSRouter.d.ts +1 -1
- package/build/services/MentraJSRouter.d.ts.map +1 -1
- package/build/services/MentraJSRouter.js +2 -2
- package/build/services/MentraJSRouter.js.map +1 -1
- package/build/services/MicStateCoordinator.d.ts +22 -0
- package/build/services/MicStateCoordinator.d.ts.map +1 -1
- package/build/services/MicStateCoordinator.js +34 -3
- package/build/services/MicStateCoordinator.js.map +1 -1
- package/build/services/OtaErrorMapping.d.ts +25 -2
- package/build/services/OtaErrorMapping.d.ts.map +1 -1
- package/build/services/OtaErrorMapping.js +68 -23
- package/build/services/OtaErrorMapping.js.map +1 -1
- package/build/services/OtaInstallCoordinator.d.ts.map +1 -1
- package/build/services/OtaInstallCoordinator.js +6 -1
- package/build/services/OtaInstallCoordinator.js.map +1 -1
- package/build/services/PhoneStreamCoordinator.d.ts +8 -0
- package/build/services/PhoneStreamCoordinator.d.ts.map +1 -1
- package/build/services/PhoneStreamCoordinator.js +2 -0
- package/build/services/PhoneStreamCoordinator.js.map +1 -1
- package/build/services/SoftapCallTransport.d.ts +365 -0
- package/build/services/SoftapCallTransport.d.ts.map +1 -0
- package/build/services/SoftapCallTransport.js +722 -0
- package/build/services/SoftapCallTransport.js.map +1 -0
- package/build/services/SoftapCleanupBarrier.d.ts +45 -0
- package/build/services/SoftapCleanupBarrier.d.ts.map +1 -0
- package/build/services/SoftapCleanupBarrier.js +51 -0
- package/build/services/SoftapCleanupBarrier.js.map +1 -0
- package/build/utils/pcm16.d.ts +35 -0
- package/build/utils/pcm16.d.ts.map +1 -0
- package/build/utils/pcm16.js +85 -0
- package/build/utils/pcm16.js.map +1 -0
- package/build/utils/softapTrace.d.ts +39 -0
- package/build/utils/softapTrace.d.ts.map +1 -0
- package/build/utils/softapTrace.js +124 -0
- package/build/utils/softapTrace.js.map +1 -0
- package/package.json +7 -7
- package/src/generated/releaseMetadata.ts +5 -5
- package/src/index.ts +8 -0
- package/src/react/MentraLiveOtaFlow.tsx +22 -3
- package/src/react/useMentraLiveOta.ts +44 -6
- package/src/services/AcsMeetingService.ts +956 -22
- package/src/services/AudioPlaybackService.ts +12 -3
- package/src/services/GlassesMicProbe.ts +300 -0
- package/src/services/LocalMiniappRuntime.ts +775 -42
- package/src/services/MentraJSLogPipeline.ts +70 -3
- package/src/services/MentraJSRouter.ts +2 -2
- package/src/services/MicStateCoordinator.ts +35 -3
- package/src/services/OtaErrorMapping.ts +77 -25
- package/src/services/OtaInstallCoordinator.ts +6 -1
- package/src/services/PhoneStreamCoordinator.ts +10 -0
- package/src/services/SoftapCallTransport.ts +928 -0
- package/src/services/SoftapCleanupBarrier.ts +72 -0
- package/src/utils/pcm16.ts +93 -0
- package/src/utils/softapTrace.ts +133 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Sequences a SoftAP call. Sequencing only — no sockets, no peers, no BLE.
|
|
3
|
+
*
|
|
4
|
+
* The glasses open a hotspot, the phone joins it without giving up its cellular route, and the
|
|
5
|
+
* glasses publish WebRTC straight to a listener on the phone. Cloudflare is not involved at all.
|
|
6
|
+
*
|
|
7
|
+
* The order below is the whole point of this file, and one step in it is load-bearing:
|
|
8
|
+
*
|
|
9
|
+
* hotspot on -> scoped join -> ACS join (binds the listener and arms the raw outputs)
|
|
10
|
+
* -> glasses publish -> WHIP negotiation -> first frame -> LIVE
|
|
11
|
+
*
|
|
12
|
+
* Publishing must come after the ACS join, not before. `LIVE` means a frame reached ACS, so if the
|
|
13
|
+
* glasses start publishing first, decoded video and audio can arrive before the raw outgoing
|
|
14
|
+
* streams exist and the first frames are dropped by whatever happens to be null at the time. That
|
|
15
|
+
* is not a lifecycle anyone designed; making the order explicit is what removes it.
|
|
16
|
+
*
|
|
17
|
+
* Ownership is deliberately narrow. This object owns the *sequence* and nothing else: the meeting
|
|
18
|
+
* session owns the WHIP listener and the peer, `PhoneStreamCoordinator` owns the publisher, and
|
|
19
|
+
* `localNetworkTransport` owns the scoped network. Every step therefore has exactly one owner that
|
|
20
|
+
* can tear it down, which is what makes leaving mid-join safe.
|
|
21
|
+
*/
|
|
22
|
+
/** Steps in order. Also the teardown order, reversed. */
|
|
23
|
+
export declare const SOFTAP_STEPS: readonly ["hotspot", "scopedJoin", "acsJoin", "publish", "live"];
|
|
24
|
+
export type SoftapStep = (typeof SOFTAP_STEPS)[number];
|
|
25
|
+
/**
|
|
26
|
+
* Where the sequence is.
|
|
27
|
+
*
|
|
28
|
+
* `starting` covers every step up to `live` because the caller's only useful distinction is
|
|
29
|
+
* "not yet usable" versus "carrying media"; the step names are for diagnostics, not for branching.
|
|
30
|
+
*/
|
|
31
|
+
export type SoftapPhase = "idle" | "starting" | "live" | "stopping" | "failed";
|
|
32
|
+
/** A failure, named by the step that produced it so the UI and the logs agree on the cause. */
|
|
33
|
+
export declare class SoftapCallError extends Error {
|
|
34
|
+
readonly step: SoftapStep;
|
|
35
|
+
readonly code: string;
|
|
36
|
+
readonly cause?: unknown | undefined;
|
|
37
|
+
constructor(step: SoftapStep, code: string, message: string, cause?: unknown | undefined);
|
|
38
|
+
}
|
|
39
|
+
/** Gallery sync already learned this: glasses report enabled before the SSID is in the phone scan. */
|
|
40
|
+
export declare const HOTSPOT_BROADCAST_WAIT_MS = 3000;
|
|
41
|
+
export type SoftapStepStatus = "pending" | "running" | "done" | "failed";
|
|
42
|
+
/**
|
|
43
|
+
* One step as the UI should show it. `detail` is the fact the step produced (SSID, phone address,
|
|
44
|
+
* ingest URL, what the glasses last reported); `error` is set only on `failed`.
|
|
45
|
+
*/
|
|
46
|
+
export interface SoftapStepState {
|
|
47
|
+
step: SoftapStep;
|
|
48
|
+
status: SoftapStepStatus;
|
|
49
|
+
detail?: string;
|
|
50
|
+
error?: string;
|
|
51
|
+
/** Wall-clock ms the step took; present once it is done or failed. */
|
|
52
|
+
durationMs?: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Whole-sequence snapshot, re-sent on every transition so a consumer that missed one still holds
|
|
56
|
+
* the truth. This is what the miniapp renders as its join checklist.
|
|
57
|
+
*/
|
|
58
|
+
export interface SoftapProgress {
|
|
59
|
+
traceId: string;
|
|
60
|
+
phase: SoftapPhase;
|
|
61
|
+
steps: SoftapStepState[];
|
|
62
|
+
/** ms since `start()` was called. */
|
|
63
|
+
elapsedMs: number;
|
|
64
|
+
}
|
|
65
|
+
/** Sub-status callback a step can use to narrate what it is doing while it runs. */
|
|
66
|
+
export type SoftapStepReporter = (detail: string) => void;
|
|
67
|
+
export interface SoftapCallDeps {
|
|
68
|
+
/** Enable the glasses hotspot and return its credentials. */
|
|
69
|
+
startHotspot(report?: SoftapStepReporter): Promise<{
|
|
70
|
+
ssid: string;
|
|
71
|
+
passphrase: string;
|
|
72
|
+
}>;
|
|
73
|
+
/**
|
|
74
|
+
* Wait until the phone can actually see the AP. `setHotspotState` resolves when the glasses
|
|
75
|
+
* accept the command, not when `ap0` is beaconing. A WifiNetworkSpecifier issued too early
|
|
76
|
+
* comes back `Unavailable` in well under a second — it does not keep scanning for the timeout.
|
|
77
|
+
*/
|
|
78
|
+
waitUntilHotspotJoinable?(report?: SoftapStepReporter): Promise<void>;
|
|
79
|
+
/** Disable it. Must tolerate being called when it was never enabled. */
|
|
80
|
+
stopHotspot(): Promise<void>;
|
|
81
|
+
/** Join the hotspot without taking the phone's default route. Resolves to the phone's own IPv4. */
|
|
82
|
+
joinScopedNetwork(ssid: string, passphrase: string, report?: SoftapStepReporter): Promise<string | undefined>;
|
|
83
|
+
leaveScopedNetwork(): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Join the meeting. This is what binds the local WHIP listener and arms the ACS raw outputs, so
|
|
86
|
+
* it must resolve before the glasses are told to publish.
|
|
87
|
+
*
|
|
88
|
+
* @returns the URL the glasses must POST their offer to
|
|
89
|
+
*/
|
|
90
|
+
joinMeeting(args: {
|
|
91
|
+
ssid: string;
|
|
92
|
+
passphrase: string;
|
|
93
|
+
bindAddress?: string;
|
|
94
|
+
}, report?: SoftapStepReporter): Promise<{
|
|
95
|
+
ingestUrl: string;
|
|
96
|
+
}>;
|
|
97
|
+
leaveMeeting(): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* End the meeting for everyone instead of leaving it. Optional: a host that cannot do this still
|
|
100
|
+
* tears down correctly, it just cannot honour `stop({mode: "end"})`.
|
|
101
|
+
*/
|
|
102
|
+
endMeeting?(): Promise<void>;
|
|
103
|
+
/** Tell the glasses to publish to [ingestUrl] in host-only ICE mode. */
|
|
104
|
+
startPublishing(args: {
|
|
105
|
+
ingestUrl: string;
|
|
106
|
+
traceId: string;
|
|
107
|
+
}, report?: SoftapStepReporter): Promise<void>;
|
|
108
|
+
stopPublishing(): Promise<void>;
|
|
109
|
+
/**
|
|
110
|
+
* Resolves when a frame has reached ACS, rejects if the feed failed or the deadline passed.
|
|
111
|
+
* Separate from [joinMeeting] because an answered negotiation is not a working call: a session
|
|
112
|
+
* that never delivers a frame reads as healthy behind a frozen tile.
|
|
113
|
+
*/
|
|
114
|
+
awaitFirstFrame(report?: SoftapStepReporter): Promise<void>;
|
|
115
|
+
}
|
|
116
|
+
export interface SoftapCallOptions {
|
|
117
|
+
/** Override the minted trace id, so a caller can correlate with logs it already started. */
|
|
118
|
+
traceId?: string;
|
|
119
|
+
/**
|
|
120
|
+
* Receives a fresh snapshot on every transition: step begins, step narrates, step ends, sequence
|
|
121
|
+
* ends. Exceptions thrown here are swallowed — a broken listener must not fail the call.
|
|
122
|
+
*/
|
|
123
|
+
onProgress?: (progress: SoftapProgress) => void;
|
|
124
|
+
/**
|
|
125
|
+
* Narration the caller already showed before the sequence existed — signing in to Teams, asking
|
|
126
|
+
* for a permission. Without it the first `emitProgress` would blank the checklist the wearer is
|
|
127
|
+
* already reading. Only `detail` is taken: the caller reports what it did, it does not get to
|
|
128
|
+
* claim a step ran.
|
|
129
|
+
*/
|
|
130
|
+
initialSteps?: SoftapStepState[];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* How a call is being taken down.
|
|
134
|
+
*
|
|
135
|
+
* `leave` takes this device out; `end` terminates the group call for everyone first. Everything
|
|
136
|
+
* after that step is identical, which is the point: End is not a second teardown path, it is one
|
|
137
|
+
* different verb at one step of the same one.
|
|
138
|
+
*/
|
|
139
|
+
export type SoftapTeardownMode = "leave" | "end";
|
|
140
|
+
export interface SoftapStopOptions {
|
|
141
|
+
mode?: SoftapTeardownMode;
|
|
142
|
+
keepProgress?: boolean;
|
|
143
|
+
}
|
|
144
|
+
export declare class SoftapEndNotSupportedError extends Error {
|
|
145
|
+
constructor();
|
|
146
|
+
}
|
|
147
|
+
export declare class SoftapCallTransport {
|
|
148
|
+
private readonly deps;
|
|
149
|
+
private phase;
|
|
150
|
+
/**
|
|
151
|
+
* Steps completed and not yet undone, in the order they succeeded. Teardown walks this
|
|
152
|
+
* backwards, so a failure halfway through unwinds exactly what was built and nothing else.
|
|
153
|
+
*/
|
|
154
|
+
private completed;
|
|
155
|
+
/**
|
|
156
|
+
* Bumped by every start and stop. A step that resolves after the caller has moved on must not
|
|
157
|
+
* write to the new attempt's state, which is the leave-during-join race.
|
|
158
|
+
*/
|
|
159
|
+
private generation;
|
|
160
|
+
private stopping;
|
|
161
|
+
/**
|
|
162
|
+
* The step currently in flight, and a promise that settles only after its body *and* the undo it
|
|
163
|
+
* runs when it finds itself cancelled are both finished.
|
|
164
|
+
*
|
|
165
|
+
* This is what [stop] waits on. A step that resolves late still owns a resource — a hotspot that
|
|
166
|
+
* came up after the wearer left — and its release happens inside the step, out of the teardown's
|
|
167
|
+
* sight. Without this wait, `stop()` resolves while that release is still pending and the next
|
|
168
|
+
* call brings a hotspot up straight into it.
|
|
169
|
+
*/
|
|
170
|
+
private running;
|
|
171
|
+
/** True once [start] has been called at least once, so [stop] can tell "cancelled" from "reusable". */
|
|
172
|
+
private startedEver;
|
|
173
|
+
/**
|
|
174
|
+
* A [stop] that landed before the sequence ever began.
|
|
175
|
+
*
|
|
176
|
+
* There is nothing to unwind in that case, so the flag is the only thing that can carry the
|
|
177
|
+
* cancellation forward: a `start()` arriving afterwards belongs to the attempt that was just
|
|
178
|
+
* cancelled and must refuse rather than build a call nobody is waiting for.
|
|
179
|
+
*/
|
|
180
|
+
private cancelledBeforeStart;
|
|
181
|
+
/** Failed undos for this attempt, retained across repeated stops. See [lastTeardownFailures]. */
|
|
182
|
+
private teardownFailures;
|
|
183
|
+
/**
|
|
184
|
+
* Raised the instant a teardown is decided, before any resource is touched.
|
|
185
|
+
*
|
|
186
|
+
* Everything that watches the call for failure — a lost hotspot above all — has to be able to ask
|
|
187
|
+
* "was this supposed to happen?". Without the flag, releasing the scoped network during a
|
|
188
|
+
* successful Leave looks exactly like the glasses walking out of range, and the wearer gets an
|
|
189
|
+
* error screen for a call that ended the way they asked.
|
|
190
|
+
*/
|
|
191
|
+
private terminating;
|
|
192
|
+
/** How this teardown ends the meeting. Read by the `acsJoin` undo. */
|
|
193
|
+
private teardownMode;
|
|
194
|
+
/** Set when `stop({mode: "end"})` could not end for everyone. The caller must not claim it did. */
|
|
195
|
+
private endFailure;
|
|
196
|
+
private hotspot;
|
|
197
|
+
private ingestUrl;
|
|
198
|
+
private steps;
|
|
199
|
+
private stepStartedAt;
|
|
200
|
+
private startedAt;
|
|
201
|
+
private traceId;
|
|
202
|
+
private onProgress;
|
|
203
|
+
constructor(deps: SoftapCallDeps);
|
|
204
|
+
currentPhase(): SoftapPhase;
|
|
205
|
+
/**
|
|
206
|
+
* True once a teardown has been decided. Anything that would otherwise report a failure — a lost
|
|
207
|
+
* hotspot, a dropped ACS call — must check this first: after the wearer asks to leave, those are
|
|
208
|
+
* the sound of it working.
|
|
209
|
+
*/
|
|
210
|
+
isTerminating(): boolean;
|
|
211
|
+
/** What the UI should show right now. Safe to call in any phase. */
|
|
212
|
+
progress(): SoftapProgress;
|
|
213
|
+
private emitProgress;
|
|
214
|
+
private setStep;
|
|
215
|
+
/** Narration for a running step: what the phone or the glasses just reported. */
|
|
216
|
+
private note;
|
|
217
|
+
/** Steps currently built up, oldest first. Empty when nothing needs tearing down. */
|
|
218
|
+
activeSteps(): SoftapStep[];
|
|
219
|
+
/** The URL handed to the glasses, for diagnostics. Null outside a live attempt. */
|
|
220
|
+
currentIngestUrl(): string | null;
|
|
221
|
+
/**
|
|
222
|
+
* Steps whose undo threw during the last teardown, so the caller can refuse the next call.
|
|
223
|
+
*
|
|
224
|
+
* Teardown deliberately swallows these to keep unwinding — but a hotspot that would not turn off
|
|
225
|
+
* is exactly the state the next call cannot be built on, and starting anyway is what produced
|
|
226
|
+
* "Cannot start glasses hotspot" followed by a scoped join that never found the SSID.
|
|
227
|
+
*/
|
|
228
|
+
lastTeardownFailures(): SoftapStep[];
|
|
229
|
+
/**
|
|
230
|
+
* Runs the sequence. On any failure the partial sequence is torn down before the error is
|
|
231
|
+
* rethrown, so a failed start never leaves a hotspot up or a publisher running.
|
|
232
|
+
*/
|
|
233
|
+
start(options?: SoftapCallOptions): Promise<void>;
|
|
234
|
+
/**
|
|
235
|
+
* Tears down in exact reverse order, and only what was built.
|
|
236
|
+
*
|
|
237
|
+
* Every step is attempted even if an earlier one throws: a failure to stop the publisher must
|
|
238
|
+
* not leave the hotspot on. Concurrent calls share one teardown rather than racing each other
|
|
239
|
+
* through the same resources, and a second `stop()` after one finished is a no-op — this is the
|
|
240
|
+
* only SoftAP exit, so every terminal path can call it without checking whether another already
|
|
241
|
+
* did.
|
|
242
|
+
*
|
|
243
|
+
* `mode: "end"` swaps the meeting verb and nothing else. If ending for everyone fails, the rest of
|
|
244
|
+
* the teardown still runs and the failure is rethrown at the end, so the caller can tell the
|
|
245
|
+
* wearer they left a meeting that may still be live rather than inventing a clean end.
|
|
246
|
+
*/
|
|
247
|
+
stop(options?: SoftapStopOptions): Promise<void>;
|
|
248
|
+
private undo;
|
|
249
|
+
/**
|
|
250
|
+
* The one step End changes.
|
|
251
|
+
*
|
|
252
|
+
* A failed End falls back to leaving, so the wearer is out either way, and the original failure is
|
|
253
|
+
* kept for [stop] to rethrow. Recording it rather than throwing here is what keeps the hotspot
|
|
254
|
+
* teardown — the steps after this one — unconditional.
|
|
255
|
+
*/
|
|
256
|
+
private leaveOrEndMeeting;
|
|
257
|
+
/**
|
|
258
|
+
* Runs one step, records it as undoable, and maps any throw to a [SoftapCallError] naming the
|
|
259
|
+
* step. The generation check is what makes leaving mid-step safe: a step that resolves after the
|
|
260
|
+
* caller gave up is not recorded, so teardown does not try to undo it twice.
|
|
261
|
+
*/
|
|
262
|
+
private step;
|
|
263
|
+
/** The step body itself. Split out so [step] can publish and settle {@link running} around it. */
|
|
264
|
+
private runStep;
|
|
265
|
+
/** Undo that reports rather than throws, for the cancellation path where there is no caller. */
|
|
266
|
+
private undoSafely;
|
|
267
|
+
private requireHotspot;
|
|
268
|
+
private requireIngestUrl;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Binds the sequence to the real subsystems.
|
|
272
|
+
*
|
|
273
|
+
* Kept separate from the class so the ordering above is tested against fakes rather than against
|
|
274
|
+
* BLE and ACS. The only logic here is adapting shapes; anything that needs a decision belongs in
|
|
275
|
+
* the class.
|
|
276
|
+
*
|
|
277
|
+
* @param packageName the miniapp that owns the call
|
|
278
|
+
* @param meeting the meeting to join, and how to observe its media health
|
|
279
|
+
*/
|
|
280
|
+
export declare function createSoftapCallDeps(args: {
|
|
281
|
+
packageName: string;
|
|
282
|
+
meetingUrl: string;
|
|
283
|
+
token: string;
|
|
284
|
+
displayName?: string;
|
|
285
|
+
/** Resolves when the meeting reports a frame reached ACS; rejects on a failed feed. */
|
|
286
|
+
awaitFirstFrame: () => Promise<void>;
|
|
287
|
+
subsystems: {
|
|
288
|
+
setHotspotState: (enabled: boolean) => Promise<{
|
|
289
|
+
state: string;
|
|
290
|
+
ssid?: string;
|
|
291
|
+
password?: string;
|
|
292
|
+
}>;
|
|
293
|
+
joinScopedNetwork: (ssid: string, passphrase: string) => Promise<string | undefined>;
|
|
294
|
+
leaveScopedNetwork: () => Promise<void>;
|
|
295
|
+
joinMeeting: (packageName: string, options: {
|
|
296
|
+
meetingUrl: string;
|
|
297
|
+
token: string;
|
|
298
|
+
videoSource: {
|
|
299
|
+
type: "softap";
|
|
300
|
+
ssid?: string;
|
|
301
|
+
passphrase?: string;
|
|
302
|
+
bindAddress?: string;
|
|
303
|
+
};
|
|
304
|
+
displayName?: string;
|
|
305
|
+
}) => Promise<unknown>;
|
|
306
|
+
leaveMeeting: (packageName: string) => Promise<void>;
|
|
307
|
+
/** Terminate the group call for everyone. Absent on hosts that cannot. */
|
|
308
|
+
endMeeting?: (packageName: string) => Promise<void>;
|
|
309
|
+
ingestUrl: () => string | null;
|
|
310
|
+
startPublishing: (packageName: string, options: {
|
|
311
|
+
streamUrl: string;
|
|
312
|
+
ice: {
|
|
313
|
+
stun: string;
|
|
314
|
+
};
|
|
315
|
+
traceId: string;
|
|
316
|
+
captureAudio?: boolean;
|
|
317
|
+
}) => Promise<unknown>;
|
|
318
|
+
stopPublishing: (packageName: string) => Promise<void>;
|
|
319
|
+
/**
|
|
320
|
+
* Whether the host is taking the wearer's voice off the glasses over BLE LC3 for this call.
|
|
321
|
+
*
|
|
322
|
+
* Asked after the meeting join and before the publish, because that is the only moment the
|
|
323
|
+
* answer is both known (the host has seen the native's capabilities) and still actionable (the
|
|
324
|
+
* glasses have not been told what to capture). True means the WHIP publish is video-only;
|
|
325
|
+
* false means the glasses put their microphone on the WHIP track as they always have. Absent
|
|
326
|
+
* on hosts that only have the WHIP audio path.
|
|
327
|
+
*/
|
|
328
|
+
glassesLc3Uplink?: () => boolean;
|
|
329
|
+
/**
|
|
330
|
+
* Prove the phone can reach the glasses over the hotspot it just joined. Optional because
|
|
331
|
+
* only Android hosts have the scoped network handle; when present its verdict is narrated
|
|
332
|
+
* into the scoped-join step and a failure is reported, not thrown — the glasses-to-phone
|
|
333
|
+
* direction is what the call actually needs, and that is tested by the publish step.
|
|
334
|
+
*/
|
|
335
|
+
probeGateway?: () => Promise<{
|
|
336
|
+
reachable: boolean;
|
|
337
|
+
detail: string;
|
|
338
|
+
}>;
|
|
339
|
+
/**
|
|
340
|
+
* Wait for the phone's default network to be validated again after the hotspot join took Wi-Fi
|
|
341
|
+
* away. Optional because only Android hosts can answer it.
|
|
342
|
+
*
|
|
343
|
+
* Not fatal when it reports an unusable network: the wearer is told, and the join is attempted
|
|
344
|
+
* anyway. Aborting here would fail calls that recover a second later, and the ACS join has its
|
|
345
|
+
* own bounded timeout for the case that does not.
|
|
346
|
+
*/
|
|
347
|
+
awaitValidatedDefaultNetwork?: () => Promise<{
|
|
348
|
+
usable: boolean;
|
|
349
|
+
detail: string;
|
|
350
|
+
} | null>;
|
|
351
|
+
/**
|
|
352
|
+
* Glasses `stream_status` events, so the publish step can say "camera starting" and "offer
|
|
353
|
+
* posted" instead of going quiet for the whole BLE round trip. Returns an unsubscribe.
|
|
354
|
+
*/
|
|
355
|
+
onGlassesStreamStatus?: (listener: (event: {
|
|
356
|
+
status: string;
|
|
357
|
+
streamId?: string;
|
|
358
|
+
reason?: string;
|
|
359
|
+
error?: string;
|
|
360
|
+
}) => void) => () => void;
|
|
361
|
+
};
|
|
362
|
+
/** Override only in tests. Production waits the gallery-proven broadcast window. */
|
|
363
|
+
hotspotBroadcastWaitMs?: number;
|
|
364
|
+
}): SoftapCallDeps;
|
|
365
|
+
//# sourceMappingURL=SoftapCallTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SoftapCallTransport.d.ts","sourceRoot":"","sources":["../../src/services/SoftapCallTransport.ts"],"names":[],"mappings":"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"}
|