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.
Files changed (465) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/LICENSE +21 -0
  3. package/README.md +706 -0
  4. package/docs/API.md +462 -0
  5. package/docs/ARCHITECTURE.md +384 -0
  6. package/docs/CONTRIBUTING.md +244 -0
  7. package/docs/NODE_QUICKSTART.md +259 -0
  8. package/docs/PROTOCOL.md +195 -0
  9. package/docs/REACT_NATIVE.md +315 -0
  10. package/docs/SECURITY.md +152 -0
  11. package/docs/api/constants_audio.js.html +184 -0
  12. package/docs/api/constants_ble.js.html +165 -0
  13. package/docs/api/constants_crypto.js.html +107 -0
  14. package/docs/api/constants_errors.js.html +256 -0
  15. package/docs/api/constants_events.js.html +148 -0
  16. package/docs/api/constants_index.js.html +76 -0
  17. package/docs/api/constants_protocol.js.html +205 -0
  18. package/docs/api/crypto_aead.js.html +243 -0
  19. package/docs/api/crypto_chacha20.js.html +235 -0
  20. package/docs/api/crypto_hkdf.js.html +241 -0
  21. package/docs/api/crypto_hmac.js.html +197 -0
  22. package/docs/api/crypto_index.js.html +126 -0
  23. package/docs/api/crypto_keys_KeyManager.js.html +325 -0
  24. package/docs/api/crypto_keys_KeyPair.js.html +270 -0
  25. package/docs/api/crypto_keys_SecureStorage.js.html +273 -0
  26. package/docs/api/crypto_keys_index.js.html +86 -0
  27. package/docs/api/crypto_noise_handshake.js.html +464 -0
  28. package/docs/api/crypto_noise_index.js.html +81 -0
  29. package/docs/api/crypto_noise_session.js.html +307 -0
  30. package/docs/api/crypto_noise_state.js.html +322 -0
  31. package/docs/api/crypto_poly1305.js.html +167 -0
  32. package/docs/api/crypto_sha256.js.html +294 -0
  33. package/docs/api/crypto_x25519.js.html +208 -0
  34. package/docs/api/errors_AudioError.js.html +218 -0
  35. package/docs/api/errors_ConnectionError.js.html +163 -0
  36. package/docs/api/errors_CryptoError.js.html +157 -0
  37. package/docs/api/errors_HandshakeError.js.html +176 -0
  38. package/docs/api/errors_MeshError.js.html +154 -0
  39. package/docs/api/errors_MessageError.js.html +183 -0
  40. package/docs/api/errors_ValidationError.js.html +204 -0
  41. package/docs/api/errors_index.js.html +78 -0
  42. package/docs/api/fonts/OpenSans-Bold-webfont.eot +0 -0
  43. package/docs/api/fonts/OpenSans-Bold-webfont.svg +1830 -0
  44. package/docs/api/fonts/OpenSans-Bold-webfont.woff +0 -0
  45. package/docs/api/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  46. package/docs/api/fonts/OpenSans-BoldItalic-webfont.svg +1830 -0
  47. package/docs/api/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  48. package/docs/api/fonts/OpenSans-Italic-webfont.eot +0 -0
  49. package/docs/api/fonts/OpenSans-Italic-webfont.svg +1830 -0
  50. package/docs/api/fonts/OpenSans-Italic-webfont.woff +0 -0
  51. package/docs/api/fonts/OpenSans-Light-webfont.eot +0 -0
  52. package/docs/api/fonts/OpenSans-Light-webfont.svg +1831 -0
  53. package/docs/api/fonts/OpenSans-Light-webfont.woff +0 -0
  54. package/docs/api/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  55. package/docs/api/fonts/OpenSans-LightItalic-webfont.svg +1835 -0
  56. package/docs/api/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  57. package/docs/api/fonts/OpenSans-Regular-webfont.eot +0 -0
  58. package/docs/api/fonts/OpenSans-Regular-webfont.svg +1831 -0
  59. package/docs/api/fonts/OpenSans-Regular-webfont.woff +0 -0
  60. package/docs/api/hooks_AppStateManager.js.html +233 -0
  61. package/docs/api/hooks_index.js.html +87 -0
  62. package/docs/api/hooks_useMesh.js.html +213 -0
  63. package/docs/api/hooks_useMessages.js.html +263 -0
  64. package/docs/api/hooks_usePeers.js.html +165 -0
  65. package/docs/api/index.html +868 -0
  66. package/docs/api/index.js.html +236 -0
  67. package/docs/api/mesh_dedup_BloomFilter.js.html +261 -0
  68. package/docs/api/mesh_dedup_DedupManager.js.html +266 -0
  69. package/docs/api/mesh_dedup_MessageCache.js.html +273 -0
  70. package/docs/api/mesh_dedup_index.js.html +70 -0
  71. package/docs/api/mesh_fragment_Assembler.js.html +335 -0
  72. package/docs/api/mesh_fragment_Fragmenter.js.html +230 -0
  73. package/docs/api/mesh_fragment_index.js.html +75 -0
  74. package/docs/api/mesh_index.js.html +72 -0
  75. package/docs/api/mesh_peer_Peer.js.html +296 -0
  76. package/docs/api/mesh_peer_PeerDiscovery.js.html +334 -0
  77. package/docs/api/mesh_peer_PeerManager.js.html +320 -0
  78. package/docs/api/mesh_peer_index.js.html +70 -0
  79. package/docs/api/mesh_router_MessageRouter.js.html +411 -0
  80. package/docs/api/mesh_router_PathFinder.js.html +386 -0
  81. package/docs/api/mesh_router_RouteTable.js.html +346 -0
  82. package/docs/api/mesh_router_index.js.html +70 -0
  83. package/docs/api/module-audio_buffer.html +168 -0
  84. package/docs/api/module-audio_buffer_FrameBuffer-FrameBuffer.html +2971 -0
  85. package/docs/api/module-audio_buffer_FrameBuffer.html +178 -0
  86. package/docs/api/module-audio_buffer_JitterBuffer-JitterBuffer.html +2761 -0
  87. package/docs/api/module-audio_buffer_JitterBuffer.html +178 -0
  88. package/docs/api/module-audio_codec.html +168 -0
  89. package/docs/api/module-audio_codec_LC3Codec-LC3Codec.html +2876 -0
  90. package/docs/api/module-audio_codec_LC3Codec.html +178 -0
  91. package/docs/api/module-audio_codec_LC3Decoder-LC3Decoder.html +1788 -0
  92. package/docs/api/module-audio_codec_LC3Decoder.html +178 -0
  93. package/docs/api/module-audio_codec_LC3Encoder-LC3Encoder.html +1512 -0
  94. package/docs/api/module-audio_codec_LC3Encoder.html +178 -0
  95. package/docs/api/module-audio_session.html +168 -0
  96. package/docs/api/module-audio_session_AudioSession-AudioSession.html +3922 -0
  97. package/docs/api/module-audio_session_AudioSession.html +178 -0
  98. package/docs/api/module-audio_session_VoiceMessage-VoiceMessage.html +3690 -0
  99. package/docs/api/module-audio_session_VoiceMessage-VoiceMessageRecorder.html +1780 -0
  100. package/docs/api/module-audio_session_VoiceMessage.html +332 -0
  101. package/docs/api/module-audio_transport.html +168 -0
  102. package/docs/api/module-audio_transport_AudioFragmenter-AudioAssembler.html +1545 -0
  103. package/docs/api/module-audio_transport_AudioFragmenter-AudioFragmenter.html +658 -0
  104. package/docs/api/module-audio_transport_AudioFragmenter.html +181 -0
  105. package/docs/api/module-audio_transport_AudioFramer.html +1414 -0
  106. package/docs/api/module-constants.html +168 -0
  107. package/docs/api/module-constants_audio.html +1782 -0
  108. package/docs/api/module-constants_ble.html +940 -0
  109. package/docs/api/module-constants_crypto.html +823 -0
  110. package/docs/api/module-constants_errors.html +316 -0
  111. package/docs/api/module-constants_events.html +244 -0
  112. package/docs/api/module-constants_protocol.html +1534 -0
  113. package/docs/api/module-crypto.html +169 -0
  114. package/docs/api/module-crypto_aead.html +1625 -0
  115. package/docs/api/module-crypto_chacha20.html +1440 -0
  116. package/docs/api/module-crypto_hkdf.html +1421 -0
  117. package/docs/api/module-crypto_hmac.html +828 -0
  118. package/docs/api/module-crypto_keys.html +169 -0
  119. package/docs/api/module-crypto_keys_KeyManager-KeyManager.html +2364 -0
  120. package/docs/api/module-crypto_keys_KeyManager.html +252 -0
  121. package/docs/api/module-crypto_keys_KeyPair.html +245 -0
  122. package/docs/api/module-crypto_keys_SecureStorage-MemorySecureStorage.html +923 -0
  123. package/docs/api/module-crypto_keys_SecureStorage-SecureStorage.html +942 -0
  124. package/docs/api/module-crypto_keys_SecureStorage.html +516 -0
  125. package/docs/api/module-crypto_noise.html +169 -0
  126. package/docs/api/module-crypto_noise_handshake-NoiseHandshake.html +2240 -0
  127. package/docs/api/module-crypto_noise_handshake.html +782 -0
  128. package/docs/api/module-crypto_noise_session-NoiseSession.html +1804 -0
  129. package/docs/api/module-crypto_noise_session.html +325 -0
  130. package/docs/api/module-crypto_noise_state-SymmetricState.html +1387 -0
  131. package/docs/api/module-crypto_noise_state.html +324 -0
  132. package/docs/api/module-crypto_poly1305.html +884 -0
  133. package/docs/api/module-crypto_sha256-HashContext.html +447 -0
  134. package/docs/api/module-crypto_sha256.html +942 -0
  135. package/docs/api/module-crypto_x25519.html +1503 -0
  136. package/docs/api/module-errors.html +168 -0
  137. package/docs/api/module-errors_AudioError-AudioError.html +4711 -0
  138. package/docs/api/module-errors_AudioError.html +178 -0
  139. package/docs/api/module-errors_ConnectionError-ConnectionError.html +3649 -0
  140. package/docs/api/module-errors_ConnectionError.html +178 -0
  141. package/docs/api/module-errors_CryptoError-CryptoError.html +3453 -0
  142. package/docs/api/module-errors_CryptoError.html +178 -0
  143. package/docs/api/module-errors_HandshakeError-HandshakeError.html +4261 -0
  144. package/docs/api/module-errors_HandshakeError.html +178 -0
  145. package/docs/api/module-errors_MeshError-MeshError.html +2155 -0
  146. package/docs/api/module-errors_MeshError.html +178 -0
  147. package/docs/api/module-errors_MessageError-MessageError.html +4545 -0
  148. package/docs/api/module-errors_MessageError.html +178 -0
  149. package/docs/api/module-errors_ValidationError-ValidationError.html +3432 -0
  150. package/docs/api/module-errors_ValidationError.html +178 -0
  151. package/docs/api/module-hooks.html +182 -0
  152. package/docs/api/module-hooks_AppStateManager-AppStateManager.html +1620 -0
  153. package/docs/api/module-hooks_AppStateManager.html +178 -0
  154. package/docs/api/module-hooks_useMesh.html +457 -0
  155. package/docs/api/module-hooks_useMessages.html +466 -0
  156. package/docs/api/module-hooks_usePeers.html +348 -0
  157. package/docs/api/module-mesh.html +168 -0
  158. package/docs/api/module-mesh_dedup.html +168 -0
  159. package/docs/api/module-mesh_dedup_BloomFilter-BloomFilter.html +2158 -0
  160. package/docs/api/module-mesh_dedup_BloomFilter.html +178 -0
  161. package/docs/api/module-mesh_dedup_DedupManager-DedupManager.html +2880 -0
  162. package/docs/api/module-mesh_dedup_DedupManager.html +178 -0
  163. package/docs/api/module-mesh_dedup_MessageCache-CacheNode.html +246 -0
  164. package/docs/api/module-mesh_dedup_MessageCache-MessageCache.html +2314 -0
  165. package/docs/api/module-mesh_dedup_MessageCache.html +181 -0
  166. package/docs/api/module-mesh_fragment.html +168 -0
  167. package/docs/api/module-mesh_fragment_Assembler-Assembler.html +2869 -0
  168. package/docs/api/module-mesh_fragment_Assembler-PendingFragmentSet.html +895 -0
  169. package/docs/api/module-mesh_fragment_Assembler.html +181 -0
  170. package/docs/api/module-mesh_fragment_Fragmenter.html +1084 -0
  171. package/docs/api/module-mesh_peer.html +168 -0
  172. package/docs/api/module-mesh_peer_Peer-Peer.html +4986 -0
  173. package/docs/api/module-mesh_peer_Peer.html +178 -0
  174. package/docs/api/module-mesh_peer_PeerDiscovery-PeerDiscovery.html +3423 -0
  175. package/docs/api/module-mesh_peer_PeerDiscovery.html +438 -0
  176. package/docs/api/module-mesh_peer_PeerManager-PeerManager.html +5258 -0
  177. package/docs/api/module-mesh_peer_PeerManager.html +178 -0
  178. package/docs/api/module-mesh_router.html +168 -0
  179. package/docs/api/module-mesh_router_MessageRouter-MessageRouter.html +3285 -0
  180. package/docs/api/module-mesh_router_MessageRouter.html +178 -0
  181. package/docs/api/module-mesh_router_PathFinder-PathFinder.html +3323 -0
  182. package/docs/api/module-mesh_router_PathFinder.html +421 -0
  183. package/docs/api/module-mesh_router_RouteTable-RouteTable.html +4115 -0
  184. package/docs/api/module-mesh_router_RouteTable.html +421 -0
  185. package/docs/api/module-protocol.html +169 -0
  186. package/docs/api/module-protocol_crc32.html +815 -0
  187. package/docs/api/module-protocol_deserializer.html +1393 -0
  188. package/docs/api/module-protocol_header-MessageHeader.html +2879 -0
  189. package/docs/api/module-protocol_header.html +892 -0
  190. package/docs/api/module-protocol_message-Message.html +4682 -0
  191. package/docs/api/module-protocol_message.html +178 -0
  192. package/docs/api/module-protocol_serializer.html +911 -0
  193. package/docs/api/module-protocol_validator.html +1396 -0
  194. package/docs/api/module-rn-ble-mesh.html +866 -0
  195. package/docs/api/module-service.html +168 -0
  196. package/docs/api/module-service_HandshakeManager-HandshakeManager.html +185 -0
  197. package/docs/api/module-service_HandshakeManager.html +175 -0
  198. package/docs/api/module-service_MeshService-MeshService.html +185 -0
  199. package/docs/api/module-service_MeshService.html +175 -0
  200. package/docs/api/module-service_SessionManager-SessionManager.html +174 -0
  201. package/docs/api/module-service_SessionManager.html +175 -0
  202. package/docs/api/module-service_audio.html +168 -0
  203. package/docs/api/module-service_audio_AudioManager-AudioManager.html +4653 -0
  204. package/docs/api/module-service_audio_AudioManager.html +254 -0
  205. package/docs/api/module-service_text.html +168 -0
  206. package/docs/api/module-service_text_TextManager-TextManager.html +6104 -0
  207. package/docs/api/module-service_text_TextManager.html +254 -0
  208. package/docs/api/module-service_text_broadcast.html +168 -0
  209. package/docs/api/module-service_text_broadcast_BroadcastManager-BroadcastManager.html +2434 -0
  210. package/docs/api/module-service_text_broadcast_BroadcastManager.html +254 -0
  211. package/docs/api/module-service_text_channel.html +168 -0
  212. package/docs/api/module-service_text_channel_Channel-Channel.html +4337 -0
  213. package/docs/api/module-service_text_channel_Channel.html +178 -0
  214. package/docs/api/module-service_text_channel_ChannelManager-ChannelManager.html +1927 -0
  215. package/docs/api/module-service_text_channel_ChannelManager.html +175 -0
  216. package/docs/api/module-service_text_message.html +168 -0
  217. package/docs/api/module-service_text_message_TextMessage-TextMessage.html +4162 -0
  218. package/docs/api/module-service_text_message_TextMessage.html +178 -0
  219. package/docs/api/module-service_text_message_TextSerializer.html +1725 -0
  220. package/docs/api/module-storage.html +168 -0
  221. package/docs/api/module-storage_AsyncStorageAdapter-AsyncStorageAdapter.html +4159 -0
  222. package/docs/api/module-storage_AsyncStorageAdapter.html +178 -0
  223. package/docs/api/module-storage_MemoryStorage-MemoryStorage.html +3154 -0
  224. package/docs/api/module-storage_MemoryStorage.html +178 -0
  225. package/docs/api/module-storage_MessageStore-MessageStore.html +5299 -0
  226. package/docs/api/module-storage_MessageStore.html +178 -0
  227. package/docs/api/module-storage_Storage-Storage.html +4169 -0
  228. package/docs/api/module-storage_Storage.html +178 -0
  229. package/docs/api/module-transport.html +168 -0
  230. package/docs/api/module-transport_BLEAdapter-BLEAdapter.html +4724 -0
  231. package/docs/api/module-transport_BLEAdapter.html +178 -0
  232. package/docs/api/module-transport_BLETransport-BLETransport.html +3263 -0
  233. package/docs/api/module-transport_BLETransport.html +178 -0
  234. package/docs/api/module-transport_MockTransport-MockTransport.html +3947 -0
  235. package/docs/api/module-transport_MockTransport.html +178 -0
  236. package/docs/api/module-transport_NodeBLEAdapter-NodeBLEAdapter.html +3216 -0
  237. package/docs/api/module-transport_NodeBLEAdapter.html +178 -0
  238. package/docs/api/module-transport_RNBLEAdapter-RNBLEAdapter.html +3216 -0
  239. package/docs/api/module-transport_RNBLEAdapter.html +178 -0
  240. package/docs/api/module-transport_Transport-Transport.html +4071 -0
  241. package/docs/api/module-transport_Transport.html +254 -0
  242. package/docs/api/module-transport_adapters.html +168 -0
  243. package/docs/api/module-transport_adapters_BLEAdapter-BLEAdapter.html +4724 -0
  244. package/docs/api/module-transport_adapters_BLEAdapter.html +178 -0
  245. package/docs/api/module-transport_adapters_NodeBLEAdapter-NodeBLEAdapter.html +3216 -0
  246. package/docs/api/module-transport_adapters_NodeBLEAdapter.html +178 -0
  247. package/docs/api/module-transport_adapters_RNBLEAdapter-RNBLEAdapter.html +3216 -0
  248. package/docs/api/module-transport_adapters_RNBLEAdapter.html +178 -0
  249. package/docs/api/module-utils.html +168 -0
  250. package/docs/api/module-utils_BoundedMap-BoundedMap.html +3301 -0
  251. package/docs/api/module-utils_BoundedMap.html +178 -0
  252. package/docs/api/module-utils_EventEmitter-EventEmitter.html +3358 -0
  253. package/docs/api/module-utils_EventEmitter.html +178 -0
  254. package/docs/api/module-utils_LRUCache-LRUCache.html +4134 -0
  255. package/docs/api/module-utils_LRUCache.html +178 -0
  256. package/docs/api/module-utils_RateLimiter-RateLimiter.html +2176 -0
  257. package/docs/api/module-utils_RateLimiter.html +500 -0
  258. package/docs/api/module-utils_TimeoutManager-TimeoutManager.html +1781 -0
  259. package/docs/api/module-utils_TimeoutManager.html +175 -0
  260. package/docs/api/module-utils_bytes.html +1789 -0
  261. package/docs/api/module-utils_debug.html +837 -0
  262. package/docs/api/module-utils_encoding.html +1184 -0
  263. package/docs/api/module-utils_retry.html +1457 -0
  264. package/docs/api/module-utils_time.html +1665 -0
  265. package/docs/api/module-utils_uuid.html +1269 -0
  266. package/docs/api/module-utils_validation.html +2176 -0
  267. package/docs/api/protocol_crc32.js.html +147 -0
  268. package/docs/api/protocol_deserializer.js.html +295 -0
  269. package/docs/api/protocol_header.js.html +276 -0
  270. package/docs/api/protocol_index.js.html +120 -0
  271. package/docs/api/protocol_message.js.html +287 -0
  272. package/docs/api/protocol_serializer.js.html +240 -0
  273. package/docs/api/protocol_validator.js.html +330 -0
  274. package/docs/api/scripts/linenumber.js +25 -0
  275. package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -0
  276. package/docs/api/scripts/prettify/lang-css.js +2 -0
  277. package/docs/api/scripts/prettify/prettify.js +28 -0
  278. package/docs/api/service_HandshakeManager.js.html +232 -0
  279. package/docs/api/service_MeshService.js.html +371 -0
  280. package/docs/api/service_SessionManager.js.html +153 -0
  281. package/docs/api/service_audio_AudioManager.js.html +541 -0
  282. package/docs/api/service_audio_buffer_FrameBuffer.js.html +223 -0
  283. package/docs/api/service_audio_buffer_JitterBuffer.js.html +244 -0
  284. package/docs/api/service_audio_buffer_index.js.html +68 -0
  285. package/docs/api/service_audio_codec_LC3Codec.js.html +345 -0
  286. package/docs/api/service_audio_codec_LC3Decoder.js.html +185 -0
  287. package/docs/api/service_audio_codec_LC3Encoder.js.html +194 -0
  288. package/docs/api/service_audio_codec_index.js.html +70 -0
  289. package/docs/api/service_audio_index.js.html +96 -0
  290. package/docs/api/service_audio_session_AudioSession.js.html +348 -0
  291. package/docs/api/service_audio_session_VoiceMessage.js.html +432 -0
  292. package/docs/api/service_audio_session_index.js.html +70 -0
  293. package/docs/api/service_audio_transport_AudioFragmenter.js.html +314 -0
  294. package/docs/api/service_audio_transport_AudioFramer.js.html +236 -0
  295. package/docs/api/service_audio_transport_index.js.html +69 -0
  296. package/docs/api/service_index.js.html +93 -0
  297. package/docs/api/service_text_TextManager.js.html +578 -0
  298. package/docs/api/service_text_broadcast_BroadcastManager.js.html +276 -0
  299. package/docs/api/service_text_broadcast_index.js.html +66 -0
  300. package/docs/api/service_text_channel_Channel.js.html +280 -0
  301. package/docs/api/service_text_channel_ChannelManager.js.html +225 -0
  302. package/docs/api/service_text_channel_index.js.html +68 -0
  303. package/docs/api/service_text_index.js.html +85 -0
  304. package/docs/api/service_text_message_TextMessage.js.html +350 -0
  305. package/docs/api/service_text_message_TextSerializer.js.html +218 -0
  306. package/docs/api/service_text_message_index.js.html +68 -0
  307. package/docs/api/storage_AsyncStorageAdapter.js.html +357 -0
  308. package/docs/api/storage_MemoryStorage.js.html +279 -0
  309. package/docs/api/storage_MessageStore.js.html +369 -0
  310. package/docs/api/storage_Storage.js.html +214 -0
  311. package/docs/api/storage_index.js.html +72 -0
  312. package/docs/api/styles/jsdoc-default.css +358 -0
  313. package/docs/api/styles/prettify-jsdoc.css +111 -0
  314. package/docs/api/styles/prettify-tomorrow.css +132 -0
  315. package/docs/api/transport_BLEAdapter.js.html +231 -0
  316. package/docs/api/transport_BLETransport.js.html +411 -0
  317. package/docs/api/transport_MockTransport.js.html +339 -0
  318. package/docs/api/transport_NodeBLEAdapter.js.html +479 -0
  319. package/docs/api/transport_RNBLEAdapter.js.html +382 -0
  320. package/docs/api/transport_Transport.js.html +242 -0
  321. package/docs/api/transport_adapters_BLEAdapter.js.html +231 -0
  322. package/docs/api/transport_adapters_NodeBLEAdapter.js.html +479 -0
  323. package/docs/api/transport_adapters_RNBLEAdapter.js.html +382 -0
  324. package/docs/api/transport_adapters_index.js.html +70 -0
  325. package/docs/api/transport_index.js.html +87 -0
  326. package/docs/api/utils_BoundedMap.js.html +205 -0
  327. package/docs/api/utils_EventEmitter.js.html +259 -0
  328. package/docs/api/utils_LRUCache.js.html +256 -0
  329. package/docs/api/utils_RateLimiter.js.html +256 -0
  330. package/docs/api/utils_TimeoutManager.js.html +218 -0
  331. 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
  332. package/docs/api/utils_base64.js.html +205 -0
  333. package/docs/api/utils_bytes.js.html +241 -0
  334. package/docs/api/utils_debug.js.html +205 -0
  335. package/docs/api/utils_encoding.js.html +302 -0
  336. package/docs/api/utils_index.js.html +160 -0
  337. package/docs/api/utils_retry.js.html +200 -0
  338. package/docs/api/utils_time.js.html +220 -0
  339. package/docs/api/utils_uuid.js.html +199 -0
  340. package/docs/api/utils_validation.js.html +259 -0
  341. package/examples/node-chat/chat.js +220 -0
  342. package/examples/node-quickstart/index.js +94 -0
  343. package/examples/testing/test-helper.js +182 -0
  344. package/package.json +111 -0
  345. package/src/constants/audio.js +130 -0
  346. package/src/constants/ble.js +111 -0
  347. package/src/constants/crypto.js +53 -0
  348. package/src/constants/errors.js +202 -0
  349. package/src/constants/events.js +94 -0
  350. package/src/constants/index.js +22 -0
  351. package/src/constants/protocol.js +151 -0
  352. package/src/crypto/aead.js +189 -0
  353. package/src/crypto/chacha20.js +181 -0
  354. package/src/crypto/hkdf.js +187 -0
  355. package/src/crypto/hmac.js +143 -0
  356. package/src/crypto/index.js +72 -0
  357. package/src/crypto/keys/KeyManager.js +271 -0
  358. package/src/crypto/keys/KeyPair.js +216 -0
  359. package/src/crypto/keys/SecureStorage.js +219 -0
  360. package/src/crypto/keys/index.js +32 -0
  361. package/src/crypto/noise/handshake.js +410 -0
  362. package/src/crypto/noise/index.js +27 -0
  363. package/src/crypto/noise/session.js +253 -0
  364. package/src/crypto/noise/state.js +268 -0
  365. package/src/crypto/poly1305.js +113 -0
  366. package/src/crypto/sha256.js +240 -0
  367. package/src/crypto/x25519.js +154 -0
  368. package/src/errors/AudioError.js +164 -0
  369. package/src/errors/ConnectionError.js +109 -0
  370. package/src/errors/CryptoError.js +103 -0
  371. package/src/errors/HandshakeError.js +122 -0
  372. package/src/errors/MeshError.js +100 -0
  373. package/src/errors/MessageError.js +129 -0
  374. package/src/errors/ValidationError.js +150 -0
  375. package/src/errors/index.js +24 -0
  376. package/src/hooks/AppStateManager.js +179 -0
  377. package/src/hooks/index.js +33 -0
  378. package/src/hooks/useMesh.js +159 -0
  379. package/src/hooks/useMessages.js +209 -0
  380. package/src/hooks/usePeers.js +111 -0
  381. package/src/index.d.ts +494 -0
  382. package/src/index.js +182 -0
  383. package/src/index.mjs +62 -0
  384. package/src/mesh/dedup/BloomFilter.js +207 -0
  385. package/src/mesh/dedup/DedupManager.js +212 -0
  386. package/src/mesh/dedup/MessageCache.js +219 -0
  387. package/src/mesh/dedup/index.js +16 -0
  388. package/src/mesh/fragment/Assembler.js +281 -0
  389. package/src/mesh/fragment/Fragmenter.js +176 -0
  390. package/src/mesh/fragment/index.js +21 -0
  391. package/src/mesh/index.js +18 -0
  392. package/src/mesh/peer/Peer.js +242 -0
  393. package/src/mesh/peer/PeerDiscovery.js +280 -0
  394. package/src/mesh/peer/PeerManager.js +266 -0
  395. package/src/mesh/peer/index.js +16 -0
  396. package/src/mesh/router/MessageRouter.js +357 -0
  397. package/src/mesh/router/PathFinder.js +332 -0
  398. package/src/mesh/router/RouteTable.js +292 -0
  399. package/src/mesh/router/index.js +16 -0
  400. package/src/protocol/crc32.js +93 -0
  401. package/src/protocol/deserializer.js +241 -0
  402. package/src/protocol/header.js +222 -0
  403. package/src/protocol/index.js +66 -0
  404. package/src/protocol/message.js +233 -0
  405. package/src/protocol/serializer.js +186 -0
  406. package/src/protocol/validator.js +276 -0
  407. package/src/service/HandshakeManager.js +178 -0
  408. package/src/service/MeshService.js +317 -0
  409. package/src/service/SessionManager.js +99 -0
  410. package/src/service/audio/AudioManager.js +487 -0
  411. package/src/service/audio/buffer/FrameBuffer.js +169 -0
  412. package/src/service/audio/buffer/JitterBuffer.js +190 -0
  413. package/src/service/audio/buffer/index.js +14 -0
  414. package/src/service/audio/codec/LC3Codec.js +291 -0
  415. package/src/service/audio/codec/LC3Decoder.js +131 -0
  416. package/src/service/audio/codec/LC3Encoder.js +140 -0
  417. package/src/service/audio/codec/index.js +16 -0
  418. package/src/service/audio/index.js +42 -0
  419. package/src/service/audio/session/AudioSession.js +294 -0
  420. package/src/service/audio/session/VoiceMessage.js +378 -0
  421. package/src/service/audio/session/index.js +16 -0
  422. package/src/service/audio/transport/AudioFragmenter.js +260 -0
  423. package/src/service/audio/transport/AudioFramer.js +182 -0
  424. package/src/service/audio/transport/index.js +15 -0
  425. package/src/service/index.js +39 -0
  426. package/src/service/text/TextManager.js +524 -0
  427. package/src/service/text/broadcast/BroadcastManager.js +222 -0
  428. package/src/service/text/broadcast/index.js +12 -0
  429. package/src/service/text/channel/Channel.js +226 -0
  430. package/src/service/text/channel/ChannelManager.js +171 -0
  431. package/src/service/text/channel/index.js +14 -0
  432. package/src/service/text/index.js +31 -0
  433. package/src/service/text/message/TextMessage.js +296 -0
  434. package/src/service/text/message/TextSerializer.js +164 -0
  435. package/src/service/text/message/index.js +14 -0
  436. package/src/storage/AsyncStorageAdapter.js +303 -0
  437. package/src/storage/MemoryStorage.js +225 -0
  438. package/src/storage/MessageStore.js +315 -0
  439. package/src/storage/Storage.js +160 -0
  440. package/src/storage/index.js +18 -0
  441. package/src/transport/BLEAdapter.js +177 -0
  442. package/src/transport/BLETransport.js +357 -0
  443. package/src/transport/MockTransport.js +285 -0
  444. package/src/transport/NodeBLEAdapter.js +425 -0
  445. package/src/transport/RNBLEAdapter.js +328 -0
  446. package/src/transport/Transport.js +188 -0
  447. package/src/transport/adapters/BLEAdapter.js +177 -0
  448. package/src/transport/adapters/NodeBLEAdapter.js +425 -0
  449. package/src/transport/adapters/RNBLEAdapter.js +328 -0
  450. package/src/transport/adapters/index.js +16 -0
  451. package/src/transport/index.js +33 -0
  452. package/src/utils/BoundedMap.js +151 -0
  453. package/src/utils/EventEmitter.js +205 -0
  454. package/src/utils/LRUCache.js +202 -0
  455. package/src/utils/RateLimiter.js +202 -0
  456. package/src/utils/TimeoutManager.js +164 -0
  457. package/src/utils/base64.js +151 -0
  458. package/src/utils/bytes.js +187 -0
  459. package/src/utils/debug.js +151 -0
  460. package/src/utils/encoding.js +248 -0
  461. package/src/utils/index.js +106 -0
  462. package/src/utils/retry.js +146 -0
  463. package/src/utils/time.js +166 -0
  464. package/src/utils/uuid.js +145 -0
  465. package/src/utils/validation.js +205 -0
@@ -0,0 +1,222 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Broadcast message handling
5
+ * @module service/text/broadcast/BroadcastManager
6
+ */
7
+
8
+ const EventEmitter = require('events');
9
+ const TextMessage = require('../message/TextMessage');
10
+
11
+ /**
12
+ * Broadcast configuration
13
+ * @constant {Object}
14
+ */
15
+ const BROADCAST_CONFIG = Object.freeze({
16
+ MAX_MESSAGE_SIZE: 1000,
17
+ MAX_RECENT_BROADCASTS: 100,
18
+ DEDUP_WINDOW_MS: 5 * 60 * 1000 // 5 minutes
19
+ });
20
+
21
+ /**
22
+ * Manages broadcast message handling
23
+ * @class BroadcastManager
24
+ * @extends EventEmitter
25
+ */
26
+ class BroadcastManager extends EventEmitter {
27
+ /**
28
+ * Creates a new BroadcastManager
29
+ * @param {Object} [options] - Manager options
30
+ * @param {number} [options.maxRecentBroadcasts] - Max broadcasts to keep
31
+ * @param {number} [options.dedupWindowMs] - Deduplication window
32
+ */
33
+ constructor(options = {}) {
34
+ super();
35
+
36
+ /** @private */
37
+ this._maxRecentBroadcasts = options.maxRecentBroadcasts || BROADCAST_CONFIG.MAX_RECENT_BROADCASTS;
38
+ /** @private */
39
+ this._dedupWindowMs = options.dedupWindowMs || BROADCAST_CONFIG.DEDUP_WINDOW_MS;
40
+ /** @private */
41
+ this._recentBroadcasts = [];
42
+ /** @private */
43
+ this._seenMessageIds = new Map(); // messageId -> timestamp
44
+ /** @private */
45
+ this._senderId = null;
46
+ /** @private */
47
+ this._sendCallback = null;
48
+ }
49
+
50
+ /**
51
+ * Initializes the broadcast manager
52
+ * @param {Object} options - Init options
53
+ * @param {string} options.senderId - Local sender ID
54
+ * @param {Function} options.sendCallback - Callback to send broadcast
55
+ */
56
+ initialize(options) {
57
+ this._senderId = options.senderId;
58
+ this._sendCallback = options.sendCallback;
59
+ }
60
+
61
+ /**
62
+ * Sends a broadcast message
63
+ * @param {string} content - Message content
64
+ * @returns {string} Message ID
65
+ */
66
+ broadcast(content) {
67
+ if (content.length > BROADCAST_CONFIG.MAX_MESSAGE_SIZE) {
68
+ throw new Error(`Broadcast message too large (max ${BROADCAST_CONFIG.MAX_MESSAGE_SIZE} bytes)`);
69
+ }
70
+
71
+ const message = TextMessage.fromString(content, {
72
+ senderId: this._senderId
73
+ });
74
+
75
+ const messageId = message.getId();
76
+
77
+ // Mark as seen to avoid echo
78
+ this._seenMessageIds.set(messageId, Date.now());
79
+
80
+ // Add to recent broadcasts
81
+ this._addToRecent(message);
82
+
83
+ // Send via callback
84
+ if (this._sendCallback) {
85
+ this._sendCallback(message);
86
+ }
87
+
88
+ this.emit('broadcast-sent', {
89
+ messageId,
90
+ content,
91
+ timestamp: message.getTimestamp()
92
+ });
93
+
94
+ return messageId;
95
+ }
96
+
97
+ /**
98
+ * Handles an incoming broadcast message
99
+ * @param {string} peerId - Sender peer ID
100
+ * @param {Uint8Array} payload - Message payload
101
+ */
102
+ handleIncomingBroadcast(peerId, payload) {
103
+ let message;
104
+
105
+ // Try to deserialize
106
+ try {
107
+ if (payload instanceof Uint8Array) {
108
+ message = TextMessage.fromSerialized(payload);
109
+ } else if (typeof payload === 'string') {
110
+ message = TextMessage.fromString(payload, { senderId: peerId });
111
+ } else {
112
+ return;
113
+ }
114
+ } catch {
115
+ // If deserialization fails, treat as plain text
116
+ const content = typeof payload === 'string'
117
+ ? payload
118
+ : new TextDecoder().decode(payload);
119
+ message = TextMessage.fromString(content, { senderId: peerId });
120
+ }
121
+
122
+ const messageId = message.getId();
123
+
124
+ // Check for duplicate
125
+ if (this._isDuplicate(messageId)) {
126
+ return;
127
+ }
128
+
129
+ // Mark as seen
130
+ this._seenMessageIds.set(messageId, Date.now());
131
+
132
+ // Add to recent broadcasts
133
+ this._addToRecent(message);
134
+
135
+ this.emit('broadcast-received', {
136
+ messageId,
137
+ peerId,
138
+ content: message.getContent(),
139
+ timestamp: message.getTimestamp(),
140
+ message
141
+ });
142
+ }
143
+
144
+ /**
145
+ * Gets recent broadcasts
146
+ * @param {number} [limit] - Maximum number to return
147
+ * @returns {TextMessage[]}
148
+ */
149
+ getRecentBroadcasts(limit) {
150
+ const broadcasts = [...this._recentBroadcasts];
151
+ if (limit && limit > 0) {
152
+ return broadcasts.slice(-limit);
153
+ }
154
+ return broadcasts;
155
+ }
156
+
157
+ /**
158
+ * Clears all broadcast data
159
+ */
160
+ clear() {
161
+ this._recentBroadcasts = [];
162
+ this._seenMessageIds.clear();
163
+ }
164
+
165
+ /**
166
+ * Gets broadcast statistics
167
+ * @returns {Object}
168
+ */
169
+ getStats() {
170
+ return {
171
+ recentCount: this._recentBroadcasts.length,
172
+ seenCount: this._seenMessageIds.size
173
+ };
174
+ }
175
+
176
+ /**
177
+ * Cleans up old dedup entries
178
+ */
179
+ cleanup() {
180
+ const now = Date.now();
181
+ const cutoff = now - this._dedupWindowMs;
182
+
183
+ for (const [messageId, timestamp] of this._seenMessageIds) {
184
+ if (timestamp < cutoff) {
185
+ this._seenMessageIds.delete(messageId);
186
+ }
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Checks if a message is a duplicate
192
+ * @private
193
+ * @param {string} messageId - Message ID
194
+ * @returns {boolean}
195
+ */
196
+ _isDuplicate(messageId) {
197
+ const seenAt = this._seenMessageIds.get(messageId);
198
+ if (!seenAt) { return false; }
199
+
200
+ // Check if within dedup window
201
+ const age = Date.now() - seenAt;
202
+ return age < this._dedupWindowMs;
203
+ }
204
+
205
+ /**
206
+ * Adds a message to recent broadcasts
207
+ * @private
208
+ * @param {TextMessage} message - Message to add
209
+ */
210
+ _addToRecent(message) {
211
+ this._recentBroadcasts.push(message);
212
+
213
+ // Trim if over limit
214
+ while (this._recentBroadcasts.length > this._maxRecentBroadcasts) {
215
+ this._recentBroadcasts.shift();
216
+ }
217
+ }
218
+ }
219
+
220
+ BroadcastManager.CONFIG = BROADCAST_CONFIG;
221
+
222
+ module.exports = BroadcastManager;
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Broadcast module exports
5
+ * @module service/text/broadcast
6
+ */
7
+
8
+ const BroadcastManager = require('./BroadcastManager');
9
+
10
+ module.exports = {
11
+ BroadcastManager
12
+ };
@@ -0,0 +1,226 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Channel class for group messaging
5
+ * @module service/text/channel/Channel
6
+ */
7
+
8
+ /**
9
+ * Represents a communication channel for group messaging
10
+ * @class Channel
11
+ */
12
+ class Channel {
13
+ /**
14
+ * Creates a new Channel
15
+ * @param {Object} options - Channel options
16
+ * @param {string} options.id - Channel ID
17
+ * @param {string} [options.name] - Channel display name
18
+ * @param {string} [options.password] - Channel password (hashed)
19
+ * @param {number} [options.createdAt] - Creation timestamp
20
+ */
21
+ constructor(options) {
22
+ const { id, name, password, createdAt } = options;
23
+
24
+ if (!id || typeof id !== 'string') {
25
+ throw new Error('Channel ID is required');
26
+ }
27
+
28
+ /** @private */
29
+ this._id = id;
30
+ /** @private */
31
+ this._name = name || id;
32
+ /** @private */
33
+ this._passwordHash = password ? this._hashPassword(password) : null;
34
+ /** @private */
35
+ this._members = new Set();
36
+ /** @private */
37
+ this._createdAt = createdAt || Date.now();
38
+ /** @private */
39
+ this._joinedAt = Date.now();
40
+ }
41
+
42
+ /**
43
+ * Returns the channel ID
44
+ * @returns {string}
45
+ */
46
+ getId() {
47
+ return this._id;
48
+ }
49
+
50
+ /**
51
+ * Returns the channel name
52
+ * @returns {string}
53
+ */
54
+ getName() {
55
+ return this._name;
56
+ }
57
+
58
+ /**
59
+ * Sets the channel name
60
+ * @param {string} name - New channel name
61
+ */
62
+ setName(name) {
63
+ this._name = name;
64
+ }
65
+
66
+ /**
67
+ * Returns channel member peer IDs
68
+ * @returns {string[]}
69
+ */
70
+ getMembers() {
71
+ return Array.from(this._members);
72
+ }
73
+
74
+ /**
75
+ * Returns the number of members
76
+ * @returns {number}
77
+ */
78
+ getMemberCount() {
79
+ return this._members.size;
80
+ }
81
+
82
+ /**
83
+ * Adds a member to the channel
84
+ * @param {string} peerId - Peer ID to add
85
+ * @returns {boolean} True if member was added (not already present)
86
+ */
87
+ addMember(peerId) {
88
+ if (this._members.has(peerId)) {
89
+ return false;
90
+ }
91
+ this._members.add(peerId);
92
+ return true;
93
+ }
94
+
95
+ /**
96
+ * Removes a member from the channel
97
+ * @param {string} peerId - Peer ID to remove
98
+ * @returns {boolean} True if member was removed
99
+ */
100
+ removeMember(peerId) {
101
+ return this._members.delete(peerId);
102
+ }
103
+
104
+ /**
105
+ * Checks if a peer is a member
106
+ * @param {string} peerId - Peer ID to check
107
+ * @returns {boolean}
108
+ */
109
+ hasMember(peerId) {
110
+ return this._members.has(peerId);
111
+ }
112
+
113
+ /**
114
+ * Returns whether the channel is password protected
115
+ * @returns {boolean}
116
+ */
117
+ isPasswordProtected() {
118
+ return this._passwordHash !== null;
119
+ }
120
+
121
+ /**
122
+ * Validates a password against the channel password
123
+ * @param {string} password - Password to validate
124
+ * @returns {boolean}
125
+ */
126
+ validatePassword(password) {
127
+ if (!this._passwordHash) {
128
+ return true;
129
+ }
130
+ const hash = this._hashPassword(password);
131
+ return this._constantTimeEqual(this._passwordHash, hash);
132
+ }
133
+
134
+ /**
135
+ * Sets a new password for the channel
136
+ * @param {string|null} password - New password or null to remove
137
+ */
138
+ setPassword(password) {
139
+ this._passwordHash = password ? this._hashPassword(password) : null;
140
+ }
141
+
142
+ /**
143
+ * Returns the creation timestamp
144
+ * @returns {number}
145
+ */
146
+ getCreatedAt() {
147
+ return this._createdAt;
148
+ }
149
+
150
+ /**
151
+ * Returns the joined timestamp
152
+ * @returns {number}
153
+ */
154
+ getJoinedAt() {
155
+ return this._joinedAt;
156
+ }
157
+
158
+ /**
159
+ * Converts to JSON representation
160
+ * @returns {Object}
161
+ */
162
+ toJSON() {
163
+ return {
164
+ id: this._id,
165
+ name: this._name,
166
+ memberCount: this._members.size,
167
+ members: Array.from(this._members),
168
+ isPasswordProtected: this.isPasswordProtected(),
169
+ createdAt: this._createdAt,
170
+ joinedAt: this._joinedAt
171
+ };
172
+ }
173
+
174
+ /**
175
+ * Creates a Channel from JSON
176
+ * @param {Object} json - JSON object
177
+ * @returns {Channel}
178
+ */
179
+ static fromJSON(json) {
180
+ const channel = new Channel({
181
+ id: json.id,
182
+ name: json.name,
183
+ createdAt: json.createdAt
184
+ });
185
+
186
+ if (json.members) {
187
+ json.members.forEach(peerId => channel.addMember(peerId));
188
+ }
189
+
190
+ channel._joinedAt = json.joinedAt || Date.now();
191
+ return channel;
192
+ }
193
+
194
+ /**
195
+ * Simple password hash function
196
+ * @private
197
+ * @param {string} password - Password to hash
198
+ * @returns {Uint8Array}
199
+ */
200
+ _hashPassword(password) {
201
+ const data = new TextEncoder().encode(password);
202
+ const hash = new Uint8Array(32);
203
+ for (let i = 0; i < data.length; i++) {
204
+ hash[i % 32] ^= data[i];
205
+ }
206
+ return hash;
207
+ }
208
+
209
+ /**
210
+ * Constant-time comparison
211
+ * @private
212
+ * @param {Uint8Array} a - First array
213
+ * @param {Uint8Array} b - Second array
214
+ * @returns {boolean}
215
+ */
216
+ _constantTimeEqual(a, b) {
217
+ if (a.length !== b.length) { return false; }
218
+ let diff = 0;
219
+ for (let i = 0; i < a.length; i++) {
220
+ diff |= a[i] ^ b[i];
221
+ }
222
+ return diff === 0;
223
+ }
224
+ }
225
+
226
+ module.exports = Channel;
@@ -0,0 +1,171 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Channel subscription management for group messaging
5
+ * @module service/text/channel/ChannelManager
6
+ */
7
+
8
+ const EventEmitter = require('events');
9
+ const { MeshError } = require('../../../errors');
10
+ const { EVENTS, ERROR_CODE } = require('../../../constants');
11
+ const Channel = require('./Channel');
12
+
13
+ /**
14
+ * Manages channel subscriptions and channel-based messaging.
15
+ * @class ChannelManager
16
+ * @extends EventEmitter
17
+ */
18
+ class ChannelManager extends EventEmitter {
19
+ constructor() {
20
+ super();
21
+ /** @private */
22
+ this._channels = new Map();
23
+ }
24
+
25
+ /**
26
+ * Joins a channel
27
+ * @param {string} channelId - Channel ID
28
+ * @param {string} [password] - Optional password
29
+ * @returns {Channel}
30
+ */
31
+ joinChannel(channelId, password) {
32
+ if (!channelId || typeof channelId !== 'string') {
33
+ throw new MeshError('Invalid channel ID', ERROR_CODE.E801);
34
+ }
35
+ if (this._channels.has(channelId)) {
36
+ throw new MeshError('Already joined this channel', ERROR_CODE.E601);
37
+ }
38
+
39
+ const channel = new Channel({
40
+ id: channelId,
41
+ name: channelId,
42
+ password: password || null
43
+ });
44
+
45
+ this._channels.set(channelId, channel);
46
+ this.emit(EVENTS.CHANNEL_JOINED, { channelId, channel: channel.toJSON() });
47
+ return channel;
48
+ }
49
+
50
+ /**
51
+ * Leaves a channel
52
+ * @param {string} channelId - Channel ID
53
+ */
54
+ leaveChannel(channelId) {
55
+ if (!this._channels.has(channelId)) {
56
+ throw new MeshError('Not a member of this channel', ERROR_CODE.E602);
57
+ }
58
+ const channel = this._channels.get(channelId);
59
+ this._channels.delete(channelId);
60
+ this.emit(EVENTS.CHANNEL_LEFT, { channelId, memberCount: channel.getMemberCount() });
61
+ }
62
+
63
+ /**
64
+ * Gets all joined channels
65
+ * @returns {Object[]}
66
+ */
67
+ getChannels() {
68
+ return Array.from(this._channels.values()).map(c => c.toJSON());
69
+ }
70
+
71
+ /**
72
+ * Gets a specific channel
73
+ * @param {string} channelId - Channel ID
74
+ * @returns {Channel|undefined}
75
+ */
76
+ getChannel(channelId) {
77
+ return this._channels.get(channelId);
78
+ }
79
+
80
+ /**
81
+ * Checks if in a channel
82
+ * @param {string} channelId - Channel ID
83
+ * @returns {boolean}
84
+ */
85
+ isInChannel(channelId) {
86
+ return this._channels.has(channelId);
87
+ }
88
+
89
+ /**
90
+ * Gets members of a channel
91
+ * @param {string} channelId - Channel ID
92
+ * @returns {string[]}
93
+ */
94
+ getChannelMembers(channelId) {
95
+ const channel = this._channels.get(channelId);
96
+ return channel ? channel.getMembers() : [];
97
+ }
98
+
99
+ /**
100
+ * Adds a member to a channel
101
+ * @param {string} channelId - Channel ID
102
+ * @param {string} peerId - Peer ID
103
+ */
104
+ addMember(channelId, peerId) {
105
+ const channel = this._channels.get(channelId);
106
+ if (channel && channel.addMember(peerId)) {
107
+ this.emit(EVENTS.CHANNEL_MEMBER_JOINED, { channelId, peerId });
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Removes a member from a channel
113
+ * @param {string} channelId - Channel ID
114
+ * @param {string} peerId - Peer ID
115
+ */
116
+ removeMember(channelId, peerId) {
117
+ const channel = this._channels.get(channelId);
118
+ if (channel && channel.removeMember(peerId)) {
119
+ this.emit(EVENTS.CHANNEL_MEMBER_LEFT, { channelId, peerId });
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Handles an incoming channel message
125
+ * @param {Object} message - Message data
126
+ */
127
+ handleChannelMessage(message) {
128
+ const { channelId, senderId, content, timestamp } = message;
129
+ if (!this._channels.has(channelId)) { return; }
130
+
131
+ const channel = this._channels.get(channelId);
132
+ if (senderId && !channel.hasMember(senderId)) {
133
+ channel.addMember(senderId);
134
+ this.emit(EVENTS.CHANNEL_MEMBER_JOINED, { channelId, peerId: senderId });
135
+ }
136
+ const ts = timestamp || Date.now();
137
+ this.emit(EVENTS.CHANNEL_MESSAGE, { channelId, senderId, content, timestamp: ts });
138
+ }
139
+
140
+ /**
141
+ * Verifies a channel password
142
+ * @param {string} channelId - Channel ID
143
+ * @param {string} password - Password to verify
144
+ * @returns {boolean}
145
+ */
146
+ verifyPassword(channelId, password) {
147
+ const channel = this._channels.get(channelId);
148
+ if (!channel) { return false; }
149
+ return channel.validatePassword(password);
150
+ }
151
+
152
+ /**
153
+ * Clears all channels
154
+ */
155
+ clear() {
156
+ this._channels.clear();
157
+ }
158
+
159
+ /**
160
+ * Gets channel statistics
161
+ * @returns {Object}
162
+ */
163
+ getStats() {
164
+ return {
165
+ channelCount: this._channels.size,
166
+ totalMembers: Array.from(this._channels.values()).reduce((s, c) => s + c.getMemberCount(), 0)
167
+ };
168
+ }
169
+ }
170
+
171
+ module.exports = ChannelManager;
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Channel module exports
5
+ * @module service/text/channel
6
+ */
7
+
8
+ const Channel = require('./Channel');
9
+ const ChannelManager = require('./ChannelManager');
10
+
11
+ module.exports = {
12
+ Channel,
13
+ ChannelManager
14
+ };
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Text messaging module exports
5
+ * @module service/text
6
+ */
7
+
8
+ const TextManager = require('./TextManager');
9
+ const message = require('./message');
10
+ const channel = require('./channel');
11
+ const broadcast = require('./broadcast');
12
+
13
+ module.exports = {
14
+ // Main service
15
+ TextManager,
16
+
17
+ // Message
18
+ TextMessage: message.TextMessage,
19
+
20
+ // Channel
21
+ Channel: channel.Channel,
22
+ ChannelManager: channel.ChannelManager,
23
+
24
+ // Broadcast
25
+ BroadcastManager: broadcast.BroadcastManager,
26
+
27
+ // Submodules for advanced usage
28
+ message,
29
+ channel,
30
+ broadcast
31
+ };