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