@livekit/agents 1.0.46 → 1.0.47

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 (151) hide show
  1. package/dist/cli.cjs +14 -20
  2. package/dist/cli.cjs.map +1 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +14 -20
  5. package/dist/cli.js.map +1 -1
  6. package/dist/ipc/job_proc_lazy_main.cjs +14 -5
  7. package/dist/ipc/job_proc_lazy_main.cjs.map +1 -1
  8. package/dist/ipc/job_proc_lazy_main.js +14 -5
  9. package/dist/ipc/job_proc_lazy_main.js.map +1 -1
  10. package/dist/llm/chat_context.cjs +19 -0
  11. package/dist/llm/chat_context.cjs.map +1 -1
  12. package/dist/llm/chat_context.d.cts +4 -0
  13. package/dist/llm/chat_context.d.ts +4 -0
  14. package/dist/llm/chat_context.d.ts.map +1 -1
  15. package/dist/llm/chat_context.js +19 -0
  16. package/dist/llm/chat_context.js.map +1 -1
  17. package/dist/llm/provider_format/index.cjs +2 -0
  18. package/dist/llm/provider_format/index.cjs.map +1 -1
  19. package/dist/llm/provider_format/index.d.cts +1 -1
  20. package/dist/llm/provider_format/index.d.ts +1 -1
  21. package/dist/llm/provider_format/index.d.ts.map +1 -1
  22. package/dist/llm/provider_format/index.js +6 -1
  23. package/dist/llm/provider_format/index.js.map +1 -1
  24. package/dist/llm/provider_format/openai.cjs +82 -2
  25. package/dist/llm/provider_format/openai.cjs.map +1 -1
  26. package/dist/llm/provider_format/openai.d.cts +1 -0
  27. package/dist/llm/provider_format/openai.d.ts +1 -0
  28. package/dist/llm/provider_format/openai.d.ts.map +1 -1
  29. package/dist/llm/provider_format/openai.js +80 -1
  30. package/dist/llm/provider_format/openai.js.map +1 -1
  31. package/dist/llm/provider_format/openai.test.cjs +326 -0
  32. package/dist/llm/provider_format/openai.test.cjs.map +1 -1
  33. package/dist/llm/provider_format/openai.test.js +327 -1
  34. package/dist/llm/provider_format/openai.test.js.map +1 -1
  35. package/dist/llm/provider_format/utils.cjs +4 -3
  36. package/dist/llm/provider_format/utils.cjs.map +1 -1
  37. package/dist/llm/provider_format/utils.d.ts.map +1 -1
  38. package/dist/llm/provider_format/utils.js +4 -3
  39. package/dist/llm/provider_format/utils.js.map +1 -1
  40. package/dist/llm/realtime.cjs.map +1 -1
  41. package/dist/llm/realtime.d.cts +1 -0
  42. package/dist/llm/realtime.d.ts +1 -0
  43. package/dist/llm/realtime.d.ts.map +1 -1
  44. package/dist/llm/realtime.js.map +1 -1
  45. package/dist/log.cjs +5 -2
  46. package/dist/log.cjs.map +1 -1
  47. package/dist/log.d.ts.map +1 -1
  48. package/dist/log.js +5 -2
  49. package/dist/log.js.map +1 -1
  50. package/dist/stream/deferred_stream.cjs +15 -6
  51. package/dist/stream/deferred_stream.cjs.map +1 -1
  52. package/dist/stream/deferred_stream.d.ts.map +1 -1
  53. package/dist/stream/deferred_stream.js +15 -6
  54. package/dist/stream/deferred_stream.js.map +1 -1
  55. package/dist/utils.cjs +31 -2
  56. package/dist/utils.cjs.map +1 -1
  57. package/dist/utils.d.cts +7 -0
  58. package/dist/utils.d.ts +7 -0
  59. package/dist/utils.d.ts.map +1 -1
  60. package/dist/utils.js +31 -2
  61. package/dist/utils.js.map +1 -1
  62. package/dist/utils.test.cjs +71 -0
  63. package/dist/utils.test.cjs.map +1 -1
  64. package/dist/utils.test.js +71 -0
  65. package/dist/utils.test.js.map +1 -1
  66. package/dist/version.cjs +1 -1
  67. package/dist/version.cjs.map +1 -1
  68. package/dist/version.d.cts +1 -1
  69. package/dist/version.d.ts +1 -1
  70. package/dist/version.d.ts.map +1 -1
  71. package/dist/version.js +1 -1
  72. package/dist/version.js.map +1 -1
  73. package/dist/voice/agent.cjs +144 -12
  74. package/dist/voice/agent.cjs.map +1 -1
  75. package/dist/voice/agent.d.cts +29 -4
  76. package/dist/voice/agent.d.ts +29 -4
  77. package/dist/voice/agent.d.ts.map +1 -1
  78. package/dist/voice/agent.js +140 -11
  79. package/dist/voice/agent.js.map +1 -1
  80. package/dist/voice/agent.test.cjs +120 -0
  81. package/dist/voice/agent.test.cjs.map +1 -1
  82. package/dist/voice/agent.test.js +122 -2
  83. package/dist/voice/agent.test.js.map +1 -1
  84. package/dist/voice/agent_activity.cjs +383 -298
  85. package/dist/voice/agent_activity.cjs.map +1 -1
  86. package/dist/voice/agent_activity.d.cts +34 -7
  87. package/dist/voice/agent_activity.d.ts +34 -7
  88. package/dist/voice/agent_activity.d.ts.map +1 -1
  89. package/dist/voice/agent_activity.js +383 -293
  90. package/dist/voice/agent_activity.js.map +1 -1
  91. package/dist/voice/agent_session.cjs +140 -40
  92. package/dist/voice/agent_session.cjs.map +1 -1
  93. package/dist/voice/agent_session.d.cts +19 -7
  94. package/dist/voice/agent_session.d.ts +19 -7
  95. package/dist/voice/agent_session.d.ts.map +1 -1
  96. package/dist/voice/agent_session.js +137 -37
  97. package/dist/voice/agent_session.js.map +1 -1
  98. package/dist/voice/audio_recognition.cjs +4 -0
  99. package/dist/voice/audio_recognition.cjs.map +1 -1
  100. package/dist/voice/audio_recognition.d.ts.map +1 -1
  101. package/dist/voice/audio_recognition.js +4 -0
  102. package/dist/voice/audio_recognition.js.map +1 -1
  103. package/dist/voice/generation.cjs +39 -19
  104. package/dist/voice/generation.cjs.map +1 -1
  105. package/dist/voice/generation.d.ts.map +1 -1
  106. package/dist/voice/generation.js +44 -20
  107. package/dist/voice/generation.js.map +1 -1
  108. package/dist/voice/index.cjs +2 -0
  109. package/dist/voice/index.cjs.map +1 -1
  110. package/dist/voice/index.d.cts +1 -1
  111. package/dist/voice/index.d.ts +1 -1
  112. package/dist/voice/index.d.ts.map +1 -1
  113. package/dist/voice/index.js +2 -1
  114. package/dist/voice/index.js.map +1 -1
  115. package/dist/voice/speech_handle.cjs +7 -1
  116. package/dist/voice/speech_handle.cjs.map +1 -1
  117. package/dist/voice/speech_handle.d.cts +2 -0
  118. package/dist/voice/speech_handle.d.ts +2 -0
  119. package/dist/voice/speech_handle.d.ts.map +1 -1
  120. package/dist/voice/speech_handle.js +8 -2
  121. package/dist/voice/speech_handle.js.map +1 -1
  122. package/dist/voice/testing/run_result.cjs +66 -15
  123. package/dist/voice/testing/run_result.cjs.map +1 -1
  124. package/dist/voice/testing/run_result.d.cts +14 -3
  125. package/dist/voice/testing/run_result.d.ts +14 -3
  126. package/dist/voice/testing/run_result.d.ts.map +1 -1
  127. package/dist/voice/testing/run_result.js +66 -15
  128. package/dist/voice/testing/run_result.js.map +1 -1
  129. package/package.json +1 -1
  130. package/src/cli.ts +20 -33
  131. package/src/ipc/job_proc_lazy_main.ts +16 -5
  132. package/src/llm/chat_context.ts +35 -0
  133. package/src/llm/provider_format/index.ts +7 -2
  134. package/src/llm/provider_format/openai.test.ts +385 -1
  135. package/src/llm/provider_format/openai.ts +103 -0
  136. package/src/llm/provider_format/utils.ts +6 -4
  137. package/src/llm/realtime.ts +1 -0
  138. package/src/log.ts +5 -2
  139. package/src/stream/deferred_stream.ts +17 -6
  140. package/src/utils.test.ts +87 -0
  141. package/src/utils.ts +36 -2
  142. package/src/version.ts +1 -1
  143. package/src/voice/agent.test.ts +140 -2
  144. package/src/voice/agent.ts +189 -10
  145. package/src/voice/agent_activity.ts +427 -289
  146. package/src/voice/agent_session.ts +178 -40
  147. package/src/voice/audio_recognition.ts +4 -0
  148. package/src/voice/generation.ts +52 -23
  149. package/src/voice/index.ts +1 -1
  150. package/src/voice/speech_handle.ts +9 -2
  151. package/src/voice/testing/run_result.ts +81 -23
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/stream/deferred_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 { IdentityTransform } from './identity_transform.js';\n\n/**\n * Check if error is related to stream cleanup operations.\n *\n * These errors are expected when calling reader.read() after releaseLock()\n * or when writing to already closed streams during cleanup:\n *\n * Invalid state: Releasing reader\n * Invalid state: The reader is not attached to a stream\n * Invalid state: Controller is already closed\n * Invalid state: WritableStream is closed\n */\nexport function isStreamReaderReleaseError(e: unknown) {\n const allowedMessages = [\n 'Invalid state: Releasing reader',\n 'Invalid state: The reader is not attached to a stream',\n 'Controller is already closed',\n 'WritableStream is closed',\n ];\n\n if (e instanceof TypeError) {\n return allowedMessages.some((message) => e.message.includes(message));\n }\n\n return false;\n}\nexport class DeferredReadableStream<T> {\n private transform: IdentityTransform<T>;\n private writer: WritableStreamDefaultWriter<T>;\n private sourceReader?: ReadableStreamDefaultReader<T>;\n\n constructor() {\n this.transform = new IdentityTransform<T>();\n this.writer = this.transform.writable.getWriter();\n }\n\n get stream() {\n return this.transform.readable;\n }\n\n get isSourceSet() {\n return !!this.sourceReader;\n }\n\n /**\n * Call once the actual source is ready.\n */\n setSource(source: ReadableStream<T>) {\n if (this.isSourceSet) {\n throw new Error('Stream source already set');\n }\n\n this.sourceReader = source.getReader();\n this.pump();\n }\n\n private async pump() {\n let sourceError: unknown;\n\n try {\n while (true) {\n const { done, value } = await this.sourceReader!.read();\n if (done) break;\n await this.writer.write(value);\n }\n } catch (e) {\n // skip stream cleanup related errors\n if (isStreamReaderReleaseError(e)) return;\n\n sourceError = e;\n } finally {\n // any other error from source will be propagated to the consumer\n if (sourceError) {\n try {\n this.writer.abort(sourceError);\n } catch (e) {\n // ignore if writer is already closed\n }\n return;\n }\n\n // release lock so this.stream.getReader().read() will terminate with done: true\n try {\n this.writer.releaseLock();\n } catch (e) {\n // ignore if writer lock is already released\n }\n\n // we only close the writable stream after done\n try {\n await this.transform.writable.close();\n // NOTE: we do not cancel this.transform.readable as there might be access to\n // this.transform.readable.getReader() outside that blocks this cancellation\n // hence, user is responsible for canceling reader on their own\n } catch (e) {\n // ignore TypeError: Invalid state: WritableStream is closed\n // in case stream reader is already closed, this will throw\n // but we ignore it as we are closing the stream anyway\n }\n }\n }\n\n /**\n * Detach the source stream and clean up resources.\n */\n async detachSource() {\n if (!this.isSourceSet) {\n // No-op if source was never set - this is a common case during cleanup\n return;\n }\n\n // release lock will make any pending read() throw TypeError\n // which are expected, and we intentionally catch those error\n // using isStreamReaderReleaseError\n // this will unblock any pending read() inside the async for loop\n this.sourceReader!.releaseLock();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,gCAAkC;AAa3B,SAAS,2BAA2B,GAAY;AACrD,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,aAAa,WAAW;AAC1B,WAAO,gBAAgB,KAAK,CAAC,YAAY,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,EACtE;AAEA,SAAO;AACT;AACO,MAAM,uBAA0B;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,YAAY,IAAI,4CAAqB;AAC1C,SAAK,SAAS,KAAK,UAAU,SAAS,UAAU;AAAA,EAClD;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,CAAC,CAAC,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAA2B;AACnC,QAAI,KAAK,aAAa;AACpB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,SAAK,eAAe,OAAO,UAAU;AACrC,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,MAAc,OAAO;AACnB,QAAI;AAEJ,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,aAAc,KAAK;AACtD,YAAI,KAAM;AACV,cAAM,KAAK,OAAO,MAAM,KAAK;AAAA,MAC/B;AAAA,IACF,SAAS,GAAG;AAEV,UAAI,2BAA2B,CAAC,EAAG;AAEnC,oBAAc;AAAA,IAChB,UAAE;AAEA,UAAI,aAAa;AACf,YAAI;AACF,eAAK,OAAO,MAAM,WAAW;AAAA,QAC/B,SAAS,GAAG;AAAA,QAEZ;AACA;AAAA,MACF;AAGA,UAAI;AACF,aAAK,OAAO,YAAY;AAAA,MAC1B,SAAS,GAAG;AAAA,MAEZ;AAGA,UAAI;AACF,cAAM,KAAK,UAAU,SAAS,MAAM;AAAA,MAItC,SAAS,GAAG;AAAA,MAIZ;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe;AACnB,QAAI,CAAC,KAAK,aAAa;AAErB;AAAA,IACF;AAMA,SAAK,aAAc,YAAY;AAAA,EACjC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/stream/deferred_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 { IdentityTransform } from './identity_transform.js';\n\n/**\n * Check if error is related to stream cleanup operations.\n *\n * These errors are expected when calling reader.read() after releaseLock()\n * or when writing to already closed streams during cleanup:\n *\n * Invalid state: Releasing reader\n * Invalid state: The reader is not attached to a stream\n * Invalid state: Controller is already closed\n * Invalid state: WritableStream is closed\n */\nexport function isStreamReaderReleaseError(e: unknown) {\n const allowedMessages = [\n 'Invalid state: Releasing reader',\n 'Invalid state: The reader is not attached to a stream',\n 'Controller is already closed',\n 'WritableStream is closed',\n ];\n\n if (e instanceof TypeError) {\n return allowedMessages.some((message) => e.message.includes(message));\n }\n\n return false;\n}\nexport class DeferredReadableStream<T> {\n private transform: IdentityTransform<T>;\n private writer: WritableStreamDefaultWriter<T>;\n private sourceReader?: ReadableStreamDefaultReader<T>;\n\n constructor() {\n this.transform = new IdentityTransform<T>();\n this.writer = this.transform.writable.getWriter();\n }\n\n get stream() {\n return this.transform.readable;\n }\n\n get isSourceSet() {\n return !!this.sourceReader;\n }\n\n /**\n * Call once the actual source is ready.\n */\n setSource(source: ReadableStream<T>) {\n if (this.isSourceSet) {\n throw new Error('Stream source already set');\n }\n\n const sourceReader = source.getReader();\n this.sourceReader = sourceReader;\n void this.pump(sourceReader);\n }\n\n private async pump(sourceReader: ReadableStreamDefaultReader<T>) {\n let sourceError: unknown;\n\n try {\n while (true) {\n const { done, value } = await sourceReader.read();\n if (done) break;\n await this.writer.write(value);\n }\n } catch (e) {\n // skip stream cleanup related errors\n if (isStreamReaderReleaseError(e)) return;\n\n sourceError = e;\n } finally {\n // any other error from source will be propagated to the consumer\n if (sourceError) {\n try {\n await this.writer.abort(sourceError);\n } catch (e) {\n // ignore if writer is already closed\n }\n return;\n }\n\n // release lock so this.stream.getReader().read() will terminate with done: true\n try {\n this.writer.releaseLock();\n } catch (e) {\n // ignore if writer lock is already released\n }\n\n // we only close the writable stream after done\n try {\n await this.transform.writable.close();\n // NOTE: we do not cancel this.transform.readable as there might be access to\n // this.transform.readable.getReader() outside that blocks this cancellation\n // hence, user is responsible for canceling reader on their own\n } catch (e) {\n // ignore TypeError: Invalid state: WritableStream is closed\n // in case stream reader is already closed, this will throw\n // but we ignore it as we are closing the stream anyway\n }\n }\n }\n\n /**\n * Detach the source stream and clean up resources.\n */\n async detachSource() {\n if (!this.isSourceSet) {\n // No-op if source was never set - this is a common case during cleanup\n return;\n }\n\n const sourceReader = this.sourceReader!;\n // Clear source first so future setSource() calls can reattach cleanly.\n this.sourceReader = undefined;\n\n // release lock will make any pending read() throw TypeError\n // which are expected, and we intentionally catch those error\n // using isStreamReaderReleaseError\n // this will unblock any pending read() inside the async for loop\n try {\n sourceReader.releaseLock();\n } catch (e) {\n if (!isStreamReaderReleaseError(e)) {\n throw e;\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,gCAAkC;AAa3B,SAAS,2BAA2B,GAAY;AACrD,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,aAAa,WAAW;AAC1B,WAAO,gBAAgB,KAAK,CAAC,YAAY,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,EACtE;AAEA,SAAO;AACT;AACO,MAAM,uBAA0B;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,YAAY,IAAI,4CAAqB;AAC1C,SAAK,SAAS,KAAK,UAAU,SAAS,UAAU;AAAA,EAClD;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,CAAC,CAAC,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAA2B;AACnC,QAAI,KAAK,aAAa;AACpB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,UAAM,eAAe,OAAO,UAAU;AACtC,SAAK,eAAe;AACpB,SAAK,KAAK,KAAK,YAAY;AAAA,EAC7B;AAAA,EAEA,MAAc,KAAK,cAA8C;AAC/D,QAAI;AAEJ,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,aAAa,KAAK;AAChD,YAAI,KAAM;AACV,cAAM,KAAK,OAAO,MAAM,KAAK;AAAA,MAC/B;AAAA,IACF,SAAS,GAAG;AAEV,UAAI,2BAA2B,CAAC,EAAG;AAEnC,oBAAc;AAAA,IAChB,UAAE;AAEA,UAAI,aAAa;AACf,YAAI;AACF,gBAAM,KAAK,OAAO,MAAM,WAAW;AAAA,QACrC,SAAS,GAAG;AAAA,QAEZ;AACA;AAAA,MACF;AAGA,UAAI;AACF,aAAK,OAAO,YAAY;AAAA,MAC1B,SAAS,GAAG;AAAA,MAEZ;AAGA,UAAI;AACF,cAAM,KAAK,UAAU,SAAS,MAAM;AAAA,MAItC,SAAS,GAAG;AAAA,MAIZ;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe;AACnB,QAAI,CAAC,KAAK,aAAa;AAErB;AAAA,IACF;AAEA,UAAM,eAAe,KAAK;AAE1B,SAAK,eAAe;AAMpB,QAAI;AACF,mBAAa,YAAY;AAAA,IAC3B,SAAS,GAAG;AACV,UAAI,CAAC,2BAA2B,CAAC,GAAG;AAClC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"deferred_stream.d.ts","sourceRoot":"","sources":["../../src/stream/deferred_stream.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,iBAAiB,CAAC;AAGzB;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,OAAO,WAapD;AACD,qBAAa,sBAAsB,CAAC,CAAC;IACnC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,YAAY,CAAC,CAAiC;;IAOtD,IAAI,MAAM,sBAET;IAED,IAAI,WAAW,YAEd;IAED;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;YASrB,IAAI;IA8ClB;;OAEG;IACG,YAAY;CAYnB"}
1
+ {"version":3,"file":"deferred_stream.d.ts","sourceRoot":"","sources":["../../src/stream/deferred_stream.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,iBAAiB,CAAC;AAGzB;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,OAAO,WAapD;AACD,qBAAa,sBAAsB,CAAC,CAAC;IACnC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,YAAY,CAAC,CAAiC;;IAOtD,IAAI,MAAM,sBAET;IAED,IAAI,WAAW,YAEd;IAED;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;YAUrB,IAAI;IA8ClB;;OAEG;IACG,YAAY;CAsBnB"}
@@ -32,14 +32,15 @@ class DeferredReadableStream {
32
32
  if (this.isSourceSet) {
33
33
  throw new Error("Stream source already set");
34
34
  }
35
- this.sourceReader = source.getReader();
36
- this.pump();
35
+ const sourceReader = source.getReader();
36
+ this.sourceReader = sourceReader;
37
+ void this.pump(sourceReader);
37
38
  }
38
- async pump() {
39
+ async pump(sourceReader) {
39
40
  let sourceError;
40
41
  try {
41
42
  while (true) {
42
- const { done, value } = await this.sourceReader.read();
43
+ const { done, value } = await sourceReader.read();
43
44
  if (done) break;
44
45
  await this.writer.write(value);
45
46
  }
@@ -49,7 +50,7 @@ class DeferredReadableStream {
49
50
  } finally {
50
51
  if (sourceError) {
51
52
  try {
52
- this.writer.abort(sourceError);
53
+ await this.writer.abort(sourceError);
53
54
  } catch (e) {
54
55
  }
55
56
  return;
@@ -71,7 +72,15 @@ class DeferredReadableStream {
71
72
  if (!this.isSourceSet) {
72
73
  return;
73
74
  }
74
- this.sourceReader.releaseLock();
75
+ const sourceReader = this.sourceReader;
76
+ this.sourceReader = void 0;
77
+ try {
78
+ sourceReader.releaseLock();
79
+ } catch (e) {
80
+ if (!isStreamReaderReleaseError(e)) {
81
+ throw e;
82
+ }
83
+ }
75
84
  }
76
85
  }
77
86
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/stream/deferred_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 { IdentityTransform } from './identity_transform.js';\n\n/**\n * Check if error is related to stream cleanup operations.\n *\n * These errors are expected when calling reader.read() after releaseLock()\n * or when writing to already closed streams during cleanup:\n *\n * Invalid state: Releasing reader\n * Invalid state: The reader is not attached to a stream\n * Invalid state: Controller is already closed\n * Invalid state: WritableStream is closed\n */\nexport function isStreamReaderReleaseError(e: unknown) {\n const allowedMessages = [\n 'Invalid state: Releasing reader',\n 'Invalid state: The reader is not attached to a stream',\n 'Controller is already closed',\n 'WritableStream is closed',\n ];\n\n if (e instanceof TypeError) {\n return allowedMessages.some((message) => e.message.includes(message));\n }\n\n return false;\n}\nexport class DeferredReadableStream<T> {\n private transform: IdentityTransform<T>;\n private writer: WritableStreamDefaultWriter<T>;\n private sourceReader?: ReadableStreamDefaultReader<T>;\n\n constructor() {\n this.transform = new IdentityTransform<T>();\n this.writer = this.transform.writable.getWriter();\n }\n\n get stream() {\n return this.transform.readable;\n }\n\n get isSourceSet() {\n return !!this.sourceReader;\n }\n\n /**\n * Call once the actual source is ready.\n */\n setSource(source: ReadableStream<T>) {\n if (this.isSourceSet) {\n throw new Error('Stream source already set');\n }\n\n this.sourceReader = source.getReader();\n this.pump();\n }\n\n private async pump() {\n let sourceError: unknown;\n\n try {\n while (true) {\n const { done, value } = await this.sourceReader!.read();\n if (done) break;\n await this.writer.write(value);\n }\n } catch (e) {\n // skip stream cleanup related errors\n if (isStreamReaderReleaseError(e)) return;\n\n sourceError = e;\n } finally {\n // any other error from source will be propagated to the consumer\n if (sourceError) {\n try {\n this.writer.abort(sourceError);\n } catch (e) {\n // ignore if writer is already closed\n }\n return;\n }\n\n // release lock so this.stream.getReader().read() will terminate with done: true\n try {\n this.writer.releaseLock();\n } catch (e) {\n // ignore if writer lock is already released\n }\n\n // we only close the writable stream after done\n try {\n await this.transform.writable.close();\n // NOTE: we do not cancel this.transform.readable as there might be access to\n // this.transform.readable.getReader() outside that blocks this cancellation\n // hence, user is responsible for canceling reader on their own\n } catch (e) {\n // ignore TypeError: Invalid state: WritableStream is closed\n // in case stream reader is already closed, this will throw\n // but we ignore it as we are closing the stream anyway\n }\n }\n }\n\n /**\n * Detach the source stream and clean up resources.\n */\n async detachSource() {\n if (!this.isSourceSet) {\n // No-op if source was never set - this is a common case during cleanup\n return;\n }\n\n // release lock will make any pending read() throw TypeError\n // which are expected, and we intentionally catch those error\n // using isStreamReaderReleaseError\n // this will unblock any pending read() inside the async for loop\n this.sourceReader!.releaseLock();\n }\n}\n"],"mappings":"AAQA,SAAS,yBAAyB;AAa3B,SAAS,2BAA2B,GAAY;AACrD,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,aAAa,WAAW;AAC1B,WAAO,gBAAgB,KAAK,CAAC,YAAY,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,EACtE;AAEA,SAAO;AACT;AACO,MAAM,uBAA0B;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,YAAY,IAAI,kBAAqB;AAC1C,SAAK,SAAS,KAAK,UAAU,SAAS,UAAU;AAAA,EAClD;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,CAAC,CAAC,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAA2B;AACnC,QAAI,KAAK,aAAa;AACpB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,SAAK,eAAe,OAAO,UAAU;AACrC,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,MAAc,OAAO;AACnB,QAAI;AAEJ,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,aAAc,KAAK;AACtD,YAAI,KAAM;AACV,cAAM,KAAK,OAAO,MAAM,KAAK;AAAA,MAC/B;AAAA,IACF,SAAS,GAAG;AAEV,UAAI,2BAA2B,CAAC,EAAG;AAEnC,oBAAc;AAAA,IAChB,UAAE;AAEA,UAAI,aAAa;AACf,YAAI;AACF,eAAK,OAAO,MAAM,WAAW;AAAA,QAC/B,SAAS,GAAG;AAAA,QAEZ;AACA;AAAA,MACF;AAGA,UAAI;AACF,aAAK,OAAO,YAAY;AAAA,MAC1B,SAAS,GAAG;AAAA,MAEZ;AAGA,UAAI;AACF,cAAM,KAAK,UAAU,SAAS,MAAM;AAAA,MAItC,SAAS,GAAG;AAAA,MAIZ;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe;AACnB,QAAI,CAAC,KAAK,aAAa;AAErB;AAAA,IACF;AAMA,SAAK,aAAc,YAAY;AAAA,EACjC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/stream/deferred_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 { IdentityTransform } from './identity_transform.js';\n\n/**\n * Check if error is related to stream cleanup operations.\n *\n * These errors are expected when calling reader.read() after releaseLock()\n * or when writing to already closed streams during cleanup:\n *\n * Invalid state: Releasing reader\n * Invalid state: The reader is not attached to a stream\n * Invalid state: Controller is already closed\n * Invalid state: WritableStream is closed\n */\nexport function isStreamReaderReleaseError(e: unknown) {\n const allowedMessages = [\n 'Invalid state: Releasing reader',\n 'Invalid state: The reader is not attached to a stream',\n 'Controller is already closed',\n 'WritableStream is closed',\n ];\n\n if (e instanceof TypeError) {\n return allowedMessages.some((message) => e.message.includes(message));\n }\n\n return false;\n}\nexport class DeferredReadableStream<T> {\n private transform: IdentityTransform<T>;\n private writer: WritableStreamDefaultWriter<T>;\n private sourceReader?: ReadableStreamDefaultReader<T>;\n\n constructor() {\n this.transform = new IdentityTransform<T>();\n this.writer = this.transform.writable.getWriter();\n }\n\n get stream() {\n return this.transform.readable;\n }\n\n get isSourceSet() {\n return !!this.sourceReader;\n }\n\n /**\n * Call once the actual source is ready.\n */\n setSource(source: ReadableStream<T>) {\n if (this.isSourceSet) {\n throw new Error('Stream source already set');\n }\n\n const sourceReader = source.getReader();\n this.sourceReader = sourceReader;\n void this.pump(sourceReader);\n }\n\n private async pump(sourceReader: ReadableStreamDefaultReader<T>) {\n let sourceError: unknown;\n\n try {\n while (true) {\n const { done, value } = await sourceReader.read();\n if (done) break;\n await this.writer.write(value);\n }\n } catch (e) {\n // skip stream cleanup related errors\n if (isStreamReaderReleaseError(e)) return;\n\n sourceError = e;\n } finally {\n // any other error from source will be propagated to the consumer\n if (sourceError) {\n try {\n await this.writer.abort(sourceError);\n } catch (e) {\n // ignore if writer is already closed\n }\n return;\n }\n\n // release lock so this.stream.getReader().read() will terminate with done: true\n try {\n this.writer.releaseLock();\n } catch (e) {\n // ignore if writer lock is already released\n }\n\n // we only close the writable stream after done\n try {\n await this.transform.writable.close();\n // NOTE: we do not cancel this.transform.readable as there might be access to\n // this.transform.readable.getReader() outside that blocks this cancellation\n // hence, user is responsible for canceling reader on their own\n } catch (e) {\n // ignore TypeError: Invalid state: WritableStream is closed\n // in case stream reader is already closed, this will throw\n // but we ignore it as we are closing the stream anyway\n }\n }\n }\n\n /**\n * Detach the source stream and clean up resources.\n */\n async detachSource() {\n if (!this.isSourceSet) {\n // No-op if source was never set - this is a common case during cleanup\n return;\n }\n\n const sourceReader = this.sourceReader!;\n // Clear source first so future setSource() calls can reattach cleanly.\n this.sourceReader = undefined;\n\n // release lock will make any pending read() throw TypeError\n // which are expected, and we intentionally catch those error\n // using isStreamReaderReleaseError\n // this will unblock any pending read() inside the async for loop\n try {\n sourceReader.releaseLock();\n } catch (e) {\n if (!isStreamReaderReleaseError(e)) {\n throw e;\n }\n }\n }\n}\n"],"mappings":"AAQA,SAAS,yBAAyB;AAa3B,SAAS,2BAA2B,GAAY;AACrD,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,aAAa,WAAW;AAC1B,WAAO,gBAAgB,KAAK,CAAC,YAAY,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,EACtE;AAEA,SAAO;AACT;AACO,MAAM,uBAA0B;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,YAAY,IAAI,kBAAqB;AAC1C,SAAK,SAAS,KAAK,UAAU,SAAS,UAAU;AAAA,EAClD;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,CAAC,CAAC,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAA2B;AACnC,QAAI,KAAK,aAAa;AACpB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,UAAM,eAAe,OAAO,UAAU;AACtC,SAAK,eAAe;AACpB,SAAK,KAAK,KAAK,YAAY;AAAA,EAC7B;AAAA,EAEA,MAAc,KAAK,cAA8C;AAC/D,QAAI;AAEJ,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,aAAa,KAAK;AAChD,YAAI,KAAM;AACV,cAAM,KAAK,OAAO,MAAM,KAAK;AAAA,MAC/B;AAAA,IACF,SAAS,GAAG;AAEV,UAAI,2BAA2B,CAAC,EAAG;AAEnC,oBAAc;AAAA,IAChB,UAAE;AAEA,UAAI,aAAa;AACf,YAAI;AACF,gBAAM,KAAK,OAAO,MAAM,WAAW;AAAA,QACrC,SAAS,GAAG;AAAA,QAEZ;AACA;AAAA,MACF;AAGA,UAAI;AACF,aAAK,OAAO,YAAY;AAAA,MAC1B,SAAS,GAAG;AAAA,MAEZ;AAGA,UAAI;AACF,cAAM,KAAK,UAAU,SAAS,MAAM;AAAA,MAItC,SAAS,GAAG;AAAA,MAIZ;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe;AACnB,QAAI,CAAC,KAAK,aAAa;AAErB;AAAA,IACF;AAEA,UAAM,eAAe,KAAK;AAE1B,SAAK,eAAe;AAMpB,QAAI;AACF,mBAAa,YAAY;AAAA,IAC3B,SAAS,GAAG;AACV,UAAI,CAAC,2BAA2B,CAAC,GAAG;AAClC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/dist/utils.cjs CHANGED
@@ -51,6 +51,7 @@ __export(utils_exports, {
51
51
  });
52
52
  module.exports = __toCommonJS(utils_exports);
53
53
  var import_rtc_node = require("@livekit/rtc-node");
54
+ var import_node_async_hooks = require("node:async_hooks");
54
55
  var import_node_events = require("node:events");
55
56
  var import_web = require("node:stream/web");
56
57
  var import_uuid = require("uuid");
@@ -350,9 +351,24 @@ class Task {
350
351
  this.controller = controller;
351
352
  this.name = name;
352
353
  this.resultFuture = new Future();
354
+ void this.resultFuture.await.then(
355
+ () => void 0,
356
+ () => void 0
357
+ ).finally(() => {
358
+ for (const callback of this.doneCallbacks) {
359
+ try {
360
+ callback();
361
+ } catch (error) {
362
+ this.#logger.error({ error }, "Task done callback failed");
363
+ }
364
+ }
365
+ this.doneCallbacks.clear();
366
+ });
353
367
  this.runTask();
354
368
  }
369
+ static currentTaskStorage = new import_node_async_hooks.AsyncLocalStorage();
355
370
  resultFuture;
371
+ doneCallbacks = /* @__PURE__ */ new Set();
356
372
  #logger = (0, import_log.log)();
357
373
  /**
358
374
  * Creates a new task from a function.
@@ -365,6 +381,12 @@ class Task {
365
381
  const abortController = controller ?? new AbortController();
366
382
  return new Task(fn, abortController, name);
367
383
  }
384
+ /**
385
+ * Returns the currently running task in this async context, if available.
386
+ */
387
+ static current() {
388
+ return Task.currentTaskStorage.getStore();
389
+ }
368
390
  async runTask() {
369
391
  const run = async () => {
370
392
  if (this.name) {
@@ -372,7 +394,7 @@ class Task {
372
394
  }
373
395
  return await this.fn(this.controller);
374
396
  };
375
- return run().then((value) => {
397
+ return Task.currentTaskStorage.run(this, run).then((value) => {
376
398
  this.resultFuture.resolve(value);
377
399
  return value;
378
400
  }).catch((error) => {
@@ -427,7 +449,14 @@ class Task {
427
449
  return this.resultFuture.done;
428
450
  }
429
451
  addDoneCallback(callback) {
430
- this.resultFuture.await.finally(callback);
452
+ if (this.done) {
453
+ queueMicrotask(callback);
454
+ return;
455
+ }
456
+ this.doneCallbacks.add(callback);
457
+ }
458
+ removeDoneCallback(callback) {
459
+ this.doneCallbacks.delete(callback);
431
460
  }
432
461
  }
433
462
  async function waitFor(tasks) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type {\n ParticipantKind,\n RemoteParticipant,\n RemoteTrackPublication,\n Room,\n TrackKind,\n} from '@livekit/rtc-node';\nimport { AudioFrame, AudioResampler, RoomEvent } from '@livekit/rtc-node';\nimport { EventEmitter, once } from 'node:events';\nimport type { ReadableStream } from 'node:stream/web';\nimport { TransformStream, type TransformStreamDefaultController } from 'node:stream/web';\nimport { v4 as uuidv4 } from 'uuid';\nimport { log } from './log.js';\n\n/**\n * Recursively expands all nested properties of a type,\n * resolving aliases so as to inspect the real shape in IDE.\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type Expand<T> = T extends Function\n ? T\n : T extends object\n ? T extends Array<infer U>\n ? Array<Expand<U>>\n : T extends Map<infer K, infer V>\n ? Map<Expand<K>, Expand<V>>\n : T extends Set<infer M>\n ? Set<Expand<M>>\n : { [K in keyof T]: Expand<T[K]> }\n : T;\n\n/** Union of a single and a list of {@link AudioFrame}s */\nexport type AudioBuffer = AudioFrame[] | AudioFrame;\n\nexport const noop = () => {};\n\nexport const isPending = async (promise: Promise<unknown>): Promise<boolean> => {\n const sentinel = Symbol('sentinel');\n const result = await Promise.race([promise, Promise.resolve(sentinel)]);\n return result === sentinel;\n};\n\n/**\n * Merge one or more {@link AudioFrame}s into a single one.\n *\n * @param buffer - Either an {@link AudioFrame} or a list thereof\n * @throws\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError\n * | TypeError} if sample rate or channel count are mismatched\n */\nexport const mergeFrames = (buffer: AudioBuffer): AudioFrame => {\n if (Array.isArray(buffer)) {\n buffer = buffer as AudioFrame[];\n if (buffer.length == 0) {\n throw new TypeError('buffer is empty');\n }\n\n const sampleRate = buffer[0]!.sampleRate;\n const channels = buffer[0]!.channels;\n let samplesPerChannel = 0;\n let data = new Int16Array();\n\n for (const frame of buffer) {\n if (frame.sampleRate !== sampleRate) {\n throw new TypeError('sample rate mismatch');\n }\n\n if (frame.channels !== channels) {\n throw new TypeError('channel count mismatch');\n }\n\n data = new Int16Array([...data, ...frame.data]);\n samplesPerChannel += frame.samplesPerChannel;\n }\n\n return new AudioFrame(data, sampleRate, channels, samplesPerChannel);\n }\n\n return buffer;\n};\n\n/** @internal */\nexport class Queue<T> {\n /** @internal */\n items: T[] = [];\n #limit?: number;\n #events = new EventEmitter();\n\n constructor(limit?: number) {\n this.#limit = limit;\n }\n\n async get(): Promise<T> {\n const _get = async (): Promise<T> => {\n if (this.items.length === 0) {\n await once(this.#events, 'put');\n }\n let item = this.items.shift();\n if (!item) {\n item = await _get();\n }\n return item;\n };\n\n const item = _get();\n this.#events.emit('get');\n return item;\n }\n\n async put(item: T) {\n if (this.#limit && this.items.length >= this.#limit) {\n await once(this.#events, 'get');\n }\n this.items.push(item);\n this.#events.emit('put');\n }\n}\n\n/** @internal */\nexport class Future<T = void> {\n #await: Promise<T>;\n #resolvePromise!: (value: T) => void;\n #rejectPromise!: (error: Error) => void;\n #done: boolean = false;\n #rejected: boolean = false;\n #result: T | undefined = undefined;\n #error: Error | undefined = undefined;\n\n constructor() {\n this.#await = new Promise<T>((resolve, reject) => {\n this.#resolvePromise = resolve;\n this.#rejectPromise = reject;\n });\n }\n\n get await() {\n return this.#await;\n }\n\n get done() {\n return this.#done;\n }\n\n get result(): T {\n if (!this.#done) {\n throw new Error('Future is not done');\n }\n\n if (this.#rejected) {\n throw this.#error;\n }\n\n return this.#result!;\n }\n\n /** Whether the future was rejected (cancelled) */\n get rejected() {\n return this.#rejected;\n }\n\n resolve(value: T) {\n this.#done = true;\n this.#result = value;\n this.#resolvePromise(value);\n }\n\n reject(error: Error) {\n this.#done = true;\n this.#rejected = true;\n this.#error = error;\n this.#rejectPromise(error);\n }\n}\n\n/** @internal */\nexport class Event {\n #isSet = false;\n #waiters: Array<() => void> = [];\n\n async wait() {\n if (this.#isSet) return true;\n\n let resolve: () => void = noop;\n const waiter = new Promise<void>((r) => {\n resolve = r;\n this.#waiters.push(resolve);\n });\n\n try {\n await waiter;\n return true;\n } finally {\n const index = this.#waiters.indexOf(resolve);\n if (index !== -1) {\n this.#waiters.splice(index, 1);\n }\n }\n }\n\n get isSet(): boolean {\n return this.#isSet;\n }\n\n set(): void {\n if (this.#isSet) return;\n\n this.#isSet = true;\n this.#waiters.forEach((resolve) => resolve());\n this.#waiters = [];\n }\n\n clear(): void {\n this.#isSet = false;\n }\n}\n\n/** @internal */\nexport class CancellablePromise<T> {\n #promise: Promise<T>;\n #cancelFn: () => void;\n #isCancelled: boolean = false;\n #error: Error | null = null;\n\n constructor(\n executor: (\n resolve: (value: T | PromiseLike<T>) => void,\n reject: (reason?: unknown) => void,\n onCancel: (cancelFn: () => void) => void,\n ) => void,\n ) {\n let cancel: () => void;\n\n this.#promise = new Promise<T>((resolve, reject) => {\n executor(\n resolve,\n (reason) => {\n this.#error = reason instanceof Error ? reason : new Error(String(reason));\n reject(reason);\n },\n (cancelFn) => {\n cancel = () => {\n this.#isCancelled = true;\n cancelFn();\n };\n },\n );\n });\n\n this.#cancelFn = cancel!;\n }\n\n get isCancelled(): boolean {\n return this.#isCancelled;\n }\n\n get error(): Error | null {\n return this.#error;\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | Promise<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | Promise<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.#promise.then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | Promise<TResult>) | null,\n ): Promise<T | TResult> {\n return this.#promise.catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.#promise.finally(onfinally);\n }\n\n cancel(): void {\n this.#cancelFn();\n }\n\n static from<T>(promise: Promise<T>): CancellablePromise<T> {\n return new CancellablePromise<T>((resolve, reject) => {\n promise.then(resolve).catch(reject);\n });\n }\n}\n\n/** @internal */\nexport async function gracefullyCancel<T>(promise: CancellablePromise<T>): Promise<void> {\n if (!promise.isCancelled) {\n promise.cancel();\n }\n try {\n await promise;\n } catch (error) {\n // Ignore the error, as it's expected due to cancellation\n }\n}\n\n/** @internal */\nexport class AsyncIterableQueue<T> implements AsyncIterableIterator<T> {\n private static readonly CLOSE_SENTINEL = Symbol('CLOSE_SENTINEL');\n #queue = new Queue<T | typeof AsyncIterableQueue.CLOSE_SENTINEL>();\n #closed = false;\n\n get closed(): boolean {\n return this.#closed;\n }\n\n put(item: T): void {\n if (this.#closed) {\n throw new Error('Queue is closed');\n }\n this.#queue.put(item);\n }\n\n close(): void {\n this.#closed = true;\n this.#queue.put(AsyncIterableQueue.CLOSE_SENTINEL);\n }\n\n async next(): Promise<IteratorResult<T>> {\n if (this.#closed && this.#queue.items.length === 0) {\n return { value: undefined, done: true };\n }\n const item = await this.#queue.get();\n if (item === AsyncIterableQueue.CLOSE_SENTINEL && this.#closed) {\n return { value: undefined, done: true };\n }\n return { value: item as T, done: false };\n }\n\n [Symbol.asyncIterator](): AsyncIterableQueue<T> {\n return this;\n }\n}\n\n/** @internal */\nexport class ExpFilter {\n #alpha: number;\n #max?: number;\n #filtered?: number = undefined;\n\n constructor(alpha: number, max?: number) {\n this.#alpha = alpha;\n this.#max = max;\n }\n\n reset(alpha?: number) {\n if (alpha) {\n this.#alpha = alpha;\n }\n this.#filtered = undefined;\n }\n\n apply(exp: number, sample: number): number {\n if (this.#filtered) {\n const a = this.#alpha ** exp;\n this.#filtered = a * this.#filtered + (1 - a) * sample;\n } else {\n this.#filtered = sample;\n }\n\n if (this.#max && this.#filtered > this.#max) {\n this.#filtered = this.#max;\n }\n\n return this.#filtered;\n }\n\n get filtered(): number | undefined {\n return this.#filtered;\n }\n\n set alpha(alpha: number) {\n this.#alpha = alpha;\n }\n}\n\n/** @internal */\nexport class AudioEnergyFilter {\n #cooldownSeconds: number;\n #cooldown: number;\n\n constructor(cooldownSeconds = 1) {\n this.#cooldownSeconds = cooldownSeconds;\n this.#cooldown = cooldownSeconds;\n }\n\n pushFrame(frame: AudioFrame): boolean {\n const arr = Float32Array.from(frame.data, (x) => x / 32768);\n const rms = (arr.map((x) => x ** 2).reduce((acc, x) => acc + x) / arr.length) ** 0.5;\n if (rms > 0.004) {\n this.#cooldown = this.#cooldownSeconds;\n return true;\n }\n\n const durationSeconds = frame.samplesPerChannel / frame.sampleRate;\n this.#cooldown -= durationSeconds;\n if (this.#cooldown > 0) {\n return true;\n }\n\n return false;\n }\n}\n\nexport enum TaskResult {\n Timeout = 'timeout',\n Completed = 'completed',\n Aborted = 'aborted',\n}\n\n/** @internal */\n/**\n * A task that can be cancelled.\n *\n * We recommend using the `Task.from` method to create a task. When creating subtasks, pass the same controller to all subtasks.\n *\n * @example\n * ```ts\n * const parent = Task.from((controller) => {\n * const child1 = Task.from(() => { ... }, controller);\n * const child2 = Task.from(() => { ... }, controller);\n * });\n * parent.cancel();\n * ```\n *\n * This will cancel all subtasks when the parent is cancelled.\n *\n * @param T - The type of the task result\n */\nexport class Task<T> {\n private resultFuture: Future<T>;\n\n #logger = log();\n\n constructor(\n private readonly fn: (controller: AbortController) => Promise<T>,\n private readonly controller: AbortController,\n readonly name?: string,\n ) {\n this.resultFuture = new Future();\n this.runTask();\n }\n\n /**\n * Creates a new task from a function.\n *\n * @param fn - The function to run\n * @param controller - The abort controller to use\n * @returns A new task\n */\n static from<T>(\n fn: (controller: AbortController) => Promise<T>,\n controller?: AbortController,\n name?: string,\n ) {\n const abortController = controller ?? new AbortController();\n return new Task(fn, abortController, name);\n }\n\n private async runTask() {\n const run = async () => {\n if (this.name) {\n this.#logger.debug(`Task.runTask: task ${this.name} started`);\n }\n return await this.fn(this.controller);\n };\n\n return run()\n .then((value) => {\n this.resultFuture.resolve(value);\n return value;\n })\n .catch((error) => {\n this.resultFuture.reject(error);\n })\n .finally(() => {\n if (this.name) {\n this.#logger.debug(`Task.runTask: task ${this.name} done`);\n }\n });\n }\n\n /**\n * Cancels the task.\n */\n cancel() {\n this.controller.abort();\n }\n\n /**\n * Cancels the task and waits for it to complete.\n *\n * @param timeout - The timeout in milliseconds\n * @returns The result status of the task (timeout, completed, aborted)\n */\n async cancelAndWait(timeout?: number) {\n this.cancel();\n\n // Race between task completion and timeout\n const promises = [\n this.result\n .then(() => TaskResult.Completed)\n .catch((error) => {\n if (error.name === 'AbortError') {\n return TaskResult.Aborted;\n }\n throw error;\n }),\n ];\n\n if (timeout) {\n promises.push(delay(timeout).then(() => TaskResult.Timeout));\n }\n\n const result = await Promise.race(promises);\n\n // Check what happened\n if (result === TaskResult.Timeout) {\n throw new Error('Task cancellation timed out');\n }\n\n return result;\n }\n\n /**\n * The result of the task.\n */\n get result(): Promise<T> {\n return this.resultFuture.await;\n }\n\n /**\n * Whether the task has completed.\n */\n get done(): boolean {\n return this.resultFuture.done;\n }\n\n addDoneCallback(callback: () => void) {\n this.resultFuture.await.finally(callback);\n }\n}\n\nexport async function waitFor(tasks: Task<void>[]): Promise<void> {\n await Promise.allSettled(tasks.map((task) => task.result));\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function cancelAndWait(tasks: Task<any>[], timeout?: number): Promise<void> {\n await Promise.allSettled(tasks.map((task) => task.cancelAndWait(timeout)));\n}\n\nexport function withResolvers<T = unknown>() {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n\n/**\n * Generates a short UUID with a prefix. Mirrors the python agents implementation.\n *\n * @param prefix - The prefix to add to the UUID.\n * @returns A short UUID with the prefix.\n */\nexport function shortuuid(prefix: string = ''): string {\n return `${prefix}${uuidv4().slice(0, 12)}`;\n}\n\nconst READONLY_SYMBOL = Symbol('Readonly');\n\nconst MUTATION_METHODS = [\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'splice',\n 'sort',\n 'reverse',\n 'fill',\n 'copyWithin',\n] as const;\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n/**\n * Creates a read-only proxy for an array.\n * @param array - The array to make read-only.\n * @param additionalErrorMessage - An additional error message to include in the error thrown when a mutation method is called.\n * @returns A read-only proxy for the array.\n */\nexport function createImmutableArray<T>(array: T[], additionalErrorMessage: string = ''): T[] {\n return new Proxy(array, {\n get(target, key) {\n if (key === READONLY_SYMBOL) {\n return true;\n }\n\n // Intercept mutation methods\n if (\n typeof key === 'string' &&\n MUTATION_METHODS.includes(key as (typeof MUTATION_METHODS)[number])\n ) {\n return function () {\n throw new TypeError(\n `Cannot call ${key}() on a read-only array. ${additionalErrorMessage}`.trim(),\n );\n };\n }\n\n return Reflect.get(target, key);\n },\n set(_, prop) {\n throw new TypeError(\n `Cannot assign to read-only array index \"${String(prop)}\". ${additionalErrorMessage}`.trim(),\n );\n },\n deleteProperty(_, prop) {\n throw new TypeError(\n `Cannot delete read-only array index \"${String(prop)}\". ${additionalErrorMessage}`.trim(),\n );\n },\n defineProperty(_, prop) {\n throw new TypeError(\n `Cannot define property \"${String(prop)}\" on a read-only array. ${additionalErrorMessage}`.trim(),\n );\n },\n setPrototypeOf() {\n throw new TypeError(\n `Cannot change prototype of a read-only array. ${additionalErrorMessage}`.trim(),\n );\n },\n });\n}\n\nexport function isImmutableArray(array: unknown): boolean {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return typeof array === 'object' && !!(array as any)[READONLY_SYMBOL];\n}\n\n/**\n * Resamples an audio stream to a target sample rate.\n *\n * WARINING: The input stream will be locked until the resampled stream is closed.\n *\n * @param stream - The input stream to resample.\n * @param outputRate - The target sample rate.\n * @returns A new stream with the resampled audio.\n */\nexport function resampleStream({\n stream,\n outputRate,\n}: {\n stream: ReadableStream<AudioFrame>;\n outputRate: number;\n}): ReadableStream<AudioFrame> {\n let resampler: AudioResampler | null = null;\n const transformStream = new TransformStream<AudioFrame, AudioFrame>({\n transform(chunk: AudioFrame, controller: TransformStreamDefaultController<AudioFrame>) {\n if (chunk.samplesPerChannel === 0) {\n controller.enqueue(chunk);\n return;\n }\n if (!resampler) {\n resampler = new AudioResampler(chunk.sampleRate, outputRate);\n }\n for (const frame of resampler.push(chunk)) {\n controller.enqueue(frame);\n }\n },\n flush(controller) {\n if (resampler) {\n for (const frame of resampler.flush()) {\n controller.enqueue(frame);\n }\n }\n },\n });\n return stream.pipeThrough(transformStream);\n}\n\nexport class InvalidErrorType extends Error {\n readonly error: unknown;\n\n constructor(error: unknown) {\n super(`Expected error, got ${error} (${typeof error})`);\n this.error = error;\n Error.captureStackTrace(this, InvalidErrorType);\n }\n}\n\n/**\n * Check if an error is a stream closed error that can be safely ignored during cleanup.\n * This happens during handover/cleanup when close() is called while operations are still running.\n *\n * @param error - The error to check.\n * @returns True if the error is a stream closed error.\n */\nexport function isStreamClosedError(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.message === 'Stream is closed' || error.message === 'Input is closed')\n );\n}\n\n/**\n * In JS an error can be any arbitrary value.\n * This function converts an unknown error to an Error and stores the original value in the error object.\n *\n * @param error - The error to convert.\n * @returns An Error.\n */\nexport function toError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n throw new InvalidErrorType(error);\n}\n\n/**\n * This is a hack to immitate asyncio.create_task so that\n * func will be run after the current event loop iteration.\n *\n * @param func - The function to run.\n */\nexport function startSoon(func: () => void) {\n setTimeout(func, 0);\n}\n\nexport type DelayOptions = {\n signal?: AbortSignal;\n};\n\n/**\n * Delay for a given number of milliseconds.\n *\n * @param ms - The number of milliseconds to delay.\n * @param options - The options for the delay.\n * @returns A promise that resolves after the delay.\n */\nexport function delay(ms: number, options: DelayOptions = {}): Promise<void> {\n const { signal } = options;\n if (signal?.aborted) return Promise.reject(signal.reason);\n return new Promise((resolve, reject) => {\n const abort = () => {\n clearTimeout(i);\n reject(signal?.reason);\n };\n const done = () => {\n signal?.removeEventListener('abort', abort);\n resolve();\n };\n const i = setTimeout(done, ms);\n signal?.addEventListener('abort', abort, { once: true });\n });\n}\n\n/**\n * Returns a participant that matches the given identity. If identity is None, the first\n * participant that joins the room will be returned.\n * If the participant has already joined, the function will return immediately.\n * @param room - The room to wait for a participant in.\n * @param identity - The identity of the participant to wait for.\n * @param kind - The kind of the participant to wait for.\n * @returns A promise that resolves to the participant.\n */\nexport async function waitForParticipant({\n room,\n identity,\n kind,\n}: {\n room: Room;\n identity?: string;\n kind?: ParticipantKind | ParticipantKind[];\n}): Promise<RemoteParticipant> {\n if (!room.isConnected) {\n throw new Error('Room is not connected');\n }\n\n const fut = new Future<RemoteParticipant>();\n\n const kindMatch = (participant: RemoteParticipant) => {\n if (kind === undefined) return true;\n\n if (Array.isArray(kind)) {\n return kind.includes(participant.kind);\n }\n\n return participant.kind === kind;\n };\n\n const onParticipantConnected = (p: RemoteParticipant) => {\n if ((identity === undefined || p.identity === identity) && kindMatch(p)) {\n if (!fut.done) {\n fut.resolve(p);\n }\n }\n };\n\n room.on(RoomEvent.ParticipantConnected, onParticipantConnected);\n\n try {\n for (const p of room.remoteParticipants.values()) {\n onParticipantConnected(p);\n if (fut.done) {\n break;\n }\n }\n\n return await fut.await;\n } finally {\n room.off(RoomEvent.ParticipantConnected, onParticipantConnected);\n }\n}\n\nexport async function waitForTrackPublication({\n room,\n identity,\n kind,\n}: {\n room: Room;\n identity: string;\n kind: TrackKind;\n}): Promise<RemoteTrackPublication> {\n if (!room.isConnected) {\n throw new Error('Room is not connected');\n }\n\n const fut = new Future<RemoteTrackPublication>();\n\n const kindMatch = (k: TrackKind | undefined) => {\n if (kind === undefined || kind === null) {\n return true;\n }\n return k === kind;\n };\n\n const onTrackPublished = (\n publication: RemoteTrackPublication,\n participant: RemoteParticipant,\n ) => {\n if (fut.done) return;\n if (\n (identity === undefined || participant.identity === identity) &&\n kindMatch(publication.kind)\n ) {\n fut.resolve(publication);\n }\n };\n\n room.on(RoomEvent.TrackPublished, onTrackPublished);\n\n try {\n for (const p of room.remoteParticipants.values()) {\n for (const publication of p.trackPublications.values()) {\n onTrackPublished(publication, p);\n if (fut.done) break;\n }\n }\n\n return await fut.await;\n } finally {\n room.off(RoomEvent.TrackPublished, onTrackPublished);\n }\n}\n\nexport async function waitForAbort(signal: AbortSignal) {\n const abortFuture = new Future<void>();\n const handler = () => {\n abortFuture.resolve();\n signal.removeEventListener('abort', handler);\n };\n\n signal.addEventListener('abort', handler, { once: true });\n return await abortFuture.await;\n}\n\n/**\n * Combines two abort signals into a single abort signal.\n * @param a - The first abort signal.\n * @param b - The second abort signal.\n * @returns A new abort signal that is aborted when either of the input signals is aborted.\n */\nexport const combineSignals = (a: AbortSignal, b: AbortSignal): AbortSignal => {\n const c = new AbortController();\n const abortFrom = (s: AbortSignal) => {\n if (c.signal.aborted) return;\n c.abort((s as any).reason);\n };\n if (a.aborted) {\n abortFrom(a);\n } else {\n a.addEventListener('abort', () => abortFrom(a), { once: true });\n }\n if (b.aborted) {\n abortFrom(b);\n } else {\n b.addEventListener('abort', () => abortFrom(b), { once: true });\n }\n return c.signal;\n};\n\nexport const isCloud = (url: URL) => {\n const hostname = url.hostname;\n return hostname.endsWith('.livekit.cloud') || hostname.endsWith('.livekit.run');\n};\n"],"mappings":"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","names":["item","TaskResult","uuidv4"]}
1
+ {"version":3,"sources":["../src/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type {\n ParticipantKind,\n RemoteParticipant,\n RemoteTrackPublication,\n Room,\n TrackKind,\n} from '@livekit/rtc-node';\nimport { AudioFrame, AudioResampler, RoomEvent } from '@livekit/rtc-node';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { EventEmitter, once } from 'node:events';\nimport type { ReadableStream } from 'node:stream/web';\nimport { TransformStream, type TransformStreamDefaultController } from 'node:stream/web';\nimport { v4 as uuidv4 } from 'uuid';\nimport { log } from './log.js';\n\n/**\n * Recursively expands all nested properties of a type,\n * resolving aliases so as to inspect the real shape in IDE.\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type Expand<T> = T extends Function\n ? T\n : T extends object\n ? T extends Array<infer U>\n ? Array<Expand<U>>\n : T extends Map<infer K, infer V>\n ? Map<Expand<K>, Expand<V>>\n : T extends Set<infer M>\n ? Set<Expand<M>>\n : { [K in keyof T]: Expand<T[K]> }\n : T;\n\n/** Union of a single and a list of {@link AudioFrame}s */\nexport type AudioBuffer = AudioFrame[] | AudioFrame;\n\nexport const noop = () => {};\n\nexport const isPending = async (promise: Promise<unknown>): Promise<boolean> => {\n const sentinel = Symbol('sentinel');\n const result = await Promise.race([promise, Promise.resolve(sentinel)]);\n return result === sentinel;\n};\n\n/**\n * Merge one or more {@link AudioFrame}s into a single one.\n *\n * @param buffer - Either an {@link AudioFrame} or a list thereof\n * @throws\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError\n * | TypeError} if sample rate or channel count are mismatched\n */\nexport const mergeFrames = (buffer: AudioBuffer): AudioFrame => {\n if (Array.isArray(buffer)) {\n buffer = buffer as AudioFrame[];\n if (buffer.length == 0) {\n throw new TypeError('buffer is empty');\n }\n\n const sampleRate = buffer[0]!.sampleRate;\n const channels = buffer[0]!.channels;\n let samplesPerChannel = 0;\n let data = new Int16Array();\n\n for (const frame of buffer) {\n if (frame.sampleRate !== sampleRate) {\n throw new TypeError('sample rate mismatch');\n }\n\n if (frame.channels !== channels) {\n throw new TypeError('channel count mismatch');\n }\n\n data = new Int16Array([...data, ...frame.data]);\n samplesPerChannel += frame.samplesPerChannel;\n }\n\n return new AudioFrame(data, sampleRate, channels, samplesPerChannel);\n }\n\n return buffer;\n};\n\n/** @internal */\nexport class Queue<T> {\n /** @internal */\n items: T[] = [];\n #limit?: number;\n #events = new EventEmitter();\n\n constructor(limit?: number) {\n this.#limit = limit;\n }\n\n async get(): Promise<T> {\n const _get = async (): Promise<T> => {\n if (this.items.length === 0) {\n await once(this.#events, 'put');\n }\n let item = this.items.shift();\n if (!item) {\n item = await _get();\n }\n return item;\n };\n\n const item = _get();\n this.#events.emit('get');\n return item;\n }\n\n async put(item: T) {\n if (this.#limit && this.items.length >= this.#limit) {\n await once(this.#events, 'get');\n }\n this.items.push(item);\n this.#events.emit('put');\n }\n}\n\n/** @internal */\nexport class Future<T = void> {\n #await: Promise<T>;\n #resolvePromise!: (value: T) => void;\n #rejectPromise!: (error: Error) => void;\n #done: boolean = false;\n #rejected: boolean = false;\n #result: T | undefined = undefined;\n #error: Error | undefined = undefined;\n\n constructor() {\n this.#await = new Promise<T>((resolve, reject) => {\n this.#resolvePromise = resolve;\n this.#rejectPromise = reject;\n });\n }\n\n get await() {\n return this.#await;\n }\n\n get done() {\n return this.#done;\n }\n\n get result(): T {\n if (!this.#done) {\n throw new Error('Future is not done');\n }\n\n if (this.#rejected) {\n throw this.#error;\n }\n\n return this.#result!;\n }\n\n /** Whether the future was rejected (cancelled) */\n get rejected() {\n return this.#rejected;\n }\n\n resolve(value: T) {\n this.#done = true;\n this.#result = value;\n this.#resolvePromise(value);\n }\n\n reject(error: Error) {\n this.#done = true;\n this.#rejected = true;\n this.#error = error;\n this.#rejectPromise(error);\n }\n}\n\n/** @internal */\nexport class Event {\n #isSet = false;\n #waiters: Array<() => void> = [];\n\n async wait() {\n if (this.#isSet) return true;\n\n let resolve: () => void = noop;\n const waiter = new Promise<void>((r) => {\n resolve = r;\n this.#waiters.push(resolve);\n });\n\n try {\n await waiter;\n return true;\n } finally {\n const index = this.#waiters.indexOf(resolve);\n if (index !== -1) {\n this.#waiters.splice(index, 1);\n }\n }\n }\n\n get isSet(): boolean {\n return this.#isSet;\n }\n\n set(): void {\n if (this.#isSet) return;\n\n this.#isSet = true;\n this.#waiters.forEach((resolve) => resolve());\n this.#waiters = [];\n }\n\n clear(): void {\n this.#isSet = false;\n }\n}\n\n/** @internal */\nexport class CancellablePromise<T> {\n #promise: Promise<T>;\n #cancelFn: () => void;\n #isCancelled: boolean = false;\n #error: Error | null = null;\n\n constructor(\n executor: (\n resolve: (value: T | PromiseLike<T>) => void,\n reject: (reason?: unknown) => void,\n onCancel: (cancelFn: () => void) => void,\n ) => void,\n ) {\n let cancel: () => void;\n\n this.#promise = new Promise<T>((resolve, reject) => {\n executor(\n resolve,\n (reason) => {\n this.#error = reason instanceof Error ? reason : new Error(String(reason));\n reject(reason);\n },\n (cancelFn) => {\n cancel = () => {\n this.#isCancelled = true;\n cancelFn();\n };\n },\n );\n });\n\n this.#cancelFn = cancel!;\n }\n\n get isCancelled(): boolean {\n return this.#isCancelled;\n }\n\n get error(): Error | null {\n return this.#error;\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | Promise<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | Promise<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.#promise.then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | Promise<TResult>) | null,\n ): Promise<T | TResult> {\n return this.#promise.catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.#promise.finally(onfinally);\n }\n\n cancel(): void {\n this.#cancelFn();\n }\n\n static from<T>(promise: Promise<T>): CancellablePromise<T> {\n return new CancellablePromise<T>((resolve, reject) => {\n promise.then(resolve).catch(reject);\n });\n }\n}\n\n/** @internal */\nexport async function gracefullyCancel<T>(promise: CancellablePromise<T>): Promise<void> {\n if (!promise.isCancelled) {\n promise.cancel();\n }\n try {\n await promise;\n } catch (error) {\n // Ignore the error, as it's expected due to cancellation\n }\n}\n\n/** @internal */\nexport class AsyncIterableQueue<T> implements AsyncIterableIterator<T> {\n private static readonly CLOSE_SENTINEL = Symbol('CLOSE_SENTINEL');\n #queue = new Queue<T | typeof AsyncIterableQueue.CLOSE_SENTINEL>();\n #closed = false;\n\n get closed(): boolean {\n return this.#closed;\n }\n\n put(item: T): void {\n if (this.#closed) {\n throw new Error('Queue is closed');\n }\n this.#queue.put(item);\n }\n\n close(): void {\n this.#closed = true;\n this.#queue.put(AsyncIterableQueue.CLOSE_SENTINEL);\n }\n\n async next(): Promise<IteratorResult<T>> {\n if (this.#closed && this.#queue.items.length === 0) {\n return { value: undefined, done: true };\n }\n const item = await this.#queue.get();\n if (item === AsyncIterableQueue.CLOSE_SENTINEL && this.#closed) {\n return { value: undefined, done: true };\n }\n return { value: item as T, done: false };\n }\n\n [Symbol.asyncIterator](): AsyncIterableQueue<T> {\n return this;\n }\n}\n\n/** @internal */\nexport class ExpFilter {\n #alpha: number;\n #max?: number;\n #filtered?: number = undefined;\n\n constructor(alpha: number, max?: number) {\n this.#alpha = alpha;\n this.#max = max;\n }\n\n reset(alpha?: number) {\n if (alpha) {\n this.#alpha = alpha;\n }\n this.#filtered = undefined;\n }\n\n apply(exp: number, sample: number): number {\n if (this.#filtered) {\n const a = this.#alpha ** exp;\n this.#filtered = a * this.#filtered + (1 - a) * sample;\n } else {\n this.#filtered = sample;\n }\n\n if (this.#max && this.#filtered > this.#max) {\n this.#filtered = this.#max;\n }\n\n return this.#filtered;\n }\n\n get filtered(): number | undefined {\n return this.#filtered;\n }\n\n set alpha(alpha: number) {\n this.#alpha = alpha;\n }\n}\n\n/** @internal */\nexport class AudioEnergyFilter {\n #cooldownSeconds: number;\n #cooldown: number;\n\n constructor(cooldownSeconds = 1) {\n this.#cooldownSeconds = cooldownSeconds;\n this.#cooldown = cooldownSeconds;\n }\n\n pushFrame(frame: AudioFrame): boolean {\n const arr = Float32Array.from(frame.data, (x) => x / 32768);\n const rms = (arr.map((x) => x ** 2).reduce((acc, x) => acc + x) / arr.length) ** 0.5;\n if (rms > 0.004) {\n this.#cooldown = this.#cooldownSeconds;\n return true;\n }\n\n const durationSeconds = frame.samplesPerChannel / frame.sampleRate;\n this.#cooldown -= durationSeconds;\n if (this.#cooldown > 0) {\n return true;\n }\n\n return false;\n }\n}\n\nexport enum TaskResult {\n Timeout = 'timeout',\n Completed = 'completed',\n Aborted = 'aborted',\n}\n\n/** @internal */\n/**\n * A task that can be cancelled.\n *\n * We recommend using the `Task.from` method to create a task. When creating subtasks, pass the same controller to all subtasks.\n *\n * @example\n * ```ts\n * const parent = Task.from((controller) => {\n * const child1 = Task.from(() => { ... }, controller);\n * const child2 = Task.from(() => { ... }, controller);\n * });\n * parent.cancel();\n * ```\n *\n * This will cancel all subtasks when the parent is cancelled.\n *\n * @param T - The type of the task result\n */\nexport class Task<T> {\n private static readonly currentTaskStorage = new AsyncLocalStorage<Task<unknown>>();\n private resultFuture: Future<T>;\n private doneCallbacks: Set<() => void> = new Set();\n\n #logger = log();\n\n constructor(\n private readonly fn: (controller: AbortController) => Promise<T>,\n private readonly controller: AbortController,\n readonly name?: string,\n ) {\n this.resultFuture = new Future();\n void this.resultFuture.await\n .then(\n () => undefined,\n () => undefined,\n )\n .finally(() => {\n for (const callback of this.doneCallbacks) {\n try {\n callback();\n } catch (error) {\n this.#logger.error({ error }, 'Task done callback failed');\n }\n }\n this.doneCallbacks.clear();\n });\n this.runTask();\n }\n\n /**\n * Creates a new task from a function.\n *\n * @param fn - The function to run\n * @param controller - The abort controller to use\n * @returns A new task\n */\n static from<T>(\n fn: (controller: AbortController) => Promise<T>,\n controller?: AbortController,\n name?: string,\n ) {\n const abortController = controller ?? new AbortController();\n return new Task(fn, abortController, name);\n }\n\n /**\n * Returns the currently running task in this async context, if available.\n */\n static current(): Task<unknown> | undefined {\n return Task.currentTaskStorage.getStore();\n }\n\n private async runTask() {\n const run = async () => {\n if (this.name) {\n this.#logger.debug(`Task.runTask: task ${this.name} started`);\n }\n return await this.fn(this.controller);\n };\n\n return Task.currentTaskStorage\n .run(this as Task<unknown>, run)\n .then((value) => {\n this.resultFuture.resolve(value);\n return value;\n })\n .catch((error) => {\n this.resultFuture.reject(error);\n })\n .finally(() => {\n if (this.name) {\n this.#logger.debug(`Task.runTask: task ${this.name} done`);\n }\n });\n }\n\n /**\n * Cancels the task.\n */\n cancel() {\n this.controller.abort();\n }\n\n /**\n * Cancels the task and waits for it to complete.\n *\n * @param timeout - The timeout in milliseconds\n * @returns The result status of the task (timeout, completed, aborted)\n */\n async cancelAndWait(timeout?: number) {\n this.cancel();\n\n // Race between task completion and timeout\n const promises = [\n this.result\n .then(() => TaskResult.Completed)\n .catch((error) => {\n if (error.name === 'AbortError') {\n return TaskResult.Aborted;\n }\n throw error;\n }),\n ];\n\n if (timeout) {\n promises.push(delay(timeout).then(() => TaskResult.Timeout));\n }\n\n const result = await Promise.race(promises);\n\n // Check what happened\n if (result === TaskResult.Timeout) {\n throw new Error('Task cancellation timed out');\n }\n\n return result;\n }\n\n /**\n * The result of the task.\n */\n get result(): Promise<T> {\n return this.resultFuture.await;\n }\n\n /**\n * Whether the task has completed.\n */\n get done(): boolean {\n return this.resultFuture.done;\n }\n\n addDoneCallback(callback: () => void) {\n if (this.done) {\n queueMicrotask(callback);\n return;\n }\n this.doneCallbacks.add(callback);\n }\n\n removeDoneCallback(callback: () => void) {\n this.doneCallbacks.delete(callback);\n }\n}\n\nexport async function waitFor(tasks: Task<void>[]): Promise<void> {\n await Promise.allSettled(tasks.map((task) => task.result));\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function cancelAndWait(tasks: Task<any>[], timeout?: number): Promise<void> {\n await Promise.allSettled(tasks.map((task) => task.cancelAndWait(timeout)));\n}\n\nexport function withResolvers<T = unknown>() {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n\n/**\n * Generates a short UUID with a prefix. Mirrors the python agents implementation.\n *\n * @param prefix - The prefix to add to the UUID.\n * @returns A short UUID with the prefix.\n */\nexport function shortuuid(prefix: string = ''): string {\n return `${prefix}${uuidv4().slice(0, 12)}`;\n}\n\nconst READONLY_SYMBOL = Symbol('Readonly');\n\nconst MUTATION_METHODS = [\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'splice',\n 'sort',\n 'reverse',\n 'fill',\n 'copyWithin',\n] as const;\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy\n/**\n * Creates a read-only proxy for an array.\n * @param array - The array to make read-only.\n * @param additionalErrorMessage - An additional error message to include in the error thrown when a mutation method is called.\n * @returns A read-only proxy for the array.\n */\nexport function createImmutableArray<T>(array: T[], additionalErrorMessage: string = ''): T[] {\n return new Proxy(array, {\n get(target, key) {\n if (key === READONLY_SYMBOL) {\n return true;\n }\n\n // Intercept mutation methods\n if (\n typeof key === 'string' &&\n MUTATION_METHODS.includes(key as (typeof MUTATION_METHODS)[number])\n ) {\n return function () {\n throw new TypeError(\n `Cannot call ${key}() on a read-only array. ${additionalErrorMessage}`.trim(),\n );\n };\n }\n\n return Reflect.get(target, key);\n },\n set(_, prop) {\n throw new TypeError(\n `Cannot assign to read-only array index \"${String(prop)}\". ${additionalErrorMessage}`.trim(),\n );\n },\n deleteProperty(_, prop) {\n throw new TypeError(\n `Cannot delete read-only array index \"${String(prop)}\". ${additionalErrorMessage}`.trim(),\n );\n },\n defineProperty(_, prop) {\n throw new TypeError(\n `Cannot define property \"${String(prop)}\" on a read-only array. ${additionalErrorMessage}`.trim(),\n );\n },\n setPrototypeOf() {\n throw new TypeError(\n `Cannot change prototype of a read-only array. ${additionalErrorMessage}`.trim(),\n );\n },\n });\n}\n\nexport function isImmutableArray(array: unknown): boolean {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return typeof array === 'object' && !!(array as any)[READONLY_SYMBOL];\n}\n\n/**\n * Resamples an audio stream to a target sample rate.\n *\n * WARINING: The input stream will be locked until the resampled stream is closed.\n *\n * @param stream - The input stream to resample.\n * @param outputRate - The target sample rate.\n * @returns A new stream with the resampled audio.\n */\nexport function resampleStream({\n stream,\n outputRate,\n}: {\n stream: ReadableStream<AudioFrame>;\n outputRate: number;\n}): ReadableStream<AudioFrame> {\n let resampler: AudioResampler | null = null;\n const transformStream = new TransformStream<AudioFrame, AudioFrame>({\n transform(chunk: AudioFrame, controller: TransformStreamDefaultController<AudioFrame>) {\n if (chunk.samplesPerChannel === 0) {\n controller.enqueue(chunk);\n return;\n }\n if (!resampler) {\n resampler = new AudioResampler(chunk.sampleRate, outputRate);\n }\n for (const frame of resampler.push(chunk)) {\n controller.enqueue(frame);\n }\n },\n flush(controller) {\n if (resampler) {\n for (const frame of resampler.flush()) {\n controller.enqueue(frame);\n }\n }\n },\n });\n return stream.pipeThrough(transformStream);\n}\n\nexport class InvalidErrorType extends Error {\n readonly error: unknown;\n\n constructor(error: unknown) {\n super(`Expected error, got ${error} (${typeof error})`);\n this.error = error;\n Error.captureStackTrace(this, InvalidErrorType);\n }\n}\n\n/**\n * Check if an error is a stream closed error that can be safely ignored during cleanup.\n * This happens during handover/cleanup when close() is called while operations are still running.\n *\n * @param error - The error to check.\n * @returns True if the error is a stream closed error.\n */\nexport function isStreamClosedError(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.message === 'Stream is closed' || error.message === 'Input is closed')\n );\n}\n\n/**\n * In JS an error can be any arbitrary value.\n * This function converts an unknown error to an Error and stores the original value in the error object.\n *\n * @param error - The error to convert.\n * @returns An Error.\n */\nexport function toError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n throw new InvalidErrorType(error);\n}\n\n/**\n * This is a hack to immitate asyncio.create_task so that\n * func will be run after the current event loop iteration.\n *\n * @param func - The function to run.\n */\nexport function startSoon(func: () => void) {\n setTimeout(func, 0);\n}\n\nexport type DelayOptions = {\n signal?: AbortSignal;\n};\n\n/**\n * Delay for a given number of milliseconds.\n *\n * @param ms - The number of milliseconds to delay.\n * @param options - The options for the delay.\n * @returns A promise that resolves after the delay.\n */\nexport function delay(ms: number, options: DelayOptions = {}): Promise<void> {\n const { signal } = options;\n if (signal?.aborted) return Promise.reject(signal.reason);\n return new Promise((resolve, reject) => {\n const abort = () => {\n clearTimeout(i);\n reject(signal?.reason);\n };\n const done = () => {\n signal?.removeEventListener('abort', abort);\n resolve();\n };\n const i = setTimeout(done, ms);\n signal?.addEventListener('abort', abort, { once: true });\n });\n}\n\n/**\n * Returns a participant that matches the given identity. If identity is None, the first\n * participant that joins the room will be returned.\n * If the participant has already joined, the function will return immediately.\n * @param room - The room to wait for a participant in.\n * @param identity - The identity of the participant to wait for.\n * @param kind - The kind of the participant to wait for.\n * @returns A promise that resolves to the participant.\n */\nexport async function waitForParticipant({\n room,\n identity,\n kind,\n}: {\n room: Room;\n identity?: string;\n kind?: ParticipantKind | ParticipantKind[];\n}): Promise<RemoteParticipant> {\n if (!room.isConnected) {\n throw new Error('Room is not connected');\n }\n\n const fut = new Future<RemoteParticipant>();\n\n const kindMatch = (participant: RemoteParticipant) => {\n if (kind === undefined) return true;\n\n if (Array.isArray(kind)) {\n return kind.includes(participant.kind);\n }\n\n return participant.kind === kind;\n };\n\n const onParticipantConnected = (p: RemoteParticipant) => {\n if ((identity === undefined || p.identity === identity) && kindMatch(p)) {\n if (!fut.done) {\n fut.resolve(p);\n }\n }\n };\n\n room.on(RoomEvent.ParticipantConnected, onParticipantConnected);\n\n try {\n for (const p of room.remoteParticipants.values()) {\n onParticipantConnected(p);\n if (fut.done) {\n break;\n }\n }\n\n return await fut.await;\n } finally {\n room.off(RoomEvent.ParticipantConnected, onParticipantConnected);\n }\n}\n\nexport async function waitForTrackPublication({\n room,\n identity,\n kind,\n}: {\n room: Room;\n identity: string;\n kind: TrackKind;\n}): Promise<RemoteTrackPublication> {\n if (!room.isConnected) {\n throw new Error('Room is not connected');\n }\n\n const fut = new Future<RemoteTrackPublication>();\n\n const kindMatch = (k: TrackKind | undefined) => {\n if (kind === undefined || kind === null) {\n return true;\n }\n return k === kind;\n };\n\n const onTrackPublished = (\n publication: RemoteTrackPublication,\n participant: RemoteParticipant,\n ) => {\n if (fut.done) return;\n if (\n (identity === undefined || participant.identity === identity) &&\n kindMatch(publication.kind)\n ) {\n fut.resolve(publication);\n }\n };\n\n room.on(RoomEvent.TrackPublished, onTrackPublished);\n\n try {\n for (const p of room.remoteParticipants.values()) {\n for (const publication of p.trackPublications.values()) {\n onTrackPublished(publication, p);\n if (fut.done) break;\n }\n }\n\n return await fut.await;\n } finally {\n room.off(RoomEvent.TrackPublished, onTrackPublished);\n }\n}\n\nexport async function waitForAbort(signal: AbortSignal) {\n const abortFuture = new Future<void>();\n const handler = () => {\n abortFuture.resolve();\n signal.removeEventListener('abort', handler);\n };\n\n signal.addEventListener('abort', handler, { once: true });\n return await abortFuture.await;\n}\n\n/**\n * Combines two abort signals into a single abort signal.\n * @param a - The first abort signal.\n * @param b - The second abort signal.\n * @returns A new abort signal that is aborted when either of the input signals is aborted.\n */\nexport const combineSignals = (a: AbortSignal, b: AbortSignal): AbortSignal => {\n const c = new AbortController();\n const abortFrom = (s: AbortSignal) => {\n if (c.signal.aborted) return;\n c.abort((s as any).reason);\n };\n if (a.aborted) {\n abortFrom(a);\n } else {\n a.addEventListener('abort', () => abortFrom(a), { once: true });\n }\n if (b.aborted) {\n abortFrom(b);\n } else {\n b.addEventListener('abort', () => abortFrom(b), { once: true });\n }\n return c.signal;\n};\n\nexport const isCloud = (url: URL) => {\n const hostname = url.hostname;\n return hostname.endsWith('.livekit.cloud') || hostname.endsWith('.livekit.run');\n};\n"],"mappings":"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","names":["item","TaskResult","uuidv4"]}
package/dist/utils.d.cts CHANGED
@@ -119,7 +119,9 @@ export declare class Task<T> {
119
119
  private readonly fn;
120
120
  private readonly controller;
121
121
  readonly name?: string | undefined;
122
+ private static readonly currentTaskStorage;
122
123
  private resultFuture;
124
+ private doneCallbacks;
123
125
  constructor(fn: (controller: AbortController) => Promise<T>, controller: AbortController, name?: string | undefined);
124
126
  /**
125
127
  * Creates a new task from a function.
@@ -129,6 +131,10 @@ export declare class Task<T> {
129
131
  * @returns A new task
130
132
  */
131
133
  static from<T>(fn: (controller: AbortController) => Promise<T>, controller?: AbortController, name?: string): Task<T>;
134
+ /**
135
+ * Returns the currently running task in this async context, if available.
136
+ */
137
+ static current(): Task<unknown> | undefined;
132
138
  private runTask;
133
139
  /**
134
140
  * Cancels the task.
@@ -150,6 +156,7 @@ export declare class Task<T> {
150
156
  */
151
157
  get done(): boolean;
152
158
  addDoneCallback(callback: () => void): void;
159
+ removeDoneCallback(callback: () => void): void;
153
160
  }
154
161
  export declare function waitFor(tasks: Task<void>[]): Promise<void>;
155
162
  export declare function cancelAndWait(tasks: Task<any>[], timeout?: number): Promise<void>;
package/dist/utils.d.ts CHANGED
@@ -119,7 +119,9 @@ export declare class Task<T> {
119
119
  private readonly fn;
120
120
  private readonly controller;
121
121
  readonly name?: string | undefined;
122
+ private static readonly currentTaskStorage;
122
123
  private resultFuture;
124
+ private doneCallbacks;
123
125
  constructor(fn: (controller: AbortController) => Promise<T>, controller: AbortController, name?: string | undefined);
124
126
  /**
125
127
  * Creates a new task from a function.
@@ -129,6 +131,10 @@ export declare class Task<T> {
129
131
  * @returns A new task
130
132
  */
131
133
  static from<T>(fn: (controller: AbortController) => Promise<T>, controller?: AbortController, name?: string): Task<T>;
134
+ /**
135
+ * Returns the currently running task in this async context, if available.
136
+ */
137
+ static current(): Task<unknown> | undefined;
132
138
  private runTask;
133
139
  /**
134
140
  * Cancels the task.
@@ -150,6 +156,7 @@ export declare class Task<T> {
150
156
  */
151
157
  get done(): boolean;
152
158
  addDoneCallback(callback: () => void): void;
159
+ removeDoneCallback(callback: () => void): void;
153
160
  }
154
161
  export declare function waitFor(tasks: Task<void>[]): Promise<void>;
155
162
  export declare function cancelAndWait(tasks: Task<any>[], timeout?: number): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/dist/utils.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { AudioFrame, AudioResampler, RoomEvent } from "@livekit/rtc-node";
2
+ import { AsyncLocalStorage } from "node:async_hooks";
2
3
  import { EventEmitter, once } from "node:events";
3
4
  import { TransformStream } from "node:stream/web";
4
5
  import { v4 as uuidv4 } from "uuid";
@@ -298,9 +299,24 @@ class Task {
298
299
  this.controller = controller;
299
300
  this.name = name;
300
301
  this.resultFuture = new Future();
302
+ void this.resultFuture.await.then(
303
+ () => void 0,
304
+ () => void 0
305
+ ).finally(() => {
306
+ for (const callback of this.doneCallbacks) {
307
+ try {
308
+ callback();
309
+ } catch (error) {
310
+ this.#logger.error({ error }, "Task done callback failed");
311
+ }
312
+ }
313
+ this.doneCallbacks.clear();
314
+ });
301
315
  this.runTask();
302
316
  }
317
+ static currentTaskStorage = new AsyncLocalStorage();
303
318
  resultFuture;
319
+ doneCallbacks = /* @__PURE__ */ new Set();
304
320
  #logger = log();
305
321
  /**
306
322
  * Creates a new task from a function.
@@ -313,6 +329,12 @@ class Task {
313
329
  const abortController = controller ?? new AbortController();
314
330
  return new Task(fn, abortController, name);
315
331
  }
332
+ /**
333
+ * Returns the currently running task in this async context, if available.
334
+ */
335
+ static current() {
336
+ return Task.currentTaskStorage.getStore();
337
+ }
316
338
  async runTask() {
317
339
  const run = async () => {
318
340
  if (this.name) {
@@ -320,7 +342,7 @@ class Task {
320
342
  }
321
343
  return await this.fn(this.controller);
322
344
  };
323
- return run().then((value) => {
345
+ return Task.currentTaskStorage.run(this, run).then((value) => {
324
346
  this.resultFuture.resolve(value);
325
347
  return value;
326
348
  }).catch((error) => {
@@ -375,7 +397,14 @@ class Task {
375
397
  return this.resultFuture.done;
376
398
  }
377
399
  addDoneCallback(callback) {
378
- this.resultFuture.await.finally(callback);
400
+ if (this.done) {
401
+ queueMicrotask(callback);
402
+ return;
403
+ }
404
+ this.doneCallbacks.add(callback);
405
+ }
406
+ removeDoneCallback(callback) {
407
+ this.doneCallbacks.delete(callback);
379
408
  }
380
409
  }
381
410
  async function waitFor(tasks) {