openai 7.16.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 +28 -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 +5 -0
- package/bedrock.js.map +1 -1
- package/bedrock.mjs +5 -0
- 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 +1 -0
- package/client.d.mts.map +1 -1
- package/client.d.ts +1 -0
- package/client.d.ts.map +1 -1
- package/client.js +27 -6
- package/client.js.map +1 -1
- package/client.mjs +27 -6
- 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/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.map +1 -1
- package/internal/utils/abort.d.ts.map +1 -1
- package/internal/utils/abort.js +9 -2
- package/internal/utils/abort.js.map +1 -1
- package/internal/utils/abort.mjs +9 -2
- package/internal/utils/abort.mjs.map +1 -1
- 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 +9 -0
- package/internal/ws.d.mts.map +1 -1
- package/internal/ws.d.ts +9 -0
- package/internal/ws.d.ts.map +1 -1
- package/internal/ws.js +36 -4
- package/internal/ws.js.map +1 -1
- package/internal/ws.mjs +35 -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/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 -12
- package/resources/beta/responses/internal-base.js.map +1 -1
- package/resources/beta/responses/internal-base.mjs +21 -12
- 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 +5 -1
- package/resources/beta/responses/ws-base.d.mts.map +1 -1
- package/resources/beta/responses/ws-base.d.ts +5 -1
- package/resources/beta/responses/ws-base.d.ts.map +1 -1
- package/resources/beta/responses/ws-base.js +2 -4
- package/resources/beta/responses/ws-base.js.map +1 -1
- package/resources/beta/responses/ws-base.mjs +2 -4
- package/resources/beta/responses/ws-base.mjs.map +1 -1
- package/resources/beta/responses/ws.d.mts +2 -0
- package/resources/beta/responses/ws.d.mts.map +1 -1
- package/resources/beta/responses/ws.d.ts +2 -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/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/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 -12
- package/resources/responses/internal-base.js.map +1 -1
- package/resources/responses/internal-base.mjs +21 -12
- 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 +5 -1
- package/resources/responses/ws-base.d.mts.map +1 -1
- package/resources/responses/ws-base.d.ts +5 -1
- package/resources/responses/ws-base.d.ts.map +1 -1
- package/resources/responses/ws-base.js +2 -4
- package/resources/responses/ws-base.js.map +1 -1
- package/resources/responses/ws-base.mjs +2 -4
- package/resources/responses/ws-base.mjs.map +1 -1
- package/resources/responses/ws.d.mts +2 -0
- package/resources/responses/ws.d.mts.map +1 -1
- package/resources/responses/ws.d.ts +2 -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 +5 -0
- 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 +35 -3
- 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/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 +7 -2
- 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 +44 -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/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 -11
- package/src/resources/beta/responses/responses.ts +58 -0
- package/src/resources/beta/responses/ws-base.ts +7 -5
- package/src/resources/beta/responses/ws.ts +21 -6
- package/src/resources/live/forks/internal-base.ts +24 -5
- package/src/resources/live/internal-base.ts +24 -5
- package/src/resources/live/sideband/internal-base.ts +24 -5
- package/src/resources/responses/api.md +1 -0
- package/src/resources/responses/internal-base.ts +24 -11
- package/src/resources/responses/responses.ts +41 -0
- package/src/resources/responses/ws-base.ts +7 -5
- package/src/resources/responses/ws.ts +21 -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
|
@@ -53,6 +53,7 @@ function calculateRefreshAt(
|
|
|
53
53
|
const NATIVE_RESPONSE_PROTOTYPE = Response.prototype;
|
|
54
54
|
const READ_NATIVE_RESPONSE_BODY = NATIVE_RESPONSE_PROTOTYPE.arrayBuffer;
|
|
55
55
|
|
|
56
|
+
// oxlint-disable-next-line anti-slop/no-object-parameters -- Custom fetch response prototypes are verified through descriptors before trusting their native contract.
|
|
56
57
|
function isResponsePrototype(response: Response, prototype: object): boolean {
|
|
57
58
|
const constructor = Object.getOwnPropertyDescriptor(prototype, 'constructor')?.value;
|
|
58
59
|
if (
|
|
@@ -73,6 +74,7 @@ function isResponsePrototype(response: Response, prototype: object): boolean {
|
|
|
73
74
|
);
|
|
74
75
|
}
|
|
75
76
|
|
|
77
|
+
// oxlint-disable-next-line anti-slop/no-object-parameters -- The prototype walk compares untrusted cross-realm objects by identity and descriptor metadata.
|
|
76
78
|
function isResponseBodyPrototype(prototype: object, responsePrototype: object | null): boolean {
|
|
77
79
|
if (prototype === responsePrototype) {
|
|
78
80
|
return true;
|
|
@@ -89,10 +91,12 @@ function isResponseBodyPrototype(prototype: object, responsePrototype: object |
|
|
|
89
91
|
}
|
|
90
92
|
|
|
91
93
|
function decodeNativeResponseBody(body: ArrayBuffer): string {
|
|
94
|
+
// SAFETY: Bun is an optional runtime global; its version is checked before selecting Bun-specific decoding behavior.
|
|
92
95
|
const scope = globalThis as typeof globalThis & { Bun?: { version?: unknown } };
|
|
93
96
|
return new TextDecoder('utf-8', { ignoreBOM: typeof scope.Bun?.version === 'string' }).decode(body);
|
|
94
97
|
}
|
|
95
98
|
|
|
99
|
+
// oxlint-disable-next-line anti-slop/no-unknown-returns -- Decoded token JSON remains untrusted until the caller validates its fields.
|
|
96
100
|
async function parseOAuthTokenResponse(response: Response): Promise<unknown> {
|
|
97
101
|
let readText: ((this: Response) => Promise<string>) | undefined;
|
|
98
102
|
let responsePrototype: object | null = null;
|
|
@@ -140,6 +144,7 @@ async function parseOAuthTokenResponse(response: Response): Promise<unknown> {
|
|
|
140
144
|
}
|
|
141
145
|
|
|
142
146
|
function isUnsafeAccessToken(accessToken: string): boolean {
|
|
147
|
+
// SAFETY: Bun is an optional runtime global; its version is checked before selecting Bun-specific decoding behavior.
|
|
143
148
|
const scope = globalThis as typeof globalThis & { Bun?: { version?: unknown } };
|
|
144
149
|
if (typeof scope.Bun?.version === 'string') {
|
|
145
150
|
return /[^\t\u0020-\u007E]|^[\t ]|[\t ]$/u.test(accessToken);
|
|
@@ -173,7 +178,9 @@ export class WorkloadIdentityAuth {
|
|
|
173
178
|
this.config = {
|
|
174
179
|
identityProviderId,
|
|
175
180
|
serviceAccountId,
|
|
181
|
+
// Spread creates an own data property without invoking inherited setters or changing the object prototype.
|
|
176
182
|
...(clientId === undefined ? {} : { clientId }),
|
|
183
|
+
// Spread creates an own data property without invoking inherited setters or changing the object prototype.
|
|
177
184
|
...(refreshBufferSeconds === undefined ? {} : { refreshBufferSeconds }),
|
|
178
185
|
provider: {
|
|
179
186
|
tokenType: provider.tokenType,
|
|
@@ -226,6 +233,7 @@ export class WorkloadIdentityAuth {
|
|
|
226
233
|
|
|
227
234
|
private async refreshToken(generation: number): Promise<string> {
|
|
228
235
|
const subjectToken = await this.config.provider.getToken();
|
|
236
|
+
// oxlint-disable-next-line anti-slop/no-known-value-widening -- The token-exchange field dictionary gains an optional client_id after its required fields are initialized.
|
|
229
237
|
const body: Record<string, string> = {
|
|
230
238
|
grant_type: TOKEN_EXCHANGE_GRANT_TYPE,
|
|
231
239
|
subject_token: subjectToken,
|
|
@@ -260,7 +268,7 @@ export class WorkloadIdentityAuth {
|
|
|
260
268
|
}
|
|
261
269
|
|
|
262
270
|
if (response.status === 400 || response.status === 401 || response.status === 403) {
|
|
263
|
-
throw new OAuthError(response.status
|
|
271
|
+
throw new OAuthError(response.status, body, response.headers);
|
|
264
272
|
}
|
|
265
273
|
throw APIError.generate(
|
|
266
274
|
response.status,
|
|
@@ -283,6 +291,7 @@ export class WorkloadIdentityAuth {
|
|
|
283
291
|
throw new OpenAIError("Token exchange response missing 'access_token' field");
|
|
284
292
|
}
|
|
285
293
|
|
|
294
|
+
// SAFETY: The token response was checked as an object with a valid access token; expires_in is still validated by calculateExpiresAt.
|
|
286
295
|
const expiresIn = (tokenResponse as Partial<TokenExchangeResponse>).expires_in ?? 3600;
|
|
287
296
|
const expiresAt = calculateExpiresAt(expiresIn, exchangeStartedAt);
|
|
288
297
|
|
|
@@ -82,6 +82,7 @@ function safeOptionRecord(
|
|
|
82
82
|
if (prototype !== Object.prototype && prototype !== null) {
|
|
83
83
|
throw new Error(`X.509 ${label} options must have only own plain data properties.`);
|
|
84
84
|
}
|
|
85
|
+
// SAFETY: The snapshot starts empty with no prototype; only checked own data properties are copied into it below.
|
|
85
86
|
const snapshot = Object.create(null) as Record<string, unknown>;
|
|
86
87
|
for (const name of Reflect.ownKeys(value)) {
|
|
87
88
|
if (typeof name !== 'string' || !allowed.has(name)) {
|
|
@@ -179,6 +180,7 @@ function validatedCredentialOptions(options: X509CredentialOptions): ValidatedX5
|
|
|
179
180
|
const leaf = new X509Certificate(certificateChain);
|
|
180
181
|
const privateKey = createPrivateKey({
|
|
181
182
|
key: privateKeyPEM,
|
|
183
|
+
// Create an own data property so an inherited setter cannot intercept the private-key passphrase.
|
|
182
184
|
...(passphrase === undefined ? {} : { passphrase }),
|
|
183
185
|
});
|
|
184
186
|
if (!leaf.checkPrivateKey(privateKey)) {
|
|
@@ -239,6 +241,7 @@ function credentialDispatcher(
|
|
|
239
241
|
requestTls: VerifiedX509TLSOptions,
|
|
240
242
|
): { dispatcher: Agent | ProxyAgent; proxy: X509ProxyMode } {
|
|
241
243
|
if (proxyOptionsInput === undefined) {
|
|
244
|
+
// oxlint-disable-next-line anti-slop/no-known-value-widening -- The dispatcher owner returns one contract for direct Agents and both supported CONNECT proxy modes.
|
|
242
245
|
return { dispatcher: new Agent({ connect: requestTls }), proxy: 'direct' };
|
|
243
246
|
}
|
|
244
247
|
|
|
@@ -262,16 +265,20 @@ function credentialDispatcher(
|
|
|
262
265
|
}
|
|
263
266
|
const auth = proxyAuthentication(url);
|
|
264
267
|
|
|
268
|
+
// oxlint-disable-next-line anti-slop/no-known-value-widening -- The declared transport contract preserves the same dispatcher and proxy types across both construction paths.
|
|
265
269
|
return {
|
|
266
270
|
proxy,
|
|
267
271
|
dispatcher: new ProxyAgent({
|
|
268
272
|
uri: url.href,
|
|
273
|
+
// Define proxy credentials as own data without invoking inherited setters.
|
|
269
274
|
...(auth === undefined ? {} : { auth }),
|
|
270
275
|
requestTls,
|
|
276
|
+
// Keep the optional proxy TLS configuration as an own data property.
|
|
271
277
|
...(proxy === 'https-connect'
|
|
272
278
|
? {
|
|
273
279
|
proxyTls: {
|
|
274
280
|
rejectUnauthorized: true,
|
|
281
|
+
// Define explicit proxy trust roots as own data without invoking inherited setters.
|
|
275
282
|
...(proxyCA === undefined ? {} : { ca: proxyCA }),
|
|
276
283
|
},
|
|
277
284
|
}
|
|
@@ -300,6 +307,7 @@ export function createX509Transport(options: X509TransportOptions): X509Transpor
|
|
|
300
307
|
transport: capability,
|
|
301
308
|
identityProviderId,
|
|
302
309
|
serviceAccountId,
|
|
310
|
+
// Preserve the cancellation signal as own data without invoking inherited setters.
|
|
303
311
|
...(signal ? { signal } : {}),
|
|
304
312
|
}),
|
|
305
313
|
run: (operation) =>
|
|
@@ -315,11 +323,13 @@ export function createX509Transport(options: X509TransportOptions): X509Transpor
|
|
|
315
323
|
export function fromX509(options: X509CredentialOptions): X509Credential {
|
|
316
324
|
const configured = validatedCredentialOptions(options);
|
|
317
325
|
|
|
318
|
-
const requestTls = {
|
|
326
|
+
const requestTls: VerifiedX509TLSOptions = {
|
|
319
327
|
cert: configured.certificateChain,
|
|
320
328
|
key: configured.privateKey,
|
|
321
|
-
rejectUnauthorized: true
|
|
329
|
+
rejectUnauthorized: true,
|
|
330
|
+
// Define the TLS passphrase as own data so inherited setters cannot intercept it.
|
|
322
331
|
...(configured.passphrase === undefined ? {} : { passphrase: configured.passphrase }),
|
|
332
|
+
// Define explicit workload trust roots as own data without invoking inherited setters.
|
|
323
333
|
...(configured.ca === undefined ? {} : { ca: configured.ca }),
|
|
324
334
|
};
|
|
325
335
|
const { dispatcher, proxy } = credentialDispatcher(configured.proxy, requestTls);
|
|
@@ -335,6 +345,7 @@ export function fromX509(options: X509CredentialOptions): X509Credential {
|
|
|
335
345
|
type: 'x509',
|
|
336
346
|
identityProviderId: configured.identityProviderId,
|
|
337
347
|
serviceAccountId: configured.serviceAccountId,
|
|
348
|
+
// Preserve the optional refresh setting as own data without invoking inherited setters.
|
|
338
349
|
...(configured.refreshBufferSeconds === undefined
|
|
339
350
|
? {}
|
|
340
351
|
: { refreshBufferSeconds: configured.refreshBufferSeconds }),
|
package/src/azure.ts
CHANGED
|
@@ -101,6 +101,7 @@ export class AzureOpenAI extends OpenAI {
|
|
|
101
101
|
);
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Azure accepts JavaScript credential configuration; distinguish static keys from callable token providers.
|
|
104
105
|
if (typeof azureADTokenProvider === 'function') {
|
|
105
106
|
dangerouslyAllowBrowser ??= true;
|
|
106
107
|
}
|
|
@@ -143,6 +144,7 @@ export class AzureOpenAI extends OpenAI {
|
|
|
143
144
|
apiKey: azureADTokenProvider ?? apiKey,
|
|
144
145
|
baseURL,
|
|
145
146
|
...opts,
|
|
147
|
+
// Spread creates an own data property without invoking inherited setters or changing the object prototype.
|
|
146
148
|
...(dangerouslyAllowBrowser === undefined ? {} : { dangerouslyAllowBrowser }),
|
|
147
149
|
});
|
|
148
150
|
|
|
@@ -224,6 +226,7 @@ export class AzureOpenAI extends OpenAI {
|
|
|
224
226
|
schemes?: { bearerAuth?: boolean; adminAPIKeyAuth?: boolean },
|
|
225
227
|
): Promise<NullableHeaders | undefined> {
|
|
226
228
|
const security = schemes ?? { bearerAuth: true, adminAPIKeyAuth: true };
|
|
229
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Azure accepts JavaScript credential configuration; distinguish static keys from callable token providers.
|
|
227
230
|
if (security.bearerAuth && typeof this._options.apiKey === 'string') {
|
|
228
231
|
return buildHeaders([{ 'api-key': this.apiKey }]);
|
|
229
232
|
}
|
package/src/bedrock.ts
CHANGED
|
@@ -112,6 +112,7 @@ function addBedrockOutputText<ResponseT extends ResponsesAPI.Response>(response:
|
|
|
112
112
|
function restoreBedrockStreamOutputText(responses: API.Responses): API.Responses {
|
|
113
113
|
const stream = responses.stream.bind(responses);
|
|
114
114
|
|
|
115
|
+
// SAFETY: The wrapper forwards the original stream parameters and preserves its generic result, only repairing the final response's output_text property.
|
|
115
116
|
responses.stream = ((body: ResponseStreamParams, options?: RequestOptions) => {
|
|
116
117
|
const responseStream = stream(body, options);
|
|
117
118
|
const finalResponse = responseStream.finalResponse.bind(responseStream);
|
|
@@ -162,6 +163,8 @@ export class BedrockOpenAI extends OpenAI {
|
|
|
162
163
|
apiKey = readEnv('AWS_BEARER_TOKEN_BEDROCK') ?? null;
|
|
163
164
|
}
|
|
164
165
|
|
|
166
|
+
// SAFETY: The widening keeps a runtime guard for JavaScript callers that supply an API-key function despite the declared string contract.
|
|
167
|
+
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Reject a JavaScript function supplied as a static Bedrock API key before it can become a credential.
|
|
165
168
|
if (typeof (apiKey as unknown) === 'function') {
|
|
166
169
|
throw new Errors.OpenAIError(
|
|
167
170
|
'Pass refreshable Bedrock credentials via `bedrockTokenProvider`, not `apiKey`.',
|
|
@@ -281,8 +284,10 @@ export class BedrockOpenAI extends OpenAI {
|
|
|
281
284
|
const bedrockTokenProvider =
|
|
282
285
|
options.apiKey === undefined ? (options.bedrockTokenProvider ?? this.bedrockTokenProvider) : undefined;
|
|
283
286
|
|
|
287
|
+
// SAFETY: Bedrock options extend the base client options; forwarding them preserves the subclass's existing withOptions construction behavior.
|
|
284
288
|
return super.withOptions({
|
|
285
289
|
...options,
|
|
290
|
+
// Spread creates an own data property without invoking inherited setters or changing the object prototype.
|
|
286
291
|
...(bedrockTokenProvider ? { apiKey: undefined, bedrockTokenProvider } : {}),
|
|
287
292
|
} as Partial<ClientOptions>);
|
|
288
293
|
}
|
|
@@ -12,6 +12,7 @@ import { assertX509WebSocketSupported } from '../../internal/auth/x509-workload-
|
|
|
12
12
|
/** Parses frame data without exposing malformed payloads through JSON syntax errors. */
|
|
13
13
|
export function parseRealtimeEvent(data: string): RealtimeServerEvent {
|
|
14
14
|
try {
|
|
15
|
+
// SAFETY: RealtimeServerEvent is the API wire contract; JSON syntax is checked here while future event types remain accepted at runtime.
|
|
15
16
|
return JSON.parse(data) as RealtimeServerEvent;
|
|
16
17
|
} catch (error) {
|
|
17
18
|
if (error instanceof SyntaxError) {
|
|
@@ -86,6 +87,7 @@ type RealtimeEvents = Simplify<
|
|
|
86
87
|
type: EventType;
|
|
87
88
|
}
|
|
88
89
|
>,
|
|
90
|
+
// oxlint-disable-next-line anti-slop/no-unknown-returns -- Preserve the published event-callback contract, which accepts and ignores arbitrary return values.
|
|
89
91
|
) => unknown;
|
|
90
92
|
}
|
|
91
93
|
>;
|
|
@@ -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
|
@@ -856,6 +856,10 @@ export class OpenAI {
|
|
|
856
856
|
return Errors.APIError.generate(status, normalizedError, message, headers);
|
|
857
857
|
}
|
|
858
858
|
|
|
859
|
+
_hasApiKeyProvider(): boolean {
|
|
860
|
+
return typeof this._options.apiKey === 'function';
|
|
861
|
+
}
|
|
862
|
+
|
|
859
863
|
/**
|
|
860
864
|
* Resolves a function-based API key and retains the resolved value on this client.
|
|
861
865
|
* Returns whether a provider was invoked. Internal callers can capture this
|
|
@@ -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>>(
|
|
@@ -1638,6 +1659,7 @@ export class OpenAI {
|
|
|
1638
1659
|
retriesRemaining: number,
|
|
1639
1660
|
requestLogID: string,
|
|
1640
1661
|
responseHeaders?: Headers | undefined,
|
|
1662
|
+
requestSignal: AbortSignal | null | undefined = options.signal,
|
|
1641
1663
|
): Promise<APIResponseProps> {
|
|
1642
1664
|
let timeoutMillis: number | undefined;
|
|
1643
1665
|
|
|
@@ -1685,7 +1707,17 @@ export class OpenAI {
|
|
|
1685
1707
|
if (x509Authentication) {
|
|
1686
1708
|
await x509Authentication.waitForRetry(timeoutMillis, x509Authentication.effectiveSignal());
|
|
1687
1709
|
} else {
|
|
1688
|
-
|
|
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
|
+
}
|
|
1689
1721
|
}
|
|
1690
1722
|
|
|
1691
1723
|
return this.makeRequest(options, retriesRemaining - 1, requestLogID);
|
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
|