react-native-ble-mesh 1.0.1

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 (465) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/LICENSE +21 -0
  3. package/README.md +706 -0
  4. package/docs/API.md +462 -0
  5. package/docs/ARCHITECTURE.md +384 -0
  6. package/docs/CONTRIBUTING.md +244 -0
  7. package/docs/NODE_QUICKSTART.md +259 -0
  8. package/docs/PROTOCOL.md +195 -0
  9. package/docs/REACT_NATIVE.md +315 -0
  10. package/docs/SECURITY.md +152 -0
  11. package/docs/api/constants_audio.js.html +184 -0
  12. package/docs/api/constants_ble.js.html +165 -0
  13. package/docs/api/constants_crypto.js.html +107 -0
  14. package/docs/api/constants_errors.js.html +256 -0
  15. package/docs/api/constants_events.js.html +148 -0
  16. package/docs/api/constants_index.js.html +76 -0
  17. package/docs/api/constants_protocol.js.html +205 -0
  18. package/docs/api/crypto_aead.js.html +243 -0
  19. package/docs/api/crypto_chacha20.js.html +235 -0
  20. package/docs/api/crypto_hkdf.js.html +241 -0
  21. package/docs/api/crypto_hmac.js.html +197 -0
  22. package/docs/api/crypto_index.js.html +126 -0
  23. package/docs/api/crypto_keys_KeyManager.js.html +325 -0
  24. package/docs/api/crypto_keys_KeyPair.js.html +270 -0
  25. package/docs/api/crypto_keys_SecureStorage.js.html +273 -0
  26. package/docs/api/crypto_keys_index.js.html +86 -0
  27. package/docs/api/crypto_noise_handshake.js.html +464 -0
  28. package/docs/api/crypto_noise_index.js.html +81 -0
  29. package/docs/api/crypto_noise_session.js.html +307 -0
  30. package/docs/api/crypto_noise_state.js.html +322 -0
  31. package/docs/api/crypto_poly1305.js.html +167 -0
  32. package/docs/api/crypto_sha256.js.html +294 -0
  33. package/docs/api/crypto_x25519.js.html +208 -0
  34. package/docs/api/errors_AudioError.js.html +218 -0
  35. package/docs/api/errors_ConnectionError.js.html +163 -0
  36. package/docs/api/errors_CryptoError.js.html +157 -0
  37. package/docs/api/errors_HandshakeError.js.html +176 -0
  38. package/docs/api/errors_MeshError.js.html +154 -0
  39. package/docs/api/errors_MessageError.js.html +183 -0
  40. package/docs/api/errors_ValidationError.js.html +204 -0
  41. package/docs/api/errors_index.js.html +78 -0
  42. package/docs/api/fonts/OpenSans-Bold-webfont.eot +0 -0
  43. package/docs/api/fonts/OpenSans-Bold-webfont.svg +1830 -0
  44. package/docs/api/fonts/OpenSans-Bold-webfont.woff +0 -0
  45. package/docs/api/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  46. package/docs/api/fonts/OpenSans-BoldItalic-webfont.svg +1830 -0
  47. package/docs/api/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  48. package/docs/api/fonts/OpenSans-Italic-webfont.eot +0 -0
  49. package/docs/api/fonts/OpenSans-Italic-webfont.svg +1830 -0
  50. package/docs/api/fonts/OpenSans-Italic-webfont.woff +0 -0
  51. package/docs/api/fonts/OpenSans-Light-webfont.eot +0 -0
  52. package/docs/api/fonts/OpenSans-Light-webfont.svg +1831 -0
  53. package/docs/api/fonts/OpenSans-Light-webfont.woff +0 -0
  54. package/docs/api/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  55. package/docs/api/fonts/OpenSans-LightItalic-webfont.svg +1835 -0
  56. package/docs/api/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  57. package/docs/api/fonts/OpenSans-Regular-webfont.eot +0 -0
  58. package/docs/api/fonts/OpenSans-Regular-webfont.svg +1831 -0
  59. package/docs/api/fonts/OpenSans-Regular-webfont.woff +0 -0
  60. package/docs/api/hooks_AppStateManager.js.html +233 -0
  61. package/docs/api/hooks_index.js.html +87 -0
  62. package/docs/api/hooks_useMesh.js.html +213 -0
  63. package/docs/api/hooks_useMessages.js.html +263 -0
  64. package/docs/api/hooks_usePeers.js.html +165 -0
  65. package/docs/api/index.html +868 -0
  66. package/docs/api/index.js.html +236 -0
  67. package/docs/api/mesh_dedup_BloomFilter.js.html +261 -0
  68. package/docs/api/mesh_dedup_DedupManager.js.html +266 -0
  69. package/docs/api/mesh_dedup_MessageCache.js.html +273 -0
  70. package/docs/api/mesh_dedup_index.js.html +70 -0
  71. package/docs/api/mesh_fragment_Assembler.js.html +335 -0
  72. package/docs/api/mesh_fragment_Fragmenter.js.html +230 -0
  73. package/docs/api/mesh_fragment_index.js.html +75 -0
  74. package/docs/api/mesh_index.js.html +72 -0
  75. package/docs/api/mesh_peer_Peer.js.html +296 -0
  76. package/docs/api/mesh_peer_PeerDiscovery.js.html +334 -0
  77. package/docs/api/mesh_peer_PeerManager.js.html +320 -0
  78. package/docs/api/mesh_peer_index.js.html +70 -0
  79. package/docs/api/mesh_router_MessageRouter.js.html +411 -0
  80. package/docs/api/mesh_router_PathFinder.js.html +386 -0
  81. package/docs/api/mesh_router_RouteTable.js.html +346 -0
  82. package/docs/api/mesh_router_index.js.html +70 -0
  83. package/docs/api/module-audio_buffer.html +168 -0
  84. package/docs/api/module-audio_buffer_FrameBuffer-FrameBuffer.html +2971 -0
  85. package/docs/api/module-audio_buffer_FrameBuffer.html +178 -0
  86. package/docs/api/module-audio_buffer_JitterBuffer-JitterBuffer.html +2761 -0
  87. package/docs/api/module-audio_buffer_JitterBuffer.html +178 -0
  88. package/docs/api/module-audio_codec.html +168 -0
  89. package/docs/api/module-audio_codec_LC3Codec-LC3Codec.html +2876 -0
  90. package/docs/api/module-audio_codec_LC3Codec.html +178 -0
  91. package/docs/api/module-audio_codec_LC3Decoder-LC3Decoder.html +1788 -0
  92. package/docs/api/module-audio_codec_LC3Decoder.html +178 -0
  93. package/docs/api/module-audio_codec_LC3Encoder-LC3Encoder.html +1512 -0
  94. package/docs/api/module-audio_codec_LC3Encoder.html +178 -0
  95. package/docs/api/module-audio_session.html +168 -0
  96. package/docs/api/module-audio_session_AudioSession-AudioSession.html +3922 -0
  97. package/docs/api/module-audio_session_AudioSession.html +178 -0
  98. package/docs/api/module-audio_session_VoiceMessage-VoiceMessage.html +3690 -0
  99. package/docs/api/module-audio_session_VoiceMessage-VoiceMessageRecorder.html +1780 -0
  100. package/docs/api/module-audio_session_VoiceMessage.html +332 -0
  101. package/docs/api/module-audio_transport.html +168 -0
  102. package/docs/api/module-audio_transport_AudioFragmenter-AudioAssembler.html +1545 -0
  103. package/docs/api/module-audio_transport_AudioFragmenter-AudioFragmenter.html +658 -0
  104. package/docs/api/module-audio_transport_AudioFragmenter.html +181 -0
  105. package/docs/api/module-audio_transport_AudioFramer.html +1414 -0
  106. package/docs/api/module-constants.html +168 -0
  107. package/docs/api/module-constants_audio.html +1782 -0
  108. package/docs/api/module-constants_ble.html +940 -0
  109. package/docs/api/module-constants_crypto.html +823 -0
  110. package/docs/api/module-constants_errors.html +316 -0
  111. package/docs/api/module-constants_events.html +244 -0
  112. package/docs/api/module-constants_protocol.html +1534 -0
  113. package/docs/api/module-crypto.html +169 -0
  114. package/docs/api/module-crypto_aead.html +1625 -0
  115. package/docs/api/module-crypto_chacha20.html +1440 -0
  116. package/docs/api/module-crypto_hkdf.html +1421 -0
  117. package/docs/api/module-crypto_hmac.html +828 -0
  118. package/docs/api/module-crypto_keys.html +169 -0
  119. package/docs/api/module-crypto_keys_KeyManager-KeyManager.html +2364 -0
  120. package/docs/api/module-crypto_keys_KeyManager.html +252 -0
  121. package/docs/api/module-crypto_keys_KeyPair.html +245 -0
  122. package/docs/api/module-crypto_keys_SecureStorage-MemorySecureStorage.html +923 -0
  123. package/docs/api/module-crypto_keys_SecureStorage-SecureStorage.html +942 -0
  124. package/docs/api/module-crypto_keys_SecureStorage.html +516 -0
  125. package/docs/api/module-crypto_noise.html +169 -0
  126. package/docs/api/module-crypto_noise_handshake-NoiseHandshake.html +2240 -0
  127. package/docs/api/module-crypto_noise_handshake.html +782 -0
  128. package/docs/api/module-crypto_noise_session-NoiseSession.html +1804 -0
  129. package/docs/api/module-crypto_noise_session.html +325 -0
  130. package/docs/api/module-crypto_noise_state-SymmetricState.html +1387 -0
  131. package/docs/api/module-crypto_noise_state.html +324 -0
  132. package/docs/api/module-crypto_poly1305.html +884 -0
  133. package/docs/api/module-crypto_sha256-HashContext.html +447 -0
  134. package/docs/api/module-crypto_sha256.html +942 -0
  135. package/docs/api/module-crypto_x25519.html +1503 -0
  136. package/docs/api/module-errors.html +168 -0
  137. package/docs/api/module-errors_AudioError-AudioError.html +4711 -0
  138. package/docs/api/module-errors_AudioError.html +178 -0
  139. package/docs/api/module-errors_ConnectionError-ConnectionError.html +3649 -0
  140. package/docs/api/module-errors_ConnectionError.html +178 -0
  141. package/docs/api/module-errors_CryptoError-CryptoError.html +3453 -0
  142. package/docs/api/module-errors_CryptoError.html +178 -0
  143. package/docs/api/module-errors_HandshakeError-HandshakeError.html +4261 -0
  144. package/docs/api/module-errors_HandshakeError.html +178 -0
  145. package/docs/api/module-errors_MeshError-MeshError.html +2155 -0
  146. package/docs/api/module-errors_MeshError.html +178 -0
  147. package/docs/api/module-errors_MessageError-MessageError.html +4545 -0
  148. package/docs/api/module-errors_MessageError.html +178 -0
  149. package/docs/api/module-errors_ValidationError-ValidationError.html +3432 -0
  150. package/docs/api/module-errors_ValidationError.html +178 -0
  151. package/docs/api/module-hooks.html +182 -0
  152. package/docs/api/module-hooks_AppStateManager-AppStateManager.html +1620 -0
  153. package/docs/api/module-hooks_AppStateManager.html +178 -0
  154. package/docs/api/module-hooks_useMesh.html +457 -0
  155. package/docs/api/module-hooks_useMessages.html +466 -0
  156. package/docs/api/module-hooks_usePeers.html +348 -0
  157. package/docs/api/module-mesh.html +168 -0
  158. package/docs/api/module-mesh_dedup.html +168 -0
  159. package/docs/api/module-mesh_dedup_BloomFilter-BloomFilter.html +2158 -0
  160. package/docs/api/module-mesh_dedup_BloomFilter.html +178 -0
  161. package/docs/api/module-mesh_dedup_DedupManager-DedupManager.html +2880 -0
  162. package/docs/api/module-mesh_dedup_DedupManager.html +178 -0
  163. package/docs/api/module-mesh_dedup_MessageCache-CacheNode.html +246 -0
  164. package/docs/api/module-mesh_dedup_MessageCache-MessageCache.html +2314 -0
  165. package/docs/api/module-mesh_dedup_MessageCache.html +181 -0
  166. package/docs/api/module-mesh_fragment.html +168 -0
  167. package/docs/api/module-mesh_fragment_Assembler-Assembler.html +2869 -0
  168. package/docs/api/module-mesh_fragment_Assembler-PendingFragmentSet.html +895 -0
  169. package/docs/api/module-mesh_fragment_Assembler.html +181 -0
  170. package/docs/api/module-mesh_fragment_Fragmenter.html +1084 -0
  171. package/docs/api/module-mesh_peer.html +168 -0
  172. package/docs/api/module-mesh_peer_Peer-Peer.html +4986 -0
  173. package/docs/api/module-mesh_peer_Peer.html +178 -0
  174. package/docs/api/module-mesh_peer_PeerDiscovery-PeerDiscovery.html +3423 -0
  175. package/docs/api/module-mesh_peer_PeerDiscovery.html +438 -0
  176. package/docs/api/module-mesh_peer_PeerManager-PeerManager.html +5258 -0
  177. package/docs/api/module-mesh_peer_PeerManager.html +178 -0
  178. package/docs/api/module-mesh_router.html +168 -0
  179. package/docs/api/module-mesh_router_MessageRouter-MessageRouter.html +3285 -0
  180. package/docs/api/module-mesh_router_MessageRouter.html +178 -0
  181. package/docs/api/module-mesh_router_PathFinder-PathFinder.html +3323 -0
  182. package/docs/api/module-mesh_router_PathFinder.html +421 -0
  183. package/docs/api/module-mesh_router_RouteTable-RouteTable.html +4115 -0
  184. package/docs/api/module-mesh_router_RouteTable.html +421 -0
  185. package/docs/api/module-protocol.html +169 -0
  186. package/docs/api/module-protocol_crc32.html +815 -0
  187. package/docs/api/module-protocol_deserializer.html +1393 -0
  188. package/docs/api/module-protocol_header-MessageHeader.html +2879 -0
  189. package/docs/api/module-protocol_header.html +892 -0
  190. package/docs/api/module-protocol_message-Message.html +4682 -0
  191. package/docs/api/module-protocol_message.html +178 -0
  192. package/docs/api/module-protocol_serializer.html +911 -0
  193. package/docs/api/module-protocol_validator.html +1396 -0
  194. package/docs/api/module-rn-ble-mesh.html +866 -0
  195. package/docs/api/module-service.html +168 -0
  196. package/docs/api/module-service_HandshakeManager-HandshakeManager.html +185 -0
  197. package/docs/api/module-service_HandshakeManager.html +175 -0
  198. package/docs/api/module-service_MeshService-MeshService.html +185 -0
  199. package/docs/api/module-service_MeshService.html +175 -0
  200. package/docs/api/module-service_SessionManager-SessionManager.html +174 -0
  201. package/docs/api/module-service_SessionManager.html +175 -0
  202. package/docs/api/module-service_audio.html +168 -0
  203. package/docs/api/module-service_audio_AudioManager-AudioManager.html +4653 -0
  204. package/docs/api/module-service_audio_AudioManager.html +254 -0
  205. package/docs/api/module-service_text.html +168 -0
  206. package/docs/api/module-service_text_TextManager-TextManager.html +6104 -0
  207. package/docs/api/module-service_text_TextManager.html +254 -0
  208. package/docs/api/module-service_text_broadcast.html +168 -0
  209. package/docs/api/module-service_text_broadcast_BroadcastManager-BroadcastManager.html +2434 -0
  210. package/docs/api/module-service_text_broadcast_BroadcastManager.html +254 -0
  211. package/docs/api/module-service_text_channel.html +168 -0
  212. package/docs/api/module-service_text_channel_Channel-Channel.html +4337 -0
  213. package/docs/api/module-service_text_channel_Channel.html +178 -0
  214. package/docs/api/module-service_text_channel_ChannelManager-ChannelManager.html +1927 -0
  215. package/docs/api/module-service_text_channel_ChannelManager.html +175 -0
  216. package/docs/api/module-service_text_message.html +168 -0
  217. package/docs/api/module-service_text_message_TextMessage-TextMessage.html +4162 -0
  218. package/docs/api/module-service_text_message_TextMessage.html +178 -0
  219. package/docs/api/module-service_text_message_TextSerializer.html +1725 -0
  220. package/docs/api/module-storage.html +168 -0
  221. package/docs/api/module-storage_AsyncStorageAdapter-AsyncStorageAdapter.html +4159 -0
  222. package/docs/api/module-storage_AsyncStorageAdapter.html +178 -0
  223. package/docs/api/module-storage_MemoryStorage-MemoryStorage.html +3154 -0
  224. package/docs/api/module-storage_MemoryStorage.html +178 -0
  225. package/docs/api/module-storage_MessageStore-MessageStore.html +5299 -0
  226. package/docs/api/module-storage_MessageStore.html +178 -0
  227. package/docs/api/module-storage_Storage-Storage.html +4169 -0
  228. package/docs/api/module-storage_Storage.html +178 -0
  229. package/docs/api/module-transport.html +168 -0
  230. package/docs/api/module-transport_BLEAdapter-BLEAdapter.html +4724 -0
  231. package/docs/api/module-transport_BLEAdapter.html +178 -0
  232. package/docs/api/module-transport_BLETransport-BLETransport.html +3263 -0
  233. package/docs/api/module-transport_BLETransport.html +178 -0
  234. package/docs/api/module-transport_MockTransport-MockTransport.html +3947 -0
  235. package/docs/api/module-transport_MockTransport.html +178 -0
  236. package/docs/api/module-transport_NodeBLEAdapter-NodeBLEAdapter.html +3216 -0
  237. package/docs/api/module-transport_NodeBLEAdapter.html +178 -0
  238. package/docs/api/module-transport_RNBLEAdapter-RNBLEAdapter.html +3216 -0
  239. package/docs/api/module-transport_RNBLEAdapter.html +178 -0
  240. package/docs/api/module-transport_Transport-Transport.html +4071 -0
  241. package/docs/api/module-transport_Transport.html +254 -0
  242. package/docs/api/module-transport_adapters.html +168 -0
  243. package/docs/api/module-transport_adapters_BLEAdapter-BLEAdapter.html +4724 -0
  244. package/docs/api/module-transport_adapters_BLEAdapter.html +178 -0
  245. package/docs/api/module-transport_adapters_NodeBLEAdapter-NodeBLEAdapter.html +3216 -0
  246. package/docs/api/module-transport_adapters_NodeBLEAdapter.html +178 -0
  247. package/docs/api/module-transport_adapters_RNBLEAdapter-RNBLEAdapter.html +3216 -0
  248. package/docs/api/module-transport_adapters_RNBLEAdapter.html +178 -0
  249. package/docs/api/module-utils.html +168 -0
  250. package/docs/api/module-utils_BoundedMap-BoundedMap.html +3301 -0
  251. package/docs/api/module-utils_BoundedMap.html +178 -0
  252. package/docs/api/module-utils_EventEmitter-EventEmitter.html +3358 -0
  253. package/docs/api/module-utils_EventEmitter.html +178 -0
  254. package/docs/api/module-utils_LRUCache-LRUCache.html +4134 -0
  255. package/docs/api/module-utils_LRUCache.html +178 -0
  256. package/docs/api/module-utils_RateLimiter-RateLimiter.html +2176 -0
  257. package/docs/api/module-utils_RateLimiter.html +500 -0
  258. package/docs/api/module-utils_TimeoutManager-TimeoutManager.html +1781 -0
  259. package/docs/api/module-utils_TimeoutManager.html +175 -0
  260. package/docs/api/module-utils_bytes.html +1789 -0
  261. package/docs/api/module-utils_debug.html +837 -0
  262. package/docs/api/module-utils_encoding.html +1184 -0
  263. package/docs/api/module-utils_retry.html +1457 -0
  264. package/docs/api/module-utils_time.html +1665 -0
  265. package/docs/api/module-utils_uuid.html +1269 -0
  266. package/docs/api/module-utils_validation.html +2176 -0
  267. package/docs/api/protocol_crc32.js.html +147 -0
  268. package/docs/api/protocol_deserializer.js.html +295 -0
  269. package/docs/api/protocol_header.js.html +276 -0
  270. package/docs/api/protocol_index.js.html +120 -0
  271. package/docs/api/protocol_message.js.html +287 -0
  272. package/docs/api/protocol_serializer.js.html +240 -0
  273. package/docs/api/protocol_validator.js.html +330 -0
  274. package/docs/api/scripts/linenumber.js +25 -0
  275. package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -0
  276. package/docs/api/scripts/prettify/lang-css.js +2 -0
  277. package/docs/api/scripts/prettify/prettify.js +28 -0
  278. package/docs/api/service_HandshakeManager.js.html +232 -0
  279. package/docs/api/service_MeshService.js.html +371 -0
  280. package/docs/api/service_SessionManager.js.html +153 -0
  281. package/docs/api/service_audio_AudioManager.js.html +541 -0
  282. package/docs/api/service_audio_buffer_FrameBuffer.js.html +223 -0
  283. package/docs/api/service_audio_buffer_JitterBuffer.js.html +244 -0
  284. package/docs/api/service_audio_buffer_index.js.html +68 -0
  285. package/docs/api/service_audio_codec_LC3Codec.js.html +345 -0
  286. package/docs/api/service_audio_codec_LC3Decoder.js.html +185 -0
  287. package/docs/api/service_audio_codec_LC3Encoder.js.html +194 -0
  288. package/docs/api/service_audio_codec_index.js.html +70 -0
  289. package/docs/api/service_audio_index.js.html +96 -0
  290. package/docs/api/service_audio_session_AudioSession.js.html +348 -0
  291. package/docs/api/service_audio_session_VoiceMessage.js.html +432 -0
  292. package/docs/api/service_audio_session_index.js.html +70 -0
  293. package/docs/api/service_audio_transport_AudioFragmenter.js.html +314 -0
  294. package/docs/api/service_audio_transport_AudioFramer.js.html +236 -0
  295. package/docs/api/service_audio_transport_index.js.html +69 -0
  296. package/docs/api/service_index.js.html +93 -0
  297. package/docs/api/service_text_TextManager.js.html +578 -0
  298. package/docs/api/service_text_broadcast_BroadcastManager.js.html +276 -0
  299. package/docs/api/service_text_broadcast_index.js.html +66 -0
  300. package/docs/api/service_text_channel_Channel.js.html +280 -0
  301. package/docs/api/service_text_channel_ChannelManager.js.html +225 -0
  302. package/docs/api/service_text_channel_index.js.html +68 -0
  303. package/docs/api/service_text_index.js.html +85 -0
  304. package/docs/api/service_text_message_TextMessage.js.html +350 -0
  305. package/docs/api/service_text_message_TextSerializer.js.html +218 -0
  306. package/docs/api/service_text_message_index.js.html +68 -0
  307. package/docs/api/storage_AsyncStorageAdapter.js.html +357 -0
  308. package/docs/api/storage_MemoryStorage.js.html +279 -0
  309. package/docs/api/storage_MessageStore.js.html +369 -0
  310. package/docs/api/storage_Storage.js.html +214 -0
  311. package/docs/api/storage_index.js.html +72 -0
  312. package/docs/api/styles/jsdoc-default.css +358 -0
  313. package/docs/api/styles/prettify-jsdoc.css +111 -0
  314. package/docs/api/styles/prettify-tomorrow.css +132 -0
  315. package/docs/api/transport_BLEAdapter.js.html +231 -0
  316. package/docs/api/transport_BLETransport.js.html +411 -0
  317. package/docs/api/transport_MockTransport.js.html +339 -0
  318. package/docs/api/transport_NodeBLEAdapter.js.html +479 -0
  319. package/docs/api/transport_RNBLEAdapter.js.html +382 -0
  320. package/docs/api/transport_Transport.js.html +242 -0
  321. package/docs/api/transport_adapters_BLEAdapter.js.html +231 -0
  322. package/docs/api/transport_adapters_NodeBLEAdapter.js.html +479 -0
  323. package/docs/api/transport_adapters_RNBLEAdapter.js.html +382 -0
  324. package/docs/api/transport_adapters_index.js.html +70 -0
  325. package/docs/api/transport_index.js.html +87 -0
  326. package/docs/api/utils_BoundedMap.js.html +205 -0
  327. package/docs/api/utils_EventEmitter.js.html +259 -0
  328. package/docs/api/utils_LRUCache.js.html +256 -0
  329. package/docs/api/utils_RateLimiter.js.html +256 -0
  330. package/docs/api/utils_TimeoutManager.js.html +218 -0
  331. package/docs/api/utils_base64%0A%0AThis%20implementation%20avoids%20string%20concatenation%20in%20loops%20which%20is%20O(n%C2%B2).%0AUses%20array%20building%20which%20is%20O(n)%20-%20critical%20for%20React%20Native%20performance.module_.html +717 -0
  332. package/docs/api/utils_base64.js.html +205 -0
  333. package/docs/api/utils_bytes.js.html +241 -0
  334. package/docs/api/utils_debug.js.html +205 -0
  335. package/docs/api/utils_encoding.js.html +302 -0
  336. package/docs/api/utils_index.js.html +160 -0
  337. package/docs/api/utils_retry.js.html +200 -0
  338. package/docs/api/utils_time.js.html +220 -0
  339. package/docs/api/utils_uuid.js.html +199 -0
  340. package/docs/api/utils_validation.js.html +259 -0
  341. package/examples/node-chat/chat.js +220 -0
  342. package/examples/node-quickstart/index.js +94 -0
  343. package/examples/testing/test-helper.js +182 -0
  344. package/package.json +111 -0
  345. package/src/constants/audio.js +130 -0
  346. package/src/constants/ble.js +111 -0
  347. package/src/constants/crypto.js +53 -0
  348. package/src/constants/errors.js +202 -0
  349. package/src/constants/events.js +94 -0
  350. package/src/constants/index.js +22 -0
  351. package/src/constants/protocol.js +151 -0
  352. package/src/crypto/aead.js +189 -0
  353. package/src/crypto/chacha20.js +181 -0
  354. package/src/crypto/hkdf.js +187 -0
  355. package/src/crypto/hmac.js +143 -0
  356. package/src/crypto/index.js +72 -0
  357. package/src/crypto/keys/KeyManager.js +271 -0
  358. package/src/crypto/keys/KeyPair.js +216 -0
  359. package/src/crypto/keys/SecureStorage.js +219 -0
  360. package/src/crypto/keys/index.js +32 -0
  361. package/src/crypto/noise/handshake.js +410 -0
  362. package/src/crypto/noise/index.js +27 -0
  363. package/src/crypto/noise/session.js +253 -0
  364. package/src/crypto/noise/state.js +268 -0
  365. package/src/crypto/poly1305.js +113 -0
  366. package/src/crypto/sha256.js +240 -0
  367. package/src/crypto/x25519.js +154 -0
  368. package/src/errors/AudioError.js +164 -0
  369. package/src/errors/ConnectionError.js +109 -0
  370. package/src/errors/CryptoError.js +103 -0
  371. package/src/errors/HandshakeError.js +122 -0
  372. package/src/errors/MeshError.js +100 -0
  373. package/src/errors/MessageError.js +129 -0
  374. package/src/errors/ValidationError.js +150 -0
  375. package/src/errors/index.js +24 -0
  376. package/src/hooks/AppStateManager.js +179 -0
  377. package/src/hooks/index.js +33 -0
  378. package/src/hooks/useMesh.js +159 -0
  379. package/src/hooks/useMessages.js +209 -0
  380. package/src/hooks/usePeers.js +111 -0
  381. package/src/index.d.ts +494 -0
  382. package/src/index.js +182 -0
  383. package/src/index.mjs +62 -0
  384. package/src/mesh/dedup/BloomFilter.js +207 -0
  385. package/src/mesh/dedup/DedupManager.js +212 -0
  386. package/src/mesh/dedup/MessageCache.js +219 -0
  387. package/src/mesh/dedup/index.js +16 -0
  388. package/src/mesh/fragment/Assembler.js +281 -0
  389. package/src/mesh/fragment/Fragmenter.js +176 -0
  390. package/src/mesh/fragment/index.js +21 -0
  391. package/src/mesh/index.js +18 -0
  392. package/src/mesh/peer/Peer.js +242 -0
  393. package/src/mesh/peer/PeerDiscovery.js +280 -0
  394. package/src/mesh/peer/PeerManager.js +266 -0
  395. package/src/mesh/peer/index.js +16 -0
  396. package/src/mesh/router/MessageRouter.js +357 -0
  397. package/src/mesh/router/PathFinder.js +332 -0
  398. package/src/mesh/router/RouteTable.js +292 -0
  399. package/src/mesh/router/index.js +16 -0
  400. package/src/protocol/crc32.js +93 -0
  401. package/src/protocol/deserializer.js +241 -0
  402. package/src/protocol/header.js +222 -0
  403. package/src/protocol/index.js +66 -0
  404. package/src/protocol/message.js +233 -0
  405. package/src/protocol/serializer.js +186 -0
  406. package/src/protocol/validator.js +276 -0
  407. package/src/service/HandshakeManager.js +178 -0
  408. package/src/service/MeshService.js +317 -0
  409. package/src/service/SessionManager.js +99 -0
  410. package/src/service/audio/AudioManager.js +487 -0
  411. package/src/service/audio/buffer/FrameBuffer.js +169 -0
  412. package/src/service/audio/buffer/JitterBuffer.js +190 -0
  413. package/src/service/audio/buffer/index.js +14 -0
  414. package/src/service/audio/codec/LC3Codec.js +291 -0
  415. package/src/service/audio/codec/LC3Decoder.js +131 -0
  416. package/src/service/audio/codec/LC3Encoder.js +140 -0
  417. package/src/service/audio/codec/index.js +16 -0
  418. package/src/service/audio/index.js +42 -0
  419. package/src/service/audio/session/AudioSession.js +294 -0
  420. package/src/service/audio/session/VoiceMessage.js +378 -0
  421. package/src/service/audio/session/index.js +16 -0
  422. package/src/service/audio/transport/AudioFragmenter.js +260 -0
  423. package/src/service/audio/transport/AudioFramer.js +182 -0
  424. package/src/service/audio/transport/index.js +15 -0
  425. package/src/service/index.js +39 -0
  426. package/src/service/text/TextManager.js +524 -0
  427. package/src/service/text/broadcast/BroadcastManager.js +222 -0
  428. package/src/service/text/broadcast/index.js +12 -0
  429. package/src/service/text/channel/Channel.js +226 -0
  430. package/src/service/text/channel/ChannelManager.js +171 -0
  431. package/src/service/text/channel/index.js +14 -0
  432. package/src/service/text/index.js +31 -0
  433. package/src/service/text/message/TextMessage.js +296 -0
  434. package/src/service/text/message/TextSerializer.js +164 -0
  435. package/src/service/text/message/index.js +14 -0
  436. package/src/storage/AsyncStorageAdapter.js +303 -0
  437. package/src/storage/MemoryStorage.js +225 -0
  438. package/src/storage/MessageStore.js +315 -0
  439. package/src/storage/Storage.js +160 -0
  440. package/src/storage/index.js +18 -0
  441. package/src/transport/BLEAdapter.js +177 -0
  442. package/src/transport/BLETransport.js +357 -0
  443. package/src/transport/MockTransport.js +285 -0
  444. package/src/transport/NodeBLEAdapter.js +425 -0
  445. package/src/transport/RNBLEAdapter.js +328 -0
  446. package/src/transport/Transport.js +188 -0
  447. package/src/transport/adapters/BLEAdapter.js +177 -0
  448. package/src/transport/adapters/NodeBLEAdapter.js +425 -0
  449. package/src/transport/adapters/RNBLEAdapter.js +328 -0
  450. package/src/transport/adapters/index.js +16 -0
  451. package/src/transport/index.js +33 -0
  452. package/src/utils/BoundedMap.js +151 -0
  453. package/src/utils/EventEmitter.js +205 -0
  454. package/src/utils/LRUCache.js +202 -0
  455. package/src/utils/RateLimiter.js +202 -0
  456. package/src/utils/TimeoutManager.js +164 -0
  457. package/src/utils/base64.js +151 -0
  458. package/src/utils/bytes.js +187 -0
  459. package/src/utils/debug.js +151 -0
  460. package/src/utils/encoding.js +248 -0
  461. package/src/utils/index.js +106 -0
  462. package/src/utils/retry.js +146 -0
  463. package/src/utils/time.js +166 -0
  464. package/src/utils/uuid.js +145 -0
  465. package/src/utils/validation.js +205 -0
@@ -0,0 +1,315 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Message persistence layer for BLE Mesh Network
5
+ * @module storage/MessageStore
6
+ */
7
+
8
+ const MemoryStorage = require('./MemoryStorage');
9
+ const { MESH_CONFIG } = require('../constants');
10
+
11
+ /**
12
+ * Message store for persisting and retrieving mesh network messages.
13
+ * Provides message caching, deduplication support, and cleanup functionality.
14
+ *
15
+ * @class MessageStore
16
+ */
17
+ class MessageStore {
18
+ /**
19
+ * Creates a new MessageStore instance
20
+ * @param {Object} [options={}] - Store options
21
+ * @param {Object} [options.storage] - Storage backend (defaults to MemoryStorage)
22
+ * @param {number} [options.maxMessages=1000] - Maximum messages to store
23
+ * @param {number} [options.messageTtlMs] - Message TTL in milliseconds
24
+ */
25
+ constructor(options = {}) {
26
+ /**
27
+ * Storage backend
28
+ * @type {Object}
29
+ * @private
30
+ */
31
+ this._storage = options.storage || new MemoryStorage({
32
+ prefix: 'msg',
33
+ maxSize: options.maxMessages || 1000
34
+ });
35
+
36
+ /**
37
+ * Message TTL in milliseconds
38
+ * @type {number}
39
+ * @private
40
+ */
41
+ this._messageTtlMs = options.messageTtlMs || MESH_CONFIG.MESSAGE_TTL_MS;
42
+
43
+ /**
44
+ * Index storage for queries
45
+ * @type {Object}
46
+ * @private
47
+ */
48
+ this._indexStorage = options.indexStorage || new MemoryStorage({
49
+ prefix: 'msg_idx'
50
+ });
51
+ }
52
+
53
+ /**
54
+ * Saves a message to storage
55
+ * @param {Object} message - Message to save
56
+ * @param {string} message.id - Message ID
57
+ * @param {number} message.type - Message type
58
+ * @param {Uint8Array} [message.payload] - Message payload
59
+ * @param {string} [message.senderId] - Sender peer ID
60
+ * @param {string} [message.recipientId] - Recipient peer ID
61
+ * @param {number} [message.timestamp] - Message timestamp
62
+ * @returns {Promise<void>}
63
+ */
64
+ async saveMessage(message) {
65
+ if (!message || !message.id) {
66
+ throw new Error('Message must have an id');
67
+ }
68
+
69
+ const storedMessage = {
70
+ ...message,
71
+ payload: message.payload
72
+ ? Array.from(message.payload)
73
+ : undefined,
74
+ storedAt: Date.now()
75
+ };
76
+
77
+ await this._storage.set(message.id, storedMessage, {
78
+ ttl: this._messageTtlMs
79
+ });
80
+
81
+ // Update indexes
82
+ await this._updateIndexes(storedMessage);
83
+ }
84
+
85
+ /**
86
+ * Gets a message by ID
87
+ * @param {string} id - Message ID
88
+ * @returns {Promise<Object|null>} Message or null if not found
89
+ */
90
+ async getMessage(id) {
91
+ const message = await this._storage.get(id);
92
+
93
+ if (!message) {
94
+ return null;
95
+ }
96
+
97
+ // Convert payload back to Uint8Array
98
+ if (message.payload) {
99
+ message.payload = new Uint8Array(message.payload);
100
+ }
101
+
102
+ return message;
103
+ }
104
+
105
+ /**
106
+ * Gets messages matching query options
107
+ * @param {Object} [options={}] - Query options
108
+ * @param {string} [options.senderId] - Filter by sender ID
109
+ * @param {string} [options.recipientId] - Filter by recipient ID
110
+ * @param {number} [options.type] - Filter by message type
111
+ * @param {number} [options.since] - Filter messages since timestamp
112
+ * @param {number} [options.until] - Filter messages until timestamp
113
+ * @param {number} [options.limit=50] - Maximum messages to return
114
+ * @param {number} [options.offset=0] - Offset for pagination
115
+ * @returns {Promise<Object[]>} Array of messages
116
+ */
117
+ async getMessages(options = {}) {
118
+ const {
119
+ senderId,
120
+ recipientId,
121
+ type,
122
+ since,
123
+ until,
124
+ limit = 50,
125
+ offset = 0
126
+ } = options;
127
+
128
+ const allKeys = await this._storage.keys();
129
+ const messages = [];
130
+
131
+ for (const key of allKeys) {
132
+ const message = await this.getMessage(key);
133
+ if (!message) { continue; }
134
+
135
+ // Apply filters
136
+ if (senderId && message.senderId !== senderId) { continue; }
137
+ if (recipientId && message.recipientId !== recipientId) { continue; }
138
+ if (type !== undefined && message.type !== type) { continue; }
139
+ if (since && message.timestamp < since) { continue; }
140
+ if (until && message.timestamp > until) { continue; }
141
+
142
+ messages.push(message);
143
+ }
144
+
145
+ // Sort by timestamp (newest first)
146
+ messages.sort((a, b) => (b.timestamp || 0) - (a.timestamp || 0));
147
+
148
+ // Apply pagination
149
+ return messages.slice(offset, offset + limit);
150
+ }
151
+
152
+ /**
153
+ * Deletes a message by ID
154
+ * @param {string} id - Message ID
155
+ * @returns {Promise<void>}
156
+ */
157
+ async deleteMessage(id) {
158
+ const message = await this.getMessage(id);
159
+ if (message) {
160
+ await this._removeFromIndexes(message);
161
+ }
162
+ await this._storage.delete(id);
163
+ }
164
+
165
+ /**
166
+ * Checks if a message exists
167
+ * @param {string} id - Message ID
168
+ * @returns {Promise<boolean>} True if message exists
169
+ */
170
+ async hasMessage(id) {
171
+ return this._storage.has(id);
172
+ }
173
+
174
+ /**
175
+ * Cleans up expired messages
176
+ * @param {number} [maxAgeMs] - Maximum message age in milliseconds
177
+ * @returns {Promise<number>} Number of messages removed
178
+ */
179
+ async cleanup(maxAgeMs) {
180
+ const maxAge = maxAgeMs || this._messageTtlMs;
181
+ const cutoff = Date.now() - maxAge;
182
+ const allKeys = await this._storage.keys();
183
+ let removed = 0;
184
+
185
+ for (const key of allKeys) {
186
+ const message = await this._storage.get(key);
187
+ if (message) {
188
+ const messageTime = message.timestamp || message.storedAt || 0;
189
+ if (messageTime < cutoff) {
190
+ await this.deleteMessage(key);
191
+ removed++;
192
+ }
193
+ }
194
+ }
195
+
196
+ return removed;
197
+ }
198
+
199
+ /**
200
+ * Gets the count of stored messages
201
+ * @returns {Promise<number>} Number of messages
202
+ */
203
+ async getCount() {
204
+ return this._storage.size();
205
+ }
206
+
207
+ /**
208
+ * Clears all stored messages
209
+ * @returns {Promise<void>}
210
+ */
211
+ async clear() {
212
+ await this._storage.clear();
213
+ await this._indexStorage.clear();
214
+ }
215
+
216
+ /**
217
+ * Gets messages by sender
218
+ * @param {string} senderId - Sender peer ID
219
+ * @param {number} [limit=50] - Maximum messages
220
+ * @returns {Promise<Object[]>} Array of messages
221
+ */
222
+ async getMessagesBySender(senderId, limit = 50) {
223
+ return this.getMessages({ senderId, limit });
224
+ }
225
+
226
+ /**
227
+ * Gets messages by recipient
228
+ * @param {string} recipientId - Recipient peer ID
229
+ * @param {number} [limit=50] - Maximum messages
230
+ * @returns {Promise<Object[]>} Array of messages
231
+ */
232
+ async getMessagesByRecipient(recipientId, limit = 50) {
233
+ return this.getMessages({ recipientId, limit });
234
+ }
235
+
236
+ /**
237
+ * Gets conversation messages between two peers
238
+ * @param {string} peerId1 - First peer ID
239
+ * @param {string} peerId2 - Second peer ID
240
+ * @param {number} [limit=50] - Maximum messages
241
+ * @returns {Promise<Object[]>} Array of messages
242
+ */
243
+ async getConversation(peerId1, peerId2, limit = 50) {
244
+ const allKeys = await this._storage.keys();
245
+ const messages = [];
246
+
247
+ for (const key of allKeys) {
248
+ const message = await this.getMessage(key);
249
+ if (!message) { continue; }
250
+
251
+ const isMatch =
252
+ (message.senderId === peerId1 && message.recipientId === peerId2) ||
253
+ (message.senderId === peerId2 && message.recipientId === peerId1);
254
+
255
+ if (isMatch) {
256
+ messages.push(message);
257
+ }
258
+ }
259
+
260
+ messages.sort((a, b) => (a.timestamp || 0) - (b.timestamp || 0));
261
+ return messages.slice(-limit);
262
+ }
263
+
264
+ /**
265
+ * Updates indexes for a message
266
+ * @param {Object} message - Message to index
267
+ * @returns {Promise<void>}
268
+ * @private
269
+ */
270
+ async _updateIndexes(message) {
271
+ // Sender index
272
+ if (message.senderId) {
273
+ const key = `sender:${message.senderId}`;
274
+ const ids = (await this._indexStorage.get(key)) || [];
275
+ if (!ids.includes(message.id)) {
276
+ ids.push(message.id);
277
+ await this._indexStorage.set(key, ids);
278
+ }
279
+ }
280
+
281
+ // Recipient index
282
+ if (message.recipientId) {
283
+ const key = `recipient:${message.recipientId}`;
284
+ const ids = (await this._indexStorage.get(key)) || [];
285
+ if (!ids.includes(message.id)) {
286
+ ids.push(message.id);
287
+ await this._indexStorage.set(key, ids);
288
+ }
289
+ }
290
+ }
291
+
292
+ /**
293
+ * Removes a message from indexes
294
+ * @param {Object} message - Message to remove from indexes
295
+ * @returns {Promise<void>}
296
+ * @private
297
+ */
298
+ async _removeFromIndexes(message) {
299
+ if (message.senderId) {
300
+ const key = `sender:${message.senderId}`;
301
+ const ids = (await this._indexStorage.get(key)) || [];
302
+ const filtered = ids.filter(id => id !== message.id);
303
+ await this._indexStorage.set(key, filtered);
304
+ }
305
+
306
+ if (message.recipientId) {
307
+ const key = `recipient:${message.recipientId}`;
308
+ const ids = (await this._indexStorage.get(key)) || [];
309
+ const filtered = ids.filter(id => id !== message.id);
310
+ await this._indexStorage.set(key, filtered);
311
+ }
312
+ }
313
+ }
314
+
315
+ module.exports = MessageStore;
@@ -0,0 +1,160 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Abstract storage interface for BLE Mesh Network
5
+ * @module storage/Storage
6
+ */
7
+
8
+ /**
9
+ * Abstract storage interface.
10
+ * Extend this class to implement specific storage backends.
11
+ *
12
+ * @abstract
13
+ * @class Storage
14
+ */
15
+ class Storage {
16
+ /**
17
+ * Creates a new Storage instance
18
+ * @param {Object} [options={}] - Storage options
19
+ * @param {string} [options.prefix=''] - Key prefix for namespacing
20
+ */
21
+ constructor(options = {}) {
22
+ /**
23
+ * Storage options
24
+ * @type {Object}
25
+ * @protected
26
+ */
27
+ this._options = {
28
+ prefix: '',
29
+ ...options
30
+ };
31
+ }
32
+
33
+ /**
34
+ * Gets the prefixed key
35
+ * @param {string} key - Original key
36
+ * @returns {string} Prefixed key
37
+ * @protected
38
+ */
39
+ _getKey(key) {
40
+ return this._options.prefix ? `${this._options.prefix}:${key}` : key;
41
+ }
42
+
43
+ /**
44
+ * Gets a value by key
45
+ * @abstract
46
+ * @param {string} key - Key to retrieve
47
+ * @returns {Promise<any>} Stored value or undefined
48
+ * @throws {Error} If not implemented by subclass
49
+ */
50
+ async get(_key) {
51
+ throw new Error('Storage.get() must be implemented by subclass');
52
+ }
53
+
54
+ /**
55
+ * Sets a value by key
56
+ * @abstract
57
+ * @param {string} key - Key to set
58
+ * @param {any} value - Value to store
59
+ * @returns {Promise<void>}
60
+ * @throws {Error} If not implemented by subclass
61
+ */
62
+ async set(_key, _value) {
63
+ throw new Error('Storage.set() must be implemented by subclass');
64
+ }
65
+
66
+ /**
67
+ * Deletes a value by key
68
+ * @abstract
69
+ * @param {string} key - Key to delete
70
+ * @returns {Promise<void>}
71
+ * @throws {Error} If not implemented by subclass
72
+ */
73
+ async delete(_key) {
74
+ throw new Error('Storage.delete() must be implemented by subclass');
75
+ }
76
+
77
+ /**
78
+ * Checks if a key exists
79
+ * @abstract
80
+ * @param {string} key - Key to check
81
+ * @returns {Promise<boolean>} True if key exists
82
+ * @throws {Error} If not implemented by subclass
83
+ */
84
+ async has(_key) {
85
+ throw new Error('Storage.has() must be implemented by subclass');
86
+ }
87
+
88
+ /**
89
+ * Clears all stored data
90
+ * @abstract
91
+ * @returns {Promise<void>}
92
+ * @throws {Error} If not implemented by subclass
93
+ */
94
+ async clear() {
95
+ throw new Error('Storage.clear() must be implemented by subclass');
96
+ }
97
+
98
+ /**
99
+ * Gets all keys
100
+ * @abstract
101
+ * @returns {Promise<string[]>} Array of keys
102
+ * @throws {Error} If not implemented by subclass
103
+ */
104
+ async keys() {
105
+ throw new Error('Storage.keys() must be implemented by subclass');
106
+ }
107
+
108
+ /**
109
+ * Gets the number of stored items
110
+ * @returns {Promise<number>} Number of items
111
+ */
112
+ async size() {
113
+ const allKeys = await this.keys();
114
+ return allKeys.length;
115
+ }
116
+
117
+ /**
118
+ * Gets multiple values by keys
119
+ * @param {string[]} keys - Keys to retrieve
120
+ * @returns {Promise<Map<string, any>>} Map of key-value pairs
121
+ */
122
+ async getMany(keys) {
123
+ const result = new Map();
124
+ await Promise.all(
125
+ keys.map(async (key) => {
126
+ const value = await this.get(key);
127
+ if (value !== undefined) {
128
+ result.set(key, value);
129
+ }
130
+ })
131
+ );
132
+ return result;
133
+ }
134
+
135
+ /**
136
+ * Sets multiple key-value pairs
137
+ * @param {Map<string, any>|Object} entries - Entries to set
138
+ * @returns {Promise<void>}
139
+ */
140
+ async setMany(entries) {
141
+ const pairs = entries instanceof Map
142
+ ? Array.from(entries.entries())
143
+ : Object.entries(entries);
144
+
145
+ await Promise.all(
146
+ pairs.map(([key, value]) => this.set(key, value))
147
+ );
148
+ }
149
+
150
+ /**
151
+ * Deletes multiple keys
152
+ * @param {string[]} keys - Keys to delete
153
+ * @returns {Promise<void>}
154
+ */
155
+ async deleteMany(keys) {
156
+ await Promise.all(keys.map(key => this.delete(key)));
157
+ }
158
+ }
159
+
160
+ module.exports = Storage;
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Storage module exports
5
+ * @module storage
6
+ */
7
+
8
+ const Storage = require('./Storage');
9
+ const MemoryStorage = require('./MemoryStorage');
10
+ const AsyncStorageAdapter = require('./AsyncStorageAdapter');
11
+ const MessageStore = require('./MessageStore');
12
+
13
+ module.exports = {
14
+ Storage,
15
+ MemoryStorage,
16
+ AsyncStorageAdapter,
17
+ MessageStore
18
+ };
@@ -0,0 +1,177 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Abstract BLE adapter interface
5
+ * @module transport/BLEAdapter
6
+ */
7
+
8
+ const { BLUETOOTH_STATE } = require('../constants');
9
+
10
+ /**
11
+ * Abstract BLE adapter interface.
12
+ * Provides a unified API for different BLE implementations.
13
+ *
14
+ * @abstract
15
+ * @class BLEAdapter
16
+ */
17
+ class BLEAdapter {
18
+ /**
19
+ * Creates a new BLEAdapter instance
20
+ * @param {Object} [options={}] - Adapter options
21
+ */
22
+ constructor(options = {}) {
23
+ /**
24
+ * Adapter options
25
+ * @type {Object}
26
+ * @protected
27
+ */
28
+ this._options = options;
29
+
30
+ /**
31
+ * State change callback
32
+ * @type {Function|null}
33
+ * @protected
34
+ */
35
+ this._stateChangeCallback = null;
36
+
37
+ /**
38
+ * Whether adapter is initialized
39
+ * @type {boolean}
40
+ * @protected
41
+ */
42
+ this._initialized = false;
43
+ }
44
+
45
+ /**
46
+ * Gets whether the adapter is initialized
47
+ * @returns {boolean} True if initialized
48
+ */
49
+ get isInitialized() {
50
+ return this._initialized;
51
+ }
52
+
53
+ /**
54
+ * Initializes the BLE adapter
55
+ * @abstract
56
+ * @returns {Promise<void>}
57
+ * @throws {Error} If not implemented by subclass
58
+ */
59
+ async initialize() {
60
+ throw new Error('BLEAdapter.initialize() must be implemented by subclass');
61
+ }
62
+
63
+ /**
64
+ * Destroys the BLE adapter and releases resources
65
+ * @abstract
66
+ * @returns {Promise<void>}
67
+ * @throws {Error} If not implemented by subclass
68
+ */
69
+ async destroy() {
70
+ throw new Error('BLEAdapter.destroy() must be implemented by subclass');
71
+ }
72
+
73
+ /**
74
+ * Starts scanning for BLE devices
75
+ * @abstract
76
+ * @param {string[]} serviceUUIDs - Service UUIDs to filter by
77
+ * @param {Function} callback - Callback for discovered devices
78
+ * @returns {Promise<void>}
79
+ * @throws {Error} If not implemented by subclass
80
+ */
81
+ async startScan(_serviceUUIDs, _callback) {
82
+ throw new Error('BLEAdapter.startScan() must be implemented by subclass');
83
+ }
84
+
85
+ /**
86
+ * Stops scanning for BLE devices
87
+ * @abstract
88
+ * @throws {Error} If not implemented by subclass
89
+ */
90
+ stopScan() {
91
+ throw new Error('BLEAdapter.stopScan() must be implemented by subclass');
92
+ }
93
+
94
+ /**
95
+ * Connects to a BLE device
96
+ * @abstract
97
+ * @param {string} deviceId - Device ID to connect to
98
+ * @returns {Promise<Object>} Connected device info
99
+ * @throws {Error} If not implemented by subclass
100
+ */
101
+ async connect(_deviceId) {
102
+ throw new Error('BLEAdapter.connect() must be implemented by subclass');
103
+ }
104
+
105
+ /**
106
+ * Disconnects from a BLE device
107
+ * @abstract
108
+ * @param {string} deviceId - Device ID to disconnect from
109
+ * @returns {Promise<void>}
110
+ * @throws {Error} If not implemented by subclass
111
+ */
112
+ async disconnect(_deviceId) {
113
+ throw new Error('BLEAdapter.disconnect() must be implemented by subclass');
114
+ }
115
+
116
+ /**
117
+ * Writes data to a characteristic
118
+ * @abstract
119
+ * @param {string} deviceId - Target device ID
120
+ * @param {string} serviceUUID - Service UUID
121
+ * @param {string} charUUID - Characteristic UUID
122
+ * @param {Uint8Array} data - Data to write
123
+ * @returns {Promise<void>}
124
+ * @throws {Error} If not implemented by subclass
125
+ */
126
+ async write(_deviceId, _serviceUUID, _charUUID, _data) {
127
+ throw new Error('BLEAdapter.write() must be implemented by subclass');
128
+ }
129
+
130
+ /**
131
+ * Subscribes to characteristic notifications
132
+ * @abstract
133
+ * @param {string} deviceId - Target device ID
134
+ * @param {string} serviceUUID - Service UUID
135
+ * @param {string} charUUID - Characteristic UUID
136
+ * @param {Function} callback - Notification callback
137
+ * @returns {Promise<void>}
138
+ * @throws {Error} If not implemented by subclass
139
+ */
140
+ async subscribe(_deviceId, _serviceUUID, _charUUID, _callback) {
141
+ throw new Error('BLEAdapter.subscribe() must be implemented by subclass');
142
+ }
143
+
144
+ /**
145
+ * Gets the current Bluetooth state
146
+ * @abstract
147
+ * @returns {Promise<string>} Bluetooth state
148
+ * @throws {Error} If not implemented by subclass
149
+ */
150
+ async getState() {
151
+ throw new Error('BLEAdapter.getState() must be implemented by subclass');
152
+ }
153
+
154
+ /**
155
+ * Registers a callback for Bluetooth state changes
156
+ * @param {Function} callback - State change callback
157
+ */
158
+ onStateChange(callback) {
159
+ this._stateChangeCallback = callback;
160
+ }
161
+
162
+ /**
163
+ * Notifies listeners of state change
164
+ * @param {string} state - New Bluetooth state
165
+ * @protected
166
+ */
167
+ _notifyStateChange(state) {
168
+ if (this._stateChangeCallback) {
169
+ this._stateChangeCallback(state);
170
+ }
171
+ }
172
+ }
173
+
174
+ // Export state constants with the class
175
+ BLEAdapter.STATE = BLUETOOTH_STATE;
176
+
177
+ module.exports = BLEAdapter;