@mentra/sdk 2.1.31-beta.5 → 3.0.0-alpha.1
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/README.md +54 -9
- package/dist/MiniAppServer.d.ts +58 -0
- package/dist/MiniAppServer.d.ts.map +1 -0
- package/dist/app/server/index.d.ts +208 -70
- package/dist/app/server/index.d.ts.map +1 -1
- package/dist/app/session/events.d.ts +20 -3
- package/dist/app/session/events.d.ts.map +1 -1
- package/dist/app/session/index.d.ts +56 -3
- package/dist/app/session/index.d.ts.map +1 -1
- package/dist/app/session/modules/audio-output-stream.d.ts +108 -0
- package/dist/app/session/modules/audio-output-stream.d.ts.map +1 -0
- package/dist/app/session/modules/audio.d.ts +36 -1
- package/dist/app/session/modules/audio.d.ts.map +1 -1
- package/dist/app/session/modules/camera-managed-extension.d.ts +37 -33
- package/dist/app/session/modules/camera-managed-extension.d.ts.map +1 -1
- package/dist/app/session/modules/camera.d.ts +113 -93
- package/dist/app/session/modules/camera.d.ts.map +1 -1
- package/dist/app/session/modules/index.d.ts +4 -3
- package/dist/app/session/modules/index.d.ts.map +1 -1
- package/dist/app/session/modules/led.d.ts.map +1 -1
- package/dist/app/session/modules/location.d.ts.map +1 -1
- package/dist/app/session/settings.d.ts +5 -1
- package/dist/app/session/settings.d.ts.map +1 -1
- package/dist/app/webview/index.d.ts +67 -9
- package/dist/app/webview/index.d.ts.map +1 -1
- package/dist/constants/log-messages/updates.d.ts +32 -9
- package/dist/constants/log-messages/updates.d.ts.map +1 -1
- package/dist/constants/log-messages/warning.d.ts +12 -0
- package/dist/constants/log-messages/warning.d.ts.map +1 -1
- package/dist/display-utils.d.ts +3 -1
- package/dist/display-utils.d.ts.map +1 -1
- package/dist/display-utils.js +443 -26
- package/dist/display-utils.js.map +10 -6
- package/dist/index.d.ts +22 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8957 -4428
- package/dist/index.js.map +63 -31
- package/dist/internal/_SessionManager.d.ts +76 -0
- package/dist/internal/_SessionManager.d.ts.map +1 -0
- package/dist/logging/clean-transport.d.ts +50 -0
- package/dist/logging/clean-transport.d.ts.map +1 -0
- package/dist/logging/errors.d.ts +90 -0
- package/dist/logging/errors.d.ts.map +1 -0
- package/dist/logging/logger.d.ts +72 -1
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/telemetry-transport.d.ts +51 -0
- package/dist/logging/telemetry-transport.d.ts.map +1 -0
- package/dist/session/DataStreamRouter.d.ts +219 -0
- package/dist/session/DataStreamRouter.d.ts.map +1 -0
- package/dist/session/MentraSession.d.ts +102 -0
- package/dist/session/MentraSession.d.ts.map +1 -0
- package/dist/session/index.d.ts +2 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/internal/_ConnectionManager.d.ts +43 -0
- package/dist/session/internal/_ConnectionManager.d.ts.map +1 -0
- package/dist/session/internal/_MessageRouter.d.ts +11 -0
- package/dist/session/internal/_MessageRouter.d.ts.map +1 -0
- package/dist/session/internal/_SubscriptionManager.d.ts +32 -0
- package/dist/session/internal/_SubscriptionManager.d.ts.map +1 -0
- package/dist/session/internal/_V2AudioStreamShim.d.ts +12 -0
- package/dist/session/internal/_V2AudioStreamShim.d.ts.map +1 -0
- package/dist/session/internal/_V2CameraShim.d.ts +52 -0
- package/dist/session/internal/_V2CameraShim.d.ts.map +1 -0
- package/dist/session/internal/_V2EventManagerShim.d.ts +52 -0
- package/dist/session/internal/_V2EventManagerShim.d.ts.map +1 -0
- package/dist/session/internal/_V2SessionShim.d.ts +169 -0
- package/dist/session/internal/_V2SessionShim.d.ts.map +1 -0
- package/dist/session/internal/_V2SettingsShim.d.ts +17 -0
- package/dist/session/internal/_V2SettingsShim.d.ts.map +1 -0
- package/dist/session/managers/CameraManager.d.ts +198 -0
- package/dist/session/managers/CameraManager.d.ts.map +1 -0
- package/dist/session/managers/DashboardManager.d.ts +131 -0
- package/dist/session/managers/DashboardManager.d.ts.map +1 -0
- package/dist/session/managers/DeviceManager.d.ts +348 -0
- package/dist/session/managers/DeviceManager.d.ts.map +1 -0
- package/dist/session/managers/DisplayManager.d.ts +171 -0
- package/dist/session/managers/DisplayManager.d.ts.map +1 -0
- package/dist/session/managers/LedManager.d.ts +116 -0
- package/dist/session/managers/LedManager.d.ts.map +1 -0
- package/dist/session/managers/LocationManager.d.ts +224 -0
- package/dist/session/managers/LocationManager.d.ts.map +1 -0
- package/dist/session/managers/MicManager.d.ts +252 -0
- package/dist/session/managers/MicManager.d.ts.map +1 -0
- package/dist/session/managers/PermissionsManager.d.ts +139 -0
- package/dist/session/managers/PermissionsManager.d.ts.map +1 -0
- package/dist/session/managers/PhoneManager.d.ts +351 -0
- package/dist/session/managers/PhoneManager.d.ts.map +1 -0
- package/dist/session/managers/SpeakerManager.d.ts +285 -0
- package/dist/session/managers/SpeakerManager.d.ts.map +1 -0
- package/dist/session/managers/StorageManager.d.ts +289 -0
- package/dist/session/managers/StorageManager.d.ts.map +1 -0
- package/dist/session/managers/TimeUtils.d.ts +175 -0
- package/dist/session/managers/TimeUtils.d.ts.map +1 -0
- package/dist/session/managers/TranscriptionManager.d.ts +195 -0
- package/dist/session/managers/TranscriptionManager.d.ts.map +1 -0
- package/dist/session/managers/TranslationManager.d.ts +189 -0
- package/dist/session/managers/TranslationManager.d.ts.map +1 -0
- package/dist/session.d.ts +41 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +4110 -0
- package/dist/session.js.map +44 -0
- package/dist/transport/Transport.d.ts +119 -0
- package/dist/transport/Transport.d.ts.map +1 -0
- package/dist/transport/WebSocketTransport.d.ts +73 -0
- package/dist/transport/WebSocketTransport.d.ts.map +1 -0
- package/dist/types/index.d.ts +31 -5
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/message-types.d.ts +25 -9
- package/dist/types/message-types.d.ts.map +1 -1
- package/dist/types/messages/app-to-cloud.d.ts +113 -16
- package/dist/types/messages/app-to-cloud.d.ts.map +1 -1
- package/dist/types/messages/cloud-to-app.d.ts +50 -4
- package/dist/types/messages/cloud-to-app.d.ts.map +1 -1
- package/dist/types/messages/cloud-to-glasses.d.ts +43 -14
- package/dist/types/messages/cloud-to-glasses.d.ts.map +1 -1
- package/dist/types/messages/glasses-to-cloud.d.ts +5 -5
- package/dist/types/messages/glasses-to-cloud.d.ts.map +1 -1
- package/dist/types/models.d.ts +17 -0
- package/dist/types/models.d.ts.map +1 -1
- package/dist/types/rtmp-stream.d.ts +4 -4
- package/dist/types/rtmp-stream.d.ts.map +1 -1
- package/dist/types/streams.d.ts +6 -1
- package/dist/types/streams.d.ts.map +1 -1
- package/dist/types/webhooks.d.ts +11 -0
- package/dist/types/webhooks.d.ts.map +1 -1
- package/dist/utils/error-utils.d.ts +139 -0
- package/dist/utils/error-utils.d.ts.map +1 -0
- package/dist/utils/permissions-utils.d.ts +30 -7
- package/dist/utils/permissions-utils.d.ts.map +1 -1
- package/node_modules/@mentra/types/dist/applet.d.ts +5 -1
- package/node_modules/@mentra/types/dist/applet.d.ts.map +1 -1
- package/node_modules/@mentra/types/dist/capabilities/even-realities-g2.d.ts +12 -0
- package/node_modules/@mentra/types/dist/capabilities/even-realities-g2.d.ts.map +1 -0
- package/node_modules/@mentra/types/dist/capabilities/even-realities-g2.js +61 -0
- package/node_modules/@mentra/types/dist/capabilities/mentra-display.d.ts +12 -0
- package/node_modules/@mentra/types/dist/capabilities/mentra-display.d.ts.map +1 -0
- package/node_modules/@mentra/types/dist/capabilities/mentra-display.js +54 -0
- package/node_modules/@mentra/types/dist/capabilities/none.d.ts +13 -0
- package/node_modules/@mentra/types/dist/capabilities/none.d.ts.map +1 -0
- package/node_modules/@mentra/types/dist/capabilities/none.js +67 -0
- package/node_modules/@mentra/types/dist/enums.d.ts +8 -2
- package/node_modules/@mentra/types/dist/enums.d.ts.map +1 -1
- package/node_modules/@mentra/types/dist/enums.js +9 -2
- package/node_modules/@mentra/types/dist/hardware.d.ts +3 -1
- package/node_modules/@mentra/types/dist/hardware.d.ts.map +1 -1
- package/node_modules/@mentra/types/dist/hardware.js +12 -2
- package/node_modules/@mentra/types/dist/index.d.ts +1 -1
- package/node_modules/@mentra/types/dist/index.d.ts.map +1 -1
- package/node_modules/@mentra/types/dist/index.js +2 -1
- package/node_modules/@mentra/types/package.json +2 -2
- package/package.json +24 -12
- package/dist/examples/managed-rtmp-streaming-example.d.ts +0 -2
- package/dist/examples/managed-rtmp-streaming-example.d.ts.map +0 -1
- package/dist/examples/managed-rtmp-streaming-with-restream-example.d.ts +0 -11
- package/dist/examples/managed-rtmp-streaming-with-restream-example.d.ts.map +0 -1
- package/dist/examples/rtmp-streaming-example.d.ts +0 -2
- package/dist/examples/rtmp-streaming-example.d.ts.map +0 -1
- package/node_modules/@mentra/types/src/applet.ts +0 -51
- package/node_modules/@mentra/types/src/capabilities/even-realities-g1.ts +0 -63
- package/node_modules/@mentra/types/src/capabilities/mentra-live.ts +0 -103
- package/node_modules/@mentra/types/src/capabilities/simulated-glasses.ts +0 -76
- package/node_modules/@mentra/types/src/capabilities/vuzix-z100.ts +0 -60
- package/node_modules/@mentra/types/src/cli.ts +0 -169
- package/node_modules/@mentra/types/src/device.ts +0 -43
- package/node_modules/@mentra/types/src/enums.ts +0 -36
- package/node_modules/@mentra/types/src/hardware.ts +0 -172
- package/node_modules/@mentra/types/src/index.ts +0 -64
- package/node_modules/@mentra/types/tsconfig.json +0 -22
- package/node_modules/@mentra/types/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CameraManager — v3 SDK Camera API
|
|
3
|
+
*
|
|
4
|
+
* Covers:
|
|
5
|
+
* - photo capture
|
|
6
|
+
* - externally-triggered photo events
|
|
7
|
+
* - unmanaged RTMP streaming
|
|
8
|
+
* - managed stream orchestration/status
|
|
9
|
+
*/
|
|
10
|
+
import { type ManagedStreamStatus, type RestreamDestination, type StreamStatus, type AudioConfig, type StreamConfig, type VideoConfig } from "../../types";
|
|
11
|
+
export interface PhotoOptions {
|
|
12
|
+
size?: "small" | "medium" | "large" | "full";
|
|
13
|
+
compression?: "none" | "medium" | "heavy";
|
|
14
|
+
saveToGallery?: boolean;
|
|
15
|
+
sound?: boolean;
|
|
16
|
+
timeout?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface PhotoData {
|
|
19
|
+
url: string;
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
timestamp: number;
|
|
23
|
+
savedToGallery: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Options for session.camera.startStream().
|
|
27
|
+
*
|
|
28
|
+
* Three modes:
|
|
29
|
+
* - No options → managed relay (default, best for most apps)
|
|
30
|
+
* - `destinations` → managed relay + fan out to external services
|
|
31
|
+
* - `direct` → glasses connect straight to this URL, no relay
|
|
32
|
+
*/
|
|
33
|
+
export interface StreamOptions {
|
|
34
|
+
/** Direct stream URL. Glasses connect to this URL directly, bypassing the cloud relay.
|
|
35
|
+
* Supports srt://, rtmp://, rtmps://, and https:// (WHIP) protocols.
|
|
36
|
+
* When set, the cloud relay is not used. No viewer URLs are returned.
|
|
37
|
+
* Most apps should NOT use this — use the default managed relay instead. */
|
|
38
|
+
direct?: string;
|
|
39
|
+
/** Restream destinations. The cloud relay fans out to these URLs.
|
|
40
|
+
* Only works with managed streaming (when `direct` is not set).
|
|
41
|
+
* Each URL is an RTMP or SRT ingest endpoint (YouTube, Twitch, etc.) */
|
|
42
|
+
destinations?: string[];
|
|
43
|
+
/** Stream quality. Only applies to managed streaming. */
|
|
44
|
+
quality?: "720p" | "1080p";
|
|
45
|
+
/** Enable WebRTC playback URL. Only applies to managed streaming. Default: true. */
|
|
46
|
+
enableWebRTC?: boolean;
|
|
47
|
+
/** Video configuration (resolution, bitrate, fps) */
|
|
48
|
+
video?: VideoConfig;
|
|
49
|
+
/** Audio configuration (bitrate, sample rate) */
|
|
50
|
+
audio?: AudioConfig;
|
|
51
|
+
/** Stream transport configuration */
|
|
52
|
+
stream?: StreamConfig;
|
|
53
|
+
/** Controls stream start/stop sounds on the glasses. Default: true. */
|
|
54
|
+
sound?: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface StreamResult {
|
|
57
|
+
hlsUrl: string;
|
|
58
|
+
dashUrl: string;
|
|
59
|
+
webrtcUrl?: string;
|
|
60
|
+
previewUrl?: string;
|
|
61
|
+
thumbnailUrl?: string;
|
|
62
|
+
streamId: string;
|
|
63
|
+
}
|
|
64
|
+
/** @deprecated Use StreamOptions instead */
|
|
65
|
+
export interface RtmpStreamOptions {
|
|
66
|
+
rtmpUrl: string;
|
|
67
|
+
video?: VideoConfig;
|
|
68
|
+
audio?: AudioConfig;
|
|
69
|
+
stream?: StreamConfig;
|
|
70
|
+
sound?: boolean;
|
|
71
|
+
}
|
|
72
|
+
/** @deprecated Use StreamOptions with destinations instead */
|
|
73
|
+
export interface ManagedStreamOptions {
|
|
74
|
+
quality?: "720p" | "1080p";
|
|
75
|
+
enableWebRTC?: boolean;
|
|
76
|
+
video?: VideoConfig;
|
|
77
|
+
audio?: AudioConfig;
|
|
78
|
+
stream?: StreamConfig;
|
|
79
|
+
restreamDestinations?: RestreamDestination[];
|
|
80
|
+
sound?: boolean;
|
|
81
|
+
}
|
|
82
|
+
/** @deprecated Use StreamResult instead */
|
|
83
|
+
export type ManagedStreamResult = StreamResult;
|
|
84
|
+
export interface ExistingStreamInfo {
|
|
85
|
+
hasActiveStream: boolean;
|
|
86
|
+
streamInfo?: {
|
|
87
|
+
type: "managed" | "unmanaged";
|
|
88
|
+
streamId: string;
|
|
89
|
+
status: string;
|
|
90
|
+
createdAt: Date;
|
|
91
|
+
hlsUrl?: string;
|
|
92
|
+
dashUrl?: string;
|
|
93
|
+
webrtcUrl?: string;
|
|
94
|
+
previewUrl?: string;
|
|
95
|
+
thumbnailUrl?: string;
|
|
96
|
+
activeViewers?: number;
|
|
97
|
+
rtmpUrl?: string;
|
|
98
|
+
requestingAppId?: string;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export type StreamStatusHandler = (status: StreamStatus) => void;
|
|
102
|
+
export interface CameraManagerDeps {
|
|
103
|
+
router: {
|
|
104
|
+
on(key: string, handler: (streamType: string, data: any, message: any) => void): () => void;
|
|
105
|
+
};
|
|
106
|
+
messageHandlers: {
|
|
107
|
+
register(type: string, handler: (msg: any) => void): () => void;
|
|
108
|
+
};
|
|
109
|
+
addSubscription: (stream: string) => void;
|
|
110
|
+
removeSubscription: (stream: string) => void;
|
|
111
|
+
sendMessage: (message: any) => void;
|
|
112
|
+
logger: {
|
|
113
|
+
debug(...args: any[]): void;
|
|
114
|
+
info(...args: any[]): void;
|
|
115
|
+
warn(...args: any[]): void;
|
|
116
|
+
error(...args: any[]): void;
|
|
117
|
+
};
|
|
118
|
+
getPackageName: () => string;
|
|
119
|
+
getSessionId: () => string;
|
|
120
|
+
}
|
|
121
|
+
export declare class CameraManager {
|
|
122
|
+
private readonly deps;
|
|
123
|
+
private readonly events;
|
|
124
|
+
private readonly handlerCleanups;
|
|
125
|
+
private pendingRequests;
|
|
126
|
+
private pendingStreamChecks;
|
|
127
|
+
private pendingManagedStreamRequest;
|
|
128
|
+
private _hasPermission;
|
|
129
|
+
private isStreaming;
|
|
130
|
+
private currentStreamUrl?;
|
|
131
|
+
private currentStreamState?;
|
|
132
|
+
private isManagedStreaming;
|
|
133
|
+
private currentManagedStreamId?;
|
|
134
|
+
private currentManagedStreamUrls?;
|
|
135
|
+
private managedStreamStatus?;
|
|
136
|
+
constructor(deps: CameraManagerDeps);
|
|
137
|
+
takePhoto(opts?: PhotoOptions): Promise<PhotoData>;
|
|
138
|
+
onPhotoTaken(handler: (photo: PhotoData) => void): () => void;
|
|
139
|
+
/**
|
|
140
|
+
* Start a video stream from the glasses.
|
|
141
|
+
*
|
|
142
|
+
* Three modes:
|
|
143
|
+
* - `startStream()` — managed relay (default). Cloud handles quality, reconnection, viewer URLs.
|
|
144
|
+
* - `startStream({ destinations: [...] })` — managed relay + fan out to YouTube/Twitch/etc.
|
|
145
|
+
* - `startStream({ direct: "srt://..." })` — glasses connect straight to your URL, no relay.
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```ts
|
|
149
|
+
* // Default — managed relay
|
|
150
|
+
* const stream = await session.camera.startStream();
|
|
151
|
+
* console.log(stream.hlsUrl, stream.webrtcUrl);
|
|
152
|
+
*
|
|
153
|
+
* // Managed relay + restream to YouTube
|
|
154
|
+
* const stream = await session.camera.startStream({
|
|
155
|
+
* destinations: ["rtmp://youtube.com/live/your-key"],
|
|
156
|
+
* });
|
|
157
|
+
*
|
|
158
|
+
* // Direct — glasses → your server, no relay
|
|
159
|
+
* await session.camera.startStream({ direct: "srt://192.168.1.100:4201" });
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
startStream(options?: StreamOptions): Promise<StreamResult | void>;
|
|
163
|
+
/**
|
|
164
|
+
* Stop any active stream (managed or direct).
|
|
165
|
+
*/
|
|
166
|
+
stopStream(): Promise<void>;
|
|
167
|
+
/**
|
|
168
|
+
* Subscribe to stream status updates (works for both managed and direct).
|
|
169
|
+
*/
|
|
170
|
+
onStreamStatus(handler: StreamStatusHandler): () => void;
|
|
171
|
+
isCurrentlyStreaming(): boolean;
|
|
172
|
+
getCurrentStreamUrl(): string | undefined;
|
|
173
|
+
getStreamStatus(): StreamStatus | undefined;
|
|
174
|
+
getStreamUrls(): StreamResult | undefined;
|
|
175
|
+
private _startDirectStream;
|
|
176
|
+
private _startManagedStream;
|
|
177
|
+
/** @deprecated Use startStream({ direct: url }) instead */
|
|
178
|
+
startDirectStream(options: RtmpStreamOptions): Promise<void>;
|
|
179
|
+
/** @deprecated Use startStream() or startStream({ destinations: [...] }) instead */
|
|
180
|
+
startManagedStream(options?: ManagedStreamOptions): Promise<StreamResult>;
|
|
181
|
+
/** @deprecated Use stopStream() instead */
|
|
182
|
+
stopManagedStream(): Promise<void>;
|
|
183
|
+
/** @deprecated Use onStreamStatus() instead */
|
|
184
|
+
onManagedStreamStatus(handler: (status: ManagedStreamStatus) => void): () => void;
|
|
185
|
+
/** @deprecated Use isCurrentlyStreaming() instead */
|
|
186
|
+
isManagedStreamActive(): boolean;
|
|
187
|
+
/** @deprecated Use getStreamUrls() instead */
|
|
188
|
+
getManagedStreamUrls(): StreamResult | undefined;
|
|
189
|
+
getManagedStreamStatus(): ManagedStreamStatus | undefined;
|
|
190
|
+
checkExistingStream(): Promise<ExistingStreamInfo>;
|
|
191
|
+
get hasPermission(): boolean;
|
|
192
|
+
handlePhotoResponse(message: any): void;
|
|
193
|
+
private handleStreamStatus;
|
|
194
|
+
private handleManagedStreamStatus;
|
|
195
|
+
private handleStreamCheckResponse;
|
|
196
|
+
destroy(): void;
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=CameraManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CameraManager.d.ts","sourceRoot":"","sources":["../../../src/session/managers/CameraManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EAGjB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B;;;iFAG6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;6EAEyE;IACzE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAE3B,oFAAoF;IACpF,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,qDAAqD;IACrD,KAAK,CAAC,EAAE,WAAW,CAAC;IAEpB,iDAAiD;IACjD,KAAK,CAAC,EAAE,WAAW,CAAC;IAEpB,qCAAqC;IACrC,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,uEAAuE;IACvE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,8DAA8D;AAC9D,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,oBAAoB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,2CAA2C;AAC3C,MAAM,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,SAAS,GAAG,WAAW,CAAC;QAC9B,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,IAAI,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;AAEjE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE;QACN,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;KAC7F,CAAC;IACF,eAAe,EAAE;QACf,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;KACjE,CAAC;IACF,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACpC,MAAM,EAAE;QACN,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC3B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;KAC7B,CAAC;IACF,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,MAAM,CAAC;CAC5B;AA0BD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IAEzD,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,mBAAmB,CAAyC;IACpE,OAAO,CAAC,2BAA2B,CAMrB;IAEd,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAClC,OAAO,CAAC,kBAAkB,CAAC,CAAe;IAC1C,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,sBAAsB,CAAC,CAAS;IACxC,OAAO,CAAC,wBAAwB,CAAC,CAAsB;IACvD,OAAO,CAAC,mBAAmB,CAAC,CAAsB;gBAEtC,IAAI,EAAE,iBAAiB;IAwBnC,SAAS,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC;IAsClD,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAoB7D;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,WAAW,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IASxE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCjC;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAmBxD,oBAAoB,IAAI,OAAO;IAI/B,mBAAmB,IAAI,MAAM,GAAG,SAAS;IAIzC,eAAe,IAAI,YAAY,GAAG,SAAS;IAI3C,aAAa,IAAI,YAAY,GAAG,SAAS;YAM3B,kBAAkB;YA+BlB,mBAAmB;IAuCjC,2DAA2D;IACrD,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlE,oFAAoF;IAC9E,kBAAkB,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,YAAY,CAAC;IAYnF,2CAA2C;IACrC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxC,+CAA+C;IAC/C,qBAAqB,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,GAAG,MAAM,IAAI;IAUjF,qDAAqD;IACrD,qBAAqB,IAAI,OAAO;IAIhC,8CAA8C;IAC9C,oBAAoB,IAAI,YAAY,GAAG,SAAS;IAIhD,sBAAsB,IAAI,mBAAmB,GAAG,SAAS;IAInD,mBAAmB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAoBxD,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,mBAAmB,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAmCvC,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,yBAAyB;IA+CjC,OAAO,CAAC,yBAAyB;IAwCjC,OAAO,IAAI,IAAI;CAiChB"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 📊 DashboardManager — v3 SDK Dashboard Content API
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper that sends dashboard content updates to the cloud.
|
|
5
|
+
* Provides a simplified two-method API: {@link showText} and {@link clear}.
|
|
6
|
+
*
|
|
7
|
+
* Wire format is identical to v2 DashboardContentManager:
|
|
8
|
+
* ```json
|
|
9
|
+
* {
|
|
10
|
+
* "type": "dashboard_content_update",
|
|
11
|
+
* "packageName": "<packageName>",
|
|
12
|
+
* "sessionId": "<sessionId>-<packageName>",
|
|
13
|
+
* "content": "<text>",
|
|
14
|
+
* "modes": ["main"],
|
|
15
|
+
* "timestamp": "<ISO date>"
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* The `sessionId` field in dashboard messages uses the composite format
|
|
20
|
+
* `"<sessionId>-<packageName>"` to match the v2 wire format exactly.
|
|
21
|
+
*
|
|
22
|
+
* @module
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Dependencies injected by MentraSession.
|
|
26
|
+
*
|
|
27
|
+
* Structural type — no concrete imports so the manager stays unit-testable
|
|
28
|
+
* with plain stubs.
|
|
29
|
+
*/
|
|
30
|
+
export interface DashboardManagerDeps {
|
|
31
|
+
/** DataStreamRouter — register for DATA_STREAM messages by streamType key. */
|
|
32
|
+
router: {
|
|
33
|
+
on(key: string, handler: (streamType: string, data: any, message: any) => void): () => void;
|
|
34
|
+
};
|
|
35
|
+
/** MessageHandlerRegistry — register for top-level message types. */
|
|
36
|
+
messageHandlers: {
|
|
37
|
+
register(type: string, handler: (msg: any) => void): () => void;
|
|
38
|
+
};
|
|
39
|
+
/** Add a subscription string (triggers SUBSCRIPTION_UPDATE to cloud). */
|
|
40
|
+
addSubscription: (stream: string) => void;
|
|
41
|
+
/** Remove a subscription string. */
|
|
42
|
+
removeSubscription: (stream: string) => void;
|
|
43
|
+
/** Send an arbitrary JSON message over the WebSocket. */
|
|
44
|
+
sendMessage: (message: any) => void;
|
|
45
|
+
/** Structured logger. */
|
|
46
|
+
logger: {
|
|
47
|
+
debug(...args: any[]): void;
|
|
48
|
+
info(...args: any[]): void;
|
|
49
|
+
warn(...args: any[]): void;
|
|
50
|
+
error(...args: any[]): void;
|
|
51
|
+
};
|
|
52
|
+
/** Package name for outgoing messages. */
|
|
53
|
+
getPackageName: () => string;
|
|
54
|
+
/** Current session ID. */
|
|
55
|
+
getSessionId: () => string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Controls the dashboard content displayed for this app on the user's glasses.
|
|
59
|
+
*
|
|
60
|
+
* Dashboard content is a text overlay shown in the main dashboard view.
|
|
61
|
+
* The {@link showText} method sends content targeting the `MAIN` dashboard
|
|
62
|
+
* mode by default. Use {@link clear} to remove any displayed content.
|
|
63
|
+
*
|
|
64
|
+
* All methods are fire-and-forget — the messages are sent immediately and
|
|
65
|
+
* no response is awaited.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```ts
|
|
69
|
+
* const session = await mentra.connect();
|
|
70
|
+
*
|
|
71
|
+
* // Show a single line of text
|
|
72
|
+
* session.dashboard.showText("Meeting in 5 minutes");
|
|
73
|
+
*
|
|
74
|
+
* // Show multiple lines
|
|
75
|
+
* session.dashboard.showText(["Line 1", "Line 2", "Line 3"]);
|
|
76
|
+
*
|
|
77
|
+
* // Clear the dashboard
|
|
78
|
+
* session.dashboard.clear();
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export declare class DashboardManager {
|
|
82
|
+
private readonly deps;
|
|
83
|
+
constructor(deps: DashboardManagerDeps);
|
|
84
|
+
/**
|
|
85
|
+
* Show text content on the dashboard.
|
|
86
|
+
*
|
|
87
|
+
* Sends a `dashboard_content_update` message targeting the `MAIN`
|
|
88
|
+
* dashboard mode. Accepts either a single string or an array of
|
|
89
|
+
* pre-wrapped lines — when an array is provided the lines are joined
|
|
90
|
+
* with newlines before sending.
|
|
91
|
+
*
|
|
92
|
+
* @param text - A string or array of strings to display on the dashboard.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```ts
|
|
96
|
+
* // Single string
|
|
97
|
+
* session.dashboard.showText("Status: Connected");
|
|
98
|
+
*
|
|
99
|
+
* // Pre-wrapped lines
|
|
100
|
+
* session.dashboard.showText([
|
|
101
|
+
* "Temperature: 72°F",
|
|
102
|
+
* "Humidity: 45%",
|
|
103
|
+
* "Wind: 5 mph",
|
|
104
|
+
* ]);
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
showText(text: string | string[]): void;
|
|
108
|
+
/**
|
|
109
|
+
* Clear the dashboard content.
|
|
110
|
+
*
|
|
111
|
+
* Sends an empty `dashboard_content_update` message targeting the
|
|
112
|
+
* `MAIN` dashboard mode, which removes any currently displayed content
|
|
113
|
+
* for this app.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```ts
|
|
117
|
+
* session.dashboard.clear();
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
clear(): void;
|
|
121
|
+
/**
|
|
122
|
+
* Clean up resources.
|
|
123
|
+
*
|
|
124
|
+
* Called by MentraSession during disconnect/cleanup. Dashboard commands
|
|
125
|
+
* are fire-and-forget so there is no pending state to drain.
|
|
126
|
+
*
|
|
127
|
+
* @internal
|
|
128
|
+
*/
|
|
129
|
+
destroy(): void;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=DashboardManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardManager.d.ts","sourceRoot":"","sources":["../../../src/session/managers/DashboardManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAOH;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,MAAM,EAAE;QACN,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;KAC7F,CAAC;IACF,qEAAqE;IACrE,eAAe,EAAE;QACf,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;KACjE,CAAC;IACF,yEAAyE;IACzE,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,oCAAoC;IACpC,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,yDAAyD;IACzD,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACpC,yBAAyB;IACzB,MAAM,EAAE;QACN,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC3B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;KAC7B,CAAC;IACF,0CAA0C;IAC1C,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,0BAA0B;IAC1B,YAAY,EAAE,MAAM,MAAM,CAAC;CAC5B;AAID;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;gBAEhC,IAAI,EAAE,oBAAoB;IAMtC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAiBvC;;;;;;;;;;;OAWG;IACH,KAAK,IAAI,IAAI;IAiBb;;;;;;;OAOG;IACH,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeviceManager — Consolidated Device State, Hardware Events & Capabilities
|
|
3
|
+
*
|
|
4
|
+
* Owns all device-related concerns for a MentraSession:
|
|
5
|
+
*
|
|
6
|
+
* - **Reactive state** — Observable properties for connection, battery, WiFi,
|
|
7
|
+
* hotspot, and case status (mirrors the legacy DeviceState pattern).
|
|
8
|
+
* - **Hardware events** — Button presses, head position, touch gestures,
|
|
9
|
+
* battery updates, and VPS coordinates, all routed from the DataStreamRouter.
|
|
10
|
+
* - **Capabilities** — Device capability profile received at connection time
|
|
11
|
+
* and updated mid-session when the glasses model changes.
|
|
12
|
+
* - **Actions** — Outbound commands like `requestWifiSetup`.
|
|
13
|
+
*
|
|
14
|
+
* All handler registrations return a cleanup function. Subscriptions are
|
|
15
|
+
* managed automatically — `addSubscription` is called when the first handler
|
|
16
|
+
* for a stream is registered, and `removeSubscription` when the last is removed.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* // Reactive state
|
|
21
|
+
* device.state.batteryLevel.onChange((level) => {
|
|
22
|
+
* console.log("Battery:", level, "%");
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* // Hardware events
|
|
26
|
+
* const stop = device.onButtonPress((e) => {
|
|
27
|
+
* console.log(e.buttonId, e.pressType);
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* // Filtered touch events
|
|
31
|
+
* device.onTouchEvent("double_tap", (e) => {
|
|
32
|
+
* console.log("Double tap!", e);
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* // Capabilities
|
|
36
|
+
* device.onCapabilitiesChange((caps) => {
|
|
37
|
+
* console.log("Device supports camera:", !!caps?.camera);
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* // Actions
|
|
41
|
+
* device.requestWifiSetup("App needs internet for sync");
|
|
42
|
+
*
|
|
43
|
+
* // Cleanup
|
|
44
|
+
* stop();
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @module
|
|
48
|
+
*/
|
|
49
|
+
import { Observable } from "../../utils/Observable";
|
|
50
|
+
import type { PermissionsManager } from "./PermissionsManager";
|
|
51
|
+
/**
|
|
52
|
+
* Button press event from the glasses hardware.
|
|
53
|
+
*/
|
|
54
|
+
export interface ButtonPressEvent {
|
|
55
|
+
/** Identifier of the button that was pressed. */
|
|
56
|
+
buttonId: string;
|
|
57
|
+
/** Whether the press was short or long. */
|
|
58
|
+
pressType: "short" | "long";
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Head position event from the IMU.
|
|
62
|
+
*/
|
|
63
|
+
export interface HeadPositionEvent {
|
|
64
|
+
/** Current head position. */
|
|
65
|
+
position: "up" | "down";
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Normalised touch/gesture event from the glasses touchpad.
|
|
69
|
+
*
|
|
70
|
+
* Raw wire fields (`gesture_name`, `device_model`) are normalised to
|
|
71
|
+
* `gesture` and `model` for a cleaner developer experience.
|
|
72
|
+
*/
|
|
73
|
+
export interface TouchEventData {
|
|
74
|
+
/** Normalised gesture name (e.g. "double_tap", "forward_swipe"). */
|
|
75
|
+
gesture: string;
|
|
76
|
+
/** Normalised device model name. */
|
|
77
|
+
model: string;
|
|
78
|
+
/** Timestamp of the gesture. */
|
|
79
|
+
timestamp: Date | string;
|
|
80
|
+
/** The original raw data, preserved for advanced use cases. */
|
|
81
|
+
[key: string]: any;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Glasses battery update event.
|
|
85
|
+
*/
|
|
86
|
+
export interface BatteryUpdateEvent {
|
|
87
|
+
/** Battery level 0–100. */
|
|
88
|
+
level: number;
|
|
89
|
+
/** Whether the glasses are currently charging. */
|
|
90
|
+
charging: boolean;
|
|
91
|
+
/** Estimated minutes remaining (if available). */
|
|
92
|
+
timeRemaining?: number;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Dependencies injected by MentraSession into the DeviceManager.
|
|
96
|
+
*/
|
|
97
|
+
export interface DeviceManagerDeps {
|
|
98
|
+
/** DataStreamRouter — register for stream-type events. */
|
|
99
|
+
router: {
|
|
100
|
+
on(key: string, handler: (streamType: string, data: any, message: any) => void): () => void;
|
|
101
|
+
};
|
|
102
|
+
/** MessageHandlerRegistry — register for top-level message types. */
|
|
103
|
+
messageHandlers: {
|
|
104
|
+
register(type: string, handler: (msg: any) => void): () => void;
|
|
105
|
+
};
|
|
106
|
+
/** Subscribe to a data stream (sent to cloud). */
|
|
107
|
+
addSubscription: (stream: string) => void;
|
|
108
|
+
/** Unsubscribe from a data stream. */
|
|
109
|
+
removeSubscription: (stream: string) => void;
|
|
110
|
+
/** Send an arbitrary message to the cloud. */
|
|
111
|
+
sendMessage: (message: any) => void;
|
|
112
|
+
/** Session-scoped logger. */
|
|
113
|
+
logger: {
|
|
114
|
+
debug(...args: any[]): void;
|
|
115
|
+
info(...args: any[]): void;
|
|
116
|
+
warn(...args: any[]): void;
|
|
117
|
+
error(...args: any[]): void;
|
|
118
|
+
};
|
|
119
|
+
/** Returns the current app's package name. */
|
|
120
|
+
getPackageName: () => string;
|
|
121
|
+
/** Returns the active session ID. */
|
|
122
|
+
getSessionId: () => string;
|
|
123
|
+
/** PermissionsManager for gating protected streams. */
|
|
124
|
+
permissions: PermissionsManager;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Read-only reactive device state container.
|
|
128
|
+
*
|
|
129
|
+
* Every property is an {@link Observable} — call `.value` for synchronous
|
|
130
|
+
* reads or `.onChange(cb)` for reactive subscriptions.
|
|
131
|
+
*/
|
|
132
|
+
export interface DeviceStateShape {
|
|
133
|
+
readonly connected: Observable<boolean>;
|
|
134
|
+
readonly modelName: Observable<string | null>;
|
|
135
|
+
readonly batteryLevel: Observable<number | null>;
|
|
136
|
+
readonly charging: Observable<boolean | null>;
|
|
137
|
+
readonly caseBatteryLevel: Observable<number | null>;
|
|
138
|
+
readonly caseCharging: Observable<boolean | null>;
|
|
139
|
+
readonly caseOpen: Observable<boolean | null>;
|
|
140
|
+
readonly caseRemoved: Observable<boolean | null>;
|
|
141
|
+
readonly wifiConnected: Observable<boolean>;
|
|
142
|
+
readonly wifiSsid: Observable<string | null>;
|
|
143
|
+
readonly wifiLocalIp: Observable<string | null>;
|
|
144
|
+
readonly hotspotEnabled: Observable<boolean | null>;
|
|
145
|
+
readonly hotspotSsid: Observable<string | null>;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Manages all device-related state, hardware events, capabilities, and actions.
|
|
149
|
+
*
|
|
150
|
+
* Created by MentraSession and exposed as `session.device`.
|
|
151
|
+
*/
|
|
152
|
+
export declare class DeviceManager {
|
|
153
|
+
/** Reactive device state observables. */
|
|
154
|
+
readonly state: DeviceStateShape;
|
|
155
|
+
/** Current device capabilities (set from CONNECTION_ACK). */
|
|
156
|
+
capabilities: any;
|
|
157
|
+
private deps;
|
|
158
|
+
private permissions;
|
|
159
|
+
/** Internal mutable references to observables (state exposes them read-only). */
|
|
160
|
+
private readonly _connected;
|
|
161
|
+
private readonly _modelName;
|
|
162
|
+
private readonly _batteryLevel;
|
|
163
|
+
private readonly _charging;
|
|
164
|
+
private readonly _caseBatteryLevel;
|
|
165
|
+
private readonly _caseCharging;
|
|
166
|
+
private readonly _caseOpen;
|
|
167
|
+
private readonly _caseRemoved;
|
|
168
|
+
private readonly _wifiConnected;
|
|
169
|
+
private readonly _wifiSsid;
|
|
170
|
+
private readonly _wifiLocalIp;
|
|
171
|
+
private readonly _hotspotEnabled;
|
|
172
|
+
private readonly _hotspotSsid;
|
|
173
|
+
/** Capabilities-change listeners. */
|
|
174
|
+
private capabilitiesListeners;
|
|
175
|
+
/**
|
|
176
|
+
* Ref-counted handler bookkeeping per stream key.
|
|
177
|
+
*
|
|
178
|
+
* Tracks the number of active handlers for each stream so that
|
|
179
|
+
* `addSubscription` / `removeSubscription` are called exactly once
|
|
180
|
+
* when the first handler is added / last handler is removed.
|
|
181
|
+
*/
|
|
182
|
+
private handlerCounts;
|
|
183
|
+
/** Cleanup functions returned by router/messageHandlers registrations. */
|
|
184
|
+
private cleanups;
|
|
185
|
+
constructor(deps: DeviceManagerDeps);
|
|
186
|
+
/**
|
|
187
|
+
* Listen for physical button press events on the glasses.
|
|
188
|
+
*
|
|
189
|
+
* @param handler - Called with {@link ButtonPressEvent} for every press
|
|
190
|
+
* @returns Cleanup function to remove the handler
|
|
191
|
+
*
|
|
192
|
+
* @example
|
|
193
|
+
* ```ts
|
|
194
|
+
* const stop = device.onButtonPress((e) => {
|
|
195
|
+
* if (e.pressType === "long") {
|
|
196
|
+
* console.log("Long press on", e.buttonId);
|
|
197
|
+
* }
|
|
198
|
+
* });
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
onButtonPress(handler: (event: ButtonPressEvent) => void): () => void;
|
|
202
|
+
/**
|
|
203
|
+
* Listen for head position (up/down) events from the IMU.
|
|
204
|
+
*
|
|
205
|
+
* @param handler - Called with {@link HeadPositionEvent} on position change
|
|
206
|
+
* @returns Cleanup function to remove the handler
|
|
207
|
+
*/
|
|
208
|
+
onHeadPosition(handler: (event: HeadPositionEvent) => void): () => void;
|
|
209
|
+
/**
|
|
210
|
+
* Listen for touch/gesture events from the glasses touchpad.
|
|
211
|
+
*
|
|
212
|
+
* Overloaded:
|
|
213
|
+
* - `onTouchEvent(handler)` — all touch events
|
|
214
|
+
* - `onTouchEvent(gesture, handler)` — only events matching the given gesture
|
|
215
|
+
*
|
|
216
|
+
* @param gestureOrHandler - A gesture name string, or a handler for all events
|
|
217
|
+
* @param handler - Handler when the first argument is a gesture name
|
|
218
|
+
* @returns Cleanup function to remove the handler
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* ```ts
|
|
222
|
+
* // All gestures
|
|
223
|
+
* device.onTouchEvent((e) => console.log(e.gesture));
|
|
224
|
+
*
|
|
225
|
+
* // Specific gesture
|
|
226
|
+
* device.onTouchEvent("double_tap", (e) => console.log("Double tap!"));
|
|
227
|
+
* ```
|
|
228
|
+
*/
|
|
229
|
+
onTouchEvent(handler: (event: TouchEventData) => void): () => void;
|
|
230
|
+
onTouchEvent(gesture: string, handler: (event: TouchEventData) => void): () => void;
|
|
231
|
+
/**
|
|
232
|
+
* Subscribe to multiple touch gestures at once.
|
|
233
|
+
*
|
|
234
|
+
* Registers a handler for each gesture and returns a single cleanup
|
|
235
|
+
* function that removes all of them.
|
|
236
|
+
*
|
|
237
|
+
* @param gestures - Array of gesture names (e.g. `["double_tap", "forward_swipe"]`)
|
|
238
|
+
* @returns Cleanup function that removes all gesture subscriptions
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* ```ts
|
|
242
|
+
* const stop = device.subscribeToGestures(["single_tap", "double_tap", "forward_swipe"]);
|
|
243
|
+
* // Later:
|
|
244
|
+
* stop();
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
247
|
+
subscribeToGestures(gestures: string[]): () => void;
|
|
248
|
+
/**
|
|
249
|
+
* Listen for glasses battery update events.
|
|
250
|
+
*
|
|
251
|
+
* Also updates the reactive `state.batteryLevel` and `state.charging` observables.
|
|
252
|
+
*
|
|
253
|
+
* @param handler - Called with {@link BatteryUpdateEvent} on each update
|
|
254
|
+
* @returns Cleanup function to remove the handler
|
|
255
|
+
*/
|
|
256
|
+
onBatteryUpdate(handler: (event: BatteryUpdateEvent) => void): () => void;
|
|
257
|
+
/**
|
|
258
|
+
* Listen for VPS (Visual Positioning System) coordinate updates.
|
|
259
|
+
*
|
|
260
|
+
* @param handler - Called with raw VPS coordinate data
|
|
261
|
+
* @returns Cleanup function to remove the handler
|
|
262
|
+
*/
|
|
263
|
+
onVpsCoordinates(handler: (event: any) => void): () => void;
|
|
264
|
+
/**
|
|
265
|
+
* Request the user to set up WiFi on their glasses.
|
|
266
|
+
*
|
|
267
|
+
* Sends a `request_wifi_setup` message to the cloud, which prompts
|
|
268
|
+
* the companion app to display a WiFi configuration flow.
|
|
269
|
+
*
|
|
270
|
+
* @param reason - Optional human-readable reason shown to the user
|
|
271
|
+
*
|
|
272
|
+
* @example
|
|
273
|
+
* ```ts
|
|
274
|
+
* device.requestWifiSetup("This app needs WiFi for real-time sync");
|
|
275
|
+
* ```
|
|
276
|
+
*/
|
|
277
|
+
requestWifiSetup(reason?: string): void;
|
|
278
|
+
/**
|
|
279
|
+
* Subscribe to device capability changes.
|
|
280
|
+
*
|
|
281
|
+
* Called when capabilities are first received (CONNECTION_ACK) and
|
|
282
|
+
* whenever the device model or capabilities change mid-session.
|
|
283
|
+
*
|
|
284
|
+
* @param handler - Called with the new capabilities object
|
|
285
|
+
* @returns Cleanup function to remove the handler
|
|
286
|
+
*
|
|
287
|
+
* @example
|
|
288
|
+
* ```ts
|
|
289
|
+
* device.onCapabilitiesChange((caps) => {
|
|
290
|
+
* if (caps?.camera?.photo) {
|
|
291
|
+
* console.log("Camera supports photos");
|
|
292
|
+
* }
|
|
293
|
+
* });
|
|
294
|
+
* ```
|
|
295
|
+
*/
|
|
296
|
+
onCapabilitiesChange(handler: (caps: any) => void): () => void;
|
|
297
|
+
/**
|
|
298
|
+
* Handle a `device_state_update` message from the cloud.
|
|
299
|
+
*
|
|
300
|
+
* Updates all matching Observable properties. Only fields present in
|
|
301
|
+
* the message are touched — Observables for absent fields keep their
|
|
302
|
+
* current value.
|
|
303
|
+
*
|
|
304
|
+
* @param message - The raw device_state_update message
|
|
305
|
+
* @internal
|
|
306
|
+
*/
|
|
307
|
+
handleDeviceStateUpdate(message: any): void;
|
|
308
|
+
/**
|
|
309
|
+
* Handle a `capabilities_update` message from the cloud.
|
|
310
|
+
*
|
|
311
|
+
* Extracts the capabilities payload and delegates to {@link setCapabilities}.
|
|
312
|
+
*
|
|
313
|
+
* @param message - The raw capabilities_update message
|
|
314
|
+
* @internal
|
|
315
|
+
*/
|
|
316
|
+
handleCapabilitiesUpdate(message: any): void;
|
|
317
|
+
/**
|
|
318
|
+
* Directly set the device capabilities.
|
|
319
|
+
*
|
|
320
|
+
* Called by MentraSession from the CONNECTION_ACK payload, or by
|
|
321
|
+
* {@link handleCapabilitiesUpdate} for mid-session updates.
|
|
322
|
+
*
|
|
323
|
+
* @param caps - The capabilities object (or null)
|
|
324
|
+
* @internal
|
|
325
|
+
*/
|
|
326
|
+
setCapabilities(caps: any): void;
|
|
327
|
+
/**
|
|
328
|
+
* Remove all tracked handlers and clear listeners.
|
|
329
|
+
*
|
|
330
|
+
* Called by MentraSession during disconnect/cleanup.
|
|
331
|
+
*
|
|
332
|
+
* @internal
|
|
333
|
+
*/
|
|
334
|
+
destroy(): void;
|
|
335
|
+
/**
|
|
336
|
+
* Register a handler on the DataStreamRouter for a given stream key,
|
|
337
|
+
* managing subscription lifecycle automatically.
|
|
338
|
+
*
|
|
339
|
+
* - Calls `deps.addSubscription` when the first handler for a key is added.
|
|
340
|
+
* - Calls `deps.removeSubscription` when the last handler for a key is removed.
|
|
341
|
+
*
|
|
342
|
+
* @param streamKey - The stream type or prefixed stream key
|
|
343
|
+
* @param handler - The stream handler function
|
|
344
|
+
* @returns Cleanup function that unregisters the handler and manages subscription
|
|
345
|
+
*/
|
|
346
|
+
private addStreamHandler;
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=DeviceManager.d.ts.map
|