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,384 @@
1
+ # Architecture Documentation
2
+
3
+ ## System Overview
4
+
5
+ The BLE Mesh Network library is organized into layered modules with clear separation of concerns:
6
+
7
+ ```
8
+ ┌─────────────────────────────────────────────────────────────┐
9
+ │ Application Layer │
10
+ │ (MeshService API) │
11
+ ├─────────────────────────────────────────────────────────────┤
12
+ │ Service Layer │
13
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
14
+ │ │ Session │ │ Handshake │ │ Channel │ │
15
+ │ │ Manager │ │ Manager │ │ Manager │ │
16
+ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │
17
+ ├─────────────────────────────────────────────────────────────┤
18
+ │ Mesh Layer │
19
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
20
+ │ │ Router │ │ Peer │ │ Fragment │ │
21
+ │ │ (Dedup) │ │ Manager │ │ Assembler │ │
22
+ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │
23
+ ├─────────────────────────────────────────────────────────────┤
24
+ │ Protocol Layer │
25
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
26
+ │ │ Serializer │ │ Deserializer│ │ Validator │ │
27
+ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │
28
+ ├─────────────────────────────────────────────────────────────┤
29
+ │ Crypto Layer │
30
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
31
+ │ │ Noise │ │ AEAD │ │ X25519 │ │
32
+ │ │ Protocol │ │ (ChaCha20) │ │ Key Exchange │ │
33
+ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │
34
+ ├─────────────────────────────────────────────────────────────┤
35
+ │ Transport Layer │
36
+ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
37
+ │ │ BLE │ │ Mock │ │ Adapters │ │
38
+ │ │ Transport │ │ Transport │ │ (RN/Node/Web) │ │
39
+ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │
40
+ └─────────────────────────────────────────────────────────────┘
41
+ ```
42
+
43
+ ## Module Dependency Graph
44
+
45
+ ```
46
+ index.js
47
+
48
+
49
+ MeshService
50
+ / │ \
51
+ / │ \
52
+ ▼ ▼ ▼
53
+ Session Handshake Channel
54
+ Manager Manager Manager
55
+ \ │ /
56
+ \ │ /
57
+ ▼ ▼ ▼
58
+ ┌─────────────────┐
59
+ │ Mesh Layer │
60
+ │ ┌───────────┐ │
61
+ │ │ Router │ │
62
+ │ │ ┌─────┐ │ │
63
+ │ │ │Dedup│ │ │
64
+ │ │ └─────┘ │ │
65
+ │ └───────────┘ │
66
+ │ ┌───────────┐ │
67
+ │ │ Peer │ │
68
+ │ │ Manager │ │
69
+ │ └───────────┘ │
70
+ │ ┌───────────┐ │
71
+ │ │ Fragment │ │
72
+ │ └───────────┘ │
73
+ └─────────────────┘
74
+
75
+
76
+ ┌─────────────────┐
77
+ │ Protocol Layer │
78
+ │ ┌───────────┐ │
79
+ │ │ Message │ │
80
+ │ │ Header │ │
81
+ │ └───────────┘ │
82
+ │ ┌───────────┐ │
83
+ │ │Serializer │ │
84
+ │ └───────────┘ │
85
+ └─────────────────┘
86
+
87
+
88
+ ┌─────────────────┐
89
+ │ Crypto Layer │
90
+ │ ┌───────────┐ │
91
+ │ │ Noise │ │
92
+ │ │ Handshake │ │
93
+ │ └───────────┘ │
94
+ │ ┌───────────┐ │
95
+ │ │ AEAD │ │
96
+ │ └───────────┘ │
97
+ │ ┌───────────┐ │
98
+ │ │ X25519 │ │
99
+ │ └───────────┘ │
100
+ │ ┌───────────┐ │
101
+ │ │ SHA-256 │ │
102
+ │ └───────────┘ │
103
+ └─────────────────┘
104
+ ```
105
+
106
+ ## Data Flow
107
+
108
+ ### Outgoing Message Flow
109
+
110
+ ```
111
+ Application
112
+
113
+ │ sendPrivateMessage(peerId, content)
114
+
115
+ MeshService
116
+
117
+ │ Create Message object
118
+
119
+ SessionManager
120
+
121
+ │ Get NoiseSession for peer
122
+ │ Encrypt payload
123
+
124
+ MessageRouter
125
+
126
+ │ Check routing table
127
+ │ Get next hop
128
+
129
+ Serializer
130
+
131
+ │ Serialize to binary
132
+ │ Add CRC32 checksum
133
+
134
+ Transport
135
+
136
+ │ Send over BLE
137
+
138
+ Remote Peer
139
+ ```
140
+
141
+ ### Incoming Message Flow
142
+
143
+ ```
144
+ Transport
145
+
146
+ │ Receive bytes
147
+
148
+ Deserializer
149
+
150
+ │ Parse header
151
+ │ Verify checksum
152
+
153
+ MessageRouter
154
+
155
+ │ Check if duplicate (Bloom + LRU)
156
+ │ Check TTL and hop count
157
+
158
+ ├──► If for us: process locally
159
+
160
+
161
+ SessionManager
162
+
163
+ │ Get NoiseSession
164
+ │ Decrypt payload
165
+
166
+ MeshService
167
+
168
+ │ Emit 'message:received'
169
+
170
+ Application
171
+ ```
172
+
173
+ ### Handshake Flow
174
+
175
+ ```
176
+ ┌──────────┐ ┌──────────┐
177
+ │ Alice │ │ Bob │
178
+ │(Initiator) │(Responder)
179
+ └────┬─────┘ └────┬─────┘
180
+ │ │
181
+ │ initializeInitiator(aliceStatic) │ initializeResponder(bobStatic)
182
+ │ │
183
+ │ Message 1 │
184
+ │ ────────────────────────────────────► │
185
+ │ e (ephemeral public key, 32 bytes) │
186
+ │ │
187
+ │ Message 2 │
188
+ │ ◄──────────────────────────────────── │
189
+ │ e, ee, s, es (96 bytes) │
190
+ │ - Bob's ephemeral public key │
191
+ │ - Encrypted Bob's static public key │
192
+ │ │
193
+ │ Message 3 │
194
+ │ ────────────────────────────────────► │
195
+ │ s, se (48 bytes) │
196
+ │ - Encrypted Alice's static public key │
197
+ │ │
198
+ │ ◄ Session Established ► │
199
+ │ │
200
+ │ getSession() → NoiseSession │ getSession() → NoiseSession
201
+ │ (sendKey, receiveKey) │ (sendKey, receiveKey)
202
+ │ │
203
+ │ Encrypted Data │
204
+ │ ◄─────────────────────────────────────►│
205
+ │ │
206
+ ```
207
+
208
+ ## State Machine
209
+
210
+ ### MeshService States
211
+
212
+ ```
213
+ initialize()
214
+ ┌───────────┐ ──────────────► ┌──────────────┐
215
+ │UNINITIALIZED│ │ INITIALIZING │
216
+ └───────────┘ └──────┬───────┘
217
+
218
+ │ success
219
+
220
+ ┌─────────────────────────┐
221
+ │ READY │
222
+ └───────────┬─────────────┘
223
+
224
+ │ start(transport)
225
+
226
+ stop() ┌─────────────────────────┐
227
+ ◄──────────────── │ ACTIVE │
228
+ └───────────┬─────────────┘
229
+
230
+ ┌───────────────────┼───────────────────┐
231
+ │ │ │
232
+ │ error │ suspend │ destroy
233
+ ▼ ▼ ▼
234
+ ┌───────────┐ ┌───────────┐ ┌───────────┐
235
+ │ ERROR │ │ SUSPENDED │ │ DESTROYED │
236
+ └───────────┘ └───────────┘ └───────────┘
237
+ │ │
238
+ └───────────────────┘
239
+
240
+ │ recover/resume
241
+
242
+ ┌───────────┐
243
+ │ ACTIVE │
244
+ └───────────┘
245
+ ```
246
+
247
+ ### Peer States
248
+
249
+ ```
250
+ ┌──────────────┐
251
+ │ DISCOVERED │ ◄── Transport discovery
252
+ └──────┬───────┘
253
+
254
+ │ connect()
255
+
256
+ ┌──────────────┐
257
+ │ CONNECTING │
258
+ └──────┬───────┘
259
+
260
+ │ connection established
261
+
262
+ ┌──────────────┐
263
+ │ CONNECTED │
264
+ └──────┬───────┘
265
+
266
+ │ handshake complete
267
+
268
+ ┌──────────────┐
269
+ │ SECURED │ ◄── Ready for encrypted messages
270
+ └──────┬───────┘
271
+
272
+ │ disconnect / timeout
273
+
274
+ ┌──────────────┐
275
+ │ DISCONNECTED │
276
+ └──────────────┘
277
+ ```
278
+
279
+ ## Key Components
280
+
281
+ ### Crypto Layer
282
+
283
+ | Component | Purpose |
284
+ |-----------|---------|
285
+ | `sha256.js` | SHA-256 hash function (FIPS 180-4) |
286
+ | `hmac.js` | HMAC-SHA256 message authentication |
287
+ | `hkdf.js` | HKDF key derivation (RFC 5869) |
288
+ | `x25519.js` | Elliptic curve Diffie-Hellman |
289
+ | `chacha20.js` | ChaCha20 stream cipher |
290
+ | `poly1305.js` | Poly1305 MAC |
291
+ | `aead.js` | ChaCha20-Poly1305 AEAD |
292
+ | `noise/state.js` | Noise symmetric state |
293
+ | `noise/handshake.js` | Noise XX handshake |
294
+ | `noise/session.js` | Post-handshake encryption |
295
+
296
+ ### Protocol Layer
297
+
298
+ | Component | Purpose |
299
+ |-----------|---------|
300
+ | `header.js` | 48-byte message header |
301
+ | `message.js` | Message container class |
302
+ | `serializer.js` | Binary serialization |
303
+ | `deserializer.js` | Binary deserialization |
304
+ | `validator.js` | Message validation |
305
+ | `crc32.js` | CRC32 checksum |
306
+
307
+ ### Mesh Layer
308
+
309
+ | Component | Purpose |
310
+ |-----------|---------|
311
+ | `BloomFilter.js` | Fast probabilistic duplicate detection |
312
+ | `MessageCache.js` | LRU cache for recent messages |
313
+ | `DedupManager.js` | Combined deduplication |
314
+ | `Fragmenter.js` | Message fragmentation |
315
+ | `Assembler.js` | Fragment reassembly |
316
+ | `Peer.js` | Peer data structure |
317
+ | `PeerManager.js` | Peer lifecycle management |
318
+ | `RouteTable.js` | Routing information |
319
+ | `MessageRouter.js` | Message routing logic |
320
+
321
+ ### Service Layer
322
+
323
+ | Component | Purpose |
324
+ |-----------|---------|
325
+ | `MeshService.js` | Main orchestrator, public API |
326
+ | `SessionManager.js` | Noise session lifecycle |
327
+ | `HandshakeManager.js` | Handshake orchestration |
328
+ | `ChannelManager.js` | Channel subscriptions |
329
+
330
+ ## Design Decisions
331
+
332
+ ### Why Pure JavaScript Crypto?
333
+
334
+ 1. **Portability**: Works in Node.js, React Native, and browsers
335
+ 2. **No Native Dependencies**: Easier installation and deployment
336
+ 3. **Auditability**: Code can be reviewed without native expertise
337
+ 4. **Trade-off**: Slower than native, but sufficient for messaging workloads
338
+
339
+ ### Why Noise Protocol XX?
340
+
341
+ 1. **Mutual Authentication**: Both parties prove identity
342
+ 2. **Forward Secrecy**: Ephemeral keys protect past sessions
343
+ 3. **Identity Hiding**: Static keys encrypted during handshake
344
+ 4. **Simplicity**: Well-defined pattern with clear security properties
345
+ 5. **No PKI Required**: Works peer-to-peer without certificate authorities
346
+
347
+ ### Why Bloom Filter + LRU?
348
+
349
+ 1. **Fast**: O(1) probabilistic check with Bloom filter
350
+ 2. **Accurate**: LRU cache eliminates false positives
351
+ 3. **Memory Efficient**: Bloom filter uses minimal memory
352
+ 4. **Bounded**: LRU prevents unbounded growth
353
+
354
+ ### Why 48-byte Header?
355
+
356
+ 1. **Fixed Size**: Simplifies parsing and allocation
357
+ 2. **Complete**: Contains all necessary routing metadata
358
+ 3. **Extensible**: Reserved bytes for future use
359
+ 4. **Checksummed**: CRC32 catches corruption
360
+
361
+ ## Performance Considerations
362
+
363
+ ### Message Throughput
364
+
365
+ - Header serialization: ~50μs
366
+ - AEAD encryption (256 bytes): ~100μs
367
+ - Bloom filter check: ~1μs
368
+ - Total per message: ~200μs
369
+ - Theoretical throughput: ~5000 messages/second
370
+
371
+ ### Memory Usage
372
+
373
+ - Bloom filter (2KB): 2,048 bytes
374
+ - LRU cache (1000 entries): ~100KB
375
+ - Peer manager (100 peers): ~50KB
376
+ - Session keys (10 sessions): ~2KB
377
+ - Total baseline: ~200KB
378
+
379
+ ### Battery Considerations
380
+
381
+ - BLE scanning: Major power consumer
382
+ - Configurable scan intervals (POWER_MODE)
383
+ - Heartbeat interval tuning
384
+ - Aggressive peer timeout for cleanup
@@ -0,0 +1,244 @@
1
+ # Contributing to BLE Mesh
2
+
3
+ Thank you for your interest in contributing to BLE Mesh! This document provides guidelines and information for contributors.
4
+
5
+ ## Getting Started
6
+
7
+ ### Prerequisites
8
+
9
+ - Node.js 18 or higher
10
+ - npm or yarn
11
+ - Git
12
+
13
+ ### Setup
14
+
15
+ 1. Fork the repository
16
+ 2. Clone your fork:
17
+ ```bash
18
+ git clone https://github.com/YOUR_USERNAME/react-native-ble-mesh.git
19
+ cd react-native-ble-mesh
20
+ ```
21
+ 3. Install dependencies:
22
+ ```bash
23
+ npm install
24
+ ```
25
+ 4. Run tests to ensure everything works:
26
+ ```bash
27
+ npm test
28
+ ```
29
+
30
+ ## Development Guidelines
31
+
32
+ ### Code Style
33
+
34
+ - **Maximum 200 lines per file** - Split large files into focused modules
35
+ - Use **JSDoc comments** for all public APIs
36
+ - Follow existing code patterns and naming conventions
37
+ - Use strict mode (`'use strict';`) in all files
38
+
39
+ ### File Organization
40
+
41
+ ```
42
+ src/
43
+ ├── core/ # Core mesh service
44
+ ├── crypto/ # Cryptographic primitives (flat structure)
45
+ ├── protocol/ # Wire protocol
46
+ ├── mesh/ # Mesh networking (flat structure)
47
+ ├── transport/ # Transport layer (flat structure)
48
+ ├── storage/ # Data persistence
49
+ ├── utils/ # Utility functions
50
+ ├── errors/ # Error classes
51
+ ├── hooks/ # React Native hooks
52
+ └── plugins/ # Optional features (audio, text)
53
+ ```
54
+
55
+ ### Writing Code
56
+
57
+ ```javascript
58
+ 'use strict';
59
+
60
+ /**
61
+ * @fileoverview Brief description of the file
62
+ * @module module/name
63
+ */
64
+
65
+ const SomeDependency = require('./SomeDependency');
66
+
67
+ /**
68
+ * Description of the class/function
69
+ * @class ClassName
70
+ * @example
71
+ * const instance = new ClassName(options);
72
+ */
73
+ class ClassName {
74
+ /**
75
+ * Creates a new instance
76
+ * @param {Object} options - Configuration options
77
+ * @param {string} options.name - The name
78
+ */
79
+ constructor(options = {}) {
80
+ // Implementation
81
+ }
82
+ }
83
+
84
+ module.exports = ClassName;
85
+ ```
86
+
87
+ ### Error Handling
88
+
89
+ Use custom error classes from `src/errors/`:
90
+
91
+ ```javascript
92
+ const { CryptoError, ConnectionError } = require('../errors');
93
+
94
+ // Throw appropriate errors
95
+ if (!isValid) {
96
+ throw new CryptoError('Invalid key format', 'E_CRYPTO_002');
97
+ }
98
+ ```
99
+
100
+ ### Testing
101
+
102
+ - Write tests for all new functionality
103
+ - Place tests in `__tests__/` mirroring `src/` structure
104
+ - Aim for **>80% code coverage** (100% for crypto)
105
+ - Use descriptive test names
106
+
107
+ ```javascript
108
+ describe('ClassName', () => {
109
+ describe('methodName()', () => {
110
+ test('does something specific', () => {
111
+ // Arrange
112
+ const instance = new ClassName();
113
+
114
+ // Act
115
+ const result = instance.methodName();
116
+
117
+ // Assert
118
+ expect(result).toBe(expected);
119
+ });
120
+
121
+ test('throws error for invalid input', () => {
122
+ expect(() => instance.methodName(null)).toThrow(SomeError);
123
+ });
124
+ });
125
+ });
126
+ ```
127
+
128
+ Run tests:
129
+ ```bash
130
+ npm test # Run all tests
131
+ npm test -- --watch # Watch mode
132
+ npm test -- --coverage # With coverage
133
+ npm test -- path/to/test # Specific test
134
+ ```
135
+
136
+ ## Pull Request Process
137
+
138
+ ### Before Submitting
139
+
140
+ 1. **Run tests**: `npm test`
141
+ 2. **Run linter**: `npm run lint`
142
+ 3. **Check coverage**: `npm test -- --coverage`
143
+ 4. Update documentation if needed
144
+ 5. Add tests for new features
145
+
146
+ ### PR Guidelines
147
+
148
+ 1. Create a feature branch from `master`:
149
+ ```bash
150
+ git checkout -b feature/your-feature-name
151
+ ```
152
+
153
+ 2. Make your changes with clear, focused commits
154
+
155
+ 3. Write a clear PR description:
156
+ - What changes were made
157
+ - Why the changes were made
158
+ - How to test the changes
159
+
160
+ 4. Ensure CI passes (tests, linting)
161
+
162
+ 5. Request review from maintainers
163
+
164
+ ### Commit Messages
165
+
166
+ Follow conventional commit format:
167
+
168
+ ```
169
+ type(scope): brief description
170
+
171
+ Longer description if needed.
172
+
173
+ Fixes #123
174
+ ```
175
+
176
+ Types:
177
+ - `feat`: New feature
178
+ - `fix`: Bug fix
179
+ - `docs`: Documentation
180
+ - `test`: Tests
181
+ - `refactor`: Code refactoring
182
+ - `perf`: Performance improvement
183
+ - `chore`: Maintenance
184
+
185
+ Examples:
186
+ ```
187
+ feat(hooks): add useMesh hook for React Native
188
+ fix(transport): handle BLE disconnection gracefully
189
+ docs(readme): update installation instructions
190
+ test(crypto): add Ed25519 test vectors
191
+ ```
192
+
193
+ ## Architecture Guidelines
194
+
195
+ ### Module Dependencies
196
+
197
+ ```
198
+ index.js (entry point)
199
+
200
+ service/MeshService.js (orchestrator)
201
+ ├→ crypto/ (no external deps)
202
+ ├→ protocol/ (depends on crypto)
203
+ ├→ mesh/ (depends on protocol, crypto)
204
+ ├→ transport/ (depends on protocol)
205
+ └→ storage/ (depends on protocol)
206
+ ```
207
+
208
+ **Rules:**
209
+ - No circular dependencies
210
+ - Lower layers don't depend on higher layers
211
+ - Utils and errors can be used anywhere
212
+
213
+ ### Adding New Features
214
+
215
+ 1. **Discuss first**: Open an issue to discuss the feature
216
+ 2. **Design**: Consider how it fits with existing architecture
217
+ 3. **Implement**: Follow existing patterns
218
+ 4. **Test**: Write comprehensive tests
219
+ 5. **Document**: Update API docs and examples
220
+
221
+ ### Performance Considerations
222
+
223
+ - Use `BoundedMap` for caches (prevents memory leaks)
224
+ - Use `TimeoutManager` for timeouts (prevents memory leaks)
225
+ - Use optimized `base64` module (not string concatenation)
226
+ - Batch async operations when possible
227
+ - Profile before and after changes
228
+
229
+ ## Security Guidelines
230
+
231
+ - **Never log secrets** (keys, tokens, passwords)
232
+ - Use **constant-time comparisons** for sensitive data
233
+ - Follow existing crypto patterns
234
+ - Report security issues privately to maintainers
235
+
236
+ ## Getting Help
237
+
238
+ - **Questions**: Open a GitHub Discussion
239
+ - **Bugs**: Open a GitHub Issue
240
+ - **Security**: Email maintainers directly
241
+
242
+ ## License
243
+
244
+ By contributing, you agree that your contributions will be licensed under the MIT License.