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,259 @@
|
|
|
1
|
+
# Node.js Quick Start Guide
|
|
2
|
+
|
|
3
|
+
This guide shows how to use react-native-ble-mesh in Node.js applications.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install react-native-ble-mesh
|
|
9
|
+
|
|
10
|
+
# For real BLE hardware support (optional):
|
|
11
|
+
npm install @abandonware/noble
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Basic Usage
|
|
15
|
+
|
|
16
|
+
### Method 1: Using Factory Functions (Recommended)
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
const { createNodeMesh, createTestMesh, MockTransport } = require('react-native-ble-mesh');
|
|
20
|
+
|
|
21
|
+
// For testing without BLE hardware
|
|
22
|
+
async function testExample() {
|
|
23
|
+
// Creates an initialized mesh with MockTransport
|
|
24
|
+
const { mesh, transport } = await createTestMesh({ displayName: 'TestNode' });
|
|
25
|
+
|
|
26
|
+
// Mesh is ready to use!
|
|
27
|
+
mesh.on('message', (msg) => console.log('Received:', msg));
|
|
28
|
+
|
|
29
|
+
// Clean up
|
|
30
|
+
await mesh.stop();
|
|
31
|
+
await mesh.destroy();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// For production with BLE
|
|
35
|
+
async function productionExample() {
|
|
36
|
+
const mesh = await createNodeMesh({ displayName: 'MyNode' });
|
|
37
|
+
|
|
38
|
+
// You provide the transport
|
|
39
|
+
const { BLETransport } = require('react-native-ble-mesh');
|
|
40
|
+
const transport = new BLETransport();
|
|
41
|
+
|
|
42
|
+
await mesh.start(transport);
|
|
43
|
+
// ...
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Method 2: Manual Setup
|
|
48
|
+
|
|
49
|
+
```javascript
|
|
50
|
+
const { MeshService, MockTransport, MemoryStorage } = require('react-native-ble-mesh');
|
|
51
|
+
|
|
52
|
+
async function main() {
|
|
53
|
+
// Create service
|
|
54
|
+
const mesh = new MeshService({ displayName: 'Alice' });
|
|
55
|
+
|
|
56
|
+
// Initialize with storage
|
|
57
|
+
await mesh.initialize({
|
|
58
|
+
storage: new MemoryStorage()
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// Create and start transport
|
|
62
|
+
const transport = new MockTransport();
|
|
63
|
+
await mesh.start(transport);
|
|
64
|
+
|
|
65
|
+
// Use the mesh...
|
|
66
|
+
mesh.sendBroadcast('Hello!');
|
|
67
|
+
|
|
68
|
+
// Clean up
|
|
69
|
+
await mesh.stop();
|
|
70
|
+
await mesh.destroy();
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Connecting Two Nodes
|
|
75
|
+
|
|
76
|
+
```javascript
|
|
77
|
+
const { createTestMesh } = require('react-native-ble-mesh');
|
|
78
|
+
|
|
79
|
+
async function twoNodeExample() {
|
|
80
|
+
// Create two test nodes
|
|
81
|
+
const { mesh: alice, transport: aliceTransport } = await createTestMesh({ displayName: 'Alice' });
|
|
82
|
+
const { mesh: bob, transport: bobTransport } = await createTestMesh({ displayName: 'Bob' });
|
|
83
|
+
|
|
84
|
+
// Link their transports (simulates BLE discovery)
|
|
85
|
+
aliceTransport.linkTo(bobTransport);
|
|
86
|
+
|
|
87
|
+
// Set up message handlers
|
|
88
|
+
bob.on('message', (msg) => {
|
|
89
|
+
console.log('Bob received:', msg);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// Send a message
|
|
93
|
+
alice.sendBroadcast('Hello Bob!');
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Event Handling
|
|
98
|
+
|
|
99
|
+
```javascript
|
|
100
|
+
const mesh = await createNodeMesh({ displayName: 'MyNode' });
|
|
101
|
+
|
|
102
|
+
// Peer events
|
|
103
|
+
mesh.on('peer-discovered', ({ peer }) => console.log('Found peer:', peer.id));
|
|
104
|
+
mesh.on('peer-connected', ({ peerId }) => console.log('Connected:', peerId));
|
|
105
|
+
mesh.on('peer-disconnected', ({ peerId }) => console.log('Disconnected:', peerId));
|
|
106
|
+
mesh.on('peer-secured', ({ peer }) => console.log('Secured session with:', peer.id));
|
|
107
|
+
|
|
108
|
+
// Message events
|
|
109
|
+
mesh.on('message', (message) => console.log('Any message:', message));
|
|
110
|
+
mesh.on('private-message', (message) => console.log('Private:', message));
|
|
111
|
+
mesh.on('channel-message', (message) => console.log('Channel:', message));
|
|
112
|
+
|
|
113
|
+
// Handshake events
|
|
114
|
+
mesh.on('handshake-complete', ({ peerId }) => console.log('Handshake done:', peerId));
|
|
115
|
+
mesh.on('handshake-failed', ({ peerId, error }) => console.error('Handshake failed:', error));
|
|
116
|
+
|
|
117
|
+
// State events
|
|
118
|
+
mesh.on('state-changed', ({ oldState, newState }) => console.log(`State: ${oldState} -> ${newState}`));
|
|
119
|
+
|
|
120
|
+
// Error handling
|
|
121
|
+
mesh.on('error', (error) => console.error('Error:', error.code, error.message));
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Debug Logging
|
|
125
|
+
|
|
126
|
+
Enable debug output to see what's happening:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# Enable all debug output
|
|
130
|
+
DEBUG=ble-mesh:* node your-app.js
|
|
131
|
+
|
|
132
|
+
# Enable specific namespaces
|
|
133
|
+
DEBUG=ble-mesh:service,ble-mesh:handshake node your-app.js
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Available namespaces:
|
|
137
|
+
- `ble-mesh:service` - MeshService events
|
|
138
|
+
- `ble-mesh:transport` - Transport layer
|
|
139
|
+
- `ble-mesh:crypto` - Cryptographic operations
|
|
140
|
+
- `ble-mesh:handshake` - Noise Protocol handshake
|
|
141
|
+
- `ble-mesh:mesh` - Mesh routing
|
|
142
|
+
- `ble-mesh:protocol` - Protocol serialization
|
|
143
|
+
- `ble-mesh:storage` - Storage operations
|
|
144
|
+
|
|
145
|
+
Or enable programmatically:
|
|
146
|
+
|
|
147
|
+
```javascript
|
|
148
|
+
const { utils } = require('react-native-ble-mesh');
|
|
149
|
+
utils.enableDebug('ble-mesh:*');
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## ESM Import
|
|
153
|
+
|
|
154
|
+
For ES Modules:
|
|
155
|
+
|
|
156
|
+
```javascript
|
|
157
|
+
import { createNodeMesh, MockTransport } from 'react-native-ble-mesh';
|
|
158
|
+
|
|
159
|
+
const mesh = await createNodeMesh({ displayName: 'ESMNode' });
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## TypeScript
|
|
163
|
+
|
|
164
|
+
TypeScript definitions are included:
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
import { MeshService, Peer, Message } from 'react-native-ble-mesh';
|
|
168
|
+
|
|
169
|
+
const mesh = new MeshService({ displayName: 'TypedNode' });
|
|
170
|
+
|
|
171
|
+
mesh.on('peer-discovered', ({ peer }: { peer: Peer }) => {
|
|
172
|
+
console.log(peer.id, peer.name);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
mesh.on('message', (message: Message) => {
|
|
176
|
+
console.log(message.content);
|
|
177
|
+
});
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Using Real BLE (Noble)
|
|
181
|
+
|
|
182
|
+
For actual Bluetooth communication:
|
|
183
|
+
|
|
184
|
+
```javascript
|
|
185
|
+
const { MeshService, BLETransport, MemoryStorage } = require('react-native-ble-mesh');
|
|
186
|
+
const { NodeBLEAdapter } = require('react-native-ble-mesh/adapters');
|
|
187
|
+
|
|
188
|
+
async function realBLE() {
|
|
189
|
+
const mesh = new MeshService({ displayName: 'BLENode' });
|
|
190
|
+
await mesh.initialize({ storage: new MemoryStorage() });
|
|
191
|
+
|
|
192
|
+
// Use real BLE with Noble adapter
|
|
193
|
+
const transport = new BLETransport({
|
|
194
|
+
adapter: new NodeBLEAdapter()
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
await mesh.start(transport);
|
|
198
|
+
|
|
199
|
+
// Now using real Bluetooth!
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**Requirements for Noble:**
|
|
204
|
+
- Linux: BlueZ 5.x (install with `apt-get install bluetooth bluez libbluetooth-dev libudev-dev`)
|
|
205
|
+
- macOS: Xcode Command Line Tools
|
|
206
|
+
- Windows: Not currently supported by Noble
|
|
207
|
+
|
|
208
|
+
## Examples
|
|
209
|
+
|
|
210
|
+
Run the included examples:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
# Quick start demo
|
|
214
|
+
npm run example:node
|
|
215
|
+
|
|
216
|
+
# Interactive chat (terminal)
|
|
217
|
+
npm run example:chat
|
|
218
|
+
|
|
219
|
+
# Auto chat demo (non-interactive)
|
|
220
|
+
node examples/node-chat/chat.js --auto
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## Testing Helper
|
|
224
|
+
|
|
225
|
+
For unit tests:
|
|
226
|
+
|
|
227
|
+
```javascript
|
|
228
|
+
const {
|
|
229
|
+
createTestMesh,
|
|
230
|
+
createTestPair,
|
|
231
|
+
createTestNetwork,
|
|
232
|
+
cleanupTestMeshes,
|
|
233
|
+
waitForEvent
|
|
234
|
+
} = require('react-native-ble-mesh/examples/testing/test-helper');
|
|
235
|
+
|
|
236
|
+
describe('My mesh tests', () => {
|
|
237
|
+
let alice, bob;
|
|
238
|
+
|
|
239
|
+
beforeEach(async () => {
|
|
240
|
+
const pair = await createTestPair();
|
|
241
|
+
alice = pair.alice;
|
|
242
|
+
bob = pair.bob;
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
afterEach(async () => {
|
|
246
|
+
await cleanupTestMeshes(alice, bob);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
test('sends message', async () => {
|
|
250
|
+
alice.sendBroadcast('Hello');
|
|
251
|
+
const event = await waitForEvent(bob, 'message', 1000);
|
|
252
|
+
expect(event).toBeDefined();
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
## API Reference
|
|
258
|
+
|
|
259
|
+
See [docs/API.md](API.md) for complete API documentation.
|
package/docs/PROTOCOL.md
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# Protocol Specification
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The BLE Mesh Protocol defines the wire format and message types for peer-to-peer communication over Bluetooth Low Energy.
|
|
6
|
+
|
|
7
|
+
## Message Format
|
|
8
|
+
|
|
9
|
+
### Header (48 bytes)
|
|
10
|
+
|
|
11
|
+
| Offset | Size | Field | Description |
|
|
12
|
+
|--------|------|-------|-------------|
|
|
13
|
+
| 0 | 1 | version | Protocol version (currently 1) |
|
|
14
|
+
| 1 | 1 | type | Message type identifier |
|
|
15
|
+
| 2 | 1 | flags | Message flags bitmap |
|
|
16
|
+
| 3 | 1 | hopCount | Current hop count |
|
|
17
|
+
| 4 | 1 | maxHops | Maximum allowed hops |
|
|
18
|
+
| 5 | 3 | reserved | Reserved for future use |
|
|
19
|
+
| 8 | 16 | messageId | UUID v4 as bytes |
|
|
20
|
+
| 24 | 8 | timestamp | Creation time (ms since epoch, big-endian) |
|
|
21
|
+
| 32 | 8 | expiresAt | Expiry time (ms since epoch, big-endian) |
|
|
22
|
+
| 40 | 2 | payloadLength | Payload size in bytes (big-endian) |
|
|
23
|
+
| 42 | 1 | fragmentIndex | Fragment index (0-based) |
|
|
24
|
+
| 43 | 1 | fragmentTotal | Total number of fragments |
|
|
25
|
+
| 44 | 4 | checksum | CRC32 of header (excluding checksum field) |
|
|
26
|
+
|
|
27
|
+
### Payload
|
|
28
|
+
|
|
29
|
+
Variable length payload follows the header. Maximum payload size is 500 bytes.
|
|
30
|
+
|
|
31
|
+
## Message Types
|
|
32
|
+
|
|
33
|
+
### Data Messages (0x01-0x0F)
|
|
34
|
+
|
|
35
|
+
| Type | Value | Description |
|
|
36
|
+
|------|-------|-------------|
|
|
37
|
+
| TEXT | 0x01 | Plain text message |
|
|
38
|
+
| TEXT_ACK | 0x02 | Text message acknowledgment |
|
|
39
|
+
|
|
40
|
+
### Handshake Messages (0x10-0x1F)
|
|
41
|
+
|
|
42
|
+
| Type | Value | Description |
|
|
43
|
+
|------|-------|-------------|
|
|
44
|
+
| HANDSHAKE_INIT | 0x10 | Noise XX Message 1 |
|
|
45
|
+
| HANDSHAKE_RESPONSE | 0x11 | Noise XX Message 2 |
|
|
46
|
+
| HANDSHAKE_FINAL | 0x12 | Noise XX Message 3 |
|
|
47
|
+
|
|
48
|
+
### Discovery Messages (0x20-0x2F)
|
|
49
|
+
|
|
50
|
+
| Type | Value | Description |
|
|
51
|
+
|------|-------|-------------|
|
|
52
|
+
| PEER_ANNOUNCE | 0x20 | Peer presence announcement |
|
|
53
|
+
| PEER_REQUEST | 0x21 | Request for peer information |
|
|
54
|
+
| PEER_RESPONSE | 0x22 | Response with peer information |
|
|
55
|
+
|
|
56
|
+
### Channel Messages (0x30-0x3F)
|
|
57
|
+
|
|
58
|
+
| Type | Value | Description |
|
|
59
|
+
|------|-------|-------------|
|
|
60
|
+
| CHANNEL_JOIN | 0x30 | Join channel request |
|
|
61
|
+
| CHANNEL_LEAVE | 0x31 | Leave channel notification |
|
|
62
|
+
| CHANNEL_MESSAGE | 0x32 | Channel broadcast message |
|
|
63
|
+
|
|
64
|
+
### Private Messages (0x40-0x4F)
|
|
65
|
+
|
|
66
|
+
| Type | Value | Description |
|
|
67
|
+
|------|-------|-------------|
|
|
68
|
+
| PRIVATE_MESSAGE | 0x40 | Encrypted private message |
|
|
69
|
+
| PRIVATE_ACK | 0x41 | Private message acknowledgment |
|
|
70
|
+
|
|
71
|
+
### Control Messages (0x60-0x6F)
|
|
72
|
+
|
|
73
|
+
| Type | Value | Description |
|
|
74
|
+
|------|-------|-------------|
|
|
75
|
+
| HEARTBEAT | 0x60 | Keep-alive message |
|
|
76
|
+
| PING | 0x61 | Ping request |
|
|
77
|
+
| PONG | 0x62 | Ping response |
|
|
78
|
+
|
|
79
|
+
### Fragment Messages (0x70-0x7F)
|
|
80
|
+
|
|
81
|
+
| Type | Value | Description |
|
|
82
|
+
|------|-------|-------------|
|
|
83
|
+
| FRAGMENT | 0x70 | Message fragment |
|
|
84
|
+
|
|
85
|
+
### Error Messages (0xFF)
|
|
86
|
+
|
|
87
|
+
| Type | Value | Description |
|
|
88
|
+
|------|-------|-------------|
|
|
89
|
+
| ERROR | 0xFF | Error notification |
|
|
90
|
+
|
|
91
|
+
## Message Flags
|
|
92
|
+
|
|
93
|
+
| Flag | Value | Description |
|
|
94
|
+
|------|-------|-------------|
|
|
95
|
+
| NONE | 0x00 | No flags |
|
|
96
|
+
| ENCRYPTED | 0x01 | Payload is encrypted |
|
|
97
|
+
| COMPRESSED | 0x02 | Payload is compressed |
|
|
98
|
+
| REQUIRES_ACK | 0x04 | Acknowledgment requested |
|
|
99
|
+
| IS_FRAGMENT | 0x08 | Message is a fragment |
|
|
100
|
+
| IS_BROADCAST | 0x10 | Broadcast message |
|
|
101
|
+
| HIGH_PRIORITY | 0x20 | High priority delivery |
|
|
102
|
+
|
|
103
|
+
## Routing
|
|
104
|
+
|
|
105
|
+
### Hop Count
|
|
106
|
+
|
|
107
|
+
- Messages include current `hopCount` and `maxHops`
|
|
108
|
+
- On relay, `hopCount` is incremented
|
|
109
|
+
- Messages with `hopCount >= maxHops` are not relayed
|
|
110
|
+
- Default `maxHops` is 7
|
|
111
|
+
|
|
112
|
+
### Duplicate Detection
|
|
113
|
+
|
|
114
|
+
- Bloom filter for fast probabilistic detection
|
|
115
|
+
- LRU cache for verification
|
|
116
|
+
- Messages seen before are dropped
|
|
117
|
+
|
|
118
|
+
### Route Discovery
|
|
119
|
+
|
|
120
|
+
- Routes learned from received messages
|
|
121
|
+
- Route table maps destination to next hop
|
|
122
|
+
- Routes expire after 10 minutes
|
|
123
|
+
|
|
124
|
+
## Fragmentation
|
|
125
|
+
|
|
126
|
+
### Fragment Header
|
|
127
|
+
|
|
128
|
+
For messages exceeding MTU:
|
|
129
|
+
|
|
130
|
+
- `fragmentIndex`: 0-based index of this fragment
|
|
131
|
+
- `fragmentTotal`: Total number of fragments
|
|
132
|
+
- Same `messageId` across all fragments
|
|
133
|
+
|
|
134
|
+
### Reassembly
|
|
135
|
+
|
|
136
|
+
- Receiver buffers fragments by `messageId`
|
|
137
|
+
- Fragments can arrive out of order
|
|
138
|
+
- Incomplete sets timeout after 60 seconds
|
|
139
|
+
- Payload reassembled in order
|
|
140
|
+
|
|
141
|
+
## Handshake Protocol
|
|
142
|
+
|
|
143
|
+
### Noise XX Pattern
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
-> e (32 bytes)
|
|
147
|
+
<- e, ee, s, es (32 + 48 bytes)
|
|
148
|
+
-> s, se (48 bytes)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Message 1 Payload
|
|
152
|
+
|
|
153
|
+
- Initiator ephemeral public key (32 bytes)
|
|
154
|
+
|
|
155
|
+
### Message 2 Payload
|
|
156
|
+
|
|
157
|
+
- Responder ephemeral public key (32 bytes)
|
|
158
|
+
- Encrypted responder static public key (32 + 16 tag)
|
|
159
|
+
|
|
160
|
+
### Message 3 Payload
|
|
161
|
+
|
|
162
|
+
- Encrypted initiator static public key (32 + 16 tag)
|
|
163
|
+
|
|
164
|
+
## BLE Characteristics
|
|
165
|
+
|
|
166
|
+
### Service UUID
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
6E400001-B5A3-F393-E0A9-E50E24DCCA9E
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### TX Characteristic (Write)
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
6E400002-B5A3-F393-E0A9-E50E24DCCA9E
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### RX Characteristic (Notify)
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
6E400003-B5A3-F393-E0A9-E50E24DCCA9E
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Serialization
|
|
185
|
+
|
|
186
|
+
- All multi-byte integers are big-endian
|
|
187
|
+
- UUIDs serialized as 16 bytes (no dashes)
|
|
188
|
+
- Strings encoded as UTF-8
|
|
189
|
+
- CRC32 uses polynomial 0xEDB88320
|
|
190
|
+
|
|
191
|
+
## Version Compatibility
|
|
192
|
+
|
|
193
|
+
- Version 1 is the initial protocol version
|
|
194
|
+
- Future versions maintain backward compatibility
|
|
195
|
+
- Unknown message types are ignored
|