@mentra/engine 0.1.0-dev.0 → 3.1.0-dev.4

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 (503) hide show
  1. package/README.md +55 -18
  2. package/build/bluetooth-sdk/debug.d.ts +2 -0
  3. package/build/bluetooth-sdk/debug.d.ts.map +1 -0
  4. package/build/bluetooth-sdk/debug.js +2 -0
  5. package/build/bluetooth-sdk/debug.js.map +1 -0
  6. package/build/bluetooth-sdk/index.d.ts +3 -0
  7. package/build/bluetooth-sdk/index.d.ts.map +1 -0
  8. package/build/bluetooth-sdk/index.js +3 -0
  9. package/build/bluetooth-sdk/index.js.map +1 -0
  10. package/build/bluetooth-sdk/photo-receiver.d.ts +3 -0
  11. package/build/bluetooth-sdk/photo-receiver.d.ts.map +1 -0
  12. package/build/bluetooth-sdk/photo-receiver.js +3 -0
  13. package/build/bluetooth-sdk/photo-receiver.js.map +1 -0
  14. package/build/bluetooth-sdk/react.d.ts +2 -0
  15. package/build/bluetooth-sdk/react.d.ts.map +1 -0
  16. package/build/bluetooth-sdk/react.js +2 -0
  17. package/build/bluetooth-sdk/react.js.map +1 -0
  18. package/build/bluetooth-sdk/types.d.ts +2 -0
  19. package/build/bluetooth-sdk/types.d.ts.map +1 -0
  20. package/build/bluetooth-sdk/types.js +2 -0
  21. package/build/bluetooth-sdk/types.js.map +1 -0
  22. package/build/engine.d.ts +24 -16
  23. package/build/engine.d.ts.map +1 -1
  24. package/build/engine.js +9 -4
  25. package/build/engine.js.map +1 -1
  26. package/build/facades/dev.d.ts +3 -2
  27. package/build/facades/dev.d.ts.map +1 -1
  28. package/build/facades/dev.js +18 -12
  29. package/build/facades/dev.js.map +1 -1
  30. package/build/facades/display.d.ts +1 -1
  31. package/build/facades/display.d.ts.map +1 -1
  32. package/build/facades/display.js +1 -1
  33. package/build/facades/display.js.map +1 -1
  34. package/build/facades/gallery.js +1 -1
  35. package/build/facades/gallery.js.map +1 -1
  36. package/build/facades/glasses.d.ts +4 -13
  37. package/build/facades/glasses.d.ts.map +1 -1
  38. package/build/facades/glasses.js +21 -6
  39. package/build/facades/glasses.js.map +1 -1
  40. package/build/facades/glassesSettings.d.ts.map +1 -1
  41. package/build/facades/glassesSettings.js +1 -0
  42. package/build/facades/glassesSettings.js.map +1 -1
  43. package/build/facades/miniapps.d.ts +4 -0
  44. package/build/facades/miniapps.d.ts.map +1 -1
  45. package/build/facades/miniapps.js +5 -0
  46. package/build/facades/miniapps.js.map +1 -1
  47. package/build/facades/ota.d.ts +14 -16
  48. package/build/facades/ota.d.ts.map +1 -1
  49. package/build/facades/ota.js +22 -7
  50. package/build/facades/ota.js.map +1 -1
  51. package/build/facades/pairing.d.ts +8 -5
  52. package/build/facades/pairing.d.ts.map +1 -1
  53. package/build/facades/pairing.js +12 -10
  54. package/build/facades/pairing.js.map +1 -1
  55. package/build/facades/permissions.d.ts +10 -0
  56. package/build/facades/permissions.d.ts.map +1 -1
  57. package/build/facades/permissions.js +10 -0
  58. package/build/facades/permissions.js.map +1 -1
  59. package/build/facades/phoneNotifications.d.ts +0 -4
  60. package/build/facades/phoneNotifications.d.ts.map +1 -1
  61. package/build/facades/phoneNotifications.js +4 -14
  62. package/build/facades/phoneNotifications.js.map +1 -1
  63. package/build/facades/speech.d.ts +7 -6
  64. package/build/facades/speech.d.ts.map +1 -1
  65. package/build/facades/speech.js +1 -1
  66. package/build/facades/speech.js.map +1 -1
  67. package/build/generated/releaseMetadata.d.ts +12 -0
  68. package/build/generated/releaseMetadata.d.ts.map +1 -0
  69. package/build/generated/releaseMetadata.js +10 -0
  70. package/build/generated/releaseMetadata.js.map +1 -0
  71. package/build/index.d.ts +10 -8
  72. package/build/index.d.ts.map +1 -1
  73. package/build/index.js +6 -5
  74. package/build/index.js.map +1 -1
  75. package/build/react/MentraLiveOtaFlow.d.ts +38 -0
  76. package/build/react/MentraLiveOtaFlow.d.ts.map +1 -0
  77. package/build/react/MentraLiveOtaFlow.js +528 -0
  78. package/build/react/MentraLiveOtaFlow.js.map +1 -0
  79. package/build/react/index.d.ts +2 -0
  80. package/build/react/index.d.ts.map +1 -0
  81. package/build/react/index.js +2 -0
  82. package/build/react/index.js.map +1 -0
  83. package/build/react/useEngineSnapshot.d.ts +2 -0
  84. package/build/react/useEngineSnapshot.d.ts.map +1 -0
  85. package/build/react/useEngineSnapshot.js +14 -0
  86. package/build/react/useEngineSnapshot.js.map +1 -0
  87. package/build/runtime/bootstrap.d.ts +24 -1
  88. package/build/runtime/bootstrap.d.ts.map +1 -1
  89. package/build/runtime/bootstrap.js +17 -0
  90. package/build/runtime/bootstrap.js.map +1 -1
  91. package/build/runtime/scanQrSeam.d.ts +7 -0
  92. package/build/runtime/scanQrSeam.d.ts.map +1 -0
  93. package/build/runtime/scanQrSeam.js +16 -0
  94. package/build/runtime/scanQrSeam.js.map +1 -0
  95. package/build/services/AppRegistry.d.ts +41 -57
  96. package/build/services/AppRegistry.d.ts.map +1 -1
  97. package/build/services/AppRegistry.js +208 -144
  98. package/build/services/AppRegistry.js.map +1 -1
  99. package/build/services/AudioCloudUplink.d.ts +12 -0
  100. package/build/services/AudioCloudUplink.d.ts.map +1 -1
  101. package/build/services/AudioCloudUplink.js +22 -1
  102. package/build/services/AudioCloudUplink.js.map +1 -1
  103. package/build/services/AudioPlaybackService.d.ts +41 -2
  104. package/build/services/AudioPlaybackService.d.ts.map +1 -1
  105. package/build/services/AudioPlaybackService.js +250 -33
  106. package/build/services/AudioPlaybackService.js.map +1 -1
  107. package/build/services/BlobStore.d.ts +2 -1
  108. package/build/services/BlobStore.d.ts.map +1 -1
  109. package/build/services/BlobStore.js +17 -9
  110. package/build/services/BlobStore.js.map +1 -1
  111. package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -1
  112. package/build/services/CloudAudioSubscriptionSync.js +13 -1
  113. package/build/services/CloudAudioSubscriptionSync.js.map +1 -1
  114. package/build/services/CloudClientService.d.ts +15 -0
  115. package/build/services/CloudClientService.d.ts.map +1 -1
  116. package/build/services/CloudClientService.js +93 -1
  117. package/build/services/CloudClientService.js.map +1 -1
  118. package/build/services/DeviceEventRouter.js +5 -5
  119. package/build/services/DeviceEventRouter.js.map +1 -1
  120. package/build/services/ForegroundLocationPermission.d.ts +13 -0
  121. package/build/services/ForegroundLocationPermission.d.ts.map +1 -0
  122. package/build/services/ForegroundLocationPermission.js +12 -0
  123. package/build/services/ForegroundLocationPermission.js.map +1 -0
  124. package/build/services/GlassesSettingsSync.d.ts.map +1 -1
  125. package/build/services/GlassesSettingsSync.js +9 -3
  126. package/build/services/GlassesSettingsSync.js.map +1 -1
  127. package/build/services/GlassesStatusProjection.d.ts +2 -1
  128. package/build/services/GlassesStatusProjection.d.ts.map +1 -1
  129. package/build/services/GlassesStatusProjection.js +15 -8
  130. package/build/services/GlassesStatusProjection.js.map +1 -1
  131. package/build/services/HotspotOtaTransport.d.ts +29 -0
  132. package/build/services/HotspotOtaTransport.d.ts.map +1 -0
  133. package/build/services/HotspotOtaTransport.js +146 -0
  134. package/build/services/HotspotOtaTransport.js.map +1 -0
  135. package/build/services/HotspotShutdown.d.ts +17 -0
  136. package/build/services/HotspotShutdown.d.ts.map +1 -0
  137. package/build/services/HotspotShutdown.js +29 -0
  138. package/build/services/HotspotShutdown.js.map +1 -0
  139. package/build/services/LocalDisplayManager.d.ts +15 -0
  140. package/build/services/LocalDisplayManager.d.ts.map +1 -1
  141. package/build/services/LocalDisplayManager.js +106 -20
  142. package/build/services/LocalDisplayManager.js.map +1 -1
  143. package/build/services/LocalMiniappRuntime.d.ts +74 -2
  144. package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
  145. package/build/services/LocalMiniappRuntime.js +785 -291
  146. package/build/services/LocalMiniappRuntime.js.map +1 -1
  147. package/build/services/LocalMiniappStorage.d.ts +32 -0
  148. package/build/services/LocalMiniappStorage.d.ts.map +1 -0
  149. package/build/services/LocalMiniappStorage.js +66 -0
  150. package/build/services/LocalMiniappStorage.js.map +1 -0
  151. package/build/services/LocalMiniappUserIdentity.d.ts +20 -0
  152. package/build/services/LocalMiniappUserIdentity.d.ts.map +1 -0
  153. package/build/services/LocalMiniappUserIdentity.js +43 -0
  154. package/build/services/LocalMiniappUserIdentity.js.map +1 -0
  155. package/build/services/LocalSttFallbackCoordinator.d.ts +9 -6
  156. package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -1
  157. package/build/services/LocalSttFallbackCoordinator.js +18 -12
  158. package/build/services/LocalSttFallbackCoordinator.js.map +1 -1
  159. package/build/services/MicStateCoordinator.d.ts +42 -1
  160. package/build/services/MicStateCoordinator.d.ts.map +1 -1
  161. package/build/services/MicStateCoordinator.js +141 -3
  162. package/build/services/MicStateCoordinator.js.map +1 -1
  163. package/build/services/MiniappLauncher.d.ts.map +1 -1
  164. package/build/services/MiniappLauncher.js +23 -3
  165. package/build/services/MiniappLauncher.js.map +1 -1
  166. package/build/services/MiniappLiveness.d.ts +12 -0
  167. package/build/services/MiniappLiveness.d.ts.map +1 -0
  168. package/build/services/MiniappLiveness.js +16 -0
  169. package/build/services/MiniappLiveness.js.map +1 -0
  170. package/build/services/NativeHttpResponse.d.ts +3 -0
  171. package/build/services/NativeHttpResponse.d.ts.map +1 -0
  172. package/build/services/NativeHttpResponse.js +6 -0
  173. package/build/services/NativeHttpResponse.js.map +1 -0
  174. package/build/services/OtaArtifactDownloader.d.ts +65 -0
  175. package/build/services/OtaArtifactDownloader.d.ts.map +1 -0
  176. package/build/services/OtaArtifactDownloader.js +226 -0
  177. package/build/services/OtaArtifactDownloader.js.map +1 -0
  178. package/build/services/OtaAutoChain.d.ts +34 -0
  179. package/build/services/OtaAutoChain.d.ts.map +1 -0
  180. package/build/services/OtaAutoChain.js +83 -0
  181. package/build/services/OtaAutoChain.js.map +1 -0
  182. package/build/services/OtaErrorMapping.d.ts +18 -0
  183. package/build/services/OtaErrorMapping.d.ts.map +1 -0
  184. package/build/services/OtaErrorMapping.js +63 -0
  185. package/build/services/OtaErrorMapping.js.map +1 -0
  186. package/build/services/OtaInstallCoordinator.d.ts +95 -15
  187. package/build/services/OtaInstallCoordinator.d.ts.map +1 -1
  188. package/build/services/OtaInstallCoordinator.js +577 -130
  189. package/build/services/OtaInstallCoordinator.js.map +1 -1
  190. package/build/services/OtaService.d.ts.map +1 -1
  191. package/build/services/OtaService.js +8 -1
  192. package/build/services/OtaService.js.map +1 -1
  193. package/build/services/OtaUpdateCheckService.d.ts +39 -4
  194. package/build/services/OtaUpdateCheckService.d.ts.map +1 -1
  195. package/build/services/OtaUpdateCheckService.js +138 -22
  196. package/build/services/OtaUpdateCheckService.js.map +1 -1
  197. package/build/services/PhoneCalendarHelpers.d.ts +32 -0
  198. package/build/services/PhoneCalendarHelpers.d.ts.map +1 -0
  199. package/build/services/PhoneCalendarHelpers.js +157 -0
  200. package/build/services/PhoneCalendarHelpers.js.map +1 -0
  201. package/build/services/PhoneCalendarService.d.ts +5 -0
  202. package/build/services/PhoneCalendarService.d.ts.map +1 -0
  203. package/build/services/PhoneCalendarService.js +45 -0
  204. package/build/services/PhoneCalendarService.js.map +1 -0
  205. package/build/services/PhoneCameraFovCoordinator.d.ts +30 -0
  206. package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
  207. package/build/services/PhoneCameraFovCoordinator.js +194 -0
  208. package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
  209. package/build/services/PhoneNotificationsSync.d.ts.map +1 -1
  210. package/build/services/PhoneNotificationsSync.js +12 -10
  211. package/build/services/PhoneNotificationsSync.js.map +1 -1
  212. package/build/services/PhonePhotoCoordinator.d.ts +26 -2
  213. package/build/services/PhonePhotoCoordinator.d.ts.map +1 -1
  214. package/build/services/PhonePhotoCoordinator.js +79 -9
  215. package/build/services/PhonePhotoCoordinator.js.map +1 -1
  216. package/build/services/PhoneStreamCoordinator.d.ts +8 -1
  217. package/build/services/PhoneStreamCoordinator.d.ts.map +1 -1
  218. package/build/services/PhoneStreamCoordinator.js +125 -13
  219. package/build/services/PhoneStreamCoordinator.js.map +1 -1
  220. package/build/services/PhoneVideoCoordinator.d.ts +2 -0
  221. package/build/services/PhoneVideoCoordinator.d.ts.map +1 -1
  222. package/build/services/PhoneVideoCoordinator.js +10 -0
  223. package/build/services/PhoneVideoCoordinator.js.map +1 -1
  224. package/build/services/SceneRenderer.d.ts.map +1 -1
  225. package/build/services/SceneRenderer.js +15 -0
  226. package/build/services/SceneRenderer.js.map +1 -1
  227. package/build/services/SentenceTtsPipeline.d.ts +31 -0
  228. package/build/services/SentenceTtsPipeline.d.ts.map +1 -0
  229. package/build/services/SentenceTtsPipeline.js +67 -0
  230. package/build/services/SentenceTtsPipeline.js.map +1 -0
  231. package/build/services/SupportProfileSync.d.ts +22 -0
  232. package/build/services/SupportProfileSync.d.ts.map +1 -0
  233. package/build/services/SupportProfileSync.js +213 -0
  234. package/build/services/SupportProfileSync.js.map +1 -0
  235. package/build/services/TranscriptionRouting.d.ts +12 -0
  236. package/build/services/TranscriptionRouting.d.ts.map +1 -0
  237. package/build/services/TranscriptionRouting.js +24 -0
  238. package/build/services/TranscriptionRouting.js.map +1 -0
  239. package/build/services/TtsTextSanitizer.d.ts +5 -0
  240. package/build/services/TtsTextSanitizer.d.ts.map +1 -0
  241. package/build/services/TtsTextSanitizer.js +61 -0
  242. package/build/services/TtsTextSanitizer.js.map +1 -0
  243. package/build/services/WifiAdbRequest.d.ts +17 -0
  244. package/build/services/WifiAdbRequest.d.ts.map +1 -0
  245. package/build/services/WifiAdbRequest.js +35 -0
  246. package/build/services/WifiAdbRequest.js.map +1 -0
  247. package/build/services/asg/asgCameraApi.d.ts +43 -0
  248. package/build/services/asg/asgCameraApi.d.ts.map +1 -1
  249. package/build/services/asg/asgCameraApi.js +509 -26
  250. package/build/services/asg/asgCameraApi.js.map +1 -1
  251. package/build/services/asg/cameraRollExportCoordinator.d.ts +60 -0
  252. package/build/services/asg/cameraRollExportCoordinator.d.ts.map +1 -0
  253. package/build/services/asg/cameraRollExportCoordinator.js +618 -0
  254. package/build/services/asg/cameraRollExportCoordinator.js.map +1 -0
  255. package/build/services/asg/cameraRollExportLedger.d.ts +44 -0
  256. package/build/services/asg/cameraRollExportLedger.d.ts.map +1 -0
  257. package/build/services/asg/cameraRollExportLedger.js +78 -0
  258. package/build/services/asg/cameraRollExportLedger.js.map +1 -0
  259. package/build/services/asg/galleryNotices.d.ts +1 -1
  260. package/build/services/asg/galleryNotices.d.ts.map +1 -1
  261. package/build/services/asg/galleryNotices.js.map +1 -1
  262. package/build/services/asg/galleryPathMigration.d.ts +3 -0
  263. package/build/services/asg/galleryPathMigration.d.ts.map +1 -0
  264. package/build/services/asg/galleryPathMigration.js +26 -0
  265. package/build/services/asg/galleryPathMigration.js.map +1 -0
  266. package/build/services/asg/gallerySettingsService.d.ts +1 -0
  267. package/build/services/asg/gallerySettingsService.d.ts.map +1 -1
  268. package/build/services/asg/gallerySettingsService.js +2 -0
  269. package/build/services/asg/gallerySettingsService.js.map +1 -1
  270. package/build/services/asg/gallerySyncService.d.ts.map +1 -1
  271. package/build/services/asg/gallerySyncService.js +162 -56
  272. package/build/services/asg/gallerySyncService.js.map +1 -1
  273. package/build/services/asg/galleryTransferLedger.d.ts +58 -0
  274. package/build/services/asg/galleryTransferLedger.d.ts.map +1 -0
  275. package/build/services/asg/galleryTransferLedger.js +225 -0
  276. package/build/services/asg/galleryTransferLedger.js.map +1 -0
  277. package/build/services/asg/localNetworkTransport.d.ts +15 -0
  278. package/build/services/asg/localNetworkTransport.d.ts.map +1 -0
  279. package/build/services/asg/localNetworkTransport.js +144 -0
  280. package/build/services/asg/localNetworkTransport.js.map +1 -0
  281. package/build/services/asg/localStorageService.d.ts +18 -0
  282. package/build/services/asg/localStorageService.d.ts.map +1 -1
  283. package/build/services/asg/localStorageService.js +168 -19
  284. package/build/services/asg/localStorageService.js.map +1 -1
  285. package/build/services/asg/mediaProcessingQueue.d.ts +10 -0
  286. package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -1
  287. package/build/services/asg/mediaProcessingQueue.js +193 -62
  288. package/build/services/asg/mediaProcessingQueue.js.map +1 -1
  289. package/build/services/audioPlaybackAssets.d.ts +8 -0
  290. package/build/services/audioPlaybackAssets.d.ts.map +1 -0
  291. package/build/services/audioPlaybackAssets.js +7 -0
  292. package/build/services/audioPlaybackAssets.js.map +1 -0
  293. package/build/services/gallerySyncClock.js +1 -1
  294. package/build/services/gallerySyncClock.js.map +1 -1
  295. package/build/services/glassesClockSync.d.ts.map +1 -1
  296. package/build/services/glassesClockSync.js +6 -2
  297. package/build/services/glassesClockSync.js.map +1 -1
  298. package/build/services/manifestActions.d.ts +7 -0
  299. package/build/services/manifestActions.d.ts.map +1 -0
  300. package/build/services/manifestActions.js +25 -0
  301. package/build/services/manifestActions.js.map +1 -0
  302. package/build/services/otaDisplayState.d.ts +23 -12
  303. package/build/services/otaDisplayState.d.ts.map +1 -1
  304. package/build/services/otaDisplayState.js +36 -14
  305. package/build/services/otaDisplayState.js.map +1 -1
  306. package/build/services/otaInstallPolicy.d.ts +16 -4
  307. package/build/services/otaInstallPolicy.d.ts.map +1 -1
  308. package/build/services/otaInstallPolicy.js +24 -3
  309. package/build/services/otaInstallPolicy.js.map +1 -1
  310. package/build/services/otaLegacyMapping.d.ts +1 -1
  311. package/build/services/otaLegacyMapping.d.ts.map +1 -1
  312. package/build/services/otaLegacyMapping.js.map +1 -1
  313. package/build/services/otaManifestPolicy.d.ts +14 -0
  314. package/build/services/otaManifestPolicy.d.ts.map +1 -0
  315. package/build/services/otaManifestPolicy.js +19 -0
  316. package/build/services/otaManifestPolicy.js.map +1 -0
  317. package/build/services/otaManifestUrl.d.ts +3 -0
  318. package/build/services/otaManifestUrl.d.ts.map +1 -0
  319. package/build/services/otaManifestUrl.js +38 -0
  320. package/build/services/otaManifestUrl.js.map +1 -0
  321. package/build/services/slimStreamStatus.d.ts +11 -0
  322. package/build/services/slimStreamStatus.d.ts.map +1 -1
  323. package/build/services/slimStreamStatus.js +14 -4
  324. package/build/services/slimStreamStatus.js.map +1 -1
  325. package/build/stores/apps.d.ts.map +1 -1
  326. package/build/stores/apps.js +11 -0
  327. package/build/stores/apps.js.map +1 -1
  328. package/build/stores/bluetoothSettingKeys.d.ts.map +1 -1
  329. package/build/stores/bluetoothSettingKeys.js +2 -0
  330. package/build/stores/bluetoothSettingKeys.js.map +1 -1
  331. package/build/stores/gallerySync.d.ts +2 -0
  332. package/build/stores/gallerySync.d.ts.map +1 -1
  333. package/build/stores/gallerySync.js +2 -0
  334. package/build/stores/gallerySync.js.map +1 -1
  335. package/build/stores/glasses.d.ts.map +1 -1
  336. package/build/stores/glasses.js +3 -0
  337. package/build/stores/glasses.js.map +1 -1
  338. package/build/stores/settings.d.ts +17 -0
  339. package/build/stores/settings.d.ts.map +1 -1
  340. package/build/stores/settings.js +157 -17
  341. package/build/stores/settings.js.map +1 -1
  342. package/build/types/applet.d.ts +2 -0
  343. package/build/types/applet.d.ts.map +1 -1
  344. package/build/types/applet.js.map +1 -1
  345. package/build/types/asg.d.ts +7 -0
  346. package/build/types/asg.d.ts.map +1 -1
  347. package/build/types/asg.js.map +1 -1
  348. package/build/types/enums.d.ts +2 -25
  349. package/build/types/enums.d.ts.map +1 -1
  350. package/build/types/enums.js +2 -27
  351. package/build/types/enums.js.map +1 -1
  352. package/build/types/hardware.d.ts +4 -13
  353. package/build/types/hardware.d.ts.map +1 -1
  354. package/build/types/hardware.js +15 -3
  355. package/build/types/hardware.js.map +1 -1
  356. package/build/types/index.d.ts +2 -6
  357. package/build/types/index.d.ts.map +1 -1
  358. package/build/types/index.js +2 -6
  359. package/build/types/index.js.map +1 -1
  360. package/build/utils/configuredDevHost.d.ts +6 -0
  361. package/build/utils/configuredDevHost.d.ts.map +1 -0
  362. package/build/utils/configuredDevHost.js +19 -0
  363. package/build/utils/configuredDevHost.js.map +1 -0
  364. package/build/utils/devMiniappLaunch.d.ts +19 -8
  365. package/build/utils/devMiniappLaunch.d.ts.map +1 -1
  366. package/build/utils/devMiniappLaunch.js +144 -21
  367. package/build/utils/devMiniappLaunch.js.map +1 -1
  368. package/build/utils/diagnosticContext.d.ts.map +1 -1
  369. package/build/utils/diagnosticContext.js +15 -17
  370. package/build/utils/diagnosticContext.js.map +1 -1
  371. package/build/utils/hardware/hardware.d.ts.map +1 -1
  372. package/build/utils/hardware/hardware.js +7 -3
  373. package/build/utils/hardware/hardware.js.map +1 -1
  374. package/build/utils/miniappDiagnostics.d.ts +64 -0
  375. package/build/utils/miniappDiagnostics.d.ts.map +1 -0
  376. package/build/utils/miniappDiagnostics.js +173 -0
  377. package/build/utils/miniappDiagnostics.js.map +1 -0
  378. package/build/utils/permissions/MediaLibraryPermissions.d.ts +11 -0
  379. package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -1
  380. package/build/utils/permissions/MediaLibraryPermissions.js +27 -4
  381. package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -1
  382. package/build/utils/timers/timers.d.ts.map +1 -1
  383. package/build/utils/timers/timers.js +55 -18
  384. package/build/utils/timers/timers.js.map +1 -1
  385. package/package.json +59 -31
  386. package/src/assets/silence.wav +0 -0
  387. package/src/bluetooth-sdk/debug.ts +1 -0
  388. package/src/bluetooth-sdk/index.ts +2 -0
  389. package/src/bluetooth-sdk/photo-receiver.ts +2 -0
  390. package/src/bluetooth-sdk/react.ts +1 -0
  391. package/src/bluetooth-sdk/types.ts +1 -0
  392. package/src/engine.ts +9 -4
  393. package/src/facades/dev.ts +17 -12
  394. package/src/facades/display.ts +1 -1
  395. package/src/facades/gallery.ts +1 -1
  396. package/src/facades/glasses.ts +20 -7
  397. package/src/facades/glassesSettings.ts +5 -0
  398. package/src/facades/miniapps.ts +7 -0
  399. package/src/facades/ota.ts +23 -8
  400. package/src/facades/pairing.ts +15 -11
  401. package/src/facades/permissions.ts +14 -0
  402. package/src/facades/phoneNotifications.ts +4 -13
  403. package/src/facades/speech.ts +21 -7
  404. package/src/generated/releaseMetadata.ts +20 -0
  405. package/src/index.ts +39 -13
  406. package/src/react/MentraLiveOtaFlow.tsx +856 -0
  407. package/src/react/index.ts +7 -0
  408. package/src/react/useEngineSnapshot.ts +16 -0
  409. package/src/runtime/bootstrap.ts +33 -1
  410. package/src/runtime/scanQrSeam.ts +20 -0
  411. package/src/services/AppRegistry.ts +240 -149
  412. package/src/services/AudioCloudUplink.ts +23 -1
  413. package/src/services/AudioPlaybackService.ts +287 -38
  414. package/src/services/BlobStore.ts +22 -9
  415. package/src/services/CloudAudioSubscriptionSync.ts +13 -1
  416. package/src/services/CloudClientService.ts +96 -1
  417. package/src/services/DeviceEventRouter.ts +5 -5
  418. package/src/services/ForegroundLocationPermission.ts +24 -0
  419. package/src/services/GlassesSettingsSync.ts +9 -3
  420. package/src/services/GlassesStatusProjection.ts +16 -8
  421. package/src/services/HotspotOtaTransport.ts +184 -0
  422. package/src/services/HotspotShutdown.ts +41 -0
  423. package/src/services/LocalDisplayManager.ts +112 -21
  424. package/src/services/LocalMiniappRuntime.ts +967 -346
  425. package/src/services/LocalMiniappStorage.ts +82 -0
  426. package/src/services/LocalMiniappUserIdentity.ts +46 -0
  427. package/src/services/LocalSttFallbackCoordinator.ts +19 -12
  428. package/src/services/MicStateCoordinator.ts +169 -4
  429. package/src/services/MiniappLauncher.ts +30 -3
  430. package/src/services/MiniappLiveness.ts +24 -0
  431. package/src/services/NativeHttpResponse.ts +6 -0
  432. package/src/services/OtaArtifactDownloader.ts +312 -0
  433. package/src/services/OtaAutoChain.ts +106 -0
  434. package/src/services/OtaErrorMapping.ts +80 -0
  435. package/src/services/OtaInstallCoordinator.ts +649 -144
  436. package/src/services/OtaService.ts +11 -5
  437. package/src/services/OtaUpdateCheckService.ts +181 -21
  438. package/src/services/PhoneCalendarHelpers.ts +212 -0
  439. package/src/services/PhoneCalendarService.ts +65 -0
  440. package/src/services/PhoneCameraFovCoordinator.ts +210 -0
  441. package/src/services/PhoneNotificationsSync.ts +12 -10
  442. package/src/services/PhonePhotoCoordinator.ts +116 -18
  443. package/src/services/PhoneStreamCoordinator.ts +139 -25
  444. package/src/services/PhoneVideoCoordinator.ts +11 -0
  445. package/src/services/SceneRenderer.ts +16 -0
  446. package/src/services/SentenceTtsPipeline.ts +106 -0
  447. package/src/services/SupportProfileSync.ts +218 -0
  448. package/src/services/TranscriptionRouting.ts +37 -0
  449. package/src/services/TtsTextSanitizer.ts +66 -0
  450. package/src/services/WifiAdbRequest.ts +53 -0
  451. package/src/services/asg/asgCameraApi.ts +615 -33
  452. package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
  453. package/src/services/asg/cameraRollExportLedger.ts +122 -0
  454. package/src/services/asg/galleryNotices.ts +1 -0
  455. package/src/services/asg/galleryPathMigration.ts +22 -0
  456. package/src/services/asg/gallerySettingsService.ts +3 -0
  457. package/src/services/asg/gallerySyncService.ts +184 -73
  458. package/src/services/asg/galleryTransferLedger.ts +312 -0
  459. package/src/services/asg/localNetworkTransport.ts +169 -0
  460. package/src/services/asg/localStorageService.ts +179 -24
  461. package/src/services/asg/mediaProcessingQueue.ts +209 -62
  462. package/src/services/audioPlaybackAssets.ts +8 -0
  463. package/src/services/gallerySyncClock.ts +1 -1
  464. package/src/services/glassesClockSync.ts +6 -2
  465. package/src/services/manifestActions.ts +30 -0
  466. package/src/services/otaDisplayState.ts +58 -17
  467. package/src/services/otaInstallPolicy.ts +30 -4
  468. package/src/services/otaLegacyMapping.ts +1 -1
  469. package/src/services/otaManifestPolicy.ts +42 -0
  470. package/src/services/otaManifestUrl.ts +44 -0
  471. package/src/services/slimStreamStatus.ts +16 -5
  472. package/src/stores/apps.ts +12 -0
  473. package/src/stores/bluetoothSettingKeys.ts +2 -0
  474. package/src/stores/gallerySync.ts +4 -0
  475. package/src/stores/glasses.ts +3 -0
  476. package/src/stores/settings.ts +179 -18
  477. package/src/types/applet.ts +2 -0
  478. package/src/types/asg.ts +7 -0
  479. package/src/types/enums.ts +3 -28
  480. package/src/types/hardware.ts +20 -13
  481. package/src/types/index.ts +2 -6
  482. package/src/utils/configuredDevHost.ts +17 -0
  483. package/src/utils/devMiniappLaunch.ts +151 -23
  484. package/src/utils/diagnosticContext.ts +17 -17
  485. package/src/utils/hardware/hardware.ts +7 -9
  486. package/src/utils/miniappDiagnostics.ts +226 -0
  487. package/src/utils/permissions/MediaLibraryPermissions.ts +35 -4
  488. package/src/utils/timers/timers.ts +57 -21
  489. package/build/devtools.d.ts +0 -11
  490. package/build/devtools.d.ts.map +0 -1
  491. package/build/devtools.js +0 -13
  492. package/build/devtools.js.map +0 -1
  493. package/build/internal.d.ts +0 -66
  494. package/build/internal.d.ts.map +0 -1
  495. package/build/internal.js +0 -89
  496. package/build/internal.js.map +0 -1
  497. package/build/services/asgOtaVersionUrl.d.ts +0 -2
  498. package/build/services/asgOtaVersionUrl.d.ts.map +0 -1
  499. package/build/services/asgOtaVersionUrl.js +0 -36
  500. package/build/services/asgOtaVersionUrl.js.map +0 -1
  501. package/src/devtools.ts +0 -13
  502. package/src/internal.ts +0 -158
  503. package/src/services/asgOtaVersionUrl.ts +0 -41
@@ -0,0 +1,312 @@
1
+ import {CaptureGroup} from "../../types/asg"
2
+ import {storage} from "../../utils/storage"
3
+ import * as RNFS from "@dr.pogodin/react-native-fs"
4
+
5
+ export type GalleryTransferState =
6
+ | "DISCOVERED"
7
+ | "TRANSFERRING"
8
+ | "VERIFIED"
9
+ | "INDEXED"
10
+ | "EXPORT_PENDING"
11
+ | "EXPORTED"
12
+ | "ACK_PENDING"
13
+ | "TRASHED"
14
+ | "RESTORE_PENDING"
15
+ | "GARBAGE_COLLECTED"
16
+
17
+ export interface GalleryAssetReceipt {
18
+ platform: "ios" | "android" | "unknown"
19
+ uri?: string
20
+ identifier?: string
21
+ exportedAt: number
22
+ }
23
+
24
+ export interface GalleryLedgerFile {
25
+ name: string
26
+ size: number
27
+ role: "primary" | "bracket" | "sidecar"
28
+ etag?: string
29
+ sha256?: string
30
+ completedSegments: number[]
31
+ }
32
+
33
+ export interface GalleryTransferEntry {
34
+ captureId: string
35
+ state: GalleryTransferState
36
+ protocolVersion: number
37
+ captureType: "photo" | "video"
38
+ timestamp: number
39
+ totalSize: number
40
+ files: GalleryLedgerFile[]
41
+ deleteFromGlasses: string[]
42
+ finalPath?: string
43
+ thumbnailPath?: string
44
+ shouldAutoSave?: boolean
45
+ assetReceipt?: GalleryAssetReceipt
46
+ ackId: string
47
+ retryCount: number
48
+ lastError?: string
49
+ createdAt: number
50
+ updatedAt: number
51
+ }
52
+
53
+ type GalleryTransferLedgerData = {
54
+ version: 1
55
+ entries: Record<string, GalleryTransferEntry>
56
+ }
57
+
58
+ const LEDGER_KEY = "asg_gallery_transfer_ledger_v1"
59
+
60
+ const STATE_ORDER: Record<GalleryTransferState, number> = {
61
+ DISCOVERED: 0,
62
+ TRANSFERRING: 1,
63
+ VERIFIED: 2,
64
+ INDEXED: 3,
65
+ EXPORT_PENDING: 4,
66
+ EXPORTED: 5,
67
+ ACK_PENDING: 6,
68
+ TRASHED: 7,
69
+ RESTORE_PENDING: 0,
70
+ GARBAGE_COLLECTED: 8,
71
+ }
72
+
73
+ class GalleryTransferLedger {
74
+ private load(): GalleryTransferLedgerData {
75
+ const result = storage.load<GalleryTransferLedgerData>(LEDGER_KEY)
76
+ if (result.is_error() || result.value?.version !== 1) {
77
+ return {version: 1, entries: {}}
78
+ }
79
+ return {
80
+ ...result.value,
81
+ entries: Object.fromEntries(
82
+ Object.entries(result.value.entries).map(([id, entry]) => [
83
+ id,
84
+ {
85
+ ...entry,
86
+ finalPath: entry.finalPath ? this.toRuntimePath(entry.finalPath) : undefined,
87
+ thumbnailPath: entry.thumbnailPath ? this.toRuntimePath(entry.thumbnailPath) : undefined,
88
+ },
89
+ ]),
90
+ ),
91
+ }
92
+ }
93
+
94
+ private save(data: GalleryTransferLedgerData): void {
95
+ const portableData: GalleryTransferLedgerData = {
96
+ ...data,
97
+ entries: Object.fromEntries(
98
+ Object.entries(data.entries).map(([id, entry]) => [
99
+ id,
100
+ {
101
+ ...entry,
102
+ finalPath: entry.finalPath ? this.toStoredPath(entry.finalPath) : undefined,
103
+ thumbnailPath: entry.thumbnailPath ? this.toStoredPath(entry.thumbnailPath) : undefined,
104
+ },
105
+ ]),
106
+ ),
107
+ }
108
+ const result = storage.save(LEDGER_KEY, portableData)
109
+ if (result.is_error()) {
110
+ throw result.error
111
+ }
112
+ }
113
+
114
+ ensureCapture(capture: CaptureGroup, protocolVersion: number): GalleryTransferEntry {
115
+ const data = this.load()
116
+ const existing = data.entries[capture.capture_id]
117
+ const now = Date.now()
118
+ const incomingFiles = capture.files.map((file) => {
119
+ const previous = existing?.files.find((candidate) => candidate.name === file.name)
120
+ const sameGeneration =
121
+ previous &&
122
+ previous.size === file.size &&
123
+ ((!file.etag && !previous.etag) || (!!file.etag && !!previous.etag && previous.etag === file.etag))
124
+ return {
125
+ name: file.name,
126
+ size: file.size,
127
+ role: file.role,
128
+ etag: file.etag,
129
+ sha256: file.sha256,
130
+ completedSegments: sameGeneration ? previous.completedSegments || [] : [],
131
+ }
132
+ })
133
+
134
+ const generationChanged =
135
+ !!existing &&
136
+ (existing.totalSize !== capture.total_size ||
137
+ existing.files.length !== incomingFiles.length ||
138
+ incomingFiles.some((file) => {
139
+ const previous = existing.files.find((candidate) => candidate.name === file.name)
140
+ return !previous || file.size !== previous.size || file.role !== previous.role || file.etag !== previous.etag
141
+ }))
142
+
143
+ const entry: GalleryTransferEntry = {
144
+ ...(existing || {
145
+ captureId: capture.capture_id,
146
+ state: "DISCOVERED" as const,
147
+ ackId: `${capture.capture_id}-${now}-${Math.random().toString(36).slice(2, 10)}`,
148
+ retryCount: 0,
149
+ createdAt: now,
150
+ }),
151
+ protocolVersion,
152
+ captureType: capture.type,
153
+ timestamp: capture.timestamp,
154
+ totalSize: capture.total_size,
155
+ files: incomingFiles,
156
+ deleteFromGlasses: capture.files.map((file) => file.name),
157
+ state: generationChanged ? "DISCOVERED" : existing?.state || "DISCOVERED",
158
+ ackId: generationChanged
159
+ ? `${capture.capture_id}-${now}-${Math.random().toString(36).slice(2, 10)}`
160
+ : existing?.ackId || `${capture.capture_id}-${now}-${Math.random().toString(36).slice(2, 10)}`,
161
+ retryCount: generationChanged ? 0 : existing?.retryCount || 0,
162
+ updatedAt: now,
163
+ }
164
+ if (generationChanged) {
165
+ delete entry.finalPath
166
+ delete entry.thumbnailPath
167
+ delete entry.assetReceipt
168
+ delete entry.lastError
169
+ }
170
+ data.entries[capture.capture_id] = entry
171
+ this.save(data)
172
+ return entry
173
+ }
174
+
175
+ get(captureId: string): GalleryTransferEntry | undefined {
176
+ return this.load().entries[captureId]
177
+ }
178
+
179
+ list(): GalleryTransferEntry[] {
180
+ return Object.values(this.load().entries)
181
+ }
182
+
183
+ update(captureId: string, patch: Partial<GalleryTransferEntry>): GalleryTransferEntry {
184
+ const data = this.load()
185
+ const existing = data.entries[captureId]
186
+ if (!existing) {
187
+ throw new Error(`Gallery transfer ledger entry missing: ${captureId}`)
188
+ }
189
+ const updated = {...existing, ...patch, captureId, updatedAt: Date.now()}
190
+ data.entries[captureId] = updated
191
+ this.save(data)
192
+ return updated
193
+ }
194
+
195
+ transition(
196
+ captureId: string,
197
+ state: GalleryTransferState,
198
+ patch: Partial<GalleryTransferEntry> = {},
199
+ ): GalleryTransferEntry {
200
+ return this.update(captureId, {...patch, state})
201
+ }
202
+
203
+ markSegmentComplete(captureId: string, fileName: string, segmentIndex: number): void {
204
+ const data = this.load()
205
+ const entry = data.entries[captureId]
206
+ if (!entry) throw new Error(`Gallery transfer ledger entry missing: ${captureId}`)
207
+ entry.files = entry.files.map((file) =>
208
+ file.name === fileName
209
+ ? {...file, completedSegments: [...new Set([...file.completedSegments, segmentIndex])].sort((a, b) => a - b)}
210
+ : file,
211
+ )
212
+ entry.state = "TRANSFERRING"
213
+ entry.updatedAt = Date.now()
214
+ data.entries[captureId] = entry
215
+ this.save(data)
216
+ }
217
+
218
+ markFileHash(captureId: string, fileName: string, sha256: string): void {
219
+ const data = this.load()
220
+ const entry = data.entries[captureId]
221
+ if (!entry) throw new Error(`Gallery transfer ledger entry missing: ${captureId}`)
222
+ entry.files = entry.files.map((file) => (file.name === fileName ? {...file, sha256} : file))
223
+ entry.updatedAt = Date.now()
224
+ this.save(data)
225
+ }
226
+
227
+ recordFailure(captureId: string, error: unknown): void {
228
+ const entry = this.get(captureId)
229
+ if (!entry) return
230
+ this.update(captureId, {
231
+ retryCount: entry.retryCount + 1,
232
+ lastError: error instanceof Error ? error.message : String(error),
233
+ })
234
+ }
235
+
236
+ isLocallyCommitted(captureId: string): boolean {
237
+ const entry = this.get(captureId)
238
+ return !!entry && entry.state !== "RESTORE_PENDING" && STATE_ORDER[entry.state] >= STATE_ORDER.INDEXED
239
+ }
240
+
241
+ isFileLocallyCommitted(fileName: string): boolean {
242
+ return this.list().some(
243
+ (entry) => entry.deleteFromGlasses.includes(fileName) && STATE_ORDER[entry.state] >= STATE_ORDER.INDEXED,
244
+ )
245
+ }
246
+
247
+ pendingRecovery(): GalleryTransferEntry[] {
248
+ return this.list().filter(
249
+ (entry) =>
250
+ entry.state === "INDEXED" ||
251
+ entry.state === "EXPORT_PENDING" ||
252
+ entry.state === "EXPORTED" ||
253
+ entry.state === "ACK_PENDING" ||
254
+ entry.state === "RESTORE_PENDING",
255
+ )
256
+ }
257
+
258
+ hasPendingRecovery(): boolean {
259
+ return this.pendingRecovery().length > 0
260
+ }
261
+
262
+ releaseMissingLocalCommit(captureId: string, recoverAcknowledged: boolean = false): void {
263
+ const entry = this.get(captureId)
264
+ if (!entry) return
265
+ if (entry.state === "TRASHED" || entry.state === "GARBAGE_COLLECTED") {
266
+ if (recoverAcknowledged) {
267
+ this.update(captureId, {
268
+ state: "RESTORE_PENDING",
269
+ finalPath: undefined,
270
+ thumbnailPath: undefined,
271
+ assetReceipt: undefined,
272
+ lastError: "Committed local media is missing; source restore is pending",
273
+ files: entry.files.map((file) => ({...file, completedSegments: []})),
274
+ })
275
+ }
276
+ return
277
+ }
278
+ this.update(captureId, {
279
+ state: "DISCOVERED",
280
+ finalPath: undefined,
281
+ thumbnailPath: undefined,
282
+ assetReceipt: undefined,
283
+ lastError: "Local media was removed before source acknowledgement",
284
+ files: entry.files.map((file) => ({...file, completedSegments: []})),
285
+ })
286
+ }
287
+
288
+ releaseAllMissingLocalCommits(recoverAcknowledged: boolean = false): void {
289
+ for (const entry of this.list()) {
290
+ this.releaseMissingLocalCommit(entry.captureId, recoverAcknowledged)
291
+ }
292
+ }
293
+
294
+ private toStoredPath(path: string): string {
295
+ const cleanPath = path.replace(/^file:\/\//, "")
296
+ const documentsPath = RNFS.DocumentDirectoryPath?.replace(/\/$/, "")
297
+ if (!documentsPath) return cleanPath
298
+ return cleanPath.startsWith(`${documentsPath}/`) ? cleanPath.substring(documentsPath.length + 1) : cleanPath
299
+ }
300
+
301
+ private toRuntimePath(path: string): string {
302
+ if (!RNFS.DocumentDirectoryPath) return path
303
+ if (path.startsWith("/")) {
304
+ const marker = "/Documents/"
305
+ const index = path.indexOf(marker)
306
+ return index >= 0 ? `${RNFS.DocumentDirectoryPath}/${path.substring(index + marker.length)}` : path
307
+ }
308
+ return `${RNFS.DocumentDirectoryPath}/${path}`
309
+ }
310
+ }
311
+
312
+ export const galleryTransferLedger = new GalleryTransferLedger()
@@ -0,0 +1,169 @@
1
+ import * as RNFS from "@dr.pogodin/react-native-fs"
2
+ import {MentraLocalNetwork, type LocalNetworkDownloadProgress} from "@mentra/bluetooth-sdk/internal"
3
+ import {Buffer} from "buffer"
4
+ import {Platform} from "react-native"
5
+ import WifiManager from "react-native-wifi-reborn"
6
+
7
+ type DownloadOptions = Parameters<typeof RNFS.downloadFile>[0]
8
+ type DownloadHandle = ReturnType<typeof RNFS.downloadFile>
9
+
10
+ let scopedConnectionActive = false
11
+ let nextJobId = 1_000_000
12
+ const nativeJobs = new Map<number, string>()
13
+ const cancelledNativeJobs = new Set<number>()
14
+
15
+ export function shouldUseScopedLocalNetwork(os: string, moduleAvailable: boolean): boolean {
16
+ return os === "android" && moduleAvailable
17
+ }
18
+
19
+ function supportsScopedConnection(): boolean {
20
+ return shouldUseScopedLocalNetwork(Platform.OS, MentraLocalNetwork != null)
21
+ }
22
+
23
+ function normalizeHeaders(headers?: HeadersInit): Record<string, string> {
24
+ if (!headers) return {}
25
+ if (headers instanceof Headers) {
26
+ const result: Record<string, string> = {}
27
+ headers.forEach((value, key) => {
28
+ result[key] = value
29
+ })
30
+ return result
31
+ }
32
+ if (Array.isArray(headers)) return Object.fromEntries(headers)
33
+ return {...headers}
34
+ }
35
+
36
+ function requestId(prefix: string): string {
37
+ return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2)}`
38
+ }
39
+
40
+ export const localNetworkTransport = {
41
+ supportsScopedConnection: (): boolean => supportsScopedConnection(),
42
+ isScopedConnectionActive: (): boolean => scopedConnectionActive,
43
+
44
+ async connect(ssid: string, password: string): Promise<string | undefined> {
45
+ scopedConnectionActive = false
46
+ nativeJobs.clear()
47
+ if (!supportsScopedConnection()) {
48
+ await WifiManager.connectToProtectedSSID(ssid, password, false, false)
49
+ return undefined
50
+ }
51
+ const result = await MentraLocalNetwork!.connect(ssid, password)
52
+ scopedConnectionActive = true
53
+ return result.localAddress
54
+ },
55
+
56
+ async disconnect(): Promise<void> {
57
+ if (supportsScopedConnection()) {
58
+ await MentraLocalNetwork!.disconnect().catch(() => {})
59
+ }
60
+ scopedConnectionActive = false
61
+ nativeJobs.clear()
62
+ },
63
+
64
+ async fetch(url: string | URL | Request, init?: RequestInit, timeoutMs = 30_000): Promise<Response> {
65
+ if (!scopedConnectionActive || !MentraLocalNetwork || typeof url !== "string") {
66
+ return globalThis.fetch(url, init)
67
+ }
68
+
69
+ const nativeModule = MentraLocalNetwork
70
+ const id = requestId("request")
71
+ const signal = init?.signal
72
+ const cancel = () => void nativeModule.cancel(id)
73
+ if (signal?.aborted) throw new Error("Request aborted")
74
+ signal?.addEventListener("abort", cancel, {once: true})
75
+ try {
76
+ const result = await nativeModule.request(
77
+ id,
78
+ url,
79
+ init?.method || "GET",
80
+ normalizeHeaders(init?.headers),
81
+ typeof init?.body === "string" ? init.body : null,
82
+ timeoutMs,
83
+ )
84
+ const bytes = Buffer.from(result.bodyBase64, "base64")
85
+ return new Response(bytes as unknown as BodyInit, {
86
+ status: result.status,
87
+ headers: result.headers,
88
+ })
89
+ } finally {
90
+ signal?.removeEventListener("abort", cancel)
91
+ }
92
+ },
93
+
94
+ downloadFile(options: DownloadOptions): DownloadHandle {
95
+ if (!scopedConnectionActive || !MentraLocalNetwork) return RNFS.downloadFile(options)
96
+
97
+ const jobId = nextJobId++
98
+ const id = requestId("download")
99
+ let began = false
100
+ nativeJobs.set(jobId, id)
101
+ const subscription = MentraLocalNetwork.addListener("downloadProgress", (event: LocalNetworkDownloadProgress) => {
102
+ if (event.requestId !== id) return
103
+ if (!began) {
104
+ began = true
105
+ options.begin?.({
106
+ jobId,
107
+ statusCode: event.statusCode || 200,
108
+ contentLength: event.contentLength,
109
+ headers: event.headers || {},
110
+ })
111
+ }
112
+ options.progress?.({
113
+ jobId,
114
+ contentLength: event.contentLength,
115
+ bytesWritten: event.bytesWritten,
116
+ })
117
+ })
118
+
119
+ const promise = MentraLocalNetwork.download(
120
+ id,
121
+ options.fromUrl,
122
+ options.toFile,
123
+ options.headers || {},
124
+ options.connectionTimeout || 30_000,
125
+ options.readTimeout || 30_000,
126
+ )
127
+ .then((result) => {
128
+ if (!began) {
129
+ options.begin?.({
130
+ jobId,
131
+ statusCode: result.statusCode,
132
+ contentLength: result.bytesWritten,
133
+ headers: result.headers,
134
+ })
135
+ }
136
+ return {
137
+ jobId,
138
+ statusCode: result.statusCode,
139
+ bytesWritten: result.bytesWritten,
140
+ }
141
+ })
142
+ .catch((error) => {
143
+ if (cancelledNativeJobs.has(jobId)) throw new Error("Sync cancelled")
144
+ throw error
145
+ })
146
+ .finally(() => {
147
+ nativeJobs.delete(jobId)
148
+ cancelledNativeJobs.delete(jobId)
149
+ subscription.remove()
150
+ })
151
+
152
+ return {jobId, promise} as DownloadHandle
153
+ },
154
+
155
+ stopDownload(jobId: number): void {
156
+ const nativeId = nativeJobs.get(jobId)
157
+ if (nativeId && MentraLocalNetwork) {
158
+ cancelledNativeJobs.add(jobId)
159
+ void MentraLocalNetwork.cancel(nativeId)
160
+ return
161
+ }
162
+ RNFS.stopDownload(jobId)
163
+ },
164
+ }
165
+
166
+ MentraLocalNetwork?.addListener("networkLost", () => {
167
+ scopedConnectionActive = false
168
+ nativeJobs.clear()
169
+ })