livekit-server-sdk 2.9.3 → 2.9.5

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 (40) hide show
  1. package/dist/AccessToken.d.cts +80 -0
  2. package/dist/AgentDispatchClient.d.cts +50 -0
  3. package/dist/EgressClient.cjs +1 -0
  4. package/dist/EgressClient.cjs.map +1 -1
  5. package/dist/EgressClient.d.cts +168 -0
  6. package/dist/EgressClient.d.ts.map +1 -1
  7. package/dist/EgressClient.js +1 -0
  8. package/dist/EgressClient.js.map +1 -1
  9. package/dist/IngressClient.d.cts +136 -0
  10. package/dist/RoomServiceClient.d.cts +173 -0
  11. package/dist/ServiceBase.d.cts +21 -0
  12. package/dist/SipClient.cjs +49 -90
  13. package/dist/SipClient.cjs.map +1 -1
  14. package/dist/SipClient.d.cts +172 -0
  15. package/dist/SipClient.d.ts +31 -0
  16. package/dist/SipClient.d.ts.map +1 -1
  17. package/dist/SipClient.js +49 -90
  18. package/dist/SipClient.js.map +1 -1
  19. package/dist/TwirpRPC.d.cts +18 -0
  20. package/dist/WebhookReceiver.d.cts +29 -0
  21. package/dist/digest.d.cts +3 -0
  22. package/dist/grants.d.cts +71 -0
  23. package/dist/index.d.cts +12 -0
  24. package/package.json +17 -9
  25. package/src/AccessToken.test.ts +6 -6
  26. package/src/EgressClient.ts +1 -0
  27. package/src/SipClient.ts +78 -98
  28. package/src/grants.test.ts +2 -2
  29. package/dist/AccessToken.test.cjs +0 -147
  30. package/dist/AccessToken.test.cjs.map +0 -1
  31. package/dist/AccessToken.test.js +0 -129
  32. package/dist/AccessToken.test.js.map +0 -1
  33. package/dist/WebhookReceiver.test.cjs +0 -38
  34. package/dist/WebhookReceiver.test.cjs.map +0 -1
  35. package/dist/WebhookReceiver.test.js +0 -37
  36. package/dist/WebhookReceiver.test.js.map +0 -1
  37. package/dist/grants.test.cjs +0 -27
  38. package/dist/grants.test.cjs.map +0 -1
  39. package/dist/grants.test.js +0 -26
  40. package/dist/grants.test.js.map +0 -1
@@ -0,0 +1,71 @@
1
+ import { TrackSource, RoomConfiguration } from '@livekit/protocol';
2
+ import { JWTPayload } from 'jose';
3
+
4
+ declare function trackSourceToString(source: TrackSource): "camera" | "microphone" | "screen_share" | "screen_share_audio";
5
+ declare function claimsToJwtPayload(grant: ClaimGrants): JWTPayload & {
6
+ video?: Record<string, unknown>;
7
+ };
8
+ interface VideoGrant {
9
+ /** permission to create a room */
10
+ roomCreate?: boolean;
11
+ /** permission to join a room as a participant, room must be set */
12
+ roomJoin?: boolean;
13
+ /** permission to list rooms */
14
+ roomList?: boolean;
15
+ /** permission to start a recording */
16
+ roomRecord?: boolean;
17
+ /** permission to control a specific room, room must be set */
18
+ roomAdmin?: boolean;
19
+ /** name of the room, must be set for admin or join permissions */
20
+ room?: string;
21
+ /** permissions to control ingress, not specific to any room or ingress */
22
+ ingressAdmin?: boolean;
23
+ /**
24
+ * allow participant to publish. If neither canPublish or canSubscribe is set,
25
+ * both publish and subscribe are enabled
26
+ */
27
+ canPublish?: boolean;
28
+ /**
29
+ * TrackSource types that the participant is allowed to publish
30
+ * When set, it supersedes CanPublish. Only sources explicitly set here can be published
31
+ */
32
+ canPublishSources?: TrackSource[];
33
+ /** allow participant to subscribe to other tracks */
34
+ canSubscribe?: boolean;
35
+ /**
36
+ * allow participants to publish data, defaults to true if not set
37
+ */
38
+ canPublishData?: boolean;
39
+ /**
40
+ * by default, a participant is not allowed to update its own metadata
41
+ */
42
+ canUpdateOwnMetadata?: boolean;
43
+ /** participant isn't visible to others */
44
+ hidden?: boolean;
45
+ /** participant is recording the room, when set, allows room to indicate it's being recorded */
46
+ recorder?: boolean;
47
+ /** participant allowed to connect to LiveKit as Agent Framework worker */
48
+ agent?: boolean;
49
+ /** allow participant to subscribe to metrics */
50
+ canSubscribeMetrics?: boolean;
51
+ }
52
+ interface SIPGrant {
53
+ /** manage sip resources */
54
+ admin?: boolean;
55
+ /** make outbound calls */
56
+ call?: boolean;
57
+ }
58
+ /** @internal */
59
+ interface ClaimGrants extends JWTPayload {
60
+ name?: string;
61
+ video?: VideoGrant;
62
+ sip?: SIPGrant;
63
+ kind?: string;
64
+ metadata?: string;
65
+ attributes?: Record<string, string>;
66
+ sha256?: string;
67
+ roomPreset?: string;
68
+ roomConfig?: RoomConfiguration;
69
+ }
70
+
71
+ export { type ClaimGrants, type SIPGrant, type VideoGrant, claimsToJwtPayload, trackSourceToString };
@@ -0,0 +1,12 @@
1
+ export { AliOSSUpload, AutoParticipantEgress, AutoTrackEgress, AzureBlobUpload, DataPacket_Kind, DirectFileOutput, EgressInfo, EgressStatus, EncodedFileOutput, EncodedFileType, EncodingOptions, EncodingOptionsPreset, GCPUpload, ImageCodec, ImageFileSuffix, ImageOutput, IngressAudioEncodingOptions, IngressAudioEncodingPreset, IngressAudioOptions, IngressInfo, IngressInput, IngressState, IngressVideoEncodingOptions, IngressVideoEncodingPreset, IngressVideoOptions, ParticipantEgressRequest, ParticipantInfo, ParticipantInfo_State, ParticipantPermission, Room, RoomCompositeEgressRequest, RoomEgress, S3Upload, SIPDispatchRuleInfo, SIPParticipantInfo, SIPTrunkInfo, SegmentedFileOutput, SegmentedFileProtocol, StreamOutput, StreamProtocol, TrackCompositeEgressRequest, TrackEgressRequest, TrackInfo, TrackSource, TrackType, WebEgressRequest } from '@livekit/protocol';
2
+ export { AccessToken, AccessTokenOptions, TokenVerifier } from './AccessToken.cjs';
3
+ export { AgentDispatchClient } from './AgentDispatchClient.cjs';
4
+ export { EgressClient, EncodedOutputs, ListEgressOptions, ParticipantEgressOptions, RoomCompositeOptions, TrackCompositeOptions, WebOptions } from './EgressClient.cjs';
5
+ export { ClaimGrants, SIPGrant, VideoGrant, claimsToJwtPayload, trackSourceToString } from './grants.cjs';
6
+ export { CreateIngressOptions, IngressClient, ListIngressOptions, UpdateIngressOptions } from './IngressClient.cjs';
7
+ export { CreateOptions, RoomServiceClient, SendDataOptions, UpdateParticipantOptions } from './RoomServiceClient.cjs';
8
+ export { CreateSipDispatchRuleOptions, CreateSipInboundTrunkOptions, CreateSipOutboundTrunkOptions, CreateSipParticipantOptions, CreateSipTrunkOptions, SipClient, SipDispatchRuleDirect, SipDispatchRuleIndividual, TransferSipParticipantOptions } from './SipClient.cjs';
9
+ export { WebhookEvent, WebhookEventNames, WebhookReceiver, authorizeHeader } from './WebhookReceiver.cjs';
10
+ import './ServiceBase.cjs';
11
+ import 'jose';
12
+ import '@bufbuild/protobuf';
package/package.json CHANGED
@@ -1,19 +1,27 @@
1
1
  {
2
2
  "name": "livekit-server-sdk",
3
- "version": "2.9.3",
3
+ "version": "2.9.5",
4
4
  "description": "Server-side SDK for LiveKit",
5
5
  "main": "dist/index.js",
6
6
  "require": "dist/index.cjs",
7
7
  "types": "dist/index.d.ts",
8
- "repository": "git@github.com:livekit/server-sdk-js.git",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/livekit/server-sdk-js.git"
11
+ },
9
12
  "author": "David Zhao <david@davidzhao.com>",
10
13
  "license": "Apache-2.0",
11
14
  "type": "module",
12
15
  "exports": {
13
16
  ".": {
14
- "types": "./dist/index.d.ts",
15
- "import": "./dist/index.js",
16
- "require": "./dist/index.cjs"
17
+ "import": {
18
+ "types": "./dist/index.d.ts",
19
+ "default": "./dist/index.js"
20
+ },
21
+ "require": {
22
+ "types": "./dist/index.d.cts",
23
+ "default": "./dist/index.cjs"
24
+ }
17
25
  }
18
26
  },
19
27
  "files": [
@@ -21,7 +29,7 @@
21
29
  "src"
22
30
  ],
23
31
  "dependencies": {
24
- "@livekit/protocol": "^1.29.1",
32
+ "@livekit/protocol": "^1.30.0",
25
33
  "camelcase-keys": "^9.0.0",
26
34
  "jose": "^5.1.2"
27
35
  },
@@ -31,11 +39,11 @@
31
39
  "@edge-runtime/vm": "^4.0.0",
32
40
  "@livekit/changesets-changelog-github": "^0.0.4",
33
41
  "@types/node": "^20.10.1",
34
- "happy-dom": "^15.0.0",
42
+ "happy-dom": "^16.0.0",
35
43
  "prettier": "^3.0.0",
36
44
  "tsup": "^8.3.5",
37
- "typedoc": "^0.26.0",
38
- "typescript": "5.6.x",
45
+ "typedoc": "^0.27.0",
46
+ "typescript": "5.7.x",
39
47
  "vite": "^5.2.9",
40
48
  "vitest": "^2.0.0"
41
49
  },
@@ -9,8 +9,8 @@ import {
9
9
  } from '@livekit/protocol';
10
10
  import * as jose from 'jose';
11
11
  import { describe, expect, it } from 'vitest';
12
- import { AccessToken, TokenVerifier } from './AccessToken';
13
- import type { ClaimGrants } from './grants';
12
+ import { AccessToken, TokenVerifier } from './AccessToken.js';
13
+ import type { ClaimGrants } from './grants.js';
14
14
 
15
15
  const testApiKey = 'abcdefg';
16
16
  const testSecret = 'abababa';
@@ -143,10 +143,10 @@ describe('room configuration with agents and egress', () => {
143
143
  expect(decoded.roomConfig?.name).toEqual('test-room');
144
144
  expect(decoded.roomConfig?.maxParticipants).toEqual(10);
145
145
  expect(decoded.roomConfig?.agents).toHaveLength(2);
146
- expect(decoded.roomConfig?.agents?.[0].agentName).toEqual('agent1');
147
- expect(decoded.roomConfig?.agents?.[0].metadata).toEqual('metadata-1');
148
- expect(decoded.roomConfig?.agents?.[1].agentName).toEqual('agent2');
149
- expect(decoded.roomConfig?.agents?.[1].metadata).toEqual('metadata-2');
146
+ expect(decoded.roomConfig?.agents?.[0]?.agentName).toEqual('agent1');
147
+ expect(decoded.roomConfig?.agents?.[0]?.metadata).toEqual('metadata-1');
148
+ expect(decoded.roomConfig?.agents?.[1]?.agentName).toEqual('agent2');
149
+ expect(decoded.roomConfig?.agents?.[1]?.metadata).toEqual('metadata-2');
150
150
  expect(decoded.roomConfig?.egress?.room?.roomName).toEqual('test-room');
151
151
  });
152
152
  });
@@ -274,6 +274,7 @@ export class EgressClient extends ServiceBase {
274
274
  const req = new ParticipantEgressRequest({
275
275
  roomName,
276
276
  identity,
277
+ screenShare: opts?.screenShare ?? false,
277
278
  options,
278
279
  fileOutputs,
279
280
  streamOutputs,
package/src/SipClient.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  //
3
3
  // SPDX-License-Identifier: Apache-2.0
4
4
  import { Duration } from '@bufbuild/protobuf';
5
+ import type { RoomConfiguration, SIPHeaderOptions } from '@livekit/protocol';
5
6
  import {
6
7
  CreateSIPDispatchRuleRequest,
7
8
  CreateSIPInboundTrunkRequest,
@@ -51,20 +52,37 @@ export interface CreateSipTrunkOptions {
51
52
  }
52
53
  export interface CreateSipInboundTrunkOptions {
53
54
  metadata?: string;
55
+ /** @deprecated - use `allowedAddresses` instead */
54
56
  allowed_addresses?: string[];
57
+ allowedAddresses?: string[];
58
+ /** @deprecated - use `allowedNumbers` instead */
55
59
  allowed_numbers?: string[];
60
+ allowedNumbers?: string[];
61
+ /** @deprecated - use `authUsername` instead */
56
62
  auth_username?: string;
63
+ authUsername?: string;
64
+ /** @deprecated - use `authPassword` instead */
57
65
  auth_password?: string;
66
+ authPassword?: string;
58
67
  headers?: { [key: string]: string };
59
68
  headersToAttributes?: { [key: string]: string };
69
+ // Map SIP response headers from INVITE to sip.h.* participant attributes automatically.
70
+ includeHeaders?: SIPHeaderOptions;
71
+ krispEnabled?: boolean;
60
72
  }
61
73
  export interface CreateSipOutboundTrunkOptions {
62
74
  metadata?: string;
63
75
  transport: SIPTransport;
76
+ /** @deprecated - use `authUsername` instead */
64
77
  auth_username?: string;
78
+ authUsername?: string;
79
+ /** @deprecated - use `authPassword` instead */
65
80
  auth_password?: string;
81
+ authPassword?: string;
66
82
  headers?: { [key: string]: string };
67
83
  headersToAttributes?: { [key: string]: string };
84
+ // Map SIP response headers from INVITE to sip.h.* participant attributes automatically.
85
+ includeHeaders?: SIPHeaderOptions;
68
86
  }
69
87
 
70
88
  export interface SipDispatchRuleDirect {
@@ -84,16 +102,24 @@ export interface CreateSipDispatchRuleOptions {
84
102
  metadata?: string;
85
103
  trunkIds?: string[];
86
104
  hidePhoneNumber?: boolean;
105
+ attributes?: { [key: string]: string };
106
+ roomPreset?: string;
107
+ roomConfig?: RoomConfiguration;
87
108
  }
88
109
 
89
110
  export interface CreateSipParticipantOptions {
90
111
  participantIdentity?: string;
91
112
  participantName?: string;
92
113
  participantMetadata?: string;
114
+ participantAttributes?: { [key: string]: string };
93
115
  dtmf?: string;
94
116
  /** @deprecated - use `playDialtone` instead */
95
117
  playRingtone?: boolean; // Deprecated, use playDialtone instead
96
118
  playDialtone?: boolean;
119
+ // These headers are sent as-is and may help identify this call as coming from LiveKit for the other SIP endpoint.
120
+ headers?: { [key: string]: string };
121
+ // Map SIP response headers from INVITE to sip.h.* participant attributes automatically.
122
+ includeHeaders?: SIPHeaderOptions;
97
123
  hidePhoneNumber?: boolean;
98
124
  ringingTimeout?: number; // Duration in seconds
99
125
  maxCallDuration?: number; // Duration in seconds
@@ -102,6 +128,7 @@ export interface CreateSipParticipantOptions {
102
128
 
103
129
  export interface TransferSipParticipantOptions {
104
130
  playDialtone?: boolean;
131
+ headers?: { [key: string]: string };
105
132
  }
106
133
 
107
134
  /**
@@ -180,35 +207,22 @@ export class SipClient extends ServiceBase {
180
207
  numbers: string[],
181
208
  opts?: CreateSipInboundTrunkOptions,
182
209
  ): Promise<SIPInboundTrunkInfo> {
183
- let allowedAddresses: string[] | undefined;
184
- let allowedNumbers: string[] | undefined;
185
- let authUsername: string = '';
186
- let authPassword: string = '';
187
- let metadata: string = '';
188
- let headers: { [key: string]: string } = {};
189
- let headersToAttributes: { [key: string]: string } = {};
190
-
191
- if (opts !== undefined) {
192
- allowedAddresses = opts.allowed_addresses;
193
- allowedNumbers = opts.allowed_numbers;
194
- authUsername = opts.auth_username || '';
195
- authPassword = opts.auth_password || '';
196
- metadata = opts.metadata || '';
197
- headers = opts.headers || {};
198
- headersToAttributes = opts.headersToAttributes || {};
210
+ if (opts === undefined) {
211
+ opts = {};
199
212
  }
200
-
201
213
  const req = new CreateSIPInboundTrunkRequest({
202
214
  trunk: new SIPInboundTrunkInfo({
203
215
  name: name,
204
216
  numbers: numbers,
205
- metadata: metadata,
206
- allowedAddresses: allowedAddresses,
207
- allowedNumbers: allowedNumbers,
208
- authUsername: authUsername,
209
- authPassword: authPassword,
210
- headers: headers,
211
- headersToAttributes: headersToAttributes,
217
+ metadata: opts?.metadata,
218
+ allowedAddresses: opts.allowedAddresses ?? opts.allowed_addresses,
219
+ allowedNumbers: opts.allowedNumbers ?? opts.allowed_numbers,
220
+ authUsername: opts.authUsername ?? opts.auth_username,
221
+ authPassword: opts.authPassword ?? opts.auth_password,
222
+ headers: opts.headers,
223
+ headersToAttributes: opts.headersToAttributes,
224
+ includeHeaders: opts.includeHeaders,
225
+ krispEnabled: opts.krispEnabled,
212
226
  }),
213
227
  }).toJson();
214
228
 
@@ -233,20 +247,10 @@ export class SipClient extends ServiceBase {
233
247
  numbers: string[],
234
248
  opts?: CreateSipOutboundTrunkOptions,
235
249
  ): Promise<SIPOutboundTrunkInfo> {
236
- let authUsername: string = '';
237
- let authPassword: string = '';
238
- let transport: SIPTransport = SIPTransport.SIP_TRANSPORT_AUTO;
239
- let metadata: string = '';
240
- let headers: { [key: string]: string } = {};
241
- let headersToAttributes: { [key: string]: string } = {};
242
-
243
- if (opts !== undefined) {
244
- authUsername = opts.auth_username || '';
245
- authPassword = opts.auth_password || '';
246
- transport = opts.transport || SIPTransport.SIP_TRANSPORT_AUTO;
247
- metadata = opts.metadata || '';
248
- headers = opts.headers || {};
249
- headersToAttributes = opts.headersToAttributes || {};
250
+ if (opts === undefined) {
251
+ opts = {
252
+ transport: SIPTransport.SIP_TRANSPORT_AUTO,
253
+ };
250
254
  }
251
255
 
252
256
  const req = new CreateSIPOutboundTrunkRequest({
@@ -254,12 +258,13 @@ export class SipClient extends ServiceBase {
254
258
  name: name,
255
259
  address: address,
256
260
  numbers: numbers,
257
- metadata: metadata,
258
- transport: transport,
259
- authUsername: authUsername,
260
- authPassword: authPassword,
261
- headers: headers,
262
- headersToAttributes: headersToAttributes,
261
+ metadata: opts.metadata,
262
+ transport: opts.transport,
263
+ authUsername: opts.authUsername ?? opts.auth_username,
264
+ authPassword: opts.authPassword ?? opts.auth_password,
265
+ headers: opts.headers,
266
+ headersToAttributes: opts.headersToAttributes,
267
+ includeHeaders: opts.includeHeaders,
263
268
  }),
264
269
  }).toJson();
265
270
 
@@ -329,18 +334,10 @@ export class SipClient extends ServiceBase {
329
334
  rule: SipDispatchRuleDirect | SipDispatchRuleIndividual,
330
335
  opts?: CreateSipDispatchRuleOptions,
331
336
  ): Promise<SIPDispatchRuleInfo> {
332
- let trunkIds: string[] | undefined;
333
- let hidePhoneNumber: boolean = false;
334
- let name: string = '';
335
- let metadata: string = '';
336
- let ruleProto: SIPDispatchRule | undefined = undefined;
337
-
338
- if (opts !== undefined) {
339
- trunkIds = opts.trunkIds;
340
- hidePhoneNumber = opts.hidePhoneNumber || false;
341
- name = opts.name || '';
342
- metadata = opts.metadata || '';
337
+ if (opts === undefined) {
338
+ opts = {};
343
339
  }
340
+ let ruleProto: SIPDispatchRule | undefined = undefined;
344
341
  if (rule.type == 'direct') {
345
342
  ruleProto = new SIPDispatchRule({
346
343
  rule: {
@@ -365,10 +362,13 @@ export class SipClient extends ServiceBase {
365
362
 
366
363
  const req = new CreateSIPDispatchRuleRequest({
367
364
  rule: ruleProto,
368
- trunkIds: trunkIds,
369
- hidePhoneNumber: hidePhoneNumber,
370
- name: name,
371
- metadata: metadata,
365
+ trunkIds: opts.trunkIds,
366
+ hidePhoneNumber: opts.hidePhoneNumber,
367
+ name: opts.name,
368
+ metadata: opts.metadata,
369
+ attributes: opts.attributes,
370
+ roomPreset: opts.roomPreset,
371
+ roomConfig: opts.roomConfig,
372
372
  }).toJson();
373
373
 
374
374
  const data = await this.rpc.request(
@@ -416,48 +416,29 @@ export class SipClient extends ServiceBase {
416
416
  roomName: string,
417
417
  opts?: CreateSipParticipantOptions,
418
418
  ): Promise<SIPParticipantInfo> {
419
- let participantIdentity: string = '';
420
- let participantName: string = '';
421
- let participantMetadata: string = '';
422
- let dtmf: string = '';
423
- let playRingtone: boolean = false;
424
- let playDialtone: boolean = false;
425
- let hidePhoneNumber: boolean = false;
426
- let ringingTimeout: number | undefined = undefined;
427
- let maxCallDuration: number | undefined = undefined;
428
- let enableKrisp: boolean | undefined = undefined;
429
-
430
- if (opts !== undefined) {
431
- participantIdentity = opts.participantIdentity || '';
432
- participantName = opts.participantName || '';
433
- participantMetadata = opts.participantMetadata || '';
434
- dtmf = opts.dtmf || '';
435
- playRingtone = opts.playRingtone || false;
436
- playDialtone = opts.playDialtone || playRingtone; // Enable PlayDialtone if either PlayDialtone or playRingtone is set
437
- hidePhoneNumber = opts.hidePhoneNumber || false;
438
- ringingTimeout = opts.ringingTimeout || undefined;
439
- maxCallDuration = opts.maxCallDuration || undefined;
440
- enableKrisp = opts.enableKrisp || undefined;
419
+ if (opts === undefined) {
420
+ opts = {};
441
421
  }
442
422
 
443
423
  const req = new CreateSIPParticipantRequest({
444
424
  sipTrunkId: sipTrunkId,
445
425
  sipCallTo: number,
446
426
  roomName: roomName,
447
- participantIdentity: participantIdentity,
448
- participantName: participantName,
449
- participantMetadata: participantMetadata,
450
- dtmf: dtmf,
451
- playRingtone: playDialtone,
452
- playDialtone: playDialtone,
453
- hidePhoneNumber: hidePhoneNumber,
454
- ringingTimeout: ringingTimeout
455
- ? new Duration({ seconds: BigInt(ringingTimeout) })
427
+ participantIdentity: opts.participantIdentity || 'sip-participant',
428
+ participantName: opts.participantName,
429
+ participantMetadata: opts.participantMetadata,
430
+ dtmf: opts.dtmf,
431
+ playDialtone: opts.playDialtone ?? opts.playRingtone,
432
+ headers: opts.headers,
433
+ hidePhoneNumber: opts.hidePhoneNumber,
434
+ includeHeaders: opts.includeHeaders,
435
+ ringingTimeout: opts.ringingTimeout
436
+ ? new Duration({ seconds: BigInt(opts.ringingTimeout) })
456
437
  : undefined,
457
- maxCallDuration: maxCallDuration
458
- ? new Duration({ seconds: BigInt(maxCallDuration) })
438
+ maxCallDuration: opts.maxCallDuration
439
+ ? new Duration({ seconds: BigInt(opts.maxCallDuration) })
459
440
  : undefined,
460
- enableKrisp: enableKrisp,
441
+ enableKrisp: opts.enableKrisp,
461
442
  }).toJson();
462
443
 
463
444
  const data = await this.rpc.request(
@@ -480,17 +461,16 @@ export class SipClient extends ServiceBase {
480
461
  transferTo: string,
481
462
  opts?: TransferSipParticipantOptions,
482
463
  ): Promise<void> {
483
- let playDialtone: boolean = false;
484
-
485
- if (opts !== undefined) {
486
- playDialtone = opts.playDialtone || false;
464
+ if (opts === undefined) {
465
+ opts = {};
487
466
  }
488
467
 
489
468
  const req = new TransferSIPParticipantRequest({
490
469
  participantIdentity: participantIdentity,
491
470
  roomName: roomName,
492
471
  transferTo: transferTo,
493
- playDialtone: playDialtone,
472
+ playDialtone: opts.playDialtone,
473
+ headers: opts.headers,
494
474
  }).toJson();
495
475
 
496
476
  await this.rpc.request(
@@ -3,8 +3,8 @@
3
3
  // SPDX-License-Identifier: Apache-2.0
4
4
  import { TrackSource } from '@livekit/protocol';
5
5
  import { describe, expect, it } from 'vitest';
6
- import type { ClaimGrants, VideoGrant } from './grants';
7
- import { claimsToJwtPayload } from './grants';
6
+ import type { ClaimGrants, VideoGrant } from './grants.js';
7
+ import { claimsToJwtPayload } from './grants.js';
8
8
 
9
9
  describe('ClaimGrants are parsed correctly', () => {
10
10
  it('parses TrackSource correctly to strings', () => {
@@ -1,147 +0,0 @@
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 __copyProps = (to, from, except, desc) => {
9
- if (from && typeof from === "object" || typeof from === "function") {
10
- for (let key of __getOwnPropNames(from))
11
- if (!__hasOwnProp.call(to, key) && key !== except)
12
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
- }
14
- return to;
15
- };
16
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
- // If the importer is in node compatibility mode or this is not an ESM
18
- // file that has been converted to a CommonJS file using a Babel-
19
- // compatible transform (i.e. "__esModule" has not been set), then set
20
- // "default" to the CommonJS "module.exports" for node compatibility.
21
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
- mod
23
- ));
24
- var import_protocol = require("@livekit/protocol");
25
- var jose = __toESM(require("jose"), 1);
26
- var import_vitest = require("vitest");
27
- var import_AccessToken = require("./AccessToken");
28
- const testApiKey = "abcdefg";
29
- const testSecret = "abababa";
30
- (0, import_vitest.describe)("encoded tokens are valid", () => {
31
- const t = new import_AccessToken.AccessToken(testApiKey, testSecret, {
32
- identity: "me",
33
- name: "myname"
34
- });
35
- t.addGrant({ room: "myroom" });
36
- const EncodedTestSecret = new TextEncoder().encode(testSecret);
37
- (0, import_vitest.it)("can be decoded", async () => {
38
- const { payload } = await jose.jwtVerify(await t.toJwt(), EncodedTestSecret, {
39
- issuer: testApiKey
40
- });
41
- (0, import_vitest.expect)(payload).not.toBe(void 0);
42
- });
43
- (0, import_vitest.it)("has name set", async () => {
44
- const { payload } = await jose.jwtVerify(await t.toJwt(), EncodedTestSecret, {
45
- issuer: testApiKey
46
- });
47
- (0, import_vitest.expect)(payload.name).toBe("myname");
48
- });
49
- (0, import_vitest.it)("has video grants set", async () => {
50
- var _a;
51
- const { payload } = await jose.jwtVerify(await t.toJwt(), EncodedTestSecret, {
52
- issuer: testApiKey
53
- });
54
- (0, import_vitest.expect)(payload.video).toBeTruthy();
55
- (0, import_vitest.expect)((_a = payload.video) == null ? void 0 : _a.room).toEqual("myroom");
56
- });
57
- });
58
- (0, import_vitest.describe)("identity is required for only join grants", () => {
59
- (0, import_vitest.it)("allows empty identity for create", async () => {
60
- const t = new import_AccessToken.AccessToken(testApiKey, testSecret);
61
- t.addGrant({ roomCreate: true });
62
- (0, import_vitest.expect)(await t.toJwt()).toBeTruthy();
63
- });
64
- (0, import_vitest.it)("throws error when identity is not provided for join", async () => {
65
- const t = new import_AccessToken.AccessToken(testApiKey, testSecret);
66
- t.addGrant({ roomJoin: true });
67
- await (0, import_vitest.expect)(async () => {
68
- await t.toJwt();
69
- }).rejects.toThrow();
70
- });
71
- });
72
- (0, import_vitest.describe)("verify token is valid", () => {
73
- (0, import_vitest.it)("can decode encoded token", async () => {
74
- var _a;
75
- const t = new import_AccessToken.AccessToken(testApiKey, testSecret);
76
- t.sha256 = "abcdefg";
77
- t.kind = "agent";
78
- t.addGrant({ roomCreate: true });
79
- t.attributes = { foo: "bar", live: "kit" };
80
- const v = new import_AccessToken.TokenVerifier(testApiKey, testSecret);
81
- const decoded = await v.verify(await t.toJwt());
82
- (0, import_vitest.expect)(decoded).not.toBe(void 0);
83
- (0, import_vitest.expect)(decoded.sha256).toEqual("abcdefg");
84
- (0, import_vitest.expect)((_a = decoded.video) == null ? void 0 : _a.roomCreate).toBeTruthy();
85
- (0, import_vitest.expect)(decoded.kind).toEqual("agent");
86
- (0, import_vitest.expect)(decoded.attributes).toEqual(t.attributes);
87
- });
88
- });
89
- (0, import_vitest.describe)("adding grants should not overwrite existing grants", () => {
90
- const EncodedTestSecret = new TextEncoder().encode(testSecret);
91
- (0, import_vitest.it)("should not overwrite existing grants", async () => {
92
- var _a, _b;
93
- const t = new import_AccessToken.AccessToken(testApiKey, testSecret, {
94
- identity: "me",
95
- name: "myname"
96
- });
97
- t.addGrant({ roomCreate: true });
98
- t.addGrant({ roomJoin: true });
99
- const { payload } = await jose.jwtVerify(
100
- await t.toJwt(),
101
- EncodedTestSecret,
102
- { issuer: testApiKey }
103
- );
104
- (0, import_vitest.expect)((_a = payload.video) == null ? void 0 : _a.roomCreate).toBeTruthy();
105
- (0, import_vitest.expect)((_b = payload.video) == null ? void 0 : _b.roomJoin).toBeTruthy();
106
- });
107
- });
108
- (0, import_vitest.describe)("room configuration with agents and egress", () => {
109
- (0, import_vitest.it)("should set agents and egress in room configuration", async () => {
110
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
111
- const t = new import_AccessToken.AccessToken(testApiKey, testSecret, {
112
- identity: "test-identity"
113
- });
114
- const roomConfig = new import_protocol.RoomConfiguration({
115
- name: "test-room",
116
- maxParticipants: 10
117
- });
118
- const agents = [
119
- new import_protocol.RoomAgentDispatch({
120
- agentName: "agent1",
121
- metadata: "metadata-1"
122
- }),
123
- new import_protocol.RoomAgentDispatch({
124
- agentName: "agent2",
125
- metadata: "metadata-2"
126
- })
127
- ];
128
- const egress = new import_protocol.RoomEgress({
129
- room: new import_protocol.RoomCompositeEgressRequest({ roomName: "test-room" })
130
- });
131
- roomConfig.agents = agents;
132
- roomConfig.egress = egress;
133
- t.roomConfig = roomConfig;
134
- const v = new import_AccessToken.TokenVerifier(testApiKey, testSecret);
135
- const decoded = await v.verify(await t.toJwt());
136
- (0, import_vitest.expect)(decoded.roomConfig).toBeDefined();
137
- (0, import_vitest.expect)((_a = decoded.roomConfig) == null ? void 0 : _a.name).toEqual("test-room");
138
- (0, import_vitest.expect)((_b = decoded.roomConfig) == null ? void 0 : _b.maxParticipants).toEqual(10);
139
- (0, import_vitest.expect)((_c = decoded.roomConfig) == null ? void 0 : _c.agents).toHaveLength(2);
140
- (0, import_vitest.expect)((_e = (_d = decoded.roomConfig) == null ? void 0 : _d.agents) == null ? void 0 : _e[0].agentName).toEqual("agent1");
141
- (0, import_vitest.expect)((_g = (_f = decoded.roomConfig) == null ? void 0 : _f.agents) == null ? void 0 : _g[0].metadata).toEqual("metadata-1");
142
- (0, import_vitest.expect)((_i = (_h = decoded.roomConfig) == null ? void 0 : _h.agents) == null ? void 0 : _i[1].agentName).toEqual("agent2");
143
- (0, import_vitest.expect)((_k = (_j = decoded.roomConfig) == null ? void 0 : _j.agents) == null ? void 0 : _k[1].metadata).toEqual("metadata-2");
144
- (0, import_vitest.expect)((_n = (_m = (_l = decoded.roomConfig) == null ? void 0 : _l.egress) == null ? void 0 : _m.room) == null ? void 0 : _n.roomName).toEqual("test-room");
145
- });
146
- });
147
- //# sourceMappingURL=AccessToken.test.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/AccessToken.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport {\n RoomAgentDispatch,\n RoomCompositeEgressRequest,\n RoomConfiguration,\n RoomEgress,\n} from '@livekit/protocol';\nimport * as jose from 'jose';\nimport { describe, expect, it } from 'vitest';\nimport { AccessToken, TokenVerifier } from './AccessToken';\nimport type { ClaimGrants } from './grants';\n\nconst testApiKey = 'abcdefg';\nconst testSecret = 'abababa';\n\ndescribe('encoded tokens are valid', () => {\n const t = new AccessToken(testApiKey, testSecret, {\n identity: 'me',\n name: 'myname',\n });\n t.addGrant({ room: 'myroom' });\n const EncodedTestSecret = new TextEncoder().encode(testSecret);\n it('can be decoded', async () => {\n const { payload } = await jose.jwtVerify(await t.toJwt(), EncodedTestSecret, {\n issuer: testApiKey,\n });\n\n expect(payload).not.toBe(undefined);\n });\n\n it('has name set', async () => {\n const { payload } = await jose.jwtVerify(await t.toJwt(), EncodedTestSecret, {\n issuer: testApiKey,\n });\n\n expect(payload.name).toBe('myname');\n });\n\n it('has video grants set', async () => {\n const { payload } = await jose.jwtVerify(await t.toJwt(), EncodedTestSecret, {\n issuer: testApiKey,\n });\n\n expect(payload.video).toBeTruthy();\n expect((payload as ClaimGrants).video?.room).toEqual('myroom');\n });\n});\n\ndescribe('identity is required for only join grants', () => {\n it('allows empty identity for create', async () => {\n const t = new AccessToken(testApiKey, testSecret);\n t.addGrant({ roomCreate: true });\n\n expect(await t.toJwt()).toBeTruthy();\n });\n it('throws error when identity is not provided for join', async () => {\n const t = new AccessToken(testApiKey, testSecret);\n t.addGrant({ roomJoin: true });\n\n await expect(async () => {\n await t.toJwt();\n }).rejects.toThrow();\n });\n});\n\ndescribe('verify token is valid', () => {\n it('can decode encoded token', async () => {\n const t = new AccessToken(testApiKey, testSecret);\n t.sha256 = 'abcdefg';\n t.kind = 'agent';\n t.addGrant({ roomCreate: true });\n t.attributes = { foo: 'bar', live: 'kit' };\n\n const v = new TokenVerifier(testApiKey, testSecret);\n const decoded = await v.verify(await t.toJwt());\n\n expect(decoded).not.toBe(undefined);\n expect(decoded.sha256).toEqual('abcdefg');\n expect(decoded.video?.roomCreate).toBeTruthy();\n expect(decoded.kind).toEqual('agent');\n expect(decoded.attributes).toEqual(t.attributes);\n });\n});\n\ndescribe('adding grants should not overwrite existing grants', () => {\n const EncodedTestSecret = new TextEncoder().encode(testSecret);\n\n it('should not overwrite existing grants', async () => {\n const t = new AccessToken(testApiKey, testSecret, {\n identity: 'me',\n name: 'myname',\n });\n t.addGrant({ roomCreate: true });\n t.addGrant({ roomJoin: true });\n\n const { payload }: jose.JWTVerifyResult<ClaimGrants> = await jose.jwtVerify(\n await t.toJwt(),\n EncodedTestSecret,\n { issuer: testApiKey },\n );\n expect(payload.video?.roomCreate).toBeTruthy();\n expect(payload.video?.roomJoin).toBeTruthy();\n });\n});\n\ndescribe('room configuration with agents and egress', () => {\n it('should set agents and egress in room configuration', async () => {\n const t = new AccessToken(testApiKey, testSecret, {\n identity: 'test-identity',\n });\n\n const roomConfig = new RoomConfiguration({\n name: 'test-room',\n maxParticipants: 10,\n });\n\n const agents: RoomAgentDispatch[] = [\n new RoomAgentDispatch({\n agentName: 'agent1',\n metadata: 'metadata-1',\n }),\n new RoomAgentDispatch({\n agentName: 'agent2',\n metadata: 'metadata-2',\n }),\n ];\n\n const egress = new RoomEgress({\n room: new RoomCompositeEgressRequest({ roomName: 'test-room' }),\n });\n\n roomConfig.agents = agents;\n roomConfig.egress = egress;\n\n t.roomConfig = roomConfig;\n\n const v = new TokenVerifier(testApiKey, testSecret);\n const decoded = await v.verify(await t.toJwt());\n\n expect(decoded.roomConfig).toBeDefined();\n expect(decoded.roomConfig?.name).toEqual('test-room');\n expect(decoded.roomConfig?.maxParticipants).toEqual(10);\n expect(decoded.roomConfig?.agents).toHaveLength(2);\n expect(decoded.roomConfig?.agents?.[0].agentName).toEqual('agent1');\n expect(decoded.roomConfig?.agents?.[0].metadata).toEqual('metadata-1');\n expect(decoded.roomConfig?.agents?.[1].agentName).toEqual('agent2');\n expect(decoded.roomConfig?.agents?.[1].metadata).toEqual('metadata-2');\n expect(decoded.roomConfig?.egress?.room?.roomName).toEqual('test-room');\n });\n});\n"],"mappings":"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","names":[]}