livekit-client 2.5.10 → 2.6.1
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +54 -0
- package/dist/livekit-client.e2ee.worker.js.map +1 -1
- package/dist/livekit-client.e2ee.worker.mjs.map +1 -1
- package/dist/livekit-client.esm.mjs +431 -45
- package/dist/livekit-client.esm.mjs.map +1 -1
- package/dist/livekit-client.umd.js +1 -1
- package/dist/livekit-client.umd.js.map +1 -1
- package/dist/src/api/SignalClient.d.ts.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/room/PCTransport.d.ts +2 -0
- package/dist/src/room/PCTransport.d.ts.map +1 -1
- package/dist/src/room/PCTransportManager.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/RegionUrlProvider.d.ts.map +1 -1
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/errors.d.ts +2 -2
- package/dist/src/room/errors.d.ts.map +1 -1
- package/dist/src/room/participant/LocalParticipant.d.ts +56 -0
- package/dist/src/room/participant/LocalParticipant.d.ts.map +1 -1
- package/dist/src/room/rpc.d.ts +96 -0
- package/dist/src/room/rpc.d.ts.map +1 -0
- package/dist/src/room/track/RemoteAudioTrack.d.ts +1 -1
- package/dist/src/room/track/RemoteAudioTrack.d.ts.map +1 -1
- package/dist/src/room/track/RemoteVideoTrack.d.ts +2 -1
- package/dist/src/room/track/RemoteVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/utils.d.ts +2 -2
- package/dist/src/room/track/utils.d.ts.map +1 -1
- package/dist/ts4.2/src/index.d.ts +2 -0
- package/dist/ts4.2/src/room/PCTransport.d.ts +2 -0
- package/dist/ts4.2/src/room/errors.d.ts +2 -2
- package/dist/ts4.2/src/room/participant/LocalParticipant.d.ts +56 -0
- package/dist/ts4.2/src/room/rpc.d.ts +96 -0
- package/dist/ts4.2/src/room/track/RemoteAudioTrack.d.ts +1 -1
- package/dist/ts4.2/src/room/track/RemoteVideoTrack.d.ts +2 -1
- package/dist/ts4.2/src/room/track/utils.d.ts +2 -2
- package/package.json +2 -2
- package/src/api/SignalClient.ts +19 -3
- package/src/index.ts +2 -0
- package/src/room/PCTransport.ts +42 -29
- package/src/room/PCTransportManager.ts +6 -1
- package/src/room/RTCEngine.ts +13 -3
- package/src/room/RegionUrlProvider.ts +3 -1
- package/src/room/Room.ts +9 -3
- package/src/room/errors.ts +2 -2
- package/src/room/participant/LocalParticipant.test.ts +304 -0
- package/src/room/participant/LocalParticipant.ts +340 -1
- package/src/room/rpc.ts +172 -0
- package/src/room/track/RemoteAudioTrack.ts +1 -1
- package/src/room/track/RemoteVideoTrack.ts +1 -1
- package/src/room/track/utils.ts +1 -6
package/src/room/rpc.ts
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
// SPDX-FileCopyrightText: 2024 LiveKit, Inc.
|
2
|
+
//
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
4
|
+
import { RpcError as RpcError_Proto } from '@livekit/protocol';
|
5
|
+
|
6
|
+
/** Parameters for initiating an RPC call */
|
7
|
+
export interface PerformRpcParams {
|
8
|
+
/** The `identity` of the destination participant */
|
9
|
+
destinationIdentity: string;
|
10
|
+
/** The method name to call */
|
11
|
+
method: string;
|
12
|
+
/** The method payload */
|
13
|
+
payload: string;
|
14
|
+
/** Timeout for receiving a response after initial connection (milliseconds). Default: 10000 */
|
15
|
+
responseTimeout?: number;
|
16
|
+
}
|
17
|
+
|
18
|
+
/**
|
19
|
+
* Data passed to method handler for incoming RPC invocations
|
20
|
+
*/
|
21
|
+
export interface RpcInvocationData {
|
22
|
+
/**
|
23
|
+
* The unique request ID. Will match at both sides of the call, useful for debugging or logging.
|
24
|
+
*/
|
25
|
+
requestId: string;
|
26
|
+
|
27
|
+
/**
|
28
|
+
* The unique participant identity of the caller.
|
29
|
+
*/
|
30
|
+
callerIdentity: string;
|
31
|
+
|
32
|
+
/**
|
33
|
+
* The payload of the request. User-definable format, typically JSON.
|
34
|
+
*/
|
35
|
+
payload: string;
|
36
|
+
|
37
|
+
/**
|
38
|
+
* The maximum time the caller will wait for a response.
|
39
|
+
*/
|
40
|
+
responseTimeout: number;
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Specialized error handling for RPC methods.
|
45
|
+
*
|
46
|
+
* Instances of this type, when thrown in a method handler, will have their `message`
|
47
|
+
* serialized and sent across the wire. The sender will receive an equivalent error on the other side.
|
48
|
+
*
|
49
|
+
* Built-in types are included but developers may use any string, with a max length of 256 bytes.
|
50
|
+
*/
|
51
|
+
|
52
|
+
export class RpcError extends Error {
|
53
|
+
static MAX_MESSAGE_BYTES = 256;
|
54
|
+
|
55
|
+
static MAX_DATA_BYTES = 15360; // 15 KB
|
56
|
+
|
57
|
+
code: number;
|
58
|
+
|
59
|
+
data?: string;
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Creates an error object with the given code and message, plus an optional data payload.
|
63
|
+
*
|
64
|
+
* If thrown in an RPC method handler, the error will be sent back to the caller.
|
65
|
+
*
|
66
|
+
* Error codes 1001-1999 are reserved for built-in errors (see RpcError.ErrorCode for their meanings).
|
67
|
+
*/
|
68
|
+
constructor(code: number, message: string, data?: string) {
|
69
|
+
super(message);
|
70
|
+
this.code = code;
|
71
|
+
this.message = truncateBytes(message, RpcError.MAX_MESSAGE_BYTES);
|
72
|
+
this.data = data ? truncateBytes(data, RpcError.MAX_DATA_BYTES) : undefined;
|
73
|
+
}
|
74
|
+
|
75
|
+
/**
|
76
|
+
* @internal
|
77
|
+
*/
|
78
|
+
static fromProto(proto: RpcError_Proto) {
|
79
|
+
return new RpcError(proto.code, proto.message, proto.data);
|
80
|
+
}
|
81
|
+
|
82
|
+
/**
|
83
|
+
* @internal
|
84
|
+
*/
|
85
|
+
toProto() {
|
86
|
+
return new RpcError_Proto({
|
87
|
+
code: this.code as number,
|
88
|
+
message: this.message,
|
89
|
+
data: this.data,
|
90
|
+
});
|
91
|
+
}
|
92
|
+
|
93
|
+
static ErrorCode = {
|
94
|
+
APPLICATION_ERROR: 1500,
|
95
|
+
CONNECTION_TIMEOUT: 1501,
|
96
|
+
RESPONSE_TIMEOUT: 1502,
|
97
|
+
RECIPIENT_DISCONNECTED: 1503,
|
98
|
+
RESPONSE_PAYLOAD_TOO_LARGE: 1504,
|
99
|
+
SEND_FAILED: 1505,
|
100
|
+
|
101
|
+
UNSUPPORTED_METHOD: 1400,
|
102
|
+
RECIPIENT_NOT_FOUND: 1401,
|
103
|
+
REQUEST_PAYLOAD_TOO_LARGE: 1402,
|
104
|
+
UNSUPPORTED_SERVER: 1403,
|
105
|
+
UNSUPPORTED_VERSION: 1404,
|
106
|
+
} as const;
|
107
|
+
|
108
|
+
/**
|
109
|
+
* @internal
|
110
|
+
*/
|
111
|
+
static ErrorMessage: Record<keyof typeof RpcError.ErrorCode, string> = {
|
112
|
+
APPLICATION_ERROR: 'Application error in method handler',
|
113
|
+
CONNECTION_TIMEOUT: 'Connection timeout',
|
114
|
+
RESPONSE_TIMEOUT: 'Response timeout',
|
115
|
+
RECIPIENT_DISCONNECTED: 'Recipient disconnected',
|
116
|
+
RESPONSE_PAYLOAD_TOO_LARGE: 'Response payload too large',
|
117
|
+
SEND_FAILED: 'Failed to send',
|
118
|
+
|
119
|
+
UNSUPPORTED_METHOD: 'Method not supported at destination',
|
120
|
+
RECIPIENT_NOT_FOUND: 'Recipient not found',
|
121
|
+
REQUEST_PAYLOAD_TOO_LARGE: 'Request payload too large',
|
122
|
+
UNSUPPORTED_SERVER: 'RPC not supported by server',
|
123
|
+
UNSUPPORTED_VERSION: 'Unsupported RPC version',
|
124
|
+
} as const;
|
125
|
+
|
126
|
+
/**
|
127
|
+
* Creates an error object from the code, with an auto-populated message.
|
128
|
+
*
|
129
|
+
* @internal
|
130
|
+
*/
|
131
|
+
static builtIn(key: keyof typeof RpcError.ErrorCode, data?: string): RpcError {
|
132
|
+
return new RpcError(RpcError.ErrorCode[key], RpcError.ErrorMessage[key], data);
|
133
|
+
}
|
134
|
+
}
|
135
|
+
|
136
|
+
/*
|
137
|
+
* Maximum payload size for RPC requests and responses. If a payload exceeds this size,
|
138
|
+
* the RPC call will fail with a REQUEST_PAYLOAD_TOO_LARGE(1402) or RESPONSE_PAYLOAD_TOO_LARGE(1504) error.
|
139
|
+
*/
|
140
|
+
export const MAX_PAYLOAD_BYTES = 15360; // 15 KB
|
141
|
+
|
142
|
+
/**
|
143
|
+
* @internal
|
144
|
+
*/
|
145
|
+
export function byteLength(str: string): number {
|
146
|
+
const encoder = new TextEncoder();
|
147
|
+
return encoder.encode(str).length;
|
148
|
+
}
|
149
|
+
|
150
|
+
/**
|
151
|
+
* @internal
|
152
|
+
*/
|
153
|
+
export function truncateBytes(str: string, maxBytes: number): string {
|
154
|
+
if (byteLength(str) <= maxBytes) {
|
155
|
+
return str;
|
156
|
+
}
|
157
|
+
|
158
|
+
let low = 0;
|
159
|
+
let high = str.length;
|
160
|
+
const encoder = new TextEncoder();
|
161
|
+
|
162
|
+
while (low < high) {
|
163
|
+
const mid = Math.floor((low + high + 1) / 2);
|
164
|
+
if (encoder.encode(str.slice(0, mid)).length <= maxBytes) {
|
165
|
+
low = mid;
|
166
|
+
} else {
|
167
|
+
high = mid - 1;
|
168
|
+
}
|
169
|
+
}
|
170
|
+
|
171
|
+
return str.slice(0, low);
|
172
|
+
}
|
@@ -233,7 +233,7 @@ export default class RemoteAudioTrack extends RemoteTrack<Track.Kind.Audio> {
|
|
233
233
|
this.prevStats = stats;
|
234
234
|
};
|
235
235
|
|
236
|
-
|
236
|
+
async getReceiverStats(): Promise<AudioReceiverStats | undefined> {
|
237
237
|
if (!this.receiver || !this.receiver.getStats) {
|
238
238
|
return;
|
239
239
|
}
|
@@ -163,7 +163,7 @@ export default class RemoteVideoTrack extends RemoteTrack<Track.Kind.Video> {
|
|
163
163
|
this.prevStats = stats;
|
164
164
|
};
|
165
165
|
|
166
|
-
|
166
|
+
async getReceiverStats(): Promise<VideoReceiverStats | undefined> {
|
167
167
|
if (!this.receiver || !this.receiver.getStats) {
|
168
168
|
return;
|
169
169
|
}
|
package/src/room/track/utils.ts
CHANGED
@@ -9,7 +9,6 @@ import {
|
|
9
9
|
type ScreenShareCaptureOptions,
|
10
10
|
type VideoCaptureOptions,
|
11
11
|
type VideoCodec,
|
12
|
-
videoCodecs,
|
13
12
|
} from './options';
|
14
13
|
import type { AudioTrack } from './types';
|
15
14
|
|
@@ -188,11 +187,7 @@ export function screenCaptureToDisplayMediaStreamOptions(
|
|
188
187
|
}
|
189
188
|
|
190
189
|
export function mimeTypeToVideoCodecString(mimeType: string) {
|
191
|
-
|
192
|
-
if (!videoCodecs.includes(codec)) {
|
193
|
-
throw Error(`Video codec not supported: ${codec}`);
|
194
|
-
}
|
195
|
-
return codec;
|
190
|
+
return mimeType.split('/')[1].toLowerCase() as VideoCodec;
|
196
191
|
}
|
197
192
|
|
198
193
|
export function getTrackPublicationInfo<T extends TrackPublication>(
|