From ac3ef5aaad44883497f0c20d6aed3f7552358882 Mon Sep 17 00:00:00 2001 From: Bryan Fox Date: Thu, 16 Oct 2025 10:07:37 -0400 Subject: [PATCH 1/7] Add timeout option to server clients --- .../src/AgentDispatchClient.ts | 13 +++++++++++-- packages/livekit-server-sdk/src/EgressClient.ts | 13 +++++++++++-- .../livekit-server-sdk/src/IngressClient.ts | 13 +++++++++++-- .../livekit-server-sdk/src/RoomServiceClient.ts | 13 +++++++++++-- packages/livekit-server-sdk/src/SipClient.ts | 13 +++++++++++-- packages/livekit-server-sdk/src/TwirpRPC.ts | 17 ++++++++++++++--- 6 files changed, 69 insertions(+), 13 deletions(-) diff --git a/packages/livekit-server-sdk/src/AgentDispatchClient.ts b/packages/livekit-server-sdk/src/AgentDispatchClient.ts index 4ee507d9..149aa750 100644 --- a/packages/livekit-server-sdk/src/AgentDispatchClient.ts +++ b/packages/livekit-server-sdk/src/AgentDispatchClient.ts @@ -17,6 +17,10 @@ interface CreateDispatchOptions { metadata?: string; } +type ClientOptions = { + timeoutSeconds?: number; +}; + const svc = 'AgentDispatchService'; /** @@ -29,10 +33,15 @@ export class AgentDispatchClient extends ServiceBase { * @param host - hostname including protocol. i.e. 'https://.livekit.cloud' * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET + * @param options - client options + * @param options.timeoutSeconds - optional timeout, in seconds, for all server requests */ - constructor(host: string, apiKey?: string, secret?: string) { + constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); - this.rpc = new TwirpRpc(host, livekitPackage); + const rpcOptions = options?.timeoutSeconds + ? { timeoutSeconds: options.timeoutSeconds } + : undefined; + this.rpc = new TwirpRpc(host, livekitPackage, rpcOptions); } /** diff --git a/packages/livekit-server-sdk/src/EgressClient.ts b/packages/livekit-server-sdk/src/EgressClient.ts index 0c500ecd..ab64e633 100644 --- a/packages/livekit-server-sdk/src/EgressClient.ts +++ b/packages/livekit-server-sdk/src/EgressClient.ts @@ -127,6 +127,10 @@ export interface ListEgressOptions { active?: boolean; } +type ClientOptions = { + timeoutSeconds?: number; +}; + /** * Client to access Egress APIs */ @@ -137,10 +141,15 @@ export class EgressClient extends ServiceBase { * @param host - hostname including protocol. i.e. 'https://.livekit.cloud' * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET + * @param options - client options + * @param options.timeoutSeconds - optional timeout, in seconds, for all server requests */ - constructor(host: string, apiKey?: string, secret?: string) { + constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); - this.rpc = new TwirpRpc(host, livekitPackage); + const rpcOptions = options?.timeoutSeconds + ? { timeoutSeconds: options.timeoutSeconds } + : undefined; + this.rpc = new TwirpRpc(host, livekitPackage, rpcOptions); } /** diff --git a/packages/livekit-server-sdk/src/IngressClient.ts b/packages/livekit-server-sdk/src/IngressClient.ts index ef4b8b99..9cb21394 100644 --- a/packages/livekit-server-sdk/src/IngressClient.ts +++ b/packages/livekit-server-sdk/src/IngressClient.ts @@ -114,6 +114,10 @@ export interface ListIngressOptions { ingressId?: string; } +type ClientOptions = { + timeoutSeconds?: number; +}; + /** * Client to access Ingress APIs */ @@ -124,10 +128,15 @@ export class IngressClient extends ServiceBase { * @param host - hostname including protocol. i.e. 'https://.livekit.cloud' * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET + * @param options - client options + * @param options.timeoutSeconds - optional timeout, in seconds, for all server requests */ - constructor(host: string, apiKey?: string, secret?: string) { + constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); - this.rpc = new TwirpRpc(host, livekitPackage); + const rpcOptions = options?.timeoutSeconds + ? { timeoutSeconds: options.timeoutSeconds } + : undefined; + this.rpc = new TwirpRpc(host, livekitPackage, rpcOptions); } /** diff --git a/packages/livekit-server-sdk/src/RoomServiceClient.ts b/packages/livekit-server-sdk/src/RoomServiceClient.ts index fd7ad3f6..b09c839a 100644 --- a/packages/livekit-server-sdk/src/RoomServiceClient.ts +++ b/packages/livekit-server-sdk/src/RoomServiceClient.ts @@ -107,6 +107,10 @@ export type UpdateParticipantOptions = { name?: string; }; +type ClientOptions = { + timeoutSeconds?: number; +}; + const svc = 'RoomService'; /** @@ -120,10 +124,15 @@ export class RoomServiceClient extends ServiceBase { * @param host - hostname including protocol. i.e. 'https://.livekit.cloud' * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET + * @param options - client options + * @param options.timeoutSeconds - optional timeout, in seconds, for all server requests */ - constructor(host: string, apiKey?: string, secret?: string) { + constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); - this.rpc = new TwirpRpc(host, livekitPackage); + const rpcOptions = options?.timeoutSeconds + ? { timeoutSeconds: options.timeoutSeconds } + : undefined; + this.rpc = new TwirpRpc(host, livekitPackage, rpcOptions); } /** diff --git a/packages/livekit-server-sdk/src/SipClient.ts b/packages/livekit-server-sdk/src/SipClient.ts index 2b8003ec..b086ff22 100644 --- a/packages/livekit-server-sdk/src/SipClient.ts +++ b/packages/livekit-server-sdk/src/SipClient.ts @@ -205,6 +205,10 @@ export interface TransferSipParticipantOptions { headers?: { [key: string]: string }; } +type ClientOptions = { + timeoutSeconds?: number; +}; + /** * Client to access Egress APIs */ @@ -215,10 +219,15 @@ export class SipClient extends ServiceBase { * @param host - hostname including protocol. i.e. 'https://.livekit.cloud' * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET + * @param options - client options + * @param options.timeoutSeconds - optional timeout, in seconds, for all server requests */ - constructor(host: string, apiKey?: string, secret?: string) { + constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); - this.rpc = new TwirpRpc(host, livekitPackage); + const rpcOptions = options?.timeoutSeconds + ? { timeoutSeconds: options.timeoutSeconds } + : undefined; + this.rpc = new TwirpRpc(host, livekitPackage, rpcOptions); } /** diff --git a/packages/livekit-server-sdk/src/TwirpRPC.ts b/packages/livekit-server-sdk/src/TwirpRPC.ts index 11f725dc..b47505b6 100644 --- a/packages/livekit-server-sdk/src/TwirpRPC.ts +++ b/packages/livekit-server-sdk/src/TwirpRPC.ts @@ -5,7 +5,15 @@ import type { JsonValue } from '@bufbuild/protobuf'; // twirp RPC adapter for client implementation +type Options = { + /** Prefix for the RPC requests */ + prefix?: string; + /** Timeout for fetch requests, in seconds. Must resolve to a positive integer millisecond value. */ + timeoutSeconds?: number; +}; + const defaultPrefix = '/twirp'; +const defaultTimeoutSeconds = 60; export const livekitPackage = 'livekit'; export interface Rpc { @@ -48,13 +56,16 @@ export class TwirpRpc { prefix: string; - constructor(host: string, pkg: string, prefix?: string) { + requestTimeout: number; + + constructor(host: string, pkg: string, options?: Options) { if (host.startsWith('ws')) { host = host.replace('ws', 'http'); } this.host = host; this.pkg = pkg; - this.prefix = prefix || defaultPrefix; + this.requestTimeout = options?.timeoutSeconds ?? defaultTimeoutSeconds; + this.prefix = options?.prefix || defaultPrefix; } async request( @@ -62,7 +73,7 @@ export class TwirpRpc { method: string, data: any, // eslint-disable-line @typescript-eslint/no-explicit-any headers: any, // eslint-disable-line @typescript-eslint/no-explicit-any - timeout = 60, + timeout = this.requestTimeout, // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Promise { const path = `${this.prefix}/${this.pkg}.${service}/${method}`; From 769f01d9f11ff541e7c29786ed842054ffb3ce0b Mon Sep 17 00:00:00 2001 From: Bryan Fox Date: Mon, 20 Oct 2025 11:35:05 -0400 Subject: [PATCH 2/7] Rename --- packages/livekit-server-sdk/src/AgentDispatchClient.ts | 8 ++++---- packages/livekit-server-sdk/src/EgressClient.ts | 8 ++++---- packages/livekit-server-sdk/src/IngressClient.ts | 8 ++++---- packages/livekit-server-sdk/src/RoomServiceClient.ts | 8 ++++---- packages/livekit-server-sdk/src/SipClient.ts | 8 ++++---- packages/livekit-server-sdk/src/TwirpRPC.ts | 4 ++-- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/livekit-server-sdk/src/AgentDispatchClient.ts b/packages/livekit-server-sdk/src/AgentDispatchClient.ts index 149aa750..d11248b2 100644 --- a/packages/livekit-server-sdk/src/AgentDispatchClient.ts +++ b/packages/livekit-server-sdk/src/AgentDispatchClient.ts @@ -18,7 +18,7 @@ interface CreateDispatchOptions { } type ClientOptions = { - timeoutSeconds?: number; + requestTimeout?: number; }; const svc = 'AgentDispatchService'; @@ -34,12 +34,12 @@ export class AgentDispatchClient extends ServiceBase { * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET * @param options - client options - * @param options.timeoutSeconds - optional timeout, in seconds, for all server requests + * @param options.requestTimeout - optional timeout, in seconds, for all server requests */ constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); - const rpcOptions = options?.timeoutSeconds - ? { timeoutSeconds: options.timeoutSeconds } + const rpcOptions = options?.requestTimeout + ? { requestTimeout: options.requestTimeout } : undefined; this.rpc = new TwirpRpc(host, livekitPackage, rpcOptions); } diff --git a/packages/livekit-server-sdk/src/EgressClient.ts b/packages/livekit-server-sdk/src/EgressClient.ts index ab64e633..322cab00 100644 --- a/packages/livekit-server-sdk/src/EgressClient.ts +++ b/packages/livekit-server-sdk/src/EgressClient.ts @@ -128,7 +128,7 @@ export interface ListEgressOptions { } type ClientOptions = { - timeoutSeconds?: number; + requestTimeout?: number; }; /** @@ -142,12 +142,12 @@ export class EgressClient extends ServiceBase { * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET * @param options - client options - * @param options.timeoutSeconds - optional timeout, in seconds, for all server requests + * @param options.requestTimeout - optional timeout, in seconds, for all server requests */ constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); - const rpcOptions = options?.timeoutSeconds - ? { timeoutSeconds: options.timeoutSeconds } + const rpcOptions = options?.requestTimeout + ? { requestTimeout: options.requestTimeout } : undefined; this.rpc = new TwirpRpc(host, livekitPackage, rpcOptions); } diff --git a/packages/livekit-server-sdk/src/IngressClient.ts b/packages/livekit-server-sdk/src/IngressClient.ts index 9cb21394..90026c65 100644 --- a/packages/livekit-server-sdk/src/IngressClient.ts +++ b/packages/livekit-server-sdk/src/IngressClient.ts @@ -115,7 +115,7 @@ export interface ListIngressOptions { } type ClientOptions = { - timeoutSeconds?: number; + requestTimeout?: number; }; /** @@ -129,12 +129,12 @@ export class IngressClient extends ServiceBase { * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET * @param options - client options - * @param options.timeoutSeconds - optional timeout, in seconds, for all server requests + * @param options.requestTimeout - optional timeout, in seconds, for all server requests */ constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); - const rpcOptions = options?.timeoutSeconds - ? { timeoutSeconds: options.timeoutSeconds } + const rpcOptions = options?.requestTimeout + ? { requestTimeout: options.requestTimeout } : undefined; this.rpc = new TwirpRpc(host, livekitPackage, rpcOptions); } diff --git a/packages/livekit-server-sdk/src/RoomServiceClient.ts b/packages/livekit-server-sdk/src/RoomServiceClient.ts index b09c839a..22d07f67 100644 --- a/packages/livekit-server-sdk/src/RoomServiceClient.ts +++ b/packages/livekit-server-sdk/src/RoomServiceClient.ts @@ -108,7 +108,7 @@ export type UpdateParticipantOptions = { }; type ClientOptions = { - timeoutSeconds?: number; + requestTimeout?: number; }; const svc = 'RoomService'; @@ -125,12 +125,12 @@ export class RoomServiceClient extends ServiceBase { * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET * @param options - client options - * @param options.timeoutSeconds - optional timeout, in seconds, for all server requests + * @param options.requestTimeout - optional timeout, in seconds, for all server requests */ constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); - const rpcOptions = options?.timeoutSeconds - ? { timeoutSeconds: options.timeoutSeconds } + const rpcOptions = options?.requestTimeout + ? { requestTimeout: options.requestTimeout } : undefined; this.rpc = new TwirpRpc(host, livekitPackage, rpcOptions); } diff --git a/packages/livekit-server-sdk/src/SipClient.ts b/packages/livekit-server-sdk/src/SipClient.ts index b086ff22..0adaa308 100644 --- a/packages/livekit-server-sdk/src/SipClient.ts +++ b/packages/livekit-server-sdk/src/SipClient.ts @@ -206,7 +206,7 @@ export interface TransferSipParticipantOptions { } type ClientOptions = { - timeoutSeconds?: number; + requestTimeout?: number; }; /** @@ -220,12 +220,12 @@ export class SipClient extends ServiceBase { * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET * @param options - client options - * @param options.timeoutSeconds - optional timeout, in seconds, for all server requests + * @param options.requestTimeout - optional timeout, in seconds, for all server requests */ constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); - const rpcOptions = options?.timeoutSeconds - ? { timeoutSeconds: options.timeoutSeconds } + const rpcOptions = options?.requestTimeout + ? { requestTimeout: options.requestTimeout } : undefined; this.rpc = new TwirpRpc(host, livekitPackage, rpcOptions); } diff --git a/packages/livekit-server-sdk/src/TwirpRPC.ts b/packages/livekit-server-sdk/src/TwirpRPC.ts index b47505b6..1f48b67f 100644 --- a/packages/livekit-server-sdk/src/TwirpRPC.ts +++ b/packages/livekit-server-sdk/src/TwirpRPC.ts @@ -9,7 +9,7 @@ type Options = { /** Prefix for the RPC requests */ prefix?: string; /** Timeout for fetch requests, in seconds. Must resolve to a positive integer millisecond value. */ - timeoutSeconds?: number; + requestTimeout?: number; }; const defaultPrefix = '/twirp'; @@ -64,7 +64,7 @@ export class TwirpRpc { } this.host = host; this.pkg = pkg; - this.requestTimeout = options?.timeoutSeconds ?? defaultTimeoutSeconds; + this.requestTimeout = options?.requestTimeout ?? defaultTimeoutSeconds; this.prefix = options?.prefix || defaultPrefix; } From 55890cb3416e54635ee05aaca34e8ebc34d58c02 Mon Sep 17 00:00:00 2001 From: Bryan Fox Date: Thu, 6 Nov 2025 09:38:38 -0500 Subject: [PATCH 3/7] Share options type; remove ctor docs --- packages/livekit-server-sdk/src/AgentDispatchClient.ts | 6 +----- packages/livekit-server-sdk/src/ClientOptions.ts | 9 +++++++++ packages/livekit-server-sdk/src/EgressClient.ts | 6 +----- packages/livekit-server-sdk/src/IngressClient.ts | 6 +----- packages/livekit-server-sdk/src/RoomServiceClient.ts | 6 +----- packages/livekit-server-sdk/src/SipClient.ts | 6 +----- 6 files changed, 14 insertions(+), 25 deletions(-) create mode 100644 packages/livekit-server-sdk/src/ClientOptions.ts diff --git a/packages/livekit-server-sdk/src/AgentDispatchClient.ts b/packages/livekit-server-sdk/src/AgentDispatchClient.ts index d11248b2..32054409 100644 --- a/packages/livekit-server-sdk/src/AgentDispatchClient.ts +++ b/packages/livekit-server-sdk/src/AgentDispatchClient.ts @@ -8,6 +8,7 @@ import { ListAgentDispatchRequest, ListAgentDispatchResponse, } from '@livekit/protocol'; +import type { ClientOptions } from "./ClientOptions.js"; import { ServiceBase } from './ServiceBase.js'; import { type Rpc, TwirpRpc, livekitPackage } from './TwirpRPC.js'; @@ -17,10 +18,6 @@ interface CreateDispatchOptions { metadata?: string; } -type ClientOptions = { - requestTimeout?: number; -}; - const svc = 'AgentDispatchService'; /** @@ -34,7 +31,6 @@ export class AgentDispatchClient extends ServiceBase { * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET * @param options - client options - * @param options.requestTimeout - optional timeout, in seconds, for all server requests */ constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); diff --git a/packages/livekit-server-sdk/src/ClientOptions.ts b/packages/livekit-server-sdk/src/ClientOptions.ts new file mode 100644 index 00000000..55d0b63c --- /dev/null +++ b/packages/livekit-server-sdk/src/ClientOptions.ts @@ -0,0 +1,9 @@ +/** + * Options common to all clients + */ +export type ClientOptions = { + /** + * Optional timeout, in seconds, for all server requests + */ + requestTimeout?: number; +}; diff --git a/packages/livekit-server-sdk/src/EgressClient.ts b/packages/livekit-server-sdk/src/EgressClient.ts index 322cab00..d90eb6db 100644 --- a/packages/livekit-server-sdk/src/EgressClient.ts +++ b/packages/livekit-server-sdk/src/EgressClient.ts @@ -25,6 +25,7 @@ import { UpdateStreamRequest, WebEgressRequest, } from '@livekit/protocol'; +import type { ClientOptions } from "./ClientOptions.js"; import { ServiceBase } from './ServiceBase.js'; import type { Rpc } from './TwirpRPC.js'; import { TwirpRpc, livekitPackage } from './TwirpRPC.js'; @@ -127,10 +128,6 @@ export interface ListEgressOptions { active?: boolean; } -type ClientOptions = { - requestTimeout?: number; -}; - /** * Client to access Egress APIs */ @@ -142,7 +139,6 @@ export class EgressClient extends ServiceBase { * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET * @param options - client options - * @param options.requestTimeout - optional timeout, in seconds, for all server requests */ constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); diff --git a/packages/livekit-server-sdk/src/IngressClient.ts b/packages/livekit-server-sdk/src/IngressClient.ts index 90026c65..ed83f94b 100644 --- a/packages/livekit-server-sdk/src/IngressClient.ts +++ b/packages/livekit-server-sdk/src/IngressClient.ts @@ -10,6 +10,7 @@ import { ListIngressResponse, UpdateIngressRequest, } from '@livekit/protocol'; +import type { ClientOptions } from "./ClientOptions.js"; import { ServiceBase } from './ServiceBase.js'; import type { Rpc } from './TwirpRPC.js'; import { TwirpRpc, livekitPackage } from './TwirpRPC.js'; @@ -114,10 +115,6 @@ export interface ListIngressOptions { ingressId?: string; } -type ClientOptions = { - requestTimeout?: number; -}; - /** * Client to access Ingress APIs */ @@ -129,7 +126,6 @@ export class IngressClient extends ServiceBase { * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET * @param options - client options - * @param options.requestTimeout - optional timeout, in seconds, for all server requests */ constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); diff --git a/packages/livekit-server-sdk/src/RoomServiceClient.ts b/packages/livekit-server-sdk/src/RoomServiceClient.ts index 22d07f67..57775bbd 100644 --- a/packages/livekit-server-sdk/src/RoomServiceClient.ts +++ b/packages/livekit-server-sdk/src/RoomServiceClient.ts @@ -22,6 +22,7 @@ import { UpdateRoomMetadataRequest, UpdateSubscriptionsRequest, } from '@livekit/protocol'; +import type { ClientOptions } from "./ClientOptions.js"; import { ServiceBase } from './ServiceBase.js'; import type { Rpc } from './TwirpRPC.js'; import { TwirpRpc, livekitPackage } from './TwirpRPC.js'; @@ -107,10 +108,6 @@ export type UpdateParticipantOptions = { name?: string; }; -type ClientOptions = { - requestTimeout?: number; -}; - const svc = 'RoomService'; /** @@ -125,7 +122,6 @@ export class RoomServiceClient extends ServiceBase { * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET * @param options - client options - * @param options.requestTimeout - optional timeout, in seconds, for all server requests */ constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); diff --git a/packages/livekit-server-sdk/src/SipClient.ts b/packages/livekit-server-sdk/src/SipClient.ts index 3874101f..b645f24c 100644 --- a/packages/livekit-server-sdk/src/SipClient.ts +++ b/packages/livekit-server-sdk/src/SipClient.ts @@ -39,6 +39,7 @@ import { UpdateSIPInboundTrunkRequest, UpdateSIPOutboundTrunkRequest, } from '@livekit/protocol'; +import type { ClientOptions } from "./ClientOptions.js"; import { ServiceBase } from './ServiceBase.js'; import type { Rpc } from './TwirpRPC.js'; import { TwirpRpc, livekitPackage } from './TwirpRPC.js'; @@ -206,10 +207,6 @@ export interface TransferSipParticipantOptions { headers?: { [key: string]: string }; } -type ClientOptions = { - requestTimeout?: number; -}; - /** * Client to access Egress APIs */ @@ -221,7 +218,6 @@ export class SipClient extends ServiceBase { * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET * @param options - client options - * @param options.requestTimeout - optional timeout, in seconds, for all server requests */ constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) { super(apiKey, secret); From 84ad9473269f1f44e74a78e320b4456ced21d43f Mon Sep 17 00:00:00 2001 From: Bryan Fox Date: Thu, 6 Nov 2025 09:45:38 -0500 Subject: [PATCH 4/7] Re-word --- packages/livekit-server-sdk/src/TwirpRPC.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/livekit-server-sdk/src/TwirpRPC.ts b/packages/livekit-server-sdk/src/TwirpRPC.ts index 1f48b67f..f7f63d30 100644 --- a/packages/livekit-server-sdk/src/TwirpRPC.ts +++ b/packages/livekit-server-sdk/src/TwirpRPC.ts @@ -8,7 +8,7 @@ import type { JsonValue } from '@bufbuild/protobuf'; type Options = { /** Prefix for the RPC requests */ prefix?: string; - /** Timeout for fetch requests, in seconds. Must resolve to a positive integer millisecond value. */ + /** Timeout for fetch requests, in seconds. Must be within the valid range for abort signal timeouts. */ requestTimeout?: number; }; From 59bdca9c4e53424f824e95eaf70068a3991e4696 Mon Sep 17 00:00:00 2001 From: Bryan Fox Date: Thu, 6 Nov 2025 09:53:00 -0500 Subject: [PATCH 5/7] Format --- packages/livekit-server-sdk/src/AgentDispatchClient.ts | 2 +- packages/livekit-server-sdk/src/EgressClient.ts | 2 +- packages/livekit-server-sdk/src/IngressClient.ts | 2 +- packages/livekit-server-sdk/src/RoomServiceClient.ts | 2 +- packages/livekit-server-sdk/src/SipClient.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/livekit-server-sdk/src/AgentDispatchClient.ts b/packages/livekit-server-sdk/src/AgentDispatchClient.ts index 32054409..91dbabb5 100644 --- a/packages/livekit-server-sdk/src/AgentDispatchClient.ts +++ b/packages/livekit-server-sdk/src/AgentDispatchClient.ts @@ -8,7 +8,7 @@ import { ListAgentDispatchRequest, ListAgentDispatchResponse, } from '@livekit/protocol'; -import type { ClientOptions } from "./ClientOptions.js"; +import type { ClientOptions } from './ClientOptions.js'; import { ServiceBase } from './ServiceBase.js'; import { type Rpc, TwirpRpc, livekitPackage } from './TwirpRPC.js'; diff --git a/packages/livekit-server-sdk/src/EgressClient.ts b/packages/livekit-server-sdk/src/EgressClient.ts index d90eb6db..5d6f97aa 100644 --- a/packages/livekit-server-sdk/src/EgressClient.ts +++ b/packages/livekit-server-sdk/src/EgressClient.ts @@ -25,7 +25,7 @@ import { UpdateStreamRequest, WebEgressRequest, } from '@livekit/protocol'; -import type { ClientOptions } from "./ClientOptions.js"; +import type { ClientOptions } from './ClientOptions.js'; import { ServiceBase } from './ServiceBase.js'; import type { Rpc } from './TwirpRPC.js'; import { TwirpRpc, livekitPackage } from './TwirpRPC.js'; diff --git a/packages/livekit-server-sdk/src/IngressClient.ts b/packages/livekit-server-sdk/src/IngressClient.ts index ed83f94b..f0198720 100644 --- a/packages/livekit-server-sdk/src/IngressClient.ts +++ b/packages/livekit-server-sdk/src/IngressClient.ts @@ -10,7 +10,7 @@ import { ListIngressResponse, UpdateIngressRequest, } from '@livekit/protocol'; -import type { ClientOptions } from "./ClientOptions.js"; +import type { ClientOptions } from './ClientOptions.js'; import { ServiceBase } from './ServiceBase.js'; import type { Rpc } from './TwirpRPC.js'; import { TwirpRpc, livekitPackage } from './TwirpRPC.js'; diff --git a/packages/livekit-server-sdk/src/RoomServiceClient.ts b/packages/livekit-server-sdk/src/RoomServiceClient.ts index 57775bbd..39097cf4 100644 --- a/packages/livekit-server-sdk/src/RoomServiceClient.ts +++ b/packages/livekit-server-sdk/src/RoomServiceClient.ts @@ -22,7 +22,7 @@ import { UpdateRoomMetadataRequest, UpdateSubscriptionsRequest, } from '@livekit/protocol'; -import type { ClientOptions } from "./ClientOptions.js"; +import type { ClientOptions } from './ClientOptions.js'; import { ServiceBase } from './ServiceBase.js'; import type { Rpc } from './TwirpRPC.js'; import { TwirpRpc, livekitPackage } from './TwirpRPC.js'; diff --git a/packages/livekit-server-sdk/src/SipClient.ts b/packages/livekit-server-sdk/src/SipClient.ts index b645f24c..1312725b 100644 --- a/packages/livekit-server-sdk/src/SipClient.ts +++ b/packages/livekit-server-sdk/src/SipClient.ts @@ -39,7 +39,7 @@ import { UpdateSIPInboundTrunkRequest, UpdateSIPOutboundTrunkRequest, } from '@livekit/protocol'; -import type { ClientOptions } from "./ClientOptions.js"; +import type { ClientOptions } from './ClientOptions.js'; import { ServiceBase } from './ServiceBase.js'; import type { Rpc } from './TwirpRPC.js'; import { TwirpRpc, livekitPackage } from './TwirpRPC.js'; From 2449cdaee8910e53a735c892f29575a49807599d Mon Sep 17 00:00:00 2001 From: Bryan Fox Date: Thu, 6 Nov 2025 09:53:46 -0500 Subject: [PATCH 6/7] License header --- packages/livekit-server-sdk/src/ClientOptions.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/livekit-server-sdk/src/ClientOptions.ts b/packages/livekit-server-sdk/src/ClientOptions.ts index 55d0b63c..b2ef093f 100644 --- a/packages/livekit-server-sdk/src/ClientOptions.ts +++ b/packages/livekit-server-sdk/src/ClientOptions.ts @@ -1,3 +1,7 @@ +// SPDX-FileCopyrightText: 2024 LiveKit, Inc. +// +// SPDX-License-Identifier: Apache-2.0 + /** * Options common to all clients */ From e6b06fc287aec73076e2dd07172adb010d454896 Mon Sep 17 00:00:00 2001 From: lukasIO Date: Thu, 6 Nov 2025 16:36:15 +0100 Subject: [PATCH 7/7] Create honest-apes-sparkle.md --- .changeset/honest-apes-sparkle.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/honest-apes-sparkle.md diff --git a/.changeset/honest-apes-sparkle.md b/.changeset/honest-apes-sparkle.md new file mode 100644 index 00000000..32303dd3 --- /dev/null +++ b/.changeset/honest-apes-sparkle.md @@ -0,0 +1,5 @@ +--- +"livekit-server-sdk": patch +--- + +Add optional timeouts to clients in server APIs