openai 7.16.0 → 7.18.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 (689) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/_vendor/zod-to-json-schema/Options.d.mts.map +1 -1
  3. package/_vendor/zod-to-json-schema/Options.d.ts.map +1 -1
  4. package/_vendor/zod-to-json-schema/Options.js +2 -0
  5. package/_vendor/zod-to-json-schema/Options.js.map +1 -1
  6. package/_vendor/zod-to-json-schema/Options.mjs +2 -0
  7. package/_vendor/zod-to-json-schema/Options.mjs.map +1 -1
  8. package/_vendor/zod-to-json-schema/parseDef.d.mts.map +1 -1
  9. package/_vendor/zod-to-json-schema/parseDef.d.ts.map +1 -1
  10. package/_vendor/zod-to-json-schema/parseDef.js +1 -0
  11. package/_vendor/zod-to-json-schema/parseDef.js.map +1 -1
  12. package/_vendor/zod-to-json-schema/parseDef.mjs +1 -0
  13. package/_vendor/zod-to-json-schema/parseDef.mjs.map +1 -1
  14. package/_vendor/zod-to-json-schema/parsers/bigint.d.mts.map +1 -1
  15. package/_vendor/zod-to-json-schema/parsers/bigint.d.ts.map +1 -1
  16. package/_vendor/zod-to-json-schema/parsers/bigint.js +2 -0
  17. package/_vendor/zod-to-json-schema/parsers/bigint.js.map +1 -1
  18. package/_vendor/zod-to-json-schema/parsers/bigint.mjs +2 -0
  19. package/_vendor/zod-to-json-schema/parsers/bigint.mjs.map +1 -1
  20. package/_vendor/zod-to-json-schema/parsers/literal.d.mts.map +1 -1
  21. package/_vendor/zod-to-json-schema/parsers/literal.d.ts.map +1 -1
  22. package/_vendor/zod-to-json-schema/parsers/literal.js +1 -0
  23. package/_vendor/zod-to-json-schema/parsers/literal.js.map +1 -1
  24. package/_vendor/zod-to-json-schema/parsers/literal.mjs +1 -0
  25. package/_vendor/zod-to-json-schema/parsers/literal.mjs.map +1 -1
  26. package/_vendor/zod-to-json-schema/parsers/null.d.mts.map +1 -1
  27. package/_vendor/zod-to-json-schema/parsers/null.d.ts.map +1 -1
  28. package/_vendor/zod-to-json-schema/parsers/null.js +1 -0
  29. package/_vendor/zod-to-json-schema/parsers/null.js.map +1 -1
  30. package/_vendor/zod-to-json-schema/parsers/null.mjs +1 -0
  31. package/_vendor/zod-to-json-schema/parsers/null.mjs.map +1 -1
  32. package/_vendor/zod-to-json-schema/parsers/nullable.d.mts.map +1 -1
  33. package/_vendor/zod-to-json-schema/parsers/nullable.d.ts.map +1 -1
  34. package/_vendor/zod-to-json-schema/parsers/nullable.js +4 -0
  35. package/_vendor/zod-to-json-schema/parsers/nullable.js.map +1 -1
  36. package/_vendor/zod-to-json-schema/parsers/nullable.mjs +4 -0
  37. package/_vendor/zod-to-json-schema/parsers/nullable.mjs.map +1 -1
  38. package/_vendor/zod-to-json-schema/parsers/number.d.mts.map +1 -1
  39. package/_vendor/zod-to-json-schema/parsers/number.d.ts.map +1 -1
  40. package/_vendor/zod-to-json-schema/parsers/number.js +2 -0
  41. package/_vendor/zod-to-json-schema/parsers/number.js.map +1 -1
  42. package/_vendor/zod-to-json-schema/parsers/number.mjs +2 -0
  43. package/_vendor/zod-to-json-schema/parsers/number.mjs.map +1 -1
  44. package/_vendor/zod-to-json-schema/parsers/optional.d.mts.map +1 -1
  45. package/_vendor/zod-to-json-schema/parsers/optional.d.ts.map +1 -1
  46. package/_vendor/zod-to-json-schema/parsers/optional.js +6 -7
  47. package/_vendor/zod-to-json-schema/parsers/optional.js.map +1 -1
  48. package/_vendor/zod-to-json-schema/parsers/optional.mjs +6 -7
  49. package/_vendor/zod-to-json-schema/parsers/optional.mjs.map +1 -1
  50. package/_vendor/zod-to-json-schema/parsers/record.d.mts.map +1 -1
  51. package/_vendor/zod-to-json-schema/parsers/record.d.ts.map +1 -1
  52. package/_vendor/zod-to-json-schema/parsers/record.js +2 -0
  53. package/_vendor/zod-to-json-schema/parsers/record.js.map +1 -1
  54. package/_vendor/zod-to-json-schema/parsers/record.mjs +2 -0
  55. package/_vendor/zod-to-json-schema/parsers/record.mjs.map +1 -1
  56. package/_vendor/zod-to-json-schema/parsers/string.d.mts.map +1 -1
  57. package/_vendor/zod-to-json-schema/parsers/string.d.ts.map +1 -1
  58. package/_vendor/zod-to-json-schema/parsers/string.js +1 -0
  59. package/_vendor/zod-to-json-schema/parsers/string.js.map +1 -1
  60. package/_vendor/zod-to-json-schema/parsers/string.mjs +1 -0
  61. package/_vendor/zod-to-json-schema/parsers/string.mjs.map +1 -1
  62. package/_vendor/zod-to-json-schema/parsers/union.d.mts.map +1 -1
  63. package/_vendor/zod-to-json-schema/parsers/union.d.ts.map +1 -1
  64. package/_vendor/zod-to-json-schema/parsers/union.js +3 -0
  65. package/_vendor/zod-to-json-schema/parsers/union.js.map +1 -1
  66. package/_vendor/zod-to-json-schema/parsers/union.mjs +3 -0
  67. package/_vendor/zod-to-json-schema/parsers/union.mjs.map +1 -1
  68. package/_vendor/zod-to-json-schema/util.d.mts.map +1 -1
  69. package/_vendor/zod-to-json-schema/util.d.ts.map +1 -1
  70. package/_vendor/zod-to-json-schema/util.js +1 -0
  71. package/_vendor/zod-to-json-schema/util.js.map +1 -1
  72. package/_vendor/zod-to-json-schema/util.mjs +1 -0
  73. package/_vendor/zod-to-json-schema/util.mjs.map +1 -1
  74. package/_vendor/zod-to-json-schema/zodToJsonSchema.d.mts.map +1 -1
  75. package/_vendor/zod-to-json-schema/zodToJsonSchema.d.ts.map +1 -1
  76. package/_vendor/zod-to-json-schema/zodToJsonSchema.js +2 -0
  77. package/_vendor/zod-to-json-schema/zodToJsonSchema.js.map +1 -1
  78. package/_vendor/zod-to-json-schema/zodToJsonSchema.mjs +2 -0
  79. package/_vendor/zod-to-json-schema/zodToJsonSchema.mjs.map +1 -1
  80. package/auth/subject-token-providers.d.mts.map +1 -1
  81. package/auth/subject-token-providers.d.ts.map +1 -1
  82. package/auth/subject-token-providers.js +6 -1
  83. package/auth/subject-token-providers.js.map +1 -1
  84. package/auth/subject-token-providers.mjs +6 -1
  85. package/auth/subject-token-providers.mjs.map +1 -1
  86. package/auth/workload-identity-auth.d.mts.map +1 -1
  87. package/auth/workload-identity-auth.d.ts.map +1 -1
  88. package/auth/workload-identity-auth.js +9 -0
  89. package/auth/workload-identity-auth.js.map +1 -1
  90. package/auth/workload-identity-auth.mjs +9 -0
  91. package/auth/workload-identity-auth.mjs.map +1 -1
  92. package/auth/x509-transport.d.mts.map +1 -1
  93. package/auth/x509-transport.d.ts.map +1 -1
  94. package/auth/x509-transport.js +11 -0
  95. package/auth/x509-transport.js.map +1 -1
  96. package/auth/x509-transport.mjs +11 -0
  97. package/auth/x509-transport.mjs.map +1 -1
  98. package/azure.d.mts.map +1 -1
  99. package/azure.d.ts.map +1 -1
  100. package/azure.js +3 -0
  101. package/azure.js.map +1 -1
  102. package/azure.mjs +3 -0
  103. package/azure.mjs.map +1 -1
  104. package/bedrock.d.mts.map +1 -1
  105. package/bedrock.d.ts.map +1 -1
  106. package/bedrock.js +5 -0
  107. package/bedrock.js.map +1 -1
  108. package/bedrock.mjs +5 -0
  109. package/bedrock.mjs.map +1 -1
  110. package/beta/realtime/internal-base.d.mts.map +1 -1
  111. package/beta/realtime/internal-base.d.ts.map +1 -1
  112. package/beta/realtime/internal-base.js +1 -0
  113. package/beta/realtime/internal-base.js.map +1 -1
  114. package/beta/realtime/internal-base.mjs +1 -0
  115. package/beta/realtime/internal-base.mjs.map +1 -1
  116. package/beta/realtime/websocket.d.mts.map +1 -1
  117. package/beta/realtime/websocket.d.ts.map +1 -1
  118. package/beta/realtime/websocket.js +9 -1
  119. package/beta/realtime/websocket.js.map +1 -1
  120. package/beta/realtime/websocket.mjs +9 -1
  121. package/beta/realtime/websocket.mjs.map +1 -1
  122. package/beta/realtime/ws.d.mts.map +1 -1
  123. package/beta/realtime/ws.d.ts.map +1 -1
  124. package/beta/realtime/ws.js +3 -0
  125. package/beta/realtime/ws.js.map +1 -1
  126. package/beta/realtime/ws.mjs +3 -0
  127. package/beta/realtime/ws.mjs.map +1 -1
  128. package/client.d.mts +3 -0
  129. package/client.d.mts.map +1 -1
  130. package/client.d.ts +3 -0
  131. package/client.d.ts.map +1 -1
  132. package/client.js +39 -6
  133. package/client.js.map +1 -1
  134. package/client.mjs +39 -6
  135. package/client.mjs.map +1 -1
  136. package/core/EventEmitter.d.mts.map +1 -1
  137. package/core/EventEmitter.d.ts.map +1 -1
  138. package/core/EventEmitter.js +15 -0
  139. package/core/EventEmitter.js.map +1 -1
  140. package/core/EventEmitter.mjs +15 -0
  141. package/core/EventEmitter.mjs.map +1 -1
  142. package/core/streaming.d.mts +1 -0
  143. package/core/streaming.d.mts.map +1 -1
  144. package/core/streaming.d.ts +1 -0
  145. package/core/streaming.d.ts.map +1 -1
  146. package/core/streaming.js +28 -1
  147. package/core/streaming.js.map +1 -1
  148. package/core/streaming.mjs +28 -1
  149. package/core/streaming.mjs.map +1 -1
  150. package/helpers/audio.d.mts.map +1 -1
  151. package/helpers/audio.d.ts.map +1 -1
  152. package/helpers/audio.js +2 -0
  153. package/helpers/audio.js.map +1 -1
  154. package/helpers/audio.mjs +2 -0
  155. package/helpers/audio.mjs.map +1 -1
  156. package/helpers/standard-schema.d.mts.map +1 -1
  157. package/helpers/standard-schema.d.ts.map +1 -1
  158. package/helpers/standard-schema.js +28 -18
  159. package/helpers/standard-schema.js.map +1 -1
  160. package/helpers/standard-schema.mjs +28 -18
  161. package/helpers/standard-schema.mjs.map +1 -1
  162. package/helpers/zod-v3-strict-schema.d.mts.map +1 -1
  163. package/helpers/zod-v3-strict-schema.d.ts.map +1 -1
  164. package/helpers/zod-v3-strict-schema.js +5 -0
  165. package/helpers/zod-v3-strict-schema.js.map +1 -1
  166. package/helpers/zod-v3-strict-schema.mjs +5 -0
  167. package/helpers/zod-v3-strict-schema.mjs.map +1 -1
  168. package/helpers/zod.d.mts.map +1 -1
  169. package/helpers/zod.d.ts.map +1 -1
  170. package/helpers/zod.js +16 -1
  171. package/helpers/zod.js.map +1 -1
  172. package/helpers/zod.mjs +17 -2
  173. package/helpers/zod.mjs.map +1 -1
  174. package/internal/assistant-stream-delta.d.mts.map +1 -1
  175. package/internal/assistant-stream-delta.d.ts.map +1 -1
  176. package/internal/assistant-stream-delta.js +8 -1
  177. package/internal/assistant-stream-delta.js.map +1 -1
  178. package/internal/assistant-stream-delta.mjs +8 -1
  179. package/internal/assistant-stream-delta.mjs.map +1 -1
  180. package/internal/auth/x509-credential-options.d.mts.map +1 -1
  181. package/internal/auth/x509-credential-options.d.ts.map +1 -1
  182. package/internal/auth/x509-credential-options.js +3 -0
  183. package/internal/auth/x509-credential-options.js.map +1 -1
  184. package/internal/auth/x509-credential-options.mjs +3 -0
  185. package/internal/auth/x509-credential-options.mjs.map +1 -1
  186. package/internal/auth/x509-token-exchange.d.mts.map +1 -1
  187. package/internal/auth/x509-token-exchange.d.ts.map +1 -1
  188. package/internal/auth/x509-token-exchange.js +2 -0
  189. package/internal/auth/x509-token-exchange.js.map +1 -1
  190. package/internal/auth/x509-token-exchange.mjs +2 -0
  191. package/internal/auth/x509-token-exchange.mjs.map +1 -1
  192. package/internal/auth/x509-transport-capability.d.mts.map +1 -1
  193. package/internal/auth/x509-transport-capability.d.ts.map +1 -1
  194. package/internal/auth/x509-transport-capability.js +1 -0
  195. package/internal/auth/x509-transport-capability.js.map +1 -1
  196. package/internal/auth/x509-transport-capability.mjs +1 -0
  197. package/internal/auth/x509-transport-capability.mjs.map +1 -1
  198. package/internal/auth/x509-transport-state.mjs +1 -0
  199. package/internal/auth/x509-workload-identity-auth.d.mts.map +1 -1
  200. package/internal/auth/x509-workload-identity-auth.d.ts.map +1 -1
  201. package/internal/auth/x509-workload-identity-auth.js +11 -0
  202. package/internal/auth/x509-workload-identity-auth.js.map +1 -1
  203. package/internal/auth/x509-workload-identity-auth.mjs +11 -0
  204. package/internal/auth/x509-workload-identity-auth.mjs.map +1 -1
  205. package/internal/bedrock.d.mts.map +1 -1
  206. package/internal/bedrock.d.ts.map +1 -1
  207. package/internal/bedrock.js +17 -1
  208. package/internal/bedrock.js.map +1 -1
  209. package/internal/bedrock.mjs +17 -1
  210. package/internal/bedrock.mjs.map +1 -1
  211. package/internal/decoders/line.d.mts.map +1 -1
  212. package/internal/decoders/line.d.ts.map +1 -1
  213. package/internal/decoders/line.js +1 -0
  214. package/internal/decoders/line.js.map +1 -1
  215. package/internal/decoders/line.mjs +1 -0
  216. package/internal/decoders/line.mjs.map +1 -1
  217. package/internal/parse.d.mts +1 -0
  218. package/internal/parse.d.mts.map +1 -1
  219. package/internal/parse.d.ts +1 -0
  220. package/internal/parse.d.ts.map +1 -1
  221. package/internal/parse.js.map +1 -1
  222. package/internal/parse.mjs.map +1 -1
  223. package/internal/provider.d.mts.map +1 -1
  224. package/internal/provider.d.ts.map +1 -1
  225. package/internal/provider.js +3 -0
  226. package/internal/provider.js.map +1 -1
  227. package/internal/provider.mjs +3 -0
  228. package/internal/provider.mjs.map +1 -1
  229. package/internal/qs/stringify.d.mts.map +1 -1
  230. package/internal/qs/stringify.d.ts.map +1 -1
  231. package/internal/qs/stringify.js +3 -0
  232. package/internal/qs/stringify.js.map +1 -1
  233. package/internal/qs/stringify.mjs +3 -0
  234. package/internal/qs/stringify.mjs.map +1 -1
  235. package/internal/qs/utils.d.mts.map +1 -1
  236. package/internal/qs/utils.d.ts.map +1 -1
  237. package/internal/qs/utils.js +15 -3
  238. package/internal/qs/utils.js.map +1 -1
  239. package/internal/qs/utils.mjs +15 -3
  240. package/internal/qs/utils.mjs.map +1 -1
  241. package/internal/responses/response-accumulator.d.mts.map +1 -1
  242. package/internal/responses/response-accumulator.d.ts.map +1 -1
  243. package/internal/responses/response-accumulator.js +20 -4
  244. package/internal/responses/response-accumulator.js.map +1 -1
  245. package/internal/responses/response-accumulator.mjs +20 -4
  246. package/internal/responses/response-accumulator.mjs.map +1 -1
  247. package/internal/to-file.js.map +1 -1
  248. package/internal/to-file.mjs.map +1 -1
  249. package/internal/uploads.d.mts.map +1 -1
  250. package/internal/uploads.d.ts.map +1 -1
  251. package/internal/uploads.js +10 -0
  252. package/internal/uploads.js.map +1 -1
  253. package/internal/uploads.mjs +10 -0
  254. package/internal/uploads.mjs.map +1 -1
  255. package/internal/utils/abort.d.mts.map +1 -1
  256. package/internal/utils/abort.d.ts.map +1 -1
  257. package/internal/utils/abort.js +9 -2
  258. package/internal/utils/abort.js.map +1 -1
  259. package/internal/utils/abort.mjs +9 -2
  260. package/internal/utils/abort.mjs.map +1 -1
  261. package/internal/utils/bytes.d.mts.map +1 -1
  262. package/internal/utils/bytes.d.ts.map +1 -1
  263. package/internal/utils/bytes.js +2 -0
  264. package/internal/utils/bytes.js.map +1 -1
  265. package/internal/utils/bytes.mjs +2 -0
  266. package/internal/utils/bytes.mjs.map +1 -1
  267. package/internal/utils/path.d.mts.map +1 -1
  268. package/internal/utils/path.d.ts.map +1 -1
  269. package/internal/utils/path.js +2 -0
  270. package/internal/utils/path.js.map +1 -1
  271. package/internal/utils/path.mjs +2 -0
  272. package/internal/utils/path.mjs.map +1 -1
  273. package/internal/utils/sleep.d.mts +1 -1
  274. package/internal/utils/sleep.d.mts.map +1 -1
  275. package/internal/utils/sleep.d.ts +1 -1
  276. package/internal/utils/sleep.d.ts.map +1 -1
  277. package/internal/utils/sleep.js +51 -1
  278. package/internal/utils/sleep.js.map +1 -1
  279. package/internal/utils/sleep.mjs +51 -1
  280. package/internal/utils/sleep.mjs.map +1 -1
  281. package/internal/ws-adapter-browser.d.mts.map +1 -1
  282. package/internal/ws-adapter-browser.d.ts.map +1 -1
  283. package/internal/ws-adapter-browser.js +2 -0
  284. package/internal/ws-adapter-browser.js.map +1 -1
  285. package/internal/ws-adapter-browser.mjs +2 -0
  286. package/internal/ws-adapter-browser.mjs.map +1 -1
  287. package/internal/ws.d.mts +16 -0
  288. package/internal/ws.d.mts.map +1 -1
  289. package/internal/ws.d.ts +16 -0
  290. package/internal/ws.d.ts.map +1 -1
  291. package/internal/ws.js +71 -5
  292. package/internal/ws.js.map +1 -1
  293. package/internal/ws.mjs +68 -6
  294. package/internal/ws.mjs.map +1 -1
  295. package/lib/AbstractChatCompletionRunner.d.mts.map +1 -1
  296. package/lib/AbstractChatCompletionRunner.d.ts.map +1 -1
  297. package/lib/AbstractChatCompletionRunner.js +41 -16
  298. package/lib/AbstractChatCompletionRunner.js.map +1 -1
  299. package/lib/AbstractChatCompletionRunner.mjs +42 -17
  300. package/lib/AbstractChatCompletionRunner.mjs.map +1 -1
  301. package/lib/AssistantStream.d.mts.map +1 -1
  302. package/lib/AssistantStream.d.ts.map +1 -1
  303. package/lib/AssistantStream.js +19 -5
  304. package/lib/AssistantStream.js.map +1 -1
  305. package/lib/AssistantStream.mjs +20 -6
  306. package/lib/AssistantStream.mjs.map +1 -1
  307. package/lib/ChatCompletionRunner.d.mts.map +1 -1
  308. package/lib/ChatCompletionRunner.d.ts.map +1 -1
  309. package/lib/ChatCompletionRunner.js +1 -0
  310. package/lib/ChatCompletionRunner.js.map +1 -1
  311. package/lib/ChatCompletionRunner.mjs +1 -0
  312. package/lib/ChatCompletionRunner.mjs.map +1 -1
  313. package/lib/ChatCompletionStream.d.mts +6 -1
  314. package/lib/ChatCompletionStream.d.mts.map +1 -1
  315. package/lib/ChatCompletionStream.d.ts +6 -1
  316. package/lib/ChatCompletionStream.d.ts.map +1 -1
  317. package/lib/ChatCompletionStream.js +63 -7
  318. package/lib/ChatCompletionStream.js.map +1 -1
  319. package/lib/ChatCompletionStream.mjs +64 -8
  320. package/lib/ChatCompletionStream.mjs.map +1 -1
  321. package/lib/EventEmitter.d.mts.map +1 -1
  322. package/lib/EventEmitter.d.ts.map +1 -1
  323. package/lib/EventEmitter.js +15 -0
  324. package/lib/EventEmitter.js.map +1 -1
  325. package/lib/EventEmitter.mjs +15 -0
  326. package/lib/EventEmitter.mjs.map +1 -1
  327. package/lib/EventStream.d.mts +2 -0
  328. package/lib/EventStream.d.mts.map +1 -1
  329. package/lib/EventStream.d.ts +2 -0
  330. package/lib/EventStream.d.ts.map +1 -1
  331. package/lib/EventStream.js +111 -14
  332. package/lib/EventStream.js.map +1 -1
  333. package/lib/EventStream.mjs +111 -14
  334. package/lib/EventStream.mjs.map +1 -1
  335. package/lib/ResponsesParser.d.mts.map +1 -1
  336. package/lib/ResponsesParser.d.ts.map +1 -1
  337. package/lib/ResponsesParser.js +4 -0
  338. package/lib/ResponsesParser.js.map +1 -1
  339. package/lib/ResponsesParser.mjs +4 -0
  340. package/lib/ResponsesParser.mjs.map +1 -1
  341. package/lib/RunnableFunction.d.mts.map +1 -1
  342. package/lib/RunnableFunction.d.ts.map +1 -1
  343. package/lib/RunnableFunction.js.map +1 -1
  344. package/lib/RunnableFunction.mjs.map +1 -1
  345. package/lib/agents/agent-session-stream.d.mts.map +1 -1
  346. package/lib/agents/agent-session-stream.d.ts.map +1 -1
  347. package/lib/agents/agent-session-stream.js +5 -2
  348. package/lib/agents/agent-session-stream.js.map +1 -1
  349. package/lib/agents/agent-session-stream.mjs +5 -2
  350. package/lib/agents/agent-session-stream.mjs.map +1 -1
  351. package/lib/embeddings.d.mts.map +1 -1
  352. package/lib/embeddings.d.ts.map +1 -1
  353. package/lib/embeddings.js +2 -0
  354. package/lib/embeddings.js.map +1 -1
  355. package/lib/embeddings.mjs +2 -0
  356. package/lib/embeddings.mjs.map +1 -1
  357. package/lib/live/transcript-grouper.d.mts.map +1 -1
  358. package/lib/live/transcript-grouper.d.ts.map +1 -1
  359. package/lib/live/transcript-grouper.js +8 -2
  360. package/lib/live/transcript-grouper.js.map +1 -1
  361. package/lib/live/transcript-grouper.mjs +8 -2
  362. package/lib/live/transcript-grouper.mjs.map +1 -1
  363. package/lib/parser.d.mts.map +1 -1
  364. package/lib/parser.d.ts.map +1 -1
  365. package/lib/parser.js +13 -0
  366. package/lib/parser.js.map +1 -1
  367. package/lib/parser.mjs +13 -0
  368. package/lib/parser.mjs.map +1 -1
  369. package/lib/responses/ResponseInputItems.d.mts.map +1 -1
  370. package/lib/responses/ResponseInputItems.d.ts.map +1 -1
  371. package/lib/responses/ResponseInputItems.js +11 -0
  372. package/lib/responses/ResponseInputItems.js.map +1 -1
  373. package/lib/responses/ResponseInputItems.mjs +11 -0
  374. package/lib/responses/ResponseInputItems.mjs.map +1 -1
  375. package/lib/responses/ResponseStream.d.mts.map +1 -1
  376. package/lib/responses/ResponseStream.d.ts.map +1 -1
  377. package/lib/responses/ResponseStream.js +7 -3
  378. package/lib/responses/ResponseStream.js.map +1 -1
  379. package/lib/responses/ResponseStream.mjs +8 -4
  380. package/lib/responses/ResponseStream.mjs.map +1 -1
  381. package/lib/responses/responses-websocket-lane.d.mts +63 -0
  382. package/lib/responses/responses-websocket-lane.d.mts.map +1 -0
  383. package/lib/responses/responses-websocket-lane.d.ts +63 -0
  384. package/lib/responses/responses-websocket-lane.d.ts.map +1 -0
  385. package/lib/responses/responses-websocket-lane.js +314 -0
  386. package/lib/responses/responses-websocket-lane.js.map +1 -0
  387. package/lib/responses/responses-websocket-lane.mjs +309 -0
  388. package/lib/responses/responses-websocket-lane.mjs.map +1 -0
  389. package/lib/responses/responses-websocket-session.d.mts +38 -0
  390. package/lib/responses/responses-websocket-session.d.mts.map +1 -0
  391. package/lib/responses/responses-websocket-session.d.ts +38 -0
  392. package/lib/responses/responses-websocket-session.d.ts.map +1 -0
  393. package/lib/responses/responses-websocket-session.js +268 -0
  394. package/lib/responses/responses-websocket-session.js.map +1 -0
  395. package/lib/responses/responses-websocket-session.mjs +263 -0
  396. package/lib/responses/responses-websocket-session.mjs.map +1 -0
  397. package/lib/transform.d.mts.map +1 -1
  398. package/lib/transform.d.ts.map +1 -1
  399. package/lib/transform.js +69 -33
  400. package/lib/transform.js.map +1 -1
  401. package/lib/transform.mjs +69 -33
  402. package/lib/transform.mjs.map +1 -1
  403. package/lib/webrtc/connection.d.mts.map +1 -1
  404. package/lib/webrtc/connection.d.ts.map +1 -1
  405. package/lib/webrtc/connection.js +6 -1
  406. package/lib/webrtc/connection.js.map +1 -1
  407. package/lib/webrtc/connection.mjs +6 -1
  408. package/lib/webrtc/connection.mjs.map +1 -1
  409. package/lib/webrtc/data-channel.d.mts.map +1 -1
  410. package/lib/webrtc/data-channel.d.ts.map +1 -1
  411. package/lib/webrtc/data-channel.js +9 -1
  412. package/lib/webrtc/data-channel.js.map +1 -1
  413. package/lib/webrtc/data-channel.mjs +9 -1
  414. package/lib/webrtc/data-channel.mjs.map +1 -1
  415. package/lib/webrtc/subscriptions.d.mts.map +1 -1
  416. package/lib/webrtc/subscriptions.d.ts.map +1 -1
  417. package/lib/webrtc/subscriptions.js +2 -0
  418. package/lib/webrtc/subscriptions.js.map +1 -1
  419. package/lib/webrtc/subscriptions.mjs +2 -0
  420. package/lib/webrtc/subscriptions.mjs.map +1 -1
  421. package/lib/webrtc/types.d.mts.map +1 -1
  422. package/lib/webrtc/types.d.ts.map +1 -1
  423. package/package.json +1 -1
  424. package/providers/bedrock/aws.d.mts.map +1 -1
  425. package/providers/bedrock/aws.d.ts.map +1 -1
  426. package/providers/bedrock/aws.js +4 -0
  427. package/providers/bedrock/aws.js.map +1 -1
  428. package/providers/bedrock/aws.mjs +4 -0
  429. package/providers/bedrock/aws.mjs.map +1 -1
  430. package/realtime/internal-base.d.mts.map +1 -1
  431. package/realtime/internal-base.d.ts.map +1 -1
  432. package/realtime/internal-base.js +1 -0
  433. package/realtime/internal-base.js.map +1 -1
  434. package/realtime/internal-base.mjs +1 -0
  435. package/realtime/internal-base.mjs.map +1 -1
  436. package/realtime/websocket.d.mts.map +1 -1
  437. package/realtime/websocket.d.ts.map +1 -1
  438. package/realtime/websocket.js +9 -1
  439. package/realtime/websocket.js.map +1 -1
  440. package/realtime/websocket.mjs +9 -1
  441. package/realtime/websocket.mjs.map +1 -1
  442. package/realtime/ws.d.mts.map +1 -1
  443. package/realtime/ws.d.ts.map +1 -1
  444. package/realtime/ws.js +3 -0
  445. package/realtime/ws.js.map +1 -1
  446. package/realtime/ws.mjs +3 -0
  447. package/realtime/ws.mjs.map +1 -1
  448. package/resources/beta/agents/agents.d.mts +2 -1
  449. package/resources/beta/agents/agents.d.mts.map +1 -1
  450. package/resources/beta/agents/agents.d.ts +2 -1
  451. package/resources/beta/agents/agents.d.ts.map +1 -1
  452. package/resources/beta/agents/agents.js.map +1 -1
  453. package/resources/beta/agents/agents.mjs.map +1 -1
  454. package/resources/beta/agents/sessions/sessions.d.mts +42 -1
  455. package/resources/beta/agents/sessions/sessions.d.mts.map +1 -1
  456. package/resources/beta/agents/sessions/sessions.d.ts +42 -1
  457. package/resources/beta/agents/sessions/sessions.d.ts.map +1 -1
  458. package/resources/beta/agents/sessions/sessions.js +2 -1
  459. package/resources/beta/agents/sessions/sessions.js.map +1 -1
  460. package/resources/beta/agents/sessions/sessions.mjs +2 -1
  461. package/resources/beta/agents/sessions/sessions.mjs.map +1 -1
  462. package/resources/beta/beta.d.mts +2 -2
  463. package/resources/beta/beta.d.mts.map +1 -1
  464. package/resources/beta/beta.d.ts +2 -2
  465. package/resources/beta/beta.d.ts.map +1 -1
  466. package/resources/beta/beta.js.map +1 -1
  467. package/resources/beta/beta.mjs.map +1 -1
  468. package/resources/beta/index.d.mts +1 -1
  469. package/resources/beta/index.d.mts.map +1 -1
  470. package/resources/beta/index.d.ts +1 -1
  471. package/resources/beta/index.d.ts.map +1 -1
  472. package/resources/beta/index.js.map +1 -1
  473. package/resources/beta/index.mjs.map +1 -1
  474. package/resources/beta/responses/index.d.mts +1 -1
  475. package/resources/beta/responses/index.d.mts.map +1 -1
  476. package/resources/beta/responses/index.d.ts +1 -1
  477. package/resources/beta/responses/index.d.ts.map +1 -1
  478. package/resources/beta/responses/index.js.map +1 -1
  479. package/resources/beta/responses/index.mjs.map +1 -1
  480. package/resources/beta/responses/internal-base.d.mts +3 -0
  481. package/resources/beta/responses/internal-base.d.mts.map +1 -1
  482. package/resources/beta/responses/internal-base.d.ts +3 -0
  483. package/resources/beta/responses/internal-base.d.ts.map +1 -1
  484. package/resources/beta/responses/internal-base.js +21 -12
  485. package/resources/beta/responses/internal-base.js.map +1 -1
  486. package/resources/beta/responses/internal-base.mjs +21 -12
  487. package/resources/beta/responses/internal-base.mjs.map +1 -1
  488. package/resources/beta/responses/responses.d.mts +65 -7
  489. package/resources/beta/responses/responses.d.mts.map +1 -1
  490. package/resources/beta/responses/responses.d.ts +65 -7
  491. package/resources/beta/responses/responses.d.ts.map +1 -1
  492. package/resources/beta/responses/responses.js.map +1 -1
  493. package/resources/beta/responses/responses.mjs.map +1 -1
  494. package/resources/beta/responses/ws-base.d.mts +9 -1
  495. package/resources/beta/responses/ws-base.d.mts.map +1 -1
  496. package/resources/beta/responses/ws-base.d.ts +9 -1
  497. package/resources/beta/responses/ws-base.d.ts.map +1 -1
  498. package/resources/beta/responses/ws-base.js +24 -5
  499. package/resources/beta/responses/ws-base.js.map +1 -1
  500. package/resources/beta/responses/ws-base.mjs +23 -6
  501. package/resources/beta/responses/ws-base.mjs.map +1 -1
  502. package/resources/beta/responses/ws.d.mts +2 -0
  503. package/resources/beta/responses/ws.d.mts.map +1 -1
  504. package/resources/beta/responses/ws.d.ts +2 -0
  505. package/resources/beta/responses/ws.d.ts.map +1 -1
  506. package/resources/beta/responses/ws.js +21 -8
  507. package/resources/beta/responses/ws.js.map +1 -1
  508. package/resources/beta/responses/ws.mjs +21 -8
  509. package/resources/beta/responses/ws.mjs.map +1 -1
  510. package/resources/live/forks/internal-base.d.mts +3 -0
  511. package/resources/live/forks/internal-base.d.mts.map +1 -1
  512. package/resources/live/forks/internal-base.d.ts +3 -0
  513. package/resources/live/forks/internal-base.d.ts.map +1 -1
  514. package/resources/live/forks/internal-base.js +21 -5
  515. package/resources/live/forks/internal-base.js.map +1 -1
  516. package/resources/live/forks/internal-base.mjs +21 -5
  517. package/resources/live/forks/internal-base.mjs.map +1 -1
  518. package/resources/live/forks/ws.d.mts.map +1 -1
  519. package/resources/live/forks/ws.d.ts.map +1 -1
  520. package/resources/live/forks/ws.js +2 -4
  521. package/resources/live/forks/ws.js.map +1 -1
  522. package/resources/live/forks/ws.mjs +2 -4
  523. package/resources/live/forks/ws.mjs.map +1 -1
  524. package/resources/live/internal-base.d.mts +3 -0
  525. package/resources/live/internal-base.d.mts.map +1 -1
  526. package/resources/live/internal-base.d.ts +3 -0
  527. package/resources/live/internal-base.d.ts.map +1 -1
  528. package/resources/live/internal-base.js +21 -5
  529. package/resources/live/internal-base.js.map +1 -1
  530. package/resources/live/internal-base.mjs +21 -5
  531. package/resources/live/internal-base.mjs.map +1 -1
  532. package/resources/live/sideband/internal-base.d.mts +3 -0
  533. package/resources/live/sideband/internal-base.d.mts.map +1 -1
  534. package/resources/live/sideband/internal-base.d.ts +3 -0
  535. package/resources/live/sideband/internal-base.d.ts.map +1 -1
  536. package/resources/live/sideband/internal-base.js +21 -5
  537. package/resources/live/sideband/internal-base.js.map +1 -1
  538. package/resources/live/sideband/internal-base.mjs +21 -5
  539. package/resources/live/sideband/internal-base.mjs.map +1 -1
  540. package/resources/live/sideband/ws.d.mts.map +1 -1
  541. package/resources/live/sideband/ws.d.ts.map +1 -1
  542. package/resources/live/sideband/ws.js +2 -4
  543. package/resources/live/sideband/ws.js.map +1 -1
  544. package/resources/live/sideband/ws.mjs +2 -4
  545. package/resources/live/sideband/ws.mjs.map +1 -1
  546. package/resources/live/ws.d.mts.map +1 -1
  547. package/resources/live/ws.d.ts.map +1 -1
  548. package/resources/live/ws.js +2 -4
  549. package/resources/live/ws.js.map +1 -1
  550. package/resources/live/ws.mjs +2 -4
  551. package/resources/live/ws.mjs.map +1 -1
  552. package/resources/responses/internal-base.d.mts +3 -0
  553. package/resources/responses/internal-base.d.mts.map +1 -1
  554. package/resources/responses/internal-base.d.ts +3 -0
  555. package/resources/responses/internal-base.d.ts.map +1 -1
  556. package/resources/responses/internal-base.js +21 -12
  557. package/resources/responses/internal-base.js.map +1 -1
  558. package/resources/responses/internal-base.mjs +21 -12
  559. package/resources/responses/internal-base.mjs.map +1 -1
  560. package/resources/responses/responses.d.mts +47 -4
  561. package/resources/responses/responses.d.mts.map +1 -1
  562. package/resources/responses/responses.d.ts +47 -4
  563. package/resources/responses/responses.d.ts.map +1 -1
  564. package/resources/responses/responses.js.map +1 -1
  565. package/resources/responses/responses.mjs.map +1 -1
  566. package/resources/responses/ws-base.d.mts +11 -1
  567. package/resources/responses/ws-base.d.mts.map +1 -1
  568. package/resources/responses/ws-base.d.ts +11 -1
  569. package/resources/responses/ws-base.d.ts.map +1 -1
  570. package/resources/responses/ws-base.js +29 -8
  571. package/resources/responses/ws-base.js.map +1 -1
  572. package/resources/responses/ws-base.mjs +28 -9
  573. package/resources/responses/ws-base.mjs.map +1 -1
  574. package/resources/responses/ws.d.mts +2 -0
  575. package/resources/responses/ws.d.mts.map +1 -1
  576. package/resources/responses/ws.d.ts +2 -0
  577. package/resources/responses/ws.d.ts.map +1 -1
  578. package/resources/responses/ws.js +21 -8
  579. package/resources/responses/ws.js.map +1 -1
  580. package/resources/responses/ws.mjs +21 -8
  581. package/resources/responses/ws.mjs.map +1 -1
  582. package/resources/shared.d.mts +1 -1
  583. package/resources/shared.d.mts.map +1 -1
  584. package/resources/shared.d.ts +1 -1
  585. package/resources/shared.d.ts.map +1 -1
  586. package/resources/webhooks/webhooks.d.mts +3 -4
  587. package/resources/webhooks/webhooks.d.mts.map +1 -1
  588. package/resources/webhooks/webhooks.d.ts +3 -4
  589. package/resources/webhooks/webhooks.d.ts.map +1 -1
  590. package/src/_vendor/zod-to-json-schema/Options.ts +2 -0
  591. package/src/_vendor/zod-to-json-schema/parseDef.ts +1 -0
  592. package/src/_vendor/zod-to-json-schema/parsers/bigint.ts +2 -0
  593. package/src/_vendor/zod-to-json-schema/parsers/literal.ts +1 -0
  594. package/src/_vendor/zod-to-json-schema/parsers/null.ts +1 -0
  595. package/src/_vendor/zod-to-json-schema/parsers/nullable.ts +4 -0
  596. package/src/_vendor/zod-to-json-schema/parsers/number.ts +2 -0
  597. package/src/_vendor/zod-to-json-schema/parsers/optional.ts +6 -7
  598. package/src/_vendor/zod-to-json-schema/parsers/record.ts +2 -0
  599. package/src/_vendor/zod-to-json-schema/parsers/string.ts +1 -0
  600. package/src/_vendor/zod-to-json-schema/parsers/union.ts +3 -0
  601. package/src/_vendor/zod-to-json-schema/util.ts +1 -0
  602. package/src/_vendor/zod-to-json-schema/zodToJsonSchema.ts +3 -1
  603. package/src/auth/subject-token-providers.ts +6 -1
  604. package/src/auth/workload-identity-auth.ts +10 -1
  605. package/src/auth/x509-transport.ts +13 -2
  606. package/src/azure.ts +3 -0
  607. package/src/bedrock.ts +5 -0
  608. package/src/beta/realtime/internal-base.ts +2 -0
  609. package/src/beta/realtime/websocket.ts +11 -1
  610. package/src/beta/realtime/ws.ts +3 -0
  611. package/src/client.ts +50 -3
  612. package/src/core/EventEmitter.ts +15 -0
  613. package/src/core/streaming.ts +30 -2
  614. package/src/helpers/audio.ts +2 -0
  615. package/src/helpers/standard-schema.ts +31 -19
  616. package/src/helpers/zod-v3-strict-schema.ts +8 -2
  617. package/src/helpers/zod.ts +32 -13
  618. package/src/internal/assistant-stream-delta.ts +7 -1
  619. package/src/internal/auth/x509-credential-options.ts +3 -0
  620. package/src/internal/auth/x509-token-exchange.ts +10 -1
  621. package/src/internal/auth/x509-transport-capability.ts +2 -1
  622. package/src/internal/auth/x509-workload-identity-auth.ts +13 -8
  623. package/src/internal/bedrock.ts +15 -0
  624. package/src/internal/decoders/line.ts +1 -0
  625. package/src/internal/parse.ts +1 -0
  626. package/src/internal/provider.ts +3 -0
  627. package/src/internal/qs/stringify.ts +3 -0
  628. package/src/internal/qs/utils.ts +14 -3
  629. package/src/internal/responses/response-accumulator.ts +34 -4
  630. package/src/internal/to-file.ts +1 -1
  631. package/src/internal/uploads.ts +11 -1
  632. package/src/internal/utils/abort.ts +7 -2
  633. package/src/internal/utils/bytes.ts +2 -0
  634. package/src/internal/utils/path.ts +2 -0
  635. package/src/internal/utils/sleep.ts +52 -1
  636. package/src/internal/ws-adapter-browser.ts +2 -0
  637. package/src/internal/ws.ts +80 -6
  638. package/src/lib/AbstractChatCompletionRunner.ts +40 -17
  639. package/src/lib/AssistantStream.ts +31 -20
  640. package/src/lib/ChatCompletionRunner.ts +1 -0
  641. package/src/lib/ChatCompletionStream.ts +81 -14
  642. package/src/lib/EventEmitter.ts +15 -0
  643. package/src/lib/EventStream.ts +93 -3
  644. package/src/lib/ResponsesParser.ts +5 -0
  645. package/src/lib/RunnableFunction.ts +4 -1
  646. package/src/lib/agents/agent-session-stream.ts +5 -3
  647. package/src/lib/embeddings.ts +3 -1
  648. package/src/lib/live/transcript-grouper.ts +4 -0
  649. package/src/lib/parser.ts +16 -2
  650. package/src/lib/responses/ResponseInputItems.ts +11 -0
  651. package/src/lib/responses/ResponseStream.ts +6 -3
  652. package/src/lib/responses/responses-websocket-lane.ts +388 -0
  653. package/src/lib/responses/responses-websocket-session.ts +317 -0
  654. package/src/lib/transform.ts +70 -35
  655. package/src/lib/webrtc/connection.ts +5 -1
  656. package/src/lib/webrtc/data-channel.ts +7 -0
  657. package/src/lib/webrtc/subscriptions.ts +3 -0
  658. package/src/lib/webrtc/types.ts +1 -0
  659. package/src/providers/bedrock/aws.ts +5 -1
  660. package/src/realtime/internal-base.ts +2 -0
  661. package/src/realtime/websocket.ts +11 -1
  662. package/src/realtime/ws.ts +3 -0
  663. package/src/resources/beta/agents/agents.ts +2 -0
  664. package/src/resources/beta/agents/sessions/sessions.ts +47 -1
  665. package/src/resources/beta/beta.ts +2 -0
  666. package/src/resources/beta/index.ts +1 -0
  667. package/src/resources/beta/responses/index.ts +1 -0
  668. package/src/resources/beta/responses/internal-base.ts +24 -11
  669. package/src/resources/beta/responses/responses.ts +82 -4
  670. package/src/resources/beta/responses/ws-base.ts +31 -6
  671. package/src/resources/beta/responses/ws.ts +29 -11
  672. package/src/resources/live/forks/internal-base.ts +24 -5
  673. package/src/resources/live/forks/ws.ts +4 -5
  674. package/src/resources/live/internal-base.ts +24 -5
  675. package/src/resources/live/sideband/internal-base.ts +24 -5
  676. package/src/resources/live/sideband/ws.ts +4 -5
  677. package/src/resources/live/ws.ts +4 -5
  678. package/src/resources/responses/api.md +1 -0
  679. package/src/resources/responses/internal-base.ts +24 -11
  680. package/src/resources/responses/responses.ts +56 -1
  681. package/src/resources/responses/ws-base.ts +36 -9
  682. package/src/resources/responses/ws.ts +29 -11
  683. package/src/resources/shared.ts +4 -2
  684. package/src/resources/webhooks/webhooks.ts +3 -4
  685. package/src/version.ts +1 -1
  686. package/version.d.mts +1 -1
  687. package/version.d.ts +1 -1
  688. package/version.js +1 -1
  689. package/version.mjs +1 -1
@@ -0,0 +1,388 @@
1
+ import type {
2
+ Response,
3
+ ResponsesClientEvent,
4
+ ResponsesServerEvent,
5
+ } from '../../resources/responses/responses';
6
+ import { WebSocketError } from '../../resources/responses/internal-base';
7
+ import { OpenAIError } from '../../core/error';
8
+ import { hasOwn, isObj } from '../../internal/utils/values';
9
+ import {
10
+ cloneResponse,
11
+ createCanonicalResponseContext,
12
+ ensureCanonicalOutputText,
13
+ } from '../../internal/responses/canonical-output-text';
14
+
15
+ type WireResponse = Omit<Response, 'output' | 'output_text'> &
16
+ Partial<Pick<Response, 'output' | 'output_text'>>;
17
+
18
+ type WireEvent<Event> = Event extends { response: Response }
19
+ ? Omit<Event, 'response'> & {
20
+ response: WireResponse;
21
+ }
22
+ : Event;
23
+
24
+ /** Raw lane events, including future types with unknown fields. Response output may be omitted. */
25
+ export type ResponsesWebSocketEvent =
26
+ | WireEvent<ResponsesServerEvent>
27
+ // oxlint-disable-next-line anti-slop/no-unsafe-dictionary-type -- Future wire event fields have no SDK schema and must remain unknown to callers.
28
+ | {
29
+ /** The server's event tag, which may be newer than the SDK. */
30
+ type: string;
31
+ [key: string]: unknown;
32
+ };
33
+
34
+ function isEventType<Type extends ResponsesServerEvent['type']>(
35
+ event: ResponsesWebSocketEvent,
36
+ ...types: Type[]
37
+ ): event is Extract<WireEvent<ResponsesServerEvent>, { type: Type }> {
38
+ return types.some((type) => event.type === type);
39
+ }
40
+
41
+ /** @internal */
42
+ export function positiveInteger(value: number): number {
43
+ if (!Number.isSafeInteger(value) || value <= 0) {
44
+ throw new OpenAIError('Responses WebSocket limits must be positive integers');
45
+ }
46
+ return value;
47
+ }
48
+
49
+ /** A single ordered local consumer. Canceling receive cancels only that wait. */
50
+ export class ResponsesWebSocketLane {
51
+ declare readonly streamID: string | undefined;
52
+ readonly #streamID: string | undefined;
53
+ readonly #send: (event: ResponsesClientEvent) => void;
54
+ readonly #release: (bytes: number) => void;
55
+ readonly #maxEvents: number;
56
+ readonly #maxBytes: number;
57
+ #bytes = 0;
58
+ readonly #queue: ({ event: ResponsesWebSocketEvent; bytes: number } | undefined)[] = [];
59
+ #queueHead = 0;
60
+ #wake: (() => void) | undefined;
61
+ #failure: Error | undefined;
62
+ #reading = false;
63
+
64
+ /** Created by ResponsesWebSocketSession.lane().
65
+ * @internal
66
+ */
67
+ constructor(
68
+ streamID: string | undefined,
69
+ send: (event: ResponsesClientEvent) => void,
70
+ release: (bytes: number) => void,
71
+ maxEvents: number,
72
+ maxBytes: number,
73
+ ) {
74
+ this.#streamID = streamID;
75
+ Object.defineProperty(this, 'streamID', {
76
+ value: streamID,
77
+ enumerable: true,
78
+ configurable: true,
79
+ writable: true,
80
+ });
81
+ this.#send = send;
82
+ this.#release = release;
83
+ this.#maxEvents = maxEvents;
84
+ this.#maxBytes = maxBytes;
85
+ }
86
+
87
+ /** Sends a request on this lane, omitting HTTP-only stream/background fields. previous_response_id remains caller-controlled. */
88
+ create(
89
+ request: Omit<
90
+ Extract<ResponsesClientEvent, { type: 'response.create' }>,
91
+ 'type' | 'stream_id' | 'stream' | 'background'
92
+ >,
93
+ ): void {
94
+ if (this.#failure) {
95
+ throw this.#failure;
96
+ }
97
+ const event: Extract<ResponsesClientEvent, { type: 'response.create' }> = {
98
+ ...request,
99
+ type: 'response.create',
100
+ };
101
+ // The SDK owns this envelope; a top-level hook must not replace its routing.
102
+ Object.defineProperty(event, 'toJSON', { value: undefined });
103
+ delete event.stream;
104
+ delete event.background;
105
+ if (this.#streamID === undefined) {
106
+ delete event.stream_id;
107
+ } else {
108
+ Object.defineProperty(event, 'stream_id', { value: this.#streamID, enumerable: true });
109
+ }
110
+ this.#send(event);
111
+ }
112
+
113
+ /** Returns the next raw event without filling omitted output or computing output_text. */
114
+ async receive(options: { signal?: AbortSignal } = {}): Promise<ResponsesWebSocketEvent> {
115
+ this.#acquireReader();
116
+ try {
117
+ const item = await this.#receive(options);
118
+ return item.event;
119
+ } finally {
120
+ this.#reading = false;
121
+ }
122
+ }
123
+
124
+ #acquireReader(): void {
125
+ if (this.#reading) {
126
+ throw new OpenAIError('Responses WebSocket lane already has a reader');
127
+ }
128
+ this.#reading = true;
129
+ }
130
+
131
+ async #receive(options: {
132
+ signal?: AbortSignal | undefined;
133
+ }): Promise<{ event: ResponsesWebSocketEvent; bytes: number }> {
134
+ const { signal } = options;
135
+ for (;;) {
136
+ if (signal?.aborted) {
137
+ throw signal.reason;
138
+ }
139
+ const item = this.#queue[this.#queueHead];
140
+ if (item) {
141
+ this.#queue[this.#queueHead] = undefined;
142
+ this.#queueHead += 1;
143
+ if (this.#queueHead >= 64 && this.#queueHead * 2 >= this.#queue.length) {
144
+ this.#queue.splice(0, this.#queueHead);
145
+ this.#queueHead = 0;
146
+ }
147
+ this.#release(item.bytes);
148
+ this.#bytes -= item.bytes;
149
+ return item;
150
+ }
151
+ if (this.#failure) {
152
+ throw this.#failure;
153
+ }
154
+ // oxlint-disable-next-line eslint/no-await-in-loop, promise/avoid-new -- A single ordered consumer waits for socket callbacks; canceling a wait must preserve queued events.
155
+ await new Promise<void>((resolve) => {
156
+ this.#wake = () => resolve();
157
+ signal?.addEventListener('abort', this.#wake, { once: true });
158
+ }).finally(() => {
159
+ if (this.#wake) {
160
+ signal?.removeEventListener('abort', this.#wake);
161
+ }
162
+ this.#wake = undefined;
163
+ });
164
+ }
165
+ }
166
+
167
+ /**
168
+ * Consumes the next response, returning completed, failed, or incomplete results.
169
+ * Collects finalized items and uses the existing Responses snapshot normalizer.
170
+ * Socket error events retain their nested data.
171
+ * Raw events remain observable on the original connection. maxResponseBytes
172
+ * optionally bounds the cumulative UTF-8 event bytes consumed for this result.
173
+ * There is no cumulative limit unless maxResponseBytes is supplied; the lane's
174
+ * queue budget only limits events waiting to be consumed. Exceeding the limit
175
+ * before a terminal event fails this lane, so the partial response cannot be
176
+ * consumed as a new result by a later call. Cancellation after consuming events
177
+ * also fails the lane; cancellation before consuming anything leaves it reusable.
178
+ * An invalid completed output item or terminal response fails only this lane.
179
+ */
180
+ async finalResponse(options: { signal?: AbortSignal; maxResponseBytes?: number } = {}): Promise<Response> {
181
+ const { signal } = options;
182
+ const maxBytes =
183
+ options.maxResponseBytes === undefined ? Infinity : positiveInteger(options.maxResponseBytes);
184
+ const completedOutput = new Map<number, Response['output'][number]>();
185
+ let consumedBytes = 0;
186
+ this.#acquireReader();
187
+ try {
188
+ for (;;) {
189
+ // oxlint-disable-next-line eslint/no-await-in-loop -- Protocol order is required to accumulate one response.
190
+ const { event, bytes } = await this.#receive({ signal });
191
+ consumedBytes += bytes;
192
+ const terminal = isEventType(
193
+ event,
194
+ 'error',
195
+ 'response.completed',
196
+ 'response.failed',
197
+ 'response.incomplete',
198
+ );
199
+ if (consumedBytes > maxBytes) {
200
+ const error = new OpenAIError('Responses WebSocket accumulated response limit exceeded');
201
+ if (!terminal) {
202
+ this.fail(error);
203
+ }
204
+ throw error;
205
+ }
206
+ if (isEventType(event, 'error')) {
207
+ throw new WebSocketError('Responses WebSocket request failed', event);
208
+ }
209
+ if (isEventType(event, 'response.created')) {
210
+ completedOutput.clear();
211
+ } else if (isEventType(event, 'response.output_item.done')) {
212
+ this.#validateOutputItem(event);
213
+ completedOutput.set(event.output_index, structuredClone(event.item));
214
+ }
215
+ if (terminal) {
216
+ this.#validateTerminalResponse(event);
217
+ return this.#finalizeResponse(event.response, completedOutput);
218
+ }
219
+ }
220
+ } catch (error) {
221
+ if (consumedBytes > 0 && signal?.aborted) {
222
+ this.fail(new OpenAIError('Responses WebSocket final response canceled after consuming events'));
223
+ }
224
+ throw error;
225
+ } finally {
226
+ this.#reading = false;
227
+ }
228
+ }
229
+
230
+ #finalizeResponse(
231
+ response: WireResponse,
232
+ completedOutput: Map<number, Response['output'][number]>,
233
+ ): Response {
234
+ const context = createCanonicalResponseContext();
235
+ try {
236
+ // Socket deltas need not include the setup events required by SSE.
237
+ // The terminal response is authoritative; finalized items fill an omitted output.
238
+ const completedEntries = [...completedOutput];
239
+ completedEntries.sort(([left], [right]) => left - right);
240
+ const output = hasOwn(response, 'output') ? response.output : undefined;
241
+ const outputText = hasOwn(response, 'output_text') ? response.output_text : undefined;
242
+ if (
243
+ (output !== undefined &&
244
+ output !== null &&
245
+ (!Array.isArray(output) ||
246
+ !output.every((item) => ResponsesWebSocketLane.#isValidOutputItem(item)))) ||
247
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Validate present wire fields before exposing a typed final response.
248
+ (outputText !== undefined && outputText !== null && typeof outputText !== 'string')
249
+ ) {
250
+ throw new OpenAIError('Invalid Responses WebSocket terminal response');
251
+ }
252
+ const snapshot = cloneResponse(context, {
253
+ ...response,
254
+ output: output ?? completedEntries.map(([, item]) => item),
255
+ output_text: outputText ?? '',
256
+ });
257
+ if (outputText === undefined || outputText === null) {
258
+ ensureCanonicalOutputText(context, snapshot);
259
+ }
260
+ return snapshot;
261
+ } catch {
262
+ const error = new OpenAIError('Invalid Responses WebSocket terminal response');
263
+ this.fail(error);
264
+ throw error;
265
+ }
266
+ }
267
+
268
+ #validateOutputItem(event: { output_index: number; item: unknown }): void {
269
+ if (
270
+ !hasOwn(event, 'output_index') ||
271
+ !Number.isSafeInteger(event.output_index) ||
272
+ event.output_index < 0
273
+ ) {
274
+ const error = new OpenAIError('Responses WebSocket output index must be a nonnegative integer');
275
+ this.fail(error);
276
+ throw error;
277
+ }
278
+ if (!hasOwn(event, 'item')) {
279
+ const error = new OpenAIError('Responses WebSocket output item must be an own property');
280
+ this.fail(error);
281
+ throw error;
282
+ }
283
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Completed output items must be wire objects before they enter the typed response.
284
+ if (event.item === null || typeof event.item !== 'object' || Array.isArray(event.item)) {
285
+ const error = new OpenAIError('Responses WebSocket output item must be an object');
286
+ this.fail(error);
287
+ throw error;
288
+ }
289
+ if (!ResponsesWebSocketLane.#isValidOutputItem(event.item)) {
290
+ const error = new OpenAIError('Invalid Responses WebSocket completed output item');
291
+ this.fail(error);
292
+ throw error;
293
+ }
294
+ }
295
+
296
+ // oxlint-disable-next-line anti-slop/no-unknown-parameters -- This is the wire boundary that validates untyped output items.
297
+ static #isValidOutputItem(item: unknown): boolean {
298
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Wire items require an own string discriminator, including unknown future variants.
299
+ if (!isObj(item) || !hasOwn(item, 'type') || typeof item['type'] !== 'string') {
300
+ return false;
301
+ }
302
+ if (item['type'] !== 'message') {
303
+ return true;
304
+ }
305
+ return (
306
+ hasOwn(item, 'content') &&
307
+ Array.isArray(item['content']) &&
308
+ // oxlint-disable-next-line anti-slop/no-unknown-parameters -- Validate untyped message parts before exposing the final response.
309
+ item['content'].every((content: unknown) => {
310
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Message parts use the same wire discriminator contract.
311
+ if (!isObj(content) || !hasOwn(content, 'type') || typeof content['type'] !== 'string') {
312
+ return false;
313
+ }
314
+ return (
315
+ content['type'] !== 'output_text' ||
316
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Canonical text accumulation consumes this exact wire field.
317
+ (hasOwn(content, 'text') && typeof content['text'] === 'string')
318
+ );
319
+ })
320
+ );
321
+ }
322
+
323
+ #validateTerminalResponse(event: { response?: unknown }): void {
324
+ if (
325
+ !hasOwn(event, 'response') ||
326
+ event.response === null ||
327
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Validate the untrusted terminal envelope before normalizing a typed response snapshot.
328
+ typeof event.response !== 'object' ||
329
+ Array.isArray(event.response)
330
+ ) {
331
+ const error = new OpenAIError('Responses WebSocket terminal response must be an object');
332
+ this.fail(error);
333
+ throw error;
334
+ }
335
+ }
336
+
337
+ /** Detaches this consumer without canceling remote work. Its ID remains reserved until reconnect. */
338
+ close(): void {
339
+ this.fail(new OpenAIError('Responses WebSocket lane is closed'));
340
+ }
341
+
342
+ /** Preserves already accepted events when the transport ends.
343
+ * @internal
344
+ */
345
+ end(error: Error): void {
346
+ if (this.#failure) {
347
+ return;
348
+ }
349
+ this.#failure = error;
350
+ // Keep queued events owned by the session until drain, close, or reconnect.
351
+ this.#wake?.();
352
+ }
353
+
354
+ /** @internal */
355
+ get ended(): boolean {
356
+ return this.#failure !== undefined;
357
+ }
358
+
359
+ /** @internal */
360
+ push(event: ResponsesWebSocketEvent, bytes: number): void {
361
+ if (this.#failure) {
362
+ this.#release(bytes);
363
+ return;
364
+ }
365
+ if (this.#queue.length - this.#queueHead >= this.#maxEvents || bytes > this.#maxBytes - this.#bytes) {
366
+ this.#release(bytes);
367
+ this.fail(new OpenAIError('Responses WebSocket lane buffer limit exceeded'));
368
+ return;
369
+ }
370
+ this.#bytes += bytes;
371
+ this.#queue.push({ event, bytes });
372
+ this.#wake?.();
373
+ }
374
+
375
+ /** @internal */
376
+ fail(error: Error): void {
377
+ this.#failure ??= error;
378
+ for (const item of this.#queue) {
379
+ if (item) {
380
+ this.#release(item.bytes);
381
+ }
382
+ }
383
+ this.#queue.length = 0;
384
+ this.#queueHead = 0;
385
+ this.#bytes = 0;
386
+ this.#wake?.();
387
+ }
388
+ }
@@ -0,0 +1,317 @@
1
+ import type { ResponsesServerEvent } from '../../resources/responses/responses';
2
+ import type { ResponsesEmitter } from '../../resources/responses/internal-base';
3
+ import { WebSocketError } from '../../resources/responses/internal-base';
4
+ import { OpenAIError } from '../../core/error';
5
+ import { ReadyState } from '../../internal/ws-adapter';
6
+ import type { WebSocketLike } from '../../internal/ws-adapter';
7
+ import { getWebSocketError, rawByteLength } from '../../internal/ws';
8
+ import { hasOwn, isObj } from '../../internal/utils/values';
9
+ import { getWebSocketEventBytes, getWebSocketEventPayload } from '../../resources/responses/ws-base';
10
+ import {
11
+ getWebSocketEventBytes as getBetaWebSocketEventBytes,
12
+ getWebSocketEventPayload as getBetaWebSocketEventPayload,
13
+ } from '../../resources/beta/responses/ws-base';
14
+ import { ResponsesWebSocketLane, positiveInteger } from './responses-websocket-lane';
15
+
16
+ export { ResponsesWebSocketLane } from './responses-websocket-lane';
17
+ export type { ResponsesWebSocketEvent } from './responses-websocket-lane';
18
+
19
+ interface LaneState {
20
+ lane: ResponsesWebSocketLane;
21
+ events: number;
22
+ bytes: number;
23
+ }
24
+
25
+ /** Limits for this optional helper. They do not change the underlying socket's limits. */
26
+ export interface ResponsesWebSocketSessionOptions {
27
+ /** Maximum lane IDs registered until the next reconnect, including detached lanes. */
28
+ maxLanes: number;
29
+ /** Maximum queued events across all lanes. */
30
+ maxBufferedEvents: number;
31
+ /** Maximum queued UTF-8 JSON bytes across all lanes. */
32
+ maxBufferedBytes: number;
33
+ }
34
+
35
+ function parseEvent(serialized: string): ResponsesServerEvent {
36
+ // SAFETY: Validate the envelope below, as the native transport does for server-defined payloads.
37
+ const event = JSON.parse(serialized) as ResponsesServerEvent;
38
+ if (
39
+ !isObj(event) ||
40
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Match the native event envelope at this untyped boundary.
41
+ typeof Object.getOwnPropertyDescriptor(event, 'type')?.value !== 'string'
42
+ ) {
43
+ throw new OpenAIError('Invalid WebSocket event shape');
44
+ }
45
+ return event;
46
+ }
47
+
48
+ function serializeCustomEvent(incoming: ResponsesServerEvent): string {
49
+ const snapshot = structuredClone(incoming);
50
+ // Mask inherited serialization hooks throughout our copy, not the caller's event.
51
+ const pending: unknown[] = [snapshot];
52
+ const visited = new Set<object>();
53
+ while (pending.length > 0) {
54
+ const value = pending.pop();
55
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Traverse only objects in the untyped structured clone.
56
+ if (value === null || typeof value !== 'object' || visited.has(value)) {
57
+ continue;
58
+ }
59
+ visited.add(value);
60
+ // Keep Date's standard JSON conversion, which is owned by Date.prototype.
61
+ if (!(value instanceof Date) && !hasOwn(value, 'toJSON')) {
62
+ Object.defineProperty(value, 'toJSON', { value: undefined });
63
+ }
64
+ for (const child of Object.values(value)) {
65
+ pending.push(child);
66
+ }
67
+ }
68
+ return JSON.stringify(snapshot);
69
+ }
70
+
71
+ /**
72
+ * Routes events from an existing Responses socket without creating another reader.
73
+ * Register lanes before sending. Unregistered events remain observable on the socket.
74
+ * Closing this helper releases its listeners and lanes, but leaves the socket open.
75
+ * Attaching to a closing or closed socket is rejected.
76
+ * Reconnecting invalidates lanes: register new ones after restoring application state.
77
+ * No request is replayed by this helper.
78
+ */
79
+ export class ResponsesWebSocketSession {
80
+ readonly #connection: ResponsesEmitter & { readonly socket: WebSocketLike };
81
+ readonly #lanes = new Map<string | undefined, LaneState>();
82
+ readonly #maxLanes: number;
83
+ readonly #maxEvents: number;
84
+ readonly #maxBytes: number;
85
+ #events = 0;
86
+ #bytes = 0;
87
+ #closed = false;
88
+ #socket: WebSocketLike | undefined;
89
+ #failedTransport: { socket: WebSocketLike | undefined; error: WebSocketError } | undefined;
90
+
91
+ constructor(
92
+ connection: ResponsesEmitter & { readonly socket: WebSocketLike },
93
+ options: ResponsesWebSocketSessionOptions,
94
+ ) {
95
+ this.#connection = connection;
96
+ this.#maxLanes = positiveInteger(options.maxLanes);
97
+ this.#maxEvents = positiveInteger(options.maxBufferedEvents);
98
+ this.#maxBytes = positiveInteger(options.maxBufferedBytes);
99
+ if (
100
+ connection.socket.readyState === ReadyState.CLOSING ||
101
+ connection.socket.readyState === ReadyState.CLOSED
102
+ ) {
103
+ throw new OpenAIError('Cannot attach a Responses WebSocket session to a closing or closed socket');
104
+ }
105
+ connection.on('event', this.#onEvent);
106
+ connection.on('error', this.#onError);
107
+ connection.on('close', this.#onClose);
108
+ connection.on('reconnecting', this.#onReconnect);
109
+ connection.on('reconnected', this.#onReconnected);
110
+ this.#onReconnected();
111
+ }
112
+
113
+ /** Omit streamID for the protocol's default lane. A lane has one consumer.
114
+ * IDs remain reserved until reconnect, including after close or failure:
115
+ * a terminal response can still be followed by an automatic successor.
116
+ */
117
+ lane(
118
+ streamID?: string,
119
+ limits: { maxBufferedEvents?: number; maxBufferedBytes?: number } = {},
120
+ ): ResponsesWebSocketLane {
121
+ if (this.#closed) {
122
+ throw new OpenAIError('Responses WebSocket session is closed');
123
+ }
124
+ this.#assertTransportAvailable(this.#connection.socket);
125
+ if (
126
+ streamID !== undefined &&
127
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Untyped JavaScript callers must not create non-string routing keys through RegExp coercion.
128
+ (typeof streamID !== 'string' || !/^[A-Za-z0-9_.-]{1,256}$/u.test(streamID))
129
+ ) {
130
+ throw new OpenAIError('Invalid Responses WebSocket stream ID');
131
+ }
132
+ if (this.#lanes.has(streamID)) {
133
+ throw new OpenAIError('Responses WebSocket lane is already registered');
134
+ }
135
+ if (this.#lanes.size >= this.#maxLanes) {
136
+ throw new OpenAIError('Responses WebSocket lane limit exceeded');
137
+ }
138
+ const entry: LaneState = {
139
+ events: 0,
140
+ bytes: 0,
141
+ lane: new ResponsesWebSocketLane(
142
+ streamID,
143
+ (event) => {
144
+ const { socket } = this.#connection;
145
+ this.#assertTransportAvailable(socket);
146
+ if (socket.readyState !== ReadyState.OPEN) {
147
+ throw new OpenAIError('Wait for an open Responses WebSocket before sending');
148
+ }
149
+ // The emitter's reconnect queue may replay an uncertain write. Send
150
+ // directly to the physical socket, including during its open callback.
151
+ socket.send(JSON.stringify(event));
152
+ },
153
+ (bytes) => {
154
+ this.#events -= 1;
155
+ this.#bytes -= bytes;
156
+ entry.events -= 1;
157
+ entry.bytes -= bytes;
158
+ },
159
+ positiveInteger(limits.maxBufferedEvents ?? this.#maxEvents),
160
+ positiveInteger(limits.maxBufferedBytes ?? this.#maxBytes),
161
+ ),
162
+ };
163
+ this.#lanes.set(streamID, entry);
164
+ return entry.lane;
165
+ }
166
+
167
+ close(): void {
168
+ this.#closed = true;
169
+ this.#removeListeners();
170
+ this.#failLanes(new OpenAIError('Responses WebSocket session is closed'));
171
+ this.#lanes.clear();
172
+ }
173
+
174
+ #removeListeners(): void {
175
+ this.#connection.off('event', this.#onEvent);
176
+ this.#connection.off('error', this.#onError);
177
+ this.#connection.off('close', this.#onClose);
178
+ this.#connection.off('reconnecting', this.#onReconnect);
179
+ this.#connection.off('reconnected', this.#onReconnected);
180
+ this.#socket?.off('error', this.#onSocketError);
181
+ this.#socket = undefined;
182
+ }
183
+
184
+ #onEvent = (incoming: ResponsesServerEvent): void => {
185
+ let event: ResponsesServerEvent;
186
+ let bytes: number;
187
+ try {
188
+ const payload = getWebSocketEventPayload(incoming) ?? getBetaWebSocketEventPayload(incoming);
189
+ // Native events are copied from the wire, before any observer's mutations.
190
+ // Clone custom inputs once to strip prototypes and evaluate accessors,
191
+ // then retain only the JSON representation covered by byte accounting.
192
+ let serialized = payload;
193
+ if (serialized === undefined) {
194
+ serialized = serializeCustomEvent(incoming);
195
+ }
196
+ event = parseEvent(serialized);
197
+ bytes =
198
+ payload === undefined
199
+ ? rawByteLength(serialized)
200
+ : (getBetaWebSocketEventBytes(incoming) ?? getWebSocketEventBytes(incoming));
201
+ } catch {
202
+ this.#failLanes(new OpenAIError('Cannot snapshot custom WebSocket event'));
203
+ return;
204
+ }
205
+ const routing = Object.getOwnPropertyDescriptor(event, 'stream_id');
206
+ let streamID: string | undefined;
207
+ if (routing) {
208
+ const value: unknown = routing.value;
209
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Raw event observers may mutate routing; only an own string value can select a lane, without invoking accessors.
210
+ if (typeof value !== 'string') {
211
+ return;
212
+ }
213
+ streamID = value;
214
+ }
215
+ const entry = this.#lanes.get(streamID);
216
+ if (!entry || entry.lane.ended) {
217
+ return;
218
+ }
219
+ if (bytes > this.#maxBytes) {
220
+ entry.lane.fail(new OpenAIError('Responses WebSocket helper buffer limit exceeded'));
221
+ return;
222
+ }
223
+ this.#events += 1;
224
+ this.#bytes += bytes;
225
+ entry.events += 1;
226
+ entry.bytes += bytes;
227
+ // Apply the lane's own limits first, releasing its backlog on overflow.
228
+ entry.lane.push(event, bytes);
229
+ while (this.#events > this.#maxEvents || this.#bytes > this.#maxBytes) {
230
+ const bytePressure = this.#bytes > this.#maxBytes;
231
+ let largest = entry;
232
+ let largestSize = 0;
233
+ for (const candidate of this.#lanes.values()) {
234
+ // Attribute pressure to existing backlogs, excluding the incoming event.
235
+ const size = bytePressure
236
+ ? candidate.bytes - (candidate === entry ? bytes : 0)
237
+ : candidate.events - (candidate === entry ? 1 : 0);
238
+ // Strict comparison breaks ties by lane registration order.
239
+ if (size > largestSize) {
240
+ largest = candidate;
241
+ largestSize = size;
242
+ }
243
+ }
244
+ largest.lane.fail(new OpenAIError('Responses WebSocket helper buffer limit exceeded'));
245
+ }
246
+ };
247
+
248
+ #onClose = (): void => {
249
+ if (this.#closed) {
250
+ return;
251
+ }
252
+ this.#closed = true;
253
+ this.#removeListeners();
254
+ for (const { lane } of this.#lanes.values()) {
255
+ lane.end(new OpenAIError('Responses WebSocket connection closed'));
256
+ }
257
+ };
258
+ // oxlint-disable-next-line eslint/class-methods-use-this -- Each session owns a distinct listener so detaching one does not unhandle another session's errors.
259
+ #onError = (): void => {
260
+ // API errors are routed as events. Other emitter errors may be recoverable
261
+ // diagnostics; only the physical socket's errors end all lanes.
262
+ };
263
+ #onSocketError = (cause: Error): void => {
264
+ const error = new WebSocketError(cause.message, null);
265
+ Object.assign(error, { cause });
266
+ this.#failedTransport = { socket: this.#socket, error };
267
+ for (const { lane } of this.#lanes.values()) {
268
+ lane.end(error);
269
+ }
270
+ };
271
+ #onReconnect = (): void => {
272
+ this.#socket?.off('error', this.#onSocketError);
273
+ this.#socket = undefined;
274
+ this.#failLanes(new OpenAIError('Responses WebSocket reconnected state must be restored explicitly'));
275
+ this.#lanes.clear();
276
+ };
277
+ #onReconnected = (): void => {
278
+ if (this.#closed) {
279
+ return;
280
+ }
281
+ this.#socket?.off('error', this.#onSocketError);
282
+ this.#socket = this.#connection.socket;
283
+ this.#clearRecoveredTransportError(this.#socket);
284
+ this.#socket.on('error', this.#onSocketError);
285
+ };
286
+
287
+ #assertTransportAvailable(socket: WebSocketLike): void {
288
+ // Native transports record failure before forwarding their public error event.
289
+ const cause = getWebSocketError(socket);
290
+ if (cause) {
291
+ const error = new WebSocketError(cause.message, null);
292
+ Object.assign(error, { cause });
293
+ throw error;
294
+ }
295
+ this.#clearRecoveredTransportError(socket);
296
+ if (this.#failedTransport) {
297
+ throw this.#failedTransport.error;
298
+ }
299
+ }
300
+
301
+ #clearRecoveredTransportError(socket: WebSocketLike): void {
302
+ // Application recovery callbacks can run before our reconnected listener.
303
+ if (
304
+ this.#failedTransport &&
305
+ socket !== this.#failedTransport.socket &&
306
+ socket.readyState === ReadyState.OPEN
307
+ ) {
308
+ this.#failedTransport = undefined;
309
+ }
310
+ }
311
+
312
+ #failLanes(error: Error): void {
313
+ for (const { lane } of this.#lanes.values()) {
314
+ lane.fail(error);
315
+ }
316
+ }
317
+ }