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,332 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Route discovery and path finding logic
5
+ * @module mesh/router/PathFinder
6
+ */
7
+
8
+ const EventEmitter = require('events');
9
+ const { MESH_CONFIG } = require('../../constants');
10
+ const { ValidationError } = require('../../errors');
11
+
12
+ /**
13
+ * Route request entry
14
+ * @typedef {Object} RouteRequest
15
+ * @property {string} requestId - Unique request ID
16
+ * @property {string} destination - Target peer ID
17
+ * @property {number} createdAt - Request creation timestamp
18
+ * @property {number} expiresAt - Request expiration timestamp
19
+ * @property {Function} resolve - Promise resolve function
20
+ * @property {Function} reject - Promise reject function
21
+ */
22
+
23
+ /**
24
+ * Path finder for route discovery
25
+ * @class PathFinder
26
+ * @extends EventEmitter
27
+ */
28
+ class PathFinder extends EventEmitter {
29
+ /**
30
+ * Creates a new PathFinder
31
+ * @param {Object} options - Configuration options
32
+ * @param {string} options.localPeerId - Local peer ID
33
+ * @param {Object} options.routeTable - RouteTable instance
34
+ * @param {number} [options.discoveryTimeout] - Route discovery timeout
35
+ */
36
+ constructor(options = {}) {
37
+ super();
38
+
39
+ if (!options.localPeerId) {
40
+ throw ValidationError.missingArgument('localPeerId');
41
+ }
42
+ if (!options.routeTable) {
43
+ throw ValidationError.missingArgument('routeTable');
44
+ }
45
+
46
+ /**
47
+ * Local peer ID
48
+ * @type {string}
49
+ */
50
+ this.localPeerId = options.localPeerId;
51
+
52
+ /**
53
+ * Route table reference
54
+ * @type {Object}
55
+ */
56
+ this.routeTable = options.routeTable;
57
+
58
+ /**
59
+ * Discovery timeout in milliseconds
60
+ * @type {number}
61
+ */
62
+ this.discoveryTimeout = options.discoveryTimeout || 10000;
63
+
64
+ /**
65
+ * Pending route requests
66
+ * @type {Map<string, RouteRequest>}
67
+ * @private
68
+ */
69
+ this._pendingRequests = new Map();
70
+
71
+ /**
72
+ * Request counter for unique IDs
73
+ * @type {number}
74
+ * @private
75
+ */
76
+ this._requestCounter = 0;
77
+
78
+ /**
79
+ * Statistics
80
+ * @type {Object}
81
+ * @private
82
+ */
83
+ this._stats = {
84
+ requestsSent: 0,
85
+ requestsReceived: 0,
86
+ repliesSent: 0,
87
+ repliesReceived: 0,
88
+ routesDiscovered: 0,
89
+ requestsTimedOut: 0
90
+ };
91
+ }
92
+
93
+ /**
94
+ * Finds a route to a destination
95
+ * @param {string} destination - Target peer ID
96
+ * @returns {Promise<Object|null>} Route or null if not found
97
+ */
98
+ async findRoute(destination) {
99
+ if (!destination || typeof destination !== 'string') {
100
+ throw ValidationError.invalidArgument('destination', destination);
101
+ }
102
+
103
+ // Check existing route first
104
+ const existingRoute = this.routeTable.getRoute(destination);
105
+ if (existingRoute) {
106
+ return existingRoute;
107
+ }
108
+
109
+ // Initiate route discovery
110
+ return this._initiateDiscovery(destination);
111
+ }
112
+
113
+ /**
114
+ * Initiates route discovery for a destination
115
+ * @param {string} destination - Target peer ID
116
+ * @returns {Promise<Object|null>} Discovered route or null
117
+ * @private
118
+ */
119
+ _initiateDiscovery(destination) {
120
+ return new Promise((resolve, reject) => {
121
+ const requestId = this._generateRequestId();
122
+ const now = Date.now();
123
+
124
+ const request = {
125
+ requestId,
126
+ destination,
127
+ createdAt: now,
128
+ expiresAt: now + this.discoveryTimeout,
129
+ resolve,
130
+ reject
131
+ };
132
+
133
+ this._pendingRequests.set(requestId, request);
134
+ this._stats.requestsSent++;
135
+
136
+ // Emit discovery request event
137
+ this.emit('discovery:request', {
138
+ requestId,
139
+ destination,
140
+ sourcePeerId: this.localPeerId,
141
+ hopCount: 0
142
+ });
143
+
144
+ // Set timeout
145
+ setTimeout(() => {
146
+ if (this._pendingRequests.has(requestId)) {
147
+ this._pendingRequests.delete(requestId);
148
+ this._stats.requestsTimedOut++;
149
+ resolve(null);
150
+ }
151
+ }, this.discoveryTimeout);
152
+ });
153
+ }
154
+
155
+ /**
156
+ * Generates a unique request ID
157
+ * @returns {string} Request ID
158
+ * @private
159
+ */
160
+ _generateRequestId() {
161
+ this._requestCounter = (this._requestCounter + 1) % 0xFFFFFFFF;
162
+ return `${this.localPeerId}:${this._requestCounter}:${Date.now()}`;
163
+ }
164
+
165
+ /**
166
+ * Processes an incoming route request
167
+ * @param {Object} request - Route request data
168
+ * @param {string} sourcePeerId - Source peer ID
169
+ * @returns {Object|null} Reply to send or null
170
+ */
171
+ processRouteRequest(request, sourcePeerId) {
172
+ this._stats.requestsReceived++;
173
+
174
+ const { requestId, destination, hopCount = 0 } = request;
175
+
176
+ // Ignore requests for ourselves
177
+ if (request.sourcePeerId === this.localPeerId) {
178
+ return null;
179
+ }
180
+
181
+ // Check if we are the destination
182
+ if (destination === this.localPeerId) {
183
+ this._stats.repliesSent++;
184
+ return {
185
+ type: 'route:reply',
186
+ requestId,
187
+ destination,
188
+ nextHop: this.localPeerId,
189
+ hopCount: 0,
190
+ success: true
191
+ };
192
+ }
193
+
194
+ // Check if we have a route
195
+ const route = this.routeTable.getRoute(destination);
196
+ if (route) {
197
+ this._stats.repliesSent++;
198
+ return {
199
+ type: 'route:reply',
200
+ requestId,
201
+ destination,
202
+ nextHop: this.localPeerId,
203
+ hopCount: route.hopCount + 1,
204
+ success: true
205
+ };
206
+ }
207
+
208
+ // Forward the request if within hop limit
209
+ if (hopCount < MESH_CONFIG.MAX_HOPS) {
210
+ this.emit('discovery:forward', {
211
+ ...request,
212
+ hopCount: hopCount + 1,
213
+ previousHop: sourcePeerId
214
+ });
215
+ }
216
+
217
+ return null;
218
+ }
219
+
220
+ /**
221
+ * Processes an incoming route reply
222
+ * @param {Object} reply - Route reply data
223
+ * @param {string} sourcePeerId - Source peer ID
224
+ */
225
+ processRouteReply(reply, sourcePeerId) {
226
+ this._stats.repliesReceived++;
227
+
228
+ const { requestId, destination, hopCount, success } = reply;
229
+ const pendingRequest = this._pendingRequests.get(requestId);
230
+
231
+ if (!pendingRequest) {
232
+ // Not our request, may need to forward
233
+ return;
234
+ }
235
+
236
+ this._pendingRequests.delete(requestId);
237
+
238
+ if (success) {
239
+ // Add route to table
240
+ this.routeTable.addRoute(destination, sourcePeerId, hopCount + 1);
241
+ this._stats.routesDiscovered++;
242
+
243
+ const route = this.routeTable.getRoute(destination);
244
+ pendingRequest.resolve(route);
245
+ } else {
246
+ pendingRequest.resolve(null);
247
+ }
248
+ }
249
+
250
+ /**
251
+ * Updates route information from received messages
252
+ * @param {string} sourcePeerId - Source peer ID
253
+ * @param {string} originalSender - Original message sender
254
+ * @param {number} hopCount - Current hop count
255
+ */
256
+ updateRouteFromMessage(sourcePeerId, originalSender, hopCount) {
257
+ // Add/update route to original sender via source peer
258
+ if (originalSender !== this.localPeerId) {
259
+ this.routeTable.addRoute(originalSender, sourcePeerId, hopCount);
260
+ }
261
+
262
+ // Direct neighbor
263
+ if (sourcePeerId !== this.localPeerId) {
264
+ this.routeTable.addRoute(sourcePeerId, sourcePeerId, 0);
265
+ }
266
+ }
267
+
268
+ /**
269
+ * Gets pending request count
270
+ * @returns {number} Number of pending requests
271
+ */
272
+ getPendingCount() {
273
+ return this._pendingRequests.size;
274
+ }
275
+
276
+ /**
277
+ * Cleans up expired requests
278
+ * @returns {number} Number of cleaned up requests
279
+ */
280
+ cleanup() {
281
+ const now = Date.now();
282
+ let cleaned = 0;
283
+
284
+ for (const [requestId, request] of this._pendingRequests) {
285
+ if (now > request.expiresAt) {
286
+ request.resolve(null);
287
+ this._pendingRequests.delete(requestId);
288
+ this._stats.requestsTimedOut++;
289
+ cleaned++;
290
+ }
291
+ }
292
+
293
+ return cleaned;
294
+ }
295
+
296
+ /**
297
+ * Gets path finder statistics
298
+ * @returns {Object} Statistics
299
+ */
300
+ getStats() {
301
+ return {
302
+ ...this._stats,
303
+ pendingRequests: this._pendingRequests.size
304
+ };
305
+ }
306
+
307
+ /**
308
+ * Resets statistics
309
+ */
310
+ resetStats() {
311
+ this._stats = {
312
+ requestsSent: 0,
313
+ requestsReceived: 0,
314
+ repliesSent: 0,
315
+ repliesReceived: 0,
316
+ routesDiscovered: 0,
317
+ requestsTimedOut: 0
318
+ };
319
+ }
320
+
321
+ /**
322
+ * Clears all pending requests
323
+ */
324
+ clear() {
325
+ for (const request of this._pendingRequests.values()) {
326
+ request.resolve(null);
327
+ }
328
+ this._pendingRequests.clear();
329
+ }
330
+ }
331
+
332
+ module.exports = PathFinder;
@@ -0,0 +1,292 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Routing table for mesh network
5
+ * @module mesh/router/RouteTable
6
+ */
7
+
8
+ const { MESH_CONFIG } = require('../../constants');
9
+ const { ValidationError } = require('../../errors');
10
+
11
+ /**
12
+ * Route entry
13
+ * @typedef {Object} RouteEntry
14
+ * @property {string} destination - Destination peer ID
15
+ * @property {string} nextHop - Next hop peer ID
16
+ * @property {number} hopCount - Distance in hops
17
+ * @property {number} metric - Route quality metric
18
+ * @property {number} lastUpdated - Last update timestamp
19
+ * @property {number} expiresAt - Expiration timestamp
20
+ */
21
+
22
+ /**
23
+ * Routing table for tracking paths to peers
24
+ * @class RouteTable
25
+ */
26
+ class RouteTable {
27
+ /**
28
+ * Creates a new RouteTable
29
+ * @param {Object} [options] - Configuration options
30
+ * @param {number} [options.routeTimeout] - Route expiration timeout
31
+ * @param {number} [options.maxRoutes] - Maximum routes to store
32
+ */
33
+ constructor(options = {}) {
34
+ /**
35
+ * Route timeout in milliseconds
36
+ * @type {number}
37
+ */
38
+ this.routeTimeout = options.routeTimeout || MESH_CONFIG.ROUTE_TIMEOUT_MS;
39
+
40
+ /**
41
+ * Maximum routes to store
42
+ * @type {number}
43
+ */
44
+ this.maxRoutes = options.maxRoutes || 256;
45
+
46
+ /**
47
+ * Routes by destination peer ID
48
+ * @type {Map<string, RouteEntry>}
49
+ * @private
50
+ */
51
+ this._routes = new Map();
52
+
53
+ /**
54
+ * Direct neighbors (next hop = destination)
55
+ * @type {Set<string>}
56
+ * @private
57
+ */
58
+ this._neighbors = new Set();
59
+ }
60
+
61
+ /**
62
+ * Adds or updates a route
63
+ * @param {string} destination - Destination peer ID
64
+ * @param {string} nextHop - Next hop peer ID
65
+ * @param {number} hopCount - Hop count to destination
66
+ * @param {number} [metric] - Quality metric (lower is better)
67
+ * @returns {boolean} True if route was added/updated
68
+ */
69
+ addRoute(destination, nextHop, hopCount, metric = 0) {
70
+ if (!destination || typeof destination !== 'string') {
71
+ throw ValidationError.invalidArgument('destination', destination);
72
+ }
73
+ if (!nextHop || typeof nextHop !== 'string') {
74
+ throw ValidationError.invalidArgument('nextHop', nextHop);
75
+ }
76
+ if (!Number.isInteger(hopCount) || hopCount < 0) {
77
+ throw ValidationError.outOfRange('hopCount', hopCount, { min: 0 });
78
+ }
79
+
80
+ const existingRoute = this._routes.get(destination);
81
+ const now = Date.now();
82
+
83
+ // Check if we should update the route
84
+ if (existingRoute) {
85
+ // Prefer routes with fewer hops or better metric
86
+ const existingScore = existingRoute.hopCount * 100 + existingRoute.metric;
87
+ const newScore = hopCount * 100 + metric;
88
+
89
+ if (newScore >= existingScore && !existingRoute.isExpired) {
90
+ // Only update if same next hop (refresh)
91
+ if (existingRoute.nextHop === nextHop) {
92
+ existingRoute.lastUpdated = now;
93
+ existingRoute.expiresAt = now + this.routeTimeout;
94
+ return true;
95
+ }
96
+ return false;
97
+ }
98
+ }
99
+
100
+ // Enforce max routes limit
101
+ if (!existingRoute && this._routes.size >= this.maxRoutes) {
102
+ this._evictOldestRoute();
103
+ }
104
+
105
+ const route = {
106
+ destination,
107
+ nextHop,
108
+ hopCount,
109
+ metric,
110
+ lastUpdated: now,
111
+ expiresAt: now + this.routeTimeout
112
+ };
113
+
114
+ this._routes.set(destination, route);
115
+
116
+ // Track direct neighbors
117
+ if (hopCount === 0 || destination === nextHop) {
118
+ this._neighbors.add(destination);
119
+ }
120
+
121
+ return true;
122
+ }
123
+
124
+ /**
125
+ * Gets a route to a destination
126
+ * @param {string} destination - Destination peer ID
127
+ * @returns {RouteEntry|undefined} Route or undefined
128
+ */
129
+ getRoute(destination) {
130
+ const route = this._routes.get(destination);
131
+ if (!route) { return undefined; }
132
+
133
+ // Check if expired
134
+ if (Date.now() > route.expiresAt) {
135
+ this._routes.delete(destination);
136
+ this._neighbors.delete(destination);
137
+ return undefined;
138
+ }
139
+
140
+ return route;
141
+ }
142
+
143
+ /**
144
+ * Gets the next hop for a destination
145
+ * @param {string} destination - Destination peer ID
146
+ * @returns {string|null} Next hop peer ID or null
147
+ */
148
+ getNextHop(destination) {
149
+ const route = this.getRoute(destination);
150
+ return route ? route.nextHop : null;
151
+ }
152
+
153
+ /**
154
+ * Removes a route
155
+ * @param {string} destination - Destination peer ID
156
+ * @returns {boolean} True if removed
157
+ */
158
+ removeRoute(destination) {
159
+ const removed = this._routes.delete(destination);
160
+ if (removed) {
161
+ this._neighbors.delete(destination);
162
+ }
163
+ return removed;
164
+ }
165
+
166
+ /**
167
+ * Removes all routes through a specific next hop
168
+ * @param {string} nextHop - Next hop peer ID
169
+ * @returns {string[]} Removed destination IDs
170
+ */
171
+ removeRoutesVia(nextHop) {
172
+ const removed = [];
173
+ for (const [destination, route] of this._routes) {
174
+ if (route.nextHop === nextHop) {
175
+ this._routes.delete(destination);
176
+ this._neighbors.delete(destination);
177
+ removed.push(destination);
178
+ }
179
+ }
180
+ return removed;
181
+ }
182
+
183
+ /**
184
+ * Checks if a route exists
185
+ * @param {string} destination - Destination peer ID
186
+ * @returns {boolean} True if route exists and is valid
187
+ */
188
+ hasRoute(destination) {
189
+ return this.getRoute(destination) !== undefined;
190
+ }
191
+
192
+ /**
193
+ * Gets all valid routes
194
+ * @returns {RouteEntry[]} Array of routes
195
+ */
196
+ getAllRoutes() {
197
+ const now = Date.now();
198
+ const routes = [];
199
+
200
+ for (const [, route] of this._routes) {
201
+ if (now <= route.expiresAt) {
202
+ routes.push({ ...route });
203
+ }
204
+ }
205
+
206
+ return routes;
207
+ }
208
+
209
+ /**
210
+ * Gets all direct neighbors
211
+ * @returns {string[]} Array of neighbor peer IDs
212
+ */
213
+ getNeighbors() {
214
+ return Array.from(this._neighbors);
215
+ }
216
+
217
+ /**
218
+ * Cleans up expired routes
219
+ * @returns {string[]} Array of removed destination IDs
220
+ */
221
+ cleanup() {
222
+ const removed = [];
223
+ const now = Date.now();
224
+
225
+ for (const [destination, route] of this._routes) {
226
+ if (now > route.expiresAt) {
227
+ this._routes.delete(destination);
228
+ this._neighbors.delete(destination);
229
+ removed.push(destination);
230
+ }
231
+ }
232
+
233
+ return removed;
234
+ }
235
+
236
+ /**
237
+ * Evicts the oldest route
238
+ * @private
239
+ */
240
+ _evictOldestRoute() {
241
+ let oldest = null;
242
+ let oldestTime = Infinity;
243
+
244
+ for (const [destination, route] of this._routes) {
245
+ if (route.lastUpdated < oldestTime) {
246
+ oldest = destination;
247
+ oldestTime = route.lastUpdated;
248
+ }
249
+ }
250
+
251
+ if (oldest) {
252
+ this._routes.delete(oldest);
253
+ this._neighbors.delete(oldest);
254
+ }
255
+ }
256
+
257
+ /**
258
+ * Clears all routes
259
+ */
260
+ clear() {
261
+ this._routes.clear();
262
+ this._neighbors.clear();
263
+ }
264
+
265
+ /**
266
+ * Gets the number of routes
267
+ * @returns {number} Route count
268
+ */
269
+ get size() {
270
+ return this._routes.size;
271
+ }
272
+
273
+ /**
274
+ * Gets routing table statistics
275
+ * @returns {Object} Statistics
276
+ */
277
+ getStats() {
278
+ const routes = this.getAllRoutes();
279
+ const hopCounts = routes.map(r => r.hopCount);
280
+
281
+ return {
282
+ totalRoutes: routes.length,
283
+ directNeighbors: this._neighbors.size,
284
+ maxHops: hopCounts.length > 0 ? Math.max(...hopCounts) : 0,
285
+ avgHops: hopCounts.length > 0
286
+ ? hopCounts.reduce((a, b) => a + b, 0) / hopCounts.length
287
+ : 0
288
+ };
289
+ }
290
+ }
291
+
292
+ module.exports = RouteTable;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @fileoverview Router module exports
3
+ * @module mesh/router
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const RouteTable = require('./RouteTable');
9
+ const PathFinder = require('./PathFinder');
10
+ const MessageRouter = require('./MessageRouter');
11
+
12
+ module.exports = {
13
+ RouteTable,
14
+ PathFinder,
15
+ MessageRouter
16
+ };