@livekit/agents 1.1.0 → 1.2.0

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 (942) hide show
  1. package/dist/audio.cjs +89 -3
  2. package/dist/audio.cjs.map +1 -1
  3. package/dist/audio.d.cts +36 -1
  4. package/dist/audio.d.ts +36 -1
  5. package/dist/audio.d.ts.map +1 -1
  6. package/dist/audio.js +76 -2
  7. package/dist/audio.js.map +1 -1
  8. package/dist/beta/index.cjs +29 -0
  9. package/dist/beta/index.cjs.map +1 -0
  10. package/dist/beta/index.d.cts +2 -0
  11. package/dist/beta/index.d.ts +2 -0
  12. package/dist/beta/index.d.ts.map +1 -0
  13. package/dist/beta/index.js +7 -0
  14. package/dist/beta/index.js.map +1 -0
  15. package/dist/beta/workflows/index.cjs +29 -0
  16. package/dist/beta/workflows/index.cjs.map +1 -0
  17. package/dist/beta/workflows/index.d.cts +2 -0
  18. package/dist/beta/workflows/index.d.ts +2 -0
  19. package/dist/beta/workflows/index.d.ts.map +1 -0
  20. package/dist/beta/workflows/index.js +7 -0
  21. package/dist/beta/workflows/index.js.map +1 -0
  22. package/dist/beta/workflows/task_group.cjs +162 -0
  23. package/dist/beta/workflows/task_group.cjs.map +1 -0
  24. package/dist/beta/workflows/task_group.d.cts +32 -0
  25. package/dist/beta/workflows/task_group.d.ts +32 -0
  26. package/dist/beta/workflows/task_group.d.ts.map +1 -0
  27. package/dist/beta/workflows/task_group.js +138 -0
  28. package/dist/beta/workflows/task_group.js.map +1 -0
  29. package/dist/cli.cjs +44 -46
  30. package/dist/cli.cjs.map +1 -1
  31. package/dist/cli.d.cts +3 -3
  32. package/dist/cli.d.ts +3 -3
  33. package/dist/cli.d.ts.map +1 -1
  34. package/dist/cli.js +45 -47
  35. package/dist/cli.js.map +1 -1
  36. package/dist/connection_pool.cjs +242 -0
  37. package/dist/connection_pool.cjs.map +1 -0
  38. package/dist/connection_pool.d.cts +123 -0
  39. package/dist/connection_pool.d.ts +123 -0
  40. package/dist/connection_pool.d.ts.map +1 -0
  41. package/dist/connection_pool.js +218 -0
  42. package/dist/connection_pool.js.map +1 -0
  43. package/dist/connection_pool.test.cjs +256 -0
  44. package/dist/connection_pool.test.cjs.map +1 -0
  45. package/dist/connection_pool.test.js +255 -0
  46. package/dist/connection_pool.test.js.map +1 -0
  47. package/dist/constants.cjs +30 -0
  48. package/dist/constants.cjs.map +1 -1
  49. package/dist/constants.d.cts +10 -0
  50. package/dist/constants.d.ts +10 -0
  51. package/dist/constants.d.ts.map +1 -1
  52. package/dist/constants.js +20 -0
  53. package/dist/constants.js.map +1 -1
  54. package/dist/cpu.cjs +189 -0
  55. package/dist/cpu.cjs.map +1 -0
  56. package/dist/cpu.d.cts +24 -0
  57. package/dist/cpu.d.ts +24 -0
  58. package/dist/cpu.d.ts.map +1 -0
  59. package/dist/cpu.js +152 -0
  60. package/dist/cpu.js.map +1 -0
  61. package/dist/cpu.test.cjs +227 -0
  62. package/dist/cpu.test.cjs.map +1 -0
  63. package/dist/cpu.test.js +204 -0
  64. package/dist/cpu.test.js.map +1 -0
  65. package/dist/http_server.cjs +9 -6
  66. package/dist/http_server.cjs.map +1 -1
  67. package/dist/http_server.d.cts +5 -1
  68. package/dist/http_server.d.ts +5 -1
  69. package/dist/http_server.d.ts.map +1 -1
  70. package/dist/http_server.js +9 -6
  71. package/dist/http_server.js.map +1 -1
  72. package/dist/index.cjs +24 -9
  73. package/dist/index.cjs.map +1 -1
  74. package/dist/index.d.cts +15 -11
  75. package/dist/index.d.ts +15 -11
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +18 -9
  78. package/dist/index.js.map +1 -1
  79. package/dist/inference/api_protos.cjs +70 -2
  80. package/dist/inference/api_protos.cjs.map +1 -1
  81. package/dist/inference/api_protos.d.cts +373 -32
  82. package/dist/inference/api_protos.d.ts +373 -32
  83. package/dist/inference/api_protos.d.ts.map +1 -1
  84. package/dist/inference/api_protos.js +62 -2
  85. package/dist/inference/api_protos.js.map +1 -1
  86. package/dist/inference/index.cjs +8 -0
  87. package/dist/inference/index.cjs.map +1 -1
  88. package/dist/inference/index.d.cts +3 -4
  89. package/dist/inference/index.d.ts +3 -4
  90. package/dist/inference/index.d.ts.map +1 -1
  91. package/dist/inference/index.js +18 -3
  92. package/dist/inference/index.js.map +1 -1
  93. package/dist/inference/interruption/defaults.cjs +81 -0
  94. package/dist/inference/interruption/defaults.cjs.map +1 -0
  95. package/dist/inference/interruption/defaults.d.cts +19 -0
  96. package/dist/inference/interruption/defaults.d.ts +19 -0
  97. package/dist/inference/interruption/defaults.d.ts.map +1 -0
  98. package/dist/inference/interruption/defaults.js +46 -0
  99. package/dist/inference/interruption/defaults.js.map +1 -0
  100. package/dist/inference/interruption/errors.cjs +44 -0
  101. package/dist/inference/interruption/errors.cjs.map +1 -0
  102. package/dist/inference/interruption/errors.d.cts +12 -0
  103. package/dist/inference/interruption/errors.d.ts +12 -0
  104. package/dist/inference/interruption/errors.d.ts.map +1 -0
  105. package/dist/inference/interruption/errors.js +20 -0
  106. package/dist/inference/interruption/errors.js.map +1 -0
  107. package/dist/inference/interruption/http_transport.cjs +163 -0
  108. package/dist/inference/interruption/http_transport.cjs.map +1 -0
  109. package/dist/inference/interruption/http_transport.d.cts +63 -0
  110. package/dist/inference/interruption/http_transport.d.ts +63 -0
  111. package/dist/inference/interruption/http_transport.d.ts.map +1 -0
  112. package/dist/inference/interruption/http_transport.js +137 -0
  113. package/dist/inference/interruption/http_transport.js.map +1 -0
  114. package/dist/inference/interruption/interruption_cache_entry.cjs +58 -0
  115. package/dist/inference/interruption/interruption_cache_entry.cjs.map +1 -0
  116. package/dist/inference/interruption/interruption_cache_entry.d.cts +30 -0
  117. package/dist/inference/interruption/interruption_cache_entry.d.ts +30 -0
  118. package/dist/inference/interruption/interruption_cache_entry.d.ts.map +1 -0
  119. package/dist/inference/interruption/interruption_cache_entry.js +34 -0
  120. package/dist/inference/interruption/interruption_cache_entry.js.map +1 -0
  121. package/dist/inference/interruption/interruption_detector.cjs +198 -0
  122. package/dist/inference/interruption/interruption_detector.cjs.map +1 -0
  123. package/dist/inference/interruption/interruption_detector.d.cts +59 -0
  124. package/dist/inference/interruption/interruption_detector.d.ts +59 -0
  125. package/dist/inference/interruption/interruption_detector.d.ts.map +1 -0
  126. package/dist/inference/interruption/interruption_detector.js +164 -0
  127. package/dist/inference/interruption/interruption_detector.js.map +1 -0
  128. package/dist/inference/interruption/interruption_stream.cjs +368 -0
  129. package/dist/inference/interruption/interruption_stream.cjs.map +1 -0
  130. package/dist/inference/interruption/interruption_stream.d.cts +46 -0
  131. package/dist/inference/interruption/interruption_stream.d.ts +46 -0
  132. package/dist/inference/interruption/interruption_stream.d.ts.map +1 -0
  133. package/dist/inference/interruption/interruption_stream.js +344 -0
  134. package/dist/inference/interruption/interruption_stream.js.map +1 -0
  135. package/dist/inference/interruption/types.cjs +17 -0
  136. package/dist/inference/interruption/types.cjs.map +1 -0
  137. package/dist/inference/interruption/types.d.cts +66 -0
  138. package/dist/inference/interruption/types.d.ts +66 -0
  139. package/dist/inference/interruption/types.d.ts.map +1 -0
  140. package/dist/inference/interruption/types.js +1 -0
  141. package/dist/inference/interruption/types.js.map +1 -0
  142. package/dist/inference/interruption/utils.cjs +130 -0
  143. package/dist/inference/interruption/utils.cjs.map +1 -0
  144. package/dist/inference/interruption/utils.d.cts +41 -0
  145. package/dist/inference/interruption/utils.d.ts +41 -0
  146. package/dist/inference/interruption/utils.d.ts.map +1 -0
  147. package/dist/inference/interruption/utils.js +105 -0
  148. package/dist/inference/interruption/utils.js.map +1 -0
  149. package/dist/inference/interruption/utils.test.cjs +105 -0
  150. package/dist/inference/interruption/utils.test.cjs.map +1 -0
  151. package/dist/inference/interruption/utils.test.js +104 -0
  152. package/dist/inference/interruption/utils.test.js.map +1 -0
  153. package/dist/inference/interruption/ws_transport.cjs +342 -0
  154. package/dist/inference/interruption/ws_transport.cjs.map +1 -0
  155. package/dist/inference/interruption/ws_transport.d.cts +33 -0
  156. package/dist/inference/interruption/ws_transport.d.ts +33 -0
  157. package/dist/inference/interruption/ws_transport.d.ts.map +1 -0
  158. package/dist/inference/interruption/ws_transport.js +308 -0
  159. package/dist/inference/interruption/ws_transport.js.map +1 -0
  160. package/dist/inference/llm.cjs +106 -66
  161. package/dist/inference/llm.cjs.map +1 -1
  162. package/dist/inference/llm.d.cts +65 -43
  163. package/dist/inference/llm.d.ts +65 -43
  164. package/dist/inference/llm.d.ts.map +1 -1
  165. package/dist/inference/llm.js +100 -66
  166. package/dist/inference/llm.js.map +1 -1
  167. package/dist/inference/stt.cjs +319 -170
  168. package/dist/inference/stt.cjs.map +1 -1
  169. package/dist/inference/stt.d.cts +64 -15
  170. package/dist/inference/stt.d.ts +64 -15
  171. package/dist/inference/stt.d.ts.map +1 -1
  172. package/dist/inference/stt.js +319 -170
  173. package/dist/inference/stt.js.map +1 -1
  174. package/dist/inference/stt.test.cjs +218 -0
  175. package/dist/inference/stt.test.cjs.map +1 -0
  176. package/dist/inference/stt.test.js +217 -0
  177. package/dist/inference/stt.test.js.map +1 -0
  178. package/dist/inference/tts.cjs +249 -71
  179. package/dist/inference/tts.cjs.map +1 -1
  180. package/dist/inference/tts.d.cts +55 -16
  181. package/dist/inference/tts.d.ts +55 -16
  182. package/dist/inference/tts.d.ts.map +1 -1
  183. package/dist/inference/tts.js +249 -77
  184. package/dist/inference/tts.js.map +1 -1
  185. package/dist/inference/tts.test.cjs +233 -0
  186. package/dist/inference/tts.test.cjs.map +1 -0
  187. package/dist/inference/tts.test.js +232 -0
  188. package/dist/inference/tts.test.js.map +1 -0
  189. package/dist/inference/utils.cjs +26 -7
  190. package/dist/inference/utils.cjs.map +1 -1
  191. package/dist/inference/utils.d.cts +14 -1
  192. package/dist/inference/utils.d.ts +14 -1
  193. package/dist/inference/utils.d.ts.map +1 -1
  194. package/dist/inference/utils.js +18 -2
  195. package/dist/inference/utils.js.map +1 -1
  196. package/dist/ipc/inference_proc_executor.cjs +6 -3
  197. package/dist/ipc/inference_proc_executor.cjs.map +1 -1
  198. package/dist/ipc/inference_proc_executor.d.ts.map +1 -1
  199. package/dist/ipc/inference_proc_executor.js +6 -3
  200. package/dist/ipc/inference_proc_executor.js.map +1 -1
  201. package/dist/ipc/inference_proc_lazy_main.cjs +13 -1
  202. package/dist/ipc/inference_proc_lazy_main.cjs.map +1 -1
  203. package/dist/ipc/inference_proc_lazy_main.js +13 -1
  204. package/dist/ipc/inference_proc_lazy_main.js.map +1 -1
  205. package/dist/ipc/job_proc_executor.cjs +6 -1
  206. package/dist/ipc/job_proc_executor.cjs.map +1 -1
  207. package/dist/ipc/job_proc_executor.d.ts.map +1 -1
  208. package/dist/ipc/job_proc_executor.js +6 -1
  209. package/dist/ipc/job_proc_executor.js.map +1 -1
  210. package/dist/ipc/job_proc_lazy_main.cjs +89 -17
  211. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
  212. package/dist/ipc/job_proc_lazy_main.js +68 -18
  213. package/dist/ipc/job_proc_lazy_main.js.map +1 -1
  214. package/dist/ipc/supervised_proc.cjs +34 -8
  215. package/dist/ipc/supervised_proc.cjs.map +1 -1
  216. package/dist/ipc/supervised_proc.d.cts +8 -0
  217. package/dist/ipc/supervised_proc.d.ts +8 -0
  218. package/dist/ipc/supervised_proc.d.ts.map +1 -1
  219. package/dist/ipc/supervised_proc.js +34 -8
  220. package/dist/ipc/supervised_proc.js.map +1 -1
  221. package/dist/ipc/supervised_proc.test.cjs +145 -0
  222. package/dist/ipc/supervised_proc.test.cjs.map +1 -0
  223. package/dist/ipc/supervised_proc.test.js +122 -0
  224. package/dist/ipc/supervised_proc.test.js.map +1 -0
  225. package/dist/job.cjs +109 -1
  226. package/dist/job.cjs.map +1 -1
  227. package/dist/job.d.cts +14 -0
  228. package/dist/job.d.ts +14 -0
  229. package/dist/job.d.ts.map +1 -1
  230. package/dist/job.js +99 -1
  231. package/dist/job.js.map +1 -1
  232. package/dist/language.cjs +394 -0
  233. package/dist/language.cjs.map +1 -0
  234. package/dist/language.d.cts +15 -0
  235. package/dist/language.d.ts +15 -0
  236. package/dist/language.d.ts.map +1 -0
  237. package/dist/language.js +363 -0
  238. package/dist/language.js.map +1 -0
  239. package/dist/language.test.cjs +43 -0
  240. package/dist/language.test.cjs.map +1 -0
  241. package/dist/language.test.js +49 -0
  242. package/dist/language.test.js.map +1 -0
  243. package/dist/llm/chat_context.cjs +274 -3
  244. package/dist/llm/chat_context.cjs.map +1 -1
  245. package/dist/llm/chat_context.d.cts +86 -2
  246. package/dist/llm/chat_context.d.ts +86 -2
  247. package/dist/llm/chat_context.d.ts.map +1 -1
  248. package/dist/llm/chat_context.js +273 -3
  249. package/dist/llm/chat_context.js.map +1 -1
  250. package/dist/llm/chat_context.test.cjs +574 -0
  251. package/dist/llm/chat_context.test.cjs.map +1 -1
  252. package/dist/llm/chat_context.test.js +574 -0
  253. package/dist/llm/chat_context.test.js.map +1 -1
  254. package/dist/llm/fallback_adapter.cjs +278 -0
  255. package/dist/llm/fallback_adapter.cjs.map +1 -0
  256. package/dist/llm/fallback_adapter.d.cts +73 -0
  257. package/dist/llm/fallback_adapter.d.ts +73 -0
  258. package/dist/llm/fallback_adapter.d.ts.map +1 -0
  259. package/dist/llm/fallback_adapter.js +254 -0
  260. package/dist/llm/fallback_adapter.js.map +1 -0
  261. package/dist/llm/fallback_adapter.test.cjs +176 -0
  262. package/dist/llm/fallback_adapter.test.cjs.map +1 -0
  263. package/dist/llm/fallback_adapter.test.js +175 -0
  264. package/dist/llm/fallback_adapter.test.js.map +1 -0
  265. package/dist/llm/index.cjs +9 -0
  266. package/dist/llm/index.cjs.map +1 -1
  267. package/dist/llm/index.d.cts +4 -3
  268. package/dist/llm/index.d.ts +4 -3
  269. package/dist/llm/index.d.ts.map +1 -1
  270. package/dist/llm/index.js +11 -1
  271. package/dist/llm/index.js.map +1 -1
  272. package/dist/llm/llm.cjs +65 -11
  273. package/dist/llm/llm.cjs.map +1 -1
  274. package/dist/llm/llm.d.cts +13 -2
  275. package/dist/llm/llm.d.ts +13 -2
  276. package/dist/llm/llm.d.ts.map +1 -1
  277. package/dist/llm/llm.js +65 -11
  278. package/dist/llm/llm.js.map +1 -1
  279. package/dist/llm/provider_format/google.cjs +6 -2
  280. package/dist/llm/provider_format/google.cjs.map +1 -1
  281. package/dist/llm/provider_format/google.d.cts +1 -1
  282. package/dist/llm/provider_format/google.d.ts +1 -1
  283. package/dist/llm/provider_format/google.d.ts.map +1 -1
  284. package/dist/llm/provider_format/google.js +6 -2
  285. package/dist/llm/provider_format/google.js.map +1 -1
  286. package/dist/llm/provider_format/google.test.cjs +48 -0
  287. package/dist/llm/provider_format/google.test.cjs.map +1 -1
  288. package/dist/llm/provider_format/google.test.js +54 -1
  289. package/dist/llm/provider_format/google.test.js.map +1 -1
  290. package/dist/llm/provider_format/index.cjs +2 -0
  291. package/dist/llm/provider_format/index.cjs.map +1 -1
  292. package/dist/llm/provider_format/index.d.cts +2 -2
  293. package/dist/llm/provider_format/index.d.ts +2 -2
  294. package/dist/llm/provider_format/index.d.ts.map +1 -1
  295. package/dist/llm/provider_format/index.js +6 -1
  296. package/dist/llm/provider_format/index.js.map +1 -1
  297. package/dist/llm/provider_format/openai.cjs +126 -24
  298. package/dist/llm/provider_format/openai.cjs.map +1 -1
  299. package/dist/llm/provider_format/openai.d.cts +1 -0
  300. package/dist/llm/provider_format/openai.d.ts +1 -0
  301. package/dist/llm/provider_format/openai.d.ts.map +1 -1
  302. package/dist/llm/provider_format/openai.js +124 -23
  303. package/dist/llm/provider_format/openai.js.map +1 -1
  304. package/dist/llm/provider_format/openai.test.cjs +393 -0
  305. package/dist/llm/provider_format/openai.test.cjs.map +1 -1
  306. package/dist/llm/provider_format/openai.test.js +400 -2
  307. package/dist/llm/provider_format/openai.test.js.map +1 -1
  308. package/dist/llm/provider_format/utils.cjs +5 -4
  309. package/dist/llm/provider_format/utils.cjs.map +1 -1
  310. package/dist/llm/provider_format/utils.d.ts.map +1 -1
  311. package/dist/llm/provider_format/utils.js +5 -4
  312. package/dist/llm/provider_format/utils.js.map +1 -1
  313. package/dist/llm/realtime.cjs +3 -0
  314. package/dist/llm/realtime.cjs.map +1 -1
  315. package/dist/llm/realtime.d.cts +15 -1
  316. package/dist/llm/realtime.d.ts +15 -1
  317. package/dist/llm/realtime.d.ts.map +1 -1
  318. package/dist/llm/realtime.js +3 -0
  319. package/dist/llm/realtime.js.map +1 -1
  320. package/dist/llm/remote_chat_context.cjs.map +1 -1
  321. package/dist/llm/remote_chat_context.d.cts +2 -0
  322. package/dist/llm/remote_chat_context.d.ts +2 -0
  323. package/dist/llm/remote_chat_context.d.ts.map +1 -1
  324. package/dist/llm/remote_chat_context.js.map +1 -1
  325. package/dist/llm/tool_context.cjs +50 -2
  326. package/dist/llm/tool_context.cjs.map +1 -1
  327. package/dist/llm/tool_context.d.cts +47 -11
  328. package/dist/llm/tool_context.d.ts +47 -11
  329. package/dist/llm/tool_context.d.ts.map +1 -1
  330. package/dist/llm/tool_context.js +48 -3
  331. package/dist/llm/tool_context.js.map +1 -1
  332. package/dist/llm/tool_context.test.cjs +197 -0
  333. package/dist/llm/tool_context.test.cjs.map +1 -1
  334. package/dist/llm/tool_context.test.js +175 -0
  335. package/dist/llm/tool_context.test.js.map +1 -1
  336. package/dist/llm/utils.cjs +18 -12
  337. package/dist/llm/utils.cjs.map +1 -1
  338. package/dist/llm/utils.d.cts +2 -3
  339. package/dist/llm/utils.d.ts +2 -3
  340. package/dist/llm/utils.d.ts.map +1 -1
  341. package/dist/llm/utils.js +18 -12
  342. package/dist/llm/utils.js.map +1 -1
  343. package/dist/llm/zod-utils.cjs +102 -0
  344. package/dist/llm/zod-utils.cjs.map +1 -0
  345. package/dist/llm/zod-utils.d.cts +65 -0
  346. package/dist/llm/zod-utils.d.ts +65 -0
  347. package/dist/llm/zod-utils.d.ts.map +1 -0
  348. package/dist/llm/zod-utils.js +64 -0
  349. package/dist/llm/zod-utils.js.map +1 -0
  350. package/dist/llm/zod-utils.test.cjs +472 -0
  351. package/dist/llm/zod-utils.test.cjs.map +1 -0
  352. package/dist/llm/zod-utils.test.js +455 -0
  353. package/dist/llm/zod-utils.test.js.map +1 -0
  354. package/dist/log.cjs +45 -14
  355. package/dist/log.cjs.map +1 -1
  356. package/dist/log.d.cts +8 -1
  357. package/dist/log.d.ts +8 -1
  358. package/dist/log.d.ts.map +1 -1
  359. package/dist/log.js +45 -15
  360. package/dist/log.js.map +1 -1
  361. package/dist/metrics/base.cjs.map +1 -1
  362. package/dist/metrics/base.d.cts +75 -19
  363. package/dist/metrics/base.d.ts +75 -19
  364. package/dist/metrics/base.d.ts.map +1 -1
  365. package/dist/metrics/index.cjs +5 -0
  366. package/dist/metrics/index.cjs.map +1 -1
  367. package/dist/metrics/index.d.cts +2 -1
  368. package/dist/metrics/index.d.ts +2 -1
  369. package/dist/metrics/index.d.ts.map +1 -1
  370. package/dist/metrics/index.js +6 -0
  371. package/dist/metrics/index.js.map +1 -1
  372. package/dist/metrics/model_usage.cjs +189 -0
  373. package/dist/metrics/model_usage.cjs.map +1 -0
  374. package/dist/metrics/model_usage.d.cts +92 -0
  375. package/dist/metrics/model_usage.d.ts +92 -0
  376. package/dist/metrics/model_usage.d.ts.map +1 -0
  377. package/dist/metrics/model_usage.js +164 -0
  378. package/dist/metrics/model_usage.js.map +1 -0
  379. package/dist/metrics/model_usage.test.cjs +474 -0
  380. package/dist/metrics/model_usage.test.cjs.map +1 -0
  381. package/dist/metrics/model_usage.test.js +476 -0
  382. package/dist/metrics/model_usage.test.js.map +1 -0
  383. package/dist/metrics/usage_collector.cjs +5 -2
  384. package/dist/metrics/usage_collector.cjs.map +1 -1
  385. package/dist/metrics/usage_collector.d.cts +10 -1
  386. package/dist/metrics/usage_collector.d.ts +10 -1
  387. package/dist/metrics/usage_collector.d.ts.map +1 -1
  388. package/dist/metrics/usage_collector.js +5 -2
  389. package/dist/metrics/usage_collector.js.map +1 -1
  390. package/dist/metrics/utils.cjs +23 -7
  391. package/dist/metrics/utils.cjs.map +1 -1
  392. package/dist/metrics/utils.d.ts.map +1 -1
  393. package/dist/metrics/utils.js +23 -7
  394. package/dist/metrics/utils.js.map +1 -1
  395. package/dist/stream/deferred_stream.cjs +31 -10
  396. package/dist/stream/deferred_stream.cjs.map +1 -1
  397. package/dist/stream/deferred_stream.d.cts +6 -1
  398. package/dist/stream/deferred_stream.d.ts +6 -1
  399. package/dist/stream/deferred_stream.d.ts.map +1 -1
  400. package/dist/stream/deferred_stream.js +31 -10
  401. package/dist/stream/deferred_stream.js.map +1 -1
  402. package/dist/stream/deferred_stream.test.cjs +2 -2
  403. package/dist/stream/deferred_stream.test.cjs.map +1 -1
  404. package/dist/stream/deferred_stream.test.js +2 -2
  405. package/dist/stream/deferred_stream.test.js.map +1 -1
  406. package/dist/stream/index.cjs +3 -0
  407. package/dist/stream/index.cjs.map +1 -1
  408. package/dist/stream/index.d.cts +1 -0
  409. package/dist/stream/index.d.ts +1 -0
  410. package/dist/stream/index.d.ts.map +1 -1
  411. package/dist/stream/index.js +2 -0
  412. package/dist/stream/index.js.map +1 -1
  413. package/dist/stream/multi_input_stream.cjs +139 -0
  414. package/dist/stream/multi_input_stream.cjs.map +1 -0
  415. package/dist/stream/multi_input_stream.d.cts +55 -0
  416. package/dist/stream/multi_input_stream.d.ts +55 -0
  417. package/dist/stream/multi_input_stream.d.ts.map +1 -0
  418. package/dist/stream/multi_input_stream.js +115 -0
  419. package/dist/stream/multi_input_stream.js.map +1 -0
  420. package/dist/stream/multi_input_stream.test.cjs +344 -0
  421. package/dist/stream/multi_input_stream.test.cjs.map +1 -0
  422. package/dist/stream/multi_input_stream.test.js +343 -0
  423. package/dist/stream/multi_input_stream.test.js.map +1 -0
  424. package/dist/stream/stream_channel.cjs +39 -1
  425. package/dist/stream/stream_channel.cjs.map +1 -1
  426. package/dist/stream/stream_channel.d.cts +5 -2
  427. package/dist/stream/stream_channel.d.ts +5 -2
  428. package/dist/stream/stream_channel.d.ts.map +1 -1
  429. package/dist/stream/stream_channel.js +39 -1
  430. package/dist/stream/stream_channel.js.map +1 -1
  431. package/dist/stream/stream_channel.test.cjs +27 -0
  432. package/dist/stream/stream_channel.test.cjs.map +1 -1
  433. package/dist/stream/stream_channel.test.js +27 -0
  434. package/dist/stream/stream_channel.test.js.map +1 -1
  435. package/dist/stt/stream_adapter.cjs +24 -9
  436. package/dist/stt/stream_adapter.cjs.map +1 -1
  437. package/dist/stt/stream_adapter.d.cts +7 -3
  438. package/dist/stt/stream_adapter.d.ts +7 -3
  439. package/dist/stt/stream_adapter.d.ts.map +1 -1
  440. package/dist/stt/stream_adapter.js +24 -9
  441. package/dist/stt/stream_adapter.js.map +1 -1
  442. package/dist/stt/stt.cjs +86 -19
  443. package/dist/stt/stt.cjs.map +1 -1
  444. package/dist/stt/stt.d.cts +60 -5
  445. package/dist/stt/stt.d.ts +60 -5
  446. package/dist/stt/stt.d.ts.map +1 -1
  447. package/dist/stt/stt.js +88 -21
  448. package/dist/stt/stt.js.map +1 -1
  449. package/dist/telemetry/index.cjs +72 -0
  450. package/dist/telemetry/index.cjs.map +1 -0
  451. package/dist/telemetry/index.d.cts +7 -0
  452. package/dist/telemetry/index.d.ts +7 -0
  453. package/dist/telemetry/index.d.ts.map +1 -0
  454. package/dist/telemetry/index.js +37 -0
  455. package/dist/telemetry/index.js.map +1 -0
  456. package/dist/telemetry/logging.cjs +65 -0
  457. package/dist/telemetry/logging.cjs.map +1 -0
  458. package/dist/telemetry/logging.d.cts +21 -0
  459. package/dist/telemetry/logging.d.ts +21 -0
  460. package/dist/telemetry/logging.d.ts.map +1 -0
  461. package/dist/telemetry/logging.js +40 -0
  462. package/dist/telemetry/logging.js.map +1 -0
  463. package/dist/telemetry/otel_http_exporter.cjs +166 -0
  464. package/dist/telemetry/otel_http_exporter.cjs.map +1 -0
  465. package/dist/telemetry/otel_http_exporter.d.cts +63 -0
  466. package/dist/telemetry/otel_http_exporter.d.ts +63 -0
  467. package/dist/telemetry/otel_http_exporter.d.ts.map +1 -0
  468. package/dist/telemetry/otel_http_exporter.js +142 -0
  469. package/dist/telemetry/otel_http_exporter.js.map +1 -0
  470. package/dist/telemetry/pino_otel_transport.cjs +217 -0
  471. package/dist/telemetry/pino_otel_transport.cjs.map +1 -0
  472. package/dist/telemetry/pino_otel_transport.d.cts +58 -0
  473. package/dist/telemetry/pino_otel_transport.d.ts +58 -0
  474. package/dist/telemetry/pino_otel_transport.d.ts.map +1 -0
  475. package/dist/telemetry/pino_otel_transport.js +189 -0
  476. package/dist/telemetry/pino_otel_transport.js.map +1 -0
  477. package/dist/telemetry/trace_types.cjs +233 -0
  478. package/dist/telemetry/trace_types.cjs.map +1 -0
  479. package/dist/telemetry/trace_types.d.cts +74 -0
  480. package/dist/telemetry/trace_types.d.ts +74 -0
  481. package/dist/telemetry/trace_types.d.ts.map +1 -0
  482. package/dist/telemetry/trace_types.js +141 -0
  483. package/dist/telemetry/trace_types.js.map +1 -0
  484. package/dist/telemetry/traces.cjs +484 -0
  485. package/dist/telemetry/traces.cjs.map +1 -0
  486. package/dist/telemetry/traces.d.cts +116 -0
  487. package/dist/telemetry/traces.d.ts +116 -0
  488. package/dist/telemetry/traces.d.ts.map +1 -0
  489. package/dist/telemetry/traces.js +449 -0
  490. package/dist/telemetry/traces.js.map +1 -0
  491. package/dist/telemetry/utils.cjs +86 -0
  492. package/dist/telemetry/utils.cjs.map +1 -0
  493. package/dist/telemetry/utils.d.cts +5 -0
  494. package/dist/telemetry/utils.d.ts +5 -0
  495. package/dist/telemetry/utils.d.ts.map +1 -0
  496. package/dist/telemetry/utils.js +51 -0
  497. package/dist/telemetry/utils.js.map +1 -0
  498. package/dist/tokenize/basic/sentence.cjs +3 -3
  499. package/dist/tokenize/basic/sentence.cjs.map +1 -1
  500. package/dist/tokenize/basic/sentence.js +3 -3
  501. package/dist/tokenize/basic/sentence.js.map +1 -1
  502. package/dist/tokenize/tokenizer.test.cjs +3 -1
  503. package/dist/tokenize/tokenizer.test.cjs.map +1 -1
  504. package/dist/tokenize/tokenizer.test.js +3 -1
  505. package/dist/tokenize/tokenizer.test.js.map +1 -1
  506. package/dist/transcription.cjs.map +1 -1
  507. package/dist/transcription.d.cts +6 -0
  508. package/dist/transcription.d.ts +6 -0
  509. package/dist/transcription.d.ts.map +1 -1
  510. package/dist/transcription.js.map +1 -1
  511. package/dist/tts/fallback_adapter.cjs +466 -0
  512. package/dist/tts/fallback_adapter.cjs.map +1 -0
  513. package/dist/tts/fallback_adapter.d.cts +110 -0
  514. package/dist/tts/fallback_adapter.d.ts +110 -0
  515. package/dist/tts/fallback_adapter.d.ts.map +1 -0
  516. package/dist/tts/fallback_adapter.js +442 -0
  517. package/dist/tts/fallback_adapter.js.map +1 -0
  518. package/dist/tts/index.cjs +3 -0
  519. package/dist/tts/index.cjs.map +1 -1
  520. package/dist/tts/index.d.cts +1 -0
  521. package/dist/tts/index.d.ts +1 -0
  522. package/dist/tts/index.d.ts.map +1 -1
  523. package/dist/tts/index.js +2 -0
  524. package/dist/tts/index.js.map +1 -1
  525. package/dist/tts/stream_adapter.cjs +25 -8
  526. package/dist/tts/stream_adapter.cjs.map +1 -1
  527. package/dist/tts/stream_adapter.d.cts +6 -3
  528. package/dist/tts/stream_adapter.d.ts +6 -3
  529. package/dist/tts/stream_adapter.d.ts.map +1 -1
  530. package/dist/tts/stream_adapter.js +25 -8
  531. package/dist/tts/stream_adapter.js.map +1 -1
  532. package/dist/tts/tts.cjs +189 -57
  533. package/dist/tts/tts.cjs.map +1 -1
  534. package/dist/tts/tts.d.cts +58 -6
  535. package/dist/tts/tts.d.ts +58 -6
  536. package/dist/tts/tts.d.ts.map +1 -1
  537. package/dist/tts/tts.js +191 -59
  538. package/dist/tts/tts.js.map +1 -1
  539. package/dist/types.cjs +24 -32
  540. package/dist/types.cjs.map +1 -1
  541. package/dist/types.d.cts +45 -10
  542. package/dist/types.d.ts +45 -10
  543. package/dist/types.d.ts.map +1 -1
  544. package/dist/types.js +20 -30
  545. package/dist/types.js.map +1 -1
  546. package/dist/utils.cjs +122 -26
  547. package/dist/utils.cjs.map +1 -1
  548. package/dist/utils.d.cts +41 -1
  549. package/dist/utils.d.ts +41 -1
  550. package/dist/utils.d.ts.map +1 -1
  551. package/dist/utils.js +117 -25
  552. package/dist/utils.js.map +1 -1
  553. package/dist/utils.test.cjs +73 -1
  554. package/dist/utils.test.cjs.map +1 -1
  555. package/dist/utils.test.js +74 -10
  556. package/dist/utils.test.js.map +1 -1
  557. package/dist/vad.cjs +35 -15
  558. package/dist/vad.cjs.map +1 -1
  559. package/dist/vad.d.cts +15 -5
  560. package/dist/vad.d.ts +15 -5
  561. package/dist/vad.d.ts.map +1 -1
  562. package/dist/vad.js +35 -15
  563. package/dist/vad.js.map +1 -1
  564. package/dist/version.cjs +1 -1
  565. package/dist/version.cjs.map +1 -1
  566. package/dist/version.d.cts +1 -1
  567. package/dist/version.d.ts +1 -1
  568. package/dist/version.d.ts.map +1 -1
  569. package/dist/version.js +1 -1
  570. package/dist/version.js.map +1 -1
  571. package/dist/voice/agent.cjs +258 -35
  572. package/dist/voice/agent.cjs.map +1 -1
  573. package/dist/voice/agent.d.cts +54 -13
  574. package/dist/voice/agent.d.ts +54 -13
  575. package/dist/voice/agent.d.ts.map +1 -1
  576. package/dist/voice/agent.js +254 -34
  577. package/dist/voice/agent.js.map +1 -1
  578. package/dist/voice/agent.test.cjs +314 -0
  579. package/dist/voice/agent.test.cjs.map +1 -1
  580. package/dist/voice/agent.test.js +316 -2
  581. package/dist/voice/agent.test.js.map +1 -1
  582. package/dist/voice/agent_activity.cjs +1116 -385
  583. package/dist/voice/agent_activity.cjs.map +1 -1
  584. package/dist/voice/agent_activity.d.cts +72 -11
  585. package/dist/voice/agent_activity.d.ts +72 -11
  586. package/dist/voice/agent_activity.d.ts.map +1 -1
  587. package/dist/voice/agent_activity.js +1119 -383
  588. package/dist/voice/agent_activity.js.map +1 -1
  589. package/dist/voice/agent_activity.test.cjs +135 -0
  590. package/dist/voice/agent_activity.test.cjs.map +1 -0
  591. package/dist/voice/agent_activity.test.js +134 -0
  592. package/dist/voice/agent_activity.test.js.map +1 -0
  593. package/dist/voice/agent_session.cjs +550 -90
  594. package/dist/voice/agent_session.cjs.map +1 -1
  595. package/dist/voice/agent_session.d.cts +185 -25
  596. package/dist/voice/agent_session.d.ts +185 -25
  597. package/dist/voice/agent_session.d.ts.map +1 -1
  598. package/dist/voice/agent_session.js +556 -91
  599. package/dist/voice/agent_session.js.map +1 -1
  600. package/dist/voice/audio_recognition.cjs +605 -46
  601. package/dist/voice/audio_recognition.cjs.map +1 -1
  602. package/dist/voice/audio_recognition.d.cts +96 -4
  603. package/dist/voice/audio_recognition.d.ts +96 -4
  604. package/dist/voice/audio_recognition.d.ts.map +1 -1
  605. package/dist/voice/audio_recognition.js +611 -47
  606. package/dist/voice/audio_recognition.js.map +1 -1
  607. package/dist/voice/audio_recognition_span.test.cjs +295 -0
  608. package/dist/voice/audio_recognition_span.test.cjs.map +1 -0
  609. package/dist/voice/audio_recognition_span.test.js +299 -0
  610. package/dist/voice/audio_recognition_span.test.js.map +1 -0
  611. package/dist/voice/avatar/datastream_io.cjs +7 -1
  612. package/dist/voice/avatar/datastream_io.cjs.map +1 -1
  613. package/dist/voice/avatar/datastream_io.d.cts +1 -0
  614. package/dist/voice/avatar/datastream_io.d.ts +1 -0
  615. package/dist/voice/avatar/datastream_io.d.ts.map +1 -1
  616. package/dist/voice/avatar/datastream_io.js +7 -1
  617. package/dist/voice/avatar/datastream_io.js.map +1 -1
  618. package/dist/voice/background_audio.cjs +367 -0
  619. package/dist/voice/background_audio.cjs.map +1 -0
  620. package/dist/voice/background_audio.d.cts +123 -0
  621. package/dist/voice/background_audio.d.ts +123 -0
  622. package/dist/voice/background_audio.d.ts.map +1 -0
  623. package/dist/voice/background_audio.js +343 -0
  624. package/dist/voice/background_audio.js.map +1 -0
  625. package/dist/voice/events.cjs +3 -0
  626. package/dist/voice/events.cjs.map +1 -1
  627. package/dist/voice/events.d.cts +16 -9
  628. package/dist/voice/events.d.ts +16 -9
  629. package/dist/voice/events.d.ts.map +1 -1
  630. package/dist/voice/events.js +3 -0
  631. package/dist/voice/events.js.map +1 -1
  632. package/dist/voice/generation.cjs +205 -41
  633. package/dist/voice/generation.cjs.map +1 -1
  634. package/dist/voice/generation.d.cts +21 -5
  635. package/dist/voice/generation.d.ts +21 -5
  636. package/dist/voice/generation.d.ts.map +1 -1
  637. package/dist/voice/generation.js +215 -43
  638. package/dist/voice/generation.js.map +1 -1
  639. package/dist/voice/generation_tools.test.cjs +236 -0
  640. package/dist/voice/generation_tools.test.cjs.map +1 -0
  641. package/dist/voice/generation_tools.test.js +235 -0
  642. package/dist/voice/generation_tools.test.js.map +1 -0
  643. package/dist/voice/index.cjs +33 -2
  644. package/dist/voice/index.cjs.map +1 -1
  645. package/dist/voice/index.d.cts +8 -2
  646. package/dist/voice/index.d.ts +8 -2
  647. package/dist/voice/index.d.ts.map +1 -1
  648. package/dist/voice/index.js +19 -2
  649. package/dist/voice/index.js.map +1 -1
  650. package/dist/voice/interruption_detection.test.cjs +114 -0
  651. package/dist/voice/interruption_detection.test.cjs.map +1 -0
  652. package/dist/voice/interruption_detection.test.js +113 -0
  653. package/dist/voice/interruption_detection.test.js.map +1 -0
  654. package/dist/voice/io.cjs +66 -6
  655. package/dist/voice/io.cjs.map +1 -1
  656. package/dist/voice/io.d.cts +67 -7
  657. package/dist/voice/io.d.ts +67 -7
  658. package/dist/voice/io.d.ts.map +1 -1
  659. package/dist/voice/io.js +62 -5
  660. package/dist/voice/io.js.map +1 -1
  661. package/dist/voice/recorder_io/index.cjs +23 -0
  662. package/dist/voice/recorder_io/index.cjs.map +1 -0
  663. package/dist/voice/recorder_io/index.d.cts +2 -0
  664. package/dist/voice/recorder_io/index.d.ts +2 -0
  665. package/dist/voice/recorder_io/index.d.ts.map +1 -0
  666. package/dist/voice/recorder_io/index.js +2 -0
  667. package/dist/voice/recorder_io/index.js.map +1 -0
  668. package/dist/voice/recorder_io/recorder_io.cjs +607 -0
  669. package/dist/voice/recorder_io/recorder_io.cjs.map +1 -0
  670. package/dist/voice/recorder_io/recorder_io.d.cts +106 -0
  671. package/dist/voice/recorder_io/recorder_io.d.ts +106 -0
  672. package/dist/voice/recorder_io/recorder_io.d.ts.map +1 -0
  673. package/dist/voice/recorder_io/recorder_io.js +573 -0
  674. package/dist/voice/recorder_io/recorder_io.js.map +1 -0
  675. package/dist/voice/remote_session.cjs +922 -0
  676. package/dist/voice/remote_session.cjs.map +1 -0
  677. package/dist/voice/remote_session.d.cts +108 -0
  678. package/dist/voice/remote_session.d.ts +108 -0
  679. package/dist/voice/remote_session.d.ts.map +1 -0
  680. package/dist/voice/remote_session.js +887 -0
  681. package/dist/voice/remote_session.js.map +1 -0
  682. package/dist/voice/report.cjs +88 -0
  683. package/dist/voice/report.cjs.map +1 -0
  684. package/dist/voice/report.d.cts +49 -0
  685. package/dist/voice/report.d.ts +49 -0
  686. package/dist/voice/report.d.ts.map +1 -0
  687. package/dist/voice/report.js +63 -0
  688. package/dist/voice/report.js.map +1 -0
  689. package/dist/voice/report.test.cjs +121 -0
  690. package/dist/voice/report.test.cjs.map +1 -0
  691. package/dist/voice/report.test.js +120 -0
  692. package/dist/voice/report.test.js.map +1 -0
  693. package/dist/voice/room_io/_input.cjs +40 -7
  694. package/dist/voice/room_io/_input.cjs.map +1 -1
  695. package/dist/voice/room_io/_input.d.cts +5 -2
  696. package/dist/voice/room_io/_input.d.ts +5 -2
  697. package/dist/voice/room_io/_input.d.ts.map +1 -1
  698. package/dist/voice/room_io/_input.js +41 -8
  699. package/dist/voice/room_io/_input.js.map +1 -1
  700. package/dist/voice/room_io/_output.cjs +19 -11
  701. package/dist/voice/room_io/_output.cjs.map +1 -1
  702. package/dist/voice/room_io/_output.d.cts +7 -4
  703. package/dist/voice/room_io/_output.d.ts +7 -4
  704. package/dist/voice/room_io/_output.d.ts.map +1 -1
  705. package/dist/voice/room_io/_output.js +20 -12
  706. package/dist/voice/room_io/_output.js.map +1 -1
  707. package/dist/voice/room_io/room_io.cjs +33 -6
  708. package/dist/voice/room_io/room_io.cjs.map +1 -1
  709. package/dist/voice/room_io/room_io.d.cts +29 -9
  710. package/dist/voice/room_io/room_io.d.ts +29 -9
  711. package/dist/voice/room_io/room_io.d.ts.map +1 -1
  712. package/dist/voice/room_io/room_io.js +33 -7
  713. package/dist/voice/room_io/room_io.js.map +1 -1
  714. package/dist/voice/speech_handle.cjs +22 -4
  715. package/dist/voice/speech_handle.cjs.map +1 -1
  716. package/dist/voice/speech_handle.d.cts +17 -2
  717. package/dist/voice/speech_handle.d.ts +17 -2
  718. package/dist/voice/speech_handle.d.ts.map +1 -1
  719. package/dist/voice/speech_handle.js +21 -4
  720. package/dist/voice/speech_handle.js.map +1 -1
  721. package/dist/voice/testing/fake_llm.cjs +127 -0
  722. package/dist/voice/testing/fake_llm.cjs.map +1 -0
  723. package/dist/voice/testing/fake_llm.d.cts +30 -0
  724. package/dist/voice/testing/fake_llm.d.ts +30 -0
  725. package/dist/voice/testing/fake_llm.d.ts.map +1 -0
  726. package/dist/voice/testing/fake_llm.js +103 -0
  727. package/dist/voice/testing/fake_llm.js.map +1 -0
  728. package/dist/voice/testing/index.cjs +57 -0
  729. package/dist/voice/testing/index.cjs.map +1 -0
  730. package/dist/voice/testing/index.d.cts +21 -0
  731. package/dist/voice/testing/index.d.ts +21 -0
  732. package/dist/voice/testing/index.d.ts.map +1 -0
  733. package/dist/voice/testing/index.js +35 -0
  734. package/dist/voice/testing/index.js.map +1 -0
  735. package/dist/voice/testing/run_result.cjs +817 -0
  736. package/dist/voice/testing/run_result.cjs.map +1 -0
  737. package/dist/voice/testing/run_result.d.cts +385 -0
  738. package/dist/voice/testing/run_result.d.ts +385 -0
  739. package/dist/voice/testing/run_result.d.ts.map +1 -0
  740. package/dist/voice/testing/run_result.js +790 -0
  741. package/dist/voice/testing/run_result.js.map +1 -0
  742. package/dist/voice/testing/types.cjs +46 -0
  743. package/dist/voice/testing/types.cjs.map +1 -0
  744. package/dist/voice/testing/types.d.cts +83 -0
  745. package/dist/voice/testing/types.d.ts +83 -0
  746. package/dist/voice/testing/types.d.ts.map +1 -0
  747. package/dist/voice/testing/types.js +19 -0
  748. package/dist/voice/testing/types.js.map +1 -0
  749. package/dist/voice/transcription/synchronizer.cjs +139 -15
  750. package/dist/voice/transcription/synchronizer.cjs.map +1 -1
  751. package/dist/voice/transcription/synchronizer.d.cts +35 -4
  752. package/dist/voice/transcription/synchronizer.d.ts +35 -4
  753. package/dist/voice/transcription/synchronizer.d.ts.map +1 -1
  754. package/dist/voice/transcription/synchronizer.js +143 -16
  755. package/dist/voice/transcription/synchronizer.js.map +1 -1
  756. package/dist/voice/transcription/synchronizer.test.cjs +151 -0
  757. package/dist/voice/transcription/synchronizer.test.cjs.map +1 -0
  758. package/dist/voice/transcription/synchronizer.test.js +150 -0
  759. package/dist/voice/transcription/synchronizer.test.js.map +1 -0
  760. package/dist/voice/turn_config/endpointing.cjs +33 -0
  761. package/dist/voice/turn_config/endpointing.cjs.map +1 -0
  762. package/dist/voice/turn_config/endpointing.d.cts +30 -0
  763. package/dist/voice/turn_config/endpointing.d.ts +30 -0
  764. package/dist/voice/turn_config/endpointing.d.ts.map +1 -0
  765. package/dist/voice/turn_config/endpointing.js +9 -0
  766. package/dist/voice/turn_config/endpointing.js.map +1 -0
  767. package/dist/voice/turn_config/interruption.cjs +37 -0
  768. package/dist/voice/turn_config/interruption.cjs.map +1 -0
  769. package/dist/voice/turn_config/interruption.d.cts +53 -0
  770. package/dist/voice/turn_config/interruption.d.ts +53 -0
  771. package/dist/voice/turn_config/interruption.d.ts.map +1 -0
  772. package/dist/voice/turn_config/interruption.js +13 -0
  773. package/dist/voice/turn_config/interruption.js.map +1 -0
  774. package/dist/voice/turn_config/turn_handling.cjs +35 -0
  775. package/dist/voice/turn_config/turn_handling.cjs.map +1 -0
  776. package/dist/voice/turn_config/turn_handling.d.cts +36 -0
  777. package/dist/voice/turn_config/turn_handling.d.ts +36 -0
  778. package/dist/voice/turn_config/turn_handling.d.ts.map +1 -0
  779. package/dist/voice/turn_config/turn_handling.js +11 -0
  780. package/dist/voice/turn_config/turn_handling.js.map +1 -0
  781. package/dist/voice/turn_config/utils.cjs +157 -0
  782. package/dist/voice/turn_config/utils.cjs.map +1 -0
  783. package/dist/voice/turn_config/utils.d.cts +37 -0
  784. package/dist/voice/turn_config/utils.d.ts +37 -0
  785. package/dist/voice/turn_config/utils.d.ts.map +1 -0
  786. package/dist/voice/turn_config/utils.js +131 -0
  787. package/dist/voice/turn_config/utils.js.map +1 -0
  788. package/dist/voice/turn_config/utils.test.cjs +128 -0
  789. package/dist/voice/turn_config/utils.test.cjs.map +1 -0
  790. package/dist/voice/turn_config/utils.test.js +127 -0
  791. package/dist/voice/turn_config/utils.test.js.map +1 -0
  792. package/dist/voice/utils.cjs +47 -0
  793. package/dist/voice/utils.cjs.map +1 -0
  794. package/dist/voice/utils.d.cts +4 -0
  795. package/dist/voice/utils.d.ts +4 -0
  796. package/dist/voice/utils.d.ts.map +1 -0
  797. package/dist/voice/utils.js +23 -0
  798. package/dist/voice/utils.js.map +1 -0
  799. package/dist/worker.cjs +44 -52
  800. package/dist/worker.cjs.map +1 -1
  801. package/dist/worker.d.cts +18 -8
  802. package/dist/worker.d.ts +18 -8
  803. package/dist/worker.d.ts.map +1 -1
  804. package/dist/worker.js +43 -43
  805. package/dist/worker.js.map +1 -1
  806. package/package.json +32 -12
  807. package/resources/NOTICE +2 -0
  808. package/resources/keyboard-typing.ogg +0 -0
  809. package/resources/keyboard-typing2.ogg +0 -0
  810. package/resources/office-ambience.ogg +0 -0
  811. package/src/audio.ts +132 -1
  812. package/src/beta/index.ts +9 -0
  813. package/src/beta/workflows/index.ts +9 -0
  814. package/src/beta/workflows/task_group.ts +194 -0
  815. package/src/cli.ts +57 -66
  816. package/src/connection_pool.test.ts +346 -0
  817. package/src/connection_pool.ts +307 -0
  818. package/src/constants.ts +14 -0
  819. package/src/cpu.test.ts +239 -0
  820. package/src/cpu.ts +173 -0
  821. package/src/http_server.ts +18 -6
  822. package/src/index.ts +15 -13
  823. package/src/inference/api_protos.ts +85 -2
  824. package/src/inference/index.ts +32 -4
  825. package/src/inference/interruption/defaults.ts +51 -0
  826. package/src/inference/interruption/errors.ts +25 -0
  827. package/src/inference/interruption/http_transport.ts +206 -0
  828. package/src/inference/interruption/interruption_cache_entry.ts +50 -0
  829. package/src/inference/interruption/interruption_detector.ts +204 -0
  830. package/src/inference/interruption/interruption_stream.ts +467 -0
  831. package/src/inference/interruption/types.ts +84 -0
  832. package/src/inference/interruption/utils.test.ts +132 -0
  833. package/src/inference/interruption/utils.ts +137 -0
  834. package/src/inference/interruption/ws_transport.ts +406 -0
  835. package/src/inference/llm.ts +214 -163
  836. package/src/inference/stt.test.ts +253 -0
  837. package/src/inference/stt.ts +449 -208
  838. package/src/inference/tts.test.ts +267 -0
  839. package/src/inference/tts.ts +377 -115
  840. package/src/inference/utils.ts +30 -2
  841. package/src/ipc/inference_proc_executor.ts +11 -3
  842. package/src/ipc/inference_proc_lazy_main.ts +13 -1
  843. package/src/ipc/job_proc_executor.ts +11 -1
  844. package/src/ipc/job_proc_lazy_main.ts +86 -20
  845. package/src/ipc/supervised_proc.test.ts +153 -0
  846. package/src/ipc/supervised_proc.ts +39 -10
  847. package/src/job.ts +120 -1
  848. package/src/language.test.ts +62 -0
  849. package/src/language.ts +380 -0
  850. package/src/llm/__snapshots__/zod-utils.test.ts.snap +559 -0
  851. package/src/llm/chat_context.test.ts +655 -0
  852. package/src/llm/chat_context.ts +412 -2
  853. package/src/llm/fallback_adapter.test.ts +238 -0
  854. package/src/llm/fallback_adapter.ts +391 -0
  855. package/src/llm/index.ts +11 -0
  856. package/src/llm/llm.ts +77 -12
  857. package/src/llm/provider_format/google.test.ts +72 -1
  858. package/src/llm/provider_format/google.ts +10 -6
  859. package/src/llm/provider_format/index.ts +7 -2
  860. package/src/llm/provider_format/openai.test.ts +480 -2
  861. package/src/llm/provider_format/openai.ts +152 -21
  862. package/src/llm/provider_format/utils.ts +11 -5
  863. package/src/llm/realtime.ts +23 -2
  864. package/src/llm/remote_chat_context.ts +2 -2
  865. package/src/llm/tool_context.test.ts +210 -1
  866. package/src/llm/tool_context.ts +115 -17
  867. package/src/llm/utils.ts +24 -16
  868. package/src/llm/zod-utils.test.ts +577 -0
  869. package/src/llm/zod-utils.ts +153 -0
  870. package/src/log.ts +71 -19
  871. package/src/metrics/base.ts +78 -19
  872. package/src/metrics/index.ts +12 -0
  873. package/src/metrics/model_usage.test.ts +545 -0
  874. package/src/metrics/model_usage.ts +262 -0
  875. package/src/metrics/usage_collector.ts +14 -3
  876. package/src/metrics/utils.ts +27 -7
  877. package/src/stream/deferred_stream.test.ts +3 -3
  878. package/src/stream/deferred_stream.ts +43 -11
  879. package/src/stream/index.ts +1 -0
  880. package/src/stream/multi_input_stream.test.ts +545 -0
  881. package/src/stream/multi_input_stream.ts +172 -0
  882. package/src/stream/stream_channel.test.ts +37 -0
  883. package/src/stream/stream_channel.ts +43 -3
  884. package/src/stt/stream_adapter.ts +30 -9
  885. package/src/stt/stt.ts +131 -22
  886. package/src/telemetry/index.ts +28 -0
  887. package/src/telemetry/logging.ts +55 -0
  888. package/src/telemetry/otel_http_exporter.ts +218 -0
  889. package/src/telemetry/pino_otel_transport.ts +265 -0
  890. package/src/telemetry/trace_types.ts +109 -0
  891. package/src/telemetry/traces.ts +673 -0
  892. package/src/telemetry/utils.ts +61 -0
  893. package/src/tokenize/basic/sentence.ts +3 -3
  894. package/src/tokenize/tokenizer.test.ts +4 -0
  895. package/src/transcription.ts +6 -0
  896. package/src/tts/fallback_adapter.ts +579 -0
  897. package/src/tts/index.ts +1 -0
  898. package/src/tts/stream_adapter.ts +38 -8
  899. package/src/tts/tts.ts +245 -62
  900. package/src/types.ts +62 -33
  901. package/src/utils.test.ts +90 -10
  902. package/src/utils.ts +176 -31
  903. package/src/vad.ts +42 -18
  904. package/src/version.ts +1 -1
  905. package/src/voice/agent.test.ts +347 -2
  906. package/src/voice/agent.ts +346 -44
  907. package/src/voice/agent_activity.test.ts +194 -0
  908. package/src/voice/agent_activity.ts +1457 -388
  909. package/src/voice/agent_session.ts +817 -112
  910. package/src/voice/audio_recognition.ts +845 -70
  911. package/src/voice/audio_recognition_span.test.ts +341 -0
  912. package/src/voice/avatar/datastream_io.ts +9 -1
  913. package/src/voice/background_audio.ts +494 -0
  914. package/src/voice/events.ts +27 -7
  915. package/src/voice/generation.ts +310 -56
  916. package/src/voice/generation_tools.test.ts +268 -0
  917. package/src/voice/index.ts +17 -3
  918. package/src/voice/interruption_detection.test.ts +151 -0
  919. package/src/voice/io.ts +115 -12
  920. package/src/voice/recorder_io/index.ts +4 -0
  921. package/src/voice/recorder_io/recorder_io.ts +783 -0
  922. package/src/voice/remote_session.ts +1083 -0
  923. package/src/voice/report.test.ts +136 -0
  924. package/src/voice/report.ts +140 -0
  925. package/src/voice/room_io/_input.ts +45 -10
  926. package/src/voice/room_io/_output.ts +26 -14
  927. package/src/voice/room_io/room_io.ts +67 -22
  928. package/src/voice/speech_handle.ts +38 -6
  929. package/src/voice/testing/fake_llm.ts +138 -0
  930. package/src/voice/testing/index.ts +52 -0
  931. package/src/voice/testing/run_result.ts +995 -0
  932. package/src/voice/testing/types.ts +118 -0
  933. package/src/voice/transcription/synchronizer.test.ts +206 -0
  934. package/src/voice/transcription/synchronizer.ts +204 -19
  935. package/src/voice/turn_config/endpointing.ts +33 -0
  936. package/src/voice/turn_config/interruption.ts +56 -0
  937. package/src/voice/turn_config/turn_handling.ts +45 -0
  938. package/src/voice/turn_config/utils.test.ts +148 -0
  939. package/src/voice/turn_config/utils.ts +167 -0
  940. package/src/voice/utils.ts +29 -0
  941. package/src/worker.ts +92 -78
  942. package/src/llm/__snapshots__/utils.test.ts.snap +0 -65
@@ -0,0 +1,55 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import type { ReadableStream } from 'node:stream/web';
3
+ /**
4
+ * A fan-in multiplexer that merges multiple {@link ReadableStream} inputs into
5
+ * a single output {@link ReadableStream}. Inputs can be dynamically added and
6
+ * removed at any time while the stream is open.
7
+ *
8
+ * Unlike {@link DeferredReadableStream} which supports a single readable source,
9
+ * `MultiInputStream` allows N concurrent input streams to pump data into one output.
10
+ *
11
+ * Key behaviors:
12
+ * - An error in one input removes that input but does **not** kill the output.
13
+ * - When all inputs end or are removed, the output stays open (waiting for new inputs).
14
+ * - The output only closes when {@link close} is called explicitly.
15
+ * - {@link removeInputStream} releases the reader lock so the source can be reused.
16
+ */
17
+ export declare class MultiInputStream<T> {
18
+ private transform;
19
+ private writer;
20
+ private inputs;
21
+ private pumpPromises;
22
+ private nextId;
23
+ private _closed;
24
+ private logger;
25
+ constructor();
26
+ /** The single output stream that consumers read from. */
27
+ get stream(): ReadableStream<T>;
28
+ /** Number of currently active input streams. */
29
+ get inputCount(): number;
30
+ /** Whether {@link close} has been called. */
31
+ get isClosed(): boolean;
32
+ /**
33
+ * Add an input {@link ReadableStream} that will be pumped into the output.
34
+ *
35
+ * @returns A unique identifier that can be passed to {@link removeInputStream}.
36
+ * @throws If the stream has already been closed.
37
+ */
38
+ addInputStream(source: ReadableStream<T>): string;
39
+ /**
40
+ * Detach an input stream by its ID and release the reader lock so the
41
+ * source stream can be reused elsewhere.
42
+ *
43
+ * No-op if the ID does not exist (e.g. the input already ended or was removed).
44
+ */
45
+ removeInputStream(id: string): Promise<void>;
46
+ /**
47
+ * Close the output stream and detach all inputs.
48
+ *
49
+ * Idempotent — calling more than once is a no-op.
50
+ */
51
+ close(): Promise<void>;
52
+ private shouldStopPumping;
53
+ private pumpInput;
54
+ }
55
+ //# sourceMappingURL=multi_input_stream.d.ts.map
@@ -0,0 +1,55 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import type { ReadableStream } from 'node:stream/web';
3
+ /**
4
+ * A fan-in multiplexer that merges multiple {@link ReadableStream} inputs into
5
+ * a single output {@link ReadableStream}. Inputs can be dynamically added and
6
+ * removed at any time while the stream is open.
7
+ *
8
+ * Unlike {@link DeferredReadableStream} which supports a single readable source,
9
+ * `MultiInputStream` allows N concurrent input streams to pump data into one output.
10
+ *
11
+ * Key behaviors:
12
+ * - An error in one input removes that input but does **not** kill the output.
13
+ * - When all inputs end or are removed, the output stays open (waiting for new inputs).
14
+ * - The output only closes when {@link close} is called explicitly.
15
+ * - {@link removeInputStream} releases the reader lock so the source can be reused.
16
+ */
17
+ export declare class MultiInputStream<T> {
18
+ private transform;
19
+ private writer;
20
+ private inputs;
21
+ private pumpPromises;
22
+ private nextId;
23
+ private _closed;
24
+ private logger;
25
+ constructor();
26
+ /** The single output stream that consumers read from. */
27
+ get stream(): ReadableStream<T>;
28
+ /** Number of currently active input streams. */
29
+ get inputCount(): number;
30
+ /** Whether {@link close} has been called. */
31
+ get isClosed(): boolean;
32
+ /**
33
+ * Add an input {@link ReadableStream} that will be pumped into the output.
34
+ *
35
+ * @returns A unique identifier that can be passed to {@link removeInputStream}.
36
+ * @throws If the stream has already been closed.
37
+ */
38
+ addInputStream(source: ReadableStream<T>): string;
39
+ /**
40
+ * Detach an input stream by its ID and release the reader lock so the
41
+ * source stream can be reused elsewhere.
42
+ *
43
+ * No-op if the ID does not exist (e.g. the input already ended or was removed).
44
+ */
45
+ removeInputStream(id: string): Promise<void>;
46
+ /**
47
+ * Close the output stream and detach all inputs.
48
+ *
49
+ * Idempotent — calling more than once is a no-op.
50
+ */
51
+ close(): Promise<void>;
52
+ private shouldStopPumping;
53
+ private pumpInput;
54
+ }
55
+ //# sourceMappingURL=multi_input_stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi_input_stream.d.ts","sourceRoot":"","sources":["../../src/stream/multi_input_stream.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,iBAAiB,CAAC;AAKzB;;;;;;;;;;;;;GAaG;AACH,qBAAa,gBAAgB,CAAC,CAAC;IAC7B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,MAAM,CAA0D;IACxE,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;;IAOvB,yDAAyD;IACzD,IAAI,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,CAE9B;IAED,gDAAgD;IAChD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,6CAA6C;IAC7C,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;;;OAKG;IACH,cAAc,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,MAAM;IAejD;;;;;OAKG;IACG,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBlD;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B5B,OAAO,CAAC,iBAAiB;YAIX,SAAS;CAiCxB"}
@@ -0,0 +1,115 @@
1
+ import { log } from "../log.js";
2
+ import { isStreamReaderReleaseError } from "./deferred_stream.js";
3
+ import { IdentityTransform } from "./identity_transform.js";
4
+ class MultiInputStream {
5
+ transform;
6
+ writer;
7
+ inputs = /* @__PURE__ */ new Map();
8
+ pumpPromises = /* @__PURE__ */ new Map();
9
+ nextId = 0;
10
+ _closed = false;
11
+ logger = log();
12
+ constructor() {
13
+ this.transform = new IdentityTransform();
14
+ this.writer = this.transform.writable.getWriter();
15
+ }
16
+ /** The single output stream that consumers read from. */
17
+ get stream() {
18
+ return this.transform.readable;
19
+ }
20
+ /** Number of currently active input streams. */
21
+ get inputCount() {
22
+ return this.inputs.size;
23
+ }
24
+ /** Whether {@link close} has been called. */
25
+ get isClosed() {
26
+ return this._closed;
27
+ }
28
+ /**
29
+ * Add an input {@link ReadableStream} that will be pumped into the output.
30
+ *
31
+ * @returns A unique identifier that can be passed to {@link removeInputStream}.
32
+ * @throws If the stream has already been closed.
33
+ */
34
+ addInputStream(source) {
35
+ if (this._closed) {
36
+ throw new Error("MultiInputStream is closed");
37
+ }
38
+ const id = `input-${this.nextId++}`;
39
+ const reader = source.getReader();
40
+ this.inputs.set(id, reader);
41
+ const pumpDone = this.pumpInput(id, reader);
42
+ this.pumpPromises.set(id, pumpDone);
43
+ return id;
44
+ }
45
+ /**
46
+ * Detach an input stream by its ID and release the reader lock so the
47
+ * source stream can be reused elsewhere.
48
+ *
49
+ * No-op if the ID does not exist (e.g. the input already ended or was removed).
50
+ */
51
+ async removeInputStream(id) {
52
+ const reader = this.inputs.get(id);
53
+ if (!reader) return;
54
+ this.inputs.delete(id);
55
+ reader.releaseLock();
56
+ const pump = this.pumpPromises.get(id);
57
+ if (pump) {
58
+ await pump;
59
+ this.pumpPromises.delete(id);
60
+ }
61
+ }
62
+ /**
63
+ * Close the output stream and detach all inputs.
64
+ *
65
+ * Idempotent — calling more than once is a no-op.
66
+ */
67
+ async close() {
68
+ if (this._closed) return;
69
+ this._closed = true;
70
+ for (const reader of this.inputs.values()) {
71
+ reader.releaseLock();
72
+ }
73
+ this.inputs.clear();
74
+ await Promise.allSettled([...this.pumpPromises.values()]);
75
+ this.pumpPromises.clear();
76
+ try {
77
+ this.writer.releaseLock();
78
+ } catch {
79
+ }
80
+ try {
81
+ await this.transform.writable.close();
82
+ } catch {
83
+ }
84
+ }
85
+ shouldStopPumping(id) {
86
+ return this._closed || !this.inputs.has(id);
87
+ }
88
+ async pumpInput(id, reader) {
89
+ try {
90
+ while (true) {
91
+ if (this.shouldStopPumping(id)) break;
92
+ const { done, value } = await reader.read();
93
+ if (done) break;
94
+ if (this.shouldStopPumping(id)) break;
95
+ await this.writer.write(value);
96
+ }
97
+ } catch (e) {
98
+ if (isStreamReaderReleaseError(e)) {
99
+ return;
100
+ }
101
+ this.logger.error({ error: e }, "Error pumping input stream from MultiInputStream");
102
+ } finally {
103
+ try {
104
+ reader.releaseLock();
105
+ } catch {
106
+ }
107
+ this.inputs.delete(id);
108
+ this.pumpPromises.delete(id);
109
+ }
110
+ }
111
+ }
112
+ export {
113
+ MultiInputStream
114
+ };
115
+ //# sourceMappingURL=multi_input_stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/stream/multi_input_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type {\n ReadableStream,\n ReadableStreamDefaultReader,\n WritableStreamDefaultWriter,\n} from 'node:stream/web';\nimport { log } from '../log.js';\nimport { isStreamReaderReleaseError } from './deferred_stream.js';\nimport { IdentityTransform } from './identity_transform.js';\n\n/**\n * A fan-in multiplexer that merges multiple {@link ReadableStream} inputs into\n * a single output {@link ReadableStream}. Inputs can be dynamically added and\n * removed at any time while the stream is open.\n *\n * Unlike {@link DeferredReadableStream} which supports a single readable source,\n * `MultiInputStream` allows N concurrent input streams to pump data into one output.\n *\n * Key behaviors:\n * - An error in one input removes that input but does **not** kill the output.\n * - When all inputs end or are removed, the output stays open (waiting for new inputs).\n * - The output only closes when {@link close} is called explicitly.\n * - {@link removeInputStream} releases the reader lock so the source can be reused.\n */\nexport class MultiInputStream<T> {\n private transform: IdentityTransform<T>;\n private writer: WritableStreamDefaultWriter<T>;\n private inputs: Map<string, ReadableStreamDefaultReader<T>> = new Map();\n private pumpPromises: Map<string, Promise<void>> = new Map();\n private nextId = 0;\n private _closed = false;\n private logger = log();\n\n constructor() {\n this.transform = new IdentityTransform<T>();\n this.writer = this.transform.writable.getWriter();\n }\n\n /** The single output stream that consumers read from. */\n get stream(): ReadableStream<T> {\n return this.transform.readable;\n }\n\n /** Number of currently active input streams. */\n get inputCount(): number {\n return this.inputs.size;\n }\n\n /** Whether {@link close} has been called. */\n get isClosed(): boolean {\n return this._closed;\n }\n\n /**\n * Add an input {@link ReadableStream} that will be pumped into the output.\n *\n * @returns A unique identifier that can be passed to {@link removeInputStream}.\n * @throws If the stream has already been closed.\n */\n addInputStream(source: ReadableStream<T>): string {\n if (this._closed) {\n throw new Error('MultiInputStream is closed');\n }\n\n const id = `input-${this.nextId++}`;\n const reader = source.getReader();\n this.inputs.set(id, reader);\n\n const pumpDone = this.pumpInput(id, reader);\n this.pumpPromises.set(id, pumpDone);\n\n return id;\n }\n\n /**\n * Detach an input stream by its ID and release the reader lock so the\n * source stream can be reused elsewhere.\n *\n * No-op if the ID does not exist (e.g. the input already ended or was removed).\n */\n async removeInputStream(id: string): Promise<void> {\n const reader = this.inputs.get(id);\n if (!reader) return;\n\n // Delete first so the pump's finally-block is a harmless no-op.\n this.inputs.delete(id);\n\n // Releasing the lock causes any pending reader.read() inside pump to throw\n // a TypeError, which is caught by isStreamReaderReleaseError.\n reader.releaseLock();\n\n // Wait for the pump to finish so the caller knows cleanup is complete.\n const pump = this.pumpPromises.get(id);\n if (pump) {\n await pump;\n this.pumpPromises.delete(id);\n }\n }\n\n /**\n * Close the output stream and detach all inputs.\n *\n * Idempotent — calling more than once is a no-op.\n */\n async close(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n\n // Release every input reader to unblock pending reads inside pumps.\n for (const reader of this.inputs.values()) {\n reader.releaseLock();\n }\n this.inputs.clear();\n\n // Wait for every pump loop to finish before touching the writer.\n await Promise.allSettled([...this.pumpPromises.values()]);\n this.pumpPromises.clear();\n\n // Close the output writer + writable side of the transform.\n try {\n this.writer.releaseLock();\n } catch {\n // ignore if already released\n }\n\n try {\n await this.transform.writable.close();\n } catch {\n // ignore if already closed\n }\n }\n\n private shouldStopPumping(id: string): boolean {\n return this._closed || !this.inputs.has(id);\n }\n\n private async pumpInput(id: string, reader: ReadableStreamDefaultReader<T>): Promise<void> {\n try {\n while (true) {\n // If the stream was closed or the input was removed while we were\n // awaiting the previous write, bail out immediately.\n if (this.shouldStopPumping(id)) break;\n\n const { done, value } = await reader.read();\n if (done) break;\n\n // Double-check after the (potentially long) read.\n if (this.shouldStopPumping(id)) break;\n\n await this.writer.write(value);\n }\n } catch (e) {\n // TypeErrors from releaseLock() during removeInputStream / close are expected.\n if (isStreamReaderReleaseError(e)) {\n return;\n }\n\n this.logger.error({ error: e }, 'Error pumping input stream from MultiInputStream');\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // ignore if already released\n }\n\n this.inputs.delete(id);\n this.pumpPromises.delete(id);\n }\n }\n}\n"],"mappings":"AAQA,SAAS,WAAW;AACpB,SAAS,kCAAkC;AAC3C,SAAS,yBAAyB;AAgB3B,MAAM,iBAAoB;AAAA,EACvB;AAAA,EACA;AAAA,EACA,SAAsD,oBAAI,IAAI;AAAA,EAC9D,eAA2C,oBAAI,IAAI;AAAA,EACnD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS,IAAI;AAAA,EAErB,cAAc;AACZ,SAAK,YAAY,IAAI,kBAAqB;AAC1C,SAAK,SAAS,KAAK,UAAU,SAAS,UAAU;AAAA,EAClD;AAAA;AAAA,EAGA,IAAI,SAA4B;AAC9B,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA;AAAA,EAGA,IAAI,aAAqB;AACvB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA,EAGA,IAAI,WAAoB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAe,QAAmC;AAChD,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,UAAM,KAAK,SAAS,KAAK,QAAQ;AACjC,UAAM,SAAS,OAAO,UAAU;AAChC,SAAK,OAAO,IAAI,IAAI,MAAM;AAE1B,UAAM,WAAW,KAAK,UAAU,IAAI,MAAM;AAC1C,SAAK,aAAa,IAAI,IAAI,QAAQ;AAElC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,kBAAkB,IAA2B;AACjD,UAAM,SAAS,KAAK,OAAO,IAAI,EAAE;AACjC,QAAI,CAAC,OAAQ;AAGb,SAAK,OAAO,OAAO,EAAE;AAIrB,WAAO,YAAY;AAGnB,UAAM,OAAO,KAAK,aAAa,IAAI,EAAE;AACrC,QAAI,MAAM;AACR,YAAM;AACN,WAAK,aAAa,OAAO,EAAE;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAuB;AAC3B,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AAGf,eAAW,UAAU,KAAK,OAAO,OAAO,GAAG;AACzC,aAAO,YAAY;AAAA,IACrB;AACA,SAAK,OAAO,MAAM;AAGlB,UAAM,QAAQ,WAAW,CAAC,GAAG,KAAK,aAAa,OAAO,CAAC,CAAC;AACxD,SAAK,aAAa,MAAM;AAGxB,QAAI;AACF,WAAK,OAAO,YAAY;AAAA,IAC1B,QAAQ;AAAA,IAER;AAEA,QAAI;AACF,YAAM,KAAK,UAAU,SAAS,MAAM;AAAA,IACtC,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,kBAAkB,IAAqB;AAC7C,WAAO,KAAK,WAAW,CAAC,KAAK,OAAO,IAAI,EAAE;AAAA,EAC5C;AAAA,EAEA,MAAc,UAAU,IAAY,QAAuD;AACzF,QAAI;AACF,aAAO,MAAM;AAGX,YAAI,KAAK,kBAAkB,EAAE,EAAG;AAEhC,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AAGV,YAAI,KAAK,kBAAkB,EAAE,EAAG;AAEhC,cAAM,KAAK,OAAO,MAAM,KAAK;AAAA,MAC/B;AAAA,IACF,SAAS,GAAG;AAEV,UAAI,2BAA2B,CAAC,GAAG;AACjC;AAAA,MACF;AAEA,WAAK,OAAO,MAAM,EAAE,OAAO,EAAE,GAAG,kDAAkD;AAAA,IACpF,UAAE;AACA,UAAI;AACF,eAAO,YAAY;AAAA,MACrB,QAAQ;AAAA,MAER;AAEA,WAAK,OAAO,OAAO,EAAE;AACrB,WAAK,aAAa,OAAO,EAAE;AAAA,IAC7B;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,344 @@
1
+ "use strict";
2
+ var import_web = require("node:stream/web");
3
+ var import_vitest = require("vitest");
4
+ var import_log = require("../log.cjs");
5
+ var import_utils = require("../utils.cjs");
6
+ var import_multi_input_stream = require("./multi_input_stream.cjs");
7
+ function streamFrom(values) {
8
+ return new import_web.ReadableStream({
9
+ start(controller) {
10
+ for (const v of values) controller.enqueue(v);
11
+ controller.close();
12
+ }
13
+ });
14
+ }
15
+ (0, import_vitest.describe)("MultiInputStream", () => {
16
+ (0, import_vitest.beforeAll)(() => {
17
+ (0, import_log.initializeLogger)({ pretty: false });
18
+ });
19
+ (0, import_vitest.it)("should create a readable output stream", () => {
20
+ const multi = new import_multi_input_stream.MultiInputStream();
21
+ (0, import_vitest.expect)(multi.stream).toBeInstanceOf(import_web.ReadableStream);
22
+ (0, import_vitest.expect)(multi.inputCount).toBe(0);
23
+ (0, import_vitest.expect)(multi.isClosed).toBe(false);
24
+ });
25
+ (0, import_vitest.it)("should read data from a single input stream", async () => {
26
+ const multi = new import_multi_input_stream.MultiInputStream();
27
+ const reader = multi.stream.getReader();
28
+ multi.addInputStream(streamFrom(["a", "b", "c"]));
29
+ const results = [];
30
+ for (let i = 0; i < 3; i++) {
31
+ const { value } = await reader.read();
32
+ results.push(value);
33
+ }
34
+ (0, import_vitest.expect)(results).toEqual(["a", "b", "c"]);
35
+ reader.releaseLock();
36
+ await multi.close();
37
+ });
38
+ (0, import_vitest.it)("should merge data from multiple input streams", async () => {
39
+ const multi = new import_multi_input_stream.MultiInputStream();
40
+ const reader = multi.stream.getReader();
41
+ multi.addInputStream(streamFrom([1, 2]));
42
+ multi.addInputStream(streamFrom([3, 4]));
43
+ const results = [];
44
+ for (let i = 0; i < 4; i++) {
45
+ const { value } = await reader.read();
46
+ results.push(value);
47
+ }
48
+ (0, import_vitest.expect)(results.sort()).toEqual([1, 2, 3, 4]);
49
+ reader.releaseLock();
50
+ await multi.close();
51
+ });
52
+ (0, import_vitest.it)("should allow adding inputs dynamically while reading", async () => {
53
+ const multi = new import_multi_input_stream.MultiInputStream();
54
+ const reader = multi.stream.getReader();
55
+ multi.addInputStream(streamFrom(["first"]));
56
+ const r1 = await reader.read();
57
+ (0, import_vitest.expect)(r1.value).toBe("first");
58
+ multi.addInputStream(streamFrom(["second"]));
59
+ const r2 = await reader.read();
60
+ (0, import_vitest.expect)(r2.value).toBe("second");
61
+ reader.releaseLock();
62
+ await multi.close();
63
+ });
64
+ (0, import_vitest.it)("should continue reading from remaining inputs after removing one", async () => {
65
+ const multi = new import_multi_input_stream.MultiInputStream();
66
+ const reader = multi.stream.getReader();
67
+ const slowSource = new import_web.ReadableStream({
68
+ async start(controller) {
69
+ controller.enqueue("slow-1");
70
+ await (0, import_utils.delay)(50);
71
+ controller.enqueue("slow-2");
72
+ await (0, import_utils.delay)(50);
73
+ controller.enqueue("slow-3");
74
+ controller.close();
75
+ }
76
+ });
77
+ const slowId = multi.addInputStream(slowSource);
78
+ const r1 = await reader.read();
79
+ (0, import_vitest.expect)(r1.value).toBe("slow-1");
80
+ await multi.removeInputStream(slowId);
81
+ multi.addInputStream(streamFrom(["fast-1", "fast-2"]));
82
+ const r2 = await reader.read();
83
+ (0, import_vitest.expect)(r2.value).toBe("fast-1");
84
+ const r3 = await reader.read();
85
+ (0, import_vitest.expect)(r3.value).toBe("fast-2");
86
+ reader.releaseLock();
87
+ await multi.close();
88
+ });
89
+ (0, import_vitest.it)("should handle swapping inputs (remove then add)", async () => {
90
+ const multi = new import_multi_input_stream.MultiInputStream();
91
+ const reader = multi.stream.getReader();
92
+ const id1 = multi.addInputStream(streamFrom(["from-A"]));
93
+ const r1 = await reader.read();
94
+ (0, import_vitest.expect)(r1.value).toBe("from-A");
95
+ await multi.removeInputStream(id1);
96
+ const id2 = multi.addInputStream(streamFrom(["from-B"]));
97
+ const r2 = await reader.read();
98
+ (0, import_vitest.expect)(r2.value).toBe("from-B");
99
+ await multi.removeInputStream(id2);
100
+ reader.releaseLock();
101
+ await multi.close();
102
+ });
103
+ (0, import_vitest.it)("should keep reader awaiting until an input is added", async () => {
104
+ const multi = new import_multi_input_stream.MultiInputStream();
105
+ const reader = multi.stream.getReader();
106
+ let readCompleted = false;
107
+ const readPromise = reader.read().then((result2) => {
108
+ readCompleted = true;
109
+ return result2;
110
+ });
111
+ await (0, import_utils.delay)(50);
112
+ (0, import_vitest.expect)(readCompleted).toBe(false);
113
+ multi.addInputStream(streamFrom(["hello"]));
114
+ const result = await readPromise;
115
+ (0, import_vitest.expect)(readCompleted).toBe(true);
116
+ (0, import_vitest.expect)(result.value).toBe("hello");
117
+ reader.releaseLock();
118
+ await multi.close();
119
+ });
120
+ (0, import_vitest.it)("should handle empty input streams without closing the output", async () => {
121
+ const multi = new import_multi_input_stream.MultiInputStream();
122
+ const reader = multi.stream.getReader();
123
+ multi.addInputStream(streamFrom([]));
124
+ await (0, import_utils.delay)(20);
125
+ multi.addInputStream(streamFrom(["data"]));
126
+ const result = await reader.read();
127
+ (0, import_vitest.expect)(result.value).toBe("data");
128
+ reader.releaseLock();
129
+ await multi.close();
130
+ });
131
+ (0, import_vitest.it)("should remove errored input without killing the output", async () => {
132
+ const multi = new import_multi_input_stream.MultiInputStream();
133
+ const reader = multi.stream.getReader();
134
+ const errorSource = new import_web.ReadableStream({
135
+ async start(controller) {
136
+ controller.enqueue("before-error");
137
+ await (0, import_utils.delay)(20);
138
+ controller.error(new Error("boom"));
139
+ }
140
+ });
141
+ multi.addInputStream(errorSource);
142
+ const r1 = await reader.read();
143
+ (0, import_vitest.expect)(r1.value).toBe("before-error");
144
+ await (0, import_utils.delay)(50);
145
+ (0, import_vitest.expect)(multi.inputCount).toBe(0);
146
+ multi.addInputStream(streamFrom(["after-error"]));
147
+ const r2 = await reader.read();
148
+ (0, import_vitest.expect)(r2.value).toBe("after-error");
149
+ reader.releaseLock();
150
+ await multi.close();
151
+ });
152
+ (0, import_vitest.it)("should keep other inputs alive when one errors", async () => {
153
+ const multi = new import_multi_input_stream.MultiInputStream();
154
+ const reader = multi.stream.getReader();
155
+ const goodSource = new import_web.ReadableStream({
156
+ async start(controller) {
157
+ await (0, import_utils.delay)(60);
158
+ controller.enqueue("good");
159
+ controller.close();
160
+ }
161
+ });
162
+ const badSource = new import_web.ReadableStream({
163
+ async start(controller) {
164
+ controller.error(new Error("bad"));
165
+ }
166
+ });
167
+ multi.addInputStream(goodSource);
168
+ multi.addInputStream(badSource);
169
+ await (0, import_utils.delay)(10);
170
+ const result = await reader.read();
171
+ (0, import_vitest.expect)(result.value).toBe("good");
172
+ reader.releaseLock();
173
+ await multi.close();
174
+ });
175
+ (0, import_vitest.it)("should end the output stream with done:true when close is called", async () => {
176
+ const multi = new import_multi_input_stream.MultiInputStream();
177
+ const reader = multi.stream.getReader();
178
+ multi.addInputStream(streamFrom(["data"]));
179
+ const r1 = await reader.read();
180
+ (0, import_vitest.expect)(r1.value).toBe("data");
181
+ await multi.close();
182
+ const r2 = await reader.read();
183
+ (0, import_vitest.expect)(r2.done).toBe(true);
184
+ (0, import_vitest.expect)(r2.value).toBeUndefined();
185
+ reader.releaseLock();
186
+ });
187
+ (0, import_vitest.it)("should resolve pending reads as done when close is called", async () => {
188
+ const multi = new import_multi_input_stream.MultiInputStream();
189
+ const reader = multi.stream.getReader();
190
+ const readPromise = reader.read();
191
+ await (0, import_utils.delay)(10);
192
+ await multi.close();
193
+ const result = await readPromise;
194
+ (0, import_vitest.expect)(result.done).toBe(true);
195
+ (0, import_vitest.expect)(result.value).toBeUndefined();
196
+ reader.releaseLock();
197
+ });
198
+ (0, import_vitest.it)("should be idempotent for multiple close calls", async () => {
199
+ const multi = new import_multi_input_stream.MultiInputStream();
200
+ await multi.close();
201
+ await multi.close();
202
+ (0, import_vitest.expect)(multi.isClosed).toBe(true);
203
+ });
204
+ (0, import_vitest.it)("should throw when adding input after close", async () => {
205
+ const multi = new import_multi_input_stream.MultiInputStream();
206
+ await multi.close();
207
+ (0, import_vitest.expect)(() => multi.addInputStream(streamFrom(["x"]))).toThrow("MultiInputStream is closed");
208
+ });
209
+ (0, import_vitest.it)("should no-op when removing a non-existent input", async () => {
210
+ const multi = new import_multi_input_stream.MultiInputStream();
211
+ await multi.removeInputStream("does-not-exist");
212
+ await multi.close();
213
+ });
214
+ (0, import_vitest.it)("should release the source reader lock so the source can be reused", async () => {
215
+ const multi = new import_multi_input_stream.MultiInputStream();
216
+ const reader = multi.stream.getReader();
217
+ const source = new import_web.ReadableStream({
218
+ async start(controller) {
219
+ controller.enqueue("chunk-0");
220
+ await (0, import_utils.delay)(30);
221
+ controller.enqueue("chunk-1");
222
+ controller.close();
223
+ }
224
+ });
225
+ const id = multi.addInputStream(source);
226
+ const r1 = await reader.read();
227
+ (0, import_vitest.expect)(r1.value).toBe("chunk-0");
228
+ await multi.removeInputStream(id);
229
+ const sourceReader = source.getReader();
230
+ const sr = await sourceReader.read();
231
+ (0, import_vitest.expect)(sr.value).toBe("chunk-1");
232
+ sourceReader.releaseLock();
233
+ reader.releaseLock();
234
+ await multi.close();
235
+ });
236
+ (0, import_vitest.it)("should track inputCount correctly through add / remove / natural end", async () => {
237
+ const multi = new import_multi_input_stream.MultiInputStream();
238
+ (0, import_vitest.expect)(multi.inputCount).toBe(0);
239
+ const id1 = multi.addInputStream(streamFrom(["a"]));
240
+ const id2 = multi.addInputStream(streamFrom(["b"]));
241
+ (0, import_vitest.expect)(multi.inputCount).toBe(2);
242
+ await multi.removeInputStream(id1);
243
+ (0, import_vitest.expect)(multi.inputCount).toBeLessThanOrEqual(1);
244
+ await (0, import_utils.delay)(20);
245
+ (0, import_vitest.expect)(multi.inputCount).toBe(0);
246
+ await multi.removeInputStream(id2);
247
+ (0, import_vitest.expect)(multi.inputCount).toBe(0);
248
+ await multi.close();
249
+ });
250
+ (0, import_vitest.it)("should handle concurrent reads and slow writes", async () => {
251
+ const multi = new import_multi_input_stream.MultiInputStream();
252
+ const reader = multi.stream.getReader();
253
+ const chunks = ["a", "b", "c", "d", "e"];
254
+ let idx = 0;
255
+ const source = new import_web.ReadableStream({
256
+ start(controller) {
257
+ const writeNext = () => {
258
+ if (idx < chunks.length) {
259
+ controller.enqueue(chunks[idx++]);
260
+ setTimeout(writeNext, 5);
261
+ } else {
262
+ controller.close();
263
+ }
264
+ };
265
+ writeNext();
266
+ }
267
+ });
268
+ multi.addInputStream(source);
269
+ const results = [];
270
+ for (let i = 0; i < chunks.length; i++) {
271
+ const { value } = await reader.read();
272
+ results.push(value);
273
+ }
274
+ (0, import_vitest.expect)(results).toEqual(chunks);
275
+ reader.releaseLock();
276
+ await multi.close();
277
+ });
278
+ (0, import_vitest.it)("should handle backpressure with large data", async () => {
279
+ const multi = new import_multi_input_stream.MultiInputStream();
280
+ const largeChunks = Array.from({ length: 1e3 }, (_, i) => `chunk-${i}`);
281
+ multi.addInputStream(streamFrom(largeChunks));
282
+ const reader = multi.stream.getReader();
283
+ const results = [];
284
+ let result = await reader.read();
285
+ while (!result.done) {
286
+ results.push(result.value);
287
+ if (results.length === largeChunks.length) break;
288
+ result = await reader.read();
289
+ }
290
+ (0, import_vitest.expect)(results).toEqual(largeChunks);
291
+ reader.releaseLock();
292
+ await multi.close();
293
+ });
294
+ (0, import_vitest.it)("should support tee on the output stream", async () => {
295
+ const multi = new import_multi_input_stream.MultiInputStream();
296
+ const [s1, s2] = multi.stream.tee();
297
+ const r1 = s1.getReader();
298
+ const r2 = s2.getReader();
299
+ multi.addInputStream(streamFrom([10, 20]));
300
+ const [a1, a2] = await Promise.all([r1.read(), r2.read()]);
301
+ (0, import_vitest.expect)(a1.value).toBe(10);
302
+ (0, import_vitest.expect)(a2.value).toBe(10);
303
+ const [b1, b2] = await Promise.all([r1.read(), r2.read()]);
304
+ (0, import_vitest.expect)(b1.value).toBe(20);
305
+ (0, import_vitest.expect)(b2.value).toBe(20);
306
+ r1.releaseLock();
307
+ r2.releaseLock();
308
+ await multi.close();
309
+ });
310
+ (0, import_vitest.it)("should return unique IDs from addInputStream", () => {
311
+ const multi = new import_multi_input_stream.MultiInputStream();
312
+ const id1 = multi.addInputStream(streamFrom(["a"]));
313
+ const id2 = multi.addInputStream(streamFrom(["b"]));
314
+ const id3 = multi.addInputStream(streamFrom(["c"]));
315
+ (0, import_vitest.expect)(id1).not.toBe(id2);
316
+ (0, import_vitest.expect)(id2).not.toBe(id3);
317
+ (0, import_vitest.expect)(id1).not.toBe(id3);
318
+ });
319
+ (0, import_vitest.it)("should cleanly close while pumps are actively writing", async () => {
320
+ const multi = new import_multi_input_stream.MultiInputStream();
321
+ const reader = multi.stream.getReader();
322
+ const infiniteSource = new import_web.ReadableStream({
323
+ async start(controller) {
324
+ let i = 0;
325
+ while (true) {
326
+ try {
327
+ controller.enqueue(`tick-${i++}`);
328
+ } catch {
329
+ break;
330
+ }
331
+ await (0, import_utils.delay)(5);
332
+ }
333
+ }
334
+ });
335
+ multi.addInputStream(infiniteSource);
336
+ const r1 = await reader.read();
337
+ (0, import_vitest.expect)(r1.done).toBe(false);
338
+ await multi.close();
339
+ const r2 = await reader.read();
340
+ (0, import_vitest.expect)(r2.done).toBe(true);
341
+ reader.releaseLock();
342
+ });
343
+ });
344
+ //# sourceMappingURL=multi_input_stream.test.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/stream/multi_input_stream.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { ReadableStream } from 'node:stream/web';\nimport { beforeAll, describe, expect, it } from 'vitest';\nimport { initializeLogger } from '../log.js';\nimport { delay } from '../utils.js';\nimport { MultiInputStream } from './multi_input_stream.js';\n\nfunction streamFrom<T>(values: T[]): ReadableStream<T> {\n return new ReadableStream<T>({\n start(controller) {\n for (const v of values) controller.enqueue(v);\n controller.close();\n },\n });\n}\n\ndescribe('MultiInputStream', () => {\n beforeAll(() => {\n initializeLogger({ pretty: false });\n });\n\n // ---------------------------------------------------------------------------\n // Basic functionality\n // ---------------------------------------------------------------------------\n\n it('should create a readable output stream', () => {\n const multi = new MultiInputStream<string>();\n expect(multi.stream).toBeInstanceOf(ReadableStream);\n expect(multi.inputCount).toBe(0);\n expect(multi.isClosed).toBe(false);\n });\n\n it('should read data from a single input stream', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n multi.addInputStream(streamFrom(['a', 'b', 'c']));\n\n const results: string[] = [];\n // Read three values then close manually (output stays open after input ends).\n for (let i = 0; i < 3; i++) {\n const { value } = await reader.read();\n results.push(value!);\n }\n\n expect(results).toEqual(['a', 'b', 'c']);\n reader.releaseLock();\n await multi.close();\n });\n\n it('should merge data from multiple input streams', async () => {\n const multi = new MultiInputStream<number>();\n const reader = multi.stream.getReader();\n\n multi.addInputStream(streamFrom([1, 2]));\n multi.addInputStream(streamFrom([3, 4]));\n\n const results: number[] = [];\n for (let i = 0; i < 4; i++) {\n const { value } = await reader.read();\n results.push(value!);\n }\n\n // Order is non-deterministic but all values must arrive.\n expect(results.sort()).toEqual([1, 2, 3, 4]);\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Dynamic add / remove\n // ---------------------------------------------------------------------------\n\n it('should allow adding inputs dynamically while reading', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n multi.addInputStream(streamFrom(['first']));\n\n const r1 = await reader.read();\n expect(r1.value).toBe('first');\n\n // Add a second input after reading from the first.\n multi.addInputStream(streamFrom(['second']));\n\n const r2 = await reader.read();\n expect(r2.value).toBe('second');\n\n reader.releaseLock();\n await multi.close();\n });\n\n it('should continue reading from remaining inputs after removing one', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n // A slow stream that emits over time.\n const slowSource = new ReadableStream<string>({\n async start(controller) {\n controller.enqueue('slow-1');\n await delay(50);\n controller.enqueue('slow-2');\n await delay(50);\n controller.enqueue('slow-3');\n controller.close();\n },\n });\n\n const slowId = multi.addInputStream(slowSource);\n\n // Read first value from slow source.\n const r1 = await reader.read();\n expect(r1.value).toBe('slow-1');\n\n // Remove the slow source and add a fast one.\n await multi.removeInputStream(slowId);\n\n multi.addInputStream(streamFrom(['fast-1', 'fast-2']));\n\n const r2 = await reader.read();\n expect(r2.value).toBe('fast-1');\n\n const r3 = await reader.read();\n expect(r3.value).toBe('fast-2');\n\n reader.releaseLock();\n await multi.close();\n });\n\n it('should handle swapping inputs (remove then add)', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n const id1 = multi.addInputStream(streamFrom(['from-A']));\n\n const r1 = await reader.read();\n expect(r1.value).toBe('from-A');\n\n await multi.removeInputStream(id1);\n\n const id2 = multi.addInputStream(streamFrom(['from-B']));\n\n const r2 = await reader.read();\n expect(r2.value).toBe('from-B');\n\n await multi.removeInputStream(id2);\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Reading before any input is added\n // ---------------------------------------------------------------------------\n\n it('should keep reader awaiting until an input is added', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n let readCompleted = false;\n const readPromise = reader.read().then((result) => {\n readCompleted = true;\n return result;\n });\n\n await delay(50);\n expect(readCompleted).toBe(false);\n\n // Now add an input to unblock the read.\n multi.addInputStream(streamFrom(['hello']));\n\n const result = await readPromise;\n expect(readCompleted).toBe(true);\n expect(result.value).toBe('hello');\n\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Empty input streams\n // ---------------------------------------------------------------------------\n\n it('should handle empty input streams without closing the output', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n // Add an empty stream — it should end immediately without affecting the output.\n multi.addInputStream(streamFrom([]));\n\n await delay(20);\n\n // The output should still be open. Adding a real input should work.\n multi.addInputStream(streamFrom(['data']));\n\n const result = await reader.read();\n expect(result.value).toBe('data');\n\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Error handling\n // ---------------------------------------------------------------------------\n\n it('should remove errored input without killing the output', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n // An input that errors after emitting one value.\n const errorSource = new ReadableStream<string>({\n async start(controller) {\n controller.enqueue('before-error');\n await delay(20);\n controller.error(new Error('boom'));\n },\n });\n\n multi.addInputStream(errorSource);\n\n const r1 = await reader.read();\n expect(r1.value).toBe('before-error');\n\n // Wait for the error to propagate and the input to be removed.\n await delay(50);\n\n expect(multi.inputCount).toBe(0);\n\n // The output is still alive — we can add another input.\n multi.addInputStream(streamFrom(['after-error']));\n\n const r2 = await reader.read();\n expect(r2.value).toBe('after-error');\n\n reader.releaseLock();\n await multi.close();\n });\n\n it('should keep other inputs alive when one errors', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n const goodSource = new ReadableStream<string>({\n async start(controller) {\n await delay(60);\n controller.enqueue('good');\n controller.close();\n },\n });\n\n const badSource = new ReadableStream<string>({\n async start(controller) {\n controller.error(new Error('bad'));\n },\n });\n\n multi.addInputStream(goodSource);\n multi.addInputStream(badSource);\n\n // Wait a bit for the bad source to error and be removed.\n await delay(10);\n\n // The good source should still be pumping.\n const result = await reader.read();\n expect(result.value).toBe('good');\n\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Close semantics\n // ---------------------------------------------------------------------------\n\n it('should end the output stream with done:true when close is called', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n multi.addInputStream(streamFrom(['data']));\n\n const r1 = await reader.read();\n expect(r1.value).toBe('data');\n\n await multi.close();\n\n const r2 = await reader.read();\n expect(r2.done).toBe(true);\n expect(r2.value).toBeUndefined();\n\n reader.releaseLock();\n });\n\n it('should resolve pending reads as done when close is called', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n // No inputs — read will be pending.\n const readPromise = reader.read();\n\n await delay(10);\n await multi.close();\n\n const result = await readPromise;\n expect(result.done).toBe(true);\n expect(result.value).toBeUndefined();\n\n reader.releaseLock();\n });\n\n it('should be idempotent for multiple close calls', async () => {\n const multi = new MultiInputStream<string>();\n\n await multi.close();\n await multi.close();\n\n expect(multi.isClosed).toBe(true);\n });\n\n it('should throw when adding input after close', async () => {\n const multi = new MultiInputStream<string>();\n await multi.close();\n\n expect(() => multi.addInputStream(streamFrom(['x']))).toThrow('MultiInputStream is closed');\n });\n\n // ---------------------------------------------------------------------------\n // removeInputStream edge cases\n // ---------------------------------------------------------------------------\n\n it('should no-op when removing a non-existent input', async () => {\n const multi = new MultiInputStream<string>();\n\n // Should not throw.\n await multi.removeInputStream('does-not-exist');\n\n await multi.close();\n });\n\n it('should release the source reader lock so the source can be reused', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n const source = new ReadableStream<string>({\n async start(controller) {\n controller.enqueue('chunk-0');\n await delay(30);\n controller.enqueue('chunk-1');\n controller.close();\n },\n });\n\n const id = multi.addInputStream(source);\n\n const r1 = await reader.read();\n expect(r1.value).toBe('chunk-0');\n\n await multi.removeInputStream(id);\n\n // The source's reader lock should be released — we can get a new reader.\n const sourceReader = source.getReader();\n const sr = await sourceReader.read();\n expect(sr.value).toBe('chunk-1');\n sourceReader.releaseLock();\n\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Input count tracking\n // ---------------------------------------------------------------------------\n\n it('should track inputCount correctly through add / remove / natural end', async () => {\n const multi = new MultiInputStream<string>();\n\n expect(multi.inputCount).toBe(0);\n\n const id1 = multi.addInputStream(streamFrom(['a']));\n const id2 = multi.addInputStream(streamFrom(['b']));\n\n expect(multi.inputCount).toBe(2);\n\n await multi.removeInputStream(id1);\n expect(multi.inputCount).toBeLessThanOrEqual(1);\n\n // Let the remaining stream finish.\n await delay(20);\n expect(multi.inputCount).toBe(0);\n\n await multi.removeInputStream(id2); // already gone, no-op\n expect(multi.inputCount).toBe(0);\n\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Concurrent reads and writes\n // ---------------------------------------------------------------------------\n\n it('should handle concurrent reads and slow writes', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n const chunks = ['a', 'b', 'c', 'd', 'e'];\n let idx = 0;\n\n const source = new ReadableStream<string>({\n start(controller) {\n const writeNext = () => {\n if (idx < chunks.length) {\n controller.enqueue(chunks[idx++]);\n setTimeout(writeNext, 5);\n } else {\n controller.close();\n }\n };\n writeNext();\n },\n });\n\n multi.addInputStream(source);\n\n const results: string[] = [];\n for (let i = 0; i < chunks.length; i++) {\n const { value } = await reader.read();\n results.push(value!);\n }\n\n expect(results).toEqual(chunks);\n\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Backpressure\n // ---------------------------------------------------------------------------\n\n it('should handle backpressure with large data', async () => {\n const multi = new MultiInputStream<string>();\n\n const largeChunks = Array.from({ length: 1000 }, (_, i) => `chunk-${i}`);\n multi.addInputStream(streamFrom(largeChunks));\n\n const reader = multi.stream.getReader();\n const results: string[] = [];\n\n let result = await reader.read();\n while (!result.done) {\n results.push(result.value);\n // Check if we've collected all expected values before reading again,\n // to avoid hanging on the output which stays open after input ends.\n if (results.length === largeChunks.length) break;\n result = await reader.read();\n }\n\n expect(results).toEqual(largeChunks);\n\n reader.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Multiple tee / concurrent consumers\n // ---------------------------------------------------------------------------\n\n it('should support tee on the output stream', async () => {\n const multi = new MultiInputStream<number>();\n\n const [s1, s2] = multi.stream.tee();\n const r1 = s1.getReader();\n const r2 = s2.getReader();\n\n multi.addInputStream(streamFrom([10, 20]));\n\n const [a1, a2] = await Promise.all([r1.read(), r2.read()]);\n expect(a1.value).toBe(10);\n expect(a2.value).toBe(10);\n\n const [b1, b2] = await Promise.all([r1.read(), r2.read()]);\n expect(b1.value).toBe(20);\n expect(b2.value).toBe(20);\n\n r1.releaseLock();\n r2.releaseLock();\n await multi.close();\n });\n\n // ---------------------------------------------------------------------------\n // Return value of addInputStream\n // ---------------------------------------------------------------------------\n\n it('should return unique IDs from addInputStream', () => {\n const multi = new MultiInputStream<string>();\n\n const id1 = multi.addInputStream(streamFrom(['a']));\n const id2 = multi.addInputStream(streamFrom(['b']));\n const id3 = multi.addInputStream(streamFrom(['c']));\n\n expect(id1).not.toBe(id2);\n expect(id2).not.toBe(id3);\n expect(id1).not.toBe(id3);\n });\n\n // ---------------------------------------------------------------------------\n // close() while pumps are actively writing\n // ---------------------------------------------------------------------------\n\n it('should cleanly close while pumps are actively writing', async () => {\n const multi = new MultiInputStream<string>();\n const reader = multi.stream.getReader();\n\n // A source that never stops on its own.\n const infiniteSource = new ReadableStream<string>({\n async start(controller) {\n let i = 0;\n while (true) {\n try {\n controller.enqueue(`tick-${i++}`);\n } catch {\n // controller.enqueue throws after stream is canceled\n break;\n }\n await delay(5);\n }\n },\n });\n\n multi.addInputStream(infiniteSource);\n\n // Read a couple of values.\n const r1 = await reader.read();\n expect(r1.done).toBe(false);\n\n // Close while the infinite source is still pumping.\n await multi.close();\n\n const r2 = await reader.read();\n expect(r2.done).toBe(true);\n\n reader.releaseLock();\n });\n});\n"],"mappings":"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","names":["result"]}