@mentra/bluetooth-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/README.md +278 -0
  2. package/android/build.gradle +167 -0
  3. package/android/lc3Lib/CMakeLists.txt +6 -0
  4. package/android/lc3Lib/build.gradle +109 -0
  5. package/android/lc3Lib/proguard-rules.pro +33 -0
  6. package/android/lc3Lib/src/main/AndroidManifest.xml +2 -0
  7. package/android/lc3Lib/src/main/cpp/CMakeLists.txt +8 -0
  8. package/android/lc3Lib/src/main/cpp/google_opus_stuff/CMakeLists.txt +30 -0
  9. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/CMakeLists.txt +7 -0
  10. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.cc +96 -0
  11. package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.h +53 -0
  12. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/Makefile.am +6 -0
  13. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h +26 -0
  14. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h.in +26 -0
  15. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/ogg.h +209 -0
  16. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/os_types.h +158 -0
  17. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus.h +981 -0
  18. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_custom.h +342 -0
  19. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_defines.h +799 -0
  20. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_multistream.h +660 -0
  21. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_projection.h +568 -0
  22. package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_types.h +166 -0
  23. package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.cc +268 -0
  24. package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.h +115 -0
  25. package/android/lc3Lib/src/main/cpp/google_opus_stuff/opus_tools/opus_header.h +59 -0
  26. package/android/lc3Lib/src/main/cpp/liblc3/CMakeLists.txt +38 -0
  27. package/android/lc3Lib/src/main/cpp/liblc3/include/lc3.h +309 -0
  28. package/android/lc3Lib/src/main/cpp/liblc3/include/lc3_private.h +162 -0
  29. package/android/lc3Lib/src/main/cpp/liblc3/include/rnnoise.h +114 -0
  30. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/CMakeLists.txt +19 -0
  31. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.c +92 -0
  32. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.h +44 -0
  33. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.c +375 -0
  34. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.h +315 -0
  35. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.c +129 -0
  36. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.h +69 -0
  37. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/common.h +148 -0
  38. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.c +70 -0
  39. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.h +43 -0
  40. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/fastmath.h +158 -0
  41. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/lc3.c +702 -0
  42. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.c +893 -0
  43. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.h +111 -0
  44. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_arm.h +506 -0
  45. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_neon.h +281 -0
  46. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/makefile.mk +35 -0
  47. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.c +452 -0
  48. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.h +57 -0
  49. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct_neon.h +296 -0
  50. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/meson.build +46 -0
  51. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.c +61 -0
  52. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.h +57 -0
  53. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.c +880 -0
  54. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.h +103 -0
  55. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.c +904 -0
  56. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.h +119 -0
  57. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.c +3457 -0
  58. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.h +94 -0
  59. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.c +457 -0
  60. package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.h +99 -0
  61. package/android/lc3Lib/src/main/cpp/liblc3/liblc3.cpp +159 -0
  62. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/_kiss_fft_guts.h +182 -0
  63. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/arch.h +261 -0
  64. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.c +279 -0
  65. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.h +59 -0
  66. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/common.h +48 -0
  67. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/compile.sh +3 -0
  68. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/denoise.c +646 -0
  69. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.c +601 -0
  70. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.h +203 -0
  71. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/opus_types.h +159 -0
  72. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.c +526 -0
  73. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.h +149 -0
  74. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.c +178 -0
  75. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.h +69 -0
  76. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.c +11051 -0
  77. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.h +34 -0
  78. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_reader.c +168 -0
  79. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_train.py +66 -0
  80. package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/tansig_table.h +45 -0
  81. package/android/lc3Lib/src/main/java/com/mentra/lc3Lib/Lc3Cpp.java +38 -0
  82. package/android/lc3Lib/third_party/CMakeLists.txt +23 -0
  83. package/android/lc3Lib/third_party/CMakeLists_libogg.txt +18 -0
  84. package/android/lc3Lib/third_party/CMakeLists_libopus.txt +18 -0
  85. package/android/lc3Lib/third_party/CMakeLists_opus-tools.txt +23 -0
  86. package/android/lc3Lib/third_party/opus_tools/src/AUTHORS +5 -0
  87. package/android/lc3Lib/third_party/opus_tools/src/CMakeLists.txt +4 -0
  88. package/android/lc3Lib/third_party/opus_tools/src/COPYING +371 -0
  89. package/android/lc3Lib/third_party/opus_tools/src/ChangeLog +3 -0
  90. package/android/lc3Lib/third_party/opus_tools/src/Makefile.am +42 -0
  91. package/android/lc3Lib/third_party/opus_tools/src/Makefile.unix +23 -0
  92. package/android/lc3Lib/third_party/opus_tools/src/NEWS +0 -0
  93. package/android/lc3Lib/third_party/opus_tools/src/README +0 -0
  94. package/android/lc3Lib/third_party/opus_tools/src/autogen.sh +115 -0
  95. package/android/lc3Lib/third_party/opus_tools/src/configure.ac +293 -0
  96. package/android/lc3Lib/third_party/opus_tools/src/src/arch.h +239 -0
  97. package/android/lc3Lib/third_party/opus_tools/src/src/audio-in.c +1046 -0
  98. package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.c +245 -0
  99. package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.h +28 -0
  100. package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.c +320 -0
  101. package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.h +51 -0
  102. package/android/lc3Lib/third_party/opus_tools/src/src/lpc.c +157 -0
  103. package/android/lc3Lib/third_party/opus_tools/src/src/lpc.h +27 -0
  104. package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.c +286 -0
  105. package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.h +59 -0
  106. package/android/lc3Lib/third_party/opus_tools/src/src/opusdec.c +884 -0
  107. package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.c +1021 -0
  108. package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.h +101 -0
  109. package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.c +639 -0
  110. package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.h +51 -0
  111. package/android/lc3Lib/third_party/opus_tools/src/src/os_support.h +167 -0
  112. package/android/lc3Lib/third_party/opus_tools/src/src/resample.c +1137 -0
  113. package/android/lc3Lib/third_party/opus_tools/src/src/speex_resampler.h +344 -0
  114. package/android/lc3Lib/third_party/opus_tools/src/src/stack_alloc.h +115 -0
  115. package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.c +125 -0
  116. package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.h +62 -0
  117. package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.c +223 -0
  118. package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.h +60 -0
  119. package/android/settings.gradle +1 -0
  120. package/android/src/main/AndroidManifest.xml +40 -0
  121. package/android/src/main/java/com/mentra/bluetoothsdk/BluetoothSdkModule.kt +528 -0
  122. package/android/src/main/java/com/mentra/bluetoothsdk/Bridge.kt +610 -0
  123. package/android/src/main/java/com/mentra/bluetoothsdk/DeviceManager.kt +1616 -0
  124. package/android/src/main/java/com/mentra/bluetoothsdk/DeviceStore.kt +314 -0
  125. package/android/src/main/java/com/mentra/bluetoothsdk/MentraBluetoothModels.kt +1710 -0
  126. package/android/src/main/java/com/mentra/bluetoothsdk/MentraBluetoothSdk.kt +554 -0
  127. package/android/src/main/java/com/mentra/bluetoothsdk/ObservableStore.kt +68 -0
  128. package/android/src/main/java/com/mentra/bluetoothsdk/controllers/ControllerManager.kt +158 -0
  129. package/android/src/main/java/com/mentra/bluetoothsdk/controllers/R1.kt +934 -0
  130. package/android/src/main/java/com/mentra/bluetoothsdk/services/Foreground.kt +175 -0
  131. package/android/src/main/java/com/mentra/bluetoothsdk/services/PhoneMic.kt +1109 -0
  132. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/G1.java +3974 -0
  133. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/G2.kt +3551 -0
  134. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/Mach1.java +1327 -0
  135. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraLive.java +6959 -0
  136. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraNex.kt +1655 -0
  137. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/MentraosBle.java +53675 -0
  138. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/SGCManager.kt +202 -0
  139. package/android/src/main/java/com/mentra/bluetoothsdk/sgcs/Simulated.kt +224 -0
  140. package/android/src/main/java/com/mentra/bluetoothsdk/stt/STTTools.kt +340 -0
  141. package/android/src/main/java/com/mentra/bluetoothsdk/stt/SherpaOnnxTranscriber.kt +465 -0
  142. package/android/src/main/java/com/mentra/bluetoothsdk/stt/VadGateSpeechPolicy.kt +221 -0
  143. package/android/src/main/java/com/mentra/bluetoothsdk/utils/AES.java +106 -0
  144. package/android/src/main/java/com/mentra/bluetoothsdk/utils/AudioSessionMonitor.kt +189 -0
  145. package/android/src/main/java/com/mentra/bluetoothsdk/utils/BitmapJavaUtils.java +169 -0
  146. package/android/src/main/java/com/mentra/bluetoothsdk/utils/BlePhotoUploadService.java +179 -0
  147. package/android/src/main/java/com/mentra/bluetoothsdk/utils/Constants.kt +44 -0
  148. package/android/src/main/java/com/mentra/bluetoothsdk/utils/G1Text.kt +436 -0
  149. package/android/src/main/java/com/mentra/bluetoothsdk/utils/IncidentLogBleRelayNaming.java +29 -0
  150. package/android/src/main/java/com/mentra/bluetoothsdk/utils/IncidentLogBleUploadService.java +76 -0
  151. package/android/src/main/java/com/mentra/bluetoothsdk/utils/K900ProtocolUtils.java +791 -0
  152. package/android/src/main/java/com/mentra/bluetoothsdk/utils/MessageChunker.java +186 -0
  153. package/android/src/main/java/com/mentra/bluetoothsdk/utils/NexSGCUtils.kt +589 -0
  154. package/android/src/main/java/com/mentra/bluetoothsdk/utils/PhoneAudioMonitor.kt +303 -0
  155. package/android/src/main/java/com/mentra/bluetoothsdk/utils/SmartGlassesConnectionState.java +9 -0
  156. package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/ByteUtilAudioPlayer.java +655 -0
  157. package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/Lc3Player.java +441 -0
  158. package/android/src/main/java/com/mentra/bluetoothsdk/utils/audio/PCMAudioPlayer.java +431 -0
  159. package/android/src/main/res/values/strings.xml +4 -0
  160. package/app.plugin.js +1 -0
  161. package/build/BluetoothSdk.types.d.ts +498 -0
  162. package/build/BluetoothSdk.types.d.ts.map +1 -0
  163. package/build/BluetoothSdk.types.js +23 -0
  164. package/build/BluetoothSdk.types.js.map +1 -0
  165. package/build/BluetoothSdkModule.d.ts +71 -0
  166. package/build/BluetoothSdkModule.d.ts.map +1 -0
  167. package/build/BluetoothSdkModule.js +106 -0
  168. package/build/BluetoothSdkModule.js.map +1 -0
  169. package/build/index.d.ts +3 -0
  170. package/build/index.d.ts.map +1 -0
  171. package/build/index.js +5 -0
  172. package/build/index.js.map +1 -0
  173. package/expo-module.config.json +9 -0
  174. package/ios/BluetoothSdkModule.swift +665 -0
  175. package/ios/MentraBluetoothSDK.podspec +77 -0
  176. package/ios/Packages/CoreObjC/CoreObjC.xcodeproj/project.pbxproj +213 -0
  177. package/ios/Packages/CoreObjC/PcmConverter.h +22 -0
  178. package/ios/Packages/CoreObjC/PcmConverter.m +266 -0
  179. package/ios/Packages/CoreObjC/attdet.c +92 -0
  180. package/ios/Packages/CoreObjC/attdet.h +44 -0
  181. package/ios/Packages/CoreObjC/bits.c +375 -0
  182. package/ios/Packages/CoreObjC/bits.h +315 -0
  183. package/ios/Packages/CoreObjC/bwdet.c +129 -0
  184. package/ios/Packages/CoreObjC/bwdet.h +69 -0
  185. package/ios/Packages/CoreObjC/common.h +151 -0
  186. package/ios/Packages/CoreObjC/energy.c +70 -0
  187. package/ios/Packages/CoreObjC/energy.h +43 -0
  188. package/ios/Packages/CoreObjC/fastmath.h +158 -0
  189. package/ios/Packages/CoreObjC/lc3.c +704 -0
  190. package/ios/Packages/CoreObjC/lc3.h +313 -0
  191. package/ios/Packages/CoreObjC/lc3_cpp.h +283 -0
  192. package/ios/Packages/CoreObjC/lc3_private.h +163 -0
  193. package/ios/Packages/CoreObjC/ltpf.c +905 -0
  194. package/ios/Packages/CoreObjC/ltpf.h +111 -0
  195. package/ios/Packages/CoreObjC/ltpf_arm.h +506 -0
  196. package/ios/Packages/CoreObjC/ltpf_neon.h +281 -0
  197. package/ios/Packages/CoreObjC/makefile.mk +35 -0
  198. package/ios/Packages/CoreObjC/mdct.c +469 -0
  199. package/ios/Packages/CoreObjC/mdct.h +57 -0
  200. package/ios/Packages/CoreObjC/mdct_neon.h +296 -0
  201. package/ios/Packages/CoreObjC/meson.build +61 -0
  202. package/ios/Packages/CoreObjC/plc.c +61 -0
  203. package/ios/Packages/CoreObjC/plc.h +57 -0
  204. package/ios/Packages/CoreObjC/rnnoise.h +114 -0
  205. package/ios/Packages/CoreObjC/sns.c +880 -0
  206. package/ios/Packages/CoreObjC/sns.h +103 -0
  207. package/ios/Packages/CoreObjC/spec.c +907 -0
  208. package/ios/Packages/CoreObjC/spec.h +119 -0
  209. package/ios/Packages/CoreObjC/tables.c +3457 -0
  210. package/ios/Packages/CoreObjC/tables.h +94 -0
  211. package/ios/Packages/CoreObjC/tns.c +457 -0
  212. package/ios/Packages/CoreObjC/tns.h +99 -0
  213. package/ios/Packages/SherpaOnnx/Model/joiner.onnx +0 -0
  214. package/ios/Packages/SherpaOnnx/Model/tokens.txt +502 -0
  215. package/ios/Packages/SherpaOnnx/SherpaOnnx.swift +1659 -0
  216. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/cargs.h +162 -0
  217. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/sherpa-onnx/c-api/c-api.h +1852 -0
  218. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Headers/sherpa-onnx/c-api/cxx-api.h +674 -0
  219. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Info.plist +44 -0
  220. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/libsherpa-onnx.a +0 -0
  221. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/sherpa-onnx.a +0 -0
  222. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/libsherpa-onnx.a +0 -0
  223. package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/sherpa-onnx.a +0 -0
  224. package/ios/Packages/VAD/Common/VAD/VADQuality.swift +41 -0
  225. package/ios/Packages/VAD/Common/VAD/VADState.swift +26 -0
  226. package/ios/Packages/VAD/Common/VAD/VADStrategy.swift +29 -0
  227. package/ios/Packages/VAD/Common/VAD/VADType.swift +14 -0
  228. package/ios/Packages/VAD/Data/Configuration.swift +68 -0
  229. package/ios/Packages/VAD/Data/FrameSize.swift +39 -0
  230. package/ios/Packages/VAD/Data/Record.swift +13 -0
  231. package/ios/Packages/VAD/Data/Result.swift +22 -0
  232. package/ios/Packages/VAD/Data/SampleRate.swift +48 -0
  233. package/ios/Packages/VAD/Silero/Model/silero_vad.onnx +0 -0
  234. package/ios/Packages/VAD/Silero/SileroVAD.swift +284 -0
  235. package/ios/Packages/VAD/Silero/SileroVADStrategy.swift +64 -0
  236. package/ios/Packages/libbz2/module.modulemap +5 -0
  237. package/ios/Packages/libbz2/shim.h +1 -0
  238. package/ios/Source/Bridge.swift +353 -0
  239. package/ios/Source/Bridging-Header.h +16 -0
  240. package/ios/Source/DeviceManager.swift +1478 -0
  241. package/ios/Source/DeviceStore.swift +295 -0
  242. package/ios/Source/MentraBluetoothSDK.swift +2439 -0
  243. package/ios/Source/ObservableStore.swift +88 -0
  244. package/ios/Source/PrivacyInfo.xcprivacy +23 -0
  245. package/ios/Source/controllers/ControllerManager.swift +187 -0
  246. package/ios/Source/controllers/R1.swift +827 -0
  247. package/ios/Source/services/PhoneMic.swift +662 -0
  248. package/ios/Source/sgcs/Frame.swift +651 -0
  249. package/ios/Source/sgcs/G1.swift +2505 -0
  250. package/ios/Source/sgcs/G2.swift +3730 -0
  251. package/ios/Source/sgcs/Mach1.swift +543 -0
  252. package/ios/Source/sgcs/MentraLive.swift +4708 -0
  253. package/ios/Source/sgcs/MentraNex.swift +2479 -0
  254. package/ios/Source/sgcs/SGCManager.swift +243 -0
  255. package/ios/Source/sgcs/Simulated.swift +270 -0
  256. package/ios/Source/sgcs/mentraos_ble.pb.swift +3811 -0
  257. package/ios/Source/stt/STTTools.swift +154 -0
  258. package/ios/Source/stt/SherpaOnnxTranscriber.swift +401 -0
  259. package/ios/Source/utils/AudioSessionMonitor.swift +283 -0
  260. package/ios/Source/utils/Constants.swift +74 -0
  261. package/ios/Source/utils/Enums.swift +95 -0
  262. package/ios/Source/utils/G1Text.swift +2067 -0
  263. package/ios/Source/utils/JSCExperiment.swift +241 -0
  264. package/ios/Source/utils/MemoryMonitor.swift +44 -0
  265. package/ios/Source/utils/MessageChunker.swift +164 -0
  266. package/ios/Source/utils/Models.swift +135 -0
  267. package/ios/Source/utils/PhoneAudioMonitor.swift +226 -0
  268. package/ios/Source/utils/TarBz2Extractor.swift +206 -0
  269. package/package.json +78 -0
  270. package/plugin/build/index.d.ts +6 -0
  271. package/plugin/build/index.js +12 -0
  272. package/plugin/build/withAndroid.d.ts +4 -0
  273. package/plugin/build/withAndroid.js +80 -0
  274. package/plugin/build/withIos.d.ts +4 -0
  275. package/plugin/build/withIos.js +64 -0
  276. package/src/BluetoothSdk.types.ts +581 -0
  277. package/src/BluetoothSdkModule.ts +259 -0
  278. package/src/index.ts +4 -0
@@ -0,0 +1,353 @@
1
+ //
2
+ // Bridge.swift
3
+ // AOS
4
+ //
5
+ // Created by Matthew Fosse on 3/4/25.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ /// Bridge for Bluetooth SDK communication between Expo modules and native iOS code
11
+ /// Has commands for the Bluetooth SDK to use to send messages to JavaScript
12
+ class Bridge {
13
+ private static let eventSinkLock = NSLock()
14
+ private static let defaultEventSinkId = "default"
15
+ private static var eventSinks: [String: (String, [String: Any]) -> Void] = [:]
16
+
17
+ static func initialize(callback: @escaping (String, [String: Any]) -> Void) {
18
+ setEventSink(defaultEventSinkId, callback)
19
+ }
20
+
21
+ static func addEventSink(callback: @escaping (String, [String: Any]) -> Void) -> String {
22
+ let id = UUID().uuidString
23
+ setEventSink(id, callback)
24
+ return id
25
+ }
26
+
27
+ static func removeEventSink(_ id: String) {
28
+ eventSinkLock.lock()
29
+ eventSinks.removeValue(forKey: id)
30
+ eventSinkLock.unlock()
31
+ }
32
+
33
+ private static func setEventSink(_ id: String, _ callback: @escaping (String, [String: Any]) -> Void) {
34
+ eventSinkLock.lock()
35
+ eventSinks[id] = callback
36
+ eventSinkLock.unlock()
37
+ }
38
+
39
+ private static func currentEventSinks() -> [(String, [String: Any]) -> Void] {
40
+ eventSinkLock.lock()
41
+ let sinks = Array(eventSinks.values)
42
+ eventSinkLock.unlock()
43
+ return sinks
44
+ }
45
+
46
+ /// Thread-safe event dispatch - ensures callback is invoked on main thread
47
+ /// to avoid React Native bridge threading issues that can cause EXC_BREAKPOINT
48
+ private static func dispatchEvent(_ eventName: String, _ data: [String: Any]) {
49
+ let sinks = currentEventSinks()
50
+ guard !sinks.isEmpty else { return }
51
+ if Thread.isMainThread {
52
+ sinks.forEach { $0(eventName, data) }
53
+ } else {
54
+ DispatchQueue.main.async {
55
+ sinks.forEach { $0(eventName, data) }
56
+ }
57
+ }
58
+ }
59
+
60
+ static func log(_ message: String) {
61
+ let data = ["message": message]
62
+ Bridge.sendTypedMessage("log", body: data)
63
+ }
64
+
65
+ static func sendHeadUp(_ isUp: Bool) {
66
+ let data = ["up": isUp]
67
+ Bridge.sendTypedMessage("head_up", body: data)
68
+ }
69
+
70
+ static func sendPairFailureEvent(_ error: String) {
71
+ let data = ["error": error]
72
+ Bridge.sendTypedMessage("pair_failure", body: data)
73
+ }
74
+
75
+ static func sendMicPcm(_ data: Data) {
76
+ // let base64String = data.base64EncodedString()
77
+ // let body = ["base64": base64String]
78
+ let body = ["pcm": data]
79
+ Bridge.sendTypedMessage("mic_pcm", body: body)
80
+ }
81
+
82
+ static func sendMicLc3(_ data: Data) {
83
+ // let base64String = data.base64EncodedString()
84
+ // let body = ["base64": base64String]
85
+ let body = ["lc3": data]
86
+ Bridge.sendTypedMessage("mic_lc3", body: body)
87
+ }
88
+
89
+ static func saveSetting(_ key: String, _ value: Any) {
90
+ let body = ["key": key, "value": value]
91
+ Bridge.sendTypedMessage("save_setting", body: body)
92
+ }
93
+
94
+ static func sendVadEvent(_ isSpeaking: Bool) {
95
+ let body: [String: Any] = ["status": isSpeaking]
96
+ Bridge.sendTypedMessage("vad_status", body: body)
97
+ }
98
+
99
+ static func sendBatteryStatus(level: Int, charging: Bool) {
100
+ let body: [String: Any] = [
101
+ "level": level,
102
+ "charging": charging,
103
+ "timestamp": Date().timeIntervalSince1970 * 1000,
104
+ ]
105
+ Bridge.sendTypedMessage("battery_status", body: body)
106
+ }
107
+
108
+ static func sendDiscoveredDevice(
109
+ _ deviceModel: String,
110
+ _ deviceName: String,
111
+ deviceAddress: String = "",
112
+ rssi: Int? = nil
113
+ ) {
114
+ Task {
115
+ await MainActor.run {
116
+ let searchResults = DeviceStore.shared.get("bluetooth", "searchResults") as? [[String: Any]] ?? []
117
+ let id = "\(deviceModel):\(deviceName)"
118
+ var newResult: [String: Any] = [
119
+ "id": id,
120
+ "model": deviceModel,
121
+ "name": deviceName,
122
+ ]
123
+ if !deviceAddress.isEmpty {
124
+ newResult["address"] = deviceAddress
125
+ }
126
+ if let rssi {
127
+ newResult["rssi"] = rssi
128
+ }
129
+ let allResults = searchResults + [newResult]
130
+ var seen = Set<String>()
131
+ let uniqueResults = allResults.reversed().filter {
132
+ let model = $0["model"] as? String ?? $0["deviceModel"] as? String ?? deviceModel
133
+ guard let name = $0["name"] as? String ?? $0["deviceName"] as? String else { return false }
134
+ return seen.insert("\(model):\(name)").inserted
135
+ }.reversed()
136
+ DeviceStore.shared.set("bluetooth", "searchResults", Array(uniqueResults))
137
+ }
138
+ }
139
+ }
140
+
141
+ // MARK: - Hardware Events
142
+
143
+ static func sendButtonPress(buttonId: String, pressType: String) {
144
+ // Send as typed message so it gets handled locally by MantleBridge.tsx
145
+ // This allows the React Native layer to process it before forwarding to server
146
+ let body: [String: Any] = [
147
+ "buttonId": buttonId,
148
+ "pressType": pressType,
149
+ "timestamp": Int(Date().timeIntervalSince1970 * 1000),
150
+ ]
151
+ Bridge.sendTypedMessage("button_press", body: body)
152
+ }
153
+
154
+ static func sendTouchEvent(deviceModel: String, gestureName: String, timestamp: Int64, source: Int32? = nil) {
155
+ var body: [String: Any] = [
156
+ "device_model": deviceModel,
157
+ "gesture_name": gestureName,
158
+ "timestamp": timestamp,
159
+ ]
160
+ if let source {
161
+ body["source"] = source
162
+ }
163
+ Bridge.sendTypedMessage("touch_event", body: body)
164
+ }
165
+
166
+ static func sendSwipeVolumeStatus(enabled: Bool, timestamp: Int64) {
167
+ let body: [String: Any] = [
168
+ "enabled": enabled,
169
+ "timestamp": timestamp,
170
+ ]
171
+ Bridge.sendTypedMessage("swipe_volume_status", body: body)
172
+ }
173
+
174
+ static func sendSwitchStatus(switchType: Int, value: Int, timestamp: Int64) {
175
+ let body: [String: Any] = [
176
+ "switch_type": switchType,
177
+ "switch_value": value,
178
+ "timestamp": timestamp,
179
+ ]
180
+ Bridge.sendTypedMessage("switch_status", body: body)
181
+ }
182
+
183
+ static func sendRgbLedControlResponse(requestId: String, success: Bool, error: String?) {
184
+ guard !requestId.isEmpty else { return }
185
+ var body: [String: Any] = [
186
+ "requestId": requestId,
187
+ "state": success ? "success" : "error",
188
+ ]
189
+ if !success {
190
+ body["errorCode"] = error ?? "unknown_error"
191
+ }
192
+ Bridge.sendTypedMessage("rgb_led_control_response", body: body)
193
+ }
194
+
195
+ static func sendPhotoError(requestId: String, errorCode: String, errorMessage: String) {
196
+ var event: [String: Any] = [
197
+ "type": "photo_response",
198
+ "state": "error",
199
+ "requestId": requestId,
200
+ "timestamp": Int(Date().timeIntervalSince1970 * 1000),
201
+ ]
202
+ if !errorCode.isEmpty {
203
+ event["errorCode"] = errorCode
204
+ }
205
+ if !errorMessage.isEmpty {
206
+ event["errorMessage"] = errorMessage
207
+ }
208
+ Bridge.sendTypedMessage("photo_response", body: event)
209
+ }
210
+
211
+ static func sendMiniappSelected(packageName: String) {
212
+ let event: [String: Any] = [
213
+ "packageName": packageName,
214
+ ]
215
+ Bridge.sendTypedMessage("miniapp_selected", body: event)
216
+ }
217
+
218
+ /**
219
+ * Send transcription result to server
220
+ * Used by AOSManager to send pre-formatted transcription results
221
+ * Matches the Java ServerComms structure exactly
222
+ */
223
+ static func sendLocalTranscription(transcription: [String: Any]) {
224
+ guard let text = transcription["text"] as? String, !text.isEmpty else {
225
+ Bridge.log("Skipping empty transcription result")
226
+ return
227
+ }
228
+
229
+ Bridge.sendTypedMessage("local_transcription", body: transcription)
230
+ }
231
+
232
+ // Bluetooth SDK bridge funcs:
233
+
234
+ static func sendserialNumber(_ serialNumber: String, style: String, color: String) {
235
+ let body = [
236
+ "glasses_serial_number": [
237
+ "serial_number": serialNumber,
238
+ "style": style,
239
+ "color": color,
240
+ ],
241
+ ]
242
+ Bridge.sendTypedMessage("glasses_serial_number", body: body)
243
+ }
244
+
245
+ static func sendWifiStatusChange(connected: Bool, ssid: String?, localIp: String?) {
246
+ guard let status = WifiStatus.fromStoreFields(
247
+ connected: connected,
248
+ ssid: ssid,
249
+ localIp: localIp
250
+ ) else {
251
+ return
252
+ }
253
+ Bridge.sendTypedMessage("wifi_status_change", body: status.values)
254
+ }
255
+
256
+ static func updateWifiScanResults(_ networks: [[String: Any]]) {
257
+ Task {
258
+ await MainActor.run {
259
+ var storedNetworks: [[String: Any]] =
260
+ DeviceStore.shared.get("bluetooth", "wifiScanResults") as? [[String: Any]] ?? []
261
+ // add the networks to the storedNetworks array, removing duplicates by ssid
262
+ for network in networks {
263
+ if !storedNetworks.contains(where: {
264
+ $0["ssid"] as? String == network["ssid"] as? String
265
+ }) {
266
+ storedNetworks.append(network)
267
+ }
268
+ }
269
+ DeviceStore.shared.apply("bluetooth", "wifiScanResults", storedNetworks)
270
+ }
271
+ }
272
+ }
273
+
274
+ static func sendMtkUpdateComplete(message: String, timestamp: Int64) {
275
+ let eventBody: [String: Any] = [
276
+ "message": message,
277
+ "timestamp": timestamp,
278
+ ]
279
+ Bridge.sendTypedMessage("mtk_update_complete", body: eventBody)
280
+ }
281
+
282
+ /// Send ota_start_ack — glasses confirmed receipt of ota_start command
283
+ static func sendOtaStartAck() {
284
+ let eventBody: [String: Any] = [
285
+ "timestamp": Int64(Date().timeIntervalSince1970 * 1000),
286
+ ]
287
+ Bridge.sendTypedMessage("ota_start_ack", body: eventBody)
288
+ }
289
+
290
+ /// Send OTA update available notification - glasses have detected an available update (background mode)
291
+ static func sendOtaUpdateAvailable(
292
+ versionCode: Int64,
293
+ versionName: String,
294
+ updates: [String],
295
+ totalSize: Int64
296
+ ) {
297
+ let eventBody: [String: Any] = [
298
+ "version_code": versionCode,
299
+ "version_name": versionName,
300
+ "updates": updates,
301
+ "total_size": totalSize,
302
+ ]
303
+ Bridge.sendTypedMessage("ota_update_available", body: eventBody)
304
+ }
305
+
306
+ static func sendOtaStatus(
307
+ sessionId: String,
308
+ totalSteps: Int,
309
+ currentStep: Int,
310
+ stepType: String,
311
+ phase: String,
312
+ stepPercent: Int,
313
+ overallPercent: Int,
314
+ status: String,
315
+ errorMessage: String?
316
+ ) {
317
+ var eventBody: [String: Any] = [
318
+ "session_id": sessionId,
319
+ "total_steps": totalSteps,
320
+ "current_step": currentStep,
321
+ "step_type": stepType,
322
+ "phase": phase,
323
+ "step_percent": stepPercent,
324
+ "overall_percent": overallPercent,
325
+ "status": status,
326
+ ]
327
+ if let error = errorMessage {
328
+ eventBody["error_message"] = error
329
+ }
330
+ Bridge.sendTypedMessage("ota_status", body: eventBody)
331
+ }
332
+
333
+ /// Arbitrary WS Comms (dont use these, make a dedicated function for your use case):
334
+ static func sendWSText(_ msg: String) {
335
+ let data = ["text": msg]
336
+ Bridge.sendTypedMessage("ws_text", body: data)
337
+ }
338
+
339
+ static func sendWSBinary(_ data: Data) {
340
+ let base64String = data.base64EncodedString()
341
+ let body = ["base64": base64String]
342
+ Bridge.sendTypedMessage("ws_bin", body: body)
343
+ }
344
+
345
+ /// don't call this function directly, instead
346
+ /// make a function above that calls this function:
347
+ static func sendTypedMessage(_ type: String, body: [String: Any]) {
348
+ var body = body
349
+ body["type"] = type
350
+ // Send directly using type as event name - no JSON serialization
351
+ dispatchEvent(type, body)
352
+ }
353
+ }
@@ -0,0 +1,16 @@
1
+ //
2
+ // Use this file to import your target's public headers that you would like to expose to Swift.
3
+ //
4
+
5
+ #import "../Packages/CoreObjC/PcmConverter.h"
6
+
7
+ // environment variables:
8
+ #import "RNCConfig.h"
9
+
10
+ // onnx runtime:
11
+ #import <onnxruntime.h>
12
+
13
+ // sherpa-onnx C API - direct file path
14
+ #import "sherpa-onnx/c-api/c-api.h"
15
+
16
+ #import <bzlib.h>