livekit-client 2.17.3 → 2.18.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 (125) hide show
  1. package/dist/livekit-client.esm.mjs +64 -46
  2. package/dist/livekit-client.esm.mjs.map +1 -1
  3. package/dist/livekit-client.umd.js +1 -1
  4. package/dist/livekit-client.umd.js.map +1 -1
  5. package/dist/src/index.d.ts +1 -1
  6. package/dist/src/index.d.ts.map +1 -1
  7. package/dist/src/room/RTCEngine.d.ts +3 -1
  8. package/dist/src/room/RTCEngine.d.ts.map +1 -1
  9. package/dist/src/room/data-track/{track.d.ts → LocalDataTrack.d.ts} +9 -14
  10. package/dist/src/room/data-track/LocalDataTrack.d.ts.map +1 -0
  11. package/dist/src/room/data-track/RemoteDataTrack.d.ts +46 -0
  12. package/dist/src/room/data-track/RemoteDataTrack.d.ts.map +1 -0
  13. package/dist/src/room/data-track/depacketizer.d.ts +3 -3
  14. package/dist/src/room/data-track/depacketizer.d.ts.map +1 -1
  15. package/dist/src/room/data-track/e2ee.d.ts +1 -1
  16. package/dist/src/room/data-track/e2ee.d.ts.map +1 -1
  17. package/dist/src/room/data-track/handle.d.ts +2 -2
  18. package/dist/src/room/data-track/handle.d.ts.map +1 -1
  19. package/dist/src/room/data-track/incoming/IncomingDataTrackManager.d.ts +96 -0
  20. package/dist/src/room/data-track/incoming/IncomingDataTrackManager.d.ts.map +1 -0
  21. package/dist/src/room/data-track/incoming/errors.d.ts +24 -0
  22. package/dist/src/room/data-track/incoming/errors.d.ts.map +1 -0
  23. package/dist/src/room/data-track/incoming/pipeline.d.ts +37 -0
  24. package/dist/src/room/data-track/incoming/pipeline.d.ts.map +1 -0
  25. package/dist/src/room/data-track/incoming/types.d.ts +20 -0
  26. package/dist/src/room/data-track/incoming/types.d.ts.map +1 -0
  27. package/dist/src/room/data-track/outgoing/OutgoingDataTrackManager.d.ts +9 -8
  28. package/dist/src/room/data-track/outgoing/OutgoingDataTrackManager.d.ts.map +1 -1
  29. package/dist/src/room/data-track/outgoing/errors.d.ts +4 -4
  30. package/dist/src/room/data-track/outgoing/errors.d.ts.map +1 -1
  31. package/dist/src/room/data-track/outgoing/pipeline.d.ts +3 -3
  32. package/dist/src/room/data-track/outgoing/pipeline.d.ts.map +1 -1
  33. package/dist/src/room/data-track/outgoing/types.d.ts +4 -5
  34. package/dist/src/room/data-track/outgoing/types.d.ts.map +1 -1
  35. package/dist/src/room/data-track/packet/errors.d.ts +2 -4
  36. package/dist/src/room/data-track/packet/errors.d.ts.map +1 -1
  37. package/dist/src/room/data-track/packet/extensions.d.ts +4 -4
  38. package/dist/src/room/data-track/packet/extensions.d.ts.map +1 -1
  39. package/dist/src/room/data-track/packet/index.d.ts +5 -5
  40. package/dist/src/room/data-track/packet/index.d.ts.map +1 -1
  41. package/dist/src/room/data-track/packet/serializable.d.ts +4 -4
  42. package/dist/src/room/data-track/packet/serializable.d.ts.map +1 -1
  43. package/dist/src/room/data-track/packetizer.d.ts +3 -3
  44. package/dist/src/room/data-track/packetizer.d.ts.map +1 -1
  45. package/dist/src/room/data-track/track-interfaces.d.ts +23 -0
  46. package/dist/src/room/data-track/track-interfaces.d.ts.map +1 -0
  47. package/dist/src/room/data-track/types.d.ts +10 -0
  48. package/dist/src/room/data-track/types.d.ts.map +1 -0
  49. package/dist/src/room/participant/RemoteParticipant.d.ts +1 -1
  50. package/dist/src/room/token-source/TokenSource.d.ts +1 -1
  51. package/dist/src/room/token-source/TokenSource.d.ts.map +1 -1
  52. package/dist/src/room/token-source/types.d.ts +1 -0
  53. package/dist/src/room/token-source/types.d.ts.map +1 -1
  54. package/dist/src/room/utils.d.ts +1 -1
  55. package/dist/src/room/utils.d.ts.map +1 -1
  56. package/dist/src/utils/abort-signal-polyfill.d.ts +13 -0
  57. package/dist/src/utils/abort-signal-polyfill.d.ts.map +1 -0
  58. package/dist/src/utils/subscribeToEvents.d.ts +3 -0
  59. package/dist/src/utils/subscribeToEvents.d.ts.map +1 -1
  60. package/dist/ts4.2/index.d.ts +1 -1
  61. package/dist/ts4.2/room/RTCEngine.d.ts +3 -1
  62. package/dist/ts4.2/room/data-track/{track.d.ts → LocalDataTrack.d.ts} +9 -14
  63. package/dist/ts4.2/room/data-track/RemoteDataTrack.d.ts +46 -0
  64. package/dist/ts4.2/room/data-track/depacketizer.d.ts +3 -3
  65. package/dist/ts4.2/room/data-track/e2ee.d.ts +1 -1
  66. package/dist/ts4.2/room/data-track/handle.d.ts +2 -2
  67. package/dist/ts4.2/room/data-track/incoming/IncomingDataTrackManager.d.ts +99 -0
  68. package/dist/ts4.2/room/data-track/incoming/errors.d.ts +24 -0
  69. package/dist/ts4.2/room/data-track/incoming/pipeline.d.ts +37 -0
  70. package/dist/ts4.2/room/data-track/incoming/types.d.ts +20 -0
  71. package/dist/ts4.2/room/data-track/outgoing/OutgoingDataTrackManager.d.ts +9 -9
  72. package/dist/ts4.2/room/data-track/outgoing/errors.d.ts +4 -4
  73. package/dist/ts4.2/room/data-track/outgoing/pipeline.d.ts +3 -3
  74. package/dist/ts4.2/room/data-track/outgoing/types.d.ts +4 -5
  75. package/dist/ts4.2/room/data-track/packet/errors.d.ts +2 -4
  76. package/dist/ts4.2/room/data-track/packet/extensions.d.ts +4 -4
  77. package/dist/ts4.2/room/data-track/packet/index.d.ts +5 -6
  78. package/dist/ts4.2/room/data-track/packet/serializable.d.ts +4 -4
  79. package/dist/ts4.2/room/data-track/packetizer.d.ts +3 -3
  80. package/dist/ts4.2/room/data-track/track-interfaces.d.ts +23 -0
  81. package/dist/ts4.2/room/data-track/types.d.ts +10 -0
  82. package/dist/ts4.2/room/participant/RemoteParticipant.d.ts +1 -1
  83. package/dist/ts4.2/room/token-source/TokenSource.d.ts +1 -1
  84. package/dist/ts4.2/room/token-source/types.d.ts +1 -0
  85. package/dist/ts4.2/room/utils.d.ts +1 -1
  86. package/dist/ts4.2/utils/abort-signal-polyfill.d.ts +13 -0
  87. package/dist/ts4.2/utils/subscribeToEvents.d.ts +3 -0
  88. package/package.json +4 -2
  89. package/src/index.ts +1 -1
  90. package/src/room/RTCEngine.ts +8 -1
  91. package/src/room/Room.ts +3 -3
  92. package/src/room/data-stream/outgoing/OutgoingDataStreamManager.ts +2 -2
  93. package/src/room/data-track/{track.ts → LocalDataTrack.ts} +13 -10
  94. package/src/room/data-track/RemoteDataTrack.ts +82 -0
  95. package/src/room/data-track/depacketizer.ts +4 -16
  96. package/src/room/data-track/e2ee.ts +2 -1
  97. package/src/room/data-track/handle.ts +2 -8
  98. package/src/room/data-track/incoming/IncomingDataTrackManager.test.ts +570 -0
  99. package/src/room/data-track/incoming/IncomingDataTrackManager.ts +537 -0
  100. package/src/room/data-track/incoming/errors.ts +57 -0
  101. package/src/room/data-track/incoming/pipeline.ts +116 -0
  102. package/src/room/data-track/incoming/types.ts +22 -0
  103. package/src/room/data-track/outgoing/OutgoingDataTrackManager.test.ts +20 -0
  104. package/src/room/data-track/outgoing/OutgoingDataTrackManager.ts +18 -12
  105. package/src/room/data-track/outgoing/errors.ts +4 -4
  106. package/src/room/data-track/outgoing/pipeline.ts +3 -7
  107. package/src/room/data-track/outgoing/types.ts +4 -5
  108. package/src/room/data-track/packet/errors.ts +2 -14
  109. package/src/room/data-track/packet/extensions.ts +4 -4
  110. package/src/room/data-track/packet/index.ts +4 -6
  111. package/src/room/data-track/packet/serializable.ts +4 -4
  112. package/src/room/data-track/packetizer.ts +3 -6
  113. package/src/room/data-track/track-interfaces.ts +53 -0
  114. package/src/room/data-track/types.ts +11 -0
  115. package/src/room/participant/RemoteParticipant.ts +1 -1
  116. package/src/room/token-source/TokenSource.ts +8 -2
  117. package/src/room/token-source/types.ts +4 -0
  118. package/src/room/utils.ts +1 -1
  119. package/src/utils/abort-signal-polyfill.ts +63 -0
  120. package/src/utils/subscribeToEvents.ts +18 -1
  121. package/dist/src/room/data-track/track.d.ts.map +0 -1
  122. package/dist/src/utils/throws.d.ts +0 -36
  123. package/dist/src/utils/throws.d.ts.map +0 -1
  124. package/dist/ts4.2/utils/throws.d.ts +0 -39
  125. package/src/utils/throws.ts +0 -42
@@ -0,0 +1,99 @@
1
+ import type { Throws } from '@livekit/throws-transformer/throws';
2
+ import type TypedEmitter from 'typed-emitter';
3
+ import type Participant from '../../participant/Participant';
4
+ import type RemoteParticipant from '../../participant/RemoteParticipant';
5
+ import { DataTrackDepacketizerDropError } from '../depacketizer';
6
+ import type { DecryptionProvider } from '../e2ee';
7
+ import type { DataTrackFrame } from '../frame';
8
+ import { DataTrackHandle } from '../handle';
9
+ import type { DataTrackInfo, DataTrackSid } from '../types';
10
+ import { DataTrackSubscribeError } from './errors';
11
+ import type { EventSfuUpdateSubscription, EventTrackAvailable, EventTrackUnavailable } from './types';
12
+ export type DataTrackIncomingManagerCallbacks = {
13
+ /** Request sent to the SFU to update the subscription for a data track. */
14
+ sfuUpdateSubscription: (event: EventSfuUpdateSubscription) => void;
15
+ /** A track has been published by a remote participant and is available to be
16
+ * subscribed to. */
17
+ trackAvailable: (event: EventTrackAvailable) => void;
18
+ /** A track has been unpublished by a remote participant and can no longer be subscribed to. */
19
+ trackUnavailable: (event: EventTrackUnavailable) => void;
20
+ };
21
+ type IncomingDataTrackManagerOptions = {
22
+ /** Provider to use for decrypting incoming frame payloads.
23
+ * If none, remote tracks using end-to-end encryption will not be available
24
+ * for subscription.
25
+ */
26
+ decryptionProvider: DecryptionProvider | null;
27
+ };
28
+ declare const IncomingDataTrackManager_base: new () => TypedEmitter<DataTrackIncomingManagerCallbacks>;
29
+ export default class IncomingDataTrackManager extends IncomingDataTrackManager_base {
30
+ private decryptionProvider;
31
+ /** Mapping between track SID and descriptor. */
32
+ private descriptors;
33
+ /** Mapping between subscriber handle and track SID.
34
+ *
35
+ * This is an index that allows track descriptors to be looked up
36
+ * by subscriber handle in O(1) time, to make routing incoming packets
37
+ * a (hot code path) faster.
38
+ */
39
+ private subscriptionHandles;
40
+ constructor(options?: IncomingDataTrackManagerOptions);
41
+ /** Client requested to subscribe to a data track.
42
+ *
43
+ * This is sent when the user calls {@link RemoteDataTrack.subscribe}.
44
+ *
45
+ * Only the first request to subscribe to a given track incurs meaningful overhead; subsequent
46
+ * requests simply attach an additional receiver to the broadcast channel, allowing them to consume
47
+ * frames from the existing subscription pipeline.
48
+ */
49
+ subscribeRequest(sid: DataTrackSid, signal?: AbortSignal, highWaterMark?: number): Promise<Throws<ReadableStream<DataTrackFrame>, DataTrackSubscribeError>>;
50
+ /** Allocates a ReadableStream which emits when a new {@link DataTrackFrame} is received from the
51
+ * SFU. */
52
+ private createReadableStream;
53
+ /**
54
+ * Get information about all currently subscribed tracks.
55
+ * @internal */
56
+ querySubscribed(): Promise<[
57
+ info: DataTrackInfo,
58
+ identity: string
59
+ ][]>;
60
+ /** Client requested to unsubscribe from a data track. */
61
+ unSubscribeRequest(sid: DataTrackSid): void;
62
+ /** SFU notification that track publications have changed.
63
+ *
64
+ * This event is produced from both {@link JoinResponse} and {@link ParticipantUpdate}
65
+ * to provide a complete view of remote participants' track publications:
66
+ *
67
+ * - From a `JoinResponse`, it captures the initial set of tracks published when a participant joins.
68
+ * - From a `ParticipantUpdate`, it captures subsequent changes (i.e., new tracks being
69
+ * published and existing tracks unpublished).
70
+ */
71
+ receiveSfuPublicationUpdates(updates: Map<Participant['identity'], Array<DataTrackInfo>>): Promise<void>;
72
+ /**
73
+ * Get information about all currently remotely published tracks which could be subscribed to.
74
+ * @internal */
75
+ queryPublications(): Promise<DataTrackInfo[]>;
76
+ handleTrackPublished(publisherIdentity: Participant['identity'], info: DataTrackInfo): Promise<void>;
77
+ handleTrackUnpublished(sid: DataTrackSid): void;
78
+ /** SFU notification that handles have been assigned for requested subscriptions. */
79
+ receivedSfuSubscriberHandles(
80
+ /** Mapping between track handles attached to incoming packets to the
81
+ * track SIDs they belong to. */
82
+ mapping: Map<DataTrackHandle, DataTrackSid>): void;
83
+ private registerSubscriberHandle;
84
+ /** Packet has been received over the transport. */
85
+ packetReceived(bytes: Uint8Array): Throws<void, DataTrackDepacketizerDropError>;
86
+ /** Resend all subscription updates.
87
+ *
88
+ * This must be sent after a full reconnect to ensure the SFU knows which
89
+ * tracks are subscribed to locally.
90
+ */
91
+ resendSubscriptionUpdates(): void;
92
+ /** Called when a remote participant is disconnected so that any pending data tracks can be
93
+ * cancelled. */
94
+ handleRemoteParticipantDisconnected(remoteParticipantIdentity: RemoteParticipant['identity']): void;
95
+ /** Shutdown the manager, ending any subscriptions. */
96
+ shutdown(): void;
97
+ }
98
+ export {};
99
+ //# sourceMappingURL=IncomingDataTrackManager.d.ts.map
@@ -0,0 +1,24 @@
1
+ import { LivekitReasonedError } from '../../errors';
2
+ export declare enum DataTrackSubscribeErrorReason {
3
+ /** The track has been unpublished and is no longer available */
4
+ Unpublished = 0,
5
+ /** Request to subscribe to data track timed-out */
6
+ Timeout = 1,
7
+ /** Cannot subscribe to data track when disconnected */
8
+ Disconnected = 2,
9
+ /** Subscription to data track cancelled by caller */
10
+ Cancelled = 4
11
+ }
12
+ export declare class DataTrackSubscribeError<Reason extends DataTrackSubscribeErrorReason = DataTrackSubscribeErrorReason> extends LivekitReasonedError<Reason> {
13
+ readonly name = "DataTrackSubscribeError";
14
+ reason: Reason;
15
+ reasonName: string;
16
+ constructor(message: string, reason: Reason, options?: {
17
+ cause?: unknown;
18
+ });
19
+ static unpublished(): DataTrackSubscribeError<DataTrackSubscribeErrorReason.Unpublished>;
20
+ static timeout(): DataTrackSubscribeError<DataTrackSubscribeErrorReason.Timeout>;
21
+ static disconnected(): DataTrackSubscribeError<DataTrackSubscribeErrorReason.Disconnected>;
22
+ static cancelled(): DataTrackSubscribeError<DataTrackSubscribeErrorReason.Cancelled>;
23
+ }
24
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1,37 @@
1
+ import type { Throws } from '@livekit/throws-transformer/throws';
2
+ import { DataTrackDepacketizerDropError } from '../depacketizer';
3
+ import type { DecryptionProvider } from '../e2ee';
4
+ import type { DataTrackFrame } from '../frame';
5
+ import { DataTrackPacket } from '../packet';
6
+ import type { DataTrackInfo } from '../types';
7
+ /**
8
+ * Options for creating a {@link IncomingDataTrackPipeline}.
9
+ */
10
+ type Options = {
11
+ info: DataTrackInfo;
12
+ publisherIdentity: string;
13
+ decryptionProvider: DecryptionProvider | null;
14
+ };
15
+ /**
16
+ * Pipeline for an individual data track subscription.
17
+ */
18
+ export default class IncomingDataTrackPipeline {
19
+ private publisherIdentity;
20
+ private e2eeProvider;
21
+ private depacketizer;
22
+ /**
23
+ * Creates a new pipeline with the given options.
24
+ */
25
+ constructor(options: Options);
26
+ processPacket(packet: DataTrackPacket): Throws<DataTrackFrame | null, DataTrackDepacketizerDropError>;
27
+ /**
28
+ * Depacketize the given frame, log if a drop occurs.
29
+ */
30
+ private depacketize;
31
+ /**
32
+ * Decrypt the frame's payload if E2EE is enabled for this track.
33
+ */
34
+ private decryptIfNeeded;
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1,20 @@
1
+ import type Participant from '../../participant/Participant';
2
+ import type RemoteDataTrack from '../RemoteDataTrack';
3
+ import type { DataTrackSid } from '../types';
4
+ /** Request sent to the SFU to update the subscription for a data track. */
5
+ export type EventSfuUpdateSubscription = {
6
+ /** Identifier of the affected track. */
7
+ sid: DataTrackSid;
8
+ /** Whether to subscribe or unsubscribe. */
9
+ subscribe: boolean;
10
+ };
11
+ /** A track has been published by a remote participant and is available to be subscribed to. */
12
+ export type EventTrackAvailable = {
13
+ track: RemoteDataTrack;
14
+ };
15
+ /** A track has been unpublished by a remote participant and can no longer be subscribed to. */
16
+ export type EventTrackUnavailable = {
17
+ sid: DataTrackSid;
18
+ publisherIdentity: Participant['identity'];
19
+ };
20
+ //# sourceMappingURL=types.d.ts.map
@@ -1,13 +1,13 @@
1
+ import type { Throws } from '@livekit/throws-transformer/throws';
1
2
  import type TypedEmitter from 'typed-emitter';
2
- import type { Throws } from '../../../utils/throws';
3
3
  import { Future } from '../../utils';
4
+ import LocalDataTrack from '../LocalDataTrack';
4
5
  import type { EncryptionProvider } from '../e2ee';
5
6
  import { DataTrackHandle } from '../handle';
6
- import type { DataTrackInfo } from '../track';
7
- import { LocalDataTrack } from '../track';
7
+ import type { DataTrackInfo } from '../types';
8
8
  import { DataTrackPublishError, DataTrackPublishErrorReason, DataTrackPushFrameError, DataTrackPushFrameErrorReason } from './errors';
9
9
  import DataTrackOutgoingPipeline from './pipeline';
10
- import type { DataTrackOptions, OutputEventPacketsAvailable, OutputEventSfuPublishRequest, OutputEventSfuUnpublishRequest, SfuPublishResponseResult } from './types';
10
+ import type { DataTrackOptions, EventPacketsAvailable, EventSfuPublishRequest, EventSfuUnpublishRequest, SfuPublishResponseResult } from './types';
11
11
  export type PendingDescriptor = {
12
12
  type: 'pending';
13
13
  completionFuture: Future<LocalDataTrack, DataTrackPublishError<DataTrackPublishErrorReason.NotAllowed> | DataTrackPublishError<DataTrackPublishErrorReason.DuplicateName> | DataTrackPublishError<DataTrackPublishErrorReason.Timeout> | DataTrackPublishError<DataTrackPublishErrorReason.LimitReached> | DataTrackPublishError<DataTrackPublishErrorReason.Disconnected> | DataTrackPublishError<DataTrackPublishErrorReason.Cancelled>>;
@@ -26,13 +26,13 @@ export declare const Descriptor: {
26
26
  };
27
27
  export type DataTrackOutgoingManagerCallbacks = {
28
28
  /** Request sent to the SFU to publish a track. */
29
- sfuPublishRequest: (event: OutputEventSfuPublishRequest) => void;
29
+ sfuPublishRequest: (event: EventSfuPublishRequest) => void;
30
30
  /** Request sent to the SFU to unpublish a track. */
31
- sfuUnpublishRequest: (event: OutputEventSfuUnpublishRequest) => void;
31
+ sfuUnpublishRequest: (event: EventSfuUnpublishRequest) => void;
32
32
  /** Serialized packets are ready to be sent over the transport. */
33
- packetsAvailable: (event: OutputEventPacketsAvailable) => void;
33
+ packetsAvailable: (event: EventPacketsAvailable) => void;
34
34
  };
35
- type DataTrackLocalManagerOptions = {
35
+ type OutgoingDataTrackManagerOptions = {
36
36
  /**
37
37
  * Provider to use for encrypting outgoing frame payloads.
38
38
  *
@@ -45,7 +45,7 @@ export default class OutgoingDataTrackManager extends OutgoingDataTrackManager_b
45
45
  private encryptionProvider;
46
46
  private handleAllocator;
47
47
  private descriptors;
48
- constructor(options?: DataTrackLocalManagerOptions);
48
+ constructor(options?: OutgoingDataTrackManagerOptions);
49
49
  static withDescriptors(descriptors: Map<DataTrackHandle, Descriptor>): OutgoingDataTrackManager;
50
50
  /**
51
51
  * Used by attached {@link LocalDataTrack} instances to query their associated descriptor info.
@@ -1,5 +1,5 @@
1
1
  import { LivekitReasonedError } from '../../errors';
2
- import { DataTrackPacketizerError, DataTrackPacketizerReason } from '../packetizer';
2
+ import { DataTrackPacketizerError } from '../packetizer';
3
3
  export declare enum DataTrackPublishErrorReason {
4
4
  /**
5
5
  * Local participant does not have permission to publish data tracks.
@@ -37,7 +37,7 @@ export declare enum DataTrackPushFrameErrorReason {
37
37
  /** Frame was dropped. */
38
38
  Dropped = 1
39
39
  }
40
- export declare class DataTrackPushFrameError<Reason extends DataTrackPushFrameErrorReason> extends LivekitReasonedError<Reason> {
40
+ export declare class DataTrackPushFrameError<Reason extends DataTrackPushFrameErrorReason = DataTrackPushFrameErrorReason> extends LivekitReasonedError<Reason> {
41
41
  readonly name = "DataTrackPushFrameError";
42
42
  reason: Reason;
43
43
  reasonName: string;
@@ -51,14 +51,14 @@ export declare enum DataTrackOutgoingPipelineErrorReason {
51
51
  Packetizer = 0,
52
52
  Encryption = 1
53
53
  }
54
- export declare class DataTrackOutgoingPipelineError<Reason extends DataTrackOutgoingPipelineErrorReason> extends LivekitReasonedError<Reason> {
54
+ export declare class DataTrackOutgoingPipelineError<Reason extends DataTrackOutgoingPipelineErrorReason = DataTrackOutgoingPipelineErrorReason> extends LivekitReasonedError<Reason> {
55
55
  readonly name = "DataTrackOutgoingPipelineError";
56
56
  reason: Reason;
57
57
  reasonName: string;
58
58
  constructor(message: string, reason: Reason, options?: {
59
59
  cause?: unknown;
60
60
  });
61
- static packetizer(cause: DataTrackPacketizerError<DataTrackPacketizerReason.MtuTooShort>): DataTrackOutgoingPipelineError<DataTrackOutgoingPipelineErrorReason.Packetizer>;
61
+ static packetizer(cause: DataTrackPacketizerError): DataTrackOutgoingPipelineError<DataTrackOutgoingPipelineErrorReason.Packetizer>;
62
62
  static encryption(cause: unknown): DataTrackOutgoingPipelineError<DataTrackOutgoingPipelineErrorReason.Encryption>;
63
63
  }
64
64
  //# sourceMappingURL=errors.d.ts.map
@@ -1,8 +1,8 @@
1
- import type { Throws } from '../../../utils/throws';
1
+ import type { Throws } from '@livekit/throws-transformer/throws';
2
2
  import type { EncryptionProvider } from '../e2ee';
3
3
  import type { DataTrackFrame } from '../frame';
4
4
  import { DataTrackPacket } from '../packet';
5
- import type { DataTrackInfo } from '../track';
5
+ import type { DataTrackInfo } from '../types';
6
6
  import { DataTrackOutgoingPipelineError, DataTrackOutgoingPipelineErrorReason } from './errors';
7
7
  type Options = {
8
8
  info: DataTrackInfo;
@@ -15,7 +15,7 @@ export default class DataTrackOutgoingPipeline {
15
15
  /** Maximum transmission unit (MTU) of the transport. */
16
16
  private static TRANSPORT_MTU_BYTES;
17
17
  constructor(options: Options);
18
- processFrame(frame: DataTrackFrame): Throws<Generator<DataTrackPacket>, DataTrackOutgoingPipelineError<DataTrackOutgoingPipelineErrorReason.Packetizer> | DataTrackOutgoingPipelineError<DataTrackOutgoingPipelineErrorReason.Encryption>>;
18
+ processFrame(frame: DataTrackFrame): Throws<Generator<DataTrackPacket>, DataTrackOutgoingPipelineError>;
19
19
  encryptIfNeeded(frame: DataTrackFrame): Throws<DataTrackFrame, DataTrackOutgoingPipelineError<DataTrackOutgoingPipelineErrorReason.Encryption>>;
20
20
  }
21
21
  export {};
@@ -1,5 +1,5 @@
1
1
  import type { DataTrackHandle } from '../handle';
2
- import type { DataTrackInfo } from '../track';
2
+ import type { DataTrackInfo } from '../types';
3
3
  import type { DataTrackPublishError, DataTrackPublishErrorReason } from './errors';
4
4
  /** Options for publishing a data track. */
5
5
  export type DataTrackOptions = {
@@ -14,18 +14,17 @@ export type SfuPublishResponseResult = {
14
14
  error: DataTrackPublishError<DataTrackPublishErrorReason.NotAllowed> | DataTrackPublishError<DataTrackPublishErrorReason.DuplicateName> | DataTrackPublishError<DataTrackPublishErrorReason.LimitReached>;
15
15
  };
16
16
  /** Request sent to the SFU to publish a track. */
17
- export type OutputEventSfuPublishRequest = {
17
+ export type EventSfuPublishRequest = {
18
18
  handle: DataTrackHandle;
19
19
  name: string;
20
20
  usesE2ee: boolean;
21
21
  };
22
22
  /** Request sent to the SFU to unpublish a track. */
23
- export type OutputEventSfuUnpublishRequest = {
23
+ export type EventSfuUnpublishRequest = {
24
24
  handle: DataTrackHandle;
25
25
  };
26
26
  /** Serialized packets are ready to be sent over the transport. */
27
- export type OutputEventPacketsAvailable = {
27
+ export type EventPacketsAvailable = {
28
28
  bytes: Uint8Array;
29
- signal?: AbortSignal;
30
29
  };
31
30
  //# sourceMappingURL=types.d.ts.map
@@ -8,7 +8,7 @@ export declare enum DataTrackDeserializeErrorReason {
8
8
  InvalidHandle = 4,
9
9
  MalformedExt = 5
10
10
  }
11
- export declare class DataTrackDeserializeError<Reason extends DataTrackDeserializeErrorReason> extends LivekitReasonedError<DataTrackDeserializeErrorReason> {
11
+ export declare class DataTrackDeserializeError<Reason extends DataTrackDeserializeErrorReason = DataTrackDeserializeErrorReason> extends LivekitReasonedError<DataTrackDeserializeErrorReason> {
12
12
  readonly name = "DataTrackDeserializeError";
13
13
  reason: Reason;
14
14
  reasonName: string;
@@ -23,12 +23,11 @@ export declare class DataTrackDeserializeError<Reason extends DataTrackDeseriali
23
23
  static invalidHandle(cause: DataTrackHandleError): DataTrackDeserializeError<DataTrackDeserializeErrorReason.InvalidHandle>;
24
24
  static malformedExt(tag: number): DataTrackDeserializeError<DataTrackDeserializeErrorReason.MalformedExt>;
25
25
  }
26
- export type DataTrackDeserializeErrorAll = DataTrackDeserializeError<DataTrackDeserializeErrorReason.TooShort> | DataTrackDeserializeError<DataTrackDeserializeErrorReason.HeaderOverrun> | DataTrackDeserializeError<DataTrackDeserializeErrorReason.MissingExtWords> | DataTrackDeserializeError<DataTrackDeserializeErrorReason.UnsupportedVersion> | DataTrackDeserializeError<DataTrackDeserializeErrorReason.InvalidHandle> | DataTrackDeserializeError<DataTrackDeserializeErrorReason.MalformedExt>;
27
26
  export declare enum DataTrackSerializeErrorReason {
28
27
  TooSmallForHeader = 0,
29
28
  TooSmallForPayload = 1
30
29
  }
31
- export declare class DataTrackSerializeError<Reason extends DataTrackSerializeErrorReason> extends LivekitReasonedError<DataTrackSerializeErrorReason> {
30
+ export declare class DataTrackSerializeError<Reason extends DataTrackSerializeErrorReason = DataTrackSerializeErrorReason> extends LivekitReasonedError<DataTrackSerializeErrorReason> {
32
31
  readonly name = "DataTrackSerializeError";
33
32
  reason: Reason;
34
33
  reasonName: string;
@@ -38,5 +37,4 @@ export declare class DataTrackSerializeError<Reason extends DataTrackSerializeEr
38
37
  static tooSmallForHeader(): DataTrackSerializeError<DataTrackSerializeErrorReason.TooSmallForHeader>;
39
38
  static tooSmallForPayload(): DataTrackSerializeError<DataTrackSerializeErrorReason.TooSmallForPayload>;
40
39
  }
41
- export type DataTrackSerializeErrorAll = DataTrackSerializeError<DataTrackSerializeErrorReason.TooSmallForHeader> | DataTrackSerializeError<DataTrackSerializeErrorReason.TooSmallForPayload>;
42
40
  //# sourceMappingURL=errors.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { Throws } from '../../../utils/throws';
1
+ import type { Throws } from '@livekit/throws-transformer/throws';
2
2
  import { DataTrackDeserializeError, DataTrackDeserializeErrorReason } from './errors';
3
3
  import Serializable from './serializable';
4
4
  export declare enum DataTrackExtensionTag {
@@ -12,7 +12,7 @@ declare abstract class DataTrackExtension extends Serializable {
12
12
  export declare class DataTrackUserTimestampExtension extends DataTrackExtension {
13
13
  static tag: DataTrackExtensionTag;
14
14
  static lengthBytes: number;
15
- private timestamp;
15
+ timestamp: bigint;
16
16
  constructor(timestamp: bigint);
17
17
  toBinaryLengthBytes(): number;
18
18
  toBinaryInto(dataView: DataView): Throws<number, never>;
@@ -25,8 +25,8 @@ export declare class DataTrackUserTimestampExtension extends DataTrackExtension
25
25
  export declare class DataTrackE2eeExtension extends DataTrackExtension {
26
26
  static tag: DataTrackExtensionTag;
27
27
  static lengthBytes: number;
28
- private keyIndex;
29
- private iv;
28
+ keyIndex: number;
29
+ iv: Uint8Array;
30
30
  constructor(keyIndex: number, iv: Uint8Array);
31
31
  toBinaryLengthBytes(): number;
32
32
  toBinaryInto(dataView: DataView): Throws<number, never>;
@@ -1,8 +1,7 @@
1
- import type { Throws } from '../../../utils/throws';
1
+ import type { Throws } from '@livekit/throws-transformer/throws';
2
2
  import { DataTrackHandle } from '../handle';
3
3
  import { DataTrackTimestamp, U16_MAX_SIZE, WrapAroundUnsignedInt } from '../utils';
4
- import type { DataTrackDeserializeErrorAll, DataTrackSerializeErrorAll } from './errors';
5
- import { DataTrackSerializeError, DataTrackSerializeErrorReason } from './errors';
4
+ import { DataTrackDeserializeError, DataTrackSerializeError, DataTrackSerializeErrorReason } from './errors';
6
5
  import { DataTrackExtensions } from './extensions';
7
6
  import Serializable from './serializable';
8
7
  /** A class for serializing / deserializing data track packet header sections. */
@@ -27,7 +26,7 @@ export declare class DataTrackPacketHeader extends Serializable {
27
26
  static fromBinary<Input extends DataView | ArrayBuffer | Uint8Array>(input: Input): Throws<[
28
27
  header: DataTrackPacketHeader,
29
28
  byteLength: number
30
- ], DataTrackDeserializeErrorAll>;
29
+ ], DataTrackDeserializeError>;
31
30
  toJSON(): {
32
31
  marker: FrameMarker;
33
32
  trackHandle: number;
@@ -66,11 +65,11 @@ export declare class DataTrackPacket extends Serializable {
66
65
  payload: Uint8Array;
67
66
  constructor(header: DataTrackPacketHeader, payload: Uint8Array);
68
67
  toBinaryLengthBytes(): number;
69
- toBinaryInto(dataView: DataView): Throws<number, DataTrackSerializeErrorAll>;
68
+ toBinaryInto(dataView: DataView): Throws<number, DataTrackSerializeError>;
70
69
  static fromBinary<Input extends DataView | ArrayBuffer | Uint8Array>(input: Input): Throws<[
71
70
  packet: DataTrackPacket,
72
71
  byteLength: number
73
- ], DataTrackDeserializeErrorAll>;
72
+ ], DataTrackDeserializeError>;
74
73
  toJSON(): {
75
74
  header: {
76
75
  marker: FrameMarker;
@@ -1,12 +1,12 @@
1
- import type { Throws } from '../../../utils/throws';
2
- import type { DataTrackSerializeErrorAll } from './errors';
1
+ import type { Throws } from '@livekit/throws-transformer/throws';
2
+ import { DataTrackSerializeError } from './errors';
3
3
  /** An abstract class implementing common behavior related to data track binary serialization. */
4
4
  export default abstract class Serializable {
5
5
  /** Returns the expected length of the serialized output in bytes */
6
6
  abstract toBinaryLengthBytes(): number;
7
7
  /** Given a DataView, serialize the instance inside and return the number of bytes written. */
8
- abstract toBinaryInto(dataView: DataView): Throws<number, DataTrackSerializeErrorAll>;
8
+ abstract toBinaryInto(dataView: DataView): Throws<number, DataTrackSerializeError>;
9
9
  /** Encodes the instance as binary and returns the data as a Uint8Array. */
10
- toBinary(): Throws<Uint8Array, DataTrackSerializeErrorAll>;
10
+ toBinary(): Throws<Uint8Array, DataTrackSerializeError>;
11
11
  }
12
12
  //# sourceMappingURL=serializable.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { Throws } from '../../utils/throws';
1
+ import type { Throws } from '@livekit/throws-transformer/throws';
2
2
  import { LivekitReasonedError } from '../errors';
3
3
  import type { DataTrackFrame } from './frame';
4
4
  import { DataTrackHandle } from './handle';
@@ -9,7 +9,7 @@ type PacketizeOptions = {
9
9
  * defaults to the return value of {@link DataTrackClock#now}. */
10
10
  now?: DataTrackTimestamp<90000>;
11
11
  };
12
- export declare class DataTrackPacketizerError<Reason extends DataTrackPacketizerReason> extends LivekitReasonedError<Reason> {
12
+ export declare class DataTrackPacketizerError<Reason extends DataTrackPacketizerReason = DataTrackPacketizerReason> extends LivekitReasonedError<Reason> {
13
13
  readonly name = "DataTrackPacketizerError";
14
14
  reason: Reason;
15
15
  reasonName: string;
@@ -37,7 +37,7 @@ export default class DataTrackPacketizer {
37
37
  * NOTE: The return value of this function is a generator, so it can be lazily ran if desired,
38
38
  * or converted to an array with {@link Array.from}.
39
39
  */
40
- packetize(frame: DataTrackFrame, options?: PacketizeOptions): Throws<Generator<DataTrackPacket>, DataTrackPacketizerError<DataTrackPacketizerReason.MtuTooShort>>;
40
+ packetize(frame: DataTrackFrame, options?: PacketizeOptions): Throws<Generator<DataTrackPacket>, DataTrackPacketizerError>;
41
41
  }
42
42
  export {};
43
43
  //# sourceMappingURL=packetizer.d.ts.map
@@ -0,0 +1,23 @@
1
+ import type { DataTrackInfo } from './types';
2
+ export declare const TrackSymbol: symbol;
3
+ export interface ITrack {
4
+ readonly trackSymbol: typeof TrackSymbol;
5
+ }
6
+ /** An interface representing a track (of any type) which is local and sending data to the SFU. */
7
+ export interface ILocalTrack extends ITrack {
8
+ readonly isLocal: true;
9
+ isPublished(): boolean;
10
+ }
11
+ export declare const RemoteTrackSymbol: symbol;
12
+ /** An interface representing a track (of any type) which is remote and receiving data from the SFU. */
13
+ export interface IRemoteTrack extends ITrack {
14
+ readonly isLocal: false;
15
+ }
16
+ export declare const DataTrackSymbol: symbol;
17
+ /** An interface representing a data track, either local or remote. */
18
+ export interface IDataTrack extends ITrack {
19
+ readonly typeSymbol: typeof DataTrackSymbol;
20
+ readonly info: DataTrackInfo;
21
+ }
22
+ export declare function isDataTrack(subject: unknown): subject is IDataTrack;
23
+ //# sourceMappingURL=track-interfaces.d.ts.map
@@ -0,0 +1,10 @@
1
+ import type { DataTrackHandle } from './handle';
2
+ export type DataTrackSid = string;
3
+ /** Information about a published data track. */
4
+ export type DataTrackInfo = {
5
+ sid: DataTrackSid;
6
+ pubHandle: DataTrackHandle;
7
+ name: String;
8
+ usesE2ee: boolean;
9
+ };
10
+ //# sourceMappingURL=types.d.ts.map
@@ -17,7 +17,7 @@ export default class RemoteParticipant extends Participant {
17
17
  /** @internal */
18
18
  static fromParticipantInfo(signalClient: SignalClient, pi: ParticipantInfo, loggerOptions: LoggerOptions): RemoteParticipant;
19
19
  protected get logContext(): {
20
- rpID: string;
20
+ remoteParticipantID: string;
21
21
  remoteParticipant: string;
22
22
  };
23
23
  /** @internal */
@@ -11,7 +11,7 @@ declare abstract class TokenSourceCached extends TokenSourceConfigurable {
11
11
  private isSameAsCachedFetchOptions;
12
12
  private shouldReturnCachedValueFromFetch;
13
13
  getCachedResponseJwtPayload(): import("./types").TokenPayload | null;
14
- fetch(options: TokenSourceFetchOptions): Promise<TokenSourceResponseObject>;
14
+ fetch(options: TokenSourceFetchOptions, force?: boolean): Promise<TokenSourceResponseObject>;
15
15
  protected abstract update(options: TokenSourceFetchOptions): Promise<TokenSourceResponse>;
16
16
  }
17
17
  type LiteralOrFn = TokenSourceResponseObject | (() => TokenSourceResponseObject | Promise<TokenSourceResponseObject>);
@@ -62,6 +62,7 @@ export type TokenSourceFetchOptions = {
62
62
  */
63
63
  export declare abstract class TokenSourceConfigurable {
64
64
  abstract fetch(options: TokenSourceFetchOptions): Promise<TokenSourceResponseObject>;
65
+ abstract fetch(options: TokenSourceFetchOptions, force?: boolean): Promise<TokenSourceResponseObject>;
65
66
  }
66
67
  /** A TokenSource is a mechanism for fetching credentials required to connect to a LiveKit Room. */
67
68
  export type TokenSourceBase = TokenSourceFixed | TokenSourceConfigurable;
@@ -1,7 +1,7 @@
1
1
  import { ChatMessage as ChatMessageModel, ClientInfo, DisconnectReason, Transcription as TranscriptionModel } from '@livekit/protocol';
2
+ import type { Throws } from '@livekit/throws-transformer/throws';
2
3
  import TypedPromise from '../utils/TypedPromise';
3
4
  import type { BrowserDetails } from '../utils/browserParser';
4
- import type { Throws } from '../utils/throws';
5
5
  import type { ConnectionError } from './errors';
6
6
  import type LocalParticipant from './participant/LocalParticipant';
7
7
  import type Participant from './participant/Participant';
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Implementation of AbortSignal.any
3
+ * Creates a signal that will be aborted when any of the given signals is aborted.
4
+ * @link https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/any
5
+ */
6
+ export declare function abortSignalAny(signals: Array<AbortSignal>): AbortSignal;
7
+ /**
8
+ * Implementation of AbortSignal.timeout
9
+ * Creates a signal that will be aborted after the specified timeout.
10
+ * @link https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/timeout
11
+ */
12
+ export declare function abortSignalTimeout(ms: number): AbortSignal;
13
+ //# sourceMappingURL=abort-signal-polyfill.d.ts.map
@@ -6,6 +6,9 @@ export declare function subscribeToEvents<Callbacks extends EventMap, EventNames
6
6
  /** Listen for the next occurrance of an event to be emitted, or return the last event that was
7
7
  * buffered (but hasn't been processed yet). */
8
8
  waitFor<EventPayload extends Parameters<Callbacks[EventName]>[0], EventName extends EventNames = EventNames>(eventName: EventName): Promise<EventPayload>;
9
+ /** Are there events of the given name which are waiting to be processed? Use this to assert
10
+ * that no unexpected events have been emitted. */
11
+ areThereBufferedEvents<EventPayload extends Parameters<Callbacks[EventName]>[0], EventName extends EventNames = EventNames>(eventName: EventName): boolean;
9
12
  /** Cleanup any lingering subscriptions. */
10
13
  unsubscribe: () => void;
11
14
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "livekit-client",
3
- "version": "2.17.3",
3
+ "version": "2.18.0",
4
4
  "description": "JavaScript/TypeScript client SDK for LiveKit",
5
5
  "main": "./dist/livekit-client.umd.js",
6
6
  "unpkg": "./dist/livekit-client.umd.js",
@@ -56,6 +56,7 @@
56
56
  "@changesets/cli": "2.29.8",
57
57
  "@eslint/js": "9.39.2",
58
58
  "@livekit/changesets-changelog-github": "^0.0.4",
59
+ "@livekit/throws-transformer": "^0.1.3",
59
60
  "@rollup/plugin-babel": "6.1.0",
60
61
  "@rollup/plugin-commonjs": "28.0.9",
61
62
  "@rollup/plugin-json": "6.1.0",
@@ -86,6 +87,7 @@
86
87
  "rollup-plugin-delete": "^2.1.0",
87
88
  "rollup-plugin-typescript2": "0.36.0",
88
89
  "size-limit": "^11.2.0",
90
+ "tsx": "^4.21.0",
89
91
  "typedoc": "0.28.16",
90
92
  "typedoc-plugin-no-inherit": "1.6.1",
91
93
  "typescript": "5.8.3",
@@ -107,7 +109,7 @@
107
109
  "deploy": "gh-pages -d examples/demo/dist",
108
110
  "format": "prettier --write src examples/**/*.ts",
109
111
  "format:check": "prettier --check src examples/**/*.ts",
110
- "throws:check": "pnpm dlx tsx ./throws-transformer/cli.ts 'src/!(*.test).ts' 'src/**/!(*.test).ts'",
112
+ "throws:check": "pnpm --package=@livekit/throws-transformer dlx throws-check 'src/!(*.test).ts' 'src/**/!(*.test).ts'",
111
113
  "ci:publish": "pnpm build:clean && pnpm compat && changeset publish",
112
114
  "downlevel-dts": "downlevel-dts ./dist/src ./dist/ts4.2 --to=4.2",
113
115
  "compat": "eslint --config ./eslint.config.dist.mjs --no-inline-config ./dist/livekit-client.esm.mjs",
package/src/index.ts CHANGED
@@ -12,7 +12,7 @@ import type { ReconnectContext, ReconnectPolicy } from './room/ReconnectPolicy';
12
12
  import Room, { ConnectionState, type RoomEventCallbacks } from './room/Room';
13
13
  import * as attributes from './room/attribute-typings';
14
14
  // FIXME: remove this import in a follow up data track pull request.
15
- import './room/data-track/depacketizer';
15
+ import './room/data-track/incoming/IncomingDataTrackManager';
16
16
  // FIXME: remove this import in a follow up data track pull request.
17
17
  import './room/data-track/outgoing/OutgoingDataTrackManager';
18
18
  import LocalParticipant from './room/participant/LocalParticipant';
@@ -134,6 +134,10 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
134
134
  return this._isClosed;
135
135
  }
136
136
 
137
+ get isNewlyCreated() {
138
+ return this._isNewlyCreated;
139
+ }
140
+
137
141
  get pendingReconnect() {
138
142
  return !!this.reconnectTimeout;
139
143
  }
@@ -156,6 +160,8 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
156
160
 
157
161
  private _isClosed: boolean = true;
158
162
 
163
+ private _isNewlyCreated: boolean = true;
164
+
159
165
  private pendingTrackResolvers: {
160
166
  [key: string]: { resolve: (info: TrackInfo) => void; reject: () => void };
161
167
  } = {};
@@ -257,7 +263,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
257
263
  room: this.latestJoinResponse?.room?.name,
258
264
  roomID: this.latestJoinResponse?.room?.sid,
259
265
  participant: this.latestJoinResponse?.participant?.identity,
260
- pID: this.participantSid,
266
+ participantID: this.participantSid,
261
267
  };
262
268
  }
263
269
 
@@ -269,6 +275,7 @@ export default class RTCEngine extends (EventEmitter as new () => TypedEventEmit
269
275
  /** setting this to true results in dual peer connection mode being used */
270
276
  useV0Path: boolean = false,
271
277
  ): Promise<JoinResponse> {
278
+ this._isNewlyCreated = false;
272
279
  this.url = url;
273
280
  this.token = token;
274
281
  this.signalOpts = opts;