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.
- package/CHANGELOG.md +151 -0
- package/LICENSE +21 -0
- package/README.md +706 -0
- package/docs/API.md +462 -0
- package/docs/ARCHITECTURE.md +384 -0
- package/docs/CONTRIBUTING.md +244 -0
- package/docs/NODE_QUICKSTART.md +259 -0
- package/docs/PROTOCOL.md +195 -0
- package/docs/REACT_NATIVE.md +315 -0
- package/docs/SECURITY.md +152 -0
- package/docs/api/constants_audio.js.html +184 -0
- package/docs/api/constants_ble.js.html +165 -0
- package/docs/api/constants_crypto.js.html +107 -0
- package/docs/api/constants_errors.js.html +256 -0
- package/docs/api/constants_events.js.html +148 -0
- package/docs/api/constants_index.js.html +76 -0
- package/docs/api/constants_protocol.js.html +205 -0
- package/docs/api/crypto_aead.js.html +243 -0
- package/docs/api/crypto_chacha20.js.html +235 -0
- package/docs/api/crypto_hkdf.js.html +241 -0
- package/docs/api/crypto_hmac.js.html +197 -0
- package/docs/api/crypto_index.js.html +126 -0
- package/docs/api/crypto_keys_KeyManager.js.html +325 -0
- package/docs/api/crypto_keys_KeyPair.js.html +270 -0
- package/docs/api/crypto_keys_SecureStorage.js.html +273 -0
- package/docs/api/crypto_keys_index.js.html +86 -0
- package/docs/api/crypto_noise_handshake.js.html +464 -0
- package/docs/api/crypto_noise_index.js.html +81 -0
- package/docs/api/crypto_noise_session.js.html +307 -0
- package/docs/api/crypto_noise_state.js.html +322 -0
- package/docs/api/crypto_poly1305.js.html +167 -0
- package/docs/api/crypto_sha256.js.html +294 -0
- package/docs/api/crypto_x25519.js.html +208 -0
- package/docs/api/errors_AudioError.js.html +218 -0
- package/docs/api/errors_ConnectionError.js.html +163 -0
- package/docs/api/errors_CryptoError.js.html +157 -0
- package/docs/api/errors_HandshakeError.js.html +176 -0
- package/docs/api/errors_MeshError.js.html +154 -0
- package/docs/api/errors_MessageError.js.html +183 -0
- package/docs/api/errors_ValidationError.js.html +204 -0
- package/docs/api/errors_index.js.html +78 -0
- package/docs/api/fonts/OpenSans-Bold-webfont.eot +0 -0
- package/docs/api/fonts/OpenSans-Bold-webfont.svg +1830 -0
- package/docs/api/fonts/OpenSans-Bold-webfont.woff +0 -0
- package/docs/api/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
- package/docs/api/fonts/OpenSans-BoldItalic-webfont.svg +1830 -0
- package/docs/api/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
- package/docs/api/fonts/OpenSans-Italic-webfont.eot +0 -0
- package/docs/api/fonts/OpenSans-Italic-webfont.svg +1830 -0
- package/docs/api/fonts/OpenSans-Italic-webfont.woff +0 -0
- package/docs/api/fonts/OpenSans-Light-webfont.eot +0 -0
- package/docs/api/fonts/OpenSans-Light-webfont.svg +1831 -0
- package/docs/api/fonts/OpenSans-Light-webfont.woff +0 -0
- package/docs/api/fonts/OpenSans-LightItalic-webfont.eot +0 -0
- package/docs/api/fonts/OpenSans-LightItalic-webfont.svg +1835 -0
- package/docs/api/fonts/OpenSans-LightItalic-webfont.woff +0 -0
- package/docs/api/fonts/OpenSans-Regular-webfont.eot +0 -0
- package/docs/api/fonts/OpenSans-Regular-webfont.svg +1831 -0
- package/docs/api/fonts/OpenSans-Regular-webfont.woff +0 -0
- package/docs/api/hooks_AppStateManager.js.html +233 -0
- package/docs/api/hooks_index.js.html +87 -0
- package/docs/api/hooks_useMesh.js.html +213 -0
- package/docs/api/hooks_useMessages.js.html +263 -0
- package/docs/api/hooks_usePeers.js.html +165 -0
- package/docs/api/index.html +868 -0
- package/docs/api/index.js.html +236 -0
- package/docs/api/mesh_dedup_BloomFilter.js.html +261 -0
- package/docs/api/mesh_dedup_DedupManager.js.html +266 -0
- package/docs/api/mesh_dedup_MessageCache.js.html +273 -0
- package/docs/api/mesh_dedup_index.js.html +70 -0
- package/docs/api/mesh_fragment_Assembler.js.html +335 -0
- package/docs/api/mesh_fragment_Fragmenter.js.html +230 -0
- package/docs/api/mesh_fragment_index.js.html +75 -0
- package/docs/api/mesh_index.js.html +72 -0
- package/docs/api/mesh_peer_Peer.js.html +296 -0
- package/docs/api/mesh_peer_PeerDiscovery.js.html +334 -0
- package/docs/api/mesh_peer_PeerManager.js.html +320 -0
- package/docs/api/mesh_peer_index.js.html +70 -0
- package/docs/api/mesh_router_MessageRouter.js.html +411 -0
- package/docs/api/mesh_router_PathFinder.js.html +386 -0
- package/docs/api/mesh_router_RouteTable.js.html +346 -0
- package/docs/api/mesh_router_index.js.html +70 -0
- package/docs/api/module-audio_buffer.html +168 -0
- package/docs/api/module-audio_buffer_FrameBuffer-FrameBuffer.html +2971 -0
- package/docs/api/module-audio_buffer_FrameBuffer.html +178 -0
- package/docs/api/module-audio_buffer_JitterBuffer-JitterBuffer.html +2761 -0
- package/docs/api/module-audio_buffer_JitterBuffer.html +178 -0
- package/docs/api/module-audio_codec.html +168 -0
- package/docs/api/module-audio_codec_LC3Codec-LC3Codec.html +2876 -0
- package/docs/api/module-audio_codec_LC3Codec.html +178 -0
- package/docs/api/module-audio_codec_LC3Decoder-LC3Decoder.html +1788 -0
- package/docs/api/module-audio_codec_LC3Decoder.html +178 -0
- package/docs/api/module-audio_codec_LC3Encoder-LC3Encoder.html +1512 -0
- package/docs/api/module-audio_codec_LC3Encoder.html +178 -0
- package/docs/api/module-audio_session.html +168 -0
- package/docs/api/module-audio_session_AudioSession-AudioSession.html +3922 -0
- package/docs/api/module-audio_session_AudioSession.html +178 -0
- package/docs/api/module-audio_session_VoiceMessage-VoiceMessage.html +3690 -0
- package/docs/api/module-audio_session_VoiceMessage-VoiceMessageRecorder.html +1780 -0
- package/docs/api/module-audio_session_VoiceMessage.html +332 -0
- package/docs/api/module-audio_transport.html +168 -0
- package/docs/api/module-audio_transport_AudioFragmenter-AudioAssembler.html +1545 -0
- package/docs/api/module-audio_transport_AudioFragmenter-AudioFragmenter.html +658 -0
- package/docs/api/module-audio_transport_AudioFragmenter.html +181 -0
- package/docs/api/module-audio_transport_AudioFramer.html +1414 -0
- package/docs/api/module-constants.html +168 -0
- package/docs/api/module-constants_audio.html +1782 -0
- package/docs/api/module-constants_ble.html +940 -0
- package/docs/api/module-constants_crypto.html +823 -0
- package/docs/api/module-constants_errors.html +316 -0
- package/docs/api/module-constants_events.html +244 -0
- package/docs/api/module-constants_protocol.html +1534 -0
- package/docs/api/module-crypto.html +169 -0
- package/docs/api/module-crypto_aead.html +1625 -0
- package/docs/api/module-crypto_chacha20.html +1440 -0
- package/docs/api/module-crypto_hkdf.html +1421 -0
- package/docs/api/module-crypto_hmac.html +828 -0
- package/docs/api/module-crypto_keys.html +169 -0
- package/docs/api/module-crypto_keys_KeyManager-KeyManager.html +2364 -0
- package/docs/api/module-crypto_keys_KeyManager.html +252 -0
- package/docs/api/module-crypto_keys_KeyPair.html +245 -0
- package/docs/api/module-crypto_keys_SecureStorage-MemorySecureStorage.html +923 -0
- package/docs/api/module-crypto_keys_SecureStorage-SecureStorage.html +942 -0
- package/docs/api/module-crypto_keys_SecureStorage.html +516 -0
- package/docs/api/module-crypto_noise.html +169 -0
- package/docs/api/module-crypto_noise_handshake-NoiseHandshake.html +2240 -0
- package/docs/api/module-crypto_noise_handshake.html +782 -0
- package/docs/api/module-crypto_noise_session-NoiseSession.html +1804 -0
- package/docs/api/module-crypto_noise_session.html +325 -0
- package/docs/api/module-crypto_noise_state-SymmetricState.html +1387 -0
- package/docs/api/module-crypto_noise_state.html +324 -0
- package/docs/api/module-crypto_poly1305.html +884 -0
- package/docs/api/module-crypto_sha256-HashContext.html +447 -0
- package/docs/api/module-crypto_sha256.html +942 -0
- package/docs/api/module-crypto_x25519.html +1503 -0
- package/docs/api/module-errors.html +168 -0
- package/docs/api/module-errors_AudioError-AudioError.html +4711 -0
- package/docs/api/module-errors_AudioError.html +178 -0
- package/docs/api/module-errors_ConnectionError-ConnectionError.html +3649 -0
- package/docs/api/module-errors_ConnectionError.html +178 -0
- package/docs/api/module-errors_CryptoError-CryptoError.html +3453 -0
- package/docs/api/module-errors_CryptoError.html +178 -0
- package/docs/api/module-errors_HandshakeError-HandshakeError.html +4261 -0
- package/docs/api/module-errors_HandshakeError.html +178 -0
- package/docs/api/module-errors_MeshError-MeshError.html +2155 -0
- package/docs/api/module-errors_MeshError.html +178 -0
- package/docs/api/module-errors_MessageError-MessageError.html +4545 -0
- package/docs/api/module-errors_MessageError.html +178 -0
- package/docs/api/module-errors_ValidationError-ValidationError.html +3432 -0
- package/docs/api/module-errors_ValidationError.html +178 -0
- package/docs/api/module-hooks.html +182 -0
- package/docs/api/module-hooks_AppStateManager-AppStateManager.html +1620 -0
- package/docs/api/module-hooks_AppStateManager.html +178 -0
- package/docs/api/module-hooks_useMesh.html +457 -0
- package/docs/api/module-hooks_useMessages.html +466 -0
- package/docs/api/module-hooks_usePeers.html +348 -0
- package/docs/api/module-mesh.html +168 -0
- package/docs/api/module-mesh_dedup.html +168 -0
- package/docs/api/module-mesh_dedup_BloomFilter-BloomFilter.html +2158 -0
- package/docs/api/module-mesh_dedup_BloomFilter.html +178 -0
- package/docs/api/module-mesh_dedup_DedupManager-DedupManager.html +2880 -0
- package/docs/api/module-mesh_dedup_DedupManager.html +178 -0
- package/docs/api/module-mesh_dedup_MessageCache-CacheNode.html +246 -0
- package/docs/api/module-mesh_dedup_MessageCache-MessageCache.html +2314 -0
- package/docs/api/module-mesh_dedup_MessageCache.html +181 -0
- package/docs/api/module-mesh_fragment.html +168 -0
- package/docs/api/module-mesh_fragment_Assembler-Assembler.html +2869 -0
- package/docs/api/module-mesh_fragment_Assembler-PendingFragmentSet.html +895 -0
- package/docs/api/module-mesh_fragment_Assembler.html +181 -0
- package/docs/api/module-mesh_fragment_Fragmenter.html +1084 -0
- package/docs/api/module-mesh_peer.html +168 -0
- package/docs/api/module-mesh_peer_Peer-Peer.html +4986 -0
- package/docs/api/module-mesh_peer_Peer.html +178 -0
- package/docs/api/module-mesh_peer_PeerDiscovery-PeerDiscovery.html +3423 -0
- package/docs/api/module-mesh_peer_PeerDiscovery.html +438 -0
- package/docs/api/module-mesh_peer_PeerManager-PeerManager.html +5258 -0
- package/docs/api/module-mesh_peer_PeerManager.html +178 -0
- package/docs/api/module-mesh_router.html +168 -0
- package/docs/api/module-mesh_router_MessageRouter-MessageRouter.html +3285 -0
- package/docs/api/module-mesh_router_MessageRouter.html +178 -0
- package/docs/api/module-mesh_router_PathFinder-PathFinder.html +3323 -0
- package/docs/api/module-mesh_router_PathFinder.html +421 -0
- package/docs/api/module-mesh_router_RouteTable-RouteTable.html +4115 -0
- package/docs/api/module-mesh_router_RouteTable.html +421 -0
- package/docs/api/module-protocol.html +169 -0
- package/docs/api/module-protocol_crc32.html +815 -0
- package/docs/api/module-protocol_deserializer.html +1393 -0
- package/docs/api/module-protocol_header-MessageHeader.html +2879 -0
- package/docs/api/module-protocol_header.html +892 -0
- package/docs/api/module-protocol_message-Message.html +4682 -0
- package/docs/api/module-protocol_message.html +178 -0
- package/docs/api/module-protocol_serializer.html +911 -0
- package/docs/api/module-protocol_validator.html +1396 -0
- package/docs/api/module-rn-ble-mesh.html +866 -0
- package/docs/api/module-service.html +168 -0
- package/docs/api/module-service_HandshakeManager-HandshakeManager.html +185 -0
- package/docs/api/module-service_HandshakeManager.html +175 -0
- package/docs/api/module-service_MeshService-MeshService.html +185 -0
- package/docs/api/module-service_MeshService.html +175 -0
- package/docs/api/module-service_SessionManager-SessionManager.html +174 -0
- package/docs/api/module-service_SessionManager.html +175 -0
- package/docs/api/module-service_audio.html +168 -0
- package/docs/api/module-service_audio_AudioManager-AudioManager.html +4653 -0
- package/docs/api/module-service_audio_AudioManager.html +254 -0
- package/docs/api/module-service_text.html +168 -0
- package/docs/api/module-service_text_TextManager-TextManager.html +6104 -0
- package/docs/api/module-service_text_TextManager.html +254 -0
- package/docs/api/module-service_text_broadcast.html +168 -0
- package/docs/api/module-service_text_broadcast_BroadcastManager-BroadcastManager.html +2434 -0
- package/docs/api/module-service_text_broadcast_BroadcastManager.html +254 -0
- package/docs/api/module-service_text_channel.html +168 -0
- package/docs/api/module-service_text_channel_Channel-Channel.html +4337 -0
- package/docs/api/module-service_text_channel_Channel.html +178 -0
- package/docs/api/module-service_text_channel_ChannelManager-ChannelManager.html +1927 -0
- package/docs/api/module-service_text_channel_ChannelManager.html +175 -0
- package/docs/api/module-service_text_message.html +168 -0
- package/docs/api/module-service_text_message_TextMessage-TextMessage.html +4162 -0
- package/docs/api/module-service_text_message_TextMessage.html +178 -0
- package/docs/api/module-service_text_message_TextSerializer.html +1725 -0
- package/docs/api/module-storage.html +168 -0
- package/docs/api/module-storage_AsyncStorageAdapter-AsyncStorageAdapter.html +4159 -0
- package/docs/api/module-storage_AsyncStorageAdapter.html +178 -0
- package/docs/api/module-storage_MemoryStorage-MemoryStorage.html +3154 -0
- package/docs/api/module-storage_MemoryStorage.html +178 -0
- package/docs/api/module-storage_MessageStore-MessageStore.html +5299 -0
- package/docs/api/module-storage_MessageStore.html +178 -0
- package/docs/api/module-storage_Storage-Storage.html +4169 -0
- package/docs/api/module-storage_Storage.html +178 -0
- package/docs/api/module-transport.html +168 -0
- package/docs/api/module-transport_BLEAdapter-BLEAdapter.html +4724 -0
- package/docs/api/module-transport_BLEAdapter.html +178 -0
- package/docs/api/module-transport_BLETransport-BLETransport.html +3263 -0
- package/docs/api/module-transport_BLETransport.html +178 -0
- package/docs/api/module-transport_MockTransport-MockTransport.html +3947 -0
- package/docs/api/module-transport_MockTransport.html +178 -0
- package/docs/api/module-transport_NodeBLEAdapter-NodeBLEAdapter.html +3216 -0
- package/docs/api/module-transport_NodeBLEAdapter.html +178 -0
- package/docs/api/module-transport_RNBLEAdapter-RNBLEAdapter.html +3216 -0
- package/docs/api/module-transport_RNBLEAdapter.html +178 -0
- package/docs/api/module-transport_Transport-Transport.html +4071 -0
- package/docs/api/module-transport_Transport.html +254 -0
- package/docs/api/module-transport_adapters.html +168 -0
- package/docs/api/module-transport_adapters_BLEAdapter-BLEAdapter.html +4724 -0
- package/docs/api/module-transport_adapters_BLEAdapter.html +178 -0
- package/docs/api/module-transport_adapters_NodeBLEAdapter-NodeBLEAdapter.html +3216 -0
- package/docs/api/module-transport_adapters_NodeBLEAdapter.html +178 -0
- package/docs/api/module-transport_adapters_RNBLEAdapter-RNBLEAdapter.html +3216 -0
- package/docs/api/module-transport_adapters_RNBLEAdapter.html +178 -0
- package/docs/api/module-utils.html +168 -0
- package/docs/api/module-utils_BoundedMap-BoundedMap.html +3301 -0
- package/docs/api/module-utils_BoundedMap.html +178 -0
- package/docs/api/module-utils_EventEmitter-EventEmitter.html +3358 -0
- package/docs/api/module-utils_EventEmitter.html +178 -0
- package/docs/api/module-utils_LRUCache-LRUCache.html +4134 -0
- package/docs/api/module-utils_LRUCache.html +178 -0
- package/docs/api/module-utils_RateLimiter-RateLimiter.html +2176 -0
- package/docs/api/module-utils_RateLimiter.html +500 -0
- package/docs/api/module-utils_TimeoutManager-TimeoutManager.html +1781 -0
- package/docs/api/module-utils_TimeoutManager.html +175 -0
- package/docs/api/module-utils_bytes.html +1789 -0
- package/docs/api/module-utils_debug.html +837 -0
- package/docs/api/module-utils_encoding.html +1184 -0
- package/docs/api/module-utils_retry.html +1457 -0
- package/docs/api/module-utils_time.html +1665 -0
- package/docs/api/module-utils_uuid.html +1269 -0
- package/docs/api/module-utils_validation.html +2176 -0
- package/docs/api/protocol_crc32.js.html +147 -0
- package/docs/api/protocol_deserializer.js.html +295 -0
- package/docs/api/protocol_header.js.html +276 -0
- package/docs/api/protocol_index.js.html +120 -0
- package/docs/api/protocol_message.js.html +287 -0
- package/docs/api/protocol_serializer.js.html +240 -0
- package/docs/api/protocol_validator.js.html +330 -0
- package/docs/api/scripts/linenumber.js +25 -0
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -0
- package/docs/api/scripts/prettify/lang-css.js +2 -0
- package/docs/api/scripts/prettify/prettify.js +28 -0
- package/docs/api/service_HandshakeManager.js.html +232 -0
- package/docs/api/service_MeshService.js.html +371 -0
- package/docs/api/service_SessionManager.js.html +153 -0
- package/docs/api/service_audio_AudioManager.js.html +541 -0
- package/docs/api/service_audio_buffer_FrameBuffer.js.html +223 -0
- package/docs/api/service_audio_buffer_JitterBuffer.js.html +244 -0
- package/docs/api/service_audio_buffer_index.js.html +68 -0
- package/docs/api/service_audio_codec_LC3Codec.js.html +345 -0
- package/docs/api/service_audio_codec_LC3Decoder.js.html +185 -0
- package/docs/api/service_audio_codec_LC3Encoder.js.html +194 -0
- package/docs/api/service_audio_codec_index.js.html +70 -0
- package/docs/api/service_audio_index.js.html +96 -0
- package/docs/api/service_audio_session_AudioSession.js.html +348 -0
- package/docs/api/service_audio_session_VoiceMessage.js.html +432 -0
- package/docs/api/service_audio_session_index.js.html +70 -0
- package/docs/api/service_audio_transport_AudioFragmenter.js.html +314 -0
- package/docs/api/service_audio_transport_AudioFramer.js.html +236 -0
- package/docs/api/service_audio_transport_index.js.html +69 -0
- package/docs/api/service_index.js.html +93 -0
- package/docs/api/service_text_TextManager.js.html +578 -0
- package/docs/api/service_text_broadcast_BroadcastManager.js.html +276 -0
- package/docs/api/service_text_broadcast_index.js.html +66 -0
- package/docs/api/service_text_channel_Channel.js.html +280 -0
- package/docs/api/service_text_channel_ChannelManager.js.html +225 -0
- package/docs/api/service_text_channel_index.js.html +68 -0
- package/docs/api/service_text_index.js.html +85 -0
- package/docs/api/service_text_message_TextMessage.js.html +350 -0
- package/docs/api/service_text_message_TextSerializer.js.html +218 -0
- package/docs/api/service_text_message_index.js.html +68 -0
- package/docs/api/storage_AsyncStorageAdapter.js.html +357 -0
- package/docs/api/storage_MemoryStorage.js.html +279 -0
- package/docs/api/storage_MessageStore.js.html +369 -0
- package/docs/api/storage_Storage.js.html +214 -0
- package/docs/api/storage_index.js.html +72 -0
- package/docs/api/styles/jsdoc-default.css +358 -0
- package/docs/api/styles/prettify-jsdoc.css +111 -0
- package/docs/api/styles/prettify-tomorrow.css +132 -0
- package/docs/api/transport_BLEAdapter.js.html +231 -0
- package/docs/api/transport_BLETransport.js.html +411 -0
- package/docs/api/transport_MockTransport.js.html +339 -0
- package/docs/api/transport_NodeBLEAdapter.js.html +479 -0
- package/docs/api/transport_RNBLEAdapter.js.html +382 -0
- package/docs/api/transport_Transport.js.html +242 -0
- package/docs/api/transport_adapters_BLEAdapter.js.html +231 -0
- package/docs/api/transport_adapters_NodeBLEAdapter.js.html +479 -0
- package/docs/api/transport_adapters_RNBLEAdapter.js.html +382 -0
- package/docs/api/transport_adapters_index.js.html +70 -0
- package/docs/api/transport_index.js.html +87 -0
- package/docs/api/utils_BoundedMap.js.html +205 -0
- package/docs/api/utils_EventEmitter.js.html +259 -0
- package/docs/api/utils_LRUCache.js.html +256 -0
- package/docs/api/utils_RateLimiter.js.html +256 -0
- package/docs/api/utils_TimeoutManager.js.html +218 -0
- 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
- package/docs/api/utils_base64.js.html +205 -0
- package/docs/api/utils_bytes.js.html +241 -0
- package/docs/api/utils_debug.js.html +205 -0
- package/docs/api/utils_encoding.js.html +302 -0
- package/docs/api/utils_index.js.html +160 -0
- package/docs/api/utils_retry.js.html +200 -0
- package/docs/api/utils_time.js.html +220 -0
- package/docs/api/utils_uuid.js.html +199 -0
- package/docs/api/utils_validation.js.html +259 -0
- package/examples/node-chat/chat.js +220 -0
- package/examples/node-quickstart/index.js +94 -0
- package/examples/testing/test-helper.js +182 -0
- package/package.json +111 -0
- package/src/constants/audio.js +130 -0
- package/src/constants/ble.js +111 -0
- package/src/constants/crypto.js +53 -0
- package/src/constants/errors.js +202 -0
- package/src/constants/events.js +94 -0
- package/src/constants/index.js +22 -0
- package/src/constants/protocol.js +151 -0
- package/src/crypto/aead.js +189 -0
- package/src/crypto/chacha20.js +181 -0
- package/src/crypto/hkdf.js +187 -0
- package/src/crypto/hmac.js +143 -0
- package/src/crypto/index.js +72 -0
- package/src/crypto/keys/KeyManager.js +271 -0
- package/src/crypto/keys/KeyPair.js +216 -0
- package/src/crypto/keys/SecureStorage.js +219 -0
- package/src/crypto/keys/index.js +32 -0
- package/src/crypto/noise/handshake.js +410 -0
- package/src/crypto/noise/index.js +27 -0
- package/src/crypto/noise/session.js +253 -0
- package/src/crypto/noise/state.js +268 -0
- package/src/crypto/poly1305.js +113 -0
- package/src/crypto/sha256.js +240 -0
- package/src/crypto/x25519.js +154 -0
- package/src/errors/AudioError.js +164 -0
- package/src/errors/ConnectionError.js +109 -0
- package/src/errors/CryptoError.js +103 -0
- package/src/errors/HandshakeError.js +122 -0
- package/src/errors/MeshError.js +100 -0
- package/src/errors/MessageError.js +129 -0
- package/src/errors/ValidationError.js +150 -0
- package/src/errors/index.js +24 -0
- package/src/hooks/AppStateManager.js +179 -0
- package/src/hooks/index.js +33 -0
- package/src/hooks/useMesh.js +159 -0
- package/src/hooks/useMessages.js +209 -0
- package/src/hooks/usePeers.js +111 -0
- package/src/index.d.ts +494 -0
- package/src/index.js +182 -0
- package/src/index.mjs +62 -0
- package/src/mesh/dedup/BloomFilter.js +207 -0
- package/src/mesh/dedup/DedupManager.js +212 -0
- package/src/mesh/dedup/MessageCache.js +219 -0
- package/src/mesh/dedup/index.js +16 -0
- package/src/mesh/fragment/Assembler.js +281 -0
- package/src/mesh/fragment/Fragmenter.js +176 -0
- package/src/mesh/fragment/index.js +21 -0
- package/src/mesh/index.js +18 -0
- package/src/mesh/peer/Peer.js +242 -0
- package/src/mesh/peer/PeerDiscovery.js +280 -0
- package/src/mesh/peer/PeerManager.js +266 -0
- package/src/mesh/peer/index.js +16 -0
- package/src/mesh/router/MessageRouter.js +357 -0
- package/src/mesh/router/PathFinder.js +332 -0
- package/src/mesh/router/RouteTable.js +292 -0
- package/src/mesh/router/index.js +16 -0
- package/src/protocol/crc32.js +93 -0
- package/src/protocol/deserializer.js +241 -0
- package/src/protocol/header.js +222 -0
- package/src/protocol/index.js +66 -0
- package/src/protocol/message.js +233 -0
- package/src/protocol/serializer.js +186 -0
- package/src/protocol/validator.js +276 -0
- package/src/service/HandshakeManager.js +178 -0
- package/src/service/MeshService.js +317 -0
- package/src/service/SessionManager.js +99 -0
- package/src/service/audio/AudioManager.js +487 -0
- package/src/service/audio/buffer/FrameBuffer.js +169 -0
- package/src/service/audio/buffer/JitterBuffer.js +190 -0
- package/src/service/audio/buffer/index.js +14 -0
- package/src/service/audio/codec/LC3Codec.js +291 -0
- package/src/service/audio/codec/LC3Decoder.js +131 -0
- package/src/service/audio/codec/LC3Encoder.js +140 -0
- package/src/service/audio/codec/index.js +16 -0
- package/src/service/audio/index.js +42 -0
- package/src/service/audio/session/AudioSession.js +294 -0
- package/src/service/audio/session/VoiceMessage.js +378 -0
- package/src/service/audio/session/index.js +16 -0
- package/src/service/audio/transport/AudioFragmenter.js +260 -0
- package/src/service/audio/transport/AudioFramer.js +182 -0
- package/src/service/audio/transport/index.js +15 -0
- package/src/service/index.js +39 -0
- package/src/service/text/TextManager.js +524 -0
- package/src/service/text/broadcast/BroadcastManager.js +222 -0
- package/src/service/text/broadcast/index.js +12 -0
- package/src/service/text/channel/Channel.js +226 -0
- package/src/service/text/channel/ChannelManager.js +171 -0
- package/src/service/text/channel/index.js +14 -0
- package/src/service/text/index.js +31 -0
- package/src/service/text/message/TextMessage.js +296 -0
- package/src/service/text/message/TextSerializer.js +164 -0
- package/src/service/text/message/index.js +14 -0
- package/src/storage/AsyncStorageAdapter.js +303 -0
- package/src/storage/MemoryStorage.js +225 -0
- package/src/storage/MessageStore.js +315 -0
- package/src/storage/Storage.js +160 -0
- package/src/storage/index.js +18 -0
- package/src/transport/BLEAdapter.js +177 -0
- package/src/transport/BLETransport.js +357 -0
- package/src/transport/MockTransport.js +285 -0
- package/src/transport/NodeBLEAdapter.js +425 -0
- package/src/transport/RNBLEAdapter.js +328 -0
- package/src/transport/Transport.js +188 -0
- package/src/transport/adapters/BLEAdapter.js +177 -0
- package/src/transport/adapters/NodeBLEAdapter.js +425 -0
- package/src/transport/adapters/RNBLEAdapter.js +328 -0
- package/src/transport/adapters/index.js +16 -0
- package/src/transport/index.js +33 -0
- package/src/utils/BoundedMap.js +151 -0
- package/src/utils/EventEmitter.js +205 -0
- package/src/utils/LRUCache.js +202 -0
- package/src/utils/RateLimiter.js +202 -0
- package/src/utils/TimeoutManager.js +164 -0
- package/src/utils/base64.js +151 -0
- package/src/utils/bytes.js +187 -0
- package/src/utils/debug.js +151 -0
- package/src/utils/encoding.js +248 -0
- package/src/utils/index.js +106 -0
- package/src/utils/retry.js +146 -0
- package/src/utils/time.js +166 -0
- package/src/utils/uuid.js +145 -0
- 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.
|