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,179 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview React Native app state management for mesh service
5
+ * @module hooks/AppStateManager
6
+ */
7
+
8
+ /**
9
+ * Manages React Native app state transitions for mesh service.
10
+ * Automatically handles background/foreground power mode switching.
11
+ *
12
+ * @class AppStateManager
13
+ *
14
+ * @example
15
+ * const mesh = new MeshService();
16
+ * const appStateManager = new AppStateManager(mesh);
17
+ * appStateManager.initialize();
18
+ *
19
+ * // On component unmount:
20
+ * appStateManager.destroy();
21
+ */
22
+ class AppStateManager {
23
+ /**
24
+ * Creates a new AppStateManager
25
+ * @param {MeshService} mesh - MeshService instance to manage
26
+ * @param {Object} [options] - Configuration options
27
+ * @param {string} [options.backgroundMode='ULTRA_POWER_SAVER'] - Power mode for background
28
+ * @param {string} [options.foregroundMode='BALANCED'] - Power mode for foreground
29
+ * @param {boolean} [options.autoSaveState=true] - Auto save state on background
30
+ */
31
+ constructor(mesh, options = {}) {
32
+ /** @private */
33
+ this._mesh = mesh;
34
+ /** @private */
35
+ this._options = {
36
+ backgroundMode: options.backgroundMode || 'ULTRA_POWER_SAVER',
37
+ foregroundMode: options.foregroundMode || 'BALANCED',
38
+ autoSaveState: options.autoSaveState !== false
39
+ };
40
+ /** @private */
41
+ this._appState = 'active';
42
+ /** @private */
43
+ this._subscription = null;
44
+ /** @private */
45
+ this._initialized = false;
46
+ /** @private */
47
+ this._AppState = null;
48
+ }
49
+
50
+ /**
51
+ * Initialize app state monitoring
52
+ * @returns {boolean} True if initialized, false if AppState not available
53
+ */
54
+ initialize() {
55
+ if (this._initialized) { return true; }
56
+
57
+ // Try to get AppState from React Native
58
+ try {
59
+ const { AppState } = require('react-native');
60
+ this._AppState = AppState;
61
+ } catch (e) {
62
+ // React Native not available (Node.js environment)
63
+ console.warn('AppStateManager: React Native AppState not available');
64
+ return false;
65
+ }
66
+
67
+ this._subscription = this._AppState.addEventListener(
68
+ 'change',
69
+ this._handleStateChange.bind(this)
70
+ );
71
+
72
+ this._initialized = true;
73
+ return true;
74
+ }
75
+
76
+ /**
77
+ * Handle app state change
78
+ * @private
79
+ * @param {string} nextAppState - New app state
80
+ */
81
+ _handleStateChange(nextAppState) {
82
+ const wasActive = this._appState === 'active';
83
+ const isActive = nextAppState === 'active';
84
+
85
+ // Going to background
86
+ if (wasActive && !isActive) {
87
+ this._onBackground();
88
+ }
89
+
90
+ // Coming to foreground
91
+ if (!wasActive && isActive) {
92
+ this._onForeground();
93
+ }
94
+
95
+ this._appState = nextAppState;
96
+ }
97
+
98
+ /**
99
+ * Called when app goes to background
100
+ * @private
101
+ */
102
+ _onBackground() {
103
+ if (!this._mesh) { return; }
104
+
105
+ try {
106
+ // Switch to power saver mode
107
+ if (typeof this._mesh.setPowerMode === 'function') {
108
+ this._mesh.setPowerMode(this._options.backgroundMode);
109
+ }
110
+
111
+ // Save state if enabled
112
+ if (this._options.autoSaveState && typeof this._mesh._saveState === 'function') {
113
+ this._mesh._saveState();
114
+ }
115
+ } catch (e) {
116
+ console.warn('AppStateManager: Error handling background transition', e);
117
+ }
118
+ }
119
+
120
+ /**
121
+ * Called when app comes to foreground
122
+ * @private
123
+ */
124
+ _onForeground() {
125
+ if (!this._mesh) { return; }
126
+
127
+ try {
128
+ // Restore normal power mode
129
+ if (typeof this._mesh.setPowerMode === 'function') {
130
+ this._mesh.setPowerMode(this._options.foregroundMode);
131
+ }
132
+
133
+ // Restore state if enabled
134
+ if (this._options.autoSaveState && typeof this._mesh._restoreState === 'function') {
135
+ this._mesh._restoreState();
136
+ }
137
+ } catch (e) {
138
+ console.warn('AppStateManager: Error handling foreground transition', e);
139
+ }
140
+ }
141
+
142
+ /**
143
+ * Get current app state
144
+ * @returns {string} Current app state ('active', 'background', 'inactive')
145
+ */
146
+ getAppState() {
147
+ return this._appState;
148
+ }
149
+
150
+ /**
151
+ * Check if app is in foreground
152
+ * @returns {boolean} True if app is active
153
+ */
154
+ isActive() {
155
+ return this._appState === 'active';
156
+ }
157
+
158
+ /**
159
+ * Check if app is in background
160
+ * @returns {boolean} True if app is in background
161
+ */
162
+ isBackground() {
163
+ return this._appState === 'background';
164
+ }
165
+
166
+ /**
167
+ * Destroy the manager and cleanup subscriptions
168
+ */
169
+ destroy() {
170
+ if (this._subscription) {
171
+ this._subscription.remove();
172
+ this._subscription = null;
173
+ }
174
+ this._mesh = null;
175
+ this._initialized = false;
176
+ }
177
+ }
178
+
179
+ module.exports = AppStateManager;
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview React Native hooks for BLE Mesh
5
+ * @module hooks
6
+ *
7
+ * @description
8
+ * React Native hooks for easy integration with BLE Mesh.
9
+ * These hooks handle lifecycle management, state updates, and cleanup.
10
+ *
11
+ * @example
12
+ * import { useMesh, usePeers, useMessages } from 'react-native-ble-mesh/hooks';
13
+ *
14
+ * function App() {
15
+ * const { mesh, state, initialize } = useMesh({ displayName: 'MyDevice' });
16
+ * const { peers, connectedPeers } = usePeers(mesh);
17
+ * const { messages, sendBroadcast } = useMessages(mesh);
18
+ *
19
+ * // ... your app logic
20
+ * }
21
+ */
22
+
23
+ const useMesh = require('./useMesh');
24
+ const usePeers = require('./usePeers');
25
+ const useMessages = require('./useMessages');
26
+ const AppStateManager = require('./AppStateManager');
27
+
28
+ module.exports = {
29
+ useMesh,
30
+ usePeers,
31
+ useMessages,
32
+ AppStateManager
33
+ };
@@ -0,0 +1,159 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview React hook for MeshService
5
+ * @module hooks/useMesh
6
+ */
7
+
8
+ /**
9
+ * React hook for managing MeshService lifecycle in React Native apps.
10
+ * Handles initialization, cleanup, and state management.
11
+ *
12
+ * @param {Object} [config] - MeshService configuration
13
+ * @param {string} [config.displayName] - Display name for this node
14
+ * @param {Object} [config.storage] - Storage adapter
15
+ * @returns {Object} Mesh state and controls
16
+ *
17
+ * @example
18
+ * function App() {
19
+ * const { mesh, state, error, initialize, destroy } = useMesh({
20
+ * displayName: 'MyDevice'
21
+ * });
22
+ *
23
+ * useEffect(() => {
24
+ * initialize();
25
+ * return () => destroy();
26
+ * }, []);
27
+ *
28
+ * if (state === 'error') return <Text>Error: {error.message}</Text>;
29
+ * if (state !== 'active') return <Text>Loading...</Text>;
30
+ *
31
+ * return <ChatScreen mesh={mesh} />;
32
+ * }
33
+ */
34
+ function useMesh(config = {}) {
35
+ // This hook requires React - check if available
36
+ let React;
37
+ try {
38
+ React = require('react');
39
+ } catch (e) {
40
+ throw new Error('useMesh requires React. Install react as a dependency.');
41
+ }
42
+
43
+ const { useState, useCallback, useRef, useEffect } = React;
44
+ const { MeshService } = require('../service');
45
+ const { MemoryStorage } = require('../storage');
46
+
47
+ // Create mesh instance ref (persists across renders)
48
+ const meshRef = useRef(null);
49
+
50
+ // State
51
+ const [state, setState] = useState('uninitialized');
52
+ const [error, setError] = useState(null);
53
+
54
+ // Create mesh instance lazily
55
+ const getMesh = useCallback(() => {
56
+ if (!meshRef.current) {
57
+ meshRef.current = new MeshService({
58
+ displayName: config.displayName || 'MeshNode'
59
+ });
60
+ }
61
+ return meshRef.current;
62
+ }, [config.displayName]);
63
+
64
+ // Initialize mesh
65
+ const initialize = useCallback(async (transport) => {
66
+ try {
67
+ setState('initializing');
68
+ setError(null);
69
+
70
+ const mesh = getMesh();
71
+
72
+ // Setup state change listener
73
+ mesh.on('state-changed', ({ newState }) => {
74
+ setState(newState);
75
+ });
76
+
77
+ mesh.on('error', (err) => {
78
+ setError(err);
79
+ });
80
+
81
+ // Initialize with storage
82
+ await mesh.initialize({
83
+ storage: config.storage || new MemoryStorage()
84
+ });
85
+
86
+ // Start with transport if provided
87
+ if (transport) {
88
+ await mesh.start(transport);
89
+ }
90
+
91
+ return mesh;
92
+ } catch (err) {
93
+ setState('error');
94
+ setError(err);
95
+ throw err;
96
+ }
97
+ }, [getMesh, config.storage]);
98
+
99
+ // Start with transport
100
+ const start = useCallback(async (transport) => {
101
+ const mesh = getMesh();
102
+ try {
103
+ await mesh.start(transport);
104
+ } catch (err) {
105
+ setError(err);
106
+ throw err;
107
+ }
108
+ }, [getMesh]);
109
+
110
+ // Stop mesh
111
+ const stop = useCallback(async () => {
112
+ const mesh = meshRef.current;
113
+ if (mesh) {
114
+ try {
115
+ await mesh.stop();
116
+ } catch (err) {
117
+ setError(err);
118
+ }
119
+ }
120
+ }, []);
121
+
122
+ // Destroy mesh
123
+ const destroy = useCallback(async () => {
124
+ const mesh = meshRef.current;
125
+ if (mesh) {
126
+ try {
127
+ await mesh.destroy();
128
+ } catch (err) {
129
+ // Ignore destroy errors
130
+ }
131
+ meshRef.current = null;
132
+ setState('destroyed');
133
+ }
134
+ }, []);
135
+
136
+ // Cleanup on unmount
137
+ useEffect(() => {
138
+ return () => {
139
+ if (meshRef.current) {
140
+ meshRef.current.destroy().catch(() => {});
141
+ meshRef.current = null;
142
+ }
143
+ };
144
+ }, []);
145
+
146
+ return {
147
+ mesh: meshRef.current,
148
+ state,
149
+ error,
150
+ initialize,
151
+ start,
152
+ stop,
153
+ destroy,
154
+ isReady: state === 'ready' || state === 'active',
155
+ isActive: state === 'active'
156
+ };
157
+ }
158
+
159
+ module.exports = useMesh;
@@ -0,0 +1,209 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview React hook for message handling
5
+ * @module hooks/useMessages
6
+ */
7
+
8
+ /**
9
+ * React hook for sending and receiving messages in the mesh network.
10
+ * Manages message state and provides send functions.
11
+ *
12
+ * @param {MeshService} mesh - MeshService instance
13
+ * @param {Object} [options] - Options
14
+ * @param {number} [options.maxMessages=100] - Maximum messages to keep in state
15
+ * @returns {Object} Messages state and send functions
16
+ *
17
+ * @example
18
+ * function Chat({ mesh, peerId }) {
19
+ * const { messages, sendPrivate, sendBroadcast } = useMessages(mesh);
20
+ *
21
+ * const handleSend = async (text) => {
22
+ * if (peerId) {
23
+ * await sendPrivate(peerId, text);
24
+ * } else {
25
+ * sendBroadcast(text);
26
+ * }
27
+ * };
28
+ *
29
+ * return (
30
+ * <View>
31
+ * {messages.map(msg => <Message key={msg.id} data={msg} />)}
32
+ * <Input onSubmit={handleSend} />
33
+ * </View>
34
+ * );
35
+ * }
36
+ */
37
+ function useMessages(mesh, options = {}) {
38
+ // This hook requires React
39
+ let React;
40
+ try {
41
+ React = require('react');
42
+ } catch (e) {
43
+ throw new Error('useMessages requires React. Install react as a dependency.');
44
+ }
45
+
46
+ const { useState, useEffect, useCallback, useRef } = React;
47
+
48
+ const maxMessages = options.maxMessages || 100;
49
+ const [messages, setMessages] = useState([]);
50
+ const [sending, setSending] = useState(false);
51
+ const [error, setError] = useState(null);
52
+ const messageIdRef = useRef(new Set());
53
+
54
+ // Add message to state (with dedup)
55
+ const addMessage = useCallback((msg) => {
56
+ if (messageIdRef.current.has(msg.id)) { return; }
57
+ messageIdRef.current.add(msg.id);
58
+
59
+ setMessages(prev => {
60
+ const updated = [msg, ...prev];
61
+ // Trim to max messages
62
+ if (updated.length > maxMessages) {
63
+ const removed = updated.slice(maxMessages);
64
+ removed.forEach(m => messageIdRef.current.delete(m.id));
65
+ return updated.slice(0, maxMessages);
66
+ }
67
+ return updated;
68
+ });
69
+ }, [maxMessages]);
70
+
71
+ // Subscribe to message events
72
+ useEffect(() => {
73
+ if (!mesh) { return; }
74
+
75
+ const handleBroadcast = (data) => {
76
+ addMessage({
77
+ id: data.messageId,
78
+ type: 'broadcast',
79
+ content: data.content,
80
+ senderId: data.peerId,
81
+ timestamp: data.timestamp || Date.now(),
82
+ isOwn: false
83
+ });
84
+ };
85
+
86
+ const handlePrivate = (data) => {
87
+ addMessage({
88
+ id: data.messageId,
89
+ type: 'private',
90
+ content: data.content,
91
+ senderId: data.peerId,
92
+ timestamp: data.timestamp || Date.now(),
93
+ isOwn: false
94
+ });
95
+ };
96
+
97
+ const handleChannel = (data) => {
98
+ addMessage({
99
+ id: data.messageId,
100
+ type: 'channel',
101
+ content: data.content,
102
+ senderId: data.peerId,
103
+ channelId: data.channelId,
104
+ timestamp: data.timestamp || Date.now(),
105
+ isOwn: false
106
+ });
107
+ };
108
+
109
+ mesh.on('broadcast-received', handleBroadcast);
110
+ mesh.on('private-message-received', handlePrivate);
111
+ mesh.on('channel-message-received', handleChannel);
112
+
113
+ return () => {
114
+ mesh.off('broadcast-received', handleBroadcast);
115
+ mesh.off('private-message-received', handlePrivate);
116
+ mesh.off('channel-message-received', handleChannel);
117
+ };
118
+ }, [mesh, addMessage]);
119
+
120
+ // Send broadcast message
121
+ const sendBroadcast = useCallback((content) => {
122
+ if (!mesh) { throw new Error('Mesh not initialized'); }
123
+ setError(null);
124
+
125
+ try {
126
+ const messageId = mesh.sendBroadcast(content);
127
+ addMessage({
128
+ id: messageId,
129
+ type: 'broadcast',
130
+ content,
131
+ senderId: mesh.getIdentity()?.id,
132
+ timestamp: Date.now(),
133
+ isOwn: true
134
+ });
135
+ return messageId;
136
+ } catch (err) {
137
+ setError(err);
138
+ throw err;
139
+ }
140
+ }, [mesh, addMessage]);
141
+
142
+ // Send private message
143
+ const sendPrivate = useCallback(async (peerId, content) => {
144
+ if (!mesh) { throw new Error('Mesh not initialized'); }
145
+ setError(null);
146
+ setSending(true);
147
+
148
+ try {
149
+ const messageId = await mesh.sendPrivateMessage(peerId, content);
150
+ addMessage({
151
+ id: messageId,
152
+ type: 'private',
153
+ content,
154
+ recipientId: peerId,
155
+ senderId: mesh.getIdentity()?.id,
156
+ timestamp: Date.now(),
157
+ isOwn: true
158
+ });
159
+ return messageId;
160
+ } catch (err) {
161
+ setError(err);
162
+ throw err;
163
+ } finally {
164
+ setSending(false);
165
+ }
166
+ }, [mesh, addMessage]);
167
+
168
+ // Send channel message
169
+ const sendToChannel = useCallback((channelId, content) => {
170
+ if (!mesh) { throw new Error('Mesh not initialized'); }
171
+ setError(null);
172
+
173
+ try {
174
+ const messageId = mesh.sendChannelMessage(channelId, content);
175
+ addMessage({
176
+ id: messageId,
177
+ type: 'channel',
178
+ content,
179
+ channelId,
180
+ senderId: mesh.getIdentity()?.id,
181
+ timestamp: Date.now(),
182
+ isOwn: true
183
+ });
184
+ return messageId;
185
+ } catch (err) {
186
+ setError(err);
187
+ throw err;
188
+ }
189
+ }, [mesh, addMessage]);
190
+
191
+ // Clear messages
192
+ const clearMessages = useCallback(() => {
193
+ setMessages([]);
194
+ messageIdRef.current.clear();
195
+ }, []);
196
+
197
+ return {
198
+ messages,
199
+ sending,
200
+ error,
201
+ sendBroadcast,
202
+ sendPrivate,
203
+ sendToChannel,
204
+ clearMessages,
205
+ messageCount: messages.length
206
+ };
207
+ }
208
+
209
+ module.exports = useMessages;
@@ -0,0 +1,111 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview React hook for peer management
5
+ * @module hooks/usePeers
6
+ */
7
+
8
+ /**
9
+ * React hook for managing and observing peers in the mesh network.
10
+ * Automatically updates when peers connect, disconnect, or change state.
11
+ *
12
+ * @param {MeshService} mesh - MeshService instance
13
+ * @returns {Object} Peers state and utilities
14
+ *
15
+ * @example
16
+ * function PeerList({ mesh }) {
17
+ * const { peers, connectedPeers, getPeer } = usePeers(mesh);
18
+ *
19
+ * return (
20
+ * <View>
21
+ * <Text>Connected: {connectedPeers.length}</Text>
22
+ * {peers.map(peer => (
23
+ * <PeerItem key={peer.id} peer={peer} />
24
+ * ))}
25
+ * </View>
26
+ * );
27
+ * }
28
+ */
29
+ function usePeers(mesh) {
30
+ // This hook requires React
31
+ let React;
32
+ try {
33
+ React = require('react');
34
+ } catch (e) {
35
+ throw new Error('usePeers requires React. Install react as a dependency.');
36
+ }
37
+
38
+ const { useState, useEffect, useCallback, useMemo } = React;
39
+
40
+ const [peers, setPeers] = useState([]);
41
+ const [lastUpdate, setLastUpdate] = useState(Date.now());
42
+
43
+ // Update peers from mesh
44
+ const refreshPeers = useCallback(() => {
45
+ if (mesh) {
46
+ try {
47
+ const allPeers = mesh.getPeers();
48
+ setPeers(allPeers);
49
+ setLastUpdate(Date.now());
50
+ } catch (e) {
51
+ // Mesh might not be ready
52
+ }
53
+ }
54
+ }, [mesh]);
55
+
56
+ // Subscribe to peer events
57
+ useEffect(() => {
58
+ if (!mesh) { return; }
59
+
60
+ const handlePeerEvent = () => refreshPeers();
61
+
62
+ mesh.on('peer-discovered', handlePeerEvent);
63
+ mesh.on('peer-connected', handlePeerEvent);
64
+ mesh.on('peer-disconnected', handlePeerEvent);
65
+ mesh.on('peer-secured', handlePeerEvent);
66
+
67
+ // Initial load
68
+ refreshPeers();
69
+
70
+ return () => {
71
+ mesh.off('peer-discovered', handlePeerEvent);
72
+ mesh.off('peer-connected', handlePeerEvent);
73
+ mesh.off('peer-disconnected', handlePeerEvent);
74
+ mesh.off('peer-secured', handlePeerEvent);
75
+ };
76
+ }, [mesh, refreshPeers]);
77
+
78
+ // Computed values
79
+ const connectedPeers = useMemo(() => {
80
+ return peers.filter(p => p.connectionState === 'connected' || p.connectionState === 'secured');
81
+ }, [peers]);
82
+
83
+ const securedPeers = useMemo(() => {
84
+ return peers.filter(p => p.connectionState === 'secured');
85
+ }, [peers]);
86
+
87
+ // Get single peer by ID
88
+ const getPeer = useCallback((peerId) => {
89
+ return peers.find(p => p.id === peerId);
90
+ }, [peers]);
91
+
92
+ // Check if peer is connected
93
+ const isConnected = useCallback((peerId) => {
94
+ const peer = getPeer(peerId);
95
+ return peer && (peer.connectionState === 'connected' || peer.connectionState === 'secured');
96
+ }, [getPeer]);
97
+
98
+ return {
99
+ peers,
100
+ connectedPeers,
101
+ securedPeers,
102
+ peerCount: peers.length,
103
+ connectedCount: connectedPeers.length,
104
+ getPeer,
105
+ isConnected,
106
+ refresh: refreshPeers,
107
+ lastUpdate
108
+ };
109
+ }
110
+
111
+ module.exports = usePeers;