@mentra/engine 0.1.0-beta.0
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 +79 -0
- package/build/devtools.d.ts +11 -0
- package/build/devtools.d.ts.map +1 -0
- package/build/devtools.js +13 -0
- package/build/devtools.js.map +1 -0
- package/build/engine.d.ts +261 -0
- package/build/engine.d.ts.map +1 -0
- package/build/engine.js +170 -0
- package/build/engine.js.map +1 -0
- package/build/facades/dev.d.ts +58 -0
- package/build/facades/dev.d.ts.map +1 -0
- package/build/facades/dev.js +189 -0
- package/build/facades/dev.js.map +1 -0
- package/build/facades/display.d.ts +21 -0
- package/build/facades/display.d.ts.map +1 -0
- package/build/facades/display.js +17 -0
- package/build/facades/display.js.map +1 -0
- package/build/facades/displayMirror.d.ts +15 -0
- package/build/facades/displayMirror.d.ts.map +1 -0
- package/build/facades/displayMirror.js +29 -0
- package/build/facades/displayMirror.js.map +1 -0
- package/build/facades/gallery.d.ts +62 -0
- package/build/facades/gallery.d.ts.map +1 -0
- package/build/facades/gallery.js +61 -0
- package/build/facades/gallery.js.map +1 -0
- package/build/facades/glasses.d.ts +141 -0
- package/build/facades/glasses.d.ts.map +1 -0
- package/build/facades/glasses.js +199 -0
- package/build/facades/glasses.js.map +1 -0
- package/build/facades/glassesSettings.d.ts +13 -0
- package/build/facades/glassesSettings.d.ts.map +1 -0
- package/build/facades/glassesSettings.js +54 -0
- package/build/facades/glassesSettings.js.map +1 -0
- package/build/facades/glassesWifi.d.ts +25 -0
- package/build/facades/glassesWifi.d.ts.map +1 -0
- package/build/facades/glassesWifi.js +57 -0
- package/build/facades/glassesWifi.js.map +1 -0
- package/build/facades/miniapps.d.ts +43 -0
- package/build/facades/miniapps.d.ts.map +1 -0
- package/build/facades/miniapps.js +49 -0
- package/build/facades/miniapps.js.map +1 -0
- package/build/facades/notifications.d.ts +13 -0
- package/build/facades/notifications.d.ts.map +1 -0
- package/build/facades/notifications.js +12 -0
- package/build/facades/notifications.js.map +1 -0
- package/build/facades/ota.d.ts +103 -0
- package/build/facades/ota.d.ts.map +1 -0
- package/build/facades/ota.js +156 -0
- package/build/facades/ota.js.map +1 -0
- package/build/facades/pairing.d.ts +114 -0
- package/build/facades/pairing.d.ts.map +1 -0
- package/build/facades/pairing.js +275 -0
- package/build/facades/pairing.js.map +1 -0
- package/build/facades/permissions.d.ts +33 -0
- package/build/facades/permissions.d.ts.map +1 -0
- package/build/facades/permissions.js +155 -0
- package/build/facades/permissions.js.map +1 -0
- package/build/facades/phoneNotifications.d.ts +21 -0
- package/build/facades/phoneNotifications.d.ts.map +1 -0
- package/build/facades/phoneNotifications.js +51 -0
- package/build/facades/phoneNotifications.js.map +1 -0
- package/build/facades/reports.d.ts +36 -0
- package/build/facades/reports.d.ts.map +1 -0
- package/build/facades/reports.js +134 -0
- package/build/facades/reports.js.map +1 -0
- package/build/facades/session.d.ts +21 -0
- package/build/facades/session.d.ts.map +1 -0
- package/build/facades/session.js +52 -0
- package/build/facades/session.js.map +1 -0
- package/build/facades/settings.d.ts +37 -0
- package/build/facades/settings.d.ts.map +1 -0
- package/build/facades/settings.js +55 -0
- package/build/facades/settings.js.map +1 -0
- package/build/facades/speech.d.ts +30 -0
- package/build/facades/speech.d.ts.map +1 -0
- package/build/facades/speech.js +37 -0
- package/build/facades/speech.js.map +1 -0
- package/build/index.d.ts +43 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +45 -0
- package/build/index.js.map +1 -0
- package/build/internal.d.ts +67 -0
- package/build/internal.d.ts.map +1 -0
- package/build/internal.js +90 -0
- package/build/internal.js.map +1 -0
- package/build/runtime/bootstrap.d.ts +83 -0
- package/build/runtime/bootstrap.d.ts.map +1 -0
- package/build/runtime/bootstrap.js +56 -0
- package/build/runtime/bootstrap.js.map +1 -0
- package/build/runtime/config.d.ts +146 -0
- package/build/runtime/config.d.ts.map +1 -0
- package/build/runtime/config.js +18 -0
- package/build/runtime/config.js.map +1 -0
- package/build/runtime/streamConfig.d.ts +4 -0
- package/build/runtime/streamConfig.d.ts.map +1 -0
- package/build/runtime/streamConfig.js +38 -0
- package/build/runtime/streamConfig.js.map +1 -0
- package/build/services/AppRegistry.d.ts +269 -0
- package/build/services/AppRegistry.d.ts.map +1 -0
- package/build/services/AppRegistry.js +1079 -0
- package/build/services/AppRegistry.js.map +1 -0
- package/build/services/AudioCloudUplink.d.ts +9 -0
- package/build/services/AudioCloudUplink.d.ts.map +1 -0
- package/build/services/AudioCloudUplink.js +48 -0
- package/build/services/AudioCloudUplink.js.map +1 -0
- package/build/services/AudioPlaybackService.d.ts +175 -0
- package/build/services/AudioPlaybackService.d.ts.map +1 -0
- package/build/services/AudioPlaybackService.js +705 -0
- package/build/services/AudioPlaybackService.js.map +1 -0
- package/build/services/AutomaticReportResult.d.ts +20 -0
- package/build/services/AutomaticReportResult.d.ts.map +1 -0
- package/build/services/AutomaticReportResult.js +29 -0
- package/build/services/AutomaticReportResult.js.map +1 -0
- package/build/services/BlobStore.d.ts +91 -0
- package/build/services/BlobStore.d.ts.map +1 -0
- package/build/services/BlobStore.js +668 -0
- package/build/services/BlobStore.js.map +1 -0
- package/build/services/CaptionsTesterReportService.d.ts +4 -0
- package/build/services/CaptionsTesterReportService.d.ts.map +1 -0
- package/build/services/CaptionsTesterReportService.js +80 -0
- package/build/services/CaptionsTesterReportService.js.map +1 -0
- package/build/services/CloudAudioSubscriptionSync.d.ts +24 -0
- package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -0
- package/build/services/CloudAudioSubscriptionSync.js +39 -0
- package/build/services/CloudAudioSubscriptionSync.js.map +1 -0
- package/build/services/CloudClientService.d.ts +143 -0
- package/build/services/CloudClientService.d.ts.map +1 -0
- package/build/services/CloudClientService.js +644 -0
- package/build/services/CloudClientService.js.map +1 -0
- package/build/services/CloudTranscriptE2EMetrics.d.ts +4 -0
- package/build/services/CloudTranscriptE2EMetrics.d.ts.map +1 -0
- package/build/services/CloudTranscriptE2EMetrics.js +24 -0
- package/build/services/CloudTranscriptE2EMetrics.js.map +1 -0
- package/build/services/ConnectionCoordinator.d.ts +51 -0
- package/build/services/ConnectionCoordinator.d.ts.map +1 -0
- package/build/services/ConnectionCoordinator.js +34 -0
- package/build/services/ConnectionCoordinator.js.map +1 -0
- package/build/services/DevServerBridge.d.ts +63 -0
- package/build/services/DevServerBridge.d.ts.map +1 -0
- package/build/services/DevServerBridge.js +294 -0
- package/build/services/DevServerBridge.js.map +1 -0
- package/build/services/DeviceEventRouter.d.ts +3 -0
- package/build/services/DeviceEventRouter.d.ts.map +1 -0
- package/build/services/DeviceEventRouter.js +190 -0
- package/build/services/DeviceEventRouter.js.map +1 -0
- package/build/services/DeviceStoreHydration.d.ts +38 -0
- package/build/services/DeviceStoreHydration.d.ts.map +1 -0
- package/build/services/DeviceStoreHydration.js +124 -0
- package/build/services/DeviceStoreHydration.js.map +1 -0
- package/build/services/DisplayProcessor.d.ts +223 -0
- package/build/services/DisplayProcessor.d.ts.map +1 -0
- package/build/services/DisplayProcessor.js +552 -0
- package/build/services/DisplayProcessor.js.map +1 -0
- package/build/services/GlassesReadiness.d.ts +41 -0
- package/build/services/GlassesReadiness.d.ts.map +1 -0
- package/build/services/GlassesReadiness.js +82 -0
- package/build/services/GlassesReadiness.js.map +1 -0
- package/build/services/GlassesSettingsSync.d.ts +33 -0
- package/build/services/GlassesSettingsSync.d.ts.map +1 -0
- package/build/services/GlassesSettingsSync.js +121 -0
- package/build/services/GlassesSettingsSync.js.map +1 -0
- package/build/services/GlassesStatusProjection.d.ts +3 -0
- package/build/services/GlassesStatusProjection.d.ts.map +1 -0
- package/build/services/GlassesStatusProjection.js +65 -0
- package/build/services/GlassesStatusProjection.js.map +1 -0
- package/build/services/HeadingService.d.ts +27 -0
- package/build/services/HeadingService.d.ts.map +1 -0
- package/build/services/HeadingService.js +96 -0
- package/build/services/HeadingService.js.map +1 -0
- package/build/services/LocalDisplayManager.d.ts +139 -0
- package/build/services/LocalDisplayManager.d.ts.map +1 -0
- package/build/services/LocalDisplayManager.js +579 -0
- package/build/services/LocalDisplayManager.js.map +1 -0
- package/build/services/LocalMiniappRuntime.d.ts +439 -0
- package/build/services/LocalMiniappRuntime.d.ts.map +1 -0
- package/build/services/LocalMiniappRuntime.js +3695 -0
- package/build/services/LocalMiniappRuntime.js.map +1 -0
- package/build/services/LocalSttFallbackCoordinator.d.ts +57 -0
- package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -0
- package/build/services/LocalSttFallbackCoordinator.js +137 -0
- package/build/services/LocalSttFallbackCoordinator.js.map +1 -0
- package/build/services/MentraJSCrashController.d.ts +97 -0
- package/build/services/MentraJSCrashController.d.ts.map +1 -0
- package/build/services/MentraJSCrashController.js +138 -0
- package/build/services/MentraJSCrashController.js.map +1 -0
- package/build/services/MentraJSCrashloopReportService.d.ts +9 -0
- package/build/services/MentraJSCrashloopReportService.d.ts.map +1 -0
- package/build/services/MentraJSCrashloopReportService.js +54 -0
- package/build/services/MentraJSCrashloopReportService.js.map +1 -0
- package/build/services/MentraJSLogPipeline.d.ts +87 -0
- package/build/services/MentraJSLogPipeline.d.ts.map +1 -0
- package/build/services/MentraJSLogPipeline.js +137 -0
- package/build/services/MentraJSLogPipeline.js.map +1 -0
- package/build/services/MentraJSRouter.d.ts +203 -0
- package/build/services/MentraJSRouter.d.ts.map +1 -0
- package/build/services/MentraJSRouter.js +480 -0
- package/build/services/MentraJSRouter.js.map +1 -0
- package/build/services/MentraUIRouter.d.ts +137 -0
- package/build/services/MentraUIRouter.d.ts.map +1 -0
- package/build/services/MentraUIRouter.js +210 -0
- package/build/services/MentraUIRouter.js.map +1 -0
- package/build/services/MicStateCoordinator.d.ts +37 -0
- package/build/services/MicStateCoordinator.d.ts.map +1 -0
- package/build/services/MicStateCoordinator.js +81 -0
- package/build/services/MicStateCoordinator.js.map +1 -0
- package/build/services/MiniappEngine.d.ts +31 -0
- package/build/services/MiniappEngine.d.ts.map +1 -0
- package/build/services/MiniappEngine.js +119 -0
- package/build/services/MiniappEngine.js.map +1 -0
- package/build/services/MiniappLauncher.d.ts +129 -0
- package/build/services/MiniappLauncher.d.ts.map +1 -0
- package/build/services/MiniappLauncher.js +291 -0
- package/build/services/MiniappLauncher.js.map +1 -0
- package/build/services/MiniappRunningRegistry.d.ts +24 -0
- package/build/services/MiniappRunningRegistry.d.ts.map +1 -0
- package/build/services/MiniappRunningRegistry.js +52 -0
- package/build/services/MiniappRunningRegistry.js.map +1 -0
- package/build/services/NativeHttpResponse.d.ts +3 -0
- package/build/services/NativeHttpResponse.d.ts.map +1 -0
- package/build/services/NativeHttpResponse.js +6 -0
- package/build/services/NativeHttpResponse.js.map +1 -0
- package/build/services/NavigationHandlers.d.ts +90 -0
- package/build/services/NavigationHandlers.d.ts.map +1 -0
- package/build/services/NavigationHandlers.js +379 -0
- package/build/services/NavigationHandlers.js.map +1 -0
- package/build/services/NavigationService.d.ts +254 -0
- package/build/services/NavigationService.d.ts.map +1 -0
- package/build/services/NavigationService.js +553 -0
- package/build/services/NavigationService.js.map +1 -0
- package/build/services/NotificationsEmitter.d.ts +28 -0
- package/build/services/NotificationsEmitter.d.ts.map +1 -0
- package/build/services/NotificationsEmitter.js +22 -0
- package/build/services/NotificationsEmitter.js.map +1 -0
- package/build/services/OfflineSpeechModelService.d.ts +33 -0
- package/build/services/OfflineSpeechModelService.d.ts.map +1 -0
- package/build/services/OfflineSpeechModelService.js +136 -0
- package/build/services/OfflineSpeechModelService.js.map +1 -0
- package/build/services/OtaInstallCoordinator.d.ts +195 -0
- package/build/services/OtaInstallCoordinator.d.ts.map +1 -0
- package/build/services/OtaInstallCoordinator.js +1047 -0
- package/build/services/OtaInstallCoordinator.js.map +1 -0
- package/build/services/OtaService.d.ts +3 -0
- package/build/services/OtaService.d.ts.map +1 -0
- package/build/services/OtaService.js +65 -0
- package/build/services/OtaService.js.map +1 -0
- package/build/services/OtaUpdateCheckService.d.ts +65 -0
- package/build/services/OtaUpdateCheckService.d.ts.map +1 -0
- package/build/services/OtaUpdateCheckService.js +260 -0
- package/build/services/OtaUpdateCheckService.js.map +1 -0
- package/build/services/PairingIdentity.d.ts +80 -0
- package/build/services/PairingIdentity.d.ts.map +1 -0
- package/build/services/PairingIdentity.js +145 -0
- package/build/services/PairingIdentity.js.map +1 -0
- package/build/services/PhoneCalendarHelpers.d.ts +32 -0
- package/build/services/PhoneCalendarHelpers.d.ts.map +1 -0
- package/build/services/PhoneCalendarHelpers.js +157 -0
- package/build/services/PhoneCalendarHelpers.js.map +1 -0
- package/build/services/PhoneCalendarService.d.ts +5 -0
- package/build/services/PhoneCalendarService.d.ts.map +1 -0
- package/build/services/PhoneCalendarService.js +24 -0
- package/build/services/PhoneCalendarService.js.map +1 -0
- package/build/services/PhoneCameraFovCoordinator.d.ts +28 -0
- package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
- package/build/services/PhoneCameraFovCoordinator.js +180 -0
- package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
- package/build/services/PhoneLocationService.d.ts +36 -0
- package/build/services/PhoneLocationService.d.ts.map +1 -0
- package/build/services/PhoneLocationService.js +115 -0
- package/build/services/PhoneLocationService.js.map +1 -0
- package/build/services/PhoneNotificationsSync.d.ts +3 -0
- package/build/services/PhoneNotificationsSync.d.ts.map +1 -0
- package/build/services/PhoneNotificationsSync.js +35 -0
- package/build/services/PhoneNotificationsSync.js.map +1 -0
- package/build/services/PhonePhotoCoordinator.d.ts +103 -0
- package/build/services/PhonePhotoCoordinator.d.ts.map +1 -0
- package/build/services/PhonePhotoCoordinator.js +326 -0
- package/build/services/PhonePhotoCoordinator.js.map +1 -0
- package/build/services/PhoneStreamCoordinator.d.ts +168 -0
- package/build/services/PhoneStreamCoordinator.d.ts.map +1 -0
- package/build/services/PhoneStreamCoordinator.js +632 -0
- package/build/services/PhoneStreamCoordinator.js.map +1 -0
- package/build/services/PhoneVideoCoordinator.d.ts +50 -0
- package/build/services/PhoneVideoCoordinator.d.ts.map +1 -0
- package/build/services/PhoneVideoCoordinator.js +147 -0
- package/build/services/PhoneVideoCoordinator.js.map +1 -0
- package/build/services/STTModelManager.d.ts +65 -0
- package/build/services/STTModelManager.d.ts.map +1 -0
- package/build/services/STTModelManager.js +292 -0
- package/build/services/STTModelManager.js.map +1 -0
- package/build/services/SceneRenderer.d.ts +90 -0
- package/build/services/SceneRenderer.d.ts.map +1 -0
- package/build/services/SceneRenderer.js +248 -0
- package/build/services/SceneRenderer.js.map +1 -0
- package/build/services/SentenceTtsPipeline.d.ts +31 -0
- package/build/services/SentenceTtsPipeline.d.ts.map +1 -0
- package/build/services/SentenceTtsPipeline.js +67 -0
- package/build/services/SentenceTtsPipeline.js.map +1 -0
- package/build/services/StreamLifecycleController.d.ts +67 -0
- package/build/services/StreamLifecycleController.d.ts.map +1 -0
- package/build/services/StreamLifecycleController.js +152 -0
- package/build/services/StreamLifecycleController.js.map +1 -0
- package/build/services/TTSModelManager.d.ts +90 -0
- package/build/services/TTSModelManager.d.ts.map +1 -0
- package/build/services/TTSModelManager.js +366 -0
- package/build/services/TTSModelManager.js.map +1 -0
- package/build/services/TranscriptionRouting.d.ts +12 -0
- package/build/services/TranscriptionRouting.d.ts.map +1 -0
- package/build/services/TranscriptionRouting.js +24 -0
- package/build/services/TranscriptionRouting.js.map +1 -0
- package/build/services/WebviewBridge.d.ts +22 -0
- package/build/services/WebviewBridge.d.ts.map +1 -0
- package/build/services/WebviewBridge.js +47 -0
- package/build/services/WebviewBridge.js.map +1 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.d.ts +17 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.d.ts.map +1 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.js +43 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.js.map +1 -0
- package/build/services/asg/asgCameraApi.d.ts +205 -0
- package/build/services/asg/asgCameraApi.d.ts.map +1 -0
- package/build/services/asg/asgCameraApi.js +1410 -0
- package/build/services/asg/asgCameraApi.js.map +1 -0
- package/build/services/asg/cameraRollExportCoordinator.d.ts +60 -0
- package/build/services/asg/cameraRollExportCoordinator.d.ts.map +1 -0
- package/build/services/asg/cameraRollExportCoordinator.js +618 -0
- package/build/services/asg/cameraRollExportCoordinator.js.map +1 -0
- package/build/services/asg/cameraRollExportLedger.d.ts +44 -0
- package/build/services/asg/cameraRollExportLedger.d.ts.map +1 -0
- package/build/services/asg/cameraRollExportLedger.js +78 -0
- package/build/services/asg/cameraRollExportLedger.js.map +1 -0
- package/build/services/asg/galleryMediaValidation.d.ts +29 -0
- package/build/services/asg/galleryMediaValidation.d.ts.map +1 -0
- package/build/services/asg/galleryMediaValidation.js +149 -0
- package/build/services/asg/galleryMediaValidation.js.map +1 -0
- package/build/services/asg/galleryNotices.d.ts +33 -0
- package/build/services/asg/galleryNotices.d.ts.map +1 -0
- package/build/services/asg/galleryNotices.js +29 -0
- package/build/services/asg/galleryNotices.js.map +1 -0
- package/build/services/asg/galleryPathMigration.d.ts +3 -0
- package/build/services/asg/galleryPathMigration.d.ts.map +1 -0
- package/build/services/asg/galleryPathMigration.js +26 -0
- package/build/services/asg/galleryPathMigration.js.map +1 -0
- package/build/services/asg/gallerySettingsService.d.ts +20 -0
- package/build/services/asg/gallerySettingsService.d.ts.map +1 -0
- package/build/services/asg/gallerySettingsService.js +53 -0
- package/build/services/asg/gallerySettingsService.js.map +1 -0
- package/build/services/asg/gallerySyncNotifications.d.ts +56 -0
- package/build/services/asg/gallerySyncNotifications.d.ts.map +1 -0
- package/build/services/asg/gallerySyncNotifications.js +198 -0
- package/build/services/asg/gallerySyncNotifications.js.map +1 -0
- package/build/services/asg/gallerySyncService.d.ts +137 -0
- package/build/services/asg/gallerySyncService.d.ts.map +1 -0
- package/build/services/asg/gallerySyncService.js +1933 -0
- package/build/services/asg/gallerySyncService.js.map +1 -0
- package/build/services/asg/galleryTransferLedger.d.ts +58 -0
- package/build/services/asg/galleryTransferLedger.d.ts.map +1 -0
- package/build/services/asg/galleryTransferLedger.js +225 -0
- package/build/services/asg/galleryTransferLedger.js.map +1 -0
- package/build/services/asg/localNetworkTransport.d.ts +15 -0
- package/build/services/asg/localNetworkTransport.d.ts.map +1 -0
- package/build/services/asg/localNetworkTransport.js +144 -0
- package/build/services/asg/localNetworkTransport.js.map +1 -0
- package/build/services/asg/localStorageService.d.ts +146 -0
- package/build/services/asg/localStorageService.d.ts.map +1 -0
- package/build/services/asg/localStorageService.js +572 -0
- package/build/services/asg/localStorageService.js.map +1 -0
- package/build/services/asg/mediaProcessingQueue.d.ts +70 -0
- package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -0
- package/build/services/asg/mediaProcessingQueue.js +451 -0
- package/build/services/asg/mediaProcessingQueue.js.map +1 -0
- package/build/services/asgOtaVersionUrl.d.ts +2 -0
- package/build/services/asgOtaVersionUrl.d.ts.map +1 -0
- package/build/services/asgOtaVersionUrl.js +36 -0
- package/build/services/asgOtaVersionUrl.js.map +1 -0
- package/build/services/blobPaths.d.ts +31 -0
- package/build/services/blobPaths.d.ts.map +1 -0
- package/build/services/blobPaths.js +86 -0
- package/build/services/blobPaths.js.map +1 -0
- package/build/services/cloudStreamApi.d.ts +59 -0
- package/build/services/cloudStreamApi.d.ts.map +1 -0
- package/build/services/cloudStreamApi.js +81 -0
- package/build/services/cloudStreamApi.js.map +1 -0
- package/build/services/gallerySyncClock.d.ts +17 -0
- package/build/services/gallerySyncClock.d.ts.map +1 -0
- package/build/services/gallerySyncClock.js +21 -0
- package/build/services/gallerySyncClock.js.map +1 -0
- package/build/services/glassesClockSync.d.ts +20 -0
- package/build/services/glassesClockSync.d.ts.map +1 -0
- package/build/services/glassesClockSync.js +97 -0
- package/build/services/glassesClockSync.js.map +1 -0
- package/build/services/manifestVersionGate.d.ts +28 -0
- package/build/services/manifestVersionGate.d.ts.map +1 -0
- package/build/services/manifestVersionGate.js +41 -0
- package/build/services/manifestVersionGate.js.map +1 -0
- package/build/services/mentraUiShim.d.ts +38 -0
- package/build/services/mentraUiShim.d.ts.map +1 -0
- package/build/services/mentraUiShim.js +360 -0
- package/build/services/mentraUiShim.js.map +1 -0
- package/build/services/navigation/roadNameResolver.d.ts +67 -0
- package/build/services/navigation/roadNameResolver.d.ts.map +1 -0
- package/build/services/navigation/roadNameResolver.js +96 -0
- package/build/services/navigation/roadNameResolver.js.map +1 -0
- package/build/services/navigation/routesApiCodec.d.ts +38 -0
- package/build/services/navigation/routesApiCodec.d.ts.map +1 -0
- package/build/services/navigation/routesApiCodec.js +68 -0
- package/build/services/navigation/routesApiCodec.js.map +1 -0
- package/build/services/otaDisplayState.d.ts +42 -0
- package/build/services/otaDisplayState.d.ts.map +1 -0
- package/build/services/otaDisplayState.js +92 -0
- package/build/services/otaDisplayState.js.map +1 -0
- package/build/services/otaInstallPolicy.d.ts +81 -0
- package/build/services/otaInstallPolicy.d.ts.map +1 -0
- package/build/services/otaInstallPolicy.js +96 -0
- package/build/services/otaInstallPolicy.js.map +1 -0
- package/build/services/otaLegacyMapping.d.ts +22 -0
- package/build/services/otaLegacyMapping.d.ts.map +1 -0
- package/build/services/otaLegacyMapping.js +56 -0
- package/build/services/otaLegacyMapping.js.map +1 -0
- package/build/services/slimStreamStatus.d.ts +7 -0
- package/build/services/slimStreamStatus.d.ts.map +1 -0
- package/build/services/slimStreamStatus.js +26 -0
- package/build/services/slimStreamStatus.js.map +1 -0
- package/build/stores/apps.d.ts +104 -0
- package/build/stores/apps.d.ts.map +1 -0
- package/build/stores/apps.js +492 -0
- package/build/stores/apps.js.map +1 -0
- package/build/stores/bluetoothSettingKeys.d.ts +4 -0
- package/build/stores/bluetoothSettingKeys.d.ts.map +1 -0
- package/build/stores/bluetoothSettingKeys.js +31 -0
- package/build/stores/bluetoothSettingKeys.js.map +1 -0
- package/build/stores/cloudClientStatus.d.ts +9 -0
- package/build/stores/cloudClientStatus.d.ts.map +1 -0
- package/build/stores/cloudClientStatus.js +24 -0
- package/build/stores/cloudClientStatus.js.map +1 -0
- package/build/stores/connection.d.ts +22 -0
- package/build/stores/connection.d.ts.map +1 -0
- package/build/stores/connection.js +43 -0
- package/build/stores/connection.js.map +1 -0
- package/build/stores/core.d.ts +15 -0
- package/build/stores/core.d.ts.map +1 -0
- package/build/stores/core.js +21 -0
- package/build/stores/core.js.map +1 -0
- package/build/stores/display.d.ts +24 -0
- package/build/stores/display.d.ts.map +1 -0
- package/build/stores/display.js +96 -0
- package/build/stores/display.js.map +1 -0
- package/build/stores/gallerySync.d.ts +101 -0
- package/build/stores/gallerySync.d.ts.map +1 -0
- package/build/stores/gallerySync.js +217 -0
- package/build/stores/gallerySync.js.map +1 -0
- package/build/stores/glasses.d.ts +62 -0
- package/build/stores/glasses.d.ts.map +1 -0
- package/build/stores/glasses.js +203 -0
- package/build/stores/glasses.js.map +1 -0
- package/build/stores/settings.d.ts +37 -0
- package/build/stores/settings.d.ts.map +1 -0
- package/build/stores/settings.js +922 -0
- package/build/stores/settings.js.map +1 -0
- package/build/types/applet.d.ts +96 -0
- package/build/types/applet.d.ts.map +1 -0
- package/build/types/applet.js +5 -0
- package/build/types/applet.js.map +1 -0
- package/build/types/asg.d.ts +53 -0
- package/build/types/asg.d.ts.map +1 -0
- package/build/types/asg.js +2 -0
- package/build/types/asg.js.map +1 -0
- package/build/types/capabilities/even-realities-g1.d.ts +12 -0
- package/build/types/capabilities/even-realities-g1.d.ts.map +1 -0
- package/build/types/capabilities/even-realities-g1.js +55 -0
- package/build/types/capabilities/even-realities-g1.js.map +1 -0
- package/build/types/capabilities/even-realities-g2.d.ts +12 -0
- package/build/types/capabilities/even-realities-g2.d.ts.map +1 -0
- package/build/types/capabilities/even-realities-g2.js +75 -0
- package/build/types/capabilities/even-realities-g2.js.map +1 -0
- package/build/types/capabilities/mentra-display.d.ts +12 -0
- package/build/types/capabilities/mentra-display.d.ts.map +1 -0
- package/build/types/capabilities/mentra-display.js +63 -0
- package/build/types/capabilities/mentra-display.js.map +1 -0
- package/build/types/capabilities/mentra-live.d.ts +12 -0
- package/build/types/capabilities/mentra-live.d.ts.map +1 -0
- package/build/types/capabilities/mentra-live.js +92 -0
- package/build/types/capabilities/mentra-live.js.map +1 -0
- package/build/types/capabilities/none.d.ts +13 -0
- package/build/types/capabilities/none.d.ts.map +1 -0
- package/build/types/capabilities/none.js +65 -0
- package/build/types/capabilities/none.js.map +1 -0
- package/build/types/capabilities/simulated-glasses.d.ts +13 -0
- package/build/types/capabilities/simulated-glasses.d.ts.map +1 -0
- package/build/types/capabilities/simulated-glasses.js +65 -0
- package/build/types/capabilities/simulated-glasses.js.map +1 -0
- package/build/types/capabilities/vuzix-z100.d.ts +12 -0
- package/build/types/capabilities/vuzix-z100.d.ts.map +1 -0
- package/build/types/capabilities/vuzix-z100.js +52 -0
- package/build/types/capabilities/vuzix-z100.js.map +1 -0
- package/build/types/enums.d.ts +40 -0
- package/build/types/enums.d.ts.map +1 -0
- package/build/types/enums.js +44 -0
- package/build/types/enums.js.map +1 -0
- package/build/types/hardware.d.ts +160 -0
- package/build/types/hardware.d.ts.map +1 -0
- package/build/types/hardware.js +36 -0
- package/build/types/hardware.js.map +1 -0
- package/build/types/index.d.ts +11 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/index.js +10 -0
- package/build/types/index.js.map +1 -0
- package/build/utils/GlobalEventEmitter.d.ts +10 -0
- package/build/utils/GlobalEventEmitter.d.ts.map +1 -0
- package/build/utils/GlobalEventEmitter.js +13 -0
- package/build/utils/GlobalEventEmitter.js.map +1 -0
- package/build/utils/cloudClient/RnUdpAdapter.d.ts +3 -0
- package/build/utils/cloudClient/RnUdpAdapter.d.ts.map +1 -0
- package/build/utils/cloudClient/RnUdpAdapter.js +41 -0
- package/build/utils/cloudClient/RnUdpAdapter.js.map +1 -0
- package/build/utils/cloudClient/cloudSecureStore.d.ts +3 -0
- package/build/utils/cloudClient/cloudSecureStore.d.ts.map +1 -0
- package/build/utils/cloudClient/cloudSecureStore.js +26 -0
- package/build/utils/cloudClient/cloudSecureStore.js.map +1 -0
- package/build/utils/debouncedPatch.d.ts +6 -0
- package/build/utils/debouncedPatch.d.ts.map +1 -0
- package/build/utils/debouncedPatch.js +25 -0
- package/build/utils/debouncedPatch.js.map +1 -0
- package/build/utils/devLogging.d.ts +26 -0
- package/build/utils/devLogging.d.ts.map +1 -0
- package/build/utils/devLogging.js +116 -0
- package/build/utils/devLogging.js.map +1 -0
- package/build/utils/devMiniappLaunch.d.ts +44 -0
- package/build/utils/devMiniappLaunch.d.ts.map +1 -0
- package/build/utils/devMiniappLaunch.js +52 -0
- package/build/utils/devMiniappLaunch.js.map +1 -0
- package/build/utils/diagnosticContext.d.ts +3 -0
- package/build/utils/diagnosticContext.d.ts.map +1 -0
- package/build/utils/diagnosticContext.js +119 -0
- package/build/utils/diagnosticContext.js.map +1 -0
- package/build/utils/display/composer/ColumnComposer.d.ts +131 -0
- package/build/utils/display/composer/ColumnComposer.d.ts.map +1 -0
- package/build/utils/display/composer/ColumnComposer.js +204 -0
- package/build/utils/display/composer/ColumnComposer.js.map +1 -0
- package/build/utils/display/composer/index.d.ts +9 -0
- package/build/utils/display/composer/index.d.ts.map +1 -0
- package/build/utils/display/composer/index.js +9 -0
- package/build/utils/display/composer/index.js.map +1 -0
- package/build/utils/display/helpers/DisplayHelpers.d.ts +165 -0
- package/build/utils/display/helpers/DisplayHelpers.d.ts.map +1 -0
- package/build/utils/display/helpers/DisplayHelpers.js +312 -0
- package/build/utils/display/helpers/DisplayHelpers.js.map +1 -0
- package/build/utils/display/helpers/ScrollView.d.ts +183 -0
- package/build/utils/display/helpers/ScrollView.d.ts.map +1 -0
- package/build/utils/display/helpers/ScrollView.js +257 -0
- package/build/utils/display/helpers/ScrollView.js.map +1 -0
- package/build/utils/display/helpers/index.d.ts +11 -0
- package/build/utils/display/helpers/index.d.ts.map +1 -0
- package/build/utils/display/helpers/index.js +10 -0
- package/build/utils/display/helpers/index.js.map +1 -0
- package/build/utils/display/index.d.ts +174 -0
- package/build/utils/display/index.d.ts.map +1 -0
- package/build/utils/display/index.js +185 -0
- package/build/utils/display/index.js.map +1 -0
- package/build/utils/display/measurer/TextMeasurer.d.ts +160 -0
- package/build/utils/display/measurer/TextMeasurer.d.ts.map +1 -0
- package/build/utils/display/measurer/TextMeasurer.js +273 -0
- package/build/utils/display/measurer/TextMeasurer.js.map +1 -0
- package/build/utils/display/measurer/index.d.ts +10 -0
- package/build/utils/display/measurer/index.d.ts.map +1 -0
- package/build/utils/display/measurer/index.js +11 -0
- package/build/utils/display/measurer/index.js.map +1 -0
- package/build/utils/display/measurer/script-detection.d.ts +53 -0
- package/build/utils/display/measurer/script-detection.d.ts.map +1 -0
- package/build/utils/display/measurer/script-detection.js +184 -0
- package/build/utils/display/measurer/script-detection.js.map +1 -0
- package/build/utils/display/profiles/g1.d.ts +33 -0
- package/build/utils/display/profiles/g1.d.ts.map +1 -0
- package/build/utils/display/profiles/g1.js +213 -0
- package/build/utils/display/profiles/g1.js.map +1 -0
- package/build/utils/display/profiles/g2.d.ts +13 -0
- package/build/utils/display/profiles/g2.d.ts.map +1 -0
- package/build/utils/display/profiles/g2.js +34 -0
- package/build/utils/display/profiles/g2.js.map +1 -0
- package/build/utils/display/profiles/index.d.ts +12 -0
- package/build/utils/display/profiles/index.d.ts.map +1 -0
- package/build/utils/display/profiles/index.js +15 -0
- package/build/utils/display/profiles/index.js.map +1 -0
- package/build/utils/display/profiles/nex.d.ts +10 -0
- package/build/utils/display/profiles/nex.d.ts.map +1 -0
- package/build/utils/display/profiles/nex.js +150 -0
- package/build/utils/display/profiles/nex.js.map +1 -0
- package/build/utils/display/profiles/types.d.ts +103 -0
- package/build/utils/display/profiles/types.d.ts.map +1 -0
- package/build/utils/display/profiles/types.js +2 -0
- package/build/utils/display/profiles/types.js.map +1 -0
- package/build/utils/display/profiles/z100.d.ts +33 -0
- package/build/utils/display/profiles/z100.d.ts.map +1 -0
- package/build/utils/display/profiles/z100.js +182 -0
- package/build/utils/display/profiles/z100.js.map +1 -0
- package/build/utils/display/scene/degrade.d.ts +25 -0
- package/build/utils/display/scene/degrade.d.ts.map +1 -0
- package/build/utils/display/scene/degrade.js +64 -0
- package/build/utils/display/scene/degrade.js.map +1 -0
- package/build/utils/display/scene/differ.d.ts +38 -0
- package/build/utils/display/scene/differ.d.ts.map +1 -0
- package/build/utils/display/scene/differ.js +107 -0
- package/build/utils/display/scene/differ.js.map +1 -0
- package/build/utils/display/scene/index.d.ts +10 -0
- package/build/utils/display/scene/index.d.ts.map +1 -0
- package/build/utils/display/scene/index.js +6 -0
- package/build/utils/display/scene/index.js.map +1 -0
- package/build/utils/display/scene/process.d.ts +35 -0
- package/build/utils/display/scene/process.d.ts.map +1 -0
- package/build/utils/display/scene/process.js +187 -0
- package/build/utils/display/scene/process.js.map +1 -0
- package/build/utils/display/scene/store.d.ts +48 -0
- package/build/utils/display/scene/store.d.ts.map +1 -0
- package/build/utils/display/scene/store.js +0 -0
- package/build/utils/display/scene/store.js.map +1 -0
- package/build/utils/display/scene/types.d.ts +120 -0
- package/build/utils/display/scene/types.d.ts.map +1 -0
- package/build/utils/display/scene/types.js +0 -0
- package/build/utils/display/scene/types.js.map +1 -0
- package/build/utils/display/wrapper/TextWrapper.d.ts +102 -0
- package/build/utils/display/wrapper/TextWrapper.d.ts.map +1 -0
- package/build/utils/display/wrapper/TextWrapper.js +471 -0
- package/build/utils/display/wrapper/TextWrapper.js.map +1 -0
- package/build/utils/display/wrapper/index.d.ts +12 -0
- package/build/utils/display/wrapper/index.d.ts.map +1 -0
- package/build/utils/display/wrapper/index.js +12 -0
- package/build/utils/display/wrapper/index.js.map +1 -0
- package/build/utils/display/wrapper/types.d.ts +75 -0
- package/build/utils/display/wrapper/types.d.ts.map +1 -0
- package/build/utils/display/wrapper/types.js +11 -0
- package/build/utils/display/wrapper/types.js.map +1 -0
- package/build/utils/e2eMetrics.d.ts +6 -0
- package/build/utils/e2eMetrics.d.ts.map +1 -0
- package/build/utils/e2eMetrics.js +27 -0
- package/build/utils/e2eMetrics.js.map +1 -0
- package/build/utils/hardware/hardware.d.ts +42 -0
- package/build/utils/hardware/hardware.d.ts.map +1 -0
- package/build/utils/hardware/hardware.js +127 -0
- package/build/utils/hardware/hardware.js.map +1 -0
- package/build/utils/hardware/index.d.ts +2 -0
- package/build/utils/hardware/index.d.ts.map +1 -0
- package/build/utils/hardware/index.js +2 -0
- package/build/utils/hardware/index.js.map +1 -0
- package/build/utils/miniappGlobals.d.ts +60 -0
- package/build/utils/miniappGlobals.d.ts.map +1 -0
- package/build/utils/miniappGlobals.js +224 -0
- package/build/utils/miniappGlobals.js.map +1 -0
- package/build/utils/permissions/MediaLibraryPermissions.d.ts +45 -0
- package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -0
- package/build/utils/permissions/MediaLibraryPermissions.js +145 -0
- package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -0
- package/build/utils/permissions/galleryDisplayName.d.ts +8 -0
- package/build/utils/permissions/galleryDisplayName.d.ts.map +1 -0
- package/build/utils/permissions/galleryDisplayName.js +25 -0
- package/build/utils/permissions/galleryDisplayName.js.map +1 -0
- package/build/utils/storage/index.d.ts +3 -0
- package/build/utils/storage/index.d.ts.map +1 -0
- package/build/utils/storage/index.js +3 -0
- package/build/utils/storage/index.js.map +1 -0
- package/build/utils/storage/storage.d.ts +24 -0
- package/build/utils/storage/storage.d.ts.map +1 -0
- package/build/utils/storage/storage.js +85 -0
- package/build/utils/storage/storage.js.map +1 -0
- package/build/utils/storage/zip.d.ts +3 -0
- package/build/utils/storage/zip.d.ts.map +1 -0
- package/build/utils/storage/zip.js +14 -0
- package/build/utils/storage/zip.js.map +1 -0
- package/build/utils/timers/index.d.ts +3 -0
- package/build/utils/timers/index.d.ts.map +1 -0
- package/build/utils/timers/index.js +3 -0
- package/build/utils/timers/index.js.map +1 -0
- package/build/utils/timers/timers.d.ts +9 -0
- package/build/utils/timers/timers.d.ts.map +1 -0
- package/build/utils/timers/timers.js +105 -0
- package/build/utils/timers/timers.js.map +1 -0
- package/package.json +120 -0
- package/src/devtools.ts +13 -0
- package/src/engine.ts +173 -0
- package/src/facades/dev.ts +198 -0
- package/src/facades/display.ts +17 -0
- package/src/facades/displayMirror.ts +33 -0
- package/src/facades/gallery.ts +69 -0
- package/src/facades/glasses.ts +206 -0
- package/src/facades/glassesSettings.ts +56 -0
- package/src/facades/glassesWifi.ts +68 -0
- package/src/facades/miniapps.ts +55 -0
- package/src/facades/notifications.ts +15 -0
- package/src/facades/ota.ts +174 -0
- package/src/facades/pairing.ts +329 -0
- package/src/facades/permissions.ts +165 -0
- package/src/facades/phoneNotifications.ts +50 -0
- package/src/facades/reports.ts +185 -0
- package/src/facades/session.ts +55 -0
- package/src/facades/settings.ts +57 -0
- package/src/facades/speech.ts +38 -0
- package/src/index.ts +191 -0
- package/src/internal.ts +159 -0
- package/src/runtime/bootstrap.ts +118 -0
- package/src/runtime/config.ts +147 -0
- package/src/runtime/streamConfig.ts +34 -0
- package/src/services/AppRegistry.ts +1190 -0
- package/src/services/AudioCloudUplink.ts +50 -0
- package/src/services/AudioPlaybackService.ts +813 -0
- package/src/services/AutomaticReportResult.ts +48 -0
- package/src/services/BlobStore.ts +746 -0
- package/src/services/CaptionsTesterReportService.ts +107 -0
- package/src/services/CloudAudioSubscriptionSync.ts +41 -0
- package/src/services/CloudClientService.ts +689 -0
- package/src/services/CloudTranscriptE2EMetrics.ts +27 -0
- package/src/services/ConnectionCoordinator.ts +65 -0
- package/src/services/DevServerBridge.ts +332 -0
- package/src/services/DeviceEventRouter.ts +238 -0
- package/src/services/DeviceStoreHydration.ts +130 -0
- package/src/services/DisplayProcessor.ts +775 -0
- package/src/services/GlassesReadiness.ts +103 -0
- package/src/services/GlassesSettingsSync.ts +134 -0
- package/src/services/GlassesStatusProjection.ts +73 -0
- package/src/services/HeadingService.ts +98 -0
- package/src/services/LocalDisplayManager.ts +703 -0
- package/src/services/LocalMiniappRuntime.ts +4213 -0
- package/src/services/LocalSttFallbackCoordinator.ts +147 -0
- package/src/services/MentraJSCrashController.ts +189 -0
- package/src/services/MentraJSCrashloopReportService.ts +66 -0
- package/src/services/MentraJSLogPipeline.ts +166 -0
- package/src/services/MentraJSRouter.ts +557 -0
- package/src/services/MentraUIRouter.ts +244 -0
- package/src/services/MicStateCoordinator.ts +94 -0
- package/src/services/MiniappEngine.ts +143 -0
- package/src/services/MiniappLauncher.ts +340 -0
- package/src/services/MiniappRunningRegistry.ts +57 -0
- package/src/services/NativeHttpResponse.ts +6 -0
- package/src/services/NavigationHandlers.ts +423 -0
- package/src/services/NavigationService.ts +731 -0
- package/src/services/NotificationsEmitter.ts +48 -0
- package/src/services/OfflineSpeechModelService.ts +168 -0
- package/src/services/OtaInstallCoordinator.ts +1205 -0
- package/src/services/OtaService.ts +83 -0
- package/src/services/OtaUpdateCheckService.ts +386 -0
- package/src/services/PairingIdentity.ts +154 -0
- package/src/services/PhoneCalendarHelpers.ts +212 -0
- package/src/services/PhoneCalendarService.ts +42 -0
- package/src/services/PhoneCameraFovCoordinator.ts +195 -0
- package/src/services/PhoneLocationService.ts +122 -0
- package/src/services/PhoneNotificationsSync.ts +44 -0
- package/src/services/PhonePhotoCoordinator.ts +409 -0
- package/src/services/PhoneStreamCoordinator.ts +777 -0
- package/src/services/PhoneVideoCoordinator.ts +189 -0
- package/src/services/STTModelManager.ts +360 -0
- package/src/services/SceneRenderer.ts +292 -0
- package/src/services/SentenceTtsPipeline.ts +106 -0
- package/src/services/StreamLifecycleController.ts +213 -0
- package/src/services/TTSModelManager.ts +466 -0
- package/src/services/TranscriptionRouting.ts +37 -0
- package/src/services/WebviewBridge.ts +50 -0
- package/src/services/asg/GalleryMediaIntegrityReportService.ts +70 -0
- package/src/services/asg/asgCameraApi.ts +1695 -0
- package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
- package/src/services/asg/cameraRollExportLedger.ts +122 -0
- package/src/services/asg/galleryMediaValidation.ts +183 -0
- package/src/services/asg/galleryNotices.ts +61 -0
- package/src/services/asg/galleryPathMigration.ts +22 -0
- package/src/services/asg/gallerySettingsService.ts +68 -0
- package/src/services/asg/gallerySyncNotifications.ts +236 -0
- package/src/services/asg/gallerySyncService.ts +2269 -0
- package/src/services/asg/galleryTransferLedger.ts +312 -0
- package/src/services/asg/localNetworkTransport.ts +173 -0
- package/src/services/asg/localStorageService.ts +652 -0
- package/src/services/asg/mediaProcessingQueue.ts +518 -0
- package/src/services/asgOtaVersionUrl.ts +41 -0
- package/src/services/blobPaths.ts +86 -0
- package/src/services/cloudStreamApi.ts +154 -0
- package/src/services/gallerySyncClock.ts +39 -0
- package/src/services/glassesClockSync.ts +115 -0
- package/src/services/manifestVersionGate.ts +43 -0
- package/src/services/mentraUiShim.ts +366 -0
- package/src/services/navigation/roadNameResolver.ts +112 -0
- package/src/services/navigation/routesApiCodec.ts +69 -0
- package/src/services/otaDisplayState.ts +115 -0
- package/src/services/otaInstallPolicy.ts +106 -0
- package/src/services/otaLegacyMapping.ts +71 -0
- package/src/services/slimStreamStatus.ts +28 -0
- package/src/stores/apps.ts +614 -0
- package/src/stores/bluetoothSettingKeys.ts +36 -0
- package/src/stores/cloudClientStatus.ts +37 -0
- package/src/stores/connection.ts +69 -0
- package/src/stores/core.ts +32 -0
- package/src/stores/display.ts +121 -0
- package/src/stores/gallerySync.ts +380 -0
- package/src/stores/glasses.ts +309 -0
- package/src/stores/settings.ts +1001 -0
- package/src/types/applet.ts +112 -0
- package/src/types/asg.ts +58 -0
- package/src/types/capabilities/even-realities-g1.ts +67 -0
- package/src/types/capabilities/even-realities-g2.ts +88 -0
- package/src/types/capabilities/mentra-display.ts +75 -0
- package/src/types/capabilities/mentra-live.ts +103 -0
- package/src/types/capabilities/none.ts +76 -0
- package/src/types/capabilities/simulated-glasses.ts +76 -0
- package/src/types/capabilities/vuzix-z100.ts +64 -0
- package/src/types/enums.ts +43 -0
- package/src/types/hardware.ts +203 -0
- package/src/types/index.ts +37 -0
- package/src/utils/GlobalEventEmitter.ts +14 -0
- package/src/utils/cloudClient/RnUdpAdapter.ts +47 -0
- package/src/utils/cloudClient/cloudSecureStore.ts +28 -0
- package/src/utils/debouncedPatch.ts +28 -0
- package/src/utils/devLogging.ts +140 -0
- package/src/utils/devMiniappLaunch.ts +68 -0
- package/src/utils/diagnosticContext.ts +155 -0
- package/src/utils/display/composer/ColumnComposer.ts +285 -0
- package/src/utils/display/composer/index.ts +15 -0
- package/src/utils/display/helpers/DisplayHelpers.ts +413 -0
- package/src/utils/display/helpers/ScrollView.ts +337 -0
- package/src/utils/display/helpers/index.ts +14 -0
- package/src/utils/display/index.ts +273 -0
- package/src/utils/display/measurer/TextMeasurer.ts +346 -0
- package/src/utils/display/measurer/index.ts +21 -0
- package/src/utils/display/measurer/script-detection.ts +218 -0
- package/src/utils/display/profiles/g1.ts +236 -0
- package/src/utils/display/profiles/g2.ts +39 -0
- package/src/utils/display/profiles/index.ts +28 -0
- package/src/utils/display/profiles/nex.ts +166 -0
- package/src/utils/display/profiles/types.ts +132 -0
- package/src/utils/display/profiles/z100.ts +198 -0
- package/src/utils/display/scene/degrade.ts +80 -0
- package/src/utils/display/scene/differ.ts +128 -0
- package/src/utils/display/scene/index.ts +21 -0
- package/src/utils/display/scene/process.ts +214 -0
- package/src/utils/display/scene/store.ts +0 -0
- package/src/utils/display/scene/types.ts +0 -0
- package/src/utils/display/wrapper/TextWrapper.ts +546 -0
- package/src/utils/display/wrapper/index.ts +15 -0
- package/src/utils/display/wrapper/types.ts +102 -0
- package/src/utils/e2eMetrics.ts +30 -0
- package/src/utils/hardware/hardware.ts +166 -0
- package/src/utils/hardware/index.ts +1 -0
- package/src/utils/miniappGlobals.ts +260 -0
- package/src/utils/permissions/MediaLibraryPermissions.ts +161 -0
- package/src/utils/permissions/galleryDisplayName.ts +28 -0
- package/src/utils/storage/index.ts +2 -0
- package/src/utils/storage/storage.ts +101 -0
- package/src/utils/storage/zip.ts +13 -0
- package/src/utils/timers/index.ts +2 -0
- package/src/utils/timers/timers.ts +139 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GlassesReadiness — the canonical connection predicates plus a wait-for-booted
|
|
3
|
+
* primitive.
|
|
4
|
+
*
|
|
5
|
+
* The predicates ("connected / booted / busy") are the single app-facing home
|
|
6
|
+
* for connection readiness: the app, the Connection coordinator, and the
|
|
7
|
+
* Pairing coordinator all read them through engine rather than re-deriving the
|
|
8
|
+
* same checks in three places. They are defined here over the btsdk
|
|
9
|
+
* `GlassesConnectionStatus` type through the public Bluetooth SDK package
|
|
10
|
+
* boundary.
|
|
11
|
+
*
|
|
12
|
+
* waitForGlassesReady is the new primitive those coordinators build on:
|
|
13
|
+
* "resolve once the glasses report fully booted, or false on timeout". It is
|
|
14
|
+
* host-store-agnostic — callers inject a snapshot getter + a subscribe fn — so
|
|
15
|
+
* it is unit-testable without a live device.
|
|
16
|
+
*/
|
|
17
|
+
import { type GlassesConnectionStatus } from "@mentra/bluetooth-sdk/types";
|
|
18
|
+
export type { GlassesConnectionStatus };
|
|
19
|
+
/** True when the BLE link is established (regardless of boot state). */
|
|
20
|
+
export declare function isGlassesConnected(connection: GlassesConnectionStatus): boolean;
|
|
21
|
+
/** True when connected AND the glasses OS has finished booting. */
|
|
22
|
+
export declare function isGlassesReady(connection: GlassesConnectionStatus): boolean;
|
|
23
|
+
/** True while the native link layer is mid scan / connect / bond. */
|
|
24
|
+
export declare function isGlassesLinkLayerBusy(connection: GlassesConnectionStatus): boolean;
|
|
25
|
+
export interface WaitForGlassesReadyOptions {
|
|
26
|
+
/** Current connection snapshot. */
|
|
27
|
+
getConnection: () => GlassesConnectionStatus;
|
|
28
|
+
/** Subscribe to connection changes; returns an unsubscribe fn. */
|
|
29
|
+
subscribe: (listener: (connection: GlassesConnectionStatus) => void) => () => void;
|
|
30
|
+
/** Resolve false after this many ms if still not ready. Default 35s — the pairing boot budget. */
|
|
31
|
+
timeoutMs?: number;
|
|
32
|
+
/** Abort the wait early (e.g. the screen unmounted). Tears down the subscription + timer; resolves false. */
|
|
33
|
+
signal?: AbortSignal;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolves true once the glasses report fully booted, false on timeout, or
|
|
37
|
+
* false if the optional signal aborts. Resolves immediately when already ready.
|
|
38
|
+
* Always tears down its subscription, timer, and abort listener before resolving.
|
|
39
|
+
*/
|
|
40
|
+
export declare function waitForGlassesReady(options: WaitForGlassesReadyOptions): Promise<boolean>;
|
|
41
|
+
//# sourceMappingURL=GlassesReadiness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GlassesReadiness.d.ts","sourceRoot":"","sources":["../../src/services/GlassesReadiness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAIL,KAAK,uBAAuB,EAC7B,MAAM,6BAA6B,CAAA;AAIpC,YAAY,EAAC,uBAAuB,EAAC,CAAA;AAErC,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,uBAAuB,GAAG,OAAO,CAE/E;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,UAAU,EAAE,uBAAuB,GAAG,OAAO,CAE3E;AAED,qEAAqE;AACrE,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,uBAAuB,GAAG,OAAO,CAEnF;AAED,MAAM,WAAW,0BAA0B;IACzC,mCAAmC;IACnC,aAAa,EAAE,MAAM,uBAAuB,CAAA;IAC5C,kEAAkE;IAClE,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,uBAAuB,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;IAClF,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6GAA6G;IAC7G,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,OAAO,CAAC,CA4CzF"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GlassesReadiness — the canonical connection predicates plus a wait-for-booted
|
|
3
|
+
* primitive.
|
|
4
|
+
*
|
|
5
|
+
* The predicates ("connected / booted / busy") are the single app-facing home
|
|
6
|
+
* for connection readiness: the app, the Connection coordinator, and the
|
|
7
|
+
* Pairing coordinator all read them through engine rather than re-deriving the
|
|
8
|
+
* same checks in three places. They are defined here over the btsdk
|
|
9
|
+
* `GlassesConnectionStatus` type through the public Bluetooth SDK package
|
|
10
|
+
* boundary.
|
|
11
|
+
*
|
|
12
|
+
* waitForGlassesReady is the new primitive those coordinators build on:
|
|
13
|
+
* "resolve once the glasses report fully booted, or false on timeout". It is
|
|
14
|
+
* host-store-agnostic — callers inject a snapshot getter + a subscribe fn — so
|
|
15
|
+
* it is unit-testable without a live device.
|
|
16
|
+
*/
|
|
17
|
+
import { isBusyGlassesConnectionStatus, isConnectedGlassesConnectionStatus, isReadyGlassesConnectionStatus, } from "@mentra/bluetooth-sdk/types";
|
|
18
|
+
import { BgTimer } from "../utils/timers";
|
|
19
|
+
/** True when the BLE link is established (regardless of boot state). */
|
|
20
|
+
export function isGlassesConnected(connection) {
|
|
21
|
+
return isConnectedGlassesConnectionStatus(connection);
|
|
22
|
+
}
|
|
23
|
+
/** True when connected AND the glasses OS has finished booting. */
|
|
24
|
+
export function isGlassesReady(connection) {
|
|
25
|
+
return isReadyGlassesConnectionStatus(connection);
|
|
26
|
+
}
|
|
27
|
+
/** True while the native link layer is mid scan / connect / bond. */
|
|
28
|
+
export function isGlassesLinkLayerBusy(connection) {
|
|
29
|
+
return isBusyGlassesConnectionStatus(connection);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Resolves true once the glasses report fully booted, false on timeout, or
|
|
33
|
+
* false if the optional signal aborts. Resolves immediately when already ready.
|
|
34
|
+
* Always tears down its subscription, timer, and abort listener before resolving.
|
|
35
|
+
*/
|
|
36
|
+
export function waitForGlassesReady(options) {
|
|
37
|
+
const { getConnection, subscribe, timeoutMs = 35_000, signal } = options;
|
|
38
|
+
return new Promise((resolve) => {
|
|
39
|
+
if (signal?.aborted) {
|
|
40
|
+
resolve(false);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (isGlassesReady(getConnection())) {
|
|
44
|
+
resolve(true);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
let settled = false;
|
|
48
|
+
let timer = null;
|
|
49
|
+
let unsubscribe = null;
|
|
50
|
+
let onAbort = null;
|
|
51
|
+
const finish = (value) => {
|
|
52
|
+
if (settled)
|
|
53
|
+
return;
|
|
54
|
+
settled = true;
|
|
55
|
+
if (unsubscribe)
|
|
56
|
+
unsubscribe();
|
|
57
|
+
if (timer !== null)
|
|
58
|
+
BgTimer.clearTimeout(timer);
|
|
59
|
+
if (onAbort && signal)
|
|
60
|
+
signal.removeEventListener("abort", onAbort);
|
|
61
|
+
resolve(value);
|
|
62
|
+
};
|
|
63
|
+
if (signal) {
|
|
64
|
+
onAbort = () => finish(false);
|
|
65
|
+
signal.addEventListener("abort", onAbort);
|
|
66
|
+
}
|
|
67
|
+
unsubscribe = subscribe((connection) => {
|
|
68
|
+
if (isGlassesReady(connection))
|
|
69
|
+
finish(true);
|
|
70
|
+
});
|
|
71
|
+
if (settled) {
|
|
72
|
+
// subscribe() notified synchronously with a ready state, so finish() ran
|
|
73
|
+
// before unsubscribe was assigned and couldn't tear the subscription down.
|
|
74
|
+
// Do it now (and don't arm a timer).
|
|
75
|
+
unsubscribe();
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
timer = BgTimer.setTimeout(() => finish(isGlassesReady(getConnection())), timeoutMs);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=GlassesReadiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GlassesReadiness.js","sourceRoot":"","sources":["../../src/services/GlassesReadiness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EACL,6BAA6B,EAC7B,kCAAkC,EAClC,8BAA8B,GAE/B,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAAC,OAAO,EAAC,MAAM,iBAAiB,CAAA;AAIvC,wEAAwE;AACxE,MAAM,UAAU,kBAAkB,CAAC,UAAmC;IACpE,OAAO,kCAAkC,CAAC,UAAU,CAAC,CAAA;AACvD,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,cAAc,CAAC,UAAmC;IAChE,OAAO,8BAA8B,CAAC,UAAU,CAAC,CAAA;AACnD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,sBAAsB,CAAC,UAAmC;IACxE,OAAO,6BAA6B,CAAC,UAAU,CAAC,CAAA;AAClD,CAAC;AAaD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAmC;IACrE,MAAM,EAAC,aAAa,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM,EAAE,MAAM,EAAC,GAAG,OAAO,CAAA;IACtE,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;QACtC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,CAAA;YACd,OAAM;QACR,CAAC;QACD,IAAI,cAAc,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAA;YACb,OAAM;QACR,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,KAAK,GAAkB,IAAI,CAAA;QAC/B,IAAI,WAAW,GAAwB,IAAI,CAAA;QAC3C,IAAI,OAAO,GAAwB,IAAI,CAAA;QAEvC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,EAAE;YAChC,IAAI,OAAO;gBAAE,OAAM;YACnB,OAAO,GAAG,IAAI,CAAA;YACd,IAAI,WAAW;gBAAE,WAAW,EAAE,CAAA;YAC9B,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;YAC/C,IAAI,OAAO,IAAI,MAAM;gBAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YACnE,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC,CAAA;QAED,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC7B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC3C,CAAC;QAED,WAAW,GAAG,SAAS,CAAC,CAAC,UAAU,EAAE,EAAE;YACrC,IAAI,cAAc,CAAC,UAAU,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;QAEF,IAAI,OAAO,EAAE,CAAC;YACZ,yEAAyE;YACzE,2EAA2E;YAC3E,qCAAqC;YACrC,WAAW,EAAE,CAAA;QACf,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;QACtF,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["/**\n * GlassesReadiness — the canonical connection predicates plus a wait-for-booted\n * primitive.\n *\n * The predicates (\"connected / booted / busy\") are the single app-facing home\n * for connection readiness: the app, the Connection coordinator, and the\n * Pairing coordinator all read them through engine rather than re-deriving the\n * same checks in three places. They are defined here over the btsdk\n * `GlassesConnectionStatus` type through the public Bluetooth SDK package\n * boundary.\n *\n * waitForGlassesReady is the new primitive those coordinators build on:\n * \"resolve once the glasses report fully booted, or false on timeout\". It is\n * host-store-agnostic — callers inject a snapshot getter + a subscribe fn — so\n * it is unit-testable without a live device.\n */\nimport {\n isBusyGlassesConnectionStatus,\n isConnectedGlassesConnectionStatus,\n isReadyGlassesConnectionStatus,\n type GlassesConnectionStatus,\n} from \"@mentra/bluetooth-sdk/types\"\n\nimport {BgTimer} from \"../utils/timers\"\n\nexport type {GlassesConnectionStatus}\n\n/** True when the BLE link is established (regardless of boot state). */\nexport function isGlassesConnected(connection: GlassesConnectionStatus): boolean {\n return isConnectedGlassesConnectionStatus(connection)\n}\n\n/** True when connected AND the glasses OS has finished booting. */\nexport function isGlassesReady(connection: GlassesConnectionStatus): boolean {\n return isReadyGlassesConnectionStatus(connection)\n}\n\n/** True while the native link layer is mid scan / connect / bond. */\nexport function isGlassesLinkLayerBusy(connection: GlassesConnectionStatus): boolean {\n return isBusyGlassesConnectionStatus(connection)\n}\n\nexport interface WaitForGlassesReadyOptions {\n /** Current connection snapshot. */\n getConnection: () => GlassesConnectionStatus\n /** Subscribe to connection changes; returns an unsubscribe fn. */\n subscribe: (listener: (connection: GlassesConnectionStatus) => void) => () => void\n /** Resolve false after this many ms if still not ready. Default 35s — the pairing boot budget. */\n timeoutMs?: number\n /** Abort the wait early (e.g. the screen unmounted). Tears down the subscription + timer; resolves false. */\n signal?: AbortSignal\n}\n\n/**\n * Resolves true once the glasses report fully booted, false on timeout, or\n * false if the optional signal aborts. Resolves immediately when already ready.\n * Always tears down its subscription, timer, and abort listener before resolving.\n */\nexport function waitForGlassesReady(options: WaitForGlassesReadyOptions): Promise<boolean> {\n const {getConnection, subscribe, timeoutMs = 35_000, signal} = options\n return new Promise<boolean>((resolve) => {\n if (signal?.aborted) {\n resolve(false)\n return\n }\n if (isGlassesReady(getConnection())) {\n resolve(true)\n return\n }\n\n let settled = false\n let timer: number | null = null\n let unsubscribe: (() => void) | null = null\n let onAbort: (() => void) | null = null\n\n const finish = (value: boolean) => {\n if (settled) return\n settled = true\n if (unsubscribe) unsubscribe()\n if (timer !== null) BgTimer.clearTimeout(timer)\n if (onAbort && signal) signal.removeEventListener(\"abort\", onAbort)\n resolve(value)\n }\n\n if (signal) {\n onAbort = () => finish(false)\n signal.addEventListener(\"abort\", onAbort)\n }\n\n unsubscribe = subscribe((connection) => {\n if (isGlassesReady(connection)) finish(true)\n })\n\n if (settled) {\n // subscribe() notified synchronously with a ready state, so finish() ran\n // before unsubscribe was assigned and couldn't tear the subscription down.\n // Do it now (and don't arm a timer).\n unsubscribe()\n } else {\n timer = BgTimer.setTimeout(() => finish(isGlassesReady(getConnection())), timeoutMs)\n }\n })\n}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The changed-keys diff for the change-push, MINUS the pairing-identity keys.
|
|
3
|
+
* Identity is native-authoritative (promoted on pairing success, cleared on
|
|
4
|
+
* forget, echoed down via save_setting) and reaches native only through the
|
|
5
|
+
* explicit full seeds. Pushing identity from the change subscription would
|
|
6
|
+
* close a feedback loop: native echo → store setSetting → change-push →
|
|
7
|
+
* native apply → echo…, which self-sustains the moment two different values
|
|
8
|
+
* are in flight (e.g. a boot demotion crossing a native promotion) and flaps
|
|
9
|
+
* the pairing UI.
|
|
10
|
+
*/
|
|
11
|
+
export declare function diffBluetoothSettingsForPush(settings: Record<string, unknown>, previous: Record<string, unknown>): Record<string, unknown>;
|
|
12
|
+
/** A copy of the settings record without the pairing-identity keys. */
|
|
13
|
+
export declare function stripPairingIdentity(settings: Record<string, unknown>): Record<string, unknown>;
|
|
14
|
+
/**
|
|
15
|
+
* Push the FULL current device-settings set — identity included — to native.
|
|
16
|
+
* This is the explicit identity SEED, for the flows where native genuinely
|
|
17
|
+
* needs the phone's persisted identity BEFORE it can act: the device-store
|
|
18
|
+
* hydration at start, the pre-connect seed (connectDefault targets the seeded
|
|
19
|
+
* identity), the post-demotion re-push, and the abandon re-seed.
|
|
20
|
+
*/
|
|
21
|
+
export declare function pushAllBluetoothSettings(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Push the device-settings set MINUS the pairing identity. The on-connect
|
|
24
|
+
* replay uses this: while connected, NATIVE owns the identity (it promotes at
|
|
25
|
+
* device-ready and echoes down), and the JS snapshot can be mid-relay stale —
|
|
26
|
+
* on Mentra Live "connected" lands together with device-ready, and a full
|
|
27
|
+
* replay raced the promotion echoes and overwrote the just-promoted identity
|
|
28
|
+
* with pre-promotion empties (wiping the pairing it had just made).
|
|
29
|
+
*/
|
|
30
|
+
export declare function pushDeviceSettingsOnConnect(): Promise<void>;
|
|
31
|
+
export declare function startGlassesSettingsSync(): void;
|
|
32
|
+
export declare function stopGlassesSettingsSync(): void;
|
|
33
|
+
//# sourceMappingURL=GlassesSettingsSync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GlassesSettingsSync.d.ts","sourceRoot":"","sources":["../../src/services/GlassesSettingsSync.ts"],"names":[],"mappings":"AAmCA;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOzB;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAO/F;AAKD;;;;;;GAMG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC,CAK9D;AAED;;;;;;;GAOG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjE;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CA8B/C;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAK9C"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Glasses settings sync — engine-owned. Keeps the connected glasses in sync with
|
|
3
|
+
* the phone's device settings (`BLUETOOTH_SETTING_KEYS`) over the bluetooth-sdk, so
|
|
4
|
+
* `engine.glasses.settings.set()` (and any other settings-store write) reaches the
|
|
5
|
+
* device for ANY host — not just the first-party Mentra app, where this used to live
|
|
6
|
+
* in MantleManager.
|
|
7
|
+
*
|
|
8
|
+
* Two triggers:
|
|
9
|
+
* 1. on change — push the keys that changed.
|
|
10
|
+
* 2. on (re)connect — push the FULL set, so a freshly-connected device gets the
|
|
11
|
+
* phone's current settings (not just future changes).
|
|
12
|
+
*
|
|
13
|
+
* Started by `engine.start()`. Idempotent.
|
|
14
|
+
*/
|
|
15
|
+
import { shallow } from "zustand/shallow";
|
|
16
|
+
import BluetoothSdk from "@mentra/bluetooth-sdk/internal";
|
|
17
|
+
import { useSettingsStore, PAIRING_IDENTITY_KEYS } from "../stores/settings";
|
|
18
|
+
import { useGlassesStore } from "../stores/glasses";
|
|
19
|
+
import { createDebouncedPatchFlusher } from "../utils/debouncedPatch";
|
|
20
|
+
import { isGlassesConnected } from "./GlassesReadiness";
|
|
21
|
+
/**
|
|
22
|
+
* Change-pushes are debounced (300ms) and merged so a burst of setSetting
|
|
23
|
+
* calls becomes ONE BLE write (wire v2 keeps BLE JSON small and infrequent).
|
|
24
|
+
* The full on-connect/seed pushes stay direct — callers await their ordering.
|
|
25
|
+
*/
|
|
26
|
+
const flushBluetoothSettingsPatch = createDebouncedPatchFlusher((patch) => {
|
|
27
|
+
// Settings can change while the glasses are disconnected — a native
|
|
28
|
+
// rejection must not surface as an unhandled promise rejection.
|
|
29
|
+
void Promise.resolve(BluetoothSdk.updateBluetoothSettings(patch)).catch((error) => {
|
|
30
|
+
console.warn("GlassesSettingsSync: updateBluetoothSettings failed:", error);
|
|
31
|
+
});
|
|
32
|
+
}, 300);
|
|
33
|
+
/**
|
|
34
|
+
* The changed-keys diff for the change-push, MINUS the pairing-identity keys.
|
|
35
|
+
* Identity is native-authoritative (promoted on pairing success, cleared on
|
|
36
|
+
* forget, echoed down via save_setting) and reaches native only through the
|
|
37
|
+
* explicit full seeds. Pushing identity from the change subscription would
|
|
38
|
+
* close a feedback loop: native echo → store setSetting → change-push →
|
|
39
|
+
* native apply → echo…, which self-sustains the moment two different values
|
|
40
|
+
* are in flight (e.g. a boot demotion crossing a native promotion) and flaps
|
|
41
|
+
* the pairing UI.
|
|
42
|
+
*/
|
|
43
|
+
export function diffBluetoothSettingsForPush(settings, previous) {
|
|
44
|
+
const changed = {};
|
|
45
|
+
for (const key in settings) {
|
|
46
|
+
if (PAIRING_IDENTITY_KEYS.includes(key))
|
|
47
|
+
continue;
|
|
48
|
+
if (settings[key] !== previous[key])
|
|
49
|
+
changed[key] = settings[key];
|
|
50
|
+
}
|
|
51
|
+
return changed;
|
|
52
|
+
}
|
|
53
|
+
/** A copy of the settings record without the pairing-identity keys. */
|
|
54
|
+
export function stripPairingIdentity(settings) {
|
|
55
|
+
const stripped = {};
|
|
56
|
+
for (const key in settings) {
|
|
57
|
+
if (PAIRING_IDENTITY_KEYS.includes(key))
|
|
58
|
+
continue;
|
|
59
|
+
stripped[key] = settings[key];
|
|
60
|
+
}
|
|
61
|
+
return stripped;
|
|
62
|
+
}
|
|
63
|
+
let unsubChange = null;
|
|
64
|
+
let unsubConnect = null;
|
|
65
|
+
/**
|
|
66
|
+
* Push the FULL current device-settings set — identity included — to native.
|
|
67
|
+
* This is the explicit identity SEED, for the flows where native genuinely
|
|
68
|
+
* needs the phone's persisted identity BEFORE it can act: the device-store
|
|
69
|
+
* hydration at start, the pre-connect seed (connectDefault targets the seeded
|
|
70
|
+
* identity), the post-demotion re-push, and the abandon re-seed.
|
|
71
|
+
*/
|
|
72
|
+
export async function pushAllBluetoothSettings() {
|
|
73
|
+
// Returns the native write promise so callers can await the seed before the
|
|
74
|
+
// connect handshake replays settings to the glasses (otherwise the handshake
|
|
75
|
+
// can race ahead and replay stale native settings).
|
|
76
|
+
await BluetoothSdk.updateBluetoothSettings(useSettingsStore.getState().getBluetoothSettings());
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Push the device-settings set MINUS the pairing identity. The on-connect
|
|
80
|
+
* replay uses this: while connected, NATIVE owns the identity (it promotes at
|
|
81
|
+
* device-ready and echoes down), and the JS snapshot can be mid-relay stale —
|
|
82
|
+
* on Mentra Live "connected" lands together with device-ready, and a full
|
|
83
|
+
* replay raced the promotion echoes and overwrote the just-promoted identity
|
|
84
|
+
* with pre-promotion empties (wiping the pairing it had just made).
|
|
85
|
+
*/
|
|
86
|
+
export async function pushDeviceSettingsOnConnect() {
|
|
87
|
+
await BluetoothSdk.updateBluetoothSettings(stripPairingIdentity(useSettingsStore.getState().getBluetoothSettings()));
|
|
88
|
+
}
|
|
89
|
+
export function startGlassesSettingsSync() {
|
|
90
|
+
if (unsubChange || unsubConnect)
|
|
91
|
+
return;
|
|
92
|
+
// 1. Push only the keys that changed (matching the prior MantleManager sync).
|
|
93
|
+
// Pairing identity is excluded — see diffBluetoothSettingsForPush.
|
|
94
|
+
unsubChange = useSettingsStore.subscribe((state) => state.getBluetoothSettings(), (settings, previous) => {
|
|
95
|
+
const changed = diffBluetoothSettingsForPush(settings, previous);
|
|
96
|
+
if (Object.keys(changed).length > 0) {
|
|
97
|
+
flushBluetoothSettingsPatch(changed);
|
|
98
|
+
}
|
|
99
|
+
}, { equalityFn: shallow });
|
|
100
|
+
// 2. Push the device settings whenever the glasses transition to connected —
|
|
101
|
+
// identity EXCLUDED: native owns the identity it just promoted, and a full
|
|
102
|
+
// replay here raced the promotion echoes (see pushDeviceSettingsOnConnect).
|
|
103
|
+
let wasConnected = isGlassesConnected(useGlassesStore.getState().connection);
|
|
104
|
+
unsubConnect = useGlassesStore.subscribe(() => {
|
|
105
|
+
const connected = isGlassesConnected(useGlassesStore.getState().connection);
|
|
106
|
+
if (connected && !wasConnected) {
|
|
107
|
+
// Background sync: log-and-continue if the device drops right after connect.
|
|
108
|
+
void pushDeviceSettingsOnConnect().catch((error) => {
|
|
109
|
+
console.warn("GlassesSettingsSync: on-connect settings push failed:", error);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
wasConnected = connected;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
export function stopGlassesSettingsSync() {
|
|
116
|
+
unsubChange?.();
|
|
117
|
+
unsubConnect?.();
|
|
118
|
+
unsubChange = null;
|
|
119
|
+
unsubConnect = null;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=GlassesSettingsSync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GlassesSettingsSync.js","sourceRoot":"","sources":["../../src/services/GlassesSettingsSync.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Glasses settings sync — engine-owned. Keeps the connected glasses in sync with\n * the phone's device settings (`BLUETOOTH_SETTING_KEYS`) over the bluetooth-sdk, so\n * `engine.glasses.settings.set()` (and any other settings-store write) reaches the\n * device for ANY host — not just the first-party Mentra app, where this used to live\n * in MantleManager.\n *\n * Two triggers:\n * 1. on change — push the keys that changed.\n * 2. on (re)connect — push the FULL set, so a freshly-connected device gets the\n * phone's current settings (not just future changes).\n *\n * Started by `engine.start()`. Idempotent.\n */\nimport {shallow} from \"zustand/shallow\"\n\nimport BluetoothSdk from \"@mentra/bluetooth-sdk/internal\"\nimport {useSettingsStore, PAIRING_IDENTITY_KEYS} from \"../stores/settings\"\nimport {useGlassesStore} from \"../stores/glasses\"\nimport {createDebouncedPatchFlusher} from \"../utils/debouncedPatch\"\nimport {isGlassesConnected} from \"./GlassesReadiness\"\n\n/**\n * Change-pushes are debounced (300ms) and merged so a burst of setSetting\n * calls becomes ONE BLE write (wire v2 keeps BLE JSON small and infrequent).\n * The full on-connect/seed pushes stay direct — callers await their ordering.\n */\nconst flushBluetoothSettingsPatch = createDebouncedPatchFlusher<Record<string, unknown>>((patch) => {\n // Settings can change while the glasses are disconnected — a native\n // rejection must not surface as an unhandled promise rejection.\n void Promise.resolve(BluetoothSdk.updateBluetoothSettings(patch)).catch((error) => {\n console.warn(\"GlassesSettingsSync: updateBluetoothSettings failed:\", error)\n })\n}, 300)\n\n/**\n * The changed-keys diff for the change-push, MINUS the pairing-identity keys.\n * Identity is native-authoritative (promoted on pairing success, cleared on\n * forget, echoed down via save_setting) and reaches native only through the\n * explicit full seeds. Pushing identity from the change subscription would\n * close a feedback loop: native echo → store setSetting → change-push →\n * native apply → echo…, which self-sustains the moment two different values\n * are in flight (e.g. a boot demotion crossing a native promotion) and flaps\n * the pairing UI.\n */\nexport function diffBluetoothSettingsForPush(\n settings: Record<string, unknown>,\n previous: Record<string, unknown>,\n): Record<string, unknown> {\n const changed: Record<string, unknown> = {}\n for (const key in settings) {\n if (PAIRING_IDENTITY_KEYS.includes(key)) continue\n if (settings[key] !== previous[key]) changed[key] = settings[key]\n }\n return changed\n}\n\n/** A copy of the settings record without the pairing-identity keys. */\nexport function stripPairingIdentity(settings: Record<string, unknown>): Record<string, unknown> {\n const stripped: Record<string, unknown> = {}\n for (const key in settings) {\n if (PAIRING_IDENTITY_KEYS.includes(key)) continue\n stripped[key] = settings[key]\n }\n return stripped\n}\n\nlet unsubChange: (() => void) | null = null\nlet unsubConnect: (() => void) | null = null\n\n/**\n * Push the FULL current device-settings set — identity included — to native.\n * This is the explicit identity SEED, for the flows where native genuinely\n * needs the phone's persisted identity BEFORE it can act: the device-store\n * hydration at start, the pre-connect seed (connectDefault targets the seeded\n * identity), the post-demotion re-push, and the abandon re-seed.\n */\nexport async function pushAllBluetoothSettings(): Promise<void> {\n // Returns the native write promise so callers can await the seed before the\n // connect handshake replays settings to the glasses (otherwise the handshake\n // can race ahead and replay stale native settings).\n await BluetoothSdk.updateBluetoothSettings(useSettingsStore.getState().getBluetoothSettings())\n}\n\n/**\n * Push the device-settings set MINUS the pairing identity. The on-connect\n * replay uses this: while connected, NATIVE owns the identity (it promotes at\n * device-ready and echoes down), and the JS snapshot can be mid-relay stale —\n * on Mentra Live \"connected\" lands together with device-ready, and a full\n * replay raced the promotion echoes and overwrote the just-promoted identity\n * with pre-promotion empties (wiping the pairing it had just made).\n */\nexport async function pushDeviceSettingsOnConnect(): Promise<void> {\n await BluetoothSdk.updateBluetoothSettings(stripPairingIdentity(useSettingsStore.getState().getBluetoothSettings()))\n}\n\nexport function startGlassesSettingsSync(): void {\n if (unsubChange || unsubConnect) return\n\n // 1. Push only the keys that changed (matching the prior MantleManager sync).\n // Pairing identity is excluded — see diffBluetoothSettingsForPush.\n unsubChange = useSettingsStore.subscribe(\n (state) => state.getBluetoothSettings(),\n (settings: Record<string, unknown>, previous: Record<string, unknown>) => {\n const changed = diffBluetoothSettingsForPush(settings, previous)\n if (Object.keys(changed).length > 0) {\n flushBluetoothSettingsPatch(changed)\n }\n },\n {equalityFn: shallow},\n )\n\n // 2. Push the device settings whenever the glasses transition to connected —\n // identity EXCLUDED: native owns the identity it just promoted, and a full\n // replay here raced the promotion echoes (see pushDeviceSettingsOnConnect).\n let wasConnected = isGlassesConnected(useGlassesStore.getState().connection)\n unsubConnect = useGlassesStore.subscribe(() => {\n const connected = isGlassesConnected(useGlassesStore.getState().connection)\n if (connected && !wasConnected) {\n // Background sync: log-and-continue if the device drops right after connect.\n void pushDeviceSettingsOnConnect().catch((error) => {\n console.warn(\"GlassesSettingsSync: on-connect settings push failed:\", error)\n })\n }\n wasConnected = connected\n })\n}\n\nexport function stopGlassesSettingsSync(): void {\n unsubChange?.()\n unsubConnect?.()\n unsubChange = null\n unsubConnect = null\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GlassesStatusProjection.d.ts","sourceRoot":"","sources":["../../src/services/GlassesStatusProjection.ts"],"names":[],"mappings":"AAqBA,wBAAgB,4BAA4B,IAAI,IAAI,CA6CnD;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Glasses status projection — engine-owned. Subscribes to the native bluetooth-sdk
|
|
3
|
+
* status events and projects them into the engine device stores, so engine's own
|
|
4
|
+
* services (which react to those stores) work for ANY host — not just the first-party
|
|
5
|
+
* Mentra app, where this used to live in MantleManager.
|
|
6
|
+
*
|
|
7
|
+
* This is the INBOUND mirror of GlassesSettingsSync: that pushes the settings store
|
|
8
|
+
* OUT to the device; this pulls device status IN to the stores. It's the feed that
|
|
9
|
+
* the rest of the engine runtime depends on (MicStateCoordinator, the settings-sync
|
|
10
|
+
* on-connect trigger, the facade read-models all read these stores).
|
|
11
|
+
*
|
|
12
|
+
* Started by `engine.start()`. Idempotent.
|
|
13
|
+
*/
|
|
14
|
+
import BluetoothSdk from "@mentra/bluetooth-sdk/internal";
|
|
15
|
+
import { useCoreStore } from "../stores/core";
|
|
16
|
+
import { useGlassesStore } from "../stores/glasses";
|
|
17
|
+
import localMiniappRuntime from "./LocalMiniappRuntime";
|
|
18
|
+
let unsubs = [];
|
|
19
|
+
let projectionRunId = 0;
|
|
20
|
+
export function startGlassesStatusProjection() {
|
|
21
|
+
if (unsubs.length)
|
|
22
|
+
return;
|
|
23
|
+
const runId = ++projectionRunId;
|
|
24
|
+
let bluetoothEventSeen = false;
|
|
25
|
+
let glassesEventSeen = false;
|
|
26
|
+
void BluetoothSdk.getBluetoothStatus()
|
|
27
|
+
.then((status) => {
|
|
28
|
+
if (runId !== projectionRunId || bluetoothEventSeen)
|
|
29
|
+
return;
|
|
30
|
+
useCoreStore.getState().setCoreInfo(status);
|
|
31
|
+
})
|
|
32
|
+
.catch((error) => {
|
|
33
|
+
console.warn("GlassesStatusProjection: getBluetoothStatus failed", error);
|
|
34
|
+
});
|
|
35
|
+
void BluetoothSdk.getGlassesStatus()
|
|
36
|
+
.then((status) => {
|
|
37
|
+
if (runId !== projectionRunId || glassesEventSeen)
|
|
38
|
+
return;
|
|
39
|
+
useGlassesStore.getState().setGlassesInfo(status);
|
|
40
|
+
})
|
|
41
|
+
.catch((error) => {
|
|
42
|
+
console.warn("GlassesStatusProjection: getGlassesStatus failed", error);
|
|
43
|
+
});
|
|
44
|
+
// Bluetooth-adapter status -> core store.
|
|
45
|
+
unsubs.push(BluetoothSdk.onBluetoothStatus((changed) => {
|
|
46
|
+
bluetoothEventSeen = true;
|
|
47
|
+
useCoreStore.getState().setCoreInfo(changed);
|
|
48
|
+
}));
|
|
49
|
+
// Glasses status -> glasses store (+ forward to local miniapps; clear any stale
|
|
50
|
+
// OTA-available flag on disconnect).
|
|
51
|
+
unsubs.push(BluetoothSdk.onGlassesStatus((changed) => {
|
|
52
|
+
glassesEventSeen = true;
|
|
53
|
+
useGlassesStore.getState().setGlassesInfo(changed);
|
|
54
|
+
localMiniappRuntime.forwardEvent("glasses_connection_state", changed);
|
|
55
|
+
if (changed.connection?.state === "disconnected") {
|
|
56
|
+
useGlassesStore.getState().setOtaUpdateAvailable(null);
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
export function stopGlassesStatusProjection() {
|
|
61
|
+
projectionRunId++;
|
|
62
|
+
unsubs.forEach((unsub) => unsub());
|
|
63
|
+
unsubs = [];
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=GlassesStatusProjection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GlassesStatusProjection.js","sourceRoot":"","sources":["../../src/services/GlassesStatusProjection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,YAAY,MAAM,gCAAgC,CAAA;AACzD,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAA;AACjD,OAAO,mBAAmB,MAAM,uBAAuB,CAAA;AAEvD,IAAI,MAAM,GAAsB,EAAE,CAAA;AAClC,IAAI,eAAe,GAAG,CAAC,CAAA;AAEvB,MAAM,UAAU,4BAA4B;IAC1C,IAAI,MAAM,CAAC,MAAM;QAAE,OAAM;IAEzB,MAAM,KAAK,GAAG,EAAE,eAAe,CAAA;IAC/B,IAAI,kBAAkB,GAAG,KAAK,CAAA;IAC9B,IAAI,gBAAgB,GAAG,KAAK,CAAA;IAE5B,KAAK,YAAY,CAAC,kBAAkB,EAAE;SACnC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,IAAI,KAAK,KAAK,eAAe,IAAI,kBAAkB;YAAE,OAAM;QAC3D,YAAY,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IAC7C,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,OAAO,CAAC,IAAI,CAAC,oDAAoD,EAAE,KAAK,CAAC,CAAA;IAC3E,CAAC,CAAC,CAAA;IAEJ,KAAK,YAAY,CAAC,gBAAgB,EAAE;SACjC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,IAAI,KAAK,KAAK,eAAe,IAAI,gBAAgB;YAAE,OAAM;QACzD,eAAe,CAAC,QAAQ,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;IACnD,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,OAAO,CAAC,IAAI,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;IAEJ,0CAA0C;IAC1C,MAAM,CAAC,IAAI,CACT,YAAY,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE,EAAE;QACzC,kBAAkB,GAAG,IAAI,CAAA;QACzB,YAAY,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IAC9C,CAAC,CAAC,CACH,CAAA;IAED,gFAAgF;IAChF,qCAAqC;IACrC,MAAM,CAAC,IAAI,CACT,YAAY,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE,EAAE;QACvC,gBAAgB,GAAG,IAAI,CAAA;QACvB,eAAe,CAAC,QAAQ,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;QAClD,mBAAmB,CAAC,YAAY,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAA;QACrE,IAAI,OAAO,CAAC,UAAU,EAAE,KAAK,KAAK,cAAc,EAAE,CAAC;YACjD,eAAe,CAAC,QAAQ,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;QACxD,CAAC;IACH,CAAC,CAAC,CACH,CAAA;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,eAAe,EAAE,CAAA;IACjB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;IAClC,MAAM,GAAG,EAAE,CAAA;AACb,CAAC","sourcesContent":["/**\n * Glasses status projection — engine-owned. Subscribes to the native bluetooth-sdk\n * status events and projects them into the engine device stores, so engine's own\n * services (which react to those stores) work for ANY host — not just the first-party\n * Mentra app, where this used to live in MantleManager.\n *\n * This is the INBOUND mirror of GlassesSettingsSync: that pushes the settings store\n * OUT to the device; this pulls device status IN to the stores. It's the feed that\n * the rest of the engine runtime depends on (MicStateCoordinator, the settings-sync\n * on-connect trigger, the facade read-models all read these stores).\n *\n * Started by `engine.start()`. Idempotent.\n */\nimport BluetoothSdk from \"@mentra/bluetooth-sdk/internal\"\nimport {useCoreStore} from \"../stores/core\"\nimport {useGlassesStore} from \"../stores/glasses\"\nimport localMiniappRuntime from \"./LocalMiniappRuntime\"\n\nlet unsubs: Array<() => void> = []\nlet projectionRunId = 0\n\nexport function startGlassesStatusProjection(): void {\n if (unsubs.length) return\n\n const runId = ++projectionRunId\n let bluetoothEventSeen = false\n let glassesEventSeen = false\n\n void BluetoothSdk.getBluetoothStatus()\n .then((status) => {\n if (runId !== projectionRunId || bluetoothEventSeen) return\n useCoreStore.getState().setCoreInfo(status)\n })\n .catch((error) => {\n console.warn(\"GlassesStatusProjection: getBluetoothStatus failed\", error)\n })\n\n void BluetoothSdk.getGlassesStatus()\n .then((status) => {\n if (runId !== projectionRunId || glassesEventSeen) return\n useGlassesStore.getState().setGlassesInfo(status)\n })\n .catch((error) => {\n console.warn(\"GlassesStatusProjection: getGlassesStatus failed\", error)\n })\n\n // Bluetooth-adapter status -> core store.\n unsubs.push(\n BluetoothSdk.onBluetoothStatus((changed) => {\n bluetoothEventSeen = true\n useCoreStore.getState().setCoreInfo(changed)\n }),\n )\n\n // Glasses status -> glasses store (+ forward to local miniapps; clear any stale\n // OTA-available flag on disconnect).\n unsubs.push(\n BluetoothSdk.onGlassesStatus((changed) => {\n glassesEventSeen = true\n useGlassesStore.getState().setGlassesInfo(changed)\n localMiniappRuntime.forwardEvent(\"glasses_connection_state\", changed)\n if (changed.connection?.state === \"disconnected\") {\n useGlassesStore.getState().setOtaUpdateAvailable(null)\n }\n }),\n )\n}\n\nexport function stopGlassesStatusProjection(): void {\n projectionRunId++\n unsubs.forEach((unsub) => unsub())\n unsubs = []\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HeadingService
|
|
3
|
+
*
|
|
4
|
+
* Thin singleton over the native compass stream exposed by `crust`.
|
|
5
|
+
* Works on both Android and iOS via CLLocationManager (iOS) / SensorManager (Android).
|
|
6
|
+
*
|
|
7
|
+
* Reference-counted: the underlying SensorManager subscription starts on
|
|
8
|
+
* the first listener and stops when the last one unsubscribes. Late
|
|
9
|
+
* subscribers get the most recently emitted heading replayed
|
|
10
|
+
* synchronously so the UI doesn't have to wait for the next sensor tick.
|
|
11
|
+
*/
|
|
12
|
+
export type HeadingListener = (degrees: number) => void;
|
|
13
|
+
declare class HeadingService {
|
|
14
|
+
private static instance;
|
|
15
|
+
private listeners;
|
|
16
|
+
private nativeSub;
|
|
17
|
+
private lastDegrees;
|
|
18
|
+
private nativeStarted;
|
|
19
|
+
private constructor();
|
|
20
|
+
static getInstance(): HeadingService;
|
|
21
|
+
addListener(listener: HeadingListener): () => void;
|
|
22
|
+
private startNative;
|
|
23
|
+
private stopNative;
|
|
24
|
+
}
|
|
25
|
+
declare const headingService: HeadingService;
|
|
26
|
+
export default headingService;
|
|
27
|
+
//# sourceMappingURL=HeadingService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeadingService.d.ts","sourceRoot":"","sources":["../../src/services/HeadingService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;AAEvD,cAAM,cAAc;IAClB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA8B;IACrD,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,aAAa,CAAQ;IAE7B,OAAO;WAEO,WAAW,IAAI,cAAc;IAOpC,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,IAAI;YAoB3C,WAAW;YA2BX,UAAU;CAazB;AAED,QAAA,MAAM,cAAc,gBAA+B,CAAA;AACnD,eAAe,cAAc,CAAA"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HeadingService
|
|
3
|
+
*
|
|
4
|
+
* Thin singleton over the native compass stream exposed by `crust`.
|
|
5
|
+
* Works on both Android and iOS via CLLocationManager (iOS) / SensorManager (Android).
|
|
6
|
+
*
|
|
7
|
+
* Reference-counted: the underlying SensorManager subscription starts on
|
|
8
|
+
* the first listener and stops when the last one unsubscribes. Late
|
|
9
|
+
* subscribers get the most recently emitted heading replayed
|
|
10
|
+
* synchronously so the UI doesn't have to wait for the next sensor tick.
|
|
11
|
+
*/
|
|
12
|
+
import CrustModule from "@mentra/crust";
|
|
13
|
+
const LOG_TAG = "HEADING_SERVICE";
|
|
14
|
+
class HeadingService {
|
|
15
|
+
static instance = null;
|
|
16
|
+
listeners = new Set();
|
|
17
|
+
nativeSub = null;
|
|
18
|
+
lastDegrees = null;
|
|
19
|
+
nativeStarted = false;
|
|
20
|
+
constructor() { }
|
|
21
|
+
static getInstance() {
|
|
22
|
+
if (!HeadingService.instance) {
|
|
23
|
+
HeadingService.instance = new HeadingService();
|
|
24
|
+
}
|
|
25
|
+
return HeadingService.instance;
|
|
26
|
+
}
|
|
27
|
+
addListener(listener) {
|
|
28
|
+
this.listeners.add(listener);
|
|
29
|
+
if (!this.nativeStarted) {
|
|
30
|
+
this.startNative();
|
|
31
|
+
}
|
|
32
|
+
if (this.lastDegrees != null) {
|
|
33
|
+
try {
|
|
34
|
+
listener(this.lastDegrees);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
console.error(`${LOG_TAG}: listener threw on replay`, err);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return () => {
|
|
41
|
+
this.listeners.delete(listener);
|
|
42
|
+
if (this.listeners.size === 0) {
|
|
43
|
+
this.stopNative();
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async startNative() {
|
|
48
|
+
if (this.nativeStarted)
|
|
49
|
+
return;
|
|
50
|
+
this.nativeStarted = true;
|
|
51
|
+
this.nativeSub = CrustModule.addListener("onHeading", (data) => {
|
|
52
|
+
const deg = Number(data.degrees);
|
|
53
|
+
if (!Number.isFinite(deg))
|
|
54
|
+
return;
|
|
55
|
+
this.lastDegrees = deg;
|
|
56
|
+
this.listeners.forEach((l) => {
|
|
57
|
+
try {
|
|
58
|
+
l(deg);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.error(`${LOG_TAG}: listener threw`, err);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
try {
|
|
66
|
+
const result = await CrustModule.startHeading();
|
|
67
|
+
if (!result.ok) {
|
|
68
|
+
console.warn(`${LOG_TAG}: startHeading failed — ${result.error}`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
console.log(`${LOG_TAG}: started`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
console.error(`${LOG_TAG}: startHeading threw`, err);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async stopNative() {
|
|
79
|
+
if (!this.nativeStarted)
|
|
80
|
+
return;
|
|
81
|
+
this.nativeStarted = false;
|
|
82
|
+
this.nativeSub?.remove();
|
|
83
|
+
this.nativeSub = null;
|
|
84
|
+
this.lastDegrees = null;
|
|
85
|
+
try {
|
|
86
|
+
await CrustModule.stopHeading();
|
|
87
|
+
console.log(`${LOG_TAG}: stopped`);
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
console.error(`${LOG_TAG}: stopHeading threw`, err);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const headingService = HeadingService.getInstance();
|
|
95
|
+
export default headingService;
|
|
96
|
+
//# sourceMappingURL=HeadingService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeadingService.js","sourceRoot":"","sources":["../../src/services/HeadingService.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * HeadingService\n *\n * Thin singleton over the native compass stream exposed by `crust`.\n * Works on both Android and iOS via CLLocationManager (iOS) / SensorManager (Android).\n *\n * Reference-counted: the underlying SensorManager subscription starts on\n * the first listener and stops when the last one unsubscribes. Late\n * subscribers get the most recently emitted heading replayed\n * synchronously so the UI doesn't have to wait for the next sensor tick.\n */\n\nimport CrustModule from \"@mentra/crust\"\n\nconst LOG_TAG = \"HEADING_SERVICE\"\n\nexport type HeadingListener = (degrees: number) => void\n\nclass HeadingService {\n private static instance: HeadingService | null = null\n private listeners = new Set<HeadingListener>()\n private nativeSub: {remove: () => void} | null = null\n private lastDegrees: number | null = null\n private nativeStarted = false\n\n private constructor() {}\n\n public static getInstance(): HeadingService {\n if (!HeadingService.instance) {\n HeadingService.instance = new HeadingService()\n }\n return HeadingService.instance\n }\n\n public addListener(listener: HeadingListener): () => void {\n this.listeners.add(listener)\n if (!this.nativeStarted) {\n this.startNative()\n }\n if (this.lastDegrees != null) {\n try {\n listener(this.lastDegrees)\n } catch (err) {\n console.error(`${LOG_TAG}: listener threw on replay`, err)\n }\n }\n return () => {\n this.listeners.delete(listener)\n if (this.listeners.size === 0) {\n this.stopNative()\n }\n }\n }\n\n private async startNative(): Promise<void> {\n if (this.nativeStarted) return\n this.nativeStarted = true\n this.nativeSub = CrustModule.addListener(\"onHeading\", (data) => {\n const deg = Number(data.degrees)\n if (!Number.isFinite(deg)) return\n this.lastDegrees = deg\n this.listeners.forEach((l) => {\n try {\n l(deg)\n } catch (err) {\n console.error(`${LOG_TAG}: listener threw`, err)\n }\n })\n })\n try {\n const result = await CrustModule.startHeading()\n if (!result.ok) {\n console.warn(`${LOG_TAG}: startHeading failed — ${result.error}`)\n } else {\n console.log(`${LOG_TAG}: started`)\n }\n } catch (err) {\n console.error(`${LOG_TAG}: startHeading threw`, err)\n }\n }\n\n private async stopNative(): Promise<void> {\n if (!this.nativeStarted) return\n this.nativeStarted = false\n this.nativeSub?.remove()\n this.nativeSub = null\n this.lastDegrees = null\n try {\n await CrustModule.stopHeading()\n console.log(`${LOG_TAG}: stopped`)\n } catch (err) {\n console.error(`${LOG_TAG}: stopHeading threw`, err)\n }\n }\n}\n\nconst headingService = HeadingService.getInstance()\nexport default headingService\n"]}
|