@glassly/engine 0.1.0-dev.98 → 0.2.8-dev.445
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 +28 -0
- package/build/engine.d.ts +32 -10
- package/build/engine.d.ts.map +1 -1
- package/build/engine.js +24 -16
- package/build/engine.js.map +1 -1
- package/build/facades/dev.d.ts +9 -0
- package/build/facades/dev.d.ts.map +1 -1
- package/build/facades/dev.js +9 -0
- package/build/facades/dev.js.map +1 -1
- package/build/facades/display.d.ts +10 -3
- package/build/facades/display.d.ts.map +1 -1
- package/build/facades/display.js +22 -8
- package/build/facades/display.js.map +1 -1
- package/build/facades/displayMirror.d.ts +11 -0
- package/build/facades/displayMirror.d.ts.map +1 -1
- package/build/facades/displayMirror.js +22 -0
- package/build/facades/displayMirror.js.map +1 -1
- package/build/facades/glasses.d.ts +31 -1
- package/build/facades/glasses.d.ts.map +1 -1
- package/build/facades/glasses.js +51 -0
- package/build/facades/glasses.js.map +1 -1
- package/build/facades/memory.d.ts +0 -6
- package/build/facades/memory.d.ts.map +1 -1
- package/build/facades/memory.js +1 -9
- package/build/facades/memory.js.map +1 -1
- package/build/facades/miniapps.d.ts +3 -1
- package/build/facades/miniapps.d.ts.map +1 -1
- package/build/facades/miniapps.js +3 -1
- package/build/facades/miniapps.js.map +1 -1
- package/build/facades/pairing.d.ts.map +1 -1
- package/build/facades/pairing.js +5 -4
- package/build/facades/pairing.js.map +1 -1
- package/build/facades/permissions.d.ts +2 -0
- package/build/facades/permissions.d.ts.map +1 -1
- package/build/facades/permissions.js +48 -0
- package/build/facades/permissions.js.map +1 -1
- package/build/facades/phoneNotifications.d.ts +20 -9
- package/build/facades/phoneNotifications.d.ts.map +1 -1
- package/build/facades/phoneNotifications.js +33 -26
- package/build/facades/phoneNotifications.js.map +1 -1
- package/build/facades/settings.d.ts.map +1 -1
- package/build/facades/settings.js +1 -2
- package/build/facades/settings.js.map +1 -1
- package/build/generated/releaseMetadata.js +4 -4
- package/build/generated/releaseMetadata.js.map +1 -1
- package/build/index.d.ts +6 -4
- package/build/index.d.ts.map +1 -1
- package/build/index.js +5 -4
- package/build/index.js.map +1 -1
- package/build/react/MentraLiveOtaFlow.js +2 -2
- package/build/react/MentraLiveOtaFlow.js.map +1 -1
- package/build/react/useMentraLiveOta.d.ts.map +1 -1
- package/build/react/useMentraLiveOta.js +8 -7
- package/build/react/useMentraLiveOta.js.map +1 -1
- package/build/runtime/config.d.ts +1 -1
- package/build/runtime/config.d.ts.map +1 -1
- package/build/runtime/config.js.map +1 -1
- package/build/services/AppRegistry.d.ts +4 -1
- package/build/services/AppRegistry.d.ts.map +1 -1
- package/build/services/AppRegistry.js +21 -1
- package/build/services/AppRegistry.js.map +1 -1
- package/build/services/BlobStore.d.ts +2 -2
- package/build/services/BlobStore.js +3 -3
- package/build/services/BlobStore.js.map +1 -1
- package/build/services/CloudClientService.d.ts +7 -3
- package/build/services/CloudClientService.d.ts.map +1 -1
- package/build/services/CloudClientService.js +34 -9
- package/build/services/CloudClientService.js.map +1 -1
- package/build/services/DevServerBridge.d.ts +1 -18
- package/build/services/DevServerBridge.d.ts.map +1 -1
- package/build/services/DevServerBridge.js +9 -8
- package/build/services/DevServerBridge.js.map +1 -1
- package/build/services/DeviceEventRouter.d.ts.map +1 -1
- package/build/services/DeviceEventRouter.js +58 -71
- package/build/services/DeviceEventRouter.js.map +1 -1
- package/build/services/DisplayDiagnostics.d.ts +5 -0
- package/build/services/DisplayDiagnostics.d.ts.map +1 -0
- package/build/services/DisplayDiagnostics.js +105 -0
- package/build/services/DisplayDiagnostics.js.map +1 -0
- package/build/services/DisplayProcessor.d.ts +6 -7
- package/build/services/DisplayProcessor.d.ts.map +1 -1
- package/build/services/DisplayProcessor.js +17 -45
- package/build/services/DisplayProcessor.js.map +1 -1
- package/build/services/GestureDotsService.d.ts +10 -4
- package/build/services/GestureDotsService.d.ts.map +1 -1
- package/build/services/GestureDotsService.js +70 -16
- package/build/services/GestureDotsService.js.map +1 -1
- package/build/services/GlassesKeyboardInput.d.ts +77 -0
- package/build/services/GlassesKeyboardInput.d.ts.map +1 -0
- package/build/services/GlassesKeyboardInput.js +261 -0
- package/build/services/GlassesKeyboardInput.js.map +1 -0
- package/build/services/GlassesSensorService.d.ts +47 -0
- package/build/services/GlassesSensorService.d.ts.map +1 -0
- package/build/services/GlassesSensorService.js +242 -0
- package/build/services/GlassesSensorService.js.map +1 -0
- package/build/services/GlassesTouchInput.d.ts +14 -0
- package/build/services/GlassesTouchInput.d.ts.map +1 -0
- package/build/services/GlassesTouchInput.js +107 -0
- package/build/services/GlassesTouchInput.js.map +1 -0
- package/build/services/HeadingService.d.ts +0 -6
- package/build/services/HeadingService.d.ts.map +1 -1
- package/build/services/HeadingService.js +0 -27
- package/build/services/HeadingService.js.map +1 -1
- package/build/services/HotspotShutdown.d.ts.map +1 -1
- package/build/services/HotspotShutdown.js +2 -1
- package/build/services/HotspotShutdown.js.map +1 -1
- package/build/services/JSCrashloopReportService.js +2 -2
- package/build/services/JSCrashloopReportService.js.map +1 -1
- package/build/services/JSRouter.d.ts +6 -4
- package/build/services/JSRouter.d.ts.map +1 -1
- package/build/services/JSRouter.js +15 -13
- package/build/services/JSRouter.js.map +1 -1
- package/build/services/LocalDisplayManager.d.ts +35 -7
- package/build/services/LocalDisplayManager.d.ts.map +1 -1
- package/build/services/LocalDisplayManager.js +105 -27
- package/build/services/LocalDisplayManager.js.map +1 -1
- package/build/services/LocalMiniappDataMigration.d.ts +1 -1
- package/build/services/LocalMiniappDataMigration.js +1 -1
- package/build/services/LocalMiniappDataMigration.js.map +1 -1
- package/build/services/LocalMiniappRuntime.d.ts +64 -11
- package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
- package/build/services/LocalMiniappRuntime.js +441 -35
- package/build/services/LocalMiniappRuntime.js.map +1 -1
- package/build/services/LocalSttFallbackCoordinator.d.ts +3 -0
- package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -1
- package/build/services/LocalSttFallbackCoordinator.js +27 -8
- package/build/services/LocalSttFallbackCoordinator.js.map +1 -1
- package/build/services/MemoryStore.d.ts +8 -33
- package/build/services/MemoryStore.d.ts.map +1 -1
- package/build/services/MemoryStore.js +30 -56
- package/build/services/MemoryStore.js.map +1 -1
- package/build/services/MiniappEngine.d.ts +3 -3
- package/build/services/MiniappEngine.js +7 -7
- package/build/services/MiniappEngine.js.map +1 -1
- package/build/services/MiniappLauncher.d.ts +8 -0
- package/build/services/MiniappLauncher.d.ts.map +1 -1
- package/build/services/MiniappLauncher.js +19 -1
- package/build/services/MiniappLauncher.js.map +1 -1
- package/build/services/MirrorService.d.ts +24 -0
- package/build/services/MirrorService.d.ts.map +1 -0
- package/build/services/MirrorService.js +132 -0
- package/build/services/MirrorService.js.map +1 -0
- package/build/services/NativeNavigationService.d.ts +2 -3
- package/build/services/NativeNavigationService.d.ts.map +1 -1
- package/build/services/NativeNavigationService.js +24 -21
- package/build/services/NativeNavigationService.js.map +1 -1
- package/build/services/NavigationHandlers.d.ts.map +1 -1
- package/build/services/NavigationHandlers.js +10 -5
- package/build/services/NavigationHandlers.js.map +1 -1
- package/build/services/OtaInstallCoordinator.d.ts.map +1 -1
- package/build/services/OtaInstallCoordinator.js +24 -23
- package/build/services/OtaInstallCoordinator.js.map +1 -1
- package/build/services/PairedGlassesLatch.d.ts +7 -0
- package/build/services/PairedGlassesLatch.d.ts.map +1 -0
- package/build/services/PairedGlassesLatch.js +38 -0
- package/build/services/PairedGlassesLatch.js.map +1 -0
- package/build/services/PhoneActivity.d.ts +23 -0
- package/build/services/PhoneActivity.d.ts.map +1 -0
- package/build/services/PhoneActivity.js +111 -0
- package/build/services/PhoneActivity.js.map +1 -0
- package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -1
- package/build/services/PhoneCameraFovCoordinator.js +4 -3
- package/build/services/PhoneCameraFovCoordinator.js.map +1 -1
- package/build/services/PhoneNotificationsSync.d.ts +40 -6
- package/build/services/PhoneNotificationsSync.d.ts.map +1 -1
- package/build/services/PhoneNotificationsSync.js +160 -84
- package/build/services/PhoneNotificationsSync.js.map +1 -1
- package/build/services/PhonePhotoCoordinator.d.ts.map +1 -1
- package/build/services/PhonePhotoCoordinator.js +6 -5
- package/build/services/PhonePhotoCoordinator.js.map +1 -1
- package/build/services/PhoneStreamCoordinator.d.ts.map +1 -1
- package/build/services/PhoneStreamCoordinator.js +8 -7
- package/build/services/PhoneStreamCoordinator.js.map +1 -1
- package/build/services/STTModelManager.d.ts +3 -0
- package/build/services/STTModelManager.d.ts.map +1 -1
- package/build/services/STTModelManager.js +15 -1
- package/build/services/STTModelManager.js.map +1 -1
- package/build/services/SceneRenderer.d.ts +43 -2
- package/build/services/SceneRenderer.d.ts.map +1 -1
- package/build/services/SceneRenderer.js +123 -8
- package/build/services/SceneRenderer.js.map +1 -1
- package/build/services/StreamLifecycleController.d.ts.map +1 -1
- package/build/services/StreamLifecycleController.js +6 -14
- package/build/services/StreamLifecycleController.js.map +1 -1
- package/build/services/TTSModelManager.js +1 -1
- package/build/services/TTSModelManager.js.map +1 -1
- package/build/services/UIRouter.d.ts +2 -2
- package/build/services/UIRouter.js +5 -5
- package/build/services/UIRouter.js.map +1 -1
- package/build/services/asg/galleryPathMigration.js +1 -1
- package/build/services/asg/galleryPathMigration.js.map +1 -1
- package/build/services/asg/gallerySyncService.js +2 -2
- package/build/services/asg/gallerySyncService.js.map +1 -1
- package/build/services/asg/localStorageService.d.ts.map +1 -1
- package/build/services/asg/localStorageService.js +3 -3
- package/build/services/asg/localStorageService.js.map +1 -1
- package/build/services/debug/DashboardOpenTrace.d.ts +32 -0
- package/build/services/debug/DashboardOpenTrace.d.ts.map +1 -0
- package/build/services/debug/DashboardOpenTrace.js +128 -0
- package/build/services/debug/DashboardOpenTrace.js.map +1 -0
- package/build/services/debug/dashboardOpenTimeline.d.ts +77 -0
- package/build/services/debug/dashboardOpenTimeline.d.ts.map +1 -0
- package/build/services/debug/dashboardOpenTimeline.js +195 -0
- package/build/services/debug/dashboardOpenTimeline.js.map +1 -0
- package/build/services/effectiveCapabilities.d.ts.map +1 -1
- package/build/services/effectiveCapabilities.js +25 -13
- package/build/services/effectiveCapabilities.js.map +1 -1
- package/build/services/gestureClaims.d.ts +34 -15
- package/build/services/gestureClaims.d.ts.map +1 -1
- package/build/services/gestureClaims.js +42 -21
- package/build/services/gestureClaims.js.map +1 -1
- package/build/services/manifestFields.d.ts +9 -0
- package/build/services/manifestFields.d.ts.map +1 -0
- package/build/services/manifestFields.js +26 -0
- package/build/services/manifestFields.js.map +1 -0
- package/build/services/memoryStoreInstance.d.ts +0 -10
- package/build/services/memoryStoreInstance.d.ts.map +1 -1
- package/build/services/memoryStoreInstance.js +2 -31
- package/build/services/memoryStoreInstance.js.map +1 -1
- package/build/services/mirrorSnapshot.d.ts +16 -0
- package/build/services/mirrorSnapshot.d.ts.map +1 -0
- package/build/services/mirrorSnapshot.js +102 -0
- package/build/services/mirrorSnapshot.js.map +1 -0
- package/build/services/nativeNavigationGate.d.ts +8 -0
- package/build/services/nativeNavigationGate.d.ts.map +1 -0
- package/build/services/nativeNavigationGate.js +12 -0
- package/build/services/nativeNavigationGate.js.map +1 -0
- package/build/services/notificationAppCatalog.d.ts +7 -0
- package/build/services/notificationAppCatalog.d.ts.map +1 -0
- package/build/services/notificationAppCatalog.js +16 -0
- package/build/services/notificationAppCatalog.js.map +1 -0
- package/build/services/notifications/notificationPolicy.d.ts +55 -0
- package/build/services/notifications/notificationPolicy.d.ts.map +1 -0
- package/build/services/notifications/notificationPolicy.js +41 -0
- package/build/services/notifications/notificationPolicy.js.map +1 -0
- package/build/services/pages/OverlayPages.d.ts +26 -0
- package/build/services/pages/OverlayPages.d.ts.map +1 -0
- package/build/services/pages/OverlayPages.js +80 -0
- package/build/services/pages/OverlayPages.js.map +1 -0
- package/build/services/pages/PageHost.d.ts +32 -0
- package/build/services/pages/PageHost.d.ts.map +1 -0
- package/build/services/pages/PageHost.js +99 -0
- package/build/services/pages/PageHost.js.map +1 -0
- package/build/services/pages/overlayApps.d.ts +25 -0
- package/build/services/pages/overlayApps.d.ts.map +1 -0
- package/build/services/pages/overlayApps.js +66 -0
- package/build/services/pages/overlayApps.js.map +1 -0
- package/build/services/pages/pageEligibility.d.ts +9 -0
- package/build/services/pages/pageEligibility.d.ts.map +1 -0
- package/build/services/pages/pageEligibility.js +27 -0
- package/build/services/pages/pageEligibility.js.map +1 -0
- package/build/services/settingsBridge.d.ts +58 -0
- package/build/services/settingsBridge.d.ts.map +1 -0
- package/build/services/settingsBridge.js +90 -0
- package/build/services/settingsBridge.js.map +1 -0
- package/build/services/speakerProfileStoreInstance.js +1 -1
- package/build/services/speakerProfileStoreInstance.js.map +1 -1
- package/build/services/uiShim.d.ts +1 -1
- package/build/services/uiShim.js +4 -4
- package/build/services/uiShim.js.map +1 -1
- package/build/stores/appVisibility.d.ts +28 -0
- package/build/stores/appVisibility.d.ts.map +1 -1
- package/build/stores/appVisibility.js +34 -0
- package/build/stores/appVisibility.js.map +1 -1
- package/build/stores/apps.d.ts +13 -0
- package/build/stores/apps.d.ts.map +1 -1
- package/build/stores/apps.js +66 -12
- package/build/stores/apps.js.map +1 -1
- package/build/stores/bluetoothSettingKeys.js +1 -1
- package/build/stores/bluetoothSettingKeys.js.map +1 -1
- package/build/stores/display.d.ts +3 -3
- package/build/stores/display.d.ts.map +1 -1
- package/build/stores/display.js +16 -4
- package/build/stores/display.js.map +1 -1
- package/build/stores/glasses.d.ts.map +1 -1
- package/build/stores/glasses.js +14 -1
- package/build/stores/glasses.js.map +1 -1
- package/build/stores/settings.d.ts +1 -0
- package/build/stores/settings.d.ts.map +1 -1
- package/build/stores/settings.js +170 -44
- package/build/stores/settings.js.map +1 -1
- package/build/types/applet.d.ts +14 -1
- package/build/types/applet.d.ts.map +1 -1
- package/build/types/applet.js.map +1 -1
- package/build/types/capabilities/even-realities-g2.d.ts.map +1 -1
- package/build/types/capabilities/even-realities-g2.js +5 -0
- package/build/types/capabilities/even-realities-g2.js.map +1 -1
- package/build/types/capabilities/simulated-glasses.d.ts +1 -1
- package/build/types/capabilities/simulated-glasses.d.ts.map +1 -1
- package/build/types/capabilities/simulated-glasses.js +7 -4
- package/build/types/capabilities/simulated-glasses.js.map +1 -1
- package/build/types/hardware.d.ts +20 -1
- package/build/types/hardware.d.ts.map +1 -1
- package/build/types/hardware.js +2 -0
- package/build/types/hardware.js.map +1 -1
- package/build/types/index.d.ts +1 -0
- package/build/types/index.d.ts.map +1 -1
- package/build/types/index.js +1 -0
- package/build/types/index.js.map +1 -1
- package/build/utils/debouncedPatch.d.ts +3 -1
- package/build/utils/debouncedPatch.d.ts.map +1 -1
- package/build/utils/debouncedPatch.js +6 -3
- package/build/utils/debouncedPatch.js.map +1 -1
- package/build/utils/devMiniappLaunch.d.ts.map +1 -1
- package/build/utils/devMiniappLaunch.js +4 -3
- package/build/utils/devMiniappLaunch.js.map +1 -1
- package/build/utils/display/measurer/TextMeasurer.d.ts +2 -159
- package/build/utils/display/measurer/TextMeasurer.d.ts.map +1 -1
- package/build/utils/display/measurer/TextMeasurer.js +2 -272
- package/build/utils/display/measurer/TextMeasurer.js.map +1 -1
- package/build/utils/display/measurer/script-detection.d.ts +1 -52
- package/build/utils/display/measurer/script-detection.d.ts.map +1 -1
- package/build/utils/display/measurer/script-detection.js +2 -183
- package/build/utils/display/measurer/script-detection.js.map +1 -1
- package/build/utils/display/pixelArt.d.ts +3 -0
- package/build/utils/display/pixelArt.d.ts.map +1 -0
- package/build/utils/display/pixelArt.js +3 -0
- package/build/utils/display/pixelArt.js.map +1 -0
- package/build/utils/display/profiles/g1.d.ts +1 -32
- package/build/utils/display/profiles/g1.d.ts.map +1 -1
- package/build/utils/display/profiles/g1.js +2 -212
- package/build/utils/display/profiles/g1.js.map +1 -1
- package/build/utils/display/profiles/g2.d.ts +1 -12
- package/build/utils/display/profiles/g2.d.ts.map +1 -1
- package/build/utils/display/profiles/g2.js +2 -33
- package/build/utils/display/profiles/g2.js.map +1 -1
- package/build/utils/display/profiles/nex.d.ts +1 -9
- package/build/utils/display/profiles/nex.d.ts.map +1 -1
- package/build/utils/display/profiles/nex.js +2 -149
- package/build/utils/display/profiles/nex.js.map +1 -1
- package/build/utils/display/profiles/types.d.ts +1 -102
- package/build/utils/display/profiles/types.d.ts.map +1 -1
- package/build/utils/display/profiles/types.js.map +1 -1
- package/build/utils/display/profiles/z100.d.ts +1 -32
- package/build/utils/display/profiles/z100.d.ts.map +1 -1
- package/build/utils/display/profiles/z100.js +2 -181
- package/build/utils/display/profiles/z100.js.map +1 -1
- package/build/utils/display/scene/degrade.d.ts.map +1 -1
- package/build/utils/display/scene/degrade.js +4 -1
- package/build/utils/display/scene/degrade.js.map +1 -1
- package/build/utils/display/scene/differ.d.ts +13 -1
- package/build/utils/display/scene/differ.d.ts.map +1 -1
- package/build/utils/display/scene/differ.js +22 -0
- package/build/utils/display/scene/differ.js.map +1 -1
- package/build/utils/display/scene/index.d.ts +1 -1
- package/build/utils/display/scene/index.d.ts.map +1 -1
- package/build/utils/display/scene/index.js.map +1 -1
- package/build/utils/display/scene/process.d.ts.map +1 -1
- package/build/utils/display/scene/process.js +183 -11
- package/build/utils/display/scene/process.js.map +1 -1
- package/build/utils/display/scene/store.d.ts +1 -1
- package/build/utils/display/scene/store.d.ts.map +1 -1
- package/build/utils/display/scene/store.js +0 -0
- package/build/utils/display/scene/store.js.map +1 -1
- package/build/utils/display/scene/svgPath.d.ts +9 -0
- package/build/utils/display/scene/svgPath.d.ts.map +1 -0
- package/build/utils/display/scene/svgPath.js +167 -0
- package/build/utils/display/scene/svgPath.js.map +1 -0
- package/build/utils/display/scene/types.d.ts +2 -142
- package/build/utils/display/scene/types.d.ts.map +1 -1
- package/build/utils/display/scene/types.js +0 -0
- package/build/utils/display/scene/types.js.map +1 -1
- package/build/utils/display/wrapper/TextWrapper.d.ts +1 -101
- package/build/utils/display/wrapper/TextWrapper.d.ts.map +1 -1
- package/build/utils/display/wrapper/TextWrapper.js +2 -470
- package/build/utils/display/wrapper/TextWrapper.js.map +1 -1
- package/build/utils/display/wrapper/types.d.ts +2 -74
- package/build/utils/display/wrapper/types.d.ts.map +1 -1
- package/build/utils/display/wrapper/types.js +2 -10
- package/build/utils/display/wrapper/types.js.map +1 -1
- package/build/utils/hardware/hardware.js +1 -1
- package/build/utils/hardware/hardware.js.map +1 -1
- package/build/utils/timers/timers.d.ts.map +1 -1
- package/build/utils/timers/timers.js +26 -4
- package/build/utils/timers/timers.js.map +1 -1
- package/package.json +8 -8
- package/src/engine.ts +24 -15
- package/src/facades/dev.ts +10 -0
- package/src/facades/display.ts +21 -8
- package/src/facades/displayMirror.ts +29 -0
- package/src/facades/glasses.ts +61 -1
- package/src/facades/memory.ts +1 -12
- package/src/facades/miniapps.ts +4 -1
- package/src/facades/pairing.ts +8 -6
- package/src/facades/permissions.ts +46 -0
- package/src/facades/phoneNotifications.ts +45 -26
- package/src/facades/settings.ts +1 -2
- package/src/generated/releaseMetadata.ts +4 -4
- package/src/index.ts +6 -9
- package/src/react/MentraLiveOtaFlow.tsx +2 -2
- package/src/react/useMentraLiveOta.ts +14 -8
- package/src/runtime/config.ts +1 -1
- package/src/services/AppRegistry.ts +43 -7
- package/src/services/BlobStore.ts +3 -3
- package/src/services/CloudClientService.ts +37 -10
- package/src/services/DevServerBridge.ts +12 -10
- package/src/services/DeviceEventRouter.ts +73 -74
- package/src/services/DisplayDiagnostics.ts +107 -0
- package/src/services/DisplayProcessor.ts +20 -55
- package/src/services/GestureDotsService.ts +77 -16
- package/src/services/GlassesKeyboardInput.ts +306 -0
- package/src/services/GlassesSensorService.ts +233 -0
- package/src/services/GlassesTouchInput.ts +128 -0
- package/src/services/HeadingService.ts +0 -24
- package/src/services/HotspotShutdown.ts +3 -1
- package/src/services/JSCrashloopReportService.ts +2 -2
- package/src/services/JSRouter.ts +29 -14
- package/src/services/LocalDisplayManager.ts +112 -26
- package/src/services/LocalMiniappDataMigration.ts +1 -1
- package/src/services/LocalMiniappRuntime.ts +500 -43
- package/src/services/LocalSttFallbackCoordinator.ts +28 -7
- package/src/services/MemoryStore.ts +32 -80
- package/src/services/MiniappEngine.ts +7 -7
- package/src/services/MiniappLauncher.ts +25 -1
- package/src/services/MirrorService.ts +139 -0
- package/src/services/NativeNavigationService.ts +29 -25
- package/src/services/NavigationHandlers.ts +10 -5
- package/src/services/OtaInstallCoordinator.ts +36 -34
- package/src/services/PairedGlassesLatch.ts +39 -0
- package/src/services/PhoneActivity.ts +116 -0
- package/src/services/PhoneCameraFovCoordinator.ts +6 -4
- package/src/services/PhoneNotificationsSync.ts +185 -103
- package/src/services/PhonePhotoCoordinator.ts +9 -10
- package/src/services/PhoneStreamCoordinator.ts +13 -11
- package/src/services/STTModelManager.ts +15 -1
- package/src/services/SceneRenderer.ts +148 -10
- package/src/services/StreamLifecycleController.ts +9 -7
- package/src/services/TTSModelManager.ts +1 -1
- package/src/services/UIRouter.ts +5 -5
- package/src/services/asg/galleryPathMigration.ts +1 -1
- package/src/services/asg/gallerySyncService.ts +2 -2
- package/src/services/asg/localStorageService.ts +3 -3
- package/src/services/debug/DashboardOpenTrace.ts +153 -0
- package/src/services/debug/dashboardOpenTimeline.ts +237 -0
- package/src/services/effectiveCapabilities.ts +32 -13
- package/src/services/gestureClaims.ts +72 -23
- package/src/services/manifestFields.ts +23 -0
- package/src/services/memoryStoreInstance.ts +2 -34
- package/src/services/mirrorSnapshot.ts +116 -0
- package/src/services/nativeNavigationGate.ts +14 -0
- package/src/services/notificationAppCatalog.ts +21 -0
- package/src/services/notifications/notificationPolicy.ts +87 -0
- package/src/services/pages/OverlayPages.ts +86 -0
- package/src/services/pages/PageHost.ts +116 -0
- package/src/services/pages/overlayApps.ts +72 -0
- package/src/services/pages/pageEligibility.ts +30 -0
- package/src/services/settingsBridge.ts +111 -0
- package/src/services/speakerProfileStoreInstance.ts +1 -1
- package/src/services/uiShim.ts +4 -4
- package/src/stores/appVisibility.ts +45 -0
- package/src/stores/apps.ts +110 -32
- package/src/stores/bluetoothSettingKeys.ts +1 -1
- package/src/stores/display.ts +18 -7
- package/src/stores/glasses.ts +15 -1
- package/src/stores/settings.ts +175 -51
- package/src/types/applet.ts +14 -1
- package/src/types/capabilities/even-realities-g2.ts +6 -0
- package/src/types/capabilities/simulated-glasses.ts +8 -4
- package/src/types/hardware.ts +34 -1
- package/src/types/index.ts +1 -0
- package/src/utils/debouncedPatch.ts +8 -4
- package/src/utils/devMiniappLaunch.ts +5 -3
- package/src/utils/display/measurer/TextMeasurer.ts +3 -346
- package/src/utils/display/measurer/script-detection.ts +10 -218
- package/src/utils/display/pixelArt.ts +3 -0
- package/src/utils/display/profiles/g1.ts +2 -236
- package/src/utils/display/profiles/g2.ts +2 -39
- package/src/utils/display/profiles/nex.ts +2 -166
- package/src/utils/display/profiles/types.ts +9 -132
- package/src/utils/display/profiles/z100.ts +2 -198
- package/src/utils/display/scene/degrade.ts +4 -1
- package/src/utils/display/scene/differ.ts +25 -1
- package/src/utils/display/scene/index.ts +5 -0
- package/src/utils/display/scene/process.ts +196 -13
- package/src/utils/display/scene/store.ts +0 -0
- package/src/utils/display/scene/svgPath.ts +163 -0
- package/src/utils/display/scene/types.ts +0 -0
- package/src/utils/display/wrapper/TextWrapper.ts +2 -546
- package/src/utils/display/wrapper/types.ts +3 -102
- package/src/utils/hardware/hardware.ts +1 -1
- package/src/utils/timers/timers.ts +32 -4
- package/build/services/CustomDashboardModel.d.ts +0 -48
- package/build/services/CustomDashboardModel.d.ts.map +0 -1
- package/build/services/CustomDashboardModel.js +0 -73
- package/build/services/CustomDashboardModel.js.map +0 -1
- package/build/services/CustomDashboardService.d.ts +0 -63
- package/build/services/CustomDashboardService.d.ts.map +0 -1
- package/build/services/CustomDashboardService.js +0 -576
- package/build/services/CustomDashboardService.js.map +0 -1
- package/build/services/DashboardCoordinator.d.ts +0 -26
- package/build/services/DashboardCoordinator.d.ts.map +0 -1
- package/build/services/DashboardCoordinator.js +0 -125
- package/build/services/DashboardCoordinator.js.map +0 -1
- package/build/services/iosNotificationAppCatalog.d.ts +0 -13
- package/build/services/iosNotificationAppCatalog.d.ts.map +0 -1
- package/build/services/iosNotificationAppCatalog.js +0 -28
- package/build/services/iosNotificationAppCatalog.js.map +0 -1
- package/src/services/CustomDashboardModel.ts +0 -83
- package/src/services/CustomDashboardService.ts +0 -598
- package/src/services/DashboardCoordinator.ts +0 -121
- package/src/services/iosNotificationAppCatalog.ts +0 -39
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudClientService.js","sourceRoot":"","sources":["../../src/services/CloudClientService.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owns the singleton `@glassly/cloud-client` (CloudClient) for the engine runtime\n * — the keystone move that pulls backend comms INTO engine.\n *\n * engine constructs the client from engine-owned pieces (the native UDP socket,\n * the MMKV secure store, the cloud-status store) plus the two things the host\n * provides through the engine front door: `auth.getSubjectToken` (the one\n * permanent seam — the OEM owns login) and the resolved cloud endpoints\n * (`config.coreUrl/runtimeUrl`, computed host-side from dev/settings). On init it\n * exposes cloud runtime methods directly from this service, so the host no longer\n * injects a cloud adapter — engine owns construction and wiring.\n *\n * The local-miniapp path drives the cloud's transcription/translation through\n * this service.\n */\nimport {CloudClient, setNativeHttp, setNativeUdp, setSecureStorage} from \"@glassly/cloud-client/react-native\"\nimport type {PreinstalledMiniappRegistry, RuntimeSnapshot} from \"@glassly/cloud-client/react-native\"\nimport type {SubjectTokenType} from \"@glassly/cloud-client\"\nimport {Platform} from \"react-native\"\nimport type {AudioSubscription, QuotaStatusPayload, TranscriptionData, TranslationData} from \"@glassly/cloud-protocol\"\n\nimport BluetoothSdk from \"@glassly/bluetooth-sdk/internal\"\nimport CrustModule from \"@glassly/crust\"\nimport {getAuth, getConfigValues} from \"../runtime/bootstrap\"\nimport {useSettingsStore, SETTINGS} from \"../stores/settings\"\nimport {type CloudClientStatusSnapshot, type MiniappAuthToken} from \"../runtime/config\"\nimport {createCloudUdpSocket} from \"../utils/cloudClient/RnUdpAdapter\"\nimport {cloudSecureStore} from \"../utils/cloudClient/cloudSecureStore\"\nimport {storage as mmkvStorage} from \"../utils/storage\"\nimport {useCloudClientStatusStore} from \"../stores/cloudClientStatus\"\nimport {islandNotifications} from \"./NotificationsEmitter\"\nimport {BgTimer} from \"../utils/timers\"\nimport {logCloudV2TranscriptMetric} from \"./CloudTranscriptE2EMetrics\"\nimport {isLocalUserId, LocalMiniappUserIdentity} from \"./LocalMiniappUserIdentity\"\nimport {migrateLocalMiniappData, type LocalMiniappDataMigrationBackend} from \"./LocalMiniappDataMigration\"\nimport {nativeHttpResponseBody} from \"./NativeHttpResponse\"\n\nconst LOG_TAG = \"cloudClient\"\ntype CloudCore = NonNullable<CloudClient[\"core\"]>\n\n// Persistent cloud-disconnect detector: the cloud-client reconnect loop is infinite\n// and never surfaces a \"giving up\" signal, so \"persistent failure\" = the session has\n// been continuously NOT connected for this long. A quick reconnect cancels it; brief\n// flaps that recover don't fire. Raised as engine.notifications(connection_failed_persistent).\nconst CLOUD_PERSISTENT_FAILURE_MS = 60_000\nconst LOCAL_MINIAPP_USER_ID_KEY = \"glassly.localMiniapp.userId\"\n\n/** Cancel the pending persistent-failure alarm + re-arm for the next outage. */\nfunction clearPersistentFailureAlarm(): void {\n if (persistentFailureTimer) {\n BgTimer.clearTimeout(persistentFailureTimer)\n persistentFailureTimer = null\n }\n persistentFailureNotified = false\n}\n\ntype Lc3FrameSizeBytes = 20 | 40 | 60\n\n// Neutral last-ditch fallbacks (reachable under `adb reverse`) for when the host\n// passes no endpoints. The host normally resolves the real URLs (dev override /\n// Metro host / env) and hands them in via `engine.configure({config})`.\nconst FALLBACK_CORE_URL = \"http://localhost:3000\"\nconst FALLBACK_RUNTIME_URL = \"http://localhost:3001\"\nconst LOCAL_AUTH_PORT = 3002\n\nlet client: CloudClient | null = null\nlet connected = false\nlet persistentFailureTimer: ReturnType<typeof BgTimer.setTimeout> | null = null\nlet persistentFailureNotified = false\nlet audioSubscriptions: AudioSubscription[] = []\nlet transportsReady = false\n/** Endpoints to build with — seeded from config, overridable via reconnect(). */\nlet endpointsOverride: {core: string; runtime: string} | null = null\nlet runtimeStatusUnsubscribe: (() => void) | null = null\nlet transcriptUnsubscribe: (() => void) | null = null\nlet translationUnsubscribe: (() => void) | null = null\nlet quotaUnsubscribe: (() => void) | null = null\nlet authStateUnsubscribe: (() => void) | null = null\nlet localDevRuntimeToken: {runtimeUrl: string; token: string; expiresAtMs: number} | null = null\nlet lc3FrameSizeUnsubscribe: (() => void) | null = null\nlet disableCloudUnsubscribe: (() => void) | null = null\nlet coreTokenSyncPromise: Promise<string> | null = null\n/**\n * A device-local namespace (`local_…`) whose data still needs to be adopted\n * into the account namespace. Set when a sign-in displaces a local id; cleared\n * once {@link adoptLocalNamespace} has moved the data.\n */\nlet pendingLocalNamespace: string | null = null\n\n/**\n * Moves blob bytes between user directories during namespace adoption.\n * Registered by LocalMiniappRuntime (which owns the BlobStore instance) so this\n * service doesn't import it and create a cycle. Absent in tests / before the\n * runtime boots, in which case only the key-value stores migrate.\n */\ntype BlobNamespaceMigrator = (fromUserId: string, toUserId: string) => {moved: number; skipped: number}\nlet blobNamespaceMigrator: BlobNamespaceMigrator | null = null\n\n/**\n * Register the blob-bytes half of namespace adoption. Called by\n * LocalMiniappRuntime at construction — it owns the BlobStore instance, and\n * having it push the hook here keeps this service from importing the runtime.\n */\nexport function setBlobNamespaceMigrator(migrator: BlobNamespaceMigrator | null): void {\n blobNamespaceMigrator = migrator\n}\n\n/** Result-free view of MMKV, as the migration's plain get/set/remove/keys. */\nconst migrationBackend: LocalMiniappDataMigrationBackend = {\n get(key: string): unknown | null {\n const result = mmkvStorage.load<unknown>(key)\n return result.is_ok() ? result.value : null\n },\n set(key: string, value: unknown): void {\n const result = mmkvStorage.save(key, value)\n if (result.is_error()) throw result.error\n },\n remove(key: string): void {\n const result = mmkvStorage.remove(key)\n if (result.is_error()) throw result.error\n },\n keys(): string[] {\n return mmkvStorage.getAllKeys()\n },\n}\n\n/**\n * Adopt data written under a device-local namespace into the signed-in\n * account's, so miniapp state created while cloud was disabled survives\n * sign-in. No-op unless a sign-in actually displaced a local id.\n */\nfunction adoptLocalNamespace(coreUserId: string): void {\n const from = pendingLocalNamespace\n if (!from) return\n // Clear first: a failure must not re-run on every subsequent resolve, and the\n // migration is idempotent anyway.\n pendingLocalNamespace = null\n if (!coreUserId || from === coreUserId) return\n\n try {\n const keys = migrateLocalMiniappData(migrationBackend, from, coreUserId)\n const blobs = blobNamespaceMigrator?.(from, coreUserId) ?? {moved: 0, skipped: 0}\n if (keys.moved || keys.skipped || blobs.moved || blobs.skipped) {\n console.log(\n `${LOG_TAG}: adopted local miniapp data into account namespace ` +\n `(keys ${keys.moved} moved/${keys.skipped} skipped, blobs ${blobs.moved} moved/${blobs.skipped} skipped)`,\n )\n }\n } catch (err) {\n console.warn(`${LOG_TAG}: local namespace adoption failed: ${(err as Error)?.message ?? err}`)\n }\n}\n\nconst localMiniappUserIdentity = new LocalMiniappUserIdentity({\n get(): string | null {\n const result = mmkvStorage.load<string>(LOCAL_MINIAPP_USER_ID_KEY)\n return result.is_ok() ? result.value : null\n },\n set(userId: string): void {\n const result = mmkvStorage.save(LOCAL_MINIAPP_USER_ID_KEY, userId)\n if (result.is_error()) throw result.error\n },\n remove(): void {\n const result = mmkvStorage.remove(LOCAL_MINIAPP_USER_ID_KEY)\n if (result.is_error()) throw result.error\n },\n})\n\nconst transcriptListeners = new Set<(d: TranscriptionData) => void>()\nconst translationListeners = new Set<(d: TranslationData) => void>()\nconst quotaListeners = new Set<(d: QuotaStatusPayload) => void>()\nconst statusListeners = new Set<(snapshot: CloudClientStatusSnapshot) => void>()\nconst connectionListeners = new Set<(connected: boolean) => void>()\n\nfunction resolveEndpoints(): {core: string; runtime: string} {\n if (endpointsOverride) return endpointsOverride\n const cfg = getConfigValues()\n return {\n core: cfg.coreUrl?.trim() || FALLBACK_CORE_URL,\n runtime: cfg.runtimeUrl?.trim() || FALLBACK_RUNTIME_URL,\n }\n}\n\nfunction getCoreClient(): CloudCore {\n if (!client) construct()\n const core = client?.core\n if (!core) throw new Error(\"cloud client core not configured\")\n return core\n}\n\nfunction syncCoreAccessTokenToBluetooth(): Promise<string> {\n if (coreTokenSyncPromise) return coreTokenSyncPromise\n\n coreTokenSyncPromise = syncCoreAccessTokenToBluetoothInternal().finally(() => {\n coreTokenSyncPromise = null\n })\n return coreTokenSyncPromise\n}\n\nasync function syncCoreAccessTokenToBluetoothInternal(): Promise<string> {\n if (!client) construct()\n const c = client\n if (!c) throw new Error(\"cloud client not initialized\")\n\n const token = await c.auth.getCoreToken()\n if (c !== client) {\n throw new Error(\"cloud client changed while syncing core token\")\n }\n adoptLocalNamespace(c.auth.identity.glasslyUserId)\n localMiniappUserIdentity.remember(c.auth.identity.glasslyUserId)\n const result = await useSettingsStore.getState().setSetting(SETTINGS.core_token.key, token, false)\n if (result.is_error()) {\n throw result.error\n }\n\n try {\n await BluetoothSdk.updateBluetoothSettings({[SETTINGS.core_token.key]: token})\n } catch (err) {\n console.warn(`${LOG_TAG}: direct Bluetooth core_token sync failed: ${(err as Error)?.message ?? err}`)\n }\n\n return token\n}\n\nfunction frameSizeBytes(): Lc3FrameSizeBytes {\n // Read LIVE from the engine settings store (the source of truth) so a\n // reconnect after a glasses swap (G1=20 ↔ G2=40) picks up the new frame size,\n // not the one-time engine.configure({config}) snapshot. Falls back to the\n // config value (set at boot) then 20 when the setting is unset.\n const fromSettings = useSettingsStore.getState().getSetting(SETTINGS.lc3_frame_size.key)\n const size = fromSettings ?? getConfigValues().audioFrameSizeBytes\n return size === 20 || size === 40 || size === 60 ? size : 20\n}\n\nasync function getSubjectToken(): Promise<{token: string; type: SubjectTokenType}> {\n const a = getAuth()\n if (!a) throw new Error(\"cloudClient: engine.configure({auth}) not called\")\n const r = await a.getSubjectToken()\n // IslandAuth's SubjectTokenType is intentionally open (`string & {}`) so OEMs\n // can use other token kinds; cloud-client's is a closed union. The host's\n // actual value (\"supabase\") is valid — narrow at this boundary.\n return {token: r.token, type: r.type as SubjectTokenType}\n}\n\nfunction normalizeExpiresAt(expiresAt: number): number {\n return expiresAt < 10_000_000_000 ? expiresAt * 1000 : expiresAt\n}\n\nfunction shouldUseLocalDevRuntimeToken(endpoints: {runtime: string}): boolean {\n if (!__DEV__) return false\n try {\n const host = new URL(endpoints.runtime).hostname\n return host === \"localhost\" || host === \"127.0.0.1\" || host === \"10.0.2.2\"\n } catch {\n return false\n }\n}\n\nasync function getLocalDevRuntimeToken(runtimeEndpoint: string, opts?: {forceRefresh?: boolean}): Promise<string> {\n const now = Date.now()\n if (\n !opts?.forceRefresh &&\n localDevRuntimeToken?.runtimeUrl === runtimeEndpoint &&\n localDevRuntimeToken.expiresAtMs - now > 60_000\n ) {\n return localDevRuntimeToken.token\n }\n\n const base = new URL(runtimeEndpoint)\n base.port = String(LOCAL_AUTH_PORT)\n base.pathname = \"/api/dev/runtime-token\"\n base.search = new URLSearchParams({userId: \"local-phone-user\", tenantId: \"glassly\"}).toString()\n\n const res = await fetch(base.toString())\n if (!res.ok) {\n throw new Error(`cloudClient: local dev runtime token failed (${res.status})`)\n }\n const body = (await res.json()) as {access_token?: string; expires_in?: number}\n if (!body.access_token) {\n throw new Error(\"cloudClient: local dev runtime token response missing access_token\")\n }\n localDevRuntimeToken = {\n runtimeUrl: runtimeEndpoint,\n token: body.access_token,\n expiresAtMs: now + (body.expires_in ?? 300) * 1000,\n }\n return body.access_token\n}\n\nfunction toCloudClientStatusSnapshot(snapshot: RuntimeSnapshot): CloudClientStatusSnapshot {\n return {status: snapshot.status, audioTransport: snapshot.audioTransport}\n}\n\nfunction currentRuntimeStatus(): CloudClientStatusSnapshot {\n const state = useCloudClientStatusStore.getState()\n return {status: state.status, audioTransport: state.audioTransport}\n}\n\nfunction setRuntimeStatus(snapshot: RuntimeSnapshot): void {\n useCloudClientStatusStore.getState().setSnapshot(snapshot)\n emitStatus(toCloudClientStatusSnapshot(snapshot))\n}\n\nfunction resetRuntimeStatus(): void {\n useCloudClientStatusStore.getState().reset()\n emitStatus(currentRuntimeStatus())\n}\n\nfunction stringifyMeta(meta: unknown): string {\n if (!meta || typeof meta !== \"object\") return \"\"\n try {\n return ` ${JSON.stringify(meta)}`\n } catch {\n return \"\"\n }\n}\n\nconst cloudLogger = {\n debug: (msg: string, meta?: unknown) => console.log(`${LOG_TAG}: debug: ${msg}${stringifyMeta(meta)}`),\n info: (msg: string, meta?: unknown) => console.log(`${LOG_TAG}: info: ${msg}${stringifyMeta(meta)}`),\n warn: (msg: string, meta?: unknown) => console.warn(`${LOG_TAG}: warn: ${msg}${stringifyMeta(meta)}`),\n error: (msg: string, meta?: unknown) => console.warn(`${LOG_TAG}: error: ${msg}${stringifyMeta(meta)}`),\n}\n\nfunction notifyConnectionListeners(next: boolean): void {\n for (const l of connectionListeners) {\n try {\n l(next)\n } catch (err) {\n console.warn(`${LOG_TAG}: connection listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction extractUnsubscribe(sub: unknown): (() => void) | null {\n const candidates: unknown[] = []\n const s = sub as Record<string, unknown> | null | undefined\n if (s && typeof s === \"object\") {\n candidates.push(s)\n candidates.push((s.value as Record<string, unknown>)?.subscription)\n candidates.push((s.data as Record<string, unknown>)?.subscription)\n candidates.push(s.subscription)\n }\n for (const c of candidates) {\n const unsub = (c as {unsubscribe?: unknown})?.unsubscribe\n if (typeof unsub === \"function\") return unsub as () => void\n }\n return null\n}\n\nfunction ensureAuthWatch(): void {\n if (authStateUnsubscribe) return\n authStateUnsubscribe = () => {}\n\n const auth = getAuth()\n if (!auth?.onStateChange) return\n\n let reconnectPending = false\n try {\n const sub = auth.onStateChange((event, session) => {\n if (event === \"SIGNED_OUT\") {\n localMiniappUserIdentity.forget()\n return\n }\n // A new sign-in may belong to a different account. Force the next\n // storage request to resolve and persist that account's Core identity.\n // A device-local namespace is remembered first so the data written while\n // cloud was off can follow the user into the account (see\n // adoptLocalNamespace).\n if (event === \"SIGNED_IN\") {\n const local = localMiniappUserIdentity.get()\n if (local && isLocalUserId(local)) pendingLocalNamespace = local\n localMiniappUserIdentity.forget()\n }\n if (!session?.token) return\n if (connected || reconnectPending) return\n\n reconnectPending = true\n console.log(`${LOG_TAG}: auth session available (${event}) while disconnected — reconnecting`)\n try {\n cloudClientService.reconnect()\n } finally {\n setTimeout(() => {\n reconnectPending = false\n }, 0)\n }\n })\n\n const unsub = extractUnsubscribe(sub)\n if (unsub) authStateUnsubscribe = unsub\n } catch (err) {\n console.warn(`${LOG_TAG}: auth watch subscribe failed: ${(err as Error)?.message ?? err}`)\n }\n}\n\nfunction stopAuthWatch(): void {\n authStateUnsubscribe?.()\n authStateUnsubscribe = null\n}\n\nfunction emitTranscript(data: TranscriptionData): void {\n for (const l of transcriptListeners) {\n try {\n l(data)\n } catch (err) {\n console.warn(`${LOG_TAG}: transcript listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction emitTranslation(data: TranslationData): void {\n for (const l of translationListeners) {\n try {\n l(data)\n } catch (err) {\n console.warn(`${LOG_TAG}: translation listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction emitQuota(data: QuotaStatusPayload): void {\n for (const l of quotaListeners) {\n try {\n l(data)\n } catch (err) {\n console.warn(`${LOG_TAG}: quota listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction emitStatus(snapshot: CloudClientStatusSnapshot): void {\n for (const l of statusListeners) {\n try {\n l(snapshot)\n } catch (err) {\n console.warn(`${LOG_TAG}: status listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction ensureTransports(): void {\n if (transportsReady) return\n transportsReady = true\n setNativeUdp(() => createCloudUdpSocket())\n setSecureStorage(cloudSecureStore)\n if (Platform.OS !== \"android\") return\n setNativeHttp(async (input, init) => {\n if (typeof input !== \"string\" || (init?.body != null && typeof init.body !== \"string\")) {\n return globalThis.fetch(input, init)\n }\n const headers = Object.fromEntries(new Headers(init?.headers).entries())\n const result = await CrustModule.nativeHttpRequest(\n init?.method ?? \"GET\",\n input,\n headers,\n (init?.body as string | undefined) ?? null,\n )\n return new Response(nativeHttpResponseBody(result.status, result.body), {\n status: result.status,\n statusText: result.statusText,\n headers: result.headers,\n })\n })\n}\n\nfunction clearRuntimeEventSubscriptions(): void {\n runtimeStatusUnsubscribe?.()\n runtimeStatusUnsubscribe = null\n transcriptUnsubscribe?.()\n transcriptUnsubscribe = null\n translationUnsubscribe?.()\n translationUnsubscribe = null\n quotaUnsubscribe?.()\n quotaUnsubscribe = null\n}\n\n/**\n * The user's hard \"never talk to Glassly cloud\" stance (Settings > Privacy).\n * Read imperatively at every would-be-connect point rather than cached, so\n * flipping the toggle takes effect without a restart. `=== true` because\n * getSetting is `any` and an unhydrated store must not read as \"disabled\".\n */\nfunction cloudDisabled(): boolean {\n return useSettingsStore.getState().getSetting(SETTINGS.disable_cloud.key) === true\n}\n\nfunction startLc3FrameSizeWatcher(): void {\n if (lc3FrameSizeUnsubscribe) return\n\n let last = frameSizeBytes()\n lc3FrameSizeUnsubscribe = useSettingsStore.subscribe(\n (state) => state.getSetting(SETTINGS.lc3_frame_size.key),\n () => {\n const next = frameSizeBytes()\n if (next === last) return\n last = next\n if (!client) return\n console.log(`${LOG_TAG}: LC3 frame size changed to ${next}; reconnecting runtime`)\n cloudClientService.reconnect()\n },\n )\n}\n\nfunction stopLc3FrameSizeWatcher(): void {\n lc3FrameSizeUnsubscribe?.()\n lc3FrameSizeUnsubscribe = null\n}\n\n/**\n * Apply a mid-session flip of the Privacy toggle without a restart: turning it\n * on tears the live client down, turning it back off reconnects. Installed by\n * init() on BOTH branches — when cloud starts disabled there is no client to\n * hang the watcher off, but we still need to notice the user re-enabling it.\n */\nfunction startDisableCloudWatcher(): void {\n if (disableCloudUnsubscribe) return\n\n let last = cloudDisabled()\n disableCloudUnsubscribe = useSettingsStore.subscribe(\n (state) => state.getSetting(SETTINGS.disable_cloud.key),\n () => {\n const next = cloudDisabled()\n if (next === last) return\n last = next\n if (next) {\n console.log(`${LOG_TAG}: cloud disabled — tearing down client`)\n cloudClientService.stop()\n } else {\n console.log(`${LOG_TAG}: cloud re-enabled — reconnecting`)\n cloudClientService.init()\n }\n },\n )\n}\n\nfunction stopDisableCloudWatcher(): void {\n disableCloudUnsubscribe?.()\n disableCloudUnsubscribe = null\n}\n\nfunction construct(): void {\n ensureTransports()\n\n const endpoints = resolveEndpoints()\n console.log(`${LOG_TAG}: endpoints ${JSON.stringify(endpoints)}`)\n\n const coreAuth = {getSubjectToken}\n const auth = shouldUseLocalDevRuntimeToken(endpoints)\n ? {\n core: coreAuth,\n runtime: {getToken: (opts?: {forceRefresh?: boolean}) => getLocalDevRuntimeToken(endpoints.runtime, opts)},\n }\n : {core: coreAuth, runtime: {source: \"core\" as const}}\n\n client = new CloudClient({\n endpoints,\n // The phone LC3-encodes mic audio (even in phone/simulated mode); announce\n // LC3 at 16 kHz with the frame size the encoder emits.\n audio: {codec: \"lc3\", sampleRate: 16000, frameSizeBytes: frameSizeBytes()},\n auth,\n timers: {\n setTimeout: (callback, delayMs) => BgTimer.setTimeout(callback, delayMs),\n clearTimeout: (handle) => BgTimer.clearTimeout(handle as number),\n setInterval: (callback, intervalMs) => BgTimer.setInterval(callback, intervalMs),\n clearInterval: (handle) => BgTimer.clearInterval(handle as number),\n },\n logger: cloudLogger,\n })\n\n const c = client\n clearRuntimeEventSubscriptions()\n runtimeStatusUnsubscribe = c.runtime.onStatusChanged((status) => {\n if (c !== client) return\n setRuntimeStatus(status)\n })\n transcriptUnsubscribe = c.runtime.onTranscript((data) => {\n if (c !== client) return\n logCloudV2TranscriptMetric(data)\n emitTranscript(data)\n })\n translationUnsubscribe = c.runtime.onTranslation((data) => {\n if (c !== client) return\n emitTranslation(data)\n })\n quotaUnsubscribe = c.runtime.onQuota((data) => {\n if (c !== client) return\n emitQuota(data)\n })\n setRuntimeStatus(c.runtime.getStatus())\n\n c.runtime.onConnected(() => {\n if (c !== client) return\n connected = true\n console.log(`${LOG_TAG}: runtime connected`)\n console.log(`${LOG_TAG}: debug: ws-session-debug connected`)\n // Cloud is up — cancel any pending persistent-failure alarm and re-arm for the\n // next outage.\n clearPersistentFailureAlarm()\n // Re-apply the authoritative subscription set, including the empty set, so\n // a fresh phone launch clears any stale server-side audio subscriptions.\n c.runtime\n .setSubscriptions(audioSubscriptions)\n .catch((err) =>\n console.warn(`${LOG_TAG}: re-applying queued subscriptions failed: ${(err as Error)?.message ?? err}`),\n )\n notifyConnectionListeners(true)\n })\n c.runtime.onDisconnected((info) => {\n if (c !== client) return\n connected = false\n console.log(`${LOG_TAG}: runtime disconnected (${info.reason})`)\n console.log(\n `${LOG_TAG}: debug: ws-session-debug disconnected reason=${info.reason} willStayDown=${/superseded by newer session/i.test(info.reason)}`,\n )\n // Arm the persistent-failure alarm once; if we're still down when it fires, raise\n // the notification. A reconnect within the window cancels it (onConnected above).\n if (!persistentFailureTimer && !persistentFailureNotified) {\n persistentFailureTimer = BgTimer.setTimeout(() => {\n persistentFailureTimer = null\n if (connected) return\n persistentFailureNotified = true\n islandNotifications.emit({\n kind: \"connection_failed_persistent\",\n reason: `Cloud session has been disconnected for over ${Math.round(CLOUD_PERSISTENT_FAILURE_MS / 1000)}s`,\n metadata: {downForMs: CLOUD_PERSISTENT_FAILURE_MS, lastReason: info.reason},\n timestamp: Date.now(),\n })\n }, CLOUD_PERSISTENT_FAILURE_MS)\n }\n notifyConnectionListeners(false)\n })\n c.runtime.onError((err) => {\n console.warn(`${LOG_TAG}: runtime error: ${err.code}`)\n })\n\n // Dead credentials (refresh AND subject exchange both failed). Surface to\n // the host so it can force a re-login — otherwise the app looks signed-in\n // while every cloud feature silently fails. Fires at most once per client\n // instance (the auth module latches until a successful exchange).\n c.auth.onExpired(() => {\n if (c !== client) return\n console.warn(`${LOG_TAG}: cloud session expired beyond recovery — notifying host`)\n getAuth()?.onSessionExpired?.()\n })\n\n // Best-effort connect. Do not crash the app if the dev cloud is unreachable.\n c.runtime\n .connect()\n .then(() => console.log(`${LOG_TAG}: connect() resolved`))\n .catch((err) => console.warn(`${LOG_TAG}: connect() failed: ${err?.message ?? err}`))\n\n syncCoreAccessTokenToBluetooth().catch((err) =>\n console.warn(`${LOG_TAG}: initial Bluetooth core_token sync failed: ${(err as Error)?.message ?? err}`),\n )\n\n startLc3FrameSizeWatcher()\n}\n\n/**\n * engine's cloud client. Owns the singleton CloudClient, its connection state,\n * and the runtime-hook wiring.\n */\nexport const cloudClientService = {\n /**\n * Construct (once) + connect the client. Idempotent. Best-effort connect — a\n * failure is logged and the app keeps running. Requires\n * `engine.configure({auth, config})` first.\n */\n init(): void {\n if (client) return\n // Privacy stance wins over every caller, including the lazy `if (!client)\n // this.init()` paths below — this is the one chokepoint where the client\n // gets built, so refusing here keeps the socket from ever opening.\n if (cloudDisabled()) {\n console.log(`${LOG_TAG}: init skipped — cloud disabled in Privacy settings`)\n startDisableCloudWatcher()\n return\n }\n ensureAuthWatch()\n startDisableCloudWatcher()\n construct()\n },\n\n /** True when the user has turned Glassly cloud off entirely. */\n isCloudDisabled(): boolean {\n return cloudDisabled()\n },\n\n /**\n * Tear down + rebuild. Pass new endpoints to switch URLs; pass `null` to CLEAR\n * a prior override and fall back to the boot config (so cleared/default cloud\n * URLs don't keep reconnecting to a stale override); omit to keep the current.\n */\n reconnect(endpoints?: {core: string; runtime: string} | null): void {\n const prevCore = resolveEndpoints().core\n if (endpoints !== undefined) endpointsOverride = endpoints\n // Tokens are minted per backend (per-env signing keys + user DB), so a\n // core switch makes the persisted refresh token dead weight the new\n // backend will reject. Drop it so the client goes straight to a subject\n // exchange instead of burning a round trip on a guaranteed invalid_grant.\n // Key literal matches cloud-client's token-store.ts REFRESH_TOKEN_KEY.\n if (resolveEndpoints().core !== prevCore) {\n console.log(`${LOG_TAG}: core endpoint changed — dropping persisted cloud refresh token`)\n void cloudSecureStore.delete(\"glassly.cloud-client.refreshToken\")\n }\n try {\n client?.runtime.close()\n } catch (err) {\n console.warn(`${LOG_TAG}: reconnect close() failed: ${(err as Error)?.message ?? err}`)\n }\n clearRuntimeEventSubscriptions()\n clearPersistentFailureAlarm()\n\n const wasConnected = connected\n client = null\n localDevRuntimeToken = null\n connected = false\n resetRuntimeStatus()\n if (wasConnected) notifyConnectionListeners(false)\n\n // Same gate as init(): endpoint changes / LC3 reconnects must not resurrect\n // a connection the user has switched off.\n if (cloudDisabled()) {\n console.log(`${LOG_TAG}: reconnect skipped — cloud disabled in Privacy settings`)\n return\n }\n construct()\n },\n\n async getPreinstalledMiniappRegistry(): Promise<PreinstalledMiniappRegistry> {\n if (!client) this.init()\n const c = client\n if (!c?.core) throw new Error(\"cloud client core is unavailable\")\n return c.core.miniapps.getRegistry()\n },\n\n /**\n * Resolve the stable Core-owned Glassly user id.\n *\n * Storage must use this identity rather than the short-lived Core access\n * token. A previously verified id is restored from MMKV so local miniapps\n * remain available after an offline process restart. On first sign-in,\n * callers join the auth module's single-flight exchange/refresh instead of\n * falling back to an anonymous namespace.\n */\n async resolveGlasslyUserId(): Promise<string> {\n // With cloud off there is no client to exchange a token with and never will\n // be, so the online path below would throw on every storage call and take\n // offline-capable local miniapps down with it. Fall back to a device-local\n // namespace instead — a cached Core id still wins inside resolveLocal().\n if (cloudDisabled()) return localMiniappUserIdentity.resolveLocal()\n\n return localMiniappUserIdentity.resolve(async () => {\n if (!client) this.init()\n const c = client\n if (!c) throw new Error(\"cloud client not initialized\")\n\n await c.auth.getCoreToken()\n if (c !== client) throw new Error(\"cloud client changed while resolving user identity\")\n // Runs before resolve() persists the id, so the local namespace is adopted\n // whichever path reaches Core identity first (this or the token sync).\n adoptLocalNamespace(c.auth.identity.glasslyUserId)\n return c.auth.identity.glasslyUserId\n })\n },\n\n /** Read the stable Glassly user id after async identity resolution. */\n getGlasslyUserId(): string {\n // Mirrors resolveGlasslyUserId(): with cloud off, minting is synchronous and\n // cannot fail, so sync callers (BlobStore) don't depend on an async resolve\n // having run first.\n if (cloudDisabled()) return localMiniappUserIdentity.resolveLocal()\n const userId = localMiniappUserIdentity.get()\n if (!userId) throw new Error(\"Glassly user identity is unavailable\")\n return userId\n },\n\n async getMiniappAuthToken(\n packageName: string,\n opts?: {minTtlMs?: number; devAttestation?: string},\n ): Promise<MiniappAuthToken> {\n if (!client) this.init()\n const c = client\n if (!c) throw new Error(\"cloud client not initialized\")\n\n const {token, expiresAt} = await c.auth.getMiniappToken(packageName, opts)\n const identity = c.auth.identity\n return {\n glasslyUserId: identity.glasslyUserId,\n tenantId: identity.tenantId,\n token,\n expiresAt: normalizeExpiresAt(expiresAt),\n }\n },\n\n /**\n * Tear down the client + connection (the engine.stop() lifecycle).\n *\n * Deliberately leaves the disable-cloud watcher installed: this is also the\n * teardown the Privacy toggle triggers, and dropping the subscription here\n * would strand the app disconnected until restart when the user flips the\n * toggle back off. `shutdown()` is the full-stop variant that removes it.\n */\n stop(): void {\n try {\n client?.runtime.close()\n } catch (err) {\n console.warn(`${LOG_TAG}: stop close() failed: ${(err as Error)?.message ?? err}`)\n }\n stopLc3FrameSizeWatcher()\n stopAuthWatch()\n clearRuntimeEventSubscriptions()\n clearPersistentFailureAlarm()\n const wasConnected = connected\n client = null\n // stop() is part of the logout lifecycle and runs before the host emits\n // SIGNED_OUT. Remove the persisted namespace owner here so a later account\n // can never inherit it. A force-stop/process kill does not call stop(), so\n // the cached id still survives the offline cold-start case.\n localMiniappUserIdentity.forget()\n localDevRuntimeToken = null\n connected = false\n resetRuntimeStatus()\n if (wasConnected) notifyConnectionListeners(false)\n },\n\n /** `stop()` plus the disable-cloud watcher — for a genuine engine teardown. */\n shutdown(): void {\n this.stop()\n stopDisableCloudWatcher()\n },\n\n /** Device-side managed photo (cloud-v2): presign now, deliver bytes, await ready. */\n startManagedPhoto(opts: Record<string, unknown> = {}) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.startManagedPhoto(opts)\n },\n awaitManagedPhotoReady(requestId: string) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.awaitManagedPhotoReady(requestId)\n },\n\n /** Managed stream (cloud-v2): provision ingest+playback on the runtime. */\n startManagedStream(opts: Record<string, unknown> = {}) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.startManagedStream(opts)\n },\n getManagedStreamStatus(streamId: string) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.getManagedStreamStatus(streamId)\n },\n stopManagedStream(streamId: string) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.stopManagedStream(streamId)\n },\n\n /** Current live-session connection state (handshake completed). */\n isConnected(): boolean {\n return connected\n },\n\n /** Subscribe to connection-state transitions. Returns an unsubscribe fn. */\n onConnectionChange(listener: (connected: boolean) => void): () => void {\n connectionListeners.add(listener)\n return () => {\n connectionListeners.delete(listener)\n }\n },\n\n /** Replace the v2 cloud's audio subscription set for the live session. */\n async setSubscriptions(subs: AudioSubscription[]): Promise<void> {\n // Cache unconditionally so the desired set survives a not-yet-connected\n // session and reconnects; the onConnected handler re-applies the cached set.\n audioSubscriptions = subs\n const c = client\n if (connected && c) {\n await c.runtime.setSubscriptions(subs)\n }\n },\n\n sendAudioFrame(frame: Uint8Array): void {\n client?.runtime.sendAudioFrame(frame)\n },\n\n onTranscript(cb: (d: TranscriptionData) => void): () => void {\n transcriptListeners.add(cb)\n return () => {\n transcriptListeners.delete(cb)\n }\n },\n\n onTranslation(cb: (d: TranslationData) => void): () => void {\n translationListeners.add(cb)\n return () => {\n translationListeners.delete(cb)\n }\n },\n\n /** Plan-quota block/unblock pushes for metered cloud streams. */\n onQuota(cb: (d: QuotaStatusPayload) => void): () => void {\n quotaListeners.add(cb)\n return () => {\n quotaListeners.delete(cb)\n }\n },\n\n getStatus(): CloudClientStatusSnapshot {\n return currentRuntimeStatus()\n },\n\n getCoreUrl(): string {\n return resolveEndpoints().core\n },\n\n syncCoreTokenToBluetooth(): Promise<string> {\n return syncCoreAccessTokenToBluetooth()\n },\n\n onStatusChanged(cb: (snapshot: CloudClientStatusSnapshot) => void): () => void {\n statusListeners.add(cb)\n return () => {\n statusListeners.delete(cb)\n }\n },\n\n tts: {\n speak(text: string, options?: Parameters<CloudClient[\"runtime\"][\"tts\"][\"speak\"]>[1]) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.tts.speak(text, options)\n },\n },\n\n llm: {\n /**\n * One completion turn through the cloud LLM service. `userApiKey` is the\n * user's own provider key when they've saved one; the cloud bills that key\n * instead of the platform's and skips metering. It rides as a header, never\n * in the request body.\n */\n complete(\n req: Parameters<CloudClient[\"runtime\"][\"llm\"][\"complete\"]>[0],\n opts?: Parameters<CloudClient[\"runtime\"][\"llm\"][\"complete\"]>[1],\n ) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.llm.complete(req, opts)\n },\n\n /** One agentic visual-generation run. Long-running; see cloud-client docs. */\n generate(\n req: Parameters<CloudClient[\"runtime\"][\"llm\"][\"generate\"]>[0],\n opts?: Parameters<CloudClient[\"runtime\"][\"llm\"][\"generate\"]>[1],\n ) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.llm.generate(req, opts)\n },\n\n /** Start a pollable generate job (async flavor; 404 on old clouds). */\n startGenerateJob(\n req: Parameters<CloudClient[\"runtime\"][\"llm\"][\"startGenerateJob\"]>[0],\n opts?: Parameters<CloudClient[\"runtime\"][\"llm\"][\"startGenerateJob\"]>[1],\n ) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.llm.startGenerateJob(req, opts)\n },\n\n generateJobStatus(jobId: string) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.llm.generateJobStatus(jobId)\n },\n\n cancelGenerateJob(jobId: string) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.llm.cancelGenerateJob(jobId)\n },\n },\n\n maps: {\n directions(req: Parameters<CloudClient[\"runtime\"][\"maps\"][\"directions\"]>[0]) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.directions(req)\n },\n reverseGeocode(coord: Parameters<CloudClient[\"runtime\"][\"maps\"][\"reverseGeocode\"]>[0]) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.reverseGeocode(coord)\n },\n placeAutocomplete(req: Parameters<CloudClient[\"runtime\"][\"maps\"][\"placeAutocomplete\"]>[0]) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.placeAutocomplete(req)\n },\n placeDetails(req: Parameters<CloudClient[\"runtime\"][\"maps\"][\"placeDetails\"]>[0]) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.placeDetails(req)\n },\n /**\n * The deployment's public map render token ({provider, token}) for the\n * consumers that can't be proxied (tiles, native nav SDK). `token` null =\n * this deployment serves none. See MapboxTokenService for the caching\n * consumer.\n */\n renderToken() {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.renderToken()\n },\n },\n\n core: {\n reports: {\n submit(...args: Parameters<CloudCore[\"reports\"][\"submit\"]>) {\n return getCoreClient().reports.submit(...args)\n },\n addLogs(...args: Parameters<CloudCore[\"reports\"][\"addLogs\"]>) {\n return getCoreClient().reports.addLogs(...args)\n },\n addScreenshots(...args: Parameters<CloudCore[\"reports\"][\"addScreenshots\"]>) {\n return getCoreClient().reports.addScreenshots(...args)\n },\n complete(...args: Parameters<CloudCore[\"reports\"][\"complete\"]>) {\n return getCoreClient().reports.complete(...args)\n },\n },\n supportProfile: {\n update(...args: Parameters<CloudCore[\"supportProfile\"][\"update\"]>) {\n return getCoreClient().supportProfile.update(...args)\n },\n },\n },\n\n hasAudioSubscriptions(): boolean {\n return audioSubscriptions.length > 0\n },\n}\n"]}
|
|
1
|
+
{"version":3,"file":"CloudClientService.js","sourceRoot":"","sources":["../../src/services/CloudClientService.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Owns the singleton `@glassly/cloud-client` (CloudClient) for the engine runtime\n * — the keystone move that pulls backend comms INTO engine.\n *\n * engine constructs the client from engine-owned pieces (the native UDP socket,\n * the MMKV secure store, the cloud-status store) plus the two things the host\n * provides through the engine front door: `auth.getSubjectToken` (the one\n * permanent seam — the OEM owns login) and the resolved cloud endpoints\n * (`config.coreUrl/runtimeUrl`, computed host-side from dev/settings). On init it\n * exposes cloud runtime methods directly from this service, so the host no longer\n * injects a cloud adapter — engine owns construction and wiring.\n *\n * The local-miniapp path drives the cloud's transcription/translation through\n * this service.\n */\nimport {CloudClient, setNativeHttp, setNativeUdp, setSecureStorage} from \"@glassly/cloud-client/react-native\"\nimport type {\n PreinstalledMiniappRegistry,\n RuntimeSnapshot,\n StoreCatalogResponse,\n StoreListing,\n} from \"@glassly/cloud-client/react-native\"\nimport type {SubjectTokenType} from \"@glassly/cloud-client\"\nimport {Platform} from \"react-native\"\nimport type {AudioSubscription, QuotaStatusPayload, TranscriptionData, TranslationData} from \"@glassly/cloud-protocol\"\n\nimport BluetoothSdk from \"@glassly/bluetooth-sdk/internal\"\nimport CrustModule from \"@glassly/crust\"\nimport {getAuth, getConfigValues} from \"../runtime/bootstrap\"\nimport {useSettingsStore, SETTINGS} from \"../stores/settings\"\nimport {type CloudClientStatusSnapshot, type MiniappAuthToken} from \"../runtime/config\"\nimport {createCloudUdpSocket} from \"../utils/cloudClient/RnUdpAdapter\"\nimport {cloudSecureStore} from \"../utils/cloudClient/cloudSecureStore\"\nimport {storage as mmkvStorage} from \"../utils/storage\"\nimport {useCloudClientStatusStore} from \"../stores/cloudClientStatus\"\nimport {islandNotifications} from \"./NotificationsEmitter\"\nimport {BgTimer} from \"../utils/timers\"\nimport {logCloudV2TranscriptMetric} from \"./CloudTranscriptE2EMetrics\"\nimport {isLocalUserId, LocalMiniappUserIdentity} from \"./LocalMiniappUserIdentity\"\nimport {migrateLocalMiniappData, type LocalMiniappDataMigrationBackend} from \"./LocalMiniappDataMigration\"\nimport {nativeHttpResponseBody} from \"./NativeHttpResponse\"\n\nconst LOG_TAG = \"cloudClient\"\ntype CloudCore = NonNullable<CloudClient[\"core\"]>\n\n// Persistent cloud-disconnect detector: the cloud-client reconnect loop is infinite\n// and never surfaces a \"giving up\" signal, so \"persistent failure\" = the session has\n// been continuously NOT connected for this long. A quick reconnect cancels it; brief\n// flaps that recover don't fire. Raised as engine.notifications(connection_failed_persistent).\nconst CLOUD_PERSISTENT_FAILURE_MS = 60_000\nconst LOCAL_MINIAPP_USER_ID_KEY = \"glassly.localMiniapp.userId\"\n\n/** Cancel the pending persistent-failure alarm + re-arm for the next outage. */\nfunction clearPersistentFailureAlarm(): void {\n if (persistentFailureTimer) {\n BgTimer.clearTimeout(persistentFailureTimer)\n persistentFailureTimer = null\n }\n persistentFailureNotified = false\n}\n\ntype Lc3FrameSizeBytes = 20 | 40 | 60\n\n// Neutral last-ditch fallbacks (reachable under `adb reverse`) for when the host\n// passes no endpoints. The host normally resolves the real URLs (dev override /\n// Metro host / env) and hands them in via `engine.configure({config})`.\nconst FALLBACK_CORE_URL = \"http://localhost:3000\"\nconst FALLBACK_RUNTIME_URL = \"http://localhost:3001\"\nconst LOCAL_AUTH_PORT = 3002\n\nlet client: CloudClient | null = null\nlet connected = false\nlet persistentFailureTimer: ReturnType<typeof BgTimer.setTimeout> | null = null\nlet persistentFailureNotified = false\nlet audioSubscriptions: AudioSubscription[] = []\nlet transportsReady = false\n/** Endpoints to build with — seeded from config, overridable via reconnect(). */\nlet endpointsOverride: {core: string; runtime: string} | null = null\nlet runtimeStatusUnsubscribe: (() => void) | null = null\nlet transcriptUnsubscribe: (() => void) | null = null\nlet translationUnsubscribe: (() => void) | null = null\nlet quotaUnsubscribe: (() => void) | null = null\nlet authStateUnsubscribe: (() => void) | null = null\nlet localDevRuntimeToken: {runtimeUrl: string; token: string; expiresAtMs: number} | null = null\nlet lc3FrameSizeUnsubscribe: (() => void) | null = null\nlet disableCloudUnsubscribe: (() => void) | null = null\nlet coreTokenSyncPromise: Promise<string> | null = null\n/**\n * A device-local namespace (`local_…`) whose data still needs to be adopted\n * into the account namespace. Set when a sign-in displaces a local id; cleared\n * once {@link adoptLocalNamespace} has moved the data.\n */\nlet pendingLocalNamespace: string | null = null\n\n/**\n * Moves blob bytes between user directories during namespace adoption.\n * Registered by LocalMiniappRuntime (which owns the BlobStore instance) so this\n * service doesn't import it and create a cycle. Absent in tests / before the\n * runtime boots, in which case only the key-value stores migrate.\n */\ntype BlobNamespaceMigrator = (fromUserId: string, toUserId: string) => {moved: number; skipped: number}\nlet blobNamespaceMigrator: BlobNamespaceMigrator | null = null\n\n/**\n * Register the blob-bytes half of namespace adoption. Called by\n * LocalMiniappRuntime at construction — it owns the BlobStore instance, and\n * having it push the hook here keeps this service from importing the runtime.\n */\nexport function setBlobNamespaceMigrator(migrator: BlobNamespaceMigrator | null): void {\n blobNamespaceMigrator = migrator\n}\n\n/** Result-free view of MMKV, as the migration's plain get/set/remove/keys. */\nconst migrationBackend: LocalMiniappDataMigrationBackend = {\n get(key: string): unknown | null {\n const result = mmkvStorage.load<unknown>(key)\n return result.is_ok() ? result.value : null\n },\n set(key: string, value: unknown): void {\n const result = mmkvStorage.save(key, value)\n if (result.is_error()) throw result.error\n },\n remove(key: string): void {\n const result = mmkvStorage.remove(key)\n if (result.is_error()) throw result.error\n },\n keys(): string[] {\n return mmkvStorage.getAllKeys()\n },\n}\n\n/**\n * Adopt data written under a device-local namespace into the signed-in\n * account's, so miniapp state created while cloud was disabled survives\n * sign-in. No-op unless a sign-in actually displaced a local id.\n */\nfunction adoptLocalNamespace(coreUserId: string): void {\n const from = pendingLocalNamespace\n if (!from) return\n // Clear first: a failure must not re-run on every subsequent resolve, and the\n // migration is idempotent anyway.\n pendingLocalNamespace = null\n if (!coreUserId || from === coreUserId) return\n\n try {\n const keys = migrateLocalMiniappData(migrationBackend, from, coreUserId)\n const blobs = blobNamespaceMigrator?.(from, coreUserId) ?? {moved: 0, skipped: 0}\n if (keys.moved || keys.skipped || blobs.moved || blobs.skipped) {\n console.log(\n `${LOG_TAG}: adopted local miniapp data into account namespace ` +\n `(keys ${keys.moved} moved/${keys.skipped} skipped, blobs ${blobs.moved} moved/${blobs.skipped} skipped)`,\n )\n }\n } catch (err) {\n console.warn(`${LOG_TAG}: local namespace adoption failed: ${(err as Error)?.message ?? err}`)\n }\n}\n\nconst localMiniappUserIdentity = new LocalMiniappUserIdentity({\n get(): string | null {\n const result = mmkvStorage.load<string>(LOCAL_MINIAPP_USER_ID_KEY)\n return result.is_ok() ? result.value : null\n },\n set(userId: string): void {\n const result = mmkvStorage.save(LOCAL_MINIAPP_USER_ID_KEY, userId)\n if (result.is_error()) throw result.error\n },\n remove(): void {\n const result = mmkvStorage.remove(LOCAL_MINIAPP_USER_ID_KEY)\n if (result.is_error()) throw result.error\n },\n})\n\nconst transcriptListeners = new Set<(d: TranscriptionData) => void>()\nconst translationListeners = new Set<(d: TranslationData) => void>()\nconst quotaListeners = new Set<(d: QuotaStatusPayload) => void>()\nconst statusListeners = new Set<(snapshot: CloudClientStatusSnapshot) => void>()\nconst connectionListeners = new Set<(connected: boolean) => void>()\n\nfunction resolveEndpoints(): {core: string; runtime: string} {\n if (endpointsOverride) return endpointsOverride\n const cfg = getConfigValues()\n return {\n core: cfg.coreUrl?.trim() || FALLBACK_CORE_URL,\n runtime: cfg.runtimeUrl?.trim() || FALLBACK_RUNTIME_URL,\n }\n}\n\nfunction getCoreClient(): CloudCore {\n if (!client) construct()\n const core = client?.core\n if (!core) throw new Error(\"cloud client core not configured\")\n return core\n}\n\nfunction syncCoreAccessTokenToBluetooth(): Promise<string> {\n if (coreTokenSyncPromise) return coreTokenSyncPromise\n\n coreTokenSyncPromise = syncCoreAccessTokenToBluetoothInternal().finally(() => {\n coreTokenSyncPromise = null\n })\n return coreTokenSyncPromise\n}\n\nasync function syncCoreAccessTokenToBluetoothInternal(): Promise<string> {\n if (!client) construct()\n const c = client\n if (!c) throw new Error(\"cloud client not initialized\")\n\n const token = await c.auth.getCoreToken()\n if (c !== client) {\n throw new Error(\"cloud client changed while syncing core token\")\n }\n adoptLocalNamespace(c.auth.identity.userId)\n localMiniappUserIdentity.remember(c.auth.identity.userId)\n const result = await useSettingsStore.getState().setSetting(SETTINGS.core_token.key, token, false)\n if (result.is_error()) {\n throw result.error\n }\n\n try {\n await BluetoothSdk.updateBluetoothSettings({[SETTINGS.core_token.key]: token})\n } catch (err) {\n console.warn(`${LOG_TAG}: direct Bluetooth core_token sync failed: ${(err as Error)?.message ?? err}`)\n }\n\n return token\n}\n\nfunction frameSizeBytes(): Lc3FrameSizeBytes {\n // Read LIVE from the engine settings store (the source of truth) so a\n // reconnect after a glasses swap (G1=20 ↔ G2=40) picks up the new frame size,\n // not the one-time engine.configure({config}) snapshot. Falls back to the\n // config value (set at boot) then 20 when the setting is unset.\n const fromSettings = useSettingsStore.getState().getSetting(SETTINGS.lc3_frame_size.key)\n const size = fromSettings ?? getConfigValues().audioFrameSizeBytes\n return size === 20 || size === 40 || size === 60 ? size : 20\n}\n\nasync function getSubjectToken(): Promise<{token: string; type: SubjectTokenType}> {\n const a = getAuth()\n if (!a) throw new Error(\"cloudClient: engine.configure({auth}) not called\")\n const r = await a.getSubjectToken()\n // IslandAuth's SubjectTokenType is intentionally open (`string & {}`) so OEMs\n // can use other token kinds; cloud-client's is a closed union. The host's\n // actual value (\"supabase\") is valid — narrow at this boundary.\n return {token: r.token, type: r.type as SubjectTokenType}\n}\n\nfunction normalizeExpiresAt(expiresAt: number): number {\n return expiresAt < 10_000_000_000 ? expiresAt * 1000 : expiresAt\n}\n\nfunction shouldUseLocalDevRuntimeToken(endpoints: {runtime: string}): boolean {\n if (!__DEV__) return false\n try {\n const host = new URL(endpoints.runtime).hostname\n return host === \"localhost\" || host === \"127.0.0.1\" || host === \"10.0.2.2\"\n } catch {\n return false\n }\n}\n\nasync function getLocalDevRuntimeToken(runtimeEndpoint: string, opts?: {forceRefresh?: boolean}): Promise<string> {\n const now = Date.now()\n if (\n !opts?.forceRefresh &&\n localDevRuntimeToken?.runtimeUrl === runtimeEndpoint &&\n localDevRuntimeToken.expiresAtMs - now > 60_000\n ) {\n return localDevRuntimeToken.token\n }\n\n const base = new URL(runtimeEndpoint)\n base.port = String(LOCAL_AUTH_PORT)\n base.pathname = \"/api/dev/runtime-token\"\n base.search = new URLSearchParams({userId: \"local-phone-user\", tenantId: \"glassly\"}).toString()\n\n const res = await fetch(base.toString())\n if (!res.ok) {\n throw new Error(`cloudClient: local dev runtime token failed (${res.status})`)\n }\n const body = (await res.json()) as {access_token?: string; expires_in?: number}\n if (!body.access_token) {\n throw new Error(\"cloudClient: local dev runtime token response missing access_token\")\n }\n localDevRuntimeToken = {\n runtimeUrl: runtimeEndpoint,\n token: body.access_token,\n expiresAtMs: now + (body.expires_in ?? 300) * 1000,\n }\n return body.access_token\n}\n\nfunction toCloudClientStatusSnapshot(snapshot: RuntimeSnapshot): CloudClientStatusSnapshot {\n return {status: snapshot.status, audioTransport: snapshot.audioTransport}\n}\n\nfunction currentRuntimeStatus(): CloudClientStatusSnapshot {\n const state = useCloudClientStatusStore.getState()\n return {status: state.status, audioTransport: state.audioTransport}\n}\n\nfunction setRuntimeStatus(snapshot: RuntimeSnapshot): void {\n useCloudClientStatusStore.getState().setSnapshot(snapshot)\n emitStatus(toCloudClientStatusSnapshot(snapshot))\n}\n\nfunction resetRuntimeStatus(): void {\n useCloudClientStatusStore.getState().reset()\n emitStatus(currentRuntimeStatus())\n}\n\nfunction stringifyMeta(meta: unknown): string {\n if (!meta || typeof meta !== \"object\") return \"\"\n try {\n return ` ${JSON.stringify(meta)}`\n } catch {\n return \"\"\n }\n}\n\nconst cloudLogger = {\n debug: (msg: string, meta?: unknown) => console.log(`${LOG_TAG}: debug: ${msg}${stringifyMeta(meta)}`),\n info: (msg: string, meta?: unknown) => console.log(`${LOG_TAG}: info: ${msg}${stringifyMeta(meta)}`),\n warn: (msg: string, meta?: unknown) => console.warn(`${LOG_TAG}: warn: ${msg}${stringifyMeta(meta)}`),\n error: (msg: string, meta?: unknown) => console.warn(`${LOG_TAG}: error: ${msg}${stringifyMeta(meta)}`),\n}\n\nfunction notifyConnectionListeners(next: boolean): void {\n for (const l of connectionListeners) {\n try {\n l(next)\n } catch (err) {\n console.warn(`${LOG_TAG}: connection listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction extractUnsubscribe(sub: unknown): (() => void) | null {\n const candidates: unknown[] = []\n const s = sub as Record<string, unknown> | null | undefined\n if (s && typeof s === \"object\") {\n candidates.push(s)\n candidates.push((s.value as Record<string, unknown>)?.subscription)\n candidates.push((s.data as Record<string, unknown>)?.subscription)\n candidates.push(s.subscription)\n }\n for (const c of candidates) {\n const unsub = (c as {unsubscribe?: unknown})?.unsubscribe\n if (typeof unsub === \"function\") return unsub as () => void\n }\n return null\n}\n\nfunction ensureAuthWatch(): void {\n if (authStateUnsubscribe) return\n authStateUnsubscribe = () => {}\n\n const auth = getAuth()\n if (!auth?.onStateChange) return\n\n let reconnectPending = false\n try {\n const sub = auth.onStateChange((event, session) => {\n if (event === \"SIGNED_OUT\") {\n localMiniappUserIdentity.forget()\n return\n }\n // A new sign-in may belong to a different account. Force the next\n // storage request to resolve and persist that account's Core identity.\n // A device-local namespace is remembered first so the data written while\n // cloud was off can follow the user into the account (see\n // adoptLocalNamespace).\n if (event === \"SIGNED_IN\") {\n const local = localMiniappUserIdentity.get()\n if (local && isLocalUserId(local)) pendingLocalNamespace = local\n localMiniappUserIdentity.forget()\n }\n if (!session?.token) return\n if (connected || reconnectPending) return\n\n reconnectPending = true\n console.log(`${LOG_TAG}: auth session available (${event}) while disconnected — reconnecting`)\n try {\n cloudClientService.reconnect()\n } finally {\n BgTimer.setTimeout(() => {\n reconnectPending = false\n }, 0)\n }\n })\n\n const unsub = extractUnsubscribe(sub)\n if (unsub) authStateUnsubscribe = unsub\n } catch (err) {\n console.warn(`${LOG_TAG}: auth watch subscribe failed: ${(err as Error)?.message ?? err}`)\n }\n}\n\nfunction stopAuthWatch(): void {\n authStateUnsubscribe?.()\n authStateUnsubscribe = null\n}\n\nfunction emitTranscript(data: TranscriptionData): void {\n for (const l of transcriptListeners) {\n try {\n l(data)\n } catch (err) {\n console.warn(`${LOG_TAG}: transcript listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction emitTranslation(data: TranslationData): void {\n for (const l of translationListeners) {\n try {\n l(data)\n } catch (err) {\n console.warn(`${LOG_TAG}: translation listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction emitQuota(data: QuotaStatusPayload): void {\n for (const l of quotaListeners) {\n try {\n l(data)\n } catch (err) {\n console.warn(`${LOG_TAG}: quota listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction emitStatus(snapshot: CloudClientStatusSnapshot): void {\n for (const l of statusListeners) {\n try {\n l(snapshot)\n } catch (err) {\n console.warn(`${LOG_TAG}: status listener threw: ${(err as Error)?.message ?? err}`)\n }\n }\n}\n\nfunction ensureTransports(): void {\n if (transportsReady) return\n transportsReady = true\n setNativeUdp(() => createCloudUdpSocket())\n setSecureStorage(cloudSecureStore)\n if (Platform.OS !== \"android\") return\n setNativeHttp(async (input, init) => {\n if (typeof input !== \"string\" || (init?.body != null && typeof init.body !== \"string\")) {\n return globalThis.fetch(input, init)\n }\n const headers = Object.fromEntries(new Headers(init?.headers).entries())\n const result = await CrustModule.nativeHttpRequest(\n init?.method ?? \"GET\",\n input,\n headers,\n (init?.body as string | undefined) ?? null,\n )\n return new Response(nativeHttpResponseBody(result.status, result.body), {\n status: result.status,\n statusText: result.statusText,\n headers: result.headers,\n })\n })\n}\n\nfunction clearRuntimeEventSubscriptions(): void {\n runtimeStatusUnsubscribe?.()\n runtimeStatusUnsubscribe = null\n transcriptUnsubscribe?.()\n transcriptUnsubscribe = null\n translationUnsubscribe?.()\n translationUnsubscribe = null\n quotaUnsubscribe?.()\n quotaUnsubscribe = null\n}\n\n/**\n * The user's hard \"never talk to Glassly cloud\" stance (Settings > Privacy).\n * Read imperatively at every would-be-connect point rather than cached, so\n * flipping the toggle takes effect without a restart. `=== true` because\n * getSetting is `any` and an unhydrated store must not read as \"disabled\".\n */\nfunction cloudDisabled(): boolean {\n return useSettingsStore.getState().getSetting(SETTINGS.disable_cloud.key) === true\n}\n\nfunction startLc3FrameSizeWatcher(): void {\n if (lc3FrameSizeUnsubscribe) return\n\n let last = frameSizeBytes()\n lc3FrameSizeUnsubscribe = useSettingsStore.subscribe(\n (state) => state.getSetting(SETTINGS.lc3_frame_size.key),\n () => {\n const next = frameSizeBytes()\n if (next === last) return\n last = next\n if (!client) return\n console.log(`${LOG_TAG}: LC3 frame size changed to ${next}; reconnecting runtime`)\n cloudClientService.reconnect()\n },\n )\n}\n\nfunction stopLc3FrameSizeWatcher(): void {\n lc3FrameSizeUnsubscribe?.()\n lc3FrameSizeUnsubscribe = null\n}\n\n/**\n * Apply a mid-session flip of the Privacy toggle without a restart: turning it\n * on tears the live client down, turning it back off reconnects. Installed by\n * init() on BOTH branches — when cloud starts disabled there is no client to\n * hang the watcher off, but we still need to notice the user re-enabling it.\n */\nfunction startDisableCloudWatcher(): void {\n if (disableCloudUnsubscribe) return\n\n let last = cloudDisabled()\n disableCloudUnsubscribe = useSettingsStore.subscribe(\n (state) => state.getSetting(SETTINGS.disable_cloud.key),\n () => {\n const next = cloudDisabled()\n if (next === last) return\n last = next\n if (next) {\n console.log(`${LOG_TAG}: cloud disabled — tearing down client`)\n cloudClientService.stop()\n } else {\n console.log(`${LOG_TAG}: cloud re-enabled — reconnecting`)\n cloudClientService.init()\n }\n },\n )\n}\n\nfunction stopDisableCloudWatcher(): void {\n disableCloudUnsubscribe?.()\n disableCloudUnsubscribe = null\n}\n\nfunction construct(): void {\n ensureTransports()\n\n const endpoints = resolveEndpoints()\n console.log(`${LOG_TAG}: endpoints ${JSON.stringify(endpoints)}`)\n\n const coreAuth = {getSubjectToken}\n const auth = shouldUseLocalDevRuntimeToken(endpoints)\n ? {\n core: coreAuth,\n runtime: {getToken: (opts?: {forceRefresh?: boolean}) => getLocalDevRuntimeToken(endpoints.runtime, opts)},\n }\n : {core: coreAuth, runtime: {source: \"core\" as const}}\n\n client = new CloudClient({\n endpoints,\n // The phone LC3-encodes mic audio (even in phone/simulated mode); announce\n // LC3 at 16 kHz with the frame size the encoder emits.\n audio: {codec: \"lc3\", sampleRate: 16000, frameSizeBytes: frameSizeBytes()},\n auth,\n timers: {\n setTimeout: (callback, delayMs) => BgTimer.setTimeout(callback, delayMs),\n clearTimeout: (handle) => BgTimer.clearTimeout(handle as number),\n setInterval: (callback, intervalMs) => BgTimer.setInterval(callback, intervalMs),\n clearInterval: (handle) => BgTimer.clearInterval(handle as number),\n },\n logger: cloudLogger,\n })\n\n const c = client\n clearRuntimeEventSubscriptions()\n runtimeStatusUnsubscribe = c.runtime.onStatusChanged((status) => {\n if (c !== client) return\n setRuntimeStatus(status)\n })\n transcriptUnsubscribe = c.runtime.onTranscript((data) => {\n if (c !== client) return\n logCloudV2TranscriptMetric(data)\n emitTranscript(data)\n })\n translationUnsubscribe = c.runtime.onTranslation((data) => {\n if (c !== client) return\n emitTranslation(data)\n })\n quotaUnsubscribe = c.runtime.onQuota((data) => {\n if (c !== client) return\n emitQuota(data)\n })\n setRuntimeStatus(c.runtime.getStatus())\n\n c.runtime.onConnected(() => {\n if (c !== client) return\n connected = true\n console.log(`${LOG_TAG}: runtime connected`)\n console.log(`${LOG_TAG}: debug: ws-session-debug connected`)\n // Cloud is up — cancel any pending persistent-failure alarm and re-arm for the\n // next outage.\n clearPersistentFailureAlarm()\n // Re-apply the authoritative subscription set, including the empty set, so\n // a fresh phone launch clears any stale server-side audio subscriptions.\n c.runtime\n .setSubscriptions(audioSubscriptions)\n .catch((err) =>\n console.warn(`${LOG_TAG}: re-applying queued subscriptions failed: ${(err as Error)?.message ?? err}`),\n )\n notifyConnectionListeners(true)\n })\n c.runtime.onDisconnected((info) => {\n if (c !== client) return\n connected = false\n console.log(`${LOG_TAG}: runtime disconnected (${info.reason})`)\n console.log(\n `${LOG_TAG}: debug: ws-session-debug disconnected reason=${info.reason} willStayDown=${/superseded by newer session/i.test(info.reason)}`,\n )\n // Arm the persistent-failure alarm once; if we're still down when it fires, raise\n // the notification. A reconnect within the window cancels it (onConnected above).\n if (!persistentFailureTimer && !persistentFailureNotified) {\n persistentFailureTimer = BgTimer.setTimeout(() => {\n persistentFailureTimer = null\n if (connected) return\n persistentFailureNotified = true\n islandNotifications.emit({\n kind: \"connection_failed_persistent\",\n reason: `Cloud session has been disconnected for over ${Math.round(CLOUD_PERSISTENT_FAILURE_MS / 1000)}s`,\n metadata: {downForMs: CLOUD_PERSISTENT_FAILURE_MS, lastReason: info.reason},\n timestamp: Date.now(),\n })\n }, CLOUD_PERSISTENT_FAILURE_MS)\n }\n notifyConnectionListeners(false)\n })\n c.runtime.onError((err) => {\n console.warn(`${LOG_TAG}: runtime error: ${err.code}`)\n })\n\n // Dead credentials (refresh AND subject exchange both failed). Surface to\n // the host so it can force a re-login — otherwise the app looks signed-in\n // while every cloud feature silently fails. Fires at most once per client\n // instance (the auth module latches until a successful exchange).\n c.auth.onExpired(() => {\n if (c !== client) return\n console.warn(`${LOG_TAG}: cloud session expired beyond recovery — notifying host`)\n getAuth()?.onSessionExpired?.()\n })\n\n // Best-effort connect. Do not crash the app if the dev cloud is unreachable.\n c.runtime\n .connect()\n .then(() => console.log(`${LOG_TAG}: connect() resolved`))\n .catch((err) => console.warn(`${LOG_TAG}: connect() failed: ${err?.message ?? err}`))\n\n syncCoreAccessTokenToBluetooth().catch((err) =>\n console.warn(`${LOG_TAG}: initial Bluetooth core_token sync failed: ${(err as Error)?.message ?? err}`),\n )\n\n startLc3FrameSizeWatcher()\n}\n\n/**\n * engine's cloud client. Owns the singleton CloudClient, its connection state,\n * and the runtime-hook wiring.\n */\nexport const cloudClientService = {\n /**\n * Construct (once) + connect the client. Idempotent. Best-effort connect — a\n * failure is logged and the app keeps running. Requires\n * `engine.configure({auth, config})` first.\n */\n init(): void {\n if (client) return\n // Privacy stance wins over every caller, including the lazy `if (!client)\n // this.init()` paths below — this is the one chokepoint where the client\n // gets built, so refusing here keeps the socket from ever opening.\n if (cloudDisabled()) {\n console.log(`${LOG_TAG}: init skipped — cloud disabled in Privacy settings`)\n startDisableCloudWatcher()\n return\n }\n ensureAuthWatch()\n startDisableCloudWatcher()\n construct()\n },\n\n /** True when the user has turned Glassly cloud off entirely. */\n isCloudDisabled(): boolean {\n return cloudDisabled()\n },\n\n /**\n * Tear down + rebuild. Pass new endpoints to switch URLs; pass `null` to CLEAR\n * a prior override and fall back to the boot config (so cleared/default cloud\n * URLs don't keep reconnecting to a stale override); omit to keep the current.\n */\n reconnect(endpoints?: {core: string; runtime: string} | null): void {\n const prevCore = resolveEndpoints().core\n if (endpoints !== undefined) endpointsOverride = endpoints\n // Tokens are minted per backend (per-env signing keys + user DB), so a\n // core switch makes the persisted refresh token dead weight the new\n // backend will reject. Drop it so the client goes straight to a subject\n // exchange instead of burning a round trip on a guaranteed invalid_grant.\n // Key literal matches cloud-client's token-store.ts REFRESH_TOKEN_KEY.\n if (resolveEndpoints().core !== prevCore) {\n console.log(`${LOG_TAG}: core endpoint changed — dropping persisted cloud refresh token`)\n void cloudSecureStore.delete(\"glassly.cloud-client.refreshToken\")\n }\n try {\n client?.runtime.close()\n } catch (err) {\n console.warn(`${LOG_TAG}: reconnect close() failed: ${(err as Error)?.message ?? err}`)\n }\n clearRuntimeEventSubscriptions()\n clearPersistentFailureAlarm()\n\n const wasConnected = connected\n client = null\n localDevRuntimeToken = null\n connected = false\n resetRuntimeStatus()\n if (wasConnected) notifyConnectionListeners(false)\n\n // Same gate as init(): endpoint changes / LC3 reconnects must not resurrect\n // a connection the user has switched off.\n if (cloudDisabled()) {\n console.log(`${LOG_TAG}: reconnect skipped — cloud disabled in Privacy settings`)\n return\n }\n construct()\n },\n\n async getPreinstalledMiniappRegistry(): Promise<PreinstalledMiniappRegistry> {\n if (!client) this.init()\n const c = client\n if (!c?.core) throw new Error(\"cloud client core is unavailable\")\n return c.core.miniapps.getRegistry()\n },\n\n async getStoreCatalog(): Promise<StoreCatalogResponse> {\n if (!client) this.init()\n const c = client\n if (!c?.core) throw new Error(\"cloud client core is unavailable\")\n return c.core.store.list()\n },\n\n async getStoreListing(packageName: string): Promise<StoreListing> {\n if (!client) this.init()\n const c = client\n if (!c?.core) throw new Error(\"cloud client core is unavailable\")\n return c.core.store.get(packageName)\n },\n\n /** Bytes of a store icon or screenshot; these routes need the user Bearer. */\n async fetchStoreAsset(url: string): Promise<Uint8Array> {\n if (!client) this.init()\n const c = client\n if (!c?.core) throw new Error(\"cloud client core is unavailable\")\n return c.core.store.fetchAsset(url)\n },\n\n /**\n * Resolve the stable Core-owned Glassly user id.\n *\n * Storage must use this identity rather than the short-lived Core access\n * token. A previously verified id is restored from MMKV so local miniapps\n * remain available after an offline process restart. On first sign-in,\n * callers join the auth module's single-flight exchange/refresh instead of\n * falling back to an anonymous namespace.\n */\n async resolveUserId(): Promise<string> {\n // With cloud off there is no client to exchange a token with and never will\n // be, so the online path below would throw on every storage call and take\n // offline-capable local miniapps down with it. Fall back to a device-local\n // namespace instead — a cached Core id still wins inside resolveLocal().\n if (cloudDisabled()) return localMiniappUserIdentity.resolveLocal()\n\n return localMiniappUserIdentity.resolve(async () => {\n if (!client) this.init()\n const c = client\n if (!c) throw new Error(\"cloud client not initialized\")\n\n await c.auth.getCoreToken()\n if (c !== client) throw new Error(\"cloud client changed while resolving user identity\")\n // Runs before resolve() persists the id, so the local namespace is adopted\n // whichever path reaches Core identity first (this or the token sync).\n adoptLocalNamespace(c.auth.identity.userId)\n return c.auth.identity.userId\n })\n },\n\n /** Read the stable Glassly user id after async identity resolution. */\n getUserId(): string {\n // Mirrors resolveUserId(): with cloud off, minting is synchronous and\n // cannot fail, so sync callers (BlobStore) don't depend on an async resolve\n // having run first.\n if (cloudDisabled()) return localMiniappUserIdentity.resolveLocal()\n const userId = localMiniappUserIdentity.get()\n if (!userId) throw new Error(\"Glassly user identity is unavailable\")\n return userId\n },\n\n async getMiniappAuthToken(\n packageName: string,\n opts?: {minTtlMs?: number; devAttestation?: string},\n ): Promise<MiniappAuthToken> {\n if (!client) this.init()\n const c = client\n if (!c) throw new Error(\"cloud client not initialized\")\n\n const {token, expiresAt} = await c.auth.getMiniappToken(packageName, opts)\n const identity = c.auth.identity\n return {\n userId: identity.userId,\n tenantId: identity.tenantId,\n token,\n expiresAt: normalizeExpiresAt(expiresAt),\n }\n },\n\n /**\n * Tear down the client + connection (the engine.stop() lifecycle).\n *\n * Deliberately leaves the disable-cloud watcher installed: this is also the\n * teardown the Privacy toggle triggers, and dropping the subscription here\n * would strand the app disconnected until restart when the user flips the\n * toggle back off. `shutdown()` is the full-stop variant that removes it.\n */\n stop(): void {\n try {\n client?.runtime.close()\n } catch (err) {\n console.warn(`${LOG_TAG}: stop close() failed: ${(err as Error)?.message ?? err}`)\n }\n stopLc3FrameSizeWatcher()\n stopAuthWatch()\n clearRuntimeEventSubscriptions()\n clearPersistentFailureAlarm()\n const wasConnected = connected\n client = null\n // stop() is part of the logout lifecycle and runs before the host emits\n // SIGNED_OUT. Remove the persisted namespace owner here so a later account\n // can never inherit it. A force-stop/process kill does not call stop(), so\n // the cached id still survives the offline cold-start case.\n localMiniappUserIdentity.forget()\n localDevRuntimeToken = null\n connected = false\n resetRuntimeStatus()\n if (wasConnected) notifyConnectionListeners(false)\n },\n\n /** `stop()` plus the disable-cloud watcher — for a genuine engine teardown. */\n shutdown(): void {\n this.stop()\n stopDisableCloudWatcher()\n },\n\n /** Device-side managed photo (cloud-v2): presign now, deliver bytes, await ready. */\n startManagedPhoto(opts: Record<string, unknown> = {}) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.startManagedPhoto(opts)\n },\n awaitManagedPhotoReady(requestId: string) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.awaitManagedPhotoReady(requestId)\n },\n\n /** Managed stream (cloud-v2): provision ingest+playback on the runtime. */\n startManagedStream(opts: Record<string, unknown> = {}) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.startManagedStream(opts)\n },\n getManagedStreamStatus(streamId: string) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.getManagedStreamStatus(streamId)\n },\n stopManagedStream(streamId: string) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.stopManagedStream(streamId)\n },\n\n /** Current live-session connection state (handshake completed). */\n isConnected(): boolean {\n return connected\n },\n\n /** Subscribe to connection-state transitions. Returns an unsubscribe fn. */\n onConnectionChange(listener: (connected: boolean) => void): () => void {\n connectionListeners.add(listener)\n return () => {\n connectionListeners.delete(listener)\n }\n },\n\n /** Replace the v2 cloud's audio subscription set for the live session. */\n async setSubscriptions(subs: AudioSubscription[]): Promise<void> {\n // Cache unconditionally so the desired set survives a not-yet-connected\n // session and reconnects; the onConnected handler re-applies the cached set.\n audioSubscriptions = subs\n const c = client\n if (connected && c) {\n await c.runtime.setSubscriptions(subs)\n }\n },\n\n sendAudioFrame(frame: Uint8Array): void {\n client?.runtime.sendAudioFrame(frame)\n },\n\n onTranscript(cb: (d: TranscriptionData) => void): () => void {\n transcriptListeners.add(cb)\n return () => {\n transcriptListeners.delete(cb)\n }\n },\n\n onTranslation(cb: (d: TranslationData) => void): () => void {\n translationListeners.add(cb)\n return () => {\n translationListeners.delete(cb)\n }\n },\n\n /** Plan-quota block/unblock pushes for metered cloud streams. */\n onQuota(cb: (d: QuotaStatusPayload) => void): () => void {\n quotaListeners.add(cb)\n return () => {\n quotaListeners.delete(cb)\n }\n },\n\n getStatus(): CloudClientStatusSnapshot {\n return currentRuntimeStatus()\n },\n\n getCoreUrl(): string {\n return resolveEndpoints().core\n },\n\n syncCoreTokenToBluetooth(): Promise<string> {\n return syncCoreAccessTokenToBluetooth()\n },\n\n onStatusChanged(cb: (snapshot: CloudClientStatusSnapshot) => void): () => void {\n statusListeners.add(cb)\n return () => {\n statusListeners.delete(cb)\n }\n },\n\n tts: {\n speak(text: string, options?: Parameters<CloudClient[\"runtime\"][\"tts\"][\"speak\"]>[1]) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.tts.speak(text, options)\n },\n },\n\n llm: {\n /**\n * One completion turn through the cloud LLM service. `userApiKey` is the\n * user's own provider key when they've saved one; the cloud bills that key\n * instead of the platform's and skips metering. It rides as a header, never\n * in the request body.\n */\n complete(\n req: Parameters<CloudClient[\"runtime\"][\"llm\"][\"complete\"]>[0],\n opts?: Parameters<CloudClient[\"runtime\"][\"llm\"][\"complete\"]>[1],\n ) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.llm.complete(req, opts)\n },\n\n /** One agentic visual-generation run. Long-running; see cloud-client docs. */\n generate(\n req: Parameters<CloudClient[\"runtime\"][\"llm\"][\"generate\"]>[0],\n opts?: Parameters<CloudClient[\"runtime\"][\"llm\"][\"generate\"]>[1],\n ) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.llm.generate(req, opts)\n },\n\n /** Start a pollable generate job (async flavor; 404 on old clouds). */\n startGenerateJob(\n req: Parameters<CloudClient[\"runtime\"][\"llm\"][\"startGenerateJob\"]>[0],\n opts?: Parameters<CloudClient[\"runtime\"][\"llm\"][\"startGenerateJob\"]>[1],\n ) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.llm.startGenerateJob(req, opts)\n },\n\n generateJobStatus(jobId: string) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.llm.generateJobStatus(jobId)\n },\n\n cancelGenerateJob(jobId: string) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.llm.cancelGenerateJob(jobId)\n },\n },\n\n maps: {\n directions(req: Parameters<CloudClient[\"runtime\"][\"maps\"][\"directions\"]>[0]) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.directions(req)\n },\n reverseGeocode(coord: Parameters<CloudClient[\"runtime\"][\"maps\"][\"reverseGeocode\"]>[0]) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.reverseGeocode(coord)\n },\n placeAutocomplete(req: Parameters<CloudClient[\"runtime\"][\"maps\"][\"placeAutocomplete\"]>[0]) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.placeAutocomplete(req)\n },\n placeDetails(req: Parameters<CloudClient[\"runtime\"][\"maps\"][\"placeDetails\"]>[0]) {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.placeDetails(req)\n },\n /**\n * The deployment's public map render token ({provider, token}) for the\n * consumers that can't be proxied (tiles, native nav SDK). `token` null =\n * this deployment serves none. See MapboxTokenService for the caching\n * consumer.\n */\n renderToken() {\n if (!client) throw new Error(\"cloud client not connected\")\n return client.runtime.maps.renderToken()\n },\n },\n\n core: {\n reports: {\n submit(...args: Parameters<CloudCore[\"reports\"][\"submit\"]>) {\n return getCoreClient().reports.submit(...args)\n },\n addLogs(...args: Parameters<CloudCore[\"reports\"][\"addLogs\"]>) {\n return getCoreClient().reports.addLogs(...args)\n },\n addScreenshots(...args: Parameters<CloudCore[\"reports\"][\"addScreenshots\"]>) {\n return getCoreClient().reports.addScreenshots(...args)\n },\n complete(...args: Parameters<CloudCore[\"reports\"][\"complete\"]>) {\n return getCoreClient().reports.complete(...args)\n },\n },\n supportProfile: {\n update(...args: Parameters<CloudCore[\"supportProfile\"][\"update\"]>) {\n return getCoreClient().supportProfile.update(...args)\n },\n },\n },\n\n hasAudioSubscriptions(): boolean {\n return audioSubscriptions.length > 0\n },\n}\n"]}
|
|
@@ -1,20 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DevServerBridge — phone-side WebSocket connection to a `glassly-miniapp dev`
|
|
3
|
-
* sidecar running on a developer's laptop.
|
|
4
|
-
*
|
|
5
|
-
* Multiplexed over a single WebSocket per dev miniapp:
|
|
6
|
-
* laptop → phone : {type: "reload"} → trigger WebView.reload()
|
|
7
|
-
* phone → laptop: {type: "log", level, args, ...} → forwarded console calls
|
|
8
|
-
*
|
|
9
|
-
* Lifecycle: `connect(packageName, devUrl, devPort)` is called from
|
|
10
|
-
* MiniappHost.mountDev once the dev applet is mounted. `disconnect(packageName)`
|
|
11
|
-
* is called from MiniappHost.unmount. Reconnect with exponential backoff on
|
|
12
|
-
* unexpected close — the dev server is the developer's laptop and may bounce.
|
|
13
|
-
*
|
|
14
|
-
* Outgoing logs are buffered in a small ring while disconnected; flushed on
|
|
15
|
-
* reconnect. This catches early-startup logs the developer would otherwise
|
|
16
|
-
* miss when re-launching the dev server.
|
|
17
|
-
*/
|
|
18
1
|
declare class DevServerBridge {
|
|
19
2
|
private entries;
|
|
20
3
|
private globalReloadHandler;
|
|
@@ -45,7 +28,7 @@ declare class DevServerBridge {
|
|
|
45
28
|
* side (`UIRouter.routeFromWebView` for `type:"log"` frames).
|
|
46
29
|
*
|
|
47
30
|
* `source` distinguishes the two halves so the CLI can prefix lines
|
|
48
|
-
* `[UI]` vs `[
|
|
31
|
+
* `[UI]` vs `[JSRuntime]`. Logs are silently dropped when no bridge
|
|
49
32
|
* exists for the package (no `glassly-miniapp dev` running) and
|
|
50
33
|
* buffered in the per-bridge ring while disconnected.
|
|
51
34
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevServerBridge.d.ts","sourceRoot":"","sources":["../../src/services/DevServerBridge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DevServerBridge.d.ts","sourceRoot":"","sources":["../../src/services/DevServerBridge.ts"],"names":[],"mappings":"AAmDA,cAAM,eAAe;IACnB,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,mBAAmB,CAA+C;IAC1E,OAAO,CAAC,8BAA8B,CAA+C;IAErF;;;;OAIG;IACI,QAAQ,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI7D;;;;;;OAMG;IACI,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAIjF,+EAA+E;IACxE,6BAA6B,IAAI,IAAI;IAI5C,0DAA0D;IACnD,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAuB9E,gEAAgE;IACzD,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAQ5C;;;;;;;;;OASG;IACI,UAAU,CACf,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,EAAE,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,IAAI,GAAG,YAAY,GAC1B,IAAI;IAiBP,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,UAAU;IAiGlB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,eAAe;IA2BvB,OAAO,CAAC,aAAa;CActB;AAED,QAAA,MAAM,eAAe,iBAAwB,CAAA;AAC7C,eAAe,eAAe,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BgTimer } from "../utils/timers";
|
|
1
2
|
/**
|
|
2
3
|
* DevServerBridge — phone-side WebSocket connection to a `glassly-miniapp dev`
|
|
3
4
|
* sidecar running on a developer's laptop.
|
|
@@ -87,7 +88,7 @@ class DevServerBridge {
|
|
|
87
88
|
* side (`UIRouter.routeFromWebView` for `type:"log"` frames).
|
|
88
89
|
*
|
|
89
90
|
* `source` distinguishes the two halves so the CLI can prefix lines
|
|
90
|
-
* `[UI]` vs `[
|
|
91
|
+
* `[UI]` vs `[JSRuntime]`. Logs are silently dropped when no bridge
|
|
91
92
|
* exists for the package (no `glassly-miniapp dev` running) and
|
|
92
93
|
* buffered in the per-bridge ring while disconnected.
|
|
93
94
|
*/
|
|
@@ -121,7 +122,7 @@ class DevServerBridge {
|
|
|
121
122
|
.split(":")[0]
|
|
122
123
|
.split("/")[0];
|
|
123
124
|
}
|
|
124
|
-
return `ws://${host}:${devPort}/
|
|
125
|
+
return `ws://${host}:${devPort}/__host_dev`;
|
|
125
126
|
}
|
|
126
127
|
openSocket(packageName, entry) {
|
|
127
128
|
if (entry.state === "closed")
|
|
@@ -133,7 +134,7 @@ class DevServerBridge {
|
|
|
133
134
|
let helloAcked = false;
|
|
134
135
|
const teardown = (reason) => {
|
|
135
136
|
if (helloTimer) {
|
|
136
|
-
clearTimeout(helloTimer);
|
|
137
|
+
BgTimer.clearTimeout(helloTimer);
|
|
137
138
|
helloTimer = null;
|
|
138
139
|
}
|
|
139
140
|
try {
|
|
@@ -159,7 +160,7 @@ class DevServerBridge {
|
|
|
159
160
|
teardown("hello send failed");
|
|
160
161
|
return;
|
|
161
162
|
}
|
|
162
|
-
helloTimer = setTimeout(() => {
|
|
163
|
+
helloTimer = BgTimer.setTimeout(() => {
|
|
163
164
|
if (!helloAcked) {
|
|
164
165
|
teardown("hello-ack timeout");
|
|
165
166
|
}
|
|
@@ -185,7 +186,7 @@ class DevServerBridge {
|
|
|
185
186
|
}
|
|
186
187
|
helloAcked = true;
|
|
187
188
|
if (helloTimer) {
|
|
188
|
-
clearTimeout(helloTimer);
|
|
189
|
+
BgTimer.clearTimeout(helloTimer);
|
|
189
190
|
helloTimer = null;
|
|
190
191
|
}
|
|
191
192
|
entry.state = "connected";
|
|
@@ -219,9 +220,9 @@ class DevServerBridge {
|
|
|
219
220
|
if (entry.state === "closed")
|
|
220
221
|
return;
|
|
221
222
|
if (entry.reconnectTimer)
|
|
222
|
-
clearTimeout(entry.reconnectTimer);
|
|
223
|
+
BgTimer.clearTimeout(entry.reconnectTimer);
|
|
223
224
|
const delay = this.backoffMs(entry.attempts);
|
|
224
|
-
entry.reconnectTimer = setTimeout(() => {
|
|
225
|
+
entry.reconnectTimer = BgTimer.setTimeout(() => {
|
|
225
226
|
entry.reconnectTimer = null;
|
|
226
227
|
// Verify still alive and still in the bridge map.
|
|
227
228
|
const current = this.entries.get(packageName);
|
|
@@ -277,7 +278,7 @@ class DevServerBridge {
|
|
|
277
278
|
}
|
|
278
279
|
teardownEntry(entry) {
|
|
279
280
|
if (entry.reconnectTimer) {
|
|
280
|
-
clearTimeout(entry.reconnectTimer);
|
|
281
|
+
BgTimer.clearTimeout(entry.reconnectTimer);
|
|
281
282
|
entry.reconnectTimer = null;
|
|
282
283
|
}
|
|
283
284
|
if (entry.ws) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevServerBridge.js","sourceRoot":"","sources":["../../src/services/DevServerBridge.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * DevServerBridge — phone-side WebSocket connection to a `glassly-miniapp dev`\n * sidecar running on a developer's laptop.\n *\n * Multiplexed over a single WebSocket per dev miniapp:\n * laptop → phone : {type: \"reload\"} → trigger WebView.reload()\n * phone → laptop: {type: \"log\", level, args, ...} → forwarded console calls\n *\n * Lifecycle: `connect(packageName, devUrl, devPort)` is called from\n * MiniappHost.mountDev once the dev applet is mounted. `disconnect(packageName)`\n * is called from MiniappHost.unmount. Reconnect with exponential backoff on\n * unexpected close — the dev server is the developer's laptop and may bounce.\n *\n * Outgoing logs are buffered in a small ring while disconnected; flushed on\n * reconnect. This catches early-startup logs the developer would otherwise\n * miss when re-launching the dev server.\n */\n\nconst LOG_TAG = \"DEV_SERVER_BRIDGE\"\nconst PROTOCOL_VERSION = \"glassly-dev/1\"\nconst HELLO_TIMEOUT_MS = 1_000\nconst BACKOFF_MIN_MS = 1_000\nconst BACKOFF_MAX_MS = 30_000\nconst RING_BUFFER_MAX_ENTRIES = 100\nconst RING_BUFFER_MAX_BYTES = 32 * 1024\n\ntype State = \"idle\" | \"connecting\" | \"connected\" | \"disconnected\" | \"closed\"\n\ninterface BufferedLog {\n packageName: string\n level: string\n args: unknown[]\n timestamp: number\n /** \"ui\" = WebView, \"background\" = JSContext. Stamped at capture time. */\n source: \"ui\" | \"background\"\n size: number\n}\n\ninterface BridgeEntry {\n state: State\n ws: WebSocket | null\n url: string\n attempts: number\n ringBuffer: BufferedLog[]\n ringBytes: number\n reloadHandler: ((packageName: string) => void) | null\n reconnectTimer: ReturnType<typeof setTimeout> | null\n}\n\nclass DevServerBridge {\n private entries = new Map<string, BridgeEntry>()\n private globalReloadHandler: ((packageName: string) => void) | null = null\n private globalRespawnBackgroundHandler: ((packageName: string) => void) | null = null\n\n /**\n * Register a global reload handler. MiniappHost calls this once at boot. The\n * bridge invokes the handler with the offending packageName whenever a\n * reload signal is received.\n */\n public onReload(handler: (packageName: string) => void): void {\n this.globalReloadHandler = handler\n }\n\n /**\n * Register a global background-respawn handler. Fires when the dev\n * server sends `{type: \"respawn-bg\"}` — emitted on filesystem changes\n * under `src/background/`. The host (JSRouter via the\n * bootstrap) should kill + respawn the JSContext to pick up the\n * change. WebView reload is separate (see `onReload`).\n */\n public onRespawnBackground(handler: ((packageName: string) => void) | null): void {\n this.globalRespawnBackgroundHandler = handler\n }\n\n /** Clear the background-respawn handler when the miniapp engine is stopped. */\n public clearRespawnBackgroundHandler(): void {\n this.globalRespawnBackgroundHandler = null\n }\n\n /** Open (or re-open) a bridge to the given dev server. */\n public connect(packageName: string, devHostUrl: string, devPort: number): void {\n const url = this.buildWsUrl(devHostUrl, devPort)\n let entry = this.entries.get(packageName)\n if (entry) {\n // Already have an entry; if the URL changed (e.g. LAN IP shifted), close\n // and rebuild.\n if (entry.url === url && (entry.state === \"connecting\" || entry.state === \"connected\")) return\n this.teardownEntry(entry)\n }\n entry = {\n state: \"idle\",\n ws: null,\n url,\n attempts: 0,\n ringBuffer: [],\n ringBytes: 0,\n reloadHandler: null,\n reconnectTimer: null,\n }\n this.entries.set(packageName, entry)\n this.openSocket(packageName, entry)\n }\n\n /** Close a bridge for good. Called from MiniappHost.unmount. */\n public disconnect(packageName: string): void {\n const entry = this.entries.get(packageName)\n if (!entry) return\n entry.state = \"closed\"\n this.teardownEntry(entry)\n this.entries.delete(packageName)\n }\n\n /**\n * Forward a `log` envelope to the connected dev sidecar. Called from\n * the JSContext side (`JSRouter.__log` handler) AND the WebView\n * side (`UIRouter.routeFromWebView` for `type:\"log\"` frames).\n *\n * `source` distinguishes the two halves so the CLI can prefix lines\n * `[UI]` vs `[GlasslyJS]`. Logs are silently dropped when no bridge\n * exists for the package (no `glassly-miniapp dev` running) and\n * buffered in the per-bridge ring while disconnected.\n */\n public forwardLog(\n packageName: string,\n level: string,\n args: unknown[],\n timestamp: number,\n source: \"ui\" | \"background\",\n ): void {\n const entry = this.entries.get(packageName)\n if (!entry) return\n const message = JSON.stringify({type: \"log\", level, args, packageName, timestamp, source})\n if (entry.state === \"connected\" && entry.ws) {\n try {\n entry.ws.send(message)\n return\n } catch {\n // Fall through to buffer.\n }\n }\n this.bufferLog(entry, {packageName, level, args, timestamp, source, size: message.length})\n }\n\n // -----------------------------------------------------------------------\n\n private buildWsUrl(devHostUrl: string, devPort: number): string {\n let host: string\n try {\n const parsed = new URL(devHostUrl)\n host = parsed.hostname\n } catch {\n // devHostUrl might already be just an IP; best-effort.\n host = devHostUrl\n .replace(/^https?:\\/\\//, \"\")\n .split(\":\")[0]\n .split(\"/\")[0]\n }\n return `ws://${host}:${devPort}/__glassly_dev`\n }\n\n private openSocket(packageName: string, entry: BridgeEntry): void {\n if (entry.state === \"closed\") return\n entry.state = \"connecting\"\n const ws = new WebSocket(entry.url)\n entry.ws = ws\n\n let helloTimer: ReturnType<typeof setTimeout> | null = null\n let helloAcked = false\n\n const teardown = (reason: string): void => {\n if (helloTimer) {\n clearTimeout(helloTimer)\n helloTimer = null\n }\n try {\n ws.close()\n } catch {\n /* ignore */\n }\n if (entry.state === \"closed\") return\n entry.state = \"disconnected\"\n entry.ws = null\n entry.attempts++\n console.log(\n `${LOG_TAG}: ${packageName} disconnected (${reason}); reconnect in ${this.backoffMs(entry.attempts)}ms`,\n )\n this.scheduleReconnect(packageName, entry)\n }\n\n ws.onopen = () => {\n // Send hello; wait for hello-ack to confirm we hit the right server.\n try {\n ws.send(JSON.stringify({type: \"hello\", protocol: PROTOCOL_VERSION}))\n } catch {\n teardown(\"hello send failed\")\n return\n }\n helloTimer = setTimeout(() => {\n if (!helloAcked) {\n teardown(\"hello-ack timeout\")\n }\n }, HELLO_TIMEOUT_MS)\n }\n\n ws.onmessage = (ev) => {\n const data = typeof ev.data === \"string\" ? ev.data : null\n if (!data) return\n let parsed: {type?: string; protocol?: string} | null = null\n try {\n parsed = JSON.parse(data)\n } catch {\n return\n }\n if (!parsed) return\n\n if (parsed.type === \"hello-ack\") {\n if (parsed.protocol !== PROTOCOL_VERSION) {\n teardown(`protocol mismatch: server sent ${parsed.protocol}, expected ${PROTOCOL_VERSION}`)\n return\n }\n helloAcked = true\n if (helloTimer) {\n clearTimeout(helloTimer)\n helloTimer = null\n }\n entry.state = \"connected\"\n entry.attempts = 0\n console.log(`${LOG_TAG}: ${packageName} connected to ${entry.url}`)\n this.flushRingBuffer(packageName, entry)\n return\n }\n\n if (parsed.type === \"reload\") {\n console.log(`${LOG_TAG}: ${packageName} received reload signal`)\n this.globalReloadHandler?.(packageName)\n return\n }\n\n // Two-layer dev signal: filesystem changes under src/background/\n // trigger a full JSContext kill + respawn (not just a WebView\n // reload). The host's JSRouter listens here.\n if (parsed.type === \"respawn-bg\") {\n console.log(`${LOG_TAG}: ${packageName} received respawn-bg signal`)\n this.globalRespawnBackgroundHandler?.(packageName)\n return\n }\n }\n\n ws.onerror = () => {\n // onclose follows; defer all teardown to that path so we don't double-fire.\n }\n\n ws.onclose = () => {\n teardown(helloAcked ? \"ws closed\" : \"ws closed before hello-ack\")\n }\n }\n\n private scheduleReconnect(packageName: string, entry: BridgeEntry): void {\n if (entry.state === \"closed\") return\n if (entry.reconnectTimer) clearTimeout(entry.reconnectTimer)\n const delay = this.backoffMs(entry.attempts)\n entry.reconnectTimer = setTimeout(() => {\n entry.reconnectTimer = null\n // Verify still alive and still in the bridge map.\n const current = this.entries.get(packageName)\n if (!current || current !== entry || entry.state === \"closed\") return\n this.openSocket(packageName, entry)\n }, delay)\n }\n\n private backoffMs(attempts: number): number {\n const exp = Math.min(BACKOFF_MAX_MS, BACKOFF_MIN_MS * Math.pow(2, Math.max(0, attempts - 1)))\n const jitter = exp * (0.8 + Math.random() * 0.4)\n return Math.round(jitter)\n }\n\n private bufferLog(entry: BridgeEntry, log: BufferedLog): void {\n entry.ringBuffer.push(log)\n entry.ringBytes += log.size\n while (entry.ringBuffer.length > RING_BUFFER_MAX_ENTRIES || entry.ringBytes > RING_BUFFER_MAX_BYTES) {\n const dropped = entry.ringBuffer.shift()\n if (dropped) entry.ringBytes -= dropped.size\n if (entry.ringBuffer.length === 0) {\n entry.ringBytes = 0\n break\n }\n }\n }\n\n private flushRingBuffer(packageName: string, entry: BridgeEntry): void {\n if (entry.ringBuffer.length === 0) return\n const buffered = entry.ringBuffer\n entry.ringBuffer = []\n entry.ringBytes = 0\n if (!entry.ws) return\n for (const log of buffered) {\n try {\n entry.ws.send(\n JSON.stringify({\n type: \"log\",\n level: log.level,\n args: log.args,\n packageName: log.packageName,\n timestamp: log.timestamp,\n source: log.source,\n }),\n )\n } catch {\n // Re-buffer on failure and bail.\n entry.ringBuffer.unshift(log)\n entry.ringBytes += log.size\n return\n }\n }\n }\n\n private teardownEntry(entry: BridgeEntry): void {\n if (entry.reconnectTimer) {\n clearTimeout(entry.reconnectTimer)\n entry.reconnectTimer = null\n }\n if (entry.ws) {\n try {\n entry.ws.close()\n } catch {\n /* ignore */\n }\n entry.ws = null\n }\n }\n}\n\nconst devServerBridge = new DevServerBridge()\nexport default devServerBridge\n"]}
|
|
1
|
+
{"version":3,"file":"DevServerBridge.js","sourceRoot":"","sources":["../../src/services/DevServerBridge.ts"],"names":[],"mappings":"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","sourcesContent":["import {BgTimer} from \"../utils/timers\"\n\n/**\n * DevServerBridge — phone-side WebSocket connection to a `glassly-miniapp dev`\n * sidecar running on a developer's laptop.\n *\n * Multiplexed over a single WebSocket per dev miniapp:\n * laptop → phone : {type: \"reload\"} → trigger WebView.reload()\n * phone → laptop: {type: \"log\", level, args, ...} → forwarded console calls\n *\n * Lifecycle: `connect(packageName, devUrl, devPort)` is called from\n * MiniappHost.mountDev once the dev applet is mounted. `disconnect(packageName)`\n * is called from MiniappHost.unmount. Reconnect with exponential backoff on\n * unexpected close — the dev server is the developer's laptop and may bounce.\n *\n * Outgoing logs are buffered in a small ring while disconnected; flushed on\n * reconnect. This catches early-startup logs the developer would otherwise\n * miss when re-launching the dev server.\n */\n\nconst LOG_TAG = \"DEV_SERVER_BRIDGE\"\nconst PROTOCOL_VERSION = \"glassly-dev/1\"\nconst HELLO_TIMEOUT_MS = 1_000\nconst BACKOFF_MIN_MS = 1_000\nconst BACKOFF_MAX_MS = 30_000\nconst RING_BUFFER_MAX_ENTRIES = 100\nconst RING_BUFFER_MAX_BYTES = 32 * 1024\n\ntype State = \"idle\" | \"connecting\" | \"connected\" | \"disconnected\" | \"closed\"\n\ninterface BufferedLog {\n packageName: string\n level: string\n args: unknown[]\n timestamp: number\n /** \"ui\" = WebView, \"background\" = JSContext. Stamped at capture time. */\n source: \"ui\" | \"background\"\n size: number\n}\n\ninterface BridgeEntry {\n state: State\n ws: WebSocket | null\n url: string\n attempts: number\n ringBuffer: BufferedLog[]\n ringBytes: number\n reloadHandler: ((packageName: string) => void) | null\n reconnectTimer: number | null\n}\n\nclass DevServerBridge {\n private entries = new Map<string, BridgeEntry>()\n private globalReloadHandler: ((packageName: string) => void) | null = null\n private globalRespawnBackgroundHandler: ((packageName: string) => void) | null = null\n\n /**\n * Register a global reload handler. MiniappHost calls this once at boot. The\n * bridge invokes the handler with the offending packageName whenever a\n * reload signal is received.\n */\n public onReload(handler: (packageName: string) => void): void {\n this.globalReloadHandler = handler\n }\n\n /**\n * Register a global background-respawn handler. Fires when the dev\n * server sends `{type: \"respawn-bg\"}` — emitted on filesystem changes\n * under `src/background/`. The host (JSRouter via the\n * bootstrap) should kill + respawn the JSContext to pick up the\n * change. WebView reload is separate (see `onReload`).\n */\n public onRespawnBackground(handler: ((packageName: string) => void) | null): void {\n this.globalRespawnBackgroundHandler = handler\n }\n\n /** Clear the background-respawn handler when the miniapp engine is stopped. */\n public clearRespawnBackgroundHandler(): void {\n this.globalRespawnBackgroundHandler = null\n }\n\n /** Open (or re-open) a bridge to the given dev server. */\n public connect(packageName: string, devHostUrl: string, devPort: number): void {\n const url = this.buildWsUrl(devHostUrl, devPort)\n let entry = this.entries.get(packageName)\n if (entry) {\n // Already have an entry; if the URL changed (e.g. LAN IP shifted), close\n // and rebuild.\n if (entry.url === url && (entry.state === \"connecting\" || entry.state === \"connected\")) return\n this.teardownEntry(entry)\n }\n entry = {\n state: \"idle\",\n ws: null,\n url,\n attempts: 0,\n ringBuffer: [],\n ringBytes: 0,\n reloadHandler: null,\n reconnectTimer: null,\n }\n this.entries.set(packageName, entry)\n this.openSocket(packageName, entry)\n }\n\n /** Close a bridge for good. Called from MiniappHost.unmount. */\n public disconnect(packageName: string): void {\n const entry = this.entries.get(packageName)\n if (!entry) return\n entry.state = \"closed\"\n this.teardownEntry(entry)\n this.entries.delete(packageName)\n }\n\n /**\n * Forward a `log` envelope to the connected dev sidecar. Called from\n * the JSContext side (`JSRouter.__log` handler) AND the WebView\n * side (`UIRouter.routeFromWebView` for `type:\"log\"` frames).\n *\n * `source` distinguishes the two halves so the CLI can prefix lines\n * `[UI]` vs `[JSRuntime]`. Logs are silently dropped when no bridge\n * exists for the package (no `glassly-miniapp dev` running) and\n * buffered in the per-bridge ring while disconnected.\n */\n public forwardLog(\n packageName: string,\n level: string,\n args: unknown[],\n timestamp: number,\n source: \"ui\" | \"background\",\n ): void {\n const entry = this.entries.get(packageName)\n if (!entry) return\n const message = JSON.stringify({type: \"log\", level, args, packageName, timestamp, source})\n if (entry.state === \"connected\" && entry.ws) {\n try {\n entry.ws.send(message)\n return\n } catch {\n // Fall through to buffer.\n }\n }\n this.bufferLog(entry, {packageName, level, args, timestamp, source, size: message.length})\n }\n\n // -----------------------------------------------------------------------\n\n private buildWsUrl(devHostUrl: string, devPort: number): string {\n let host: string\n try {\n const parsed = new URL(devHostUrl)\n host = parsed.hostname\n } catch {\n // devHostUrl might already be just an IP; best-effort.\n host = devHostUrl\n .replace(/^https?:\\/\\//, \"\")\n .split(\":\")[0]\n .split(\"/\")[0]\n }\n return `ws://${host}:${devPort}/__host_dev`\n }\n\n private openSocket(packageName: string, entry: BridgeEntry): void {\n if (entry.state === \"closed\") return\n entry.state = \"connecting\"\n const ws = new WebSocket(entry.url)\n entry.ws = ws\n\n let helloTimer: number | null = null\n let helloAcked = false\n\n const teardown = (reason: string): void => {\n if (helloTimer) {\n BgTimer.clearTimeout(helloTimer)\n helloTimer = null\n }\n try {\n ws.close()\n } catch {\n /* ignore */\n }\n if (entry.state === \"closed\") return\n entry.state = \"disconnected\"\n entry.ws = null\n entry.attempts++\n console.log(\n `${LOG_TAG}: ${packageName} disconnected (${reason}); reconnect in ${this.backoffMs(entry.attempts)}ms`,\n )\n this.scheduleReconnect(packageName, entry)\n }\n\n ws.onopen = () => {\n // Send hello; wait for hello-ack to confirm we hit the right server.\n try {\n ws.send(JSON.stringify({type: \"hello\", protocol: PROTOCOL_VERSION}))\n } catch {\n teardown(\"hello send failed\")\n return\n }\n helloTimer = BgTimer.setTimeout(() => {\n if (!helloAcked) {\n teardown(\"hello-ack timeout\")\n }\n }, HELLO_TIMEOUT_MS)\n }\n\n ws.onmessage = (ev) => {\n const data = typeof ev.data === \"string\" ? ev.data : null\n if (!data) return\n let parsed: {type?: string; protocol?: string} | null = null\n try {\n parsed = JSON.parse(data)\n } catch {\n return\n }\n if (!parsed) return\n\n if (parsed.type === \"hello-ack\") {\n if (parsed.protocol !== PROTOCOL_VERSION) {\n teardown(`protocol mismatch: server sent ${parsed.protocol}, expected ${PROTOCOL_VERSION}`)\n return\n }\n helloAcked = true\n if (helloTimer) {\n BgTimer.clearTimeout(helloTimer)\n helloTimer = null\n }\n entry.state = \"connected\"\n entry.attempts = 0\n console.log(`${LOG_TAG}: ${packageName} connected to ${entry.url}`)\n this.flushRingBuffer(packageName, entry)\n return\n }\n\n if (parsed.type === \"reload\") {\n console.log(`${LOG_TAG}: ${packageName} received reload signal`)\n this.globalReloadHandler?.(packageName)\n return\n }\n\n // Two-layer dev signal: filesystem changes under src/background/\n // trigger a full JSContext kill + respawn (not just a WebView\n // reload). The host's JSRouter listens here.\n if (parsed.type === \"respawn-bg\") {\n console.log(`${LOG_TAG}: ${packageName} received respawn-bg signal`)\n this.globalRespawnBackgroundHandler?.(packageName)\n return\n }\n }\n\n ws.onerror = () => {\n // onclose follows; defer all teardown to that path so we don't double-fire.\n }\n\n ws.onclose = () => {\n teardown(helloAcked ? \"ws closed\" : \"ws closed before hello-ack\")\n }\n }\n\n private scheduleReconnect(packageName: string, entry: BridgeEntry): void {\n if (entry.state === \"closed\") return\n if (entry.reconnectTimer) BgTimer.clearTimeout(entry.reconnectTimer)\n const delay = this.backoffMs(entry.attempts)\n entry.reconnectTimer = BgTimer.setTimeout(() => {\n entry.reconnectTimer = null\n // Verify still alive and still in the bridge map.\n const current = this.entries.get(packageName)\n if (!current || current !== entry || entry.state === \"closed\") return\n this.openSocket(packageName, entry)\n }, delay)\n }\n\n private backoffMs(attempts: number): number {\n const exp = Math.min(BACKOFF_MAX_MS, BACKOFF_MIN_MS * Math.pow(2, Math.max(0, attempts - 1)))\n const jitter = exp * (0.8 + Math.random() * 0.4)\n return Math.round(jitter)\n }\n\n private bufferLog(entry: BridgeEntry, log: BufferedLog): void {\n entry.ringBuffer.push(log)\n entry.ringBytes += log.size\n while (entry.ringBuffer.length > RING_BUFFER_MAX_ENTRIES || entry.ringBytes > RING_BUFFER_MAX_BYTES) {\n const dropped = entry.ringBuffer.shift()\n if (dropped) entry.ringBytes -= dropped.size\n if (entry.ringBuffer.length === 0) {\n entry.ringBytes = 0\n break\n }\n }\n }\n\n private flushRingBuffer(packageName: string, entry: BridgeEntry): void {\n if (entry.ringBuffer.length === 0) return\n const buffered = entry.ringBuffer\n entry.ringBuffer = []\n entry.ringBytes = 0\n if (!entry.ws) return\n for (const log of buffered) {\n try {\n entry.ws.send(\n JSON.stringify({\n type: \"log\",\n level: log.level,\n args: log.args,\n packageName: log.packageName,\n timestamp: log.timestamp,\n source: log.source,\n }),\n )\n } catch {\n // Re-buffer on failure and bail.\n entry.ringBuffer.unshift(log)\n entry.ringBytes += log.size\n return\n }\n }\n }\n\n private teardownEntry(entry: BridgeEntry): void {\n if (entry.reconnectTimer) {\n BgTimer.clearTimeout(entry.reconnectTimer)\n entry.reconnectTimer = null\n }\n if (entry.ws) {\n try {\n entry.ws.close()\n } catch {\n /* ignore */\n }\n entry.ws = null\n }\n }\n}\n\nconst devServerBridge = new DevServerBridge()\nexport default devServerBridge\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceEventRouter.d.ts","sourceRoot":"","sources":["../../src/services/DeviceEventRouter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DeviceEventRouter.d.ts","sourceRoot":"","sources":["../../src/services/DeviceEventRouter.ts"],"names":[],"mappings":"AAwCA,wBAAgB,sBAAsB,IAAI,IAAI,CAkQ7C;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C"}
|