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,328 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview React Native BLE adapter using react-native-ble-plx
|
|
5
|
+
* @module transport/RNBLEAdapter
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const BLEAdapter = require('./BLEAdapter');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* React Native BLE adapter implementation.
|
|
12
|
+
* Wraps react-native-ble-plx for BLE communication in React Native apps.
|
|
13
|
+
*
|
|
14
|
+
* NOTE: react-native-ble-plx is an optional peer dependency.
|
|
15
|
+
* Install it separately: npm install react-native-ble-plx
|
|
16
|
+
*
|
|
17
|
+
* @class RNBLEAdapter
|
|
18
|
+
* @extends BLEAdapter
|
|
19
|
+
*/
|
|
20
|
+
class RNBLEAdapter extends BLEAdapter {
|
|
21
|
+
/**
|
|
22
|
+
* Creates a new RNBLEAdapter instance
|
|
23
|
+
* @param {Object} [options={}] - Adapter options
|
|
24
|
+
* @param {Object} [options.BleManager] - BleManager class from react-native-ble-plx
|
|
25
|
+
*/
|
|
26
|
+
constructor(options = {}) {
|
|
27
|
+
super(options);
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* BleManager instance
|
|
31
|
+
* @type {Object|null}
|
|
32
|
+
* @private
|
|
33
|
+
*/
|
|
34
|
+
this._manager = null;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* BleManager class reference
|
|
38
|
+
* @type {Function|null}
|
|
39
|
+
* @private
|
|
40
|
+
*/
|
|
41
|
+
this._BleManager = options.BleManager || null;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Connected devices map
|
|
45
|
+
* @type {Map<string, Object>}
|
|
46
|
+
* @private
|
|
47
|
+
*/
|
|
48
|
+
this._devices = new Map();
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Subscription handlers map
|
|
52
|
+
* @type {Map<string, Object>}
|
|
53
|
+
* @private
|
|
54
|
+
*/
|
|
55
|
+
this._subscriptions = new Map();
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Scan subscription reference
|
|
59
|
+
* @type {Object|null}
|
|
60
|
+
* @private
|
|
61
|
+
*/
|
|
62
|
+
this._scanSubscription = null;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* State subscription reference
|
|
66
|
+
* @type {Object|null}
|
|
67
|
+
* @private
|
|
68
|
+
*/
|
|
69
|
+
this._stateSubscription = null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Initializes the BLE manager
|
|
74
|
+
* @returns {Promise<void>}
|
|
75
|
+
* @throws {Error} If react-native-ble-plx is not available
|
|
76
|
+
*/
|
|
77
|
+
async initialize() {
|
|
78
|
+
if (this._initialized) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Try to load BleManager if not provided
|
|
83
|
+
if (!this._BleManager) {
|
|
84
|
+
try {
|
|
85
|
+
const blePlx = require('react-native-ble-plx');
|
|
86
|
+
this._BleManager = blePlx.BleManager;
|
|
87
|
+
} catch (error) {
|
|
88
|
+
throw new Error(
|
|
89
|
+
'react-native-ble-plx is required. Install with: npm install react-native-ble-plx'
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
this._manager = new this._BleManager();
|
|
95
|
+
|
|
96
|
+
// Subscribe to state changes
|
|
97
|
+
this._stateSubscription = this._manager.onStateChange((state) => {
|
|
98
|
+
this._notifyStateChange(this._mapState(state));
|
|
99
|
+
}, true);
|
|
100
|
+
|
|
101
|
+
this._initialized = true;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Destroys the BLE manager and releases resources
|
|
106
|
+
* @returns {Promise<void>}
|
|
107
|
+
*/
|
|
108
|
+
async destroy() {
|
|
109
|
+
if (!this._initialized) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Cancel all subscriptions
|
|
114
|
+
for (const subscription of this._subscriptions.values()) {
|
|
115
|
+
subscription.remove();
|
|
116
|
+
}
|
|
117
|
+
this._subscriptions.clear();
|
|
118
|
+
|
|
119
|
+
// Stop scanning
|
|
120
|
+
this.stopScan();
|
|
121
|
+
|
|
122
|
+
// Remove state subscription
|
|
123
|
+
if (this._stateSubscription) {
|
|
124
|
+
this._stateSubscription.remove();
|
|
125
|
+
this._stateSubscription = null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Disconnect all devices
|
|
129
|
+
for (const deviceId of this._devices.keys()) {
|
|
130
|
+
await this.disconnect(deviceId);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Destroy manager
|
|
134
|
+
if (this._manager) {
|
|
135
|
+
this._manager.destroy();
|
|
136
|
+
this._manager = null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
this._initialized = false;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Starts scanning for BLE devices
|
|
144
|
+
* @param {string[]} serviceUUIDs - Service UUIDs to filter by
|
|
145
|
+
* @param {Function} callback - Callback for discovered devices
|
|
146
|
+
* @returns {Promise<void>}
|
|
147
|
+
*/
|
|
148
|
+
async startScan(serviceUUIDs, callback) {
|
|
149
|
+
this._ensureInitialized();
|
|
150
|
+
|
|
151
|
+
this._manager.startDeviceScan(serviceUUIDs, null, (error, device) => {
|
|
152
|
+
if (error) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (device) {
|
|
156
|
+
callback({
|
|
157
|
+
id: device.id,
|
|
158
|
+
name: device.name || device.localName,
|
|
159
|
+
rssi: device.rssi
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Stops scanning for BLE devices
|
|
167
|
+
*/
|
|
168
|
+
stopScan() {
|
|
169
|
+
if (this._manager) {
|
|
170
|
+
this._manager.stopDeviceScan();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Connects to a BLE device
|
|
176
|
+
* @param {string} deviceId - Device ID to connect to
|
|
177
|
+
* @returns {Promise<Object>} Connected device info
|
|
178
|
+
*/
|
|
179
|
+
async connect(deviceId) {
|
|
180
|
+
this._ensureInitialized();
|
|
181
|
+
|
|
182
|
+
const device = await this._manager.connectToDevice(deviceId);
|
|
183
|
+
await device.discoverAllServicesAndCharacteristics();
|
|
184
|
+
|
|
185
|
+
this._devices.set(deviceId, device);
|
|
186
|
+
|
|
187
|
+
// Monitor disconnection
|
|
188
|
+
device.onDisconnected(() => {
|
|
189
|
+
this._devices.delete(deviceId);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
return {
|
|
193
|
+
id: device.id,
|
|
194
|
+
name: device.name,
|
|
195
|
+
rssi: device.rssi
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Disconnects from a BLE device
|
|
201
|
+
* @param {string} deviceId - Device ID to disconnect from
|
|
202
|
+
* @returns {Promise<void>}
|
|
203
|
+
*/
|
|
204
|
+
async disconnect(deviceId) {
|
|
205
|
+
const device = this._devices.get(deviceId);
|
|
206
|
+
if (device) {
|
|
207
|
+
await this._manager.cancelDeviceConnection(deviceId);
|
|
208
|
+
this._devices.delete(deviceId);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Writes data to a characteristic
|
|
214
|
+
* @param {string} deviceId - Target device ID
|
|
215
|
+
* @param {string} serviceUUID - Service UUID
|
|
216
|
+
* @param {string} charUUID - Characteristic UUID
|
|
217
|
+
* @param {Uint8Array} data - Data to write
|
|
218
|
+
* @returns {Promise<void>}
|
|
219
|
+
*/
|
|
220
|
+
async write(deviceId, serviceUUID, charUUID, data) {
|
|
221
|
+
this._ensureInitialized();
|
|
222
|
+
|
|
223
|
+
const base64Data = this._uint8ArrayToBase64(data);
|
|
224
|
+
await this._manager.writeCharacteristicWithResponseForDevice(
|
|
225
|
+
deviceId,
|
|
226
|
+
serviceUUID,
|
|
227
|
+
charUUID,
|
|
228
|
+
base64Data
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Subscribes to characteristic notifications
|
|
234
|
+
* @param {string} deviceId - Target device ID
|
|
235
|
+
* @param {string} serviceUUID - Service UUID
|
|
236
|
+
* @param {string} charUUID - Characteristic UUID
|
|
237
|
+
* @param {Function} callback - Notification callback
|
|
238
|
+
* @returns {Promise<void>}
|
|
239
|
+
*/
|
|
240
|
+
async subscribe(deviceId, serviceUUID, charUUID, callback) {
|
|
241
|
+
this._ensureInitialized();
|
|
242
|
+
|
|
243
|
+
const key = `${deviceId}:${serviceUUID}:${charUUID}`;
|
|
244
|
+
const subscription = this._manager.monitorCharacteristicForDevice(
|
|
245
|
+
deviceId,
|
|
246
|
+
serviceUUID,
|
|
247
|
+
charUUID,
|
|
248
|
+
(error, characteristic) => {
|
|
249
|
+
if (!error && characteristic) {
|
|
250
|
+
const data = this._base64ToUint8Array(characteristic.value);
|
|
251
|
+
callback(data);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
this._subscriptions.set(key, subscription);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Gets the current Bluetooth state
|
|
261
|
+
* @returns {Promise<string>} Bluetooth state
|
|
262
|
+
*/
|
|
263
|
+
async getState() {
|
|
264
|
+
this._ensureInitialized();
|
|
265
|
+
const state = await this._manager.state();
|
|
266
|
+
return this._mapState(state);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Maps react-native-ble-plx state to BLEAdapter state
|
|
271
|
+
* @param {string} state - RN BLE state
|
|
272
|
+
* @returns {string} Mapped state
|
|
273
|
+
* @private
|
|
274
|
+
*/
|
|
275
|
+
_mapState(state) {
|
|
276
|
+
const stateMap = {
|
|
277
|
+
Unknown: BLEAdapter.STATE.UNKNOWN,
|
|
278
|
+
Resetting: BLEAdapter.STATE.RESETTING,
|
|
279
|
+
Unsupported: BLEAdapter.STATE.UNSUPPORTED,
|
|
280
|
+
Unauthorized: BLEAdapter.STATE.UNAUTHORIZED,
|
|
281
|
+
PoweredOff: BLEAdapter.STATE.POWERED_OFF,
|
|
282
|
+
PoweredOn: BLEAdapter.STATE.POWERED_ON
|
|
283
|
+
};
|
|
284
|
+
return stateMap[state] || BLEAdapter.STATE.UNKNOWN;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Ensures the adapter is initialized
|
|
289
|
+
* @throws {Error} If not initialized
|
|
290
|
+
* @private
|
|
291
|
+
*/
|
|
292
|
+
_ensureInitialized() {
|
|
293
|
+
if (!this._initialized) {
|
|
294
|
+
throw new Error('RNBLEAdapter is not initialized');
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Converts Uint8Array to Base64 string
|
|
300
|
+
* @param {Uint8Array} bytes - Bytes to convert
|
|
301
|
+
* @returns {string} Base64 string
|
|
302
|
+
* @private
|
|
303
|
+
*/
|
|
304
|
+
_uint8ArrayToBase64(bytes) {
|
|
305
|
+
let binary = '';
|
|
306
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
307
|
+
binary += String.fromCharCode(bytes[i]);
|
|
308
|
+
}
|
|
309
|
+
return btoa(binary);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Converts Base64 string to Uint8Array
|
|
314
|
+
* @param {string} base64 - Base64 string
|
|
315
|
+
* @returns {Uint8Array} Byte array
|
|
316
|
+
* @private
|
|
317
|
+
*/
|
|
318
|
+
_base64ToUint8Array(base64) {
|
|
319
|
+
const binary = atob(base64);
|
|
320
|
+
const bytes = new Uint8Array(binary.length);
|
|
321
|
+
for (let i = 0; i < binary.length; i++) {
|
|
322
|
+
bytes[i] = binary.charCodeAt(i);
|
|
323
|
+
}
|
|
324
|
+
return bytes;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
module.exports = RNBLEAdapter;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Abstract transport interface for BLE Mesh Network
|
|
5
|
+
* @module transport/Transport
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const EventEmitter = require('events');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Transport states
|
|
12
|
+
* @constant {Object.<string, string>}
|
|
13
|
+
*/
|
|
14
|
+
const TRANSPORT_STATE = Object.freeze({
|
|
15
|
+
STOPPED: 'stopped',
|
|
16
|
+
STARTING: 'starting',
|
|
17
|
+
RUNNING: 'running',
|
|
18
|
+
STOPPING: 'stopping',
|
|
19
|
+
ERROR: 'error'
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Abstract transport interface for mesh network communication.
|
|
24
|
+
* Extend this class to implement specific transport mechanisms (BLE, WiFi, etc.)
|
|
25
|
+
*
|
|
26
|
+
* @abstract
|
|
27
|
+
* @class Transport
|
|
28
|
+
* @extends EventEmitter
|
|
29
|
+
*
|
|
30
|
+
* @fires Transport#message - When a message is received from a peer
|
|
31
|
+
* @fires Transport#peerConnected - When a peer connects
|
|
32
|
+
* @fires Transport#peerDisconnected - When a peer disconnects
|
|
33
|
+
* @fires Transport#error - When an error occurs
|
|
34
|
+
* @fires Transport#stateChanged - When transport state changes
|
|
35
|
+
*/
|
|
36
|
+
class Transport extends EventEmitter {
|
|
37
|
+
/**
|
|
38
|
+
* Creates a new Transport instance
|
|
39
|
+
* @param {Object} [options={}] - Transport options
|
|
40
|
+
* @param {number} [options.maxPeers=8] - Maximum number of simultaneous peers
|
|
41
|
+
*/
|
|
42
|
+
constructor(options = {}) {
|
|
43
|
+
super();
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Transport options
|
|
47
|
+
* @type {Object}
|
|
48
|
+
* @protected
|
|
49
|
+
*/
|
|
50
|
+
this._options = {
|
|
51
|
+
maxPeers: 8,
|
|
52
|
+
...options
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Current transport state
|
|
57
|
+
* @type {string}
|
|
58
|
+
* @protected
|
|
59
|
+
*/
|
|
60
|
+
this._state = TRANSPORT_STATE.STOPPED;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Connected peers map (peerId -> connection info)
|
|
64
|
+
* @type {Map<string, Object>}
|
|
65
|
+
* @protected
|
|
66
|
+
*/
|
|
67
|
+
this._peers = new Map();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Gets the current transport state
|
|
72
|
+
* @returns {string} Current state
|
|
73
|
+
*/
|
|
74
|
+
get state() {
|
|
75
|
+
return this._state;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Checks if transport is running
|
|
80
|
+
* @returns {boolean} True if running
|
|
81
|
+
*/
|
|
82
|
+
get isRunning() {
|
|
83
|
+
return this._state === TRANSPORT_STATE.RUNNING;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Sets the transport state and emits state change event
|
|
88
|
+
* @param {string} newState - New state
|
|
89
|
+
* @protected
|
|
90
|
+
*/
|
|
91
|
+
_setState(newState) {
|
|
92
|
+
const oldState = this._state;
|
|
93
|
+
if (oldState !== newState) {
|
|
94
|
+
this._state = newState;
|
|
95
|
+
this.emit('stateChanged', { oldState, newState });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Starts the transport layer
|
|
101
|
+
* @abstract
|
|
102
|
+
* @returns {Promise<void>}
|
|
103
|
+
* @throws {Error} If not implemented by subclass
|
|
104
|
+
*/
|
|
105
|
+
async start() {
|
|
106
|
+
throw new Error('Transport.start() must be implemented by subclass');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Stops the transport layer
|
|
111
|
+
* @abstract
|
|
112
|
+
* @returns {Promise<void>}
|
|
113
|
+
* @throws {Error} If not implemented by subclass
|
|
114
|
+
*/
|
|
115
|
+
async stop() {
|
|
116
|
+
throw new Error('Transport.stop() must be implemented by subclass');
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Sends data to a specific peer
|
|
121
|
+
* @abstract
|
|
122
|
+
* @param {string} peerId - Target peer ID
|
|
123
|
+
* @param {Uint8Array} data - Data to send
|
|
124
|
+
* @returns {Promise<void>}
|
|
125
|
+
* @throws {Error} If not implemented by subclass
|
|
126
|
+
*/
|
|
127
|
+
async send(_peerId, _data) {
|
|
128
|
+
throw new Error('Transport.send() must be implemented by subclass');
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Broadcasts data to all connected peers
|
|
133
|
+
* @abstract
|
|
134
|
+
* @param {Uint8Array} data - Data to broadcast
|
|
135
|
+
* @returns {Promise<string[]>} Array of peer IDs that received the broadcast
|
|
136
|
+
* @throws {Error} If not implemented by subclass
|
|
137
|
+
*/
|
|
138
|
+
async broadcast(_data) {
|
|
139
|
+
throw new Error('Transport.broadcast() must be implemented by subclass');
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Gets list of connected peer IDs
|
|
144
|
+
* @returns {string[]} Array of connected peer IDs
|
|
145
|
+
*/
|
|
146
|
+
getConnectedPeers() {
|
|
147
|
+
return Array.from(this._peers.keys());
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Checks if a peer is connected
|
|
152
|
+
* @param {string} peerId - Peer ID to check
|
|
153
|
+
* @returns {boolean} True if peer is connected
|
|
154
|
+
*/
|
|
155
|
+
isConnected(peerId) {
|
|
156
|
+
return this._peers.has(peerId);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Gets connection info for a peer
|
|
161
|
+
* @param {string} peerId - Peer ID
|
|
162
|
+
* @returns {Object|undefined} Connection info or undefined
|
|
163
|
+
*/
|
|
164
|
+
getPeerInfo(peerId) {
|
|
165
|
+
return this._peers.get(peerId);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Gets the number of connected peers
|
|
170
|
+
* @returns {number} Number of connected peers
|
|
171
|
+
*/
|
|
172
|
+
getConnectionCount() {
|
|
173
|
+
return this._peers.size;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Checks if more peers can connect
|
|
178
|
+
* @returns {boolean} True if under max peer limit
|
|
179
|
+
*/
|
|
180
|
+
canAcceptPeer() {
|
|
181
|
+
return this._peers.size < this._options.maxPeers;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Export state constants with the class
|
|
186
|
+
Transport.STATE = TRANSPORT_STATE;
|
|
187
|
+
|
|
188
|
+
module.exports = Transport;
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Abstract BLE adapter interface
|
|
5
|
+
* @module transport/adapters/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;
|