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,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Error code definitions
|
|
3
|
+
* @module constants/errors
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Error codes organized by category
|
|
10
|
+
* @constant {Object.<string, string>}
|
|
11
|
+
*/
|
|
12
|
+
const ERROR_CODE = Object.freeze({
|
|
13
|
+
// Initialization errors (E0xx)
|
|
14
|
+
E001: 'INIT_FAILED',
|
|
15
|
+
E002: 'ALREADY_INITIALIZED',
|
|
16
|
+
E003: 'NOT_INITIALIZED',
|
|
17
|
+
E004: 'INVALID_CONFIG',
|
|
18
|
+
E005: 'STORAGE_INIT_FAILED',
|
|
19
|
+
|
|
20
|
+
// Bluetooth errors (E1xx)
|
|
21
|
+
E100: 'BLUETOOTH_UNAVAILABLE',
|
|
22
|
+
E101: 'BLUETOOTH_UNAUTHORIZED',
|
|
23
|
+
E102: 'BLUETOOTH_POWERED_OFF',
|
|
24
|
+
E103: 'SCAN_FAILED',
|
|
25
|
+
E104: 'ADVERTISE_FAILED',
|
|
26
|
+
E105: 'MTU_NEGOTIATION_FAILED',
|
|
27
|
+
|
|
28
|
+
// Connection errors (E2xx)
|
|
29
|
+
E200: 'CONNECTION_FAILED',
|
|
30
|
+
E201: 'CONNECTION_TIMEOUT',
|
|
31
|
+
E202: 'CONNECTION_LOST',
|
|
32
|
+
E203: 'MAX_CONNECTIONS_REACHED',
|
|
33
|
+
E204: 'PEER_NOT_FOUND',
|
|
34
|
+
E205: 'PEER_BLOCKED',
|
|
35
|
+
E206: 'ALREADY_CONNECTED',
|
|
36
|
+
E207: 'NOT_CONNECTED',
|
|
37
|
+
|
|
38
|
+
// Handshake errors (E3xx)
|
|
39
|
+
E300: 'HANDSHAKE_FAILED',
|
|
40
|
+
E301: 'HANDSHAKE_TIMEOUT',
|
|
41
|
+
E302: 'HANDSHAKE_INVALID_STATE',
|
|
42
|
+
E303: 'HANDSHAKE_DECRYPTION_FAILED',
|
|
43
|
+
E304: 'HANDSHAKE_ALREADY_IN_PROGRESS',
|
|
44
|
+
E305: 'HANDSHAKE_INVALID_MESSAGE',
|
|
45
|
+
|
|
46
|
+
// Crypto errors (E4xx)
|
|
47
|
+
E400: 'KEY_GENERATION_FAILED',
|
|
48
|
+
E401: 'ENCRYPTION_FAILED',
|
|
49
|
+
E402: 'DECRYPTION_FAILED',
|
|
50
|
+
E403: 'INVALID_KEY',
|
|
51
|
+
E404: 'INVALID_NONCE',
|
|
52
|
+
E405: 'AUTH_TAG_MISMATCH',
|
|
53
|
+
E406: 'NONCE_EXHAUSTED',
|
|
54
|
+
E407: 'INVALID_SIGNATURE',
|
|
55
|
+
|
|
56
|
+
// Message errors (E5xx)
|
|
57
|
+
E500: 'MESSAGE_TOO_LARGE',
|
|
58
|
+
E501: 'MESSAGE_EXPIRED',
|
|
59
|
+
E502: 'MESSAGE_INVALID_FORMAT',
|
|
60
|
+
E503: 'MESSAGE_INVALID_CHECKSUM',
|
|
61
|
+
E504: 'MESSAGE_DUPLICATE',
|
|
62
|
+
E505: 'MESSAGE_MAX_HOPS_EXCEEDED',
|
|
63
|
+
E506: 'MESSAGE_SEND_FAILED',
|
|
64
|
+
E507: 'MESSAGE_INVALID_TYPE',
|
|
65
|
+
E508: 'FRAGMENT_ASSEMBLY_FAILED',
|
|
66
|
+
E509: 'FRAGMENT_TIMEOUT',
|
|
67
|
+
|
|
68
|
+
// Channel errors (E6xx)
|
|
69
|
+
E600: 'CHANNEL_NOT_FOUND',
|
|
70
|
+
E601: 'CHANNEL_ALREADY_JOINED',
|
|
71
|
+
E602: 'CHANNEL_NOT_JOINED',
|
|
72
|
+
E603: 'CHANNEL_INVALID_PASSWORD',
|
|
73
|
+
E604: 'CHANNEL_FULL',
|
|
74
|
+
|
|
75
|
+
// Session errors (E7xx)
|
|
76
|
+
E700: 'SESSION_NOT_FOUND',
|
|
77
|
+
E701: 'SESSION_EXPIRED',
|
|
78
|
+
E702: 'SESSION_INVALID',
|
|
79
|
+
|
|
80
|
+
// Validation errors (E8xx)
|
|
81
|
+
E800: 'VALIDATION_FAILED',
|
|
82
|
+
E801: 'INVALID_ARGUMENT',
|
|
83
|
+
E802: 'MISSING_ARGUMENT',
|
|
84
|
+
E803: 'INVALID_TYPE',
|
|
85
|
+
E804: 'OUT_OF_RANGE',
|
|
86
|
+
|
|
87
|
+
// General errors (E9xx)
|
|
88
|
+
E900: 'UNKNOWN_ERROR',
|
|
89
|
+
E901: 'OPERATION_CANCELLED',
|
|
90
|
+
E902: 'TIMEOUT',
|
|
91
|
+
E903: 'NOT_SUPPORTED',
|
|
92
|
+
E904: 'INTERNAL_ERROR',
|
|
93
|
+
|
|
94
|
+
// Audio errors (EAxx)
|
|
95
|
+
EA00: 'AUDIO_ERROR',
|
|
96
|
+
EA01: 'CODEC_INIT_FAILED',
|
|
97
|
+
EA02: 'ENCODING_FAILED',
|
|
98
|
+
EA03: 'DECODING_FAILED',
|
|
99
|
+
EA04: 'AUDIO_SESSION_FAILED',
|
|
100
|
+
EA05: 'AUDIO_BUFFER_OVERFLOW',
|
|
101
|
+
EA06: 'AUDIO_BUFFER_UNDERRUN',
|
|
102
|
+
EA07: 'VOICE_MESSAGE_TOO_LARGE',
|
|
103
|
+
EA08: 'AUDIO_STREAM_REJECTED',
|
|
104
|
+
EA09: 'CODEC_NOT_AVAILABLE',
|
|
105
|
+
EA10: 'AUDIO_INVALID_CONFIG',
|
|
106
|
+
EA11: 'VOICE_MESSAGE_TIMEOUT'
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Error messages for each error code
|
|
111
|
+
* @constant {Object.<string, string>}
|
|
112
|
+
*/
|
|
113
|
+
const ERROR_MESSAGES = Object.freeze({
|
|
114
|
+
E001: 'Initialization failed',
|
|
115
|
+
E002: 'Service is already initialized',
|
|
116
|
+
E003: 'Service is not initialized',
|
|
117
|
+
E004: 'Invalid configuration provided',
|
|
118
|
+
E005: 'Storage initialization failed',
|
|
119
|
+
|
|
120
|
+
E100: 'Bluetooth is not available on this device',
|
|
121
|
+
E101: 'Bluetooth permission not granted',
|
|
122
|
+
E102: 'Bluetooth is powered off',
|
|
123
|
+
E103: 'Failed to start BLE scan',
|
|
124
|
+
E104: 'Failed to start BLE advertising',
|
|
125
|
+
E105: 'MTU negotiation failed',
|
|
126
|
+
|
|
127
|
+
E200: 'Failed to establish connection',
|
|
128
|
+
E201: 'Connection timed out',
|
|
129
|
+
E202: 'Connection was lost',
|
|
130
|
+
E203: 'Maximum number of connections reached',
|
|
131
|
+
E204: 'Peer not found',
|
|
132
|
+
E205: 'Peer is blocked',
|
|
133
|
+
E206: 'Already connected to this peer',
|
|
134
|
+
E207: 'Not connected to this peer',
|
|
135
|
+
|
|
136
|
+
E300: 'Handshake failed',
|
|
137
|
+
E301: 'Handshake timed out',
|
|
138
|
+
E302: 'Invalid handshake state',
|
|
139
|
+
E303: 'Failed to decrypt handshake message',
|
|
140
|
+
E304: 'Handshake already in progress with this peer',
|
|
141
|
+
E305: 'Invalid handshake message received',
|
|
142
|
+
|
|
143
|
+
E400: 'Failed to generate cryptographic key',
|
|
144
|
+
E401: 'Encryption failed',
|
|
145
|
+
E402: 'Decryption failed',
|
|
146
|
+
E403: 'Invalid key provided',
|
|
147
|
+
E404: 'Invalid nonce provided',
|
|
148
|
+
E405: 'Authentication tag mismatch',
|
|
149
|
+
E406: 'Nonce counter exhausted, rekey required',
|
|
150
|
+
E407: 'Invalid signature',
|
|
151
|
+
|
|
152
|
+
E500: 'Message exceeds maximum size',
|
|
153
|
+
E501: 'Message has expired',
|
|
154
|
+
E502: 'Invalid message format',
|
|
155
|
+
E503: 'Message checksum validation failed',
|
|
156
|
+
E504: 'Duplicate message detected',
|
|
157
|
+
E505: 'Message exceeded maximum hop count',
|
|
158
|
+
E506: 'Failed to send message',
|
|
159
|
+
E507: 'Invalid message type',
|
|
160
|
+
E508: 'Failed to assemble message fragments',
|
|
161
|
+
E509: 'Fragment assembly timed out',
|
|
162
|
+
|
|
163
|
+
E600: 'Channel not found',
|
|
164
|
+
E601: 'Already joined this channel',
|
|
165
|
+
E602: 'Not a member of this channel',
|
|
166
|
+
E603: 'Invalid channel password',
|
|
167
|
+
E604: 'Channel is full',
|
|
168
|
+
|
|
169
|
+
E700: 'Session not found',
|
|
170
|
+
E701: 'Session has expired',
|
|
171
|
+
E702: 'Invalid session',
|
|
172
|
+
|
|
173
|
+
E800: 'Validation failed',
|
|
174
|
+
E801: 'Invalid argument provided',
|
|
175
|
+
E802: 'Required argument is missing',
|
|
176
|
+
E803: 'Invalid type',
|
|
177
|
+
E804: 'Value is out of valid range',
|
|
178
|
+
|
|
179
|
+
E900: 'An unknown error occurred',
|
|
180
|
+
E901: 'Operation was cancelled',
|
|
181
|
+
E902: 'Operation timed out',
|
|
182
|
+
E903: 'Operation not supported',
|
|
183
|
+
E904: 'Internal error',
|
|
184
|
+
|
|
185
|
+
EA00: 'Audio operation failed',
|
|
186
|
+
EA01: 'LC3 codec initialization failed',
|
|
187
|
+
EA02: 'Audio encoding failed',
|
|
188
|
+
EA03: 'Audio decoding failed',
|
|
189
|
+
EA04: 'Audio session failed',
|
|
190
|
+
EA05: 'Audio buffer overflow',
|
|
191
|
+
EA06: 'Audio buffer underrun',
|
|
192
|
+
EA07: 'Voice message exceeds maximum size',
|
|
193
|
+
EA08: 'Audio stream was rejected',
|
|
194
|
+
EA09: 'LC3 codec not available - native module not installed',
|
|
195
|
+
EA10: 'Invalid audio configuration',
|
|
196
|
+
EA11: 'Voice message assembly timed out'
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
module.exports = {
|
|
200
|
+
ERROR_CODE,
|
|
201
|
+
ERROR_MESSAGES
|
|
202
|
+
};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Event name constants
|
|
3
|
+
* @module constants/events
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Event names for the mesh network
|
|
10
|
+
* @constant {Object.<string, string>}
|
|
11
|
+
*/
|
|
12
|
+
const EVENTS = Object.freeze({
|
|
13
|
+
// Lifecycle events
|
|
14
|
+
INITIALIZED: 'initialized',
|
|
15
|
+
DESTROYED: 'destroyed',
|
|
16
|
+
STATE_CHANGED: 'state:changed',
|
|
17
|
+
ERROR: 'error',
|
|
18
|
+
|
|
19
|
+
// Bluetooth events
|
|
20
|
+
BLUETOOTH_STATE: 'bluetooth:state',
|
|
21
|
+
SCAN_STARTED: 'scan:started',
|
|
22
|
+
SCAN_STOPPED: 'scan:stopped',
|
|
23
|
+
|
|
24
|
+
// Peer events
|
|
25
|
+
PEER_DISCOVERED: 'peer:discovered',
|
|
26
|
+
PEER_CONNECTED: 'peer:connected',
|
|
27
|
+
PEER_DISCONNECTED: 'peer:disconnected',
|
|
28
|
+
PEER_SECURED: 'peer:secured',
|
|
29
|
+
PEER_UPDATED: 'peer:updated',
|
|
30
|
+
PEER_LOST: 'peer:lost',
|
|
31
|
+
PEER_BLOCKED: 'peer:blocked',
|
|
32
|
+
PEER_UNBLOCKED: 'peer:unblocked',
|
|
33
|
+
|
|
34
|
+
// Handshake events
|
|
35
|
+
HANDSHAKE_STARTED: 'handshake:started',
|
|
36
|
+
HANDSHAKE_PROGRESS: 'handshake:progress',
|
|
37
|
+
HANDSHAKE_COMPLETE: 'handshake:complete',
|
|
38
|
+
HANDSHAKE_FAILED: 'handshake:failed',
|
|
39
|
+
|
|
40
|
+
// Message events
|
|
41
|
+
MESSAGE_RECEIVED: 'message:received',
|
|
42
|
+
MESSAGE_SENT: 'message:sent',
|
|
43
|
+
MESSAGE_FAILED: 'message:failed',
|
|
44
|
+
MESSAGE_RELAYED: 'message:relayed',
|
|
45
|
+
MESSAGE_DROPPED: 'message:dropped',
|
|
46
|
+
MESSAGE_ACK: 'message:ack',
|
|
47
|
+
|
|
48
|
+
// Private message events
|
|
49
|
+
PRIVATE_MESSAGE_RECEIVED: 'private:received',
|
|
50
|
+
PRIVATE_MESSAGE_SENT: 'private:sent',
|
|
51
|
+
|
|
52
|
+
// Broadcast events
|
|
53
|
+
BROADCAST_RECEIVED: 'broadcast:received',
|
|
54
|
+
BROADCAST_SENT: 'broadcast:sent',
|
|
55
|
+
|
|
56
|
+
// Channel events
|
|
57
|
+
CHANNEL_JOINED: 'channel:joined',
|
|
58
|
+
CHANNEL_LEFT: 'channel:left',
|
|
59
|
+
CHANNEL_MESSAGE: 'channel:message',
|
|
60
|
+
CHANNEL_MEMBER_JOINED: 'channel:memberJoined',
|
|
61
|
+
CHANNEL_MEMBER_LEFT: 'channel:memberLeft',
|
|
62
|
+
|
|
63
|
+
// Route events
|
|
64
|
+
ROUTE_ADDED: 'route:added',
|
|
65
|
+
ROUTE_UPDATED: 'route:updated',
|
|
66
|
+
ROUTE_REMOVED: 'route:removed',
|
|
67
|
+
|
|
68
|
+
// Session events
|
|
69
|
+
SESSION_CREATED: 'session:created',
|
|
70
|
+
SESSION_DESTROYED: 'session:destroyed',
|
|
71
|
+
SESSION_EXPIRED: 'session:expired',
|
|
72
|
+
|
|
73
|
+
// Audio streaming events
|
|
74
|
+
AUDIO_STREAM_REQUEST: 'audio:stream-request',
|
|
75
|
+
AUDIO_STREAM_STARTED: 'audio:stream-started',
|
|
76
|
+
AUDIO_STREAM_ENDED: 'audio:stream-ended',
|
|
77
|
+
AUDIO_STREAM_PAUSED: 'audio:stream-paused',
|
|
78
|
+
AUDIO_STREAM_RESUMED: 'audio:stream-resumed',
|
|
79
|
+
|
|
80
|
+
// Voice message events
|
|
81
|
+
VOICE_MESSAGE_RECEIVED: 'audio:voice-message-received',
|
|
82
|
+
VOICE_MESSAGE_SENT: 'audio:voice-message-sent',
|
|
83
|
+
VOICE_MESSAGE_PROGRESS: 'audio:voice-message-progress',
|
|
84
|
+
VOICE_MESSAGE_FAILED: 'audio:voice-message-failed',
|
|
85
|
+
|
|
86
|
+
// Audio quality events
|
|
87
|
+
AUDIO_BUFFER_UNDERRUN: 'audio:buffer-underrun',
|
|
88
|
+
AUDIO_BUFFER_OVERFLOW: 'audio:buffer-overflow',
|
|
89
|
+
AUDIO_QUALITY_CHANGE: 'audio:quality-change'
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
module.exports = {
|
|
93
|
+
EVENTS
|
|
94
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Constants module exports
|
|
3
|
+
* @module constants
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
const protocol = require('./protocol');
|
|
9
|
+
const ble = require('./ble');
|
|
10
|
+
const crypto = require('./crypto');
|
|
11
|
+
const errors = require('./errors');
|
|
12
|
+
const events = require('./events');
|
|
13
|
+
const audio = require('./audio');
|
|
14
|
+
|
|
15
|
+
module.exports = {
|
|
16
|
+
...protocol,
|
|
17
|
+
...ble,
|
|
18
|
+
...crypto,
|
|
19
|
+
...errors,
|
|
20
|
+
...events,
|
|
21
|
+
...audio
|
|
22
|
+
};
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Protocol constants for the BLE Mesh Network
|
|
3
|
+
* @module constants/protocol
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Protocol version for compatibility checking
|
|
10
|
+
* @constant {number}
|
|
11
|
+
*/
|
|
12
|
+
const PROTOCOL_VERSION = 1;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Message type identifiers
|
|
16
|
+
* @constant {Object.<string, number>}
|
|
17
|
+
*/
|
|
18
|
+
const MESSAGE_TYPE = Object.freeze({
|
|
19
|
+
// Data messages (0x01-0x0F)
|
|
20
|
+
TEXT: 0x01,
|
|
21
|
+
TEXT_ACK: 0x02,
|
|
22
|
+
|
|
23
|
+
// Handshake (0x10-0x1F)
|
|
24
|
+
HANDSHAKE_INIT: 0x10,
|
|
25
|
+
HANDSHAKE_RESPONSE: 0x11,
|
|
26
|
+
HANDSHAKE_FINAL: 0x12,
|
|
27
|
+
|
|
28
|
+
// Discovery (0x20-0x2F)
|
|
29
|
+
PEER_ANNOUNCE: 0x20,
|
|
30
|
+
PEER_REQUEST: 0x21,
|
|
31
|
+
PEER_RESPONSE: 0x22,
|
|
32
|
+
|
|
33
|
+
// Channels (0x30-0x3F)
|
|
34
|
+
CHANNEL_JOIN: 0x30,
|
|
35
|
+
CHANNEL_LEAVE: 0x31,
|
|
36
|
+
CHANNEL_MESSAGE: 0x32,
|
|
37
|
+
|
|
38
|
+
// Private (0x40-0x4F)
|
|
39
|
+
PRIVATE_MESSAGE: 0x40,
|
|
40
|
+
PRIVATE_ACK: 0x41,
|
|
41
|
+
|
|
42
|
+
// Control (0x60-0x6F)
|
|
43
|
+
HEARTBEAT: 0x60,
|
|
44
|
+
PING: 0x61,
|
|
45
|
+
PONG: 0x62,
|
|
46
|
+
|
|
47
|
+
// Fragments (0x70-0x7F)
|
|
48
|
+
FRAGMENT: 0x70,
|
|
49
|
+
|
|
50
|
+
// Audio messages (0x80-0x8F)
|
|
51
|
+
VOICE_MESSAGE_START: 0x80,
|
|
52
|
+
VOICE_MESSAGE_DATA: 0x81,
|
|
53
|
+
VOICE_MESSAGE_END: 0x82,
|
|
54
|
+
VOICE_MESSAGE_ACK: 0x83,
|
|
55
|
+
AUDIO_STREAM_REQUEST: 0x84,
|
|
56
|
+
AUDIO_STREAM_ACCEPT: 0x85,
|
|
57
|
+
AUDIO_STREAM_REJECT: 0x86,
|
|
58
|
+
AUDIO_STREAM_DATA: 0x87,
|
|
59
|
+
AUDIO_STREAM_END: 0x88,
|
|
60
|
+
|
|
61
|
+
// Error (0xFF)
|
|
62
|
+
ERROR: 0xFF
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Message flags
|
|
67
|
+
* @constant {Object.<string, number>}
|
|
68
|
+
*/
|
|
69
|
+
const MESSAGE_FLAGS = Object.freeze({
|
|
70
|
+
NONE: 0x00,
|
|
71
|
+
ENCRYPTED: 0x01,
|
|
72
|
+
COMPRESSED: 0x02,
|
|
73
|
+
REQUIRES_ACK: 0x04,
|
|
74
|
+
IS_FRAGMENT: 0x08,
|
|
75
|
+
IS_BROADCAST: 0x10,
|
|
76
|
+
HIGH_PRIORITY: 0x20
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Mesh network configuration
|
|
81
|
+
* @constant {Object.<string, number>}
|
|
82
|
+
*/
|
|
83
|
+
const MESH_CONFIG = Object.freeze({
|
|
84
|
+
/** Maximum number of hops a message can travel */
|
|
85
|
+
MAX_HOPS: 7,
|
|
86
|
+
/** Maximum message payload size in bytes */
|
|
87
|
+
MAX_MESSAGE_SIZE: 500,
|
|
88
|
+
/** Fragment payload size in bytes */
|
|
89
|
+
FRAGMENT_SIZE: 180,
|
|
90
|
+
/** Message header size in bytes */
|
|
91
|
+
HEADER_SIZE: 48,
|
|
92
|
+
/** Message time-to-live in milliseconds (30 minutes) */
|
|
93
|
+
MESSAGE_TTL_MS: 30 * 60 * 1000,
|
|
94
|
+
/** Peer timeout in milliseconds (5 minutes) */
|
|
95
|
+
PEER_TIMEOUT_MS: 5 * 60 * 1000,
|
|
96
|
+
/** Heartbeat interval in milliseconds (30 seconds) */
|
|
97
|
+
HEARTBEAT_INTERVAL_MS: 30 * 1000,
|
|
98
|
+
/** Handshake timeout in milliseconds (30 seconds) */
|
|
99
|
+
HANDSHAKE_TIMEOUT_MS: 30 * 1000,
|
|
100
|
+
/** Maximum retry attempts */
|
|
101
|
+
MAX_RETRIES: 3,
|
|
102
|
+
/** Bloom filter size in bits */
|
|
103
|
+
BLOOM_FILTER_SIZE: 2048,
|
|
104
|
+
/** Number of hash functions for bloom filter */
|
|
105
|
+
BLOOM_HASH_COUNT: 7,
|
|
106
|
+
/** Maximum pending fragments per message */
|
|
107
|
+
MAX_PENDING_FRAGMENTS: 256,
|
|
108
|
+
/** Fragment assembly timeout in milliseconds (60 seconds) */
|
|
109
|
+
FRAGMENT_TIMEOUT_MS: 60 * 1000,
|
|
110
|
+
/** Maximum connected peers */
|
|
111
|
+
MAX_PEERS: 8,
|
|
112
|
+
/** Route entry timeout in milliseconds (10 minutes) */
|
|
113
|
+
ROUTE_TIMEOUT_MS: 10 * 60 * 1000
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Connection states
|
|
118
|
+
* @constant {Object.<string, string>}
|
|
119
|
+
*/
|
|
120
|
+
const CONNECTION_STATE = Object.freeze({
|
|
121
|
+
DISCONNECTED: 'disconnected',
|
|
122
|
+
CONNECTING: 'connecting',
|
|
123
|
+
CONNECTED: 'connected',
|
|
124
|
+
SECURING: 'securing',
|
|
125
|
+
SECURED: 'secured',
|
|
126
|
+
DISCONNECTING: 'disconnecting',
|
|
127
|
+
FAILED: 'failed'
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Service states
|
|
132
|
+
* @constant {Object.<string, string>}
|
|
133
|
+
*/
|
|
134
|
+
const SERVICE_STATE = Object.freeze({
|
|
135
|
+
UNINITIALIZED: 'uninitialized',
|
|
136
|
+
INITIALIZING: 'initializing',
|
|
137
|
+
READY: 'ready',
|
|
138
|
+
ACTIVE: 'active',
|
|
139
|
+
SUSPENDED: 'suspended',
|
|
140
|
+
DESTROYED: 'destroyed',
|
|
141
|
+
ERROR: 'error'
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
module.exports = {
|
|
145
|
+
PROTOCOL_VERSION,
|
|
146
|
+
MESSAGE_TYPE,
|
|
147
|
+
MESSAGE_FLAGS,
|
|
148
|
+
MESH_CONFIG,
|
|
149
|
+
CONNECTION_STATE,
|
|
150
|
+
SERVICE_STATE
|
|
151
|
+
};
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview ChaCha20-Poly1305 AEAD implementation (RFC 8439)
|
|
3
|
+
* @module crypto/aead
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
const { chacha20 } = require('./chacha20');
|
|
9
|
+
const { poly1305 } = require('./poly1305');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Generates Poly1305 key using ChaCha20 with counter=0
|
|
13
|
+
* @param {Uint8Array} key - 32-byte encryption key
|
|
14
|
+
* @param {Uint8Array} nonce - 12-byte nonce
|
|
15
|
+
* @returns {Uint8Array} 32-byte Poly1305 key
|
|
16
|
+
*/
|
|
17
|
+
function generatePolyKey(key, nonce) {
|
|
18
|
+
const zeros = new Uint8Array(64);
|
|
19
|
+
const block = chacha20(key, nonce, 0, zeros);
|
|
20
|
+
return block.subarray(0, 32);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Pads data to 16-byte boundary with zeros
|
|
25
|
+
* @param {number} length - Current data length
|
|
26
|
+
* @returns {Uint8Array} Padding bytes (0-15 bytes)
|
|
27
|
+
*/
|
|
28
|
+
function pad16(length) {
|
|
29
|
+
const remainder = length % 16;
|
|
30
|
+
if (remainder === 0) {
|
|
31
|
+
return new Uint8Array(0);
|
|
32
|
+
}
|
|
33
|
+
return new Uint8Array(16 - remainder);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Encodes a 64-bit little-endian integer
|
|
38
|
+
* @param {number} value - Value to encode
|
|
39
|
+
* @returns {Uint8Array} 8-byte little-endian representation
|
|
40
|
+
*/
|
|
41
|
+
function encode64LE(value) {
|
|
42
|
+
const bytes = new Uint8Array(8);
|
|
43
|
+
const view = new DataView(bytes.buffer);
|
|
44
|
+
// JavaScript numbers are 64-bit floats, safe for values up to 2^53-1
|
|
45
|
+
view.setUint32(0, value >>> 0, true);
|
|
46
|
+
view.setUint32(4, Math.floor(value / 0x100000000) >>> 0, true);
|
|
47
|
+
return bytes;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Constructs Poly1305 MAC input per RFC 8439
|
|
52
|
+
* @param {Uint8Array} aad - Additional authenticated data
|
|
53
|
+
* @param {Uint8Array} ciphertext - Ciphertext
|
|
54
|
+
* @returns {Uint8Array} MAC input
|
|
55
|
+
*/
|
|
56
|
+
function constructMacData(aad, ciphertext) {
|
|
57
|
+
const aadPad = pad16(aad.length);
|
|
58
|
+
const ctPad = pad16(ciphertext.length);
|
|
59
|
+
const aadLen = encode64LE(aad.length);
|
|
60
|
+
const ctLen = encode64LE(ciphertext.length);
|
|
61
|
+
|
|
62
|
+
const totalLen = aad.length + aadPad.length + ciphertext.length +
|
|
63
|
+
ctPad.length + 8 + 8;
|
|
64
|
+
const data = new Uint8Array(totalLen);
|
|
65
|
+
|
|
66
|
+
let offset = 0;
|
|
67
|
+
data.set(aad, offset);
|
|
68
|
+
offset += aad.length;
|
|
69
|
+
data.set(aadPad, offset);
|
|
70
|
+
offset += aadPad.length;
|
|
71
|
+
data.set(ciphertext, offset);
|
|
72
|
+
offset += ciphertext.length;
|
|
73
|
+
data.set(ctPad, offset);
|
|
74
|
+
offset += ctPad.length;
|
|
75
|
+
data.set(aadLen, offset);
|
|
76
|
+
offset += 8;
|
|
77
|
+
data.set(ctLen, offset);
|
|
78
|
+
|
|
79
|
+
return data;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Constant-time comparison of two byte arrays
|
|
84
|
+
* @param {Uint8Array} a - First array
|
|
85
|
+
* @param {Uint8Array} b - Second array
|
|
86
|
+
* @returns {boolean} True if arrays are equal
|
|
87
|
+
*/
|
|
88
|
+
function constantTimeEqual(a, b) {
|
|
89
|
+
if (a.length !== b.length) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
let diff = 0;
|
|
93
|
+
for (let i = 0; i < a.length; i++) {
|
|
94
|
+
diff |= a[i] ^ b[i];
|
|
95
|
+
}
|
|
96
|
+
return diff === 0;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Encrypts and authenticates data using ChaCha20-Poly1305 AEAD
|
|
101
|
+
* @param {Uint8Array} key - 32-byte encryption key
|
|
102
|
+
* @param {Uint8Array} nonce - 12-byte nonce (must be unique per key)
|
|
103
|
+
* @param {Uint8Array} plaintext - Data to encrypt
|
|
104
|
+
* @param {Uint8Array} [aad] - Additional authenticated data (optional)
|
|
105
|
+
* @returns {Uint8Array} Ciphertext with appended 16-byte authentication tag
|
|
106
|
+
* @throws {Error} If key is not 32 bytes or nonce is not 12 bytes
|
|
107
|
+
*/
|
|
108
|
+
function encrypt(key, nonce, plaintext, aad = new Uint8Array(0)) {
|
|
109
|
+
if (!(key instanceof Uint8Array) || key.length !== 32) {
|
|
110
|
+
throw new Error('Key must be 32 bytes');
|
|
111
|
+
}
|
|
112
|
+
if (!(nonce instanceof Uint8Array) || nonce.length !== 12) {
|
|
113
|
+
throw new Error('Nonce must be 12 bytes');
|
|
114
|
+
}
|
|
115
|
+
if (!(plaintext instanceof Uint8Array)) {
|
|
116
|
+
throw new Error('Plaintext must be a Uint8Array');
|
|
117
|
+
}
|
|
118
|
+
if (!(aad instanceof Uint8Array)) {
|
|
119
|
+
throw new Error('AAD must be a Uint8Array');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Generate Poly1305 key
|
|
123
|
+
const polyKey = generatePolyKey(key, nonce);
|
|
124
|
+
|
|
125
|
+
// Encrypt plaintext with counter starting at 1
|
|
126
|
+
const ciphertext = chacha20(key, nonce, 1, plaintext);
|
|
127
|
+
|
|
128
|
+
// Compute MAC
|
|
129
|
+
const macData = constructMacData(aad, ciphertext);
|
|
130
|
+
const tag = poly1305(polyKey, macData);
|
|
131
|
+
|
|
132
|
+
// Concatenate ciphertext and tag
|
|
133
|
+
const result = new Uint8Array(ciphertext.length + 16);
|
|
134
|
+
result.set(ciphertext);
|
|
135
|
+
result.set(tag, ciphertext.length);
|
|
136
|
+
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Decrypts and verifies data using ChaCha20-Poly1305 AEAD
|
|
142
|
+
* @param {Uint8Array} key - 32-byte encryption key
|
|
143
|
+
* @param {Uint8Array} nonce - 12-byte nonce
|
|
144
|
+
* @param {Uint8Array} ciphertext - Ciphertext with 16-byte authentication tag
|
|
145
|
+
* @param {Uint8Array} [aad] - Additional authenticated data (optional)
|
|
146
|
+
* @returns {Uint8Array|null} Decrypted plaintext, or null if authentication fails
|
|
147
|
+
* @throws {Error} If key is not 32 bytes, nonce is not 12 bytes, or ciphertext too short
|
|
148
|
+
*/
|
|
149
|
+
function decrypt(key, nonce, ciphertext, aad = new Uint8Array(0)) {
|
|
150
|
+
if (!(key instanceof Uint8Array) || key.length !== 32) {
|
|
151
|
+
throw new Error('Key must be 32 bytes');
|
|
152
|
+
}
|
|
153
|
+
if (!(nonce instanceof Uint8Array) || nonce.length !== 12) {
|
|
154
|
+
throw new Error('Nonce must be 12 bytes');
|
|
155
|
+
}
|
|
156
|
+
if (!(ciphertext instanceof Uint8Array)) {
|
|
157
|
+
throw new Error('Ciphertext must be a Uint8Array');
|
|
158
|
+
}
|
|
159
|
+
if (ciphertext.length < 16) {
|
|
160
|
+
throw new Error('Ciphertext must be at least 16 bytes (tag size)');
|
|
161
|
+
}
|
|
162
|
+
if (!(aad instanceof Uint8Array)) {
|
|
163
|
+
throw new Error('AAD must be a Uint8Array');
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Split ciphertext and tag
|
|
167
|
+
const ct = ciphertext.subarray(0, ciphertext.length - 16);
|
|
168
|
+
const receivedTag = ciphertext.subarray(ciphertext.length - 16);
|
|
169
|
+
|
|
170
|
+
// Generate Poly1305 key
|
|
171
|
+
const polyKey = generatePolyKey(key, nonce);
|
|
172
|
+
|
|
173
|
+
// Compute expected MAC
|
|
174
|
+
const macData = constructMacData(aad, ct);
|
|
175
|
+
const expectedTag = poly1305(polyKey, macData);
|
|
176
|
+
|
|
177
|
+
// Verify tag using constant-time comparison
|
|
178
|
+
if (!constantTimeEqual(receivedTag, expectedTag)) {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Decrypt ciphertext with counter starting at 1
|
|
183
|
+
return chacha20(key, nonce, 1, ct);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
module.exports = {
|
|
187
|
+
encrypt,
|
|
188
|
+
decrypt
|
|
189
|
+
};
|