@glassly/bluetooth-sdk 0.1.0-dev.26

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 (548) hide show
  1. package/README.md +563 -0
  2. package/android/build.gradle +450 -0
  3. package/android/gradle.properties.example +9 -0
  4. package/android/lc3Lib/CMakeLists.txt +6 -0
  5. package/android/lc3Lib/build.gradle +212 -0
  6. package/android/lc3Lib/proguard-rules.pro +33 -0
  7. package/android/lc3Lib/src/main/AndroidManifest.xml +2 -0
  8. package/android/lc3Lib/src/main/cpp/CMakeLists.txt +8 -0
  9. package/android/lc3Lib/src/main/cpp/google_opus_stuff/CMakeLists.txt +30 -0
  10. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/CMakeLists.txt +7 -0
  11. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.cc +96 -0
  12. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.h +53 -0
  13. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/Makefile.am +6 -0
  14. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h +26 -0
  15. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h.in +26 -0
  16. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/ogg.h +209 -0
  17. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/os_types.h +158 -0
  18. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus.h +981 -0
  19. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_custom.h +342 -0
  20. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_defines.h +799 -0
  21. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_multistream.h +660 -0
  22. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_projection.h +568 -0
  23. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_types.h +166 -0
  24. package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.cc +268 -0
  25. package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.h +115 -0
  26. package/android/lc3Lib/src/main/cpp/google_opus_stuff/opus_tools/opus_header.h +59 -0
  27. package/android/lc3Lib/src/main/cpp/liblc3/CMakeLists.txt +38 -0
  28. package/android/lc3Lib/src/main/cpp/liblc3/include/lc3.h +309 -0
  29. package/android/lc3Lib/src/main/cpp/liblc3/include/lc3_private.h +162 -0
  30. package/android/lc3Lib/src/main/cpp/liblc3/include/rnnoise.h +114 -0
  31. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/CMakeLists.txt +19 -0
  32. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.c +92 -0
  33. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.h +44 -0
  34. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.c +375 -0
  35. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.h +315 -0
  36. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.c +129 -0
  37. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.h +69 -0
  38. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/common.h +148 -0
  39. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.c +70 -0
  40. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.h +43 -0
  41. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/fastmath.h +158 -0
  42. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/lc3.c +702 -0
  43. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.c +893 -0
  44. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.h +111 -0
  45. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_arm.h +506 -0
  46. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_neon.h +281 -0
  47. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/makefile.mk +35 -0
  48. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.c +452 -0
  49. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.h +57 -0
  50. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct_neon.h +296 -0
  51. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/meson.build +46 -0
  52. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.c +61 -0
  53. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.h +57 -0
  54. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.c +880 -0
  55. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.h +103 -0
  56. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.c +904 -0
  57. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.h +119 -0
  58. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.c +3457 -0
  59. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.h +94 -0
  60. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.c +457 -0
  61. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.h +99 -0
  62. package/android/lc3Lib/src/main/cpp/liblc3/liblc3.cpp +159 -0
  63. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/_kiss_fft_guts.h +182 -0
  64. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/arch.h +261 -0
  65. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.c +279 -0
  66. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.h +59 -0
  67. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/common.h +48 -0
  68. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/compile.sh +3 -0
  69. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/denoise.c +646 -0
  70. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.c +601 -0
  71. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.h +203 -0
  72. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/opus_types.h +159 -0
  73. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.c +526 -0
  74. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.h +149 -0
  75. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.c +178 -0
  76. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.h +69 -0
  77. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.c +11051 -0
  78. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.h +34 -0
  79. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_reader.c +168 -0
  80. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_train.py +66 -0
  81. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/tansig_table.h +45 -0
  82. package/android/lc3Lib/src/main/java/com/glassly/lc3Lib/Lc3Cpp.java +38 -0
  83. package/android/lc3Lib/third_party/CMakeLists.txt +23 -0
  84. package/android/lc3Lib/third_party/CMakeLists_libogg.txt +18 -0
  85. package/android/lc3Lib/third_party/CMakeLists_libopus.txt +18 -0
  86. package/android/lc3Lib/third_party/CMakeLists_opus-tools.txt +23 -0
  87. package/android/lc3Lib/third_party/opus_tools/src/AUTHORS +5 -0
  88. package/android/lc3Lib/third_party/opus_tools/src/CMakeLists.txt +4 -0
  89. package/android/lc3Lib/third_party/opus_tools/src/COPYING +371 -0
  90. package/android/lc3Lib/third_party/opus_tools/src/ChangeLog +3 -0
  91. package/android/lc3Lib/third_party/opus_tools/src/Makefile.am +42 -0
  92. package/android/lc3Lib/third_party/opus_tools/src/Makefile.unix +23 -0
  93. package/android/lc3Lib/third_party/opus_tools/src/NEWS +0 -0
  94. package/android/lc3Lib/third_party/opus_tools/src/README +0 -0
  95. package/android/lc3Lib/third_party/opus_tools/src/autogen.sh +115 -0
  96. package/android/lc3Lib/third_party/opus_tools/src/configure.ac +293 -0
  97. package/android/lc3Lib/third_party/opus_tools/src/src/arch.h +239 -0
  98. package/android/lc3Lib/third_party/opus_tools/src/src/audio-in.c +1046 -0
  99. package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.c +245 -0
  100. package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.h +28 -0
  101. package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.c +320 -0
  102. package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.h +51 -0
  103. package/android/lc3Lib/third_party/opus_tools/src/src/lpc.c +157 -0
  104. package/android/lc3Lib/third_party/opus_tools/src/src/lpc.h +27 -0
  105. package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.c +286 -0
  106. package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.h +59 -0
  107. package/android/lc3Lib/third_party/opus_tools/src/src/opusdec.c +884 -0
  108. package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.c +1021 -0
  109. package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.h +101 -0
  110. package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.c +639 -0
  111. package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.h +51 -0
  112. package/android/lc3Lib/third_party/opus_tools/src/src/os_support.h +167 -0
  113. package/android/lc3Lib/third_party/opus_tools/src/src/resample.c +1137 -0
  114. package/android/lc3Lib/third_party/opus_tools/src/src/speex_resampler.h +344 -0
  115. package/android/lc3Lib/third_party/opus_tools/src/src/stack_alloc.h +115 -0
  116. package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.c +125 -0
  117. package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.h +62 -0
  118. package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.c +223 -0
  119. package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.h +60 -0
  120. package/android/settings.gradle +4 -0
  121. package/android/silero/LICENSE.md +17 -0
  122. package/android/silero/build.gradle +50 -0
  123. package/android/silero/proguard-rules.pro +24 -0
  124. package/android/silero/src/androidTest/assets/hello.wav +0 -0
  125. package/android/silero/src/androidTest/java/com/konovalov/vad/silero/VadSileroTest.kt +79 -0
  126. package/android/silero/src/main/assets/LICENSE +21 -0
  127. package/android/silero/src/main/assets/silero_vad.onnx +0 -0
  128. package/android/silero/src/main/java/com/konovalov/vad/silero/Vad.kt +160 -0
  129. package/android/silero/src/main/java/com/konovalov/vad/silero/VadSilero.kt +449 -0
  130. package/android/silero/src/main/java/com/konovalov/vad/silero/config/FrameSize.kt +15 -0
  131. package/android/silero/src/main/java/com/konovalov/vad/silero/config/Mode.kt +14 -0
  132. package/android/silero/src/main/java/com/konovalov/vad/silero/config/SampleRate.kt +12 -0
  133. package/android/silero/src/main/java/com/konovalov/vad/silero/utils/AudioUtils.kt +47 -0
  134. package/android/silero/src/main/java/com/konovalov/vad/silero/utils/TensorMap.kt +41 -0
  135. package/android/silero/src/test/java/com/konovalov/vad/silero/utils/AudioUtilsTest.kt +44 -0
  136. package/android/src/main/AndroidManifest.xml +42 -0
  137. package/android/src/main/assets/G2Firmware/README.md +11 -0
  138. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdk.kt +2325 -0
  139. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkAnalytics.kt +216 -0
  140. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDebug.kt +14 -0
  141. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDefaults.kt +7 -0
  142. package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkModule.kt +1088 -0
  143. package/android/src/main/java/com/glassly/bluetoothsdk/Bridge.kt +953 -0
  144. package/android/src/main/java/com/glassly/bluetoothsdk/DeviceManager.kt +2528 -0
  145. package/android/src/main/java/com/glassly/bluetoothsdk/DeviceStore.kt +360 -0
  146. package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedChangelogCatalog.kt +8 -0
  147. package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedReleaseMetadata.kt +11 -0
  148. package/android/src/main/java/com/glassly/bluetoothsdk/LocalNetworkModule.kt +414 -0
  149. package/android/src/main/java/com/glassly/bluetoothsdk/ObservableStore.kt +88 -0
  150. package/android/src/main/java/com/glassly/bluetoothsdk/OtaManifest.kt +191 -0
  151. package/android/src/main/java/com/glassly/bluetoothsdk/ReleaseChangelog.kt +61 -0
  152. package/android/src/main/java/com/glassly/bluetoothsdk/ScopedNetworkReadiness.kt +17 -0
  153. package/android/src/main/java/com/glassly/bluetoothsdk/audio/AudioModels.kt +144 -0
  154. package/android/src/main/java/com/glassly/bluetoothsdk/camera/CameraModels.kt +486 -0
  155. package/android/src/main/java/com/glassly/bluetoothsdk/connection/ConnectionModels.kt +78 -0
  156. package/android/src/main/java/com/glassly/bluetoothsdk/controllers/ControllerManager.kt +158 -0
  157. package/android/src/main/java/com/glassly/bluetoothsdk/controllers/R1.kt +937 -0
  158. package/android/src/main/java/com/glassly/bluetoothsdk/debug/BleTraceLogger.kt +165 -0
  159. package/android/src/main/java/com/glassly/bluetoothsdk/events/BluetoothEvents.kt +178 -0
  160. package/android/src/main/java/com/glassly/bluetoothsdk/internal/MapParsing.kt +140 -0
  161. package/android/src/main/java/com/glassly/bluetoothsdk/net/LocalIpv4.kt +57 -0
  162. package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServer.kt +304 -0
  163. package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/OtaServerModule.kt +120 -0
  164. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistry.java +108 -0
  165. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoUploadServer.kt +622 -0
  166. package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/PhotoReceiverModule.kt +156 -0
  167. package/android/src/main/java/com/glassly/bluetoothsdk/requests/DisplayRequests.kt +56 -0
  168. package/android/src/main/java/com/glassly/bluetoothsdk/services/Foreground.kt +272 -0
  169. package/android/src/main/java/com/glassly/bluetoothsdk/services/PhoneMic.kt +1195 -0
  170. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Ar99.java +2653 -0
  171. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuard.kt +49 -0
  172. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapper.kt +27 -0
  173. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1.kt +3878 -0
  174. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizer.kt +38 -0
  175. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2.kt +6428 -0
  176. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassification.kt +49 -0
  177. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwRenderer.kt +1241 -0
  178. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCache.kt +270 -0
  179. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocol.kt +291 -0
  180. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2Flasher.kt +411 -0
  181. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/GlasslyBle.java +43189 -0
  182. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Mach1.kt +1280 -0
  183. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLive.kt +10817 -0
  184. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLiveL2capChannel.kt +274 -0
  185. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisement.kt +54 -0
  186. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraNex.kt +2011 -0
  187. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Nimo.kt +2532 -0
  188. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/SGCManager.kt +470 -0
  189. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Simulated.kt +228 -0
  190. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/Ar99OtaManager.java +566 -0
  191. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaByteUtils.java +18 -0
  192. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCommandConstants.java +35 -0
  193. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCrc32Util.java +13 -0
  194. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaGattTransport.java +11 -0
  195. package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaProtocol.java +92 -0
  196. package/android/src/main/java/com/glassly/bluetoothsdk/speakerid/SpeakerIdEngine.kt +525 -0
  197. package/android/src/main/java/com/glassly/bluetoothsdk/status/DeviceStatus.kt +669 -0
  198. package/android/src/main/java/com/glassly/bluetoothsdk/status/RuntimeState.kt +201 -0
  199. package/android/src/main/java/com/glassly/bluetoothsdk/status/WifiHotspotStatus.kt +189 -0
  200. package/android/src/main/java/com/glassly/bluetoothsdk/streaming/StreamModels.kt +518 -0
  201. package/android/src/main/java/com/glassly/bluetoothsdk/stt/STTTools.kt +391 -0
  202. package/android/src/main/java/com/glassly/bluetoothsdk/stt/SherpaOnnxTranscriber.kt +518 -0
  203. package/android/src/main/java/com/glassly/bluetoothsdk/stt/VadGateSpeechPolicy.kt +229 -0
  204. package/android/src/main/java/com/glassly/bluetoothsdk/tts/TTSTools.kt +248 -0
  205. package/android/src/main/java/com/glassly/bluetoothsdk/types/DeviceModels.kt +96 -0
  206. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AES.java +106 -0
  207. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AudioSessionMonitor.kt +189 -0
  208. package/android/src/main/java/com/glassly/bluetoothsdk/utils/AvifExifStripper.java +573 -0
  209. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BitmapJavaUtils.java +169 -0
  210. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleJsonCompact.java +496 -0
  211. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadService.java +677 -0
  212. package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleWireProtocol.java +108 -0
  213. package/android/src/main/java/com/glassly/bluetoothsdk/utils/Constants.kt +46 -0
  214. package/android/src/main/java/com/glassly/bluetoothsdk/utils/G1Text.kt +436 -0
  215. package/android/src/main/java/com/glassly/bluetoothsdk/utils/HeifExifTagReader.java +199 -0
  216. package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleRelayNaming.java +29 -0
  217. package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleUploadService.java +77 -0
  218. package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900LengthCodec.java +115 -0
  219. package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtils.java +827 -0
  220. package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunkReassembler.java +228 -0
  221. package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunker.java +325 -0
  222. package/android/src/main/java/com/glassly/bluetoothsdk/utils/NexSGCUtils.kt +698 -0
  223. package/android/src/main/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitor.kt +348 -0
  224. package/android/src/main/java/com/glassly/bluetoothsdk/utils/SmartGlassesConnectionState.java +9 -0
  225. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Ar99OpusPcmDecoder.java +398 -0
  226. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/ByteUtilAudioPlayer.java +655 -0
  227. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Lc3Player.java +441 -0
  228. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PCMAudioPlayer.java +431 -0
  229. package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PcmStreamPlayer.kt +328 -0
  230. package/android/src/main/res/values/strings.xml +4 -0
  231. package/android/src/test/java/com/glassly/bluetoothsdk/BluetoothSdkExceptionTest.kt +18 -0
  232. package/android/src/test/java/com/glassly/bluetoothsdk/OtaManifestDowngradeTest.kt +86 -0
  233. package/android/src/test/java/com/glassly/bluetoothsdk/OtaStartResponsePolicyTest.kt +30 -0
  234. package/android/src/test/java/com/glassly/bluetoothsdk/ReleaseChangelogTest.kt +13 -0
  235. package/android/src/test/java/com/glassly/bluetoothsdk/ScopedNetworkReadinessTest.kt +39 -0
  236. package/android/src/test/java/com/glassly/bluetoothsdk/StreamStatusEventTest.kt +29 -0
  237. package/android/src/test/java/com/glassly/bluetoothsdk/camera/PhotoRequestTest.kt +141 -0
  238. package/android/src/test/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServerTest.kt +82 -0
  239. package/android/src/test/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistryTest.java +75 -0
  240. package/android/src/test/java/com/glassly/bluetoothsdk/services/ForegroundServiceTypeTest.kt +69 -0
  241. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/Ar99AdvertisementMatcherTest.java +22 -0
  242. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuardTest.kt +73 -0
  243. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapperTest.kt +67 -0
  244. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/EvenRleTest.kt +63 -0
  245. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizerTest.kt +31 -0
  246. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassificationTest.kt +89 -0
  247. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwRendererTest.kt +344 -0
  248. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCacheTest.kt +200 -0
  249. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocolTest.kt +131 -0
  250. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLiveGattCharacteristicsTest.kt +39 -0
  251. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisementParserTest.kt +133 -0
  252. package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/NimoProtocolTest.kt +333 -0
  253. package/android/src/test/java/com/glassly/bluetoothsdk/utils/AvifExifStripperTest.java +46 -0
  254. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BinaryMessageChunkerTest.java +84 -0
  255. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BleJsonCompactTest.java +319 -0
  256. package/android/src/test/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadServiceTest.java +107 -0
  257. package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsEndiannessTest.java +172 -0
  258. package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsTest.java +24 -0
  259. package/android/src/test/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitorTest.kt +45 -0
  260. package/android/src/test/resources/avif_with_exif.avif +0 -0
  261. package/app.plugin.js +3 -0
  262. package/build/BluetoothSdk.types.d.ts +1354 -0
  263. package/build/BluetoothSdk.types.d.ts.map +1 -0
  264. package/build/BluetoothSdk.types.js +41 -0
  265. package/build/BluetoothSdk.types.js.map +1 -0
  266. package/build/_internal.d.ts +17 -0
  267. package/build/_internal.d.ts.map +1 -0
  268. package/build/_internal.js +16 -0
  269. package/build/_internal.js.map +1 -0
  270. package/build/_private/BluetoothSdkModule.d.ts +172 -0
  271. package/build/_private/BluetoothSdkModule.d.ts.map +1 -0
  272. package/build/_private/BluetoothSdkModule.js +300 -0
  273. package/build/_private/BluetoothSdkModule.js.map +1 -0
  274. package/build/_private/LocalNetworkModule.d.ts +38 -0
  275. package/build/_private/LocalNetworkModule.d.ts.map +1 -0
  276. package/build/_private/LocalNetworkModule.js +3 -0
  277. package/build/_private/LocalNetworkModule.js.map +1 -0
  278. package/build/_private/cameraRequestPayload.d.ts +4 -0
  279. package/build/_private/cameraRequestPayload.d.ts.map +1 -0
  280. package/build/_private/cameraRequestPayload.js +32 -0
  281. package/build/_private/cameraRequestPayload.js.map +1 -0
  282. package/build/_private/photoRequestPayload.d.ts +6 -0
  283. package/build/_private/photoRequestPayload.d.ts.map +1 -0
  284. package/build/_private/photoRequestPayload.js +86 -0
  285. package/build/_private/photoRequestPayload.js.map +1 -0
  286. package/build/_private/sdkOtaManifest.d.ts +11 -0
  287. package/build/_private/sdkOtaManifest.d.ts.map +1 -0
  288. package/build/_private/sdkOtaManifest.js +15 -0
  289. package/build/_private/sdkOtaManifest.js.map +1 -0
  290. package/build/changelogs.d.ts +7 -0
  291. package/build/changelogs.d.ts.map +1 -0
  292. package/build/changelogs.js +46 -0
  293. package/build/changelogs.js.map +1 -0
  294. package/build/debug.d.ts +3 -0
  295. package/build/debug.d.ts.map +1 -0
  296. package/build/debug.js +8 -0
  297. package/build/debug.js.map +1 -0
  298. package/build/generated/changelogCatalog.d.ts +9 -0
  299. package/build/generated/changelogCatalog.d.ts.map +1 -0
  300. package/build/generated/changelogCatalog.js +12 -0
  301. package/build/generated/changelogCatalog.js.map +1 -0
  302. package/build/generated/releaseMetadata.d.ts +12 -0
  303. package/build/generated/releaseMetadata.d.ts.map +1 -0
  304. package/build/generated/releaseMetadata.js +10 -0
  305. package/build/generated/releaseMetadata.js.map +1 -0
  306. package/build/index.d.ts +6 -0
  307. package/build/index.d.ts.map +1 -0
  308. package/build/index.js +171 -0
  309. package/build/index.js.map +1 -0
  310. package/build/ota-server/OtaServer.types.d.ts +14 -0
  311. package/build/ota-server/OtaServer.types.d.ts.map +1 -0
  312. package/build/ota-server/OtaServer.types.js +2 -0
  313. package/build/ota-server/OtaServer.types.js.map +1 -0
  314. package/build/ota-server/OtaServerModule.d.ts +21 -0
  315. package/build/ota-server/OtaServerModule.d.ts.map +1 -0
  316. package/build/ota-server/OtaServerModule.js +3 -0
  317. package/build/ota-server/OtaServerModule.js.map +1 -0
  318. package/build/ota-server/OtaServerModule.web.d.ts +10 -0
  319. package/build/ota-server/OtaServerModule.web.d.ts.map +1 -0
  320. package/build/ota-server/OtaServerModule.web.js +12 -0
  321. package/build/ota-server/OtaServerModule.web.js.map +1 -0
  322. package/build/ota-server/index.d.ts +3 -0
  323. package/build/ota-server/index.d.ts.map +1 -0
  324. package/build/ota-server/index.js +3 -0
  325. package/build/ota-server/index.js.map +1 -0
  326. package/build/ota-transport/index.d.ts +67 -0
  327. package/build/ota-transport/index.d.ts.map +1 -0
  328. package/build/ota-transport/index.js +58 -0
  329. package/build/ota-transport/index.js.map +1 -0
  330. package/build/photo-receiver/PhotoReceiver.types.d.ts +18 -0
  331. package/build/photo-receiver/PhotoReceiver.types.d.ts.map +1 -0
  332. package/build/photo-receiver/PhotoReceiver.types.js +2 -0
  333. package/build/photo-receiver/PhotoReceiver.types.js.map +1 -0
  334. package/build/photo-receiver/PhotoReceiverModule.d.ts +10 -0
  335. package/build/photo-receiver/PhotoReceiverModule.d.ts.map +1 -0
  336. package/build/photo-receiver/PhotoReceiverModule.js +3 -0
  337. package/build/photo-receiver/PhotoReceiverModule.js.map +1 -0
  338. package/build/photo-receiver/PhotoReceiverModule.web.d.ts +10 -0
  339. package/build/photo-receiver/PhotoReceiverModule.web.d.ts.map +1 -0
  340. package/build/photo-receiver/PhotoReceiverModule.web.js +12 -0
  341. package/build/photo-receiver/PhotoReceiverModule.web.js.map +1 -0
  342. package/build/photo-receiver/index.d.ts +3 -0
  343. package/build/photo-receiver/index.d.ts.map +1 -0
  344. package/build/photo-receiver/index.js +3 -0
  345. package/build/photo-receiver/index.js.map +1 -0
  346. package/build/react/index.d.ts +5 -0
  347. package/build/react/index.d.ts.map +1 -0
  348. package/build/react/index.js +4 -0
  349. package/build/react/index.js.map +1 -0
  350. package/build/react/useBluetooth.d.ts +100 -0
  351. package/build/react/useBluetooth.d.ts.map +1 -0
  352. package/build/react/useBluetooth.js +167 -0
  353. package/build/react/useBluetooth.js.map +1 -0
  354. package/build/react/useBluetoothEvent.d.ts +6 -0
  355. package/build/react/useBluetoothEvent.d.ts.map +1 -0
  356. package/build/react/useBluetoothEvent.js +21 -0
  357. package/build/react/useBluetoothEvent.js.map +1 -0
  358. package/build/react/useBluetoothScan.d.ts +22 -0
  359. package/build/react/useBluetoothScan.d.ts.map +1 -0
  360. package/build/react/useBluetoothScan.js +135 -0
  361. package/build/react/useBluetoothScan.js.map +1 -0
  362. package/build/react/useBluetoothStatus.d.ts +16 -0
  363. package/build/react/useBluetoothStatus.d.ts.map +1 -0
  364. package/build/react/useBluetoothStatus.js +137 -0
  365. package/build/react/useBluetoothStatus.js.map +1 -0
  366. package/build/react/useGlassesConnection.d.ts +29 -0
  367. package/build/react/useGlassesConnection.d.ts.map +1 -0
  368. package/build/react/useGlassesConnection.js +153 -0
  369. package/build/react/useGlassesConnection.js.map +1 -0
  370. package/build/types/index.d.ts +3 -0
  371. package/build/types/index.d.ts.map +1 -0
  372. package/build/types/index.js +2 -0
  373. package/build/types/index.js.map +1 -0
  374. package/expo-module.config.json +14 -0
  375. package/ios/BackgroundOtaArtifactDownloader.swift +125 -0
  376. package/ios/BluetoothSdkModule.swift +1034 -0
  377. package/ios/GlasslyBluetoothSDK.podspec +106 -0
  378. package/ios/LocalIPv4.swift +150 -0
  379. package/ios/LocalOtaServer.swift +309 -0
  380. package/ios/LocalPhotoUploadServer.swift +754 -0
  381. package/ios/OtaServerModule.swift +147 -0
  382. package/ios/Packages/CoreObjC/CoreObjC.xcodeproj/project.pbxproj +213 -0
  383. package/ios/Packages/CoreObjC/PcmConverter.h +22 -0
  384. package/ios/Packages/CoreObjC/PcmConverter.m +266 -0
  385. package/ios/Packages/CoreObjC/attdet.c +92 -0
  386. package/ios/Packages/CoreObjC/attdet.h +44 -0
  387. package/ios/Packages/CoreObjC/bits.c +375 -0
  388. package/ios/Packages/CoreObjC/bits.h +315 -0
  389. package/ios/Packages/CoreObjC/bwdet.c +129 -0
  390. package/ios/Packages/CoreObjC/bwdet.h +69 -0
  391. package/ios/Packages/CoreObjC/common.h +151 -0
  392. package/ios/Packages/CoreObjC/energy.c +70 -0
  393. package/ios/Packages/CoreObjC/energy.h +43 -0
  394. package/ios/Packages/CoreObjC/fastmath.h +158 -0
  395. package/ios/Packages/CoreObjC/include/PcmConverter.h +22 -0
  396. package/ios/Packages/CoreObjC/lc3.c +704 -0
  397. package/ios/Packages/CoreObjC/lc3.h +313 -0
  398. package/ios/Packages/CoreObjC/lc3_cpp.h +283 -0
  399. package/ios/Packages/CoreObjC/lc3_private.h +163 -0
  400. package/ios/Packages/CoreObjC/ltpf.c +905 -0
  401. package/ios/Packages/CoreObjC/ltpf.h +111 -0
  402. package/ios/Packages/CoreObjC/ltpf_arm.h +506 -0
  403. package/ios/Packages/CoreObjC/ltpf_neon.h +281 -0
  404. package/ios/Packages/CoreObjC/makefile.mk +35 -0
  405. package/ios/Packages/CoreObjC/mdct.c +469 -0
  406. package/ios/Packages/CoreObjC/mdct.h +57 -0
  407. package/ios/Packages/CoreObjC/mdct_neon.h +296 -0
  408. package/ios/Packages/CoreObjC/meson.build +61 -0
  409. package/ios/Packages/CoreObjC/plc.c +61 -0
  410. package/ios/Packages/CoreObjC/plc.h +57 -0
  411. package/ios/Packages/CoreObjC/rnnoise.h +114 -0
  412. package/ios/Packages/CoreObjC/sns.c +880 -0
  413. package/ios/Packages/CoreObjC/sns.h +103 -0
  414. package/ios/Packages/CoreObjC/spec.c +907 -0
  415. package/ios/Packages/CoreObjC/spec.h +119 -0
  416. package/ios/Packages/CoreObjC/tables.c +3457 -0
  417. package/ios/Packages/CoreObjC/tables.h +94 -0
  418. package/ios/Packages/CoreObjC/tns.c +457 -0
  419. package/ios/Packages/CoreObjC/tns.h +99 -0
  420. package/ios/Packages/SherpaOnnx/Model/joiner.onnx +0 -0
  421. package/ios/Packages/SherpaOnnx/Model/tokens.txt +502 -0
  422. package/ios/Packages/SherpaOnnx/SherpaOnnx.swift +2383 -0
  423. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Info.plist +48 -0
  424. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
  425. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
  426. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/libsherpa-onnx.a +0 -0
  427. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
  428. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
  429. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/libsherpa-onnx.a +0 -0
  430. package/ios/Packages/libbz2/module.modulemap +5 -0
  431. package/ios/Packages/libbz2/shim.h +1 -0
  432. package/ios/PhotoReceiverModule.swift +129 -0
  433. package/ios/Source/BluetoothSDK.swift +2303 -0
  434. package/ios/Source/BluetoothSDKDebug.swift +12 -0
  435. package/ios/Source/BluetoothSdkDefaults.swift +29 -0
  436. package/ios/Source/Bridge.swift +708 -0
  437. package/ios/Source/Bridging-Header.h +16 -0
  438. package/ios/Source/DeviceManager.swift +2109 -0
  439. package/ios/Source/DeviceStore.swift +336 -0
  440. package/ios/Source/GeneratedChangelogCatalog.swift +7 -0
  441. package/ios/Source/GeneratedReleaseMetadata.swift +11 -0
  442. package/ios/Source/ObservableStore.swift +118 -0
  443. package/ios/Source/OtaManifest.swift +211 -0
  444. package/ios/Source/PrivacyInfo.xcprivacy +23 -0
  445. package/ios/Source/ReleaseChangelog.swift +65 -0
  446. package/ios/Source/Resources/G2Firmware/README.md +10 -0
  447. package/ios/Source/audio/AudioModels.swift +178 -0
  448. package/ios/Source/audio/PcmStreamPlayer.swift +410 -0
  449. package/ios/Source/camera/CameraModels.swift +866 -0
  450. package/ios/Source/connection/ScanSession.swift +27 -0
  451. package/ios/Source/controllers/ControllerManager.swift +184 -0
  452. package/ios/Source/controllers/R1.swift +829 -0
  453. package/ios/Source/errors/BluetoothSdkError.swift +19 -0
  454. package/ios/Source/events/BluetoothEvents.swift +342 -0
  455. package/ios/Source/internal/BleTraceLogger.swift +192 -0
  456. package/ios/Source/internal/BluetoothAvailability.swift +78 -0
  457. package/ios/Source/internal/BluetoothSdkAnalytics.swift +199 -0
  458. package/ios/Source/internal/ValueParsing.swift +99 -0
  459. package/ios/Source/requests/DisplayRequests.swift +82 -0
  460. package/ios/Source/services/PhoneMic.swift +662 -0
  461. package/ios/Source/sgcs/Ar99.swift +2451 -0
  462. package/ios/Source/sgcs/Frame.swift +649 -0
  463. package/ios/Source/sgcs/G1.swift +2554 -0
  464. package/ios/Source/sgcs/G2.swift +6887 -0
  465. package/ios/Source/sgcs/G2CfwClassification.swift +43 -0
  466. package/ios/Source/sgcs/G2CfwRenderer.swift +1279 -0
  467. package/ios/Source/sgcs/G2CfwTextureCache.swift +233 -0
  468. package/ios/Source/sgcs/G2FlashProtocol.swift +312 -0
  469. package/ios/Source/sgcs/G2Flasher.swift +773 -0
  470. package/ios/Source/sgcs/Mach1.swift +541 -0
  471. package/ios/Source/sgcs/MentraLive.swift +7011 -0
  472. package/ios/Source/sgcs/MentraLiveL2capChannel.swift +183 -0
  473. package/ios/Source/sgcs/MentraLivePairingAdvertisement.swift +64 -0
  474. package/ios/Source/sgcs/MentraNex.swift +3221 -0
  475. package/ios/Source/sgcs/Nimo.swift +1886 -0
  476. package/ios/Source/sgcs/SGCManager.swift +608 -0
  477. package/ios/Source/sgcs/Simulated.swift +274 -0
  478. package/ios/Source/sgcs/ar99/ota/Ar99OtaManager.swift +637 -0
  479. package/ios/Source/sgcs/glassly_ble.pb.swift +4354 -0
  480. package/ios/Source/speakerid/SpeakerIdEngine.swift +573 -0
  481. package/ios/Source/status/DeviceStatus.swift +981 -0
  482. package/ios/Source/status/RuntimeState.swift +359 -0
  483. package/ios/Source/status/WifiHotspotStatus.swift +345 -0
  484. package/ios/Source/streaming/StreamModels.swift +693 -0
  485. package/ios/Source/stt/STTTools.swift +191 -0
  486. package/ios/Source/stt/SherpaOnnxTranscriber.swift +466 -0
  487. package/ios/Source/tts/TTSTools.swift +171 -0
  488. package/ios/Source/types/DeviceModels.swift +177 -0
  489. package/ios/Source/utils/AudioSessionMonitor.swift +283 -0
  490. package/ios/Source/utils/BinaryCodec.swift +61 -0
  491. package/ios/Source/utils/BleJsonCompact.swift +405 -0
  492. package/ios/Source/utils/BleWireProtocol.swift +92 -0
  493. package/ios/Source/utils/Constants.swift +78 -0
  494. package/ios/Source/utils/Enums.swift +95 -0
  495. package/ios/Source/utils/G1Text.swift +2096 -0
  496. package/ios/Source/utils/JSCExperiment.swift +241 -0
  497. package/ios/Source/utils/MemoryMonitor.swift +44 -0
  498. package/ios/Source/utils/MessageChunkReassembler.swift +190 -0
  499. package/ios/Source/utils/MessageChunker.swift +294 -0
  500. package/ios/Source/utils/Models.swift +135 -0
  501. package/ios/Source/utils/PhoneAudioMonitor.swift +230 -0
  502. package/ios/Source/utils/TarBz2Extractor.swift +257 -0
  503. package/ios/Tests/BluetoothSDKTests/G2CfwClassificationTests.swift +78 -0
  504. package/ios/Tests/BluetoothSDKTests/G2CfwRendererTests.swift +372 -0
  505. package/ios/Tests/BluetoothSDKTests/G2CfwTextureCacheTests.swift +162 -0
  506. package/ios/Tests/BluetoothSDKTests/G2FlashProtocolTests.swift +182 -0
  507. package/ios/Tests/MentraLivePairingAdvertisementTests.swift +160 -0
  508. package/ios/Tests/ReleaseChangelogTests.swift +13 -0
  509. package/package.json +129 -0
  510. package/plugin/build/index.d.ts +10 -0
  511. package/plugin/build/index.js +12 -0
  512. package/plugin/build/withAndroid.d.ts +3 -0
  513. package/plugin/build/withAndroid.js +190 -0
  514. package/plugin/build/withIos.d.ts +5 -0
  515. package/plugin/build/withIos.js +108 -0
  516. package/scripts/inject-ios-sdk-version.mjs +65 -0
  517. package/scripts/public-ota-api.test.mjs +37 -0
  518. package/scripts/verify-release-package.mjs +45 -0
  519. package/scripts/write-release-metadata.mjs +152 -0
  520. package/scripts/write-release-metadata.test.mjs +37 -0
  521. package/src/BluetoothSdk.types.ts +1623 -0
  522. package/src/_internal.ts +16 -0
  523. package/src/_private/BluetoothSdkModule.ts +684 -0
  524. package/src/_private/LocalNetworkModule.ts +50 -0
  525. package/src/_private/cameraRequestPayload.ts +34 -0
  526. package/src/_private/photoRequestPayload.ts +90 -0
  527. package/src/_private/sdkOtaManifest.ts +18 -0
  528. package/src/changelogs.ts +46 -0
  529. package/src/debug.ts +9 -0
  530. package/src/generated/changelogCatalog.ts +13 -0
  531. package/src/generated/releaseMetadata.ts +20 -0
  532. package/src/index.ts +321 -0
  533. package/src/ota-server/OtaServer.types.ts +10 -0
  534. package/src/ota-server/OtaServerModule.ts +23 -0
  535. package/src/ota-server/OtaServerModule.web.ts +17 -0
  536. package/src/ota-server/index.ts +2 -0
  537. package/src/ota-transport/index.ts +116 -0
  538. package/src/photo-receiver/PhotoReceiver.types.ts +20 -0
  539. package/src/photo-receiver/PhotoReceiverModule.ts +11 -0
  540. package/src/photo-receiver/PhotoReceiverModule.web.ts +17 -0
  541. package/src/photo-receiver/index.ts +2 -0
  542. package/src/react/index.ts +21 -0
  543. package/src/react/useBluetooth.ts +309 -0
  544. package/src/react/useBluetoothEvent.ts +35 -0
  545. package/src/react/useBluetoothScan.ts +173 -0
  546. package/src/react/useBluetoothStatus.ts +180 -0
  547. package/src/react/useGlassesConnection.ts +202 -0
  548. package/src/types/index.ts +12 -0
@@ -0,0 +1,693 @@
1
+ import Foundation
2
+
3
+ public struct StreamVideoConfig {
4
+ public let width: Int?
5
+ public let height: Int?
6
+ public let bitrate: Int?
7
+ public let fps: Int?
8
+
9
+ public init(
10
+ width: Int? = nil,
11
+ height: Int? = nil,
12
+ bitrate: Int? = nil,
13
+ fps: Int? = nil
14
+ ) {
15
+ self.width = width
16
+ self.height = height
17
+ self.bitrate = bitrate
18
+ self.fps = fps
19
+ }
20
+
21
+ var dictionary: [String: Any] {
22
+ var values: [String: Any] = [:]
23
+ if let width { values["width"] = width }
24
+ if let height { values["height"] = height }
25
+ if let bitrate { values["bitrate"] = bitrate }
26
+ // ASG stream parsers shipped with the BLE key named "frameRate".
27
+ if let fps { values["frameRate"] = fps }
28
+ return values
29
+ }
30
+
31
+ init?(values: [String: Any]?) {
32
+ guard let values else { return nil }
33
+ self.init(
34
+ width: intValue(values["width"]),
35
+ height: intValue(values["height"]),
36
+ bitrate: intValue(values["bitrate"]),
37
+ fps: intValue(values["fps"])
38
+ )
39
+ }
40
+ }
41
+
42
+ public struct StreamAudioConfig {
43
+ public let bitrate: Int?
44
+ public let sampleRate: Int?
45
+ public let echoCancellation: Bool?
46
+ public let noiseSuppression: Bool?
47
+
48
+ public init(
49
+ bitrate: Int? = nil,
50
+ sampleRate: Int? = nil,
51
+ echoCancellation: Bool? = nil,
52
+ noiseSuppression: Bool? = nil
53
+ ) {
54
+ self.bitrate = bitrate
55
+ self.sampleRate = sampleRate
56
+ self.echoCancellation = echoCancellation
57
+ self.noiseSuppression = noiseSuppression
58
+ }
59
+
60
+ var dictionary: [String: Any] {
61
+ var values: [String: Any] = [:]
62
+ if let bitrate { values["bitrate"] = bitrate }
63
+ if let sampleRate { values["sampleRate"] = sampleRate }
64
+ if let echoCancellation { values["echoCancellation"] = echoCancellation }
65
+ if let noiseSuppression { values["noiseSuppression"] = noiseSuppression }
66
+ return values
67
+ }
68
+
69
+ init?(values: [String: Any]?) {
70
+ guard let values else { return nil }
71
+ self.init(
72
+ bitrate: intValue(values["bitrate"]),
73
+ sampleRate: intValue(values["sampleRate"]),
74
+ echoCancellation: values["echoCancellation"] as? Bool,
75
+ noiseSuppression: values["noiseSuppression"] as? Bool
76
+ )
77
+ }
78
+ }
79
+
80
+ /// Effective video settings reported by the glasses after defaults and clamps.
81
+ public struct StreamResolvedVideoConfig: Equatable {
82
+ /// Encoded output width sent to the stream endpoint.
83
+ public let width: Int
84
+ /// Encoded output height sent to the stream endpoint.
85
+ public let height: Int
86
+ /// Native camera buffer width selected before crop/downscale.
87
+ public let captureWidth: Int?
88
+ /// Native camera buffer height selected before crop/downscale.
89
+ public let captureHeight: Int?
90
+ /// Encoded video bitrate in bits per second.
91
+ public let bitrate: Int
92
+ /// Resolved capture/encode frame rate.
93
+ public let fps: Double
94
+
95
+ public init(
96
+ width: Int,
97
+ height: Int,
98
+ captureWidth: Int? = nil,
99
+ captureHeight: Int? = nil,
100
+ bitrate: Int,
101
+ fps: Double
102
+ ) {
103
+ self.width = width
104
+ self.height = height
105
+ self.captureWidth = captureWidth
106
+ self.captureHeight = captureHeight
107
+ self.bitrate = bitrate
108
+ self.fps = fps
109
+ }
110
+
111
+ init?(values: [String: Any]?) {
112
+ guard let values,
113
+ let width = intValue(values["width"]),
114
+ let height = intValue(values["height"]),
115
+ let bitrate = intValue(values["bitrate"]),
116
+ let fps = doubleValue(values["fps"])
117
+ else {
118
+ return nil
119
+ }
120
+ self.init(
121
+ width: width,
122
+ height: height,
123
+ captureWidth: intValue(values["captureWidth"]),
124
+ captureHeight: intValue(values["captureHeight"]),
125
+ bitrate: bitrate,
126
+ fps: fps
127
+ )
128
+ }
129
+
130
+ var values: [String: Any] {
131
+ var values: [String: Any] = [
132
+ "width": width,
133
+ "height": height,
134
+ "bitrate": bitrate,
135
+ "fps": fps,
136
+ ]
137
+ if let captureWidth { values["captureWidth"] = captureWidth }
138
+ if let captureHeight { values["captureHeight"] = captureHeight }
139
+ return values
140
+ }
141
+ }
142
+
143
+ public struct StreamResolvedAudioConfig: Equatable {
144
+ public let bitrate: Int?
145
+ public let sampleRate: Int?
146
+ public let echoCancellation: Bool?
147
+ public let noiseSuppression: Bool?
148
+
149
+ public init(
150
+ bitrate: Int? = nil,
151
+ sampleRate: Int? = nil,
152
+ echoCancellation: Bool? = nil,
153
+ noiseSuppression: Bool? = nil
154
+ ) {
155
+ self.bitrate = bitrate
156
+ self.sampleRate = sampleRate
157
+ self.echoCancellation = echoCancellation
158
+ self.noiseSuppression = noiseSuppression
159
+ }
160
+
161
+ init?(values: [String: Any]?) {
162
+ guard let values else { return nil }
163
+ self.init(
164
+ bitrate: intValue(values["bitrate"]),
165
+ sampleRate: intValue(values["sampleRate"]),
166
+ echoCancellation: boolValue(values, "echoCancellation"),
167
+ noiseSuppression: boolValue(values, "noiseSuppression")
168
+ )
169
+ }
170
+
171
+ var values: [String: Any] {
172
+ var values: [String: Any] = [:]
173
+ if let bitrate { values["bitrate"] = bitrate }
174
+ if let sampleRate { values["sampleRate"] = sampleRate }
175
+ if let echoCancellation { values["echoCancellation"] = echoCancellation }
176
+ if let noiseSuppression { values["noiseSuppression"] = noiseSuppression }
177
+ return values
178
+ }
179
+ }
180
+
181
+ public enum StreamTransport: String, Equatable {
182
+ case rtmp
183
+ case srt
184
+ case whip
185
+ }
186
+
187
+ public struct StreamResolvedConfig: Equatable {
188
+ public let transport: StreamTransport?
189
+ public let video: StreamResolvedVideoConfig?
190
+ public let audio: StreamResolvedAudioConfig?
191
+
192
+ public init(
193
+ transport: StreamTransport? = nil,
194
+ video: StreamResolvedVideoConfig? = nil,
195
+ audio: StreamResolvedAudioConfig? = nil
196
+ ) {
197
+ self.transport = transport
198
+ self.video = video
199
+ self.audio = audio
200
+ }
201
+
202
+ init?(values: [String: Any]?) {
203
+ guard let values else { return nil }
204
+ self.init(
205
+ transport: stringValue(values, "transport").flatMap(StreamTransport.init(rawValue:)),
206
+ video: StreamResolvedVideoConfig(values: values["video"] as? [String: Any]),
207
+ audio: StreamResolvedAudioConfig(values: values["audio"] as? [String: Any])
208
+ )
209
+ }
210
+
211
+ var values: [String: Any] {
212
+ var values: [String: Any] = [:]
213
+ if let transport { values["transport"] = transport.rawValue }
214
+ if let video { values["video"] = video.values }
215
+ if let audio { values["audio"] = audio.values }
216
+ return values
217
+ }
218
+ }
219
+
220
+ private func streamInt64Value(_ value: Any?) -> Int64? {
221
+ if let int64 = value as? Int64 { return int64 }
222
+ if let int = value as? Int { return Int64(int) }
223
+ if let number = value as? NSNumber { return number.int64Value }
224
+ return nil
225
+ }
226
+
227
+ /// Live encoder and device telemetry reported by the glasses while streaming.
228
+ public struct StreamLiveStats: Equatable {
229
+ public let bitrate: Int64?
230
+ public let fps: Double?
231
+ public let droppedFrames: Int64?
232
+ public let duration: Int64?
233
+ public let temperatureC: Double?
234
+
235
+ public init(
236
+ bitrate: Int64? = nil,
237
+ fps: Double? = nil,
238
+ droppedFrames: Int64? = nil,
239
+ duration: Int64? = nil,
240
+ temperatureC: Double? = nil
241
+ ) {
242
+ self.bitrate = bitrate
243
+ self.fps = fps
244
+ self.droppedFrames = droppedFrames
245
+ self.duration = duration
246
+ self.temperatureC = temperatureC
247
+ }
248
+
249
+ init?(values: [String: Any]?) {
250
+ guard let values else { return nil }
251
+ self.init(
252
+ bitrate: streamInt64Value(values["bitrate"]),
253
+ fps: doubleValue(values["fps"]),
254
+ droppedFrames: streamInt64Value(values["droppedFrames"]),
255
+ duration: streamInt64Value(values["duration"]),
256
+ temperatureC: doubleValue(values["temperatureC"])
257
+ )
258
+ }
259
+
260
+ var values: [String: Any] {
261
+ var values: [String: Any] = [:]
262
+ if let bitrate { values["bitrate"] = bitrate }
263
+ if let fps { values["fps"] = fps }
264
+ if let droppedFrames { values["droppedFrames"] = droppedFrames }
265
+ if let duration { values["duration"] = duration }
266
+ if let temperatureC { values["temperatureC"] = temperatureC }
267
+ return values
268
+ }
269
+ }
270
+
271
+ public struct StreamRequest {
272
+ public let streamUrl: String
273
+ public let streamId: String
274
+ public let sound: Bool
275
+ public let video: StreamVideoConfig?
276
+ public let audio: StreamAudioConfig?
277
+ public let authToken: String?
278
+
279
+ public init(
280
+ streamUrl: String,
281
+ streamId: String = "",
282
+ sound: Bool = true,
283
+ video: StreamVideoConfig? = nil,
284
+ audio: StreamAudioConfig? = nil,
285
+ authToken: String? = nil
286
+ ) {
287
+ self.streamUrl = streamUrl
288
+ self.streamId = streamId
289
+ self.sound = sound
290
+ self.video = video
291
+ self.audio = audio
292
+ self.authToken = authToken
293
+ }
294
+
295
+ init(values: [String: Any]) {
296
+ self.init(
297
+ streamUrl: values["streamUrl"] as? String
298
+ ?? values["rtmpUrl"] as? String
299
+ ?? values["srtUrl"] as? String
300
+ ?? values["whipUrl"] as? String
301
+ ?? "",
302
+ streamId: values["streamId"] as? String ?? "",
303
+ sound: values["sound"] as? Bool ?? true,
304
+ video: StreamVideoConfig(values: values["video"] as? [String: Any]),
305
+ audio: StreamAudioConfig(values: values["audio"] as? [String: Any]),
306
+ authToken: values["authToken"] as? String ?? values["auth_token"] as? String
307
+ )
308
+ }
309
+
310
+ public var values: [String: Any] {
311
+ var values: [String: Any] = [:]
312
+ values["type"] = "start_stream"
313
+ values["streamUrl"] = streamUrl
314
+ values["streamId"] = streamId
315
+ values["sound"] = sound
316
+ if let videoValues = video?.dictionary, !videoValues.isEmpty {
317
+ values["video"] = videoValues
318
+ }
319
+ if let audioValues = audio?.dictionary, !audioValues.isEmpty {
320
+ values["audio"] = audioValues
321
+ }
322
+ if let authToken, !authToken.isEmpty {
323
+ values["authToken"] = authToken
324
+ }
325
+ return values
326
+ }
327
+ }
328
+
329
+ struct StreamKeepAliveRequest {
330
+ let streamId: String
331
+ let ackId: String
332
+
333
+ init(streamId: String, ackId: String) {
334
+ self.streamId = streamId
335
+ self.ackId = ackId
336
+ }
337
+
338
+ init(values: [String: Any]) {
339
+ self.init(
340
+ streamId: values["streamId"] as? String ?? "",
341
+ ackId: values["ackId"] as? String ?? ""
342
+ )
343
+ }
344
+
345
+ var values: [String: Any] {
346
+ var values: [String: Any] = [:]
347
+ values["type"] = "keep_stream_alive"
348
+ values["streamId"] = streamId
349
+ values["ackId"] = ackId
350
+ return values
351
+ }
352
+ }
353
+
354
+ public enum StreamState: String, Equatable {
355
+ case initializing
356
+ case streaming
357
+ case stopping
358
+ case stopped
359
+ case reconnecting
360
+ case reconnected
361
+ case reconnectFailed = "reconnect_failed"
362
+ case error
363
+
364
+ fileprivate static func from(_ value: String?) -> StreamState? {
365
+ switch value?.lowercased() {
366
+ case "initializing", "starting", "connecting":
367
+ return .initializing
368
+ case "streaming", "streaming_started", "active":
369
+ return .streaming
370
+ case "stopping":
371
+ return .stopping
372
+ case "stopped", "not_streaming", "disconnected", "timeout":
373
+ return .stopped
374
+ case "reconnecting":
375
+ return .reconnecting
376
+ case "reconnected":
377
+ return .reconnected
378
+ case "reconnect_failed":
379
+ return .reconnectFailed
380
+ case "error", "error_not_streaming":
381
+ return .error
382
+ default:
383
+ return nil
384
+ }
385
+ }
386
+ }
387
+
388
+ public enum StreamStatusKind: String, Equatable {
389
+ case lifecycle
390
+ case reconnect
391
+ case error
392
+ case snapshot
393
+ }
394
+
395
+ public enum StreamStatus: CustomStringConvertible, Equatable {
396
+ case lifecycle(state: StreamState, streamId: String?, timestamp: Int?, resolvedConfig: StreamResolvedConfig?)
397
+ case reconnecting(
398
+ streamId: String?,
399
+ attempt: Int,
400
+ maxAttempts: Int,
401
+ reason: String,
402
+ timestamp: Int?,
403
+ resolvedConfig: StreamResolvedConfig?
404
+ )
405
+ case reconnected(streamId: String?, attempt: Int, timestamp: Int?, resolvedConfig: StreamResolvedConfig?)
406
+ case reconnectFailed(streamId: String?, maxAttempts: Int, timestamp: Int?, resolvedConfig: StreamResolvedConfig?)
407
+ case error(streamId: String?, errorDetails: String, timestamp: Int?, resolvedConfig: StreamResolvedConfig?)
408
+ case snapshot(
409
+ state: StreamState,
410
+ streaming: Bool,
411
+ reconnecting: Bool,
412
+ streamId: String?,
413
+ attempt: Int?,
414
+ timestamp: Int?,
415
+ resolvedConfig: StreamResolvedConfig?
416
+ )
417
+
418
+ public init(values: [String: Any]) {
419
+ let rawState = stringValue(values, "status")
420
+ let streamId = stringValue(values, "streamId")
421
+ let timestamp = intValue(values["timestamp"])
422
+ let resolvedConfig = StreamResolvedConfig(values: values["resolvedConfig"] as? [String: Any])
423
+ let attempt = optionalIntValue(values, "attempt")
424
+ let maxAttempts = optionalIntValue(values, "maxAttempts") ?? 0
425
+ let parsedState = StreamState.from(rawState)
426
+
427
+ if hasAnyKey(values, "streaming") || hasAnyKey(values, "reconnecting") {
428
+ let streaming = boolValue(values, "streaming") == true
429
+ let reconnecting = boolValue(values, "reconnecting") == true
430
+ let snapshotState: StreamState
431
+ if reconnecting {
432
+ snapshotState = .reconnecting
433
+ } else if streaming {
434
+ snapshotState = .streaming
435
+ } else {
436
+ snapshotState = parsedState ?? .stopped
437
+ }
438
+ self = .snapshot(
439
+ state: snapshotState,
440
+ streaming: streaming,
441
+ reconnecting: reconnecting,
442
+ streamId: streamId,
443
+ attempt: attempt,
444
+ timestamp: timestamp,
445
+ resolvedConfig: resolvedConfig
446
+ )
447
+ return
448
+ }
449
+
450
+ guard let state = parsedState else {
451
+ self = .error(
452
+ streamId: streamId,
453
+ errorDetails: rawState.map { "Unknown stream status: \($0)" } ?? "Missing stream status",
454
+ timestamp: timestamp,
455
+ resolvedConfig: resolvedConfig
456
+ )
457
+ return
458
+ }
459
+
460
+ switch state {
461
+ case .reconnecting:
462
+ self = .reconnecting(
463
+ streamId: streamId,
464
+ attempt: attempt ?? 0,
465
+ maxAttempts: maxAttempts,
466
+ reason: stringValue(values, "reason") ?? "",
467
+ timestamp: timestamp,
468
+ resolvedConfig: resolvedConfig
469
+ )
470
+ case .reconnected:
471
+ self = .reconnected(
472
+ streamId: streamId,
473
+ attempt: attempt ?? 0,
474
+ timestamp: timestamp,
475
+ resolvedConfig: resolvedConfig
476
+ )
477
+ case .reconnectFailed:
478
+ self = .reconnectFailed(
479
+ streamId: streamId,
480
+ maxAttempts: maxAttempts,
481
+ timestamp: timestamp,
482
+ resolvedConfig: resolvedConfig
483
+ )
484
+ case .error:
485
+ self = .error(
486
+ streamId: streamId,
487
+ errorDetails: stringValue(values, "errorDetails")
488
+ ?? (rawState == "error_not_streaming" ? "not_streaming" : "Unknown stream error"),
489
+ timestamp: timestamp,
490
+ resolvedConfig: resolvedConfig
491
+ )
492
+ default:
493
+ self = .lifecycle(
494
+ state: state,
495
+ streamId: streamId,
496
+ timestamp: timestamp,
497
+ resolvedConfig: resolvedConfig
498
+ )
499
+ }
500
+ }
501
+
502
+ public var kind: StreamStatusKind {
503
+ switch self {
504
+ case .lifecycle:
505
+ .lifecycle
506
+ case .reconnecting, .reconnected, .reconnectFailed:
507
+ .reconnect
508
+ case .error:
509
+ .error
510
+ case .snapshot:
511
+ .snapshot
512
+ }
513
+ }
514
+
515
+ public var state: StreamState {
516
+ switch self {
517
+ case let .lifecycle(state, _, _, _):
518
+ state
519
+ case .reconnecting:
520
+ .reconnecting
521
+ case .reconnected:
522
+ .reconnected
523
+ case .reconnectFailed:
524
+ .reconnectFailed
525
+ case .error:
526
+ .error
527
+ case let .snapshot(state, _, _, _, _, _, _):
528
+ state
529
+ }
530
+ }
531
+
532
+ public var streamId: String? {
533
+ switch self {
534
+ case let .lifecycle(_, streamId, _, _),
535
+ let .reconnecting(streamId, _, _, _, _, _),
536
+ let .reconnected(streamId, _, _, _),
537
+ let .reconnectFailed(streamId, _, _, _),
538
+ let .error(streamId, _, _, _),
539
+ let .snapshot(_, _, _, streamId, _, _, _):
540
+ streamId
541
+ }
542
+ }
543
+
544
+ public var timestamp: Int? {
545
+ switch self {
546
+ case let .lifecycle(_, _, timestamp, _),
547
+ let .reconnecting(_, _, _, _, timestamp, _),
548
+ let .reconnected(_, _, timestamp, _),
549
+ let .reconnectFailed(_, _, timestamp, _),
550
+ let .error(_, _, timestamp, _),
551
+ let .snapshot(_, _, _, _, _, timestamp, _):
552
+ timestamp
553
+ }
554
+ }
555
+
556
+ public var resolvedConfig: StreamResolvedConfig? {
557
+ switch self {
558
+ case let .lifecycle(_, _, _, resolvedConfig),
559
+ let .reconnecting(_, _, _, _, _, resolvedConfig),
560
+ let .reconnected(_, _, _, resolvedConfig),
561
+ let .reconnectFailed(_, _, _, resolvedConfig),
562
+ let .error(_, _, _, resolvedConfig),
563
+ let .snapshot(_, _, _, _, _, _, resolvedConfig):
564
+ resolvedConfig
565
+ }
566
+ }
567
+
568
+ public var values: [String: Any] {
569
+ var values: [String: Any] = [
570
+ "kind": kind.rawValue,
571
+ "status": state.rawValue,
572
+ ]
573
+ if let streamId, !streamId.isEmpty {
574
+ values["streamId"] = streamId
575
+ }
576
+ if let timestamp {
577
+ values["timestamp"] = timestamp
578
+ }
579
+ if let resolvedConfig {
580
+ values["resolvedConfig"] = resolvedConfig.values
581
+ }
582
+
583
+ switch self {
584
+ case .lifecycle:
585
+ break
586
+ case let .reconnecting(_, attempt, maxAttempts, reason, _, _):
587
+ values["attempt"] = attempt
588
+ values["maxAttempts"] = maxAttempts
589
+ values["reason"] = reason
590
+ case let .reconnected(_, attempt, _, _):
591
+ values["attempt"] = attempt
592
+ case let .reconnectFailed(_, maxAttempts, _, _):
593
+ values["maxAttempts"] = maxAttempts
594
+ case let .error(_, errorDetails, _, _):
595
+ values["errorDetails"] = errorDetails
596
+ case let .snapshot(_, streaming, reconnecting, _, attempt, _, _):
597
+ values["streaming"] = streaming
598
+ values["reconnecting"] = reconnecting
599
+ if let attempt {
600
+ values["attempt"] = attempt
601
+ }
602
+ }
603
+
604
+ return values
605
+ }
606
+
607
+ public var description: String {
608
+ "StreamStatus(kind: \(kind.rawValue), status: \(state.rawValue), streamId: \(streamId ?? "none"))"
609
+ }
610
+ }
611
+
612
+ public struct StreamStatusEvent: CustomStringConvertible {
613
+ public let status: StreamStatus
614
+ public let stats: StreamLiveStats?
615
+ /// True when the glasses will retry the failed publisher themselves
616
+ /// (emitting side lands in PR #3488); absent on older firmware and on
617
+ /// events not parsed from a glasses status map. Carried here instead of
618
+ /// as an `.error` associated value so the public case stays unchanged.
619
+ public private(set) var willRetry: Bool?
620
+
621
+ public init(status: StreamStatus, stats: StreamLiveStats? = nil) {
622
+ self.status = status
623
+ self.stats = stats
624
+ }
625
+
626
+ public init(values: [String: Any]) {
627
+ status = StreamStatus(values: values)
628
+ stats = StreamLiveStats(values: values["stats"] as? [String: Any])
629
+ willRetry = boolValue(values, "willRetry")
630
+ }
631
+
632
+ public var state: StreamState {
633
+ status.state
634
+ }
635
+
636
+ public var streamId: String? {
637
+ status.streamId
638
+ }
639
+
640
+ public var resolvedConfig: StreamResolvedConfig? {
641
+ status.resolvedConfig
642
+ }
643
+
644
+ public var values: [String: Any] {
645
+ var values = status.values
646
+ values["type"] = "stream_status"
647
+ if let stats {
648
+ values["stats"] = stats.values
649
+ }
650
+ if let willRetry {
651
+ values["willRetry"] = willRetry
652
+ }
653
+ return values
654
+ }
655
+
656
+ public var description: String {
657
+ "StreamStatusEvent(kind: \(status.kind.rawValue), status: \(state.rawValue), streamId: \(streamId ?? "none"))"
658
+ }
659
+ }
660
+
661
+ public struct KeepAliveAckEvent: CustomStringConvertible, Equatable {
662
+ public let streamId: String
663
+ public let ackId: String
664
+ public let timestamp: Int?
665
+
666
+ public init(streamId: String, ackId: String, timestamp: Int? = nil) {
667
+ self.streamId = streamId
668
+ self.ackId = ackId
669
+ self.timestamp = timestamp
670
+ }
671
+
672
+ public init(values: [String: Any]) {
673
+ streamId = stringValue(values, "streamId") ?? ""
674
+ ackId = stringValue(values, "ackId") ?? ""
675
+ timestamp = intValue(values["timestamp"])
676
+ }
677
+
678
+ public var values: [String: Any] {
679
+ var values: [String: Any] = [
680
+ "type": "keep_alive_ack",
681
+ "streamId": streamId,
682
+ "ackId": ackId,
683
+ ]
684
+ if let timestamp {
685
+ values["timestamp"] = timestamp
686
+ }
687
+ return values
688
+ }
689
+
690
+ public var description: String {
691
+ "KeepAliveAckEvent(streamId: \(streamId), ackId: \(ackId))"
692
+ }
693
+ }