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,190 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Jitter buffer for real-time audio streaming
5
+ * @module audio/buffer/JitterBuffer
6
+ */
7
+
8
+ const EventEmitter = require('../../../utils/EventEmitter');
9
+ const { AUDIO_STREAM_CONFIG } = require('../../../constants/audio');
10
+
11
+ /**
12
+ * Jitter buffer for smoothing network jitter in audio streams
13
+ * @class JitterBuffer
14
+ * @extends EventEmitter
15
+ */
16
+ class JitterBuffer extends EventEmitter {
17
+ /**
18
+ * Creates a new JitterBuffer
19
+ * @param {Object} [options] - Buffer options
20
+ * @param {number} [options.depth=5] - Target buffer depth in frames
21
+ * @param {number} [options.maxDepth=20] - Maximum buffer depth
22
+ * @param {number} [options.frameMs=10] - Frame duration in ms
23
+ */
24
+ constructor(options = {}) {
25
+ super();
26
+
27
+ /** @private */
28
+ this._targetDepth = options.depth || AUDIO_STREAM_CONFIG.JITTER_BUFFER_FRAMES;
29
+ /** @private */
30
+ this._maxDepth = options.maxDepth || AUDIO_STREAM_CONFIG.MAX_JITTER_BUFFER_FRAMES;
31
+ /** @private */
32
+ this._frameMs = options.frameMs || 10;
33
+ /** @private */
34
+ this._buffer = new Map(); // sequenceNumber -> { frame, timestamp }
35
+ /** @private */
36
+ this._nextPlaySeq = 0;
37
+ /** @private */
38
+ this._initialized = false;
39
+ /** @private */
40
+ this._stats = {
41
+ framesReceived: 0,
42
+ framesPlayed: 0,
43
+ framesDropped: 0,
44
+ plcFrames: 0,
45
+ underruns: 0,
46
+ overflows: 0
47
+ };
48
+ }
49
+
50
+ /**
51
+ * Pushes a frame into the buffer
52
+ * @param {Uint8Array} frame - Audio frame data
53
+ * @param {number} sequenceNumber - Frame sequence number
54
+ * @param {number} [timestamp] - Frame timestamp
55
+ */
56
+ push(frame, sequenceNumber, timestamp = Date.now()) {
57
+ this._stats.framesReceived++;
58
+
59
+ // Initialize on first frame
60
+ if (!this._initialized) {
61
+ this._nextPlaySeq = sequenceNumber;
62
+ this._initialized = true;
63
+ }
64
+
65
+ // Drop if too old
66
+ if (sequenceNumber < this._nextPlaySeq) {
67
+ this._stats.framesDropped++;
68
+ return;
69
+ }
70
+
71
+ // Check for overflow
72
+ if (this._buffer.size >= this._maxDepth) {
73
+ this._stats.overflows++;
74
+ this.emit('overflow', { bufferSize: this._buffer.size });
75
+ // Drop oldest frame
76
+ const oldestSeq = Math.min(...this._buffer.keys());
77
+ this._buffer.delete(oldestSeq);
78
+ }
79
+
80
+ this._buffer.set(sequenceNumber, { frame: new Uint8Array(frame), timestamp });
81
+
82
+ // Emit ready when we have enough frames
83
+ if (this._buffer.size >= this._targetDepth) {
84
+ this.emit('ready', { bufferSize: this._buffer.size });
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Pops the next frame from the buffer
90
+ * @returns {{frame: Uint8Array|null, isPLC: boolean, sequenceNumber: number}}
91
+ */
92
+ pop() {
93
+ const seq = this._nextPlaySeq;
94
+ this._nextPlaySeq++;
95
+
96
+ if (this._buffer.has(seq)) {
97
+ const { frame } = this._buffer.get(seq);
98
+ this._buffer.delete(seq);
99
+ this._stats.framesPlayed++;
100
+ return { frame, isPLC: false, sequenceNumber: seq };
101
+ }
102
+
103
+ // Frame missing - generate PLC marker
104
+ this._stats.plcFrames++;
105
+
106
+ if (this._buffer.size === 0) {
107
+ this._stats.underruns++;
108
+ this.emit('underrun', { sequenceNumber: seq });
109
+ }
110
+
111
+ return { frame: null, isPLC: true, sequenceNumber: seq };
112
+ }
113
+
114
+ /**
115
+ * Peeks at the next frame without removing it
116
+ * @returns {{frame: Uint8Array|null, sequenceNumber: number}|null}
117
+ */
118
+ peek() {
119
+ if (this._buffer.has(this._nextPlaySeq)) {
120
+ const { frame } = this._buffer.get(this._nextPlaySeq);
121
+ return { frame, sequenceNumber: this._nextPlaySeq };
122
+ }
123
+ return null;
124
+ }
125
+
126
+ /**
127
+ * Returns current buffer level
128
+ * @returns {number}
129
+ */
130
+ getBufferLevel() {
131
+ return this._buffer.size;
132
+ }
133
+
134
+ /**
135
+ * Returns buffer level in milliseconds
136
+ * @returns {number}
137
+ */
138
+ getBufferMs() {
139
+ return this._buffer.size * this._frameMs;
140
+ }
141
+
142
+ /**
143
+ * Returns whether buffer has enough frames
144
+ * @returns {boolean}
145
+ */
146
+ isReady() {
147
+ return this._buffer.size >= this._targetDepth;
148
+ }
149
+
150
+ /**
151
+ * Returns buffer statistics
152
+ * @returns {Object}
153
+ */
154
+ getStats() {
155
+ return {
156
+ ...this._stats,
157
+ currentLevel: this._buffer.size,
158
+ targetDepth: this._targetDepth,
159
+ bufferMs: this.getBufferMs(),
160
+ lossRatio: this._stats.framesReceived > 0
161
+ ? this._stats.plcFrames / this._stats.framesReceived
162
+ : 0
163
+ };
164
+ }
165
+
166
+ /**
167
+ * Clears the buffer
168
+ */
169
+ clear() {
170
+ this._buffer.clear();
171
+ this._initialized = false;
172
+ this._nextPlaySeq = 0;
173
+ }
174
+
175
+ /**
176
+ * Pauses playback (stops advancing sequence)
177
+ */
178
+ pause() {
179
+ this._paused = true;
180
+ }
181
+
182
+ /**
183
+ * Resumes playback
184
+ */
185
+ resume() {
186
+ this._paused = false;
187
+ }
188
+ }
189
+
190
+ module.exports = JitterBuffer;
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview Audio buffer module exports
5
+ * @module audio/buffer
6
+ */
7
+
8
+ const FrameBuffer = require('./FrameBuffer');
9
+ const JitterBuffer = require('./JitterBuffer');
10
+
11
+ module.exports = {
12
+ FrameBuffer,
13
+ JitterBuffer
14
+ };
@@ -0,0 +1,291 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview LC3 codec wrapper for React Native
5
+ * @module audio/codec/LC3Codec
6
+ */
7
+
8
+ const EventEmitter = require('../../../utils/EventEmitter');
9
+ const AudioError = require('../../../errors/AudioError');
10
+ const { LC3_CONFIG, AUDIO_QUALITY } = require('../../../constants/audio');
11
+
12
+ /**
13
+ * LC3 Codec wrapper that bridges to React Native native modules
14
+ * @class LC3Codec
15
+ * @extends EventEmitter
16
+ */
17
+ class LC3Codec extends EventEmitter {
18
+ /**
19
+ * Creates a new LC3Codec instance
20
+ * @param {Object} [options] - Codec configuration
21
+ * @param {number} [options.sampleRate=16000] - Sample rate in Hz
22
+ * @param {number} [options.frameMs=10] - Frame duration in milliseconds
23
+ * @param {number} [options.bitRate=24000] - Bit rate in bps
24
+ * @param {number} [options.channels=1] - Number of audio channels
25
+ */
26
+ constructor(options = {}) {
27
+ super();
28
+
29
+ const quality = options.quality ? AUDIO_QUALITY[options.quality] : null;
30
+
31
+ /** @private */
32
+ this._sampleRate = quality?.sampleRate || options.sampleRate || LC3_CONFIG.DEFAULT_SAMPLE_RATE;
33
+ /** @private */
34
+ this._frameMs = quality?.frameMs || options.frameMs || LC3_CONFIG.DEFAULT_FRAME_DURATION_MS;
35
+ /** @private */
36
+ this._bitRate = quality?.bitRate || options.bitRate || LC3_CONFIG.DEFAULT_BIT_RATE;
37
+ /** @private */
38
+ this._channels = quality?.channels || options.channels || LC3_CONFIG.DEFAULT_CHANNELS;
39
+ /** @private */
40
+ this._initialized = false;
41
+ /** @private */
42
+ this._nativeModule = null;
43
+ /** @private */
44
+ this._useMock = false;
45
+
46
+ this._validateConfig();
47
+ }
48
+
49
+ /**
50
+ * Validates codec configuration
51
+ * @private
52
+ */
53
+ _validateConfig() {
54
+ if (!LC3_CONFIG.SAMPLE_RATES.includes(this._sampleRate)) {
55
+ throw AudioError.invalidConfig(`Invalid sample rate: ${this._sampleRate}`);
56
+ }
57
+ if (!LC3_CONFIG.FRAME_DURATIONS.includes(this._frameMs)) {
58
+ throw AudioError.invalidConfig(`Invalid frame duration: ${this._frameMs}`);
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Initializes the codec
64
+ * @returns {Promise<void>}
65
+ */
66
+ async initialize() {
67
+ if (this._initialized) {
68
+ return;
69
+ }
70
+
71
+ try {
72
+ // Try to load native module
73
+ this._nativeModule = this._loadNativeModule();
74
+
75
+ if (this._nativeModule) {
76
+ await this._nativeModule.initialize({
77
+ sampleRate: this._sampleRate,
78
+ frameMs: this._frameMs,
79
+ bitRate: this._bitRate,
80
+ channels: this._channels
81
+ });
82
+ } else {
83
+ // Use mock implementation for testing
84
+ this._useMock = true;
85
+ console.warn('LC3Codec: Native module not available, using mock implementation');
86
+ }
87
+
88
+ this._initialized = true;
89
+ this.emit('initialized', this.getConfig());
90
+ } catch (error) {
91
+ throw AudioError.codecInitFailed({ reason: error.message });
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Attempts to load the native LC3 module
97
+ * @private
98
+ * @returns {Object|null}
99
+ */
100
+ _loadNativeModule() {
101
+ try {
102
+ // Try React Native NativeModules
103
+ const { NativeModules } = require('react-native');
104
+ if (NativeModules && NativeModules.RNLc3Codec) {
105
+ return NativeModules.RNLc3Codec;
106
+ }
107
+ } catch {
108
+ // Not in React Native environment
109
+ }
110
+ return null;
111
+ }
112
+
113
+ /**
114
+ * Returns whether the codec is initialized
115
+ * @returns {boolean}
116
+ */
117
+ isInitialized() {
118
+ return this._initialized;
119
+ }
120
+
121
+ /**
122
+ * Returns whether using mock implementation
123
+ * @returns {boolean}
124
+ */
125
+ isMock() {
126
+ return this._useMock;
127
+ }
128
+
129
+ /**
130
+ * Encodes PCM samples to LC3 frame
131
+ * @param {Int16Array} pcmSamples - PCM audio samples
132
+ * @returns {Promise<Uint8Array>} Encoded LC3 frame
133
+ */
134
+ async encode(pcmSamples) {
135
+ if (!this._initialized) {
136
+ throw AudioError.codecInitFailed({ reason: 'Codec not initialized' });
137
+ }
138
+
139
+ const expectedSamples = this.getFrameSamples();
140
+ if (pcmSamples.length !== expectedSamples) {
141
+ throw AudioError.encodingFailed({
142
+ reason: `Expected ${expectedSamples} samples, got ${pcmSamples.length}`
143
+ });
144
+ }
145
+
146
+ if (this._useMock) {
147
+ return this._mockEncode(pcmSamples);
148
+ }
149
+
150
+ try {
151
+ const result = await this._nativeModule.encode(Array.from(pcmSamples));
152
+ return new Uint8Array(result);
153
+ } catch (error) {
154
+ throw AudioError.encodingFailed({ reason: error.message });
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Decodes LC3 frame to PCM samples
160
+ * @param {Uint8Array} lc3Frame - Encoded LC3 frame
161
+ * @returns {Promise<Int16Array>} Decoded PCM samples
162
+ */
163
+ async decode(lc3Frame) {
164
+ if (!this._initialized) {
165
+ throw AudioError.codecInitFailed({ reason: 'Codec not initialized' });
166
+ }
167
+
168
+ if (this._useMock) {
169
+ return this._mockDecode(lc3Frame);
170
+ }
171
+
172
+ try {
173
+ const result = await this._nativeModule.decode(Array.from(lc3Frame));
174
+ return new Int16Array(result);
175
+ } catch (error) {
176
+ throw AudioError.decodingFailed({ reason: error.message });
177
+ }
178
+ }
179
+
180
+ /**
181
+ * Generates PLC (Packet Loss Concealment) frame
182
+ * @returns {Promise<Int16Array>} Concealed PCM samples
183
+ */
184
+ async decodePLC() {
185
+ if (!this._initialized) {
186
+ throw AudioError.codecInitFailed({ reason: 'Codec not initialized' });
187
+ }
188
+
189
+ if (this._useMock) {
190
+ return this._mockDecodePLC();
191
+ }
192
+
193
+ try {
194
+ const result = await this._nativeModule.decodePLC();
195
+ return new Int16Array(result);
196
+ } catch (error) {
197
+ throw AudioError.decodingFailed({ reason: error.message });
198
+ }
199
+ }
200
+
201
+ /**
202
+ * Mock encode implementation for testing
203
+ * @private
204
+ */
205
+ _mockEncode(pcmSamples) {
206
+ // Simple mock: compress by taking every 4th sample and convert to bytes
207
+ const frameBytes = this.getFrameBytes();
208
+ const encoded = new Uint8Array(frameBytes);
209
+
210
+ for (let i = 0; i < frameBytes && i * 2 < pcmSamples.length; i++) {
211
+ const sample = pcmSamples[i * 2];
212
+ encoded[i] = (sample >> 8) & 0xFF;
213
+ }
214
+
215
+ return encoded;
216
+ }
217
+
218
+ /**
219
+ * Mock decode implementation for testing
220
+ * @private
221
+ */
222
+ _mockDecode(lc3Frame) {
223
+ const samples = this.getFrameSamples();
224
+ const decoded = new Int16Array(samples);
225
+
226
+ for (let i = 0; i < samples && i < lc3Frame.length; i++) {
227
+ decoded[i * 2] = (lc3Frame[i] << 8);
228
+ if (i * 2 + 1 < samples) {
229
+ decoded[i * 2 + 1] = (lc3Frame[i] << 8);
230
+ }
231
+ }
232
+
233
+ return decoded;
234
+ }
235
+
236
+ /**
237
+ * Mock PLC implementation for testing
238
+ * @private
239
+ */
240
+ _mockDecodePLC() {
241
+ // Return silence for PLC
242
+ return new Int16Array(this.getFrameSamples());
243
+ }
244
+
245
+ /**
246
+ * Returns the number of samples per frame
247
+ * @returns {number}
248
+ */
249
+ getFrameSamples() {
250
+ return Math.floor(this._sampleRate * this._frameMs / 1000);
251
+ }
252
+
253
+ /**
254
+ * Returns the encoded frame size in bytes
255
+ * @returns {number}
256
+ */
257
+ getFrameBytes() {
258
+ // LC3 frame size formula: bitRate * frameMs / 8000
259
+ return Math.ceil(this._bitRate * this._frameMs / 8000);
260
+ }
261
+
262
+ /**
263
+ * Returns the current codec configuration
264
+ * @returns {Object}
265
+ */
266
+ getConfig() {
267
+ return {
268
+ sampleRate: this._sampleRate,
269
+ frameMs: this._frameMs,
270
+ bitRate: this._bitRate,
271
+ channels: this._channels,
272
+ frameSamples: this.getFrameSamples(),
273
+ frameBytes: this.getFrameBytes(),
274
+ isMock: this._useMock
275
+ };
276
+ }
277
+
278
+ /**
279
+ * Destroys the codec and releases resources
280
+ */
281
+ destroy() {
282
+ if (this._nativeModule && typeof this._nativeModule.destroy === 'function') {
283
+ this._nativeModule.destroy();
284
+ }
285
+ this._initialized = false;
286
+ this._nativeModule = null;
287
+ this.removeAllListeners();
288
+ }
289
+ }
290
+
291
+ module.exports = LC3Codec;
@@ -0,0 +1,131 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @fileoverview LC3 decoder with PLC support
5
+ * @module audio/codec/LC3Decoder
6
+ */
7
+
8
+ const EventEmitter = require('../../../utils/EventEmitter');
9
+ const AudioError = require('../../../errors/AudioError');
10
+
11
+ /**
12
+ * LC3 Decoder with Packet Loss Concealment
13
+ * @class LC3Decoder
14
+ * @extends EventEmitter
15
+ */
16
+ class LC3Decoder extends EventEmitter {
17
+ /**
18
+ * Creates a new LC3Decoder
19
+ * @param {LC3Codec} codec - Initialized LC3 codec instance
20
+ */
21
+ constructor(codec) {
22
+ super();
23
+
24
+ if (!codec || !codec.isInitialized()) {
25
+ throw AudioError.codecInitFailed({ reason: 'Codec must be initialized' });
26
+ }
27
+
28
+ /** @private */
29
+ this._codec = codec;
30
+ /** @private */
31
+ this._frameSamples = codec.getFrameSamples();
32
+ /** @private */
33
+ this._framesDecoded = 0;
34
+ /** @private */
35
+ this._plcFrames = 0;
36
+ /** @private */
37
+ this._errors = 0;
38
+ /** @private */
39
+ this._lastSequence = -1;
40
+ }
41
+
42
+ /**
43
+ * Decodes an LC3 frame to PCM samples
44
+ * @param {Uint8Array} lc3Frame - Encoded LC3 frame
45
+ * @param {number} [sequenceNumber] - Optional sequence number for gap detection
46
+ * @returns {Promise<Int16Array>} Decoded PCM samples
47
+ */
48
+ async decode(lc3Frame, sequenceNumber) {
49
+ // Check for gaps in sequence
50
+ if (sequenceNumber !== undefined && this._lastSequence >= 0) {
51
+ const gap = sequenceNumber - this._lastSequence - 1;
52
+ if (gap > 0) {
53
+ this.emit('gap-detected', { missing: gap, lastSeq: this._lastSequence });
54
+ }
55
+ }
56
+
57
+ if (sequenceNumber !== undefined) {
58
+ this._lastSequence = sequenceNumber;
59
+ }
60
+
61
+ try {
62
+ const samples = await this._codec.decode(lc3Frame);
63
+ this._framesDecoded++;
64
+ this.emit('samples', { samples, index: this._framesDecoded });
65
+ return samples;
66
+ } catch (error) {
67
+ this._errors++;
68
+ this.emit('error', error);
69
+ throw error;
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Generates a PLC frame for packet loss concealment
75
+ * @returns {Promise<Int16Array>} Concealed PCM samples
76
+ */
77
+ async decodePLC() {
78
+ try {
79
+ const samples = await this._codec.decodePLC();
80
+ this._plcFrames++;
81
+ this.emit('plc', { samples, plcCount: this._plcFrames });
82
+ return samples;
83
+ } catch (error) {
84
+ this._errors++;
85
+ this.emit('error', error);
86
+ // Return silence on PLC failure
87
+ return new Int16Array(this._frameSamples);
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Decodes a frame or generates PLC if frame is missing
93
+ * @param {Uint8Array|null} lc3Frame - LC3 frame or null for PLC
94
+ * @param {number} [sequenceNumber] - Sequence number
95
+ * @returns {Promise<{samples: Int16Array, isPLC: boolean}>}
96
+ */
97
+ async decodeOrPLC(lc3Frame, sequenceNumber) {
98
+ if (lc3Frame === null || lc3Frame === undefined) {
99
+ const samples = await this.decodePLC();
100
+ return { samples, isPLC: true };
101
+ }
102
+
103
+ const samples = await this.decode(lc3Frame, sequenceNumber);
104
+ return { samples, isPLC: false };
105
+ }
106
+
107
+ /**
108
+ * Returns decoder statistics
109
+ * @returns {Object}
110
+ */
111
+ getStats() {
112
+ return {
113
+ framesDecoded: this._framesDecoded,
114
+ plcFrames: this._plcFrames,
115
+ errors: this._errors,
116
+ plcRatio: this._framesDecoded > 0
117
+ ? this._plcFrames / (this._framesDecoded + this._plcFrames)
118
+ : 0,
119
+ lastSequence: this._lastSequence
120
+ };
121
+ }
122
+
123
+ /**
124
+ * Resets the decoder state
125
+ */
126
+ reset() {
127
+ this._lastSequence = -1;
128
+ }
129
+ }
130
+
131
+ module.exports = LC3Decoder;