@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,70 @@
|
|
|
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
|
+
export interface ProcessingItem {
|
|
8
|
+
/** Unique ID — capture_id (v2) or file name (v1) */
|
|
9
|
+
id: string;
|
|
10
|
+
type: "photo" | "video";
|
|
11
|
+
/** Path to the primary downloaded file */
|
|
12
|
+
primaryPath: string;
|
|
13
|
+
/** HDR bracket paths (v2 only) */
|
|
14
|
+
bracketPaths?: string[];
|
|
15
|
+
/** IMU sidecar path for video stabilization */
|
|
16
|
+
sidecarPath?: string;
|
|
17
|
+
/** Thumbnail base64 data */
|
|
18
|
+
thumbnailData?: string;
|
|
19
|
+
/** Capture directory for saving thumbnail */
|
|
20
|
+
captureDir?: string;
|
|
21
|
+
/** Original capture timestamp */
|
|
22
|
+
timestamp?: number;
|
|
23
|
+
/** Total file size */
|
|
24
|
+
totalSize: number;
|
|
25
|
+
/** Video duration in ms */
|
|
26
|
+
duration?: number;
|
|
27
|
+
/** Glasses model */
|
|
28
|
+
glassesModel?: string;
|
|
29
|
+
/** Whether to process (lens/color/stabilization) */
|
|
30
|
+
shouldProcess: boolean;
|
|
31
|
+
/** Whether to auto-save to camera roll */
|
|
32
|
+
shouldAutoSave: boolean;
|
|
33
|
+
/** Pre-downloaded thumbnail path (v1 legacy sync) */
|
|
34
|
+
thumbnailPath?: string;
|
|
35
|
+
/** File names to delete from glasses after processing completes */
|
|
36
|
+
deleteFromGlasses?: string[];
|
|
37
|
+
/** Negotiated gallery protocol; absent entries are inferred from the transfer ledger. */
|
|
38
|
+
protocolVersion?: number;
|
|
39
|
+
}
|
|
40
|
+
declare class MediaProcessingQueue {
|
|
41
|
+
private queue;
|
|
42
|
+
private isRunning;
|
|
43
|
+
private aborted;
|
|
44
|
+
private generation;
|
|
45
|
+
/** Add an item to the processing queue. Starts processing if not already running. */
|
|
46
|
+
enqueue(item: ProcessingItem): void;
|
|
47
|
+
/** Cancel all pending processing. */
|
|
48
|
+
abort(): void;
|
|
49
|
+
/** Reset state for a new sync session. */
|
|
50
|
+
reset(): void;
|
|
51
|
+
/** Returns true if there are items queued or currently processing. */
|
|
52
|
+
get hasPending(): boolean;
|
|
53
|
+
/** Returns a promise that resolves when the queue is fully drained, or rejects on timeout. */
|
|
54
|
+
waitUntilDrained(timeoutMs?: number): Promise<void>;
|
|
55
|
+
/** Retry durable export/ack work after an app restart without downloading media again. */
|
|
56
|
+
retryPending(): Promise<{
|
|
57
|
+
retried: number;
|
|
58
|
+
failed: number;
|
|
59
|
+
}>;
|
|
60
|
+
private acknowledgeEntry;
|
|
61
|
+
/** Process items one at a time. */
|
|
62
|
+
private processLoop;
|
|
63
|
+
/** Process a single item through the full pipeline. */
|
|
64
|
+
private processItem;
|
|
65
|
+
/** Rebuild a missing app-local index row from the durable transfer ledger. */
|
|
66
|
+
private recoverDownloadedFile;
|
|
67
|
+
}
|
|
68
|
+
export declare const mediaProcessingQueue: MediaProcessingQueue;
|
|
69
|
+
export {};
|
|
70
|
+
//# sourceMappingURL=mediaProcessingQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaProcessingQueue.d.ts","sourceRoot":"","sources":["../../../src/services/asg/mediaProcessingQueue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,OAAO,GAAG,OAAO,CAAA;IACvB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAA;IACnB,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oDAAoD;IACpD,aAAa,EAAE,OAAO,CAAA;IACtB,0CAA0C;IAC1C,cAAc,EAAE,OAAO,CAAA;IACvB,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,mEAAmE;IACnE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,cAAM,oBAAoB;IACxB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,UAAU,CAAI;IAEtB,qFAAqF;IACrF,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAenC,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAMb,0CAA0C;IAC1C,KAAK,IAAI,IAAI;IAOb,sEAAsE;IACtE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,8FAA8F;IAC9F,gBAAgB,CAAC,SAAS,GAAE,MAA2B,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBvE,0FAA0F;IACpF,YAAY,IAAI,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAC;YAmDlD,gBAAgB;IAa9B,mCAAmC;YACrB,WAAW;IA4CzB,uDAAuD;YACzC,WAAW;IA8OzB,8EAA8E;YAChE,qBAAqB;CAgDpC;AAED,eAAO,MAAM,oBAAoB,sBAA6B,CAAA"}
|
|
@@ -0,0 +1,451 @@
|
|
|
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
|
+
import * as RNFS from "@dr.pogodin/react-native-fs";
|
|
8
|
+
import CrustModule from "@mentra/crust";
|
|
9
|
+
import { asgCameraApi } from "./asgCameraApi";
|
|
10
|
+
import { localStorageService } from "./localStorageService";
|
|
11
|
+
import { INVALID_DOWNLOADED_MEDIA, validateDownloadedMediaFile } from "./galleryMediaValidation";
|
|
12
|
+
import { reportInvalidGalleryMedia } from "./GalleryMediaIntegrityReportService";
|
|
13
|
+
import { useGallerySyncStore } from "../../stores/gallerySync";
|
|
14
|
+
import { BgTimer } from "../../utils/timers";
|
|
15
|
+
import { galleryTransferLedger } from "./galleryTransferLedger";
|
|
16
|
+
import { cameraRollExportCoordinator } from "./cameraRollExportCoordinator";
|
|
17
|
+
const TAG = "[MediaProcessingQueue]";
|
|
18
|
+
class MediaProcessingQueue {
|
|
19
|
+
queue = [];
|
|
20
|
+
isRunning = false;
|
|
21
|
+
aborted = false;
|
|
22
|
+
generation = 0; // C2: incremented on reset() to invalidate stale processLoop()
|
|
23
|
+
/** Add an item to the processing queue. Starts processing if not already running. */
|
|
24
|
+
enqueue(item) {
|
|
25
|
+
this.queue.push(item);
|
|
26
|
+
console.log(`${TAG} Enqueued ${item.id} (${item.type}), queue size: ${this.queue.length}`);
|
|
27
|
+
// Only mark as processing if we'll actually process this item
|
|
28
|
+
if (item.shouldProcess) {
|
|
29
|
+
const store = useGallerySyncStore.getState();
|
|
30
|
+
store.onFileProcessing(item.id);
|
|
31
|
+
}
|
|
32
|
+
if (!this.isRunning) {
|
|
33
|
+
this.processLoop();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Cancel all pending processing. */
|
|
37
|
+
abort() {
|
|
38
|
+
this.aborted = true;
|
|
39
|
+
this.queue = [];
|
|
40
|
+
console.log(`${TAG} Aborted`);
|
|
41
|
+
}
|
|
42
|
+
/** Reset state for a new sync session. */
|
|
43
|
+
reset() {
|
|
44
|
+
this.queue = [];
|
|
45
|
+
this.isRunning = false;
|
|
46
|
+
this.aborted = false;
|
|
47
|
+
this.generation++; // C2: invalidate any running processLoop
|
|
48
|
+
}
|
|
49
|
+
/** Returns true if there are items queued or currently processing. */
|
|
50
|
+
get hasPending() {
|
|
51
|
+
return this.queue.length > 0 || this.isRunning;
|
|
52
|
+
}
|
|
53
|
+
/** Returns a promise that resolves when the queue is fully drained, or rejects on timeout. */
|
|
54
|
+
waitUntilDrained(timeoutMs = 4 * 60 * 60 * 1000) {
|
|
55
|
+
if (!this.hasPending)
|
|
56
|
+
return Promise.resolve();
|
|
57
|
+
return new Promise((resolve, reject) => {
|
|
58
|
+
const deadline = Date.now() + timeoutMs;
|
|
59
|
+
const check = () => {
|
|
60
|
+
if (!this.hasPending || this.aborted) {
|
|
61
|
+
resolve();
|
|
62
|
+
}
|
|
63
|
+
else if (Date.now() >= deadline) {
|
|
64
|
+
console.error(`${TAG} waitUntilDrained timed out after ${timeoutMs}ms, aborting queue`);
|
|
65
|
+
this.abort();
|
|
66
|
+
reject(new Error(`Processing queue timed out after ${timeoutMs / 1000}s`));
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
BgTimer.setTimeout(check, 200);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
check();
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** Retry durable export/ack work after an app restart without downloading media again. */
|
|
76
|
+
async retryPending() {
|
|
77
|
+
let retried = 0;
|
|
78
|
+
let failed = 0;
|
|
79
|
+
for (let entry of galleryTransferLedger.pendingRecovery()) {
|
|
80
|
+
try {
|
|
81
|
+
if (entry.state === "RESTORE_PENDING") {
|
|
82
|
+
await asgCameraApi.restoreCapture(entry.captureId);
|
|
83
|
+
galleryTransferLedger.transition(entry.captureId, "DISCOVERED", { lastError: undefined });
|
|
84
|
+
retried++;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (!entry.finalPath || !(await RNFS.exists(entry.finalPath))) {
|
|
88
|
+
throw new Error(`Recovery file is missing for ${entry.captureId}`);
|
|
89
|
+
}
|
|
90
|
+
// Rebuild a missing app index before any source acknowledgement, even when camera-roll
|
|
91
|
+
// saving is disabled or an export receipt was already committed before restart.
|
|
92
|
+
const downloadedFile = await this.recoverDownloadedFile(entry);
|
|
93
|
+
if (entry.state === "EXPORT_PENDING" || entry.state === "INDEXED") {
|
|
94
|
+
const shouldAutoSave = await cameraRollExportCoordinator.isAutoSaveEnabled();
|
|
95
|
+
entry = galleryTransferLedger.update(entry.captureId, { shouldAutoSave, lastError: undefined });
|
|
96
|
+
if (shouldAutoSave) {
|
|
97
|
+
if (entry.state !== "EXPORT_PENDING") {
|
|
98
|
+
entry = galleryTransferLedger.transition(entry.captureId, "EXPORT_PENDING");
|
|
99
|
+
}
|
|
100
|
+
const receipt = await cameraRollExportCoordinator.exportForSource(downloadedFile, entry.captureId);
|
|
101
|
+
entry = receipt
|
|
102
|
+
? galleryTransferLedger.transition(entry.captureId, "EXPORTED", { assetReceipt: receipt })
|
|
103
|
+
: galleryTransferLedger.transition(entry.captureId, "INDEXED", {
|
|
104
|
+
shouldAutoSave: false,
|
|
105
|
+
lastError: undefined,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
else if (entry.state === "EXPORT_PENDING") {
|
|
109
|
+
entry = galleryTransferLedger.transition(entry.captureId, "INDEXED", {
|
|
110
|
+
shouldAutoSave: false,
|
|
111
|
+
lastError: undefined,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
entry = galleryTransferLedger.transition(entry.captureId, "ACK_PENDING");
|
|
116
|
+
await this.acknowledgeEntry(entry);
|
|
117
|
+
galleryTransferLedger.transition(entry.captureId, "TRASHED", { lastError: undefined });
|
|
118
|
+
retried++;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
galleryTransferLedger.recordFailure(entry.captureId, error);
|
|
122
|
+
failed++;
|
|
123
|
+
console.warn(`${TAG} Recovery remains pending for ${entry.captureId}:`, error);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return { retried, failed };
|
|
127
|
+
}
|
|
128
|
+
async acknowledgeEntry(entry) {
|
|
129
|
+
if (entry.protocolVersion >= 3) {
|
|
130
|
+
await asgCameraApi.acknowledgeCapture(entry.captureId, entry.ackId);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const result = await asgCameraApi.deleteFilesFromServer(entry.deleteFromGlasses.length > 0 ? entry.deleteFromGlasses : [entry.captureId]);
|
|
134
|
+
if (result.failed.length > 0 || result.deleted.length === 0) {
|
|
135
|
+
throw new Error(`Glasses did not acknowledge ${entry.captureId}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** Process items one at a time. */
|
|
139
|
+
async processLoop() {
|
|
140
|
+
if (this.isRunning)
|
|
141
|
+
return;
|
|
142
|
+
this.isRunning = true;
|
|
143
|
+
const myGeneration = this.generation; // C2: capture generation to detect reset()
|
|
144
|
+
while (this.queue.length > 0 && !this.aborted && this.generation === myGeneration) {
|
|
145
|
+
const item = this.queue.shift();
|
|
146
|
+
let processFailed = false;
|
|
147
|
+
try {
|
|
148
|
+
await this.processItem(item);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.error(`${TAG} Error processing ${item.id}:`, error);
|
|
152
|
+
processFailed = true;
|
|
153
|
+
const store = useGallerySyncStore.getState();
|
|
154
|
+
if (!store.failedFiles.includes(item.id)) {
|
|
155
|
+
store.onFileFailed(item.id, error instanceof Error ? error.message : String(error));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Exit if generation changed (reset was called during processing)
|
|
159
|
+
if (this.generation !== myGeneration)
|
|
160
|
+
break;
|
|
161
|
+
const store = useGallerySyncStore.getState();
|
|
162
|
+
if (!processFailed) {
|
|
163
|
+
// Success: increment processedFiles and remove from processingFiles set.
|
|
164
|
+
store.onFileProcessed(item.id);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// Failure is counted exactly once above. Still clear the processingFiles entry so the UI
|
|
168
|
+
// does not show it as in-progress.
|
|
169
|
+
const current = store.processingFiles;
|
|
170
|
+
if (current.has(item.id)) {
|
|
171
|
+
const newSet = new Set(current);
|
|
172
|
+
newSet.delete(item.id);
|
|
173
|
+
useGallerySyncStore.setState({ processingFiles: newSet });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Only clear isRunning if this loop owns the current generation
|
|
178
|
+
if (this.generation === myGeneration) {
|
|
179
|
+
this.isRunning = false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/** Process a single item through the full pipeline. */
|
|
183
|
+
async processItem(item) {
|
|
184
|
+
const startTime = Date.now();
|
|
185
|
+
let filePathToSave = item.primaryPath;
|
|
186
|
+
let ledgerEntry = galleryTransferLedger.get(item.id);
|
|
187
|
+
if (!ledgerEntry) {
|
|
188
|
+
ledgerEntry = galleryTransferLedger.ensureCapture({
|
|
189
|
+
capture_id: item.id,
|
|
190
|
+
type: item.type,
|
|
191
|
+
timestamp: item.timestamp || Date.now(),
|
|
192
|
+
total_size: item.totalSize,
|
|
193
|
+
files: (item.deleteFromGlasses?.length ? item.deleteFromGlasses : [item.id]).map((name, index) => ({
|
|
194
|
+
name,
|
|
195
|
+
size: index === 0 ? item.totalSize : 0,
|
|
196
|
+
role: index === 0 ? "primary" : "sidecar",
|
|
197
|
+
})),
|
|
198
|
+
}, item.protocolVersion || 2);
|
|
199
|
+
}
|
|
200
|
+
// 1. HDR merge (photos with brackets only)
|
|
201
|
+
if (item.shouldProcess && item.type === "photo" && item.bracketPaths && item.bracketPaths.length >= 3) {
|
|
202
|
+
try {
|
|
203
|
+
const underPath = item.bracketPaths.find((p) => p.includes("ev-2")) || item.bracketPaths[0];
|
|
204
|
+
const normalPath = item.bracketPaths.find((p) => p.includes("ev0")) || item.bracketPaths[1];
|
|
205
|
+
const overPath = item.bracketPaths.find((p) => p.includes("ev2") && !p.includes("ev-2")) || item.bracketPaths[2];
|
|
206
|
+
const hdrPath = item.primaryPath + ".hdr.jpg";
|
|
207
|
+
const hdrResult = await CrustModule.mergeHdrBrackets(underPath, normalPath, overPath, hdrPath);
|
|
208
|
+
if (hdrResult.success && hdrResult.outputPath) {
|
|
209
|
+
filePathToSave = hdrResult.outputPath;
|
|
210
|
+
console.log(`${TAG} HDR merged ${item.id} in ${hdrResult.processingTimeMs}ms`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch (hdrError) {
|
|
214
|
+
console.warn(`${TAG} HDR merge error for ${item.id}, continuing:`, hdrError);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// 2. Image processing (lens + color correction)
|
|
218
|
+
if (item.shouldProcess && item.type === "photo") {
|
|
219
|
+
try {
|
|
220
|
+
const processedPath = filePathToSave + ".processed.jpg";
|
|
221
|
+
const result = await CrustModule.processGalleryImage(filePathToSave, processedPath, {
|
|
222
|
+
lensCorrection: true,
|
|
223
|
+
colorCorrection: true,
|
|
224
|
+
});
|
|
225
|
+
if (result.success && result.outputPath) {
|
|
226
|
+
filePathToSave = result.outputPath;
|
|
227
|
+
console.log(`${TAG} 🎨 Processed ${item.id} in ${result.processingTimeMs}ms`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch (procError) {
|
|
231
|
+
console.warn(`${TAG} Processing error for ${item.id}, using original:`, procError);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// 3. Video stabilization + color correction
|
|
235
|
+
if (item.shouldProcess && item.type === "video" && item.sidecarPath) {
|
|
236
|
+
try {
|
|
237
|
+
const stabilizedPath = item.primaryPath + ".stabilized.mp4";
|
|
238
|
+
const result = await CrustModule.stabilizeVideo(item.primaryPath, item.sidecarPath, stabilizedPath);
|
|
239
|
+
if (result.success && result.outputPath) {
|
|
240
|
+
filePathToSave = result.outputPath;
|
|
241
|
+
console.log(`${TAG} 📹 Stabilized ${item.id} in ${result.processingTimeMs}ms`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch (stabError) {
|
|
245
|
+
console.warn(`${TAG} Stabilization error for ${item.id}, using original:`, stabError);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// 4. Save thumbnail to disk (or use pre-downloaded thumbnail from v1 sync)
|
|
249
|
+
let localThumbnailPath = item.thumbnailPath;
|
|
250
|
+
if (item.thumbnailData && item.captureDir) {
|
|
251
|
+
try {
|
|
252
|
+
const thumbPath = `${item.captureDir}/.thumb.jpg`;
|
|
253
|
+
const base64Data = item.thumbnailData.startsWith("data:")
|
|
254
|
+
? item.thumbnailData.split(",")[1]
|
|
255
|
+
: item.thumbnailData;
|
|
256
|
+
await RNFS.writeFile(thumbPath, base64Data, "base64");
|
|
257
|
+
localThumbnailPath = thumbPath;
|
|
258
|
+
}
|
|
259
|
+
catch (thumbError) {
|
|
260
|
+
console.warn(`${TAG} Failed to save thumbnail for ${item.id}:`, thumbError);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// 5. Validate local file before persisting metadata or deleting from glasses
|
|
264
|
+
try {
|
|
265
|
+
await validateDownloadedMediaFile({
|
|
266
|
+
path: filePathToSave,
|
|
267
|
+
name: item.id,
|
|
268
|
+
mediaKind: item.type,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
catch (validationError) {
|
|
272
|
+
const reason = validationError?.message?.includes(INVALID_DOWNLOADED_MEDIA)
|
|
273
|
+
? validationError.message
|
|
274
|
+
: `${INVALID_DOWNLOADED_MEDIA}: ${item.id}`;
|
|
275
|
+
console.error(`${TAG} Validation failed for ${item.id}: ${reason}`);
|
|
276
|
+
reportInvalidGalleryMedia({
|
|
277
|
+
name: item.id,
|
|
278
|
+
path: filePathToSave,
|
|
279
|
+
mediaKind: item.type,
|
|
280
|
+
stage: "processing_validation",
|
|
281
|
+
reason,
|
|
282
|
+
expectedSize: item.totalSize,
|
|
283
|
+
duration: item.duration,
|
|
284
|
+
glassesModel: item.glassesModel,
|
|
285
|
+
});
|
|
286
|
+
const store = useGallerySyncStore.getState();
|
|
287
|
+
store.onFileFailed(item.id, reason);
|
|
288
|
+
galleryTransferLedger.recordFailure(item.id, validationError);
|
|
289
|
+
throw new Error(reason);
|
|
290
|
+
}
|
|
291
|
+
// 6. Commit the app-local index before any export or source acknowledgement. Use the final
|
|
292
|
+
// on-disk output metadata for camera-roll identity: processing can change byte size, while
|
|
293
|
+
// recovery reconstructs this row from the same file and the transfer ledger timestamp.
|
|
294
|
+
const isVideo = item.type === "video";
|
|
295
|
+
const finalFileStat = await RNFS.stat(filePathToSave);
|
|
296
|
+
const finalFileSize = Number(finalFileStat.size);
|
|
297
|
+
const downloadedFile = localStorageService.convertToDownloadedFile({
|
|
298
|
+
name: item.id,
|
|
299
|
+
url: "",
|
|
300
|
+
download: "",
|
|
301
|
+
size: finalFileSize,
|
|
302
|
+
modified: ledgerEntry.timestamp,
|
|
303
|
+
is_video: isVideo,
|
|
304
|
+
thumbnail_data: item.thumbnailData,
|
|
305
|
+
duration: item.duration,
|
|
306
|
+
filePath: filePathToSave,
|
|
307
|
+
glassesModel: item.glassesModel,
|
|
308
|
+
}, filePathToSave, localThumbnailPath, item.glassesModel);
|
|
309
|
+
downloadedFile.capture_id = item.id;
|
|
310
|
+
const shouldAutoSave = await cameraRollExportCoordinator.isAutoSaveEnabled();
|
|
311
|
+
try {
|
|
312
|
+
await localStorageService.saveDownloadedFile(downloadedFile);
|
|
313
|
+
ledgerEntry = galleryTransferLedger.transition(item.id, "INDEXED", {
|
|
314
|
+
finalPath: filePathToSave,
|
|
315
|
+
thumbnailPath: localThumbnailPath,
|
|
316
|
+
shouldAutoSave,
|
|
317
|
+
});
|
|
318
|
+
await cameraRollExportCoordinator.recordIndexed(downloadedFile, shouldAutoSave, shouldAutoSave ? "SOURCE_BARRIER" : "HISTORICAL_BACKFILL", item.id);
|
|
319
|
+
}
|
|
320
|
+
catch (metadataError) {
|
|
321
|
+
console.error(`${TAG} Metadata save failed for ${item.id}; retaining local and glasses copies:`, metadataError);
|
|
322
|
+
galleryTransferLedger.recordFailure(item.id, metadataError);
|
|
323
|
+
throw metadataError;
|
|
324
|
+
}
|
|
325
|
+
// 7. While enabled, export is a durable, receipted step whose failures block ack. Turning
|
|
326
|
+
// auto-save off safely falls back to the already-verified app-local copy and later backfill.
|
|
327
|
+
if (shouldAutoSave) {
|
|
328
|
+
galleryTransferLedger.transition(item.id, "EXPORT_PENDING");
|
|
329
|
+
let receipt;
|
|
330
|
+
try {
|
|
331
|
+
receipt = await cameraRollExportCoordinator.exportForSource(downloadedFile, item.id);
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
galleryTransferLedger.recordFailure(item.id, error);
|
|
335
|
+
throw error;
|
|
336
|
+
}
|
|
337
|
+
if (receipt) {
|
|
338
|
+
ledgerEntry = galleryTransferLedger.transition(item.id, "EXPORTED", {
|
|
339
|
+
assetReceipt: receipt,
|
|
340
|
+
});
|
|
341
|
+
console.log(`${TAG} ✅ Saved to camera roll with receipt: ${item.id}`);
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
ledgerEntry = galleryTransferLedger.transition(item.id, "INDEXED", {
|
|
345
|
+
shouldAutoSave: false,
|
|
346
|
+
lastError: undefined,
|
|
347
|
+
});
|
|
348
|
+
console.log(`${TAG} Automatic camera-roll saving was disabled; keeping app-local copy: ${item.id}`);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// S4: Clean up intermediate processing files
|
|
352
|
+
const intermediates = [
|
|
353
|
+
item.primaryPath + ".hdr.jpg",
|
|
354
|
+
item.primaryPath + ".processed.jpg",
|
|
355
|
+
item.primaryPath + ".stabilized.mp4",
|
|
356
|
+
];
|
|
357
|
+
for (const intermediate of intermediates) {
|
|
358
|
+
if (intermediate !== filePathToSave) {
|
|
359
|
+
RNFS.unlink(intermediate).catch(() => { }); // fire-and-forget
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// 8. Update file in sync queue with local paths for gallery display
|
|
363
|
+
const store = useGallerySyncStore.getState();
|
|
364
|
+
const localFileUrl = filePathToSave.startsWith("file://") ? filePathToSave : `file://${filePathToSave}`;
|
|
365
|
+
const localThumbUrl = localThumbnailPath
|
|
366
|
+
? localThumbnailPath.startsWith("file://")
|
|
367
|
+
? localThumbnailPath
|
|
368
|
+
: `file://${localThumbnailPath}`
|
|
369
|
+
: undefined;
|
|
370
|
+
store.updateFileInQueue(item.id, {
|
|
371
|
+
name: item.id,
|
|
372
|
+
url: localFileUrl,
|
|
373
|
+
download: localFileUrl,
|
|
374
|
+
size: finalFileSize,
|
|
375
|
+
modified: ledgerEntry.timestamp,
|
|
376
|
+
is_video: isVideo,
|
|
377
|
+
filePath: filePathToSave,
|
|
378
|
+
mime_type: isVideo ? "video/mp4" : "image/jpeg",
|
|
379
|
+
thumbnail_data: item.thumbnailData,
|
|
380
|
+
thumbnailPath: localThumbUrl,
|
|
381
|
+
duration: item.duration,
|
|
382
|
+
});
|
|
383
|
+
// 9. Acknowledge only after VERIFIED -> INDEXED -> (EXPORTED). The server turns this into
|
|
384
|
+
// recoverable trash; failures remain ACK_PENDING and are retried without re-downloading.
|
|
385
|
+
const localFileExists = await RNFS.exists(filePathToSave);
|
|
386
|
+
const localStat = localFileExists ? await RNFS.stat(filePathToSave) : null;
|
|
387
|
+
if (!localStat || localStat.size <= 0) {
|
|
388
|
+
const error = new Error(`Cannot acknowledge ${item.id}: committed local file is missing or empty`);
|
|
389
|
+
galleryTransferLedger.recordFailure(item.id, error);
|
|
390
|
+
throw error;
|
|
391
|
+
}
|
|
392
|
+
ledgerEntry = galleryTransferLedger.transition(item.id, "ACK_PENDING");
|
|
393
|
+
try {
|
|
394
|
+
await this.acknowledgeEntry(ledgerEntry);
|
|
395
|
+
galleryTransferLedger.transition(item.id, "TRASHED", { lastError: undefined });
|
|
396
|
+
}
|
|
397
|
+
catch (ackError) {
|
|
398
|
+
galleryTransferLedger.recordFailure(item.id, ackError);
|
|
399
|
+
throw ackError;
|
|
400
|
+
}
|
|
401
|
+
const elapsed = Date.now() - startTime;
|
|
402
|
+
console.log(`${TAG} ✅ Finished ${item.id} in ${elapsed}ms`);
|
|
403
|
+
}
|
|
404
|
+
/** Rebuild a missing app-local index row from the durable transfer ledger. */
|
|
405
|
+
async recoverDownloadedFile(entry) {
|
|
406
|
+
if (!entry.finalPath)
|
|
407
|
+
throw new Error(`Recovery file is missing for ${entry.captureId}`);
|
|
408
|
+
// The transfer ledger is the durable source of truth for a committed generation. A local
|
|
409
|
+
// index row can survive an interrupted replacement and still point at an older/missing path,
|
|
410
|
+
// or contain the pre-processing size. Only reuse it when its path and identity still match the
|
|
411
|
+
// ledger's committed file; otherwise rebuild the row before export or source acknowledgement.
|
|
412
|
+
const finalPath = entry.finalPath.replace(/^file:\/\//, "");
|
|
413
|
+
const indexed = await localStorageService.getDownloadedFile(entry.captureId);
|
|
414
|
+
if (indexed) {
|
|
415
|
+
try {
|
|
416
|
+
const indexedPath = indexed.filePath?.replace(/^file:\/\//, "");
|
|
417
|
+
if (indexedPath === finalPath && (await RNFS.exists(indexedPath))) {
|
|
418
|
+
const indexedStat = await RNFS.stat(indexedPath);
|
|
419
|
+
const indexedSize = Number(indexedStat.size);
|
|
420
|
+
if (indexedSize > 0 && indexed.size === indexedSize && indexed.modified === entry.timestamp) {
|
|
421
|
+
return indexed;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
catch (error) {
|
|
426
|
+
console.warn(`${TAG} Ignoring stale local index for ${entry.captureId}:`, error);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
const stat = await RNFS.stat(finalPath);
|
|
430
|
+
const finalSize = Number(stat.size);
|
|
431
|
+
if (!Number.isFinite(finalSize) || finalSize <= 0) {
|
|
432
|
+
throw new Error(`Recovery file is missing or empty for ${entry.captureId}`);
|
|
433
|
+
}
|
|
434
|
+
const recovered = localStorageService.convertToDownloadedFile({
|
|
435
|
+
name: entry.captureId,
|
|
436
|
+
url: "",
|
|
437
|
+
download: "",
|
|
438
|
+
size: finalSize,
|
|
439
|
+
modified: entry.timestamp,
|
|
440
|
+
mime_type: entry.captureType === "video" ? "video/mp4" : "image/jpeg",
|
|
441
|
+
is_video: entry.captureType === "video",
|
|
442
|
+
filePath: finalPath,
|
|
443
|
+
}, finalPath, entry.thumbnailPath);
|
|
444
|
+
recovered.capture_id = entry.captureId;
|
|
445
|
+
recovered.assetReceipt = entry.assetReceipt;
|
|
446
|
+
await localStorageService.saveDownloadedFile(recovered);
|
|
447
|
+
return recovered;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
export const mediaProcessingQueue = new MediaProcessingQueue();
|
|
451
|
+
//# sourceMappingURL=mediaProcessingQueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaProcessingQueue.js","sourceRoot":"","sources":["../../../src/services/asg/mediaProcessingQueue.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Media Processing Queue\n *\n * Decouples media processing (HDR merge, color correction, stabilization, camera roll save)\n * from the download pipeline. Downloads push items here; processing runs independently.\n */\n\nimport * as RNFS from \"@dr.pogodin/react-native-fs\"\nimport CrustModule from \"@mentra/crust\"\n\nimport {asgCameraApi} from \"./asgCameraApi\"\nimport {localStorageService} from \"./localStorageService\"\nimport {INVALID_DOWNLOADED_MEDIA, validateDownloadedMediaFile} from \"./galleryMediaValidation\"\nimport {reportInvalidGalleryMedia} from \"./GalleryMediaIntegrityReportService\"\nimport {useGallerySyncStore} from \"../../stores/gallerySync\"\nimport {BgTimer} from \"../../utils/timers\"\nimport {galleryTransferLedger, GalleryTransferEntry} from \"./galleryTransferLedger\"\nimport {cameraRollExportCoordinator} from \"./cameraRollExportCoordinator\"\n\nconst TAG = \"[MediaProcessingQueue]\"\n\nexport interface ProcessingItem {\n /** Unique ID — capture_id (v2) or file name (v1) */\n id: string\n type: \"photo\" | \"video\"\n /** Path to the primary downloaded file */\n primaryPath: string\n /** HDR bracket paths (v2 only) */\n bracketPaths?: string[]\n /** IMU sidecar path for video stabilization */\n sidecarPath?: string\n /** Thumbnail base64 data */\n thumbnailData?: string\n /** Capture directory for saving thumbnail */\n captureDir?: string\n /** Original capture timestamp */\n timestamp?: number\n /** Total file size */\n totalSize: number\n /** Video duration in ms */\n duration?: number\n /** Glasses model */\n glassesModel?: string\n /** Whether to process (lens/color/stabilization) */\n shouldProcess: boolean\n /** Whether to auto-save to camera roll */\n shouldAutoSave: boolean\n /** Pre-downloaded thumbnail path (v1 legacy sync) */\n thumbnailPath?: string\n /** File names to delete from glasses after processing completes */\n deleteFromGlasses?: string[]\n /** Negotiated gallery protocol; absent entries are inferred from the transfer ledger. */\n protocolVersion?: number\n}\n\nclass MediaProcessingQueue {\n private queue: ProcessingItem[] = []\n private isRunning = false\n private aborted = false\n private generation = 0 // C2: incremented on reset() to invalidate stale processLoop()\n\n /** Add an item to the processing queue. Starts processing if not already running. */\n enqueue(item: ProcessingItem): void {\n this.queue.push(item)\n console.log(`${TAG} Enqueued ${item.id} (${item.type}), queue size: ${this.queue.length}`)\n\n // Only mark as processing if we'll actually process this item\n if (item.shouldProcess) {\n const store = useGallerySyncStore.getState()\n store.onFileProcessing(item.id)\n }\n\n if (!this.isRunning) {\n this.processLoop()\n }\n }\n\n /** Cancel all pending processing. */\n abort(): void {\n this.aborted = true\n this.queue = []\n console.log(`${TAG} Aborted`)\n }\n\n /** Reset state for a new sync session. */\n reset(): void {\n this.queue = []\n this.isRunning = false\n this.aborted = false\n this.generation++ // C2: invalidate any running processLoop\n }\n\n /** Returns true if there are items queued or currently processing. */\n get hasPending(): boolean {\n return this.queue.length > 0 || this.isRunning\n }\n\n /** Returns a promise that resolves when the queue is fully drained, or rejects on timeout. */\n waitUntilDrained(timeoutMs: number = 4 * 60 * 60 * 1000): Promise<void> {\n if (!this.hasPending) return Promise.resolve()\n return new Promise((resolve, reject) => {\n const deadline = Date.now() + timeoutMs\n const check = () => {\n if (!this.hasPending || this.aborted) {\n resolve()\n } else if (Date.now() >= deadline) {\n console.error(`${TAG} waitUntilDrained timed out after ${timeoutMs}ms, aborting queue`)\n this.abort()\n reject(new Error(`Processing queue timed out after ${timeoutMs / 1000}s`))\n } else {\n BgTimer.setTimeout(check, 200)\n }\n }\n check()\n })\n }\n\n /** Retry durable export/ack work after an app restart without downloading media again. */\n async retryPending(): Promise<{retried: number; failed: number}> {\n let retried = 0\n let failed = 0\n for (let entry of galleryTransferLedger.pendingRecovery()) {\n try {\n if (entry.state === \"RESTORE_PENDING\") {\n await asgCameraApi.restoreCapture(entry.captureId)\n galleryTransferLedger.transition(entry.captureId, \"DISCOVERED\", {lastError: undefined})\n retried++\n continue\n }\n if (!entry.finalPath || !(await RNFS.exists(entry.finalPath))) {\n throw new Error(`Recovery file is missing for ${entry.captureId}`)\n }\n // Rebuild a missing app index before any source acknowledgement, even when camera-roll\n // saving is disabled or an export receipt was already committed before restart.\n const downloadedFile = await this.recoverDownloadedFile(entry)\n if (entry.state === \"EXPORT_PENDING\" || entry.state === \"INDEXED\") {\n const shouldAutoSave = await cameraRollExportCoordinator.isAutoSaveEnabled()\n entry = galleryTransferLedger.update(entry.captureId, {shouldAutoSave, lastError: undefined})\n if (shouldAutoSave) {\n if (entry.state !== \"EXPORT_PENDING\") {\n entry = galleryTransferLedger.transition(entry.captureId, \"EXPORT_PENDING\")\n }\n const receipt = await cameraRollExportCoordinator.exportForSource(downloadedFile, entry.captureId)\n entry = receipt\n ? galleryTransferLedger.transition(entry.captureId, \"EXPORTED\", {assetReceipt: receipt})\n : galleryTransferLedger.transition(entry.captureId, \"INDEXED\", {\n shouldAutoSave: false,\n lastError: undefined,\n })\n } else if (entry.state === \"EXPORT_PENDING\") {\n entry = galleryTransferLedger.transition(entry.captureId, \"INDEXED\", {\n shouldAutoSave: false,\n lastError: undefined,\n })\n }\n }\n entry = galleryTransferLedger.transition(entry.captureId, \"ACK_PENDING\")\n await this.acknowledgeEntry(entry)\n galleryTransferLedger.transition(entry.captureId, \"TRASHED\", {lastError: undefined})\n retried++\n } catch (error) {\n galleryTransferLedger.recordFailure(entry.captureId, error)\n failed++\n console.warn(`${TAG} Recovery remains pending for ${entry.captureId}:`, error)\n }\n }\n return {retried, failed}\n }\n\n private async acknowledgeEntry(entry: GalleryTransferEntry): Promise<void> {\n if (entry.protocolVersion >= 3) {\n await asgCameraApi.acknowledgeCapture(entry.captureId, entry.ackId)\n return\n }\n const result = await asgCameraApi.deleteFilesFromServer(\n entry.deleteFromGlasses.length > 0 ? entry.deleteFromGlasses : [entry.captureId],\n )\n if (result.failed.length > 0 || result.deleted.length === 0) {\n throw new Error(`Glasses did not acknowledge ${entry.captureId}`)\n }\n }\n\n /** Process items one at a time. */\n private async processLoop(): Promise<void> {\n if (this.isRunning) return\n this.isRunning = true\n const myGeneration = this.generation // C2: capture generation to detect reset()\n\n while (this.queue.length > 0 && !this.aborted && this.generation === myGeneration) {\n const item = this.queue.shift()!\n let processFailed = false\n try {\n await this.processItem(item)\n } catch (error) {\n console.error(`${TAG} Error processing ${item.id}:`, error)\n processFailed = true\n const store = useGallerySyncStore.getState()\n if (!store.failedFiles.includes(item.id)) {\n store.onFileFailed(item.id, error instanceof Error ? error.message : String(error))\n }\n }\n\n // Exit if generation changed (reset was called during processing)\n if (this.generation !== myGeneration) break\n\n const store = useGallerySyncStore.getState()\n if (!processFailed) {\n // Success: increment processedFiles and remove from processingFiles set.\n store.onFileProcessed(item.id)\n } else {\n // Failure is counted exactly once above. Still clear the processingFiles entry so the UI\n // does not show it as in-progress.\n const current = store.processingFiles\n if (current.has(item.id)) {\n const newSet = new Set(current)\n newSet.delete(item.id)\n useGallerySyncStore.setState({processingFiles: newSet})\n }\n }\n }\n\n // Only clear isRunning if this loop owns the current generation\n if (this.generation === myGeneration) {\n this.isRunning = false\n }\n }\n\n /** Process a single item through the full pipeline. */\n private async processItem(item: ProcessingItem): Promise<void> {\n const startTime = Date.now()\n let filePathToSave = item.primaryPath\n let ledgerEntry = galleryTransferLedger.get(item.id)\n if (!ledgerEntry) {\n ledgerEntry = galleryTransferLedger.ensureCapture(\n {\n capture_id: item.id,\n type: item.type,\n timestamp: item.timestamp || Date.now(),\n total_size: item.totalSize,\n files: (item.deleteFromGlasses?.length ? item.deleteFromGlasses : [item.id]).map((name, index) => ({\n name,\n size: index === 0 ? item.totalSize : 0,\n role: index === 0 ? \"primary\" : \"sidecar\",\n })),\n },\n item.protocolVersion || 2,\n )\n }\n\n // 1. HDR merge (photos with brackets only)\n if (item.shouldProcess && item.type === \"photo\" && item.bracketPaths && item.bracketPaths.length >= 3) {\n try {\n const underPath = item.bracketPaths.find((p) => p.includes(\"ev-2\")) || item.bracketPaths[0]\n const normalPath = item.bracketPaths.find((p) => p.includes(\"ev0\")) || item.bracketPaths[1]\n const overPath = item.bracketPaths.find((p) => p.includes(\"ev2\") && !p.includes(\"ev-2\")) || item.bracketPaths[2]\n\n const hdrPath = item.primaryPath + \".hdr.jpg\"\n const hdrResult = await CrustModule.mergeHdrBrackets(underPath, normalPath, overPath, hdrPath)\n if (hdrResult.success && hdrResult.outputPath) {\n filePathToSave = hdrResult.outputPath\n console.log(`${TAG} HDR merged ${item.id} in ${hdrResult.processingTimeMs}ms`)\n }\n } catch (hdrError) {\n console.warn(`${TAG} HDR merge error for ${item.id}, continuing:`, hdrError)\n }\n }\n\n // 2. Image processing (lens + color correction)\n if (item.shouldProcess && item.type === \"photo\") {\n try {\n const processedPath = filePathToSave + \".processed.jpg\"\n const result = await CrustModule.processGalleryImage(filePathToSave, processedPath, {\n lensCorrection: true,\n colorCorrection: true,\n })\n if (result.success && result.outputPath) {\n filePathToSave = result.outputPath\n console.log(`${TAG} 🎨 Processed ${item.id} in ${result.processingTimeMs}ms`)\n }\n } catch (procError) {\n console.warn(`${TAG} Processing error for ${item.id}, using original:`, procError)\n }\n }\n\n // 3. Video stabilization + color correction\n if (item.shouldProcess && item.type === \"video\" && item.sidecarPath) {\n try {\n const stabilizedPath = item.primaryPath + \".stabilized.mp4\"\n const result = await CrustModule.stabilizeVideo(item.primaryPath, item.sidecarPath, stabilizedPath)\n if (result.success && result.outputPath) {\n filePathToSave = result.outputPath\n console.log(`${TAG} 📹 Stabilized ${item.id} in ${result.processingTimeMs}ms`)\n }\n } catch (stabError) {\n console.warn(`${TAG} Stabilization error for ${item.id}, using original:`, stabError)\n }\n }\n\n // 4. Save thumbnail to disk (or use pre-downloaded thumbnail from v1 sync)\n let localThumbnailPath: string | undefined = item.thumbnailPath\n if (item.thumbnailData && item.captureDir) {\n try {\n const thumbPath = `${item.captureDir}/.thumb.jpg`\n const base64Data = item.thumbnailData.startsWith(\"data:\")\n ? item.thumbnailData.split(\",\")[1]\n : item.thumbnailData\n await RNFS.writeFile(thumbPath, base64Data, \"base64\")\n localThumbnailPath = thumbPath\n } catch (thumbError) {\n console.warn(`${TAG} Failed to save thumbnail for ${item.id}:`, thumbError)\n }\n }\n\n // 5. Validate local file before persisting metadata or deleting from glasses\n try {\n await validateDownloadedMediaFile({\n path: filePathToSave,\n name: item.id,\n mediaKind: item.type,\n })\n } catch (validationError: any) {\n const reason = validationError?.message?.includes(INVALID_DOWNLOADED_MEDIA)\n ? validationError.message\n : `${INVALID_DOWNLOADED_MEDIA}: ${item.id}`\n console.error(`${TAG} Validation failed for ${item.id}: ${reason}`)\n reportInvalidGalleryMedia({\n name: item.id,\n path: filePathToSave,\n mediaKind: item.type,\n stage: \"processing_validation\",\n reason,\n expectedSize: item.totalSize,\n duration: item.duration,\n glassesModel: item.glassesModel,\n })\n const store = useGallerySyncStore.getState()\n store.onFileFailed(item.id, reason)\n galleryTransferLedger.recordFailure(item.id, validationError)\n throw new Error(reason)\n }\n\n // 6. Commit the app-local index before any export or source acknowledgement. Use the final\n // on-disk output metadata for camera-roll identity: processing can change byte size, while\n // recovery reconstructs this row from the same file and the transfer ledger timestamp.\n const isVideo = item.type === \"video\"\n const finalFileStat = await RNFS.stat(filePathToSave)\n const finalFileSize = Number(finalFileStat.size)\n const downloadedFile = localStorageService.convertToDownloadedFile(\n {\n name: item.id,\n url: \"\",\n download: \"\",\n size: finalFileSize,\n modified: ledgerEntry.timestamp,\n is_video: isVideo,\n thumbnail_data: item.thumbnailData,\n duration: item.duration,\n filePath: filePathToSave,\n glassesModel: item.glassesModel,\n },\n filePathToSave,\n localThumbnailPath,\n item.glassesModel,\n )\n downloadedFile.capture_id = item.id\n const shouldAutoSave = await cameraRollExportCoordinator.isAutoSaveEnabled()\n try {\n await localStorageService.saveDownloadedFile(downloadedFile)\n ledgerEntry = galleryTransferLedger.transition(item.id, \"INDEXED\", {\n finalPath: filePathToSave,\n thumbnailPath: localThumbnailPath,\n shouldAutoSave,\n })\n await cameraRollExportCoordinator.recordIndexed(\n downloadedFile,\n shouldAutoSave,\n shouldAutoSave ? \"SOURCE_BARRIER\" : \"HISTORICAL_BACKFILL\",\n item.id,\n )\n } catch (metadataError) {\n console.error(`${TAG} Metadata save failed for ${item.id}; retaining local and glasses copies:`, metadataError)\n galleryTransferLedger.recordFailure(item.id, metadataError)\n throw metadataError\n }\n\n // 7. While enabled, export is a durable, receipted step whose failures block ack. Turning\n // auto-save off safely falls back to the already-verified app-local copy and later backfill.\n if (shouldAutoSave) {\n galleryTransferLedger.transition(item.id, \"EXPORT_PENDING\")\n let receipt\n try {\n receipt = await cameraRollExportCoordinator.exportForSource(downloadedFile, item.id)\n } catch (error) {\n galleryTransferLedger.recordFailure(item.id, error)\n throw error\n }\n if (receipt) {\n ledgerEntry = galleryTransferLedger.transition(item.id, \"EXPORTED\", {\n assetReceipt: receipt,\n })\n console.log(`${TAG} ✅ Saved to camera roll with receipt: ${item.id}`)\n } else {\n ledgerEntry = galleryTransferLedger.transition(item.id, \"INDEXED\", {\n shouldAutoSave: false,\n lastError: undefined,\n })\n console.log(`${TAG} Automatic camera-roll saving was disabled; keeping app-local copy: ${item.id}`)\n }\n }\n\n // S4: Clean up intermediate processing files\n const intermediates = [\n item.primaryPath + \".hdr.jpg\",\n item.primaryPath + \".processed.jpg\",\n item.primaryPath + \".stabilized.mp4\",\n ]\n for (const intermediate of intermediates) {\n if (intermediate !== filePathToSave) {\n RNFS.unlink(intermediate).catch(() => {}) // fire-and-forget\n }\n }\n\n // 8. Update file in sync queue with local paths for gallery display\n const store = useGallerySyncStore.getState()\n const localFileUrl = filePathToSave.startsWith(\"file://\") ? filePathToSave : `file://${filePathToSave}`\n const localThumbUrl = localThumbnailPath\n ? localThumbnailPath.startsWith(\"file://\")\n ? localThumbnailPath\n : `file://${localThumbnailPath}`\n : undefined\n store.updateFileInQueue(item.id, {\n name: item.id,\n url: localFileUrl,\n download: localFileUrl,\n size: finalFileSize,\n modified: ledgerEntry.timestamp,\n is_video: isVideo,\n filePath: filePathToSave,\n mime_type: isVideo ? \"video/mp4\" : \"image/jpeg\",\n thumbnail_data: item.thumbnailData,\n thumbnailPath: localThumbUrl,\n duration: item.duration,\n })\n\n // 9. Acknowledge only after VERIFIED -> INDEXED -> (EXPORTED). The server turns this into\n // recoverable trash; failures remain ACK_PENDING and are retried without re-downloading.\n const localFileExists = await RNFS.exists(filePathToSave)\n const localStat = localFileExists ? await RNFS.stat(filePathToSave) : null\n if (!localStat || localStat.size <= 0) {\n const error = new Error(`Cannot acknowledge ${item.id}: committed local file is missing or empty`)\n galleryTransferLedger.recordFailure(item.id, error)\n throw error\n }\n ledgerEntry = galleryTransferLedger.transition(item.id, \"ACK_PENDING\")\n try {\n await this.acknowledgeEntry(ledgerEntry)\n galleryTransferLedger.transition(item.id, \"TRASHED\", {lastError: undefined})\n } catch (ackError) {\n galleryTransferLedger.recordFailure(item.id, ackError)\n throw ackError\n }\n\n const elapsed = Date.now() - startTime\n console.log(`${TAG} ✅ Finished ${item.id} in ${elapsed}ms`)\n }\n\n /** Rebuild a missing app-local index row from the durable transfer ledger. */\n private async recoverDownloadedFile(entry: GalleryTransferEntry) {\n if (!entry.finalPath) throw new Error(`Recovery file is missing for ${entry.captureId}`)\n\n // The transfer ledger is the durable source of truth for a committed generation. A local\n // index row can survive an interrupted replacement and still point at an older/missing path,\n // or contain the pre-processing size. Only reuse it when its path and identity still match the\n // ledger's committed file; otherwise rebuild the row before export or source acknowledgement.\n const finalPath = entry.finalPath.replace(/^file:\\/\\//, \"\")\n const indexed = await localStorageService.getDownloadedFile(entry.captureId)\n if (indexed) {\n try {\n const indexedPath = indexed.filePath?.replace(/^file:\\/\\//, \"\")\n if (indexedPath === finalPath && (await RNFS.exists(indexedPath))) {\n const indexedStat = await RNFS.stat(indexedPath)\n const indexedSize = Number(indexedStat.size)\n if (indexedSize > 0 && indexed.size === indexedSize && indexed.modified === entry.timestamp) {\n return indexed\n }\n }\n } catch (error) {\n console.warn(`${TAG} Ignoring stale local index for ${entry.captureId}:`, error)\n }\n }\n\n const stat = await RNFS.stat(finalPath)\n const finalSize = Number(stat.size)\n if (!Number.isFinite(finalSize) || finalSize <= 0) {\n throw new Error(`Recovery file is missing or empty for ${entry.captureId}`)\n }\n const recovered = localStorageService.convertToDownloadedFile(\n {\n name: entry.captureId,\n url: \"\",\n download: \"\",\n size: finalSize,\n modified: entry.timestamp,\n mime_type: entry.captureType === \"video\" ? \"video/mp4\" : \"image/jpeg\",\n is_video: entry.captureType === \"video\",\n filePath: finalPath,\n },\n finalPath,\n entry.thumbnailPath,\n )\n recovered.capture_id = entry.captureId\n recovered.assetReceipt = entry.assetReceipt\n await localStorageService.saveDownloadedFile(recovered)\n return recovered\n }\n}\n\nexport const mediaProcessingQueue = new MediaProcessingQueue()\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asgOtaVersionUrl.d.ts","sourceRoot":"","sources":["../../src/services/asgOtaVersionUrl.ts"],"names":[],"mappings":"AAsBA,wBAAgB,mBAAmB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAkB1G"}
|