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,103 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Cryptographic error class
|
|
5
|
+
* @module errors/CryptoError
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const MeshError = require('./MeshError');
|
|
9
|
+
const { ERROR_MESSAGES } = require('../constants/errors');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Error class for cryptographic operation failures
|
|
13
|
+
* @class CryptoError
|
|
14
|
+
* @extends MeshError
|
|
15
|
+
*/
|
|
16
|
+
class CryptoError extends MeshError {
|
|
17
|
+
/**
|
|
18
|
+
* Creates a new CryptoError
|
|
19
|
+
* @param {string} message - Human-readable error message
|
|
20
|
+
* @param {string} [code='E400'] - Error code (E4xx range)
|
|
21
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
22
|
+
*/
|
|
23
|
+
constructor(message, code = 'E400', details = null) {
|
|
24
|
+
super(message, code, details);
|
|
25
|
+
this.name = 'CryptoError';
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Creates an error from an error code
|
|
30
|
+
* @param {string} code - Error code from ERROR_CODE constants
|
|
31
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
32
|
+
* @returns {CryptoError} New CryptoError instance
|
|
33
|
+
*/
|
|
34
|
+
static fromCode(code, details = null) {
|
|
35
|
+
const message = ERROR_MESSAGES[code] || ERROR_MESSAGES.E400;
|
|
36
|
+
return new CryptoError(message, code, details);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Creates a key generation error
|
|
41
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
42
|
+
* @returns {CryptoError} New CryptoError instance
|
|
43
|
+
*/
|
|
44
|
+
static keyGenerationFailed(details = null) {
|
|
45
|
+
return CryptoError.fromCode('E400', details);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Creates an encryption error
|
|
50
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
51
|
+
* @returns {CryptoError} New CryptoError instance
|
|
52
|
+
*/
|
|
53
|
+
static encryptionFailed(details = null) {
|
|
54
|
+
return CryptoError.fromCode('E401', details);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Creates a decryption error
|
|
59
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
60
|
+
* @returns {CryptoError} New CryptoError instance
|
|
61
|
+
*/
|
|
62
|
+
static decryptionFailed(details = null) {
|
|
63
|
+
return CryptoError.fromCode('E402', details);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Creates an invalid key error
|
|
68
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
69
|
+
* @returns {CryptoError} New CryptoError instance
|
|
70
|
+
*/
|
|
71
|
+
static invalidKey(details = null) {
|
|
72
|
+
return CryptoError.fromCode('E403', details);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Creates an invalid nonce error
|
|
77
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
78
|
+
* @returns {CryptoError} New CryptoError instance
|
|
79
|
+
*/
|
|
80
|
+
static invalidNonce(details = null) {
|
|
81
|
+
return CryptoError.fromCode('E404', details);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Creates an authentication tag mismatch error
|
|
86
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
87
|
+
* @returns {CryptoError} New CryptoError instance
|
|
88
|
+
*/
|
|
89
|
+
static authTagMismatch(details = null) {
|
|
90
|
+
return CryptoError.fromCode('E405', details);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Creates a nonce exhausted error
|
|
95
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
96
|
+
* @returns {CryptoError} New CryptoError instance
|
|
97
|
+
*/
|
|
98
|
+
static nonceExhausted(details = null) {
|
|
99
|
+
return CryptoError.fromCode('E406', details);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
module.exports = CryptoError;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Handshake error class
|
|
5
|
+
* @module errors/HandshakeError
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const MeshError = require('./MeshError');
|
|
9
|
+
const { ERROR_MESSAGES } = require('../constants/errors');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Error class for Noise Protocol handshake failures
|
|
13
|
+
* @class HandshakeError
|
|
14
|
+
* @extends MeshError
|
|
15
|
+
*/
|
|
16
|
+
class HandshakeError extends MeshError {
|
|
17
|
+
/**
|
|
18
|
+
* Creates a new HandshakeError
|
|
19
|
+
* @param {string} message - Human-readable error message
|
|
20
|
+
* @param {string} [code='E300'] - Error code (E3xx range)
|
|
21
|
+
* @param {string|null} [peerId=null] - ID of the peer involved
|
|
22
|
+
* @param {number|null} [step=null] - Handshake step where error occurred
|
|
23
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
24
|
+
*/
|
|
25
|
+
constructor(message, code = 'E300', peerId = null, step = null, details = null) {
|
|
26
|
+
super(message, code, details);
|
|
27
|
+
this.name = 'HandshakeError';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* ID of the peer involved in the handshake
|
|
31
|
+
* @type {string|null}
|
|
32
|
+
*/
|
|
33
|
+
this.peerId = peerId;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Handshake step where the error occurred (1, 2, or 3 for XX pattern)
|
|
37
|
+
* @type {number|null}
|
|
38
|
+
*/
|
|
39
|
+
this.step = step;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Creates an error from an error code
|
|
44
|
+
* @param {string} code - Error code from ERROR_CODE constants
|
|
45
|
+
* @param {string|null} [peerId=null] - ID of the peer involved
|
|
46
|
+
* @param {number|null} [step=null] - Handshake step where error occurred
|
|
47
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
48
|
+
* @returns {HandshakeError} New HandshakeError instance
|
|
49
|
+
*/
|
|
50
|
+
static fromCode(code, peerId = null, step = null, details = null) {
|
|
51
|
+
const message = ERROR_MESSAGES[code] || ERROR_MESSAGES.E300;
|
|
52
|
+
return new HandshakeError(message, code, peerId, step, details);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Creates a handshake failed error
|
|
57
|
+
* @param {string|null} [peerId=null] - ID of the peer
|
|
58
|
+
* @param {number|null} [step=null] - Handshake step
|
|
59
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
60
|
+
* @returns {HandshakeError} New HandshakeError instance
|
|
61
|
+
*/
|
|
62
|
+
static handshakeFailed(peerId = null, step = null, details = null) {
|
|
63
|
+
return HandshakeError.fromCode('E300', peerId, step, details);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Creates a handshake timeout error
|
|
68
|
+
* @param {string|null} [peerId=null] - ID of the peer
|
|
69
|
+
* @param {number|null} [step=null] - Handshake step
|
|
70
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
71
|
+
* @returns {HandshakeError} New HandshakeError instance
|
|
72
|
+
*/
|
|
73
|
+
static handshakeTimeout(peerId = null, step = null, details = null) {
|
|
74
|
+
return HandshakeError.fromCode('E301', peerId, step, details);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Creates an invalid handshake state error
|
|
79
|
+
* @param {string|null} [peerId=null] - ID of the peer
|
|
80
|
+
* @param {number|null} [step=null] - Handshake step
|
|
81
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
82
|
+
* @returns {HandshakeError} New HandshakeError instance
|
|
83
|
+
*/
|
|
84
|
+
static invalidState(peerId = null, step = null, details = null) {
|
|
85
|
+
return HandshakeError.fromCode('E302', peerId, step, details);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Creates a decryption failed error during handshake
|
|
90
|
+
* @param {string|null} [peerId=null] - ID of the peer
|
|
91
|
+
* @param {number|null} [step=null] - Handshake step
|
|
92
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
93
|
+
* @returns {HandshakeError} New HandshakeError instance
|
|
94
|
+
*/
|
|
95
|
+
static decryptionFailed(peerId = null, step = null, details = null) {
|
|
96
|
+
return HandshakeError.fromCode('E303', peerId, step, details);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Creates an already in progress error
|
|
101
|
+
* @param {string|null} [peerId=null] - ID of the peer
|
|
102
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
103
|
+
* @returns {HandshakeError} New HandshakeError instance
|
|
104
|
+
*/
|
|
105
|
+
static alreadyInProgress(peerId = null, details = null) {
|
|
106
|
+
return HandshakeError.fromCode('E304', peerId, null, details);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Converts error to a JSON-serializable object
|
|
111
|
+
* @returns {Object} JSON representation of the error
|
|
112
|
+
*/
|
|
113
|
+
toJSON() {
|
|
114
|
+
return {
|
|
115
|
+
...super.toJSON(),
|
|
116
|
+
peerId: this.peerId,
|
|
117
|
+
step: this.step
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
module.exports = HandshakeError;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Base error class for BLE Mesh Network library
|
|
5
|
+
* @module errors/MeshError
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { ERROR_CODE, ERROR_MESSAGES } = require('../constants/errors');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Base error class for all mesh-related errors
|
|
12
|
+
* @class MeshError
|
|
13
|
+
* @extends Error
|
|
14
|
+
*/
|
|
15
|
+
class MeshError extends Error {
|
|
16
|
+
/**
|
|
17
|
+
* Creates a new MeshError
|
|
18
|
+
* @param {string} message - Human-readable error message
|
|
19
|
+
* @param {string} [code='E900'] - Error code from ERROR_CODE constants
|
|
20
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
21
|
+
*/
|
|
22
|
+
constructor(message, code = 'E900', details = null) {
|
|
23
|
+
super(message);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Error name
|
|
27
|
+
* @type {string}
|
|
28
|
+
*/
|
|
29
|
+
this.name = this.constructor.name;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Error code
|
|
33
|
+
* @type {string}
|
|
34
|
+
*/
|
|
35
|
+
this.code = code;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Additional error details
|
|
39
|
+
* @type {Object|null}
|
|
40
|
+
*/
|
|
41
|
+
this.details = details;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Timestamp when error occurred
|
|
45
|
+
* @type {number}
|
|
46
|
+
*/
|
|
47
|
+
this.timestamp = Date.now();
|
|
48
|
+
|
|
49
|
+
// Capture stack trace (V8 engines)
|
|
50
|
+
if (Error.captureStackTrace) {
|
|
51
|
+
Error.captureStackTrace(this, this.constructor);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Creates an error from an error code
|
|
57
|
+
* @param {string} code - Error code from ERROR_CODE constants
|
|
58
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
59
|
+
* @returns {MeshError} New MeshError instance
|
|
60
|
+
*/
|
|
61
|
+
static fromCode(code, details = null) {
|
|
62
|
+
const message = ERROR_MESSAGES[code] || ERROR_MESSAGES.E900;
|
|
63
|
+
return new MeshError(message, code, details);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Gets the error type name from ERROR_CODE
|
|
68
|
+
* @returns {string} Error type name
|
|
69
|
+
*/
|
|
70
|
+
getTypeName() {
|
|
71
|
+
return ERROR_CODE[this.code] || 'UNKNOWN_ERROR';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Converts error to a JSON-serializable object
|
|
76
|
+
* @returns {Object} JSON representation of the error
|
|
77
|
+
*/
|
|
78
|
+
toJSON() {
|
|
79
|
+
return {
|
|
80
|
+
name: this.name,
|
|
81
|
+
message: this.message,
|
|
82
|
+
code: this.code,
|
|
83
|
+
typeName: this.getTypeName(),
|
|
84
|
+
details: this.details,
|
|
85
|
+
timestamp: this.timestamp,
|
|
86
|
+
stack: this.stack
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Creates a string representation of the error
|
|
92
|
+
* @returns {string} String representation
|
|
93
|
+
*/
|
|
94
|
+
toString() {
|
|
95
|
+
const typeName = this.getTypeName();
|
|
96
|
+
return `${this.name} [${this.code}:${typeName}]: ${this.message}`;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
module.exports = MeshError;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Message error class
|
|
5
|
+
* @module errors/MessageError
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const MeshError = require('./MeshError');
|
|
9
|
+
const { ERROR_MESSAGES } = require('../constants/errors');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Error class for message-related failures
|
|
13
|
+
* @class MessageError
|
|
14
|
+
* @extends MeshError
|
|
15
|
+
*/
|
|
16
|
+
class MessageError extends MeshError {
|
|
17
|
+
/**
|
|
18
|
+
* Creates a new MessageError
|
|
19
|
+
* @param {string} message - Human-readable error message
|
|
20
|
+
* @param {string} [code='E500'] - Error code (E5xx range)
|
|
21
|
+
* @param {string|null} [messageId=null] - ID of the message involved
|
|
22
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
23
|
+
*/
|
|
24
|
+
constructor(message, code = 'E500', messageId = null, details = null) {
|
|
25
|
+
super(message, code, details);
|
|
26
|
+
this.name = 'MessageError';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* ID of the message involved in the error
|
|
30
|
+
* @type {string|null}
|
|
31
|
+
*/
|
|
32
|
+
this.messageId = messageId;
|
|
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} [messageId=null] - ID of the message involved
|
|
39
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
40
|
+
* @returns {MessageError} New MessageError instance
|
|
41
|
+
*/
|
|
42
|
+
static fromCode(code, messageId = null, details = null) {
|
|
43
|
+
const message = ERROR_MESSAGES[code] || ERROR_MESSAGES.E500;
|
|
44
|
+
return new MessageError(message, code, messageId, details);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Creates a message too large error
|
|
49
|
+
* @param {string|null} [messageId=null] - ID of the message
|
|
50
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
51
|
+
* @returns {MessageError} New MessageError instance
|
|
52
|
+
*/
|
|
53
|
+
static messageTooLarge(messageId = null, details = null) {
|
|
54
|
+
return MessageError.fromCode('E500', messageId, details);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Creates a message expired error
|
|
59
|
+
* @param {string|null} [messageId=null] - ID of the message
|
|
60
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
61
|
+
* @returns {MessageError} New MessageError instance
|
|
62
|
+
*/
|
|
63
|
+
static messageExpired(messageId = null, details = null) {
|
|
64
|
+
return MessageError.fromCode('E501', messageId, details);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Creates an invalid format error
|
|
69
|
+
* @param {string|null} [messageId=null] - ID of the message
|
|
70
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
71
|
+
* @returns {MessageError} New MessageError instance
|
|
72
|
+
*/
|
|
73
|
+
static invalidFormat(messageId = null, details = null) {
|
|
74
|
+
return MessageError.fromCode('E502', messageId, details);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Creates an invalid checksum error
|
|
79
|
+
* @param {string|null} [messageId=null] - ID of the message
|
|
80
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
81
|
+
* @returns {MessageError} New MessageError instance
|
|
82
|
+
*/
|
|
83
|
+
static invalidChecksum(messageId = null, details = null) {
|
|
84
|
+
return MessageError.fromCode('E503', messageId, details);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Creates a duplicate message error
|
|
89
|
+
* @param {string|null} [messageId=null] - ID of the message
|
|
90
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
91
|
+
* @returns {MessageError} New MessageError instance
|
|
92
|
+
*/
|
|
93
|
+
static duplicate(messageId = null, details = null) {
|
|
94
|
+
return MessageError.fromCode('E504', messageId, details);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Creates a max hops exceeded error
|
|
99
|
+
* @param {string|null} [messageId=null] - ID of the message
|
|
100
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
101
|
+
* @returns {MessageError} New MessageError instance
|
|
102
|
+
*/
|
|
103
|
+
static maxHopsExceeded(messageId = null, details = null) {
|
|
104
|
+
return MessageError.fromCode('E505', messageId, details);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Creates a send failed error
|
|
109
|
+
* @param {string|null} [messageId=null] - ID of the message
|
|
110
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
111
|
+
* @returns {MessageError} New MessageError instance
|
|
112
|
+
*/
|
|
113
|
+
static sendFailed(messageId = null, details = null) {
|
|
114
|
+
return MessageError.fromCode('E506', messageId, details);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Converts error to a JSON-serializable object
|
|
119
|
+
* @returns {Object} JSON representation of the error
|
|
120
|
+
*/
|
|
121
|
+
toJSON() {
|
|
122
|
+
return {
|
|
123
|
+
...super.toJSON(),
|
|
124
|
+
messageId: this.messageId
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
module.exports = MessageError;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Validation error class
|
|
5
|
+
* @module errors/ValidationError
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const MeshError = require('./MeshError');
|
|
9
|
+
const { ERROR_MESSAGES } = require('../constants/errors');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Error class for input validation failures
|
|
13
|
+
* @class ValidationError
|
|
14
|
+
* @extends MeshError
|
|
15
|
+
*/
|
|
16
|
+
class ValidationError extends MeshError {
|
|
17
|
+
/**
|
|
18
|
+
* Creates a new ValidationError
|
|
19
|
+
* @param {string} message - Human-readable error message
|
|
20
|
+
* @param {string} [code='E800'] - Error code (E8xx range)
|
|
21
|
+
* @param {string|null} [field=null] - Name of the field that failed validation
|
|
22
|
+
* @param {*} [value=undefined] - The invalid value
|
|
23
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
24
|
+
*/
|
|
25
|
+
constructor(message, code = 'E800', field = null, value = undefined, details = null) {
|
|
26
|
+
super(message, code, details);
|
|
27
|
+
this.name = 'ValidationError';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Name of the field that failed validation
|
|
31
|
+
* @type {string|null}
|
|
32
|
+
*/
|
|
33
|
+
this.field = field;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The invalid value (sanitized to prevent secret exposure)
|
|
37
|
+
* @type {string|undefined}
|
|
38
|
+
*/
|
|
39
|
+
this.value = value !== undefined ? ValidationError.sanitizeValue(value) : undefined;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Sanitizes a value for safe inclusion in error output
|
|
44
|
+
* @param {*} value - The value to sanitize
|
|
45
|
+
* @returns {string} Sanitized string representation
|
|
46
|
+
* @private
|
|
47
|
+
*/
|
|
48
|
+
static sanitizeValue(value) {
|
|
49
|
+
if (value === null) { return 'null'; }
|
|
50
|
+
if (value === undefined) { return 'undefined'; }
|
|
51
|
+
|
|
52
|
+
const type = typeof value;
|
|
53
|
+
|
|
54
|
+
if (type === 'string') {
|
|
55
|
+
// Truncate long strings and mask potentially sensitive data
|
|
56
|
+
if (value.length > 50) {
|
|
57
|
+
return `"${value.substring(0, 47)}..." (${value.length} chars)`;
|
|
58
|
+
}
|
|
59
|
+
return `"${value}"`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (type === 'number' || type === 'boolean') {
|
|
63
|
+
return String(value);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (value instanceof Uint8Array) {
|
|
67
|
+
return `Uint8Array(${value.length})`;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (Array.isArray(value)) {
|
|
71
|
+
return `Array(${value.length})`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (type === 'object') {
|
|
75
|
+
return `Object(${Object.keys(value).length} keys)`;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return `[${type}]`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Creates an error from an error code
|
|
83
|
+
* @param {string} code - Error code from ERROR_CODE constants
|
|
84
|
+
* @param {string|null} [field=null] - Name of the field
|
|
85
|
+
* @param {*} [value=undefined] - The invalid value
|
|
86
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
87
|
+
* @returns {ValidationError} New ValidationError instance
|
|
88
|
+
*/
|
|
89
|
+
static fromCode(code, field = null, value = undefined, details = null) {
|
|
90
|
+
const message = ERROR_MESSAGES[code] || ERROR_MESSAGES.E800;
|
|
91
|
+
return new ValidationError(message, code, field, value, details);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Creates an invalid argument error
|
|
96
|
+
* @param {string} field - Name of the field
|
|
97
|
+
* @param {*} [value=undefined] - The invalid value
|
|
98
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
99
|
+
* @returns {ValidationError} New ValidationError instance
|
|
100
|
+
*/
|
|
101
|
+
static invalidArgument(field, value = undefined, details = null) {
|
|
102
|
+
return ValidationError.fromCode('E801', field, value, details);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Creates a missing argument error
|
|
107
|
+
* @param {string} field - Name of the missing field
|
|
108
|
+
* @param {Object|null} [details=null] - Additional error context
|
|
109
|
+
* @returns {ValidationError} New ValidationError instance
|
|
110
|
+
*/
|
|
111
|
+
static missingArgument(field, details = null) {
|
|
112
|
+
return ValidationError.fromCode('E802', field, undefined, details);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Creates an invalid type error
|
|
117
|
+
* @param {string} field - Name of the field
|
|
118
|
+
* @param {*} value - The invalid value
|
|
119
|
+
* @param {string} expectedType - Expected type description
|
|
120
|
+
* @returns {ValidationError} New ValidationError instance
|
|
121
|
+
*/
|
|
122
|
+
static invalidType(field, value, expectedType) {
|
|
123
|
+
return ValidationError.fromCode('E803', field, value, { expectedType });
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Creates an out of range error
|
|
128
|
+
* @param {string} field - Name of the field
|
|
129
|
+
* @param {*} value - The invalid value
|
|
130
|
+
* @param {Object} range - Expected range { min, max }
|
|
131
|
+
* @returns {ValidationError} New ValidationError instance
|
|
132
|
+
*/
|
|
133
|
+
static outOfRange(field, value, range) {
|
|
134
|
+
return ValidationError.fromCode('E804', field, value, { range });
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Converts error to a JSON-serializable object
|
|
139
|
+
* @returns {Object} JSON representation of the error
|
|
140
|
+
*/
|
|
141
|
+
toJSON() {
|
|
142
|
+
return {
|
|
143
|
+
...super.toJSON(),
|
|
144
|
+
field: this.field,
|
|
145
|
+
value: this.value
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
module.exports = ValidationError;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Error classes for BLE Mesh Network library
|
|
5
|
+
* @module errors
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const MeshError = require('./MeshError');
|
|
9
|
+
const CryptoError = require('./CryptoError');
|
|
10
|
+
const ConnectionError = require('./ConnectionError');
|
|
11
|
+
const HandshakeError = require('./HandshakeError');
|
|
12
|
+
const MessageError = require('./MessageError');
|
|
13
|
+
const ValidationError = require('./ValidationError');
|
|
14
|
+
const AudioError = require('./AudioError');
|
|
15
|
+
|
|
16
|
+
module.exports = {
|
|
17
|
+
MeshError,
|
|
18
|
+
CryptoError,
|
|
19
|
+
ConnectionError,
|
|
20
|
+
HandshakeError,
|
|
21
|
+
MessageError,
|
|
22
|
+
ValidationError,
|
|
23
|
+
AudioError
|
|
24
|
+
};
|