@mentra/engine 3.2.0-dev.221 → 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.
Files changed (69) hide show
  1. package/build/generated/releaseMetadata.js +5 -5
  2. package/build/generated/releaseMetadata.js.map +1 -1
  3. package/build/index.d.ts +2 -0
  4. package/build/index.d.ts.map +1 -1
  5. package/build/index.js +1 -0
  6. package/build/index.js.map +1 -1
  7. package/build/services/AcsMeetingService.d.ts +360 -10
  8. package/build/services/AcsMeetingService.d.ts.map +1 -1
  9. package/build/services/AcsMeetingService.js +836 -19
  10. package/build/services/AcsMeetingService.js.map +1 -1
  11. package/build/services/AudioPlaybackService.d.ts +6 -0
  12. package/build/services/AudioPlaybackService.d.ts.map +1 -1
  13. package/build/services/AudioPlaybackService.js +4 -3
  14. package/build/services/AudioPlaybackService.js.map +1 -1
  15. package/build/services/GlassesMicProbe.d.ts +78 -0
  16. package/build/services/GlassesMicProbe.d.ts.map +1 -0
  17. package/build/services/GlassesMicProbe.js +258 -0
  18. package/build/services/GlassesMicProbe.js.map +1 -0
  19. package/build/services/LocalMiniappRuntime.d.ts +83 -0
  20. package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
  21. package/build/services/LocalMiniappRuntime.js +714 -39
  22. package/build/services/LocalMiniappRuntime.js.map +1 -1
  23. package/build/services/MentraJSLogPipeline.d.ts +39 -0
  24. package/build/services/MentraJSLogPipeline.d.ts.map +1 -1
  25. package/build/services/MentraJSLogPipeline.js +59 -3
  26. package/build/services/MentraJSLogPipeline.js.map +1 -1
  27. package/build/services/MentraJSRouter.d.ts +1 -1
  28. package/build/services/MentraJSRouter.d.ts.map +1 -1
  29. package/build/services/MentraJSRouter.js +2 -2
  30. package/build/services/MentraJSRouter.js.map +1 -1
  31. package/build/services/MicStateCoordinator.d.ts +22 -0
  32. package/build/services/MicStateCoordinator.d.ts.map +1 -1
  33. package/build/services/MicStateCoordinator.js +34 -3
  34. package/build/services/MicStateCoordinator.js.map +1 -1
  35. package/build/services/PhoneStreamCoordinator.d.ts +8 -0
  36. package/build/services/PhoneStreamCoordinator.d.ts.map +1 -1
  37. package/build/services/PhoneStreamCoordinator.js +2 -0
  38. package/build/services/PhoneStreamCoordinator.js.map +1 -1
  39. package/build/services/SoftapCallTransport.d.ts +365 -0
  40. package/build/services/SoftapCallTransport.d.ts.map +1 -0
  41. package/build/services/SoftapCallTransport.js +722 -0
  42. package/build/services/SoftapCallTransport.js.map +1 -0
  43. package/build/services/SoftapCleanupBarrier.d.ts +45 -0
  44. package/build/services/SoftapCleanupBarrier.d.ts.map +1 -0
  45. package/build/services/SoftapCleanupBarrier.js +51 -0
  46. package/build/services/SoftapCleanupBarrier.js.map +1 -0
  47. package/build/utils/pcm16.d.ts +35 -0
  48. package/build/utils/pcm16.d.ts.map +1 -0
  49. package/build/utils/pcm16.js +85 -0
  50. package/build/utils/pcm16.js.map +1 -0
  51. package/build/utils/softapTrace.d.ts +39 -0
  52. package/build/utils/softapTrace.d.ts.map +1 -0
  53. package/build/utils/softapTrace.js +124 -0
  54. package/build/utils/softapTrace.js.map +1 -0
  55. package/package.json +7 -7
  56. package/src/generated/releaseMetadata.ts +5 -5
  57. package/src/index.ts +2 -0
  58. package/src/services/AcsMeetingService.ts +956 -22
  59. package/src/services/AudioPlaybackService.ts +12 -3
  60. package/src/services/GlassesMicProbe.ts +300 -0
  61. package/src/services/LocalMiniappRuntime.ts +775 -42
  62. package/src/services/MentraJSLogPipeline.ts +70 -3
  63. package/src/services/MentraJSRouter.ts +2 -2
  64. package/src/services/MicStateCoordinator.ts +35 -3
  65. package/src/services/PhoneStreamCoordinator.ts +10 -0
  66. package/src/services/SoftapCallTransport.ts +928 -0
  67. package/src/services/SoftapCleanupBarrier.ts +72 -0
  68. package/src/utils/pcm16.ts +93 -0
  69. 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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"}