@livekit/agents 0.7.9 → 1.0.0-next.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 (627) hide show
  1. package/dist/_exceptions.cjs +109 -0
  2. package/dist/_exceptions.cjs.map +1 -0
  3. package/dist/_exceptions.d.cts +64 -0
  4. package/dist/_exceptions.d.ts +64 -0
  5. package/dist/_exceptions.d.ts.map +1 -0
  6. package/dist/_exceptions.js +80 -0
  7. package/dist/_exceptions.js.map +1 -0
  8. package/dist/audio.cjs +10 -3
  9. package/dist/audio.cjs.map +1 -1
  10. package/dist/audio.d.cts +2 -0
  11. package/dist/audio.d.ts +2 -0
  12. package/dist/audio.d.ts.map +1 -1
  13. package/dist/audio.js +8 -2
  14. package/dist/audio.js.map +1 -1
  15. package/dist/cli.cjs +25 -0
  16. package/dist/cli.cjs.map +1 -1
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +25 -0
  19. package/dist/cli.js.map +1 -1
  20. package/dist/constants.cjs +6 -3
  21. package/dist/constants.cjs.map +1 -1
  22. package/dist/constants.d.cts +2 -1
  23. package/dist/constants.d.ts +2 -1
  24. package/dist/constants.d.ts.map +1 -1
  25. package/dist/constants.js +4 -2
  26. package/dist/constants.js.map +1 -1
  27. package/dist/http_server.cjs.map +1 -1
  28. package/dist/http_server.d.cts +1 -0
  29. package/dist/http_server.d.ts +1 -0
  30. package/dist/http_server.d.ts.map +1 -1
  31. package/dist/http_server.js.map +1 -1
  32. package/dist/index.cjs +27 -20
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.cts +13 -10
  35. package/dist/index.d.ts +13 -10
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +15 -11
  38. package/dist/index.js.map +1 -1
  39. package/dist/inference_runner.cjs +0 -1
  40. package/dist/inference_runner.cjs.map +1 -1
  41. package/dist/inference_runner.d.cts +2 -3
  42. package/dist/inference_runner.d.ts +2 -3
  43. package/dist/inference_runner.d.ts.map +1 -1
  44. package/dist/inference_runner.js +0 -1
  45. package/dist/inference_runner.js.map +1 -1
  46. package/dist/ipc/inference_proc_executor.cjs +2 -2
  47. package/dist/ipc/inference_proc_executor.cjs.map +1 -1
  48. package/dist/ipc/inference_proc_executor.js +2 -2
  49. package/dist/ipc/inference_proc_executor.js.map +1 -1
  50. package/dist/ipc/job_executor.cjs.map +1 -1
  51. package/dist/ipc/job_executor.js.map +1 -1
  52. package/dist/ipc/job_proc_executor.cjs +1 -0
  53. package/dist/ipc/job_proc_executor.cjs.map +1 -1
  54. package/dist/ipc/job_proc_executor.js +1 -0
  55. package/dist/ipc/job_proc_executor.js.map +1 -1
  56. package/dist/ipc/job_proc_lazy_main.cjs +1 -1
  57. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
  58. package/dist/ipc/job_proc_lazy_main.js +1 -1
  59. package/dist/ipc/job_proc_lazy_main.js.map +1 -1
  60. package/dist/ipc/supervised_proc.d.cts +1 -1
  61. package/dist/ipc/supervised_proc.d.ts +1 -1
  62. package/dist/ipc/supervised_proc.d.ts.map +1 -1
  63. package/dist/job.cjs +14 -2
  64. package/dist/job.cjs.map +1 -1
  65. package/dist/job.d.cts +8 -0
  66. package/dist/job.d.ts +8 -0
  67. package/dist/job.d.ts.map +1 -1
  68. package/dist/job.js +12 -1
  69. package/dist/job.js.map +1 -1
  70. package/dist/llm/chat_context.cjs +332 -82
  71. package/dist/llm/chat_context.cjs.map +1 -1
  72. package/dist/llm/chat_context.d.cts +152 -48
  73. package/dist/llm/chat_context.d.ts +152 -48
  74. package/dist/llm/chat_context.d.ts.map +1 -1
  75. package/dist/llm/chat_context.js +327 -81
  76. package/dist/llm/chat_context.js.map +1 -1
  77. package/dist/llm/chat_context.test.cjs +380 -0
  78. package/dist/llm/chat_context.test.cjs.map +1 -0
  79. package/dist/llm/chat_context.test.js +385 -0
  80. package/dist/llm/chat_context.test.js.map +1 -0
  81. package/dist/llm/index.cjs +37 -8
  82. package/dist/llm/index.cjs.map +1 -1
  83. package/dist/llm/index.d.cts +7 -3
  84. package/dist/llm/index.d.ts +7 -3
  85. package/dist/llm/index.d.ts.map +1 -1
  86. package/dist/llm/index.js +39 -9
  87. package/dist/llm/index.js.map +1 -1
  88. package/dist/llm/llm.cjs +98 -33
  89. package/dist/llm/llm.cjs.map +1 -1
  90. package/dist/llm/llm.d.cts +50 -24
  91. package/dist/llm/llm.d.ts +50 -24
  92. package/dist/llm/llm.d.ts.map +1 -1
  93. package/dist/llm/llm.js +99 -33
  94. package/dist/llm/llm.js.map +1 -1
  95. package/dist/llm/provider_format/google.cjs +128 -0
  96. package/dist/llm/provider_format/google.cjs.map +1 -0
  97. package/dist/llm/provider_format/google.d.cts +6 -0
  98. package/dist/llm/provider_format/google.d.ts +6 -0
  99. package/dist/llm/provider_format/google.d.ts.map +1 -0
  100. package/dist/llm/provider_format/google.js +104 -0
  101. package/dist/llm/provider_format/google.js.map +1 -0
  102. package/dist/llm/provider_format/google.test.cjs +676 -0
  103. package/dist/llm/provider_format/google.test.cjs.map +1 -0
  104. package/dist/llm/provider_format/google.test.js +675 -0
  105. package/dist/llm/provider_format/google.test.js.map +1 -0
  106. package/dist/llm/provider_format/index.cjs +40 -0
  107. package/dist/llm/provider_format/index.cjs.map +1 -0
  108. package/dist/llm/provider_format/index.d.cts +4 -0
  109. package/dist/llm/provider_format/index.d.ts +4 -0
  110. package/dist/llm/provider_format/index.d.ts.map +1 -0
  111. package/dist/llm/provider_format/index.js +16 -0
  112. package/dist/llm/provider_format/index.js.map +1 -0
  113. package/dist/llm/provider_format/openai.cjs +116 -0
  114. package/dist/llm/provider_format/openai.cjs.map +1 -0
  115. package/dist/llm/provider_format/openai.d.cts +3 -0
  116. package/dist/llm/provider_format/openai.d.ts +3 -0
  117. package/dist/llm/provider_format/openai.d.ts.map +1 -0
  118. package/dist/llm/provider_format/openai.js +92 -0
  119. package/dist/llm/provider_format/openai.js.map +1 -0
  120. package/dist/llm/provider_format/openai.test.cjs +490 -0
  121. package/dist/llm/provider_format/openai.test.cjs.map +1 -0
  122. package/dist/llm/provider_format/openai.test.js +489 -0
  123. package/dist/llm/provider_format/openai.test.js.map +1 -0
  124. package/dist/llm/provider_format/utils.cjs +146 -0
  125. package/dist/llm/provider_format/utils.cjs.map +1 -0
  126. package/dist/llm/provider_format/utils.d.cts +38 -0
  127. package/dist/llm/provider_format/utils.d.ts +38 -0
  128. package/dist/llm/provider_format/utils.d.ts.map +1 -0
  129. package/dist/llm/provider_format/utils.js +122 -0
  130. package/dist/llm/provider_format/utils.js.map +1 -0
  131. package/dist/llm/realtime.cjs +77 -0
  132. package/dist/llm/realtime.cjs.map +1 -0
  133. package/dist/llm/realtime.d.cts +98 -0
  134. package/dist/llm/realtime.d.ts +98 -0
  135. package/dist/llm/realtime.d.ts.map +1 -0
  136. package/dist/llm/realtime.js +52 -0
  137. package/dist/llm/realtime.js.map +1 -0
  138. package/dist/llm/remote_chat_context.cjs +112 -0
  139. package/dist/llm/remote_chat_context.cjs.map +1 -0
  140. package/dist/llm/remote_chat_context.d.cts +23 -0
  141. package/dist/llm/remote_chat_context.d.ts +23 -0
  142. package/dist/llm/remote_chat_context.d.ts.map +1 -0
  143. package/dist/llm/remote_chat_context.js +88 -0
  144. package/dist/llm/remote_chat_context.js.map +1 -0
  145. package/dist/llm/remote_chat_context.test.cjs +225 -0
  146. package/dist/llm/remote_chat_context.test.cjs.map +1 -0
  147. package/dist/llm/remote_chat_context.test.js +224 -0
  148. package/dist/llm/remote_chat_context.test.js.map +1 -0
  149. package/dist/llm/tool_context.cjs +111 -0
  150. package/dist/llm/tool_context.cjs.map +1 -0
  151. package/dist/llm/tool_context.d.cts +125 -0
  152. package/dist/llm/tool_context.d.ts +125 -0
  153. package/dist/llm/tool_context.d.ts.map +1 -0
  154. package/dist/llm/tool_context.js +80 -0
  155. package/dist/llm/tool_context.js.map +1 -0
  156. package/dist/llm/tool_context.test.cjs +162 -0
  157. package/dist/llm/tool_context.test.cjs.map +1 -0
  158. package/dist/llm/tool_context.test.js +161 -0
  159. package/dist/llm/tool_context.test.js.map +1 -0
  160. package/dist/llm/tool_context.type.test.cjs +92 -0
  161. package/dist/llm/tool_context.type.test.cjs.map +1 -0
  162. package/dist/llm/tool_context.type.test.js +91 -0
  163. package/dist/llm/tool_context.type.test.js.map +1 -0
  164. package/dist/llm/utils.cjs +260 -0
  165. package/dist/llm/utils.cjs.map +1 -0
  166. package/dist/llm/utils.d.cts +42 -0
  167. package/dist/llm/utils.d.ts +42 -0
  168. package/dist/llm/utils.d.ts.map +1 -0
  169. package/dist/llm/utils.js +223 -0
  170. package/dist/llm/utils.js.map +1 -0
  171. package/dist/llm/utils.test.cjs +513 -0
  172. package/dist/llm/utils.test.cjs.map +1 -0
  173. package/dist/llm/utils.test.js +490 -0
  174. package/dist/llm/utils.test.js.map +1 -0
  175. package/dist/metrics/base.cjs +0 -27
  176. package/dist/metrics/base.cjs.map +1 -1
  177. package/dist/metrics/base.d.cts +105 -63
  178. package/dist/metrics/base.d.ts +105 -63
  179. package/dist/metrics/base.d.ts.map +1 -1
  180. package/dist/metrics/base.js +0 -19
  181. package/dist/metrics/base.js.map +1 -1
  182. package/dist/metrics/index.cjs +0 -3
  183. package/dist/metrics/index.cjs.map +1 -1
  184. package/dist/metrics/index.d.cts +2 -3
  185. package/dist/metrics/index.d.ts +2 -3
  186. package/dist/metrics/index.d.ts.map +1 -1
  187. package/dist/metrics/index.js +0 -2
  188. package/dist/metrics/index.js.map +1 -1
  189. package/dist/metrics/usage_collector.cjs +17 -12
  190. package/dist/metrics/usage_collector.cjs.map +1 -1
  191. package/dist/metrics/usage_collector.d.cts +3 -2
  192. package/dist/metrics/usage_collector.d.ts +3 -2
  193. package/dist/metrics/usage_collector.d.ts.map +1 -1
  194. package/dist/metrics/usage_collector.js +17 -12
  195. package/dist/metrics/usage_collector.js.map +1 -1
  196. package/dist/metrics/utils.cjs +22 -59
  197. package/dist/metrics/utils.cjs.map +1 -1
  198. package/dist/metrics/utils.d.cts +1 -8
  199. package/dist/metrics/utils.d.ts +1 -8
  200. package/dist/metrics/utils.d.ts.map +1 -1
  201. package/dist/metrics/utils.js +22 -52
  202. package/dist/metrics/utils.js.map +1 -1
  203. package/dist/multimodal/index.cjs +0 -2
  204. package/dist/multimodal/index.cjs.map +1 -1
  205. package/dist/multimodal/index.d.cts +0 -1
  206. package/dist/multimodal/index.d.ts +0 -1
  207. package/dist/multimodal/index.d.ts.map +1 -1
  208. package/dist/multimodal/index.js +0 -1
  209. package/dist/multimodal/index.js.map +1 -1
  210. package/dist/plugin.cjs +24 -8
  211. package/dist/plugin.cjs.map +1 -1
  212. package/dist/plugin.d.cts +18 -4
  213. package/dist/plugin.d.ts +18 -4
  214. package/dist/plugin.d.ts.map +1 -1
  215. package/dist/plugin.js +22 -7
  216. package/dist/plugin.js.map +1 -1
  217. package/dist/stream/deferred_stream.cjs +98 -0
  218. package/dist/stream/deferred_stream.cjs.map +1 -0
  219. package/dist/stream/deferred_stream.d.cts +27 -0
  220. package/dist/stream/deferred_stream.d.ts +27 -0
  221. package/dist/stream/deferred_stream.d.ts.map +1 -0
  222. package/dist/stream/deferred_stream.js +73 -0
  223. package/dist/stream/deferred_stream.js.map +1 -0
  224. package/dist/stream/deferred_stream.test.cjs +527 -0
  225. package/dist/stream/deferred_stream.test.cjs.map +1 -0
  226. package/dist/stream/deferred_stream.test.js +526 -0
  227. package/dist/stream/deferred_stream.test.js.map +1 -0
  228. package/dist/stream/identity_transform.cjs +42 -0
  229. package/dist/stream/identity_transform.cjs.map +1 -0
  230. package/dist/stream/identity_transform.d.cts +6 -0
  231. package/dist/stream/identity_transform.d.ts +6 -0
  232. package/dist/stream/identity_transform.d.ts.map +1 -0
  233. package/dist/stream/identity_transform.js +18 -0
  234. package/dist/stream/identity_transform.js.map +1 -0
  235. package/dist/stream/identity_transform.test.cjs +125 -0
  236. package/dist/stream/identity_transform.test.cjs.map +1 -0
  237. package/dist/stream/identity_transform.test.js +124 -0
  238. package/dist/stream/identity_transform.test.js.map +1 -0
  239. package/dist/stream/index.cjs +38 -0
  240. package/dist/stream/index.cjs.map +1 -0
  241. package/dist/stream/index.d.cts +5 -0
  242. package/dist/stream/index.d.ts +5 -0
  243. package/dist/stream/index.d.ts.map +1 -0
  244. package/dist/stream/index.js +11 -0
  245. package/dist/stream/index.js.map +1 -0
  246. package/dist/stream/merge_readable_streams.cjs +59 -0
  247. package/dist/stream/merge_readable_streams.cjs.map +1 -0
  248. package/dist/stream/merge_readable_streams.d.cts +4 -0
  249. package/dist/stream/merge_readable_streams.d.ts +4 -0
  250. package/dist/stream/merge_readable_streams.d.ts.map +1 -0
  251. package/dist/stream/merge_readable_streams.js +35 -0
  252. package/dist/stream/merge_readable_streams.js.map +1 -0
  253. package/dist/stream/stream_channel.cjs +47 -0
  254. package/dist/stream/stream_channel.cjs.map +1 -0
  255. package/dist/stream/stream_channel.d.cts +9 -0
  256. package/dist/stream/stream_channel.d.ts +9 -0
  257. package/dist/stream/stream_channel.d.ts.map +1 -0
  258. package/dist/stream/stream_channel.js +23 -0
  259. package/dist/stream/stream_channel.js.map +1 -0
  260. package/dist/stream/stream_channel.test.cjs +97 -0
  261. package/dist/stream/stream_channel.test.cjs.map +1 -0
  262. package/dist/stream/stream_channel.test.js +96 -0
  263. package/dist/stream/stream_channel.test.js.map +1 -0
  264. package/dist/stt/stream_adapter.cjs +3 -4
  265. package/dist/stt/stream_adapter.cjs.map +1 -1
  266. package/dist/stt/stream_adapter.d.cts +1 -0
  267. package/dist/stt/stream_adapter.d.ts +1 -0
  268. package/dist/stt/stream_adapter.d.ts.map +1 -1
  269. package/dist/stt/stream_adapter.js +3 -4
  270. package/dist/stt/stream_adapter.js.map +1 -1
  271. package/dist/stt/stt.cjs +101 -10
  272. package/dist/stt/stt.cjs.map +1 -1
  273. package/dist/stt/stt.d.cts +26 -5
  274. package/dist/stt/stt.d.ts +26 -5
  275. package/dist/stt/stt.d.ts.map +1 -1
  276. package/dist/stt/stt.js +102 -11
  277. package/dist/stt/stt.js.map +1 -1
  278. package/dist/tokenize/basic/basic.cjs +10 -5
  279. package/dist/tokenize/basic/basic.cjs.map +1 -1
  280. package/dist/tokenize/basic/basic.d.cts +7 -1
  281. package/dist/tokenize/basic/basic.d.ts +7 -1
  282. package/dist/tokenize/basic/basic.d.ts.map +1 -1
  283. package/dist/tokenize/basic/basic.js +10 -5
  284. package/dist/tokenize/basic/basic.js.map +1 -1
  285. package/dist/tokenize/basic/sentence.cjs +14 -6
  286. package/dist/tokenize/basic/sentence.cjs.map +1 -1
  287. package/dist/tokenize/basic/sentence.d.cts +1 -1
  288. package/dist/tokenize/basic/sentence.d.ts +1 -1
  289. package/dist/tokenize/basic/sentence.d.ts.map +1 -1
  290. package/dist/tokenize/basic/sentence.js +14 -6
  291. package/dist/tokenize/basic/sentence.js.map +1 -1
  292. package/dist/tokenize/token_stream.cjs +5 -3
  293. package/dist/tokenize/token_stream.cjs.map +1 -1
  294. package/dist/tokenize/token_stream.d.cts +1 -0
  295. package/dist/tokenize/token_stream.d.ts +1 -0
  296. package/dist/tokenize/token_stream.d.ts.map +1 -1
  297. package/dist/tokenize/token_stream.js +6 -4
  298. package/dist/tokenize/token_stream.js.map +1 -1
  299. package/dist/transcription.cjs +1 -2
  300. package/dist/transcription.cjs.map +1 -1
  301. package/dist/transcription.d.ts.map +1 -1
  302. package/dist/transcription.js +2 -3
  303. package/dist/transcription.js.map +1 -1
  304. package/dist/tts/index.cjs +2 -4
  305. package/dist/tts/index.cjs.map +1 -1
  306. package/dist/tts/index.d.cts +1 -1
  307. package/dist/tts/index.d.ts +1 -1
  308. package/dist/tts/index.d.ts.map +1 -1
  309. package/dist/tts/index.js +1 -3
  310. package/dist/tts/index.js.map +1 -1
  311. package/dist/tts/stream_adapter.cjs +26 -13
  312. package/dist/tts/stream_adapter.cjs.map +1 -1
  313. package/dist/tts/stream_adapter.d.cts +1 -1
  314. package/dist/tts/stream_adapter.d.ts +1 -1
  315. package/dist/tts/stream_adapter.d.ts.map +1 -1
  316. package/dist/tts/stream_adapter.js +27 -14
  317. package/dist/tts/stream_adapter.js.map +1 -1
  318. package/dist/tts/tts.cjs +157 -25
  319. package/dist/tts/tts.cjs.map +1 -1
  320. package/dist/tts/tts.d.cts +29 -5
  321. package/dist/tts/tts.d.ts +29 -5
  322. package/dist/tts/tts.d.ts.map +1 -1
  323. package/dist/tts/tts.js +157 -24
  324. package/dist/tts/tts.js.map +1 -1
  325. package/dist/types.cjs +60 -0
  326. package/dist/types.cjs.map +1 -0
  327. package/dist/types.d.cts +13 -0
  328. package/dist/types.d.ts +13 -0
  329. package/dist/types.d.ts.map +1 -0
  330. package/dist/types.js +35 -0
  331. package/dist/types.js.map +1 -0
  332. package/dist/utils.cjs +281 -27
  333. package/dist/utils.cjs.map +1 -1
  334. package/dist/utils.d.cts +134 -9
  335. package/dist/utils.d.ts +134 -9
  336. package/dist/utils.d.ts.map +1 -1
  337. package/dist/utils.js +265 -26
  338. package/dist/utils.js.map +1 -1
  339. package/dist/utils.test.cjs +492 -0
  340. package/dist/utils.test.cjs.map +1 -0
  341. package/dist/utils.test.js +498 -0
  342. package/dist/utils.test.js.map +1 -0
  343. package/dist/vad.cjs +76 -20
  344. package/dist/vad.cjs.map +1 -1
  345. package/dist/vad.d.cts +25 -5
  346. package/dist/vad.d.ts +25 -5
  347. package/dist/vad.d.ts.map +1 -1
  348. package/dist/vad.js +76 -20
  349. package/dist/vad.js.map +1 -1
  350. package/dist/voice/agent.cjs +245 -0
  351. package/dist/voice/agent.cjs.map +1 -0
  352. package/dist/voice/agent.d.cts +78 -0
  353. package/dist/voice/agent.d.ts +78 -0
  354. package/dist/voice/agent.d.ts.map +1 -0
  355. package/dist/voice/agent.js +220 -0
  356. package/dist/voice/agent.js.map +1 -0
  357. package/dist/voice/agent.test.cjs +61 -0
  358. package/dist/voice/agent.test.cjs.map +1 -0
  359. package/dist/voice/agent.test.js +60 -0
  360. package/dist/voice/agent.test.js.map +1 -0
  361. package/dist/voice/agent_activity.cjs +1453 -0
  362. package/dist/voice/agent_activity.cjs.map +1 -0
  363. package/dist/voice/agent_activity.d.cts +94 -0
  364. package/dist/voice/agent_activity.d.ts +94 -0
  365. package/dist/voice/agent_activity.d.ts.map +1 -0
  366. package/dist/voice/agent_activity.js +1449 -0
  367. package/dist/voice/agent_activity.js.map +1 -0
  368. package/dist/voice/agent_session.cjs +312 -0
  369. package/dist/voice/agent_session.cjs.map +1 -0
  370. package/dist/voice/agent_session.d.cts +121 -0
  371. package/dist/voice/agent_session.d.ts +121 -0
  372. package/dist/voice/agent_session.d.ts.map +1 -0
  373. package/dist/voice/agent_session.js +295 -0
  374. package/dist/voice/agent_session.js.map +1 -0
  375. package/dist/voice/audio_recognition.cjs +375 -0
  376. package/dist/voice/audio_recognition.cjs.map +1 -0
  377. package/dist/voice/audio_recognition.d.cts +80 -0
  378. package/dist/voice/audio_recognition.d.ts +80 -0
  379. package/dist/voice/audio_recognition.d.ts.map +1 -0
  380. package/dist/voice/audio_recognition.js +351 -0
  381. package/dist/voice/audio_recognition.js.map +1 -0
  382. package/dist/voice/events.cjs +145 -0
  383. package/dist/voice/events.cjs.map +1 -0
  384. package/dist/voice/events.d.cts +124 -0
  385. package/dist/voice/events.d.ts +124 -0
  386. package/dist/voice/events.d.ts.map +1 -0
  387. package/dist/voice/events.js +110 -0
  388. package/dist/voice/events.js.map +1 -0
  389. package/dist/voice/generation.cjs +700 -0
  390. package/dist/voice/generation.cjs.map +1 -0
  391. package/dist/voice/generation.d.cts +115 -0
  392. package/dist/voice/generation.d.ts +115 -0
  393. package/dist/voice/generation.d.ts.map +1 -0
  394. package/dist/voice/generation.js +672 -0
  395. package/dist/voice/generation.js.map +1 -0
  396. package/dist/voice/index.cjs +40 -0
  397. package/dist/voice/index.cjs.map +1 -0
  398. package/dist/voice/index.d.cts +5 -0
  399. package/dist/voice/index.d.ts +5 -0
  400. package/dist/voice/index.d.ts.map +1 -0
  401. package/dist/voice/index.js +11 -0
  402. package/dist/voice/index.js.map +1 -0
  403. package/dist/voice/io.cjs +245 -0
  404. package/dist/voice/io.cjs.map +1 -0
  405. package/dist/voice/io.d.cts +101 -0
  406. package/dist/voice/io.d.ts +101 -0
  407. package/dist/voice/io.d.ts.map +1 -0
  408. package/dist/voice/io.js +217 -0
  409. package/dist/voice/io.js.map +1 -0
  410. package/dist/voice/room_io/_input.cjs +121 -0
  411. package/dist/voice/room_io/_input.cjs.map +1 -0
  412. package/dist/voice/room_io/_input.d.cts +24 -0
  413. package/dist/voice/room_io/_input.d.ts +24 -0
  414. package/dist/voice/room_io/_input.d.ts.map +1 -0
  415. package/dist/voice/room_io/_input.js +102 -0
  416. package/dist/voice/room_io/_input.js.map +1 -0
  417. package/dist/voice/room_io/_output.cjs +358 -0
  418. package/dist/voice/room_io/_output.cjs.map +1 -0
  419. package/dist/voice/room_io/_output.d.cts +75 -0
  420. package/dist/voice/room_io/_output.d.ts +75 -0
  421. package/dist/voice/room_io/_output.d.ts.map +1 -0
  422. package/dist/voice/room_io/_output.js +342 -0
  423. package/dist/voice/room_io/_output.js.map +1 -0
  424. package/dist/voice/room_io/index.cjs +25 -0
  425. package/dist/voice/room_io/index.cjs.map +1 -0
  426. package/dist/voice/room_io/index.d.cts +3 -0
  427. package/dist/voice/room_io/index.d.ts +3 -0
  428. package/dist/voice/room_io/index.d.ts.map +1 -0
  429. package/dist/voice/room_io/index.js +3 -0
  430. package/dist/voice/room_io/index.js.map +1 -0
  431. package/dist/voice/room_io/room_io.cjs +370 -0
  432. package/dist/voice/room_io/room_io.cjs.map +1 -0
  433. package/dist/voice/room_io/room_io.d.cts +73 -0
  434. package/dist/voice/room_io/room_io.d.ts +73 -0
  435. package/dist/voice/room_io/room_io.d.ts.map +1 -0
  436. package/dist/voice/room_io/room_io.js +361 -0
  437. package/dist/voice/room_io/room_io.js.map +1 -0
  438. package/dist/{pipeline/index.cjs → voice/run_context.cjs} +16 -11
  439. package/dist/voice/run_context.cjs.map +1 -0
  440. package/dist/voice/run_context.d.cts +12 -0
  441. package/dist/voice/run_context.d.ts +12 -0
  442. package/dist/voice/run_context.d.ts.map +1 -0
  443. package/dist/voice/run_context.js +14 -0
  444. package/dist/voice/run_context.js.map +1 -0
  445. package/dist/voice/speech_handle.cjs +105 -0
  446. package/dist/voice/speech_handle.cjs.map +1 -0
  447. package/dist/voice/speech_handle.d.cts +46 -0
  448. package/dist/voice/speech_handle.d.ts +46 -0
  449. package/dist/voice/speech_handle.d.ts.map +1 -0
  450. package/dist/voice/speech_handle.js +81 -0
  451. package/dist/voice/speech_handle.js.map +1 -0
  452. package/dist/voice/transcription/_utils.cjs +45 -0
  453. package/dist/voice/transcription/_utils.cjs.map +1 -0
  454. package/dist/voice/transcription/_utils.d.cts +3 -0
  455. package/dist/voice/transcription/_utils.d.ts +3 -0
  456. package/dist/voice/transcription/_utils.d.ts.map +1 -0
  457. package/dist/voice/transcription/_utils.js +21 -0
  458. package/dist/voice/transcription/_utils.js.map +1 -0
  459. package/dist/voice/transcription/index.cjs +23 -0
  460. package/dist/voice/transcription/index.cjs.map +1 -0
  461. package/dist/voice/transcription/index.d.cts +2 -0
  462. package/dist/voice/transcription/index.d.ts +2 -0
  463. package/dist/voice/transcription/index.d.ts.map +1 -0
  464. package/dist/voice/transcription/index.js +2 -0
  465. package/dist/voice/transcription/index.js.map +1 -0
  466. package/dist/voice/transcription/synchronizer.cjs +380 -0
  467. package/dist/voice/transcription/synchronizer.cjs.map +1 -0
  468. package/dist/voice/transcription/synchronizer.d.cts +86 -0
  469. package/dist/voice/transcription/synchronizer.d.ts +86 -0
  470. package/dist/voice/transcription/synchronizer.d.ts.map +1 -0
  471. package/dist/voice/transcription/synchronizer.js +355 -0
  472. package/dist/voice/transcription/synchronizer.js.map +1 -0
  473. package/dist/worker.cjs +22 -4
  474. package/dist/worker.cjs.map +1 -1
  475. package/dist/worker.d.cts +1 -1
  476. package/dist/worker.d.ts +1 -1
  477. package/dist/worker.d.ts.map +1 -1
  478. package/dist/worker.js +22 -4
  479. package/dist/worker.js.map +1 -1
  480. package/package.json +9 -2
  481. package/src/_exceptions.ts +137 -0
  482. package/src/audio.ts +12 -1
  483. package/src/cli.ts +37 -0
  484. package/src/constants.ts +2 -1
  485. package/src/http_server.ts +1 -0
  486. package/src/index.ts +13 -10
  487. package/src/inference_runner.ts +2 -3
  488. package/src/ipc/inference_proc_executor.ts +2 -2
  489. package/src/ipc/job_executor.ts +1 -1
  490. package/src/ipc/job_proc_executor.ts +1 -1
  491. package/src/ipc/job_proc_lazy_main.ts +1 -1
  492. package/src/job.ts +18 -0
  493. package/src/llm/__snapshots__/chat_context.test.ts.snap +527 -0
  494. package/src/llm/__snapshots__/tool_context.test.ts.snap +177 -0
  495. package/src/llm/__snapshots__/utils.test.ts.snap +65 -0
  496. package/src/llm/chat_context.test.ts +450 -0
  497. package/src/llm/chat_context.ts +501 -103
  498. package/src/llm/index.ts +53 -18
  499. package/src/llm/llm.ts +149 -50
  500. package/src/llm/provider_format/google.test.ts +772 -0
  501. package/src/llm/provider_format/google.ts +130 -0
  502. package/src/llm/provider_format/index.ts +23 -0
  503. package/src/llm/provider_format/openai.test.ts +581 -0
  504. package/src/llm/provider_format/openai.ts +118 -0
  505. package/src/llm/provider_format/utils.ts +183 -0
  506. package/src/llm/realtime.ts +151 -0
  507. package/src/llm/remote_chat_context.test.ts +290 -0
  508. package/src/llm/remote_chat_context.ts +114 -0
  509. package/src/llm/tool_context.test.ts +198 -0
  510. package/src/llm/tool_context.ts +259 -0
  511. package/src/llm/tool_context.type.test.ts +115 -0
  512. package/src/llm/utils.test.ts +670 -0
  513. package/src/llm/utils.ts +324 -0
  514. package/src/metrics/base.ts +110 -78
  515. package/src/metrics/index.ts +3 -9
  516. package/src/metrics/usage_collector.ts +19 -13
  517. package/src/metrics/utils.ts +24 -69
  518. package/src/multimodal/index.ts +0 -1
  519. package/src/plugin.ts +26 -8
  520. package/src/stream/deferred_stream.test.ts +755 -0
  521. package/src/stream/deferred_stream.ts +110 -0
  522. package/src/stream/identity_transform.test.ts +179 -0
  523. package/src/stream/identity_transform.ts +18 -0
  524. package/src/stream/index.ts +7 -0
  525. package/src/stream/merge_readable_streams.ts +40 -0
  526. package/src/stream/stream_channel.test.ts +129 -0
  527. package/src/stream/stream_channel.ts +32 -0
  528. package/src/stt/stream_adapter.ts +3 -5
  529. package/src/stt/stt.ts +135 -17
  530. package/src/tokenize/basic/basic.ts +13 -5
  531. package/src/tokenize/basic/sentence.ts +20 -6
  532. package/src/tokenize/token_stream.ts +7 -4
  533. package/src/transcription.ts +2 -3
  534. package/src/tts/index.ts +0 -1
  535. package/src/tts/stream_adapter.ts +42 -16
  536. package/src/tts/tts.ts +203 -21
  537. package/src/types.ts +42 -0
  538. package/src/utils.test.ts +658 -0
  539. package/src/utils.ts +375 -44
  540. package/src/vad.ts +90 -22
  541. package/src/voice/agent.test.ts +80 -0
  542. package/src/voice/agent.ts +332 -0
  543. package/src/voice/agent_activity.ts +1913 -0
  544. package/src/voice/agent_session.ts +460 -0
  545. package/src/voice/audio_recognition.ts +474 -0
  546. package/src/voice/events.ts +252 -0
  547. package/src/voice/generation.ts +881 -0
  548. package/src/voice/index.ts +7 -0
  549. package/src/voice/io.ts +304 -0
  550. package/src/voice/room_io/_input.ts +144 -0
  551. package/src/voice/room_io/_output.ts +436 -0
  552. package/src/voice/room_io/index.ts +5 -0
  553. package/src/voice/room_io/room_io.ts +495 -0
  554. package/src/voice/run_context.ts +20 -0
  555. package/src/voice/speech_handle.ts +104 -0
  556. package/src/voice/transcription/_utils.ts +25 -0
  557. package/src/voice/transcription/index.ts +4 -0
  558. package/src/voice/transcription/synchronizer.ts +478 -0
  559. package/src/worker.ts +22 -2
  560. package/dist/llm/function_context.cjs +0 -103
  561. package/dist/llm/function_context.cjs.map +0 -1
  562. package/dist/llm/function_context.d.cts +0 -47
  563. package/dist/llm/function_context.d.ts +0 -47
  564. package/dist/llm/function_context.d.ts.map +0 -1
  565. package/dist/llm/function_context.js +0 -78
  566. package/dist/llm/function_context.js.map +0 -1
  567. package/dist/llm/function_context.test.cjs +0 -218
  568. package/dist/llm/function_context.test.cjs.map +0 -1
  569. package/dist/llm/function_context.test.js +0 -217
  570. package/dist/llm/function_context.test.js.map +0 -1
  571. package/dist/multimodal/multimodal_agent.cjs +0 -486
  572. package/dist/multimodal/multimodal_agent.cjs.map +0 -1
  573. package/dist/multimodal/multimodal_agent.d.cts +0 -48
  574. package/dist/multimodal/multimodal_agent.d.ts +0 -48
  575. package/dist/multimodal/multimodal_agent.d.ts.map +0 -1
  576. package/dist/multimodal/multimodal_agent.js +0 -461
  577. package/dist/multimodal/multimodal_agent.js.map +0 -1
  578. package/dist/pipeline/agent_output.cjs +0 -197
  579. package/dist/pipeline/agent_output.cjs.map +0 -1
  580. package/dist/pipeline/agent_output.d.cts +0 -33
  581. package/dist/pipeline/agent_output.d.ts +0 -33
  582. package/dist/pipeline/agent_output.d.ts.map +0 -1
  583. package/dist/pipeline/agent_output.js +0 -172
  584. package/dist/pipeline/agent_output.js.map +0 -1
  585. package/dist/pipeline/agent_playout.cjs +0 -175
  586. package/dist/pipeline/agent_playout.cjs.map +0 -1
  587. package/dist/pipeline/agent_playout.d.cts +0 -40
  588. package/dist/pipeline/agent_playout.d.ts +0 -40
  589. package/dist/pipeline/agent_playout.d.ts.map +0 -1
  590. package/dist/pipeline/agent_playout.js +0 -139
  591. package/dist/pipeline/agent_playout.js.map +0 -1
  592. package/dist/pipeline/human_input.cjs +0 -171
  593. package/dist/pipeline/human_input.cjs.map +0 -1
  594. package/dist/pipeline/human_input.d.cts +0 -30
  595. package/dist/pipeline/human_input.d.ts +0 -30
  596. package/dist/pipeline/human_input.d.ts.map +0 -1
  597. package/dist/pipeline/human_input.js +0 -146
  598. package/dist/pipeline/human_input.js.map +0 -1
  599. package/dist/pipeline/index.cjs.map +0 -1
  600. package/dist/pipeline/index.d.cts +0 -2
  601. package/dist/pipeline/index.d.ts +0 -2
  602. package/dist/pipeline/index.d.ts.map +0 -1
  603. package/dist/pipeline/index.js +0 -11
  604. package/dist/pipeline/index.js.map +0 -1
  605. package/dist/pipeline/pipeline_agent.cjs +0 -859
  606. package/dist/pipeline/pipeline_agent.cjs.map +0 -1
  607. package/dist/pipeline/pipeline_agent.d.cts +0 -150
  608. package/dist/pipeline/pipeline_agent.d.ts +0 -150
  609. package/dist/pipeline/pipeline_agent.d.ts.map +0 -1
  610. package/dist/pipeline/pipeline_agent.js +0 -837
  611. package/dist/pipeline/pipeline_agent.js.map +0 -1
  612. package/dist/pipeline/speech_handle.cjs +0 -176
  613. package/dist/pipeline/speech_handle.cjs.map +0 -1
  614. package/dist/pipeline/speech_handle.d.cts +0 -37
  615. package/dist/pipeline/speech_handle.d.ts +0 -37
  616. package/dist/pipeline/speech_handle.d.ts.map +0 -1
  617. package/dist/pipeline/speech_handle.js +0 -152
  618. package/dist/pipeline/speech_handle.js.map +0 -1
  619. package/src/llm/function_context.test.ts +0 -248
  620. package/src/llm/function_context.ts +0 -142
  621. package/src/multimodal/multimodal_agent.ts +0 -592
  622. package/src/pipeline/agent_output.ts +0 -219
  623. package/src/pipeline/agent_playout.ts +0 -192
  624. package/src/pipeline/human_input.ts +0 -188
  625. package/src/pipeline/index.ts +0 -15
  626. package/src/pipeline/pipeline_agent.ts +0 -1197
  627. package/src/pipeline/speech_handle.ts +0 -201
@@ -0,0 +1,18 @@
1
+ import { TransformStream } from "node:stream/web";
2
+ class IdentityTransform extends TransformStream {
3
+ constructor() {
4
+ super(
5
+ {
6
+ transform: (chunk, controller) => controller.enqueue(chunk)
7
+ },
8
+ // By default the transfor stream will buffer only one chunk at a time.
9
+ // In order to follow the python agents channel.py, we set set the capaciy to be effectively infinite.
10
+ { highWaterMark: Number.MAX_SAFE_INTEGER },
11
+ { highWaterMark: Number.MAX_SAFE_INTEGER }
12
+ );
13
+ }
14
+ }
15
+ export {
16
+ IdentityTransform
17
+ };
18
+ //# sourceMappingURL=identity_transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/stream/identity_transform.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { TransformStream } from 'node:stream/web';\n\nexport class IdentityTransform<T> extends TransformStream<T, T> {\n constructor() {\n super(\n {\n transform: (chunk, controller) => controller.enqueue(chunk),\n },\n // By default the transfor stream will buffer only one chunk at a time.\n // In order to follow the python agents channel.py, we set set the capaciy to be effectively infinite.\n { highWaterMark: Number.MAX_SAFE_INTEGER },\n { highWaterMark: Number.MAX_SAFE_INTEGER },\n );\n }\n}\n"],"mappings":"AAGA,SAAS,uBAAuB;AAEzB,MAAM,0BAA6B,gBAAsB;AAAA,EAC9D,cAAc;AACZ;AAAA,MACE;AAAA,QACE,WAAW,CAAC,OAAO,eAAe,WAAW,QAAQ,KAAK;AAAA,MAC5D;AAAA;AAAA;AAAA,MAGA,EAAE,eAAe,OAAO,iBAAiB;AAAA,MACzC,EAAE,eAAe,OAAO,iBAAiB;AAAA,IAC3C;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_identity_transform = require("./identity_transform.cjs");
4
+ (0, import_vitest.describe)("IdentityTransform", () => {
5
+ (0, import_vitest.it)("should handle stream with one value", async () => {
6
+ const transform = new import_identity_transform.IdentityTransform();
7
+ const writer = transform.writable.getWriter();
8
+ const reader = transform.readable.getReader();
9
+ const inputValue = "single value";
10
+ await writer.write(inputValue);
11
+ await writer.close();
12
+ const result = await reader.read();
13
+ (0, import_vitest.expect)(result.done).toBe(false);
14
+ (0, import_vitest.expect)(result.value).toBe(inputValue);
15
+ const nextResult = await reader.read();
16
+ (0, import_vitest.expect)(nextResult.done).toBe(true);
17
+ });
18
+ (0, import_vitest.it)("should handle multiple values in sequence", async () => {
19
+ const transform = new import_identity_transform.IdentityTransform();
20
+ const writer = transform.writable.getWriter();
21
+ const reader = transform.readable.getReader();
22
+ const inputValues = ["first", "second", "third"];
23
+ for (const value of inputValues) {
24
+ await writer.write(value);
25
+ }
26
+ await writer.close();
27
+ const results = [];
28
+ let result = await reader.read();
29
+ while (!result.done) {
30
+ results.push(result.value);
31
+ result = await reader.read();
32
+ }
33
+ (0, import_vitest.expect)(results).toEqual(inputValues);
34
+ });
35
+ (0, import_vitest.it)("should handle null and undefined values", async () => {
36
+ const transform = new import_identity_transform.IdentityTransform();
37
+ const writer = transform.writable.getWriter();
38
+ const reader = transform.readable.getReader();
39
+ const inputValues = ["test", null, void 0, "another"];
40
+ for (const value of inputValues) {
41
+ await writer.write(value);
42
+ }
43
+ await writer.close();
44
+ const results = [];
45
+ let result = await reader.read();
46
+ while (!result.done) {
47
+ results.push(result.value);
48
+ result = await reader.read();
49
+ }
50
+ (0, import_vitest.expect)(results).toEqual(inputValues);
51
+ });
52
+ (0, import_vitest.it)("should handle arrays", async () => {
53
+ const transform = new import_identity_transform.IdentityTransform();
54
+ const writer = transform.writable.getWriter();
55
+ const reader = transform.readable.getReader();
56
+ const inputValue = [1, 2, 3, 4, 5];
57
+ await writer.write(inputValue);
58
+ await writer.close();
59
+ const result = await reader.read();
60
+ (0, import_vitest.expect)(result.done).toBe(false);
61
+ (0, import_vitest.expect)(result.value).toEqual(inputValue);
62
+ (0, import_vitest.expect)(result.value).toBe(inputValue);
63
+ const nextResult = await reader.read();
64
+ (0, import_vitest.expect)(nextResult.done).toBe(true);
65
+ });
66
+ (0, import_vitest.it)("should work with streamed data", async () => {
67
+ const transform = new import_identity_transform.IdentityTransform();
68
+ const writer = transform.writable.getWriter();
69
+ const reader = transform.readable.getReader();
70
+ const testData = ["chunk1", "chunk2", "chunk3"];
71
+ const writePromise = (async () => {
72
+ for (const chunk of testData) {
73
+ await writer.write(chunk);
74
+ }
75
+ await writer.close();
76
+ })();
77
+ const results = [];
78
+ let result = await reader.read();
79
+ while (!result.done) {
80
+ results.push(result.value);
81
+ result = await reader.read();
82
+ }
83
+ await writePromise;
84
+ (0, import_vitest.expect)(results).toEqual(testData);
85
+ });
86
+ (0, import_vitest.it)("should handle empty stream", async () => {
87
+ const transform = new import_identity_transform.IdentityTransform();
88
+ const writer = transform.writable.getWriter();
89
+ const reader = transform.readable.getReader();
90
+ await writer.close();
91
+ const result = await reader.read();
92
+ (0, import_vitest.expect)(result.done).toBe(true);
93
+ });
94
+ (0, import_vitest.it)("should handle writer closing while reading is in progress", async () => {
95
+ const transform = new import_identity_transform.IdentityTransform();
96
+ const writer = transform.writable.getWriter();
97
+ const reader = transform.readable.getReader();
98
+ const testData = ["chunk1", "chunk2", "chunk3"];
99
+ const results = [];
100
+ await writer.write(testData[0]);
101
+ await writer.write(testData[1]);
102
+ const readPromise = (async () => {
103
+ let result = await reader.read();
104
+ while (!result.done) {
105
+ results.push(result.value);
106
+ result = await reader.read();
107
+ }
108
+ })();
109
+ await writer.write(testData[2]);
110
+ await writer.close();
111
+ await readPromise;
112
+ (0, import_vitest.expect)(results).toEqual(testData);
113
+ });
114
+ (0, import_vitest.it)("should handle a pending read when the writer is closed", async () => {
115
+ const transform = new import_identity_transform.IdentityTransform();
116
+ const writer = transform.writable.getWriter();
117
+ const reader = transform.readable.getReader();
118
+ const readPromise = reader.read();
119
+ await writer.close();
120
+ const result = await readPromise;
121
+ (0, import_vitest.expect)(result.done).toBe(true);
122
+ (0, import_vitest.expect)(result.value).toBeUndefined();
123
+ });
124
+ });
125
+ //# sourceMappingURL=identity_transform.test.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/stream/identity_transform.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { describe, expect, it } from 'vitest';\nimport { IdentityTransform } from './identity_transform.js';\n\ndescribe('IdentityTransform', () => {\n it('should handle stream with one value', async () => {\n const transform = new IdentityTransform<string>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n const inputValue = 'single value';\n\n await writer.write(inputValue);\n await writer.close();\n\n const result = await reader.read();\n expect(result.done).toBe(false);\n expect(result.value).toBe(inputValue);\n\n const nextResult = await reader.read();\n expect(nextResult.done).toBe(true);\n });\n\n it('should handle multiple values in sequence', async () => {\n const transform = new IdentityTransform<string>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n const inputValues = ['first', 'second', 'third'];\n\n // Write all values\n for (const value of inputValues) {\n await writer.write(value);\n }\n await writer.close();\n\n // Read all values\n const results: string[] = [];\n let result = await reader.read();\n while (!result.done) {\n results.push(result.value);\n result = await reader.read();\n }\n\n expect(results).toEqual(inputValues);\n });\n\n it('should handle null and undefined values', async () => {\n const transform = new IdentityTransform<string | null | undefined>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n const inputValues = ['test', null, undefined, 'another'];\n\n // Write all values\n for (const value of inputValues) {\n await writer.write(value);\n }\n await writer.close();\n\n // Read all values\n const results: (string | null | undefined)[] = [];\n let result = await reader.read();\n while (!result.done) {\n results.push(result.value);\n result = await reader.read();\n }\n\n expect(results).toEqual(inputValues);\n });\n\n it('should handle arrays', async () => {\n const transform = new IdentityTransform<number[]>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n const inputValue = [1, 2, 3, 4, 5];\n\n await writer.write(inputValue);\n await writer.close();\n\n const result = await reader.read();\n\n expect(result.done).toBe(false);\n expect(result.value).toEqual(inputValue);\n expect(result.value).toBe(inputValue); // Should be the same reference\n\n const nextResult = await reader.read();\n expect(nextResult.done).toBe(true);\n });\n\n it('should work with streamed data', async () => {\n const transform = new IdentityTransform<string>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n const testData = ['chunk1', 'chunk2', 'chunk3'];\n\n // Write data asynchronously to simulate streaming\n const writePromise = (async () => {\n for (const chunk of testData) {\n await writer.write(chunk);\n }\n await writer.close();\n })();\n\n // Read data as it comes through\n const results: string[] = [];\n let result = await reader.read();\n while (!result.done) {\n results.push(result.value);\n result = await reader.read();\n }\n\n await writePromise;\n expect(results).toEqual(testData);\n });\n\n it('should handle empty stream', async () => {\n const transform = new IdentityTransform<string>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n // Close immediately without writing anything\n await writer.close();\n\n // Should immediately be done\n const result = await reader.read();\n expect(result.done).toBe(true);\n });\n\n it('should handle writer closing while reading is in progress', async () => {\n const transform = new IdentityTransform<string>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n const testData = ['chunk1', 'chunk2', 'chunk3'];\n const results: string[] = [];\n\n // Start writing some data\n await writer.write(testData[0]);\n await writer.write(testData[1]);\n\n // Start reading concurrently\n const readPromise = (async () => {\n let result = await reader.read();\n while (!result.done) {\n results.push(result.value);\n result = await reader.read();\n }\n })();\n\n // Write one more chunk and then close the writer while reading\n await writer.write(testData[2]);\n await writer.close();\n\n // Wait for reading to complete\n await readPromise;\n\n // Should have received all the data\n expect(results).toEqual(testData);\n });\n\n it('should handle a pending read when the writer is closed', async () => {\n const transform = new IdentityTransform<string>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n const readPromise = reader.read();\n\n await writer.close();\n\n const result = await readPromise;\n expect(result.done).toBe(true);\n expect(result.value).toBeUndefined();\n });\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,124 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { IdentityTransform } from "./identity_transform.js";
3
+ describe("IdentityTransform", () => {
4
+ it("should handle stream with one value", async () => {
5
+ const transform = new IdentityTransform();
6
+ const writer = transform.writable.getWriter();
7
+ const reader = transform.readable.getReader();
8
+ const inputValue = "single value";
9
+ await writer.write(inputValue);
10
+ await writer.close();
11
+ const result = await reader.read();
12
+ expect(result.done).toBe(false);
13
+ expect(result.value).toBe(inputValue);
14
+ const nextResult = await reader.read();
15
+ expect(nextResult.done).toBe(true);
16
+ });
17
+ it("should handle multiple values in sequence", async () => {
18
+ const transform = new IdentityTransform();
19
+ const writer = transform.writable.getWriter();
20
+ const reader = transform.readable.getReader();
21
+ const inputValues = ["first", "second", "third"];
22
+ for (const value of inputValues) {
23
+ await writer.write(value);
24
+ }
25
+ await writer.close();
26
+ const results = [];
27
+ let result = await reader.read();
28
+ while (!result.done) {
29
+ results.push(result.value);
30
+ result = await reader.read();
31
+ }
32
+ expect(results).toEqual(inputValues);
33
+ });
34
+ it("should handle null and undefined values", async () => {
35
+ const transform = new IdentityTransform();
36
+ const writer = transform.writable.getWriter();
37
+ const reader = transform.readable.getReader();
38
+ const inputValues = ["test", null, void 0, "another"];
39
+ for (const value of inputValues) {
40
+ await writer.write(value);
41
+ }
42
+ await writer.close();
43
+ const results = [];
44
+ let result = await reader.read();
45
+ while (!result.done) {
46
+ results.push(result.value);
47
+ result = await reader.read();
48
+ }
49
+ expect(results).toEqual(inputValues);
50
+ });
51
+ it("should handle arrays", async () => {
52
+ const transform = new IdentityTransform();
53
+ const writer = transform.writable.getWriter();
54
+ const reader = transform.readable.getReader();
55
+ const inputValue = [1, 2, 3, 4, 5];
56
+ await writer.write(inputValue);
57
+ await writer.close();
58
+ const result = await reader.read();
59
+ expect(result.done).toBe(false);
60
+ expect(result.value).toEqual(inputValue);
61
+ expect(result.value).toBe(inputValue);
62
+ const nextResult = await reader.read();
63
+ expect(nextResult.done).toBe(true);
64
+ });
65
+ it("should work with streamed data", async () => {
66
+ const transform = new IdentityTransform();
67
+ const writer = transform.writable.getWriter();
68
+ const reader = transform.readable.getReader();
69
+ const testData = ["chunk1", "chunk2", "chunk3"];
70
+ const writePromise = (async () => {
71
+ for (const chunk of testData) {
72
+ await writer.write(chunk);
73
+ }
74
+ await writer.close();
75
+ })();
76
+ const results = [];
77
+ let result = await reader.read();
78
+ while (!result.done) {
79
+ results.push(result.value);
80
+ result = await reader.read();
81
+ }
82
+ await writePromise;
83
+ expect(results).toEqual(testData);
84
+ });
85
+ it("should handle empty stream", async () => {
86
+ const transform = new IdentityTransform();
87
+ const writer = transform.writable.getWriter();
88
+ const reader = transform.readable.getReader();
89
+ await writer.close();
90
+ const result = await reader.read();
91
+ expect(result.done).toBe(true);
92
+ });
93
+ it("should handle writer closing while reading is in progress", async () => {
94
+ const transform = new IdentityTransform();
95
+ const writer = transform.writable.getWriter();
96
+ const reader = transform.readable.getReader();
97
+ const testData = ["chunk1", "chunk2", "chunk3"];
98
+ const results = [];
99
+ await writer.write(testData[0]);
100
+ await writer.write(testData[1]);
101
+ const readPromise = (async () => {
102
+ let result = await reader.read();
103
+ while (!result.done) {
104
+ results.push(result.value);
105
+ result = await reader.read();
106
+ }
107
+ })();
108
+ await writer.write(testData[2]);
109
+ await writer.close();
110
+ await readPromise;
111
+ expect(results).toEqual(testData);
112
+ });
113
+ it("should handle a pending read when the writer is closed", async () => {
114
+ const transform = new IdentityTransform();
115
+ const writer = transform.writable.getWriter();
116
+ const reader = transform.readable.getReader();
117
+ const readPromise = reader.read();
118
+ await writer.close();
119
+ const result = await readPromise;
120
+ expect(result.done).toBe(true);
121
+ expect(result.value).toBeUndefined();
122
+ });
123
+ });
124
+ //# sourceMappingURL=identity_transform.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/stream/identity_transform.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { describe, expect, it } from 'vitest';\nimport { IdentityTransform } from './identity_transform.js';\n\ndescribe('IdentityTransform', () => {\n it('should handle stream with one value', async () => {\n const transform = new IdentityTransform<string>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n const inputValue = 'single value';\n\n await writer.write(inputValue);\n await writer.close();\n\n const result = await reader.read();\n expect(result.done).toBe(false);\n expect(result.value).toBe(inputValue);\n\n const nextResult = await reader.read();\n expect(nextResult.done).toBe(true);\n });\n\n it('should handle multiple values in sequence', async () => {\n const transform = new IdentityTransform<string>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n const inputValues = ['first', 'second', 'third'];\n\n // Write all values\n for (const value of inputValues) {\n await writer.write(value);\n }\n await writer.close();\n\n // Read all values\n const results: string[] = [];\n let result = await reader.read();\n while (!result.done) {\n results.push(result.value);\n result = await reader.read();\n }\n\n expect(results).toEqual(inputValues);\n });\n\n it('should handle null and undefined values', async () => {\n const transform = new IdentityTransform<string | null | undefined>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n const inputValues = ['test', null, undefined, 'another'];\n\n // Write all values\n for (const value of inputValues) {\n await writer.write(value);\n }\n await writer.close();\n\n // Read all values\n const results: (string | null | undefined)[] = [];\n let result = await reader.read();\n while (!result.done) {\n results.push(result.value);\n result = await reader.read();\n }\n\n expect(results).toEqual(inputValues);\n });\n\n it('should handle arrays', async () => {\n const transform = new IdentityTransform<number[]>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n const inputValue = [1, 2, 3, 4, 5];\n\n await writer.write(inputValue);\n await writer.close();\n\n const result = await reader.read();\n\n expect(result.done).toBe(false);\n expect(result.value).toEqual(inputValue);\n expect(result.value).toBe(inputValue); // Should be the same reference\n\n const nextResult = await reader.read();\n expect(nextResult.done).toBe(true);\n });\n\n it('should work with streamed data', async () => {\n const transform = new IdentityTransform<string>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n const testData = ['chunk1', 'chunk2', 'chunk3'];\n\n // Write data asynchronously to simulate streaming\n const writePromise = (async () => {\n for (const chunk of testData) {\n await writer.write(chunk);\n }\n await writer.close();\n })();\n\n // Read data as it comes through\n const results: string[] = [];\n let result = await reader.read();\n while (!result.done) {\n results.push(result.value);\n result = await reader.read();\n }\n\n await writePromise;\n expect(results).toEqual(testData);\n });\n\n it('should handle empty stream', async () => {\n const transform = new IdentityTransform<string>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n // Close immediately without writing anything\n await writer.close();\n\n // Should immediately be done\n const result = await reader.read();\n expect(result.done).toBe(true);\n });\n\n it('should handle writer closing while reading is in progress', async () => {\n const transform = new IdentityTransform<string>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n const testData = ['chunk1', 'chunk2', 'chunk3'];\n const results: string[] = [];\n\n // Start writing some data\n await writer.write(testData[0]);\n await writer.write(testData[1]);\n\n // Start reading concurrently\n const readPromise = (async () => {\n let result = await reader.read();\n while (!result.done) {\n results.push(result.value);\n result = await reader.read();\n }\n })();\n\n // Write one more chunk and then close the writer while reading\n await writer.write(testData[2]);\n await writer.close();\n\n // Wait for reading to complete\n await readPromise;\n\n // Should have received all the data\n expect(results).toEqual(testData);\n });\n\n it('should handle a pending read when the writer is closed', async () => {\n const transform = new IdentityTransform<string>();\n const writer = transform.writable.getWriter();\n const reader = transform.readable.getReader();\n\n const readPromise = reader.read();\n\n await writer.close();\n\n const result = await readPromise;\n expect(result.done).toBe(true);\n expect(result.value).toBeUndefined();\n });\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var stream_exports = {};
20
+ __export(stream_exports, {
21
+ DeferredReadableStream: () => import_deferred_stream.DeferredReadableStream,
22
+ IdentityTransform: () => import_identity_transform.IdentityTransform,
23
+ createStreamChannel: () => import_stream_channel.createStreamChannel,
24
+ mergeReadableStreams: () => import_merge_readable_streams.mergeReadableStreams
25
+ });
26
+ module.exports = __toCommonJS(stream_exports);
27
+ var import_deferred_stream = require("./deferred_stream.cjs");
28
+ var import_identity_transform = require("./identity_transform.cjs");
29
+ var import_merge_readable_streams = require("./merge_readable_streams.cjs");
30
+ var import_stream_channel = require("./stream_channel.cjs");
31
+ // Annotate the CommonJS export names for ESM import in node:
32
+ 0 && (module.exports = {
33
+ DeferredReadableStream,
34
+ IdentityTransform,
35
+ createStreamChannel,
36
+ mergeReadableStreams
37
+ });
38
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/stream/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nexport { DeferredReadableStream } from './deferred_stream.js';\nexport { IdentityTransform } from './identity_transform.js';\nexport { mergeReadableStreams } from './merge_readable_streams.js';\nexport { createStreamChannel, type StreamChannel } from './stream_channel.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,6BAAuC;AACvC,gCAAkC;AAClC,oCAAqC;AACrC,4BAAwD;","names":[]}
@@ -0,0 +1,5 @@
1
+ export { DeferredReadableStream } from './deferred_stream.js';
2
+ export { IdentityTransform } from './identity_transform.js';
3
+ export { mergeReadableStreams } from './merge_readable_streams.js';
4
+ export { createStreamChannel, type StreamChannel } from './stream_channel.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,5 @@
1
+ export { DeferredReadableStream } from './deferred_stream.js';
2
+ export { IdentityTransform } from './identity_transform.js';
3
+ export { mergeReadableStreams } from './merge_readable_streams.js';
4
+ export { createStreamChannel, type StreamChannel } from './stream_channel.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stream/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { DeferredReadableStream } from "./deferred_stream.js";
2
+ import { IdentityTransform } from "./identity_transform.js";
3
+ import { mergeReadableStreams } from "./merge_readable_streams.js";
4
+ import { createStreamChannel } from "./stream_channel.js";
5
+ export {
6
+ DeferredReadableStream,
7
+ IdentityTransform,
8
+ createStreamChannel,
9
+ mergeReadableStreams
10
+ };
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/stream/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nexport { DeferredReadableStream } from './deferred_stream.js';\nexport { IdentityTransform } from './identity_transform.js';\nexport { mergeReadableStreams } from './merge_readable_streams.js';\nexport { createStreamChannel, type StreamChannel } from './stream_channel.js';\n"],"mappings":"AAGA,SAAS,8BAA8B;AACvC,SAAS,yBAAyB;AAClC,SAAS,4BAA4B;AACrC,SAAS,2BAA+C;","names":[]}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var merge_readable_streams_exports = {};
20
+ __export(merge_readable_streams_exports, {
21
+ mergeReadableStreams: () => mergeReadableStreams
22
+ });
23
+ module.exports = __toCommonJS(merge_readable_streams_exports);
24
+ var import_web = require("node:stream/web");
25
+ var import_utils = require("../utils.cjs");
26
+ function mergeReadableStreams(...streams) {
27
+ const resolvePromises = streams.map(() => (0, import_utils.withResolvers)());
28
+ return new import_web.ReadableStream({
29
+ start(controller) {
30
+ let mustClose = false;
31
+ Promise.all(resolvePromises.map(({ promise }) => promise)).then(() => {
32
+ controller.close();
33
+ }).catch((error) => {
34
+ mustClose = true;
35
+ controller.error(error);
36
+ });
37
+ for (const [index, stream] of streams.entries()) {
38
+ (async () => {
39
+ try {
40
+ for await (const data of stream) {
41
+ if (mustClose) {
42
+ break;
43
+ }
44
+ controller.enqueue(data);
45
+ }
46
+ resolvePromises[index].resolve();
47
+ } catch (error) {
48
+ resolvePromises[index].reject(error);
49
+ }
50
+ })();
51
+ }
52
+ }
53
+ });
54
+ }
55
+ // Annotate the CommonJS export names for ESM import in node:
56
+ 0 && (module.exports = {
57
+ mergeReadableStreams
58
+ });
59
+ //# sourceMappingURL=merge_readable_streams.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/stream/merge_readable_streams.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { ReadableStream } from 'node:stream/web';\nimport { withResolvers } from '../utils.js';\n\n// Adapted from https://github.com/denoland/std/blob/main/streams/merge_readable_streams.ts\n// we manually adapted to make ReadableStream<T> typing compatible with our current node\n// version as well as typescript configuration\nexport function mergeReadableStreams<T>(...streams: ReadableStream<T>[]): ReadableStream<T> {\n const resolvePromises = streams.map(() => withResolvers<void>());\n return new ReadableStream<T>({\n start(controller) {\n let mustClose = false;\n Promise.all(resolvePromises.map(({ promise }) => promise))\n .then(() => {\n controller.close();\n })\n .catch((error) => {\n mustClose = true;\n controller.error(error);\n });\n for (const [index, stream] of streams.entries()) {\n (async () => {\n try {\n for await (const data of stream) {\n if (mustClose) {\n break;\n }\n controller.enqueue(data);\n }\n resolvePromises[index]!.resolve();\n } catch (error) {\n resolvePromises[index]!.reject(error);\n }\n })();\n }\n },\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,iBAA+B;AAC/B,mBAA8B;AAKvB,SAAS,wBAA2B,SAAiD;AAC1F,QAAM,kBAAkB,QAAQ,IAAI,UAAM,4BAAoB,CAAC;AAC/D,SAAO,IAAI,0BAAkB;AAAA,IAC3B,MAAM,YAAY;AAChB,UAAI,YAAY;AAChB,cAAQ,IAAI,gBAAgB,IAAI,CAAC,EAAE,QAAQ,MAAM,OAAO,CAAC,EACtD,KAAK,MAAM;AACV,mBAAW,MAAM;AAAA,MACnB,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,oBAAY;AACZ,mBAAW,MAAM,KAAK;AAAA,MACxB,CAAC;AACH,iBAAW,CAAC,OAAO,MAAM,KAAK,QAAQ,QAAQ,GAAG;AAC/C,SAAC,YAAY;AACX,cAAI;AACF,6BAAiB,QAAQ,QAAQ;AAC/B,kBAAI,WAAW;AACb;AAAA,cACF;AACA,yBAAW,QAAQ,IAAI;AAAA,YACzB;AACA,4BAAgB,KAAK,EAAG,QAAQ;AAAA,UAClC,SAAS,OAAO;AACd,4BAAgB,KAAK,EAAG,OAAO,KAAK;AAAA,UACtC;AAAA,QACF,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,4 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { ReadableStream } from 'node:stream/web';
3
+ export declare function mergeReadableStreams<T>(...streams: ReadableStream<T>[]): ReadableStream<T>;
4
+ //# sourceMappingURL=merge_readable_streams.d.ts.map
@@ -0,0 +1,4 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { ReadableStream } from 'node:stream/web';
3
+ export declare function mergeReadableStreams<T>(...streams: ReadableStream<T>[]): ReadableStream<T>;
4
+ //# sourceMappingURL=merge_readable_streams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge_readable_streams.d.ts","sourceRoot":"","sources":["../../src/stream/merge_readable_streams.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMjD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,CA8B1F"}
@@ -0,0 +1,35 @@
1
+ import { ReadableStream } from "node:stream/web";
2
+ import { withResolvers } from "../utils.js";
3
+ function mergeReadableStreams(...streams) {
4
+ const resolvePromises = streams.map(() => withResolvers());
5
+ return new ReadableStream({
6
+ start(controller) {
7
+ let mustClose = false;
8
+ Promise.all(resolvePromises.map(({ promise }) => promise)).then(() => {
9
+ controller.close();
10
+ }).catch((error) => {
11
+ mustClose = true;
12
+ controller.error(error);
13
+ });
14
+ for (const [index, stream] of streams.entries()) {
15
+ (async () => {
16
+ try {
17
+ for await (const data of stream) {
18
+ if (mustClose) {
19
+ break;
20
+ }
21
+ controller.enqueue(data);
22
+ }
23
+ resolvePromises[index].resolve();
24
+ } catch (error) {
25
+ resolvePromises[index].reject(error);
26
+ }
27
+ })();
28
+ }
29
+ }
30
+ });
31
+ }
32
+ export {
33
+ mergeReadableStreams
34
+ };
35
+ //# sourceMappingURL=merge_readable_streams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/stream/merge_readable_streams.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { ReadableStream } from 'node:stream/web';\nimport { withResolvers } from '../utils.js';\n\n// Adapted from https://github.com/denoland/std/blob/main/streams/merge_readable_streams.ts\n// we manually adapted to make ReadableStream<T> typing compatible with our current node\n// version as well as typescript configuration\nexport function mergeReadableStreams<T>(...streams: ReadableStream<T>[]): ReadableStream<T> {\n const resolvePromises = streams.map(() => withResolvers<void>());\n return new ReadableStream<T>({\n start(controller) {\n let mustClose = false;\n Promise.all(resolvePromises.map(({ promise }) => promise))\n .then(() => {\n controller.close();\n })\n .catch((error) => {\n mustClose = true;\n controller.error(error);\n });\n for (const [index, stream] of streams.entries()) {\n (async () => {\n try {\n for await (const data of stream) {\n if (mustClose) {\n break;\n }\n controller.enqueue(data);\n }\n resolvePromises[index]!.resolve();\n } catch (error) {\n resolvePromises[index]!.reject(error);\n }\n })();\n }\n },\n });\n}\n"],"mappings":"AAGA,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAKvB,SAAS,wBAA2B,SAAiD;AAC1F,QAAM,kBAAkB,QAAQ,IAAI,MAAM,cAAoB,CAAC;AAC/D,SAAO,IAAI,eAAkB;AAAA,IAC3B,MAAM,YAAY;AAChB,UAAI,YAAY;AAChB,cAAQ,IAAI,gBAAgB,IAAI,CAAC,EAAE,QAAQ,MAAM,OAAO,CAAC,EACtD,KAAK,MAAM;AACV,mBAAW,MAAM;AAAA,MACnB,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,oBAAY;AACZ,mBAAW,MAAM,KAAK;AAAA,MACxB,CAAC;AACH,iBAAW,CAAC,OAAO,MAAM,KAAK,QAAQ,QAAQ,GAAG;AAC/C,SAAC,YAAY;AACX,cAAI;AACF,6BAAiB,QAAQ,QAAQ;AAC/B,kBAAI,WAAW;AACb;AAAA,cACF;AACA,yBAAW,QAAQ,IAAI;AAAA,YACzB;AACA,4BAAgB,KAAK,EAAG,QAAQ;AAAA,UAClC,SAAS,OAAO;AACd,4BAAgB,KAAK,EAAG,OAAO,KAAK;AAAA,UACtC;AAAA,QACF,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var stream_channel_exports = {};
20
+ __export(stream_channel_exports, {
21
+ createStreamChannel: () => createStreamChannel
22
+ });
23
+ module.exports = __toCommonJS(stream_channel_exports);
24
+ var import_identity_transform = require("./identity_transform.cjs");
25
+ function createStreamChannel() {
26
+ const transform = new import_identity_transform.IdentityTransform();
27
+ const writer = transform.writable.getWriter();
28
+ return {
29
+ write: (chunk) => writer.write(chunk),
30
+ stream: () => transform.readable,
31
+ close: async () => {
32
+ try {
33
+ return await writer.close();
34
+ } catch (e) {
35
+ if (e instanceof Error && e.name === "TypeError") {
36
+ return;
37
+ }
38
+ throw e;
39
+ }
40
+ }
41
+ };
42
+ }
43
+ // Annotate the CommonJS export names for ESM import in node:
44
+ 0 && (module.exports = {
45
+ createStreamChannel
46
+ });
47
+ //# sourceMappingURL=stream_channel.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/stream/stream_channel.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { ReadableStream } from 'node:stream/web';\nimport { IdentityTransform } from './identity_transform.js';\n\nexport interface StreamChannel<T> {\n write(chunk: T): Promise<void>;\n close(): Promise<void>;\n stream(): ReadableStream<T>;\n}\n\nexport function createStreamChannel<T>(): StreamChannel<T> {\n const transform = new IdentityTransform<T>();\n const writer = transform.writable.getWriter();\n\n return {\n write: (chunk: T) => writer.write(chunk),\n stream: () => transform.readable,\n close: async () => {\n try {\n return await writer.close();\n } catch (e) {\n if (e instanceof Error && e.name === 'TypeError') {\n // Ignore error if the stream is already closed\n return;\n }\n throw e;\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,gCAAkC;AAQ3B,SAAS,sBAA2C;AACzD,QAAM,YAAY,IAAI,4CAAqB;AAC3C,QAAM,SAAS,UAAU,SAAS,UAAU;AAE5C,SAAO;AAAA,IACL,OAAO,CAAC,UAAa,OAAO,MAAM,KAAK;AAAA,IACvC,QAAQ,MAAM,UAAU;AAAA,IACxB,OAAO,YAAY;AACjB,UAAI;AACF,eAAO,MAAM,OAAO,MAAM;AAAA,MAC5B,SAAS,GAAG;AACV,YAAI,aAAa,SAAS,EAAE,SAAS,aAAa;AAEhD;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,9 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import type { ReadableStream } from 'node:stream/web';
3
+ export interface StreamChannel<T> {
4
+ write(chunk: T): Promise<void>;
5
+ close(): Promise<void>;
6
+ stream(): ReadableStream<T>;
7
+ }
8
+ export declare function createStreamChannel<T>(): StreamChannel<T>;
9
+ //# sourceMappingURL=stream_channel.d.ts.map
@@ -0,0 +1,9 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import type { ReadableStream } from 'node:stream/web';
3
+ export interface StreamChannel<T> {
4
+ write(chunk: T): Promise<void>;
5
+ close(): Promise<void>;
6
+ stream(): ReadableStream<T>;
7
+ }
8
+ export declare function createStreamChannel<T>(): StreamChannel<T>;
9
+ //# sourceMappingURL=stream_channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream_channel.d.ts","sourceRoot":"","sources":["../../src/stream/stream_channel.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC;CAC7B;AAED,wBAAgB,mBAAmB,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,CAmBzD"}
@@ -0,0 +1,23 @@
1
+ import { IdentityTransform } from "./identity_transform.js";
2
+ function createStreamChannel() {
3
+ const transform = new IdentityTransform();
4
+ const writer = transform.writable.getWriter();
5
+ return {
6
+ write: (chunk) => writer.write(chunk),
7
+ stream: () => transform.readable,
8
+ close: async () => {
9
+ try {
10
+ return await writer.close();
11
+ } catch (e) {
12
+ if (e instanceof Error && e.name === "TypeError") {
13
+ return;
14
+ }
15
+ throw e;
16
+ }
17
+ }
18
+ };
19
+ }
20
+ export {
21
+ createStreamChannel
22
+ };
23
+ //# sourceMappingURL=stream_channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/stream/stream_channel.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { ReadableStream } from 'node:stream/web';\nimport { IdentityTransform } from './identity_transform.js';\n\nexport interface StreamChannel<T> {\n write(chunk: T): Promise<void>;\n close(): Promise<void>;\n stream(): ReadableStream<T>;\n}\n\nexport function createStreamChannel<T>(): StreamChannel<T> {\n const transform = new IdentityTransform<T>();\n const writer = transform.writable.getWriter();\n\n return {\n write: (chunk: T) => writer.write(chunk),\n stream: () => transform.readable,\n close: async () => {\n try {\n return await writer.close();\n } catch (e) {\n if (e instanceof Error && e.name === 'TypeError') {\n // Ignore error if the stream is already closed\n return;\n }\n throw e;\n }\n },\n };\n}\n"],"mappings":"AAIA,SAAS,yBAAyB;AAQ3B,SAAS,sBAA2C;AACzD,QAAM,YAAY,IAAI,kBAAqB;AAC3C,QAAM,SAAS,UAAU,SAAS,UAAU;AAE5C,SAAO;AAAA,IACL,OAAO,CAAC,UAAa,OAAO,MAAM,KAAK;AAAA,IACvC,QAAQ,MAAM,UAAU;AAAA,IACxB,OAAO,YAAY;AACjB,UAAI;AACF,eAAO,MAAM,OAAO,MAAM;AAAA,MAC5B,SAAS,GAAG;AACV,YAAI,aAAa,SAAS,EAAE,SAAS,aAAa;AAEhD;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;","names":[]}