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,868 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>JSDoc: Home</title>
6
+
7
+ <script src="scripts/prettify/prettify.js"> </script>
8
+ <script src="scripts/prettify/lang-css.js"> </script>
9
+ <!--[if lt IE 9]>
10
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
11
+ <![endif]-->
12
+ <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
13
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
14
+ </head>
15
+
16
+ <body>
17
+
18
+ <div id="main">
19
+
20
+ <h1 class="page-title">Home</h1>
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+ <h3> </h3>
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+ <section>
46
+ <article><h1>react-native-ble-mesh</h1>
47
+ <blockquote>
48
+ <p>Inspired by <a href="https://github.com/permissionlesstech/bitchat">Bitchat</a> - this is the React Native version.</p>
49
+ </blockquote>
50
+ <p>A <strong>production-ready BLE Mesh Network library</strong> for Node.js and React Native with Noise Protocol security. This library enables peer-to-peer communication over Bluetooth Low Energy with end-to-end encryption, multi-hop routing, and offline-first capabilities.</p>
51
+ <p><a href="https://www.npmjs.com/package/react-native-ble-mesh"><img src="https://img.shields.io/npm/v/react-native-ble-mesh.svg" alt="npm version"></a>
52
+ <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a></p>
53
+ <h2>Features</h2>
54
+ <ul>
55
+ <li><strong>End-to-End Encryption</strong> - Noise Protocol XX handshake with ChaCha20-Poly1305 AEAD</li>
56
+ <li><strong>Digital Signatures</strong> - Ed25519 signatures for message authentication and identity verification</li>
57
+ <li><strong>Multi-Hop Routing</strong> - Messages can traverse multiple peers to reach their destination</li>
58
+ <li><strong>Offline-First</strong> - Works without internet connectivity using BLE</li>
59
+ <li><strong>Forward Secrecy</strong> - Automatic session rekeying for enhanced security</li>
60
+ <li><strong>Replay Protection</strong> - Sliding window algorithm prevents replay attacks</li>
61
+ <li><strong>Traffic Analysis Resistance</strong> - PKCS#7 padding to fixed block sizes</li>
62
+ <li><strong>LZ4 Compression</strong> - Efficient bandwidth usage for larger messages</li>
63
+ <li><strong>Power Management</strong> - Multiple power modes for battery optimization</li>
64
+ <li><strong>Trust Management</strong> - Peer verification, favorites, and blocking</li>
65
+ <li><strong>Message Reliability</strong> - Automatic retry with exponential backoff</li>
66
+ </ul>
67
+ <h2>Use Cases</h2>
68
+ <ul>
69
+ <li>Offline messaging apps (like Bridgefy, Briar)</li>
70
+ <li>Disaster communication networks</li>
71
+ <li>Privacy-focused P2P chat</li>
72
+ <li>IoT mesh networks</li>
73
+ <li>Gaming multiplayer over BLE</li>
74
+ </ul>
75
+ <h2>Installation</h2>
76
+ <pre class="prettyprint source lang-bash"><code>npm install react-native-ble-mesh
77
+ </code></pre>
78
+ <h3>React Native</h3>
79
+ <p>For React Native projects, you also need to install the BLE dependency:</p>
80
+ <pre class="prettyprint source lang-bash"><code>npm install react-native-ble-plx
81
+ cd ios && pod install
82
+ </code></pre>
83
+ <h3>Node.js</h3>
84
+ <p>For Node.js projects using Noble:</p>
85
+ <pre class="prettyprint source lang-bash"><code>npm install @abandonware/noble
86
+ </code></pre>
87
+ <h2>Quick Start</h2>
88
+ <h3>Basic Setup</h3>
89
+ <pre class="prettyprint source lang-javascript"><code>const { MeshService, BLETransport } = require('react-native-ble-mesh');
90
+
91
+ // Create and initialize the mesh service
92
+ const mesh = new MeshService();
93
+
94
+ async function start() {
95
+ // Initialize with optional configuration
96
+ await mesh.initialize({
97
+ displayName: 'Alice',
98
+ storage: null, // Use in-memory storage
99
+ });
100
+
101
+ // Create transport layer
102
+ const transport = new BLETransport();
103
+
104
+ // Start the mesh service
105
+ await mesh.start(transport);
106
+
107
+ console.log('Mesh network started!');
108
+ console.log('My fingerprint:', mesh.getFingerprint());
109
+ }
110
+
111
+ start();
112
+ </code></pre>
113
+ <h3>Discovering Peers</h3>
114
+ <pre class="prettyprint source lang-javascript"><code>// Listen for peer discovery events
115
+ mesh.on('peer-discovered', (peer) => {
116
+ console.log('Discovered peer:', peer.id);
117
+ console.log('Display name:', peer.getDisplayName());
118
+ });
119
+
120
+ mesh.on('peer-connected', (peer) => {
121
+ console.log('Connected to peer:', peer.id);
122
+ });
123
+
124
+ mesh.on('peer-secured', (peer) => {
125
+ console.log('Secure session established with:', peer.id);
126
+ });
127
+ </code></pre>
128
+ <h3>Sending Messages</h3>
129
+ <pre class="prettyprint source lang-javascript"><code>// Send a broadcast message to all nearby peers
130
+ const broadcastId = mesh.sendBroadcast('Hello, mesh network!');
131
+
132
+ // Send a private encrypted message to a specific peer
133
+ const peerId = 'abc123...';
134
+ try {
135
+ const messageId = await mesh.sendPrivateMessage(peerId, 'Hello, this is private!');
136
+ console.log('Message sent:', messageId);
137
+ } catch (error) {
138
+ console.error('Failed to send:', error.message);
139
+ }
140
+
141
+ // Send a message to a channel
142
+ const channelMessageId = mesh.sendChannelMessage('general', 'Hello channel!');
143
+ </code></pre>
144
+ <h3>Receiving Messages</h3>
145
+ <pre class="prettyprint source lang-javascript"><code>// Listen for incoming messages
146
+ mesh.on('message', (message) => {
147
+ console.log('Received message:', message.content);
148
+ console.log('From:', message.senderId);
149
+ console.log('Type:', message.type);
150
+ });
151
+
152
+ // Listen for private messages specifically
153
+ mesh.on('private-message', (message) => {
154
+ console.log('Private message from', message.senderId);
155
+ console.log('Content:', message.content);
156
+ });
157
+
158
+ // Listen for channel messages
159
+ mesh.on('channel-message', (message) => {
160
+ console.log('Channel:', message.channelId);
161
+ console.log('Content:', message.content);
162
+ });
163
+ </code></pre>
164
+ <h3>Handling Acknowledgments and Read Receipts</h3>
165
+ <pre class="prettyprint source lang-javascript"><code>// Listen for message delivery confirmations
166
+ mesh.on('message-delivered', ({ messageId, peerId, timestamp }) => {
167
+ console.log(`Message ${messageId} delivered to ${peerId}`);
168
+ });
169
+
170
+ // Listen for read receipts
171
+ mesh.on('read-receipt', ({ messageIds, fromPeerId, timestamp }) => {
172
+ console.log(`Peer ${fromPeerId} read messages:`, messageIds);
173
+ });
174
+
175
+ // Send read receipts for messages you've read
176
+ mesh.sendReadReceipt(['msg-id-1', 'msg-id-2']);
177
+
178
+ // Mark a single message as read
179
+ mesh.markMessageRead('msg-id-1');
180
+ </code></pre>
181
+ <h2>API Reference</h2>
182
+ <h3>MeshService</h3>
183
+ <p>The main orchestrator for the mesh network.</p>
184
+ <h4>Lifecycle Methods</h4>
185
+ <pre class="prettyprint source lang-javascript"><code>// Initialize the service
186
+ await mesh.initialize(options);
187
+
188
+ // Start with a transport
189
+ await mesh.start(transport);
190
+
191
+ // Stop the service
192
+ await mesh.stop();
193
+
194
+ // Clean up resources
195
+ await mesh.destroy();
196
+ </code></pre>
197
+ <h4>Identity Management</h4>
198
+ <pre class="prettyprint source lang-javascript"><code>// Get your identity information
199
+ const identity = mesh.getIdentity();
200
+ // Returns: { publicKey, signingPublicKey, displayName, fingerprint }
201
+
202
+ // Set your display name
203
+ mesh.setDisplayName('Alice');
204
+
205
+ // Get your fingerprint for out-of-band verification
206
+ const fingerprint = mesh.getFingerprint();
207
+
208
+ // Export identity for backup
209
+ const exported = mesh.exportIdentity();
210
+
211
+ // Import identity from backup
212
+ mesh.importIdentity(exported);
213
+
214
+ // Announce identity to network
215
+ mesh.announceIdentity();
216
+ </code></pre>
217
+ <h4>Peer Management</h4>
218
+ <pre class="prettyprint source lang-javascript"><code>// Get all known peers
219
+ const peers = mesh.getPeers();
220
+
221
+ // Get a specific peer
222
+ const peer = mesh.getPeer(peerId);
223
+
224
+ // Initiate secure handshake with a peer
225
+ await mesh.initiateHandshake(peerId);
226
+
227
+ // Block a peer
228
+ mesh.blockPeer(peerId);
229
+
230
+ // Unblock a peer
231
+ mesh.unblockPeer(peerId);
232
+ </code></pre>
233
+ <h4>Trust Management</h4>
234
+ <pre class="prettyprint source lang-javascript"><code>// Verify a peer using their fingerprint
235
+ mesh.verifyPeer(peerId, fingerprint);
236
+
237
+ // Remove verification
238
+ mesh.unverifyPeer(peerId);
239
+
240
+ // Add to favorites
241
+ mesh.addFavorite(peerId);
242
+
243
+ // Remove from favorites
244
+ mesh.removeFavorite(peerId);
245
+
246
+ // Get verified peers
247
+ const verified = mesh.getVerifiedPeers();
248
+
249
+ // Get favorite peers
250
+ const favorites = mesh.getFavoritePeers();
251
+ </code></pre>
252
+ <h4>Power Management</h4>
253
+ <pre class="prettyprint source lang-javascript"><code>// Available power modes: PERFORMANCE, BALANCED, POWER_SAVER, ULTRA_POWER_SAVER
254
+ mesh.setPowerMode('BALANCED');
255
+
256
+ // Get current power mode
257
+ const mode = mesh.getPowerMode();
258
+
259
+ // Enable automatic power adjustment based on battery level
260
+ mesh.setAutoPowerAdjust(true);
261
+ </code></pre>
262
+ <h4>Status and Statistics</h4>
263
+ <pre class="prettyprint source lang-javascript"><code>// Get service status
264
+ const status = mesh.getStatus();
265
+
266
+ // Get current state
267
+ const state = mesh.getState();
268
+
269
+ // Get detailed statistics
270
+ const stats = mesh.getStats();
271
+ </code></pre>
272
+ <h3>Events</h3>
273
+ <table>
274
+ <thead>
275
+ <tr>
276
+ <th>Event</th>
277
+ <th>Description</th>
278
+ <th>Payload</th>
279
+ </tr>
280
+ </thead>
281
+ <tbody>
282
+ <tr>
283
+ <td><code>peer-discovered</code></td>
284
+ <td>New peer found</td>
285
+ <td><code>{ peer }</code></td>
286
+ </tr>
287
+ <tr>
288
+ <td><code>peer-connected</code></td>
289
+ <td>Connected to peer</td>
290
+ <td><code>{ peer }</code></td>
291
+ </tr>
292
+ <tr>
293
+ <td><code>peer-disconnected</code></td>
294
+ <td>Disconnected from peer</td>
295
+ <td><code>{ peer }</code></td>
296
+ </tr>
297
+ <tr>
298
+ <td><code>peer-secured</code></td>
299
+ <td>Secure session established</td>
300
+ <td><code>{ peer }</code></td>
301
+ </tr>
302
+ <tr>
303
+ <td><code>message</code></td>
304
+ <td>Any message received</td>
305
+ <td><code>{ message }</code></td>
306
+ </tr>
307
+ <tr>
308
+ <td><code>private-message</code></td>
309
+ <td>Private message received</td>
310
+ <td><code>{ message }</code></td>
311
+ </tr>
312
+ <tr>
313
+ <td><code>channel-message</code></td>
314
+ <td>Channel message received</td>
315
+ <td><code>{ message }</code></td>
316
+ </tr>
317
+ <tr>
318
+ <td><code>message-delivered</code></td>
319
+ <td>Message delivery confirmed</td>
320
+ <td><code>{ messageId, peerId, timestamp }</code></td>
321
+ </tr>
322
+ <tr>
323
+ <td><code>message-failed</code></td>
324
+ <td>Message delivery failed</td>
325
+ <td><code>{ messageId, peerId, error }</code></td>
326
+ </tr>
327
+ <tr>
328
+ <td><code>read-receipt</code></td>
329
+ <td>Read receipt received</td>
330
+ <td><code>{ messageIds, fromPeerId, timestamp }</code></td>
331
+ </tr>
332
+ <tr>
333
+ <td><code>identity-announced</code></td>
334
+ <td>Peer announced identity</td>
335
+ <td><code>{ peerId, fingerprint, nickname }</code></td>
336
+ </tr>
337
+ <tr>
338
+ <td><code>peer-verified</code></td>
339
+ <td>Peer verification changed</td>
340
+ <td><code>{ peerId, fingerprint }</code></td>
341
+ </tr>
342
+ <tr>
343
+ <td><code>peer-compromised</code></td>
344
+ <td>Fingerprint mismatch detected</td>
345
+ <td><code>{ peerId, expected, actual }</code></td>
346
+ </tr>
347
+ </tbody>
348
+ </table>
349
+ <h2>Configuration</h2>
350
+ <h3>Initialization Options</h3>
351
+ <pre class="prettyprint source lang-javascript"><code>await mesh.initialize({
352
+ // Display name for this node
353
+ displayName: 'My Device',
354
+
355
+ // Storage adapter (null for in-memory)
356
+ storage: null,
357
+
358
+ // Custom key manager (optional)
359
+ keyManager: null,
360
+
361
+ // Enable compression for messages > 64 bytes
362
+ compressionEnabled: true,
363
+
364
+ // Compression threshold in bytes
365
+ compressionThreshold: 64,
366
+ });
367
+ </code></pre>
368
+ <h3>Power Modes</h3>
369
+ <table>
370
+ <thead>
371
+ <tr>
372
+ <th>Mode</th>
373
+ <th>Scan Interval</th>
374
+ <th>Window</th>
375
+ <th>Use Case</th>
376
+ </tr>
377
+ </thead>
378
+ <tbody>
379
+ <tr>
380
+ <td><code>PERFORMANCE</code></td>
381
+ <td>1s</td>
382
+ <td>800ms</td>
383
+ <td>Active foreground use</td>
384
+ </tr>
385
+ <tr>
386
+ <td><code>BALANCED</code></td>
387
+ <td>5s</td>
388
+ <td>2s</td>
389
+ <td>Default mode</td>
390
+ </tr>
391
+ <tr>
392
+ <td><code>POWER_SAVER</code></td>
393
+ <td>30s</td>
394
+ <td>5s</td>
395
+ <td>Background operation</td>
396
+ </tr>
397
+ <tr>
398
+ <td><code>ULTRA_POWER_SAVER</code></td>
399
+ <td>60s</td>
400
+ <td>5s</td>
401
+ <td>Minimal battery drain</td>
402
+ </tr>
403
+ </tbody>
404
+ </table>
405
+ <h3>Message Options</h3>
406
+ <pre class="prettyprint source lang-javascript"><code>// Send with options
407
+ await mesh.sendPrivateMessage(peerId, content, {
408
+ // Request delivery acknowledgment
409
+ requiresAck: true,
410
+
411
+ // Enable compression
412
+ compress: true,
413
+
414
+ // Maximum hop count (1-15)
415
+ maxHops: 7,
416
+
417
+ // Priority level
418
+ priority: 'high', // 'normal' | 'high'
419
+ });
420
+ </code></pre>
421
+ <h2>Security Features</h2>
422
+ <h3>Cryptographic Primitives</h3>
423
+ <ul>
424
+ <li><strong>Key Exchange</strong>: X25519 (Curve25519 ECDH)</li>
425
+ <li><strong>Signatures</strong>: Ed25519</li>
426
+ <li><strong>Encryption</strong>: ChaCha20-Poly1305 AEAD</li>
427
+ <li><strong>Hashing</strong>: SHA-256, SHA-512</li>
428
+ <li><strong>Key Derivation</strong>: HKDF</li>
429
+ </ul>
430
+ <h3>Noise Protocol XX Handshake</h3>
431
+ <p>The library implements the Noise XX handshake pattern:</p>
432
+ <pre class="prettyprint source"><code>-> e
433
+ &lt;- e, ee, s, es
434
+ -> s, se
435
+ </code></pre>
436
+ <p>This provides:</p>
437
+ <ul>
438
+ <li>Mutual authentication</li>
439
+ <li>Forward secrecy</li>
440
+ <li>Identity hiding</li>
441
+ </ul>
442
+ <h3>Session Security</h3>
443
+ <ul>
444
+ <li><strong>Automatic Rekeying</strong>: Sessions rekey every hour or after 10,000 messages</li>
445
+ <li><strong>Replay Protection</strong>: Sliding window algorithm with configurable window size</li>
446
+ <li><strong>Nonce Management</strong>: Automatic nonce tracking prevents reuse</li>
447
+ </ul>
448
+ <h3>Identity Verification</h3>
449
+ <p>Verify peer identities out-of-band using fingerprints:</p>
450
+ <pre class="prettyprint source lang-javascript"><code>// Get your fingerprint to share
451
+ const myFingerprint = mesh.getFingerprint();
452
+ // Format: &quot;A1B2 C3D4 E5F6 G7H8 I9J0 K1L2 M3N4 O5P6&quot;
453
+
454
+ // Verify a peer after out-of-band confirmation
455
+ mesh.verifyPeer(peerId, theirFingerprint);
456
+
457
+ // Check if a peer is verified
458
+ const peer = mesh.getPeer(peerId);
459
+ console.log('Verified:', peer.verificationStatus === 'verified');
460
+ </code></pre>
461
+ <h2>Protocol Details</h2>
462
+ <h3>Message Header Format</h3>
463
+ <p>The library uses an optimized 24-32 byte header:</p>
464
+ <table>
465
+ <thead>
466
+ <tr>
467
+ <th>Field</th>
468
+ <th>Size</th>
469
+ <th>Description</th>
470
+ </tr>
471
+ </thead>
472
+ <tbody>
473
+ <tr>
474
+ <td>version</td>
475
+ <td>1</td>
476
+ <td>Protocol version</td>
477
+ </tr>
478
+ <tr>
479
+ <td>type</td>
480
+ <td>1</td>
481
+ <td>Message type</td>
482
+ </tr>
483
+ <tr>
484
+ <td>flags</td>
485
+ <td>1</td>
486
+ <td>Feature flags</td>
487
+ </tr>
488
+ <tr>
489
+ <td>ttl</td>
490
+ <td>1</td>
491
+ <td>Hop count + max hops</td>
492
+ </tr>
493
+ <tr>
494
+ <td>timestamp</td>
495
+ <td>8</td>
496
+ <td>Unix timestamp (ms)</td>
497
+ </tr>
498
+ <tr>
499
+ <td>payloadLength</td>
500
+ <td>2</td>
501
+ <td>Payload size</td>
502
+ </tr>
503
+ <tr>
504
+ <td>fragmentIndex</td>
505
+ <td>1</td>
506
+ <td>Fragment index</td>
507
+ </tr>
508
+ <tr>
509
+ <td>fragmentTotal</td>
510
+ <td>1</td>
511
+ <td>Total fragments</td>
512
+ </tr>
513
+ <tr>
514
+ <td>senderId</td>
515
+ <td>8</td>
516
+ <td>Truncated peer ID</td>
517
+ </tr>
518
+ <tr>
519
+ <td>recipientId</td>
520
+ <td>8</td>
521
+ <td>(Optional) Recipient ID</td>
522
+ </tr>
523
+ </tbody>
524
+ </table>
525
+ <h3>Message Types</h3>
526
+ <table>
527
+ <thead>
528
+ <tr>
529
+ <th>Category</th>
530
+ <th>Types</th>
531
+ </tr>
532
+ </thead>
533
+ <tbody>
534
+ <tr>
535
+ <td>Data</td>
536
+ <td>TEXT, TEXT_ACK, BINARY, BINARY_ACK</td>
537
+ </tr>
538
+ <tr>
539
+ <td>Handshake</td>
540
+ <td>HANDSHAKE_INIT, HANDSHAKE_RESPONSE, HANDSHAKE_FINAL</td>
541
+ </tr>
542
+ <tr>
543
+ <td>Discovery</td>
544
+ <td>PEER_ANNOUNCE, PEER_REQUEST, PEER_RESPONSE, IDENTITY_ANNOUNCE</td>
545
+ </tr>
546
+ <tr>
547
+ <td>Channels</td>
548
+ <td>CHANNEL_JOIN, CHANNEL_LEAVE, CHANNEL_MESSAGE</td>
549
+ </tr>
550
+ <tr>
551
+ <td>Private</td>
552
+ <td>PRIVATE_MESSAGE, PRIVATE_ACK, READ_RECEIPT</td>
553
+ </tr>
554
+ <tr>
555
+ <td>Control</td>
556
+ <td>HEARTBEAT, PING, PONG</td>
557
+ </tr>
558
+ <tr>
559
+ <td>Fragments</td>
560
+ <td>FRAGMENT_START, FRAGMENT_CONTINUE, FRAGMENT_END</td>
561
+ </tr>
562
+ </tbody>
563
+ </table>
564
+ <h2>Error Handling</h2>
565
+ <p>The library provides detailed error classes:</p>
566
+ <pre class="prettyprint source lang-javascript"><code>const {
567
+ MeshError,
568
+ CryptoError,
569
+ ConnectionError,
570
+ HandshakeError,
571
+ MessageError,
572
+ FragmentError,
573
+ TrustError,
574
+ RetryError
575
+ } = require('react-native-ble-mesh/errors');
576
+
577
+ mesh.on('error', (error) => {
578
+ if (error instanceof CryptoError) {
579
+ console.error('Crypto error:', error.code, error.message);
580
+ } else if (error instanceof ConnectionError) {
581
+ console.error('Connection error:', error.code, error.message);
582
+ } else if (error instanceof TrustError) {
583
+ console.error('Trust error:', error.code, error.message);
584
+ }
585
+
586
+ // All errors have these properties
587
+ console.log('Error code:', error.code);
588
+ console.log('Category:', error.category);
589
+ console.log('Recoverable:', error.recoverable);
590
+ console.log('Details:', error.details);
591
+ });
592
+ </code></pre>
593
+ <h3>Error Codes</h3>
594
+ <table>
595
+ <thead>
596
+ <tr>
597
+ <th>Category</th>
598
+ <th>Codes</th>
599
+ </tr>
600
+ </thead>
601
+ <tbody>
602
+ <tr>
603
+ <td>Crypto</td>
604
+ <td>E_CRYPTO_001 - E_CRYPTO_006</td>
605
+ </tr>
606
+ <tr>
607
+ <td>Connection</td>
608
+ <td>E_CONN_001 - E_CONN_003</td>
609
+ </tr>
610
+ <tr>
611
+ <td>Handshake</td>
612
+ <td>E_HAND_001 - E_HAND_003</td>
613
+ </tr>
614
+ <tr>
615
+ <td>Message</td>
616
+ <td>E_MSG_001 - E_MSG_004</td>
617
+ </tr>
618
+ <tr>
619
+ <td>Fragment</td>
620
+ <td>E_FRAG_001 - E_FRAG_004</td>
621
+ </tr>
622
+ <tr>
623
+ <td>Trust</td>
624
+ <td>E_TRUST_001 - E_TRUST_004</td>
625
+ </tr>
626
+ <tr>
627
+ <td>Retry</td>
628
+ <td>E_RETRY_001 - E_RETRY_003</td>
629
+ </tr>
630
+ </tbody>
631
+ </table>
632
+ <h2>Platform Support</h2>
633
+ <h3>React Native</h3>
634
+ <pre class="prettyprint source lang-javascript"><code>const { MeshService, BLETransport } = require('react-native-ble-mesh');
635
+ const { RNBLEAdapter } = require('react-native-ble-mesh/adapters');
636
+
637
+ const transport = new BLETransport({
638
+ adapter: new RNBLEAdapter(),
639
+ });
640
+ </code></pre>
641
+ <p><strong>Required permissions (iOS):</strong></p>
642
+ <ul>
643
+ <li>NSBluetoothAlwaysUsageDescription</li>
644
+ <li>NSBluetoothPeripheralUsageDescription</li>
645
+ </ul>
646
+ <p><strong>Required permissions (Android):</strong></p>
647
+ <ul>
648
+ <li>BLUETOOTH</li>
649
+ <li>BLUETOOTH_ADMIN</li>
650
+ <li>BLUETOOTH_SCAN</li>
651
+ <li>BLUETOOTH_ADVERTISE</li>
652
+ <li>BLUETOOTH_CONNECT</li>
653
+ <li>ACCESS_FINE_LOCATION</li>
654
+ </ul>
655
+ <h3>Node.js</h3>
656
+ <pre class="prettyprint source lang-javascript"><code>const { MeshService, BLETransport } = require('react-native-ble-mesh');
657
+ const { NodeBLEAdapter } = require('react-native-ble-mesh/adapters');
658
+
659
+ const transport = new BLETransport({
660
+ adapter: new NodeBLEAdapter(),
661
+ });
662
+ </code></pre>
663
+ <h2>Examples</h2>
664
+ <h3>Basic Chat Application</h3>
665
+ <pre class="prettyprint source lang-javascript"><code>const { MeshService, BLETransport, MemoryStorage } = require('react-native-ble-mesh');
666
+
667
+ class ChatApp {
668
+ constructor() {
669
+ this.mesh = new MeshService();
670
+ this.messages = [];
671
+ }
672
+
673
+ async start(displayName) {
674
+ await this.mesh.initialize({
675
+ displayName,
676
+ storage: new MemoryStorage(),
677
+ });
678
+
679
+ const transport = new BLETransport();
680
+ await this.mesh.start(transport);
681
+
682
+ this.setupEventHandlers();
683
+ console.log('Chat started! Your fingerprint:', this.mesh.getFingerprint());
684
+ }
685
+
686
+ setupEventHandlers() {
687
+ this.mesh.on('peer-discovered', (peer) => {
688
+ console.log(`[+] Discovered: ${peer.getDisplayName()}`);
689
+ });
690
+
691
+ this.mesh.on('private-message', (message) => {
692
+ this.messages.push(message);
693
+ console.log(`[${message.senderId.slice(0, 8)}]: ${message.content}`);
694
+ });
695
+
696
+ this.mesh.on('message-delivered', ({ messageId }) => {
697
+ console.log(`[OK] Delivered: ${messageId.slice(0, 8)}`);
698
+ });
699
+ }
700
+
701
+ async sendMessage(peerId, content) {
702
+ return await this.mesh.sendPrivateMessage(peerId, content, {
703
+ requiresAck: true,
704
+ });
705
+ }
706
+
707
+ getPeers() {
708
+ return this.mesh.getPeers();
709
+ }
710
+
711
+ verifyPeer(peerId, fingerprint) {
712
+ this.mesh.verifyPeer(peerId, fingerprint);
713
+ }
714
+
715
+ async stop() {
716
+ await this.mesh.stop();
717
+ await this.mesh.destroy();
718
+ }
719
+ }
720
+
721
+ // Usage
722
+ const chat = new ChatApp();
723
+ await chat.start('Alice');
724
+
725
+ // List discovered peers
726
+ const peers = chat.getPeers();
727
+ peers.forEach(p => console.log(p.id, p.getDisplayName()));
728
+
729
+ // Send a message
730
+ await chat.sendMessage(peers[0].id, 'Hello!');
731
+ </code></pre>
732
+ <h3>Multi-Hop Messaging</h3>
733
+ <pre class="prettyprint source lang-javascript"><code>// Messages automatically route through multiple hops
734
+ const messageId = await mesh.sendPrivateMessage(distantPeerId, 'Hello distant peer!', {
735
+ maxHops: 10, // Allow up to 10 hops
736
+ requiresAck: true,
737
+ });
738
+
739
+ // Track routing statistics
740
+ const stats = mesh.getStats();
741
+ console.log('Messages relayed:', stats.messagesRelayed);
742
+ console.log('Average hop count:', stats.averageHopCount);
743
+ </code></pre>
744
+ <h3>Secure File Transfer</h3>
745
+ <pre class="prettyprint source lang-javascript"><code>const fs = require('fs');
746
+ const path = require('path');
747
+
748
+ async function sendFile(mesh, peerId, filePath) {
749
+ const fileData = fs.readFileSync(filePath);
750
+ const fileName = path.basename(filePath);
751
+
752
+ // The library automatically handles:
753
+ // - Compression for large payloads
754
+ // - Fragmentation for BLE MTU limits
755
+ // - Encryption with peer's session key
756
+ // - Automatic retry on failure
757
+
758
+ const messageId = await mesh.sendPrivateMessage(peerId, {
759
+ type: 'file',
760
+ name: fileName,
761
+ data: fileData.toString('base64'),
762
+ size: fileData.length,
763
+ }, {
764
+ compress: true,
765
+ requiresAck: true,
766
+ });
767
+
768
+ console.log('File transfer initiated:', messageId);
769
+ }
770
+ </code></pre>
771
+ <h2>Testing</h2>
772
+ <p>Run the test suite:</p>
773
+ <pre class="prettyprint source lang-bash"><code>npm test
774
+ </code></pre>
775
+ <p>Run with coverage:</p>
776
+ <pre class="prettyprint source lang-bash"><code>npm run test:coverage
777
+ </code></pre>
778
+ <p>Run specific test files:</p>
779
+ <pre class="prettyprint source lang-bash"><code>npm test -- __tests__/crypto/sha256.test.js
780
+ npm test -- __tests__/integration/handshake.test.js
781
+ </code></pre>
782
+ <h2>Project Structure</h2>
783
+ <pre class="prettyprint source"><code>react-native-ble-mesh/
784
+ ├── src/
785
+ │ ├── index.js # Main exports
786
+ │ ├── constants/ # Protocol, BLE, crypto constants
787
+ │ ├── errors/ # Custom error classes
788
+ │ ├── crypto/ # Cryptographic implementations
789
+ │ │ ├── noise/ # Noise Protocol (handshake, session)
790
+ │ │ └── keys/ # Key management
791
+ │ ├── protocol/ # Message serialization/deserialization
792
+ │ ├── mesh/ # Mesh networking logic
793
+ │ │ ├── router/ # Message routing
794
+ │ │ ├── dedup/ # Duplicate detection
795
+ │ │ ├── fragment/ # Message fragmentation
796
+ │ │ └── peer/ # Peer management
797
+ │ ├── transport/ # BLE transport layer
798
+ │ ├── storage/ # Persistence adapters
799
+ │ ├── utils/ # Utility functions
800
+ │ └── service/ # High-level service orchestration
801
+ ├── __tests__/ # Test files
802
+ ├── docs/ # Documentation
803
+ ├── examples/ # Example applications
804
+ └── package.json
805
+ </code></pre>
806
+ <h2>Contributing</h2>
807
+ <ol>
808
+ <li>Fork the repository</li>
809
+ <li>Create your feature branch (<code>git checkout -b feature/amazing-feature</code>)</li>
810
+ <li>Run tests and linting (<code>npm run validate</code>)</li>
811
+ <li>Commit your changes (<code>git commit -m 'Add amazing feature'</code>)</li>
812
+ <li>Push to the branch (<code>git push origin feature/amazing-feature</code>)</li>
813
+ <li>Open a Pull Request</li>
814
+ </ol>
815
+ <h3>Code Style</h3>
816
+ <ul>
817
+ <li>Maximum 200 lines per file</li>
818
+ <li>JSDoc comments on all public APIs</li>
819
+ <li>ESLint with strict rules</li>
820
+ <li>100% test coverage on crypto modules</li>
821
+ <li>
822
+ <blockquote>
823
+ <p>80% coverage on other modules</p>
824
+ </blockquote>
825
+ </li>
826
+ </ul>
827
+ <h2>Documentation</h2>
828
+ <ul>
829
+ <li><a href="docs/API.md">API Reference</a> - Complete API documentation</li>
830
+ <li><a href="docs/ARCHITECTURE.md">Architecture</a> - System design and module structure</li>
831
+ <li><a href="docs/SECURITY.md">Security</a> - Threat model and security properties</li>
832
+ <li><a href="docs/PROTOCOL.md">Protocol</a> - Wire format and message types</li>
833
+ </ul>
834
+ <h2>License</h2>
835
+ <p>This project is licensed under the MIT License - see the <a href="LICENSE">LICENSE</a> file for details.</p>
836
+ <h2>Acknowledgments</h2>
837
+ <p>This project is inspired by <a href="https://github.com/permissionlesstech/bitchat">bitchat</a>.</p>
838
+ <ul>
839
+ <li><a href="https://noiseprotocol.org/">Noise Protocol Framework</a> - Cryptographic handshake pattern</li>
840
+ <li><a href="https://github.com/Polidea/react-native-ble-plx">react-native-ble-plx</a> - React Native BLE library</li>
841
+ <li><a href="https://github.com/abandonware/noble">Noble</a> - Node.js BLE library</li>
842
+ </ul></article>
843
+ </section>
844
+
845
+
846
+
847
+
848
+
849
+
850
+ </div>
851
+
852
+ <nav>
853
+ <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-audio_buffer.html">audio/buffer</a></li><li><a href="module-audio_buffer_FrameBuffer.html">audio/buffer/FrameBuffer</a></li><li><a href="module-audio_buffer_JitterBuffer.html">audio/buffer/JitterBuffer</a></li><li><a href="module-audio_codec.html">audio/codec</a></li><li><a href="module-audio_codec_LC3Codec.html">audio/codec/LC3Codec</a></li><li><a href="module-audio_codec_LC3Decoder.html">audio/codec/LC3Decoder</a></li><li><a href="module-audio_codec_LC3Encoder.html">audio/codec/LC3Encoder</a></li><li><a href="module-audio_session.html">audio/session</a></li><li><a href="module-audio_session_AudioSession.html">audio/session/AudioSession</a></li><li><a href="module-audio_session_VoiceMessage.html">audio/session/VoiceMessage</a></li><li><a href="module-audio_transport.html">audio/transport</a></li><li><a href="module-audio_transport_AudioFragmenter.html">audio/transport/AudioFragmenter</a></li><li><a href="module-audio_transport_AudioFramer.html">audio/transport/AudioFramer</a></li><li><a href="module-constants.html">constants</a></li><li><a href="module-constants_audio.html">constants/audio</a></li><li><a href="module-constants_ble.html">constants/ble</a></li><li><a href="module-constants_crypto.html">constants/crypto</a></li><li><a href="module-constants_errors.html">constants/errors</a></li><li><a href="module-constants_events.html">constants/events</a></li><li><a href="module-constants_protocol.html">constants/protocol</a></li><li><a href="module-crypto.html">crypto</a></li><li><a href="module-crypto_aead.html">crypto/aead</a></li><li><a href="module-crypto_chacha20.html">crypto/chacha20</a></li><li><a href="module-crypto_hkdf.html">crypto/hkdf</a></li><li><a href="module-crypto_hmac.html">crypto/hmac</a></li><li><a href="module-crypto_keys.html">crypto/keys</a></li><li><a href="module-crypto_keys_KeyManager.html">crypto/keys/KeyManager</a></li><li><a href="module-crypto_keys_KeyPair.html">crypto/keys/KeyPair</a></li><li><a href="module-crypto_keys_SecureStorage.html">crypto/keys/SecureStorage</a></li><li><a href="module-crypto_noise.html">crypto/noise</a></li><li><a href="module-crypto_noise_handshake.html">crypto/noise/handshake</a></li><li><a href="module-crypto_noise_session.html">crypto/noise/session</a></li><li><a href="module-crypto_noise_state.html">crypto/noise/state</a></li><li><a href="module-crypto_poly1305.html">crypto/poly1305</a></li><li><a href="module-crypto_sha256.html">crypto/sha256</a></li><li><a href="module-crypto_x25519.html">crypto/x25519</a></li><li><a href="module-errors.html">errors</a></li><li><a href="module-errors_AudioError.html">errors/AudioError</a></li><li><a href="module-errors_ConnectionError.html">errors/ConnectionError</a></li><li><a href="module-errors_CryptoError.html">errors/CryptoError</a></li><li><a href="module-errors_HandshakeError.html">errors/HandshakeError</a></li><li><a href="module-errors_MeshError.html">errors/MeshError</a></li><li><a href="module-errors_MessageError.html">errors/MessageError</a></li><li><a href="module-errors_ValidationError.html">errors/ValidationError</a></li><li><a href="module-hooks.html">hooks</a></li><li><a href="module-hooks_AppStateManager.html">hooks/AppStateManager</a></li><li><a href="module-hooks_useMesh.html">hooks/useMesh</a></li><li><a href="module-hooks_useMessages.html">hooks/useMessages</a></li><li><a href="module-hooks_usePeers.html">hooks/usePeers</a></li><li><a href="module-mesh.html">mesh</a></li><li><a href="module-mesh_dedup.html">mesh/dedup</a></li><li><a href="module-mesh_dedup_BloomFilter.html">mesh/dedup/BloomFilter</a></li><li><a href="module-mesh_dedup_DedupManager.html">mesh/dedup/DedupManager</a></li><li><a href="module-mesh_dedup_MessageCache.html">mesh/dedup/MessageCache</a></li><li><a href="module-mesh_fragment.html">mesh/fragment</a></li><li><a href="module-mesh_fragment_Assembler.html">mesh/fragment/Assembler</a></li><li><a href="module-mesh_fragment_Fragmenter.html">mesh/fragment/Fragmenter</a></li><li><a href="module-mesh_peer.html">mesh/peer</a></li><li><a href="module-mesh_peer_Peer.html">mesh/peer/Peer</a></li><li><a href="module-mesh_peer_PeerDiscovery.html">mesh/peer/PeerDiscovery</a></li><li><a href="module-mesh_peer_PeerManager.html">mesh/peer/PeerManager</a></li><li><a href="module-mesh_router.html">mesh/router</a></li><li><a href="module-mesh_router_MessageRouter.html">mesh/router/MessageRouter</a></li><li><a href="module-mesh_router_PathFinder.html">mesh/router/PathFinder</a></li><li><a href="module-mesh_router_RouteTable.html">mesh/router/RouteTable</a></li><li><a href="module-protocol.html">protocol</a></li><li><a href="module-protocol_crc32.html">protocol/crc32</a></li><li><a href="module-protocol_deserializer.html">protocol/deserializer</a></li><li><a href="module-protocol_header.html">protocol/header</a></li><li><a href="module-protocol_message.html">protocol/message</a></li><li><a href="module-protocol_serializer.html">protocol/serializer</a></li><li><a href="module-protocol_validator.html">protocol/validator</a></li><li><a href="module-rn-ble-mesh.html">rn-ble-mesh</a></li><li><a href="module-service.html">service</a></li><li><a href="module-service_HandshakeManager.html">service/HandshakeManager</a></li><li><a href="module-service_MeshService.html">service/MeshService</a></li><li><a href="module-service_SessionManager.html">service/SessionManager</a></li><li><a href="module-service_audio.html">service/audio</a></li><li><a href="module-service_audio_AudioManager.html">service/audio/AudioManager</a></li><li><a href="module-service_text.html">service/text</a></li><li><a href="module-service_text_TextManager.html">service/text/TextManager</a></li><li><a href="module-service_text_broadcast.html">service/text/broadcast</a></li><li><a href="module-service_text_broadcast_BroadcastManager.html">service/text/broadcast/BroadcastManager</a></li><li><a href="module-service_text_channel.html">service/text/channel</a></li><li><a href="module-service_text_channel_Channel.html">service/text/channel/Channel</a></li><li><a href="module-service_text_channel_ChannelManager.html">service/text/channel/ChannelManager</a></li><li><a href="module-service_text_message.html">service/text/message</a></li><li><a href="module-service_text_message_TextMessage.html">service/text/message/TextMessage</a></li><li><a href="module-service_text_message_TextSerializer.html">service/text/message/TextSerializer</a></li><li><a href="module-storage.html">storage</a></li><li><a href="module-storage_AsyncStorageAdapter.html">storage/AsyncStorageAdapter</a></li><li><a href="module-storage_MemoryStorage.html">storage/MemoryStorage</a></li><li><a href="module-storage_MessageStore.html">storage/MessageStore</a></li><li><a href="module-storage_Storage.html">storage/Storage</a></li><li><a href="module-transport.html">transport</a></li><li><a href="module-transport_BLEAdapter.html">transport/BLEAdapter</a></li><li><a href="module-transport_BLETransport.html">transport/BLETransport</a></li><li><a href="module-transport_MockTransport.html">transport/MockTransport</a></li><li><a href="module-transport_NodeBLEAdapter.html">transport/NodeBLEAdapter</a></li><li><a href="module-transport_RNBLEAdapter.html">transport/RNBLEAdapter</a></li><li><a href="module-transport_Transport.html">transport/Transport</a></li><li><a href="module-transport_adapters.html">transport/adapters</a></li><li><a href="module-transport_adapters_BLEAdapter.html">transport/adapters/BLEAdapter</a></li><li><a href="module-transport_adapters_NodeBLEAdapter.html">transport/adapters/NodeBLEAdapter</a></li><li><a href="module-transport_adapters_RNBLEAdapter.html">transport/adapters/RNBLEAdapter</a></li><li><a href="module-utils.html">utils</a></li><li><a href="module-utils_BoundedMap.html">utils/BoundedMap</a></li><li><a href="module-utils_EventEmitter.html">utils/EventEmitter</a></li><li><a href="module-utils_LRUCache.html">utils/LRUCache</a></li><li><a href="module-utils_RateLimiter.html">utils/RateLimiter</a></li><li><a href="module-utils_TimeoutManager.html">utils/TimeoutManager</a></li><li><a href="module-utils_bytes.html">utils/bytes</a></li><li><a href="module-utils_debug.html">utils/debug</a></li><li><a href="module-utils_encoding.html">utils/encoding</a></li><li><a href="module-utils_retry.html">utils/retry</a></li><li><a href="module-utils_time.html">utils/time</a></li><li><a href="module-utils_uuid.html">utils/uuid</a></li><li><a href="module-utils_validation.html">utils/validation</a></li><li><a href="utils_base64%250A%250AThis%2520implementation%2520avoids%2520string%2520concatenation%2520in%2520loops%2520which%2520is%2520O(n%25C2%25B2).%250AUses%2520array%2520building%2520which%2520is%2520O(n)%2520-%2520critical%2520for%2520React%2520Native%2520performance.module_.html">utils/base64
854
+
855
+ This implementation avoids string concatenation in loops which is O(n²).
856
+ Uses array building which is O(n) - critical for React Native performance.</a></li></ul><h3>Classes</h3><ul><li><a href="module-audio_buffer_FrameBuffer-FrameBuffer.html">FrameBuffer</a></li><li><a href="module-audio_buffer_JitterBuffer-JitterBuffer.html">JitterBuffer</a></li><li><a href="module-audio_codec_LC3Codec-LC3Codec.html">LC3Codec</a></li><li><a href="module-audio_codec_LC3Decoder-LC3Decoder.html">LC3Decoder</a></li><li><a href="module-audio_codec_LC3Encoder-LC3Encoder.html">LC3Encoder</a></li><li><a href="module-audio_session_AudioSession-AudioSession.html">AudioSession</a></li><li><a href="module-audio_session_VoiceMessage-VoiceMessage.html">VoiceMessage</a></li><li><a href="module-audio_session_VoiceMessage-VoiceMessageRecorder.html">VoiceMessageRecorder</a></li><li><a href="module-audio_transport_AudioFragmenter-AudioAssembler.html">AudioAssembler</a></li><li><a href="module-audio_transport_AudioFragmenter-AudioFragmenter.html">AudioFragmenter</a></li><li><a href="module-crypto_keys_KeyManager-KeyManager.html">KeyManager</a></li><li><a href="module-crypto_keys_SecureStorage-MemorySecureStorage.html">MemorySecureStorage</a></li><li><a href="module-crypto_keys_SecureStorage-SecureStorage.html">SecureStorage</a></li><li><a href="module-crypto_noise_handshake-NoiseHandshake.html">NoiseHandshake</a></li><li><a href="module-crypto_noise_session-NoiseSession.html">NoiseSession</a></li><li><a href="module-crypto_noise_state-SymmetricState.html">SymmetricState</a></li><li><a href="module-crypto_sha256-HashContext.html">HashContext</a></li><li><a href="module-errors_AudioError-AudioError.html">AudioError</a></li><li><a href="module-errors_ConnectionError-ConnectionError.html">ConnectionError</a></li><li><a href="module-errors_CryptoError-CryptoError.html">CryptoError</a></li><li><a href="module-errors_HandshakeError-HandshakeError.html">HandshakeError</a></li><li><a href="module-errors_MeshError-MeshError.html">MeshError</a></li><li><a href="module-errors_MessageError-MessageError.html">MessageError</a></li><li><a href="module-errors_ValidationError-ValidationError.html">ValidationError</a></li><li><a href="module-hooks_AppStateManager-AppStateManager.html">AppStateManager</a></li><li><a href="module-mesh_dedup_BloomFilter-BloomFilter.html">BloomFilter</a></li><li><a href="module-mesh_dedup_DedupManager-DedupManager.html">DedupManager</a></li><li><a href="module-mesh_dedup_MessageCache-CacheNode.html">CacheNode</a></li><li><a href="module-mesh_dedup_MessageCache-MessageCache.html">MessageCache</a></li><li><a href="module-mesh_fragment_Assembler-Assembler.html">Assembler</a></li><li><a href="module-mesh_fragment_Assembler-PendingFragmentSet.html">PendingFragmentSet</a></li><li><a href="module-mesh_peer_PeerDiscovery-PeerDiscovery.html">PeerDiscovery</a></li><li><a href="module-mesh_peer_PeerManager-PeerManager.html">PeerManager</a></li><li><a href="module-mesh_peer_Peer-Peer.html">Peer</a></li><li><a href="module-mesh_router_MessageRouter-MessageRouter.html">MessageRouter</a></li><li><a href="module-mesh_router_PathFinder-PathFinder.html">PathFinder</a></li><li><a href="module-mesh_router_RouteTable-RouteTable.html">RouteTable</a></li><li><a href="module-protocol_header-MessageHeader.html">MessageHeader</a></li><li><a href="module-protocol_message-Message.html">Message</a></li><li><a href="module-service_HandshakeManager-HandshakeManager.html">HandshakeManager</a></li><li><a href="module-service_MeshService-MeshService.html">MeshService</a></li><li><a href="module-service_SessionManager-SessionManager.html">SessionManager</a></li><li><a href="module-service_audio_AudioManager-AudioManager.html">AudioManager</a></li><li><a href="module-service_text_TextManager-TextManager.html">TextManager</a></li><li><a href="module-service_text_broadcast_BroadcastManager-BroadcastManager.html">BroadcastManager</a></li><li><a href="module-service_text_channel_ChannelManager-ChannelManager.html">ChannelManager</a></li><li><a href="module-service_text_channel_Channel-Channel.html">Channel</a></li><li><a href="module-service_text_message_TextMessage-TextMessage.html">TextMessage</a></li><li><a href="module-storage_AsyncStorageAdapter-AsyncStorageAdapter.html">AsyncStorageAdapter</a></li><li><a href="module-storage_MemoryStorage-MemoryStorage.html">MemoryStorage</a></li><li><a href="module-storage_MessageStore-MessageStore.html">MessageStore</a></li><li><a href="module-storage_Storage-Storage.html">Storage</a></li><li><a href="module-transport_BLEAdapter-BLEAdapter.html">BLEAdapter</a></li><li><a href="module-transport_BLETransport-BLETransport.html">BLETransport</a></li><li><a href="module-transport_MockTransport-MockTransport.html">MockTransport</a></li><li><a href="module-transport_NodeBLEAdapter-NodeBLEAdapter.html">NodeBLEAdapter</a></li><li><a href="module-transport_RNBLEAdapter-RNBLEAdapter.html">RNBLEAdapter</a></li><li><a href="module-transport_Transport-Transport.html">Transport</a></li><li><a href="module-transport_adapters_BLEAdapter-BLEAdapter.html">BLEAdapter</a></li><li><a href="module-transport_adapters_NodeBLEAdapter-NodeBLEAdapter.html">NodeBLEAdapter</a></li><li><a href="module-transport_adapters_RNBLEAdapter-RNBLEAdapter.html">RNBLEAdapter</a></li><li><a href="module-utils_BoundedMap-BoundedMap.html">BoundedMap</a></li><li><a href="module-utils_EventEmitter-EventEmitter.html">EventEmitter</a></li><li><a href="module-utils_LRUCache-LRUCache.html">LRUCache</a></li><li><a href="module-utils_RateLimiter-RateLimiter.html">RateLimiter</a></li><li><a href="module-utils_TimeoutManager-TimeoutManager.html">TimeoutManager</a></li></ul>
857
+ </nav>
858
+
859
+ <br class="clear">
860
+
861
+ <footer>
862
+ Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.5</a>
863
+ </footer>
864
+
865
+ <script> prettyPrint(); </script>
866
+ <script src="scripts/linenumber.js"> </script>
867
+ </body>
868
+ </html>