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,240 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* SHA-256 Hash Function (FIPS 180-4)
|
|
5
|
+
* Pure JavaScript implementation for BLE Mesh Network
|
|
6
|
+
* @module crypto/sha256
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* SHA-256 round constants K[64]
|
|
11
|
+
* First 32 bits of fractional parts of cube roots of first 64 primes
|
|
12
|
+
* @type {Uint32Array}
|
|
13
|
+
*/
|
|
14
|
+
const K = new Uint32Array([
|
|
15
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
|
|
16
|
+
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
17
|
+
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
|
|
18
|
+
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
19
|
+
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
|
|
20
|
+
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
21
|
+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
|
|
22
|
+
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
23
|
+
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
|
|
24
|
+
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
25
|
+
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
|
|
26
|
+
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
27
|
+
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
|
|
28
|
+
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
29
|
+
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
|
|
30
|
+
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
|
31
|
+
]);
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Initial hash values H[8]
|
|
35
|
+
* First 32 bits of fractional parts of square roots of first 8 primes
|
|
36
|
+
* @type {Uint32Array}
|
|
37
|
+
*/
|
|
38
|
+
const H_INIT = new Uint32Array([
|
|
39
|
+
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
|
|
40
|
+
0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
|
|
41
|
+
]);
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Right rotate a 32-bit integer
|
|
45
|
+
* @param {number} x - Value to rotate
|
|
46
|
+
* @param {number} n - Bits to rotate
|
|
47
|
+
* @returns {number} Rotated value
|
|
48
|
+
*/
|
|
49
|
+
function rotr(x, n) {
|
|
50
|
+
return ((x >>> n) | (x << (32 - n))) >>> 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* SHA-256 compression function
|
|
55
|
+
* Processes a single 512-bit block
|
|
56
|
+
* @param {Uint32Array} H - Current hash state (8 words)
|
|
57
|
+
* @param {Uint32Array} W - Message schedule (64 words)
|
|
58
|
+
*/
|
|
59
|
+
function compress(H, W) {
|
|
60
|
+
// Extend 16 words to 64 words
|
|
61
|
+
for (let i = 16; i < 64; i++) {
|
|
62
|
+
const s0 = rotr(W[i - 15], 7) ^ rotr(W[i - 15], 18) ^ (W[i - 15] >>> 3);
|
|
63
|
+
const s1 = rotr(W[i - 2], 17) ^ rotr(W[i - 2], 19) ^ (W[i - 2] >>> 10);
|
|
64
|
+
W[i] = (W[i - 16] + s0 + W[i - 7] + s1) >>> 0;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Initialize working variables
|
|
68
|
+
let a = H[0], b = H[1], c = H[2], d = H[3];
|
|
69
|
+
let e = H[4], f = H[5], g = H[6], h = H[7];
|
|
70
|
+
|
|
71
|
+
// 64 rounds
|
|
72
|
+
for (let i = 0; i < 64; i++) {
|
|
73
|
+
const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);
|
|
74
|
+
const ch = (e & f) ^ (~e & g);
|
|
75
|
+
const temp1 = (h + S1 + ch + K[i] + W[i]) >>> 0;
|
|
76
|
+
const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);
|
|
77
|
+
const maj = (a & b) ^ (a & c) ^ (b & c);
|
|
78
|
+
const temp2 = (S0 + maj) >>> 0;
|
|
79
|
+
|
|
80
|
+
h = g; g = f; f = e;
|
|
81
|
+
e = (d + temp1) >>> 0;
|
|
82
|
+
d = c; c = b; b = a;
|
|
83
|
+
a = (temp1 + temp2) >>> 0;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Add compressed chunk to hash
|
|
87
|
+
H[0] = (H[0] + a) >>> 0;
|
|
88
|
+
H[1] = (H[1] + b) >>> 0;
|
|
89
|
+
H[2] = (H[2] + c) >>> 0;
|
|
90
|
+
H[3] = (H[3] + d) >>> 0;
|
|
91
|
+
H[4] = (H[4] + e) >>> 0;
|
|
92
|
+
H[5] = (H[5] + f) >>> 0;
|
|
93
|
+
H[6] = (H[6] + g) >>> 0;
|
|
94
|
+
H[7] = (H[7] + h) >>> 0;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* HashContext for streaming SHA-256 computation
|
|
99
|
+
* @class
|
|
100
|
+
*/
|
|
101
|
+
class HashContext {
|
|
102
|
+
constructor() {
|
|
103
|
+
this._H = new Uint32Array(H_INIT);
|
|
104
|
+
this._buffer = new Uint8Array(64);
|
|
105
|
+
this._bufferLength = 0;
|
|
106
|
+
this._totalLength = 0;
|
|
107
|
+
this._finalized = false;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Update hash with additional data
|
|
112
|
+
* @param {Uint8Array} data - Data to hash
|
|
113
|
+
* @returns {HashContext} This context for chaining
|
|
114
|
+
*/
|
|
115
|
+
update(data) {
|
|
116
|
+
if (this._finalized) {
|
|
117
|
+
throw new Error('Cannot update finalized hash');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const W = new Uint32Array(64);
|
|
121
|
+
let offset = 0;
|
|
122
|
+
|
|
123
|
+
// Process any buffered data first
|
|
124
|
+
if (this._bufferLength > 0) {
|
|
125
|
+
const needed = 64 - this._bufferLength;
|
|
126
|
+
const toCopy = Math.min(needed, data.length);
|
|
127
|
+
this._buffer.set(data.subarray(0, toCopy), this._bufferLength);
|
|
128
|
+
this._bufferLength += toCopy;
|
|
129
|
+
offset = toCopy;
|
|
130
|
+
|
|
131
|
+
if (this._bufferLength === 64) {
|
|
132
|
+
for (let i = 0; i < 16; i++) {
|
|
133
|
+
W[i] = (this._buffer[i * 4] << 24) | (this._buffer[i * 4 + 1] << 16) |
|
|
134
|
+
(this._buffer[i * 4 + 2] << 8) | this._buffer[i * 4 + 3];
|
|
135
|
+
}
|
|
136
|
+
compress(this._H, W);
|
|
137
|
+
this._bufferLength = 0;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Process complete 64-byte blocks
|
|
142
|
+
while (offset + 64 <= data.length) {
|
|
143
|
+
for (let i = 0; i < 16; i++) {
|
|
144
|
+
W[i] = (data[offset + i * 4] << 24) | (data[offset + i * 4 + 1] << 16) |
|
|
145
|
+
(data[offset + i * 4 + 2] << 8) | data[offset + i * 4 + 3];
|
|
146
|
+
}
|
|
147
|
+
compress(this._H, W);
|
|
148
|
+
offset += 64;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Buffer remaining bytes
|
|
152
|
+
if (offset < data.length) {
|
|
153
|
+
this._buffer.set(data.subarray(offset), 0);
|
|
154
|
+
this._bufferLength = data.length - offset;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
this._totalLength += data.length;
|
|
158
|
+
return this;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Finalize hash and return digest
|
|
163
|
+
* @returns {Uint8Array} 32-byte hash digest
|
|
164
|
+
*/
|
|
165
|
+
digest() {
|
|
166
|
+
if (this._finalized) {
|
|
167
|
+
throw new Error('Hash already finalized');
|
|
168
|
+
}
|
|
169
|
+
this._finalized = true;
|
|
170
|
+
|
|
171
|
+
const W = new Uint32Array(64);
|
|
172
|
+
const bitLength = this._totalLength * 8;
|
|
173
|
+
|
|
174
|
+
// Append padding bit
|
|
175
|
+
this._buffer[this._bufferLength++] = 0x80;
|
|
176
|
+
|
|
177
|
+
// If not enough room for length, process current block
|
|
178
|
+
if (this._bufferLength > 56) {
|
|
179
|
+
this._buffer.fill(0, this._bufferLength, 64);
|
|
180
|
+
for (let i = 0; i < 16; i++) {
|
|
181
|
+
W[i] = (this._buffer[i * 4] << 24) | (this._buffer[i * 4 + 1] << 16) |
|
|
182
|
+
(this._buffer[i * 4 + 2] << 8) | this._buffer[i * 4 + 3];
|
|
183
|
+
}
|
|
184
|
+
compress(this._H, W);
|
|
185
|
+
this._bufferLength = 0;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Pad with zeros and append 64-bit length (big-endian)
|
|
189
|
+
this._buffer.fill(0, this._bufferLength, 56);
|
|
190
|
+
// Note: JavaScript bitwise ops are 32-bit, handle high bits separately
|
|
191
|
+
const highBits = Math.floor(bitLength / 0x100000000);
|
|
192
|
+
this._buffer[56] = (highBits >>> 24) & 0xff;
|
|
193
|
+
this._buffer[57] = (highBits >>> 16) & 0xff;
|
|
194
|
+
this._buffer[58] = (highBits >>> 8) & 0xff;
|
|
195
|
+
this._buffer[59] = highBits & 0xff;
|
|
196
|
+
this._buffer[60] = (bitLength >>> 24) & 0xff;
|
|
197
|
+
this._buffer[61] = (bitLength >>> 16) & 0xff;
|
|
198
|
+
this._buffer[62] = (bitLength >>> 8) & 0xff;
|
|
199
|
+
this._buffer[63] = bitLength & 0xff;
|
|
200
|
+
|
|
201
|
+
for (let i = 0; i < 16; i++) {
|
|
202
|
+
W[i] = (this._buffer[i * 4] << 24) | (this._buffer[i * 4 + 1] << 16) |
|
|
203
|
+
(this._buffer[i * 4 + 2] << 8) | this._buffer[i * 4 + 3];
|
|
204
|
+
}
|
|
205
|
+
compress(this._H, W);
|
|
206
|
+
|
|
207
|
+
// Convert hash to bytes
|
|
208
|
+
const result = new Uint8Array(32);
|
|
209
|
+
for (let i = 0; i < 8; i++) {
|
|
210
|
+
result[i * 4] = (this._H[i] >>> 24) & 0xff;
|
|
211
|
+
result[i * 4 + 1] = (this._H[i] >>> 16) & 0xff;
|
|
212
|
+
result[i * 4 + 2] = (this._H[i] >>> 8) & 0xff;
|
|
213
|
+
result[i * 4 + 3] = this._H[i] & 0xff;
|
|
214
|
+
}
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Create a new streaming hash context
|
|
221
|
+
* @returns {HashContext} New hash context
|
|
222
|
+
*/
|
|
223
|
+
function createHash() {
|
|
224
|
+
return new HashContext();
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Compute SHA-256 hash of data
|
|
229
|
+
* @param {Uint8Array} data - Data to hash
|
|
230
|
+
* @returns {Uint8Array} 32-byte hash digest
|
|
231
|
+
*/
|
|
232
|
+
function hash(data) {
|
|
233
|
+
return createHash().update(data).digest();
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
module.exports = {
|
|
237
|
+
hash,
|
|
238
|
+
createHash,
|
|
239
|
+
HashContext
|
|
240
|
+
};
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview X25519 Elliptic Curve Diffie-Hellman (RFC 7748)
|
|
5
|
+
* Pure JavaScript implementation using BigInt for field arithmetic.
|
|
6
|
+
* @module crypto/x25519
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const { randomBytes } = require('../utils/bytes');
|
|
10
|
+
|
|
11
|
+
/** Prime field modulus: p = 2^255 - 19 */
|
|
12
|
+
const P = (1n << 255n) - 19n;
|
|
13
|
+
/** a24 = (A - 2) / 4 = 121665 where A = 486662 for Curve25519 */
|
|
14
|
+
const A24 = 121665n;
|
|
15
|
+
/** Base point u-coordinate */
|
|
16
|
+
const BASE_POINT = 9n;
|
|
17
|
+
|
|
18
|
+
/** Converts Uint8Array to BigInt (little-endian). */
|
|
19
|
+
function bytesToBigInt(bytes) {
|
|
20
|
+
let result = 0n;
|
|
21
|
+
for (let i = bytes.length - 1; i >= 0; i--) {
|
|
22
|
+
result = (result << 8n) | BigInt(bytes[i]);
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Converts BigInt to Uint8Array (little-endian, 32 bytes). */
|
|
28
|
+
function bigIntToBytes(n) {
|
|
29
|
+
const bytes = new Uint8Array(32);
|
|
30
|
+
let value = n;
|
|
31
|
+
for (let i = 0; i < 32; i++) {
|
|
32
|
+
bytes[i] = Number(value & 0xffn);
|
|
33
|
+
value >>= 8n;
|
|
34
|
+
}
|
|
35
|
+
return bytes;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Field operations: add, sub, mul, square */
|
|
39
|
+
const fieldAdd = (a, b) => (a + b) % P;
|
|
40
|
+
const fieldSub = (a, b) => ((a - b) % P + P) % P;
|
|
41
|
+
const fieldMul = (a, b) => (a * b) % P;
|
|
42
|
+
const fieldSquare = (a) => (a * a) % P;
|
|
43
|
+
|
|
44
|
+
/** Modular exponentiation using square-and-multiply. */
|
|
45
|
+
function fieldPow(base, exp) {
|
|
46
|
+
let result = 1n;
|
|
47
|
+
base = base % P;
|
|
48
|
+
while (exp > 0n) {
|
|
49
|
+
if (exp & 1n) { result = fieldMul(result, base); }
|
|
50
|
+
exp >>= 1n;
|
|
51
|
+
base = fieldSquare(base);
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Modular inverse using Fermat's little theorem: a^(-1) = a^(p-2) mod p. */
|
|
57
|
+
const fieldInvert = (a) => fieldPow(a, P - 2n);
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Conditional swap - swaps a and b if swap is 1, otherwise leaves unchanged.
|
|
61
|
+
* Implemented without branching on secret data.
|
|
62
|
+
*/
|
|
63
|
+
function cswap(swap, a, b) {
|
|
64
|
+
const mask = -swap;
|
|
65
|
+
const diff = (a ^ b) & mask;
|
|
66
|
+
return [a ^ diff, b ^ diff];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Clamps a scalar per RFC 7748 Section 5.
|
|
71
|
+
* @param {Uint8Array} k - 32-byte scalar
|
|
72
|
+
* @returns {Uint8Array} Clamped scalar
|
|
73
|
+
*/
|
|
74
|
+
function clampScalar(k) {
|
|
75
|
+
const clamped = new Uint8Array(k);
|
|
76
|
+
clamped[0] &= 248; // Clear bits 0, 1, 2
|
|
77
|
+
clamped[31] &= 127; // Clear bit 7 of last byte
|
|
78
|
+
clamped[31] |= 64; // Set bit 6 of last byte
|
|
79
|
+
return clamped;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Montgomery ladder for X25519 scalar multiplication.
|
|
84
|
+
* Computes scalar * point on Curve25519.
|
|
85
|
+
* @param {Uint8Array} scalar - 32-byte scalar (will be clamped)
|
|
86
|
+
* @param {Uint8Array} point - 32-byte u-coordinate
|
|
87
|
+
* @returns {Uint8Array} 32-byte result u-coordinate
|
|
88
|
+
*/
|
|
89
|
+
function scalarMult(scalar, point) {
|
|
90
|
+
const k = bytesToBigInt(clampScalar(scalar));
|
|
91
|
+
let u = bytesToBigInt(point);
|
|
92
|
+
|
|
93
|
+
// Handle edge case: all-zeros point returns all-zeros
|
|
94
|
+
if (u === 0n) { return new Uint8Array(32); }
|
|
95
|
+
u = u % P;
|
|
96
|
+
|
|
97
|
+
// Montgomery ladder state (RFC 7748 naming convention)
|
|
98
|
+
// eslint-disable-next-line camelcase, prefer-const
|
|
99
|
+
let x_1 = u, x_2 = 1n, z_2 = 0n, x_3 = u, z_3 = 1n, swap = 0n;
|
|
100
|
+
|
|
101
|
+
// Process bits from 254 down to 0
|
|
102
|
+
for (let t = 254; t >= 0; t--) {
|
|
103
|
+
// eslint-disable-next-line camelcase
|
|
104
|
+
const k_t = (k >> BigInt(t)) & 1n;
|
|
105
|
+
swap ^= k_t; // eslint-disable-line camelcase
|
|
106
|
+
[x_2, x_3] = cswap(swap, x_2, x_3); // eslint-disable-line camelcase
|
|
107
|
+
[z_2, z_3] = cswap(swap, z_2, z_3); // eslint-disable-line camelcase
|
|
108
|
+
swap = k_t; // eslint-disable-line camelcase
|
|
109
|
+
|
|
110
|
+
const A = fieldAdd(x_2, z_2); // eslint-disable-line camelcase
|
|
111
|
+
const AA = fieldSquare(A);
|
|
112
|
+
const B = fieldSub(x_2, z_2); // eslint-disable-line camelcase
|
|
113
|
+
const BB = fieldSquare(B);
|
|
114
|
+
const E = fieldSub(AA, BB);
|
|
115
|
+
const C = fieldAdd(x_3, z_3); // eslint-disable-line camelcase
|
|
116
|
+
const D = fieldSub(x_3, z_3); // eslint-disable-line camelcase
|
|
117
|
+
const DA = fieldMul(D, A);
|
|
118
|
+
const CB = fieldMul(C, B);
|
|
119
|
+
x_3 = fieldSquare(fieldAdd(DA, CB)); // eslint-disable-line camelcase
|
|
120
|
+
z_3 = fieldMul(x_1, fieldSquare(fieldSub(DA, CB))); // eslint-disable-line camelcase
|
|
121
|
+
x_2 = fieldMul(AA, BB); // eslint-disable-line camelcase
|
|
122
|
+
z_2 = fieldMul(E, fieldAdd(AA, fieldMul(A24, E))); // eslint-disable-line camelcase
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
[x_2, x_3] = cswap(swap, x_2, x_3); // eslint-disable-line camelcase
|
|
126
|
+
[z_2, z_3] = cswap(swap, z_2, z_3); // eslint-disable-line camelcase
|
|
127
|
+
|
|
128
|
+
return bigIntToBytes(fieldMul(x_2, fieldInvert(z_2))); // eslint-disable-line camelcase
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Computes scalar multiplication with the base point (u = 9).
|
|
133
|
+
* @param {Uint8Array} scalar - 32-byte scalar (will be clamped)
|
|
134
|
+
* @returns {Uint8Array} 32-byte public key
|
|
135
|
+
*/
|
|
136
|
+
function scalarMultBase(scalar) {
|
|
137
|
+
return scalarMult(scalar, bigIntToBytes(BASE_POINT));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Generates a new X25519 key pair.
|
|
142
|
+
* @returns {{publicKey: Uint8Array, secretKey: Uint8Array}} Key pair
|
|
143
|
+
*/
|
|
144
|
+
function generateKeyPair() {
|
|
145
|
+
const secretKey = randomBytes(32);
|
|
146
|
+
const publicKey = scalarMultBase(secretKey);
|
|
147
|
+
return { publicKey, secretKey };
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
module.exports = {
|
|
151
|
+
generateKeyPair,
|
|
152
|
+
scalarMult,
|
|
153
|
+
scalarMultBase
|
|
154
|
+
};
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Audio-specific error class for LC3 codec and streaming
|
|
5
|
+
* @module errors/AudioError
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const MeshError = require('./MeshError');
|
|
9
|
+
const { ERROR_MESSAGES } = require('../constants/errors');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Error class for audio operation failures
|
|
13
|
+
* @class AudioError
|
|
14
|
+
* @extends MeshError
|
|
15
|
+
*/
|
|
16
|
+
class AudioError extends MeshError {
|
|
17
|
+
/**
|
|
18
|
+
* Creates a new AudioError
|
|
19
|
+
* @param {string} message - Human-readable error message
|
|
20
|
+
* @param {string} [code='EA00'] - Error code (EAxx range)
|
|
21
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
22
|
+
*/
|
|
23
|
+
constructor(message, code = 'EA00', details = null) {
|
|
24
|
+
super(message, code, details);
|
|
25
|
+
this.name = 'AudioError';
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Creates an error from an error code
|
|
30
|
+
* @param {string} code - Error code
|
|
31
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
32
|
+
* @returns {AudioError}
|
|
33
|
+
*/
|
|
34
|
+
static fromCode(code, details = null) {
|
|
35
|
+
const message = ERROR_MESSAGES[code] || 'Audio operation failed';
|
|
36
|
+
return new AudioError(message, code, details);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Creates a codec initialization error
|
|
41
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
42
|
+
* @returns {AudioError}
|
|
43
|
+
*/
|
|
44
|
+
static codecInitFailed(details = null) {
|
|
45
|
+
return new AudioError('LC3 codec initialization failed', 'EA01', details);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Creates an encoding error
|
|
50
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
51
|
+
* @returns {AudioError}
|
|
52
|
+
*/
|
|
53
|
+
static encodingFailed(details = null) {
|
|
54
|
+
return new AudioError('Audio encoding failed', 'EA02', details);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Creates a decoding error
|
|
59
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
60
|
+
* @returns {AudioError}
|
|
61
|
+
*/
|
|
62
|
+
static decodingFailed(details = null) {
|
|
63
|
+
return new AudioError('Audio decoding failed', 'EA03', details);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Creates a session error
|
|
68
|
+
* @param {string} peerId - Peer ID
|
|
69
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
70
|
+
* @returns {AudioError}
|
|
71
|
+
*/
|
|
72
|
+
static sessionFailed(peerId, details = null) {
|
|
73
|
+
return new AudioError(
|
|
74
|
+
`Audio session failed with peer ${peerId}`,
|
|
75
|
+
'EA04',
|
|
76
|
+
{ peerId, ...details }
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Creates a buffer overflow error
|
|
82
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
83
|
+
* @returns {AudioError}
|
|
84
|
+
*/
|
|
85
|
+
static bufferOverflow(details = null) {
|
|
86
|
+
return new AudioError('Audio buffer overflow', 'EA05', details);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Creates a buffer underrun error
|
|
91
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
92
|
+
* @returns {AudioError}
|
|
93
|
+
*/
|
|
94
|
+
static bufferUnderrun(details = null) {
|
|
95
|
+
return new AudioError('Audio buffer underrun', 'EA06', details);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Creates a voice message too large error
|
|
100
|
+
* @param {number} size - Actual size in bytes
|
|
101
|
+
* @param {number} maxSize - Maximum allowed size in bytes
|
|
102
|
+
* @returns {AudioError}
|
|
103
|
+
*/
|
|
104
|
+
static voiceMessageTooLarge(size, maxSize) {
|
|
105
|
+
return new AudioError(
|
|
106
|
+
`Voice message too large: ${size} bytes (max: ${maxSize})`,
|
|
107
|
+
'EA07',
|
|
108
|
+
{ size, maxSize }
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Creates a stream rejected error
|
|
114
|
+
* @param {string} peerId - Peer ID
|
|
115
|
+
* @param {string} [reason] - Rejection reason
|
|
116
|
+
* @returns {AudioError}
|
|
117
|
+
*/
|
|
118
|
+
static streamRejected(peerId, reason) {
|
|
119
|
+
return new AudioError(
|
|
120
|
+
`Audio stream rejected by peer ${peerId}`,
|
|
121
|
+
'EA08',
|
|
122
|
+
{ peerId, reason }
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Creates a codec not available error
|
|
128
|
+
* @returns {AudioError}
|
|
129
|
+
*/
|
|
130
|
+
static codecNotAvailable() {
|
|
131
|
+
return new AudioError(
|
|
132
|
+
'LC3 codec not available - native module not installed',
|
|
133
|
+
'EA09'
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Creates an invalid configuration error
|
|
139
|
+
* @param {string} [reason] - Reason for invalid configuration
|
|
140
|
+
* @returns {AudioError}
|
|
141
|
+
*/
|
|
142
|
+
static invalidConfig(reason) {
|
|
143
|
+
return new AudioError(
|
|
144
|
+
`Invalid audio configuration: ${reason || 'unknown'}`,
|
|
145
|
+
'EA10',
|
|
146
|
+
{ reason }
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Creates a voice message timeout error
|
|
152
|
+
* @param {string} messageId - Message ID
|
|
153
|
+
* @returns {AudioError}
|
|
154
|
+
*/
|
|
155
|
+
static voiceMessageTimeout(messageId) {
|
|
156
|
+
return new AudioError(
|
|
157
|
+
`Voice message assembly timed out: ${messageId}`,
|
|
158
|
+
'EA11',
|
|
159
|
+
{ messageId }
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
module.exports = AudioError;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Connection error class
|
|
5
|
+
* @module errors/ConnectionError
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const MeshError = require('./MeshError');
|
|
9
|
+
const { ERROR_MESSAGES } = require('../constants/errors');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Error class for connection-related failures
|
|
13
|
+
* @class ConnectionError
|
|
14
|
+
* @extends MeshError
|
|
15
|
+
*/
|
|
16
|
+
class ConnectionError extends MeshError {
|
|
17
|
+
/**
|
|
18
|
+
* Creates a new ConnectionError
|
|
19
|
+
* @param {string} message - Human-readable error message
|
|
20
|
+
* @param {string} [code='E200'] - Error code (E2xx range)
|
|
21
|
+
* @param {string|null} [peerId=null] - ID of the peer involved
|
|
22
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
23
|
+
*/
|
|
24
|
+
constructor(message, code = 'E200', peerId = null, details = null) {
|
|
25
|
+
super(message, code, details);
|
|
26
|
+
this.name = 'ConnectionError';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* ID of the peer involved in the connection error
|
|
30
|
+
* @type {string|null}
|
|
31
|
+
*/
|
|
32
|
+
this.peerId = peerId;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Creates an error from an error code
|
|
37
|
+
* @param {string} code - Error code from ERROR_CODE constants
|
|
38
|
+
* @param {string|null} [peerId=null] - ID of the peer involved
|
|
39
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
40
|
+
* @returns {ConnectionError} New ConnectionError instance
|
|
41
|
+
*/
|
|
42
|
+
static fromCode(code, peerId = null, details = null) {
|
|
43
|
+
const message = ERROR_MESSAGES[code] || ERROR_MESSAGES.E200;
|
|
44
|
+
return new ConnectionError(message, code, peerId, details);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Creates a connection failed error
|
|
49
|
+
* @param {string|null} [peerId=null] - ID of the peer
|
|
50
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
51
|
+
* @returns {ConnectionError} New ConnectionError instance
|
|
52
|
+
*/
|
|
53
|
+
static connectionFailed(peerId = null, details = null) {
|
|
54
|
+
return ConnectionError.fromCode('E200', peerId, details);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Creates a connection timeout error
|
|
59
|
+
* @param {string|null} [peerId=null] - ID of the peer
|
|
60
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
61
|
+
* @returns {ConnectionError} New ConnectionError instance
|
|
62
|
+
*/
|
|
63
|
+
static connectionTimeout(peerId = null, details = null) {
|
|
64
|
+
return ConnectionError.fromCode('E201', peerId, details);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Creates a connection lost error
|
|
69
|
+
* @param {string|null} [peerId=null] - ID of the peer
|
|
70
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
71
|
+
* @returns {ConnectionError} New ConnectionError instance
|
|
72
|
+
*/
|
|
73
|
+
static connectionLost(peerId = null, details = null) {
|
|
74
|
+
return ConnectionError.fromCode('E202', peerId, details);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Creates a peer not found error
|
|
79
|
+
* @param {string|null} [peerId=null] - ID of the peer
|
|
80
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
81
|
+
* @returns {ConnectionError} New ConnectionError instance
|
|
82
|
+
*/
|
|
83
|
+
static peerNotFound(peerId = null, details = null) {
|
|
84
|
+
return ConnectionError.fromCode('E204', peerId, details);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Creates a peer blocked error
|
|
89
|
+
* @param {string|null} [peerId=null] - ID of the peer
|
|
90
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
91
|
+
* @returns {ConnectionError} New ConnectionError instance
|
|
92
|
+
*/
|
|
93
|
+
static peerBlocked(peerId = null, details = null) {
|
|
94
|
+
return ConnectionError.fromCode('E205', peerId, details);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Converts error to a JSON-serializable object
|
|
99
|
+
* @returns {Object} JSON representation of the error
|
|
100
|
+
*/
|
|
101
|
+
toJSON() {
|
|
102
|
+
return {
|
|
103
|
+
...super.toJSON(),
|
|
104
|
+
peerId: this.peerId
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
module.exports = ConnectionError;
|