@mentra/miniapp 3.2.1-beta.319 → 3.2.1-beta.354

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 (102) hide show
  1. package/README.md +16 -0
  2. package/dist/background/index.d.ts +5 -3
  3. package/dist/background/index.d.ts.map +1 -1
  4. package/dist/background/index.js +1 -0
  5. package/dist/background/index.js.map +1 -1
  6. package/dist/index.d.ts +6 -3
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +2 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/modules/display.d.ts +33 -0
  11. package/dist/modules/display.d.ts.map +1 -1
  12. package/dist/modules/display.js +2 -0
  13. package/dist/modules/display.js.map +1 -1
  14. package/dist/modules/meeting.d.ts +66 -6
  15. package/dist/modules/meeting.d.ts.map +1 -1
  16. package/dist/modules/meeting.js +72 -19
  17. package/dist/modules/meeting.js.map +1 -1
  18. package/dist/modules/stream.d.ts +46 -0
  19. package/dist/modules/stream.d.ts.map +1 -1
  20. package/dist/modules/stream.js +107 -0
  21. package/dist/modules/stream.js.map +1 -1
  22. package/dist/protocol.d.ts +39 -0
  23. package/dist/protocol.d.ts.map +1 -1
  24. package/dist/protocol.js +36 -0
  25. package/dist/protocol.js.map +1 -1
  26. package/dist/react/StreamPreview.d.ts +41 -0
  27. package/dist/react/StreamPreview.d.ts.map +1 -0
  28. package/dist/react/StreamPreview.js +144 -0
  29. package/dist/react/StreamPreview.js.map +1 -0
  30. package/dist/react/index.d.ts +2 -0
  31. package/dist/react/index.d.ts.map +1 -1
  32. package/dist/react/index.js +1 -0
  33. package/dist/react/index.js.map +1 -1
  34. package/dist/react/stream-preview/PreviewConnection.d.ts +139 -0
  35. package/dist/react/stream-preview/PreviewConnection.d.ts.map +1 -0
  36. package/dist/react/stream-preview/PreviewConnection.js +462 -0
  37. package/dist/react/stream-preview/PreviewConnection.js.map +1 -0
  38. package/dist/react/stream-preview/controlChannel.d.ts +75 -0
  39. package/dist/react/stream-preview/controlChannel.d.ts.map +1 -0
  40. package/dist/react/stream-preview/controlChannel.js +55 -0
  41. package/dist/react/stream-preview/controlChannel.js.map +1 -0
  42. package/dist/react/stream-preview/creditLoop.d.ts +81 -0
  43. package/dist/react/stream-preview/creditLoop.d.ts.map +1 -0
  44. package/dist/react/stream-preview/creditLoop.js +146 -0
  45. package/dist/react/stream-preview/creditLoop.js.map +1 -0
  46. package/dist/react/stream-preview/protocol.d.ts +113 -0
  47. package/dist/react/stream-preview/protocol.d.ts.map +1 -0
  48. package/dist/react/stream-preview/protocol.js +148 -0
  49. package/dist/react/stream-preview/protocol.js.map +1 -0
  50. package/dist/react/stream-preview/resizeCoalescer.d.ts +38 -0
  51. package/dist/react/stream-preview/resizeCoalescer.d.ts.map +1 -0
  52. package/dist/react/stream-preview/resizeCoalescer.js +71 -0
  53. package/dist/react/stream-preview/resizeCoalescer.js.map +1 -0
  54. package/dist/react/stream-preview/testFrames.d.ts +38 -0
  55. package/dist/react/stream-preview/testFrames.d.ts.map +1 -0
  56. package/dist/react/stream-preview/testFrames.js +50 -0
  57. package/dist/react/stream-preview/testFrames.js.map +1 -0
  58. package/dist/react/stream-preview/tiers.d.ts +21 -0
  59. package/dist/react/stream-preview/tiers.d.ts.map +1 -0
  60. package/dist/react/stream-preview/tiers.js +33 -0
  61. package/dist/react/stream-preview/tiers.js.map +1 -0
  62. package/dist/react/stream-preview/trace.d.ts +23 -0
  63. package/dist/react/stream-preview/trace.d.ts.map +1 -0
  64. package/dist/react/stream-preview/trace.js +71 -0
  65. package/dist/react/stream-preview/trace.js.map +1 -0
  66. package/dist/react/stream-preview/transport.d.ts +79 -0
  67. package/dist/react/stream-preview/transport.d.ts.map +1 -0
  68. package/dist/react/stream-preview/transport.js +209 -0
  69. package/dist/react/stream-preview/transport.js.map +1 -0
  70. package/dist/react/stream-preview/yuvRenderer.d.ts +31 -0
  71. package/dist/react/stream-preview/yuvRenderer.d.ts.map +1 -0
  72. package/dist/react/stream-preview/yuvRenderer.js +398 -0
  73. package/dist/react/stream-preview/yuvRenderer.js.map +1 -0
  74. package/dist/session.d.ts +5 -0
  75. package/dist/session.d.ts.map +1 -1
  76. package/dist/session.js +5 -0
  77. package/dist/session.js.map +1 -1
  78. package/dist/ui/index.d.ts +2 -0
  79. package/dist/ui/index.d.ts.map +1 -1
  80. package/dist/ui/index.js +1 -0
  81. package/dist/ui/index.js.map +1 -1
  82. package/package.json +8 -3
  83. package/src/background/index.ts +14 -1
  84. package/src/index.ts +15 -0
  85. package/src/modules/display.ts +37 -0
  86. package/src/modules/meeting.ts +133 -23
  87. package/src/modules/stream.ts +153 -1
  88. package/src/protocol.ts +75 -0
  89. package/src/react/StreamPreview.tsx +187 -0
  90. package/src/react/index.ts +2 -0
  91. package/src/react/stream-preview/PreviewConnection.ts +552 -0
  92. package/src/react/stream-preview/controlChannel.ts +119 -0
  93. package/src/react/stream-preview/creditLoop.ts +189 -0
  94. package/src/react/stream-preview/protocol.ts +227 -0
  95. package/src/react/stream-preview/resizeCoalescer.ts +88 -0
  96. package/src/react/stream-preview/testFrames.ts +86 -0
  97. package/src/react/stream-preview/tiers.ts +37 -0
  98. package/src/react/stream-preview/trace.ts +81 -0
  99. package/src/react/stream-preview/transport.ts +242 -0
  100. package/src/react/stream-preview/yuvRenderer.ts +453 -0
  101. package/src/session.ts +8 -0
  102. package/src/ui/index.ts +2 -0
@@ -0,0 +1,139 @@
1
+ /**
2
+ * The preview connection for this document.
3
+ *
4
+ * Three owners with three lifetimes meet here:
5
+ * - The **lease** belongs to the miniapp's background (`session.stream.preview()`). The page
6
+ * never creates or releases it; it only hears `lease_available` / `lease_ended`.
7
+ * - The **connection** belongs to this document: the host config (token, docGen), the frame
8
+ * transport and the credit loop. It is a module-scoped singleton so it survives
9
+ * `<StreamPreview>` unmounting and remounting; a remount sends `start` without a handshake.
10
+ * It ends with the document (reload, navigation, `pagehide`) or when the lease ends.
11
+ * - The **renderer** belongs to the component and is attached here only as a draw callback.
12
+ *
13
+ * Control is desired-state: the component says which mount epoch wants which tier and whether it
14
+ * wants frames, and `sync()` sends the difference to the host over `_preview`. A new document
15
+ * always needs a new handshake; a new mount never does.
16
+ */
17
+ import type { PreviewControlChannel } from "./controlChannel";
18
+ import { type CreditLoopStats } from "./creditLoop";
19
+ import type { ParsedFrame } from "./protocol";
20
+ import { type PreviewTier } from "./tiers";
21
+ import { type PreviewTransport, type PreviewTransportOptions } from "./transport";
22
+ /** The only control protocol this SDK speaks. Anything else is reported as `unsupported`. */
23
+ export declare const PREVIEW_PROTOCOL_VERSION = 1;
24
+ export type PreviewConnectionState =
25
+ /** No handshake attempted yet in this document, or the lease ended and nobody wants frames. */
26
+ "idle" | "handshaking"
27
+ /** The host has no lease for this miniapp yet. Not an error: `lease_available` will follow. */
28
+ | "waiting_for_lease" | "connecting" | "open"
29
+ /** A failure that a re-handshake may fix (transport lost, ack timeout, host refused). */
30
+ | "error"
31
+ /** Terminal for this document: unknown protocol version or missing platform support. */
32
+ | "unsupported"
33
+ /** Not running inside a Mentra App WebView. */
34
+ | "unavailable" | "closed";
35
+ export interface PreviewConnectionStateDetail {
36
+ code?: string;
37
+ reason?: string;
38
+ paused?: boolean;
39
+ }
40
+ /** What a mounted `<StreamPreview>` gives the connection. */
41
+ export interface PreviewSink {
42
+ readonly mountEpoch: number;
43
+ /** Submit one frame; null when the renderer has no usable context. */
44
+ draw(frame: ParsedFrame): number | null;
45
+ onState(state: PreviewConnectionState, detail: PreviewConnectionStateDetail): void;
46
+ onStatus(status: Record<string, unknown>): void;
47
+ onError(code: string): void;
48
+ }
49
+ export interface PreviewDesiredState {
50
+ /** Rendered box in device pixels; only sent when `tier` changes. */
51
+ boxWidth: number;
52
+ boxHeight: number;
53
+ /** Null means hidden (zero-size box). */
54
+ tier: PreviewTier | null;
55
+ /** False while the page is hidden (`visibilitychange`) or the component is unmounting. */
56
+ running: boolean;
57
+ }
58
+ export interface PreviewConnectionCounters {
59
+ handshakes: number;
60
+ reconnects: number;
61
+ staleReplies: number;
62
+ staleLocalOps: number;
63
+ tierChanges: number;
64
+ page: CreditLoopStats;
65
+ }
66
+ export interface PreviewConnectionDeps {
67
+ channel: PreviewControlChannel | null;
68
+ createTransport?: (transport: "websocket" | "webmessage", options: PreviewTransportOptions) => PreviewTransport;
69
+ now?: () => number;
70
+ /** Document event hookup; defaults to the real `document`/`window`. */
71
+ listen?: (target: "document" | "window", type: string, handler: () => void) => () => void;
72
+ isDocumentVisible?: () => boolean;
73
+ }
74
+ export declare class PreviewConnection {
75
+ private readonly deps;
76
+ private state;
77
+ private detail;
78
+ private docGen;
79
+ private config;
80
+ private transport;
81
+ /** Bumped whenever the transport is dropped, so a stale async continuation can tell. */
82
+ private connectionGen;
83
+ private mountEpochCounter;
84
+ private latestEpoch;
85
+ private sink;
86
+ private desired;
87
+ private applied;
88
+ /** Epoch whose production the host halted on a non-recoverable error; not restarted until remount. */
89
+ private haltedEpoch;
90
+ private handshaking;
91
+ private opChain;
92
+ private reconnectTimes;
93
+ private paused;
94
+ private readonly creditLoop;
95
+ private readonly createTransport;
96
+ private readonly now;
97
+ private readonly isVisible;
98
+ private readonly unsubscribers;
99
+ private counters;
100
+ constructor(deps: PreviewConnectionDeps);
101
+ get currentState(): PreviewConnectionState;
102
+ get documentGeneration(): number;
103
+ snapshot(): PreviewConnectionCounters;
104
+ /** A fresh, strictly increasing epoch for a component mounting in this document. */
105
+ nextMountEpoch(): number;
106
+ /**
107
+ * Route frames to this component's renderer. The newest mount wins; an older sink detaching
108
+ * later cannot remove a newer one.
109
+ */
110
+ attach(sink: PreviewSink): () => void;
111
+ /** Declare what `mountEpoch` wants. Operations from a superseded epoch are ignored. */
112
+ update(mountEpoch: number, state: PreviewDesiredState): void;
113
+ reportRendererError(mountEpoch: number, message: string): void;
114
+ /** End of document. The lease is untouched; a new document will handshake again. */
115
+ close(reason: string): void;
116
+ /** Test seam: detach from the channel and document. */
117
+ dispose(): void;
118
+ private sync;
119
+ private wantsFrames;
120
+ private syncOnce;
121
+ /** False when the host dropped the op as stale; our identity is then out of date. */
122
+ private accept;
123
+ private send;
124
+ private ensureOpen;
125
+ private handshake;
126
+ private openTransport;
127
+ private handleTransportError;
128
+ private handleHostEvent;
129
+ private handleHostError;
130
+ private handleVisibility;
131
+ private scheduleReconnect;
132
+ private dropTransport;
133
+ private setState;
134
+ }
135
+ /** The connection for this document, created on first use. */
136
+ export declare function getPreviewConnection(): PreviewConnection;
137
+ /** Test seam: replace (or clear) the document singleton, as a reload would. */
138
+ export declare function setPreviewConnectionForTests(next: PreviewConnection | null): void;
139
+ //# sourceMappingURL=PreviewConnection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewConnection.d.ts","sourceRoot":"","sources":["../../../src/react/stream-preview/PreviewConnection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,462 @@
1
+ /**
2
+ * The preview connection for this document.
3
+ *
4
+ * Three owners with three lifetimes meet here:
5
+ * - The **lease** belongs to the miniapp's background (`session.stream.preview()`). The page
6
+ * never creates or releases it; it only hears `lease_available` / `lease_ended`.
7
+ * - The **connection** belongs to this document: the host config (token, docGen), the frame
8
+ * transport and the credit loop. It is a module-scoped singleton so it survives
9
+ * `<StreamPreview>` unmounting and remounting; a remount sends `start` without a handshake.
10
+ * It ends with the document (reload, navigation, `pagehide`) or when the lease ends.
11
+ * - The **renderer** belongs to the component and is attached here only as a draw callback.
12
+ *
13
+ * Control is desired-state: the component says which mount epoch wants which tier and whether it
14
+ * wants frames, and `sync()` sends the difference to the host over `_preview`. A new document
15
+ * always needs a new handshake; a new mount never does.
16
+ */
17
+ import { createMentraControlChannel, PreviewControlError } from "./controlChannel";
18
+ import { CreditLoop } from "./creditLoop";
19
+ import { sameTier } from "./tiers";
20
+ import { previewTrace, previewTraceWarn, previewTraceWarnLimited } from "./trace";
21
+ import { ackMessage, createPreviewTransport } from "./transport";
22
+ /** The only control protocol this SDK speaks. Anything else is reported as `unsupported`. */
23
+ export const PREVIEW_PROTOCOL_VERSION = 1;
24
+ /** Automatic re-handshakes after a transport failure, per window, before giving up until remount. */
25
+ const RECONNECT_BUDGET = 3;
26
+ const RECONNECT_WINDOW_MS = 60000;
27
+ /** Immediate re-handshakes after the host answers a handshake as stale. */
28
+ const STALE_HANDSHAKE_RETRIES = 2;
29
+ function defaultListen(target, type, handler) {
30
+ const node = target === "document"
31
+ ? typeof document === "undefined"
32
+ ? null
33
+ : document
34
+ : typeof window === "undefined"
35
+ ? null
36
+ : window;
37
+ if (!node)
38
+ return () => { };
39
+ node.addEventListener(type, handler);
40
+ return () => node.removeEventListener(type, handler);
41
+ }
42
+ function defaultIsVisible() {
43
+ return typeof document === "undefined" || document.visibilityState !== "hidden";
44
+ }
45
+ const NOTHING_APPLIED = { epoch: -1, tier: null, running: false };
46
+ export class PreviewConnection {
47
+ constructor(deps) {
48
+ this.deps = deps;
49
+ this.detail = {};
50
+ this.docGen = 0;
51
+ this.config = null;
52
+ this.transport = null;
53
+ /** Bumped whenever the transport is dropped, so a stale async continuation can tell. */
54
+ this.connectionGen = 0;
55
+ this.mountEpochCounter = 0;
56
+ this.latestEpoch = 0;
57
+ this.sink = null;
58
+ this.desired = null;
59
+ this.applied = NOTHING_APPLIED;
60
+ /** Epoch whose production the host halted on a non-recoverable error; not restarted until remount. */
61
+ this.haltedEpoch = -1;
62
+ this.handshaking = null;
63
+ this.opChain = Promise.resolve();
64
+ this.reconnectTimes = [];
65
+ this.paused = false;
66
+ this.unsubscribers = [];
67
+ this.counters = { handshakes: 0, reconnects: 0, staleReplies: 0, staleLocalOps: 0, tierChanges: 0 };
68
+ this.createTransport = deps.createTransport ?? createPreviewTransport;
69
+ this.now = deps.now ?? (() => (typeof performance !== "undefined" ? performance.now() : Date.now()));
70
+ this.isVisible = deps.isDocumentVisible ?? defaultIsVisible;
71
+ this.state = deps.channel ? "idle" : "unavailable";
72
+ this.creditLoop = new CreditLoop({
73
+ sendAck: (gen, seq) => this.transport?.sendText(ackMessage(gen, seq)),
74
+ onParseError: (reason) => previewTraceWarnLimited(`parse:${reason}`, "parse_reject", { reason, docGen: this.docGen }),
75
+ });
76
+ if (deps.channel) {
77
+ this.unsubscribers.push(deps.channel.onEvent((event) => this.handleHostEvent(event)));
78
+ const listen = deps.listen ?? defaultListen;
79
+ this.unsubscribers.push(listen("window", "pagehide", () => this.close("pagehide")));
80
+ // A page restored from the back/forward cache is the same document with a dead transport.
81
+ this.unsubscribers.push(listen("window", "pageshow", () => {
82
+ if (this.state !== "closed")
83
+ return;
84
+ this.setState("idle", { reason: "pageshow" });
85
+ this.sync();
86
+ }));
87
+ this.unsubscribers.push(listen("document", "visibilitychange", () => this.handleVisibility()));
88
+ }
89
+ }
90
+ get currentState() {
91
+ return this.state;
92
+ }
93
+ get documentGeneration() {
94
+ return this.docGen;
95
+ }
96
+ snapshot() {
97
+ return { ...this.counters, page: this.creditLoop.snapshot() };
98
+ }
99
+ /** A fresh, strictly increasing epoch for a component mounting in this document. */
100
+ nextMountEpoch() {
101
+ this.mountEpochCounter += 1;
102
+ return this.mountEpochCounter;
103
+ }
104
+ /**
105
+ * Route frames to this component's renderer. The newest mount wins; an older sink detaching
106
+ * later cannot remove a newer one.
107
+ */
108
+ attach(sink) {
109
+ if (sink.mountEpoch < this.latestEpoch) {
110
+ this.counters.staleLocalOps += 1;
111
+ return () => { };
112
+ }
113
+ this.latestEpoch = sink.mountEpoch;
114
+ this.sink = sink;
115
+ this.creditLoop.setDraw((frame) => sink.draw(frame));
116
+ sink.onState(this.state, { ...this.detail, paused: this.paused });
117
+ return () => {
118
+ if (this.sink !== sink)
119
+ return;
120
+ this.sink = null;
121
+ this.creditLoop.setDraw(null);
122
+ };
123
+ }
124
+ /** Declare what `mountEpoch` wants. Operations from a superseded epoch are ignored. */
125
+ update(mountEpoch, state) {
126
+ if (mountEpoch < this.latestEpoch) {
127
+ this.counters.staleLocalOps += 1;
128
+ previewTrace("stale_local_op", { mountEpoch, latestEpoch: this.latestEpoch });
129
+ return;
130
+ }
131
+ this.latestEpoch = mountEpoch;
132
+ this.desired = { epoch: mountEpoch, state };
133
+ this.sync();
134
+ }
135
+ reportRendererError(mountEpoch, message) {
136
+ this.creditLoop.recordError(message);
137
+ if (this.state !== "open" || !this.config)
138
+ return;
139
+ void this.send({ cmd: "rendererError", mountEpoch, message }).catch(() => undefined);
140
+ }
141
+ /** End of document. The lease is untouched; a new document will handshake again. */
142
+ close(reason) {
143
+ if (this.state === "closed")
144
+ return;
145
+ previewTrace("connection_closed", { reason, docGen: this.docGen });
146
+ this.dropTransport();
147
+ this.setState("closed", { reason });
148
+ }
149
+ /** Test seam: detach from the channel and document. */
150
+ dispose() {
151
+ for (const unsubscribe of this.unsubscribers.splice(0))
152
+ unsubscribe();
153
+ this.dropTransport();
154
+ }
155
+ // ---------------------------------------------------------------------------
156
+ sync() {
157
+ this.opChain = this.opChain
158
+ .then(() => this.syncOnce())
159
+ .catch((error) => {
160
+ previewTraceWarn("sync_failed", { error: error instanceof Error ? error.message : String(error) });
161
+ });
162
+ }
163
+ wantsFrames() {
164
+ const desired = this.desired;
165
+ return !!desired && desired.state.running && desired.state.tier !== null && desired.epoch !== this.haltedEpoch;
166
+ }
167
+ async syncOnce() {
168
+ const desired = this.desired;
169
+ if (!desired)
170
+ return;
171
+ if (this.state !== "open") {
172
+ // Hidden components never force a handshake; the next visible one will.
173
+ if (!this.wantsFrames())
174
+ return;
175
+ if (!(await this.ensureOpen()))
176
+ return;
177
+ }
178
+ const gen = this.connectionGen;
179
+ const { epoch, state } = desired;
180
+ if (state.tier && !sameTier(state.tier, this.applied.tier)) {
181
+ const reply = await this.send({
182
+ cmd: "configure",
183
+ mountEpoch: epoch,
184
+ boxWidth: state.boxWidth,
185
+ boxHeight: state.boxHeight,
186
+ });
187
+ if (gen !== this.connectionGen || !this.accept(reply, "configure"))
188
+ return;
189
+ this.counters.tierChanges += 1;
190
+ previewTrace("tier_sent", {
191
+ mountEpoch: epoch,
192
+ width: state.tier.width,
193
+ height: state.tier.height,
194
+ docGen: this.docGen,
195
+ });
196
+ this.applied = { ...this.applied, tier: state.tier };
197
+ }
198
+ const running = this.wantsFrames();
199
+ if (running !== this.applied.running || (running && epoch !== this.applied.epoch)) {
200
+ const reply = await this.send({ cmd: running ? "start" : "stop", mountEpoch: epoch });
201
+ if (gen !== this.connectionGen || !this.accept(reply, running ? "start" : "stop"))
202
+ return;
203
+ this.applied = { ...this.applied, epoch, running };
204
+ }
205
+ }
206
+ /** False when the host dropped the op as stale; our identity is then out of date. */
207
+ accept(reply, cmd) {
208
+ if (!reply)
209
+ return false;
210
+ if (!reply.stale)
211
+ return true;
212
+ this.counters.staleReplies += 1;
213
+ previewTraceWarn("control_stale", { cmd, docGen: this.docGen });
214
+ // The host no longer recognises this document's credential: start over with a handshake.
215
+ this.dropTransport();
216
+ this.setState("idle", { reason: "stale_identity" });
217
+ this.scheduleReconnect("stale_identity");
218
+ return false;
219
+ }
220
+ async send(request) {
221
+ const channel = this.deps.channel;
222
+ if (!channel)
223
+ return null;
224
+ try {
225
+ const reply = await channel.request({ ...request, docGen: this.docGen, token: this.config?.token });
226
+ return (reply ?? {});
227
+ }
228
+ catch (error) {
229
+ const code = error instanceof PreviewControlError ? error.code : "transport_failed";
230
+ previewTraceWarn("control_failed", { cmd: request.cmd, code, docGen: this.docGen });
231
+ this.sink?.onError(code);
232
+ return null;
233
+ }
234
+ }
235
+ ensureOpen() {
236
+ if (this.state === "open")
237
+ return Promise.resolve(true);
238
+ if (this.state === "unsupported" || this.state === "unavailable" || this.state === "closed") {
239
+ return Promise.resolve(false);
240
+ }
241
+ if (!this.handshaking) {
242
+ this.handshaking = this.handshake().finally(() => {
243
+ this.handshaking = null;
244
+ });
245
+ }
246
+ return this.handshaking;
247
+ }
248
+ async handshake(staleRetries = STALE_HANDSHAKE_RETRIES) {
249
+ const channel = this.deps.channel;
250
+ if (!channel)
251
+ return false;
252
+ const gen = this.connectionGen;
253
+ const mountEpoch = this.desired?.epoch ?? 0;
254
+ this.setState("handshaking");
255
+ previewTrace("handshake_attempt", { docGen: this.docGen, mountEpoch });
256
+ let result;
257
+ try {
258
+ result = (await channel.request({ cmd: "handshake", docGen: this.docGen, mountEpoch }));
259
+ }
260
+ catch (error) {
261
+ const code = error instanceof PreviewControlError ? error.code : "transport_failed";
262
+ const message = error instanceof Error ? error.message.slice(0, 120) : undefined;
263
+ previewTraceWarn("handshake_failed", { code, message, docGen: this.docGen });
264
+ // A bind that is not ready yet is reported as unsupported. That used to
265
+ // stick for the whole document. Treat it like a transport error and try again.
266
+ this.setState("error", { code });
267
+ this.sink?.onError(code);
268
+ if (this.isVisible() && this.wantsFrames())
269
+ this.scheduleReconnect(code);
270
+ return false;
271
+ }
272
+ if (gen !== this.connectionGen)
273
+ return false;
274
+ if (!result || typeof result !== "object") {
275
+ this.setState("error", { code: "transport_failed" });
276
+ return false;
277
+ }
278
+ if ("stale" in result) {
279
+ // The docGen this page claimed (or the one minted for it mid-handshake) was superseded,
280
+ // e.g. by the `ready` that follows `handshake_without_ready`. Ask again as a page that does
281
+ // not know its document yet; the host answers with its current one.
282
+ this.counters.staleReplies += 1;
283
+ previewTraceWarn("handshake_stale", { docGen: this.docGen, staleRetries });
284
+ this.docGen = 0;
285
+ if (staleRetries > 0)
286
+ return this.handshake(staleRetries - 1);
287
+ this.setState("error", { reason: "stale_identity" });
288
+ return false;
289
+ }
290
+ if (result.t === "waiting_for_lease") {
291
+ if (typeof result.docGen === "number")
292
+ this.docGen = result.docGen;
293
+ previewTrace("waiting_for_lease", { docGen: this.docGen });
294
+ this.setState("waiting_for_lease");
295
+ return false;
296
+ }
297
+ return this.openTransport(result);
298
+ }
299
+ async openTransport(config) {
300
+ if (config.protocolVersion !== PREVIEW_PROTOCOL_VERSION) {
301
+ previewTraceWarn("handshake_rejected", { reason: "unsupported_version", protocolVersion: config.protocolVersion });
302
+ this.setState("unsupported", { code: "unsupported" });
303
+ this.sink?.onError("unsupported");
304
+ return false;
305
+ }
306
+ this.docGen = config.docGen;
307
+ this.config = config;
308
+ this.counters.handshakes += 1;
309
+ this.setState("connecting");
310
+ const gen = ++this.connectionGen;
311
+ let transport;
312
+ try {
313
+ transport = this.createTransport(config.transport, {
314
+ url: config.url,
315
+ portName: config.portName,
316
+ token: config.token,
317
+ });
318
+ transport.onBinary((buffer) => this.creditLoop.handleBinary(buffer));
319
+ transport.onError((reason) => this.handleTransportError(gen, reason));
320
+ await transport.connect();
321
+ }
322
+ catch (error) {
323
+ const reason = error.reason ?? "connect_failed";
324
+ previewTraceWarn("transport_failed", { reason, docGen: this.docGen, transport: config.transport });
325
+ if (gen === this.connectionGen) {
326
+ this.config = null;
327
+ this.setState("error", { code: "transport_failed", reason });
328
+ this.sink?.onError("transport_failed");
329
+ }
330
+ return false;
331
+ }
332
+ if (gen !== this.connectionGen) {
333
+ transport.close();
334
+ return false;
335
+ }
336
+ this.transport = transport;
337
+ this.applied = NOTHING_APPLIED;
338
+ previewTrace("handshake_ok", {
339
+ docGen: this.docGen,
340
+ transport: config.transport,
341
+ handshakes: this.counters.handshakes,
342
+ });
343
+ this.setState("open");
344
+ return true;
345
+ }
346
+ handleTransportError(gen, reason) {
347
+ if (gen !== this.connectionGen)
348
+ return;
349
+ previewTraceWarn("transport_closed", { reason, docGen: this.docGen });
350
+ this.dropTransport();
351
+ this.setState("error", { code: "transport_failed", reason });
352
+ this.sink?.onError("transport_failed");
353
+ // A socket the OS tore down while suspended is re-established on foreground instead.
354
+ if (this.isVisible())
355
+ this.scheduleReconnect(reason);
356
+ }
357
+ handleHostEvent(event) {
358
+ switch (event.t) {
359
+ case "lease_available":
360
+ previewTrace("lease_available", { docGen: this.docGen, state: this.state });
361
+ if (this.state === "waiting_for_lease" ||
362
+ this.state === "idle" ||
363
+ this.state === "error" ||
364
+ this.state === "unsupported") {
365
+ this.setState("idle");
366
+ // Hidden stays connected-but-stopped, so handshake as soon as anyone has mounted.
367
+ if (this.desired)
368
+ void this.ensureOpen().then((open) => open && this.sync());
369
+ }
370
+ return;
371
+ case "lease_ended":
372
+ previewTrace("lease_ended", { reason: event.reason, docGen: this.docGen });
373
+ this.dropTransport();
374
+ this.setState("waiting_for_lease", { reason: event.reason });
375
+ if (event.reason === "source_ended")
376
+ this.sink?.onError("source_ended");
377
+ return;
378
+ case "error":
379
+ if (typeof event.docGen === "number" && event.docGen !== this.docGen)
380
+ return;
381
+ this.handleHostError(event.code);
382
+ return;
383
+ case "status":
384
+ this.sink?.onStatus({ ...event, page: this.snapshot() });
385
+ return;
386
+ case "paused_background":
387
+ this.paused = true;
388
+ this.sink?.onState(this.state, { ...this.detail, paused: true });
389
+ return;
390
+ case "resumed":
391
+ this.paused = false;
392
+ this.sink?.onState(this.state, { ...this.detail, paused: false });
393
+ return;
394
+ case "config":
395
+ if (event.docGen === this.docGen && this.state !== "open" && this.state !== "connecting") {
396
+ void this.openTransport(event).then((open) => open && this.sync());
397
+ }
398
+ return;
399
+ }
400
+ }
401
+ handleHostError(code) {
402
+ previewTraceWarn("host_error", { code, docGen: this.docGen });
403
+ this.sink?.onError(code);
404
+ if (code === "transport_failed" || code === "ack_timeout") {
405
+ this.dropTransport();
406
+ this.setState("error", { code });
407
+ this.scheduleReconnect(code);
408
+ return;
409
+ }
410
+ // The host halted production (pack_failed, diagnostics_disabled, ...). Restarting would only
411
+ // hit the same failure; a new mount epoch may try again.
412
+ this.applied = { ...this.applied, running: false };
413
+ this.haltedEpoch = this.desired?.epoch ?? this.haltedEpoch;
414
+ }
415
+ handleVisibility() {
416
+ const visible = this.isVisible();
417
+ previewTrace("visibility", { visible, state: this.state, docGen: this.docGen });
418
+ if (visible && (this.state === "error" || this.state === "idle"))
419
+ this.sync();
420
+ }
421
+ scheduleReconnect(reason) {
422
+ const at = this.now();
423
+ this.reconnectTimes = this.reconnectTimes.filter((t) => at - t < RECONNECT_WINDOW_MS);
424
+ if (this.reconnectTimes.length >= RECONNECT_BUDGET) {
425
+ previewTraceWarn("reconnect_budget_exhausted", { reason, docGen: this.docGen });
426
+ return;
427
+ }
428
+ this.reconnectTimes.push(at);
429
+ this.counters.reconnects += 1;
430
+ previewTrace("reconnect", { reason, docGen: this.docGen, reconnects: this.counters.reconnects });
431
+ this.sync();
432
+ }
433
+ dropTransport() {
434
+ this.connectionGen += 1;
435
+ const transport = this.transport;
436
+ this.transport = null;
437
+ this.config = null;
438
+ this.applied = NOTHING_APPLIED;
439
+ if (transport) {
440
+ transport.close();
441
+ previewTrace("transport_close", { docGen: this.docGen });
442
+ }
443
+ }
444
+ setState(state, detail = {}) {
445
+ this.state = state;
446
+ this.detail = detail;
447
+ this.sink?.onState(state, { ...detail, paused: this.paused });
448
+ }
449
+ }
450
+ let shared = null;
451
+ /** The connection for this document, created on first use. */
452
+ export function getPreviewConnection() {
453
+ if (!shared)
454
+ shared = new PreviewConnection({ channel: createMentraControlChannel() });
455
+ return shared;
456
+ }
457
+ /** Test seam: replace (or clear) the document singleton, as a reload would. */
458
+ export function setPreviewConnectionForTests(next) {
459
+ shared?.dispose();
460
+ shared = next;
461
+ }
462
+ //# sourceMappingURL=PreviewConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewConnection.js","sourceRoot":"","sources":["../../../src/react/stream-preview/PreviewConnection.ts"],"names":[],"mappings":"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"}