@glassly/engine 0.1.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1053) hide show
  1. package/README.md +96 -0
  2. package/build/devtools.d.ts +11 -0
  3. package/build/devtools.d.ts.map +1 -0
  4. package/build/devtools.js +13 -0
  5. package/build/devtools.js.map +1 -0
  6. package/build/engine.d.ts +336 -0
  7. package/build/engine.d.ts.map +1 -0
  8. package/build/engine.js +198 -0
  9. package/build/engine.js.map +1 -0
  10. package/build/facades/dev.d.ts +69 -0
  11. package/build/facades/dev.d.ts.map +1 -0
  12. package/build/facades/dev.js +204 -0
  13. package/build/facades/dev.js.map +1 -0
  14. package/build/facades/display.d.ts +21 -0
  15. package/build/facades/display.d.ts.map +1 -0
  16. package/build/facades/display.js +17 -0
  17. package/build/facades/display.js.map +1 -0
  18. package/build/facades/displayMirror.d.ts +15 -0
  19. package/build/facades/displayMirror.d.ts.map +1 -0
  20. package/build/facades/displayMirror.js +29 -0
  21. package/build/facades/displayMirror.js.map +1 -0
  22. package/build/facades/gallery.d.ts +62 -0
  23. package/build/facades/gallery.d.ts.map +1 -0
  24. package/build/facades/gallery.js +61 -0
  25. package/build/facades/gallery.js.map +1 -0
  26. package/build/facades/glasses.d.ts +142 -0
  27. package/build/facades/glasses.d.ts.map +1 -0
  28. package/build/facades/glasses.js +214 -0
  29. package/build/facades/glasses.js.map +1 -0
  30. package/build/facades/glassesSettings.d.ts +13 -0
  31. package/build/facades/glassesSettings.d.ts.map +1 -0
  32. package/build/facades/glassesSettings.js +55 -0
  33. package/build/facades/glassesSettings.js.map +1 -0
  34. package/build/facades/glassesWifi.d.ts +25 -0
  35. package/build/facades/glassesWifi.d.ts.map +1 -0
  36. package/build/facades/glassesWifi.js +57 -0
  37. package/build/facades/glassesWifi.js.map +1 -0
  38. package/build/facades/maps.d.ts +18 -0
  39. package/build/facades/maps.d.ts.map +1 -0
  40. package/build/facades/maps.js +13 -0
  41. package/build/facades/maps.js.map +1 -0
  42. package/build/facades/memory.d.ts +38 -0
  43. package/build/facades/memory.d.ts.map +1 -0
  44. package/build/facades/memory.js +33 -0
  45. package/build/facades/memory.js.map +1 -0
  46. package/build/facades/miniapps.d.ts +47 -0
  47. package/build/facades/miniapps.d.ts.map +1 -0
  48. package/build/facades/miniapps.js +54 -0
  49. package/build/facades/miniapps.js.map +1 -0
  50. package/build/facades/notifications.d.ts +13 -0
  51. package/build/facades/notifications.d.ts.map +1 -0
  52. package/build/facades/notifications.js +12 -0
  53. package/build/facades/notifications.js.map +1 -0
  54. package/build/facades/ota.d.ts +106 -0
  55. package/build/facades/ota.d.ts.map +1 -0
  56. package/build/facades/ota.js +159 -0
  57. package/build/facades/ota.js.map +1 -0
  58. package/build/facades/pairing.d.ts +115 -0
  59. package/build/facades/pairing.d.ts.map +1 -0
  60. package/build/facades/pairing.js +275 -0
  61. package/build/facades/pairing.js.map +1 -0
  62. package/build/facades/permissions.d.ts +33 -0
  63. package/build/facades/permissions.d.ts.map +1 -0
  64. package/build/facades/permissions.js +155 -0
  65. package/build/facades/permissions.js.map +1 -0
  66. package/build/facades/phoneNotifications.d.ts +17 -0
  67. package/build/facades/phoneNotifications.d.ts.map +1 -0
  68. package/build/facades/phoneNotifications.js +41 -0
  69. package/build/facades/phoneNotifications.js.map +1 -0
  70. package/build/facades/providerKeys.d.ts +26 -0
  71. package/build/facades/providerKeys.d.ts.map +1 -0
  72. package/build/facades/providerKeys.js +26 -0
  73. package/build/facades/providerKeys.js.map +1 -0
  74. package/build/facades/reports.d.ts +36 -0
  75. package/build/facades/reports.d.ts.map +1 -0
  76. package/build/facades/reports.js +134 -0
  77. package/build/facades/reports.js.map +1 -0
  78. package/build/facades/session.d.ts +21 -0
  79. package/build/facades/session.d.ts.map +1 -0
  80. package/build/facades/session.js +52 -0
  81. package/build/facades/session.js.map +1 -0
  82. package/build/facades/settings.d.ts +37 -0
  83. package/build/facades/settings.d.ts.map +1 -0
  84. package/build/facades/settings.js +55 -0
  85. package/build/facades/settings.js.map +1 -0
  86. package/build/facades/speakers.d.ts +41 -0
  87. package/build/facades/speakers.d.ts.map +1 -0
  88. package/build/facades/speakers.js +139 -0
  89. package/build/facades/speakers.js.map +1 -0
  90. package/build/facades/speech.d.ts +44 -0
  91. package/build/facades/speech.d.ts.map +1 -0
  92. package/build/facades/speech.js +46 -0
  93. package/build/facades/speech.js.map +1 -0
  94. package/build/index.d.ts +48 -0
  95. package/build/index.d.ts.map +1 -0
  96. package/build/index.js +49 -0
  97. package/build/index.js.map +1 -0
  98. package/build/internal.d.ts +67 -0
  99. package/build/internal.d.ts.map +1 -0
  100. package/build/internal.js +90 -0
  101. package/build/internal.js.map +1 -0
  102. package/build/runtime/bootstrap.d.ts +115 -0
  103. package/build/runtime/bootstrap.d.ts.map +1 -0
  104. package/build/runtime/bootstrap.js +73 -0
  105. package/build/runtime/bootstrap.js.map +1 -0
  106. package/build/runtime/config.d.ts +152 -0
  107. package/build/runtime/config.d.ts.map +1 -0
  108. package/build/runtime/config.js +19 -0
  109. package/build/runtime/config.js.map +1 -0
  110. package/build/runtime/scanQrSeam.d.ts +7 -0
  111. package/build/runtime/scanQrSeam.d.ts.map +1 -0
  112. package/build/runtime/scanQrSeam.js +16 -0
  113. package/build/runtime/scanQrSeam.js.map +1 -0
  114. package/build/runtime/streamConfig.d.ts +4 -0
  115. package/build/runtime/streamConfig.d.ts.map +1 -0
  116. package/build/runtime/streamConfig.js +38 -0
  117. package/build/runtime/streamConfig.js.map +1 -0
  118. package/build/services/AiTierResolution.d.ts +61 -0
  119. package/build/services/AiTierResolution.d.ts.map +1 -0
  120. package/build/services/AiTierResolution.js +83 -0
  121. package/build/services/AiTierResolution.js.map +1 -0
  122. package/build/services/AppRegistry.d.ts +303 -0
  123. package/build/services/AppRegistry.d.ts.map +1 -0
  124. package/build/services/AppRegistry.js +1108 -0
  125. package/build/services/AppRegistry.js.map +1 -0
  126. package/build/services/AudioCloudUplink.d.ts +15 -0
  127. package/build/services/AudioCloudUplink.d.ts.map +1 -0
  128. package/build/services/AudioCloudUplink.js +54 -0
  129. package/build/services/AudioCloudUplink.js.map +1 -0
  130. package/build/services/AudioPlaybackService.d.ts +183 -0
  131. package/build/services/AudioPlaybackService.d.ts.map +1 -0
  132. package/build/services/AudioPlaybackService.js +750 -0
  133. package/build/services/AudioPlaybackService.js.map +1 -0
  134. package/build/services/AutomaticReportResult.d.ts +20 -0
  135. package/build/services/AutomaticReportResult.d.ts.map +1 -0
  136. package/build/services/AutomaticReportResult.js +29 -0
  137. package/build/services/AutomaticReportResult.js.map +1 -0
  138. package/build/services/BlobStore.d.ts +106 -0
  139. package/build/services/BlobStore.d.ts.map +1 -0
  140. package/build/services/BlobStore.js +741 -0
  141. package/build/services/BlobStore.js.map +1 -0
  142. package/build/services/CaptionsTesterReportService.d.ts +4 -0
  143. package/build/services/CaptionsTesterReportService.d.ts.map +1 -0
  144. package/build/services/CaptionsTesterReportService.js +80 -0
  145. package/build/services/CaptionsTesterReportService.js.map +1 -0
  146. package/build/services/CloudAudioSubscriptionSync.d.ts +24 -0
  147. package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -0
  148. package/build/services/CloudAudioSubscriptionSync.js +51 -0
  149. package/build/services/CloudAudioSubscriptionSync.js.map +1 -0
  150. package/build/services/CloudClientService.d.ts +293 -0
  151. package/build/services/CloudClientService.d.ts.map +1 -0
  152. package/build/services/CloudClientService.js +965 -0
  153. package/build/services/CloudClientService.js.map +1 -0
  154. package/build/services/CloudTranscriptE2EMetrics.d.ts +4 -0
  155. package/build/services/CloudTranscriptE2EMetrics.d.ts.map +1 -0
  156. package/build/services/CloudTranscriptE2EMetrics.js +24 -0
  157. package/build/services/CloudTranscriptE2EMetrics.js.map +1 -0
  158. package/build/services/ConnectionCoordinator.d.ts +51 -0
  159. package/build/services/ConnectionCoordinator.d.ts.map +1 -0
  160. package/build/services/ConnectionCoordinator.js +34 -0
  161. package/build/services/ConnectionCoordinator.js.map +1 -0
  162. package/build/services/DevServerBridge.d.ts +63 -0
  163. package/build/services/DevServerBridge.d.ts.map +1 -0
  164. package/build/services/DevServerBridge.js +296 -0
  165. package/build/services/DevServerBridge.js.map +1 -0
  166. package/build/services/DeviceEventRouter.d.ts +3 -0
  167. package/build/services/DeviceEventRouter.d.ts.map +1 -0
  168. package/build/services/DeviceEventRouter.js +214 -0
  169. package/build/services/DeviceEventRouter.js.map +1 -0
  170. package/build/services/DeviceStoreHydration.d.ts +38 -0
  171. package/build/services/DeviceStoreHydration.d.ts.map +1 -0
  172. package/build/services/DeviceStoreHydration.js +124 -0
  173. package/build/services/DeviceStoreHydration.js.map +1 -0
  174. package/build/services/DisplayProcessor.d.ts +223 -0
  175. package/build/services/DisplayProcessor.d.ts.map +1 -0
  176. package/build/services/DisplayProcessor.js +552 -0
  177. package/build/services/DisplayProcessor.js.map +1 -0
  178. package/build/services/ForegroundLocationPermission.d.ts +13 -0
  179. package/build/services/ForegroundLocationPermission.d.ts.map +1 -0
  180. package/build/services/ForegroundLocationPermission.js +12 -0
  181. package/build/services/ForegroundLocationPermission.js.map +1 -0
  182. package/build/services/GlassesReadiness.d.ts +41 -0
  183. package/build/services/GlassesReadiness.d.ts.map +1 -0
  184. package/build/services/GlassesReadiness.js +82 -0
  185. package/build/services/GlassesReadiness.js.map +1 -0
  186. package/build/services/GlassesSettingsSync.d.ts +33 -0
  187. package/build/services/GlassesSettingsSync.d.ts.map +1 -0
  188. package/build/services/GlassesSettingsSync.js +127 -0
  189. package/build/services/GlassesSettingsSync.js.map +1 -0
  190. package/build/services/GlassesStatusProjection.d.ts +3 -0
  191. package/build/services/GlassesStatusProjection.d.ts.map +1 -0
  192. package/build/services/GlassesStatusProjection.js +65 -0
  193. package/build/services/GlassesStatusProjection.js.map +1 -0
  194. package/build/services/HeadingService.d.ts +33 -0
  195. package/build/services/HeadingService.d.ts.map +1 -0
  196. package/build/services/HeadingService.js +123 -0
  197. package/build/services/HeadingService.js.map +1 -0
  198. package/build/services/HotspotOtaTransport.d.ts +29 -0
  199. package/build/services/HotspotOtaTransport.d.ts.map +1 -0
  200. package/build/services/HotspotOtaTransport.js +146 -0
  201. package/build/services/HotspotOtaTransport.js.map +1 -0
  202. package/build/services/HotspotShutdown.d.ts +17 -0
  203. package/build/services/HotspotShutdown.d.ts.map +1 -0
  204. package/build/services/HotspotShutdown.js +29 -0
  205. package/build/services/HotspotShutdown.js.map +1 -0
  206. package/build/services/JSCrashController.d.ts +97 -0
  207. package/build/services/JSCrashController.d.ts.map +1 -0
  208. package/build/services/JSCrashController.js +138 -0
  209. package/build/services/JSCrashController.js.map +1 -0
  210. package/build/services/JSCrashloopReportService.d.ts +9 -0
  211. package/build/services/JSCrashloopReportService.d.ts.map +1 -0
  212. package/build/services/JSCrashloopReportService.js +54 -0
  213. package/build/services/JSCrashloopReportService.js.map +1 -0
  214. package/build/services/JSLogPipeline.d.ts +87 -0
  215. package/build/services/JSLogPipeline.d.ts.map +1 -0
  216. package/build/services/JSLogPipeline.js +137 -0
  217. package/build/services/JSLogPipeline.js.map +1 -0
  218. package/build/services/JSRouter.d.ts +203 -0
  219. package/build/services/JSRouter.d.ts.map +1 -0
  220. package/build/services/JSRouter.js +482 -0
  221. package/build/services/JSRouter.js.map +1 -0
  222. package/build/services/LocalDisplayManager.d.ts +162 -0
  223. package/build/services/LocalDisplayManager.d.ts.map +1 -0
  224. package/build/services/LocalDisplayManager.js +687 -0
  225. package/build/services/LocalDisplayManager.js.map +1 -0
  226. package/build/services/LocalMiniappDataMigration.d.ts +46 -0
  227. package/build/services/LocalMiniappDataMigration.d.ts.map +1 -0
  228. package/build/services/LocalMiniappDataMigration.js +78 -0
  229. package/build/services/LocalMiniappDataMigration.js.map +1 -0
  230. package/build/services/LocalMiniappRuntime.d.ts +677 -0
  231. package/build/services/LocalMiniappRuntime.d.ts.map +1 -0
  232. package/build/services/LocalMiniappRuntime.js +5068 -0
  233. package/build/services/LocalMiniappRuntime.js.map +1 -0
  234. package/build/services/LocalMiniappStorage.d.ts +32 -0
  235. package/build/services/LocalMiniappStorage.d.ts.map +1 -0
  236. package/build/services/LocalMiniappStorage.js +66 -0
  237. package/build/services/LocalMiniappStorage.js.map +1 -0
  238. package/build/services/LocalMiniappUserIdentity.d.ts +41 -0
  239. package/build/services/LocalMiniappUserIdentity.d.ts.map +1 -0
  240. package/build/services/LocalMiniappUserIdentity.js +73 -0
  241. package/build/services/LocalMiniappUserIdentity.js.map +1 -0
  242. package/build/services/LocalSttFallbackCoordinator.d.ts +101 -0
  243. package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -0
  244. package/build/services/LocalSttFallbackCoordinator.js +210 -0
  245. package/build/services/LocalSttFallbackCoordinator.js.map +1 -0
  246. package/build/services/MapboxTokenService.d.ts +33 -0
  247. package/build/services/MapboxTokenService.d.ts.map +1 -0
  248. package/build/services/MapboxTokenService.js +115 -0
  249. package/build/services/MapboxTokenService.js.map +1 -0
  250. package/build/services/MemoryCapture.d.ts +40 -0
  251. package/build/services/MemoryCapture.d.ts.map +1 -0
  252. package/build/services/MemoryCapture.js +42 -0
  253. package/build/services/MemoryCapture.js.map +1 -0
  254. package/build/services/MemoryStore.d.ts +184 -0
  255. package/build/services/MemoryStore.d.ts.map +1 -0
  256. package/build/services/MemoryStore.js +541 -0
  257. package/build/services/MemoryStore.js.map +1 -0
  258. package/build/services/MicStateCoordinator.d.ts +78 -0
  259. package/build/services/MicStateCoordinator.d.ts.map +1 -0
  260. package/build/services/MicStateCoordinator.js +219 -0
  261. package/build/services/MicStateCoordinator.js.map +1 -0
  262. package/build/services/MiniappEngine.d.ts +31 -0
  263. package/build/services/MiniappEngine.d.ts.map +1 -0
  264. package/build/services/MiniappEngine.js +119 -0
  265. package/build/services/MiniappEngine.js.map +1 -0
  266. package/build/services/MiniappLauncher.d.ts +127 -0
  267. package/build/services/MiniappLauncher.d.ts.map +1 -0
  268. package/build/services/MiniappLauncher.js +309 -0
  269. package/build/services/MiniappLauncher.js.map +1 -0
  270. package/build/services/MiniappLiveness.d.ts +12 -0
  271. package/build/services/MiniappLiveness.d.ts.map +1 -0
  272. package/build/services/MiniappLiveness.js +16 -0
  273. package/build/services/MiniappLiveness.js.map +1 -0
  274. package/build/services/MiniappRunningRegistry.d.ts +24 -0
  275. package/build/services/MiniappRunningRegistry.d.ts.map +1 -0
  276. package/build/services/MiniappRunningRegistry.js +52 -0
  277. package/build/services/MiniappRunningRegistry.js.map +1 -0
  278. package/build/services/NativeHttpResponse.d.ts +3 -0
  279. package/build/services/NativeHttpResponse.d.ts.map +1 -0
  280. package/build/services/NativeHttpResponse.js +6 -0
  281. package/build/services/NativeHttpResponse.js.map +1 -0
  282. package/build/services/NativeNavigationService.d.ts +51 -0
  283. package/build/services/NativeNavigationService.d.ts.map +1 -0
  284. package/build/services/NativeNavigationService.js +154 -0
  285. package/build/services/NativeNavigationService.js.map +1 -0
  286. package/build/services/NavigationHandlers.d.ts +107 -0
  287. package/build/services/NavigationHandlers.d.ts.map +1 -0
  288. package/build/services/NavigationHandlers.js +479 -0
  289. package/build/services/NavigationHandlers.js.map +1 -0
  290. package/build/services/NavigationService.d.ts +283 -0
  291. package/build/services/NavigationService.d.ts.map +1 -0
  292. package/build/services/NavigationService.js +696 -0
  293. package/build/services/NavigationService.js.map +1 -0
  294. package/build/services/NotificationsEmitter.d.ts +28 -0
  295. package/build/services/NotificationsEmitter.d.ts.map +1 -0
  296. package/build/services/NotificationsEmitter.js +22 -0
  297. package/build/services/NotificationsEmitter.js.map +1 -0
  298. package/build/services/OfflineSpeechModelService.d.ts +33 -0
  299. package/build/services/OfflineSpeechModelService.d.ts.map +1 -0
  300. package/build/services/OfflineSpeechModelService.js +136 -0
  301. package/build/services/OfflineSpeechModelService.js.map +1 -0
  302. package/build/services/OtaArtifactDownloader.d.ts +65 -0
  303. package/build/services/OtaArtifactDownloader.d.ts.map +1 -0
  304. package/build/services/OtaArtifactDownloader.js +226 -0
  305. package/build/services/OtaArtifactDownloader.js.map +1 -0
  306. package/build/services/OtaInstallCoordinator.d.ts +275 -0
  307. package/build/services/OtaInstallCoordinator.d.ts.map +1 -0
  308. package/build/services/OtaInstallCoordinator.js +1491 -0
  309. package/build/services/OtaInstallCoordinator.js.map +1 -0
  310. package/build/services/OtaService.d.ts +3 -0
  311. package/build/services/OtaService.d.ts.map +1 -0
  312. package/build/services/OtaService.js +72 -0
  313. package/build/services/OtaService.js.map +1 -0
  314. package/build/services/OtaUpdateCheckService.d.ts +100 -0
  315. package/build/services/OtaUpdateCheckService.d.ts.map +1 -0
  316. package/build/services/OtaUpdateCheckService.js +380 -0
  317. package/build/services/OtaUpdateCheckService.js.map +1 -0
  318. package/build/services/PairingIdentity.d.ts +80 -0
  319. package/build/services/PairingIdentity.d.ts.map +1 -0
  320. package/build/services/PairingIdentity.js +145 -0
  321. package/build/services/PairingIdentity.js.map +1 -0
  322. package/build/services/PhoneCalendarHelpers.d.ts +32 -0
  323. package/build/services/PhoneCalendarHelpers.d.ts.map +1 -0
  324. package/build/services/PhoneCalendarHelpers.js +157 -0
  325. package/build/services/PhoneCalendarHelpers.js.map +1 -0
  326. package/build/services/PhoneCalendarService.d.ts +5 -0
  327. package/build/services/PhoneCalendarService.d.ts.map +1 -0
  328. package/build/services/PhoneCalendarService.js +45 -0
  329. package/build/services/PhoneCalendarService.js.map +1 -0
  330. package/build/services/PhoneCameraFovCoordinator.d.ts +30 -0
  331. package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
  332. package/build/services/PhoneCameraFovCoordinator.js +194 -0
  333. package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
  334. package/build/services/PhoneLocationService.d.ts +36 -0
  335. package/build/services/PhoneLocationService.d.ts.map +1 -0
  336. package/build/services/PhoneLocationService.js +115 -0
  337. package/build/services/PhoneLocationService.js.map +1 -0
  338. package/build/services/PhoneNotificationsSync.d.ts +3 -0
  339. package/build/services/PhoneNotificationsSync.d.ts.map +1 -0
  340. package/build/services/PhoneNotificationsSync.js +37 -0
  341. package/build/services/PhoneNotificationsSync.js.map +1 -0
  342. package/build/services/PhonePhotoCoordinator.d.ts +110 -0
  343. package/build/services/PhonePhotoCoordinator.d.ts.map +1 -0
  344. package/build/services/PhonePhotoCoordinator.js +344 -0
  345. package/build/services/PhonePhotoCoordinator.js.map +1 -0
  346. package/build/services/PhoneStreamCoordinator.d.ts +175 -0
  347. package/build/services/PhoneStreamCoordinator.d.ts.map +1 -0
  348. package/build/services/PhoneStreamCoordinator.js +740 -0
  349. package/build/services/PhoneStreamCoordinator.js.map +1 -0
  350. package/build/services/PhoneVideoCoordinator.d.ts +52 -0
  351. package/build/services/PhoneVideoCoordinator.d.ts.map +1 -0
  352. package/build/services/PhoneVideoCoordinator.js +157 -0
  353. package/build/services/PhoneVideoCoordinator.js.map +1 -0
  354. package/build/services/ProviderKeyValidation.d.ts +27 -0
  355. package/build/services/ProviderKeyValidation.d.ts.map +1 -0
  356. package/build/services/ProviderKeyValidation.js +42 -0
  357. package/build/services/ProviderKeyValidation.js.map +1 -0
  358. package/build/services/STTModelManager.d.ts +65 -0
  359. package/build/services/STTModelManager.d.ts.map +1 -0
  360. package/build/services/STTModelManager.js +366 -0
  361. package/build/services/STTModelManager.js.map +1 -0
  362. package/build/services/SceneRenderer.d.ts +90 -0
  363. package/build/services/SceneRenderer.d.ts.map +1 -0
  364. package/build/services/SceneRenderer.js +274 -0
  365. package/build/services/SceneRenderer.js.map +1 -0
  366. package/build/services/SentenceTtsPipeline.d.ts +31 -0
  367. package/build/services/SentenceTtsPipeline.d.ts.map +1 -0
  368. package/build/services/SentenceTtsPipeline.js +67 -0
  369. package/build/services/SentenceTtsPipeline.js.map +1 -0
  370. package/build/services/SpeakerIdModelManager.d.ts +36 -0
  371. package/build/services/SpeakerIdModelManager.d.ts.map +1 -0
  372. package/build/services/SpeakerIdModelManager.js +132 -0
  373. package/build/services/SpeakerIdModelManager.js.map +1 -0
  374. package/build/services/SpeakerIdSync.d.ts +14 -0
  375. package/build/services/SpeakerIdSync.d.ts.map +1 -0
  376. package/build/services/SpeakerIdSync.js +62 -0
  377. package/build/services/SpeakerIdSync.js.map +1 -0
  378. package/build/services/SpeakerLabelResolver.d.ts +80 -0
  379. package/build/services/SpeakerLabelResolver.d.ts.map +1 -0
  380. package/build/services/SpeakerLabelResolver.js +108 -0
  381. package/build/services/SpeakerLabelResolver.js.map +1 -0
  382. package/build/services/SpeakerProfileStore.d.ts +90 -0
  383. package/build/services/SpeakerProfileStore.d.ts.map +1 -0
  384. package/build/services/SpeakerProfileStore.js +213 -0
  385. package/build/services/SpeakerProfileStore.js.map +1 -0
  386. package/build/services/SpeakerSegmentResolver.d.ts +87 -0
  387. package/build/services/SpeakerSegmentResolver.d.ts.map +1 -0
  388. package/build/services/SpeakerSegmentResolver.js +137 -0
  389. package/build/services/SpeakerSegmentResolver.js.map +1 -0
  390. package/build/services/StreamLifecycleController.d.ts +63 -0
  391. package/build/services/StreamLifecycleController.d.ts.map +1 -0
  392. package/build/services/StreamLifecycleController.js +148 -0
  393. package/build/services/StreamLifecycleController.js.map +1 -0
  394. package/build/services/SupportProfileSync.d.ts +22 -0
  395. package/build/services/SupportProfileSync.d.ts.map +1 -0
  396. package/build/services/SupportProfileSync.js +213 -0
  397. package/build/services/SupportProfileSync.js.map +1 -0
  398. package/build/services/TTSModelManager.d.ts +90 -0
  399. package/build/services/TTSModelManager.d.ts.map +1 -0
  400. package/build/services/TTSModelManager.js +366 -0
  401. package/build/services/TTSModelManager.js.map +1 -0
  402. package/build/services/TranscriptionRouting.d.ts +22 -0
  403. package/build/services/TranscriptionRouting.d.ts.map +1 -0
  404. package/build/services/TranscriptionRouting.js +34 -0
  405. package/build/services/TranscriptionRouting.js.map +1 -0
  406. package/build/services/TtsTextSanitizer.d.ts +5 -0
  407. package/build/services/TtsTextSanitizer.d.ts.map +1 -0
  408. package/build/services/TtsTextSanitizer.js +61 -0
  409. package/build/services/TtsTextSanitizer.js.map +1 -0
  410. package/build/services/UIRouter.d.ts +137 -0
  411. package/build/services/UIRouter.d.ts.map +1 -0
  412. package/build/services/UIRouter.js +210 -0
  413. package/build/services/UIRouter.js.map +1 -0
  414. package/build/services/WebviewBridge.d.ts +22 -0
  415. package/build/services/WebviewBridge.d.ts.map +1 -0
  416. package/build/services/WebviewBridge.js +47 -0
  417. package/build/services/WebviewBridge.js.map +1 -0
  418. package/build/services/WifiAdbRequest.d.ts +17 -0
  419. package/build/services/WifiAdbRequest.d.ts.map +1 -0
  420. package/build/services/WifiAdbRequest.js +35 -0
  421. package/build/services/WifiAdbRequest.js.map +1 -0
  422. package/build/services/asg/GalleryMediaIntegrityReportService.d.ts +17 -0
  423. package/build/services/asg/GalleryMediaIntegrityReportService.d.ts.map +1 -0
  424. package/build/services/asg/GalleryMediaIntegrityReportService.js +43 -0
  425. package/build/services/asg/GalleryMediaIntegrityReportService.js.map +1 -0
  426. package/build/services/asg/asgCameraApi.d.ts +208 -0
  427. package/build/services/asg/asgCameraApi.d.ts.map +1 -0
  428. package/build/services/asg/asgCameraApi.js +1480 -0
  429. package/build/services/asg/asgCameraApi.js.map +1 -0
  430. package/build/services/asg/cameraRollExportCoordinator.d.ts +60 -0
  431. package/build/services/asg/cameraRollExportCoordinator.d.ts.map +1 -0
  432. package/build/services/asg/cameraRollExportCoordinator.js +618 -0
  433. package/build/services/asg/cameraRollExportCoordinator.js.map +1 -0
  434. package/build/services/asg/cameraRollExportLedger.d.ts +44 -0
  435. package/build/services/asg/cameraRollExportLedger.d.ts.map +1 -0
  436. package/build/services/asg/cameraRollExportLedger.js +78 -0
  437. package/build/services/asg/cameraRollExportLedger.js.map +1 -0
  438. package/build/services/asg/galleryMediaValidation.d.ts +29 -0
  439. package/build/services/asg/galleryMediaValidation.d.ts.map +1 -0
  440. package/build/services/asg/galleryMediaValidation.js +149 -0
  441. package/build/services/asg/galleryMediaValidation.js.map +1 -0
  442. package/build/services/asg/galleryNotices.d.ts +33 -0
  443. package/build/services/asg/galleryNotices.d.ts.map +1 -0
  444. package/build/services/asg/galleryNotices.js +29 -0
  445. package/build/services/asg/galleryNotices.js.map +1 -0
  446. package/build/services/asg/galleryPathMigration.d.ts +3 -0
  447. package/build/services/asg/galleryPathMigration.d.ts.map +1 -0
  448. package/build/services/asg/galleryPathMigration.js +26 -0
  449. package/build/services/asg/galleryPathMigration.js.map +1 -0
  450. package/build/services/asg/gallerySettingsService.d.ts +20 -0
  451. package/build/services/asg/gallerySettingsService.d.ts.map +1 -0
  452. package/build/services/asg/gallerySettingsService.js +53 -0
  453. package/build/services/asg/gallerySettingsService.js.map +1 -0
  454. package/build/services/asg/gallerySyncNotifications.d.ts +56 -0
  455. package/build/services/asg/gallerySyncNotifications.d.ts.map +1 -0
  456. package/build/services/asg/gallerySyncNotifications.js +198 -0
  457. package/build/services/asg/gallerySyncNotifications.js.map +1 -0
  458. package/build/services/asg/gallerySyncService.d.ts +137 -0
  459. package/build/services/asg/gallerySyncService.d.ts.map +1 -0
  460. package/build/services/asg/gallerySyncService.js +1945 -0
  461. package/build/services/asg/gallerySyncService.js.map +1 -0
  462. package/build/services/asg/galleryTransferLedger.d.ts +58 -0
  463. package/build/services/asg/galleryTransferLedger.d.ts.map +1 -0
  464. package/build/services/asg/galleryTransferLedger.js +225 -0
  465. package/build/services/asg/galleryTransferLedger.js.map +1 -0
  466. package/build/services/asg/localNetworkTransport.d.ts +15 -0
  467. package/build/services/asg/localNetworkTransport.d.ts.map +1 -0
  468. package/build/services/asg/localNetworkTransport.js +144 -0
  469. package/build/services/asg/localNetworkTransport.js.map +1 -0
  470. package/build/services/asg/localStorageService.d.ts +146 -0
  471. package/build/services/asg/localStorageService.d.ts.map +1 -0
  472. package/build/services/asg/localStorageService.js +572 -0
  473. package/build/services/asg/localStorageService.js.map +1 -0
  474. package/build/services/asg/mediaProcessingQueue.d.ts +70 -0
  475. package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -0
  476. package/build/services/asg/mediaProcessingQueue.js +451 -0
  477. package/build/services/asg/mediaProcessingQueue.js.map +1 -0
  478. package/build/services/audioPlaybackAssets.d.ts +8 -0
  479. package/build/services/audioPlaybackAssets.d.ts.map +1 -0
  480. package/build/services/audioPlaybackAssets.js +7 -0
  481. package/build/services/audioPlaybackAssets.js.map +1 -0
  482. package/build/services/blobPaths.d.ts +31 -0
  483. package/build/services/blobPaths.d.ts.map +1 -0
  484. package/build/services/blobPaths.js +86 -0
  485. package/build/services/blobPaths.js.map +1 -0
  486. package/build/services/cloudStreamApi.d.ts +59 -0
  487. package/build/services/cloudStreamApi.d.ts.map +1 -0
  488. package/build/services/cloudStreamApi.js +81 -0
  489. package/build/services/cloudStreamApi.js.map +1 -0
  490. package/build/services/effectiveCapabilities.d.ts +8 -0
  491. package/build/services/effectiveCapabilities.d.ts.map +1 -0
  492. package/build/services/effectiveCapabilities.js +23 -0
  493. package/build/services/effectiveCapabilities.js.map +1 -0
  494. package/build/services/gallerySyncClock.d.ts +17 -0
  495. package/build/services/gallerySyncClock.d.ts.map +1 -0
  496. package/build/services/gallerySyncClock.js +21 -0
  497. package/build/services/gallerySyncClock.js.map +1 -0
  498. package/build/services/glassesClockSync.d.ts +20 -0
  499. package/build/services/glassesClockSync.d.ts.map +1 -0
  500. package/build/services/glassesClockSync.js +97 -0
  501. package/build/services/glassesClockSync.js.map +1 -0
  502. package/build/services/manifestActions.d.ts +31 -0
  503. package/build/services/manifestActions.d.ts.map +1 -0
  504. package/build/services/manifestActions.js +54 -0
  505. package/build/services/manifestActions.js.map +1 -0
  506. package/build/services/manifestVersionGate.d.ts +28 -0
  507. package/build/services/manifestVersionGate.d.ts.map +1 -0
  508. package/build/services/manifestVersionGate.js +41 -0
  509. package/build/services/manifestVersionGate.js.map +1 -0
  510. package/build/services/memoryStoreInstance.d.ts +19 -0
  511. package/build/services/memoryStoreInstance.d.ts.map +1 -0
  512. package/build/services/memoryStoreInstance.js +65 -0
  513. package/build/services/memoryStoreInstance.js.map +1 -0
  514. package/build/services/navigation/roadNameResolver.d.ts +67 -0
  515. package/build/services/navigation/roadNameResolver.d.ts.map +1 -0
  516. package/build/services/navigation/roadNameResolver.js +87 -0
  517. package/build/services/navigation/roadNameResolver.js.map +1 -0
  518. package/build/services/navigation/routesApiCodec.d.ts +38 -0
  519. package/build/services/navigation/routesApiCodec.d.ts.map +1 -0
  520. package/build/services/navigation/routesApiCodec.js +68 -0
  521. package/build/services/navigation/routesApiCodec.js.map +1 -0
  522. package/build/services/otaDisplayState.d.ts +53 -0
  523. package/build/services/otaDisplayState.d.ts.map +1 -0
  524. package/build/services/otaDisplayState.js +114 -0
  525. package/build/services/otaDisplayState.js.map +1 -0
  526. package/build/services/otaInstallPolicy.d.ts +93 -0
  527. package/build/services/otaInstallPolicy.d.ts.map +1 -0
  528. package/build/services/otaInstallPolicy.js +117 -0
  529. package/build/services/otaInstallPolicy.js.map +1 -0
  530. package/build/services/otaLegacyMapping.d.ts +22 -0
  531. package/build/services/otaLegacyMapping.d.ts.map +1 -0
  532. package/build/services/otaLegacyMapping.js +56 -0
  533. package/build/services/otaLegacyMapping.js.map +1 -0
  534. package/build/services/otaManifestUrl.d.ts +2 -0
  535. package/build/services/otaManifestUrl.d.ts.map +1 -0
  536. package/build/services/otaManifestUrl.js +46 -0
  537. package/build/services/otaManifestUrl.js.map +1 -0
  538. package/build/services/slimStreamStatus.d.ts +18 -0
  539. package/build/services/slimStreamStatus.d.ts.map +1 -0
  540. package/build/services/slimStreamStatus.js +36 -0
  541. package/build/services/slimStreamStatus.js.map +1 -0
  542. package/build/services/soniox/SonioxDirectService.d.ts +109 -0
  543. package/build/services/soniox/SonioxDirectService.d.ts.map +1 -0
  544. package/build/services/soniox/SonioxDirectService.js +449 -0
  545. package/build/services/soniox/SonioxDirectService.js.map +1 -0
  546. package/build/services/soniox/SonioxRealtimeClient.d.ts +121 -0
  547. package/build/services/soniox/SonioxRealtimeClient.d.ts.map +1 -0
  548. package/build/services/soniox/SonioxRealtimeClient.js +301 -0
  549. package/build/services/soniox/SonioxRealtimeClient.js.map +1 -0
  550. package/build/services/soniox/SonioxTokenAssembler.d.ts +98 -0
  551. package/build/services/soniox/SonioxTokenAssembler.d.ts.map +1 -0
  552. package/build/services/soniox/SonioxTokenAssembler.js +394 -0
  553. package/build/services/soniox/SonioxTokenAssembler.js.map +1 -0
  554. package/build/services/speakerProfileStoreInstance.d.ts +8 -0
  555. package/build/services/speakerProfileStoreInstance.d.ts.map +1 -0
  556. package/build/services/speakerProfileStoreInstance.js +24 -0
  557. package/build/services/speakerProfileStoreInstance.js.map +1 -0
  558. package/build/services/uiShim.d.ts +38 -0
  559. package/build/services/uiShim.d.ts.map +1 -0
  560. package/build/services/uiShim.js +369 -0
  561. package/build/services/uiShim.js.map +1 -0
  562. package/build/stores/apps.d.ts +104 -0
  563. package/build/stores/apps.d.ts.map +1 -0
  564. package/build/stores/apps.js +503 -0
  565. package/build/stores/apps.js.map +1 -0
  566. package/build/stores/bluetoothSettingKeys.d.ts +4 -0
  567. package/build/stores/bluetoothSettingKeys.d.ts.map +1 -0
  568. package/build/stores/bluetoothSettingKeys.js +33 -0
  569. package/build/stores/bluetoothSettingKeys.js.map +1 -0
  570. package/build/stores/cloudClientStatus.d.ts +9 -0
  571. package/build/stores/cloudClientStatus.d.ts.map +1 -0
  572. package/build/stores/cloudClientStatus.js +24 -0
  573. package/build/stores/cloudClientStatus.js.map +1 -0
  574. package/build/stores/connection.d.ts +22 -0
  575. package/build/stores/connection.d.ts.map +1 -0
  576. package/build/stores/connection.js +43 -0
  577. package/build/stores/connection.js.map +1 -0
  578. package/build/stores/core.d.ts +15 -0
  579. package/build/stores/core.d.ts.map +1 -0
  580. package/build/stores/core.js +21 -0
  581. package/build/stores/core.js.map +1 -0
  582. package/build/stores/display.d.ts +24 -0
  583. package/build/stores/display.d.ts.map +1 -0
  584. package/build/stores/display.js +96 -0
  585. package/build/stores/display.js.map +1 -0
  586. package/build/stores/gallerySync.d.ts +103 -0
  587. package/build/stores/gallerySync.d.ts.map +1 -0
  588. package/build/stores/gallerySync.js +219 -0
  589. package/build/stores/gallerySync.js.map +1 -0
  590. package/build/stores/glasses.d.ts +62 -0
  591. package/build/stores/glasses.d.ts.map +1 -0
  592. package/build/stores/glasses.js +208 -0
  593. package/build/stores/glasses.js.map +1 -0
  594. package/build/stores/settings.d.ts +54 -0
  595. package/build/stores/settings.d.ts.map +1 -0
  596. package/build/stores/settings.js +1200 -0
  597. package/build/stores/settings.js.map +1 -0
  598. package/build/stores/transcriptionDebug.d.ts +25 -0
  599. package/build/stores/transcriptionDebug.d.ts.map +1 -0
  600. package/build/stores/transcriptionDebug.js +0 -0
  601. package/build/stores/transcriptionDebug.js.map +1 -0
  602. package/build/types/applet.d.ts +101 -0
  603. package/build/types/applet.d.ts.map +1 -0
  604. package/build/types/applet.js +5 -0
  605. package/build/types/applet.js.map +1 -0
  606. package/build/types/asg.d.ts +53 -0
  607. package/build/types/asg.d.ts.map +1 -0
  608. package/build/types/asg.js +2 -0
  609. package/build/types/asg.js.map +1 -0
  610. package/build/types/capabilities/even-realities-g1.d.ts +12 -0
  611. package/build/types/capabilities/even-realities-g1.d.ts.map +1 -0
  612. package/build/types/capabilities/even-realities-g1.js +57 -0
  613. package/build/types/capabilities/even-realities-g1.js.map +1 -0
  614. package/build/types/capabilities/even-realities-g2.d.ts +12 -0
  615. package/build/types/capabilities/even-realities-g2.d.ts.map +1 -0
  616. package/build/types/capabilities/even-realities-g2.js +83 -0
  617. package/build/types/capabilities/even-realities-g2.js.map +1 -0
  618. package/build/types/capabilities/mentra-display.d.ts +12 -0
  619. package/build/types/capabilities/mentra-display.d.ts.map +1 -0
  620. package/build/types/capabilities/mentra-display.js +65 -0
  621. package/build/types/capabilities/mentra-display.js.map +1 -0
  622. package/build/types/capabilities/mentra-live.d.ts +12 -0
  623. package/build/types/capabilities/mentra-live.d.ts.map +1 -0
  624. package/build/types/capabilities/mentra-live.js +94 -0
  625. package/build/types/capabilities/mentra-live.js.map +1 -0
  626. package/build/types/capabilities/nimo.d.ts +13 -0
  627. package/build/types/capabilities/nimo.d.ts.map +1 -0
  628. package/build/types/capabilities/nimo.js +72 -0
  629. package/build/types/capabilities/nimo.js.map +1 -0
  630. package/build/types/capabilities/none.d.ts +13 -0
  631. package/build/types/capabilities/none.d.ts.map +1 -0
  632. package/build/types/capabilities/none.js +67 -0
  633. package/build/types/capabilities/none.js.map +1 -0
  634. package/build/types/capabilities/simulated-glasses.d.ts +13 -0
  635. package/build/types/capabilities/simulated-glasses.d.ts.map +1 -0
  636. package/build/types/capabilities/simulated-glasses.js +82 -0
  637. package/build/types/capabilities/simulated-glasses.js.map +1 -0
  638. package/build/types/capabilities/vuzix-z100.d.ts +12 -0
  639. package/build/types/capabilities/vuzix-z100.d.ts.map +1 -0
  640. package/build/types/capabilities/vuzix-z100.js +54 -0
  641. package/build/types/capabilities/vuzix-z100.js.map +1 -0
  642. package/build/types/enums.d.ts +22 -0
  643. package/build/types/enums.d.ts.map +1 -0
  644. package/build/types/enums.js +27 -0
  645. package/build/types/enums.js.map +1 -0
  646. package/build/types/hardware.d.ts +155 -0
  647. package/build/types/hardware.d.ts.map +1 -0
  648. package/build/types/hardware.js +52 -0
  649. package/build/types/hardware.js.map +1 -0
  650. package/build/types/index.d.ts +11 -0
  651. package/build/types/index.d.ts.map +1 -0
  652. package/build/types/index.js +10 -0
  653. package/build/types/index.js.map +1 -0
  654. package/build/utils/GlobalEventEmitter.d.ts +11 -0
  655. package/build/utils/GlobalEventEmitter.d.ts.map +1 -0
  656. package/build/utils/GlobalEventEmitter.js +14 -0
  657. package/build/utils/GlobalEventEmitter.js.map +1 -0
  658. package/build/utils/cloudClient/RnUdpAdapter.d.ts +3 -0
  659. package/build/utils/cloudClient/RnUdpAdapter.d.ts.map +1 -0
  660. package/build/utils/cloudClient/RnUdpAdapter.js +41 -0
  661. package/build/utils/cloudClient/RnUdpAdapter.js.map +1 -0
  662. package/build/utils/cloudClient/cloudSecureStore.d.ts +3 -0
  663. package/build/utils/cloudClient/cloudSecureStore.d.ts.map +1 -0
  664. package/build/utils/cloudClient/cloudSecureStore.js +26 -0
  665. package/build/utils/cloudClient/cloudSecureStore.js.map +1 -0
  666. package/build/utils/configuredDevHost.d.ts +6 -0
  667. package/build/utils/configuredDevHost.d.ts.map +1 -0
  668. package/build/utils/configuredDevHost.js +19 -0
  669. package/build/utils/configuredDevHost.js.map +1 -0
  670. package/build/utils/debouncedPatch.d.ts +6 -0
  671. package/build/utils/debouncedPatch.d.ts.map +1 -0
  672. package/build/utils/debouncedPatch.js +25 -0
  673. package/build/utils/debouncedPatch.js.map +1 -0
  674. package/build/utils/devLogging.d.ts +26 -0
  675. package/build/utils/devLogging.d.ts.map +1 -0
  676. package/build/utils/devLogging.js +116 -0
  677. package/build/utils/devLogging.js.map +1 -0
  678. package/build/utils/devMiniappLaunch.d.ts +55 -0
  679. package/build/utils/devMiniappLaunch.d.ts.map +1 -0
  680. package/build/utils/devMiniappLaunch.js +175 -0
  681. package/build/utils/devMiniappLaunch.js.map +1 -0
  682. package/build/utils/diagnosticContext.d.ts +3 -0
  683. package/build/utils/diagnosticContext.d.ts.map +1 -0
  684. package/build/utils/diagnosticContext.js +122 -0
  685. package/build/utils/diagnosticContext.js.map +1 -0
  686. package/build/utils/display/composer/ColumnComposer.d.ts +131 -0
  687. package/build/utils/display/composer/ColumnComposer.d.ts.map +1 -0
  688. package/build/utils/display/composer/ColumnComposer.js +204 -0
  689. package/build/utils/display/composer/ColumnComposer.js.map +1 -0
  690. package/build/utils/display/composer/index.d.ts +9 -0
  691. package/build/utils/display/composer/index.d.ts.map +1 -0
  692. package/build/utils/display/composer/index.js +9 -0
  693. package/build/utils/display/composer/index.js.map +1 -0
  694. package/build/utils/display/helpers/DisplayHelpers.d.ts +165 -0
  695. package/build/utils/display/helpers/DisplayHelpers.d.ts.map +1 -0
  696. package/build/utils/display/helpers/DisplayHelpers.js +312 -0
  697. package/build/utils/display/helpers/DisplayHelpers.js.map +1 -0
  698. package/build/utils/display/helpers/ScrollView.d.ts +183 -0
  699. package/build/utils/display/helpers/ScrollView.d.ts.map +1 -0
  700. package/build/utils/display/helpers/ScrollView.js +257 -0
  701. package/build/utils/display/helpers/ScrollView.js.map +1 -0
  702. package/build/utils/display/helpers/index.d.ts +11 -0
  703. package/build/utils/display/helpers/index.d.ts.map +1 -0
  704. package/build/utils/display/helpers/index.js +10 -0
  705. package/build/utils/display/helpers/index.js.map +1 -0
  706. package/build/utils/display/index.d.ts +174 -0
  707. package/build/utils/display/index.d.ts.map +1 -0
  708. package/build/utils/display/index.js +188 -0
  709. package/build/utils/display/index.js.map +1 -0
  710. package/build/utils/display/measurer/TextMeasurer.d.ts +160 -0
  711. package/build/utils/display/measurer/TextMeasurer.d.ts.map +1 -0
  712. package/build/utils/display/measurer/TextMeasurer.js +273 -0
  713. package/build/utils/display/measurer/TextMeasurer.js.map +1 -0
  714. package/build/utils/display/measurer/index.d.ts +10 -0
  715. package/build/utils/display/measurer/index.d.ts.map +1 -0
  716. package/build/utils/display/measurer/index.js +11 -0
  717. package/build/utils/display/measurer/index.js.map +1 -0
  718. package/build/utils/display/measurer/script-detection.d.ts +53 -0
  719. package/build/utils/display/measurer/script-detection.d.ts.map +1 -0
  720. package/build/utils/display/measurer/script-detection.js +184 -0
  721. package/build/utils/display/measurer/script-detection.js.map +1 -0
  722. package/build/utils/display/profiles/g1.d.ts +33 -0
  723. package/build/utils/display/profiles/g1.d.ts.map +1 -0
  724. package/build/utils/display/profiles/g1.js +213 -0
  725. package/build/utils/display/profiles/g1.js.map +1 -0
  726. package/build/utils/display/profiles/g2.d.ts +13 -0
  727. package/build/utils/display/profiles/g2.d.ts.map +1 -0
  728. package/build/utils/display/profiles/g2.js +34 -0
  729. package/build/utils/display/profiles/g2.js.map +1 -0
  730. package/build/utils/display/profiles/index.d.ts +12 -0
  731. package/build/utils/display/profiles/index.d.ts.map +1 -0
  732. package/build/utils/display/profiles/index.js +15 -0
  733. package/build/utils/display/profiles/index.js.map +1 -0
  734. package/build/utils/display/profiles/nex.d.ts +10 -0
  735. package/build/utils/display/profiles/nex.d.ts.map +1 -0
  736. package/build/utils/display/profiles/nex.js +150 -0
  737. package/build/utils/display/profiles/nex.js.map +1 -0
  738. package/build/utils/display/profiles/types.d.ts +103 -0
  739. package/build/utils/display/profiles/types.d.ts.map +1 -0
  740. package/build/utils/display/profiles/types.js +2 -0
  741. package/build/utils/display/profiles/types.js.map +1 -0
  742. package/build/utils/display/profiles/z100.d.ts +33 -0
  743. package/build/utils/display/profiles/z100.d.ts.map +1 -0
  744. package/build/utils/display/profiles/z100.js +182 -0
  745. package/build/utils/display/profiles/z100.js.map +1 -0
  746. package/build/utils/display/scene/anchor.d.ts +17 -0
  747. package/build/utils/display/scene/anchor.d.ts.map +1 -0
  748. package/build/utils/display/scene/anchor.js +33 -0
  749. package/build/utils/display/scene/anchor.js.map +1 -0
  750. package/build/utils/display/scene/degrade.d.ts +25 -0
  751. package/build/utils/display/scene/degrade.d.ts.map +1 -0
  752. package/build/utils/display/scene/degrade.js +64 -0
  753. package/build/utils/display/scene/degrade.js.map +1 -0
  754. package/build/utils/display/scene/differ.d.ts +38 -0
  755. package/build/utils/display/scene/differ.d.ts.map +1 -0
  756. package/build/utils/display/scene/differ.js +107 -0
  757. package/build/utils/display/scene/differ.js.map +1 -0
  758. package/build/utils/display/scene/index.d.ts +11 -0
  759. package/build/utils/display/scene/index.d.ts.map +1 -0
  760. package/build/utils/display/scene/index.js +7 -0
  761. package/build/utils/display/scene/index.js.map +1 -0
  762. package/build/utils/display/scene/process.d.ts +35 -0
  763. package/build/utils/display/scene/process.d.ts.map +1 -0
  764. package/build/utils/display/scene/process.js +201 -0
  765. package/build/utils/display/scene/process.js.map +1 -0
  766. package/build/utils/display/scene/store.d.ts +48 -0
  767. package/build/utils/display/scene/store.d.ts.map +1 -0
  768. package/build/utils/display/scene/store.js +0 -0
  769. package/build/utils/display/scene/store.js.map +1 -0
  770. package/build/utils/display/scene/types.d.ts +139 -0
  771. package/build/utils/display/scene/types.d.ts.map +1 -0
  772. package/build/utils/display/scene/types.js +0 -0
  773. package/build/utils/display/scene/types.js.map +1 -0
  774. package/build/utils/display/wrapper/TextWrapper.d.ts +102 -0
  775. package/build/utils/display/wrapper/TextWrapper.d.ts.map +1 -0
  776. package/build/utils/display/wrapper/TextWrapper.js +471 -0
  777. package/build/utils/display/wrapper/TextWrapper.js.map +1 -0
  778. package/build/utils/display/wrapper/index.d.ts +12 -0
  779. package/build/utils/display/wrapper/index.d.ts.map +1 -0
  780. package/build/utils/display/wrapper/index.js +12 -0
  781. package/build/utils/display/wrapper/index.js.map +1 -0
  782. package/build/utils/display/wrapper/types.d.ts +75 -0
  783. package/build/utils/display/wrapper/types.d.ts.map +1 -0
  784. package/build/utils/display/wrapper/types.js +11 -0
  785. package/build/utils/display/wrapper/types.js.map +1 -0
  786. package/build/utils/e2eMetrics.d.ts +6 -0
  787. package/build/utils/e2eMetrics.d.ts.map +1 -0
  788. package/build/utils/e2eMetrics.js +27 -0
  789. package/build/utils/e2eMetrics.js.map +1 -0
  790. package/build/utils/hardware/hardware.d.ts +42 -0
  791. package/build/utils/hardware/hardware.d.ts.map +1 -0
  792. package/build/utils/hardware/hardware.js +131 -0
  793. package/build/utils/hardware/hardware.js.map +1 -0
  794. package/build/utils/hardware/index.d.ts +2 -0
  795. package/build/utils/hardware/index.d.ts.map +1 -0
  796. package/build/utils/hardware/index.js +2 -0
  797. package/build/utils/hardware/index.js.map +1 -0
  798. package/build/utils/memory/search.d.ts +72 -0
  799. package/build/utils/memory/search.d.ts.map +1 -0
  800. package/build/utils/memory/search.js +178 -0
  801. package/build/utils/memory/search.js.map +1 -0
  802. package/build/utils/miniappDiagnostics.d.ts +64 -0
  803. package/build/utils/miniappDiagnostics.d.ts.map +1 -0
  804. package/build/utils/miniappDiagnostics.js +173 -0
  805. package/build/utils/miniappDiagnostics.js.map +1 -0
  806. package/build/utils/miniappGlobals.d.ts +59 -0
  807. package/build/utils/miniappGlobals.d.ts.map +1 -0
  808. package/build/utils/miniappGlobals.js +223 -0
  809. package/build/utils/miniappGlobals.js.map +1 -0
  810. package/build/utils/permissions/MediaLibraryPermissions.d.ts +45 -0
  811. package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -0
  812. package/build/utils/permissions/MediaLibraryPermissions.js +145 -0
  813. package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -0
  814. package/build/utils/permissions/galleryDisplayName.d.ts +8 -0
  815. package/build/utils/permissions/galleryDisplayName.d.ts.map +1 -0
  816. package/build/utils/permissions/galleryDisplayName.js +25 -0
  817. package/build/utils/permissions/galleryDisplayName.js.map +1 -0
  818. package/build/utils/speakerEmbedding.d.ts +8 -0
  819. package/build/utils/speakerEmbedding.d.ts.map +1 -0
  820. package/build/utils/speakerEmbedding.js +63 -0
  821. package/build/utils/speakerEmbedding.js.map +1 -0
  822. package/build/utils/storage/index.d.ts +3 -0
  823. package/build/utils/storage/index.d.ts.map +1 -0
  824. package/build/utils/storage/index.js +3 -0
  825. package/build/utils/storage/index.js.map +1 -0
  826. package/build/utils/storage/storage.d.ts +24 -0
  827. package/build/utils/storage/storage.d.ts.map +1 -0
  828. package/build/utils/storage/storage.js +85 -0
  829. package/build/utils/storage/storage.js.map +1 -0
  830. package/build/utils/storage/zip.d.ts +3 -0
  831. package/build/utils/storage/zip.d.ts.map +1 -0
  832. package/build/utils/storage/zip.js +14 -0
  833. package/build/utils/storage/zip.js.map +1 -0
  834. package/build/utils/timers/index.d.ts +3 -0
  835. package/build/utils/timers/index.d.ts.map +1 -0
  836. package/build/utils/timers/index.js +3 -0
  837. package/build/utils/timers/index.js.map +1 -0
  838. package/build/utils/timers/timers.d.ts +9 -0
  839. package/build/utils/timers/timers.d.ts.map +1 -0
  840. package/build/utils/timers/timers.js +142 -0
  841. package/build/utils/timers/timers.js.map +1 -0
  842. package/package.json +122 -0
  843. package/src/assets/silence.wav +0 -0
  844. package/src/devtools.ts +13 -0
  845. package/src/engine.ts +198 -0
  846. package/src/facades/dev.ts +213 -0
  847. package/src/facades/display.ts +17 -0
  848. package/src/facades/displayMirror.ts +33 -0
  849. package/src/facades/gallery.ts +69 -0
  850. package/src/facades/glasses.ts +219 -0
  851. package/src/facades/glassesSettings.ts +57 -0
  852. package/src/facades/glassesWifi.ts +68 -0
  853. package/src/facades/maps.ts +13 -0
  854. package/src/facades/memory.ts +46 -0
  855. package/src/facades/miniapps.ts +62 -0
  856. package/src/facades/notifications.ts +14 -0
  857. package/src/facades/ota.ts +177 -0
  858. package/src/facades/pairing.ts +329 -0
  859. package/src/facades/permissions.ts +165 -0
  860. package/src/facades/phoneNotifications.ts +41 -0
  861. package/src/facades/providerKeys.ts +31 -0
  862. package/src/facades/reports.ts +180 -0
  863. package/src/facades/session.ts +54 -0
  864. package/src/facades/settings.ts +57 -0
  865. package/src/facades/speakers.ts +152 -0
  866. package/src/facades/speech.ts +49 -0
  867. package/src/index.ts +214 -0
  868. package/src/internal.ts +155 -0
  869. package/src/runtime/bootstrap.ts +159 -0
  870. package/src/runtime/config.ts +155 -0
  871. package/src/runtime/scanQrSeam.ts +20 -0
  872. package/src/runtime/streamConfig.ts +34 -0
  873. package/src/services/AiTierResolution.ts +106 -0
  874. package/src/services/AppRegistry.ts +1245 -0
  875. package/src/services/AudioCloudUplink.ts +56 -0
  876. package/src/services/AudioPlaybackService.ts +873 -0
  877. package/src/services/AutomaticReportResult.ts +50 -0
  878. package/src/services/BlobStore.ts +823 -0
  879. package/src/services/CaptionsTesterReportService.ts +107 -0
  880. package/src/services/CloudAudioSubscriptionSync.ts +53 -0
  881. package/src/services/CloudClientService.ts +1031 -0
  882. package/src/services/CloudTranscriptE2EMetrics.ts +27 -0
  883. package/src/services/ConnectionCoordinator.ts +65 -0
  884. package/src/services/DevServerBridge.ts +334 -0
  885. package/src/services/DeviceEventRouter.ts +266 -0
  886. package/src/services/DeviceStoreHydration.ts +130 -0
  887. package/src/services/DisplayProcessor.ts +775 -0
  888. package/src/services/ForegroundLocationPermission.ts +24 -0
  889. package/src/services/GlassesReadiness.ts +103 -0
  890. package/src/services/GlassesSettingsSync.ts +140 -0
  891. package/src/services/GlassesStatusProjection.ts +73 -0
  892. package/src/services/HeadingService.ts +122 -0
  893. package/src/services/HotspotOtaTransport.ts +184 -0
  894. package/src/services/HotspotShutdown.ts +41 -0
  895. package/src/services/JSCrashController.ts +189 -0
  896. package/src/services/JSCrashloopReportService.ts +66 -0
  897. package/src/services/JSLogPipeline.ts +166 -0
  898. package/src/services/JSRouter.ts +555 -0
  899. package/src/services/LocalDisplayManager.ts +815 -0
  900. package/src/services/LocalMiniappDataMigration.ts +102 -0
  901. package/src/services/LocalMiniappRuntime.ts +5747 -0
  902. package/src/services/LocalMiniappStorage.ts +82 -0
  903. package/src/services/LocalMiniappUserIdentity.ts +79 -0
  904. package/src/services/LocalSttFallbackCoordinator.ts +247 -0
  905. package/src/services/MapboxTokenService.ts +118 -0
  906. package/src/services/MemoryCapture.ts +61 -0
  907. package/src/services/MemoryStore.ts +633 -0
  908. package/src/services/MicStateCoordinator.ts +259 -0
  909. package/src/services/MiniappEngine.ts +143 -0
  910. package/src/services/MiniappLauncher.ts +365 -0
  911. package/src/services/MiniappLiveness.ts +24 -0
  912. package/src/services/MiniappRunningRegistry.ts +57 -0
  913. package/src/services/NativeHttpResponse.ts +6 -0
  914. package/src/services/NativeNavigationService.ts +176 -0
  915. package/src/services/NavigationHandlers.ts +527 -0
  916. package/src/services/NavigationService.ts +926 -0
  917. package/src/services/NotificationsEmitter.ts +49 -0
  918. package/src/services/OfflineSpeechModelService.ts +168 -0
  919. package/src/services/OtaArtifactDownloader.ts +312 -0
  920. package/src/services/OtaInstallCoordinator.ts +1707 -0
  921. package/src/services/OtaService.ts +89 -0
  922. package/src/services/OtaUpdateCheckService.ts +550 -0
  923. package/src/services/PairingIdentity.ts +154 -0
  924. package/src/services/PhoneCalendarHelpers.ts +212 -0
  925. package/src/services/PhoneCalendarService.ts +61 -0
  926. package/src/services/PhoneCameraFovCoordinator.ts +210 -0
  927. package/src/services/PhoneLocationService.ts +120 -0
  928. package/src/services/PhoneNotificationsSync.ts +46 -0
  929. package/src/services/PhonePhotoCoordinator.ts +435 -0
  930. package/src/services/PhoneStreamCoordinator.ts +874 -0
  931. package/src/services/PhoneVideoCoordinator.ts +203 -0
  932. package/src/services/ProviderKeyValidation.ts +57 -0
  933. package/src/services/STTModelManager.ts +434 -0
  934. package/src/services/SceneRenderer.ts +320 -0
  935. package/src/services/SentenceTtsPipeline.ts +106 -0
  936. package/src/services/SpeakerIdModelManager.ts +151 -0
  937. package/src/services/SpeakerIdSync.ts +79 -0
  938. package/src/services/SpeakerLabelResolver.ts +140 -0
  939. package/src/services/SpeakerProfileStore.ts +265 -0
  940. package/src/services/SpeakerSegmentResolver.ts +194 -0
  941. package/src/services/StreamLifecycleController.ts +203 -0
  942. package/src/services/SupportProfileSync.ts +218 -0
  943. package/src/services/TTSModelManager.ts +466 -0
  944. package/src/services/TranscriptionRouting.ts +47 -0
  945. package/src/services/TtsTextSanitizer.ts +66 -0
  946. package/src/services/UIRouter.ts +250 -0
  947. package/src/services/WebviewBridge.ts +50 -0
  948. package/src/services/WifiAdbRequest.ts +53 -0
  949. package/src/services/asg/GalleryMediaIntegrityReportService.ts +72 -0
  950. package/src/services/asg/asgCameraApi.ts +1786 -0
  951. package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
  952. package/src/services/asg/cameraRollExportLedger.ts +122 -0
  953. package/src/services/asg/galleryMediaValidation.ts +185 -0
  954. package/src/services/asg/galleryNotices.ts +61 -0
  955. package/src/services/asg/galleryPathMigration.ts +22 -0
  956. package/src/services/asg/gallerySettingsService.ts +68 -0
  957. package/src/services/asg/gallerySyncNotifications.ts +235 -0
  958. package/src/services/asg/gallerySyncService.ts +2278 -0
  959. package/src/services/asg/galleryTransferLedger.ts +312 -0
  960. package/src/services/asg/localNetworkTransport.ts +169 -0
  961. package/src/services/asg/localStorageService.ts +652 -0
  962. package/src/services/asg/mediaProcessingQueue.ts +518 -0
  963. package/src/services/audioPlaybackAssets.ts +8 -0
  964. package/src/services/blobPaths.ts +86 -0
  965. package/src/services/cloudStreamApi.ts +142 -0
  966. package/src/services/effectiveCapabilities.ts +27 -0
  967. package/src/services/gallerySyncClock.ts +39 -0
  968. package/src/services/glassesClockSync.ts +115 -0
  969. package/src/services/manifestActions.ts +80 -0
  970. package/src/services/manifestVersionGate.ts +43 -0
  971. package/src/services/memoryStoreInstance.ts +70 -0
  972. package/src/services/navigation/roadNameResolver.ts +103 -0
  973. package/src/services/navigation/routesApiCodec.ts +69 -0
  974. package/src/services/otaDisplayState.ts +156 -0
  975. package/src/services/otaInstallPolicy.ts +132 -0
  976. package/src/services/otaLegacyMapping.ts +71 -0
  977. package/src/services/otaManifestUrl.ts +53 -0
  978. package/src/services/slimStreamStatus.ts +39 -0
  979. package/src/services/soniox/SonioxDirectService.ts +517 -0
  980. package/src/services/soniox/SonioxRealtimeClient.ts +349 -0
  981. package/src/services/soniox/SonioxTokenAssembler.ts +451 -0
  982. package/src/services/speakerProfileStoreInstance.ts +25 -0
  983. package/src/services/uiShim.ts +375 -0
  984. package/src/stores/apps.ts +626 -0
  985. package/src/stores/bluetoothSettingKeys.ts +35 -0
  986. package/src/stores/cloudClientStatus.ts +37 -0
  987. package/src/stores/connection.ts +69 -0
  988. package/src/stores/core.ts +32 -0
  989. package/src/stores/display.ts +121 -0
  990. package/src/stores/gallerySync.ts +384 -0
  991. package/src/stores/glasses.ts +314 -0
  992. package/src/stores/settings.ts +1299 -0
  993. package/src/stores/transcriptionDebug.ts +0 -0
  994. package/src/types/applet.ts +121 -0
  995. package/src/types/asg.ts +58 -0
  996. package/src/types/capabilities/even-realities-g1.ts +70 -0
  997. package/src/types/capabilities/even-realities-g2.ts +98 -0
  998. package/src/types/capabilities/mentra-display.ts +78 -0
  999. package/src/types/capabilities/mentra-live.ts +106 -0
  1000. package/src/types/capabilities/nimo.ts +84 -0
  1001. package/src/types/capabilities/none.ts +79 -0
  1002. package/src/types/capabilities/simulated-glasses.ts +95 -0
  1003. package/src/types/capabilities/vuzix-z100.ts +67 -0
  1004. package/src/types/enums.ts +27 -0
  1005. package/src/types/hardware.ts +220 -0
  1006. package/src/types/index.ts +38 -0
  1007. package/src/utils/GlobalEventEmitter.ts +15 -0
  1008. package/src/utils/cloudClient/RnUdpAdapter.ts +47 -0
  1009. package/src/utils/cloudClient/cloudSecureStore.ts +28 -0
  1010. package/src/utils/configuredDevHost.ts +17 -0
  1011. package/src/utils/debouncedPatch.ts +28 -0
  1012. package/src/utils/devLogging.ts +140 -0
  1013. package/src/utils/devMiniappLaunch.ts +196 -0
  1014. package/src/utils/diagnosticContext.ts +159 -0
  1015. package/src/utils/display/composer/ColumnComposer.ts +285 -0
  1016. package/src/utils/display/composer/index.ts +15 -0
  1017. package/src/utils/display/helpers/DisplayHelpers.ts +409 -0
  1018. package/src/utils/display/helpers/ScrollView.ts +326 -0
  1019. package/src/utils/display/helpers/index.ts +14 -0
  1020. package/src/utils/display/index.ts +273 -0
  1021. package/src/utils/display/measurer/TextMeasurer.ts +346 -0
  1022. package/src/utils/display/measurer/index.ts +21 -0
  1023. package/src/utils/display/measurer/script-detection.ts +218 -0
  1024. package/src/utils/display/profiles/g1.ts +236 -0
  1025. package/src/utils/display/profiles/g2.ts +39 -0
  1026. package/src/utils/display/profiles/index.ts +28 -0
  1027. package/src/utils/display/profiles/nex.ts +166 -0
  1028. package/src/utils/display/profiles/types.ts +132 -0
  1029. package/src/utils/display/profiles/z100.ts +198 -0
  1030. package/src/utils/display/scene/anchor.ts +39 -0
  1031. package/src/utils/display/scene/degrade.ts +80 -0
  1032. package/src/utils/display/scene/differ.ts +128 -0
  1033. package/src/utils/display/scene/index.ts +24 -0
  1034. package/src/utils/display/scene/process.ts +228 -0
  1035. package/src/utils/display/scene/store.ts +0 -0
  1036. package/src/utils/display/scene/types.ts +0 -0
  1037. package/src/utils/display/wrapper/TextWrapper.ts +546 -0
  1038. package/src/utils/display/wrapper/index.ts +15 -0
  1039. package/src/utils/display/wrapper/types.ts +102 -0
  1040. package/src/utils/e2eMetrics.ts +30 -0
  1041. package/src/utils/hardware/hardware.ts +171 -0
  1042. package/src/utils/hardware/index.ts +1 -0
  1043. package/src/utils/memory/search.ts +204 -0
  1044. package/src/utils/miniappDiagnostics.ts +226 -0
  1045. package/src/utils/miniappGlobals.ts +259 -0
  1046. package/src/utils/permissions/MediaLibraryPermissions.ts +161 -0
  1047. package/src/utils/permissions/galleryDisplayName.ts +28 -0
  1048. package/src/utils/speakerEmbedding.ts +58 -0
  1049. package/src/utils/storage/index.ts +2 -0
  1050. package/src/utils/storage/storage.ts +101 -0
  1051. package/src/utils/storage/zip.ts +13 -0
  1052. package/src/utils/timers/index.ts +2 -0
  1053. package/src/utils/timers/timers.ts +175 -0
@@ -0,0 +1,874 @@
1
+ /**
2
+ * PhoneStreamCoordinator — owns all local-miniapp streaming on the phone.
3
+ *
4
+ * Architecture:
5
+ * miniapp → SDK → LocalMiniappRuntime → coordinator
6
+ * coordinator → BluetoothSdk (BLE → glasses publisher)
7
+ * coordinator ↔ cloudStreamApi (managed only, cloud-v2 runtime provisioning)
8
+ * coordinator ↔ StreamLifecycleController (keep-alive heartbeat)
9
+ * coordinator → status listeners → routed back to miniapp(s)
10
+ *
11
+ * Single-stream constraint:
12
+ * At most ONE stream is active across all miniapps. The exception is that
13
+ * multiple miniapps can subscribe to a single managed stream that's already
14
+ * running — Cloudflare muxes one ingest into many viewers, so subscribers
15
+ * share the same playback URLs. Refcounted; teardown happens when the last
16
+ * subscriber releases.
17
+ *
18
+ * Status routing:
19
+ * Glasses publisher status arrives over BLE as `stream_status` events with
20
+ * a `streamId`. The coordinator's `owns(streamId)` lookup lets MantleManager
21
+ * route phone-owned status events here (not to cloud). For managed streams,
22
+ * we additionally poll Cloudflare's live-input status every 5s to surface
23
+ * what the OTHER end of the pipe sees.
24
+ *
25
+ * Important: this is the ONLY place that mints `streamId`s for phone-owned
26
+ * streams. We use a `phone-` prefix so they're trivially distinguishable from
27
+ * cloud-minted IDs in logs and from cloud-SDK app streams that flow through
28
+ * the legacy path.
29
+ */
30
+
31
+ import BluetoothSdk from "@glassly/bluetooth-sdk/internal"
32
+ import type {
33
+ KeepAliveAckEvent,
34
+ StreamResolvedConfig,
35
+ StreamStartRequest,
36
+ StreamStatusEvent,
37
+ } from "@glassly/bluetooth-sdk/internal"
38
+ import {isGlassesConnected} from "./GlassesReadiness"
39
+ import {useGlassesStore} from "../stores/glasses"
40
+
41
+ import {StreamLifecycleController, type LifecycleLogger} from "./StreamLifecycleController"
42
+ import {slimStreamStatusEvent, streamStatusSignature} from "./slimStreamStatus"
43
+ import {
44
+ getManagedStreamStatus,
45
+ provisionManagedStream,
46
+ teardownManagedStream,
47
+ type CloudflareStatus,
48
+ type ProvisionResult,
49
+ type RestreamDestinationInput,
50
+ } from "./cloudStreamApi"
51
+
52
+ /**
53
+ * Default cadence + thresholds. Exposed via {@link CoordinatorTimings} so tests
54
+ * can shorten them; production code should never override these.
55
+ */
56
+ const DEFAULT_TIMINGS = {
57
+ keepAliveIntervalMs: 15_000,
58
+ ackTimeoutMs: 10_000,
59
+ maxMissedAcks: 3,
60
+ cloudflareStatusPollMs: 5_000,
61
+ // During WHIP startup, probe quickly so readiness is not quantized to the
62
+ // steady-state 5s monitoring cadence. The delay backs off on each miss.
63
+ cloudflareStartupPollInitialMs: 500,
64
+ // Cloudflare typically needs ~5-10s after first frame before HLS is live.
65
+ hlsReadinessInitialDelayMs: 5_000,
66
+ hlsReadinessPollMs: 2_000,
67
+ hlsReadinessMaxAttempts: 30,
68
+ } as const
69
+
70
+ type TimingConfig = {[K in keyof typeof DEFAULT_TIMINGS]: number}
71
+ export type CoordinatorTimings = Partial<TimingConfig>
72
+
73
+ // Console-backed minimal logger; replaces pino on the phone.
74
+ const consoleLogger: LifecycleLogger = {
75
+ child: (bindings) => ({
76
+ ...consoleLogger,
77
+ debug: (...args) => console.debug("[STREAM]", bindings, ...args),
78
+ warn: (...args) => console.warn("[STREAM]", bindings, ...args),
79
+ error: (...args) => console.error("[STREAM]", bindings, ...args),
80
+ }),
81
+ debug: (...args) => console.debug("[STREAM]", ...args),
82
+ warn: (...args) => console.warn("[STREAM]", ...args),
83
+ error: (...args) => console.error("[STREAM]", ...args),
84
+ }
85
+
86
+ export interface StartUnmanagedOptions {
87
+ streamUrl: string
88
+ video?: StreamStartRequest["video"]
89
+ audio?: StreamStartRequest["audio"]
90
+ sound?: boolean
91
+ /** Optional Bearer token for WHIP Authorization (custom authenticated endpoints). */
92
+ authToken?: string
93
+ }
94
+
95
+ export interface StartManagedOptions {
96
+ restreamDestinations?: RestreamDestinationInput[]
97
+ video?: StreamStartRequest["video"]
98
+ audio?: StreamStartRequest["audio"]
99
+ sound?: boolean
100
+ /**
101
+ * Ingest protocol preference — a real latency/durability trade on Cloudflare:
102
+ * - "srt" (default): SRT ingest -> LL-HLS playback (~10-20s glass-to-screen),
103
+ * with shareable HLS/DASH URLs and automatic recording.
104
+ * - "whip": WebRTC ingest -> WHEP playback (<1s glass-to-screen), but NO
105
+ * HLS/DASH playback and NO recording (Cloudflare limitation; the returned
106
+ * hlsUrl will serve 204 forever).
107
+ * - "rtmp": RTMPS ingest over TCP 443 -> HLS playback. Survives networks
108
+ * that drop WHIP/SRT UDP.
109
+ */
110
+ ingest?: "srt" | "whip" | "rtmp"
111
+ }
112
+
113
+ export interface StreamPublisherStartResult {
114
+ streamId: string
115
+ status: string
116
+ resolvedConfig?: StreamResolvedConfig
117
+ }
118
+
119
+ export interface ManagedStartResult extends StreamPublisherStartResult {
120
+ liveInputId: string
121
+ /** Playback mode this stream supports: "hls" (SRT/RTMP ingest — use hlsUrl/
122
+ * dashUrl, recording on) or "webrtc" (WHIP ingest — use webrtcUrl/WHEP,
123
+ * sub-second, no HLS, no recording). */
124
+ mode: "hls" | "webrtc"
125
+ hlsUrl: string
126
+ dashUrl: string
127
+ webrtcUrl?: string
128
+ }
129
+
130
+ export type StreamStatusUpdate = {
131
+ streamId: string
132
+ source: "glasses" | "cloudflare" | "coordinator"
133
+ status: string
134
+ data?: Record<string, unknown>
135
+ }
136
+
137
+ export type StatusSubscriber = (packageName: string, update: StreamStatusUpdate) => void
138
+
139
+ interface UnmanagedEntry {
140
+ kind: "unmanaged"
141
+ streamId: string
142
+ packageName: string
143
+ streamUrl: string
144
+ }
145
+
146
+ interface ManagedEntry {
147
+ kind: "managed"
148
+ streamId: string
149
+ liveInputId: string
150
+ ingestUrl: string
151
+ /** Playback mode the chosen ingest supports: SRT/RTMP feed HLS; WHIP feeds
152
+ * only WHEP. Readiness is gated differently per mode. */
153
+ mode: "hls" | "webrtc"
154
+ hlsUrl: string
155
+ dashUrl: string
156
+ webrtcUrl?: string
157
+ publisherStart?: StreamPublisherStartResult
158
+ subscribers: Set<string>
159
+ hlsReady: boolean
160
+ hlsReadyResolvers: Array<(result: ManagedStartResult) => void>
161
+ hlsReadyRejecters: Array<(err: Error) => void>
162
+ cloudflareTimer?: ReturnType<typeof setTimeout>
163
+ hlsTimer?: ReturnType<typeof setInterval>
164
+ hlsAttempts: number
165
+ /** Cloudflare status probes made during this stream session. */
166
+ cloudflareAttempts: number
167
+ /** Wall-clock origin for end-to-end managed startup diagnostics. */
168
+ startupStartedAtMs: number
169
+ }
170
+
171
+ type Entry = UnmanagedEntry | ManagedEntry
172
+
173
+ export class StreamConflictError extends Error {
174
+ constructor(
175
+ public readonly code: string,
176
+ message: string,
177
+ /** Pipeline stage that failed (provision | command | publish | playback). */
178
+ public readonly stage?: string,
179
+ /** Transport in play at the failure (cloud-rest | ble | wifi). */
180
+ public readonly transport?: string,
181
+ ) {
182
+ super(message)
183
+ this.name = "StreamConflictError"
184
+ }
185
+ }
186
+
187
+ /**
188
+ * Fail fast if glasses aren't connected — BEFORE provisioning. Without this a
189
+ * managed start would create a provider live input, fail the BLE command, and
190
+ * tear the input down again: a slow, billable no-op with a confusing error.
191
+ */
192
+ function assertGlassesConnected(): void {
193
+ if (!isGlassesConnected(useGlassesStore.getState().connection)) {
194
+ throw new StreamConflictError("GLASSES_NOT_CONNECTED", "Glasses are not connected", "command", "ble")
195
+ }
196
+ }
197
+
198
+ export class PhoneStreamCoordinator {
199
+ private current: Entry | null = null
200
+ private lifecycle: StreamLifecycleController | null = null
201
+ private statusSubscriber: StatusSubscriber | null = null
202
+ private idCounter = 0
203
+ private readonly timings: TimingConfig
204
+ /**
205
+ * Serializes state transitions (start, stop, teardown). Without it, a
206
+ * second `start*` racing with the first can pass the `this.current === null`
207
+ * pre-check while the first is still awaiting its provision/BLE work, and
208
+ * end up provisioning two separate streams. A teardown racing with a start
209
+ * can clear `current` mid-stop and let the start fire BLE writes that
210
+ * collide with the in-flight stopStream.
211
+ */
212
+ private inFlight: Promise<void> = Promise.resolve()
213
+ /** Drop identical stream_status fanouts within one session. */
214
+ private lastFanoutSignature: string | null = null
215
+ /** Send full resolvedConfig only once per stream session. */
216
+ private resolvedConfigForwarded = false
217
+
218
+ constructor(timings: CoordinatorTimings = {}) {
219
+ this.timings = {...DEFAULT_TIMINGS, ...timings}
220
+ }
221
+
222
+ /**
223
+ * Run `work` under the transition lock. Each call awaits the previous
224
+ * transition before re-evaluating preconditions, so e.g. two concurrent
225
+ * `startManaged` calls are observed sequentially.
226
+ */
227
+ private async runExclusive<T>(work: () => Promise<T>): Promise<T> {
228
+ const prev = this.inFlight
229
+ let release!: () => void
230
+ this.inFlight = new Promise<void>((r) => (release = r))
231
+ try {
232
+ await prev
233
+ return await work()
234
+ } finally {
235
+ release()
236
+ }
237
+ }
238
+
239
+ /**
240
+ * Register the function that routes status updates to miniapps.
241
+ * LocalMiniappRuntime wires this so updates become EVENT envelopes on the
242
+ * `stream_status` stream for every subscribing miniapp.
243
+ */
244
+ setStatusSubscriber(cb: StatusSubscriber): void {
245
+ this.statusSubscriber = cb
246
+ }
247
+
248
+ /**
249
+ * True when a phone-owned stream currently uses this streamId. For managed
250
+ * streams, all subscribers share the same streamId so a single equality
251
+ * check covers the multi-subscriber case.
252
+ */
253
+ owns(streamId: string): boolean {
254
+ return this.current !== null && this.current.streamId === streamId
255
+ }
256
+
257
+ /** Report-safe stream ownership snapshot for incident diagnostics. */
258
+ getDiagnosticSnapshot(): Record<string, unknown> {
259
+ if (!this.current) return {active: false}
260
+ return this.current.kind === "managed"
261
+ ? {
262
+ active: true,
263
+ kind: this.current.kind,
264
+ streamId: this.current.streamId,
265
+ subscribers: [...this.current.subscribers].sort(),
266
+ mode: this.current.mode,
267
+ playbackReady: this.current.hlsReady,
268
+ }
269
+ : {
270
+ active: true,
271
+ kind: this.current.kind,
272
+ streamId: this.current.streamId,
273
+ ownerPackageName: this.current.packageName,
274
+ }
275
+ }
276
+
277
+ async startUnmanaged(packageName: string, opts: StartUnmanagedOptions): Promise<StreamPublisherStartResult> {
278
+ // Pre-check the obvious-bad input before queueing — the lock is for
279
+ // serializing state transitions, not for validating arguments.
280
+ if (!opts.streamUrl || typeof opts.streamUrl !== "string") {
281
+ throw new StreamConflictError("STREAM_URL_REQUIRED", "streamUrl is required")
282
+ }
283
+ assertGlassesConnected()
284
+ return this.runExclusive(async () => {
285
+ if (this.current) {
286
+ throw new StreamConflictError(
287
+ "STREAM_ALREADY_ACTIVE",
288
+ `A ${this.current.kind} stream is already active. Stop it before starting a new one.`,
289
+ )
290
+ }
291
+
292
+ const streamId = this.mintId("u")
293
+ const entry: UnmanagedEntry = {
294
+ kind: "unmanaged",
295
+ streamId,
296
+ packageName,
297
+ streamUrl: opts.streamUrl,
298
+ }
299
+ // Claim the slot BEFORE the BLE call so a concurrent caller waiting on
300
+ // the lock sees the in-progress entry and rejects with the conflict.
301
+ this.current = entry
302
+
303
+ try {
304
+ const event = await BluetoothSdk.startExternallyManagedStream({
305
+ type: "start_stream",
306
+ streamUrl: opts.streamUrl,
307
+ streamId,
308
+ sound: opts.sound ?? true,
309
+ // The native bridge rejects explicit `undefined` values ("Value is
310
+ // undefined, expected an Object") — only include what was provided.
311
+ ...(opts.video !== undefined ? {video: opts.video} : {}),
312
+ ...(opts.audio !== undefined ? {audio: opts.audio} : {}),
313
+ ...(opts.authToken ? {authToken: opts.authToken} : {}),
314
+ })
315
+ const result = publisherStartResult(streamId, event)
316
+ this.startLifecycle(streamId)
317
+ return result
318
+ } catch (err) {
319
+ this.current = null
320
+ throw err
321
+ }
322
+ })
323
+ }
324
+
325
+ async startManaged(packageName: string, opts: StartManagedOptions): Promise<ManagedStartResult> {
326
+ const startupStartedAtMs = Date.now()
327
+ // streamId doesn't exist yet — it's minted a few lines below, once we
328
+ // know this is a fresh provision rather than a join onto an existing one.
329
+ console.info("[STREAM_STARTUP]", {
330
+ stage: "requested",
331
+ packageName,
332
+ ingest: opts.ingest,
333
+ elapsedMs: 0,
334
+ })
335
+ // Two-phase: the entry-claim runs under the transition lock; the wait for
336
+ // HLS readiness happens AFTER the lock releases so a long warm-up doesn't
337
+ // block subsequent start/stop transitions on this coordinator.
338
+ assertGlassesConnected()
339
+ type JoinDecision =
340
+ | {kind: "join"; entry: ManagedEntry; immediate: ManagedStartResult | null}
341
+ | {kind: "fresh"; entry: ManagedEntry}
342
+
343
+ const decision = await this.runExclusive(async (): Promise<JoinDecision> => {
344
+ if (this.current && this.current.kind === "unmanaged") {
345
+ throw new StreamConflictError(
346
+ "STREAM_ALREADY_ACTIVE",
347
+ "An unmanaged stream is already active. Stop it before starting a managed stream.",
348
+ )
349
+ }
350
+
351
+ // Join an existing managed stream if one is already running.
352
+ if (this.current && this.current.kind === "managed") {
353
+ const existing = this.current
354
+ // Restream destinations are immutable after provision — a second
355
+ // caller trying to dictate destinations on an already-live stream
356
+ // is a likely bug or a feature we don't yet support.
357
+ if (opts.restreamDestinations && opts.restreamDestinations.length > 0) {
358
+ throw new StreamConflictError(
359
+ "STREAM_DESTINATIONS_LOCKED",
360
+ "Restream destinations cannot be modified on an already-running managed stream.",
361
+ )
362
+ }
363
+ existing.subscribers.add(packageName)
364
+ const immediate: ManagedStartResult | null = existing.hlsReady ? managedStartResult(existing) : null
365
+ return {kind: "join", entry: existing, immediate}
366
+ }
367
+
368
+ // Fresh provision — claim slot BEFORE awaiting Cloudflare so a
369
+ // concurrent caller queued behind us sees a managed stream in flight
370
+ // and joins instead of double-provisioning.
371
+ const provision = await provisionManagedStream(opts.restreamDestinations)
372
+ const streamId = this.mintId("m")
373
+ const ingestUrl = pickIngestUrl(provision, opts.ingest)
374
+ const mode: ManagedEntry["mode"] = ingestUrl === provision.webrtcPublishUrl ? "webrtc" : "hls"
375
+
376
+ const entry: ManagedEntry = {
377
+ kind: "managed",
378
+ streamId,
379
+ liveInputId: provision.liveInputId,
380
+ ingestUrl,
381
+ mode,
382
+ hlsUrl: provision.hlsUrl,
383
+ dashUrl: provision.dashUrl,
384
+ webrtcUrl: provision.webrtcUrl,
385
+ subscribers: new Set([packageName]),
386
+ hlsReady: false,
387
+ hlsReadyResolvers: [],
388
+ hlsReadyRejecters: [],
389
+ hlsAttempts: 0,
390
+ cloudflareAttempts: 0,
391
+ startupStartedAtMs,
392
+ }
393
+ this.current = entry
394
+
395
+ console.info("[STREAM_STARTUP]", {
396
+ streamId,
397
+ stage: "provisioned",
398
+ mode,
399
+ elapsedMs: Date.now() - startupStartedAtMs,
400
+ })
401
+
402
+ try {
403
+ const event = await BluetoothSdk.startExternallyManagedStream({
404
+ type: "start_stream",
405
+ streamUrl: ingestUrl,
406
+ streamId,
407
+ sound: opts.sound ?? true,
408
+ // See startUnmanaged: the native bridge rejects explicit `undefined`.
409
+ ...(opts.video !== undefined ? {video: opts.video} : {}),
410
+ ...(opts.audio !== undefined ? {audio: opts.audio} : {}),
411
+ })
412
+ entry.publisherStart = publisherStartResult(streamId, event)
413
+ console.info("[STREAM_STARTUP]", {
414
+ streamId,
415
+ stage: "publisher_ready",
416
+ mode,
417
+ elapsedMs: Date.now() - startupStartedAtMs,
418
+ })
419
+ } catch (err) {
420
+ this.current = null
421
+ await teardownManagedStream(provision.liveInputId).catch(() => undefined)
422
+ throw err
423
+ }
424
+
425
+ this.startLifecycle(streamId)
426
+ this.startCloudflareStatusPoll(entry)
427
+ // hls mode: readiness = a real HLS manifest exists. webrtc mode: HLS
428
+ // never materializes (Cloudflare WHIP limitation) — readiness resolves
429
+ // off the status poll's first "connected" instead.
430
+ if (entry.mode === "hls") {
431
+ this.startHlsReadinessPoll(entry)
432
+ }
433
+ return {kind: "fresh", entry}
434
+ })
435
+
436
+ if (decision.kind === "join" && decision.immediate) {
437
+ return decision.immediate
438
+ }
439
+
440
+ // The first Cloudflare probe runs immediately and can complete before the
441
+ // transition lock releases. Avoid stranding this caller after readiness
442
+ // resolvers have already been drained.
443
+ if (decision.entry.hlsReady) {
444
+ return managedStartResult(decision.entry)
445
+ }
446
+
447
+ // Wait for playback readiness OUTSIDE the lock — readiness can take ~10s
448
+ // and we don't want to block other transitions for that long.
449
+ return new Promise<ManagedStartResult>((resolve, reject) => {
450
+ decision.entry.hlsReadyResolvers.push(resolve)
451
+ decision.entry.hlsReadyRejecters.push(reject)
452
+ })
453
+ }
454
+
455
+ async stop(packageName: string, streamId?: string): Promise<void> {
456
+ await this.runExclusive(async () => {
457
+ if (!this.current) return
458
+
459
+ // If a streamId was passed but doesn't match, ignore — silent no-op
460
+ // matches the cloud's tolerant behavior.
461
+ if (streamId && this.current.streamId !== streamId) return
462
+
463
+ if (this.current.kind === "managed") {
464
+ const entry = this.current
465
+ entry.subscribers.delete(packageName)
466
+ if (entry.subscribers.size > 0) {
467
+ // Other miniapps still subscribed; keep the stream alive.
468
+ return
469
+ }
470
+ } else if (this.current.packageName !== packageName) {
471
+ // Unmanaged stream: only the owner can stop it.
472
+ return
473
+ }
474
+
475
+ await this.teardownLocked("explicit_stop")
476
+ })
477
+ }
478
+
479
+ /**
480
+ * Called by MantleManager when a `stream_status` event arrives from glasses
481
+ * and the registry says it's phone-owned.
482
+ */
483
+ handleGlassesStatus(event: StreamStatusEvent): void {
484
+ if (!this.current) return
485
+ if (event.streamId && event.streamId !== this.current.streamId) return
486
+
487
+ this.lifecycle?.recordActivity()
488
+ const includeResolvedConfig = !this.resolvedConfigForwarded && !!event.resolvedConfig
489
+ if (includeResolvedConfig) this.resolvedConfigForwarded = true
490
+ const slimData = slimStreamStatusEvent(event, {includeResolvedConfig})
491
+ const signature = streamStatusSignature(slimData)
492
+ if (signature === this.lastFanoutSignature) return
493
+ this.lastFanoutSignature = signature
494
+
495
+ this.fanout({
496
+ streamId: this.current.streamId,
497
+ source: "glasses",
498
+ status: event.status,
499
+ data: slimData,
500
+ })
501
+
502
+ // Glasses-reported TERMINAL states unwind the coordinator. Terminal means
503
+ // the publisher gave up or stopped — NOT a transient `kind:"error"`: the
504
+ // glasses publisher auto-recovers (error → reconnecting → reconnected),
505
+ // and tearing down on the first hiccup deletes the live input out from
506
+ // under a publisher that comes right back (it then retries into a dead
507
+ // input forever). A publisher that errors and never recovers is reaped by
508
+ // the keep-alive ack timeout. Queue the teardown through the transition
509
+ // lock so it serializes with any start/stop currently in flight.
510
+ const isStopped =
511
+ (event.kind === "lifecycle" && event.status === "stopped") ||
512
+ (event.kind === "snapshot" && event.status === "stopped")
513
+ const isGiveUp = event.kind === "reconnect" && event.status === "reconnect_failed"
514
+ if (isGiveUp || isStopped) {
515
+ const reason = isGiveUp ? "glasses_gave_up" : "glasses_stopped"
516
+ const targetStreamId = this.current.streamId
517
+ void this.runExclusive(async () => {
518
+ // The stream we wanted to tear down may already be gone (e.g. another
519
+ // teardown won the lock and unwound it). Guard before acting.
520
+ if (this.current?.streamId !== targetStreamId) return
521
+ await this.teardownLocked(reason, {sendBleStop: false})
522
+ })
523
+ }
524
+ }
525
+
526
+ /** Called by MantleManager when a phone-owned keep_alive_ack arrives. */
527
+ handleKeepAliveAck(event: KeepAliveAckEvent): void {
528
+ if (!event.ackId) return
529
+ this.lifecycle?.handleAck(event.ackId)
530
+ }
531
+
532
+ // ===========================================================================
533
+ // Internal
534
+ // ===========================================================================
535
+
536
+ private mintId(prefix: "u" | "m"): string {
537
+ this.idCounter += 1
538
+ return `phone-${prefix}-${Date.now().toString(36)}-${this.idCounter}`
539
+ }
540
+
541
+ private startLifecycle(streamId: string): void {
542
+ this.lifecycle?.dispose()
543
+ const ctrl = new StreamLifecycleController(
544
+ {
545
+ logger: consoleLogger,
546
+ streamId,
547
+ keepAliveIntervalMs: this.timings.keepAliveIntervalMs,
548
+ ackTimeoutMs: this.timings.ackTimeoutMs,
549
+ maxMissedAcks: this.timings.maxMissedAcks,
550
+ },
551
+ {
552
+ sendKeepAlive: async (ackId) => {
553
+ await BluetoothSdk.sendExternallyManagedStreamKeepAlive({
554
+ type: "keep_stream_alive",
555
+ streamId,
556
+ ackId,
557
+ })
558
+ },
559
+ onTimeout: async () => {
560
+ this.fanout({
561
+ streamId,
562
+ source: "coordinator",
563
+ status: "error",
564
+ data: {reason: "keep_alive_timeout"},
565
+ })
566
+ await this.runExclusive(async () => {
567
+ // The stream this timeout was bound to may already be gone.
568
+ if (this.current?.streamId !== streamId) return
569
+ await this.teardownLocked("keep_alive_timeout")
570
+ })
571
+ },
572
+ },
573
+ )
574
+ ctrl.setActive(true)
575
+ this.lifecycle = ctrl
576
+ }
577
+
578
+ private startCloudflareStatusPoll(entry: ManagedEntry): void {
579
+ // Keep the existing ~60s readiness budget while decoupling it from probe
580
+ // count. Startup probes begin immediately and back off to the normal 5s
581
+ // monitoring cadence, so a just-connected publisher is noticed quickly
582
+ // without increasing steady-state traffic.
583
+ const connectTimeoutMs = Math.max(1, this.timings.hlsReadinessMaxAttempts * this.timings.hlsReadinessPollMs)
584
+ const pollingStartedAtMs = Date.now()
585
+
586
+ const scheduleNext = () => {
587
+ if (this.current !== entry) return
588
+ const waitingForWebRtc = entry.mode === "webrtc" && !entry.hlsReady
589
+ const elapsedMs = Date.now() - pollingStartedAtMs
590
+ const remainingMs = Math.max(0, connectTimeoutMs - elapsedMs)
591
+ const startupDelayMs = Math.min(
592
+ this.timings.cloudflareStatusPollMs,
593
+ this.timings.cloudflareStartupPollInitialMs * 2 ** Math.min(Math.max(0, entry.cloudflareAttempts - 1), 10),
594
+ )
595
+ const delayMs = waitingForWebRtc ? Math.min(startupDelayMs, remainingMs) : this.timings.cloudflareStatusPollMs
596
+ entry.cloudflareTimer = setTimeout(() => void poll(), delayMs)
597
+ }
598
+
599
+ const poll = async () => {
600
+ if (this.current !== entry) return
601
+ const requestStartedAtMs = Date.now()
602
+ let keepPolling = true
603
+ entry.cloudflareAttempts += 1
604
+ try {
605
+ const status: CloudflareStatus = await getManagedStreamStatus(entry.liveInputId)
606
+ console.debug("[STREAM_STARTUP]", {
607
+ streamId: entry.streamId,
608
+ stage: "cloudflare_probe",
609
+ connected: status.isConnected,
610
+ attempt: entry.cloudflareAttempts,
611
+ requestMs: Date.now() - requestStartedAtMs,
612
+ elapsedMs: Date.now() - entry.startupStartedAtMs,
613
+ })
614
+ this.fanout({
615
+ streamId: entry.streamId,
616
+ source: "cloudflare",
617
+ status: status.isConnected ? "connected" : "disconnected",
618
+ data: status as unknown as Record<string, unknown>,
619
+ })
620
+ // webrtc mode readiness: first "connected" means WHEP playback is
621
+ // available (WebRTC playback follows the ingest directly; there is no
622
+ // manifest to probe).
623
+ if (entry.mode === "webrtc" && !entry.hlsReady) {
624
+ if (status.isConnected) {
625
+ entry.hlsReady = true
626
+ console.info("[STREAM_STARTUP]", {
627
+ streamId: entry.streamId,
628
+ stage: "playback_ready",
629
+ mode: entry.mode,
630
+ probes: entry.cloudflareAttempts,
631
+ elapsedMs: Date.now() - entry.startupStartedAtMs,
632
+ })
633
+ const result = managedStartResult(entry)
634
+ for (const r of entry.hlsReadyResolvers) r(result)
635
+ entry.hlsReadyResolvers = []
636
+ entry.hlsReadyRejecters = []
637
+ this.fanout({
638
+ streamId: entry.streamId,
639
+ source: "coordinator",
640
+ status: "webrtc_ready",
641
+ data: result as unknown as Record<string, unknown>,
642
+ })
643
+ } else {
644
+ if (Date.now() - pollingStartedAtMs >= connectTimeoutMs) {
645
+ const err = new Error(`WebRTC ingest never reached Cloudflare after ${connectTimeoutMs}ms`)
646
+ for (const reject of entry.hlsReadyRejecters) reject(err)
647
+ entry.hlsReadyResolvers = []
648
+ entry.hlsReadyRejecters = []
649
+ this.fanout({
650
+ streamId: entry.streamId,
651
+ source: "coordinator",
652
+ status: "error",
653
+ data: {reason: "webrtc_not_connected"},
654
+ })
655
+ const targetStreamId = entry.streamId
656
+ void this.runExclusive(async () => {
657
+ if (this.current?.streamId !== targetStreamId) return
658
+ await this.teardownLocked("webrtc_not_connected")
659
+ })
660
+ keepPolling = false
661
+ }
662
+ }
663
+ }
664
+ } catch (err) {
665
+ console.warn("[STREAM] cloudflare status poll failed:", err)
666
+ if (entry.mode === "webrtc" && !entry.hlsReady && Date.now() - pollingStartedAtMs >= connectTimeoutMs) {
667
+ const timeoutErr = new Error(`WebRTC ingest status could not be confirmed after ${connectTimeoutMs}ms`)
668
+ for (const reject of entry.hlsReadyRejecters) reject(timeoutErr)
669
+ entry.hlsReadyResolvers = []
670
+ entry.hlsReadyRejecters = []
671
+ const targetStreamId = entry.streamId
672
+ void this.runExclusive(async () => {
673
+ if (this.current?.streamId !== targetStreamId) return
674
+ await this.teardownLocked("webrtc_status_unavailable")
675
+ })
676
+ keepPolling = false
677
+ }
678
+ } finally {
679
+ if (keepPolling) scheduleNext()
680
+ }
681
+ }
682
+
683
+ // The glasses publisher has already reported streaming, so the first
684
+ // status request is useful now. Most starts avoid the old blind 5s wait.
685
+ void poll()
686
+ }
687
+
688
+ private startHlsReadinessPoll(entry: ManagedEntry): void {
689
+ // Skip the first few seconds — Cloudflare doesn't have first-frame yet,
690
+ // and the HEAD requests would all 404 and burn battery.
691
+ const tick = async () => {
692
+ if (this.current !== entry) return
693
+ entry.hlsAttempts += 1
694
+ try {
695
+ // Require a real manifest (200 with a body), not just res.ok — the
696
+ // playback edge returns 204 No Content while the input has no
697
+ // HLS-capable frames (e.g. WebRTC ingest), and 204 is "ok".
698
+ const res = await fetch(entry.hlsUrl, {method: "HEAD"})
699
+ if (res.status === 200) {
700
+ entry.hlsReady = true
701
+ console.info("[STREAM_STARTUP]", {
702
+ streamId: entry.streamId,
703
+ stage: "playback_ready",
704
+ mode: entry.mode,
705
+ probes: entry.hlsAttempts,
706
+ elapsedMs: Date.now() - entry.startupStartedAtMs,
707
+ })
708
+ if (entry.hlsTimer) {
709
+ clearInterval(entry.hlsTimer)
710
+ entry.hlsTimer = undefined
711
+ }
712
+ const result = managedStartResult(entry)
713
+ for (const r of entry.hlsReadyResolvers) r(result)
714
+ entry.hlsReadyResolvers = []
715
+ entry.hlsReadyRejecters = []
716
+ this.fanout({
717
+ streamId: entry.streamId,
718
+ source: "coordinator",
719
+ status: "hls_ready",
720
+ data: result as unknown as Record<string, unknown>,
721
+ })
722
+ return
723
+ }
724
+ } catch {
725
+ // 404 / network blip is expected while Cloudflare warms up.
726
+ }
727
+ if (entry.hlsAttempts >= this.timings.hlsReadinessMaxAttempts) {
728
+ if (entry.hlsTimer) {
729
+ clearInterval(entry.hlsTimer)
730
+ entry.hlsTimer = undefined
731
+ }
732
+ const err = new Error(
733
+ `HLS playback URL did not become ready after ${this.timings.hlsReadinessMaxAttempts} attempts`,
734
+ )
735
+ for (const reject of entry.hlsReadyRejecters) reject(err)
736
+ entry.hlsReadyResolvers = []
737
+ entry.hlsReadyRejecters = []
738
+ this.fanout({
739
+ streamId: entry.streamId,
740
+ source: "coordinator",
741
+ status: "error",
742
+ data: {reason: "hls_not_ready"},
743
+ })
744
+ const targetStreamId = entry.streamId
745
+ void this.runExclusive(async () => {
746
+ if (this.current?.streamId !== targetStreamId) return
747
+ await this.teardownLocked("hls_not_ready")
748
+ })
749
+ }
750
+ }
751
+ setTimeout(() => {
752
+ // Guard: stream may have been torn down during the initial delay.
753
+ if (this.current !== entry) return
754
+ entry.hlsTimer = setInterval(tick, this.timings.hlsReadinessPollMs)
755
+ }, this.timings.hlsReadinessInitialDelayMs)
756
+ }
757
+
758
+ private fanout(update: StreamStatusUpdate): void {
759
+ if (!this.current || !this.statusSubscriber) return
760
+ const targets = this.current.kind === "managed" ? Array.from(this.current.subscribers) : [this.current.packageName]
761
+ for (const pkg of targets) {
762
+ try {
763
+ this.statusSubscriber(pkg, update)
764
+ } catch (err) {
765
+ console.warn("[STREAM] statusSubscriber threw:", err)
766
+ }
767
+ }
768
+ }
769
+
770
+ /**
771
+ * Run teardown of the currently-active stream. Caller must hold the
772
+ * transition lock (see {@link runExclusive}). Keeps `this.current`
773
+ * populated until BluetoothSdk.stopStream resolves so a concurrent caller
774
+ * waiting on the lock can't claim the slot mid-stop and have its
775
+ * startStream BLE write collide with our in-flight stopStream.
776
+ */
777
+ private async teardownLocked(reason: string, options: {sendBleStop?: boolean} = {}): Promise<void> {
778
+ const entry = this.current
779
+ if (!entry) return
780
+ const sendBleStop = options.sendBleStop !== false
781
+
782
+ this.lastFanoutSignature = null
783
+ this.resolvedConfigForwarded = false
784
+
785
+ // Dispose the lifecycle controller immediately so it doesn't fire one
786
+ // more keep-alive against a stream we're tearing down. The transition
787
+ // lock guarantees no new lifecycle is started concurrently.
788
+ this.lifecycle?.dispose()
789
+ this.lifecycle = null
790
+
791
+ if (entry.kind === "managed") {
792
+ if (entry.cloudflareTimer) clearTimeout(entry.cloudflareTimer)
793
+ if (entry.hlsTimer) clearInterval(entry.hlsTimer)
794
+ // Reject any still-pending HLS readiness waiters.
795
+ const pendingErr = new Error(`Stream torn down: ${reason}`)
796
+ for (const reject of entry.hlsReadyRejecters) reject(pendingErr)
797
+ entry.hlsReadyResolvers = []
798
+ entry.hlsReadyRejecters = []
799
+ // Cloudflare DELETE is fire-and-forget — failing it doesn't undo the
800
+ // BLE stop we're about to do, and Cloudflare's idle-input scavenger
801
+ // will eventually clean up leaked inputs.
802
+ teardownManagedStream(entry.liveInputId).catch((err) => {
803
+ console.warn("[STREAM] teardownManagedStream failed:", err)
804
+ })
805
+ }
806
+
807
+ try {
808
+ if (sendBleStop) {
809
+ await BluetoothSdk.stopStream()
810
+ }
811
+ } catch (err) {
812
+ console.warn("[STREAM] BluetoothSdk.stopStream failed:", err)
813
+ } finally {
814
+ // Release the slot AFTER the BLE stop finished, so the next start can
815
+ // safely write its own start_stream without colliding with ours.
816
+ // Only clear if we're still the active entry (defensive — runExclusive
817
+ // serializes us, so this should always be true).
818
+ if (this.current === entry) this.current = null
819
+ }
820
+ }
821
+ }
822
+
823
+ function pickIngestUrl(p: ProvisionResult, preference?: "srt" | "whip" | "rtmp"): string {
824
+ // Glasses' StreamCommandHandler detects protocol from URL prefix.
825
+ //
826
+ // Default priority: SRT > RTMP > WHIP. SRT first: Cloudflare's WebRTC (WHIP)
827
+ // ingest does NOT feed HLS/DASH playback or recording — a WHIP-ingested
828
+ // managed stream reports "connected" while its hlsUrl serves 204 forever,
829
+ // which breaks the managed contract (subscribers share HLS playback). SRT
830
+ // also survives office firewalls that kill RTMPS:443 mid-handshake.
831
+ //
832
+ // "whip" preference flips the trade: sub-second WHEP playback for
833
+ // live-monitor use cases, accepting no HLS and no recording.
834
+ // "rtmp" prefers TCP 443 ingest so networks that drop WHIP/SRT UDP still
835
+ // get HLS playback. Callers must request it explicitly; WHIP starts do not
836
+ // fall back to RTMP.
837
+ //
838
+ // Throw if none resolved so the caller's Promise rejects with a clear
839
+ // message rather than the glasses' "unknown protocol" error.
840
+ const url =
841
+ preference === "whip"
842
+ ? p.webrtcPublishUrl || p.srtUrl || p.rtmpUrl
843
+ : preference === "rtmp"
844
+ ? p.rtmpUrl || p.srtUrl || p.webrtcPublishUrl
845
+ : p.srtUrl || p.rtmpUrl || p.webrtcPublishUrl
846
+ if (!url) {
847
+ throw new Error("Cloudflare provision returned no usable ingest URL")
848
+ }
849
+ return url
850
+ }
851
+
852
+ function publisherStartResult(streamId: string, event?: StreamStatusEvent): StreamPublisherStartResult {
853
+ return {
854
+ streamId: event?.streamId || streamId,
855
+ status: event?.status ?? "streaming",
856
+ ...(event?.resolvedConfig ? {resolvedConfig: event.resolvedConfig} : {}),
857
+ }
858
+ }
859
+
860
+ function managedStartResult(entry: ManagedEntry): ManagedStartResult {
861
+ const publisher = entry.publisherStart ?? publisherStartResult(entry.streamId)
862
+ return {
863
+ ...publisher,
864
+ streamId: entry.streamId,
865
+ liveInputId: entry.liveInputId,
866
+ mode: entry.mode,
867
+ hlsUrl: entry.hlsUrl,
868
+ dashUrl: entry.dashUrl,
869
+ webrtcUrl: entry.webrtcUrl,
870
+ }
871
+ }
872
+
873
+ // Singleton — coordinator's single-stream constraint is process-wide.
874
+ export const phoneStreamCoordinator = new PhoneStreamCoordinator()