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,378 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Voice message recording and playback
5
+ * @module audio/session/VoiceMessage
6
+ */
7
+
8
+ const EventEmitter = require('../../../utils/EventEmitter');
9
+ const AudioError = require('../../../errors/AudioError');
10
+ const { VOICE_MESSAGE_CONFIG, AUDIO_CODEC_TYPE } = require('../../../constants/audio');
11
+ const FrameBuffer = require('../buffer/FrameBuffer');
12
+
13
+ /**
14
+ * Voice message header size
15
+ * @constant {number}
16
+ */
17
+ const VOICE_MESSAGE_HEADER_SIZE = VOICE_MESSAGE_CONFIG.HEADER_SIZE;
18
+
19
+ /**
20
+ * Voice message magic bytes
21
+ * @constant {Uint8Array}
22
+ */
23
+ const VOICE_MESSAGE_MAGIC = new Uint8Array([0x56, 0x4D, 0x53, 0x47]); // 'VMSG'
24
+
25
+ /**
26
+ * Voice message for store-and-forward audio
27
+ * @class VoiceMessage
28
+ */
29
+ class VoiceMessage {
30
+ /**
31
+ * Creates a VoiceMessage from recorded frames
32
+ * @param {Object} options - Message options
33
+ * @param {FrameBuffer} options.frames - Recorded frames
34
+ * @param {Object} options.metadata - Recording metadata
35
+ * @param {Uint8Array} options.senderId - Sender ID (32 bytes)
36
+ */
37
+ constructor(options) {
38
+ const { frames, metadata, senderId } = options;
39
+
40
+ /** @private */
41
+ this._frames = frames;
42
+ /** @private */
43
+ this._metadata = {
44
+ version: 1,
45
+ codec: metadata.codec || AUDIO_CODEC_TYPE.LC3,
46
+ sampleRate: metadata.sampleRate || 16000,
47
+ bitRate: metadata.bitRate || 24000,
48
+ frameMs: metadata.frameMs || 10,
49
+ channels: metadata.channels || 1,
50
+ createdAt: metadata.createdAt || Date.now()
51
+ };
52
+ /** @private */
53
+ this._senderId = senderId || new Uint8Array(32);
54
+ /** @private */
55
+ this._playbackPosition = 0;
56
+ }
57
+
58
+ /**
59
+ * Starts recording a new voice message
60
+ * @param {Object} options - Recording options
61
+ * @param {LC3Codec} options.codec - Initialized codec
62
+ * @param {Uint8Array} options.senderId - Sender ID
63
+ * @returns {VoiceMessageRecorder}
64
+ */
65
+ static startRecording(options) {
66
+ // eslint-disable-next-line no-use-before-define
67
+ return new VoiceMessageRecorder(options);
68
+ }
69
+
70
+ /**
71
+ * Creates a VoiceMessage from serialized data
72
+ * @param {Uint8Array} data - Serialized voice message
73
+ * @returns {VoiceMessage}
74
+ */
75
+ static fromSerialized(data) {
76
+ if (data.length < VOICE_MESSAGE_HEADER_SIZE) {
77
+ throw AudioError.decodingFailed({ reason: 'Voice message too short' });
78
+ }
79
+
80
+ // Verify magic
81
+ for (let i = 0; i < 4; i++) {
82
+ if (data[i] !== VOICE_MESSAGE_MAGIC[i]) {
83
+ throw AudioError.decodingFailed({ reason: 'Invalid voice message magic' });
84
+ }
85
+ }
86
+
87
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
88
+
89
+ const metadata = {
90
+ version: data[4],
91
+ codec: data[5],
92
+ sampleRate: view.getUint16(6, false),
93
+ bitRate: view.getUint16(8, false),
94
+ frameMs: data[10] / 10,
95
+ channels: data[11],
96
+ totalFrames: view.getUint32(12, false),
97
+ durationMs: view.getUint32(16, false),
98
+ createdAt: view.getUint32(20, false) * 1000
99
+ };
100
+
101
+ const senderId = data.slice(24, 56);
102
+ const frameData = data.slice(VOICE_MESSAGE_HEADER_SIZE);
103
+ const frames = FrameBuffer.deserialize(frameData);
104
+
105
+ return new VoiceMessage({ frames, metadata, senderId });
106
+ }
107
+
108
+ /**
109
+ * Serializes the voice message
110
+ * @returns {Uint8Array}
111
+ */
112
+ serialize() {
113
+ const frameData = this._frames.serialize();
114
+ const totalLen = VOICE_MESSAGE_HEADER_SIZE + frameData.length;
115
+ const result = new Uint8Array(totalLen);
116
+ const view = new DataView(result.buffer);
117
+
118
+ // Header
119
+ result.set(VOICE_MESSAGE_MAGIC, 0);
120
+ result[4] = this._metadata.version;
121
+ result[5] = this._metadata.codec;
122
+ view.setUint16(6, this._metadata.sampleRate, false);
123
+ view.setUint16(8, this._metadata.bitRate, false);
124
+ result[10] = Math.round(this._metadata.frameMs * 10);
125
+ result[11] = this._metadata.channels;
126
+ view.setUint32(12, this._frames.getFrameCount(), false);
127
+ view.setUint32(16, this.getDurationMs(), false);
128
+ view.setUint32(20, Math.floor(this._metadata.createdAt / 1000), false);
129
+ result.set(this._senderId.slice(0, 32), 24);
130
+
131
+ // Frame data
132
+ result.set(frameData, VOICE_MESSAGE_HEADER_SIZE);
133
+
134
+ return result;
135
+ }
136
+
137
+ /**
138
+ * Returns duration in milliseconds
139
+ * @returns {number}
140
+ */
141
+ getDurationMs() {
142
+ return this._frames.getDurationMs(this._metadata.frameMs);
143
+ }
144
+
145
+ /**
146
+ * Returns total size in bytes
147
+ * @returns {number}
148
+ */
149
+ getSize() {
150
+ return VOICE_MESSAGE_HEADER_SIZE + this._frames.getTotalBytes();
151
+ }
152
+
153
+ /**
154
+ * Returns frame count
155
+ * @returns {number}
156
+ */
157
+ getFrameCount() {
158
+ return this._frames.getFrameCount();
159
+ }
160
+
161
+ /**
162
+ * Returns metadata
163
+ * @returns {Object}
164
+ */
165
+ getMetadata() {
166
+ return {
167
+ ...this._metadata,
168
+ frameCount: this._frames.getFrameCount(),
169
+ durationMs: this.getDurationMs(),
170
+ size: this.getSize()
171
+ };
172
+ }
173
+
174
+ /**
175
+ * Returns sender ID
176
+ * @returns {Uint8Array}
177
+ */
178
+ getSenderId() {
179
+ return this._senderId;
180
+ }
181
+
182
+ /**
183
+ * Gets frame at index for playback
184
+ * @param {number} index - Frame index
185
+ * @returns {Uint8Array|null}
186
+ */
187
+ getFrame(index) {
188
+ return this._frames.getFrame(index);
189
+ }
190
+
191
+ /**
192
+ * Gets next frame for playback
193
+ * @returns {{frame: Uint8Array, index: number, done: boolean}|null}
194
+ */
195
+ getNextFrame() {
196
+ if (this._playbackPosition >= this._frames.getFrameCount()) {
197
+ return { frame: null, index: this._playbackPosition, done: true };
198
+ }
199
+
200
+ const frame = this._frames.getFrame(this._playbackPosition);
201
+ const index = this._playbackPosition;
202
+ this._playbackPosition++;
203
+
204
+ return { frame, index, done: false };
205
+ }
206
+
207
+ /**
208
+ * Seeks to position in milliseconds
209
+ * @param {number} positionMs - Position in ms
210
+ */
211
+ seek(positionMs) {
212
+ const frameIndex = Math.floor(positionMs / this._metadata.frameMs);
213
+ this._playbackPosition = Math.max(0, Math.min(frameIndex, this._frames.getFrameCount()));
214
+ }
215
+
216
+ /**
217
+ * Resets playback position
218
+ */
219
+ resetPlayback() {
220
+ this._playbackPosition = 0;
221
+ }
222
+
223
+ /**
224
+ * Returns current playback position in ms
225
+ * @returns {number}
226
+ */
227
+ getPlaybackPositionMs() {
228
+ return this._playbackPosition * this._metadata.frameMs;
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Voice message recorder
234
+ * @class VoiceMessageRecorder
235
+ * @extends EventEmitter
236
+ */
237
+ class VoiceMessageRecorder extends EventEmitter {
238
+ /**
239
+ * Creates a new recorder
240
+ * @param {Object} options - Recorder options
241
+ * @param {LC3Codec} options.codec - Initialized codec
242
+ * @param {Uint8Array} options.senderId - Sender ID
243
+ */
244
+ constructor(options) {
245
+ super();
246
+
247
+ const { codec, senderId } = options;
248
+
249
+ if (!codec || !codec.isInitialized()) {
250
+ throw AudioError.codecInitFailed({ reason: 'Codec must be initialized' });
251
+ }
252
+
253
+ /** @private */
254
+ this._codec = codec;
255
+ /** @private */
256
+ this._senderId = senderId || new Uint8Array(32);
257
+ /** @private */
258
+ this._frames = new FrameBuffer();
259
+ /** @private */
260
+ this._encoder = null;
261
+ /** @private */
262
+ this._startTime = Date.now();
263
+ /** @private */
264
+ this._cancelled = false;
265
+ /** @private */
266
+ this._config = codec.getConfig();
267
+
268
+ // Lazy load encoder
269
+ const LC3Encoder = require('../codec/LC3Encoder');
270
+ this._encoder = new LC3Encoder(codec);
271
+ }
272
+
273
+ /**
274
+ * Pushes PCM samples to recording
275
+ * @param {Int16Array} samples - PCM audio samples
276
+ * @returns {Promise<void>}
277
+ */
278
+ async pushSamples(samples) {
279
+ if (this._cancelled) { return; }
280
+
281
+ const frames = await this._encoder.pushSamples(samples);
282
+
283
+ for (const frame of frames) {
284
+ const added = this._frames.push(frame);
285
+
286
+ if (!added) {
287
+ this.emit('limit-warning', {
288
+ type: 'size',
289
+ current: this._frames.getTotalBytes(),
290
+ max: VOICE_MESSAGE_CONFIG.MAX_SIZE_BYTES
291
+ });
292
+ return;
293
+ }
294
+
295
+ this.emit('frame', {
296
+ index: this._frames.getFrameCount(),
297
+ durationMs: this.getDurationMs()
298
+ });
299
+ }
300
+
301
+ // Check duration limit
302
+ if (this.getDurationMs() >= VOICE_MESSAGE_CONFIG.MAX_DURATION_SEC * 1000) {
303
+ this.emit('limit-warning', {
304
+ type: 'duration',
305
+ current: this.getDurationMs(),
306
+ max: VOICE_MESSAGE_CONFIG.MAX_DURATION_SEC * 1000
307
+ });
308
+ }
309
+ }
310
+
311
+ /**
312
+ * Stops recording and returns voice message
313
+ * @returns {Promise<VoiceMessage>}
314
+ */
315
+ async stop() {
316
+ if (this._cancelled) {
317
+ throw AudioError.fromCode('EA00', { reason: 'Recording cancelled' });
318
+ }
319
+
320
+ // Flush remaining samples
321
+ const frames = await this._encoder.flush();
322
+ for (const frame of frames) {
323
+ this._frames.push(frame);
324
+ }
325
+
326
+ return new VoiceMessage({
327
+ frames: this._frames,
328
+ metadata: {
329
+ codec: AUDIO_CODEC_TYPE.LC3,
330
+ sampleRate: this._config.sampleRate,
331
+ bitRate: this._config.bitRate,
332
+ frameMs: this._config.frameMs,
333
+ channels: this._config.channels,
334
+ createdAt: this._startTime
335
+ },
336
+ senderId: this._senderId
337
+ });
338
+ }
339
+
340
+ /**
341
+ * Cancels recording
342
+ */
343
+ cancel() {
344
+ this._cancelled = true;
345
+ this._frames.clear();
346
+ }
347
+
348
+ /**
349
+ * Returns current duration in ms
350
+ * @returns {number}
351
+ */
352
+ getDurationMs() {
353
+ return this._frames.getDurationMs(this._config.frameMs);
354
+ }
355
+
356
+ /**
357
+ * Returns current size in bytes
358
+ * @returns {number}
359
+ */
360
+ getSize() {
361
+ return this._frames.getTotalBytes();
362
+ }
363
+
364
+ /**
365
+ * Returns recording status
366
+ * @returns {boolean}
367
+ */
368
+ isRecording() {
369
+ return !this._cancelled;
370
+ }
371
+ }
372
+
373
+ module.exports = {
374
+ VoiceMessage,
375
+ VoiceMessageRecorder,
376
+ VOICE_MESSAGE_HEADER_SIZE,
377
+ VOICE_MESSAGE_MAGIC
378
+ };
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Audio session module exports
5
+ * @module audio/session
6
+ */
7
+
8
+ const { VoiceMessage, VoiceMessageRecorder, VOICE_MESSAGE_HEADER_SIZE } = require('./VoiceMessage');
9
+ const AudioSession = require('./AudioSession');
10
+
11
+ module.exports = {
12
+ VoiceMessage,
13
+ VoiceMessageRecorder,
14
+ AudioSession,
15
+ VOICE_MESSAGE_HEADER_SIZE
16
+ };
@@ -0,0 +1,260 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Audio-specific fragmentation for voice messages
5
+ * @module audio/transport/AudioFragmenter
6
+ */
7
+
8
+ const EventEmitter = require('../../../utils/EventEmitter');
9
+ const { MESSAGE_TYPE } = require('../../../constants/protocol');
10
+ const { VOICE_MESSAGE_CONFIG } = require('../../../constants/audio');
11
+
12
+ /**
13
+ * Fragments voice message data for BLE transport
14
+ * @class AudioFragmenter
15
+ */
16
+ class AudioFragmenter {
17
+ /**
18
+ * Fragments voice message data
19
+ * @param {Uint8Array} voiceData - Serialized voice message
20
+ * @param {Object} metadata - Voice message metadata
21
+ * @param {string} metadata.messageId - Unique message ID
22
+ * @param {number} [chunkSize] - Chunk size (default from config)
23
+ * @returns {Uint8Array[]} Array of fragments
24
+ */
25
+ static fragment(voiceData, metadata, chunkSize = VOICE_MESSAGE_CONFIG.CHUNK_SIZE) {
26
+ const { messageId } = metadata;
27
+ const messageIdBytes = this._stringToBytes(messageId, 16);
28
+ const totalChunks = Math.ceil(voiceData.length / chunkSize);
29
+ const fragments = [];
30
+
31
+ for (let i = 0; i < totalChunks; i++) {
32
+ const start = i * chunkSize;
33
+ const end = Math.min(start + chunkSize, voiceData.length);
34
+ const chunk = voiceData.slice(start, end);
35
+
36
+ let type;
37
+ if (i === 0) {
38
+ type = MESSAGE_TYPE.VOICE_MESSAGE_START;
39
+ } else if (i === totalChunks - 1) {
40
+ type = MESSAGE_TYPE.VOICE_MESSAGE_END;
41
+ } else {
42
+ type = MESSAGE_TYPE.VOICE_MESSAGE_DATA;
43
+ }
44
+
45
+ // Fragment format: [type(1)][messageId(16)][index(2)][total(2)][totalSize(4)][data...]
46
+ const headerSize = type === MESSAGE_TYPE.VOICE_MESSAGE_START ? 25 : 21;
47
+ const fragment = new Uint8Array(headerSize + chunk.length);
48
+ const view = new DataView(fragment.buffer);
49
+
50
+ fragment[0] = type;
51
+ fragment.set(messageIdBytes, 1);
52
+ view.setUint16(17, i, false);
53
+ view.setUint16(19, totalChunks, false);
54
+
55
+ if (type === MESSAGE_TYPE.VOICE_MESSAGE_START) {
56
+ view.setUint32(21, voiceData.length, false);
57
+ fragment.set(chunk, 25);
58
+ } else {
59
+ fragment.set(chunk, 21);
60
+ }
61
+
62
+ fragments.push(fragment);
63
+ }
64
+
65
+ return fragments;
66
+ }
67
+
68
+ /**
69
+ * Returns fragment count for data size
70
+ * @param {number} dataSize - Data size in bytes
71
+ * @param {number} [chunkSize] - Chunk size
72
+ * @returns {number}
73
+ */
74
+ static getFragmentCount(dataSize, chunkSize = VOICE_MESSAGE_CONFIG.CHUNK_SIZE) {
75
+ return Math.ceil(dataSize / chunkSize);
76
+ }
77
+
78
+ /**
79
+ * Converts string to fixed-length bytes
80
+ * @private
81
+ */
82
+ static _stringToBytes(str, length) {
83
+ const bytes = new Uint8Array(length);
84
+ const encoder = new TextEncoder();
85
+ const encoded = encoder.encode(str.slice(0, length));
86
+ bytes.set(encoded.slice(0, length));
87
+ return bytes;
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Assembles fragmented voice messages
93
+ * @class AudioAssembler
94
+ * @extends EventEmitter
95
+ */
96
+ class AudioAssembler extends EventEmitter {
97
+ /**
98
+ * Creates a new AudioAssembler
99
+ * @param {Object} [options] - Assembler options
100
+ * @param {number} [options.timeout=120000] - Assembly timeout in ms
101
+ */
102
+ constructor(options = {}) {
103
+ super();
104
+
105
+ /** @private */
106
+ this._timeout = options.timeout || VOICE_MESSAGE_CONFIG.TIMEOUT_MS;
107
+ /** @private */
108
+ this._pending = new Map(); // messageId -> { fragments, totalSize, receivedSize, timer }
109
+ }
110
+
111
+ /**
112
+ * Adds a fragment to assembly
113
+ * @param {Uint8Array} fragment - Fragment data
114
+ * @returns {Uint8Array|null} Complete voice data or null
115
+ */
116
+ addFragment(fragment) {
117
+ const type = fragment[0];
118
+ const messageId = this._bytesToString(fragment.slice(1, 17));
119
+ const view = new DataView(fragment.buffer, fragment.byteOffset, fragment.byteLength);
120
+ const index = view.getUint16(17, false);
121
+ const total = view.getUint16(19, false);
122
+
123
+ let chunkData;
124
+ let totalSize = 0;
125
+
126
+ if (type === MESSAGE_TYPE.VOICE_MESSAGE_START) {
127
+ totalSize = view.getUint32(21, false);
128
+ chunkData = fragment.slice(25);
129
+ } else {
130
+ chunkData = fragment.slice(21);
131
+ }
132
+
133
+ // Initialize pending entry
134
+ if (!this._pending.has(messageId)) {
135
+ if (type !== MESSAGE_TYPE.VOICE_MESSAGE_START) {
136
+ // Missed the start fragment
137
+ return null;
138
+ }
139
+
140
+ this._pending.set(messageId, {
141
+ fragments: new Map(),
142
+ totalSize,
143
+ total,
144
+ receivedSize: 0,
145
+ timer: setTimeout(() => this._handleTimeout(messageId), this._timeout)
146
+ });
147
+ }
148
+
149
+ const entry = this._pending.get(messageId);
150
+
151
+ // Store fragment
152
+ if (!entry.fragments.has(index)) {
153
+ entry.fragments.set(index, chunkData);
154
+ entry.receivedSize += chunkData.length;
155
+
156
+ this.emit('progress', {
157
+ messageId,
158
+ received: entry.fragments.size,
159
+ total: entry.total,
160
+ progress: entry.fragments.size / entry.total
161
+ });
162
+ }
163
+
164
+ // Check if complete
165
+ if (entry.fragments.size === entry.total) {
166
+ return this._assemble(messageId);
167
+ }
168
+
169
+ return null;
170
+ }
171
+
172
+ /**
173
+ * Assembles complete voice message
174
+ * @private
175
+ */
176
+ _assemble(messageId) {
177
+ const entry = this._pending.get(messageId);
178
+ if (!entry) { return null; }
179
+
180
+ clearTimeout(entry.timer);
181
+
182
+ // Combine fragments in order
183
+ const result = new Uint8Array(entry.totalSize);
184
+ let offset = 0;
185
+
186
+ for (let i = 0; i < entry.total; i++) {
187
+ const chunk = entry.fragments.get(i);
188
+ if (chunk) {
189
+ result.set(chunk, offset);
190
+ offset += chunk.length;
191
+ }
192
+ }
193
+
194
+ this._pending.delete(messageId);
195
+ this.emit('complete', { messageId, size: result.length });
196
+
197
+ return result;
198
+ }
199
+
200
+ /**
201
+ * Handles assembly timeout
202
+ * @private
203
+ */
204
+ _handleTimeout(messageId) {
205
+ this._pending.delete(messageId);
206
+ this.emit('timeout', { messageId });
207
+ }
208
+
209
+ /**
210
+ * Gets assembly progress
211
+ * @param {string} messageId - Message ID
212
+ * @returns {Object|null}
213
+ */
214
+ getProgress(messageId) {
215
+ const entry = this._pending.get(messageId);
216
+ if (!entry) { return null; }
217
+
218
+ return {
219
+ received: entry.fragments.size,
220
+ total: entry.total,
221
+ progress: entry.fragments.size / entry.total,
222
+ receivedBytes: entry.receivedSize,
223
+ totalBytes: entry.totalSize
224
+ };
225
+ }
226
+
227
+ /**
228
+ * Aborts assembly of a message
229
+ * @param {string} messageId - Message ID
230
+ */
231
+ abort(messageId) {
232
+ const entry = this._pending.get(messageId);
233
+ if (entry) {
234
+ clearTimeout(entry.timer);
235
+ this._pending.delete(messageId);
236
+ }
237
+ }
238
+
239
+ /**
240
+ * Cleans up expired entries
241
+ */
242
+ cleanup() {
243
+ // Timeouts are handled automatically
244
+ }
245
+
246
+ /**
247
+ * Converts bytes to string
248
+ * @private
249
+ */
250
+ _bytesToString(bytes) {
251
+ const decoder = new TextDecoder();
252
+ const nullIndex = bytes.indexOf(0);
253
+ return decoder.decode(nullIndex >= 0 ? bytes.slice(0, nullIndex) : bytes);
254
+ }
255
+ }
256
+
257
+ module.exports = {
258
+ AudioFragmenter,
259
+ AudioAssembler
260
+ };