livekit-server-sdk 2.8.0 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +1 -1
  2. package/dist/AccessToken.cjs +169 -0
  3. package/dist/AccessToken.cjs.map +1 -0
  4. package/dist/AccessToken.js +130 -137
  5. package/dist/AccessToken.js.map +1 -1
  6. package/dist/AccessToken.test.cjs +147 -0
  7. package/dist/AccessToken.test.cjs.map +1 -0
  8. package/dist/AccessToken.test.js +129 -0
  9. package/dist/AccessToken.test.js.map +1 -0
  10. package/dist/AgentDispatchClient.cjs +133 -0
  11. package/dist/AgentDispatchClient.cjs.map +1 -0
  12. package/dist/AgentDispatchClient.d.ts +1 -1
  13. package/dist/AgentDispatchClient.d.ts.map +1 -1
  14. package/dist/AgentDispatchClient.js +102 -79
  15. package/dist/AgentDispatchClient.js.map +1 -1
  16. package/dist/EgressClient.cjs +381 -0
  17. package/dist/EgressClient.cjs.map +1 -0
  18. package/dist/EgressClient.js +349 -288
  19. package/dist/EgressClient.js.map +1 -1
  20. package/dist/IngressClient.cjs +164 -0
  21. package/dist/IngressClient.cjs.map +1 -0
  22. package/dist/IngressClient.js +131 -106
  23. package/dist/IngressClient.js.map +1 -1
  24. package/dist/RoomServiceClient.cjs +240 -0
  25. package/dist/RoomServiceClient.cjs.map +1 -0
  26. package/dist/RoomServiceClient.js +219 -151
  27. package/dist/RoomServiceClient.js.map +1 -1
  28. package/dist/ServiceBase.cjs +49 -0
  29. package/dist/ServiceBase.cjs.map +1 -0
  30. package/dist/ServiceBase.js +25 -28
  31. package/dist/ServiceBase.js.map +1 -1
  32. package/dist/SipClient.cjs +379 -0
  33. package/dist/SipClient.cjs.map +1 -0
  34. package/dist/SipClient.d.ts +15 -0
  35. package/dist/SipClient.d.ts.map +1 -1
  36. package/dist/SipClient.js +360 -260
  37. package/dist/SipClient.js.map +1 -1
  38. package/dist/TwirpRPC.cjs +71 -0
  39. package/dist/TwirpRPC.cjs.map +1 -0
  40. package/dist/TwirpRPC.d.ts.map +1 -1
  41. package/dist/TwirpRPC.js +32 -29
  42. package/dist/TwirpRPC.js.map +1 -1
  43. package/dist/WebhookReceiver.cjs +78 -0
  44. package/dist/WebhookReceiver.cjs.map +1 -0
  45. package/dist/WebhookReceiver.js +48 -45
  46. package/dist/WebhookReceiver.js.map +1 -1
  47. package/dist/WebhookReceiver.test.cjs +38 -0
  48. package/dist/WebhookReceiver.test.cjs.map +1 -0
  49. package/dist/WebhookReceiver.test.js +37 -0
  50. package/dist/WebhookReceiver.test.js.map +1 -0
  51. package/dist/grants.cjs +53 -0
  52. package/dist/grants.cjs.map +1 -0
  53. package/dist/grants.js +25 -23
  54. package/dist/grants.js.map +1 -1
  55. package/dist/grants.test.cjs +27 -0
  56. package/dist/grants.test.cjs.map +1 -0
  57. package/dist/grants.test.js +26 -0
  58. package/dist/grants.test.js.map +1 -0
  59. package/dist/index.cjs +136 -0
  60. package/dist/index.cjs.map +1 -0
  61. package/dist/index.js +104 -12
  62. package/dist/index.js.map +1 -1
  63. package/package.json +12 -3
  64. package/src/AgentDispatchClient.ts +2 -2
  65. package/src/SipClient.ts +33 -0
  66. package/src/TwirpRPC.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SipClient.js","sourceRoot":"","sources":["../src/SipClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../src/SipClient.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Duration } from '@bufbuild/protobuf';\nimport {\n CreateSIPDispatchRuleRequest,\n CreateSIPInboundTrunkRequest,\n CreateSIPOutboundTrunkRequest,\n CreateSIPParticipantRequest,\n CreateSIPTrunkRequest,\n DeleteSIPDispatchRuleRequest,\n DeleteSIPTrunkRequest,\n ListSIPDispatchRuleRequest,\n ListSIPDispatchRuleResponse,\n ListSIPInboundTrunkRequest,\n ListSIPInboundTrunkResponse,\n ListSIPOutboundTrunkRequest,\n ListSIPOutboundTrunkResponse,\n ListSIPTrunkRequest,\n ListSIPTrunkResponse,\n SIPDispatchRule,\n SIPDispatchRuleDirect,\n SIPDispatchRuleIndividual,\n SIPDispatchRuleInfo,\n SIPInboundTrunkInfo,\n SIPOutboundTrunkInfo,\n SIPParticipantInfo,\n SIPTransport,\n SIPTrunkInfo,\n TransferSIPParticipantRequest,\n} from '@livekit/protocol';\nimport ServiceBase from './ServiceBase.js';\nimport type { Rpc } from './TwirpRPC.js';\nimport { TwirpRpc, livekitPackage } from './TwirpRPC.js';\n\nconst svc = 'SIP';\n\n/**\n * @deprecated use CreateSipInboundTrunkOptions or CreateSipOutboundTrunkOptions\n */\nexport interface CreateSipTrunkOptions {\n name?: string;\n metadata?: string;\n inbound_addresses?: string[];\n inbound_numbers?: string[];\n inbound_username?: string;\n inbound_password?: string;\n outbound_address?: string;\n outbound_username?: string;\n outbound_password?: string;\n}\nexport interface CreateSipInboundTrunkOptions {\n metadata?: string;\n allowed_addresses?: string[];\n allowed_numbers?: string[];\n auth_username?: string;\n auth_password?: string;\n headers?: { [key: string]: string };\n headersToAttributes?: { [key: string]: string };\n}\nexport interface CreateSipOutboundTrunkOptions {\n metadata?: string;\n transport: SIPTransport;\n auth_username?: string;\n auth_password?: string;\n headers?: { [key: string]: string };\n headersToAttributes?: { [key: string]: string };\n}\n\nexport interface SipDispatchRuleDirect {\n type: 'direct';\n roomName: string;\n pin?: string;\n}\n\nexport interface SipDispatchRuleIndividual {\n type: 'individual';\n roomPrefix: string;\n pin?: string;\n}\n\nexport interface CreateSipDispatchRuleOptions {\n name?: string;\n metadata?: string;\n trunkIds?: string[];\n hidePhoneNumber?: boolean;\n}\n\nexport interface CreateSipParticipantOptions {\n participantIdentity?: string;\n participantName?: string;\n participantMetadata?: string;\n dtmf?: string;\n /** @deprecated - use `playDialtone` instead */\n playRingtone?: boolean; // Deprecated, use playDialtone instead\n playDialtone?: boolean;\n hidePhoneNumber?: boolean;\n ringingTimeout?: number; // Duration in seconds\n maxCallDuration?: number; // Duration in seconds\n enableKrisp?: boolean;\n}\n\nexport interface TransferSipParticipantOptions {\n playDialtone?: boolean;\n}\n\n/**\n * Client to access Egress APIs\n */\nexport class SipClient 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 */\n constructor(host: string, apiKey?: string, secret?: string) {\n super(apiKey, secret);\n this.rpc = new TwirpRpc(host, livekitPackage);\n }\n\n /**\n * @param number - phone number of the trunk\n * @param opts - CreateSipTrunkOptions\n * @deprecated use `createSipInboundTrunk` or `createSipOutboundTrunk`\n */\n async createSipTrunk(number: string, opts?: CreateSipTrunkOptions): Promise<SIPTrunkInfo> {\n let inboundAddresses: string[] | undefined;\n let inboundNumbers: string[] | undefined;\n let inboundUsername: string = '';\n let inboundPassword: string = '';\n let outboundAddress: string = '';\n let outboundUsername: string = '';\n let outboundPassword: string = '';\n let name: string = '';\n let metadata: string = '';\n\n if (opts !== undefined) {\n inboundAddresses = opts.inbound_addresses;\n inboundNumbers = opts.inbound_numbers;\n inboundUsername = opts.inbound_username || '';\n inboundPassword = opts.inbound_password || '';\n outboundAddress = opts.outbound_address || '';\n outboundUsername = opts.outbound_username || '';\n outboundPassword = opts.outbound_password || '';\n name = opts.name || '';\n metadata = opts.metadata || '';\n }\n\n const req = new CreateSIPTrunkRequest({\n name: name,\n metadata: metadata,\n inboundAddresses: inboundAddresses,\n inboundNumbers: inboundNumbers,\n inboundUsername: inboundUsername,\n inboundPassword: inboundPassword,\n outboundNumber: number,\n outboundAddress: outboundAddress,\n outboundUsername: outboundUsername,\n outboundPassword: outboundPassword,\n }).toJson();\n\n const data = await this.rpc.request(\n svc,\n 'CreateSIPTrunk',\n req,\n await this.authHeader({}, { admin: true }),\n );\n return SIPTrunkInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n /**\n * @param name - human-readable name of the trunk\n * @param numbers - phone numbers of the trunk\n * @param opts - CreateSipTrunkOptions\n */\n async createSipInboundTrunk(\n name: string,\n numbers: string[],\n opts?: CreateSipInboundTrunkOptions,\n ): Promise<SIPInboundTrunkInfo> {\n let allowedAddresses: string[] | undefined;\n let allowedNumbers: string[] | undefined;\n let authUsername: string = '';\n let authPassword: string = '';\n let metadata: string = '';\n let headers: { [key: string]: string } = {};\n let headersToAttributes: { [key: string]: string } = {};\n\n if (opts !== undefined) {\n allowedAddresses = opts.allowed_addresses;\n allowedNumbers = opts.allowed_numbers;\n authUsername = opts.auth_username || '';\n authPassword = opts.auth_password || '';\n metadata = opts.metadata || '';\n headers = opts.headers || {};\n headersToAttributes = opts.headersToAttributes || {};\n }\n\n const req = new CreateSIPInboundTrunkRequest({\n trunk: new SIPInboundTrunkInfo({\n name: name,\n numbers: numbers,\n metadata: metadata,\n allowedAddresses: allowedAddresses,\n allowedNumbers: allowedNumbers,\n authUsername: authUsername,\n authPassword: authPassword,\n headers: headers,\n headersToAttributes: headersToAttributes,\n }),\n }).toJson();\n\n const data = await this.rpc.request(\n svc,\n 'CreateSIPInboundTrunk',\n req,\n await this.authHeader({}, { admin: true }),\n );\n return SIPInboundTrunkInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n /**\n * @param name - human-readable name of the trunk\n * @param address - hostname and port of the SIP server to dial\n * @param numbers - phone numbers of the trunk\n * @param opts - CreateSipTrunkOptions\n */\n async createSipOutboundTrunk(\n name: string,\n address: string,\n numbers: string[],\n opts?: CreateSipOutboundTrunkOptions,\n ): Promise<SIPOutboundTrunkInfo> {\n let authUsername: string = '';\n let authPassword: string = '';\n let transport: SIPTransport = SIPTransport.SIP_TRANSPORT_AUTO;\n let metadata: string = '';\n let headers: { [key: string]: string } = {};\n let headersToAttributes: { [key: string]: string } = {};\n\n if (opts !== undefined) {\n authUsername = opts.auth_username || '';\n authPassword = opts.auth_password || '';\n transport = opts.transport || SIPTransport.SIP_TRANSPORT_AUTO;\n metadata = opts.metadata || '';\n headers = opts.headers || {};\n headersToAttributes = opts.headersToAttributes || {};\n }\n\n const req = new CreateSIPOutboundTrunkRequest({\n trunk: new SIPOutboundTrunkInfo({\n name: name,\n address: address,\n numbers: numbers,\n metadata: metadata,\n transport: transport,\n authUsername: authUsername,\n authPassword: authPassword,\n headers: headers,\n headersToAttributes: headersToAttributes,\n }),\n }).toJson();\n\n const data = await this.rpc.request(\n svc,\n 'CreateSIPOutboundTrunk',\n req,\n await this.authHeader({}, { admin: true }),\n );\n return SIPOutboundTrunkInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n /**\n * @deprecated use `listSipInboundTrunk` or `listSipOutboundTrunk`\n */\n async listSipTrunk(): Promise<Array<SIPTrunkInfo>> {\n const req: Partial<ListSIPTrunkRequest> = {};\n const data = await this.rpc.request(\n svc,\n 'ListSIPTrunk',\n new ListSIPTrunkRequest(req).toJson(),\n await this.authHeader({}, { admin: true }),\n );\n return ListSIPTrunkResponse.fromJson(data, { ignoreUnknownFields: true }).items ?? [];\n }\n\n async listSipInboundTrunk(): Promise<Array<SIPInboundTrunkInfo>> {\n const req: Partial<ListSIPInboundTrunkRequest> = {};\n const data = await this.rpc.request(\n svc,\n 'ListSIPInboundTrunk',\n new ListSIPInboundTrunkRequest(req).toJson(),\n await this.authHeader({}, { admin: true }),\n );\n return ListSIPInboundTrunkResponse.fromJson(data, { ignoreUnknownFields: true }).items ?? [];\n }\n\n async listSipOutboundTrunk(): Promise<Array<SIPOutboundTrunkInfo>> {\n const req: Partial<ListSIPOutboundTrunkRequest> = {};\n const data = await this.rpc.request(\n svc,\n 'ListSIPOutboundTrunk',\n new ListSIPOutboundTrunkRequest(req).toJson(),\n await this.authHeader({}, { admin: true }),\n );\n return ListSIPOutboundTrunkResponse.fromJson(data, { ignoreUnknownFields: true }).items ?? [];\n }\n\n /**\n * @param sipTrunkId - sip trunk to delete\n */\n async deleteSipTrunk(sipTrunkId: string): Promise<SIPTrunkInfo> {\n const data = await this.rpc.request(\n svc,\n 'DeleteSIPTrunk',\n new DeleteSIPTrunkRequest({ sipTrunkId }).toJson(),\n await this.authHeader({}, { admin: true }),\n );\n return SIPTrunkInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n /**\n * @param rule - sip dispatch rule\n * @param opts - CreateSipDispatchRuleOptions\n */\n async createSipDispatchRule(\n rule: SipDispatchRuleDirect | SipDispatchRuleIndividual,\n opts?: CreateSipDispatchRuleOptions,\n ): Promise<SIPDispatchRuleInfo> {\n let trunkIds: string[] | undefined;\n let hidePhoneNumber: boolean = false;\n let name: string = '';\n let metadata: string = '';\n let ruleProto: SIPDispatchRule | undefined = undefined;\n\n if (opts !== undefined) {\n trunkIds = opts.trunkIds;\n hidePhoneNumber = opts.hidePhoneNumber || false;\n name = opts.name || '';\n metadata = opts.metadata || '';\n }\n if (rule.type == 'direct') {\n ruleProto = new SIPDispatchRule({\n rule: {\n case: 'dispatchRuleDirect',\n value: new SIPDispatchRuleDirect({\n roomName: rule.roomName,\n pin: rule.pin || '',\n }),\n },\n });\n } else if (rule.type == 'individual') {\n ruleProto = new SIPDispatchRule({\n rule: {\n case: 'dispatchRuleIndividual',\n value: new SIPDispatchRuleIndividual({\n roomPrefix: rule.roomPrefix,\n pin: rule.pin || '',\n }),\n },\n });\n }\n\n const req = new CreateSIPDispatchRuleRequest({\n rule: ruleProto,\n trunkIds: trunkIds,\n hidePhoneNumber: hidePhoneNumber,\n name: name,\n metadata: metadata,\n }).toJson();\n\n const data = await this.rpc.request(\n svc,\n 'CreateSIPDispatchRule',\n req,\n await this.authHeader({}, { admin: true }),\n );\n return SIPDispatchRuleInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n async listSipDispatchRule(): Promise<Array<SIPDispatchRuleInfo>> {\n const req: Partial<ListSIPDispatchRuleRequest> = {};\n const data = await this.rpc.request(\n svc,\n 'ListSIPDispatchRule',\n new ListSIPDispatchRuleRequest(req).toJson(),\n await this.authHeader({}, { admin: true }),\n );\n return ListSIPDispatchRuleResponse.fromJson(data, { ignoreUnknownFields: true }).items ?? [];\n }\n\n /**\n * @param sipDispatchRuleId - sip trunk to delete\n */\n async deleteSipDispatchRule(sipDispatchRuleId: string): Promise<SIPDispatchRuleInfo> {\n const data = await this.rpc.request(\n svc,\n 'DeleteSIPDispatchRule',\n new DeleteSIPDispatchRuleRequest({ sipDispatchRuleId }).toJson(),\n await this.authHeader({}, { admin: true }),\n );\n return SIPDispatchRuleInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n /**\n * @param sipTrunkId - sip trunk to use for the call\n * @param number - number to dial\n * @param roomName - room to attach the call to\n * @param opts - CreateSipParticipantOptions\n */\n async createSipParticipant(\n sipTrunkId: string,\n number: string,\n roomName: string,\n opts?: CreateSipParticipantOptions,\n ): Promise<SIPParticipantInfo> {\n let participantIdentity: string = '';\n let participantName: string = '';\n let participantMetadata: string = '';\n let dtmf: string = '';\n let playRingtone: boolean = false;\n let playDialtone: boolean = false;\n let hidePhoneNumber: boolean = false;\n let ringingTimeout: number | undefined = undefined;\n let maxCallDuration: number | undefined = undefined;\n let enableKrisp: boolean | undefined = undefined;\n\n if (opts !== undefined) {\n participantIdentity = opts.participantIdentity || '';\n participantName = opts.participantName || '';\n participantMetadata = opts.participantMetadata || '';\n dtmf = opts.dtmf || '';\n playRingtone = opts.playRingtone || false;\n playDialtone = opts.playDialtone || playRingtone; // Enable PlayDialtone if either PlayDialtone or playRingtone is set\n hidePhoneNumber = opts.hidePhoneNumber || false;\n ringingTimeout = opts.ringingTimeout || undefined;\n maxCallDuration = opts.maxCallDuration || undefined;\n enableKrisp = opts.enableKrisp || undefined;\n }\n\n const req = new CreateSIPParticipantRequest({\n sipTrunkId: sipTrunkId,\n sipCallTo: number,\n roomName: roomName,\n participantIdentity: participantIdentity,\n participantName: participantName,\n participantMetadata: participantMetadata,\n dtmf: dtmf,\n playRingtone: playDialtone,\n playDialtone: playDialtone,\n hidePhoneNumber: hidePhoneNumber,\n ringingTimeout: ringingTimeout\n ? new Duration({ seconds: BigInt(ringingTimeout) })\n : undefined,\n maxCallDuration: maxCallDuration\n ? new Duration({ seconds: BigInt(maxCallDuration) })\n : undefined,\n enableKrisp: enableKrisp,\n }).toJson();\n\n const data = await this.rpc.request(\n svc,\n 'CreateSIPParticipant',\n req,\n await this.authHeader({}, { call: true }),\n );\n return SIPParticipantInfo.fromJson(data, { ignoreUnknownFields: true });\n }\n\n /**\n * @param roomName - room the SIP participant to transfer is connectd to\n * @param participantIdentity - identity of the SIP participant to transfer\n * @param transferTo - SIP URL to transfer the participant to\n */\n async transferSipParticipant(\n roomName: string,\n participantIdentity: string,\n transferTo: string,\n opts?: TransferSipParticipantOptions,\n ): Promise<void> {\n let playDialtone: boolean = false;\n\n if (opts !== undefined) {\n playDialtone = opts.playDialtone || false;\n }\n\n const req = new TransferSIPParticipantRequest({\n participantIdentity: participantIdentity,\n roomName: roomName,\n transferTo: transferTo,\n playDialtone: playDialtone,\n }).toJson();\n\n await this.rpc.request(\n svc,\n 'TransferSIPParticipant',\n req,\n await this.authHeader({ roomAdmin: true, room: roomName }, { call: true }),\n );\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var TwirpRPC_exports = {};
30
+ __export(TwirpRPC_exports, {
31
+ TwirpRpc: () => TwirpRpc,
32
+ livekitPackage: () => livekitPackage
33
+ });
34
+ module.exports = __toCommonJS(TwirpRPC_exports);
35
+ const defaultPrefix = "/twirp";
36
+ const livekitPackage = "livekit";
37
+ class TwirpRpc {
38
+ constructor(host, pkg, prefix) {
39
+ if (host.startsWith("ws")) {
40
+ host = host.replace("ws", "http");
41
+ }
42
+ this.host = host;
43
+ this.pkg = pkg;
44
+ this.prefix = prefix || defaultPrefix;
45
+ }
46
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
+ async request(service, method, data, headers) {
48
+ const path = `${this.prefix}/${this.pkg}.${service}/${method}`;
49
+ const url = new URL(path, this.host);
50
+ const response = await fetch(url, {
51
+ method: "POST",
52
+ headers: {
53
+ "Content-Type": "application/json;charset=UTF-8",
54
+ ...headers
55
+ },
56
+ body: JSON.stringify(data)
57
+ });
58
+ if (!response.ok) {
59
+ throw new Error(`Request failed with status ${response.status}: ${response.statusText}`);
60
+ }
61
+ const parsedResp = await response.json();
62
+ const camelcaseKeys = await import("camelcase-keys").then((mod) => mod.default);
63
+ return camelcaseKeys(parsedResp, { deep: true });
64
+ }
65
+ }
66
+ // Annotate the CommonJS export names for ESM import in node:
67
+ 0 && (module.exports = {
68
+ TwirpRpc,
69
+ livekitPackage
70
+ });
71
+ //# sourceMappingURL=TwirpRPC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/TwirpRPC.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { JsonValue } from '@bufbuild/protobuf';\n\n// twirp RPC adapter for client implementation\n\nconst defaultPrefix = '/twirp';\n\nexport const livekitPackage = 'livekit';\nexport interface Rpc {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n request(service: string, method: string, data: JsonValue, headers?: any): Promise<string>;\n}\n\n/**\n * JSON based Twirp V7 RPC\n */\nexport class TwirpRpc {\n host: string;\n\n pkg: string;\n\n prefix: string;\n\n constructor(host: string, pkg: string, prefix?: string) {\n if (host.startsWith('ws')) {\n host = host.replace('ws', 'http');\n }\n this.host = host;\n this.pkg = pkg;\n this.prefix = prefix || defaultPrefix;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async request(service: string, method: string, data: any, headers?: any): Promise<any> {\n const path = `${this.prefix}/${this.pkg}.${service}/${method}`;\n const url = new URL(path, this.host);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json;charset=UTF-8',\n ...headers,\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}: ${response.statusText}`);\n }\n const parsedResp = await response.json();\n const camelcaseKeys = await import('camelcase-keys').then((mod) => mod.default);\n return camelcaseKeys(parsedResp, { deep: true });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,MAAM,gBAAgB;AAEf,MAAM,iBAAiB;AASvB,MAAM,SAAS;AAAA,EAOpB,YAAY,MAAc,KAAa,QAAiB;AACtD,QAAI,KAAK,WAAW,IAAI,GAAG;AACzB,aAAO,KAAK,QAAQ,MAAM,MAAM;AAAA,IAClC;AACA,SAAK,OAAO;AACZ,SAAK,MAAM;AACX,SAAK,SAAS,UAAU;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,QAAQ,SAAiB,QAAgB,MAAW,SAA6B;AACrF,UAAM,OAAO,GAAG,KAAK,MAAM,IAAI,KAAK,GAAG,IAAI,OAAO,IAAI,MAAM;AAC5D,UAAM,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI;AAEnC,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG;AAAA,MACL;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,8BAA8B,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,IACzF;AACA,UAAM,aAAa,MAAM,SAAS,KAAK;AACvC,UAAM,gBAAgB,MAAM,OAAO,gBAAgB,EAAE,KAAK,CAAC,QAAQ,IAAI,OAAO;AAC9E,WAAO,cAAc,YAAY,EAAE,MAAM,KAAK,CAAC;AAAA,EACjD;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"TwirpRPC.d.ts","sourceRoot":"","sources":["../src/TwirpRPC.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAOpD,eAAO,MAAM,cAAc,YAAY,CAAC;AACxC,MAAM,WAAW,GAAG;IAElB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3F;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB,IAAI,EAAE,MAAM,CAAC;IAEb,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,EAAE,MAAM,CAAC;gBAEH,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAUhD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;CAmBvF"}
1
+ {"version":3,"file":"TwirpRPC.d.ts","sourceRoot":"","sources":["../src/TwirpRPC.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAMpD,eAAO,MAAM,cAAc,YAAY,CAAC;AACxC,MAAM,WAAW,GAAG;IAElB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3F;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB,IAAI,EAAE,MAAM,CAAC;IAEb,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,EAAE,MAAM,CAAC;gBAEH,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAUhD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;CAoBvF"}
package/dist/TwirpRPC.js CHANGED
@@ -1,33 +1,36 @@
1
- import camelcaseKeys from 'camelcase-keys';
2
- // twirp RPC adapter for client implementation
3
- const defaultPrefix = '/twirp';
4
- export const livekitPackage = 'livekit';
5
- /**
6
- * JSON based Twirp V7 RPC
7
- */
8
- export class TwirpRpc {
9
- constructor(host, pkg, prefix) {
10
- if (host.startsWith('ws')) {
11
- host = host.replace('ws', 'http');
12
- }
13
- this.host = host;
14
- this.pkg = pkg;
15
- this.prefix = prefix || defaultPrefix;
1
+ const defaultPrefix = "/twirp";
2
+ const livekitPackage = "livekit";
3
+ class TwirpRpc {
4
+ constructor(host, pkg, prefix) {
5
+ if (host.startsWith("ws")) {
6
+ host = host.replace("ws", "http");
16
7
  }
17
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
- async request(service, method, data, headers) {
19
- const path = `${this.prefix}/${this.pkg}.${service}/${method}`;
20
- const url = new URL(path, this.host);
21
- const response = await fetch(url, {
22
- method: 'POST',
23
- headers: Object.assign({ 'Content-Type': 'application/json;charset=UTF-8' }, headers),
24
- body: JSON.stringify(data),
25
- });
26
- if (!response.ok) {
27
- throw new Error(`Request failed with status ${response.status}: ${response.statusText}`);
28
- }
29
- const parsedResp = await response.json();
30
- return camelcaseKeys(parsedResp, { deep: true });
8
+ this.host = host;
9
+ this.pkg = pkg;
10
+ this.prefix = prefix || defaultPrefix;
11
+ }
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ async request(service, method, data, headers) {
14
+ const path = `${this.prefix}/${this.pkg}.${service}/${method}`;
15
+ const url = new URL(path, this.host);
16
+ const response = await fetch(url, {
17
+ method: "POST",
18
+ headers: {
19
+ "Content-Type": "application/json;charset=UTF-8",
20
+ ...headers
21
+ },
22
+ body: JSON.stringify(data)
23
+ });
24
+ if (!response.ok) {
25
+ throw new Error(`Request failed with status ${response.status}: ${response.statusText}`);
31
26
  }
27
+ const parsedResp = await response.json();
28
+ const camelcaseKeys = await import("camelcase-keys").then((mod) => mod.default);
29
+ return camelcaseKeys(parsedResp, { deep: true });
30
+ }
32
31
  }
32
+ export {
33
+ TwirpRpc,
34
+ livekitPackage
35
+ };
33
36
  //# sourceMappingURL=TwirpRPC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TwirpRPC.js","sourceRoot":"","sources":["../src/TwirpRPC.ts"],"names":[],"mappings":"AAIA,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAE3C,8CAA8C;AAE9C,MAAM,aAAa,GAAG,QAAQ,CAAC;AAE/B,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,CAAC;AAMxC;;GAEG;AACH,MAAM,OAAO,QAAQ;IAOnB,YAAY,IAAY,EAAE,GAAW,EAAE,MAAe;QACpD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,aAAa,CAAC;IACxC,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,MAAc,EAAE,IAAS,EAAE,OAAa;QACrE,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QAC/D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAErC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,kBACL,cAAc,EAAE,gCAAgC,IAC7C,OAAO,CACX;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzC,OAAO,aAAa,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;CACF"}
1
+ {"version":3,"sources":["../src/TwirpRPC.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { JsonValue } from '@bufbuild/protobuf';\n\n// twirp RPC adapter for client implementation\n\nconst defaultPrefix = '/twirp';\n\nexport const livekitPackage = 'livekit';\nexport interface Rpc {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n request(service: string, method: string, data: JsonValue, headers?: any): Promise<string>;\n}\n\n/**\n * JSON based Twirp V7 RPC\n */\nexport class TwirpRpc {\n host: string;\n\n pkg: string;\n\n prefix: string;\n\n constructor(host: string, pkg: string, prefix?: string) {\n if (host.startsWith('ws')) {\n host = host.replace('ws', 'http');\n }\n this.host = host;\n this.pkg = pkg;\n this.prefix = prefix || defaultPrefix;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async request(service: string, method: string, data: any, headers?: any): Promise<any> {\n const path = `${this.prefix}/${this.pkg}.${service}/${method}`;\n const url = new URL(path, this.host);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json;charset=UTF-8',\n ...headers,\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status ${response.status}: ${response.statusText}`);\n }\n const parsedResp = await response.json();\n const camelcaseKeys = await import('camelcase-keys').then((mod) => mod.default);\n return camelcaseKeys(parsedResp, { deep: true });\n }\n}\n"],"mappings":"AAOA,MAAM,gBAAgB;AAEf,MAAM,iBAAiB;AASvB,MAAM,SAAS;AAAA,EAOpB,YAAY,MAAc,KAAa,QAAiB;AACtD,QAAI,KAAK,WAAW,IAAI,GAAG;AACzB,aAAO,KAAK,QAAQ,MAAM,MAAM;AAAA,IAClC;AACA,SAAK,OAAO;AACZ,SAAK,MAAM;AACX,SAAK,SAAS,UAAU;AAAA,EAC1B;AAAA;AAAA,EAGA,MAAM,QAAQ,SAAiB,QAAgB,MAAW,SAA6B;AACrF,UAAM,OAAO,GAAG,KAAK,MAAM,IAAI,KAAK,GAAG,IAAI,OAAO,IAAI,MAAM;AAC5D,UAAM,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI;AAEnC,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG;AAAA,MACL;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,8BAA8B,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,IACzF;AACA,UAAM,aAAa,MAAM,SAAS,KAAK;AACvC,UAAM,gBAAgB,MAAM,OAAO,gBAAgB,EAAE,KAAK,CAAC,QAAQ,IAAI,OAAO;AAC9E,WAAO,cAAc,YAAY,EAAE,MAAM,KAAK,CAAC;AAAA,EACjD;AACF;","names":[]}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var WebhookReceiver_exports = {};
20
+ __export(WebhookReceiver_exports, {
21
+ WebhookEvent: () => WebhookEvent,
22
+ WebhookReceiver: () => WebhookReceiver,
23
+ authorizeHeader: () => authorizeHeader
24
+ });
25
+ module.exports = __toCommonJS(WebhookReceiver_exports);
26
+ var import_protocol = require("@livekit/protocol");
27
+ var import_AccessToken = require("./AccessToken.cjs");
28
+ const authorizeHeader = "Authorize";
29
+ class WebhookEvent extends import_protocol.WebhookEvent {
30
+ constructor() {
31
+ super(...arguments);
32
+ this.event = "";
33
+ }
34
+ static fromBinary(bytes, options) {
35
+ return new WebhookEvent().fromBinary(bytes, options);
36
+ }
37
+ static fromJson(jsonValue, options) {
38
+ return new WebhookEvent().fromJson(jsonValue, options);
39
+ }
40
+ static fromJsonString(jsonString, options) {
41
+ return new WebhookEvent().fromJsonString(jsonString, options);
42
+ }
43
+ }
44
+ class WebhookReceiver {
45
+ constructor(apiKey, apiSecret) {
46
+ this.verifier = new import_AccessToken.TokenVerifier(apiKey, apiSecret);
47
+ }
48
+ /**
49
+ * @param body - string of the posted body
50
+ * @param authHeader - `Authorization` header from the request
51
+ * @param skipAuth - true to skip auth validation
52
+ * @returns
53
+ */
54
+ async receive(body, authHeader, skipAuth = false) {
55
+ if (!skipAuth) {
56
+ if (!authHeader) {
57
+ throw new Error("authorization header is empty");
58
+ }
59
+ const claims = await this.verifier.verify(authHeader);
60
+ const encoder = new TextEncoder();
61
+ const hash = await crypto.subtle.digest("SHA-256", encoder.encode(body));
62
+ const hashDecoded = btoa(
63
+ Array.from(new Uint8Array(hash)).map((v) => String.fromCharCode(v)).join("")
64
+ );
65
+ if (claims.sha256 !== hashDecoded) {
66
+ throw new Error("sha256 checksum of body does not match");
67
+ }
68
+ }
69
+ return WebhookEvent.fromJson(JSON.parse(body), { ignoreUnknownFields: true });
70
+ }
71
+ }
72
+ // Annotate the CommonJS export names for ESM import in node:
73
+ 0 && (module.exports = {
74
+ WebhookEvent,
75
+ WebhookReceiver,
76
+ authorizeHeader
77
+ });
78
+ //# sourceMappingURL=WebhookReceiver.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/WebhookReceiver.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { BinaryReadOptions, JsonReadOptions, JsonValue } from '@bufbuild/protobuf';\nimport { WebhookEvent as ProtoWebhookEvent } from '@livekit/protocol';\nimport { TokenVerifier } from './AccessToken.js';\n\nexport const authorizeHeader = 'Authorize';\n\nexport class WebhookEvent extends ProtoWebhookEvent {\n event: WebhookEventNames = '';\n\n static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): WebhookEvent {\n return new WebhookEvent().fromBinary(bytes, options);\n }\n\n static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): WebhookEvent {\n return new WebhookEvent().fromJson(jsonValue, options);\n }\n\n static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): WebhookEvent {\n return new WebhookEvent().fromJsonString(jsonString, options);\n }\n}\n\nexport type WebhookEventNames =\n | 'room_started'\n | 'room_finished'\n | 'participant_joined'\n | 'participant_left'\n | 'track_published'\n | 'track_unpublished'\n | 'egress_started'\n | 'egress_updated'\n | 'egress_ended'\n | 'ingress_started'\n | 'ingress_ended'\n /**\n * @internal\n * @remarks only used as a default value, not a valid webhook event\n */\n | '';\n\nexport class WebhookReceiver {\n private verifier: TokenVerifier;\n\n constructor(apiKey: string, apiSecret: string) {\n this.verifier = new TokenVerifier(apiKey, apiSecret);\n }\n\n /**\n * @param body - string of the posted body\n * @param authHeader - `Authorization` header from the request\n * @param skipAuth - true to skip auth validation\n * @returns\n */\n async receive(\n body: string,\n authHeader?: string,\n skipAuth: boolean = false,\n ): Promise<WebhookEvent> {\n // verify token\n if (!skipAuth) {\n if (!authHeader) {\n throw new Error('authorization header is empty');\n }\n const claims = await this.verifier.verify(authHeader);\n // confirm sha\n const encoder = new TextEncoder();\n const hash = await crypto.subtle.digest('SHA-256', encoder.encode(body));\n const hashDecoded = btoa(\n Array.from(new Uint8Array(hash))\n .map((v) => String.fromCharCode(v))\n .join(''),\n );\n\n if (claims.sha256 !== hashDecoded) {\n throw new Error('sha256 checksum of body does not match');\n }\n }\n\n return WebhookEvent.fromJson(JSON.parse(body), { ignoreUnknownFields: true });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,sBAAkD;AAClD,yBAA8B;AAEvB,MAAM,kBAAkB;AAExB,MAAM,qBAAqB,gBAAAA,aAAkB;AAAA,EAA7C;AAAA;AACL,iBAA2B;AAAA;AAAA,EAE3B,OAAO,WAAW,OAAmB,SAAoD;AACvF,WAAO,IAAI,aAAa,EAAE,WAAW,OAAO,OAAO;AAAA,EACrD;AAAA,EAEA,OAAO,SAAS,WAAsB,SAAkD;AACtF,WAAO,IAAI,aAAa,EAAE,SAAS,WAAW,OAAO;AAAA,EACvD;AAAA,EAEA,OAAO,eAAe,YAAoB,SAAkD;AAC1F,WAAO,IAAI,aAAa,EAAE,eAAe,YAAY,OAAO;AAAA,EAC9D;AACF;AAoBO,MAAM,gBAAgB;AAAA,EAG3B,YAAY,QAAgB,WAAmB;AAC7C,SAAK,WAAW,IAAI,iCAAc,QAAQ,SAAS;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QACJ,MACA,YACA,WAAoB,OACG;AAEvB,QAAI,CAAC,UAAU;AACb,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AACA,YAAM,SAAS,MAAM,KAAK,SAAS,OAAO,UAAU;AAEpD,YAAM,UAAU,IAAI,YAAY;AAChC,YAAM,OAAO,MAAM,OAAO,OAAO,OAAO,WAAW,QAAQ,OAAO,IAAI,CAAC;AACvE,YAAM,cAAc;AAAA,QAClB,MAAM,KAAK,IAAI,WAAW,IAAI,CAAC,EAC5B,IAAI,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC,EACjC,KAAK,EAAE;AAAA,MACZ;AAEA,UAAI,OAAO,WAAW,aAAa;AACjC,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AAAA,IACF;AAEA,WAAO,aAAa,SAAS,KAAK,MAAM,IAAI,GAAG,EAAE,qBAAqB,KAAK,CAAC;AAAA,EAC9E;AACF;","names":["ProtoWebhookEvent"]}
@@ -1,49 +1,52 @@
1
- import { WebhookEvent as ProtoWebhookEvent } from '@livekit/protocol';
2
- import { TokenVerifier } from './AccessToken.js';
3
- export const authorizeHeader = 'Authorize';
4
- export class WebhookEvent extends ProtoWebhookEvent {
5
- constructor() {
6
- super(...arguments);
7
- this.event = '';
8
- }
9
- static fromBinary(bytes, options) {
10
- return new WebhookEvent().fromBinary(bytes, options);
11
- }
12
- static fromJson(jsonValue, options) {
13
- return new WebhookEvent().fromJson(jsonValue, options);
14
- }
15
- static fromJsonString(jsonString, options) {
16
- return new WebhookEvent().fromJsonString(jsonString, options);
17
- }
1
+ import { WebhookEvent as ProtoWebhookEvent } from "@livekit/protocol";
2
+ import { TokenVerifier } from "./AccessToken.js";
3
+ const authorizeHeader = "Authorize";
4
+ class WebhookEvent extends ProtoWebhookEvent {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.event = "";
8
+ }
9
+ static fromBinary(bytes, options) {
10
+ return new WebhookEvent().fromBinary(bytes, options);
11
+ }
12
+ static fromJson(jsonValue, options) {
13
+ return new WebhookEvent().fromJson(jsonValue, options);
14
+ }
15
+ static fromJsonString(jsonString, options) {
16
+ return new WebhookEvent().fromJsonString(jsonString, options);
17
+ }
18
18
  }
19
- export class WebhookReceiver {
20
- constructor(apiKey, apiSecret) {
21
- this.verifier = new TokenVerifier(apiKey, apiSecret);
22
- }
23
- /**
24
- * @param body - string of the posted body
25
- * @param authHeader - `Authorization` header from the request
26
- * @param skipAuth - true to skip auth validation
27
- * @returns
28
- */
29
- async receive(body, authHeader, skipAuth = false) {
30
- // verify token
31
- if (!skipAuth) {
32
- if (!authHeader) {
33
- throw new Error('authorization header is empty');
34
- }
35
- const claims = await this.verifier.verify(authHeader);
36
- // confirm sha
37
- const encoder = new TextEncoder();
38
- const hash = await crypto.subtle.digest('SHA-256', encoder.encode(body));
39
- const hashDecoded = btoa(Array.from(new Uint8Array(hash))
40
- .map((v) => String.fromCharCode(v))
41
- .join(''));
42
- if (claims.sha256 !== hashDecoded) {
43
- throw new Error('sha256 checksum of body does not match');
44
- }
45
- }
46
- return WebhookEvent.fromJson(JSON.parse(body), { ignoreUnknownFields: true });
19
+ class WebhookReceiver {
20
+ constructor(apiKey, apiSecret) {
21
+ this.verifier = new TokenVerifier(apiKey, apiSecret);
22
+ }
23
+ /**
24
+ * @param body - string of the posted body
25
+ * @param authHeader - `Authorization` header from the request
26
+ * @param skipAuth - true to skip auth validation
27
+ * @returns
28
+ */
29
+ async receive(body, authHeader, skipAuth = false) {
30
+ if (!skipAuth) {
31
+ if (!authHeader) {
32
+ throw new Error("authorization header is empty");
33
+ }
34
+ const claims = await this.verifier.verify(authHeader);
35
+ const encoder = new TextEncoder();
36
+ const hash = await crypto.subtle.digest("SHA-256", encoder.encode(body));
37
+ const hashDecoded = btoa(
38
+ Array.from(new Uint8Array(hash)).map((v) => String.fromCharCode(v)).join("")
39
+ );
40
+ if (claims.sha256 !== hashDecoded) {
41
+ throw new Error("sha256 checksum of body does not match");
42
+ }
47
43
  }
44
+ return WebhookEvent.fromJson(JSON.parse(body), { ignoreUnknownFields: true });
45
+ }
48
46
  }
47
+ export {
48
+ WebhookEvent,
49
+ WebhookReceiver,
50
+ authorizeHeader
51
+ };
49
52
  //# sourceMappingURL=WebhookReceiver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WebhookReceiver.js","sourceRoot":"","sources":["../src/WebhookReceiver.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,IAAI,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AAE3C,MAAM,OAAO,YAAa,SAAQ,iBAAiB;IAAnD;;QACE,UAAK,GAAsB,EAAE,CAAC;IAahC,CAAC;IAXC,MAAM,CAAC,UAAU,CAAC,KAAiB,EAAE,OAAoC;QACvE,OAAO,IAAI,YAAY,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,SAAoB,EAAE,OAAkC;QACtE,OAAO,IAAI,YAAY,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,UAAkB,EAAE,OAAkC;QAC1E,OAAO,IAAI,YAAY,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;CACF;AAoBD,MAAM,OAAO,eAAe;IAG1B,YAAY,MAAc,EAAE,SAAiB;QAC3C,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CACX,IAAY,EACZ,UAAmB,EACnB,WAAoB,KAAK;QAEzB,eAAe;QACf,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACtD,cAAc;YACd,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACzE,MAAM,WAAW,GAAG,IAAI,CACtB,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;iBAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;iBAClC,IAAI,CAAC,EAAE,CAAC,CACZ,CAAC;YAEF,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,OAAO,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;IAChF,CAAC;CACF"}
1
+ {"version":3,"sources":["../src/WebhookReceiver.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { BinaryReadOptions, JsonReadOptions, JsonValue } from '@bufbuild/protobuf';\nimport { WebhookEvent as ProtoWebhookEvent } from '@livekit/protocol';\nimport { TokenVerifier } from './AccessToken.js';\n\nexport const authorizeHeader = 'Authorize';\n\nexport class WebhookEvent extends ProtoWebhookEvent {\n event: WebhookEventNames = '';\n\n static fromBinary(bytes: Uint8Array, options?: Partial<BinaryReadOptions>): WebhookEvent {\n return new WebhookEvent().fromBinary(bytes, options);\n }\n\n static fromJson(jsonValue: JsonValue, options?: Partial<JsonReadOptions>): WebhookEvent {\n return new WebhookEvent().fromJson(jsonValue, options);\n }\n\n static fromJsonString(jsonString: string, options?: Partial<JsonReadOptions>): WebhookEvent {\n return new WebhookEvent().fromJsonString(jsonString, options);\n }\n}\n\nexport type WebhookEventNames =\n | 'room_started'\n | 'room_finished'\n | 'participant_joined'\n | 'participant_left'\n | 'track_published'\n | 'track_unpublished'\n | 'egress_started'\n | 'egress_updated'\n | 'egress_ended'\n | 'ingress_started'\n | 'ingress_ended'\n /**\n * @internal\n * @remarks only used as a default value, not a valid webhook event\n */\n | '';\n\nexport class WebhookReceiver {\n private verifier: TokenVerifier;\n\n constructor(apiKey: string, apiSecret: string) {\n this.verifier = new TokenVerifier(apiKey, apiSecret);\n }\n\n /**\n * @param body - string of the posted body\n * @param authHeader - `Authorization` header from the request\n * @param skipAuth - true to skip auth validation\n * @returns\n */\n async receive(\n body: string,\n authHeader?: string,\n skipAuth: boolean = false,\n ): Promise<WebhookEvent> {\n // verify token\n if (!skipAuth) {\n if (!authHeader) {\n throw new Error('authorization header is empty');\n }\n const claims = await this.verifier.verify(authHeader);\n // confirm sha\n const encoder = new TextEncoder();\n const hash = await crypto.subtle.digest('SHA-256', encoder.encode(body));\n const hashDecoded = btoa(\n Array.from(new Uint8Array(hash))\n .map((v) => String.fromCharCode(v))\n .join(''),\n );\n\n if (claims.sha256 !== hashDecoded) {\n throw new Error('sha256 checksum of body does not match');\n }\n }\n\n return WebhookEvent.fromJson(JSON.parse(body), { ignoreUnknownFields: true });\n }\n}\n"],"mappings":"AAIA,SAAS,gBAAgB,yBAAyB;AAClD,SAAS,qBAAqB;AAEvB,MAAM,kBAAkB;AAExB,MAAM,qBAAqB,kBAAkB;AAAA,EAA7C;AAAA;AACL,iBAA2B;AAAA;AAAA,EAE3B,OAAO,WAAW,OAAmB,SAAoD;AACvF,WAAO,IAAI,aAAa,EAAE,WAAW,OAAO,OAAO;AAAA,EACrD;AAAA,EAEA,OAAO,SAAS,WAAsB,SAAkD;AACtF,WAAO,IAAI,aAAa,EAAE,SAAS,WAAW,OAAO;AAAA,EACvD;AAAA,EAEA,OAAO,eAAe,YAAoB,SAAkD;AAC1F,WAAO,IAAI,aAAa,EAAE,eAAe,YAAY,OAAO;AAAA,EAC9D;AACF;AAoBO,MAAM,gBAAgB;AAAA,EAG3B,YAAY,QAAgB,WAAmB;AAC7C,SAAK,WAAW,IAAI,cAAc,QAAQ,SAAS;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,QACJ,MACA,YACA,WAAoB,OACG;AAEvB,QAAI,CAAC,UAAU;AACb,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACjD;AACA,YAAM,SAAS,MAAM,KAAK,SAAS,OAAO,UAAU;AAEpD,YAAM,UAAU,IAAI,YAAY;AAChC,YAAM,OAAO,MAAM,OAAO,OAAO,OAAO,WAAW,QAAQ,OAAO,IAAI,CAAC;AACvE,YAAM,cAAc;AAAA,QAClB,MAAM,KAAK,IAAI,WAAW,IAAI,CAAC,EAC5B,IAAI,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC,EACjC,KAAK,EAAE;AAAA,MACZ;AAEA,UAAI,OAAO,WAAW,aAAa;AACjC,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AAAA,IACF;AAEA,WAAO,aAAa,SAAS,KAAK,MAAM,IAAI,GAAG,EAAE,qBAAqB,KAAK,CAAC;AAAA,EAC9E;AACF;","names":[]}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var import_vitest = require("vitest");
3
+ var import_AccessToken = require("./AccessToken.cjs");
4
+ var import_WebhookReceiver = require("./WebhookReceiver.cjs");
5
+ const testApiKey = "abcdefg";
6
+ const testSecret = "abababa";
7
+ (0, import_vitest.describe)("webhook receiver", () => {
8
+ const body = '{"event":"room_started", "room":{"sid":"RM_TkVjUvAqgzKz", "name":"mytestroom", "emptyTimeout":300, "creationTime":"1628545903", "turnPassword":"ICkSr2rEeslkN6e9bXL4Ji5zzMD5Z7zzr6ulOaxMj6N", "enabledCodecs":[{"mime":"audio/opus"}, {"mime":"video/VP8"}]}}';
9
+ const sha = "CoEQz1chqJ9bnZRcORddjplkvpjmPujmLTR42DbefYI=";
10
+ const t = new import_AccessToken.AccessToken(testApiKey, testSecret);
11
+ t.sha256 = sha;
12
+ const receiver = new import_WebhookReceiver.WebhookReceiver(testApiKey, testSecret);
13
+ (0, import_vitest.it)("should receive and decode WebhookEvent", async () => {
14
+ var _a;
15
+ const token = await t.toJwt();
16
+ const event = await receiver.receive(body, token);
17
+ (0, import_vitest.expect)(event).toBeTruthy();
18
+ (0, import_vitest.expect)((_a = event.room) == null ? void 0 : _a.name).toBe("mytestroom");
19
+ (0, import_vitest.expect)(event.event).toBe("room_started");
20
+ });
21
+ });
22
+ (0, import_vitest.describe)("decoding json payload", () => {
23
+ (0, import_vitest.it)("should allow server to return extra fields", () => {
24
+ var _a;
25
+ const obj = {
26
+ type: "room_started",
27
+ room: {
28
+ sid: "RM_TkVjUvAqgzKz",
29
+ name: "mytestroom"
30
+ },
31
+ extra: "extra"
32
+ };
33
+ const event = new import_WebhookReceiver.WebhookEvent(obj);
34
+ (0, import_vitest.expect)(event).toBeTruthy();
35
+ (0, import_vitest.expect)((_a = event.room) == null ? void 0 : _a.name).toBe("mytestroom");
36
+ });
37
+ });
38
+ //# sourceMappingURL=WebhookReceiver.test.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/WebhookReceiver.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { describe, expect, it } from 'vitest';\nimport { AccessToken } from './AccessToken.js';\nimport { WebhookEvent, WebhookReceiver } from './WebhookReceiver.js';\n\nconst testApiKey = 'abcdefg';\nconst testSecret = 'abababa';\n\ndescribe('webhook receiver', () => {\n const body =\n '{\"event\":\"room_started\", \"room\":{\"sid\":\"RM_TkVjUvAqgzKz\", \"name\":\"mytestroom\", \"emptyTimeout\":300, \"creationTime\":\"1628545903\", \"turnPassword\":\"ICkSr2rEeslkN6e9bXL4Ji5zzMD5Z7zzr6ulOaxMj6N\", \"enabledCodecs\":[{\"mime\":\"audio/opus\"}, {\"mime\":\"video/VP8\"}]}}';\n const sha = 'CoEQz1chqJ9bnZRcORddjplkvpjmPujmLTR42DbefYI=';\n const t = new AccessToken(testApiKey, testSecret);\n t.sha256 = sha;\n\n const receiver = new WebhookReceiver(testApiKey, testSecret);\n\n it('should receive and decode WebhookEvent', async () => {\n const token = await t.toJwt();\n const event = await receiver.receive(body, token);\n expect(event).toBeTruthy();\n expect(event.room?.name).toBe('mytestroom');\n expect(event.event).toBe('room_started');\n });\n});\n\ndescribe('decoding json payload', () => {\n it('should allow server to return extra fields', () => {\n const obj = {\n type: 'room_started',\n room: {\n sid: 'RM_TkVjUvAqgzKz',\n name: 'mytestroom',\n },\n extra: 'extra',\n };\n\n const event = new WebhookEvent(obj);\n expect(event).toBeTruthy();\n expect(event.room?.name).toBe('mytestroom');\n });\n});\n"],"mappings":";AAGA,oBAAqC;AACrC,yBAA4B;AAC5B,6BAA8C;AAE9C,MAAM,aAAa;AACnB,MAAM,aAAa;AAAA,IAEnB,wBAAS,oBAAoB,MAAM;AACjC,QAAM,OACJ;AACF,QAAM,MAAM;AACZ,QAAM,IAAI,IAAI,+BAAY,YAAY,UAAU;AAChD,IAAE,SAAS;AAEX,QAAM,WAAW,IAAI,uCAAgB,YAAY,UAAU;AAE3D,wBAAG,0CAA0C,YAAY;AAnB3D;AAoBI,UAAM,QAAQ,MAAM,EAAE,MAAM;AAC5B,UAAM,QAAQ,MAAM,SAAS,QAAQ,MAAM,KAAK;AAChD,8BAAO,KAAK,EAAE,WAAW;AACzB,+BAAO,WAAM,SAAN,mBAAY,IAAI,EAAE,KAAK,YAAY;AAC1C,8BAAO,MAAM,KAAK,EAAE,KAAK,cAAc;AAAA,EACzC,CAAC;AACH,CAAC;AAAA,IAED,wBAAS,yBAAyB,MAAM;AACtC,wBAAG,8CAA8C,MAAM;AA7BzD;AA8BI,UAAM,MAAM;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,KAAK;AAAA,QACL,MAAM;AAAA,MACR;AAAA,MACA,OAAO;AAAA,IACT;AAEA,UAAM,QAAQ,IAAI,oCAAa,GAAG;AAClC,8BAAO,KAAK,EAAE,WAAW;AACzB,+BAAO,WAAM,SAAN,mBAAY,IAAI,EAAE,KAAK,YAAY;AAAA,EAC5C,CAAC;AACH,CAAC;","names":[]}
@@ -0,0 +1,37 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { AccessToken } from "./AccessToken.js";
3
+ import { WebhookEvent, WebhookReceiver } from "./WebhookReceiver.js";
4
+ const testApiKey = "abcdefg";
5
+ const testSecret = "abababa";
6
+ describe("webhook receiver", () => {
7
+ const body = '{"event":"room_started", "room":{"sid":"RM_TkVjUvAqgzKz", "name":"mytestroom", "emptyTimeout":300, "creationTime":"1628545903", "turnPassword":"ICkSr2rEeslkN6e9bXL4Ji5zzMD5Z7zzr6ulOaxMj6N", "enabledCodecs":[{"mime":"audio/opus"}, {"mime":"video/VP8"}]}}';
8
+ const sha = "CoEQz1chqJ9bnZRcORddjplkvpjmPujmLTR42DbefYI=";
9
+ const t = new AccessToken(testApiKey, testSecret);
10
+ t.sha256 = sha;
11
+ const receiver = new WebhookReceiver(testApiKey, testSecret);
12
+ it("should receive and decode WebhookEvent", async () => {
13
+ var _a;
14
+ const token = await t.toJwt();
15
+ const event = await receiver.receive(body, token);
16
+ expect(event).toBeTruthy();
17
+ expect((_a = event.room) == null ? void 0 : _a.name).toBe("mytestroom");
18
+ expect(event.event).toBe("room_started");
19
+ });
20
+ });
21
+ describe("decoding json payload", () => {
22
+ it("should allow server to return extra fields", () => {
23
+ var _a;
24
+ const obj = {
25
+ type: "room_started",
26
+ room: {
27
+ sid: "RM_TkVjUvAqgzKz",
28
+ name: "mytestroom"
29
+ },
30
+ extra: "extra"
31
+ };
32
+ const event = new WebhookEvent(obj);
33
+ expect(event).toBeTruthy();
34
+ expect((_a = event.room) == null ? void 0 : _a.name).toBe("mytestroom");
35
+ });
36
+ });
37
+ //# sourceMappingURL=WebhookReceiver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/WebhookReceiver.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { describe, expect, it } from 'vitest';\nimport { AccessToken } from './AccessToken.js';\nimport { WebhookEvent, WebhookReceiver } from './WebhookReceiver.js';\n\nconst testApiKey = 'abcdefg';\nconst testSecret = 'abababa';\n\ndescribe('webhook receiver', () => {\n const body =\n '{\"event\":\"room_started\", \"room\":{\"sid\":\"RM_TkVjUvAqgzKz\", \"name\":\"mytestroom\", \"emptyTimeout\":300, \"creationTime\":\"1628545903\", \"turnPassword\":\"ICkSr2rEeslkN6e9bXL4Ji5zzMD5Z7zzr6ulOaxMj6N\", \"enabledCodecs\":[{\"mime\":\"audio/opus\"}, {\"mime\":\"video/VP8\"}]}}';\n const sha = 'CoEQz1chqJ9bnZRcORddjplkvpjmPujmLTR42DbefYI=';\n const t = new AccessToken(testApiKey, testSecret);\n t.sha256 = sha;\n\n const receiver = new WebhookReceiver(testApiKey, testSecret);\n\n it('should receive and decode WebhookEvent', async () => {\n const token = await t.toJwt();\n const event = await receiver.receive(body, token);\n expect(event).toBeTruthy();\n expect(event.room?.name).toBe('mytestroom');\n expect(event.event).toBe('room_started');\n });\n});\n\ndescribe('decoding json payload', () => {\n it('should allow server to return extra fields', () => {\n const obj = {\n type: 'room_started',\n room: {\n sid: 'RM_TkVjUvAqgzKz',\n name: 'mytestroom',\n },\n extra: 'extra',\n };\n\n const event = new WebhookEvent(obj);\n expect(event).toBeTruthy();\n expect(event.room?.name).toBe('mytestroom');\n });\n});\n"],"mappings":"AAGA,SAAS,UAAU,QAAQ,UAAU;AACrC,SAAS,mBAAmB;AAC5B,SAAS,cAAc,uBAAuB;AAE9C,MAAM,aAAa;AACnB,MAAM,aAAa;AAEnB,SAAS,oBAAoB,MAAM;AACjC,QAAM,OACJ;AACF,QAAM,MAAM;AACZ,QAAM,IAAI,IAAI,YAAY,YAAY,UAAU;AAChD,IAAE,SAAS;AAEX,QAAM,WAAW,IAAI,gBAAgB,YAAY,UAAU;AAE3D,KAAG,0CAA0C,YAAY;AAnB3D;AAoBI,UAAM,QAAQ,MAAM,EAAE,MAAM;AAC5B,UAAM,QAAQ,MAAM,SAAS,QAAQ,MAAM,KAAK;AAChD,WAAO,KAAK,EAAE,WAAW;AACzB,YAAO,WAAM,SAAN,mBAAY,IAAI,EAAE,KAAK,YAAY;AAC1C,WAAO,MAAM,KAAK,EAAE,KAAK,cAAc;AAAA,EACzC,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,MAAM;AACtC,KAAG,8CAA8C,MAAM;AA7BzD;AA8BI,UAAM,MAAM;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,KAAK;AAAA,QACL,MAAM;AAAA,MACR;AAAA,MACA,OAAO;AAAA,IACT;AAEA,UAAM,QAAQ,IAAI,aAAa,GAAG;AAClC,WAAO,KAAK,EAAE,WAAW;AACzB,YAAO,WAAM,SAAN,mBAAY,IAAI,EAAE,KAAK,YAAY;AAAA,EAC5C,CAAC;AACH,CAAC;","names":[]}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var grants_exports = {};
20
+ __export(grants_exports, {
21
+ claimsToJwtPayload: () => claimsToJwtPayload,
22
+ trackSourceToString: () => trackSourceToString
23
+ });
24
+ module.exports = __toCommonJS(grants_exports);
25
+ var import_protocol = require("@livekit/protocol");
26
+ function trackSourceToString(source) {
27
+ switch (source) {
28
+ case import_protocol.TrackSource.CAMERA:
29
+ return "camera";
30
+ case import_protocol.TrackSource.MICROPHONE:
31
+ return "microphone";
32
+ case import_protocol.TrackSource.SCREEN_SHARE:
33
+ return "screen_share";
34
+ case import_protocol.TrackSource.SCREEN_SHARE_AUDIO:
35
+ return "screen_share_audio";
36
+ default:
37
+ throw new TypeError(`Cannot convert TrackSource ${source} to string`);
38
+ }
39
+ }
40
+ function claimsToJwtPayload(grant) {
41
+ var _a;
42
+ const claim = { ...grant };
43
+ if (Array.isArray((_a = claim.video) == null ? void 0 : _a.canPublishSources)) {
44
+ claim.video.canPublishSources = claim.video.canPublishSources.map(trackSourceToString);
45
+ }
46
+ return claim;
47
+ }
48
+ // Annotate the CommonJS export names for ESM import in node:
49
+ 0 && (module.exports = {
50
+ claimsToJwtPayload,
51
+ trackSourceToString
52
+ });
53
+ //# sourceMappingURL=grants.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/grants.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { RoomConfiguration } from '@livekit/protocol';\nimport { TrackSource } from '@livekit/protocol';\nimport type { JWTPayload } from 'jose';\n\nexport function trackSourceToString(source: TrackSource) {\n switch (source) {\n case TrackSource.CAMERA:\n return 'camera';\n case TrackSource.MICROPHONE:\n return 'microphone';\n case TrackSource.SCREEN_SHARE:\n return 'screen_share';\n case TrackSource.SCREEN_SHARE_AUDIO:\n return 'screen_share_audio';\n default:\n throw new TypeError(`Cannot convert TrackSource ${source} to string`);\n }\n}\n\nexport function claimsToJwtPayload(\n grant: ClaimGrants,\n): JWTPayload & { video?: Record<string, unknown> } {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const claim: Record<string, any> = { ...grant };\n // eslint-disable-next-line no-restricted-syntax\n if (Array.isArray(claim.video?.canPublishSources)) {\n claim.video.canPublishSources = claim.video.canPublishSources.map(trackSourceToString);\n }\n return claim;\n}\n\nexport interface VideoGrant {\n /** permission to create a room */\n roomCreate?: boolean;\n\n /** permission to join a room as a participant, room must be set */\n roomJoin?: boolean;\n\n /** permission to list rooms */\n roomList?: boolean;\n\n /** permission to start a recording */\n roomRecord?: boolean;\n\n /** permission to control a specific room, room must be set */\n roomAdmin?: boolean;\n\n /** name of the room, must be set for admin or join permissions */\n room?: string;\n\n /** permissions to control ingress, not specific to any room or ingress */\n ingressAdmin?: boolean;\n\n /**\n * allow participant to publish. If neither canPublish or canSubscribe is set,\n * both publish and subscribe are enabled\n */\n canPublish?: boolean;\n\n /**\n * TrackSource types that the participant is allowed to publish\n * When set, it supersedes CanPublish. Only sources explicitly set here can be published\n */\n canPublishSources?: TrackSource[];\n\n /** allow participant to subscribe to other tracks */\n canSubscribe?: boolean;\n\n /**\n * allow participants to publish data, defaults to true if not set\n */\n canPublishData?: boolean;\n\n /**\n * by default, a participant is not allowed to update its own metadata\n */\n canUpdateOwnMetadata?: boolean;\n\n /** participant isn't visible to others */\n hidden?: boolean;\n\n /** participant is recording the room, when set, allows room to indicate it's being recorded */\n recorder?: boolean;\n\n /** participant allowed to connect to LiveKit as Agent Framework worker */\n agent?: boolean;\n\n /** allow participant to subscribe to metrics */\n canSubscribeMetrics?: boolean;\n}\n\nexport interface SIPGrant {\n /** manage sip resources */\n admin?: boolean;\n\n /** make outbound calls */\n call?: boolean;\n}\n\n/** @internal */\nexport interface ClaimGrants extends JWTPayload {\n name?: string;\n video?: VideoGrant;\n sip?: SIPGrant;\n kind?: string;\n metadata?: string;\n attributes?: Record<string, string>;\n sha256?: string;\n roomPreset?: string;\n roomConfig?: RoomConfiguration;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,sBAA4B;AAGrB,SAAS,oBAAoB,QAAqB;AACvD,UAAQ,QAAQ;AAAA,IACd,KAAK,4BAAY;AACf,aAAO;AAAA,IACT,KAAK,4BAAY;AACf,aAAO;AAAA,IACT,KAAK,4BAAY;AACf,aAAO;AAAA,IACT,KAAK,4BAAY;AACf,aAAO;AAAA,IACT;AACE,YAAM,IAAI,UAAU,8BAA8B,MAAM,YAAY;AAAA,EACxE;AACF;AAEO,SAAS,mBACd,OACkD;AAxBpD;AA0BE,QAAM,QAA6B,EAAE,GAAG,MAAM;AAE9C,MAAI,MAAM,SAAQ,WAAM,UAAN,mBAAa,iBAAiB,GAAG;AACjD,UAAM,MAAM,oBAAoB,MAAM,MAAM,kBAAkB,IAAI,mBAAmB;AAAA,EACvF;AACA,SAAO;AACT;","names":[]}