openai 7.15.0 → 7.17.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.
- package/CHANGELOG.md +62 -0
- package/README.md +6 -0
- package/_vendor/zod-to-json-schema/Options.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/Options.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/Options.js +2 -0
- package/_vendor/zod-to-json-schema/Options.js.map +1 -1
- package/_vendor/zod-to-json-schema/Options.mjs +2 -0
- package/_vendor/zod-to-json-schema/Options.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parseDef.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parseDef.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parseDef.js +1 -0
- package/_vendor/zod-to-json-schema/parseDef.js.map +1 -1
- package/_vendor/zod-to-json-schema/parseDef.mjs +1 -0
- package/_vendor/zod-to-json-schema/parseDef.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/bigint.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/bigint.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/bigint.js +2 -0
- package/_vendor/zod-to-json-schema/parsers/bigint.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/bigint.mjs +2 -0
- package/_vendor/zod-to-json-schema/parsers/bigint.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/literal.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/literal.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/literal.js +1 -0
- package/_vendor/zod-to-json-schema/parsers/literal.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/literal.mjs +1 -0
- package/_vendor/zod-to-json-schema/parsers/literal.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/null.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/null.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/null.js +1 -0
- package/_vendor/zod-to-json-schema/parsers/null.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/null.mjs +1 -0
- package/_vendor/zod-to-json-schema/parsers/null.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/nullable.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/nullable.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/nullable.js +4 -0
- package/_vendor/zod-to-json-schema/parsers/nullable.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/nullable.mjs +4 -0
- package/_vendor/zod-to-json-schema/parsers/nullable.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/number.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/number.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/number.js +2 -0
- package/_vendor/zod-to-json-schema/parsers/number.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/number.mjs +2 -0
- package/_vendor/zod-to-json-schema/parsers/number.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/optional.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/optional.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/optional.js +6 -7
- package/_vendor/zod-to-json-schema/parsers/optional.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/optional.mjs +6 -7
- package/_vendor/zod-to-json-schema/parsers/optional.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/record.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/record.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/record.js +2 -0
- package/_vendor/zod-to-json-schema/parsers/record.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/record.mjs +2 -0
- package/_vendor/zod-to-json-schema/parsers/record.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/string.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/string.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/string.js +1 -0
- package/_vendor/zod-to-json-schema/parsers/string.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/string.mjs +1 -0
- package/_vendor/zod-to-json-schema/parsers/string.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/union.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/union.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/union.js +3 -0
- package/_vendor/zod-to-json-schema/parsers/union.js.map +1 -1
- package/_vendor/zod-to-json-schema/parsers/union.mjs +3 -0
- package/_vendor/zod-to-json-schema/parsers/union.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/util.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/util.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/util.js +1 -0
- package/_vendor/zod-to-json-schema/util.js.map +1 -1
- package/_vendor/zod-to-json-schema/util.mjs +1 -0
- package/_vendor/zod-to-json-schema/util.mjs.map +1 -1
- package/_vendor/zod-to-json-schema/zodToJsonSchema.d.mts.map +1 -1
- package/_vendor/zod-to-json-schema/zodToJsonSchema.d.ts.map +1 -1
- package/_vendor/zod-to-json-schema/zodToJsonSchema.js +2 -0
- package/_vendor/zod-to-json-schema/zodToJsonSchema.js.map +1 -1
- package/_vendor/zod-to-json-schema/zodToJsonSchema.mjs +2 -0
- package/_vendor/zod-to-json-schema/zodToJsonSchema.mjs.map +1 -1
- package/auth/subject-token-providers.d.mts.map +1 -1
- package/auth/subject-token-providers.d.ts.map +1 -1
- package/auth/subject-token-providers.js +6 -1
- package/auth/subject-token-providers.js.map +1 -1
- package/auth/subject-token-providers.mjs +6 -1
- package/auth/subject-token-providers.mjs.map +1 -1
- package/auth/workload-identity-auth.d.mts.map +1 -1
- package/auth/workload-identity-auth.d.ts.map +1 -1
- package/auth/workload-identity-auth.js +9 -0
- package/auth/workload-identity-auth.js.map +1 -1
- package/auth/workload-identity-auth.mjs +9 -0
- package/auth/workload-identity-auth.mjs.map +1 -1
- package/auth/x509-transport.d.mts.map +1 -1
- package/auth/x509-transport.d.ts.map +1 -1
- package/auth/x509-transport.js +11 -0
- package/auth/x509-transport.js.map +1 -1
- package/auth/x509-transport.mjs +11 -0
- package/auth/x509-transport.mjs.map +1 -1
- package/azure.d.mts.map +1 -1
- package/azure.d.ts.map +1 -1
- package/azure.js +3 -0
- package/azure.js.map +1 -1
- package/azure.mjs +3 -0
- package/azure.mjs.map +1 -1
- package/bedrock.d.mts.map +1 -1
- package/bedrock.d.ts.map +1 -1
- package/bedrock.js +14 -6
- package/bedrock.js.map +1 -1
- package/bedrock.mjs +14 -6
- package/bedrock.mjs.map +1 -1
- package/beta/realtime/internal-base.d.mts.map +1 -1
- package/beta/realtime/internal-base.d.ts.map +1 -1
- package/beta/realtime/internal-base.js +1 -0
- package/beta/realtime/internal-base.js.map +1 -1
- package/beta/realtime/internal-base.mjs +1 -0
- package/beta/realtime/internal-base.mjs.map +1 -1
- package/beta/realtime/websocket.d.mts.map +1 -1
- package/beta/realtime/websocket.d.ts.map +1 -1
- package/beta/realtime/websocket.js +9 -1
- package/beta/realtime/websocket.js.map +1 -1
- package/beta/realtime/websocket.mjs +9 -1
- package/beta/realtime/websocket.mjs.map +1 -1
- package/beta/realtime/ws.d.mts.map +1 -1
- package/beta/realtime/ws.d.ts.map +1 -1
- package/beta/realtime/ws.js +3 -0
- package/beta/realtime/ws.js.map +1 -1
- package/beta/realtime/ws.mjs +3 -0
- package/beta/realtime/ws.mjs.map +1 -1
- package/client.d.mts +14 -3
- package/client.d.mts.map +1 -1
- package/client.d.ts +14 -3
- package/client.d.ts.map +1 -1
- package/client.js +64 -26
- package/client.js.map +1 -1
- package/client.mjs +64 -26
- package/client.mjs.map +1 -1
- package/core/EventEmitter.d.mts.map +1 -1
- package/core/EventEmitter.d.ts.map +1 -1
- package/core/EventEmitter.js +15 -0
- package/core/EventEmitter.js.map +1 -1
- package/core/EventEmitter.mjs +15 -0
- package/core/EventEmitter.mjs.map +1 -1
- package/core/streaming.d.mts +1 -0
- package/core/streaming.d.mts.map +1 -1
- package/core/streaming.d.ts +1 -0
- package/core/streaming.d.ts.map +1 -1
- package/core/streaming.js +28 -1
- package/core/streaming.js.map +1 -1
- package/core/streaming.mjs +28 -1
- package/core/streaming.mjs.map +1 -1
- package/helpers/audio.d.mts.map +1 -1
- package/helpers/audio.d.ts.map +1 -1
- package/helpers/audio.js +2 -0
- package/helpers/audio.js.map +1 -1
- package/helpers/audio.mjs +2 -0
- package/helpers/audio.mjs.map +1 -1
- package/helpers/standard-schema.d.mts.map +1 -1
- package/helpers/standard-schema.d.ts.map +1 -1
- package/helpers/standard-schema.js +28 -18
- package/helpers/standard-schema.js.map +1 -1
- package/helpers/standard-schema.mjs +28 -18
- package/helpers/standard-schema.mjs.map +1 -1
- package/helpers/zod-v3-strict-schema.d.mts.map +1 -1
- package/helpers/zod-v3-strict-schema.d.ts.map +1 -1
- package/helpers/zod-v3-strict-schema.js +5 -0
- package/helpers/zod-v3-strict-schema.js.map +1 -1
- package/helpers/zod-v3-strict-schema.mjs +5 -0
- package/helpers/zod-v3-strict-schema.mjs.map +1 -1
- package/helpers/zod.d.mts.map +1 -1
- package/helpers/zod.d.ts.map +1 -1
- package/helpers/zod.js +16 -1
- package/helpers/zod.js.map +1 -1
- package/helpers/zod.mjs +17 -2
- package/helpers/zod.mjs.map +1 -1
- package/internal/assistant-stream-delta.d.mts.map +1 -1
- package/internal/assistant-stream-delta.d.ts.map +1 -1
- package/internal/assistant-stream-delta.js +8 -1
- package/internal/assistant-stream-delta.js.map +1 -1
- package/internal/assistant-stream-delta.mjs +8 -1
- package/internal/assistant-stream-delta.mjs.map +1 -1
- package/internal/auth/x509-credential-options.d.mts.map +1 -1
- package/internal/auth/x509-credential-options.d.ts.map +1 -1
- package/internal/auth/x509-credential-options.js +3 -0
- package/internal/auth/x509-credential-options.js.map +1 -1
- package/internal/auth/x509-credential-options.mjs +3 -0
- package/internal/auth/x509-credential-options.mjs.map +1 -1
- package/internal/auth/x509-token-exchange.d.mts.map +1 -1
- package/internal/auth/x509-token-exchange.d.ts.map +1 -1
- package/internal/auth/x509-token-exchange.js +2 -0
- package/internal/auth/x509-token-exchange.js.map +1 -1
- package/internal/auth/x509-token-exchange.mjs +2 -0
- package/internal/auth/x509-token-exchange.mjs.map +1 -1
- package/internal/auth/x509-transport-capability.d.mts.map +1 -1
- package/internal/auth/x509-transport-capability.d.ts.map +1 -1
- package/internal/auth/x509-transport-capability.js +1 -0
- package/internal/auth/x509-transport-capability.js.map +1 -1
- package/internal/auth/x509-transport-capability.mjs +1 -0
- package/internal/auth/x509-transport-capability.mjs.map +1 -1
- package/internal/auth/x509-transport-state.mjs +1 -0
- package/internal/auth/x509-workload-identity-auth.d.mts.map +1 -1
- package/internal/auth/x509-workload-identity-auth.d.ts.map +1 -1
- package/internal/auth/x509-workload-identity-auth.js +11 -0
- package/internal/auth/x509-workload-identity-auth.js.map +1 -1
- package/internal/auth/x509-workload-identity-auth.mjs +11 -0
- package/internal/auth/x509-workload-identity-auth.mjs.map +1 -1
- package/internal/bedrock.d.mts.map +1 -1
- package/internal/bedrock.d.ts.map +1 -1
- package/internal/bedrock.js +17 -1
- package/internal/bedrock.js.map +1 -1
- package/internal/bedrock.mjs +17 -1
- package/internal/bedrock.mjs.map +1 -1
- package/internal/decoders/line.d.mts.map +1 -1
- package/internal/decoders/line.d.ts.map +1 -1
- package/internal/decoders/line.js +1 -0
- package/internal/decoders/line.js.map +1 -1
- package/internal/decoders/line.mjs +1 -0
- package/internal/decoders/line.mjs.map +1 -1
- package/internal/parse.d.mts +1 -0
- package/internal/parse.d.mts.map +1 -1
- package/internal/parse.d.ts +1 -0
- package/internal/parse.d.ts.map +1 -1
- package/internal/parse.js.map +1 -1
- package/internal/parse.mjs.map +1 -1
- package/internal/provider.d.mts.map +1 -1
- package/internal/provider.d.ts.map +1 -1
- package/internal/provider.js +3 -0
- package/internal/provider.js.map +1 -1
- package/internal/provider.mjs +3 -0
- package/internal/provider.mjs.map +1 -1
- package/internal/qs/stringify.d.mts.map +1 -1
- package/internal/qs/stringify.d.ts.map +1 -1
- package/internal/qs/stringify.js +3 -0
- package/internal/qs/stringify.js.map +1 -1
- package/internal/qs/stringify.mjs +3 -0
- package/internal/qs/stringify.mjs.map +1 -1
- package/internal/qs/utils.d.mts.map +1 -1
- package/internal/qs/utils.d.ts.map +1 -1
- package/internal/qs/utils.js +15 -3
- package/internal/qs/utils.js.map +1 -1
- package/internal/qs/utils.mjs +15 -3
- package/internal/qs/utils.mjs.map +1 -1
- package/internal/realtime-credentials.d.mts +1 -1
- package/internal/realtime-credentials.d.ts +1 -1
- package/internal/realtime-credentials.js +1 -1
- package/internal/realtime-credentials.mjs +1 -1
- package/internal/responses/response-accumulator.d.mts.map +1 -1
- package/internal/responses/response-accumulator.d.ts.map +1 -1
- package/internal/responses/response-accumulator.js +20 -4
- package/internal/responses/response-accumulator.js.map +1 -1
- package/internal/responses/response-accumulator.mjs +20 -4
- package/internal/responses/response-accumulator.mjs.map +1 -1
- package/internal/to-file.js.map +1 -1
- package/internal/to-file.mjs.map +1 -1
- package/internal/uploads.d.mts.map +1 -1
- package/internal/uploads.d.ts.map +1 -1
- package/internal/uploads.js +10 -0
- package/internal/uploads.js.map +1 -1
- package/internal/uploads.mjs +10 -0
- package/internal/uploads.mjs.map +1 -1
- package/internal/utils/abort.d.mts +11 -0
- package/internal/utils/abort.d.mts.map +1 -0
- package/internal/utils/abort.d.ts +11 -0
- package/internal/utils/abort.d.ts.map +1 -0
- package/internal/utils/abort.js +94 -0
- package/internal/utils/abort.js.map +1 -0
- package/internal/utils/abort.mjs +90 -0
- package/internal/utils/abort.mjs.map +1 -0
- package/internal/utils/bytes.d.mts.map +1 -1
- package/internal/utils/bytes.d.ts.map +1 -1
- package/internal/utils/bytes.js +2 -0
- package/internal/utils/bytes.js.map +1 -1
- package/internal/utils/bytes.mjs +2 -0
- package/internal/utils/bytes.mjs.map +1 -1
- package/internal/utils/path.d.mts.map +1 -1
- package/internal/utils/path.d.ts.map +1 -1
- package/internal/utils/path.js +2 -0
- package/internal/utils/path.js.map +1 -1
- package/internal/utils/path.mjs +2 -0
- package/internal/utils/path.mjs.map +1 -1
- package/internal/utils/sleep.d.mts +1 -1
- package/internal/utils/sleep.d.mts.map +1 -1
- package/internal/utils/sleep.d.ts +1 -1
- package/internal/utils/sleep.d.ts.map +1 -1
- package/internal/utils/sleep.js +51 -1
- package/internal/utils/sleep.js.map +1 -1
- package/internal/utils/sleep.mjs +51 -1
- package/internal/utils/sleep.mjs.map +1 -1
- package/internal/ws-adapter-browser.d.mts.map +1 -1
- package/internal/ws-adapter-browser.d.ts.map +1 -1
- package/internal/ws-adapter-browser.js +2 -0
- package/internal/ws-adapter-browser.js.map +1 -1
- package/internal/ws-adapter-browser.mjs +2 -0
- package/internal/ws-adapter-browser.mjs.map +1 -1
- package/internal/ws.d.mts +22 -0
- package/internal/ws.d.mts.map +1 -1
- package/internal/ws.d.ts +22 -0
- package/internal/ws.d.ts.map +1 -1
- package/internal/ws.js +46 -4
- package/internal/ws.js.map +1 -1
- package/internal/ws.mjs +44 -4
- package/internal/ws.mjs.map +1 -1
- package/lib/AbstractChatCompletionRunner.d.mts.map +1 -1
- package/lib/AbstractChatCompletionRunner.d.ts.map +1 -1
- package/lib/AbstractChatCompletionRunner.js +41 -16
- package/lib/AbstractChatCompletionRunner.js.map +1 -1
- package/lib/AbstractChatCompletionRunner.mjs +42 -17
- package/lib/AbstractChatCompletionRunner.mjs.map +1 -1
- package/lib/AssistantStream.d.mts.map +1 -1
- package/lib/AssistantStream.d.ts.map +1 -1
- package/lib/AssistantStream.js +19 -5
- package/lib/AssistantStream.js.map +1 -1
- package/lib/AssistantStream.mjs +20 -6
- package/lib/AssistantStream.mjs.map +1 -1
- package/lib/ChatCompletionRunner.d.mts.map +1 -1
- package/lib/ChatCompletionRunner.d.ts.map +1 -1
- package/lib/ChatCompletionRunner.js +1 -0
- package/lib/ChatCompletionRunner.js.map +1 -1
- package/lib/ChatCompletionRunner.mjs +1 -0
- package/lib/ChatCompletionRunner.mjs.map +1 -1
- package/lib/ChatCompletionStream.d.mts +6 -1
- package/lib/ChatCompletionStream.d.mts.map +1 -1
- package/lib/ChatCompletionStream.d.ts +6 -1
- package/lib/ChatCompletionStream.d.ts.map +1 -1
- package/lib/ChatCompletionStream.js +63 -7
- package/lib/ChatCompletionStream.js.map +1 -1
- package/lib/ChatCompletionStream.mjs +64 -8
- package/lib/ChatCompletionStream.mjs.map +1 -1
- package/lib/EventEmitter.d.mts.map +1 -1
- package/lib/EventEmitter.d.ts.map +1 -1
- package/lib/EventEmitter.js +15 -0
- package/lib/EventEmitter.js.map +1 -1
- package/lib/EventEmitter.mjs +15 -0
- package/lib/EventEmitter.mjs.map +1 -1
- package/lib/EventStream.d.mts +2 -0
- package/lib/EventStream.d.mts.map +1 -1
- package/lib/EventStream.d.ts +2 -0
- package/lib/EventStream.d.ts.map +1 -1
- package/lib/EventStream.js +111 -14
- package/lib/EventStream.js.map +1 -1
- package/lib/EventStream.mjs +111 -14
- package/lib/EventStream.mjs.map +1 -1
- package/lib/ResponsesParser.d.mts.map +1 -1
- package/lib/ResponsesParser.d.ts.map +1 -1
- package/lib/ResponsesParser.js +4 -0
- package/lib/ResponsesParser.js.map +1 -1
- package/lib/ResponsesParser.mjs +4 -0
- package/lib/ResponsesParser.mjs.map +1 -1
- package/lib/RunnableFunction.d.mts.map +1 -1
- package/lib/RunnableFunction.d.ts.map +1 -1
- package/lib/RunnableFunction.js.map +1 -1
- package/lib/RunnableFunction.mjs.map +1 -1
- package/lib/agents/agent-session-stream.d.mts.map +1 -1
- package/lib/agents/agent-session-stream.d.ts.map +1 -1
- package/lib/agents/agent-session-stream.js +5 -2
- package/lib/agents/agent-session-stream.js.map +1 -1
- package/lib/agents/agent-session-stream.mjs +5 -2
- package/lib/agents/agent-session-stream.mjs.map +1 -1
- package/lib/embeddings.d.mts.map +1 -1
- package/lib/embeddings.d.ts.map +1 -1
- package/lib/embeddings.js +2 -0
- package/lib/embeddings.js.map +1 -1
- package/lib/embeddings.mjs +2 -0
- package/lib/embeddings.mjs.map +1 -1
- package/lib/live/transcript-grouper.d.mts.map +1 -1
- package/lib/live/transcript-grouper.d.ts.map +1 -1
- package/lib/live/transcript-grouper.js +8 -2
- package/lib/live/transcript-grouper.js.map +1 -1
- package/lib/live/transcript-grouper.mjs +8 -2
- package/lib/live/transcript-grouper.mjs.map +1 -1
- package/lib/live/transcript-grouping.d.mts +2 -2
- package/lib/live/transcript-grouping.d.mts.map +1 -1
- package/lib/live/transcript-grouping.d.ts +2 -2
- package/lib/live/transcript-grouping.d.ts.map +1 -1
- package/lib/live/transcript-grouping.js +44 -22
- package/lib/live/transcript-grouping.js.map +1 -1
- package/lib/live/transcript-grouping.mjs +44 -22
- package/lib/live/transcript-grouping.mjs.map +1 -1
- package/lib/parser.d.mts.map +1 -1
- package/lib/parser.d.ts.map +1 -1
- package/lib/parser.js +13 -0
- package/lib/parser.js.map +1 -1
- package/lib/parser.mjs +13 -0
- package/lib/parser.mjs.map +1 -1
- package/lib/responses/ResponseInputItems.d.mts.map +1 -1
- package/lib/responses/ResponseInputItems.d.ts.map +1 -1
- package/lib/responses/ResponseInputItems.js +11 -0
- package/lib/responses/ResponseInputItems.js.map +1 -1
- package/lib/responses/ResponseInputItems.mjs +11 -0
- package/lib/responses/ResponseInputItems.mjs.map +1 -1
- package/lib/responses/ResponseStream.d.mts.map +1 -1
- package/lib/responses/ResponseStream.d.ts.map +1 -1
- package/lib/responses/ResponseStream.js +7 -3
- package/lib/responses/ResponseStream.js.map +1 -1
- package/lib/responses/ResponseStream.mjs +8 -4
- package/lib/responses/ResponseStream.mjs.map +1 -1
- package/lib/transform.d.mts.map +1 -1
- package/lib/transform.d.ts.map +1 -1
- package/lib/transform.js +69 -33
- package/lib/transform.js.map +1 -1
- package/lib/transform.mjs +69 -33
- package/lib/transform.mjs.map +1 -1
- package/lib/webrtc/connection.d.mts.map +1 -1
- package/lib/webrtc/connection.d.ts.map +1 -1
- package/lib/webrtc/connection.js +6 -1
- package/lib/webrtc/connection.js.map +1 -1
- package/lib/webrtc/connection.mjs +6 -1
- package/lib/webrtc/connection.mjs.map +1 -1
- package/lib/webrtc/data-channel.d.mts.map +1 -1
- package/lib/webrtc/data-channel.d.ts.map +1 -1
- package/lib/webrtc/data-channel.js +9 -1
- package/lib/webrtc/data-channel.js.map +1 -1
- package/lib/webrtc/data-channel.mjs +9 -1
- package/lib/webrtc/data-channel.mjs.map +1 -1
- package/lib/webrtc/subscriptions.d.mts.map +1 -1
- package/lib/webrtc/subscriptions.d.ts.map +1 -1
- package/lib/webrtc/subscriptions.js +2 -0
- package/lib/webrtc/subscriptions.js.map +1 -1
- package/lib/webrtc/subscriptions.mjs +2 -0
- package/lib/webrtc/subscriptions.mjs.map +1 -1
- package/lib/webrtc/types.d.mts.map +1 -1
- package/lib/webrtc/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/providers/bedrock/aws.d.mts.map +1 -1
- package/providers/bedrock/aws.d.ts.map +1 -1
- package/providers/bedrock/aws.js +4 -0
- package/providers/bedrock/aws.js.map +1 -1
- package/providers/bedrock/aws.mjs +4 -0
- package/providers/bedrock/aws.mjs.map +1 -1
- package/realtime/internal-base.d.mts.map +1 -1
- package/realtime/internal-base.d.ts.map +1 -1
- package/realtime/internal-base.js +1 -0
- package/realtime/internal-base.js.map +1 -1
- package/realtime/internal-base.mjs +1 -0
- package/realtime/internal-base.mjs.map +1 -1
- package/realtime/websocket.d.mts.map +1 -1
- package/realtime/websocket.d.ts.map +1 -1
- package/realtime/websocket.js +9 -1
- package/realtime/websocket.js.map +1 -1
- package/realtime/websocket.mjs +9 -1
- package/realtime/websocket.mjs.map +1 -1
- package/realtime/ws.d.mts.map +1 -1
- package/realtime/ws.d.ts.map +1 -1
- package/realtime/ws.js +3 -0
- package/realtime/ws.js.map +1 -1
- package/realtime/ws.mjs +3 -0
- package/realtime/ws.mjs.map +1 -1
- package/resources/beta/agents/agents.d.mts +2 -1
- package/resources/beta/agents/agents.d.mts.map +1 -1
- package/resources/beta/agents/agents.d.ts +2 -1
- package/resources/beta/agents/agents.d.ts.map +1 -1
- package/resources/beta/agents/agents.js.map +1 -1
- package/resources/beta/agents/agents.mjs.map +1 -1
- package/resources/beta/beta.d.mts +2 -2
- package/resources/beta/beta.d.mts.map +1 -1
- package/resources/beta/beta.d.ts +2 -2
- package/resources/beta/beta.d.ts.map +1 -1
- package/resources/beta/beta.js.map +1 -1
- package/resources/beta/beta.mjs.map +1 -1
- package/resources/beta/index.d.mts +1 -1
- package/resources/beta/index.d.mts.map +1 -1
- package/resources/beta/index.d.ts +1 -1
- package/resources/beta/index.d.ts.map +1 -1
- package/resources/beta/index.js.map +1 -1
- package/resources/beta/index.mjs.map +1 -1
- package/resources/beta/responses/index.d.mts +1 -1
- package/resources/beta/responses/index.d.mts.map +1 -1
- package/resources/beta/responses/index.d.ts +1 -1
- package/resources/beta/responses/index.d.ts.map +1 -1
- package/resources/beta/responses/index.js.map +1 -1
- package/resources/beta/responses/index.mjs.map +1 -1
- package/resources/beta/responses/internal-base.d.mts +3 -0
- package/resources/beta/responses/internal-base.d.mts.map +1 -1
- package/resources/beta/responses/internal-base.d.ts +3 -0
- package/resources/beta/responses/internal-base.d.ts.map +1 -1
- package/resources/beta/responses/internal-base.js +21 -6
- package/resources/beta/responses/internal-base.js.map +1 -1
- package/resources/beta/responses/internal-base.mjs +21 -6
- package/resources/beta/responses/internal-base.mjs.map +1 -1
- package/resources/beta/responses/responses.d.mts +51 -3
- package/resources/beta/responses/responses.d.mts.map +1 -1
- package/resources/beta/responses/responses.d.ts +51 -3
- package/resources/beta/responses/responses.d.ts.map +1 -1
- package/resources/beta/responses/responses.js.map +1 -1
- package/resources/beta/responses/responses.mjs.map +1 -1
- package/resources/beta/responses/ws-base.d.mts +18 -9
- package/resources/beta/responses/ws-base.d.mts.map +1 -1
- package/resources/beta/responses/ws-base.d.ts +18 -9
- package/resources/beta/responses/ws-base.d.ts.map +1 -1
- package/resources/beta/responses/ws-base.js +87 -18
- package/resources/beta/responses/ws-base.js.map +1 -1
- package/resources/beta/responses/ws-base.mjs +89 -20
- package/resources/beta/responses/ws-base.mjs.map +1 -1
- package/resources/beta/responses/ws.d.mts +3 -0
- package/resources/beta/responses/ws.d.mts.map +1 -1
- package/resources/beta/responses/ws.d.ts +3 -0
- package/resources/beta/responses/ws.d.ts.map +1 -1
- package/resources/beta/responses/ws.js +12 -3
- package/resources/beta/responses/ws.js.map +1 -1
- package/resources/beta/responses/ws.mjs +12 -3
- package/resources/beta/responses/ws.mjs.map +1 -1
- package/resources/live/forks/internal-base.d.mts +3 -0
- package/resources/live/forks/internal-base.d.mts.map +1 -1
- package/resources/live/forks/internal-base.d.ts +3 -0
- package/resources/live/forks/internal-base.d.ts.map +1 -1
- package/resources/live/forks/internal-base.js +21 -5
- package/resources/live/forks/internal-base.js.map +1 -1
- package/resources/live/forks/internal-base.mjs +21 -5
- package/resources/live/forks/internal-base.mjs.map +1 -1
- package/resources/live/forks/ws-base.d.mts +13 -8
- package/resources/live/forks/ws-base.d.mts.map +1 -1
- package/resources/live/forks/ws-base.d.ts +13 -8
- package/resources/live/forks/ws-base.d.ts.map +1 -1
- package/resources/live/forks/ws-base.js +85 -14
- package/resources/live/forks/ws-base.js.map +1 -1
- package/resources/live/forks/ws-base.mjs +87 -16
- package/resources/live/forks/ws-base.mjs.map +1 -1
- package/resources/live/forks/ws.d.mts +1 -0
- package/resources/live/forks/ws.d.mts.map +1 -1
- package/resources/live/forks/ws.d.ts +1 -0
- package/resources/live/forks/ws.d.ts.map +1 -1
- package/resources/live/forks/ws.js.map +1 -1
- package/resources/live/forks/ws.mjs.map +1 -1
- package/resources/live/internal-base.d.mts +3 -0
- package/resources/live/internal-base.d.mts.map +1 -1
- package/resources/live/internal-base.d.ts +3 -0
- package/resources/live/internal-base.d.ts.map +1 -1
- package/resources/live/internal-base.js +21 -5
- package/resources/live/internal-base.js.map +1 -1
- package/resources/live/internal-base.mjs +21 -5
- package/resources/live/internal-base.mjs.map +1 -1
- package/resources/live/sideband/internal-base.d.mts +3 -0
- package/resources/live/sideband/internal-base.d.mts.map +1 -1
- package/resources/live/sideband/internal-base.d.ts +3 -0
- package/resources/live/sideband/internal-base.d.ts.map +1 -1
- package/resources/live/sideband/internal-base.js +21 -5
- package/resources/live/sideband/internal-base.js.map +1 -1
- package/resources/live/sideband/internal-base.mjs +21 -5
- package/resources/live/sideband/internal-base.mjs.map +1 -1
- package/resources/live/sideband/ws-base.d.mts +13 -8
- package/resources/live/sideband/ws-base.d.mts.map +1 -1
- package/resources/live/sideband/ws-base.d.ts +13 -8
- package/resources/live/sideband/ws-base.d.ts.map +1 -1
- package/resources/live/sideband/ws-base.js +85 -14
- package/resources/live/sideband/ws-base.js.map +1 -1
- package/resources/live/sideband/ws-base.mjs +87 -16
- package/resources/live/sideband/ws-base.mjs.map +1 -1
- package/resources/live/sideband/ws.d.mts +1 -0
- package/resources/live/sideband/ws.d.mts.map +1 -1
- package/resources/live/sideband/ws.d.ts +1 -0
- package/resources/live/sideband/ws.d.ts.map +1 -1
- package/resources/live/sideband/ws.js.map +1 -1
- package/resources/live/sideband/ws.mjs.map +1 -1
- package/resources/live/ws-base.d.mts +13 -8
- package/resources/live/ws-base.d.mts.map +1 -1
- package/resources/live/ws-base.d.ts +13 -8
- package/resources/live/ws-base.d.ts.map +1 -1
- package/resources/live/ws-base.js +85 -14
- package/resources/live/ws-base.js.map +1 -1
- package/resources/live/ws-base.mjs +87 -16
- package/resources/live/ws-base.mjs.map +1 -1
- package/resources/live/ws.d.mts +1 -0
- package/resources/live/ws.d.mts.map +1 -1
- package/resources/live/ws.d.ts +1 -0
- package/resources/live/ws.d.ts.map +1 -1
- package/resources/live/ws.js.map +1 -1
- package/resources/live/ws.mjs.map +1 -1
- package/resources/responses/internal-base.d.mts +3 -0
- package/resources/responses/internal-base.d.mts.map +1 -1
- package/resources/responses/internal-base.d.ts +3 -0
- package/resources/responses/internal-base.d.ts.map +1 -1
- package/resources/responses/internal-base.js +21 -6
- package/resources/responses/internal-base.js.map +1 -1
- package/resources/responses/internal-base.mjs +21 -6
- package/resources/responses/internal-base.mjs.map +1 -1
- package/resources/responses/responses.d.mts +36 -3
- package/resources/responses/responses.d.mts.map +1 -1
- package/resources/responses/responses.d.ts +36 -3
- package/resources/responses/responses.d.ts.map +1 -1
- package/resources/responses/responses.js.map +1 -1
- package/resources/responses/responses.mjs.map +1 -1
- package/resources/responses/ws-base.d.mts +18 -9
- package/resources/responses/ws-base.d.mts.map +1 -1
- package/resources/responses/ws-base.d.ts +18 -9
- package/resources/responses/ws-base.d.ts.map +1 -1
- package/resources/responses/ws-base.js +87 -18
- package/resources/responses/ws-base.js.map +1 -1
- package/resources/responses/ws-base.mjs +89 -20
- package/resources/responses/ws-base.mjs.map +1 -1
- package/resources/responses/ws.d.mts +3 -0
- package/resources/responses/ws.d.mts.map +1 -1
- package/resources/responses/ws.d.ts +3 -0
- package/resources/responses/ws.d.ts.map +1 -1
- package/resources/responses/ws.js +12 -3
- package/resources/responses/ws.js.map +1 -1
- package/resources/responses/ws.mjs +12 -3
- package/resources/responses/ws.mjs.map +1 -1
- package/src/_vendor/zod-to-json-schema/Options.ts +2 -0
- package/src/_vendor/zod-to-json-schema/parseDef.ts +1 -0
- package/src/_vendor/zod-to-json-schema/parsers/bigint.ts +2 -0
- package/src/_vendor/zod-to-json-schema/parsers/literal.ts +1 -0
- package/src/_vendor/zod-to-json-schema/parsers/null.ts +1 -0
- package/src/_vendor/zod-to-json-schema/parsers/nullable.ts +4 -0
- package/src/_vendor/zod-to-json-schema/parsers/number.ts +2 -0
- package/src/_vendor/zod-to-json-schema/parsers/optional.ts +6 -7
- package/src/_vendor/zod-to-json-schema/parsers/record.ts +2 -0
- package/src/_vendor/zod-to-json-schema/parsers/string.ts +1 -0
- package/src/_vendor/zod-to-json-schema/parsers/union.ts +3 -0
- package/src/_vendor/zod-to-json-schema/util.ts +1 -0
- package/src/_vendor/zod-to-json-schema/zodToJsonSchema.ts +3 -1
- package/src/auth/subject-token-providers.ts +6 -1
- package/src/auth/workload-identity-auth.ts +10 -1
- package/src/auth/x509-transport.ts +13 -2
- package/src/azure.ts +3 -0
- package/src/bedrock.ts +23 -7
- package/src/beta/realtime/internal-base.ts +2 -0
- package/src/beta/realtime/websocket.ts +11 -1
- package/src/beta/realtime/ws.ts +3 -0
- package/src/client.ts +78 -22
- package/src/core/EventEmitter.ts +15 -0
- package/src/core/streaming.ts +30 -2
- package/src/helpers/audio.ts +2 -0
- package/src/helpers/standard-schema.ts +31 -19
- package/src/helpers/zod-v3-strict-schema.ts +8 -2
- package/src/helpers/zod.ts +32 -13
- package/src/internal/assistant-stream-delta.ts +7 -1
- package/src/internal/auth/x509-credential-options.ts +3 -0
- package/src/internal/auth/x509-token-exchange.ts +10 -1
- package/src/internal/auth/x509-transport-capability.ts +2 -1
- package/src/internal/auth/x509-workload-identity-auth.ts +13 -8
- package/src/internal/bedrock.ts +15 -0
- package/src/internal/decoders/line.ts +1 -0
- package/src/internal/parse.ts +1 -0
- package/src/internal/provider.ts +3 -0
- package/src/internal/qs/stringify.ts +3 -0
- package/src/internal/qs/utils.ts +14 -3
- package/src/internal/realtime-credentials.ts +1 -1
- package/src/internal/responses/response-accumulator.ts +34 -4
- package/src/internal/to-file.ts +1 -1
- package/src/internal/uploads.ts +11 -1
- package/src/internal/utils/abort.ts +116 -0
- package/src/internal/utils/bytes.ts +2 -0
- package/src/internal/utils/path.ts +2 -0
- package/src/internal/utils/sleep.ts +52 -1
- package/src/internal/ws-adapter-browser.ts +2 -0
- package/src/internal/ws.ts +66 -4
- package/src/lib/AbstractChatCompletionRunner.ts +40 -17
- package/src/lib/AssistantStream.ts +31 -20
- package/src/lib/ChatCompletionRunner.ts +1 -0
- package/src/lib/ChatCompletionStream.ts +81 -14
- package/src/lib/EventEmitter.ts +15 -0
- package/src/lib/EventStream.ts +93 -3
- package/src/lib/ResponsesParser.ts +5 -0
- package/src/lib/RunnableFunction.ts +4 -1
- package/src/lib/agents/agent-session-stream.ts +5 -3
- package/src/lib/embeddings.ts +3 -1
- package/src/lib/live/transcript-grouper.ts +4 -0
- package/src/lib/live/transcript-grouping.ts +59 -27
- package/src/lib/parser.ts +16 -2
- package/src/lib/responses/ResponseInputItems.ts +11 -0
- package/src/lib/responses/ResponseStream.ts +6 -3
- package/src/lib/transform.ts +70 -35
- package/src/lib/webrtc/connection.ts +5 -1
- package/src/lib/webrtc/data-channel.ts +7 -0
- package/src/lib/webrtc/subscriptions.ts +3 -0
- package/src/lib/webrtc/types.ts +1 -0
- package/src/providers/bedrock/aws.ts +5 -1
- package/src/realtime/internal-base.ts +2 -0
- package/src/realtime/websocket.ts +11 -1
- package/src/realtime/ws.ts +3 -0
- package/src/resources/beta/agents/agents.ts +2 -0
- package/src/resources/beta/beta.ts +2 -0
- package/src/resources/beta/index.ts +1 -0
- package/src/resources/beta/responses/index.ts +1 -0
- package/src/resources/beta/responses/internal-base.ts +24 -6
- package/src/resources/beta/responses/responses.ts +58 -0
- package/src/resources/beta/responses/ws-base.ts +117 -26
- package/src/resources/beta/responses/ws.ts +23 -6
- package/src/resources/live/forks/internal-base.ts +24 -5
- package/src/resources/live/forks/ws-base.ts +110 -21
- package/src/resources/live/forks/ws.ts +2 -0
- package/src/resources/live/internal-base.ts +24 -5
- package/src/resources/live/sideband/internal-base.ts +24 -5
- package/src/resources/live/sideband/ws-base.ts +110 -21
- package/src/resources/live/sideband/ws.ts +2 -0
- package/src/resources/live/ws-base.ts +110 -21
- package/src/resources/live/ws.ts +2 -0
- package/src/resources/responses/api.md +1 -0
- package/src/resources/responses/internal-base.ts +24 -6
- package/src/resources/responses/responses.ts +41 -0
- package/src/resources/responses/ws-base.ts +117 -26
- package/src/resources/responses/ws.ts +23 -6
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
|
@@ -37,6 +37,7 @@ function isRunningInBrowserOrBrowserWorker(): boolean {
|
|
|
37
37
|
return true;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
// SAFETY: RuntimeScope describes optional host capabilities; the following predicates verify their presence and value before use.
|
|
40
41
|
const scope = globalThis as RuntimeScope;
|
|
41
42
|
return (
|
|
42
43
|
typeof scope.WorkerGlobalScope === 'function' &&
|
|
@@ -55,6 +56,7 @@ function isRunningInBrowserOrBrowserWorker(): boolean {
|
|
|
55
56
|
|
|
56
57
|
/** Reports whether the runtime supports request headers in native WebSocket options. */
|
|
57
58
|
function supportsWebSocketRequestHeaders(): boolean {
|
|
59
|
+
// SAFETY: RuntimeScope describes optional host capabilities; the following predicates verify their presence and value before use.
|
|
58
60
|
const scope = globalThis as RuntimeScope;
|
|
59
61
|
if (
|
|
60
62
|
isRunningInBrowserOrBrowserWorker() ||
|
|
@@ -189,7 +191,9 @@ export class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
|
|
|
189
191
|
) {
|
|
190
192
|
super();
|
|
191
193
|
let apiKey = getRealtimeAPIKey(client, props.__apiKey);
|
|
194
|
+
// SAFETY: The supplied OpenAI client owns _options; these compatibility reads preserve its provider and browser-consent settings.
|
|
192
195
|
const hasProvider = typeof (client as any)?._options?.apiKey === 'function';
|
|
196
|
+
// SAFETY: The supplied OpenAI client owns _options; these compatibility reads preserve its provider and browser-consent settings.
|
|
193
197
|
const dangerouslyAllowBrowser =
|
|
194
198
|
props.dangerouslyAllowBrowser ??
|
|
195
199
|
(client as any)?._options?.dangerouslyAllowBrowser ??
|
|
@@ -265,7 +269,12 @@ export class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
|
|
|
265
269
|
});
|
|
266
270
|
|
|
267
271
|
this.socket.addEventListener('error', (event: any) => {
|
|
268
|
-
|
|
272
|
+
// Native ErrorEvents can carry an empty message while `error` still holds the failure.
|
|
273
|
+
const cause = event.error ?? null;
|
|
274
|
+
const message = [event.message, cause?.message].find(
|
|
275
|
+
(value) => typeof value === 'string' && value !== '',
|
|
276
|
+
);
|
|
277
|
+
this._onError(null, message ?? 'unknown error', cause);
|
|
269
278
|
});
|
|
270
279
|
}
|
|
271
280
|
|
|
@@ -329,6 +338,7 @@ export class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
|
|
|
329
338
|
return new OpenAIRealtimeWebSocket(
|
|
330
339
|
{
|
|
331
340
|
model: deploymentName,
|
|
341
|
+
// Preserve explicit browser consent as an own data property without invoking an inherited setter.
|
|
332
342
|
...(dangerouslyAllowBrowser === undefined ? {} : { dangerouslyAllowBrowser }),
|
|
333
343
|
__resolvedApiKey: isApiKeyProvider,
|
|
334
344
|
__apiKey: apiKey,
|
package/src/beta/realtime/ws.ts
CHANGED
|
@@ -60,6 +60,7 @@ export class OpenAIRealtimeWS extends OpenAIRealtimeEmitter {
|
|
|
60
60
|
super();
|
|
61
61
|
client ??= new OpenAI();
|
|
62
62
|
const apiKey = props.__apiKey === undefined ? client.apiKey : props.__apiKey;
|
|
63
|
+
// SAFETY: The supplied OpenAI client owns _options; this read detects its existing API-key provider without changing its public surface.
|
|
63
64
|
const hasProvider = typeof (client as any)?._options?.apiKey === 'function';
|
|
64
65
|
if (hasProvider && !props.__resolvedApiKey) {
|
|
65
66
|
throw new Error(
|
|
@@ -75,6 +76,7 @@ export class OpenAIRealtimeWS extends OpenAIRealtimeEmitter {
|
|
|
75
76
|
const headers = {
|
|
76
77
|
'User-Agent': `${client.constructor.name}/JS ${VERSION}`,
|
|
77
78
|
...props.options?.headers,
|
|
79
|
+
// A credential must be an own data property without invoking an inherited setter.
|
|
78
80
|
...(isAzure(client) && !props.__resolvedApiKey ? {} : { Authorization: `Bearer ${apiKey}` }),
|
|
79
81
|
'OpenAI-Beta': 'realtime=v1',
|
|
80
82
|
};
|
|
@@ -186,6 +188,7 @@ export class OpenAIRealtimeWS extends OpenAIRealtimeEmitter {
|
|
|
186
188
|
...props.options,
|
|
187
189
|
headers: {
|
|
188
190
|
...props.options?.headers,
|
|
191
|
+
// A credential must be an own data property without invoking an inherited setter.
|
|
189
192
|
...(isApiKeyProvider ? {} : { 'api-key': apiKey }),
|
|
190
193
|
},
|
|
191
194
|
},
|
package/src/client.ts
CHANGED
|
@@ -5,6 +5,7 @@ import type { HTTPMethod, PromiseOrValue, MergedRequestInit, FinalizedRequestIni
|
|
|
5
5
|
import { uuid4 } from './internal/utils/uuid';
|
|
6
6
|
import { validatePositiveInteger, isAbsoluteURL, safeJSON, hasOwn } from './internal/utils/values';
|
|
7
7
|
import { sleep } from './internal/utils/sleep';
|
|
8
|
+
import { addRequestAbortListener, retainRequestAbortCallback } from './internal/utils/abort';
|
|
8
9
|
export type { Logger, LogLevel } from './internal/utils/log';
|
|
9
10
|
import { castToError, isAbortError } from './internal/errors';
|
|
10
11
|
import { addRequestID, defaultParseResponse, type APIResponseProps } from './internal/parse';
|
|
@@ -47,6 +48,7 @@ import {
|
|
|
47
48
|
import * as Uploads from './core/uploads';
|
|
48
49
|
import * as API from './resources/index';
|
|
49
50
|
import { APIPromise } from './core/api-promise';
|
|
51
|
+
import { resolveRealtimeAPIKey } from './internal/realtime-credentials';
|
|
50
52
|
import {
|
|
51
53
|
Batch,
|
|
52
54
|
BatchCreateParams,
|
|
@@ -300,8 +302,9 @@ export interface ClientOptions {
|
|
|
300
302
|
*
|
|
301
303
|
* - Accepts either a static string or an async function that resolves to a string.
|
|
302
304
|
* - Defaults to process.env['OPENAI_API_KEY'].
|
|
303
|
-
* - When a function is provided, it is invoked
|
|
304
|
-
*
|
|
305
|
+
* - When a function is provided, it is invoked when building bearer authentication
|
|
306
|
+
* headers for each attempt, including retries and direct `buildRequest()` calls.
|
|
307
|
+
* Each invocation's result is used for its own request.
|
|
305
308
|
* - The function must return a non-empty string; otherwise an OpenAIError is thrown.
|
|
306
309
|
* - If the function throws, the error is wrapped in an OpenAIError with the original
|
|
307
310
|
* error available as `cause`.
|
|
@@ -816,10 +819,11 @@ export class OpenAI {
|
|
|
816
819
|
: await authentication.getToken();
|
|
817
820
|
return buildHeaders([{ Authorization: `Bearer ${token}` }]);
|
|
818
821
|
}
|
|
819
|
-
|
|
822
|
+
const { apiKey } = await resolveRealtimeAPIKey(this);
|
|
823
|
+
if (apiKey == null) {
|
|
820
824
|
return undefined;
|
|
821
825
|
}
|
|
822
|
-
return buildHeaders([{ Authorization: `Bearer ${
|
|
826
|
+
return buildHeaders([{ Authorization: `Bearer ${apiKey}` }]);
|
|
823
827
|
}
|
|
824
828
|
|
|
825
829
|
protected async adminAPIKeyAuth(opts: FinalRequestOptions): Promise<NullableHeaders | undefined> {
|
|
@@ -852,12 +856,16 @@ export class OpenAI {
|
|
|
852
856
|
return Errors.APIError.generate(status, normalizedError, message, headers);
|
|
853
857
|
}
|
|
854
858
|
|
|
859
|
+
_hasApiKeyProvider(): boolean {
|
|
860
|
+
return typeof this._options.apiKey === 'function';
|
|
861
|
+
}
|
|
862
|
+
|
|
855
863
|
/**
|
|
856
864
|
* Resolves a function-based API key and retains the resolved value on this client.
|
|
857
865
|
* Returns whether a provider was invoked. Internal callers can capture this
|
|
858
866
|
* invocation's key before another request updates the shared `apiKey` property.
|
|
859
867
|
* Overrides should forward `capture` or invoke it with their own resolved key
|
|
860
|
-
* to preserve
|
|
868
|
+
* to preserve invocation-local credentials in concurrent requests and Realtime factories.
|
|
861
869
|
* @internal
|
|
862
870
|
*/
|
|
863
871
|
async _callApiKey(capture?: (apiKey: string | null) => void): Promise<boolean> {
|
|
@@ -919,15 +927,11 @@ export class OpenAI {
|
|
|
919
927
|
|
|
920
928
|
/**
|
|
921
929
|
* Used as a callback for mutating the given `FinalRequestOptions` object.
|
|
930
|
+
* Function-based credentials are resolved later, when building authentication
|
|
931
|
+
* headers, including for direct `buildRequest()` calls. Overriding this hook
|
|
932
|
+
* does not bypass that resolution.
|
|
922
933
|
*/
|
|
923
|
-
protected async prepareOptions(options: FinalRequestOptions): Promise<void> {
|
|
924
|
-
if (this._provider) return;
|
|
925
|
-
|
|
926
|
-
const security = options.__security ?? { bearerAuth: true };
|
|
927
|
-
if (security.bearerAuth) {
|
|
928
|
-
await this._callApiKey();
|
|
929
|
-
}
|
|
930
|
-
}
|
|
934
|
+
protected async prepareOptions(options: FinalRequestOptions): Promise<void> {}
|
|
931
935
|
|
|
932
936
|
/**
|
|
933
937
|
* Used as a callback for mutating the given `RequestInit` object.
|
|
@@ -1108,6 +1112,8 @@ export class OpenAI {
|
|
|
1108
1112
|
props.options,
|
|
1109
1113
|
retriesRemaining,
|
|
1110
1114
|
props.retryOfRequestLogID ?? props.requestLogID,
|
|
1115
|
+
undefined,
|
|
1116
|
+
props.requestSignal,
|
|
1111
1117
|
);
|
|
1112
1118
|
Object.assign(props, next);
|
|
1113
1119
|
} finally {
|
|
@@ -1318,7 +1324,13 @@ export class OpenAI {
|
|
|
1318
1324
|
message: x509Authentication ? 'X.509 workload identity API connection failed.' : response.message,
|
|
1319
1325
|
}),
|
|
1320
1326
|
);
|
|
1321
|
-
return this.retryRequest(
|
|
1327
|
+
return this.retryRequest(
|
|
1328
|
+
options,
|
|
1329
|
+
retriesRemaining,
|
|
1330
|
+
retryOfRequestLogID ?? requestLogID,
|
|
1331
|
+
undefined,
|
|
1332
|
+
req.signal,
|
|
1333
|
+
);
|
|
1322
1334
|
}
|
|
1323
1335
|
const terminalMessage = hasStreamingBody
|
|
1324
1336
|
? 'error; streaming body cannot be retried'
|
|
@@ -1442,6 +1454,7 @@ export class OpenAI {
|
|
|
1442
1454
|
retriesRemaining,
|
|
1443
1455
|
retryOfRequestLogID ?? requestLogID,
|
|
1444
1456
|
response.headers,
|
|
1457
|
+
req.signal,
|
|
1445
1458
|
);
|
|
1446
1459
|
}
|
|
1447
1460
|
|
|
@@ -1497,7 +1510,15 @@ export class OpenAI {
|
|
|
1497
1510
|
helperMethod: options.__metadata?.['helperMethod'],
|
|
1498
1511
|
...(continueRequest ? { continueRequest } : {}),
|
|
1499
1512
|
});
|
|
1500
|
-
return {
|
|
1513
|
+
return {
|
|
1514
|
+
response,
|
|
1515
|
+
options,
|
|
1516
|
+
controller,
|
|
1517
|
+
requestSignal: req.signal,
|
|
1518
|
+
requestLogID,
|
|
1519
|
+
retryOfRequestLogID,
|
|
1520
|
+
startTime,
|
|
1521
|
+
};
|
|
1501
1522
|
}
|
|
1502
1523
|
|
|
1503
1524
|
getAPIList<Item, PageClass extends Pagination.AbstractPage<Item> = Pagination.AbstractPage<Item>>(
|
|
@@ -1574,7 +1595,8 @@ export class OpenAI {
|
|
|
1574
1595
|
const { signal, method, ...options } = init || {};
|
|
1575
1596
|
const abort = this._makeAbort(controller);
|
|
1576
1597
|
const composed = !!signal && composedCallerSignals.get(controller) === signal;
|
|
1577
|
-
|
|
1598
|
+
const cleanup =
|
|
1599
|
+
signal && !composed ? addRequestAbortListener(signal, abort, controller.signal) : undefined;
|
|
1578
1600
|
|
|
1579
1601
|
const timeout = setTimeout(abort, ms);
|
|
1580
1602
|
|
|
@@ -1596,9 +1618,13 @@ export class OpenAI {
|
|
|
1596
1618
|
|
|
1597
1619
|
try {
|
|
1598
1620
|
// use undefined this binding; fetch errors if bound to something else in browser/cloudflare
|
|
1599
|
-
|
|
1621
|
+
const response = await (this.#x509Fetch ?? this.fetch).call(undefined, url, fetchOptions);
|
|
1622
|
+
if (cleanup) {
|
|
1623
|
+
retainRequestAbortCallback(response.body ?? response, abort, controller.signal);
|
|
1624
|
+
}
|
|
1625
|
+
return response;
|
|
1600
1626
|
} catch (err) {
|
|
1601
|
-
|
|
1627
|
+
cleanup?.();
|
|
1602
1628
|
throw err;
|
|
1603
1629
|
} finally {
|
|
1604
1630
|
clearTimeout(timeout);
|
|
@@ -1633,6 +1659,7 @@ export class OpenAI {
|
|
|
1633
1659
|
retriesRemaining: number,
|
|
1634
1660
|
requestLogID: string,
|
|
1635
1661
|
responseHeaders?: Headers | undefined,
|
|
1662
|
+
requestSignal: AbortSignal | null | undefined = options.signal,
|
|
1636
1663
|
): Promise<APIResponseProps> {
|
|
1637
1664
|
let timeoutMillis: number | undefined;
|
|
1638
1665
|
|
|
@@ -1680,7 +1707,17 @@ export class OpenAI {
|
|
|
1680
1707
|
if (x509Authentication) {
|
|
1681
1708
|
await x509Authentication.waitForRetry(timeoutMillis, x509Authentication.effectiveSignal());
|
|
1682
1709
|
} else {
|
|
1683
|
-
|
|
1710
|
+
const retrySignals =
|
|
1711
|
+
requestSignal === options.signal ? [requestSignal] : [requestSignal, options.signal];
|
|
1712
|
+
try {
|
|
1713
|
+
await sleep(timeoutMillis, ...retrySignals);
|
|
1714
|
+
} catch (error) {
|
|
1715
|
+
const abortedSignal = retrySignals.find((signal) => signal?.aborted);
|
|
1716
|
+
if (abortedSignal) {
|
|
1717
|
+
throw this._makeUserAbortError(abortedSignal);
|
|
1718
|
+
}
|
|
1719
|
+
throw error;
|
|
1720
|
+
}
|
|
1684
1721
|
}
|
|
1685
1722
|
|
|
1686
1723
|
return this.makeRequest(options, retriesRemaining - 1, requestLogID);
|
|
@@ -1701,6 +1738,12 @@ export class OpenAI {
|
|
|
1701
1738
|
return sleepSeconds * jitter * 1000;
|
|
1702
1739
|
}
|
|
1703
1740
|
|
|
1741
|
+
/**
|
|
1742
|
+
* Builds a request, resolving callback credentials when constructing authentication
|
|
1743
|
+
* headers, after any subclass request-option rewrites. Calling this method directly
|
|
1744
|
+
* also resolves credentials. Complete replacement builders own authentication and
|
|
1745
|
+
* can call `this.authHeaders()` to resolve headers with request-local credentials.
|
|
1746
|
+
*/
|
|
1704
1747
|
async buildRequest(
|
|
1705
1748
|
inputOptions: FinalRequestOptions,
|
|
1706
1749
|
{ retryCount = 0 }: { retryCount?: number } = {},
|
|
@@ -1745,6 +1788,10 @@ export class OpenAI {
|
|
|
1745
1788
|
options.signal = snapshot.signal;
|
|
1746
1789
|
}
|
|
1747
1790
|
}
|
|
1791
|
+
const authenticationHeaders =
|
|
1792
|
+
this._provider || x509Authentication
|
|
1793
|
+
? undefined
|
|
1794
|
+
: await this.authHeaders(inputOptions, inputOptions.__security ?? { bearerAuth: true });
|
|
1748
1795
|
const { bodyHeaders, body, isStreamingBody } = this.buildBody({ options });
|
|
1749
1796
|
|
|
1750
1797
|
if (isStreamingBody) {
|
|
@@ -1759,6 +1806,7 @@ export class OpenAI {
|
|
|
1759
1806
|
options: inputOptions,
|
|
1760
1807
|
method,
|
|
1761
1808
|
bodyHeaders,
|
|
1809
|
+
authenticationHeaders,
|
|
1762
1810
|
retryCount,
|
|
1763
1811
|
x509Headers,
|
|
1764
1812
|
x509Timeout: explicitTimeout ? options.timeout : undefined,
|
|
@@ -1783,6 +1831,7 @@ export class OpenAI {
|
|
|
1783
1831
|
options,
|
|
1784
1832
|
method,
|
|
1785
1833
|
bodyHeaders,
|
|
1834
|
+
authenticationHeaders,
|
|
1786
1835
|
retryCount,
|
|
1787
1836
|
x509Headers,
|
|
1788
1837
|
x509Timeout,
|
|
@@ -1791,6 +1840,7 @@ export class OpenAI {
|
|
|
1791
1840
|
options: FinalRequestOptions;
|
|
1792
1841
|
method: HTTPMethod;
|
|
1793
1842
|
bodyHeaders: HeadersLike;
|
|
1843
|
+
authenticationHeaders: NullableHeaders | undefined;
|
|
1794
1844
|
retryCount: number;
|
|
1795
1845
|
x509Headers?: { defaultHeaders: NullableHeaders; requestHeaders: NullableHeaders } | undefined;
|
|
1796
1846
|
x509Timeout: number | undefined;
|
|
@@ -1816,9 +1866,10 @@ export class OpenAI {
|
|
|
1816
1866
|
'OpenAI-Organization': x509Tenant ? x509Tenant.organization : this.organization,
|
|
1817
1867
|
'OpenAI-Project': x509Tenant ? x509Tenant.project : this.project,
|
|
1818
1868
|
},
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1869
|
+
// X.509 owns streaming uploads before authentication so it can retire them on failure.
|
|
1870
|
+
this.#x509Authentication && !this.#x509Authentication.isPlanningRequest()
|
|
1871
|
+
? await this.authHeaders(options, options.__security ?? { bearerAuth: true })
|
|
1872
|
+
: authenticationHeaders,
|
|
1822
1873
|
x509Headers?.defaultHeaders ?? this._options.defaultHeaders,
|
|
1823
1874
|
bodyHeaders,
|
|
1824
1875
|
x509Headers?.requestHeaders ?? options.headers,
|
|
@@ -2024,6 +2075,11 @@ OpenAI.Evals = Evals;
|
|
|
2024
2075
|
OpenAI.Containers = Containers;
|
|
2025
2076
|
OpenAI.Skills = Skills;
|
|
2026
2077
|
OpenAI.Videos = Videos;
|
|
2078
|
+
OpenAI.ConversationCursorPage = Pagination.ConversationCursorPage;
|
|
2079
|
+
OpenAI.CursorPage = Pagination.CursorPage;
|
|
2080
|
+
OpenAI.NextCursorPage = Pagination.NextCursorPage;
|
|
2081
|
+
OpenAI.Page = Pagination.Page;
|
|
2082
|
+
OpenAI.TokenPage = Pagination.TokenPage;
|
|
2027
2083
|
|
|
2028
2084
|
const composedCallerSignals = new WeakMap<AbortController, AbortSignal>();
|
|
2029
2085
|
|
package/src/core/EventEmitter.ts
CHANGED
|
@@ -54,12 +54,14 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
|
|
|
54
54
|
return this;
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
// SAFETY: Listener functions are object identities used as WeakMap keys; registration and removal use the same function instance.
|
|
57
58
|
const emittedRegistration = this.#emittedListenerRegistrations.get(listener as object);
|
|
58
59
|
if (
|
|
59
60
|
emittedRegistration?.event === event &&
|
|
60
61
|
!emittedRegistration.registration.removed &&
|
|
61
62
|
!emittedRegistration.registration.detached
|
|
62
63
|
) {
|
|
64
|
+
// SAFETY: The stored registration event was compared with this event above, preserving the event/listener type correlation.
|
|
63
65
|
this.#removeEmittedListener(
|
|
64
66
|
event,
|
|
65
67
|
emittedRegistration.registration as EventListeners<EventTypes, Event>[number],
|
|
@@ -101,6 +103,7 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
|
|
|
101
103
|
registration?.listener === listener &&
|
|
102
104
|
registration.once
|
|
103
105
|
) {
|
|
106
|
+
// SAFETY: Listener functions are object identities used as WeakMap keys; registration and removal use the same function instance.
|
|
104
107
|
this.#emittedListenerRegistrations.set(listener as object, { event, registration });
|
|
105
108
|
}
|
|
106
109
|
}
|
|
@@ -114,6 +117,7 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
|
|
|
114
117
|
}
|
|
115
118
|
|
|
116
119
|
registration.removed = true;
|
|
120
|
+
// SAFETY: Listener functions are object identities used as WeakMap keys; registration and removal use the same function instance.
|
|
117
121
|
this.#emittedListenerRegistrations.delete(registration.listener as object);
|
|
118
122
|
this.#pendingListenerCleanup.add(event);
|
|
119
123
|
if (this.#listenerDispatchDepth === 0) {
|
|
@@ -123,9 +127,11 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
|
|
|
123
127
|
|
|
124
128
|
#cleanupEmittedListeners(): void {
|
|
125
129
|
for (const event of this.#pendingListenerCleanup) {
|
|
130
|
+
// SAFETY: Pending cleanup keys are added only from registered EventTypes events; the key retains its event-map membership.
|
|
126
131
|
const eventType = event as keyof EventTypes;
|
|
127
132
|
const listeners = this.#listeners[eventType];
|
|
128
133
|
if (listeners) {
|
|
134
|
+
// SAFETY: Filtering only removes registrations from the same event bucket and preserves the listener signatures for that event.
|
|
129
135
|
this.#listeners[eventType] = listeners.filter((listener) => !listener.removed) as any;
|
|
130
136
|
}
|
|
131
137
|
}
|
|
@@ -150,21 +156,27 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
|
|
|
150
156
|
): Promise<EmittedEventResult<EventParameters<EventTypes, Event>>> {
|
|
151
157
|
return new Promise((resolve, reject) => {
|
|
152
158
|
const listeners = {
|
|
159
|
+
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- Failures and rejection reasons can be arbitrary JavaScript values; preserve them until inspection or forwarding.
|
|
153
160
|
onError: (error: unknown) => {
|
|
161
|
+
// SAFETY: This callback is paired with the same event when registered and removed; its variadic body forwards the event tuple or captured error.
|
|
154
162
|
this.off(event, listeners.onEvent as any);
|
|
155
163
|
reject(error);
|
|
156
164
|
},
|
|
157
165
|
onEvent: (...values: unknown[]) => {
|
|
158
166
|
if (event !== 'error') {
|
|
167
|
+
// SAFETY: This callback is paired with the same event when registered and removed; its variadic body forwards the event tuple or captured error.
|
|
159
168
|
this.off('error', listeners.onError as any);
|
|
160
169
|
}
|
|
170
|
+
// SAFETY: The emitted API returns the sole argument or the full tuple according to its existing EventTypes-dependent result contract.
|
|
161
171
|
resolve((values.length > 1 ? values : values[0]) as any);
|
|
162
172
|
},
|
|
163
173
|
};
|
|
164
174
|
|
|
165
175
|
if (event !== 'error') {
|
|
176
|
+
// SAFETY: This callback is paired with the same event when registered and removed; its variadic body forwards the event tuple or captured error.
|
|
166
177
|
this.#onceForEmitted('error', listeners.onError as any);
|
|
167
178
|
}
|
|
179
|
+
// SAFETY: This callback is paired with the same event when registered and removed; its variadic body forwards the event tuple or captured error.
|
|
168
180
|
this.#onceForEmitted(event, listeners.onEvent as any);
|
|
169
181
|
});
|
|
170
182
|
}
|
|
@@ -176,6 +188,7 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
|
|
|
176
188
|
) {
|
|
177
189
|
const listeners: EventListeners<EventTypes, Event> | undefined = this.#listeners[event];
|
|
178
190
|
if (listeners) {
|
|
191
|
+
// SAFETY: Filtering only removes registrations from the same event bucket and preserves the listener signatures for that event.
|
|
179
192
|
this.#listeners[event] = listeners.filter((listener) => {
|
|
180
193
|
if (listener.once) {
|
|
181
194
|
listener.detached = true;
|
|
@@ -186,10 +199,12 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
|
|
|
186
199
|
let firstListenerError: unknown;
|
|
187
200
|
this.#listenerDispatchDepth += 1;
|
|
188
201
|
try {
|
|
202
|
+
// SAFETY: The listener bucket and argument tuple come from the same EventTypes key; this bridges TypeScript generic indexed-access correlation.
|
|
189
203
|
for (const registration of listeners as any) {
|
|
190
204
|
if (!registration.removed) {
|
|
191
205
|
try {
|
|
192
206
|
const { listener } = registration;
|
|
207
|
+
// SAFETY: The listener bucket and argument tuple come from the same EventTypes key; this bridges TypeScript generic indexed-access correlation.
|
|
193
208
|
listener(...(args as any));
|
|
194
209
|
} catch (error) {
|
|
195
210
|
if (!listenerThrew) {
|
package/src/core/streaming.ts
CHANGED
|
@@ -139,7 +139,7 @@ export class Stream<Item> implements AsyncIterable<Item> {
|
|
|
139
139
|
let data;
|
|
140
140
|
|
|
141
141
|
try {
|
|
142
|
-
data = JSON.parse(sse.data)
|
|
142
|
+
data = JSON.parse(sse.data);
|
|
143
143
|
} catch {
|
|
144
144
|
logger.error(`Could not parse message into JSON:`);
|
|
145
145
|
logger.error(`From chunk:`);
|
|
@@ -164,6 +164,7 @@ export class Stream<Item> implements AsyncIterable<Item> {
|
|
|
164
164
|
logger.error(`From chunk:`);
|
|
165
165
|
throw new SyntaxError('Error reading response: malformed server-sent event JSON.');
|
|
166
166
|
}
|
|
167
|
+
// SAFETY: Named SSE events use the public stream's event/data envelope; Item is the caller-selected API event contract.
|
|
167
168
|
yield { event: sse.event, data } as any;
|
|
168
169
|
}
|
|
169
170
|
}
|
|
@@ -264,6 +265,7 @@ export class Stream<Item> implements AsyncIterable<Item> {
|
|
|
264
265
|
if (line) {
|
|
265
266
|
let data: Item;
|
|
266
267
|
try {
|
|
268
|
+
// SAFETY: Item is the caller's NDJSON response contract; JSON syntax is parsed here without a per-resource runtime schema.
|
|
267
269
|
data = JSON.parse(line) as Item;
|
|
268
270
|
} catch (error) {
|
|
269
271
|
if (error instanceof SyntaxError) {
|
|
@@ -352,10 +354,13 @@ export class Stream<Item> implements AsyncIterable<Item> {
|
|
|
352
354
|
* which can be turned back into a Stream with `Stream.fromReadableStream()`.
|
|
353
355
|
* Canceling a response-backed readable aborts its request. Canceling a tee
|
|
354
356
|
* branch discards its buffered events and leaves sibling consumers running.
|
|
357
|
+
* Read or serialization failures also release the iterator without replacing the original error.
|
|
355
358
|
*/
|
|
356
359
|
toReadableStream(): ReadableStream {
|
|
357
360
|
const { controller } = this;
|
|
358
361
|
let iter: AsyncIterator<Item>;
|
|
362
|
+
let cancellation: Promise<void> | undefined;
|
|
363
|
+
const cancel = () => (cancellation ??= this.#cancelIterator(iter, controller));
|
|
359
364
|
|
|
360
365
|
return makeReadableStream({
|
|
361
366
|
start: async () => {
|
|
@@ -373,9 +378,12 @@ export class Stream<Item> implements AsyncIterable<Item> {
|
|
|
373
378
|
ctrl.enqueue(bytes);
|
|
374
379
|
} catch (err) {
|
|
375
380
|
ctrl.error(err);
|
|
381
|
+
// An errored readable never invokes its cancel hook. Release the source ourselves,
|
|
382
|
+
// without letting failed or stalled cleanup replace the read/serialization error.
|
|
383
|
+
void cancel().catch(() => undefined);
|
|
376
384
|
}
|
|
377
385
|
},
|
|
378
|
-
cancel
|
|
386
|
+
cancel,
|
|
379
387
|
});
|
|
380
388
|
}
|
|
381
389
|
|
|
@@ -385,6 +393,7 @@ export class Stream<Item> implements AsyncIterable<Item> {
|
|
|
385
393
|
if (!this.#isTeeBranch) {
|
|
386
394
|
controller.abort();
|
|
387
395
|
}
|
|
396
|
+
// oxlint-disable-next-line anti-slop/no-reflect-apply -- Invoke the captured iterator method with its receiver even if a caller-supplied function shadows call.
|
|
388
397
|
await Reflect.apply(returnMethod, iterator, []);
|
|
389
398
|
}
|
|
390
399
|
}
|
|
@@ -524,6 +533,7 @@ export async function* _iterSSEMessages(
|
|
|
524
533
|
): AsyncGenerator<ServerSentEvent, void, unknown> {
|
|
525
534
|
if (!response.body) {
|
|
526
535
|
controller.abort();
|
|
536
|
+
// SAFETY: navigator is optional across SDK runtimes; this compatibility branch checks its presence before identifying React Native.
|
|
527
537
|
if (
|
|
528
538
|
(globalThis as any).navigator !== undefined &&
|
|
529
539
|
(globalThis as any).navigator.product === 'ReactNative'
|
|
@@ -569,6 +579,15 @@ export async function* _iterSSEMessages(
|
|
|
569
579
|
yield sse;
|
|
570
580
|
}
|
|
571
581
|
}
|
|
582
|
+
// Servers sometimes omit the trailing blank line that normally
|
|
583
|
+
// terminates the last event. Flush any in-progress event exactly once.
|
|
584
|
+
if (signal.aborted) {
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
const pending = sseDecoder.flush();
|
|
588
|
+
if (pending) {
|
|
589
|
+
yield pending;
|
|
590
|
+
}
|
|
572
591
|
} catch (error) {
|
|
573
592
|
failed = true;
|
|
574
593
|
if (!signal.aborted || (!isAbortError(error) && error !== signal.reason)) {
|
|
@@ -699,6 +718,15 @@ class SSEDecoder {
|
|
|
699
718
|
|
|
700
719
|
return null;
|
|
701
720
|
}
|
|
721
|
+
|
|
722
|
+
/**
|
|
723
|
+
* Emits a pending event at EOF when the stream omitted the trailing blank
|
|
724
|
+
* line. Returns `null` when no event is in progress so a record that already
|
|
725
|
+
* ended with a blank line is not delivered twice.
|
|
726
|
+
*/
|
|
727
|
+
flush(): ServerSentEvent | null {
|
|
728
|
+
return this.decode('');
|
|
729
|
+
}
|
|
702
730
|
}
|
|
703
731
|
|
|
704
732
|
function partition(str: string, delimiter: string): [string, string, string] {
|
package/src/helpers/audio.ts
CHANGED
|
@@ -47,11 +47,13 @@ async function nodejsPlayAudio(stream: NodeJS.ReadableStream | Response | File):
|
|
|
47
47
|
try {
|
|
48
48
|
let source: NodeJS.ReadableStream;
|
|
49
49
|
if (isResponse(stream)) {
|
|
50
|
+
// SAFETY: Fetch implementations may expose a web or Node response body; the following pipe check selects the matching stream adapter.
|
|
50
51
|
const body = stream.body as NodeReadableStream | NodeJS.ReadableStream | null;
|
|
51
52
|
if (!body) {
|
|
52
53
|
throw new Error('Cannot play audio from a response without a body');
|
|
53
54
|
}
|
|
54
55
|
|
|
56
|
+
// SAFETY: The preceding branch handled Node pipe streams; the remaining response body follows the web ReadableStream contract consumed by fromWeb.
|
|
55
57
|
source =
|
|
56
58
|
'pipe' in body && typeof body.pipe === 'function'
|
|
57
59
|
? body
|