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,357 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview BLE transport implementation for mesh network
5
+ * @module transport/BLETransport
6
+ */
7
+
8
+ const Transport = require('./Transport');
9
+ const {
10
+ BLE_SERVICE_UUID,
11
+ BLE_CHARACTERISTIC_TX,
12
+ BLE_CHARACTERISTIC_RX,
13
+ POWER_MODE,
14
+ BLUETOOTH_STATE
15
+ } = require('../constants');
16
+ const { ConnectionError } = require('../errors');
17
+
18
+ /**
19
+ * BLE transport implementation.
20
+ * Handles Bluetooth Low Energy communication with peers.
21
+ *
22
+ * @class BLETransport
23
+ * @extends Transport
24
+ */
25
+ class BLETransport extends Transport {
26
+ /**
27
+ * Creates a new BLETransport instance
28
+ * @param {Object} adapter - BLE adapter instance (RNBLEAdapter or NodeBLEAdapter)
29
+ * @param {Object} [options={}] - Transport options
30
+ * @param {string} [options.powerMode='BALANCED'] - Power mode
31
+ * @param {number} [options.maxPeers=8] - Maximum peers
32
+ * @param {number} [options.connectTimeoutMs=10000] - Connection timeout
33
+ */
34
+ constructor(adapter, options = {}) {
35
+ super(options);
36
+
37
+ if (!adapter) {
38
+ throw new Error('BLE adapter is required');
39
+ }
40
+
41
+ /**
42
+ * BLE adapter instance
43
+ * @type {Object}
44
+ * @private
45
+ */
46
+ this._adapter = adapter;
47
+
48
+ /**
49
+ * Current power mode
50
+ * @type {Object}
51
+ * @private
52
+ */
53
+ this._powerMode = POWER_MODE[options.powerMode] || POWER_MODE.BALANCED;
54
+
55
+ /**
56
+ * Connection timeout in milliseconds
57
+ * @type {number}
58
+ * @private
59
+ */
60
+ this._connectTimeoutMs = options.connectTimeoutMs || 10000;
61
+
62
+ /**
63
+ * Whether scanning is active
64
+ * @type {boolean}
65
+ * @private
66
+ */
67
+ this._isScanning = false;
68
+
69
+ /**
70
+ * Bound event handlers for cleanup
71
+ * @type {Object}
72
+ * @private
73
+ */
74
+ this._handlers = {
75
+ onStateChange: this._handleStateChange.bind(this),
76
+ onDeviceDiscovered: this._handleDeviceDiscovered.bind(this),
77
+ onDeviceDisconnected: this._handleDeviceDisconnected.bind(this)
78
+ };
79
+ }
80
+
81
+ /**
82
+ * Gets whether scanning is active
83
+ * @returns {boolean} True if scanning
84
+ */
85
+ get isScanning() {
86
+ return this._isScanning;
87
+ }
88
+
89
+ /**
90
+ * Starts the BLE transport
91
+ * @returns {Promise<void>}
92
+ * @throws {ConnectionError} If Bluetooth is unavailable
93
+ */
94
+ async start() {
95
+ if (this.isRunning) {
96
+ return;
97
+ }
98
+
99
+ this._setState(Transport.STATE.STARTING);
100
+
101
+ try {
102
+ await this._adapter.initialize();
103
+ const state = await this._adapter.getState();
104
+
105
+ if (state !== BLUETOOTH_STATE.POWERED_ON) {
106
+ throw ConnectionError.fromCode('E100', null, { state });
107
+ }
108
+
109
+ this._adapter.onStateChange(this._handlers.onStateChange);
110
+ this._setState(Transport.STATE.RUNNING);
111
+ } catch (error) {
112
+ this._setState(Transport.STATE.ERROR);
113
+ throw error;
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Stops the BLE transport
119
+ * @returns {Promise<void>}
120
+ */
121
+ async stop() {
122
+ if (this._state === Transport.STATE.STOPPED) {
123
+ return;
124
+ }
125
+
126
+ this._setState(Transport.STATE.STOPPING);
127
+
128
+ try {
129
+ if (this._isScanning) {
130
+ await this.stopScanning();
131
+ }
132
+
133
+ // Disconnect all peers
134
+ const disconnectPromises = [];
135
+ for (const peerId of this._peers.keys()) {
136
+ disconnectPromises.push(this.disconnectFromPeer(peerId));
137
+ }
138
+ await Promise.all(disconnectPromises);
139
+
140
+ await this._adapter.destroy();
141
+ } finally {
142
+ this._setState(Transport.STATE.STOPPED);
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Starts scanning for BLE devices
148
+ * @returns {Promise<void>}
149
+ */
150
+ async startScanning() {
151
+ if (!this.isRunning || this._isScanning) {
152
+ return;
153
+ }
154
+
155
+ await this._adapter.startScan(
156
+ [BLE_SERVICE_UUID],
157
+ this._handlers.onDeviceDiscovered
158
+ );
159
+ this._isScanning = true;
160
+ this.emit('scanStarted');
161
+ }
162
+
163
+ /**
164
+ * Stops scanning for BLE devices
165
+ */
166
+ stopScanning() {
167
+ if (this._isScanning) {
168
+ this._adapter.stopScan();
169
+ this._isScanning = false;
170
+ this.emit('scanStopped');
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Connects to a specific peer device
176
+ * @param {string} peerId - Device ID to connect to
177
+ * @returns {Promise<void>}
178
+ * @throws {ConnectionError} If connection fails
179
+ */
180
+ async connectToPeer(peerId) {
181
+ if (!this.isRunning) {
182
+ throw new Error('Transport is not running');
183
+ }
184
+
185
+ if (this._peers.has(peerId)) {
186
+ throw ConnectionError.fromCode('E206', peerId);
187
+ }
188
+
189
+ if (!this.canAcceptPeer()) {
190
+ throw ConnectionError.fromCode('E203', peerId);
191
+ }
192
+
193
+ try {
194
+ const device = await Promise.race([
195
+ this._adapter.connect(peerId),
196
+ this._createTimeout(this._connectTimeoutMs, 'Connection timeout')
197
+ ]);
198
+
199
+ // Subscribe to notifications
200
+ await this._adapter.subscribe(
201
+ peerId,
202
+ BLE_SERVICE_UUID,
203
+ BLE_CHARACTERISTIC_RX,
204
+ (data) => this._handleData(peerId, data)
205
+ );
206
+
207
+ const connectionInfo = {
208
+ peerId,
209
+ device,
210
+ connectedAt: Date.now()
211
+ };
212
+
213
+ this._peers.set(peerId, connectionInfo);
214
+ this.emit('peerConnected', { peerId, rssi: device.rssi || -50 });
215
+ } catch (error) {
216
+ if (error.message === 'Connection timeout') {
217
+ throw ConnectionError.connectionTimeout(peerId);
218
+ }
219
+ throw ConnectionError.connectionFailed(peerId, { cause: error.message });
220
+ }
221
+ }
222
+
223
+ /**
224
+ * Disconnects from a specific peer
225
+ * @param {string} peerId - Peer ID to disconnect from
226
+ * @returns {Promise<void>}
227
+ */
228
+ async disconnectFromPeer(peerId) {
229
+ if (!this._peers.has(peerId)) {
230
+ return;
231
+ }
232
+
233
+ try {
234
+ await this._adapter.disconnect(peerId);
235
+ } finally {
236
+ this._peers.delete(peerId);
237
+ this.emit('peerDisconnected', { peerId, reason: 'user_request' });
238
+ }
239
+ }
240
+
241
+ /**
242
+ * Sends data to a specific peer
243
+ * @param {string} peerId - Target peer ID
244
+ * @param {Uint8Array} data - Data to send
245
+ * @returns {Promise<void>}
246
+ * @throws {ConnectionError} If peer is not connected
247
+ */
248
+ async send(peerId, data) {
249
+ if (!this.isRunning) {
250
+ throw new Error('Transport is not running');
251
+ }
252
+
253
+ if (!this._peers.has(peerId)) {
254
+ throw ConnectionError.fromCode('E207', peerId);
255
+ }
256
+
257
+ await this._adapter.write(
258
+ peerId,
259
+ BLE_SERVICE_UUID,
260
+ BLE_CHARACTERISTIC_TX,
261
+ data
262
+ );
263
+ }
264
+
265
+ /**
266
+ * Broadcasts data to all connected peers
267
+ * @param {Uint8Array} data - Data to broadcast
268
+ * @returns {Promise<string[]>} Array of peer IDs that received the broadcast
269
+ */
270
+ async broadcast(data) {
271
+ if (!this.isRunning) {
272
+ throw new Error('Transport is not running');
273
+ }
274
+
275
+ const peerIds = this.getConnectedPeers();
276
+ const results = await Promise.allSettled(
277
+ peerIds.map(peerId => this.send(peerId, data))
278
+ );
279
+
280
+ return peerIds.filter((_, i) => results[i].status === 'fulfilled');
281
+ }
282
+
283
+ /**
284
+ * Sets the power mode for BLE operations
285
+ * @param {string} modeName - Power mode name (PERFORMANCE, BALANCED, POWER_SAVER)
286
+ */
287
+ setPowerMode(modeName) {
288
+ const mode = POWER_MODE[modeName];
289
+ if (mode) {
290
+ this._powerMode = mode;
291
+ }
292
+ }
293
+
294
+ /**
295
+ * Handles Bluetooth state changes
296
+ * @param {string} state - New Bluetooth state
297
+ * @private
298
+ */
299
+ _handleStateChange(state) {
300
+ this.emit('bluetoothState', { state });
301
+
302
+ if (state !== BLUETOOTH_STATE.POWERED_ON && this.isRunning) {
303
+ this._setState(Transport.STATE.ERROR);
304
+ this.emit('error', { error: ConnectionError.fromCode('E102') });
305
+ }
306
+ }
307
+
308
+ /**
309
+ * Handles discovered BLE devices
310
+ * @param {Object} device - Discovered device info
311
+ * @private
312
+ */
313
+ _handleDeviceDiscovered(device) {
314
+ this.emit('deviceDiscovered', {
315
+ peerId: device.id,
316
+ name: device.name,
317
+ rssi: device.rssi
318
+ });
319
+ }
320
+
321
+ /**
322
+ * Handles device disconnection events
323
+ * @param {string} peerId - Disconnected peer ID
324
+ * @private
325
+ */
326
+ _handleDeviceDisconnected(peerId) {
327
+ if (this._peers.has(peerId)) {
328
+ this._peers.delete(peerId);
329
+ this.emit('peerDisconnected', { peerId, reason: 'connection_lost' });
330
+ }
331
+ }
332
+
333
+ /**
334
+ * Handles incoming data from a peer
335
+ * @param {string} peerId - Source peer ID
336
+ * @param {Uint8Array} data - Received data
337
+ * @private
338
+ */
339
+ _handleData(peerId, data) {
340
+ this.emit('message', { peerId, data: new Uint8Array(data) });
341
+ }
342
+
343
+ /**
344
+ * Creates a timeout promise
345
+ * @param {number} ms - Timeout in milliseconds
346
+ * @param {string} message - Error message
347
+ * @returns {Promise<never>}
348
+ * @private
349
+ */
350
+ _createTimeout(ms, message) {
351
+ return new Promise((_, reject) => {
352
+ setTimeout(() => reject(new Error(message)), ms);
353
+ });
354
+ }
355
+ }
356
+
357
+ module.exports = BLETransport;
@@ -0,0 +1,285 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Mock transport for testing BLE Mesh Network
5
+ * @module transport/MockTransport
6
+ */
7
+
8
+ const Transport = require('./Transport');
9
+
10
+ /**
11
+ * Mock transport for testing purposes.
12
+ * Simulates peer connections and message passing without real BLE hardware.
13
+ *
14
+ * @class MockTransport
15
+ * @extends Transport
16
+ */
17
+ class MockTransport extends Transport {
18
+ /**
19
+ * Creates a new MockTransport instance
20
+ * @param {Object} [options={}] - Transport options
21
+ * @param {number} [options.latencyMs=10] - Simulated latency in ms
22
+ * @param {number} [options.maxPeers=8] - Maximum peers
23
+ */
24
+ constructor(options = {}) {
25
+ super(options);
26
+
27
+ /**
28
+ * Simulated latency in milliseconds
29
+ * @type {number}
30
+ * @private
31
+ */
32
+ this._latencyMs = options.latencyMs || 10;
33
+
34
+ /**
35
+ * Message log for debugging
36
+ * @type {Array<Object>}
37
+ * @private
38
+ */
39
+ this._messageLog = [];
40
+
41
+ /**
42
+ * Linked mock transports for peer simulation
43
+ * @type {Map<string, MockTransport>}
44
+ * @private
45
+ */
46
+ this._linkedTransports = new Map();
47
+
48
+ /**
49
+ * Local peer ID for this transport
50
+ * @type {string|null}
51
+ * @private
52
+ */
53
+ this._localPeerId = options.localPeerId || null;
54
+ }
55
+
56
+ /**
57
+ * Gets the local peer ID
58
+ * @returns {string|null} Local peer ID
59
+ */
60
+ get localPeerId() {
61
+ return this._localPeerId;
62
+ }
63
+
64
+ /**
65
+ * Sets the local peer ID
66
+ * @param {string} peerId - New local peer ID
67
+ */
68
+ set localPeerId(peerId) {
69
+ this._localPeerId = peerId;
70
+ }
71
+
72
+ /**
73
+ * Starts the mock transport
74
+ * @returns {Promise<void>}
75
+ */
76
+ async start() {
77
+ if (this.isRunning) {
78
+ return;
79
+ }
80
+ this._setState(Transport.STATE.STARTING);
81
+ await this._delay(this._latencyMs);
82
+ this._setState(Transport.STATE.RUNNING);
83
+ }
84
+
85
+ /**
86
+ * Stops the mock transport
87
+ * @returns {Promise<void>}
88
+ */
89
+ async stop() {
90
+ if (this._state === Transport.STATE.STOPPED) {
91
+ return;
92
+ }
93
+ this._setState(Transport.STATE.STOPPING);
94
+
95
+ // Disconnect all peers
96
+ for (const peerId of this._peers.keys()) {
97
+ this._disconnectPeer(peerId, 'transport_stopped');
98
+ }
99
+
100
+ await this._delay(this._latencyMs);
101
+ this._setState(Transport.STATE.STOPPED);
102
+ }
103
+
104
+ /**
105
+ * Sends data to a specific peer
106
+ * @param {string} peerId - Target peer ID
107
+ * @param {Uint8Array} data - Data to send
108
+ * @returns {Promise<void>}
109
+ * @throws {Error} If peer is not connected
110
+ */
111
+ async send(peerId, data) {
112
+ if (!this.isRunning) {
113
+ throw new Error('Transport is not running');
114
+ }
115
+
116
+ if (!this._peers.has(peerId)) {
117
+ throw new Error(`Peer ${peerId} is not connected`);
118
+ }
119
+
120
+ this._logMessage('send', peerId, data);
121
+ await this._delay(this._latencyMs);
122
+
123
+ // Deliver to linked transport if available
124
+ const linkedTransport = this._linkedTransports.get(peerId);
125
+ if (linkedTransport && linkedTransport.isRunning) {
126
+ linkedTransport._receiveMessage(this._localPeerId, data);
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Broadcasts data to all connected peers
132
+ * @param {Uint8Array} data - Data to broadcast
133
+ * @returns {Promise<string[]>} Array of peer IDs that received the broadcast
134
+ */
135
+ async broadcast(data) {
136
+ if (!this.isRunning) {
137
+ throw new Error('Transport is not running');
138
+ }
139
+
140
+ const peerIds = this.getConnectedPeers();
141
+ await Promise.all(peerIds.map(peerId => this.send(peerId, data)));
142
+ return peerIds;
143
+ }
144
+
145
+ /**
146
+ * Simulates receiving a message from a peer
147
+ * @param {string} peerId - Source peer ID
148
+ * @param {Uint8Array} data - Received data
149
+ */
150
+ simulateMessage(peerId, data) {
151
+ if (!this.isRunning) {
152
+ return;
153
+ }
154
+ this._receiveMessage(peerId, data);
155
+ }
156
+
157
+ /**
158
+ * Simulates a peer connection
159
+ * @param {string} peerId - Connecting peer ID
160
+ * @param {Object} [info={}] - Connection info (rssi, etc.)
161
+ */
162
+ simulatePeerConnect(peerId, info = {}) {
163
+ if (!this.isRunning || this._peers.has(peerId)) {
164
+ return;
165
+ }
166
+
167
+ if (!this.canAcceptPeer()) {
168
+ return;
169
+ }
170
+
171
+ const connectionInfo = {
172
+ peerId,
173
+ rssi: info.rssi || -50,
174
+ connectedAt: Date.now(),
175
+ ...info
176
+ };
177
+
178
+ this._peers.set(peerId, connectionInfo);
179
+ this.emit('peerConnected', { peerId, rssi: connectionInfo.rssi });
180
+ }
181
+
182
+ /**
183
+ * Simulates a peer disconnection
184
+ * @param {string} peerId - Disconnecting peer ID
185
+ * @param {string} [reason='user_request'] - Disconnection reason
186
+ */
187
+ simulatePeerDisconnect(peerId, reason = 'user_request') {
188
+ this._disconnectPeer(peerId, reason);
189
+ }
190
+
191
+ /**
192
+ * Links this transport to another for bidirectional communication
193
+ * @param {MockTransport} otherTransport - Transport to link
194
+ */
195
+ linkTo(otherTransport) {
196
+ if (!(otherTransport instanceof MockTransport)) {
197
+ throw new Error('Can only link to MockTransport instances');
198
+ }
199
+
200
+ const otherPeerId = otherTransport.localPeerId;
201
+ if (!otherPeerId) {
202
+ throw new Error('Other transport must have a localPeerId set');
203
+ }
204
+
205
+ this._linkedTransports.set(otherPeerId, otherTransport);
206
+ otherTransport._linkedTransports.set(this._localPeerId, this);
207
+ }
208
+
209
+ /**
210
+ * Unlinks this transport from another
211
+ * @param {MockTransport} otherTransport - Transport to unlink
212
+ */
213
+ unlinkFrom(otherTransport) {
214
+ const otherPeerId = otherTransport.localPeerId;
215
+ this._linkedTransports.delete(otherPeerId);
216
+ otherTransport._linkedTransports.delete(this._localPeerId);
217
+ }
218
+
219
+ /**
220
+ * Gets the message log
221
+ * @returns {Array<Object>} Message log entries
222
+ */
223
+ getMessageLog() {
224
+ return [...this._messageLog];
225
+ }
226
+
227
+ /**
228
+ * Clears the message log
229
+ */
230
+ clearMessageLog() {
231
+ this._messageLog = [];
232
+ }
233
+
234
+ /**
235
+ * Internal method to receive a message
236
+ * @param {string} peerId - Source peer ID
237
+ * @param {Uint8Array} data - Received data
238
+ * @private
239
+ */
240
+ _receiveMessage(peerId, data) {
241
+ this._logMessage('receive', peerId, data);
242
+ this.emit('message', { peerId, data: new Uint8Array(data) });
243
+ }
244
+
245
+ /**
246
+ * Internal method to disconnect a peer
247
+ * @param {string} peerId - Peer to disconnect
248
+ * @param {string} reason - Disconnect reason
249
+ * @private
250
+ */
251
+ _disconnectPeer(peerId, reason) {
252
+ if (this._peers.has(peerId)) {
253
+ this._peers.delete(peerId);
254
+ this.emit('peerDisconnected', { peerId, reason });
255
+ }
256
+ }
257
+
258
+ /**
259
+ * Logs a message for debugging
260
+ * @param {string} type - Message type (send/receive)
261
+ * @param {string} peerId - Peer ID
262
+ * @param {Uint8Array} data - Message data
263
+ * @private
264
+ */
265
+ _logMessage(type, peerId, data) {
266
+ this._messageLog.push({
267
+ type,
268
+ peerId,
269
+ data: new Uint8Array(data),
270
+ timestamp: Date.now()
271
+ });
272
+ }
273
+
274
+ /**
275
+ * Utility to delay execution
276
+ * @param {number} ms - Milliseconds to delay
277
+ * @returns {Promise<void>}
278
+ * @private
279
+ */
280
+ _delay(ms) {
281
+ return new Promise(resolve => setTimeout(resolve, ms));
282
+ }
283
+ }
284
+
285
+ module.exports = MockTransport;