@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,518 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media Processing Queue
|
|
3
|
+
*
|
|
4
|
+
* Decouples media processing (HDR merge, color correction, stabilization, camera roll save)
|
|
5
|
+
* from the download pipeline. Downloads push items here; processing runs independently.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as RNFS from "@dr.pogodin/react-native-fs"
|
|
9
|
+
import CrustModule from "@mentra/crust"
|
|
10
|
+
|
|
11
|
+
import {asgCameraApi} from "./asgCameraApi"
|
|
12
|
+
import {localStorageService} from "./localStorageService"
|
|
13
|
+
import {INVALID_DOWNLOADED_MEDIA, validateDownloadedMediaFile} from "./galleryMediaValidation"
|
|
14
|
+
import {reportInvalidGalleryMedia} from "./GalleryMediaIntegrityReportService"
|
|
15
|
+
import {useGallerySyncStore} from "../../stores/gallerySync"
|
|
16
|
+
import {BgTimer} from "../../utils/timers"
|
|
17
|
+
import {galleryTransferLedger, GalleryTransferEntry} from "./galleryTransferLedger"
|
|
18
|
+
import {cameraRollExportCoordinator} from "./cameraRollExportCoordinator"
|
|
19
|
+
|
|
20
|
+
const TAG = "[MediaProcessingQueue]"
|
|
21
|
+
|
|
22
|
+
export interface ProcessingItem {
|
|
23
|
+
/** Unique ID — capture_id (v2) or file name (v1) */
|
|
24
|
+
id: string
|
|
25
|
+
type: "photo" | "video"
|
|
26
|
+
/** Path to the primary downloaded file */
|
|
27
|
+
primaryPath: string
|
|
28
|
+
/** HDR bracket paths (v2 only) */
|
|
29
|
+
bracketPaths?: string[]
|
|
30
|
+
/** IMU sidecar path for video stabilization */
|
|
31
|
+
sidecarPath?: string
|
|
32
|
+
/** Thumbnail base64 data */
|
|
33
|
+
thumbnailData?: string
|
|
34
|
+
/** Capture directory for saving thumbnail */
|
|
35
|
+
captureDir?: string
|
|
36
|
+
/** Original capture timestamp */
|
|
37
|
+
timestamp?: number
|
|
38
|
+
/** Total file size */
|
|
39
|
+
totalSize: number
|
|
40
|
+
/** Video duration in ms */
|
|
41
|
+
duration?: number
|
|
42
|
+
/** Glasses model */
|
|
43
|
+
glassesModel?: string
|
|
44
|
+
/** Whether to process (lens/color/stabilization) */
|
|
45
|
+
shouldProcess: boolean
|
|
46
|
+
/** Whether to auto-save to camera roll */
|
|
47
|
+
shouldAutoSave: boolean
|
|
48
|
+
/** Pre-downloaded thumbnail path (v1 legacy sync) */
|
|
49
|
+
thumbnailPath?: string
|
|
50
|
+
/** File names to delete from glasses after processing completes */
|
|
51
|
+
deleteFromGlasses?: string[]
|
|
52
|
+
/** Negotiated gallery protocol; absent entries are inferred from the transfer ledger. */
|
|
53
|
+
protocolVersion?: number
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
class MediaProcessingQueue {
|
|
57
|
+
private queue: ProcessingItem[] = []
|
|
58
|
+
private isRunning = false
|
|
59
|
+
private aborted = false
|
|
60
|
+
private generation = 0 // C2: incremented on reset() to invalidate stale processLoop()
|
|
61
|
+
|
|
62
|
+
/** Add an item to the processing queue. Starts processing if not already running. */
|
|
63
|
+
enqueue(item: ProcessingItem): void {
|
|
64
|
+
this.queue.push(item)
|
|
65
|
+
console.log(`${TAG} Enqueued ${item.id} (${item.type}), queue size: ${this.queue.length}`)
|
|
66
|
+
|
|
67
|
+
// Only mark as processing if we'll actually process this item
|
|
68
|
+
if (item.shouldProcess) {
|
|
69
|
+
const store = useGallerySyncStore.getState()
|
|
70
|
+
store.onFileProcessing(item.id)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (!this.isRunning) {
|
|
74
|
+
this.processLoop()
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Cancel all pending processing. */
|
|
79
|
+
abort(): void {
|
|
80
|
+
this.aborted = true
|
|
81
|
+
this.queue = []
|
|
82
|
+
console.log(`${TAG} Aborted`)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Reset state for a new sync session. */
|
|
86
|
+
reset(): void {
|
|
87
|
+
this.queue = []
|
|
88
|
+
this.isRunning = false
|
|
89
|
+
this.aborted = false
|
|
90
|
+
this.generation++ // C2: invalidate any running processLoop
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Returns true if there are items queued or currently processing. */
|
|
94
|
+
get hasPending(): boolean {
|
|
95
|
+
return this.queue.length > 0 || this.isRunning
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Returns a promise that resolves when the queue is fully drained, or rejects on timeout. */
|
|
99
|
+
waitUntilDrained(timeoutMs: number = 4 * 60 * 60 * 1000): Promise<void> {
|
|
100
|
+
if (!this.hasPending) return Promise.resolve()
|
|
101
|
+
return new Promise((resolve, reject) => {
|
|
102
|
+
const deadline = Date.now() + timeoutMs
|
|
103
|
+
const check = () => {
|
|
104
|
+
if (!this.hasPending || this.aborted) {
|
|
105
|
+
resolve()
|
|
106
|
+
} else if (Date.now() >= deadline) {
|
|
107
|
+
console.error(`${TAG} waitUntilDrained timed out after ${timeoutMs}ms, aborting queue`)
|
|
108
|
+
this.abort()
|
|
109
|
+
reject(new Error(`Processing queue timed out after ${timeoutMs / 1000}s`))
|
|
110
|
+
} else {
|
|
111
|
+
BgTimer.setTimeout(check, 200)
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
check()
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Retry durable export/ack work after an app restart without downloading media again. */
|
|
119
|
+
async retryPending(): Promise<{retried: number; failed: number}> {
|
|
120
|
+
let retried = 0
|
|
121
|
+
let failed = 0
|
|
122
|
+
for (let entry of galleryTransferLedger.pendingRecovery()) {
|
|
123
|
+
try {
|
|
124
|
+
if (entry.state === "RESTORE_PENDING") {
|
|
125
|
+
await asgCameraApi.restoreCapture(entry.captureId)
|
|
126
|
+
galleryTransferLedger.transition(entry.captureId, "DISCOVERED", {lastError: undefined})
|
|
127
|
+
retried++
|
|
128
|
+
continue
|
|
129
|
+
}
|
|
130
|
+
if (!entry.finalPath || !(await RNFS.exists(entry.finalPath))) {
|
|
131
|
+
throw new Error(`Recovery file is missing for ${entry.captureId}`)
|
|
132
|
+
}
|
|
133
|
+
// Rebuild a missing app index before any source acknowledgement, even when camera-roll
|
|
134
|
+
// saving is disabled or an export receipt was already committed before restart.
|
|
135
|
+
const downloadedFile = await this.recoverDownloadedFile(entry)
|
|
136
|
+
if (entry.state === "EXPORT_PENDING" || entry.state === "INDEXED") {
|
|
137
|
+
const shouldAutoSave = await cameraRollExportCoordinator.isAutoSaveEnabled()
|
|
138
|
+
entry = galleryTransferLedger.update(entry.captureId, {shouldAutoSave, lastError: undefined})
|
|
139
|
+
if (shouldAutoSave) {
|
|
140
|
+
if (entry.state !== "EXPORT_PENDING") {
|
|
141
|
+
entry = galleryTransferLedger.transition(entry.captureId, "EXPORT_PENDING")
|
|
142
|
+
}
|
|
143
|
+
const receipt = await cameraRollExportCoordinator.exportForSource(downloadedFile, entry.captureId)
|
|
144
|
+
entry = receipt
|
|
145
|
+
? galleryTransferLedger.transition(entry.captureId, "EXPORTED", {assetReceipt: receipt})
|
|
146
|
+
: galleryTransferLedger.transition(entry.captureId, "INDEXED", {
|
|
147
|
+
shouldAutoSave: false,
|
|
148
|
+
lastError: undefined,
|
|
149
|
+
})
|
|
150
|
+
} else if (entry.state === "EXPORT_PENDING") {
|
|
151
|
+
entry = galleryTransferLedger.transition(entry.captureId, "INDEXED", {
|
|
152
|
+
shouldAutoSave: false,
|
|
153
|
+
lastError: undefined,
|
|
154
|
+
})
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
entry = galleryTransferLedger.transition(entry.captureId, "ACK_PENDING")
|
|
158
|
+
await this.acknowledgeEntry(entry)
|
|
159
|
+
galleryTransferLedger.transition(entry.captureId, "TRASHED", {lastError: undefined})
|
|
160
|
+
retried++
|
|
161
|
+
} catch (error) {
|
|
162
|
+
galleryTransferLedger.recordFailure(entry.captureId, error)
|
|
163
|
+
failed++
|
|
164
|
+
console.warn(`${TAG} Recovery remains pending for ${entry.captureId}:`, error)
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return {retried, failed}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
private async acknowledgeEntry(entry: GalleryTransferEntry): Promise<void> {
|
|
171
|
+
if (entry.protocolVersion >= 3) {
|
|
172
|
+
await asgCameraApi.acknowledgeCapture(entry.captureId, entry.ackId)
|
|
173
|
+
return
|
|
174
|
+
}
|
|
175
|
+
const result = await asgCameraApi.deleteFilesFromServer(
|
|
176
|
+
entry.deleteFromGlasses.length > 0 ? entry.deleteFromGlasses : [entry.captureId],
|
|
177
|
+
)
|
|
178
|
+
if (result.failed.length > 0 || result.deleted.length === 0) {
|
|
179
|
+
throw new Error(`Glasses did not acknowledge ${entry.captureId}`)
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/** Process items one at a time. */
|
|
184
|
+
private async processLoop(): Promise<void> {
|
|
185
|
+
if (this.isRunning) return
|
|
186
|
+
this.isRunning = true
|
|
187
|
+
const myGeneration = this.generation // C2: capture generation to detect reset()
|
|
188
|
+
|
|
189
|
+
while (this.queue.length > 0 && !this.aborted && this.generation === myGeneration) {
|
|
190
|
+
const item = this.queue.shift()!
|
|
191
|
+
let processFailed = false
|
|
192
|
+
try {
|
|
193
|
+
await this.processItem(item)
|
|
194
|
+
} catch (error) {
|
|
195
|
+
console.error(`${TAG} Error processing ${item.id}:`, error)
|
|
196
|
+
processFailed = true
|
|
197
|
+
const store = useGallerySyncStore.getState()
|
|
198
|
+
if (!store.failedFiles.includes(item.id)) {
|
|
199
|
+
store.onFileFailed(item.id, error instanceof Error ? error.message : String(error))
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Exit if generation changed (reset was called during processing)
|
|
204
|
+
if (this.generation !== myGeneration) break
|
|
205
|
+
|
|
206
|
+
const store = useGallerySyncStore.getState()
|
|
207
|
+
if (!processFailed) {
|
|
208
|
+
// Success: increment processedFiles and remove from processingFiles set.
|
|
209
|
+
store.onFileProcessed(item.id)
|
|
210
|
+
} else {
|
|
211
|
+
// Failure is counted exactly once above. Still clear the processingFiles entry so the UI
|
|
212
|
+
// does not show it as in-progress.
|
|
213
|
+
const current = store.processingFiles
|
|
214
|
+
if (current.has(item.id)) {
|
|
215
|
+
const newSet = new Set(current)
|
|
216
|
+
newSet.delete(item.id)
|
|
217
|
+
useGallerySyncStore.setState({processingFiles: newSet})
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Only clear isRunning if this loop owns the current generation
|
|
223
|
+
if (this.generation === myGeneration) {
|
|
224
|
+
this.isRunning = false
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/** Process a single item through the full pipeline. */
|
|
229
|
+
private async processItem(item: ProcessingItem): Promise<void> {
|
|
230
|
+
const startTime = Date.now()
|
|
231
|
+
let filePathToSave = item.primaryPath
|
|
232
|
+
let ledgerEntry = galleryTransferLedger.get(item.id)
|
|
233
|
+
if (!ledgerEntry) {
|
|
234
|
+
ledgerEntry = galleryTransferLedger.ensureCapture(
|
|
235
|
+
{
|
|
236
|
+
capture_id: item.id,
|
|
237
|
+
type: item.type,
|
|
238
|
+
timestamp: item.timestamp || Date.now(),
|
|
239
|
+
total_size: item.totalSize,
|
|
240
|
+
files: (item.deleteFromGlasses?.length ? item.deleteFromGlasses : [item.id]).map((name, index) => ({
|
|
241
|
+
name,
|
|
242
|
+
size: index === 0 ? item.totalSize : 0,
|
|
243
|
+
role: index === 0 ? "primary" : "sidecar",
|
|
244
|
+
})),
|
|
245
|
+
},
|
|
246
|
+
item.protocolVersion || 2,
|
|
247
|
+
)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// 1. HDR merge (photos with brackets only)
|
|
251
|
+
if (item.shouldProcess && item.type === "photo" && item.bracketPaths && item.bracketPaths.length >= 3) {
|
|
252
|
+
try {
|
|
253
|
+
const underPath = item.bracketPaths.find((p) => p.includes("ev-2")) || item.bracketPaths[0]
|
|
254
|
+
const normalPath = item.bracketPaths.find((p) => p.includes("ev0")) || item.bracketPaths[1]
|
|
255
|
+
const overPath = item.bracketPaths.find((p) => p.includes("ev2") && !p.includes("ev-2")) || item.bracketPaths[2]
|
|
256
|
+
|
|
257
|
+
const hdrPath = item.primaryPath + ".hdr.jpg"
|
|
258
|
+
const hdrResult = await CrustModule.mergeHdrBrackets(underPath, normalPath, overPath, hdrPath)
|
|
259
|
+
if (hdrResult.success && hdrResult.outputPath) {
|
|
260
|
+
filePathToSave = hdrResult.outputPath
|
|
261
|
+
console.log(`${TAG} HDR merged ${item.id} in ${hdrResult.processingTimeMs}ms`)
|
|
262
|
+
}
|
|
263
|
+
} catch (hdrError) {
|
|
264
|
+
console.warn(`${TAG} HDR merge error for ${item.id}, continuing:`, hdrError)
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// 2. Image processing (lens + color correction)
|
|
269
|
+
if (item.shouldProcess && item.type === "photo") {
|
|
270
|
+
try {
|
|
271
|
+
const processedPath = filePathToSave + ".processed.jpg"
|
|
272
|
+
const result = await CrustModule.processGalleryImage(filePathToSave, processedPath, {
|
|
273
|
+
lensCorrection: true,
|
|
274
|
+
colorCorrection: true,
|
|
275
|
+
})
|
|
276
|
+
if (result.success && result.outputPath) {
|
|
277
|
+
filePathToSave = result.outputPath
|
|
278
|
+
console.log(`${TAG} 🎨 Processed ${item.id} in ${result.processingTimeMs}ms`)
|
|
279
|
+
}
|
|
280
|
+
} catch (procError) {
|
|
281
|
+
console.warn(`${TAG} Processing error for ${item.id}, using original:`, procError)
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// 3. Video stabilization + color correction
|
|
286
|
+
if (item.shouldProcess && item.type === "video" && item.sidecarPath) {
|
|
287
|
+
try {
|
|
288
|
+
const stabilizedPath = item.primaryPath + ".stabilized.mp4"
|
|
289
|
+
const result = await CrustModule.stabilizeVideo(item.primaryPath, item.sidecarPath, stabilizedPath)
|
|
290
|
+
if (result.success && result.outputPath) {
|
|
291
|
+
filePathToSave = result.outputPath
|
|
292
|
+
console.log(`${TAG} 📹 Stabilized ${item.id} in ${result.processingTimeMs}ms`)
|
|
293
|
+
}
|
|
294
|
+
} catch (stabError) {
|
|
295
|
+
console.warn(`${TAG} Stabilization error for ${item.id}, using original:`, stabError)
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// 4. Save thumbnail to disk (or use pre-downloaded thumbnail from v1 sync)
|
|
300
|
+
let localThumbnailPath: string | undefined = item.thumbnailPath
|
|
301
|
+
if (item.thumbnailData && item.captureDir) {
|
|
302
|
+
try {
|
|
303
|
+
const thumbPath = `${item.captureDir}/.thumb.jpg`
|
|
304
|
+
const base64Data = item.thumbnailData.startsWith("data:")
|
|
305
|
+
? item.thumbnailData.split(",")[1]
|
|
306
|
+
: item.thumbnailData
|
|
307
|
+
await RNFS.writeFile(thumbPath, base64Data, "base64")
|
|
308
|
+
localThumbnailPath = thumbPath
|
|
309
|
+
} catch (thumbError) {
|
|
310
|
+
console.warn(`${TAG} Failed to save thumbnail for ${item.id}:`, thumbError)
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// 5. Validate local file before persisting metadata or deleting from glasses
|
|
315
|
+
try {
|
|
316
|
+
await validateDownloadedMediaFile({
|
|
317
|
+
path: filePathToSave,
|
|
318
|
+
name: item.id,
|
|
319
|
+
mediaKind: item.type,
|
|
320
|
+
})
|
|
321
|
+
} catch (validationError: any) {
|
|
322
|
+
const reason = validationError?.message?.includes(INVALID_DOWNLOADED_MEDIA)
|
|
323
|
+
? validationError.message
|
|
324
|
+
: `${INVALID_DOWNLOADED_MEDIA}: ${item.id}`
|
|
325
|
+
console.error(`${TAG} Validation failed for ${item.id}: ${reason}`)
|
|
326
|
+
reportInvalidGalleryMedia({
|
|
327
|
+
name: item.id,
|
|
328
|
+
path: filePathToSave,
|
|
329
|
+
mediaKind: item.type,
|
|
330
|
+
stage: "processing_validation",
|
|
331
|
+
reason,
|
|
332
|
+
expectedSize: item.totalSize,
|
|
333
|
+
duration: item.duration,
|
|
334
|
+
glassesModel: item.glassesModel,
|
|
335
|
+
})
|
|
336
|
+
const store = useGallerySyncStore.getState()
|
|
337
|
+
store.onFileFailed(item.id, reason)
|
|
338
|
+
galleryTransferLedger.recordFailure(item.id, validationError)
|
|
339
|
+
throw new Error(reason)
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// 6. Commit the app-local index before any export or source acknowledgement. Use the final
|
|
343
|
+
// on-disk output metadata for camera-roll identity: processing can change byte size, while
|
|
344
|
+
// recovery reconstructs this row from the same file and the transfer ledger timestamp.
|
|
345
|
+
const isVideo = item.type === "video"
|
|
346
|
+
const finalFileStat = await RNFS.stat(filePathToSave)
|
|
347
|
+
const finalFileSize = Number(finalFileStat.size)
|
|
348
|
+
const downloadedFile = localStorageService.convertToDownloadedFile(
|
|
349
|
+
{
|
|
350
|
+
name: item.id,
|
|
351
|
+
url: "",
|
|
352
|
+
download: "",
|
|
353
|
+
size: finalFileSize,
|
|
354
|
+
modified: ledgerEntry.timestamp,
|
|
355
|
+
is_video: isVideo,
|
|
356
|
+
thumbnail_data: item.thumbnailData,
|
|
357
|
+
duration: item.duration,
|
|
358
|
+
filePath: filePathToSave,
|
|
359
|
+
glassesModel: item.glassesModel,
|
|
360
|
+
},
|
|
361
|
+
filePathToSave,
|
|
362
|
+
localThumbnailPath,
|
|
363
|
+
item.glassesModel,
|
|
364
|
+
)
|
|
365
|
+
downloadedFile.capture_id = item.id
|
|
366
|
+
const shouldAutoSave = await cameraRollExportCoordinator.isAutoSaveEnabled()
|
|
367
|
+
try {
|
|
368
|
+
await localStorageService.saveDownloadedFile(downloadedFile)
|
|
369
|
+
ledgerEntry = galleryTransferLedger.transition(item.id, "INDEXED", {
|
|
370
|
+
finalPath: filePathToSave,
|
|
371
|
+
thumbnailPath: localThumbnailPath,
|
|
372
|
+
shouldAutoSave,
|
|
373
|
+
})
|
|
374
|
+
await cameraRollExportCoordinator.recordIndexed(
|
|
375
|
+
downloadedFile,
|
|
376
|
+
shouldAutoSave,
|
|
377
|
+
shouldAutoSave ? "SOURCE_BARRIER" : "HISTORICAL_BACKFILL",
|
|
378
|
+
item.id,
|
|
379
|
+
)
|
|
380
|
+
} catch (metadataError) {
|
|
381
|
+
console.error(`${TAG} Metadata save failed for ${item.id}; retaining local and glasses copies:`, metadataError)
|
|
382
|
+
galleryTransferLedger.recordFailure(item.id, metadataError)
|
|
383
|
+
throw metadataError
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// 7. While enabled, export is a durable, receipted step whose failures block ack. Turning
|
|
387
|
+
// auto-save off safely falls back to the already-verified app-local copy and later backfill.
|
|
388
|
+
if (shouldAutoSave) {
|
|
389
|
+
galleryTransferLedger.transition(item.id, "EXPORT_PENDING")
|
|
390
|
+
let receipt
|
|
391
|
+
try {
|
|
392
|
+
receipt = await cameraRollExportCoordinator.exportForSource(downloadedFile, item.id)
|
|
393
|
+
} catch (error) {
|
|
394
|
+
galleryTransferLedger.recordFailure(item.id, error)
|
|
395
|
+
throw error
|
|
396
|
+
}
|
|
397
|
+
if (receipt) {
|
|
398
|
+
ledgerEntry = galleryTransferLedger.transition(item.id, "EXPORTED", {
|
|
399
|
+
assetReceipt: receipt,
|
|
400
|
+
})
|
|
401
|
+
console.log(`${TAG} ✅ Saved to camera roll with receipt: ${item.id}`)
|
|
402
|
+
} else {
|
|
403
|
+
ledgerEntry = galleryTransferLedger.transition(item.id, "INDEXED", {
|
|
404
|
+
shouldAutoSave: false,
|
|
405
|
+
lastError: undefined,
|
|
406
|
+
})
|
|
407
|
+
console.log(`${TAG} Automatic camera-roll saving was disabled; keeping app-local copy: ${item.id}`)
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// S4: Clean up intermediate processing files
|
|
412
|
+
const intermediates = [
|
|
413
|
+
item.primaryPath + ".hdr.jpg",
|
|
414
|
+
item.primaryPath + ".processed.jpg",
|
|
415
|
+
item.primaryPath + ".stabilized.mp4",
|
|
416
|
+
]
|
|
417
|
+
for (const intermediate of intermediates) {
|
|
418
|
+
if (intermediate !== filePathToSave) {
|
|
419
|
+
RNFS.unlink(intermediate).catch(() => {}) // fire-and-forget
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// 8. Update file in sync queue with local paths for gallery display
|
|
424
|
+
const store = useGallerySyncStore.getState()
|
|
425
|
+
const localFileUrl = filePathToSave.startsWith("file://") ? filePathToSave : `file://${filePathToSave}`
|
|
426
|
+
const localThumbUrl = localThumbnailPath
|
|
427
|
+
? localThumbnailPath.startsWith("file://")
|
|
428
|
+
? localThumbnailPath
|
|
429
|
+
: `file://${localThumbnailPath}`
|
|
430
|
+
: undefined
|
|
431
|
+
store.updateFileInQueue(item.id, {
|
|
432
|
+
name: item.id,
|
|
433
|
+
url: localFileUrl,
|
|
434
|
+
download: localFileUrl,
|
|
435
|
+
size: finalFileSize,
|
|
436
|
+
modified: ledgerEntry.timestamp,
|
|
437
|
+
is_video: isVideo,
|
|
438
|
+
filePath: filePathToSave,
|
|
439
|
+
mime_type: isVideo ? "video/mp4" : "image/jpeg",
|
|
440
|
+
thumbnail_data: item.thumbnailData,
|
|
441
|
+
thumbnailPath: localThumbUrl,
|
|
442
|
+
duration: item.duration,
|
|
443
|
+
})
|
|
444
|
+
|
|
445
|
+
// 9. Acknowledge only after VERIFIED -> INDEXED -> (EXPORTED). The server turns this into
|
|
446
|
+
// recoverable trash; failures remain ACK_PENDING and are retried without re-downloading.
|
|
447
|
+
const localFileExists = await RNFS.exists(filePathToSave)
|
|
448
|
+
const localStat = localFileExists ? await RNFS.stat(filePathToSave) : null
|
|
449
|
+
if (!localStat || localStat.size <= 0) {
|
|
450
|
+
const error = new Error(`Cannot acknowledge ${item.id}: committed local file is missing or empty`)
|
|
451
|
+
galleryTransferLedger.recordFailure(item.id, error)
|
|
452
|
+
throw error
|
|
453
|
+
}
|
|
454
|
+
ledgerEntry = galleryTransferLedger.transition(item.id, "ACK_PENDING")
|
|
455
|
+
try {
|
|
456
|
+
await this.acknowledgeEntry(ledgerEntry)
|
|
457
|
+
galleryTransferLedger.transition(item.id, "TRASHED", {lastError: undefined})
|
|
458
|
+
} catch (ackError) {
|
|
459
|
+
galleryTransferLedger.recordFailure(item.id, ackError)
|
|
460
|
+
throw ackError
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
const elapsed = Date.now() - startTime
|
|
464
|
+
console.log(`${TAG} ✅ Finished ${item.id} in ${elapsed}ms`)
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/** Rebuild a missing app-local index row from the durable transfer ledger. */
|
|
468
|
+
private async recoverDownloadedFile(entry: GalleryTransferEntry) {
|
|
469
|
+
if (!entry.finalPath) throw new Error(`Recovery file is missing for ${entry.captureId}`)
|
|
470
|
+
|
|
471
|
+
// The transfer ledger is the durable source of truth for a committed generation. A local
|
|
472
|
+
// index row can survive an interrupted replacement and still point at an older/missing path,
|
|
473
|
+
// or contain the pre-processing size. Only reuse it when its path and identity still match the
|
|
474
|
+
// ledger's committed file; otherwise rebuild the row before export or source acknowledgement.
|
|
475
|
+
const finalPath = entry.finalPath.replace(/^file:\/\//, "")
|
|
476
|
+
const indexed = await localStorageService.getDownloadedFile(entry.captureId)
|
|
477
|
+
if (indexed) {
|
|
478
|
+
try {
|
|
479
|
+
const indexedPath = indexed.filePath?.replace(/^file:\/\//, "")
|
|
480
|
+
if (indexedPath === finalPath && (await RNFS.exists(indexedPath))) {
|
|
481
|
+
const indexedStat = await RNFS.stat(indexedPath)
|
|
482
|
+
const indexedSize = Number(indexedStat.size)
|
|
483
|
+
if (indexedSize > 0 && indexed.size === indexedSize && indexed.modified === entry.timestamp) {
|
|
484
|
+
return indexed
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
} catch (error) {
|
|
488
|
+
console.warn(`${TAG} Ignoring stale local index for ${entry.captureId}:`, error)
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
const stat = await RNFS.stat(finalPath)
|
|
493
|
+
const finalSize = Number(stat.size)
|
|
494
|
+
if (!Number.isFinite(finalSize) || finalSize <= 0) {
|
|
495
|
+
throw new Error(`Recovery file is missing or empty for ${entry.captureId}`)
|
|
496
|
+
}
|
|
497
|
+
const recovered = localStorageService.convertToDownloadedFile(
|
|
498
|
+
{
|
|
499
|
+
name: entry.captureId,
|
|
500
|
+
url: "",
|
|
501
|
+
download: "",
|
|
502
|
+
size: finalSize,
|
|
503
|
+
modified: entry.timestamp,
|
|
504
|
+
mime_type: entry.captureType === "video" ? "video/mp4" : "image/jpeg",
|
|
505
|
+
is_video: entry.captureType === "video",
|
|
506
|
+
filePath: finalPath,
|
|
507
|
+
},
|
|
508
|
+
finalPath,
|
|
509
|
+
entry.thumbnailPath,
|
|
510
|
+
)
|
|
511
|
+
recovered.capture_id = entry.captureId
|
|
512
|
+
recovered.assetReceipt = entry.assetReceipt
|
|
513
|
+
await localStorageService.saveDownloadedFile(recovered)
|
|
514
|
+
return recovered
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
export const mediaProcessingQueue = new MediaProcessingQueue()
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import {SETTINGS, useSettingsStore} from "../stores/settings"
|
|
2
|
+
|
|
3
|
+
const OTA_VERSION_URL_PROD = "https://ota.mentraglass.com/prod_live_version.json"
|
|
4
|
+
|
|
5
|
+
function isLegacyAsgOtaStartBuild(glassesBuildNumber?: string | null): boolean {
|
|
6
|
+
const buildNumber = Number.parseInt(glassesBuildNumber ?? "", 10)
|
|
7
|
+
// ASG builds before 39 ignore ota_start.ota_version_url, so compare against
|
|
8
|
+
// the URL they will actually use.
|
|
9
|
+
return Number.isFinite(buildNumber) && buildNumber < 39
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function getOtaVersionUrlDevOverride(): string | null {
|
|
13
|
+
// Super mode only: a wrong OTA manifest can brick glasses, so a saved
|
|
14
|
+
// override is inert unless super mode is currently enabled.
|
|
15
|
+
if (!useSettingsStore.getState().getSetting(SETTINGS.super_mode.key)) {
|
|
16
|
+
return null
|
|
17
|
+
}
|
|
18
|
+
const value = useSettingsStore.getState().getSetting(SETTINGS.ota_version_url.key)
|
|
19
|
+
const trimmed = typeof value === "string" ? value.trim() : ""
|
|
20
|
+
return trimmed || null
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function getAsgOtaVersionUrl(glassesUrl?: string | null, glassesBuildNumber?: string | null): string {
|
|
24
|
+
const deviceUrl = glassesUrl?.trim()
|
|
25
|
+
if (isLegacyAsgOtaStartBuild(glassesBuildNumber)) {
|
|
26
|
+
// Legacy glasses ignore ota_start.ota_version_url and install from their
|
|
27
|
+
// compiled default, so the developer override does not apply to them either.
|
|
28
|
+
return deviceUrl || OTA_VERSION_URL_PROD
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const devOverrideUrl = getOtaVersionUrlDevOverride()
|
|
32
|
+
if (devOverrideUrl) {
|
|
33
|
+
return devOverrideUrl
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const envUrl = process.env.EXPO_PUBLIC_ASG_OTA_VERSION_URL?.trim()
|
|
37
|
+
if (envUrl) {
|
|
38
|
+
return envUrl
|
|
39
|
+
}
|
|
40
|
+
return deviceUrl || OTA_VERSION_URL_PROD
|
|
41
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure path helper for BlobStore. No React Native / Expo imports, so it's
|
|
3
|
+
* unit-testable in isolation (see blobPaths.test.ts).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/** Filesystem-safe path segment. Strips traversal + unsafe chars; never empty. */
|
|
7
|
+
export function sanitizeSegment(s: string): string {
|
|
8
|
+
const cleaned = (s || "").replace(/[^A-Za-z0-9._-]/g, "_")
|
|
9
|
+
if (cleaned === "" || cleaned === "." || cleaned === "..") return "_"
|
|
10
|
+
return cleaned.slice(0, 120)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Filesystem-safe display name for a shared blob, guaranteed to carry an
|
|
15
|
+
* extension. The on-disk blob name is a generated machine id (with a
|
|
16
|
+
* mime-derived extension since withDiskExt; legacy blobs may lack it), so the
|
|
17
|
+
* OS share sheet (which keys off the file path, not any metadata) would
|
|
18
|
+
* otherwise emit a machine-named file — breaking "open with"/preview on the
|
|
19
|
+
* receiving side. Derives the extension from the mimeType when the stored name
|
|
20
|
+
* lacks one.
|
|
21
|
+
*/
|
|
22
|
+
export function shareFileName(meta: {name?: string; fileName: string; mimeType: string}): string {
|
|
23
|
+
const raw = (meta.name || meta.fileName).trim()
|
|
24
|
+
// Replace path separators + characters illegal on common filesystems (keep
|
|
25
|
+
// spaces, hyphens, dots, etc. — they're valid and keep names readable).
|
|
26
|
+
// eslint-disable-next-line no-control-regex
|
|
27
|
+
let safe = raw.replace(/[/\\<>:"|?*\x00-\x1f]/g, "_").trim()
|
|
28
|
+
if (!safe) safe = meta.fileName
|
|
29
|
+
// Split base + extension: use an extension already on the name, else derive
|
|
30
|
+
// one from the mimeType.
|
|
31
|
+
const dot = safe.lastIndexOf(".")
|
|
32
|
+
const hasExt = dot > 0 && dot < safe.length - 1
|
|
33
|
+
let base = hasExt ? safe.slice(0, dot) : safe
|
|
34
|
+
const ext = hasExt ? safe.slice(dot + 1) : extForMime(meta.mimeType)
|
|
35
|
+
const suffix = ext ? `.${ext}` : ""
|
|
36
|
+
// Bound the total length: common filesystems reject names over ~255 bytes, so
|
|
37
|
+
// a huge app-provided name would make the share's file copy throw. Truncate
|
|
38
|
+
// the base while preserving the extension (mirrors sanitizeSegment's ceiling).
|
|
39
|
+
const MAX_LEN = 120
|
|
40
|
+
if (base.length + suffix.length > MAX_LEN) {
|
|
41
|
+
base = base.slice(0, Math.max(1, MAX_LEN - suffix.length))
|
|
42
|
+
}
|
|
43
|
+
return base + suffix
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* On-disk name for a stored blob: the generated id plus a mime-derived
|
|
48
|
+
* extension when one is known. iOS AVPlayer resolves a local file's format
|
|
49
|
+
* from its path extension (not content sniffing), so an extension-less WAV is
|
|
50
|
+
* unplayable through `session.speaker.play` even though the bytes are valid.
|
|
51
|
+
* Leaves a name that already has an extension untouched.
|
|
52
|
+
*/
|
|
53
|
+
export function withDiskExt(fileName: string, mimeType: string): string {
|
|
54
|
+
if (fileName.includes(".")) return fileName
|
|
55
|
+
const ext = extForMime(mimeType)
|
|
56
|
+
return ext ? `${fileName}.${ext}` : fileName
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Best-effort file extension (no dot) for a MIME type. Inverse of inferMime in BlobStore. */
|
|
60
|
+
export function extForMime(mime: string): string | undefined {
|
|
61
|
+
const m = (mime || "").split(";")[0].trim().toLowerCase()
|
|
62
|
+
const map: Record<string, string> = {
|
|
63
|
+
"application/pdf": "pdf",
|
|
64
|
+
"application/epub+zip": "epub",
|
|
65
|
+
"application/zip": "zip",
|
|
66
|
+
"application/json": "json",
|
|
67
|
+
"text/plain": "txt",
|
|
68
|
+
"text/csv": "csv",
|
|
69
|
+
"text/html": "html",
|
|
70
|
+
"video/mp4": "mp4",
|
|
71
|
+
"video/quicktime": "mov",
|
|
72
|
+
"video/webm": "webm",
|
|
73
|
+
"audio/mpeg": "mp3",
|
|
74
|
+
"audio/mp4": "m4a",
|
|
75
|
+
"audio/wav": "wav",
|
|
76
|
+
"audio/x-wav": "wav",
|
|
77
|
+
"audio/wave": "wav",
|
|
78
|
+
"audio/ogg": "ogg",
|
|
79
|
+
"image/png": "png",
|
|
80
|
+
"image/jpeg": "jpg",
|
|
81
|
+
"image/gif": "gif",
|
|
82
|
+
"image/webp": "webp",
|
|
83
|
+
"image/svg+xml": "svg",
|
|
84
|
+
}
|
|
85
|
+
return map[m]
|
|
86
|
+
}
|