openai 7.5.0 → 7.7.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 (597) hide show
  1. package/CHANGELOG.md +117 -0
  2. package/README.md +46 -2
  3. package/auth/index.d.mts +1 -1
  4. package/auth/index.d.mts.map +1 -1
  5. package/auth/index.d.ts +1 -1
  6. package/auth/index.d.ts.map +1 -1
  7. package/auth/index.js.map +1 -1
  8. package/auth/index.mjs.map +1 -1
  9. package/auth/subject-token-providers.d.mts.map +1 -1
  10. package/auth/subject-token-providers.d.ts.map +1 -1
  11. package/auth/subject-token-providers.js +176 -4
  12. package/auth/subject-token-providers.js.map +1 -1
  13. package/auth/subject-token-providers.mjs +176 -4
  14. package/auth/subject-token-providers.mjs.map +1 -1
  15. package/auth/types.d.mts +17 -0
  16. package/auth/types.d.mts.map +1 -1
  17. package/auth/types.d.ts +17 -0
  18. package/auth/types.d.ts.map +1 -1
  19. package/auth/workload-identity-auth.d.mts.map +1 -1
  20. package/auth/workload-identity-auth.d.ts.map +1 -1
  21. package/auth/workload-identity-auth.js +80 -7
  22. package/auth/workload-identity-auth.js.map +1 -1
  23. package/auth/workload-identity-auth.mjs +80 -7
  24. package/auth/workload-identity-auth.mjs.map +1 -1
  25. package/auth/x509-transport.d.mts +5 -0
  26. package/auth/x509-transport.d.mts.map +1 -0
  27. package/auth/x509-transport.d.ts +5 -0
  28. package/auth/x509-transport.d.ts.map +1 -0
  29. package/auth/x509-transport.js +39 -0
  30. package/auth/x509-transport.js.map +1 -0
  31. package/auth/x509-transport.mjs +36 -0
  32. package/auth/x509-transport.mjs.map +1 -0
  33. package/azure.d.mts +11 -2
  34. package/azure.d.mts.map +1 -1
  35. package/azure.d.ts +11 -2
  36. package/azure.d.ts.map +1 -1
  37. package/azure.js +7 -1
  38. package/azure.js.map +1 -1
  39. package/azure.mjs +7 -1
  40. package/azure.mjs.map +1 -1
  41. package/bedrock.d.mts +6 -2
  42. package/bedrock.d.mts.map +1 -1
  43. package/bedrock.d.ts +6 -2
  44. package/bedrock.d.ts.map +1 -1
  45. package/bedrock.js +34 -4
  46. package/bedrock.js.map +1 -1
  47. package/bedrock.mjs +35 -5
  48. package/bedrock.mjs.map +1 -1
  49. package/beta/realtime/internal-base.d.mts +2 -0
  50. package/beta/realtime/internal-base.d.mts.map +1 -1
  51. package/beta/realtime/internal-base.d.ts +2 -0
  52. package/beta/realtime/internal-base.d.ts.map +1 -1
  53. package/beta/realtime/internal-base.js +15 -0
  54. package/beta/realtime/internal-base.js.map +1 -1
  55. package/beta/realtime/internal-base.mjs +14 -0
  56. package/beta/realtime/internal-base.mjs.map +1 -1
  57. package/beta/realtime/websocket.d.mts +11 -5
  58. package/beta/realtime/websocket.d.mts.map +1 -1
  59. package/beta/realtime/websocket.d.ts +11 -5
  60. package/beta/realtime/websocket.d.ts.map +1 -1
  61. package/beta/realtime/websocket.js +106 -31
  62. package/beta/realtime/websocket.js.map +1 -1
  63. package/beta/realtime/websocket.mjs +107 -32
  64. package/beta/realtime/websocket.mjs.map +1 -1
  65. package/beta/realtime/ws.d.mts +0 -2
  66. package/beta/realtime/ws.d.mts.map +1 -1
  67. package/beta/realtime/ws.d.ts +0 -2
  68. package/beta/realtime/ws.d.ts.map +1 -1
  69. package/beta/realtime/ws.js +24 -5
  70. package/beta/realtime/ws.js.map +1 -1
  71. package/beta/realtime/ws.mjs +25 -6
  72. package/beta/realtime/ws.mjs.map +1 -1
  73. package/client.d.mts +17 -2
  74. package/client.d.mts.map +1 -1
  75. package/client.d.ts +17 -2
  76. package/client.d.ts.map +1 -1
  77. package/client.js +422 -70
  78. package/client.js.map +1 -1
  79. package/client.mjs +423 -71
  80. package/client.mjs.map +1 -1
  81. package/core/EventEmitter.d.mts.map +1 -1
  82. package/core/EventEmitter.d.ts.map +1 -1
  83. package/core/EventEmitter.js +67 -9
  84. package/core/EventEmitter.js.map +1 -1
  85. package/core/EventEmitter.mjs +68 -10
  86. package/core/EventEmitter.mjs.map +1 -1
  87. package/core/streaming.d.mts +1 -0
  88. package/core/streaming.d.mts.map +1 -1
  89. package/core/streaming.d.ts +1 -0
  90. package/core/streaming.d.ts.map +1 -1
  91. package/core/streaming.js +216 -26
  92. package/core/streaming.js.map +1 -1
  93. package/core/streaming.mjs +216 -26
  94. package/core/streaming.mjs.map +1 -1
  95. package/helpers/audio.d.mts +5 -5
  96. package/helpers/audio.d.mts.map +1 -1
  97. package/helpers/audio.d.ts +5 -5
  98. package/helpers/audio.d.ts.map +1 -1
  99. package/helpers/audio.js +93 -22
  100. package/helpers/audio.js.map +1 -1
  101. package/helpers/audio.mjs +93 -22
  102. package/helpers/audio.mjs.map +1 -1
  103. package/helpers/standard-schema.d.mts.map +1 -1
  104. package/helpers/standard-schema.d.ts.map +1 -1
  105. package/helpers/standard-schema.js +34 -14
  106. package/helpers/standard-schema.js.map +1 -1
  107. package/helpers/standard-schema.mjs +35 -15
  108. package/helpers/standard-schema.mjs.map +1 -1
  109. package/helpers/zod-v3-strict-schema.d.mts +7 -0
  110. package/helpers/zod-v3-strict-schema.d.mts.map +1 -0
  111. package/helpers/zod-v3-strict-schema.d.ts +7 -0
  112. package/helpers/zod-v3-strict-schema.d.ts.map +1 -0
  113. package/helpers/zod-v3-strict-schema.js +403 -0
  114. package/helpers/zod-v3-strict-schema.js.map +1 -0
  115. package/helpers/zod-v3-strict-schema.mjs +399 -0
  116. package/helpers/zod-v3-strict-schema.mjs.map +1 -0
  117. package/helpers/zod.d.mts.map +1 -1
  118. package/helpers/zod.d.ts.map +1 -1
  119. package/helpers/zod.js +11 -3
  120. package/helpers/zod.js.map +1 -1
  121. package/helpers/zod.mjs +12 -4
  122. package/helpers/zod.mjs.map +1 -1
  123. package/index.d.mts +1 -1
  124. package/index.d.mts.map +1 -1
  125. package/index.d.ts +1 -1
  126. package/index.d.ts.map +1 -1
  127. package/index.js.map +1 -1
  128. package/index.mjs.map +1 -1
  129. package/internal/assistant-stream-delta.d.mts.map +1 -1
  130. package/internal/assistant-stream-delta.d.ts.map +1 -1
  131. package/internal/assistant-stream-delta.js +28 -8
  132. package/internal/assistant-stream-delta.js.map +1 -1
  133. package/internal/assistant-stream-delta.mjs +28 -8
  134. package/internal/assistant-stream-delta.mjs.map +1 -1
  135. package/internal/auth/x509-token-exchange.d.mts +16 -0
  136. package/internal/auth/x509-token-exchange.d.mts.map +1 -0
  137. package/internal/auth/x509-token-exchange.d.ts +16 -0
  138. package/internal/auth/x509-token-exchange.d.ts.map +1 -0
  139. package/internal/auth/x509-token-exchange.js +246 -0
  140. package/internal/auth/x509-token-exchange.js.map +1 -0
  141. package/internal/auth/x509-token-exchange.mjs +243 -0
  142. package/internal/auth/x509-token-exchange.mjs.map +1 -0
  143. package/internal/auth/x509-transport-capability.d.mts +37 -0
  144. package/internal/auth/x509-transport-capability.d.mts.map +1 -0
  145. package/internal/auth/x509-transport-capability.d.ts +37 -0
  146. package/internal/auth/x509-transport-capability.d.ts.map +1 -0
  147. package/internal/auth/x509-transport-capability.js +169 -0
  148. package/internal/auth/x509-transport-capability.js.map +1 -0
  149. package/internal/auth/x509-transport-capability.mjs +164 -0
  150. package/internal/auth/x509-transport-capability.mjs.map +1 -0
  151. package/internal/auth/x509-transport-registry.d.mts +63 -0
  152. package/internal/auth/x509-transport-registry.d.mts.map +1 -0
  153. package/internal/auth/x509-transport-registry.d.ts +63 -0
  154. package/internal/auth/x509-transport-registry.d.ts.map +1 -0
  155. package/internal/auth/x509-transport-registry.js +53 -0
  156. package/internal/auth/x509-transport-registry.js.map +1 -0
  157. package/internal/auth/x509-transport-registry.mjs +48 -0
  158. package/internal/auth/x509-transport-registry.mjs.map +1 -0
  159. package/internal/auth/x509-transport-state-browser.d.mts +21 -0
  160. package/internal/auth/x509-transport-state-browser.d.mts.map +1 -0
  161. package/internal/auth/x509-transport-state-browser.d.ts +21 -0
  162. package/internal/auth/x509-transport-state-browser.d.ts.map +1 -0
  163. package/internal/auth/x509-transport-state-browser.js +30 -0
  164. package/internal/auth/x509-transport-state-browser.js.map +1 -0
  165. package/internal/auth/x509-transport-state-browser.mjs +27 -0
  166. package/internal/auth/x509-transport-state-browser.mjs.map +1 -0
  167. package/internal/auth/x509-transport-state.cjs +30 -0
  168. package/internal/auth/x509-transport-state.cjs.map +1 -0
  169. package/internal/auth/x509-transport-state.d.cts +21 -0
  170. package/internal/auth/x509-transport-state.d.cts.map +1 -0
  171. package/internal/auth/x509-workload-identity-auth.d.mts +128 -0
  172. package/internal/auth/x509-workload-identity-auth.d.mts.map +1 -0
  173. package/internal/auth/x509-workload-identity-auth.d.ts +128 -0
  174. package/internal/auth/x509-workload-identity-auth.d.ts.map +1 -0
  175. package/internal/auth/x509-workload-identity-auth.js +767 -0
  176. package/internal/auth/x509-workload-identity-auth.js.map +1 -0
  177. package/internal/auth/x509-workload-identity-auth.mjs +757 -0
  178. package/internal/auth/x509-workload-identity-auth.mjs.map +1 -0
  179. package/internal/bedrock.d.mts +2 -0
  180. package/internal/bedrock.d.mts.map +1 -1
  181. package/internal/bedrock.d.ts +2 -0
  182. package/internal/bedrock.d.ts.map +1 -1
  183. package/internal/bedrock.js +169 -5
  184. package/internal/bedrock.js.map +1 -1
  185. package/internal/bedrock.mjs +168 -5
  186. package/internal/bedrock.mjs.map +1 -1
  187. package/internal/data-residency.d.mts +12 -0
  188. package/internal/data-residency.d.mts.map +1 -0
  189. package/internal/data-residency.d.ts +12 -0
  190. package/internal/data-residency.d.ts.map +1 -0
  191. package/internal/data-residency.js +34 -0
  192. package/internal/data-residency.js.map +1 -0
  193. package/internal/data-residency.mjs +30 -0
  194. package/internal/data-residency.mjs.map +1 -0
  195. package/internal/multipart-encoding.d.mts +8 -0
  196. package/internal/multipart-encoding.d.mts.map +1 -0
  197. package/internal/multipart-encoding.d.ts +8 -0
  198. package/internal/multipart-encoding.d.ts.map +1 -0
  199. package/internal/multipart-encoding.js +51 -0
  200. package/internal/multipart-encoding.js.map +1 -0
  201. package/internal/multipart-encoding.mjs +48 -0
  202. package/internal/multipart-encoding.mjs.map +1 -0
  203. package/internal/qs/utils.d.mts.map +1 -1
  204. package/internal/qs/utils.d.ts.map +1 -1
  205. package/internal/qs/utils.js +307 -10
  206. package/internal/qs/utils.js.map +1 -1
  207. package/internal/qs/utils.mjs +307 -10
  208. package/internal/qs/utils.mjs.map +1 -1
  209. package/internal/request-options.d.mts +7 -0
  210. package/internal/request-options.d.mts.map +1 -1
  211. package/internal/request-options.d.ts +7 -0
  212. package/internal/request-options.d.ts.map +1 -1
  213. package/internal/request-options.js +43 -1
  214. package/internal/request-options.js.map +1 -1
  215. package/internal/request-options.mjs +42 -1
  216. package/internal/request-options.mjs.map +1 -1
  217. package/internal/responses/canonical-output-text.js +3 -3
  218. package/internal/responses/canonical-output-text.js.map +1 -1
  219. package/internal/responses/canonical-output-text.mjs +3 -3
  220. package/internal/responses/canonical-output-text.mjs.map +1 -1
  221. package/internal/responses/response-accumulator.d.mts +1 -1
  222. package/internal/responses/response-accumulator.d.mts.map +1 -1
  223. package/internal/responses/response-accumulator.d.ts +1 -1
  224. package/internal/responses/response-accumulator.d.ts.map +1 -1
  225. package/internal/responses/response-accumulator.js +331 -25
  226. package/internal/responses/response-accumulator.js.map +1 -1
  227. package/internal/responses/response-accumulator.mjs +331 -25
  228. package/internal/responses/response-accumulator.mjs.map +1 -1
  229. package/internal/tslib.js +6 -0
  230. package/internal/tslib.mjs +6 -1
  231. package/internal/uploads.d.mts +10 -6
  232. package/internal/uploads.d.mts.map +1 -1
  233. package/internal/uploads.d.ts +10 -6
  234. package/internal/uploads.d.ts.map +1 -1
  235. package/internal/uploads.js +65 -24
  236. package/internal/uploads.js.map +1 -1
  237. package/internal/uploads.mjs +65 -24
  238. package/internal/uploads.mjs.map +1 -1
  239. package/internal/utils/env.d.mts.map +1 -1
  240. package/internal/utils/env.d.ts.map +1 -1
  241. package/internal/utils/env.js +9 -4
  242. package/internal/utils/env.js.map +1 -1
  243. package/internal/utils/env.mjs +9 -4
  244. package/internal/utils/env.mjs.map +1 -1
  245. package/internal/ws.d.mts.map +1 -1
  246. package/internal/ws.d.ts.map +1 -1
  247. package/internal/ws.js +23 -1
  248. package/internal/ws.js.map +1 -1
  249. package/internal/ws.mjs +23 -1
  250. package/internal/ws.mjs.map +1 -1
  251. package/lib/AbstractChatCompletionRunner.d.mts.map +1 -1
  252. package/lib/AbstractChatCompletionRunner.d.ts.map +1 -1
  253. package/lib/AbstractChatCompletionRunner.js +32 -7
  254. package/lib/AbstractChatCompletionRunner.js.map +1 -1
  255. package/lib/AbstractChatCompletionRunner.mjs +34 -9
  256. package/lib/AbstractChatCompletionRunner.mjs.map +1 -1
  257. package/lib/AssistantStream.d.mts.map +1 -1
  258. package/lib/AssistantStream.d.ts.map +1 -1
  259. package/lib/AssistantStream.js +211 -23
  260. package/lib/AssistantStream.js.map +1 -1
  261. package/lib/AssistantStream.mjs +211 -23
  262. package/lib/AssistantStream.mjs.map +1 -1
  263. package/lib/ChatCompletionStream.d.mts +1 -1
  264. package/lib/ChatCompletionStream.d.mts.map +1 -1
  265. package/lib/ChatCompletionStream.d.ts +1 -1
  266. package/lib/ChatCompletionStream.d.ts.map +1 -1
  267. package/lib/ChatCompletionStream.js +1118 -67
  268. package/lib/ChatCompletionStream.js.map +1 -1
  269. package/lib/ChatCompletionStream.mjs +1119 -68
  270. package/lib/ChatCompletionStream.mjs.map +1 -1
  271. package/lib/EventEmitter.d.mts.map +1 -1
  272. package/lib/EventEmitter.d.ts.map +1 -1
  273. package/lib/EventEmitter.js +67 -9
  274. package/lib/EventEmitter.js.map +1 -1
  275. package/lib/EventEmitter.mjs +68 -10
  276. package/lib/EventEmitter.mjs.map +1 -1
  277. package/lib/EventStream.d.mts +4 -0
  278. package/lib/EventStream.d.mts.map +1 -1
  279. package/lib/EventStream.d.ts +4 -0
  280. package/lib/EventStream.d.ts.map +1 -1
  281. package/lib/EventStream.js +1096 -11
  282. package/lib/EventStream.js.map +1 -1
  283. package/lib/EventStream.mjs +1097 -12
  284. package/lib/EventStream.mjs.map +1 -1
  285. package/lib/ResponsesParser.d.mts.map +1 -1
  286. package/lib/ResponsesParser.d.ts.map +1 -1
  287. package/lib/ResponsesParser.js +1 -1
  288. package/lib/ResponsesParser.js.map +1 -1
  289. package/lib/ResponsesParser.mjs +1 -1
  290. package/lib/ResponsesParser.mjs.map +1 -1
  291. package/lib/Util.d.mts +2 -0
  292. package/lib/Util.d.mts.map +1 -1
  293. package/lib/Util.d.ts +2 -0
  294. package/lib/Util.d.ts.map +1 -1
  295. package/lib/Util.js +7 -4
  296. package/lib/Util.js.map +1 -1
  297. package/lib/Util.mjs +7 -4
  298. package/lib/Util.mjs.map +1 -1
  299. package/lib/assistant-run-polling.d.mts +12 -0
  300. package/lib/assistant-run-polling.d.mts.map +1 -0
  301. package/lib/assistant-run-polling.d.ts +12 -0
  302. package/lib/assistant-run-polling.d.ts.map +1 -0
  303. package/lib/assistant-run-polling.js +17 -0
  304. package/lib/assistant-run-polling.js.map +1 -0
  305. package/lib/assistant-run-polling.mjs +14 -0
  306. package/lib/assistant-run-polling.mjs.map +1 -0
  307. package/lib/embeddings.d.mts +18 -0
  308. package/lib/embeddings.d.mts.map +1 -0
  309. package/lib/embeddings.d.ts +18 -0
  310. package/lib/embeddings.d.ts.map +1 -0
  311. package/lib/embeddings.js +50 -0
  312. package/lib/embeddings.js.map +1 -0
  313. package/lib/embeddings.mjs +47 -0
  314. package/lib/embeddings.mjs.map +1 -0
  315. package/lib/file-processing.d.mts +10 -0
  316. package/lib/file-processing.d.mts.map +1 -0
  317. package/lib/file-processing.d.ts +10 -0
  318. package/lib/file-processing.d.ts.map +1 -0
  319. package/lib/file-processing.js +30 -0
  320. package/lib/file-processing.js.map +1 -0
  321. package/lib/file-processing.mjs +27 -0
  322. package/lib/file-processing.mjs.map +1 -0
  323. package/lib/parser.d.mts.map +1 -1
  324. package/lib/parser.d.ts.map +1 -1
  325. package/lib/parser.js +16 -4
  326. package/lib/parser.js.map +1 -1
  327. package/lib/parser.mjs +16 -4
  328. package/lib/parser.mjs.map +1 -1
  329. package/lib/polling.d.mts +20 -0
  330. package/lib/polling.d.mts.map +1 -0
  331. package/lib/polling.d.ts +20 -0
  332. package/lib/polling.d.ts.map +1 -0
  333. package/lib/polling.js +130 -0
  334. package/lib/polling.js.map +1 -0
  335. package/lib/polling.mjs +127 -0
  336. package/lib/polling.mjs.map +1 -0
  337. package/lib/responses/ResponseStream.d.mts.map +1 -1
  338. package/lib/responses/ResponseStream.d.ts.map +1 -1
  339. package/lib/responses/ResponseStream.js +21 -11
  340. package/lib/responses/ResponseStream.js.map +1 -1
  341. package/lib/responses/ResponseStream.mjs +21 -11
  342. package/lib/responses/ResponseStream.mjs.map +1 -1
  343. package/lib/vector-store-polling.d.mts +22 -0
  344. package/lib/vector-store-polling.d.mts.map +1 -0
  345. package/lib/vector-store-polling.d.ts +22 -0
  346. package/lib/vector-store-polling.d.ts.map +1 -0
  347. package/lib/vector-store-polling.js +24 -0
  348. package/lib/vector-store-polling.js.map +1 -0
  349. package/lib/vector-store-polling.mjs +20 -0
  350. package/lib/vector-store-polling.mjs.map +1 -0
  351. package/lib/vector-store-upload.d.mts +17 -0
  352. package/lib/vector-store-upload.d.mts.map +1 -0
  353. package/lib/vector-store-upload.d.ts +17 -0
  354. package/lib/vector-store-upload.d.ts.map +1 -0
  355. package/lib/vector-store-upload.js +37 -0
  356. package/lib/vector-store-upload.js.map +1 -0
  357. package/lib/vector-store-upload.mjs +34 -0
  358. package/lib/vector-store-upload.mjs.map +1 -0
  359. package/lib/webhook-signature.d.mts +15 -0
  360. package/lib/webhook-signature.d.mts.map +1 -0
  361. package/lib/webhook-signature.d.ts +15 -0
  362. package/lib/webhook-signature.d.ts.map +1 -0
  363. package/lib/webhook-signature.js +125 -0
  364. package/lib/webhook-signature.js.map +1 -0
  365. package/lib/webhook-signature.mjs +121 -0
  366. package/lib/webhook-signature.mjs.map +1 -0
  367. package/package.json +14 -1
  368. package/realtime/internal-base.d.mts +2 -0
  369. package/realtime/internal-base.d.mts.map +1 -1
  370. package/realtime/internal-base.d.ts +2 -0
  371. package/realtime/internal-base.d.ts.map +1 -1
  372. package/realtime/internal-base.js +15 -0
  373. package/realtime/internal-base.js.map +1 -1
  374. package/realtime/internal-base.mjs +14 -0
  375. package/realtime/internal-base.mjs.map +1 -1
  376. package/realtime/websocket.d.mts +3 -2
  377. package/realtime/websocket.d.mts.map +1 -1
  378. package/realtime/websocket.d.ts +3 -2
  379. package/realtime/websocket.d.ts.map +1 -1
  380. package/realtime/websocket.js +90 -26
  381. package/realtime/websocket.js.map +1 -1
  382. package/realtime/websocket.mjs +91 -27
  383. package/realtime/websocket.mjs.map +1 -1
  384. package/realtime/ws.d.mts.map +1 -1
  385. package/realtime/ws.d.ts.map +1 -1
  386. package/realtime/ws.js +9 -1
  387. package/realtime/ws.js.map +1 -1
  388. package/realtime/ws.mjs +10 -2
  389. package/realtime/ws.mjs.map +1 -1
  390. package/resources/admin/organization/index.d.mts +2 -2
  391. package/resources/admin/organization/index.d.mts.map +1 -1
  392. package/resources/admin/organization/index.d.ts +2 -2
  393. package/resources/admin/organization/index.d.ts.map +1 -1
  394. package/resources/admin/organization/index.js.map +1 -1
  395. package/resources/admin/organization/index.mjs.map +1 -1
  396. package/resources/admin/organization/organization.d.mts +4 -4
  397. package/resources/admin/organization/organization.d.mts.map +1 -1
  398. package/resources/admin/organization/organization.d.ts +4 -4
  399. package/resources/admin/organization/organization.d.ts.map +1 -1
  400. package/resources/admin/organization/organization.js.map +1 -1
  401. package/resources/admin/organization/organization.mjs.map +1 -1
  402. package/resources/admin/organization/projects/index.d.mts +1 -1
  403. package/resources/admin/organization/projects/index.d.mts.map +1 -1
  404. package/resources/admin/organization/projects/index.d.ts +1 -1
  405. package/resources/admin/organization/projects/index.d.ts.map +1 -1
  406. package/resources/admin/organization/projects/index.js.map +1 -1
  407. package/resources/admin/organization/projects/index.mjs.map +1 -1
  408. package/resources/admin/organization/projects/projects.d.mts +22 -5
  409. package/resources/admin/organization/projects/projects.d.mts.map +1 -1
  410. package/resources/admin/organization/projects/projects.d.ts +22 -5
  411. package/resources/admin/organization/projects/projects.d.ts.map +1 -1
  412. package/resources/admin/organization/projects/projects.js.map +1 -1
  413. package/resources/admin/organization/projects/projects.mjs.map +1 -1
  414. package/resources/admin/organization/usage.d.mts +62 -1
  415. package/resources/admin/organization/usage.d.mts.map +1 -1
  416. package/resources/admin/organization/usage.d.ts +62 -1
  417. package/resources/admin/organization/usage.d.ts.map +1 -1
  418. package/resources/admin/organization/usage.js.map +1 -1
  419. package/resources/admin/organization/usage.mjs.map +1 -1
  420. package/resources/beta/responses/internal-base.d.mts.map +1 -1
  421. package/resources/beta/responses/internal-base.d.ts.map +1 -1
  422. package/resources/beta/responses/internal-base.js +2 -0
  423. package/resources/beta/responses/internal-base.js.map +1 -1
  424. package/resources/beta/responses/internal-base.mjs +2 -0
  425. package/resources/beta/responses/internal-base.mjs.map +1 -1
  426. package/resources/beta/responses/responses.d.mts +17 -20
  427. package/resources/beta/responses/responses.d.mts.map +1 -1
  428. package/resources/beta/responses/responses.d.ts +17 -20
  429. package/resources/beta/responses/responses.d.ts.map +1 -1
  430. package/resources/beta/responses/responses.js.map +1 -1
  431. package/resources/beta/responses/responses.mjs.map +1 -1
  432. package/resources/beta/threads/runs/index.d.mts +1 -1
  433. package/resources/beta/threads/runs/index.d.mts.map +1 -1
  434. package/resources/beta/threads/runs/index.d.ts +1 -1
  435. package/resources/beta/threads/runs/index.d.ts.map +1 -1
  436. package/resources/beta/threads/runs/runs.d.mts.map +1 -1
  437. package/resources/beta/threads/runs/runs.d.ts.map +1 -1
  438. package/resources/beta/threads/runs/runs.js +2 -43
  439. package/resources/beta/threads/runs/runs.js.map +1 -1
  440. package/resources/beta/threads/runs/runs.mjs +2 -43
  441. package/resources/beta/threads/runs/runs.mjs.map +1 -1
  442. package/resources/chat/completions/completions.d.mts +6 -0
  443. package/resources/chat/completions/completions.d.mts.map +1 -1
  444. package/resources/chat/completions/completions.d.ts +6 -0
  445. package/resources/chat/completions/completions.d.ts.map +1 -1
  446. package/resources/chat/completions/completions.js.map +1 -1
  447. package/resources/chat/completions/completions.mjs.map +1 -1
  448. package/resources/embeddings.d.mts.map +1 -1
  449. package/resources/embeddings.d.ts.map +1 -1
  450. package/resources/embeddings.js +2 -36
  451. package/resources/embeddings.js.map +1 -1
  452. package/resources/embeddings.mjs +2 -36
  453. package/resources/embeddings.mjs.map +1 -1
  454. package/resources/files.d.mts.map +1 -1
  455. package/resources/files.d.ts.map +1 -1
  456. package/resources/files.js +2 -15
  457. package/resources/files.js.map +1 -1
  458. package/resources/files.mjs +2 -15
  459. package/resources/files.mjs.map +1 -1
  460. package/resources/images.d.mts +12 -22
  461. package/resources/images.d.mts.map +1 -1
  462. package/resources/images.d.ts +12 -22
  463. package/resources/images.d.ts.map +1 -1
  464. package/resources/realtime/calls.d.mts +23 -1
  465. package/resources/realtime/calls.d.mts.map +1 -1
  466. package/resources/realtime/calls.d.ts +23 -1
  467. package/resources/realtime/calls.d.ts.map +1 -1
  468. package/resources/realtime/calls.js +24 -0
  469. package/resources/realtime/calls.js.map +1 -1
  470. package/resources/realtime/calls.mjs +24 -0
  471. package/resources/realtime/calls.mjs.map +1 -1
  472. package/resources/realtime/index.d.mts +1 -1
  473. package/resources/realtime/index.d.mts.map +1 -1
  474. package/resources/realtime/index.d.ts +1 -1
  475. package/resources/realtime/index.d.ts.map +1 -1
  476. package/resources/realtime/index.js.map +1 -1
  477. package/resources/realtime/index.mjs +1 -1
  478. package/resources/realtime/index.mjs.map +1 -1
  479. package/resources/realtime/realtime.d.mts +5 -4
  480. package/resources/realtime/realtime.d.mts.map +1 -1
  481. package/resources/realtime/realtime.d.ts +5 -4
  482. package/resources/realtime/realtime.d.ts.map +1 -1
  483. package/resources/realtime/realtime.js.map +1 -1
  484. package/resources/realtime/realtime.mjs.map +1 -1
  485. package/resources/responses/internal-base.d.mts.map +1 -1
  486. package/resources/responses/internal-base.d.ts.map +1 -1
  487. package/resources/responses/internal-base.js +2 -0
  488. package/resources/responses/internal-base.js.map +1 -1
  489. package/resources/responses/internal-base.mjs +2 -0
  490. package/resources/responses/internal-base.mjs.map +1 -1
  491. package/resources/responses/responses.d.mts +17 -20
  492. package/resources/responses/responses.d.mts.map +1 -1
  493. package/resources/responses/responses.d.ts +17 -20
  494. package/resources/responses/responses.d.ts.map +1 -1
  495. package/resources/responses/responses.js.map +1 -1
  496. package/resources/responses/responses.mjs.map +1 -1
  497. package/resources/vector-stores/file-batches.d.mts.map +1 -1
  498. package/resources/vector-stores/file-batches.d.ts.map +1 -1
  499. package/resources/vector-stores/file-batches.js +4 -61
  500. package/resources/vector-stores/file-batches.js.map +1 -1
  501. package/resources/vector-stores/file-batches.mjs +4 -61
  502. package/resources/vector-stores/file-batches.mjs.map +1 -1
  503. package/resources/vector-stores/files.d.mts +1 -1
  504. package/resources/vector-stores/files.d.mts.map +1 -1
  505. package/resources/vector-stores/files.d.ts +1 -1
  506. package/resources/vector-stores/files.d.ts.map +1 -1
  507. package/resources/vector-stores/files.js +2 -35
  508. package/resources/vector-stores/files.js.map +1 -1
  509. package/resources/vector-stores/files.mjs +2 -35
  510. package/resources/vector-stores/files.mjs.map +1 -1
  511. package/resources/webhooks/webhooks.d.mts.map +1 -1
  512. package/resources/webhooks/webhooks.d.ts.map +1 -1
  513. package/resources/webhooks/webhooks.js +5 -43
  514. package/resources/webhooks/webhooks.js.map +1 -1
  515. package/resources/webhooks/webhooks.mjs +5 -43
  516. package/resources/webhooks/webhooks.mjs.map +1 -1
  517. package/src/auth/index.ts +6 -1
  518. package/src/auth/subject-token-providers.ts +196 -4
  519. package/src/auth/types.ts +24 -0
  520. package/src/auth/workload-identity-auth.ts +104 -7
  521. package/src/auth/x509-transport.ts +49 -0
  522. package/src/azure.ts +22 -1
  523. package/src/bedrock.ts +49 -5
  524. package/src/beta/realtime/internal-base.ts +15 -0
  525. package/src/beta/realtime/websocket.ts +148 -40
  526. package/src/beta/realtime/ws.ts +31 -13
  527. package/src/client.ts +536 -92
  528. package/src/core/EventEmitter.ts +91 -7
  529. package/src/core/streaming.ts +226 -30
  530. package/src/helpers/audio.ts +93 -22
  531. package/src/helpers/standard-schema.ts +50 -16
  532. package/src/helpers/zod-v3-strict-schema.ts +514 -0
  533. package/src/helpers/zod.ts +17 -4
  534. package/src/index.ts +1 -1
  535. package/src/internal/assistant-stream-delta.ts +33 -10
  536. package/src/internal/auth/x509-token-exchange.ts +310 -0
  537. package/src/internal/auth/x509-transport-capability.ts +219 -0
  538. package/src/internal/auth/x509-transport-registry.ts +118 -0
  539. package/src/internal/auth/x509-transport-state-browser.ts +36 -0
  540. package/src/internal/auth/x509-transport-state.cts +36 -0
  541. package/src/internal/auth/x509-workload-identity-auth.ts +958 -0
  542. package/src/internal/bedrock.ts +182 -5
  543. package/src/internal/data-residency.ts +44 -0
  544. package/src/internal/multipart-encoding.ts +53 -0
  545. package/src/internal/qs/utils.ts +375 -13
  546. package/src/internal/request-options.ts +52 -1
  547. package/src/internal/responses/canonical-output-text.ts +3 -3
  548. package/src/internal/responses/response-accumulator.ts +411 -24
  549. package/src/internal/uploads.ts +81 -26
  550. package/src/internal/utils/env.ts +9 -5
  551. package/src/internal/ws.ts +24 -3
  552. package/src/lib/AbstractChatCompletionRunner.ts +33 -6
  553. package/src/lib/AssistantStream.ts +262 -22
  554. package/src/lib/ChatCompletionStream.ts +1467 -103
  555. package/src/lib/EventEmitter.ts +91 -7
  556. package/src/lib/EventStream.ts +1483 -10
  557. package/src/lib/ResponsesParser.ts +4 -1
  558. package/src/lib/Util.ts +7 -5
  559. package/src/lib/assistant-run-polling.ts +27 -0
  560. package/src/lib/embeddings.ts +65 -0
  561. package/src/lib/file-processing.ts +36 -0
  562. package/src/lib/parser.ts +19 -4
  563. package/src/lib/polling.ts +144 -0
  564. package/src/lib/responses/ResponseStream.ts +22 -10
  565. package/src/lib/vector-store-polling.ts +46 -0
  566. package/src/lib/vector-store-upload.ts +53 -0
  567. package/src/lib/webhook-signature.ts +164 -0
  568. package/src/realtime/internal-base.ts +15 -0
  569. package/src/realtime/websocket.ts +130 -27
  570. package/src/realtime/ws.ts +15 -2
  571. package/src/resources/admin/organization/index.ts +2 -0
  572. package/src/resources/admin/organization/organization.ts +4 -0
  573. package/src/resources/admin/organization/projects/index.ts +1 -0
  574. package/src/resources/admin/organization/projects/projects.ts +37 -4
  575. package/src/resources/admin/organization/usage.ts +83 -0
  576. package/src/resources/beta/responses/internal-base.ts +2 -0
  577. package/src/resources/beta/responses/responses.ts +19 -22
  578. package/src/resources/beta/threads/runs/index.ts +1 -1
  579. package/src/resources/beta/threads/runs/runs.ts +2 -45
  580. package/src/resources/chat/completions/completions.ts +7 -0
  581. package/src/resources/embeddings.ts +2 -42
  582. package/src/resources/files.ts +2 -19
  583. package/src/resources/images.ts +12 -22
  584. package/src/resources/realtime/api.md +1 -0
  585. package/src/resources/realtime/calls.ts +46 -0
  586. package/src/resources/realtime/index.ts +7 -1
  587. package/src/resources/realtime/realtime.ts +5 -3
  588. package/src/resources/responses/internal-base.ts +2 -0
  589. package/src/resources/responses/responses.ts +19 -22
  590. package/src/resources/vector-stores/file-batches.ts +8 -77
  591. package/src/resources/vector-stores/files.ts +3 -43
  592. package/src/resources/webhooks/webhooks.ts +5 -61
  593. package/src/version.ts +1 -1
  594. package/version.d.mts +1 -1
  595. package/version.d.ts +1 -1
  596. package/version.js +1 -1
  597. package/version.mjs +1 -1
@@ -4,6 +4,8 @@ type EventListener<Events, EventType extends keyof Events> = Events[EventType];
4
4
  type EventListeners<Events, EventType extends keyof Events> = {
5
5
  listener: EventListener<Events, EventType>;
6
6
  once?: boolean;
7
+ removed?: boolean;
8
+ detached?: boolean;
7
9
  }[];
8
10
 
9
11
  /** Extracts the ordered listener-argument tuple for one named event. */
@@ -17,6 +19,12 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
17
19
  #listeners: {
18
20
  [Event in keyof EventTypes]?: EventListeners<EventTypes, Event>;
19
21
  } = Object.create(null);
22
+ #emittedListenerRegistrations = new WeakMap<
23
+ object,
24
+ { event: PropertyKey; registration: { removed?: boolean; detached?: boolean } }
25
+ >();
26
+ #pendingListenerCleanup = new Set<PropertyKey>();
27
+ #listenerDispatchDepth = 0;
20
28
 
21
29
  /**
22
30
  * Adds the listener function to the end of the listeners array for the event.
@@ -43,7 +51,22 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
43
51
  if (!listeners) {
44
52
  return this;
45
53
  }
46
- const index = listeners.findIndex((l) => l.listener === listener);
54
+
55
+ const emittedRegistration = this.#emittedListenerRegistrations.get(listener as object);
56
+ if (
57
+ emittedRegistration?.event === event &&
58
+ !emittedRegistration.registration.removed &&
59
+ !emittedRegistration.registration.detached
60
+ ) {
61
+ this.#removeEmittedListener(
62
+ event,
63
+ emittedRegistration.registration as EventListeners<EventTypes, Event>[number],
64
+ );
65
+ return this;
66
+ }
67
+ const index = listeners.findIndex(
68
+ (registration) => !registration.removed && registration.listener === listener,
69
+ );
47
70
  if (index !== -1) {
48
71
  listeners.splice(index, 1);
49
72
  }
@@ -61,6 +84,52 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
61
84
  return this;
62
85
  }
63
86
 
87
+ #onceForEmitted<Event extends keyof EventTypes>(
88
+ event: Event,
89
+ listener: EventListener<EventTypes, Event>,
90
+ ): void {
91
+ const previousListeners = this.#listeners[event];
92
+ const previousLength = previousListeners?.length ?? 0;
93
+ this.once(event, listener);
94
+ const listeners = this.#listeners[event];
95
+ const [registration] = listeners?.slice(-1) ?? [];
96
+ if (
97
+ (previousListeners === undefined || listeners === previousListeners) &&
98
+ listeners?.length === previousLength + 1 &&
99
+ registration?.listener === listener &&
100
+ registration.once
101
+ ) {
102
+ this.#emittedListenerRegistrations.set(listener as object, { event, registration });
103
+ }
104
+ }
105
+
106
+ #removeEmittedListener<Event extends keyof EventTypes>(
107
+ event: Event,
108
+ registration: EventListeners<EventTypes, Event>[number],
109
+ ): void {
110
+ if (registration.removed) {
111
+ return;
112
+ }
113
+
114
+ registration.removed = true;
115
+ this.#emittedListenerRegistrations.delete(registration.listener as object);
116
+ this.#pendingListenerCleanup.add(event);
117
+ if (this.#listenerDispatchDepth === 0) {
118
+ this.#cleanupEmittedListeners();
119
+ }
120
+ }
121
+
122
+ #cleanupEmittedListeners(): void {
123
+ for (const event of this.#pendingListenerCleanup) {
124
+ const eventType = event as keyof EventTypes;
125
+ const listeners = this.#listeners[eventType];
126
+ if (listeners) {
127
+ this.#listeners[eventType] = listeners.filter((listener) => !listener.removed) as any;
128
+ }
129
+ }
130
+ this.#pendingListenerCleanup.clear();
131
+ }
132
+
64
133
  /**
65
134
  * This is similar to `.once()`, but returns a Promise that resolves the next time
66
135
  * the event is triggered, instead of calling a listener callback.
@@ -98,9 +167,9 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
98
167
  };
99
168
 
100
169
  if (event !== 'error') {
101
- this.once('error', listeners.onError as any);
170
+ this.#onceForEmitted('error', listeners.onError as any);
102
171
  }
103
- this.once(event, listeners.onEvent as any);
172
+ this.#onceForEmitted(event, listeners.onEvent as any);
104
173
  });
105
174
  }
106
175
 
@@ -111,16 +180,31 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
111
180
  ) {
112
181
  const listeners: EventListeners<EventTypes, Event> | undefined = this.#listeners[event];
113
182
  if (listeners) {
114
- this.#listeners[event] = listeners.filter((l) => !l.once) as any;
115
- for (const { listener } of listeners as any) {
116
- listener(...(args as any));
183
+ this.#listeners[event] = listeners.filter((listener) => {
184
+ if (listener.once) {
185
+ listener.detached = true;
186
+ }
187
+ return !listener.once && !listener.removed;
188
+ }) as any;
189
+ this.#listenerDispatchDepth += 1;
190
+ try {
191
+ for (const registration of listeners as any) {
192
+ if (!registration.removed) {
193
+ registration.listener(...(args as any));
194
+ }
195
+ }
196
+ } finally {
197
+ this.#listenerDispatchDepth -= 1;
198
+ if (this.#listenerDispatchDepth === 0) {
199
+ this.#cleanupEmittedListeners();
200
+ }
117
201
  }
118
202
  }
119
203
  }
120
204
 
121
205
  protected _hasListener(event: keyof EventTypes): boolean {
122
206
  const listeners = this.#listeners[event];
123
- return listeners && listeners.length > 0;
207
+ return listeners && listeners.some((listener) => !listener.removed);
124
208
  }
125
209
  }
126
210
 
@@ -9,6 +9,45 @@ import type { OpenAI } from '../client';
9
9
 
10
10
  type Bytes = string | ArrayBuffer | Uint8Array | null | undefined;
11
11
 
12
+ type StreamTeeQueue<Item> = {
13
+ readonly length: number;
14
+ enqueue: (value: Promise<IteratorResult<Item>>) => void;
15
+ dequeue: () => Promise<IteratorResult<Item>> | undefined;
16
+ };
17
+
18
+ function createStreamTeeQueue<Item>(): StreamTeeQueue<Item> {
19
+ let entries: (Promise<IteratorResult<Item>> | undefined)[] = [];
20
+ let head = 0;
21
+
22
+ return {
23
+ get length() {
24
+ return entries.length - head;
25
+ },
26
+ enqueue(value) {
27
+ entries.push(value);
28
+ },
29
+ dequeue() {
30
+ if (head === entries.length) {
31
+ return undefined;
32
+ }
33
+
34
+ const value = entries[head];
35
+ entries[head] = undefined;
36
+ head += 1;
37
+
38
+ if (head === entries.length) {
39
+ entries = [];
40
+ head = 0;
41
+ } else if (head >= 1024 && head * 2 >= entries.length) {
42
+ entries = entries.slice(head);
43
+ head = 0;
44
+ }
45
+
46
+ return value;
47
+ },
48
+ };
49
+ }
50
+
12
51
  /** A decoded server-sent event before its JSON payload has been parsed. */
13
52
  export type ServerSentEvent = {
14
53
  /** Explicit SSE event name, or `null` when the event has no `event:` field. */
@@ -64,7 +103,7 @@ export class Stream<Item> implements AsyncIterable<Item> {
64
103
  let receivedCompletionSentinel = false;
65
104
  try {
66
105
  for await (const sse of _iterSSEMessages(response, controller)) {
67
- if (sse.data.startsWith('[DONE]')) {
106
+ if (sse.data === '[DONE]') {
68
107
  receivedCompletionSentinel = true;
69
108
  break;
70
109
  }
@@ -74,10 +113,14 @@ export class Stream<Item> implements AsyncIterable<Item> {
74
113
 
75
114
  try {
76
115
  data = JSON.parse(sse.data) as any;
77
- } catch (e) {
78
- logger.error(`Could not parse message into JSON:`, sse.data);
79
- logger.error(`From chunk:`, sse.raw);
80
- throw e;
116
+ } catch {
117
+ logger.error(`Could not parse message into JSON:`);
118
+ logger.error(`From chunk:`);
119
+ throw new SyntaxError('Error reading response: malformed server-sent event JSON.');
120
+ }
121
+
122
+ if (sse.event === 'error') {
123
+ throw new APIError(undefined, data?.error ?? data, undefined, response.headers);
81
124
  }
82
125
 
83
126
  if (data && data.error) {
@@ -89,14 +132,10 @@ export class Stream<Item> implements AsyncIterable<Item> {
89
132
  let data;
90
133
  try {
91
134
  data = JSON.parse(sse.data);
92
- } catch (e) {
93
- console.error(`Could not parse message into JSON:`, sse.data);
94
- console.error(`From chunk:`, sse.raw);
95
- throw e;
96
- }
97
- // SSE error events surface as APIError instances.
98
- if (sse.event === 'error') {
99
- throw new APIError(undefined, data.error, data.message, undefined);
135
+ } catch {
136
+ logger.error(`Could not parse message into JSON:`);
137
+ logger.error(`From chunk:`);
138
+ throw new SyntaxError('Error reading response: malformed server-sent event JSON.');
100
139
  }
101
140
  yield { event: sse.event, data } as any;
102
141
  }
@@ -199,7 +238,18 @@ export class Stream<Item> implements AsyncIterable<Item> {
199
238
  continue;
200
239
  }
201
240
  if (line) {
202
- yield JSON.parse(line) as Item;
241
+ let data: Item;
242
+ try {
243
+ data = JSON.parse(line) as Item;
244
+ } catch (error) {
245
+ if (error instanceof SyntaxError) {
246
+ throw new SyntaxError('Error reading response: malformed newline-delimited JSON.');
247
+ }
248
+
249
+ throw error;
250
+ }
251
+
252
+ yield data;
203
253
  }
204
254
  }
205
255
  done = true;
@@ -230,18 +280,18 @@ export class Stream<Item> implements AsyncIterable<Item> {
230
280
  * independently read from at different speeds.
231
281
  */
232
282
  tee(): [Stream<Item>, Stream<Item>] {
233
- const left: Promise<IteratorResult<Item>>[] = [];
234
- const right: Promise<IteratorResult<Item>>[] = [];
283
+ const left = createStreamTeeQueue<Item>();
284
+ const right = createStreamTeeQueue<Item>();
235
285
  const iterator = this.iterator();
236
286
 
237
- const teeIterator = (queue: Promise<IteratorResult<Item>>[]): AsyncIterator<Item> => ({
287
+ const teeIterator = (queue: StreamTeeQueue<Item>): AsyncIterator<Item> => ({
238
288
  next: () => {
239
289
  if (queue.length === 0) {
240
290
  const result = iterator.next();
241
- left.push(result);
242
- right.push(result);
291
+ left.enqueue(result);
292
+ right.enqueue(result);
243
293
  }
244
- return queue.shift()!;
294
+ return queue.dequeue()!;
245
295
  },
246
296
  });
247
297
 
@@ -284,8 +334,131 @@ export class Stream<Item> implements AsyncIterable<Item> {
284
334
  }
285
335
  }
286
336
 
337
+ function createAbortableSSESource(body: NonNullable<Response['body']>, signal: AbortSignal) {
338
+ const reader = typeof body.getReader === 'function' ? body.getReader() : undefined;
339
+ const source = reader
340
+ ? {
341
+ next: () => reader.read(),
342
+ return: () => reader.cancel(),
343
+ }
344
+ : ReadableStreamToAsyncIterable<Bytes>(body)[Symbol.asyncIterator]();
345
+ const ended: IteratorResult<Bytes> = { value: undefined, done: true };
346
+ let closed = false;
347
+ let canceled = false;
348
+ let cancellation: Promise<unknown> | undefined;
349
+ let interrupt: (() => void) | undefined;
350
+
351
+ const waitForAbort = () =>
352
+ // oxlint-disable-next-line promise/avoid-new -- AbortSignal callbacks need a portable Promise bridge.
353
+ new Promise<void>((resolve) => {
354
+ interrupt = resolve;
355
+ });
356
+
357
+ const cancel = () => {
358
+ if (canceled || closed) {
359
+ return cancellation;
360
+ }
361
+ canceled = true;
362
+ try {
363
+ cancellation = Promise.resolve(source.return?.());
364
+ } catch (error) {
365
+ cancellation = Promise.reject(error);
366
+ }
367
+ cancellation.catch(() => undefined);
368
+ return cancellation;
369
+ };
370
+ const abort = () => {
371
+ queueMicrotask(() => {
372
+ interrupt?.();
373
+ cancel();
374
+ });
375
+ };
376
+ const iterator: AsyncIterableIterator<Bytes> = {
377
+ async next() {
378
+ if (signal.aborted) {
379
+ return ended;
380
+ }
381
+ const aborted = waitForAbort().then(() => ended);
382
+ try {
383
+ const result = await Promise.race([source.next(), aborted]);
384
+ if (signal.aborted) {
385
+ return ended;
386
+ }
387
+ if (result.done) {
388
+ closed = true;
389
+ return ended;
390
+ }
391
+ return { value: result.value, done: false };
392
+ } catch (error) {
393
+ if (signal.aborted && (isAbortError(error) || error === signal.reason)) {
394
+ return ended;
395
+ }
396
+ throw error;
397
+ } finally {
398
+ interrupt = undefined;
399
+ }
400
+ },
401
+ async return() {
402
+ const pending = cancel();
403
+ if (pending && !signal.aborted) {
404
+ const aborted = waitForAbort();
405
+ try {
406
+ if (!signal.aborted) {
407
+ await Promise.race([pending, aborted]);
408
+ }
409
+ } finally {
410
+ interrupt = undefined;
411
+ }
412
+ }
413
+ return ended;
414
+ },
415
+ [Symbol.asyncIterator]() {
416
+ return this;
417
+ },
418
+ };
419
+
420
+ return {
421
+ iterator,
422
+ start() {
423
+ signal.addEventListener('abort', abort, { once: true });
424
+ if (signal.aborted) {
425
+ abort();
426
+ }
427
+ },
428
+ async cleanup(failed: boolean) {
429
+ let cleanupError: unknown;
430
+ try {
431
+ signal.removeEventListener('abort', abort);
432
+ } catch (error) {
433
+ cleanupError = error;
434
+ }
435
+ if (!closed) {
436
+ const pending = cancel();
437
+ if (pending && !failed && !signal.aborted) {
438
+ try {
439
+ await pending;
440
+ } catch (error) {
441
+ cleanupError ??= error;
442
+ }
443
+ }
444
+ }
445
+ if (reader) {
446
+ try {
447
+ reader.releaseLock();
448
+ } catch (error) {
449
+ cleanupError ??= error;
450
+ }
451
+ }
452
+ if (cleanupError !== undefined && !failed && !signal.aborted) {
453
+ throw cleanupError;
454
+ }
455
+ },
456
+ };
457
+ }
458
+
287
459
  /**
288
460
  * Decodes complete SSE records from a response and aborts when its body is absent.
461
+ * Complete events are decoded on demand without imposing a line or event size limit.
289
462
  *
290
463
  * @yields {ServerSentEvent} Each decoded server-sent event in wire order.
291
464
  */
@@ -308,22 +481,45 @@ export async function* _iterSSEMessages(
308
481
 
309
482
  const sseDecoder = new SSEDecoder();
310
483
  const lineDecoder = new LineDecoder();
311
-
312
- const iter = ReadableStreamToAsyncIterable<Bytes>(response.body);
313
- for await (const sseChunk of iterSSEChunks(iter)) {
314
- for (const line of lineDecoder.decode(sseChunk)) {
484
+ const { signal } = controller;
485
+ const source = createAbortableSSESource(response.body, signal);
486
+ let failed = false;
487
+
488
+ try {
489
+ source.start();
490
+ for await (const sseChunk of iterSSEChunks(source.iterator)) {
491
+ if (signal.aborted) {
492
+ return;
493
+ }
494
+ for (const line of lineDecoder.decode(sseChunk)) {
495
+ if (signal.aborted) {
496
+ return;
497
+ }
498
+ const sse = sseDecoder.decode(line);
499
+ if (sse) {
500
+ yield sse;
501
+ }
502
+ }
503
+ }
504
+ if (signal.aborted) {
505
+ return;
506
+ }
507
+ for (const line of lineDecoder.flush()) {
508
+ if (signal.aborted) {
509
+ return;
510
+ }
315
511
  const sse = sseDecoder.decode(line);
316
512
  if (sse) {
317
513
  yield sse;
318
514
  }
319
515
  }
320
- }
321
-
322
- for (const line of lineDecoder.flush()) {
323
- const sse = sseDecoder.decode(line);
324
- if (sse) {
325
- yield sse;
516
+ } catch (error) {
517
+ failed = true;
518
+ if (!signal.aborted || (!isAbortError(error) && error !== signal.reason)) {
519
+ throw error;
326
520
  }
521
+ } finally {
522
+ await source.cleanup(failed);
327
523
  }
328
524
  }
329
525
 
@@ -100,7 +100,7 @@ export async function playAudio(input: NodeJS.ReadableStream | Response | File):
100
100
 
101
101
  /** Controls microphone selection and when an in-progress recording is finalized. */
102
102
  type RecordAudioOptions = {
103
- /** Stops recording when aborted and resolves with the audio captured so far. */
103
+ /** Stops recording when aborted; successful termination returns the captured audio. */
104
104
  signal?: AbortSignal;
105
105
 
106
106
  /** Zero-based audio-input device number passed to FFmpeg; defaults to `0`. */
@@ -110,6 +110,14 @@ type RecordAudioOptions = {
110
110
  timeout?: number;
111
111
  };
112
112
 
113
+ function removeRecordingAbortListener(signal: AbortSignal | undefined, listener: () => void): void {
114
+ try {
115
+ signal?.removeEventListener('abort', listener);
116
+ } catch {
117
+ // A cleanup callback must not replace the recording's terminal outcome.
118
+ }
119
+ }
120
+
113
121
  function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {}): Promise<File> {
114
122
  checkFileSupport();
115
123
  return new Promise((resolve, reject) => {
@@ -119,27 +127,48 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
119
127
  let internalSignal: AbortSignal | undefined;
120
128
  let wasStopped = false;
121
129
  let settled = false;
130
+ let callerAbortObserved = false;
131
+ let timeoutAbortObserved = false;
132
+ let rejectRecording: (error: unknown) => void = reject;
122
133
 
123
134
  const collectData = (chunk: Buffer) => {
124
- data.push(chunk);
135
+ if (!settled) {
136
+ data.push(chunk);
137
+ }
125
138
  };
126
139
  const stopRecording = () => {
127
140
  if (!settled && ffmpeg) {
128
- wasStopped ||= ffmpeg.kill('SIGTERM');
141
+ try {
142
+ wasStopped ||= ffmpeg.kill('SIGTERM');
143
+ } catch (error) {
144
+ rejectRecording(error);
145
+ }
129
146
  }
130
147
  };
148
+ const stopCallerRecording = () => {
149
+ callerAbortObserved = true;
150
+ stopRecording();
151
+ };
152
+ const stopTimeoutRecording = () => {
153
+ timeoutAbortObserved = true;
154
+ stopRecording();
155
+ };
131
156
  const cleanup = () => {
132
157
  if (settled) {
133
158
  return false;
134
159
  }
135
160
 
136
161
  settled = true;
137
- signal?.removeEventListener('abort', stopRecording);
138
- internalSignal?.removeEventListener('abort', stopRecording);
139
- ffmpeg?.stdout?.removeListener('data', collectData);
162
+ removeRecordingAbortListener(signal, stopCallerRecording);
163
+ removeRecordingAbortListener(internalSignal, stopTimeoutRecording);
164
+ try {
165
+ ffmpeg?.stdout?.removeListener('data', collectData);
166
+ } catch {
167
+ // Continue settling even when the output stream rejects cleanup.
168
+ }
140
169
  return true;
141
170
  };
142
- const rejectRecording = (error: unknown) => {
171
+ rejectRecording = (error: unknown) => {
143
172
  if (cleanup()) {
144
173
  reject(error);
145
174
  }
@@ -154,6 +183,35 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
154
183
  resolve(audioFile);
155
184
  };
156
185
 
186
+ const observeTimeout = () => {
187
+ internalSignal?.addEventListener('abort', stopTimeoutRecording, { once: true });
188
+ if (settled) {
189
+ removeRecordingAbortListener(internalSignal, stopTimeoutRecording);
190
+ return false;
191
+ }
192
+
193
+ if (internalSignal && !timeoutAbortObserved && internalSignal.aborted) {
194
+ stopTimeoutRecording();
195
+ }
196
+ return !settled;
197
+ };
198
+ const observeCaller = () => {
199
+ if (!signal) {
200
+ return;
201
+ }
202
+ if (signal.aborted) {
203
+ stopRecording();
204
+ return;
205
+ }
206
+
207
+ signal.addEventListener('abort', stopCallerRecording, { once: true });
208
+ if (settled) {
209
+ removeRecordingAbortListener(signal, stopCallerRecording);
210
+ } else if (!callerAbortObserved && signal.aborted) {
211
+ stopCallerRecording();
212
+ }
213
+ };
214
+
157
215
  try {
158
216
  if (typeof timeout === 'number' && (timeout > 0 || Number.isNaN(timeout))) {
159
217
  internalSignal = AbortSignal.timeout(timeout);
@@ -182,8 +240,16 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
182
240
  ffmpeg.stdout?.on('data', collectData);
183
241
 
184
242
  ffmpeg.on('error', (error) => {
185
- console.error(error);
186
- rejectRecording(error);
243
+ if (!cleanup()) {
244
+ return;
245
+ }
246
+
247
+ try {
248
+ console.error(error);
249
+ } catch {
250
+ // A custom logger must not hide the original process failure.
251
+ }
252
+ reject(error);
187
253
  });
188
254
 
189
255
  ffmpeg.on('close', (code) => {
@@ -194,18 +260,23 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
194
260
  returnData();
195
261
  });
196
262
 
197
- internalSignal?.addEventListener('abort', stopRecording, { once: true });
263
+ if (settled || !observeTimeout()) {
264
+ return;
265
+ }
266
+ observeCaller();
267
+ } catch (error) {
268
+ if (!cleanup()) {
269
+ return;
270
+ }
198
271
 
199
- if (signal) {
200
- if (signal.aborted) {
201
- stopRecording();
202
- } else {
203
- signal.addEventListener('abort', stopRecording, { once: true });
272
+ try {
273
+ if (!wasStopped) {
274
+ ffmpeg?.kill('SIGTERM');
204
275
  }
276
+ } catch {
277
+ // Preserve the original setup error when process termination also fails.
205
278
  }
206
- } catch (error) {
207
- stopRecording();
208
- rejectRecording(error);
279
+ reject(error);
209
280
  }
210
281
  });
211
282
  }
@@ -216,13 +287,13 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
216
287
  * This helper is supported only in Node.js-compatible runtimes and requires
217
288
  * the `ffmpeg` executable from FFmpeg to be available on `PATH`. Recording
218
289
  * continues until the FFmpeg process exits, the supplied signal is aborted, or
219
- * a positive timeout elapses. Aborting or timing out finalizes and returns the
220
- * audio captured so far instead of rejecting.
290
+ * a positive timeout elapses. Successful cancellation returns the audio captured
291
+ * so far; if sending `SIGTERM` throws, recording rejects with that error.
221
292
  *
222
293
  * @param options Audio-input device, optional abort signal, and recording timeout.
223
294
  * @returns The captured WAV file with MIME type `audio/wav`.
224
- * @throws {Error} If recording is unsupported, `ffmpeg` cannot start, or the
225
- * recording process exits unsuccessfully before an intentional stop.
295
+ * @throws {Error} If recording is unsupported, `ffmpeg` cannot start or exits
296
+ * unsuccessfully before an intentional stop, or sending it `SIGTERM` throws.
226
297
  */
227
298
  export async function recordAudio(options: RecordAudioOptions = {}): Promise<File> {
228
299
  if (isNode) {