react-native-ble-mesh 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +151 -0
- package/LICENSE +21 -0
- package/README.md +706 -0
- package/docs/API.md +462 -0
- package/docs/ARCHITECTURE.md +384 -0
- package/docs/CONTRIBUTING.md +244 -0
- package/docs/NODE_QUICKSTART.md +259 -0
- package/docs/PROTOCOL.md +195 -0
- package/docs/REACT_NATIVE.md +315 -0
- package/docs/SECURITY.md +152 -0
- package/docs/api/constants_audio.js.html +184 -0
- package/docs/api/constants_ble.js.html +165 -0
- package/docs/api/constants_crypto.js.html +107 -0
- package/docs/api/constants_errors.js.html +256 -0
- package/docs/api/constants_events.js.html +148 -0
- package/docs/api/constants_index.js.html +76 -0
- package/docs/api/constants_protocol.js.html +205 -0
- package/docs/api/crypto_aead.js.html +243 -0
- package/docs/api/crypto_chacha20.js.html +235 -0
- package/docs/api/crypto_hkdf.js.html +241 -0
- package/docs/api/crypto_hmac.js.html +197 -0
- package/docs/api/crypto_index.js.html +126 -0
- package/docs/api/crypto_keys_KeyManager.js.html +325 -0
- package/docs/api/crypto_keys_KeyPair.js.html +270 -0
- package/docs/api/crypto_keys_SecureStorage.js.html +273 -0
- package/docs/api/crypto_keys_index.js.html +86 -0
- package/docs/api/crypto_noise_handshake.js.html +464 -0
- package/docs/api/crypto_noise_index.js.html +81 -0
- package/docs/api/crypto_noise_session.js.html +307 -0
- package/docs/api/crypto_noise_state.js.html +322 -0
- package/docs/api/crypto_poly1305.js.html +167 -0
- package/docs/api/crypto_sha256.js.html +294 -0
- package/docs/api/crypto_x25519.js.html +208 -0
- package/docs/api/errors_AudioError.js.html +218 -0
- package/docs/api/errors_ConnectionError.js.html +163 -0
- package/docs/api/errors_CryptoError.js.html +157 -0
- package/docs/api/errors_HandshakeError.js.html +176 -0
- package/docs/api/errors_MeshError.js.html +154 -0
- package/docs/api/errors_MessageError.js.html +183 -0
- package/docs/api/errors_ValidationError.js.html +204 -0
- package/docs/api/errors_index.js.html +78 -0
- package/docs/api/fonts/OpenSans-Bold-webfont.eot +0 -0
- package/docs/api/fonts/OpenSans-Bold-webfont.svg +1830 -0
- package/docs/api/fonts/OpenSans-Bold-webfont.woff +0 -0
- package/docs/api/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
- package/docs/api/fonts/OpenSans-BoldItalic-webfont.svg +1830 -0
- package/docs/api/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
- package/docs/api/fonts/OpenSans-Italic-webfont.eot +0 -0
- package/docs/api/fonts/OpenSans-Italic-webfont.svg +1830 -0
- package/docs/api/fonts/OpenSans-Italic-webfont.woff +0 -0
- package/docs/api/fonts/OpenSans-Light-webfont.eot +0 -0
- package/docs/api/fonts/OpenSans-Light-webfont.svg +1831 -0
- package/docs/api/fonts/OpenSans-Light-webfont.woff +0 -0
- package/docs/api/fonts/OpenSans-LightItalic-webfont.eot +0 -0
- package/docs/api/fonts/OpenSans-LightItalic-webfont.svg +1835 -0
- package/docs/api/fonts/OpenSans-LightItalic-webfont.woff +0 -0
- package/docs/api/fonts/OpenSans-Regular-webfont.eot +0 -0
- package/docs/api/fonts/OpenSans-Regular-webfont.svg +1831 -0
- package/docs/api/fonts/OpenSans-Regular-webfont.woff +0 -0
- package/docs/api/hooks_AppStateManager.js.html +233 -0
- package/docs/api/hooks_index.js.html +87 -0
- package/docs/api/hooks_useMesh.js.html +213 -0
- package/docs/api/hooks_useMessages.js.html +263 -0
- package/docs/api/hooks_usePeers.js.html +165 -0
- package/docs/api/index.html +868 -0
- package/docs/api/index.js.html +236 -0
- package/docs/api/mesh_dedup_BloomFilter.js.html +261 -0
- package/docs/api/mesh_dedup_DedupManager.js.html +266 -0
- package/docs/api/mesh_dedup_MessageCache.js.html +273 -0
- package/docs/api/mesh_dedup_index.js.html +70 -0
- package/docs/api/mesh_fragment_Assembler.js.html +335 -0
- package/docs/api/mesh_fragment_Fragmenter.js.html +230 -0
- package/docs/api/mesh_fragment_index.js.html +75 -0
- package/docs/api/mesh_index.js.html +72 -0
- package/docs/api/mesh_peer_Peer.js.html +296 -0
- package/docs/api/mesh_peer_PeerDiscovery.js.html +334 -0
- package/docs/api/mesh_peer_PeerManager.js.html +320 -0
- package/docs/api/mesh_peer_index.js.html +70 -0
- package/docs/api/mesh_router_MessageRouter.js.html +411 -0
- package/docs/api/mesh_router_PathFinder.js.html +386 -0
- package/docs/api/mesh_router_RouteTable.js.html +346 -0
- package/docs/api/mesh_router_index.js.html +70 -0
- package/docs/api/module-audio_buffer.html +168 -0
- package/docs/api/module-audio_buffer_FrameBuffer-FrameBuffer.html +2971 -0
- package/docs/api/module-audio_buffer_FrameBuffer.html +178 -0
- package/docs/api/module-audio_buffer_JitterBuffer-JitterBuffer.html +2761 -0
- package/docs/api/module-audio_buffer_JitterBuffer.html +178 -0
- package/docs/api/module-audio_codec.html +168 -0
- package/docs/api/module-audio_codec_LC3Codec-LC3Codec.html +2876 -0
- package/docs/api/module-audio_codec_LC3Codec.html +178 -0
- package/docs/api/module-audio_codec_LC3Decoder-LC3Decoder.html +1788 -0
- package/docs/api/module-audio_codec_LC3Decoder.html +178 -0
- package/docs/api/module-audio_codec_LC3Encoder-LC3Encoder.html +1512 -0
- package/docs/api/module-audio_codec_LC3Encoder.html +178 -0
- package/docs/api/module-audio_session.html +168 -0
- package/docs/api/module-audio_session_AudioSession-AudioSession.html +3922 -0
- package/docs/api/module-audio_session_AudioSession.html +178 -0
- package/docs/api/module-audio_session_VoiceMessage-VoiceMessage.html +3690 -0
- package/docs/api/module-audio_session_VoiceMessage-VoiceMessageRecorder.html +1780 -0
- package/docs/api/module-audio_session_VoiceMessage.html +332 -0
- package/docs/api/module-audio_transport.html +168 -0
- package/docs/api/module-audio_transport_AudioFragmenter-AudioAssembler.html +1545 -0
- package/docs/api/module-audio_transport_AudioFragmenter-AudioFragmenter.html +658 -0
- package/docs/api/module-audio_transport_AudioFragmenter.html +181 -0
- package/docs/api/module-audio_transport_AudioFramer.html +1414 -0
- package/docs/api/module-constants.html +168 -0
- package/docs/api/module-constants_audio.html +1782 -0
- package/docs/api/module-constants_ble.html +940 -0
- package/docs/api/module-constants_crypto.html +823 -0
- package/docs/api/module-constants_errors.html +316 -0
- package/docs/api/module-constants_events.html +244 -0
- package/docs/api/module-constants_protocol.html +1534 -0
- package/docs/api/module-crypto.html +169 -0
- package/docs/api/module-crypto_aead.html +1625 -0
- package/docs/api/module-crypto_chacha20.html +1440 -0
- package/docs/api/module-crypto_hkdf.html +1421 -0
- package/docs/api/module-crypto_hmac.html +828 -0
- package/docs/api/module-crypto_keys.html +169 -0
- package/docs/api/module-crypto_keys_KeyManager-KeyManager.html +2364 -0
- package/docs/api/module-crypto_keys_KeyManager.html +252 -0
- package/docs/api/module-crypto_keys_KeyPair.html +245 -0
- package/docs/api/module-crypto_keys_SecureStorage-MemorySecureStorage.html +923 -0
- package/docs/api/module-crypto_keys_SecureStorage-SecureStorage.html +942 -0
- package/docs/api/module-crypto_keys_SecureStorage.html +516 -0
- package/docs/api/module-crypto_noise.html +169 -0
- package/docs/api/module-crypto_noise_handshake-NoiseHandshake.html +2240 -0
- package/docs/api/module-crypto_noise_handshake.html +782 -0
- package/docs/api/module-crypto_noise_session-NoiseSession.html +1804 -0
- package/docs/api/module-crypto_noise_session.html +325 -0
- package/docs/api/module-crypto_noise_state-SymmetricState.html +1387 -0
- package/docs/api/module-crypto_noise_state.html +324 -0
- package/docs/api/module-crypto_poly1305.html +884 -0
- package/docs/api/module-crypto_sha256-HashContext.html +447 -0
- package/docs/api/module-crypto_sha256.html +942 -0
- package/docs/api/module-crypto_x25519.html +1503 -0
- package/docs/api/module-errors.html +168 -0
- package/docs/api/module-errors_AudioError-AudioError.html +4711 -0
- package/docs/api/module-errors_AudioError.html +178 -0
- package/docs/api/module-errors_ConnectionError-ConnectionError.html +3649 -0
- package/docs/api/module-errors_ConnectionError.html +178 -0
- package/docs/api/module-errors_CryptoError-CryptoError.html +3453 -0
- package/docs/api/module-errors_CryptoError.html +178 -0
- package/docs/api/module-errors_HandshakeError-HandshakeError.html +4261 -0
- package/docs/api/module-errors_HandshakeError.html +178 -0
- package/docs/api/module-errors_MeshError-MeshError.html +2155 -0
- package/docs/api/module-errors_MeshError.html +178 -0
- package/docs/api/module-errors_MessageError-MessageError.html +4545 -0
- package/docs/api/module-errors_MessageError.html +178 -0
- package/docs/api/module-errors_ValidationError-ValidationError.html +3432 -0
- package/docs/api/module-errors_ValidationError.html +178 -0
- package/docs/api/module-hooks.html +182 -0
- package/docs/api/module-hooks_AppStateManager-AppStateManager.html +1620 -0
- package/docs/api/module-hooks_AppStateManager.html +178 -0
- package/docs/api/module-hooks_useMesh.html +457 -0
- package/docs/api/module-hooks_useMessages.html +466 -0
- package/docs/api/module-hooks_usePeers.html +348 -0
- package/docs/api/module-mesh.html +168 -0
- package/docs/api/module-mesh_dedup.html +168 -0
- package/docs/api/module-mesh_dedup_BloomFilter-BloomFilter.html +2158 -0
- package/docs/api/module-mesh_dedup_BloomFilter.html +178 -0
- package/docs/api/module-mesh_dedup_DedupManager-DedupManager.html +2880 -0
- package/docs/api/module-mesh_dedup_DedupManager.html +178 -0
- package/docs/api/module-mesh_dedup_MessageCache-CacheNode.html +246 -0
- package/docs/api/module-mesh_dedup_MessageCache-MessageCache.html +2314 -0
- package/docs/api/module-mesh_dedup_MessageCache.html +181 -0
- package/docs/api/module-mesh_fragment.html +168 -0
- package/docs/api/module-mesh_fragment_Assembler-Assembler.html +2869 -0
- package/docs/api/module-mesh_fragment_Assembler-PendingFragmentSet.html +895 -0
- package/docs/api/module-mesh_fragment_Assembler.html +181 -0
- package/docs/api/module-mesh_fragment_Fragmenter.html +1084 -0
- package/docs/api/module-mesh_peer.html +168 -0
- package/docs/api/module-mesh_peer_Peer-Peer.html +4986 -0
- package/docs/api/module-mesh_peer_Peer.html +178 -0
- package/docs/api/module-mesh_peer_PeerDiscovery-PeerDiscovery.html +3423 -0
- package/docs/api/module-mesh_peer_PeerDiscovery.html +438 -0
- package/docs/api/module-mesh_peer_PeerManager-PeerManager.html +5258 -0
- package/docs/api/module-mesh_peer_PeerManager.html +178 -0
- package/docs/api/module-mesh_router.html +168 -0
- package/docs/api/module-mesh_router_MessageRouter-MessageRouter.html +3285 -0
- package/docs/api/module-mesh_router_MessageRouter.html +178 -0
- package/docs/api/module-mesh_router_PathFinder-PathFinder.html +3323 -0
- package/docs/api/module-mesh_router_PathFinder.html +421 -0
- package/docs/api/module-mesh_router_RouteTable-RouteTable.html +4115 -0
- package/docs/api/module-mesh_router_RouteTable.html +421 -0
- package/docs/api/module-protocol.html +169 -0
- package/docs/api/module-protocol_crc32.html +815 -0
- package/docs/api/module-protocol_deserializer.html +1393 -0
- package/docs/api/module-protocol_header-MessageHeader.html +2879 -0
- package/docs/api/module-protocol_header.html +892 -0
- package/docs/api/module-protocol_message-Message.html +4682 -0
- package/docs/api/module-protocol_message.html +178 -0
- package/docs/api/module-protocol_serializer.html +911 -0
- package/docs/api/module-protocol_validator.html +1396 -0
- package/docs/api/module-rn-ble-mesh.html +866 -0
- package/docs/api/module-service.html +168 -0
- package/docs/api/module-service_HandshakeManager-HandshakeManager.html +185 -0
- package/docs/api/module-service_HandshakeManager.html +175 -0
- package/docs/api/module-service_MeshService-MeshService.html +185 -0
- package/docs/api/module-service_MeshService.html +175 -0
- package/docs/api/module-service_SessionManager-SessionManager.html +174 -0
- package/docs/api/module-service_SessionManager.html +175 -0
- package/docs/api/module-service_audio.html +168 -0
- package/docs/api/module-service_audio_AudioManager-AudioManager.html +4653 -0
- package/docs/api/module-service_audio_AudioManager.html +254 -0
- package/docs/api/module-service_text.html +168 -0
- package/docs/api/module-service_text_TextManager-TextManager.html +6104 -0
- package/docs/api/module-service_text_TextManager.html +254 -0
- package/docs/api/module-service_text_broadcast.html +168 -0
- package/docs/api/module-service_text_broadcast_BroadcastManager-BroadcastManager.html +2434 -0
- package/docs/api/module-service_text_broadcast_BroadcastManager.html +254 -0
- package/docs/api/module-service_text_channel.html +168 -0
- package/docs/api/module-service_text_channel_Channel-Channel.html +4337 -0
- package/docs/api/module-service_text_channel_Channel.html +178 -0
- package/docs/api/module-service_text_channel_ChannelManager-ChannelManager.html +1927 -0
- package/docs/api/module-service_text_channel_ChannelManager.html +175 -0
- package/docs/api/module-service_text_message.html +168 -0
- package/docs/api/module-service_text_message_TextMessage-TextMessage.html +4162 -0
- package/docs/api/module-service_text_message_TextMessage.html +178 -0
- package/docs/api/module-service_text_message_TextSerializer.html +1725 -0
- package/docs/api/module-storage.html +168 -0
- package/docs/api/module-storage_AsyncStorageAdapter-AsyncStorageAdapter.html +4159 -0
- package/docs/api/module-storage_AsyncStorageAdapter.html +178 -0
- package/docs/api/module-storage_MemoryStorage-MemoryStorage.html +3154 -0
- package/docs/api/module-storage_MemoryStorage.html +178 -0
- package/docs/api/module-storage_MessageStore-MessageStore.html +5299 -0
- package/docs/api/module-storage_MessageStore.html +178 -0
- package/docs/api/module-storage_Storage-Storage.html +4169 -0
- package/docs/api/module-storage_Storage.html +178 -0
- package/docs/api/module-transport.html +168 -0
- package/docs/api/module-transport_BLEAdapter-BLEAdapter.html +4724 -0
- package/docs/api/module-transport_BLEAdapter.html +178 -0
- package/docs/api/module-transport_BLETransport-BLETransport.html +3263 -0
- package/docs/api/module-transport_BLETransport.html +178 -0
- package/docs/api/module-transport_MockTransport-MockTransport.html +3947 -0
- package/docs/api/module-transport_MockTransport.html +178 -0
- package/docs/api/module-transport_NodeBLEAdapter-NodeBLEAdapter.html +3216 -0
- package/docs/api/module-transport_NodeBLEAdapter.html +178 -0
- package/docs/api/module-transport_RNBLEAdapter-RNBLEAdapter.html +3216 -0
- package/docs/api/module-transport_RNBLEAdapter.html +178 -0
- package/docs/api/module-transport_Transport-Transport.html +4071 -0
- package/docs/api/module-transport_Transport.html +254 -0
- package/docs/api/module-transport_adapters.html +168 -0
- package/docs/api/module-transport_adapters_BLEAdapter-BLEAdapter.html +4724 -0
- package/docs/api/module-transport_adapters_BLEAdapter.html +178 -0
- package/docs/api/module-transport_adapters_NodeBLEAdapter-NodeBLEAdapter.html +3216 -0
- package/docs/api/module-transport_adapters_NodeBLEAdapter.html +178 -0
- package/docs/api/module-transport_adapters_RNBLEAdapter-RNBLEAdapter.html +3216 -0
- package/docs/api/module-transport_adapters_RNBLEAdapter.html +178 -0
- package/docs/api/module-utils.html +168 -0
- package/docs/api/module-utils_BoundedMap-BoundedMap.html +3301 -0
- package/docs/api/module-utils_BoundedMap.html +178 -0
- package/docs/api/module-utils_EventEmitter-EventEmitter.html +3358 -0
- package/docs/api/module-utils_EventEmitter.html +178 -0
- package/docs/api/module-utils_LRUCache-LRUCache.html +4134 -0
- package/docs/api/module-utils_LRUCache.html +178 -0
- package/docs/api/module-utils_RateLimiter-RateLimiter.html +2176 -0
- package/docs/api/module-utils_RateLimiter.html +500 -0
- package/docs/api/module-utils_TimeoutManager-TimeoutManager.html +1781 -0
- package/docs/api/module-utils_TimeoutManager.html +175 -0
- package/docs/api/module-utils_bytes.html +1789 -0
- package/docs/api/module-utils_debug.html +837 -0
- package/docs/api/module-utils_encoding.html +1184 -0
- package/docs/api/module-utils_retry.html +1457 -0
- package/docs/api/module-utils_time.html +1665 -0
- package/docs/api/module-utils_uuid.html +1269 -0
- package/docs/api/module-utils_validation.html +2176 -0
- package/docs/api/protocol_crc32.js.html +147 -0
- package/docs/api/protocol_deserializer.js.html +295 -0
- package/docs/api/protocol_header.js.html +276 -0
- package/docs/api/protocol_index.js.html +120 -0
- package/docs/api/protocol_message.js.html +287 -0
- package/docs/api/protocol_serializer.js.html +240 -0
- package/docs/api/protocol_validator.js.html +330 -0
- package/docs/api/scripts/linenumber.js +25 -0
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -0
- package/docs/api/scripts/prettify/lang-css.js +2 -0
- package/docs/api/scripts/prettify/prettify.js +28 -0
- package/docs/api/service_HandshakeManager.js.html +232 -0
- package/docs/api/service_MeshService.js.html +371 -0
- package/docs/api/service_SessionManager.js.html +153 -0
- package/docs/api/service_audio_AudioManager.js.html +541 -0
- package/docs/api/service_audio_buffer_FrameBuffer.js.html +223 -0
- package/docs/api/service_audio_buffer_JitterBuffer.js.html +244 -0
- package/docs/api/service_audio_buffer_index.js.html +68 -0
- package/docs/api/service_audio_codec_LC3Codec.js.html +345 -0
- package/docs/api/service_audio_codec_LC3Decoder.js.html +185 -0
- package/docs/api/service_audio_codec_LC3Encoder.js.html +194 -0
- package/docs/api/service_audio_codec_index.js.html +70 -0
- package/docs/api/service_audio_index.js.html +96 -0
- package/docs/api/service_audio_session_AudioSession.js.html +348 -0
- package/docs/api/service_audio_session_VoiceMessage.js.html +432 -0
- package/docs/api/service_audio_session_index.js.html +70 -0
- package/docs/api/service_audio_transport_AudioFragmenter.js.html +314 -0
- package/docs/api/service_audio_transport_AudioFramer.js.html +236 -0
- package/docs/api/service_audio_transport_index.js.html +69 -0
- package/docs/api/service_index.js.html +93 -0
- package/docs/api/service_text_TextManager.js.html +578 -0
- package/docs/api/service_text_broadcast_BroadcastManager.js.html +276 -0
- package/docs/api/service_text_broadcast_index.js.html +66 -0
- package/docs/api/service_text_channel_Channel.js.html +280 -0
- package/docs/api/service_text_channel_ChannelManager.js.html +225 -0
- package/docs/api/service_text_channel_index.js.html +68 -0
- package/docs/api/service_text_index.js.html +85 -0
- package/docs/api/service_text_message_TextMessage.js.html +350 -0
- package/docs/api/service_text_message_TextSerializer.js.html +218 -0
- package/docs/api/service_text_message_index.js.html +68 -0
- package/docs/api/storage_AsyncStorageAdapter.js.html +357 -0
- package/docs/api/storage_MemoryStorage.js.html +279 -0
- package/docs/api/storage_MessageStore.js.html +369 -0
- package/docs/api/storage_Storage.js.html +214 -0
- package/docs/api/storage_index.js.html +72 -0
- package/docs/api/styles/jsdoc-default.css +358 -0
- package/docs/api/styles/prettify-jsdoc.css +111 -0
- package/docs/api/styles/prettify-tomorrow.css +132 -0
- package/docs/api/transport_BLEAdapter.js.html +231 -0
- package/docs/api/transport_BLETransport.js.html +411 -0
- package/docs/api/transport_MockTransport.js.html +339 -0
- package/docs/api/transport_NodeBLEAdapter.js.html +479 -0
- package/docs/api/transport_RNBLEAdapter.js.html +382 -0
- package/docs/api/transport_Transport.js.html +242 -0
- package/docs/api/transport_adapters_BLEAdapter.js.html +231 -0
- package/docs/api/transport_adapters_NodeBLEAdapter.js.html +479 -0
- package/docs/api/transport_adapters_RNBLEAdapter.js.html +382 -0
- package/docs/api/transport_adapters_index.js.html +70 -0
- package/docs/api/transport_index.js.html +87 -0
- package/docs/api/utils_BoundedMap.js.html +205 -0
- package/docs/api/utils_EventEmitter.js.html +259 -0
- package/docs/api/utils_LRUCache.js.html +256 -0
- package/docs/api/utils_RateLimiter.js.html +256 -0
- package/docs/api/utils_TimeoutManager.js.html +218 -0
- package/docs/api/utils_base64%0A%0AThis%20implementation%20avoids%20string%20concatenation%20in%20loops%20which%20is%20O(n%C2%B2).%0AUses%20array%20building%20which%20is%20O(n)%20-%20critical%20for%20React%20Native%20performance.module_.html +717 -0
- package/docs/api/utils_base64.js.html +205 -0
- package/docs/api/utils_bytes.js.html +241 -0
- package/docs/api/utils_debug.js.html +205 -0
- package/docs/api/utils_encoding.js.html +302 -0
- package/docs/api/utils_index.js.html +160 -0
- package/docs/api/utils_retry.js.html +200 -0
- package/docs/api/utils_time.js.html +220 -0
- package/docs/api/utils_uuid.js.html +199 -0
- package/docs/api/utils_validation.js.html +259 -0
- package/examples/node-chat/chat.js +220 -0
- package/examples/node-quickstart/index.js +94 -0
- package/examples/testing/test-helper.js +182 -0
- package/package.json +111 -0
- package/src/constants/audio.js +130 -0
- package/src/constants/ble.js +111 -0
- package/src/constants/crypto.js +53 -0
- package/src/constants/errors.js +202 -0
- package/src/constants/events.js +94 -0
- package/src/constants/index.js +22 -0
- package/src/constants/protocol.js +151 -0
- package/src/crypto/aead.js +189 -0
- package/src/crypto/chacha20.js +181 -0
- package/src/crypto/hkdf.js +187 -0
- package/src/crypto/hmac.js +143 -0
- package/src/crypto/index.js +72 -0
- package/src/crypto/keys/KeyManager.js +271 -0
- package/src/crypto/keys/KeyPair.js +216 -0
- package/src/crypto/keys/SecureStorage.js +219 -0
- package/src/crypto/keys/index.js +32 -0
- package/src/crypto/noise/handshake.js +410 -0
- package/src/crypto/noise/index.js +27 -0
- package/src/crypto/noise/session.js +253 -0
- package/src/crypto/noise/state.js +268 -0
- package/src/crypto/poly1305.js +113 -0
- package/src/crypto/sha256.js +240 -0
- package/src/crypto/x25519.js +154 -0
- package/src/errors/AudioError.js +164 -0
- package/src/errors/ConnectionError.js +109 -0
- package/src/errors/CryptoError.js +103 -0
- package/src/errors/HandshakeError.js +122 -0
- package/src/errors/MeshError.js +100 -0
- package/src/errors/MessageError.js +129 -0
- package/src/errors/ValidationError.js +150 -0
- package/src/errors/index.js +24 -0
- package/src/hooks/AppStateManager.js +179 -0
- package/src/hooks/index.js +33 -0
- package/src/hooks/useMesh.js +159 -0
- package/src/hooks/useMessages.js +209 -0
- package/src/hooks/usePeers.js +111 -0
- package/src/index.d.ts +494 -0
- package/src/index.js +182 -0
- package/src/index.mjs +62 -0
- package/src/mesh/dedup/BloomFilter.js +207 -0
- package/src/mesh/dedup/DedupManager.js +212 -0
- package/src/mesh/dedup/MessageCache.js +219 -0
- package/src/mesh/dedup/index.js +16 -0
- package/src/mesh/fragment/Assembler.js +281 -0
- package/src/mesh/fragment/Fragmenter.js +176 -0
- package/src/mesh/fragment/index.js +21 -0
- package/src/mesh/index.js +18 -0
- package/src/mesh/peer/Peer.js +242 -0
- package/src/mesh/peer/PeerDiscovery.js +280 -0
- package/src/mesh/peer/PeerManager.js +266 -0
- package/src/mesh/peer/index.js +16 -0
- package/src/mesh/router/MessageRouter.js +357 -0
- package/src/mesh/router/PathFinder.js +332 -0
- package/src/mesh/router/RouteTable.js +292 -0
- package/src/mesh/router/index.js +16 -0
- package/src/protocol/crc32.js +93 -0
- package/src/protocol/deserializer.js +241 -0
- package/src/protocol/header.js +222 -0
- package/src/protocol/index.js +66 -0
- package/src/protocol/message.js +233 -0
- package/src/protocol/serializer.js +186 -0
- package/src/protocol/validator.js +276 -0
- package/src/service/HandshakeManager.js +178 -0
- package/src/service/MeshService.js +317 -0
- package/src/service/SessionManager.js +99 -0
- package/src/service/audio/AudioManager.js +487 -0
- package/src/service/audio/buffer/FrameBuffer.js +169 -0
- package/src/service/audio/buffer/JitterBuffer.js +190 -0
- package/src/service/audio/buffer/index.js +14 -0
- package/src/service/audio/codec/LC3Codec.js +291 -0
- package/src/service/audio/codec/LC3Decoder.js +131 -0
- package/src/service/audio/codec/LC3Encoder.js +140 -0
- package/src/service/audio/codec/index.js +16 -0
- package/src/service/audio/index.js +42 -0
- package/src/service/audio/session/AudioSession.js +294 -0
- package/src/service/audio/session/VoiceMessage.js +378 -0
- package/src/service/audio/session/index.js +16 -0
- package/src/service/audio/transport/AudioFragmenter.js +260 -0
- package/src/service/audio/transport/AudioFramer.js +182 -0
- package/src/service/audio/transport/index.js +15 -0
- package/src/service/index.js +39 -0
- package/src/service/text/TextManager.js +524 -0
- package/src/service/text/broadcast/BroadcastManager.js +222 -0
- package/src/service/text/broadcast/index.js +12 -0
- package/src/service/text/channel/Channel.js +226 -0
- package/src/service/text/channel/ChannelManager.js +171 -0
- package/src/service/text/channel/index.js +14 -0
- package/src/service/text/index.js +31 -0
- package/src/service/text/message/TextMessage.js +296 -0
- package/src/service/text/message/TextSerializer.js +164 -0
- package/src/service/text/message/index.js +14 -0
- package/src/storage/AsyncStorageAdapter.js +303 -0
- package/src/storage/MemoryStorage.js +225 -0
- package/src/storage/MessageStore.js +315 -0
- package/src/storage/Storage.js +160 -0
- package/src/storage/index.js +18 -0
- package/src/transport/BLEAdapter.js +177 -0
- package/src/transport/BLETransport.js +357 -0
- package/src/transport/MockTransport.js +285 -0
- package/src/transport/NodeBLEAdapter.js +425 -0
- package/src/transport/RNBLEAdapter.js +328 -0
- package/src/transport/Transport.js +188 -0
- package/src/transport/adapters/BLEAdapter.js +177 -0
- package/src/transport/adapters/NodeBLEAdapter.js +425 -0
- package/src/transport/adapters/RNBLEAdapter.js +328 -0
- package/src/transport/adapters/index.js +16 -0
- package/src/transport/index.js +33 -0
- package/src/utils/BoundedMap.js +151 -0
- package/src/utils/EventEmitter.js +205 -0
- package/src/utils/LRUCache.js +202 -0
- package/src/utils/RateLimiter.js +202 -0
- package/src/utils/TimeoutManager.js +164 -0
- package/src/utils/base64.js +151 -0
- package/src/utils/bytes.js +187 -0
- package/src/utils/debug.js +151 -0
- package/src/utils/encoding.js +248 -0
- package/src/utils/index.js +106 -0
- package/src/utils/retry.js +146 -0
- package/src/utils/time.js +166 -0
- package/src/utils/uuid.js +145 -0
- package/src/utils/validation.js +205 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Message persistence layer for BLE Mesh Network
|
|
5
|
+
* @module storage/MessageStore
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const MemoryStorage = require('./MemoryStorage');
|
|
9
|
+
const { MESH_CONFIG } = require('../constants');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Message store for persisting and retrieving mesh network messages.
|
|
13
|
+
* Provides message caching, deduplication support, and cleanup functionality.
|
|
14
|
+
*
|
|
15
|
+
* @class MessageStore
|
|
16
|
+
*/
|
|
17
|
+
class MessageStore {
|
|
18
|
+
/**
|
|
19
|
+
* Creates a new MessageStore instance
|
|
20
|
+
* @param {Object} [options={}] - Store options
|
|
21
|
+
* @param {Object} [options.storage] - Storage backend (defaults to MemoryStorage)
|
|
22
|
+
* @param {number} [options.maxMessages=1000] - Maximum messages to store
|
|
23
|
+
* @param {number} [options.messageTtlMs] - Message TTL in milliseconds
|
|
24
|
+
*/
|
|
25
|
+
constructor(options = {}) {
|
|
26
|
+
/**
|
|
27
|
+
* Storage backend
|
|
28
|
+
* @type {Object}
|
|
29
|
+
* @private
|
|
30
|
+
*/
|
|
31
|
+
this._storage = options.storage || new MemoryStorage({
|
|
32
|
+
prefix: 'msg',
|
|
33
|
+
maxSize: options.maxMessages || 1000
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Message TTL in milliseconds
|
|
38
|
+
* @type {number}
|
|
39
|
+
* @private
|
|
40
|
+
*/
|
|
41
|
+
this._messageTtlMs = options.messageTtlMs || MESH_CONFIG.MESSAGE_TTL_MS;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Index storage for queries
|
|
45
|
+
* @type {Object}
|
|
46
|
+
* @private
|
|
47
|
+
*/
|
|
48
|
+
this._indexStorage = options.indexStorage || new MemoryStorage({
|
|
49
|
+
prefix: 'msg_idx'
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Saves a message to storage
|
|
55
|
+
* @param {Object} message - Message to save
|
|
56
|
+
* @param {string} message.id - Message ID
|
|
57
|
+
* @param {number} message.type - Message type
|
|
58
|
+
* @param {Uint8Array} [message.payload] - Message payload
|
|
59
|
+
* @param {string} [message.senderId] - Sender peer ID
|
|
60
|
+
* @param {string} [message.recipientId] - Recipient peer ID
|
|
61
|
+
* @param {number} [message.timestamp] - Message timestamp
|
|
62
|
+
* @returns {Promise<void>}
|
|
63
|
+
*/
|
|
64
|
+
async saveMessage(message) {
|
|
65
|
+
if (!message || !message.id) {
|
|
66
|
+
throw new Error('Message must have an id');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const storedMessage = {
|
|
70
|
+
...message,
|
|
71
|
+
payload: message.payload
|
|
72
|
+
? Array.from(message.payload)
|
|
73
|
+
: undefined,
|
|
74
|
+
storedAt: Date.now()
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
await this._storage.set(message.id, storedMessage, {
|
|
78
|
+
ttl: this._messageTtlMs
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Update indexes
|
|
82
|
+
await this._updateIndexes(storedMessage);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Gets a message by ID
|
|
87
|
+
* @param {string} id - Message ID
|
|
88
|
+
* @returns {Promise<Object|null>} Message or null if not found
|
|
89
|
+
*/
|
|
90
|
+
async getMessage(id) {
|
|
91
|
+
const message = await this._storage.get(id);
|
|
92
|
+
|
|
93
|
+
if (!message) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Convert payload back to Uint8Array
|
|
98
|
+
if (message.payload) {
|
|
99
|
+
message.payload = new Uint8Array(message.payload);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return message;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Gets messages matching query options
|
|
107
|
+
* @param {Object} [options={}] - Query options
|
|
108
|
+
* @param {string} [options.senderId] - Filter by sender ID
|
|
109
|
+
* @param {string} [options.recipientId] - Filter by recipient ID
|
|
110
|
+
* @param {number} [options.type] - Filter by message type
|
|
111
|
+
* @param {number} [options.since] - Filter messages since timestamp
|
|
112
|
+
* @param {number} [options.until] - Filter messages until timestamp
|
|
113
|
+
* @param {number} [options.limit=50] - Maximum messages to return
|
|
114
|
+
* @param {number} [options.offset=0] - Offset for pagination
|
|
115
|
+
* @returns {Promise<Object[]>} Array of messages
|
|
116
|
+
*/
|
|
117
|
+
async getMessages(options = {}) {
|
|
118
|
+
const {
|
|
119
|
+
senderId,
|
|
120
|
+
recipientId,
|
|
121
|
+
type,
|
|
122
|
+
since,
|
|
123
|
+
until,
|
|
124
|
+
limit = 50,
|
|
125
|
+
offset = 0
|
|
126
|
+
} = options;
|
|
127
|
+
|
|
128
|
+
const allKeys = await this._storage.keys();
|
|
129
|
+
const messages = [];
|
|
130
|
+
|
|
131
|
+
for (const key of allKeys) {
|
|
132
|
+
const message = await this.getMessage(key);
|
|
133
|
+
if (!message) { continue; }
|
|
134
|
+
|
|
135
|
+
// Apply filters
|
|
136
|
+
if (senderId && message.senderId !== senderId) { continue; }
|
|
137
|
+
if (recipientId && message.recipientId !== recipientId) { continue; }
|
|
138
|
+
if (type !== undefined && message.type !== type) { continue; }
|
|
139
|
+
if (since && message.timestamp < since) { continue; }
|
|
140
|
+
if (until && message.timestamp > until) { continue; }
|
|
141
|
+
|
|
142
|
+
messages.push(message);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Sort by timestamp (newest first)
|
|
146
|
+
messages.sort((a, b) => (b.timestamp || 0) - (a.timestamp || 0));
|
|
147
|
+
|
|
148
|
+
// Apply pagination
|
|
149
|
+
return messages.slice(offset, offset + limit);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Deletes a message by ID
|
|
154
|
+
* @param {string} id - Message ID
|
|
155
|
+
* @returns {Promise<void>}
|
|
156
|
+
*/
|
|
157
|
+
async deleteMessage(id) {
|
|
158
|
+
const message = await this.getMessage(id);
|
|
159
|
+
if (message) {
|
|
160
|
+
await this._removeFromIndexes(message);
|
|
161
|
+
}
|
|
162
|
+
await this._storage.delete(id);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Checks if a message exists
|
|
167
|
+
* @param {string} id - Message ID
|
|
168
|
+
* @returns {Promise<boolean>} True if message exists
|
|
169
|
+
*/
|
|
170
|
+
async hasMessage(id) {
|
|
171
|
+
return this._storage.has(id);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Cleans up expired messages
|
|
176
|
+
* @param {number} [maxAgeMs] - Maximum message age in milliseconds
|
|
177
|
+
* @returns {Promise<number>} Number of messages removed
|
|
178
|
+
*/
|
|
179
|
+
async cleanup(maxAgeMs) {
|
|
180
|
+
const maxAge = maxAgeMs || this._messageTtlMs;
|
|
181
|
+
const cutoff = Date.now() - maxAge;
|
|
182
|
+
const allKeys = await this._storage.keys();
|
|
183
|
+
let removed = 0;
|
|
184
|
+
|
|
185
|
+
for (const key of allKeys) {
|
|
186
|
+
const message = await this._storage.get(key);
|
|
187
|
+
if (message) {
|
|
188
|
+
const messageTime = message.timestamp || message.storedAt || 0;
|
|
189
|
+
if (messageTime < cutoff) {
|
|
190
|
+
await this.deleteMessage(key);
|
|
191
|
+
removed++;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return removed;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Gets the count of stored messages
|
|
201
|
+
* @returns {Promise<number>} Number of messages
|
|
202
|
+
*/
|
|
203
|
+
async getCount() {
|
|
204
|
+
return this._storage.size();
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Clears all stored messages
|
|
209
|
+
* @returns {Promise<void>}
|
|
210
|
+
*/
|
|
211
|
+
async clear() {
|
|
212
|
+
await this._storage.clear();
|
|
213
|
+
await this._indexStorage.clear();
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Gets messages by sender
|
|
218
|
+
* @param {string} senderId - Sender peer ID
|
|
219
|
+
* @param {number} [limit=50] - Maximum messages
|
|
220
|
+
* @returns {Promise<Object[]>} Array of messages
|
|
221
|
+
*/
|
|
222
|
+
async getMessagesBySender(senderId, limit = 50) {
|
|
223
|
+
return this.getMessages({ senderId, limit });
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Gets messages by recipient
|
|
228
|
+
* @param {string} recipientId - Recipient peer ID
|
|
229
|
+
* @param {number} [limit=50] - Maximum messages
|
|
230
|
+
* @returns {Promise<Object[]>} Array of messages
|
|
231
|
+
*/
|
|
232
|
+
async getMessagesByRecipient(recipientId, limit = 50) {
|
|
233
|
+
return this.getMessages({ recipientId, limit });
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Gets conversation messages between two peers
|
|
238
|
+
* @param {string} peerId1 - First peer ID
|
|
239
|
+
* @param {string} peerId2 - Second peer ID
|
|
240
|
+
* @param {number} [limit=50] - Maximum messages
|
|
241
|
+
* @returns {Promise<Object[]>} Array of messages
|
|
242
|
+
*/
|
|
243
|
+
async getConversation(peerId1, peerId2, limit = 50) {
|
|
244
|
+
const allKeys = await this._storage.keys();
|
|
245
|
+
const messages = [];
|
|
246
|
+
|
|
247
|
+
for (const key of allKeys) {
|
|
248
|
+
const message = await this.getMessage(key);
|
|
249
|
+
if (!message) { continue; }
|
|
250
|
+
|
|
251
|
+
const isMatch =
|
|
252
|
+
(message.senderId === peerId1 && message.recipientId === peerId2) ||
|
|
253
|
+
(message.senderId === peerId2 && message.recipientId === peerId1);
|
|
254
|
+
|
|
255
|
+
if (isMatch) {
|
|
256
|
+
messages.push(message);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
messages.sort((a, b) => (a.timestamp || 0) - (b.timestamp || 0));
|
|
261
|
+
return messages.slice(-limit);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Updates indexes for a message
|
|
266
|
+
* @param {Object} message - Message to index
|
|
267
|
+
* @returns {Promise<void>}
|
|
268
|
+
* @private
|
|
269
|
+
*/
|
|
270
|
+
async _updateIndexes(message) {
|
|
271
|
+
// Sender index
|
|
272
|
+
if (message.senderId) {
|
|
273
|
+
const key = `sender:${message.senderId}`;
|
|
274
|
+
const ids = (await this._indexStorage.get(key)) || [];
|
|
275
|
+
if (!ids.includes(message.id)) {
|
|
276
|
+
ids.push(message.id);
|
|
277
|
+
await this._indexStorage.set(key, ids);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Recipient index
|
|
282
|
+
if (message.recipientId) {
|
|
283
|
+
const key = `recipient:${message.recipientId}`;
|
|
284
|
+
const ids = (await this._indexStorage.get(key)) || [];
|
|
285
|
+
if (!ids.includes(message.id)) {
|
|
286
|
+
ids.push(message.id);
|
|
287
|
+
await this._indexStorage.set(key, ids);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Removes a message from indexes
|
|
294
|
+
* @param {Object} message - Message to remove from indexes
|
|
295
|
+
* @returns {Promise<void>}
|
|
296
|
+
* @private
|
|
297
|
+
*/
|
|
298
|
+
async _removeFromIndexes(message) {
|
|
299
|
+
if (message.senderId) {
|
|
300
|
+
const key = `sender:${message.senderId}`;
|
|
301
|
+
const ids = (await this._indexStorage.get(key)) || [];
|
|
302
|
+
const filtered = ids.filter(id => id !== message.id);
|
|
303
|
+
await this._indexStorage.set(key, filtered);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (message.recipientId) {
|
|
307
|
+
const key = `recipient:${message.recipientId}`;
|
|
308
|
+
const ids = (await this._indexStorage.get(key)) || [];
|
|
309
|
+
const filtered = ids.filter(id => id !== message.id);
|
|
310
|
+
await this._indexStorage.set(key, filtered);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
module.exports = MessageStore;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Abstract storage interface for BLE Mesh Network
|
|
5
|
+
* @module storage/Storage
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Abstract storage interface.
|
|
10
|
+
* Extend this class to implement specific storage backends.
|
|
11
|
+
*
|
|
12
|
+
* @abstract
|
|
13
|
+
* @class Storage
|
|
14
|
+
*/
|
|
15
|
+
class Storage {
|
|
16
|
+
/**
|
|
17
|
+
* Creates a new Storage instance
|
|
18
|
+
* @param {Object} [options={}] - Storage options
|
|
19
|
+
* @param {string} [options.prefix=''] - Key prefix for namespacing
|
|
20
|
+
*/
|
|
21
|
+
constructor(options = {}) {
|
|
22
|
+
/**
|
|
23
|
+
* Storage options
|
|
24
|
+
* @type {Object}
|
|
25
|
+
* @protected
|
|
26
|
+
*/
|
|
27
|
+
this._options = {
|
|
28
|
+
prefix: '',
|
|
29
|
+
...options
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Gets the prefixed key
|
|
35
|
+
* @param {string} key - Original key
|
|
36
|
+
* @returns {string} Prefixed key
|
|
37
|
+
* @protected
|
|
38
|
+
*/
|
|
39
|
+
_getKey(key) {
|
|
40
|
+
return this._options.prefix ? `${this._options.prefix}:${key}` : key;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Gets a value by key
|
|
45
|
+
* @abstract
|
|
46
|
+
* @param {string} key - Key to retrieve
|
|
47
|
+
* @returns {Promise<any>} Stored value or undefined
|
|
48
|
+
* @throws {Error} If not implemented by subclass
|
|
49
|
+
*/
|
|
50
|
+
async get(_key) {
|
|
51
|
+
throw new Error('Storage.get() must be implemented by subclass');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Sets a value by key
|
|
56
|
+
* @abstract
|
|
57
|
+
* @param {string} key - Key to set
|
|
58
|
+
* @param {any} value - Value to store
|
|
59
|
+
* @returns {Promise<void>}
|
|
60
|
+
* @throws {Error} If not implemented by subclass
|
|
61
|
+
*/
|
|
62
|
+
async set(_key, _value) {
|
|
63
|
+
throw new Error('Storage.set() must be implemented by subclass');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Deletes a value by key
|
|
68
|
+
* @abstract
|
|
69
|
+
* @param {string} key - Key to delete
|
|
70
|
+
* @returns {Promise<void>}
|
|
71
|
+
* @throws {Error} If not implemented by subclass
|
|
72
|
+
*/
|
|
73
|
+
async delete(_key) {
|
|
74
|
+
throw new Error('Storage.delete() must be implemented by subclass');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Checks if a key exists
|
|
79
|
+
* @abstract
|
|
80
|
+
* @param {string} key - Key to check
|
|
81
|
+
* @returns {Promise<boolean>} True if key exists
|
|
82
|
+
* @throws {Error} If not implemented by subclass
|
|
83
|
+
*/
|
|
84
|
+
async has(_key) {
|
|
85
|
+
throw new Error('Storage.has() must be implemented by subclass');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Clears all stored data
|
|
90
|
+
* @abstract
|
|
91
|
+
* @returns {Promise<void>}
|
|
92
|
+
* @throws {Error} If not implemented by subclass
|
|
93
|
+
*/
|
|
94
|
+
async clear() {
|
|
95
|
+
throw new Error('Storage.clear() must be implemented by subclass');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Gets all keys
|
|
100
|
+
* @abstract
|
|
101
|
+
* @returns {Promise<string[]>} Array of keys
|
|
102
|
+
* @throws {Error} If not implemented by subclass
|
|
103
|
+
*/
|
|
104
|
+
async keys() {
|
|
105
|
+
throw new Error('Storage.keys() must be implemented by subclass');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Gets the number of stored items
|
|
110
|
+
* @returns {Promise<number>} Number of items
|
|
111
|
+
*/
|
|
112
|
+
async size() {
|
|
113
|
+
const allKeys = await this.keys();
|
|
114
|
+
return allKeys.length;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Gets multiple values by keys
|
|
119
|
+
* @param {string[]} keys - Keys to retrieve
|
|
120
|
+
* @returns {Promise<Map<string, any>>} Map of key-value pairs
|
|
121
|
+
*/
|
|
122
|
+
async getMany(keys) {
|
|
123
|
+
const result = new Map();
|
|
124
|
+
await Promise.all(
|
|
125
|
+
keys.map(async (key) => {
|
|
126
|
+
const value = await this.get(key);
|
|
127
|
+
if (value !== undefined) {
|
|
128
|
+
result.set(key, value);
|
|
129
|
+
}
|
|
130
|
+
})
|
|
131
|
+
);
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Sets multiple key-value pairs
|
|
137
|
+
* @param {Map<string, any>|Object} entries - Entries to set
|
|
138
|
+
* @returns {Promise<void>}
|
|
139
|
+
*/
|
|
140
|
+
async setMany(entries) {
|
|
141
|
+
const pairs = entries instanceof Map
|
|
142
|
+
? Array.from(entries.entries())
|
|
143
|
+
: Object.entries(entries);
|
|
144
|
+
|
|
145
|
+
await Promise.all(
|
|
146
|
+
pairs.map(([key, value]) => this.set(key, value))
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Deletes multiple keys
|
|
152
|
+
* @param {string[]} keys - Keys to delete
|
|
153
|
+
* @returns {Promise<void>}
|
|
154
|
+
*/
|
|
155
|
+
async deleteMany(keys) {
|
|
156
|
+
await Promise.all(keys.map(key => this.delete(key)));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
module.exports = Storage;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Storage module exports
|
|
5
|
+
* @module storage
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const Storage = require('./Storage');
|
|
9
|
+
const MemoryStorage = require('./MemoryStorage');
|
|
10
|
+
const AsyncStorageAdapter = require('./AsyncStorageAdapter');
|
|
11
|
+
const MessageStore = require('./MessageStore');
|
|
12
|
+
|
|
13
|
+
module.exports = {
|
|
14
|
+
Storage,
|
|
15
|
+
MemoryStorage,
|
|
16
|
+
AsyncStorageAdapter,
|
|
17
|
+
MessageStore
|
|
18
|
+
};
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Abstract BLE adapter interface
|
|
5
|
+
* @module transport/BLEAdapter
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { BLUETOOTH_STATE } = require('../constants');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Abstract BLE adapter interface.
|
|
12
|
+
* Provides a unified API for different BLE implementations.
|
|
13
|
+
*
|
|
14
|
+
* @abstract
|
|
15
|
+
* @class BLEAdapter
|
|
16
|
+
*/
|
|
17
|
+
class BLEAdapter {
|
|
18
|
+
/**
|
|
19
|
+
* Creates a new BLEAdapter instance
|
|
20
|
+
* @param {Object} [options={}] - Adapter options
|
|
21
|
+
*/
|
|
22
|
+
constructor(options = {}) {
|
|
23
|
+
/**
|
|
24
|
+
* Adapter options
|
|
25
|
+
* @type {Object}
|
|
26
|
+
* @protected
|
|
27
|
+
*/
|
|
28
|
+
this._options = options;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* State change callback
|
|
32
|
+
* @type {Function|null}
|
|
33
|
+
* @protected
|
|
34
|
+
*/
|
|
35
|
+
this._stateChangeCallback = null;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Whether adapter is initialized
|
|
39
|
+
* @type {boolean}
|
|
40
|
+
* @protected
|
|
41
|
+
*/
|
|
42
|
+
this._initialized = false;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Gets whether the adapter is initialized
|
|
47
|
+
* @returns {boolean} True if initialized
|
|
48
|
+
*/
|
|
49
|
+
get isInitialized() {
|
|
50
|
+
return this._initialized;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Initializes the BLE adapter
|
|
55
|
+
* @abstract
|
|
56
|
+
* @returns {Promise<void>}
|
|
57
|
+
* @throws {Error} If not implemented by subclass
|
|
58
|
+
*/
|
|
59
|
+
async initialize() {
|
|
60
|
+
throw new Error('BLEAdapter.initialize() must be implemented by subclass');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Destroys the BLE adapter and releases resources
|
|
65
|
+
* @abstract
|
|
66
|
+
* @returns {Promise<void>}
|
|
67
|
+
* @throws {Error} If not implemented by subclass
|
|
68
|
+
*/
|
|
69
|
+
async destroy() {
|
|
70
|
+
throw new Error('BLEAdapter.destroy() must be implemented by subclass');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Starts scanning for BLE devices
|
|
75
|
+
* @abstract
|
|
76
|
+
* @param {string[]} serviceUUIDs - Service UUIDs to filter by
|
|
77
|
+
* @param {Function} callback - Callback for discovered devices
|
|
78
|
+
* @returns {Promise<void>}
|
|
79
|
+
* @throws {Error} If not implemented by subclass
|
|
80
|
+
*/
|
|
81
|
+
async startScan(_serviceUUIDs, _callback) {
|
|
82
|
+
throw new Error('BLEAdapter.startScan() must be implemented by subclass');
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Stops scanning for BLE devices
|
|
87
|
+
* @abstract
|
|
88
|
+
* @throws {Error} If not implemented by subclass
|
|
89
|
+
*/
|
|
90
|
+
stopScan() {
|
|
91
|
+
throw new Error('BLEAdapter.stopScan() must be implemented by subclass');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Connects to a BLE device
|
|
96
|
+
* @abstract
|
|
97
|
+
* @param {string} deviceId - Device ID to connect to
|
|
98
|
+
* @returns {Promise<Object>} Connected device info
|
|
99
|
+
* @throws {Error} If not implemented by subclass
|
|
100
|
+
*/
|
|
101
|
+
async connect(_deviceId) {
|
|
102
|
+
throw new Error('BLEAdapter.connect() must be implemented by subclass');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Disconnects from a BLE device
|
|
107
|
+
* @abstract
|
|
108
|
+
* @param {string} deviceId - Device ID to disconnect from
|
|
109
|
+
* @returns {Promise<void>}
|
|
110
|
+
* @throws {Error} If not implemented by subclass
|
|
111
|
+
*/
|
|
112
|
+
async disconnect(_deviceId) {
|
|
113
|
+
throw new Error('BLEAdapter.disconnect() must be implemented by subclass');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Writes data to a characteristic
|
|
118
|
+
* @abstract
|
|
119
|
+
* @param {string} deviceId - Target device ID
|
|
120
|
+
* @param {string} serviceUUID - Service UUID
|
|
121
|
+
* @param {string} charUUID - Characteristic UUID
|
|
122
|
+
* @param {Uint8Array} data - Data to write
|
|
123
|
+
* @returns {Promise<void>}
|
|
124
|
+
* @throws {Error} If not implemented by subclass
|
|
125
|
+
*/
|
|
126
|
+
async write(_deviceId, _serviceUUID, _charUUID, _data) {
|
|
127
|
+
throw new Error('BLEAdapter.write() must be implemented by subclass');
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Subscribes to characteristic notifications
|
|
132
|
+
* @abstract
|
|
133
|
+
* @param {string} deviceId - Target device ID
|
|
134
|
+
* @param {string} serviceUUID - Service UUID
|
|
135
|
+
* @param {string} charUUID - Characteristic UUID
|
|
136
|
+
* @param {Function} callback - Notification callback
|
|
137
|
+
* @returns {Promise<void>}
|
|
138
|
+
* @throws {Error} If not implemented by subclass
|
|
139
|
+
*/
|
|
140
|
+
async subscribe(_deviceId, _serviceUUID, _charUUID, _callback) {
|
|
141
|
+
throw new Error('BLEAdapter.subscribe() must be implemented by subclass');
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Gets the current Bluetooth state
|
|
146
|
+
* @abstract
|
|
147
|
+
* @returns {Promise<string>} Bluetooth state
|
|
148
|
+
* @throws {Error} If not implemented by subclass
|
|
149
|
+
*/
|
|
150
|
+
async getState() {
|
|
151
|
+
throw new Error('BLEAdapter.getState() must be implemented by subclass');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Registers a callback for Bluetooth state changes
|
|
156
|
+
* @param {Function} callback - State change callback
|
|
157
|
+
*/
|
|
158
|
+
onStateChange(callback) {
|
|
159
|
+
this._stateChangeCallback = callback;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Notifies listeners of state change
|
|
164
|
+
* @param {string} state - New Bluetooth state
|
|
165
|
+
* @protected
|
|
166
|
+
*/
|
|
167
|
+
_notifyStateChange(state) {
|
|
168
|
+
if (this._stateChangeCallback) {
|
|
169
|
+
this._stateChangeCallback(state);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Export state constants with the class
|
|
175
|
+
BLEAdapter.STATE = BLUETOOTH_STATE;
|
|
176
|
+
|
|
177
|
+
module.exports = BLEAdapter;
|