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,315 @@
|
|
|
1
|
+
# React Native Integration Guide
|
|
2
|
+
|
|
3
|
+
This guide covers how to use the BLE Mesh library in React Native applications.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install react-native-ble-mesh
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Peer Dependencies
|
|
12
|
+
|
|
13
|
+
Install the BLE library for your platform:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# React Native
|
|
17
|
+
npm install react-native-ble-plx
|
|
18
|
+
|
|
19
|
+
# Expo
|
|
20
|
+
npx expo install react-native-ble-plx
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### iOS Setup
|
|
24
|
+
|
|
25
|
+
Add to `ios/Podfile`:
|
|
26
|
+
```ruby
|
|
27
|
+
pod 'react-native-ble-plx'
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Add to `Info.plist`:
|
|
31
|
+
```xml
|
|
32
|
+
<key>NSBluetoothAlwaysUsageDescription</key>
|
|
33
|
+
<string>This app uses Bluetooth to communicate with nearby devices.</string>
|
|
34
|
+
<key>NSBluetoothPeripheralUsageDescription</key>
|
|
35
|
+
<string>This app uses Bluetooth to communicate with nearby devices.</string>
|
|
36
|
+
<key>UIBackgroundModes</key>
|
|
37
|
+
<array>
|
|
38
|
+
<string>bluetooth-central</string>
|
|
39
|
+
<string>bluetooth-peripheral</string>
|
|
40
|
+
</array>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Android Setup
|
|
44
|
+
|
|
45
|
+
Add to `android/app/src/main/AndroidManifest.xml`:
|
|
46
|
+
```xml
|
|
47
|
+
<uses-permission android:name="android.permission.BLUETOOTH" />
|
|
48
|
+
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
|
49
|
+
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
|
|
50
|
+
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
|
51
|
+
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
|
|
52
|
+
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Quick Start with Hooks
|
|
56
|
+
|
|
57
|
+
The easiest way to use BLE Mesh in React Native is with the provided hooks:
|
|
58
|
+
|
|
59
|
+
```jsx
|
|
60
|
+
import React, { useEffect } from 'react';
|
|
61
|
+
import { View, Text, FlatList, Button } from 'react-native';
|
|
62
|
+
import { useMesh, usePeers, useMessages, BLETransport } from 'react-native-ble-mesh';
|
|
63
|
+
|
|
64
|
+
function ChatApp() {
|
|
65
|
+
const { mesh, state, initialize, isActive } = useMesh({
|
|
66
|
+
displayName: 'MyDevice'
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const { peers, connectedPeers } = usePeers(mesh);
|
|
70
|
+
const { messages, sendBroadcast } = useMessages(mesh);
|
|
71
|
+
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
async function setup() {
|
|
74
|
+
const transport = new BLETransport();
|
|
75
|
+
await initialize(transport);
|
|
76
|
+
}
|
|
77
|
+
setup();
|
|
78
|
+
}, []);
|
|
79
|
+
|
|
80
|
+
if (!isActive) {
|
|
81
|
+
return <Text>Connecting... ({state})</Text>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<View>
|
|
86
|
+
<Text>Connected to {connectedPeers.length} peers</Text>
|
|
87
|
+
|
|
88
|
+
<FlatList
|
|
89
|
+
data={messages}
|
|
90
|
+
keyExtractor={item => item.id}
|
|
91
|
+
renderItem={({ item }) => (
|
|
92
|
+
<Text>{item.content}</Text>
|
|
93
|
+
)}
|
|
94
|
+
/>
|
|
95
|
+
|
|
96
|
+
<Button
|
|
97
|
+
title="Send Hello"
|
|
98
|
+
onPress={() => sendBroadcast('Hello!')}
|
|
99
|
+
/>
|
|
100
|
+
</View>
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Available Hooks
|
|
106
|
+
|
|
107
|
+
### useMesh(config)
|
|
108
|
+
|
|
109
|
+
Main hook for managing the MeshService lifecycle.
|
|
110
|
+
|
|
111
|
+
```jsx
|
|
112
|
+
const {
|
|
113
|
+
mesh, // MeshService instance
|
|
114
|
+
state, // Current state: 'uninitialized' | 'initializing' | 'ready' | 'active' | 'error'
|
|
115
|
+
error, // Error object if state is 'error'
|
|
116
|
+
initialize, // Function to initialize mesh (optionally with transport)
|
|
117
|
+
start, // Function to start with a transport
|
|
118
|
+
stop, // Function to stop the mesh
|
|
119
|
+
destroy, // Function to destroy and cleanup
|
|
120
|
+
isReady, // Boolean: state is 'ready' or 'active'
|
|
121
|
+
isActive // Boolean: state is 'active'
|
|
122
|
+
} = useMesh({
|
|
123
|
+
displayName: 'MyDevice', // Optional display name
|
|
124
|
+
storage: customStorage // Optional custom storage adapter
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### usePeers(mesh)
|
|
129
|
+
|
|
130
|
+
Hook for managing and observing peers.
|
|
131
|
+
|
|
132
|
+
```jsx
|
|
133
|
+
const {
|
|
134
|
+
peers, // Array of all known peers
|
|
135
|
+
connectedPeers, // Array of connected peers
|
|
136
|
+
securedPeers, // Array of peers with secure sessions
|
|
137
|
+
peerCount, // Total peer count
|
|
138
|
+
connectedCount, // Connected peer count
|
|
139
|
+
getPeer, // Function: getPeer(peerId) => Peer
|
|
140
|
+
isConnected, // Function: isConnected(peerId) => boolean
|
|
141
|
+
refresh, // Function to manually refresh peer list
|
|
142
|
+
lastUpdate // Timestamp of last update
|
|
143
|
+
} = usePeers(mesh);
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### useMessages(mesh, options)
|
|
147
|
+
|
|
148
|
+
Hook for sending and receiving messages.
|
|
149
|
+
|
|
150
|
+
```jsx
|
|
151
|
+
const {
|
|
152
|
+
messages, // Array of messages (newest first)
|
|
153
|
+
sending, // Boolean: currently sending a private message
|
|
154
|
+
error, // Error from last send attempt
|
|
155
|
+
sendBroadcast, // Function: sendBroadcast(content) => messageId
|
|
156
|
+
sendPrivate, // Function: await sendPrivate(peerId, content) => messageId
|
|
157
|
+
sendToChannel, // Function: sendToChannel(channelId, content) => messageId
|
|
158
|
+
clearMessages, // Function to clear message history
|
|
159
|
+
messageCount // Number of messages in state
|
|
160
|
+
} = useMessages(mesh, {
|
|
161
|
+
maxMessages: 100 // Maximum messages to keep in state
|
|
162
|
+
});
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## App State Management
|
|
166
|
+
|
|
167
|
+
Use `AppStateManager` to automatically handle background/foreground transitions:
|
|
168
|
+
|
|
169
|
+
```jsx
|
|
170
|
+
import { useMesh, AppStateManager } from 'react-native-ble-mesh';
|
|
171
|
+
|
|
172
|
+
function App() {
|
|
173
|
+
const { mesh, initialize } = useMesh();
|
|
174
|
+
const appStateRef = useRef(null);
|
|
175
|
+
|
|
176
|
+
useEffect(() => {
|
|
177
|
+
async function setup() {
|
|
178
|
+
await initialize(transport);
|
|
179
|
+
|
|
180
|
+
// Setup app state management
|
|
181
|
+
appStateRef.current = new AppStateManager(mesh, {
|
|
182
|
+
backgroundMode: 'ULTRA_POWER_SAVER',
|
|
183
|
+
foregroundMode: 'BALANCED'
|
|
184
|
+
});
|
|
185
|
+
appStateRef.current.initialize();
|
|
186
|
+
}
|
|
187
|
+
setup();
|
|
188
|
+
|
|
189
|
+
return () => {
|
|
190
|
+
appStateRef.current?.destroy();
|
|
191
|
+
};
|
|
192
|
+
}, []);
|
|
193
|
+
|
|
194
|
+
// ...
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Power Modes
|
|
199
|
+
|
|
200
|
+
The library supports different power modes for battery optimization:
|
|
201
|
+
|
|
202
|
+
```jsx
|
|
203
|
+
// Set power mode manually
|
|
204
|
+
mesh.setPowerMode('BALANCED');
|
|
205
|
+
|
|
206
|
+
// Available modes:
|
|
207
|
+
// - 'PERFORMANCE': Maximum responsiveness, highest power consumption
|
|
208
|
+
// - 'BALANCED': Good balance of responsiveness and battery life
|
|
209
|
+
// - 'POWER_SAVER': Reduced responsiveness, lower power consumption
|
|
210
|
+
// - 'ULTRA_POWER_SAVER': Minimal power consumption, for background operation
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Best Practices
|
|
214
|
+
|
|
215
|
+
### 1. Permission Handling
|
|
216
|
+
|
|
217
|
+
Always request Bluetooth permissions before initializing:
|
|
218
|
+
|
|
219
|
+
```jsx
|
|
220
|
+
import { PermissionsAndroid, Platform } from 'react-native';
|
|
221
|
+
|
|
222
|
+
async function requestPermissions() {
|
|
223
|
+
if (Platform.OS === 'android') {
|
|
224
|
+
const granted = await PermissionsAndroid.requestMultiple([
|
|
225
|
+
PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN,
|
|
226
|
+
PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT,
|
|
227
|
+
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION
|
|
228
|
+
]);
|
|
229
|
+
return Object.values(granted).every(
|
|
230
|
+
status => status === PermissionsAndroid.RESULTS.GRANTED
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
return true;
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### 2. Cleanup on Unmount
|
|
238
|
+
|
|
239
|
+
Always cleanup when component unmounts:
|
|
240
|
+
|
|
241
|
+
```jsx
|
|
242
|
+
useEffect(() => {
|
|
243
|
+
initialize(transport);
|
|
244
|
+
|
|
245
|
+
return () => {
|
|
246
|
+
destroy();
|
|
247
|
+
};
|
|
248
|
+
}, []);
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### 3. Handle Connection States
|
|
252
|
+
|
|
253
|
+
Check connection state before sending messages:
|
|
254
|
+
|
|
255
|
+
```jsx
|
|
256
|
+
const handleSend = async (peerId, message) => {
|
|
257
|
+
if (!isConnected(peerId)) {
|
|
258
|
+
Alert.alert('Error', 'Peer is not connected');
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
try {
|
|
263
|
+
await sendPrivate(peerId, message);
|
|
264
|
+
} catch (error) {
|
|
265
|
+
Alert.alert('Send Failed', error.message);
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### 4. Memory Management
|
|
271
|
+
|
|
272
|
+
The library uses bounded maps and automatic cleanup, but for large message volumes:
|
|
273
|
+
|
|
274
|
+
```jsx
|
|
275
|
+
// Limit messages in state
|
|
276
|
+
const { messages } = useMessages(mesh, { maxMessages: 50 });
|
|
277
|
+
|
|
278
|
+
// Clear old messages periodically
|
|
279
|
+
useEffect(() => {
|
|
280
|
+
const interval = setInterval(() => {
|
|
281
|
+
if (messages.length > 100) {
|
|
282
|
+
clearMessages();
|
|
283
|
+
}
|
|
284
|
+
}, 60000);
|
|
285
|
+
|
|
286
|
+
return () => clearInterval(interval);
|
|
287
|
+
}, [messages.length]);
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## Troubleshooting
|
|
291
|
+
|
|
292
|
+
### BLE Not Working
|
|
293
|
+
|
|
294
|
+
1. Check permissions are granted
|
|
295
|
+
2. Ensure Bluetooth is enabled
|
|
296
|
+
3. Check device supports BLE
|
|
297
|
+
4. Verify peer dependencies are installed
|
|
298
|
+
|
|
299
|
+
### Connection Issues
|
|
300
|
+
|
|
301
|
+
1. Ensure devices are within range (~10m for BLE)
|
|
302
|
+
2. Check both devices have the app running
|
|
303
|
+
3. Try restarting Bluetooth
|
|
304
|
+
4. Check for BLE interference
|
|
305
|
+
|
|
306
|
+
### Performance Issues
|
|
307
|
+
|
|
308
|
+
1. Use `POWER_SAVER` mode when appropriate
|
|
309
|
+
2. Limit message size
|
|
310
|
+
3. Use batch operations for multiple messages
|
|
311
|
+
4. Clear old messages from state
|
|
312
|
+
|
|
313
|
+
## Example Project
|
|
314
|
+
|
|
315
|
+
See the `examples/react-native-app/` directory for a complete example application.
|
package/docs/SECURITY.md
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Security Documentation
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The BLE Mesh Network library implements end-to-end encryption using the Noise Protocol Framework with carefully chosen cryptographic primitives.
|
|
6
|
+
|
|
7
|
+
## Threat Model
|
|
8
|
+
|
|
9
|
+
### In Scope
|
|
10
|
+
|
|
11
|
+
- **Passive Eavesdropping**: Attackers can observe all BLE traffic
|
|
12
|
+
- **Active MITM**: Attackers can intercept and modify messages
|
|
13
|
+
- **Replay Attacks**: Attackers can record and replay messages
|
|
14
|
+
- **Identity Spoofing**: Attackers can attempt to impersonate peers
|
|
15
|
+
|
|
16
|
+
### Out of Scope
|
|
17
|
+
|
|
18
|
+
- **Physical Device Compromise**: Attacker has physical access to device
|
|
19
|
+
- **Side-Channel Attacks**: Timing attacks, power analysis
|
|
20
|
+
- **Denial of Service**: Resource exhaustion attacks
|
|
21
|
+
- **Traffic Analysis**: Message timing and size patterns
|
|
22
|
+
|
|
23
|
+
## Cryptographic Primitives
|
|
24
|
+
|
|
25
|
+
### Key Exchange: X25519
|
|
26
|
+
|
|
27
|
+
- Elliptic Curve Diffie-Hellman on Curve25519
|
|
28
|
+
- 128-bit security level
|
|
29
|
+
- Fast, constant-time implementation
|
|
30
|
+
- RFC 7748 compliant
|
|
31
|
+
|
|
32
|
+
### Encryption: ChaCha20-Poly1305
|
|
33
|
+
|
|
34
|
+
- ChaCha20 stream cipher for encryption
|
|
35
|
+
- Poly1305 MAC for authentication
|
|
36
|
+
- Combined AEAD construction
|
|
37
|
+
- RFC 8439 compliant
|
|
38
|
+
- 256-bit key, 96-bit nonce, 128-bit tag
|
|
39
|
+
|
|
40
|
+
### Hash Function: SHA-256
|
|
41
|
+
|
|
42
|
+
- FIPS 180-4 compliant
|
|
43
|
+
- Used in HKDF for key derivation
|
|
44
|
+
- Used in Noise Protocol for transcript hashing
|
|
45
|
+
|
|
46
|
+
## Noise Protocol XX
|
|
47
|
+
|
|
48
|
+
### Pattern
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
XX:
|
|
52
|
+
-> e
|
|
53
|
+
<- e, ee, s, es
|
|
54
|
+
-> s, se
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Security Properties
|
|
58
|
+
|
|
59
|
+
1. **Mutual Authentication**: Both parties prove possession of static keys
|
|
60
|
+
2. **Forward Secrecy**: Ephemeral keys provide protection for past sessions
|
|
61
|
+
3. **Identity Hiding**: Static public keys are encrypted
|
|
62
|
+
4. **Replay Protection**: Handshake transcript binding prevents replay
|
|
63
|
+
|
|
64
|
+
### Message Flow
|
|
65
|
+
|
|
66
|
+
1. **Message 1** (Initiator → Responder):
|
|
67
|
+
- Initiator sends ephemeral public key `e`
|
|
68
|
+
- Unencrypted, establishes initial key material
|
|
69
|
+
|
|
70
|
+
2. **Message 2** (Responder → Initiator):
|
|
71
|
+
- Responder sends ephemeral public key `e`
|
|
72
|
+
- Performs DH: `ee = DH(e_responder, e_initiator)`
|
|
73
|
+
- Sends encrypted static public key `s`
|
|
74
|
+
- Performs DH: `es = DH(e_initiator, s_responder)`
|
|
75
|
+
|
|
76
|
+
3. **Message 3** (Initiator → Responder):
|
|
77
|
+
- Initiator sends encrypted static public key `s`
|
|
78
|
+
- Performs DH: `se = DH(s_initiator, e_responder)`
|
|
79
|
+
- Session keys derived
|
|
80
|
+
|
|
81
|
+
## Key Management
|
|
82
|
+
|
|
83
|
+
### Identity Keys
|
|
84
|
+
|
|
85
|
+
- Generated using cryptographically secure random number generator
|
|
86
|
+
- 32-byte X25519 secret key
|
|
87
|
+
- Should be stored in secure storage (Keychain/Keystore)
|
|
88
|
+
|
|
89
|
+
### Session Keys
|
|
90
|
+
|
|
91
|
+
- Derived from Noise handshake
|
|
92
|
+
- Separate keys for send and receive directions
|
|
93
|
+
- 32-byte ChaCha20 keys
|
|
94
|
+
|
|
95
|
+
### Nonce Management
|
|
96
|
+
|
|
97
|
+
- 64-bit counter, incremented per message
|
|
98
|
+
- Maximum 2^64 messages per session
|
|
99
|
+
- Session must be rekeyed before exhaustion
|
|
100
|
+
|
|
101
|
+
## Implementation Security
|
|
102
|
+
|
|
103
|
+
### Constant-Time Operations
|
|
104
|
+
|
|
105
|
+
- Tag comparison uses constant-time comparison
|
|
106
|
+
- Prevents timing attacks on authentication
|
|
107
|
+
|
|
108
|
+
### Key Zeroing
|
|
109
|
+
|
|
110
|
+
- Sensitive key material zeroed after use
|
|
111
|
+
- `KeyPair.destroy()` overwrites secret keys
|
|
112
|
+
|
|
113
|
+
### No Secrets in Logs
|
|
114
|
+
|
|
115
|
+
- Error messages never contain key material
|
|
116
|
+
- Debug output sanitized
|
|
117
|
+
|
|
118
|
+
## Security Recommendations
|
|
119
|
+
|
|
120
|
+
1. **Store Identity Keys Securely**
|
|
121
|
+
- Use platform secure storage (iOS Keychain, Android Keystore)
|
|
122
|
+
- Never export keys to plaintext storage
|
|
123
|
+
|
|
124
|
+
2. **Verify Peer Identity**
|
|
125
|
+
- Display public key fingerprints to users
|
|
126
|
+
- Allow users to verify out-of-band
|
|
127
|
+
|
|
128
|
+
3. **Handle Session Expiry**
|
|
129
|
+
- Implement session timeout
|
|
130
|
+
- Rekey on reconnection
|
|
131
|
+
|
|
132
|
+
4. **Monitor for Anomalies**
|
|
133
|
+
- Track failed handshakes
|
|
134
|
+
- Alert on repeated failures
|
|
135
|
+
|
|
136
|
+
## Known Limitations
|
|
137
|
+
|
|
138
|
+
1. **No Post-Quantum Security**: X25519 is vulnerable to quantum computers
|
|
139
|
+
2. **No Deniability**: Messages can be proven to come from a specific key
|
|
140
|
+
3. **No Group Key Agreement**: Channels use pairwise encryption
|
|
141
|
+
4. **Metadata Exposure**: Message timing and sizes are visible
|
|
142
|
+
|
|
143
|
+
## Audit Status
|
|
144
|
+
|
|
145
|
+
This library has not been independently audited. Use in production at your own risk.
|
|
146
|
+
|
|
147
|
+
## References
|
|
148
|
+
|
|
149
|
+
- [Noise Protocol Framework](https://noiseprotocol.org/)
|
|
150
|
+
- [RFC 7748 - X25519](https://tools.ietf.org/html/rfc7748)
|
|
151
|
+
- [RFC 8439 - ChaCha20-Poly1305](https://tools.ietf.org/html/rfc8439)
|
|
152
|
+
- [FIPS 180-4 - SHA-256](https://csrc.nist.gov/publications/detail/fips/180/4/final)
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>JSDoc: Source: constants/audio.js</title>
|
|
6
|
+
|
|
7
|
+
<script src="scripts/prettify/prettify.js"> </script>
|
|
8
|
+
<script src="scripts/prettify/lang-css.js"> </script>
|
|
9
|
+
<!--[if lt IE 9]>
|
|
10
|
+
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
11
|
+
<![endif]-->
|
|
12
|
+
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
|
|
13
|
+
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
|
|
14
|
+
</head>
|
|
15
|
+
|
|
16
|
+
<body>
|
|
17
|
+
|
|
18
|
+
<div id="main">
|
|
19
|
+
|
|
20
|
+
<h1 class="page-title">Source: constants/audio.js</h1>
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
<section>
|
|
28
|
+
<article>
|
|
29
|
+
<pre class="prettyprint source linenums"><code>/**
|
|
30
|
+
* @fileoverview Audio constants for LC3 codec and audio streaming
|
|
31
|
+
* @module constants/audio
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
'use strict';
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* LC3 codec configuration
|
|
38
|
+
* @constant {Object}
|
|
39
|
+
*/
|
|
40
|
+
const LC3_CONFIG = Object.freeze({
|
|
41
|
+
/** Supported sample rates (Hz) */
|
|
42
|
+
SAMPLE_RATES: [16000, 24000, 32000, 48000],
|
|
43
|
+
/** Default sample rate for voice (optimized for speech) */
|
|
44
|
+
DEFAULT_SAMPLE_RATE: 16000,
|
|
45
|
+
/** Supported frame durations (ms) */
|
|
46
|
+
FRAME_DURATIONS: [7.5, 10],
|
|
47
|
+
/** Default frame duration */
|
|
48
|
+
DEFAULT_FRAME_DURATION_MS: 10,
|
|
49
|
+
/** Bit rate presets (bps) */
|
|
50
|
+
BIT_RATES: {
|
|
51
|
+
LOW: 16000,
|
|
52
|
+
MEDIUM: 24000,
|
|
53
|
+
HIGH: 32000
|
|
54
|
+
},
|
|
55
|
+
/** Default bit rate for voice */
|
|
56
|
+
DEFAULT_BIT_RATE: 24000,
|
|
57
|
+
/** Channels */
|
|
58
|
+
CHANNELS: {
|
|
59
|
+
MONO: 1,
|
|
60
|
+
STEREO: 2
|
|
61
|
+
},
|
|
62
|
+
/** Default channel count (mono for voice) */
|
|
63
|
+
DEFAULT_CHANNELS: 1
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Audio quality presets
|
|
68
|
+
* @constant {Object.<string, Object>}
|
|
69
|
+
*/
|
|
70
|
+
const AUDIO_QUALITY = Object.freeze({
|
|
71
|
+
LOW: {
|
|
72
|
+
sampleRate: 16000,
|
|
73
|
+
bitRate: 16000,
|
|
74
|
+
frameMs: 10,
|
|
75
|
+
channels: 1
|
|
76
|
+
},
|
|
77
|
+
MEDIUM: {
|
|
78
|
+
sampleRate: 16000,
|
|
79
|
+
bitRate: 24000,
|
|
80
|
+
frameMs: 10,
|
|
81
|
+
channels: 1
|
|
82
|
+
},
|
|
83
|
+
HIGH: {
|
|
84
|
+
sampleRate: 24000,
|
|
85
|
+
bitRate: 32000,
|
|
86
|
+
frameMs: 10,
|
|
87
|
+
channels: 1
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Voice message configuration
|
|
93
|
+
* @constant {Object}
|
|
94
|
+
*/
|
|
95
|
+
const VOICE_MESSAGE_CONFIG = Object.freeze({
|
|
96
|
+
/** Maximum voice message duration in seconds */
|
|
97
|
+
MAX_DURATION_SEC: 300,
|
|
98
|
+
/** Maximum voice message size in bytes (512KB) */
|
|
99
|
+
MAX_SIZE_BYTES: 512 * 1024,
|
|
100
|
+
/** Chunk size for voice message data (fits BLE MTU) */
|
|
101
|
+
CHUNK_SIZE: 180,
|
|
102
|
+
/** Voice message assembly timeout in milliseconds */
|
|
103
|
+
TIMEOUT_MS: 120000,
|
|
104
|
+
/** Voice message header size */
|
|
105
|
+
HEADER_SIZE: 51
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Audio streaming configuration
|
|
110
|
+
* @constant {Object}
|
|
111
|
+
*/
|
|
112
|
+
const AUDIO_STREAM_CONFIG = Object.freeze({
|
|
113
|
+
/** Default jitter buffer size in frames */
|
|
114
|
+
JITTER_BUFFER_FRAMES: 5,
|
|
115
|
+
/** Maximum jitter buffer size in frames */
|
|
116
|
+
MAX_JITTER_BUFFER_FRAMES: 20,
|
|
117
|
+
/** Frame timeout in milliseconds */
|
|
118
|
+
FRAME_TIMEOUT_MS: 100,
|
|
119
|
+
/** Maximum consecutive dropped frames before quality event */
|
|
120
|
+
MAX_DROPPED_FRAMES: 10,
|
|
121
|
+
/** Session timeout in milliseconds */
|
|
122
|
+
SESSION_TIMEOUT_MS: 60000,
|
|
123
|
+
/** Audio frame header size */
|
|
124
|
+
FRAME_HEADER_SIZE: 8
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Audio session states
|
|
129
|
+
* @constant {Object.<string, string>}
|
|
130
|
+
*/
|
|
131
|
+
const AUDIO_SESSION_STATE = Object.freeze({
|
|
132
|
+
IDLE: 'idle',
|
|
133
|
+
REQUESTING: 'requesting',
|
|
134
|
+
PENDING: 'pending',
|
|
135
|
+
ACTIVE: 'active',
|
|
136
|
+
PAUSED: 'paused',
|
|
137
|
+
ENDING: 'ending',
|
|
138
|
+
ENDED: 'ended',
|
|
139
|
+
FAILED: 'failed'
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Audio codec types
|
|
144
|
+
* @constant {Object.<string, number>}
|
|
145
|
+
*/
|
|
146
|
+
const AUDIO_CODEC_TYPE = Object.freeze({
|
|
147
|
+
LC3: 0x01,
|
|
148
|
+
OPUS: 0x02
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
module.exports = {
|
|
152
|
+
LC3_CONFIG,
|
|
153
|
+
AUDIO_QUALITY,
|
|
154
|
+
VOICE_MESSAGE_CONFIG,
|
|
155
|
+
AUDIO_STREAM_CONFIG,
|
|
156
|
+
AUDIO_SESSION_STATE,
|
|
157
|
+
AUDIO_CODEC_TYPE
|
|
158
|
+
};
|
|
159
|
+
</code></pre>
|
|
160
|
+
</article>
|
|
161
|
+
</section>
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
</div>
|
|
167
|
+
|
|
168
|
+
<nav>
|
|
169
|
+
<h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-audio_buffer.html">audio/buffer</a></li><li><a href="module-audio_buffer_FrameBuffer.html">audio/buffer/FrameBuffer</a></li><li><a href="module-audio_buffer_JitterBuffer.html">audio/buffer/JitterBuffer</a></li><li><a href="module-audio_codec.html">audio/codec</a></li><li><a href="module-audio_codec_LC3Codec.html">audio/codec/LC3Codec</a></li><li><a href="module-audio_codec_LC3Decoder.html">audio/codec/LC3Decoder</a></li><li><a href="module-audio_codec_LC3Encoder.html">audio/codec/LC3Encoder</a></li><li><a href="module-audio_session.html">audio/session</a></li><li><a href="module-audio_session_AudioSession.html">audio/session/AudioSession</a></li><li><a href="module-audio_session_VoiceMessage.html">audio/session/VoiceMessage</a></li><li><a href="module-audio_transport.html">audio/transport</a></li><li><a href="module-audio_transport_AudioFragmenter.html">audio/transport/AudioFragmenter</a></li><li><a href="module-audio_transport_AudioFramer.html">audio/transport/AudioFramer</a></li><li><a href="module-constants.html">constants</a></li><li><a href="module-constants_audio.html">constants/audio</a></li><li><a href="module-constants_ble.html">constants/ble</a></li><li><a href="module-constants_crypto.html">constants/crypto</a></li><li><a href="module-constants_errors.html">constants/errors</a></li><li><a href="module-constants_events.html">constants/events</a></li><li><a href="module-constants_protocol.html">constants/protocol</a></li><li><a href="module-crypto.html">crypto</a></li><li><a href="module-crypto_aead.html">crypto/aead</a></li><li><a href="module-crypto_chacha20.html">crypto/chacha20</a></li><li><a href="module-crypto_hkdf.html">crypto/hkdf</a></li><li><a href="module-crypto_hmac.html">crypto/hmac</a></li><li><a href="module-crypto_keys.html">crypto/keys</a></li><li><a href="module-crypto_keys_KeyManager.html">crypto/keys/KeyManager</a></li><li><a href="module-crypto_keys_KeyPair.html">crypto/keys/KeyPair</a></li><li><a href="module-crypto_keys_SecureStorage.html">crypto/keys/SecureStorage</a></li><li><a href="module-crypto_noise.html">crypto/noise</a></li><li><a href="module-crypto_noise_handshake.html">crypto/noise/handshake</a></li><li><a href="module-crypto_noise_session.html">crypto/noise/session</a></li><li><a href="module-crypto_noise_state.html">crypto/noise/state</a></li><li><a href="module-crypto_poly1305.html">crypto/poly1305</a></li><li><a href="module-crypto_sha256.html">crypto/sha256</a></li><li><a href="module-crypto_x25519.html">crypto/x25519</a></li><li><a href="module-errors.html">errors</a></li><li><a href="module-errors_AudioError.html">errors/AudioError</a></li><li><a href="module-errors_ConnectionError.html">errors/ConnectionError</a></li><li><a href="module-errors_CryptoError.html">errors/CryptoError</a></li><li><a href="module-errors_HandshakeError.html">errors/HandshakeError</a></li><li><a href="module-errors_MeshError.html">errors/MeshError</a></li><li><a href="module-errors_MessageError.html">errors/MessageError</a></li><li><a href="module-errors_ValidationError.html">errors/ValidationError</a></li><li><a href="module-hooks.html">hooks</a></li><li><a href="module-hooks_AppStateManager.html">hooks/AppStateManager</a></li><li><a href="module-hooks_useMesh.html">hooks/useMesh</a></li><li><a href="module-hooks_useMessages.html">hooks/useMessages</a></li><li><a href="module-hooks_usePeers.html">hooks/usePeers</a></li><li><a href="module-mesh.html">mesh</a></li><li><a href="module-mesh_dedup.html">mesh/dedup</a></li><li><a href="module-mesh_dedup_BloomFilter.html">mesh/dedup/BloomFilter</a></li><li><a href="module-mesh_dedup_DedupManager.html">mesh/dedup/DedupManager</a></li><li><a href="module-mesh_dedup_MessageCache.html">mesh/dedup/MessageCache</a></li><li><a href="module-mesh_fragment.html">mesh/fragment</a></li><li><a href="module-mesh_fragment_Assembler.html">mesh/fragment/Assembler</a></li><li><a href="module-mesh_fragment_Fragmenter.html">mesh/fragment/Fragmenter</a></li><li><a href="module-mesh_peer.html">mesh/peer</a></li><li><a href="module-mesh_peer_Peer.html">mesh/peer/Peer</a></li><li><a href="module-mesh_peer_PeerDiscovery.html">mesh/peer/PeerDiscovery</a></li><li><a href="module-mesh_peer_PeerManager.html">mesh/peer/PeerManager</a></li><li><a href="module-mesh_router.html">mesh/router</a></li><li><a href="module-mesh_router_MessageRouter.html">mesh/router/MessageRouter</a></li><li><a href="module-mesh_router_PathFinder.html">mesh/router/PathFinder</a></li><li><a href="module-mesh_router_RouteTable.html">mesh/router/RouteTable</a></li><li><a href="module-protocol.html">protocol</a></li><li><a href="module-protocol_crc32.html">protocol/crc32</a></li><li><a href="module-protocol_deserializer.html">protocol/deserializer</a></li><li><a href="module-protocol_header.html">protocol/header</a></li><li><a href="module-protocol_message.html">protocol/message</a></li><li><a href="module-protocol_serializer.html">protocol/serializer</a></li><li><a href="module-protocol_validator.html">protocol/validator</a></li><li><a href="module-rn-ble-mesh.html">rn-ble-mesh</a></li><li><a href="module-service.html">service</a></li><li><a href="module-service_HandshakeManager.html">service/HandshakeManager</a></li><li><a href="module-service_MeshService.html">service/MeshService</a></li><li><a href="module-service_SessionManager.html">service/SessionManager</a></li><li><a href="module-service_audio.html">service/audio</a></li><li><a href="module-service_audio_AudioManager.html">service/audio/AudioManager</a></li><li><a href="module-service_text.html">service/text</a></li><li><a href="module-service_text_TextManager.html">service/text/TextManager</a></li><li><a href="module-service_text_broadcast.html">service/text/broadcast</a></li><li><a href="module-service_text_broadcast_BroadcastManager.html">service/text/broadcast/BroadcastManager</a></li><li><a href="module-service_text_channel.html">service/text/channel</a></li><li><a href="module-service_text_channel_Channel.html">service/text/channel/Channel</a></li><li><a href="module-service_text_channel_ChannelManager.html">service/text/channel/ChannelManager</a></li><li><a href="module-service_text_message.html">service/text/message</a></li><li><a href="module-service_text_message_TextMessage.html">service/text/message/TextMessage</a></li><li><a href="module-service_text_message_TextSerializer.html">service/text/message/TextSerializer</a></li><li><a href="module-storage.html">storage</a></li><li><a href="module-storage_AsyncStorageAdapter.html">storage/AsyncStorageAdapter</a></li><li><a href="module-storage_MemoryStorage.html">storage/MemoryStorage</a></li><li><a href="module-storage_MessageStore.html">storage/MessageStore</a></li><li><a href="module-storage_Storage.html">storage/Storage</a></li><li><a href="module-transport.html">transport</a></li><li><a href="module-transport_BLEAdapter.html">transport/BLEAdapter</a></li><li><a href="module-transport_BLETransport.html">transport/BLETransport</a></li><li><a href="module-transport_MockTransport.html">transport/MockTransport</a></li><li><a href="module-transport_NodeBLEAdapter.html">transport/NodeBLEAdapter</a></li><li><a href="module-transport_RNBLEAdapter.html">transport/RNBLEAdapter</a></li><li><a href="module-transport_Transport.html">transport/Transport</a></li><li><a href="module-transport_adapters.html">transport/adapters</a></li><li><a href="module-transport_adapters_BLEAdapter.html">transport/adapters/BLEAdapter</a></li><li><a href="module-transport_adapters_NodeBLEAdapter.html">transport/adapters/NodeBLEAdapter</a></li><li><a href="module-transport_adapters_RNBLEAdapter.html">transport/adapters/RNBLEAdapter</a></li><li><a href="module-utils.html">utils</a></li><li><a href="module-utils_BoundedMap.html">utils/BoundedMap</a></li><li><a href="module-utils_EventEmitter.html">utils/EventEmitter</a></li><li><a href="module-utils_LRUCache.html">utils/LRUCache</a></li><li><a href="module-utils_RateLimiter.html">utils/RateLimiter</a></li><li><a href="module-utils_TimeoutManager.html">utils/TimeoutManager</a></li><li><a href="module-utils_bytes.html">utils/bytes</a></li><li><a href="module-utils_debug.html">utils/debug</a></li><li><a href="module-utils_encoding.html">utils/encoding</a></li><li><a href="module-utils_retry.html">utils/retry</a></li><li><a href="module-utils_time.html">utils/time</a></li><li><a href="module-utils_uuid.html">utils/uuid</a></li><li><a href="module-utils_validation.html">utils/validation</a></li><li><a href="utils_base64%250A%250AThis%2520implementation%2520avoids%2520string%2520concatenation%2520in%2520loops%2520which%2520is%2520O(n%25C2%25B2).%250AUses%2520array%2520building%2520which%2520is%2520O(n)%2520-%2520critical%2520for%2520React%2520Native%2520performance.module_.html">utils/base64
|
|
170
|
+
|
|
171
|
+
This implementation avoids string concatenation in loops which is O(n²).
|
|
172
|
+
Uses array building which is O(n) - critical for React Native performance.</a></li></ul><h3>Classes</h3><ul><li><a href="module-audio_buffer_FrameBuffer-FrameBuffer.html">FrameBuffer</a></li><li><a href="module-audio_buffer_JitterBuffer-JitterBuffer.html">JitterBuffer</a></li><li><a href="module-audio_codec_LC3Codec-LC3Codec.html">LC3Codec</a></li><li><a href="module-audio_codec_LC3Decoder-LC3Decoder.html">LC3Decoder</a></li><li><a href="module-audio_codec_LC3Encoder-LC3Encoder.html">LC3Encoder</a></li><li><a href="module-audio_session_AudioSession-AudioSession.html">AudioSession</a></li><li><a href="module-audio_session_VoiceMessage-VoiceMessage.html">VoiceMessage</a></li><li><a href="module-audio_session_VoiceMessage-VoiceMessageRecorder.html">VoiceMessageRecorder</a></li><li><a href="module-audio_transport_AudioFragmenter-AudioAssembler.html">AudioAssembler</a></li><li><a href="module-audio_transport_AudioFragmenter-AudioFragmenter.html">AudioFragmenter</a></li><li><a href="module-crypto_keys_KeyManager-KeyManager.html">KeyManager</a></li><li><a href="module-crypto_keys_SecureStorage-MemorySecureStorage.html">MemorySecureStorage</a></li><li><a href="module-crypto_keys_SecureStorage-SecureStorage.html">SecureStorage</a></li><li><a href="module-crypto_noise_handshake-NoiseHandshake.html">NoiseHandshake</a></li><li><a href="module-crypto_noise_session-NoiseSession.html">NoiseSession</a></li><li><a href="module-crypto_noise_state-SymmetricState.html">SymmetricState</a></li><li><a href="module-crypto_sha256-HashContext.html">HashContext</a></li><li><a href="module-errors_AudioError-AudioError.html">AudioError</a></li><li><a href="module-errors_ConnectionError-ConnectionError.html">ConnectionError</a></li><li><a href="module-errors_CryptoError-CryptoError.html">CryptoError</a></li><li><a href="module-errors_HandshakeError-HandshakeError.html">HandshakeError</a></li><li><a href="module-errors_MeshError-MeshError.html">MeshError</a></li><li><a href="module-errors_MessageError-MessageError.html">MessageError</a></li><li><a href="module-errors_ValidationError-ValidationError.html">ValidationError</a></li><li><a href="module-hooks_AppStateManager-AppStateManager.html">AppStateManager</a></li><li><a href="module-mesh_dedup_BloomFilter-BloomFilter.html">BloomFilter</a></li><li><a href="module-mesh_dedup_DedupManager-DedupManager.html">DedupManager</a></li><li><a href="module-mesh_dedup_MessageCache-CacheNode.html">CacheNode</a></li><li><a href="module-mesh_dedup_MessageCache-MessageCache.html">MessageCache</a></li><li><a href="module-mesh_fragment_Assembler-Assembler.html">Assembler</a></li><li><a href="module-mesh_fragment_Assembler-PendingFragmentSet.html">PendingFragmentSet</a></li><li><a href="module-mesh_peer_PeerDiscovery-PeerDiscovery.html">PeerDiscovery</a></li><li><a href="module-mesh_peer_PeerManager-PeerManager.html">PeerManager</a></li><li><a href="module-mesh_peer_Peer-Peer.html">Peer</a></li><li><a href="module-mesh_router_MessageRouter-MessageRouter.html">MessageRouter</a></li><li><a href="module-mesh_router_PathFinder-PathFinder.html">PathFinder</a></li><li><a href="module-mesh_router_RouteTable-RouteTable.html">RouteTable</a></li><li><a href="module-protocol_header-MessageHeader.html">MessageHeader</a></li><li><a href="module-protocol_message-Message.html">Message</a></li><li><a href="module-service_HandshakeManager-HandshakeManager.html">HandshakeManager</a></li><li><a href="module-service_MeshService-MeshService.html">MeshService</a></li><li><a href="module-service_SessionManager-SessionManager.html">SessionManager</a></li><li><a href="module-service_audio_AudioManager-AudioManager.html">AudioManager</a></li><li><a href="module-service_text_TextManager-TextManager.html">TextManager</a></li><li><a href="module-service_text_broadcast_BroadcastManager-BroadcastManager.html">BroadcastManager</a></li><li><a href="module-service_text_channel_ChannelManager-ChannelManager.html">ChannelManager</a></li><li><a href="module-service_text_channel_Channel-Channel.html">Channel</a></li><li><a href="module-service_text_message_TextMessage-TextMessage.html">TextMessage</a></li><li><a href="module-storage_AsyncStorageAdapter-AsyncStorageAdapter.html">AsyncStorageAdapter</a></li><li><a href="module-storage_MemoryStorage-MemoryStorage.html">MemoryStorage</a></li><li><a href="module-storage_MessageStore-MessageStore.html">MessageStore</a></li><li><a href="module-storage_Storage-Storage.html">Storage</a></li><li><a href="module-transport_BLEAdapter-BLEAdapter.html">BLEAdapter</a></li><li><a href="module-transport_BLETransport-BLETransport.html">BLETransport</a></li><li><a href="module-transport_MockTransport-MockTransport.html">MockTransport</a></li><li><a href="module-transport_NodeBLEAdapter-NodeBLEAdapter.html">NodeBLEAdapter</a></li><li><a href="module-transport_RNBLEAdapter-RNBLEAdapter.html">RNBLEAdapter</a></li><li><a href="module-transport_Transport-Transport.html">Transport</a></li><li><a href="module-transport_adapters_BLEAdapter-BLEAdapter.html">BLEAdapter</a></li><li><a href="module-transport_adapters_NodeBLEAdapter-NodeBLEAdapter.html">NodeBLEAdapter</a></li><li><a href="module-transport_adapters_RNBLEAdapter-RNBLEAdapter.html">RNBLEAdapter</a></li><li><a href="module-utils_BoundedMap-BoundedMap.html">BoundedMap</a></li><li><a href="module-utils_EventEmitter-EventEmitter.html">EventEmitter</a></li><li><a href="module-utils_LRUCache-LRUCache.html">LRUCache</a></li><li><a href="module-utils_RateLimiter-RateLimiter.html">RateLimiter</a></li><li><a href="module-utils_TimeoutManager-TimeoutManager.html">TimeoutManager</a></li></ul>
|
|
173
|
+
</nav>
|
|
174
|
+
|
|
175
|
+
<br class="clear">
|
|
176
|
+
|
|
177
|
+
<footer>
|
|
178
|
+
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.5</a>
|
|
179
|
+
</footer>
|
|
180
|
+
|
|
181
|
+
<script> prettyPrint(); </script>
|
|
182
|
+
<script src="scripts/linenumber.js"> </script>
|
|
183
|
+
</body>
|
|
184
|
+
</html>
|