livekit-server-sdk 2.19.0 → 2.19.1
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/dist/AccessToken.cjs +4 -1
- package/dist/AccessToken.cjs.map +1 -1
- package/dist/AccessToken.d.ts.map +1 -1
- package/dist/AccessToken.js +4 -1
- package/dist/AccessToken.js.map +1 -1
- package/dist/IngressClient.cjs +4 -1
- package/dist/IngressClient.cjs.map +1 -1
- package/dist/IngressClient.d.cts +10 -0
- package/dist/IngressClient.d.ts +10 -0
- package/dist/IngressClient.d.ts.map +1 -1
- package/dist/IngressClient.js +4 -1
- package/dist/IngressClient.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.cts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
- package/src/AccessToken.test.ts +13 -0
- package/src/AccessToken.ts +3 -0
- package/src/IngressClient.ts +14 -1
- package/src/version.ts +1 -1
package/dist/AccessToken.cjs
CHANGED
|
@@ -171,7 +171,10 @@ class TokenVerifier {
|
|
|
171
171
|
const secret = new TextEncoder().encode(this.apiSecret);
|
|
172
172
|
const { payload } = await jose.jwtVerify(token, secret, {
|
|
173
173
|
issuer: this.apiKey,
|
|
174
|
-
clockTolerance
|
|
174
|
+
clockTolerance,
|
|
175
|
+
// First-party minters always set exp. Without this, a hand-rolled token
|
|
176
|
+
// with a valid signature and no exp verifies forever (livekit/protocol#1706).
|
|
177
|
+
requiredClaims: ["exp"]
|
|
175
178
|
});
|
|
176
179
|
if (!payload) {
|
|
177
180
|
throw Error("invalid token");
|
package/dist/AccessToken.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AccessToken.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { RoomConfiguration } from '@livekit/protocol';\nimport * as jose from 'jose';\nimport type {\n ClaimGrants,\n InferenceGrant,\n ObservabilityGrant,\n SIPGrant,\n VideoGrant,\n} from './grants.js';\nimport { claimsToJwtPayload } from './grants.js';\n\n// 6 hours\nconst defaultTTL = `6h`;\n\nconst defaultClockToleranceSeconds = 10;\n\nexport interface AccessTokenOptions {\n /**\n * amount of time before expiration\n * expressed in seconds or a string describing a time span zeit/ms.\n * eg: '2 days', '10h', or seconds as numeric value\n */\n ttl?: number | string;\n\n /**\n * display name for the participant, available as `Participant.name`\n */\n name?: string;\n\n /**\n * identity of the user, required for room join tokens\n */\n identity?: string;\n\n /**\n * custom participant metadata\n */\n metadata?: string;\n\n /**\n * custom participant attributes\n */\n attributes?: Record<string, string>;\n}\n\nexport class AccessToken {\n private apiKey: string;\n\n private apiSecret: string;\n\n private grants: ClaimGrants;\n\n identity?: string;\n\n ttl: number | string;\n\n /**\n * Creates a new AccessToken\n * @param apiKey - API Key, can be set in env LIVEKIT_API_KEY\n * @param apiSecret - Secret, can be set in env LIVEKIT_API_SECRET\n */\n constructor(apiKey?: string, apiSecret?: string, options?: AccessTokenOptions) {\n if (!apiKey) {\n apiKey = process.env.LIVEKIT_API_KEY;\n }\n if (!apiSecret) {\n apiSecret = process.env.LIVEKIT_API_SECRET;\n }\n if (!apiKey || !apiSecret) {\n throw Error('api-key and api-secret must be set');\n }\n // @ts-expect-error we're not including dom lib for the server sdk so document is not defined\n else if (typeof document !== 'undefined') {\n // check against document rather than window because deno provides window\n console.error(\n 'You should not include your API secret in your web client bundle.\\n\\n' +\n 'Your web client should request a token from your backend server which should then use ' +\n 'the API secret to generate a token. See https://docs.livekit.io/client/connect/',\n );\n }\n this.apiKey = apiKey;\n this.apiSecret = apiSecret;\n this.grants = {};\n this.identity = options?.identity;\n this.ttl = options?.ttl || defaultTTL;\n if (typeof this.ttl === 'number') {\n this.ttl = `${this.ttl}s`;\n }\n if (options?.metadata) {\n this.metadata = options.metadata;\n }\n if (options?.attributes) {\n this.attributes = options.attributes;\n }\n if (options?.name) {\n this.name = options.name;\n }\n }\n\n /**\n * Adds a video grant to this token.\n * @param grant -\n */\n addGrant(grant: VideoGrant) {\n this.grants.video = { ...(this.grants.video ?? {}), ...grant };\n }\n\n /**\n * Adds an inference grant to this token.\n * @param grant -\n */\n addInferenceGrant(grant: InferenceGrant) {\n this.grants.inference = { ...(this.grants.inference ?? {}), ...grant };\n }\n\n /**\n * Adds a SIP grant to this token.\n * @param grant -\n */\n addSIPGrant(grant: SIPGrant) {\n this.grants.sip = { ...(this.grants.sip ?? {}), ...grant };\n }\n\n /**\n * Adds an observability grant to this token.\n * @param grant -\n */\n addObservabilityGrant(grant: ObservabilityGrant) {\n this.grants.observability = { ...(this.grants.observability ?? {}), ...grant };\n }\n\n get name(): string | undefined {\n return this.grants.name;\n }\n\n set name(name: string) {\n this.grants.name = name;\n }\n\n get metadata(): string | undefined {\n return this.grants.metadata;\n }\n\n /**\n * Set metadata to be passed to the Participant, used only when joining the room\n */\n set metadata(md: string) {\n this.grants.metadata = md;\n }\n\n get attributes(): Record<string, string> | undefined {\n return this.grants.attributes;\n }\n\n set attributes(attrs: Record<string, string>) {\n this.grants.attributes = attrs;\n }\n\n get kind(): string | undefined {\n return this.grants.kind;\n }\n\n set kind(kind: string) {\n this.grants.kind = kind;\n }\n\n get sha256(): string | undefined {\n return this.grants.sha256;\n }\n\n set sha256(sha: string | undefined) {\n this.grants.sha256 = sha;\n }\n\n get roomPreset(): string | undefined {\n return this.grants.roomPreset;\n }\n\n set roomPreset(preset: string | undefined) {\n this.grants.roomPreset = preset;\n }\n\n get roomConfig(): RoomConfiguration | undefined {\n return this.grants.roomConfig;\n }\n\n set roomConfig(config: RoomConfiguration | undefined) {\n this.grants.roomConfig = config;\n }\n\n /**\n * @returns JWT encoded token\n */\n async toJwt(): Promise<string> {\n // TODO: check for video grant validity\n\n const secret = new TextEncoder().encode(this.apiSecret);\n\n const jwt = new jose.SignJWT(claimsToJwtPayload(this.grants))\n .setProtectedHeader({ alg: 'HS256' })\n .setIssuer(this.apiKey)\n .setExpirationTime(this.ttl)\n .setNotBefore(new Date());\n if (this.identity) {\n jwt.setSubject(this.identity);\n } else if (this.grants.video?.roomJoin) {\n throw Error('identity is required for join but not set');\n }\n return jwt.sign(secret);\n }\n}\n\nexport class TokenVerifier {\n private apiKey: string;\n\n private apiSecret: string;\n\n constructor(apiKey: string, apiSecret: string) {\n this.apiKey = apiKey;\n this.apiSecret = apiSecret;\n }\n\n async verify(\n token: string,\n clockTolerance: string | number = defaultClockToleranceSeconds,\n ): Promise<ClaimGrants> {\n const secret = new TextEncoder().encode(this.apiSecret);\n const { payload } = await jose.jwtVerify(token, secret, {\n issuer: this.apiKey,\n clockTolerance,\n });\n if (!payload) {\n throw Error('invalid token');\n }\n\n return payload as ClaimGrants;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,WAAsB;AAQtB,oBAAmC;AAGnC,MAAM,aAAa;AAEnB,MAAM,+BAA+B;AA+B9B,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBvB,YAAY,QAAiB,WAAoB,SAA8B;AAC7E,QAAI,CAAC,QAAQ;AACX,eAAS,QAAQ,IAAI;AAAA,IACvB;AACA,QAAI,CAAC,WAAW;AACd,kBAAY,QAAQ,IAAI;AAAA,IAC1B;AACA,QAAI,CAAC,UAAU,CAAC,WAAW;AACzB,YAAM,MAAM,oCAAoC;AAAA,IAClD,WAES,OAAO,aAAa,aAAa;AAExC,cAAQ;AAAA,QACN;AAAA,MAGF;AAAA,IACF;AACA,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,SAAS,CAAC;AACf,SAAK,WAAW,mCAAS;AACzB,SAAK,OAAM,mCAAS,QAAO;AAC3B,QAAI,OAAO,KAAK,QAAQ,UAAU;AAChC,WAAK,MAAM,GAAG,KAAK,GAAG;AAAA,IACxB;AACA,QAAI,mCAAS,UAAU;AACrB,WAAK,WAAW,QAAQ;AAAA,IAC1B;AACA,QAAI,mCAAS,YAAY;AACvB,WAAK,aAAa,QAAQ;AAAA,IAC5B;AACA,QAAI,mCAAS,MAAM;AACjB,WAAK,OAAO,QAAQ;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAmB;AAC1B,SAAK,OAAO,QAAQ,EAAE,GAAI,KAAK,OAAO,SAAS,CAAC,GAAI,GAAG,MAAM;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,OAAuB;AACvC,SAAK,OAAO,YAAY,EAAE,GAAI,KAAK,OAAO,aAAa,CAAC,GAAI,GAAG,MAAM;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,OAAiB;AAC3B,SAAK,OAAO,MAAM,EAAE,GAAI,KAAK,OAAO,OAAO,CAAC,GAAI,GAAG,MAAM;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB,OAA2B;AAC/C,SAAK,OAAO,gBAAgB,EAAE,GAAI,KAAK,OAAO,iBAAiB,CAAC,GAAI,GAAG,MAAM;AAAA,EAC/E;AAAA,EAEA,IAAI,OAA2B;AAC7B,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,KAAK,MAAc;AACrB,SAAK,OAAO,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,WAA+B;AACjC,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAS,IAAY;AACvB,SAAK,OAAO,WAAW;AAAA,EACzB;AAAA,EAEA,IAAI,aAAiD;AACnD,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW,OAA+B;AAC5C,SAAK,OAAO,aAAa;AAAA,EAC3B;AAAA,EAEA,IAAI,OAA2B;AAC7B,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,KAAK,MAAc;AACrB,SAAK,OAAO,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,SAA6B;AAC/B,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,OAAO,KAAyB;AAClC,SAAK,OAAO,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,aAAiC;AACnC,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW,QAA4B;AACzC,SAAK,OAAO,aAAa;AAAA,EAC3B;AAAA,EAEA,IAAI,aAA4C;AAC9C,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW,QAAuC;AACpD,SAAK,OAAO,aAAa;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAyB;AApMjC;AAuMI,UAAM,SAAS,IAAI,YAAY,EAAE,OAAO,KAAK,SAAS;AAEtD,UAAM,MAAM,IAAI,KAAK,YAAQ,kCAAmB,KAAK,MAAM,CAAC,EACzD,mBAAmB,EAAE,KAAK,QAAQ,CAAC,EACnC,UAAU,KAAK,MAAM,EACrB,kBAAkB,KAAK,GAAG,EAC1B,aAAa,oBAAI,KAAK,CAAC;AAC1B,QAAI,KAAK,UAAU;AACjB,UAAI,WAAW,KAAK,QAAQ;AAAA,IAC9B,YAAW,UAAK,OAAO,UAAZ,mBAAmB,UAAU;AACtC,YAAM,MAAM,2CAA2C;AAAA,IACzD;AACA,WAAO,IAAI,KAAK,MAAM;AAAA,EACxB;AACF;AAEO,MAAM,cAAc;AAAA,EAKzB,YAAY,QAAgB,WAAmB;AAC7C,SAAK,SAAS;AACd,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,OACJ,OACA,iBAAkC,8BACZ;AACtB,UAAM,SAAS,IAAI,YAAY,EAAE,OAAO,KAAK,SAAS;AACtD,UAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,MACtD,QAAQ,KAAK;AAAA,MACb;AAAA,
|
|
1
|
+
{"version":3,"sources":["../src/AccessToken.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { RoomConfiguration } from '@livekit/protocol';\nimport * as jose from 'jose';\nimport type {\n ClaimGrants,\n InferenceGrant,\n ObservabilityGrant,\n SIPGrant,\n VideoGrant,\n} from './grants.js';\nimport { claimsToJwtPayload } from './grants.js';\n\n// 6 hours\nconst defaultTTL = `6h`;\n\nconst defaultClockToleranceSeconds = 10;\n\nexport interface AccessTokenOptions {\n /**\n * amount of time before expiration\n * expressed in seconds or a string describing a time span zeit/ms.\n * eg: '2 days', '10h', or seconds as numeric value\n */\n ttl?: number | string;\n\n /**\n * display name for the participant, available as `Participant.name`\n */\n name?: string;\n\n /**\n * identity of the user, required for room join tokens\n */\n identity?: string;\n\n /**\n * custom participant metadata\n */\n metadata?: string;\n\n /**\n * custom participant attributes\n */\n attributes?: Record<string, string>;\n}\n\nexport class AccessToken {\n private apiKey: string;\n\n private apiSecret: string;\n\n private grants: ClaimGrants;\n\n identity?: string;\n\n ttl: number | string;\n\n /**\n * Creates a new AccessToken\n * @param apiKey - API Key, can be set in env LIVEKIT_API_KEY\n * @param apiSecret - Secret, can be set in env LIVEKIT_API_SECRET\n */\n constructor(apiKey?: string, apiSecret?: string, options?: AccessTokenOptions) {\n if (!apiKey) {\n apiKey = process.env.LIVEKIT_API_KEY;\n }\n if (!apiSecret) {\n apiSecret = process.env.LIVEKIT_API_SECRET;\n }\n if (!apiKey || !apiSecret) {\n throw Error('api-key and api-secret must be set');\n }\n // @ts-expect-error we're not including dom lib for the server sdk so document is not defined\n else if (typeof document !== 'undefined') {\n // check against document rather than window because deno provides window\n console.error(\n 'You should not include your API secret in your web client bundle.\\n\\n' +\n 'Your web client should request a token from your backend server which should then use ' +\n 'the API secret to generate a token. See https://docs.livekit.io/client/connect/',\n );\n }\n this.apiKey = apiKey;\n this.apiSecret = apiSecret;\n this.grants = {};\n this.identity = options?.identity;\n this.ttl = options?.ttl || defaultTTL;\n if (typeof this.ttl === 'number') {\n this.ttl = `${this.ttl}s`;\n }\n if (options?.metadata) {\n this.metadata = options.metadata;\n }\n if (options?.attributes) {\n this.attributes = options.attributes;\n }\n if (options?.name) {\n this.name = options.name;\n }\n }\n\n /**\n * Adds a video grant to this token.\n * @param grant -\n */\n addGrant(grant: VideoGrant) {\n this.grants.video = { ...(this.grants.video ?? {}), ...grant };\n }\n\n /**\n * Adds an inference grant to this token.\n * @param grant -\n */\n addInferenceGrant(grant: InferenceGrant) {\n this.grants.inference = { ...(this.grants.inference ?? {}), ...grant };\n }\n\n /**\n * Adds a SIP grant to this token.\n * @param grant -\n */\n addSIPGrant(grant: SIPGrant) {\n this.grants.sip = { ...(this.grants.sip ?? {}), ...grant };\n }\n\n /**\n * Adds an observability grant to this token.\n * @param grant -\n */\n addObservabilityGrant(grant: ObservabilityGrant) {\n this.grants.observability = { ...(this.grants.observability ?? {}), ...grant };\n }\n\n get name(): string | undefined {\n return this.grants.name;\n }\n\n set name(name: string) {\n this.grants.name = name;\n }\n\n get metadata(): string | undefined {\n return this.grants.metadata;\n }\n\n /**\n * Set metadata to be passed to the Participant, used only when joining the room\n */\n set metadata(md: string) {\n this.grants.metadata = md;\n }\n\n get attributes(): Record<string, string> | undefined {\n return this.grants.attributes;\n }\n\n set attributes(attrs: Record<string, string>) {\n this.grants.attributes = attrs;\n }\n\n get kind(): string | undefined {\n return this.grants.kind;\n }\n\n set kind(kind: string) {\n this.grants.kind = kind;\n }\n\n get sha256(): string | undefined {\n return this.grants.sha256;\n }\n\n set sha256(sha: string | undefined) {\n this.grants.sha256 = sha;\n }\n\n get roomPreset(): string | undefined {\n return this.grants.roomPreset;\n }\n\n set roomPreset(preset: string | undefined) {\n this.grants.roomPreset = preset;\n }\n\n get roomConfig(): RoomConfiguration | undefined {\n return this.grants.roomConfig;\n }\n\n set roomConfig(config: RoomConfiguration | undefined) {\n this.grants.roomConfig = config;\n }\n\n /**\n * @returns JWT encoded token\n */\n async toJwt(): Promise<string> {\n // TODO: check for video grant validity\n\n const secret = new TextEncoder().encode(this.apiSecret);\n\n const jwt = new jose.SignJWT(claimsToJwtPayload(this.grants))\n .setProtectedHeader({ alg: 'HS256' })\n .setIssuer(this.apiKey)\n .setExpirationTime(this.ttl)\n .setNotBefore(new Date());\n if (this.identity) {\n jwt.setSubject(this.identity);\n } else if (this.grants.video?.roomJoin) {\n throw Error('identity is required for join but not set');\n }\n return jwt.sign(secret);\n }\n}\n\nexport class TokenVerifier {\n private apiKey: string;\n\n private apiSecret: string;\n\n constructor(apiKey: string, apiSecret: string) {\n this.apiKey = apiKey;\n this.apiSecret = apiSecret;\n }\n\n async verify(\n token: string,\n clockTolerance: string | number = defaultClockToleranceSeconds,\n ): Promise<ClaimGrants> {\n const secret = new TextEncoder().encode(this.apiSecret);\n const { payload } = await jose.jwtVerify(token, secret, {\n issuer: this.apiKey,\n clockTolerance,\n // First-party minters always set exp. Without this, a hand-rolled token\n // with a valid signature and no exp verifies forever (livekit/protocol#1706).\n requiredClaims: ['exp'],\n });\n if (!payload) {\n throw Error('invalid token');\n }\n\n return payload as ClaimGrants;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessToken.d.ts","sourceRoot":"","sources":["../src/AccessToken.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACX,MAAM,aAAa,CAAC;AAQrB,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAEtB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,MAAM,CAAc;IAE5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAErB;;;;OAIG;gBACS,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB;IAsC7E;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU;IAI1B;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,cAAc;IAIvC;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,QAAQ;IAI3B;;;OAGG;IACH,qBAAqB,CAAC,KAAK,EAAE,kBAAkB;IAI/C,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,EAEpB;IAED,IAAI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjC;IAED;;OAEG;IACH,IAAI,QAAQ,CAAC,EAAE,EAAE,MAAM,EAEtB;IAED,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEnD;IAED,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAE3C;IAED,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,EAEpB;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED,IAAI,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAEjC;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;IAED,IAAI,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAExC;IAED,IAAI,UAAU,IAAI,iBAAiB,GAAG,SAAS,CAE9C;IAED,IAAI,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,EAEnD;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAiB/B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAKvC,MAAM,CACV,KAAK,EAAE,MAAM,EACb,cAAc,GAAE,MAAM,GAAG,MAAqC,GAC7D,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"AccessToken.d.ts","sourceRoot":"","sources":["../src/AccessToken.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACX,MAAM,aAAa,CAAC;AAQrB,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAEtB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,MAAM,CAAc;IAE5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAErB;;;;OAIG;gBACS,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB;IAsC7E;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU;IAI1B;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,cAAc;IAIvC;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,QAAQ;IAI3B;;;OAGG;IACH,qBAAqB,CAAC,KAAK,EAAE,kBAAkB;IAI/C,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,EAEpB;IAED,IAAI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjC;IAED;;OAEG;IACH,IAAI,QAAQ,CAAC,EAAE,EAAE,MAAM,EAEtB;IAED,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAEnD;IAED,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAE3C;IAED,IAAI,IAAI,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,EAEpB;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED,IAAI,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAEjC;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;IAED,IAAI,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAExC;IAED,IAAI,UAAU,IAAI,iBAAiB,GAAG,SAAS,CAE9C;IAED,IAAI,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,EAEnD;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAiB/B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAKvC,MAAM,CACV,KAAK,EAAE,MAAM,EACb,cAAc,GAAE,MAAM,GAAG,MAAqC,GAC7D,OAAO,CAAC,WAAW,CAAC;CAexB"}
|
package/dist/AccessToken.js
CHANGED
|
@@ -137,7 +137,10 @@ class TokenVerifier {
|
|
|
137
137
|
const secret = new TextEncoder().encode(this.apiSecret);
|
|
138
138
|
const { payload } = await jose.jwtVerify(token, secret, {
|
|
139
139
|
issuer: this.apiKey,
|
|
140
|
-
clockTolerance
|
|
140
|
+
clockTolerance,
|
|
141
|
+
// First-party minters always set exp. Without this, a hand-rolled token
|
|
142
|
+
// with a valid signature and no exp verifies forever (livekit/protocol#1706).
|
|
143
|
+
requiredClaims: ["exp"]
|
|
141
144
|
});
|
|
142
145
|
if (!payload) {
|
|
143
146
|
throw Error("invalid token");
|
package/dist/AccessToken.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AccessToken.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { RoomConfiguration } from '@livekit/protocol';\nimport * as jose from 'jose';\nimport type {\n ClaimGrants,\n InferenceGrant,\n ObservabilityGrant,\n SIPGrant,\n VideoGrant,\n} from './grants.js';\nimport { claimsToJwtPayload } from './grants.js';\n\n// 6 hours\nconst defaultTTL = `6h`;\n\nconst defaultClockToleranceSeconds = 10;\n\nexport interface AccessTokenOptions {\n /**\n * amount of time before expiration\n * expressed in seconds or a string describing a time span zeit/ms.\n * eg: '2 days', '10h', or seconds as numeric value\n */\n ttl?: number | string;\n\n /**\n * display name for the participant, available as `Participant.name`\n */\n name?: string;\n\n /**\n * identity of the user, required for room join tokens\n */\n identity?: string;\n\n /**\n * custom participant metadata\n */\n metadata?: string;\n\n /**\n * custom participant attributes\n */\n attributes?: Record<string, string>;\n}\n\nexport class AccessToken {\n private apiKey: string;\n\n private apiSecret: string;\n\n private grants: ClaimGrants;\n\n identity?: string;\n\n ttl: number | string;\n\n /**\n * Creates a new AccessToken\n * @param apiKey - API Key, can be set in env LIVEKIT_API_KEY\n * @param apiSecret - Secret, can be set in env LIVEKIT_API_SECRET\n */\n constructor(apiKey?: string, apiSecret?: string, options?: AccessTokenOptions) {\n if (!apiKey) {\n apiKey = process.env.LIVEKIT_API_KEY;\n }\n if (!apiSecret) {\n apiSecret = process.env.LIVEKIT_API_SECRET;\n }\n if (!apiKey || !apiSecret) {\n throw Error('api-key and api-secret must be set');\n }\n // @ts-expect-error we're not including dom lib for the server sdk so document is not defined\n else if (typeof document !== 'undefined') {\n // check against document rather than window because deno provides window\n console.error(\n 'You should not include your API secret in your web client bundle.\\n\\n' +\n 'Your web client should request a token from your backend server which should then use ' +\n 'the API secret to generate a token. See https://docs.livekit.io/client/connect/',\n );\n }\n this.apiKey = apiKey;\n this.apiSecret = apiSecret;\n this.grants = {};\n this.identity = options?.identity;\n this.ttl = options?.ttl || defaultTTL;\n if (typeof this.ttl === 'number') {\n this.ttl = `${this.ttl}s`;\n }\n if (options?.metadata) {\n this.metadata = options.metadata;\n }\n if (options?.attributes) {\n this.attributes = options.attributes;\n }\n if (options?.name) {\n this.name = options.name;\n }\n }\n\n /**\n * Adds a video grant to this token.\n * @param grant -\n */\n addGrant(grant: VideoGrant) {\n this.grants.video = { ...(this.grants.video ?? {}), ...grant };\n }\n\n /**\n * Adds an inference grant to this token.\n * @param grant -\n */\n addInferenceGrant(grant: InferenceGrant) {\n this.grants.inference = { ...(this.grants.inference ?? {}), ...grant };\n }\n\n /**\n * Adds a SIP grant to this token.\n * @param grant -\n */\n addSIPGrant(grant: SIPGrant) {\n this.grants.sip = { ...(this.grants.sip ?? {}), ...grant };\n }\n\n /**\n * Adds an observability grant to this token.\n * @param grant -\n */\n addObservabilityGrant(grant: ObservabilityGrant) {\n this.grants.observability = { ...(this.grants.observability ?? {}), ...grant };\n }\n\n get name(): string | undefined {\n return this.grants.name;\n }\n\n set name(name: string) {\n this.grants.name = name;\n }\n\n get metadata(): string | undefined {\n return this.grants.metadata;\n }\n\n /**\n * Set metadata to be passed to the Participant, used only when joining the room\n */\n set metadata(md: string) {\n this.grants.metadata = md;\n }\n\n get attributes(): Record<string, string> | undefined {\n return this.grants.attributes;\n }\n\n set attributes(attrs: Record<string, string>) {\n this.grants.attributes = attrs;\n }\n\n get kind(): string | undefined {\n return this.grants.kind;\n }\n\n set kind(kind: string) {\n this.grants.kind = kind;\n }\n\n get sha256(): string | undefined {\n return this.grants.sha256;\n }\n\n set sha256(sha: string | undefined) {\n this.grants.sha256 = sha;\n }\n\n get roomPreset(): string | undefined {\n return this.grants.roomPreset;\n }\n\n set roomPreset(preset: string | undefined) {\n this.grants.roomPreset = preset;\n }\n\n get roomConfig(): RoomConfiguration | undefined {\n return this.grants.roomConfig;\n }\n\n set roomConfig(config: RoomConfiguration | undefined) {\n this.grants.roomConfig = config;\n }\n\n /**\n * @returns JWT encoded token\n */\n async toJwt(): Promise<string> {\n // TODO: check for video grant validity\n\n const secret = new TextEncoder().encode(this.apiSecret);\n\n const jwt = new jose.SignJWT(claimsToJwtPayload(this.grants))\n .setProtectedHeader({ alg: 'HS256' })\n .setIssuer(this.apiKey)\n .setExpirationTime(this.ttl)\n .setNotBefore(new Date());\n if (this.identity) {\n jwt.setSubject(this.identity);\n } else if (this.grants.video?.roomJoin) {\n throw Error('identity is required for join but not set');\n }\n return jwt.sign(secret);\n }\n}\n\nexport class TokenVerifier {\n private apiKey: string;\n\n private apiSecret: string;\n\n constructor(apiKey: string, apiSecret: string) {\n this.apiKey = apiKey;\n this.apiSecret = apiSecret;\n }\n\n async verify(\n token: string,\n clockTolerance: string | number = defaultClockToleranceSeconds,\n ): Promise<ClaimGrants> {\n const secret = new TextEncoder().encode(this.apiSecret);\n const { payload } = await jose.jwtVerify(token, secret, {\n issuer: this.apiKey,\n clockTolerance,\n });\n if (!payload) {\n throw Error('invalid token');\n }\n\n return payload as ClaimGrants;\n }\n}\n"],"mappings":"AAIA,YAAY,UAAU;AAQtB,SAAS,0BAA0B;AAGnC,MAAM,aAAa;AAEnB,MAAM,+BAA+B;AA+B9B,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBvB,YAAY,QAAiB,WAAoB,SAA8B;AAC7E,QAAI,CAAC,QAAQ;AACX,eAAS,QAAQ,IAAI;AAAA,IACvB;AACA,QAAI,CAAC,WAAW;AACd,kBAAY,QAAQ,IAAI;AAAA,IAC1B;AACA,QAAI,CAAC,UAAU,CAAC,WAAW;AACzB,YAAM,MAAM,oCAAoC;AAAA,IAClD,WAES,OAAO,aAAa,aAAa;AAExC,cAAQ;AAAA,QACN;AAAA,MAGF;AAAA,IACF;AACA,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,SAAS,CAAC;AACf,SAAK,WAAW,mCAAS;AACzB,SAAK,OAAM,mCAAS,QAAO;AAC3B,QAAI,OAAO,KAAK,QAAQ,UAAU;AAChC,WAAK,MAAM,GAAG,KAAK,GAAG;AAAA,IACxB;AACA,QAAI,mCAAS,UAAU;AACrB,WAAK,WAAW,QAAQ;AAAA,IAC1B;AACA,QAAI,mCAAS,YAAY;AACvB,WAAK,aAAa,QAAQ;AAAA,IAC5B;AACA,QAAI,mCAAS,MAAM;AACjB,WAAK,OAAO,QAAQ;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,OAAmB;AAC1B,SAAK,OAAO,QAAQ,EAAE,GAAI,KAAK,OAAO,SAAS,CAAC,GAAI,GAAG,MAAM;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,OAAuB;AACvC,SAAK,OAAO,YAAY,EAAE,GAAI,KAAK,OAAO,aAAa,CAAC,GAAI,GAAG,MAAM;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,OAAiB;AAC3B,SAAK,OAAO,MAAM,EAAE,GAAI,KAAK,OAAO,OAAO,CAAC,GAAI,GAAG,MAAM;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB,OAA2B;AAC/C,SAAK,OAAO,gBAAgB,EAAE,GAAI,KAAK,OAAO,iBAAiB,CAAC,GAAI,GAAG,MAAM;AAAA,EAC/E;AAAA,EAEA,IAAI,OAA2B;AAC7B,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,KAAK,MAAc;AACrB,SAAK,OAAO,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,WAA+B;AACjC,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAS,IAAY;AACvB,SAAK,OAAO,WAAW;AAAA,EACzB;AAAA,EAEA,IAAI,aAAiD;AACnD,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW,OAA+B;AAC5C,SAAK,OAAO,aAAa;AAAA,EAC3B;AAAA,EAEA,IAAI,OAA2B;AAC7B,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,KAAK,MAAc;AACrB,SAAK,OAAO,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,SAA6B;AAC/B,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,OAAO,KAAyB;AAClC,SAAK,OAAO,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,aAAiC;AACnC,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW,QAA4B;AACzC,SAAK,OAAO,aAAa;AAAA,EAC3B;AAAA,EAEA,IAAI,aAA4C;AAC9C,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAI,WAAW,QAAuC;AACpD,SAAK,OAAO,aAAa;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAyB;AApMjC;AAuMI,UAAM,SAAS,IAAI,YAAY,EAAE,OAAO,KAAK,SAAS;AAEtD,UAAM,MAAM,IAAI,KAAK,QAAQ,mBAAmB,KAAK,MAAM,CAAC,EACzD,mBAAmB,EAAE,KAAK,QAAQ,CAAC,EACnC,UAAU,KAAK,MAAM,EACrB,kBAAkB,KAAK,GAAG,EAC1B,aAAa,oBAAI,KAAK,CAAC;AAC1B,QAAI,KAAK,UAAU;AACjB,UAAI,WAAW,KAAK,QAAQ;AAAA,IAC9B,YAAW,UAAK,OAAO,UAAZ,mBAAmB,UAAU;AACtC,YAAM,MAAM,2CAA2C;AAAA,IACzD;AACA,WAAO,IAAI,KAAK,MAAM;AAAA,EACxB;AACF;AAEO,MAAM,cAAc;AAAA,EAKzB,YAAY,QAAgB,WAAmB;AAC7C,SAAK,SAAS;AACd,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,OACJ,OACA,iBAAkC,8BACZ;AACtB,UAAM,SAAS,IAAI,YAAY,EAAE,OAAO,KAAK,SAAS;AACtD,UAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,MACtD,QAAQ,KAAK;AAAA,MACb;AAAA,
|
|
1
|
+
{"version":3,"sources":["../src/AccessToken.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { RoomConfiguration } from '@livekit/protocol';\nimport * as jose from 'jose';\nimport type {\n ClaimGrants,\n InferenceGrant,\n ObservabilityGrant,\n SIPGrant,\n VideoGrant,\n} from './grants.js';\nimport { claimsToJwtPayload } from './grants.js';\n\n// 6 hours\nconst defaultTTL = `6h`;\n\nconst defaultClockToleranceSeconds = 10;\n\nexport interface AccessTokenOptions {\n /**\n * amount of time before expiration\n * expressed in seconds or a string describing a time span zeit/ms.\n * eg: '2 days', '10h', or seconds as numeric value\n */\n ttl?: number | string;\n\n /**\n * display name for the participant, available as `Participant.name`\n */\n name?: string;\n\n /**\n * identity of the user, required for room join tokens\n */\n identity?: string;\n\n /**\n * custom participant metadata\n */\n metadata?: string;\n\n /**\n * custom participant attributes\n */\n attributes?: Record<string, string>;\n}\n\nexport class AccessToken {\n private apiKey: string;\n\n private apiSecret: string;\n\n private grants: ClaimGrants;\n\n identity?: string;\n\n ttl: number | string;\n\n /**\n * Creates a new AccessToken\n * @param apiKey - API Key, can be set in env LIVEKIT_API_KEY\n * @param apiSecret - Secret, can be set in env LIVEKIT_API_SECRET\n */\n constructor(apiKey?: string, apiSecret?: string, options?: AccessTokenOptions) {\n if (!apiKey) {\n apiKey = process.env.LIVEKIT_API_KEY;\n }\n if (!apiSecret) {\n apiSecret = process.env.LIVEKIT_API_SECRET;\n }\n if (!apiKey || !apiSecret) {\n throw Error('api-key and api-secret must be set');\n }\n // @ts-expect-error we're not including dom lib for the server sdk so document is not defined\n else if (typeof document !== 'undefined') {\n // check against document rather than window because deno provides window\n console.error(\n 'You should not include your API secret in your web client bundle.\\n\\n' +\n 'Your web client should request a token from your backend server which should then use ' +\n 'the API secret to generate a token. See https://docs.livekit.io/client/connect/',\n );\n }\n this.apiKey = apiKey;\n this.apiSecret = apiSecret;\n this.grants = {};\n this.identity = options?.identity;\n this.ttl = options?.ttl || defaultTTL;\n if (typeof this.ttl === 'number') {\n this.ttl = `${this.ttl}s`;\n }\n if (options?.metadata) {\n this.metadata = options.metadata;\n }\n if (options?.attributes) {\n this.attributes = options.attributes;\n }\n if (options?.name) {\n this.name = options.name;\n }\n }\n\n /**\n * Adds a video grant to this token.\n * @param grant -\n */\n addGrant(grant: VideoGrant) {\n this.grants.video = { ...(this.grants.video ?? {}), ...grant };\n }\n\n /**\n * Adds an inference grant to this token.\n * @param grant -\n */\n addInferenceGrant(grant: InferenceGrant) {\n this.grants.inference = { ...(this.grants.inference ?? {}), ...grant };\n }\n\n /**\n * Adds a SIP grant to this token.\n * @param grant -\n */\n addSIPGrant(grant: SIPGrant) {\n this.grants.sip = { ...(this.grants.sip ?? {}), ...grant };\n }\n\n /**\n * Adds an observability grant to this token.\n * @param grant -\n */\n addObservabilityGrant(grant: ObservabilityGrant) {\n this.grants.observability = { ...(this.grants.observability ?? {}), ...grant };\n }\n\n get name(): string | undefined {\n return this.grants.name;\n }\n\n set name(name: string) {\n this.grants.name = name;\n }\n\n get metadata(): string | undefined {\n return this.grants.metadata;\n }\n\n /**\n * Set metadata to be passed to the Participant, used only when joining the room\n */\n set metadata(md: string) {\n this.grants.metadata = md;\n }\n\n get attributes(): Record<string, string> | undefined {\n return this.grants.attributes;\n }\n\n set attributes(attrs: Record<string, string>) {\n this.grants.attributes = attrs;\n }\n\n get kind(): string | undefined {\n return this.grants.kind;\n }\n\n set kind(kind: string) {\n this.grants.kind = kind;\n }\n\n get sha256(): string | undefined {\n return this.grants.sha256;\n }\n\n set sha256(sha: string | undefined) {\n this.grants.sha256 = sha;\n }\n\n get roomPreset(): string | undefined {\n return this.grants.roomPreset;\n }\n\n set roomPreset(preset: string | undefined) {\n this.grants.roomPreset = preset;\n }\n\n get roomConfig(): RoomConfiguration | undefined {\n return this.grants.roomConfig;\n }\n\n set roomConfig(config: RoomConfiguration | undefined) {\n this.grants.roomConfig = config;\n }\n\n /**\n * @returns JWT encoded token\n */\n async toJwt(): Promise<string> {\n // TODO: check for video grant validity\n\n const secret = new TextEncoder().encode(this.apiSecret);\n\n const jwt = new jose.SignJWT(claimsToJwtPayload(this.grants))\n .setProtectedHeader({ alg: 'HS256' })\n .setIssuer(this.apiKey)\n .setExpirationTime(this.ttl)\n .setNotBefore(new Date());\n if (this.identity) {\n jwt.setSubject(this.identity);\n } else if (this.grants.video?.roomJoin) {\n throw Error('identity is required for join but not set');\n }\n return jwt.sign(secret);\n }\n}\n\nexport class TokenVerifier {\n private apiKey: string;\n\n private apiSecret: string;\n\n constructor(apiKey: string, apiSecret: string) {\n this.apiKey = apiKey;\n this.apiSecret = apiSecret;\n }\n\n async verify(\n token: string,\n clockTolerance: string | number = defaultClockToleranceSeconds,\n ): Promise<ClaimGrants> {\n const secret = new TextEncoder().encode(this.apiSecret);\n const { payload } = await jose.jwtVerify(token, secret, {\n issuer: this.apiKey,\n clockTolerance,\n // First-party minters always set exp. Without this, a hand-rolled token\n // with a valid signature and no exp verifies forever (livekit/protocol#1706).\n requiredClaims: ['exp'],\n });\n if (!payload) {\n throw Error('invalid token');\n }\n\n return payload as ClaimGrants;\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/IngressClient.cjs
CHANGED
|
@@ -54,6 +54,7 @@ class IngressClient extends import_ServiceBase.ServiceBase {
|
|
|
54
54
|
}
|
|
55
55
|
const roomName = opts.roomName;
|
|
56
56
|
const enableTranscoding = opts.enableTranscoding;
|
|
57
|
+
const enabled = opts.enabled;
|
|
57
58
|
const audio = opts.audio;
|
|
58
59
|
const video = opts.video;
|
|
59
60
|
const participantMetadata = opts.participantMetadata;
|
|
@@ -78,6 +79,7 @@ class IngressClient extends import_ServiceBase.ServiceBase {
|
|
|
78
79
|
bypassTranscoding,
|
|
79
80
|
enableTranscoding,
|
|
80
81
|
url,
|
|
82
|
+
enabled,
|
|
81
83
|
audio,
|
|
82
84
|
video
|
|
83
85
|
}).toJson();
|
|
@@ -99,7 +101,7 @@ class IngressClient extends import_ServiceBase.ServiceBase {
|
|
|
99
101
|
const participantName = opts.participantName || "";
|
|
100
102
|
const participantIdentity = opts.participantIdentity || "";
|
|
101
103
|
const { participantMetadata } = opts;
|
|
102
|
-
const { audio, video, bypassTranscoding, enableTranscoding } = opts;
|
|
104
|
+
const { audio, video, bypassTranscoding, enableTranscoding, enabled } = opts;
|
|
103
105
|
const req = new import_protocol.UpdateIngressRequest({
|
|
104
106
|
ingressId,
|
|
105
107
|
name,
|
|
@@ -109,6 +111,7 @@ class IngressClient extends import_ServiceBase.ServiceBase {
|
|
|
109
111
|
participantMetadata,
|
|
110
112
|
bypassTranscoding,
|
|
111
113
|
enableTranscoding,
|
|
114
|
+
enabled,
|
|
112
115
|
audio,
|
|
113
116
|
video
|
|
114
117
|
}).toJson();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/IngressClient.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { IngressAudioOptions, IngressInput, IngressVideoOptions } from '@livekit/protocol';\nimport {\n CreateIngressRequest,\n DeleteIngressRequest,\n IngressInfo,\n ListIngressRequest,\n ListIngressResponse,\n UpdateIngressRequest,\n} from '@livekit/protocol';\nimport type { ClientOptions } from './ClientOptions.js';\nimport { ServiceBase } from './ServiceBase.js';\nimport type { Rpc } from './TwirpRPC.js';\nimport { TwirpRpc, livekitPackage } from './TwirpRPC.js';\n\nconst svc = 'Ingress';\n\nexport interface CreateIngressOptions {\n /**\n * ingress name. optional\n */\n name?: string;\n /**\n * name of the room to send media to. required\n */\n roomName?: string;\n /**\n * unique identity of the participant. required\n */\n participantIdentity: string;\n /**\n * participant display name\n */\n participantName?: string;\n /**\n * metadata to attach to the participant\n */\n participantMetadata?: string;\n /**\n * @deprecated use `enableTranscoding` instead.\n * whether to skip transcoding and forward the input media directly. Only supported by WHIP\n */\n bypassTranscoding?: boolean;\n /**\n * whether to enable transcoding or forward the input media directly.\n * Transcoding is required for all input types except WHIP. For WHIP, the default is to not transcode.\n */\n enableTranscoding?: boolean | undefined;\n /**\n * url of the media to pull for ingresses of type URL\n */\n url?: string;\n /**\n * custom audio encoding parameters. optional\n */\n audio?: IngressAudioOptions;\n /**\n * custom video encoding parameters. optional\n */\n video?: IngressVideoOptions;\n}\n\nexport interface UpdateIngressOptions {\n /**\n * ingress name. optional\n */\n name: string;\n /**\n * name of the room to send media to.\n */\n roomName?: string;\n /**\n * unique identity of the participant.\n */\n participantIdentity?: string;\n /**\n * participant display name\n */\n participantName?: string;\n /**\n * metadata to attach to the participant\n */\n participantMetadata?: string;\n /**\n * @deprecated use `enableTranscoding` instead\n * whether to skip transcoding and forward the input media directly. Only supported by WHIP\n */\n bypassTranscoding?: boolean | undefined;\n /**\n * whether to enable transcoding or forward the input media directly.\n * Transcoding is required for all input types except WHIP. For WHIP, the default is to not transcode.\n */\n enableTranscoding?: boolean | undefined;\n /**\n * custom audio encoding parameters. optional\n */\n audio?: IngressAudioOptions;\n /**\n * custom video encoding parameters. optional\n */\n video?: IngressVideoOptions;\n}\n\nexport interface ListIngressOptions {\n /**\n * list ingress for one room only\n */\n roomName?: string;\n\n /**\n * list ingress by ID\n */\n ingressId?: string;\n}\n\n/**\n * Client to access Ingress APIs\n */\nexport class IngressClient extends ServiceBase {\n private readonly rpc: Rpc;\n\n /**\n * @param host - hostname including protocol. i.e. 'https://<project>.livekit.cloud'\n * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY\n * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET\n * @param options - client options\n */\n constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) {\n super({ apiKey, secret, token: options?.token });\n this.rpc = new TwirpRpc(host, livekitPackage, {\n requestTimeout: options?.requestTimeout,\n failover: options?.failover,\n });\n }\n\n /**\n * @param inputType - protocol for the ingress\n * @param opts - CreateIngressOptions\n */\n async createIngress(inputType: IngressInput, opts: CreateIngressOptions): Promise<IngressInfo> {\n let name: string = '';\n let participantName: string = '';\n let participantIdentity: string = '';\n let bypassTranscoding: boolean = false;\n let url: string = '';\n\n if (opts == null) {\n throw new Error('options dictionary is required');\n }\n\n const roomName: string | undefined = opts.roomName;\n const enableTranscoding: boolean | undefined = opts.enableTranscoding;\n const audio: IngressAudioOptions | undefined = opts.audio;\n const video: IngressVideoOptions | undefined = opts.video;\n const participantMetadata: string | undefined = opts.participantMetadata;\n\n name = opts.name || '';\n participantName = opts.participantName || '';\n participantIdentity = opts.participantIdentity || '';\n bypassTranscoding = opts.bypassTranscoding || false;\n url = opts.url || '';\n\n if (typeof roomName == 'undefined') {\n throw new Error('required roomName option not provided');\n }\n\n if (participantIdentity == '') {\n throw new Error('required participantIdentity option not provided');\n }\n\n const req = new CreateIngressRequest({\n inputType,\n name,\n roomName,\n participantIdentity,\n participantMetadata,\n participantName,\n bypassTranscoding,\n enableTranscoding,\n url,\n audio,\n video,\n }).toJson();\n\n const data = await this.rpc.request(\n svc,\n 'CreateIngress',\n req,\n await this.authHeader({ ingressAdmin: true }),\n );\n return IngressInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n /**\n * @param ingressId - ID of the ingress to update\n * @param opts - UpdateIngressOptions\n */\n async updateIngress(ingressId: string, opts: UpdateIngressOptions): Promise<IngressInfo> {\n const name: string = opts.name || '';\n const roomName: string = opts.roomName || '';\n const participantName: string = opts.participantName || '';\n const participantIdentity: string = opts.participantIdentity || '';\n const { participantMetadata } = opts;\n const { audio, video, bypassTranscoding, enableTranscoding } = opts;\n\n const req = new UpdateIngressRequest({\n ingressId,\n name,\n roomName,\n participantIdentity,\n participantName,\n participantMetadata,\n bypassTranscoding,\n enableTranscoding,\n audio,\n video,\n }).toJson();\n\n const data = await this.rpc.request(\n svc,\n 'UpdateIngress',\n req,\n await this.authHeader({ ingressAdmin: true }),\n );\n return IngressInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n /**\n * @deprecated use `listIngress(opts)` or `listIngress(arg)` instead\n * @param roomName - list ingress for one room only\n */\n async listIngress(roomName?: string): Promise<Array<IngressInfo>>;\n /**\n * @param opts - list options\n */\n async listIngress(opts?: ListIngressOptions): Promise<Array<IngressInfo>>;\n /**\n * @param arg - list room name or options\n */\n async listIngress(arg?: string | ListIngressOptions): Promise<Array<IngressInfo>> {\n let req: Partial<ListIngressRequest> = {};\n if (typeof arg === 'string') {\n req.roomName = arg;\n } else if (arg) {\n req = arg;\n }\n const data = await this.rpc.request(\n svc,\n 'ListIngress',\n new ListIngressRequest(req).toJson(),\n await this.authHeader({ ingressAdmin: true }),\n );\n return ListIngressResponse.fromJson(data, { ignoreUnknownFields: true }).items ?? [];\n }\n\n /**\n * @param ingressId - ingress to delete\n */\n async deleteIngress(ingressId: string): Promise<IngressInfo> {\n const data = await this.rpc.request(\n svc,\n 'DeleteIngress',\n new DeleteIngressRequest({ ingressId }).toJson(),\n await this.authHeader({ ingressAdmin: true }),\n );\n return IngressInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/IngressClient.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { IngressAudioOptions, IngressInput, IngressVideoOptions } from '@livekit/protocol';\nimport {\n CreateIngressRequest,\n DeleteIngressRequest,\n IngressInfo,\n ListIngressRequest,\n ListIngressResponse,\n UpdateIngressRequest,\n} from '@livekit/protocol';\nimport type { ClientOptions } from './ClientOptions.js';\nimport { ServiceBase } from './ServiceBase.js';\nimport type { Rpc } from './TwirpRPC.js';\nimport { TwirpRpc, livekitPackage } from './TwirpRPC.js';\n\nconst svc = 'Ingress';\n\nexport interface CreateIngressOptions {\n /**\n * ingress name. optional\n */\n name?: string;\n /**\n * name of the room to send media to. required\n */\n roomName?: string;\n /**\n * unique identity of the participant. required\n */\n participantIdentity: string;\n /**\n * participant display name\n */\n participantName?: string;\n /**\n * metadata to attach to the participant\n */\n participantMetadata?: string;\n /**\n * @deprecated use `enableTranscoding` instead.\n * whether to skip transcoding and forward the input media directly. Only supported by WHIP\n */\n bypassTranscoding?: boolean;\n /**\n * whether to enable transcoding or forward the input media directly.\n * Transcoding is required for all input types except WHIP. For WHIP, the default is to not transcode.\n */\n enableTranscoding?: boolean | undefined;\n /**\n * url of the media to pull for ingresses of type URL\n */\n url?: string;\n /**\n * whether the ingress is enabled. When set to false, new connection attempts are rejected\n * while the stream key is preserved. The default is true.\n */\n enabled?: boolean;\n /**\n * custom audio encoding parameters. optional\n */\n audio?: IngressAudioOptions;\n /**\n * custom video encoding parameters. optional\n */\n video?: IngressVideoOptions;\n}\n\nexport interface UpdateIngressOptions {\n /**\n * ingress name. optional\n */\n name: string;\n /**\n * name of the room to send media to.\n */\n roomName?: string;\n /**\n * unique identity of the participant.\n */\n participantIdentity?: string;\n /**\n * participant display name\n */\n participantName?: string;\n /**\n * metadata to attach to the participant\n */\n participantMetadata?: string;\n /**\n * @deprecated use `enableTranscoding` instead\n * whether to skip transcoding and forward the input media directly. Only supported by WHIP\n */\n bypassTranscoding?: boolean | undefined;\n /**\n * whether to enable transcoding or forward the input media directly.\n * Transcoding is required for all input types except WHIP. For WHIP, the default is to not transcode.\n */\n enableTranscoding?: boolean | undefined;\n /**\n * whether the ingress is enabled. When set to false, new connection attempts are rejected\n * while the stream key is preserved. The default is true.\n */\n enabled?: boolean;\n /**\n * custom audio encoding parameters. optional\n */\n audio?: IngressAudioOptions;\n /**\n * custom video encoding parameters. optional\n */\n video?: IngressVideoOptions;\n}\n\nexport interface ListIngressOptions {\n /**\n * list ingress for one room only\n */\n roomName?: string;\n\n /**\n * list ingress by ID\n */\n ingressId?: string;\n}\n\n/**\n * Client to access Ingress APIs\n */\nexport class IngressClient extends ServiceBase {\n private readonly rpc: Rpc;\n\n /**\n * @param host - hostname including protocol. i.e. 'https://<project>.livekit.cloud'\n * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY\n * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET\n * @param options - client options\n */\n constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) {\n super({ apiKey, secret, token: options?.token });\n this.rpc = new TwirpRpc(host, livekitPackage, {\n requestTimeout: options?.requestTimeout,\n failover: options?.failover,\n });\n }\n\n /**\n * @param inputType - protocol for the ingress\n * @param opts - CreateIngressOptions\n */\n async createIngress(inputType: IngressInput, opts: CreateIngressOptions): Promise<IngressInfo> {\n let name: string = '';\n let participantName: string = '';\n let participantIdentity: string = '';\n let bypassTranscoding: boolean = false;\n let url: string = '';\n\n if (opts == null) {\n throw new Error('options dictionary is required');\n }\n\n const roomName: string | undefined = opts.roomName;\n const enableTranscoding: boolean | undefined = opts.enableTranscoding;\n const enabled: boolean | undefined = opts.enabled;\n const audio: IngressAudioOptions | undefined = opts.audio;\n const video: IngressVideoOptions | undefined = opts.video;\n const participantMetadata: string | undefined = opts.participantMetadata;\n\n name = opts.name || '';\n participantName = opts.participantName || '';\n participantIdentity = opts.participantIdentity || '';\n bypassTranscoding = opts.bypassTranscoding || false;\n url = opts.url || '';\n\n if (typeof roomName == 'undefined') {\n throw new Error('required roomName option not provided');\n }\n\n if (participantIdentity == '') {\n throw new Error('required participantIdentity option not provided');\n }\n\n const req = new CreateIngressRequest({\n inputType,\n name,\n roomName,\n participantIdentity,\n participantMetadata,\n participantName,\n bypassTranscoding,\n enableTranscoding,\n url,\n enabled,\n audio,\n video,\n }).toJson();\n\n const data = await this.rpc.request(\n svc,\n 'CreateIngress',\n req,\n await this.authHeader({ ingressAdmin: true }),\n );\n return IngressInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n /**\n * @param ingressId - ID of the ingress to update\n * @param opts - UpdateIngressOptions\n */\n async updateIngress(ingressId: string, opts: UpdateIngressOptions): Promise<IngressInfo> {\n const name: string = opts.name || '';\n const roomName: string = opts.roomName || '';\n const participantName: string = opts.participantName || '';\n const participantIdentity: string = opts.participantIdentity || '';\n const { participantMetadata } = opts;\n const { audio, video, bypassTranscoding, enableTranscoding, enabled } = opts;\n\n const req = new UpdateIngressRequest({\n ingressId,\n name,\n roomName,\n participantIdentity,\n participantName,\n participantMetadata,\n bypassTranscoding,\n enableTranscoding,\n enabled,\n audio,\n video,\n }).toJson();\n\n const data = await this.rpc.request(\n svc,\n 'UpdateIngress',\n req,\n await this.authHeader({ ingressAdmin: true }),\n );\n return IngressInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n /**\n * @deprecated use `listIngress(opts)` or `listIngress(arg)` instead\n * @param roomName - list ingress for one room only\n */\n async listIngress(roomName?: string): Promise<Array<IngressInfo>>;\n /**\n * @param opts - list options\n */\n async listIngress(opts?: ListIngressOptions): Promise<Array<IngressInfo>>;\n /**\n * @param arg - list room name or options\n */\n async listIngress(arg?: string | ListIngressOptions): Promise<Array<IngressInfo>> {\n let req: Partial<ListIngressRequest> = {};\n if (typeof arg === 'string') {\n req.roomName = arg;\n } else if (arg) {\n req = arg;\n }\n const data = await this.rpc.request(\n svc,\n 'ListIngress',\n new ListIngressRequest(req).toJson(),\n await this.authHeader({ ingressAdmin: true }),\n );\n return ListIngressResponse.fromJson(data, { ignoreUnknownFields: true }).items ?? [];\n }\n\n /**\n * @param ingressId - ingress to delete\n */\n async deleteIngress(ingressId: string): Promise<IngressInfo> {\n const data = await this.rpc.request(\n svc,\n 'DeleteIngress',\n new DeleteIngressRequest({ ingressId }).toJson(),\n await this.authHeader({ ingressAdmin: true }),\n );\n return IngressInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/IngressClient.d.cts
CHANGED
|
@@ -39,6 +39,11 @@ interface CreateIngressOptions {
|
|
|
39
39
|
* url of the media to pull for ingresses of type URL
|
|
40
40
|
*/
|
|
41
41
|
url?: string;
|
|
42
|
+
/**
|
|
43
|
+
* whether the ingress is enabled. When set to false, new connection attempts are rejected
|
|
44
|
+
* while the stream key is preserved. The default is true.
|
|
45
|
+
*/
|
|
46
|
+
enabled?: boolean;
|
|
42
47
|
/**
|
|
43
48
|
* custom audio encoding parameters. optional
|
|
44
49
|
*/
|
|
@@ -79,6 +84,11 @@ interface UpdateIngressOptions {
|
|
|
79
84
|
* Transcoding is required for all input types except WHIP. For WHIP, the default is to not transcode.
|
|
80
85
|
*/
|
|
81
86
|
enableTranscoding?: boolean | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* whether the ingress is enabled. When set to false, new connection attempts are rejected
|
|
89
|
+
* while the stream key is preserved. The default is true.
|
|
90
|
+
*/
|
|
91
|
+
enabled?: boolean;
|
|
82
92
|
/**
|
|
83
93
|
* custom audio encoding parameters. optional
|
|
84
94
|
*/
|
package/dist/IngressClient.d.ts
CHANGED
|
@@ -39,6 +39,11 @@ interface CreateIngressOptions {
|
|
|
39
39
|
* url of the media to pull for ingresses of type URL
|
|
40
40
|
*/
|
|
41
41
|
url?: string;
|
|
42
|
+
/**
|
|
43
|
+
* whether the ingress is enabled. When set to false, new connection attempts are rejected
|
|
44
|
+
* while the stream key is preserved. The default is true.
|
|
45
|
+
*/
|
|
46
|
+
enabled?: boolean;
|
|
42
47
|
/**
|
|
43
48
|
* custom audio encoding parameters. optional
|
|
44
49
|
*/
|
|
@@ -79,6 +84,11 @@ interface UpdateIngressOptions {
|
|
|
79
84
|
* Transcoding is required for all input types except WHIP. For WHIP, the default is to not transcode.
|
|
80
85
|
*/
|
|
81
86
|
enableTranscoding?: boolean | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* whether the ingress is enabled. When set to false, new connection attempts are rejected
|
|
89
|
+
* while the stream key is preserved. The default is true.
|
|
90
|
+
*/
|
|
91
|
+
enabled?: boolean;
|
|
82
92
|
/**
|
|
83
93
|
* custom audio encoding parameters. optional
|
|
84
94
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IngressClient.d.ts","sourceRoot":"","sources":["../src/IngressClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAGL,WAAW,EAIZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM/C,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B;;OAEG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC;;OAEG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B;;OAEG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAE1B;;;;;OAKG;gBACS,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa;IAQnF;;;OAGG;IACG,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"IngressClient.d.ts","sourceRoot":"","sources":["../src/IngressClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAGL,WAAW,EAIZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM/C,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B;;OAEG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B;;OAEG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,WAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAM;IAE1B;;;;;OAKG;gBACS,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa;IAQnF;;;OAGG;IACG,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;IAwD9F;;;OAGG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;IA+BxF;;;OAGG;IACG,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACjE;;OAEG;IACG,WAAW,CAAC,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAoBzE;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAS7D"}
|
package/dist/IngressClient.js
CHANGED
|
@@ -38,6 +38,7 @@ class IngressClient extends ServiceBase {
|
|
|
38
38
|
}
|
|
39
39
|
const roomName = opts.roomName;
|
|
40
40
|
const enableTranscoding = opts.enableTranscoding;
|
|
41
|
+
const enabled = opts.enabled;
|
|
41
42
|
const audio = opts.audio;
|
|
42
43
|
const video = opts.video;
|
|
43
44
|
const participantMetadata = opts.participantMetadata;
|
|
@@ -62,6 +63,7 @@ class IngressClient extends ServiceBase {
|
|
|
62
63
|
bypassTranscoding,
|
|
63
64
|
enableTranscoding,
|
|
64
65
|
url,
|
|
66
|
+
enabled,
|
|
65
67
|
audio,
|
|
66
68
|
video
|
|
67
69
|
}).toJson();
|
|
@@ -83,7 +85,7 @@ class IngressClient extends ServiceBase {
|
|
|
83
85
|
const participantName = opts.participantName || "";
|
|
84
86
|
const participantIdentity = opts.participantIdentity || "";
|
|
85
87
|
const { participantMetadata } = opts;
|
|
86
|
-
const { audio, video, bypassTranscoding, enableTranscoding } = opts;
|
|
88
|
+
const { audio, video, bypassTranscoding, enableTranscoding, enabled } = opts;
|
|
87
89
|
const req = new UpdateIngressRequest({
|
|
88
90
|
ingressId,
|
|
89
91
|
name,
|
|
@@ -93,6 +95,7 @@ class IngressClient extends ServiceBase {
|
|
|
93
95
|
participantMetadata,
|
|
94
96
|
bypassTranscoding,
|
|
95
97
|
enableTranscoding,
|
|
98
|
+
enabled,
|
|
96
99
|
audio,
|
|
97
100
|
video
|
|
98
101
|
}).toJson();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/IngressClient.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { IngressAudioOptions, IngressInput, IngressVideoOptions } from '@livekit/protocol';\nimport {\n CreateIngressRequest,\n DeleteIngressRequest,\n IngressInfo,\n ListIngressRequest,\n ListIngressResponse,\n UpdateIngressRequest,\n} from '@livekit/protocol';\nimport type { ClientOptions } from './ClientOptions.js';\nimport { ServiceBase } from './ServiceBase.js';\nimport type { Rpc } from './TwirpRPC.js';\nimport { TwirpRpc, livekitPackage } from './TwirpRPC.js';\n\nconst svc = 'Ingress';\n\nexport interface CreateIngressOptions {\n /**\n * ingress name. optional\n */\n name?: string;\n /**\n * name of the room to send media to. required\n */\n roomName?: string;\n /**\n * unique identity of the participant. required\n */\n participantIdentity: string;\n /**\n * participant display name\n */\n participantName?: string;\n /**\n * metadata to attach to the participant\n */\n participantMetadata?: string;\n /**\n * @deprecated use `enableTranscoding` instead.\n * whether to skip transcoding and forward the input media directly. Only supported by WHIP\n */\n bypassTranscoding?: boolean;\n /**\n * whether to enable transcoding or forward the input media directly.\n * Transcoding is required for all input types except WHIP. For WHIP, the default is to not transcode.\n */\n enableTranscoding?: boolean | undefined;\n /**\n * url of the media to pull for ingresses of type URL\n */\n url?: string;\n /**\n * custom audio encoding parameters. optional\n */\n audio?: IngressAudioOptions;\n /**\n * custom video encoding parameters. optional\n */\n video?: IngressVideoOptions;\n}\n\nexport interface UpdateIngressOptions {\n /**\n * ingress name. optional\n */\n name: string;\n /**\n * name of the room to send media to.\n */\n roomName?: string;\n /**\n * unique identity of the participant.\n */\n participantIdentity?: string;\n /**\n * participant display name\n */\n participantName?: string;\n /**\n * metadata to attach to the participant\n */\n participantMetadata?: string;\n /**\n * @deprecated use `enableTranscoding` instead\n * whether to skip transcoding and forward the input media directly. Only supported by WHIP\n */\n bypassTranscoding?: boolean | undefined;\n /**\n * whether to enable transcoding or forward the input media directly.\n * Transcoding is required for all input types except WHIP. For WHIP, the default is to not transcode.\n */\n enableTranscoding?: boolean | undefined;\n /**\n * custom audio encoding parameters. optional\n */\n audio?: IngressAudioOptions;\n /**\n * custom video encoding parameters. optional\n */\n video?: IngressVideoOptions;\n}\n\nexport interface ListIngressOptions {\n /**\n * list ingress for one room only\n */\n roomName?: string;\n\n /**\n * list ingress by ID\n */\n ingressId?: string;\n}\n\n/**\n * Client to access Ingress APIs\n */\nexport class IngressClient extends ServiceBase {\n private readonly rpc: Rpc;\n\n /**\n * @param host - hostname including protocol. i.e. 'https://<project>.livekit.cloud'\n * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY\n * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET\n * @param options - client options\n */\n constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) {\n super({ apiKey, secret, token: options?.token });\n this.rpc = new TwirpRpc(host, livekitPackage, {\n requestTimeout: options?.requestTimeout,\n failover: options?.failover,\n });\n }\n\n /**\n * @param inputType - protocol for the ingress\n * @param opts - CreateIngressOptions\n */\n async createIngress(inputType: IngressInput, opts: CreateIngressOptions): Promise<IngressInfo> {\n let name: string = '';\n let participantName: string = '';\n let participantIdentity: string = '';\n let bypassTranscoding: boolean = false;\n let url: string = '';\n\n if (opts == null) {\n throw new Error('options dictionary is required');\n }\n\n const roomName: string | undefined = opts.roomName;\n const enableTranscoding: boolean | undefined = opts.enableTranscoding;\n const audio: IngressAudioOptions | undefined = opts.audio;\n const video: IngressVideoOptions | undefined = opts.video;\n const participantMetadata: string | undefined = opts.participantMetadata;\n\n name = opts.name || '';\n participantName = opts.participantName || '';\n participantIdentity = opts.participantIdentity || '';\n bypassTranscoding = opts.bypassTranscoding || false;\n url = opts.url || '';\n\n if (typeof roomName == 'undefined') {\n throw new Error('required roomName option not provided');\n }\n\n if (participantIdentity == '') {\n throw new Error('required participantIdentity option not provided');\n }\n\n const req = new CreateIngressRequest({\n inputType,\n name,\n roomName,\n participantIdentity,\n participantMetadata,\n participantName,\n bypassTranscoding,\n enableTranscoding,\n url,\n audio,\n video,\n }).toJson();\n\n const data = await this.rpc.request(\n svc,\n 'CreateIngress',\n req,\n await this.authHeader({ ingressAdmin: true }),\n );\n return IngressInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n /**\n * @param ingressId - ID of the ingress to update\n * @param opts - UpdateIngressOptions\n */\n async updateIngress(ingressId: string, opts: UpdateIngressOptions): Promise<IngressInfo> {\n const name: string = opts.name || '';\n const roomName: string = opts.roomName || '';\n const participantName: string = opts.participantName || '';\n const participantIdentity: string = opts.participantIdentity || '';\n const { participantMetadata } = opts;\n const { audio, video, bypassTranscoding, enableTranscoding } = opts;\n\n const req = new UpdateIngressRequest({\n ingressId,\n name,\n roomName,\n participantIdentity,\n participantName,\n participantMetadata,\n bypassTranscoding,\n enableTranscoding,\n audio,\n video,\n }).toJson();\n\n const data = await this.rpc.request(\n svc,\n 'UpdateIngress',\n req,\n await this.authHeader({ ingressAdmin: true }),\n );\n return IngressInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n /**\n * @deprecated use `listIngress(opts)` or `listIngress(arg)` instead\n * @param roomName - list ingress for one room only\n */\n async listIngress(roomName?: string): Promise<Array<IngressInfo>>;\n /**\n * @param opts - list options\n */\n async listIngress(opts?: ListIngressOptions): Promise<Array<IngressInfo>>;\n /**\n * @param arg - list room name or options\n */\n async listIngress(arg?: string | ListIngressOptions): Promise<Array<IngressInfo>> {\n let req: Partial<ListIngressRequest> = {};\n if (typeof arg === 'string') {\n req.roomName = arg;\n } else if (arg) {\n req = arg;\n }\n const data = await this.rpc.request(\n svc,\n 'ListIngress',\n new ListIngressRequest(req).toJson(),\n await this.authHeader({ ingressAdmin: true }),\n );\n return ListIngressResponse.fromJson(data, { ignoreUnknownFields: true }).items ?? [];\n }\n\n /**\n * @param ingressId - ingress to delete\n */\n async deleteIngress(ingressId: string): Promise<IngressInfo> {\n const data = await this.rpc.request(\n svc,\n 'DeleteIngress',\n new DeleteIngressRequest({ ingressId }).toJson(),\n await this.authHeader({ ingressAdmin: true }),\n );\n return IngressInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/IngressClient.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { IngressAudioOptions, IngressInput, IngressVideoOptions } from '@livekit/protocol';\nimport {\n CreateIngressRequest,\n DeleteIngressRequest,\n IngressInfo,\n ListIngressRequest,\n ListIngressResponse,\n UpdateIngressRequest,\n} from '@livekit/protocol';\nimport type { ClientOptions } from './ClientOptions.js';\nimport { ServiceBase } from './ServiceBase.js';\nimport type { Rpc } from './TwirpRPC.js';\nimport { TwirpRpc, livekitPackage } from './TwirpRPC.js';\n\nconst svc = 'Ingress';\n\nexport interface CreateIngressOptions {\n /**\n * ingress name. optional\n */\n name?: string;\n /**\n * name of the room to send media to. required\n */\n roomName?: string;\n /**\n * unique identity of the participant. required\n */\n participantIdentity: string;\n /**\n * participant display name\n */\n participantName?: string;\n /**\n * metadata to attach to the participant\n */\n participantMetadata?: string;\n /**\n * @deprecated use `enableTranscoding` instead.\n * whether to skip transcoding and forward the input media directly. Only supported by WHIP\n */\n bypassTranscoding?: boolean;\n /**\n * whether to enable transcoding or forward the input media directly.\n * Transcoding is required for all input types except WHIP. For WHIP, the default is to not transcode.\n */\n enableTranscoding?: boolean | undefined;\n /**\n * url of the media to pull for ingresses of type URL\n */\n url?: string;\n /**\n * whether the ingress is enabled. When set to false, new connection attempts are rejected\n * while the stream key is preserved. The default is true.\n */\n enabled?: boolean;\n /**\n * custom audio encoding parameters. optional\n */\n audio?: IngressAudioOptions;\n /**\n * custom video encoding parameters. optional\n */\n video?: IngressVideoOptions;\n}\n\nexport interface UpdateIngressOptions {\n /**\n * ingress name. optional\n */\n name: string;\n /**\n * name of the room to send media to.\n */\n roomName?: string;\n /**\n * unique identity of the participant.\n */\n participantIdentity?: string;\n /**\n * participant display name\n */\n participantName?: string;\n /**\n * metadata to attach to the participant\n */\n participantMetadata?: string;\n /**\n * @deprecated use `enableTranscoding` instead\n * whether to skip transcoding and forward the input media directly. Only supported by WHIP\n */\n bypassTranscoding?: boolean | undefined;\n /**\n * whether to enable transcoding or forward the input media directly.\n * Transcoding is required for all input types except WHIP. For WHIP, the default is to not transcode.\n */\n enableTranscoding?: boolean | undefined;\n /**\n * whether the ingress is enabled. When set to false, new connection attempts are rejected\n * while the stream key is preserved. The default is true.\n */\n enabled?: boolean;\n /**\n * custom audio encoding parameters. optional\n */\n audio?: IngressAudioOptions;\n /**\n * custom video encoding parameters. optional\n */\n video?: IngressVideoOptions;\n}\n\nexport interface ListIngressOptions {\n /**\n * list ingress for one room only\n */\n roomName?: string;\n\n /**\n * list ingress by ID\n */\n ingressId?: string;\n}\n\n/**\n * Client to access Ingress APIs\n */\nexport class IngressClient extends ServiceBase {\n private readonly rpc: Rpc;\n\n /**\n * @param host - hostname including protocol. i.e. 'https://<project>.livekit.cloud'\n * @param apiKey - API Key, can be set in env var LIVEKIT_API_KEY\n * @param secret - API Secret, can be set in env var LIVEKIT_API_SECRET\n * @param options - client options\n */\n constructor(host: string, apiKey?: string, secret?: string, options?: ClientOptions) {\n super({ apiKey, secret, token: options?.token });\n this.rpc = new TwirpRpc(host, livekitPackage, {\n requestTimeout: options?.requestTimeout,\n failover: options?.failover,\n });\n }\n\n /**\n * @param inputType - protocol for the ingress\n * @param opts - CreateIngressOptions\n */\n async createIngress(inputType: IngressInput, opts: CreateIngressOptions): Promise<IngressInfo> {\n let name: string = '';\n let participantName: string = '';\n let participantIdentity: string = '';\n let bypassTranscoding: boolean = false;\n let url: string = '';\n\n if (opts == null) {\n throw new Error('options dictionary is required');\n }\n\n const roomName: string | undefined = opts.roomName;\n const enableTranscoding: boolean | undefined = opts.enableTranscoding;\n const enabled: boolean | undefined = opts.enabled;\n const audio: IngressAudioOptions | undefined = opts.audio;\n const video: IngressVideoOptions | undefined = opts.video;\n const participantMetadata: string | undefined = opts.participantMetadata;\n\n name = opts.name || '';\n participantName = opts.participantName || '';\n participantIdentity = opts.participantIdentity || '';\n bypassTranscoding = opts.bypassTranscoding || false;\n url = opts.url || '';\n\n if (typeof roomName == 'undefined') {\n throw new Error('required roomName option not provided');\n }\n\n if (participantIdentity == '') {\n throw new Error('required participantIdentity option not provided');\n }\n\n const req = new CreateIngressRequest({\n inputType,\n name,\n roomName,\n participantIdentity,\n participantMetadata,\n participantName,\n bypassTranscoding,\n enableTranscoding,\n url,\n enabled,\n audio,\n video,\n }).toJson();\n\n const data = await this.rpc.request(\n svc,\n 'CreateIngress',\n req,\n await this.authHeader({ ingressAdmin: true }),\n );\n return IngressInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n /**\n * @param ingressId - ID of the ingress to update\n * @param opts - UpdateIngressOptions\n */\n async updateIngress(ingressId: string, opts: UpdateIngressOptions): Promise<IngressInfo> {\n const name: string = opts.name || '';\n const roomName: string = opts.roomName || '';\n const participantName: string = opts.participantName || '';\n const participantIdentity: string = opts.participantIdentity || '';\n const { participantMetadata } = opts;\n const { audio, video, bypassTranscoding, enableTranscoding, enabled } = opts;\n\n const req = new UpdateIngressRequest({\n ingressId,\n name,\n roomName,\n participantIdentity,\n participantName,\n participantMetadata,\n bypassTranscoding,\n enableTranscoding,\n enabled,\n audio,\n video,\n }).toJson();\n\n const data = await this.rpc.request(\n svc,\n 'UpdateIngress',\n req,\n await this.authHeader({ ingressAdmin: true }),\n );\n return IngressInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n /**\n * @deprecated use `listIngress(opts)` or `listIngress(arg)` instead\n * @param roomName - list ingress for one room only\n */\n async listIngress(roomName?: string): Promise<Array<IngressInfo>>;\n /**\n * @param opts - list options\n */\n async listIngress(opts?: ListIngressOptions): Promise<Array<IngressInfo>>;\n /**\n * @param arg - list room name or options\n */\n async listIngress(arg?: string | ListIngressOptions): Promise<Array<IngressInfo>> {\n let req: Partial<ListIngressRequest> = {};\n if (typeof arg === 'string') {\n req.roomName = arg;\n } else if (arg) {\n req = arg;\n }\n const data = await this.rpc.request(\n svc,\n 'ListIngress',\n new ListIngressRequest(req).toJson(),\n await this.authHeader({ ingressAdmin: true }),\n );\n return ListIngressResponse.fromJson(data, { ignoreUnknownFields: true }).items ?? [];\n }\n\n /**\n * @param ingressId - ingress to delete\n */\n async deleteIngress(ingressId: string): Promise<IngressInfo> {\n const data = await this.rpc.request(\n svc,\n 'DeleteIngress',\n new DeleteIngressRequest({ ingressId }).toJson(),\n await this.authHeader({ ingressAdmin: true }),\n );\n return IngressInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/version.cjs
CHANGED
|
@@ -21,7 +21,7 @@ __export(version_exports, {
|
|
|
21
21
|
SDK_VERSION: () => SDK_VERSION
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(version_exports);
|
|
24
|
-
const SDK_VERSION = "2.19.
|
|
24
|
+
const SDK_VERSION = "2.19.1";
|
|
25
25
|
// Annotate the CommonJS export names for ESM import in node:
|
|
26
26
|
0 && (module.exports = {
|
|
27
27
|
SDK_VERSION
|
package/dist/version.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts"],"sourcesContent":["export const SDK_VERSION = \"2.19.
|
|
1
|
+
{"version":3,"sources":["../src/version.ts"],"sourcesContent":["export const SDK_VERSION = \"2.19.1\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,cAAc;","names":[]}
|
package/dist/version.d.cts
CHANGED
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts"],"sourcesContent":["export const SDK_VERSION = \"2.19.
|
|
1
|
+
{"version":3,"sources":["../src/version.ts"],"sourcesContent":["export const SDK_VERSION = \"2.19.1\";\n"],"mappings":"AAAO,MAAM,cAAc;","names":[]}
|
package/package.json
CHANGED
package/src/AccessToken.test.ts
CHANGED
|
@@ -64,6 +64,19 @@ describe('identity is required for only join grants', () => {
|
|
|
64
64
|
});
|
|
65
65
|
|
|
66
66
|
describe('verify token is valid', () => {
|
|
67
|
+
it('rejects a token that omits exp', async () => {
|
|
68
|
+
const secret = new TextEncoder().encode(testSecret);
|
|
69
|
+
const token = await new jose.SignJWT({ video: { roomCreate: true } })
|
|
70
|
+
.setProtectedHeader({ alg: 'HS256' })
|
|
71
|
+
.setIssuer(testApiKey)
|
|
72
|
+
.setSubject('me')
|
|
73
|
+
.setNotBefore(new Date())
|
|
74
|
+
.sign(secret);
|
|
75
|
+
|
|
76
|
+
const v = new TokenVerifier(testApiKey, testSecret);
|
|
77
|
+
await expect(v.verify(token)).rejects.toThrow();
|
|
78
|
+
});
|
|
79
|
+
|
|
67
80
|
it('can decode encoded token', async () => {
|
|
68
81
|
const t = new AccessToken(testApiKey, testSecret);
|
|
69
82
|
t.sha256 = 'abcdefg';
|
package/src/AccessToken.ts
CHANGED
|
@@ -231,6 +231,9 @@ export class TokenVerifier {
|
|
|
231
231
|
const { payload } = await jose.jwtVerify(token, secret, {
|
|
232
232
|
issuer: this.apiKey,
|
|
233
233
|
clockTolerance,
|
|
234
|
+
// First-party minters always set exp. Without this, a hand-rolled token
|
|
235
|
+
// with a valid signature and no exp verifies forever (livekit/protocol#1706).
|
|
236
|
+
requiredClaims: ['exp'],
|
|
234
237
|
});
|
|
235
238
|
if (!payload) {
|
|
236
239
|
throw Error('invalid token');
|
package/src/IngressClient.ts
CHANGED
|
@@ -52,6 +52,11 @@ export interface CreateIngressOptions {
|
|
|
52
52
|
* url of the media to pull for ingresses of type URL
|
|
53
53
|
*/
|
|
54
54
|
url?: string;
|
|
55
|
+
/**
|
|
56
|
+
* whether the ingress is enabled. When set to false, new connection attempts are rejected
|
|
57
|
+
* while the stream key is preserved. The default is true.
|
|
58
|
+
*/
|
|
59
|
+
enabled?: boolean;
|
|
55
60
|
/**
|
|
56
61
|
* custom audio encoding parameters. optional
|
|
57
62
|
*/
|
|
@@ -93,6 +98,11 @@ export interface UpdateIngressOptions {
|
|
|
93
98
|
* Transcoding is required for all input types except WHIP. For WHIP, the default is to not transcode.
|
|
94
99
|
*/
|
|
95
100
|
enableTranscoding?: boolean | undefined;
|
|
101
|
+
/**
|
|
102
|
+
* whether the ingress is enabled. When set to false, new connection attempts are rejected
|
|
103
|
+
* while the stream key is preserved. The default is true.
|
|
104
|
+
*/
|
|
105
|
+
enabled?: boolean;
|
|
96
106
|
/**
|
|
97
107
|
* custom audio encoding parameters. optional
|
|
98
108
|
*/
|
|
@@ -152,6 +162,7 @@ export class IngressClient extends ServiceBase {
|
|
|
152
162
|
|
|
153
163
|
const roomName: string | undefined = opts.roomName;
|
|
154
164
|
const enableTranscoding: boolean | undefined = opts.enableTranscoding;
|
|
165
|
+
const enabled: boolean | undefined = opts.enabled;
|
|
155
166
|
const audio: IngressAudioOptions | undefined = opts.audio;
|
|
156
167
|
const video: IngressVideoOptions | undefined = opts.video;
|
|
157
168
|
const participantMetadata: string | undefined = opts.participantMetadata;
|
|
@@ -180,6 +191,7 @@ export class IngressClient extends ServiceBase {
|
|
|
180
191
|
bypassTranscoding,
|
|
181
192
|
enableTranscoding,
|
|
182
193
|
url,
|
|
194
|
+
enabled,
|
|
183
195
|
audio,
|
|
184
196
|
video,
|
|
185
197
|
}).toJson();
|
|
@@ -203,7 +215,7 @@ export class IngressClient extends ServiceBase {
|
|
|
203
215
|
const participantName: string = opts.participantName || '';
|
|
204
216
|
const participantIdentity: string = opts.participantIdentity || '';
|
|
205
217
|
const { participantMetadata } = opts;
|
|
206
|
-
const { audio, video, bypassTranscoding, enableTranscoding } = opts;
|
|
218
|
+
const { audio, video, bypassTranscoding, enableTranscoding, enabled } = opts;
|
|
207
219
|
|
|
208
220
|
const req = new UpdateIngressRequest({
|
|
209
221
|
ingressId,
|
|
@@ -214,6 +226,7 @@ export class IngressClient extends ServiceBase {
|
|
|
214
226
|
participantMetadata,
|
|
215
227
|
bypassTranscoding,
|
|
216
228
|
enableTranscoding,
|
|
229
|
+
enabled,
|
|
217
230
|
audio,
|
|
218
231
|
video,
|
|
219
232
|
}).toJson();
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const SDK_VERSION = "2.19.
|
|
1
|
+
export const SDK_VERSION = "2.19.1";
|