@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,165 @@
|
|
|
1
|
+
import type { DisplayProfile } from "../profiles/types";
|
|
2
|
+
import { TextMeasurer } from "../measurer/TextMeasurer";
|
|
3
|
+
import { TextWrapper } from "../wrapper/TextWrapper";
|
|
4
|
+
import type { WrapOptions, WrapResult } from "../wrapper/types";
|
|
5
|
+
/**
|
|
6
|
+
* Truncation result with metadata.
|
|
7
|
+
*/
|
|
8
|
+
export interface TruncateResult {
|
|
9
|
+
/** The truncated text */
|
|
10
|
+
text: string;
|
|
11
|
+
/** Whether text was truncated */
|
|
12
|
+
wasTruncated: boolean;
|
|
13
|
+
/** Width in pixels of truncated text */
|
|
14
|
+
widthPx: number;
|
|
15
|
+
/** Original text length */
|
|
16
|
+
originalLength: number;
|
|
17
|
+
/** Truncated text length */
|
|
18
|
+
truncatedLength: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Page result for pagination.
|
|
22
|
+
*/
|
|
23
|
+
export interface Page {
|
|
24
|
+
/** Lines on this page */
|
|
25
|
+
lines: string[];
|
|
26
|
+
/** Page number (1-indexed) */
|
|
27
|
+
pageNumber: number;
|
|
28
|
+
/** Total number of pages */
|
|
29
|
+
totalPages: number;
|
|
30
|
+
/** Whether this is the first page */
|
|
31
|
+
isFirst: boolean;
|
|
32
|
+
/** Whether this is the last page */
|
|
33
|
+
isLast: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Chunk result for BLE transmission.
|
|
37
|
+
*/
|
|
38
|
+
export interface Chunk {
|
|
39
|
+
/** The chunk text */
|
|
40
|
+
text: string;
|
|
41
|
+
/** Chunk index (0-indexed) */
|
|
42
|
+
index: number;
|
|
43
|
+
/** Total number of chunks */
|
|
44
|
+
totalChunks: number;
|
|
45
|
+
/** Byte size of this chunk */
|
|
46
|
+
bytes: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Optional helper utilities for common display operations.
|
|
50
|
+
* Built on top of TextMeasurer and TextWrapper for convenience.
|
|
51
|
+
*/
|
|
52
|
+
export declare class DisplayHelpers {
|
|
53
|
+
private readonly measurer;
|
|
54
|
+
private readonly wrapper;
|
|
55
|
+
private readonly profile;
|
|
56
|
+
constructor(measurer: TextMeasurer, wrapper: TextWrapper);
|
|
57
|
+
/**
|
|
58
|
+
* Truncate lines array to max count.
|
|
59
|
+
*
|
|
60
|
+
* @param lines - Array of lines
|
|
61
|
+
* @param maxLines - Maximum lines to keep
|
|
62
|
+
* @param fromEnd - If true, keep last N lines; if false, keep first N (default: false)
|
|
63
|
+
* @returns Truncated lines array
|
|
64
|
+
*/
|
|
65
|
+
truncateToLines(lines: string[], maxLines: number, fromEnd?: boolean): string[];
|
|
66
|
+
/**
|
|
67
|
+
* Truncate text to fit within pixel width, adding ellipsis if needed.
|
|
68
|
+
*
|
|
69
|
+
* @param text - Text to truncate
|
|
70
|
+
* @param maxWidthPx - Maximum width in pixels
|
|
71
|
+
* @param ellipsis - Ellipsis string (default: '...')
|
|
72
|
+
* @returns Truncation result
|
|
73
|
+
*/
|
|
74
|
+
truncateWithEllipsis(text: string, maxWidthPx?: number, ellipsis?: string): TruncateResult;
|
|
75
|
+
/**
|
|
76
|
+
* Estimate how many lines text will need without fully wrapping.
|
|
77
|
+
* This is a quick estimate based on average character width.
|
|
78
|
+
*
|
|
79
|
+
* @param text - Text to estimate
|
|
80
|
+
* @param maxWidthPx - Optional width override
|
|
81
|
+
* @returns Estimated line count
|
|
82
|
+
*/
|
|
83
|
+
estimateLineCount(text: string, maxWidthPx?: number): number;
|
|
84
|
+
/**
|
|
85
|
+
* Wrap and truncate text to fit screen in one call.
|
|
86
|
+
*
|
|
87
|
+
* @param text - Text to fit
|
|
88
|
+
* @param options - Wrap options
|
|
89
|
+
* @returns Lines that fit on screen
|
|
90
|
+
*/
|
|
91
|
+
fitToScreen(text: string, options?: WrapOptions): string[];
|
|
92
|
+
/**
|
|
93
|
+
* Wrap text and paginate into screen-sized pages.
|
|
94
|
+
*
|
|
95
|
+
* @param text - Text to paginate
|
|
96
|
+
* @param options - Wrap options (maxLines will be used as page size)
|
|
97
|
+
* @returns Array of pages
|
|
98
|
+
*/
|
|
99
|
+
paginate(text: string, options?: WrapOptions): Page[];
|
|
100
|
+
/**
|
|
101
|
+
* Calculate UTF-8 byte size of text.
|
|
102
|
+
*
|
|
103
|
+
* @param text - Text to measure
|
|
104
|
+
* @returns Byte size
|
|
105
|
+
*/
|
|
106
|
+
calculateByteSize(text: string): number;
|
|
107
|
+
/**
|
|
108
|
+
* Check if text exceeds byte limit.
|
|
109
|
+
*
|
|
110
|
+
* @param text - Text to check
|
|
111
|
+
* @param maxBytes - Optional override (defaults to profile)
|
|
112
|
+
* @returns true if exceeds limit
|
|
113
|
+
*/
|
|
114
|
+
exceedsByteLimit(text: string, maxBytes?: number): boolean;
|
|
115
|
+
/**
|
|
116
|
+
* Split text into BLE-safe chunks.
|
|
117
|
+
* Tries to split at word/line boundaries when possible.
|
|
118
|
+
*
|
|
119
|
+
* @param text - Text to chunk
|
|
120
|
+
* @param chunkSize - Optional override (defaults to profile)
|
|
121
|
+
* @returns Array of chunks
|
|
122
|
+
*/
|
|
123
|
+
splitIntoChunks(text: string, chunkSize?: number): Chunk[];
|
|
124
|
+
/**
|
|
125
|
+
* Calculate line utilization statistics.
|
|
126
|
+
*
|
|
127
|
+
* @param result - Wrap result to analyze
|
|
128
|
+
* @returns Utilization statistics
|
|
129
|
+
*/
|
|
130
|
+
calculateUtilization(result: WrapResult): {
|
|
131
|
+
averageUtilization: number;
|
|
132
|
+
minUtilization: number;
|
|
133
|
+
maxUtilization: number;
|
|
134
|
+
totalWastedPx: number;
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Pad lines array to exact count with empty strings.
|
|
138
|
+
*
|
|
139
|
+
* @param lines - Lines to pad
|
|
140
|
+
* @param targetCount - Target number of lines
|
|
141
|
+
* @param padAtEnd - If true, pad at end; if false, pad at start (default: true)
|
|
142
|
+
* @returns Padded lines array
|
|
143
|
+
*/
|
|
144
|
+
padToLineCount(lines: string[], targetCount: number, padAtEnd?: boolean): string[];
|
|
145
|
+
/**
|
|
146
|
+
* Join lines with newlines for display.
|
|
147
|
+
*
|
|
148
|
+
* @param lines - Lines to join
|
|
149
|
+
* @returns Joined string
|
|
150
|
+
*/
|
|
151
|
+
joinLines(lines: string[]): string;
|
|
152
|
+
/**
|
|
153
|
+
* Get the measurer instance.
|
|
154
|
+
*/
|
|
155
|
+
getMeasurer(): TextMeasurer;
|
|
156
|
+
/**
|
|
157
|
+
* Get the wrapper instance.
|
|
158
|
+
*/
|
|
159
|
+
getWrapper(): TextWrapper;
|
|
160
|
+
/**
|
|
161
|
+
* Get the display profile.
|
|
162
|
+
*/
|
|
163
|
+
getProfile(): DisplayProfile;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=DisplayHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DisplayHelpers.d.ts","sourceRoot":"","sources":["../../../../src/utils/display/helpers/DisplayHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional helper utilities for common display operations.
|
|
3
|
+
* Built on top of TextMeasurer and TextWrapper for convenience.
|
|
4
|
+
*/
|
|
5
|
+
export class DisplayHelpers {
|
|
6
|
+
measurer;
|
|
7
|
+
wrapper;
|
|
8
|
+
profile;
|
|
9
|
+
constructor(measurer, wrapper) {
|
|
10
|
+
this.measurer = measurer;
|
|
11
|
+
this.wrapper = wrapper;
|
|
12
|
+
this.profile = measurer.getProfile();
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Truncate lines array to max count.
|
|
16
|
+
*
|
|
17
|
+
* @param lines - Array of lines
|
|
18
|
+
* @param maxLines - Maximum lines to keep
|
|
19
|
+
* @param fromEnd - If true, keep last N lines; if false, keep first N (default: false)
|
|
20
|
+
* @returns Truncated lines array
|
|
21
|
+
*/
|
|
22
|
+
truncateToLines(lines, maxLines, fromEnd = false) {
|
|
23
|
+
if (lines.length <= maxLines) {
|
|
24
|
+
return lines;
|
|
25
|
+
}
|
|
26
|
+
if (fromEnd) {
|
|
27
|
+
// Keep the last N lines (most recent)
|
|
28
|
+
return lines.slice(-maxLines);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Keep the first N lines
|
|
32
|
+
return lines.slice(0, maxLines);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Truncate text to fit within pixel width, adding ellipsis if needed.
|
|
37
|
+
*
|
|
38
|
+
* @param text - Text to truncate
|
|
39
|
+
* @param maxWidthPx - Maximum width in pixels
|
|
40
|
+
* @param ellipsis - Ellipsis string (default: '...')
|
|
41
|
+
* @returns Truncation result
|
|
42
|
+
*/
|
|
43
|
+
truncateWithEllipsis(text, maxWidthPx, ellipsis = "...") {
|
|
44
|
+
const width = maxWidthPx ?? this.profile.displayWidthPx;
|
|
45
|
+
const textWidth = this.measurer.measureText(text);
|
|
46
|
+
if (textWidth <= width) {
|
|
47
|
+
return {
|
|
48
|
+
text,
|
|
49
|
+
wasTruncated: false,
|
|
50
|
+
widthPx: textWidth,
|
|
51
|
+
originalLength: text.length,
|
|
52
|
+
truncatedLength: text.length,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const ellipsisWidth = this.measurer.measureText(ellipsis);
|
|
56
|
+
const targetWidth = width - ellipsisWidth;
|
|
57
|
+
// Find how many characters fit
|
|
58
|
+
let truncated = "";
|
|
59
|
+
let currentWidth = 0;
|
|
60
|
+
for (const char of text) {
|
|
61
|
+
const charWidth = this.measurer.measureChar(char);
|
|
62
|
+
if (currentWidth + charWidth > targetWidth) {
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
truncated += char;
|
|
66
|
+
currentWidth += charWidth;
|
|
67
|
+
}
|
|
68
|
+
// Trim trailing whitespace before ellipsis
|
|
69
|
+
truncated = truncated.trimEnd();
|
|
70
|
+
const finalText = truncated + ellipsis;
|
|
71
|
+
return {
|
|
72
|
+
text: finalText,
|
|
73
|
+
wasTruncated: true,
|
|
74
|
+
widthPx: this.measurer.measureText(finalText),
|
|
75
|
+
originalLength: text.length,
|
|
76
|
+
truncatedLength: truncated.length,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Estimate how many lines text will need without fully wrapping.
|
|
81
|
+
* This is a quick estimate based on average character width.
|
|
82
|
+
*
|
|
83
|
+
* @param text - Text to estimate
|
|
84
|
+
* @param maxWidthPx - Optional width override
|
|
85
|
+
* @returns Estimated line count
|
|
86
|
+
*/
|
|
87
|
+
estimateLineCount(text, maxWidthPx) {
|
|
88
|
+
if (!text)
|
|
89
|
+
return 1;
|
|
90
|
+
const width = maxWidthPx ?? this.profile.displayWidthPx;
|
|
91
|
+
const textWidth = this.measurer.measureText(text);
|
|
92
|
+
// Account for explicit newlines
|
|
93
|
+
const newlineCount = (text.match(/\n/g) || []).length;
|
|
94
|
+
// Estimate wrapped lines
|
|
95
|
+
const wrappedLines = Math.ceil(textWidth / width);
|
|
96
|
+
return wrappedLines + newlineCount;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Wrap and truncate text to fit screen in one call.
|
|
100
|
+
*
|
|
101
|
+
* @param text - Text to fit
|
|
102
|
+
* @param options - Wrap options
|
|
103
|
+
* @returns Lines that fit on screen
|
|
104
|
+
*/
|
|
105
|
+
fitToScreen(text, options) {
|
|
106
|
+
const result = this.wrapper.wrap(text, options);
|
|
107
|
+
return result.lines.slice(0, this.profile.maxLines);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Wrap text and paginate into screen-sized pages.
|
|
111
|
+
*
|
|
112
|
+
* @param text - Text to paginate
|
|
113
|
+
* @param options - Wrap options (maxLines will be used as page size)
|
|
114
|
+
* @returns Array of pages
|
|
115
|
+
*/
|
|
116
|
+
paginate(text, options) {
|
|
117
|
+
// Wrap without line limit to get all lines
|
|
118
|
+
const wrapResult = this.wrapper.wrap(text, {
|
|
119
|
+
...options,
|
|
120
|
+
maxLines: Infinity,
|
|
121
|
+
maxBytes: Infinity,
|
|
122
|
+
});
|
|
123
|
+
const linesPerPage = options?.maxLines ?? this.profile.maxLines;
|
|
124
|
+
const allLines = wrapResult.lines;
|
|
125
|
+
const pages = [];
|
|
126
|
+
for (let i = 0; i < allLines.length; i += linesPerPage) {
|
|
127
|
+
const pageLines = allLines.slice(i, i + linesPerPage);
|
|
128
|
+
const pageNumber = Math.floor(i / linesPerPage) + 1;
|
|
129
|
+
const totalPages = Math.ceil(allLines.length / linesPerPage);
|
|
130
|
+
pages.push({
|
|
131
|
+
lines: pageLines,
|
|
132
|
+
pageNumber,
|
|
133
|
+
totalPages,
|
|
134
|
+
isFirst: pageNumber === 1,
|
|
135
|
+
isLast: pageNumber === totalPages,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return pages.length > 0
|
|
139
|
+
? pages
|
|
140
|
+
: [
|
|
141
|
+
{
|
|
142
|
+
lines: [""],
|
|
143
|
+
pageNumber: 1,
|
|
144
|
+
totalPages: 1,
|
|
145
|
+
isFirst: true,
|
|
146
|
+
isLast: true,
|
|
147
|
+
},
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Calculate UTF-8 byte size of text.
|
|
152
|
+
*
|
|
153
|
+
* @param text - Text to measure
|
|
154
|
+
* @returns Byte size
|
|
155
|
+
*/
|
|
156
|
+
calculateByteSize(text) {
|
|
157
|
+
return this.measurer.getByteSize(text);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Check if text exceeds byte limit.
|
|
161
|
+
*
|
|
162
|
+
* @param text - Text to check
|
|
163
|
+
* @param maxBytes - Optional override (defaults to profile)
|
|
164
|
+
* @returns true if exceeds limit
|
|
165
|
+
*/
|
|
166
|
+
exceedsByteLimit(text, maxBytes) {
|
|
167
|
+
const limit = maxBytes ?? this.profile.maxPayloadBytes;
|
|
168
|
+
return this.calculateByteSize(text) > limit;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Split text into BLE-safe chunks.
|
|
172
|
+
* Tries to split at word/line boundaries when possible.
|
|
173
|
+
*
|
|
174
|
+
* @param text - Text to chunk
|
|
175
|
+
* @param chunkSize - Optional override (defaults to profile)
|
|
176
|
+
* @returns Array of chunks
|
|
177
|
+
*/
|
|
178
|
+
splitIntoChunks(text, chunkSize) {
|
|
179
|
+
const size = chunkSize ?? this.profile.bleChunkSize;
|
|
180
|
+
const encoder = new TextEncoder();
|
|
181
|
+
const bytes = encoder.encode(text);
|
|
182
|
+
if (bytes.length <= size) {
|
|
183
|
+
return [
|
|
184
|
+
{
|
|
185
|
+
text,
|
|
186
|
+
index: 0,
|
|
187
|
+
totalChunks: 1,
|
|
188
|
+
bytes: bytes.length,
|
|
189
|
+
},
|
|
190
|
+
];
|
|
191
|
+
}
|
|
192
|
+
const chunks = [];
|
|
193
|
+
let offset = 0;
|
|
194
|
+
while (offset < bytes.length) {
|
|
195
|
+
let endOffset = Math.min(offset + size, bytes.length);
|
|
196
|
+
// Back off to avoid splitting a multi-byte character
|
|
197
|
+
if (endOffset < bytes.length) {
|
|
198
|
+
// Find a valid UTF-8 boundary
|
|
199
|
+
while (endOffset > offset && (bytes[endOffset] & 0xc0) === 0x80) {
|
|
200
|
+
endOffset--;
|
|
201
|
+
}
|
|
202
|
+
// Try to find a good break point (space or newline)
|
|
203
|
+
let breakPoint = endOffset;
|
|
204
|
+
for (let i = endOffset - 1; i > offset + size / 2; i--) {
|
|
205
|
+
if (bytes[i] === 0x20 || bytes[i] === 0x0a) {
|
|
206
|
+
// space or newline
|
|
207
|
+
breakPoint = i + 1;
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (breakPoint > offset) {
|
|
212
|
+
endOffset = breakPoint;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const chunkBytes = bytes.slice(offset, endOffset);
|
|
216
|
+
const chunkText = new TextDecoder().decode(chunkBytes);
|
|
217
|
+
chunks.push({
|
|
218
|
+
text: chunkText,
|
|
219
|
+
index: chunks.length,
|
|
220
|
+
totalChunks: 0, // Will be set after loop
|
|
221
|
+
bytes: chunkBytes.length,
|
|
222
|
+
});
|
|
223
|
+
offset = endOffset;
|
|
224
|
+
}
|
|
225
|
+
// Update total chunks count
|
|
226
|
+
for (const chunk of chunks) {
|
|
227
|
+
chunk.totalChunks = chunks.length;
|
|
228
|
+
}
|
|
229
|
+
return chunks;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Calculate line utilization statistics.
|
|
233
|
+
*
|
|
234
|
+
* @param result - Wrap result to analyze
|
|
235
|
+
* @returns Utilization statistics
|
|
236
|
+
*/
|
|
237
|
+
calculateUtilization(result) {
|
|
238
|
+
if (result.lines.length === 0 || result.lineMetrics.length === 0) {
|
|
239
|
+
return {
|
|
240
|
+
averageUtilization: 0,
|
|
241
|
+
minUtilization: 0,
|
|
242
|
+
maxUtilization: 0,
|
|
243
|
+
totalWastedPx: 0,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
const maxWidthPx = this.profile.displayWidthPx;
|
|
247
|
+
let totalUtilization = 0;
|
|
248
|
+
let minUtilization = 100;
|
|
249
|
+
let maxUtilization = 0;
|
|
250
|
+
let totalWastedPx = 0;
|
|
251
|
+
for (const metric of result.lineMetrics) {
|
|
252
|
+
totalUtilization += metric.utilizationPercent;
|
|
253
|
+
minUtilization = Math.min(minUtilization, metric.utilizationPercent);
|
|
254
|
+
maxUtilization = Math.max(maxUtilization, metric.utilizationPercent);
|
|
255
|
+
totalWastedPx += maxWidthPx - metric.widthPx;
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
averageUtilization: Math.round(totalUtilization / result.lineMetrics.length),
|
|
259
|
+
minUtilization,
|
|
260
|
+
maxUtilization,
|
|
261
|
+
totalWastedPx,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Pad lines array to exact count with empty strings.
|
|
266
|
+
*
|
|
267
|
+
* @param lines - Lines to pad
|
|
268
|
+
* @param targetCount - Target number of lines
|
|
269
|
+
* @param padAtEnd - If true, pad at end; if false, pad at start (default: true)
|
|
270
|
+
* @returns Padded lines array
|
|
271
|
+
*/
|
|
272
|
+
padToLineCount(lines, targetCount, padAtEnd = true) {
|
|
273
|
+
if (lines.length >= targetCount) {
|
|
274
|
+
return lines.slice(0, targetCount);
|
|
275
|
+
}
|
|
276
|
+
const padding = Array(targetCount - lines.length).fill("");
|
|
277
|
+
if (padAtEnd) {
|
|
278
|
+
return [...lines, ...padding];
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
return [...padding, ...lines];
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Join lines with newlines for display.
|
|
286
|
+
*
|
|
287
|
+
* @param lines - Lines to join
|
|
288
|
+
* @returns Joined string
|
|
289
|
+
*/
|
|
290
|
+
joinLines(lines) {
|
|
291
|
+
return lines.join("\n");
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Get the measurer instance.
|
|
295
|
+
*/
|
|
296
|
+
getMeasurer() {
|
|
297
|
+
return this.measurer;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Get the wrapper instance.
|
|
301
|
+
*/
|
|
302
|
+
getWrapper() {
|
|
303
|
+
return this.wrapper;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Get the display profile.
|
|
307
|
+
*/
|
|
308
|
+
getProfile() {
|
|
309
|
+
return this.profile;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=DisplayHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DisplayHelpers.js","sourceRoot":"","sources":["../../../../src/utils/display/helpers/DisplayHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DisplayProfile } from \"../profiles/types\"\nimport { TextMeasurer } from \"../measurer/TextMeasurer\"\nimport { TextWrapper } from \"../wrapper/TextWrapper\"\nimport type { WrapOptions, WrapResult } from \"../wrapper/types\"\n\n/**\n * Truncation result with metadata.\n */\nexport interface TruncateResult {\n /** The truncated text */\n text: string\n /** Whether text was truncated */\n wasTruncated: boolean\n /** Width in pixels of truncated text */\n widthPx: number\n /** Original text length */\n originalLength: number\n /** Truncated text length */\n truncatedLength: number\n}\n\n/**\n * Page result for pagination.\n */\nexport interface Page {\n /** Lines on this page */\n lines: string[]\n /** Page number (1-indexed) */\n pageNumber: number\n /** Total number of pages */\n totalPages: number\n /** Whether this is the first page */\n isFirst: boolean\n /** Whether this is the last page */\n isLast: boolean\n}\n\n/**\n * Chunk result for BLE transmission.\n */\nexport interface Chunk {\n /** The chunk text */\n text: string\n /** Chunk index (0-indexed) */\n index: number\n /** Total number of chunks */\n totalChunks: number\n /** Byte size of this chunk */\n bytes: number\n}\n\n/**\n * Optional helper utilities for common display operations.\n * Built on top of TextMeasurer and TextWrapper for convenience.\n */\nexport class DisplayHelpers {\n private readonly measurer: TextMeasurer\n private readonly wrapper: TextWrapper\n private readonly profile: DisplayProfile\n\n constructor(measurer: TextMeasurer, wrapper: TextWrapper) {\n this.measurer = measurer\n this.wrapper = wrapper\n this.profile = measurer.getProfile()\n }\n\n /**\n * Truncate lines array to max count.\n *\n * @param lines - Array of lines\n * @param maxLines - Maximum lines to keep\n * @param fromEnd - If true, keep last N lines; if false, keep first N (default: false)\n * @returns Truncated lines array\n */\n truncateToLines(lines: string[], maxLines: number, fromEnd: boolean = false): string[] {\n if (lines.length <= maxLines) {\n return lines\n }\n\n if (fromEnd) {\n // Keep the last N lines (most recent)\n return lines.slice(-maxLines)\n } else {\n // Keep the first N lines\n return lines.slice(0, maxLines)\n }\n }\n\n /**\n * Truncate text to fit within pixel width, adding ellipsis if needed.\n *\n * @param text - Text to truncate\n * @param maxWidthPx - Maximum width in pixels\n * @param ellipsis - Ellipsis string (default: '...')\n * @returns Truncation result\n */\n truncateWithEllipsis(\n text: string,\n maxWidthPx?: number,\n ellipsis: string = \"...\"\n ): TruncateResult {\n const width = maxWidthPx ?? this.profile.displayWidthPx\n const textWidth = this.measurer.measureText(text)\n\n if (textWidth <= width) {\n return {\n text,\n wasTruncated: false,\n widthPx: textWidth,\n originalLength: text.length,\n truncatedLength: text.length,\n }\n }\n\n const ellipsisWidth = this.measurer.measureText(ellipsis)\n const targetWidth = width - ellipsisWidth\n\n // Find how many characters fit\n let truncated = \"\"\n let currentWidth = 0\n\n for (const char of text) {\n const charWidth = this.measurer.measureChar(char)\n if (currentWidth + charWidth > targetWidth) {\n break\n }\n truncated += char\n currentWidth += charWidth\n }\n\n // Trim trailing whitespace before ellipsis\n truncated = truncated.trimEnd()\n const finalText = truncated + ellipsis\n\n return {\n text: finalText,\n wasTruncated: true,\n widthPx: this.measurer.measureText(finalText),\n originalLength: text.length,\n truncatedLength: truncated.length,\n }\n }\n\n /**\n * Estimate how many lines text will need without fully wrapping.\n * This is a quick estimate based on average character width.\n *\n * @param text - Text to estimate\n * @param maxWidthPx - Optional width override\n * @returns Estimated line count\n */\n estimateLineCount(text: string, maxWidthPx?: number): number {\n if (!text) return 1\n\n const width = maxWidthPx ?? this.profile.displayWidthPx\n const textWidth = this.measurer.measureText(text)\n\n // Account for explicit newlines\n const newlineCount = (text.match(/\\n/g) || []).length\n\n // Estimate wrapped lines\n const wrappedLines = Math.ceil(textWidth / width)\n\n return wrappedLines + newlineCount\n }\n\n /**\n * Wrap and truncate text to fit screen in one call.\n *\n * @param text - Text to fit\n * @param options - Wrap options\n * @returns Lines that fit on screen\n */\n fitToScreen(text: string, options?: WrapOptions): string[] {\n const result = this.wrapper.wrap(text, options)\n return result.lines.slice(0, this.profile.maxLines)\n }\n\n /**\n * Wrap text and paginate into screen-sized pages.\n *\n * @param text - Text to paginate\n * @param options - Wrap options (maxLines will be used as page size)\n * @returns Array of pages\n */\n paginate(text: string, options?: WrapOptions): Page[] {\n // Wrap without line limit to get all lines\n const wrapResult = this.wrapper.wrap(text, {\n ...options,\n maxLines: Infinity,\n maxBytes: Infinity,\n })\n\n const linesPerPage = options?.maxLines ?? this.profile.maxLines\n const allLines = wrapResult.lines\n const pages: Page[] = []\n\n for (let i = 0; i < allLines.length; i += linesPerPage) {\n const pageLines = allLines.slice(i, i + linesPerPage)\n const pageNumber = Math.floor(i / linesPerPage) + 1\n const totalPages = Math.ceil(allLines.length / linesPerPage)\n\n pages.push({\n lines: pageLines,\n pageNumber,\n totalPages,\n isFirst: pageNumber === 1,\n isLast: pageNumber === totalPages,\n })\n }\n\n return pages.length > 0\n ? pages\n : [\n {\n lines: [\"\"],\n pageNumber: 1,\n totalPages: 1,\n isFirst: true,\n isLast: true,\n },\n ]\n }\n\n /**\n * Calculate UTF-8 byte size of text.\n *\n * @param text - Text to measure\n * @returns Byte size\n */\n calculateByteSize(text: string): number {\n return this.measurer.getByteSize(text)\n }\n\n /**\n * Check if text exceeds byte limit.\n *\n * @param text - Text to check\n * @param maxBytes - Optional override (defaults to profile)\n * @returns true if exceeds limit\n */\n exceedsByteLimit(text: string, maxBytes?: number): boolean {\n const limit = maxBytes ?? this.profile.maxPayloadBytes\n return this.calculateByteSize(text) > limit\n }\n\n /**\n * Split text into BLE-safe chunks.\n * Tries to split at word/line boundaries when possible.\n *\n * @param text - Text to chunk\n * @param chunkSize - Optional override (defaults to profile)\n * @returns Array of chunks\n */\n splitIntoChunks(text: string, chunkSize?: number): Chunk[] {\n const size = chunkSize ?? this.profile.bleChunkSize\n const encoder = new TextEncoder()\n const bytes = encoder.encode(text)\n\n if (bytes.length <= size) {\n return [\n {\n text,\n index: 0,\n totalChunks: 1,\n bytes: bytes.length,\n },\n ]\n }\n\n const chunks: Chunk[] = []\n let offset = 0\n\n while (offset < bytes.length) {\n let endOffset = Math.min(offset + size, bytes.length)\n\n // Back off to avoid splitting a multi-byte character\n if (endOffset < bytes.length) {\n // Find a valid UTF-8 boundary\n while (endOffset > offset && (bytes[endOffset] & 0xc0) === 0x80) {\n endOffset--\n }\n\n // Try to find a good break point (space or newline)\n let breakPoint = endOffset\n for (let i = endOffset - 1; i > offset + size / 2; i--) {\n if (bytes[i] === 0x20 || bytes[i] === 0x0a) {\n // space or newline\n breakPoint = i + 1\n break\n }\n }\n if (breakPoint > offset) {\n endOffset = breakPoint\n }\n }\n\n const chunkBytes = bytes.slice(offset, endOffset)\n const chunkText = new TextDecoder().decode(chunkBytes)\n\n chunks.push({\n text: chunkText,\n index: chunks.length,\n totalChunks: 0, // Will be set after loop\n bytes: chunkBytes.length,\n })\n\n offset = endOffset\n }\n\n // Update total chunks count\n for (const chunk of chunks) {\n chunk.totalChunks = chunks.length\n }\n\n return chunks\n }\n\n /**\n * Calculate line utilization statistics.\n *\n * @param result - Wrap result to analyze\n * @returns Utilization statistics\n */\n calculateUtilization(result: WrapResult): {\n averageUtilization: number\n minUtilization: number\n maxUtilization: number\n totalWastedPx: number\n } {\n if (result.lines.length === 0 || result.lineMetrics.length === 0) {\n return {\n averageUtilization: 0,\n minUtilization: 0,\n maxUtilization: 0,\n totalWastedPx: 0,\n }\n }\n\n const maxWidthPx = this.profile.displayWidthPx\n let totalUtilization = 0\n let minUtilization = 100\n let maxUtilization = 0\n let totalWastedPx = 0\n\n for (const metric of result.lineMetrics) {\n totalUtilization += metric.utilizationPercent\n minUtilization = Math.min(minUtilization, metric.utilizationPercent)\n maxUtilization = Math.max(maxUtilization, metric.utilizationPercent)\n totalWastedPx += maxWidthPx - metric.widthPx\n }\n\n return {\n averageUtilization: Math.round(totalUtilization / result.lineMetrics.length),\n minUtilization,\n maxUtilization,\n totalWastedPx,\n }\n }\n\n /**\n * Pad lines array to exact count with empty strings.\n *\n * @param lines - Lines to pad\n * @param targetCount - Target number of lines\n * @param padAtEnd - If true, pad at end; if false, pad at start (default: true)\n * @returns Padded lines array\n */\n padToLineCount(lines: string[], targetCount: number, padAtEnd: boolean = true): string[] {\n if (lines.length >= targetCount) {\n return lines.slice(0, targetCount)\n }\n\n const padding = Array(targetCount - lines.length).fill(\"\")\n\n if (padAtEnd) {\n return [...lines, ...padding]\n } else {\n return [...padding, ...lines]\n }\n }\n\n /**\n * Join lines with newlines for display.\n *\n * @param lines - Lines to join\n * @returns Joined string\n */\n joinLines(lines: string[]): string {\n return lines.join(\"\\n\")\n }\n\n /**\n * Get the measurer instance.\n */\n getMeasurer(): TextMeasurer {\n return this.measurer\n }\n\n /**\n * Get the wrapper instance.\n */\n getWrapper(): TextWrapper {\n return this.wrapper\n }\n\n /**\n * Get the display profile.\n */\n getProfile(): DisplayProfile {\n return this.profile\n }\n}\n"]}
|