@livekit/rtc-node 0.11.1 → 0.12.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.
- package/dist/audio_frame.cjs +94 -0
- package/dist/audio_frame.cjs.map +1 -0
- package/dist/audio_frame.js +64 -67
- package/dist/audio_frame.js.map +1 -1
- package/dist/audio_resampler.cjs +153 -0
- package/dist/audio_resampler.cjs.map +1 -0
- package/dist/audio_resampler.js +129 -134
- package/dist/audio_resampler.js.map +1 -1
- package/dist/audio_source.cjs +116 -0
- package/dist/audio_source.cjs.map +1 -0
- package/dist/audio_source.js +92 -85
- package/dist/audio_source.js.map +1 -1
- package/dist/audio_stream.cjs +104 -0
- package/dist/audio_stream.cjs.map +1 -0
- package/dist/audio_stream.js +77 -78
- package/dist/audio_stream.js.map +1 -1
- package/dist/e2ee.cjs +268 -0
- package/dist/e2ee.cjs.map +1 -0
- package/dist/e2ee.d.ts.map +1 -1
- package/dist/e2ee.js +244 -221
- package/dist/e2ee.js.map +1 -1
- package/dist/ffi_client.cjs +101 -0
- package/dist/ffi_client.cjs.map +1 -0
- package/dist/ffi_client.js +73 -48
- package/dist/ffi_client.js.map +1 -1
- package/dist/index.cjs +188 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +130 -48
- package/dist/index.js.map +1 -1
- package/dist/napi/native.d.cjs +17 -0
- package/dist/napi/native.d.cjs.map +1 -0
- package/dist/napi/native.d.js +1 -0
- package/dist/napi/native.d.js.map +1 -0
- package/dist/napi/native.d.ts +5 -5
- package/dist/native.cjs +301 -0
- package/dist/native.d.ts +19 -0
- package/dist/native.js +15 -0
- package/dist/participant.cjs +388 -0
- package/dist/participant.cjs.map +1 -0
- package/dist/participant.js +363 -339
- package/dist/participant.js.map +1 -1
- package/dist/proto/audio_frame_pb.cjs +193 -0
- package/dist/proto/audio_frame_pb.cjs.map +1 -0
- package/dist/proto/audio_frame_pb.js +120 -320
- package/dist/proto/audio_frame_pb.js.map +1 -1
- package/dist/proto/e2ee_pb.cjs +131 -0
- package/dist/proto/e2ee_pb.cjs.map +1 -0
- package/dist/proto/e2ee_pb.js +76 -202
- package/dist/proto/e2ee_pb.js.map +1 -1
- package/dist/proto/ffi_pb.cjs +76 -0
- package/dist/proto/ffi_pb.cjs.map +1 -0
- package/dist/proto/ffi_pb.js +33 -92
- package/dist/proto/ffi_pb.js.map +1 -1
- package/dist/proto/handle_pb.cjs +33 -0
- package/dist/proto/handle_pb.cjs.map +1 -0
- package/dist/proto/handle_pb.js +6 -22
- package/dist/proto/handle_pb.js.map +1 -1
- package/dist/proto/participant_pb.cjs +50 -0
- package/dist/proto/participant_pb.cjs.map +1 -0
- package/dist/proto/participant_pb.js +19 -57
- package/dist/proto/participant_pb.js.map +1 -1
- package/dist/proto/room_pb.cjs +370 -0
- package/dist/proto/room_pb.cjs.map +1 -0
- package/dist/proto/room_pb.js +239 -632
- package/dist/proto/room_pb.js.map +1 -1
- package/dist/proto/rpc_pb.cjs +63 -0
- package/dist/proto/rpc_pb.cjs.map +1 -0
- package/dist/proto/rpc_pb.js +26 -72
- package/dist/proto/rpc_pb.js.map +1 -1
- package/dist/proto/stats_pb.cjs +256 -0
- package/dist/proto/stats_pb.cjs.map +1 -0
- package/dist/proto/stats_pb.js +175 -456
- package/dist/proto/stats_pb.js.map +1 -1
- package/dist/proto/track_pb.cjs +116 -0
- package/dist/proto/track_pb.cjs.map +1 -0
- package/dist/proto/track_pb.js +65 -171
- package/dist/proto/track_pb.js.map +1 -1
- package/dist/proto/video_frame_pb.cjs +161 -0
- package/dist/proto/video_frame_pb.cjs.map +1 -0
- package/dist/proto/video_frame_pb.js +101 -269
- package/dist/proto/video_frame_pb.js.map +1 -1
- package/dist/room.cjs +440 -0
- package/dist/room.cjs.map +1 -0
- package/dist/room.js +384 -373
- package/dist/room.js.map +1 -1
- package/dist/rpc.cjs +89 -0
- package/dist/rpc.cjs.map +1 -0
- package/dist/rpc.js +59 -63
- package/dist/rpc.js.map +1 -1
- package/dist/track.cjs +100 -0
- package/dist/track.cjs.map +1 -0
- package/dist/track.js +66 -62
- package/dist/track.js.map +1 -1
- package/dist/track_publication.cjs +106 -0
- package/dist/track_publication.cjs.map +1 -0
- package/dist/track_publication.js +76 -74
- package/dist/track_publication.js.map +1 -1
- package/dist/transcription.cjs +17 -0
- package/dist/transcription.cjs.map +1 -0
- package/dist/transcription.js +0 -1
- package/dist/transcription.js.map +1 -1
- package/dist/types.cjs +17 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/dist/version.cjs +29 -0
- package/dist/version.cjs.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +4 -1
- package/dist/version.js.map +1 -1
- package/dist/video_frame.cjs +242 -0
- package/dist/video_frame.cjs.map +1 -0
- package/dist/video_frame.js +212 -201
- package/dist/video_frame.js.map +1 -1
- package/dist/video_source.cjs +63 -0
- package/dist/video_source.cjs.map +1 -0
- package/dist/video_source.d.ts.map +1 -1
- package/dist/video_source.js +42 -37
- package/dist/video_source.js.map +1 -1
- package/dist/video_stream.cjs +103 -0
- package/dist/video_stream.cjs.map +1 -0
- package/dist/video_stream.js +76 -77
- package/dist/video_stream.js.map +1 -1
- package/package.json +18 -9
- package/src/audio_frame.ts +2 -2
- package/src/audio_source.ts +2 -2
- package/src/e2ee.ts +2 -2
- package/src/napi/native.d.ts +5 -5
- package/src/version.ts +1 -1
- package/src/video_frame.ts +1 -1
- package/src/video_source.ts +5 -1
|
@@ -0,0 +1,388 @@
|
|
|
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 participant_exports = {};
|
|
20
|
+
__export(participant_exports, {
|
|
21
|
+
LocalParticipant: () => LocalParticipant,
|
|
22
|
+
Participant: () => Participant,
|
|
23
|
+
RemoteParticipant: () => RemoteParticipant
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(participant_exports);
|
|
26
|
+
var import_protobuf = require("@bufbuild/protobuf");
|
|
27
|
+
var import_ffi_client = require("./ffi_client.cjs");
|
|
28
|
+
var import_room_pb = require("./proto/room_pb.cjs");
|
|
29
|
+
var import_room_pb2 = require("./proto/room_pb.cjs");
|
|
30
|
+
var import_rpc_pb = require("./proto/rpc_pb.cjs");
|
|
31
|
+
var import_rpc = require("./rpc.cjs");
|
|
32
|
+
var import_track_publication = require("./track_publication.cjs");
|
|
33
|
+
class Participant {
|
|
34
|
+
constructor(owned_info) {
|
|
35
|
+
this.trackPublications = /* @__PURE__ */ new Map();
|
|
36
|
+
this.info = owned_info.info;
|
|
37
|
+
this.ffi_handle = new import_ffi_client.FfiHandle(owned_info.handle.id);
|
|
38
|
+
}
|
|
39
|
+
get sid() {
|
|
40
|
+
return this.info.sid;
|
|
41
|
+
}
|
|
42
|
+
get name() {
|
|
43
|
+
return this.info.name;
|
|
44
|
+
}
|
|
45
|
+
get identity() {
|
|
46
|
+
return this.info.identity;
|
|
47
|
+
}
|
|
48
|
+
get metadata() {
|
|
49
|
+
return this.info.metadata;
|
|
50
|
+
}
|
|
51
|
+
get attributes() {
|
|
52
|
+
return this.info.attributes;
|
|
53
|
+
}
|
|
54
|
+
get kind() {
|
|
55
|
+
return this.info.kind;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
class LocalParticipant extends Participant {
|
|
59
|
+
constructor() {
|
|
60
|
+
super(...arguments);
|
|
61
|
+
this.rpcHandlers = /* @__PURE__ */ new Map();
|
|
62
|
+
this.trackPublications = /* @__PURE__ */ new Map();
|
|
63
|
+
}
|
|
64
|
+
async publishData(data, options) {
|
|
65
|
+
const req = (0, import_protobuf.create)(import_room_pb.PublishDataRequestSchema, {
|
|
66
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
67
|
+
dataPtr: import_ffi_client.FfiClient.instance.retrievePtr(data),
|
|
68
|
+
dataLen: BigInt(data.byteLength),
|
|
69
|
+
reliable: options.reliable,
|
|
70
|
+
topic: options.topic,
|
|
71
|
+
destinationIdentities: options.destination_identities
|
|
72
|
+
});
|
|
73
|
+
const res = import_ffi_client.FfiClient.instance.request({
|
|
74
|
+
message: { case: "publishData", value: req }
|
|
75
|
+
});
|
|
76
|
+
const cb = await import_ffi_client.FfiClient.instance.waitFor((ev) => {
|
|
77
|
+
return ev.message.case == "publishData" && ev.message.value.asyncId == res.asyncId;
|
|
78
|
+
});
|
|
79
|
+
if (cb.error) {
|
|
80
|
+
throw new Error(cb.error);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async publishDtmf(code, digit) {
|
|
84
|
+
const req = (0, import_protobuf.create)(import_room_pb.PublishSipDtmfRequestSchema, {
|
|
85
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
86
|
+
code,
|
|
87
|
+
digit
|
|
88
|
+
});
|
|
89
|
+
const res = import_ffi_client.FfiClient.instance.request({
|
|
90
|
+
message: { case: "publishSipDtmf", value: req }
|
|
91
|
+
});
|
|
92
|
+
const cb = await import_ffi_client.FfiClient.instance.waitFor((ev) => {
|
|
93
|
+
return ev.message.case == "publishSipDtmf" && ev.message.value.asyncId == res.asyncId;
|
|
94
|
+
});
|
|
95
|
+
if (cb.error) {
|
|
96
|
+
throw new Error(cb.error);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async publishTranscription(transcription) {
|
|
100
|
+
const req = (0, import_protobuf.create)(import_room_pb.PublishTranscriptionRequestSchema, {
|
|
101
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
102
|
+
participantIdentity: transcription.participantIdentity,
|
|
103
|
+
segments: transcription.segments.map(
|
|
104
|
+
(s) => (0, import_protobuf.create)(import_room_pb2.TranscriptionSegmentSchema, {
|
|
105
|
+
id: s.id,
|
|
106
|
+
text: s.text,
|
|
107
|
+
startTime: s.startTime,
|
|
108
|
+
endTime: s.endTime,
|
|
109
|
+
final: s.final,
|
|
110
|
+
language: s.language
|
|
111
|
+
})
|
|
112
|
+
),
|
|
113
|
+
trackId: transcription.trackSid
|
|
114
|
+
});
|
|
115
|
+
const res = import_ffi_client.FfiClient.instance.request({
|
|
116
|
+
message: { case: "publishTranscription", value: req }
|
|
117
|
+
});
|
|
118
|
+
const cb = await import_ffi_client.FfiClient.instance.waitFor((ev) => {
|
|
119
|
+
return ev.message.case == "publishTranscription" && ev.message.value.asyncId == res.asyncId;
|
|
120
|
+
});
|
|
121
|
+
if (cb.error) {
|
|
122
|
+
throw new Error(cb.error);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async updateMetadata(metadata) {
|
|
126
|
+
const req = (0, import_protobuf.create)(import_room_pb.SetLocalMetadataRequestSchema, {
|
|
127
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
128
|
+
metadata
|
|
129
|
+
});
|
|
130
|
+
const res = import_ffi_client.FfiClient.instance.request({
|
|
131
|
+
message: { case: "setLocalMetadata", value: req }
|
|
132
|
+
});
|
|
133
|
+
await import_ffi_client.FfiClient.instance.waitFor((ev) => {
|
|
134
|
+
return ev.message.case == "setLocalMetadata" && ev.message.value.asyncId == res.asyncId;
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Sends a chat message to participants in the room
|
|
139
|
+
*
|
|
140
|
+
* @param text - The text content of the chat message.
|
|
141
|
+
* @param destinationIdentities - An optional array of recipient identities to whom the message will be sent. If omitted, the message is broadcast to all participants.
|
|
142
|
+
* @param senderIdentity - An optional identity of the sender. If omitted, the default sender identity is used.
|
|
143
|
+
*
|
|
144
|
+
*/
|
|
145
|
+
async sendChatMessage(text, destinationIdentities, senderIdentity) {
|
|
146
|
+
const req = (0, import_protobuf.create)(import_room_pb.SendChatMessageRequestSchema, {
|
|
147
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
148
|
+
message: text,
|
|
149
|
+
destinationIdentities,
|
|
150
|
+
senderIdentity
|
|
151
|
+
});
|
|
152
|
+
const res = import_ffi_client.FfiClient.instance.request({
|
|
153
|
+
message: { case: "sendChatMessage", value: req }
|
|
154
|
+
});
|
|
155
|
+
const cb = await import_ffi_client.FfiClient.instance.waitFor((ev) => {
|
|
156
|
+
return ev.message.case == "chatMessage" && ev.message.value.asyncId == res.asyncId;
|
|
157
|
+
});
|
|
158
|
+
if (cb.message.case !== "chatMessage") {
|
|
159
|
+
throw new Error(cb.message.value ?? "Unknown Error");
|
|
160
|
+
}
|
|
161
|
+
const { id, timestamp, editTimestamp, message } = cb.message.value;
|
|
162
|
+
return { id, timestamp: Number(timestamp), editTimestamp: Number(editTimestamp), message };
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* @experimental
|
|
166
|
+
*/
|
|
167
|
+
async editChatMessage(editText, originalMessage, destinationIdentities, senderIdentity) {
|
|
168
|
+
const req = (0, import_protobuf.create)(import_room_pb.EditChatMessageRequestSchema, {
|
|
169
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
170
|
+
editText,
|
|
171
|
+
originalMessage: (0, import_protobuf.create)(import_room_pb.ChatMessageSchema, {
|
|
172
|
+
...originalMessage,
|
|
173
|
+
timestamp: BigInt(originalMessage.timestamp),
|
|
174
|
+
editTimestamp: originalMessage.editTimestamp ? BigInt(originalMessage.editTimestamp) : void 0
|
|
175
|
+
}),
|
|
176
|
+
destinationIdentities,
|
|
177
|
+
senderIdentity
|
|
178
|
+
});
|
|
179
|
+
const res = import_ffi_client.FfiClient.instance.request({
|
|
180
|
+
message: { case: "editChatMessage", value: req }
|
|
181
|
+
});
|
|
182
|
+
const cb = await import_ffi_client.FfiClient.instance.waitFor((ev) => {
|
|
183
|
+
return ev.message.case == "chatMessage" && ev.message.value.asyncId == res.asyncId;
|
|
184
|
+
});
|
|
185
|
+
if (cb.message.case !== "chatMessage") {
|
|
186
|
+
throw new Error(cb.message.value ?? "Unknown Error");
|
|
187
|
+
}
|
|
188
|
+
const { id, timestamp, editTimestamp, message } = cb.message.value;
|
|
189
|
+
return { id, timestamp: Number(timestamp), editTimestamp: Number(editTimestamp), message };
|
|
190
|
+
}
|
|
191
|
+
async updateName(name) {
|
|
192
|
+
const req = (0, import_protobuf.create)(import_room_pb.SetLocalNameRequestSchema, {
|
|
193
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
194
|
+
name
|
|
195
|
+
});
|
|
196
|
+
const res = import_ffi_client.FfiClient.instance.request({
|
|
197
|
+
message: { case: "setLocalName", value: req }
|
|
198
|
+
});
|
|
199
|
+
await import_ffi_client.FfiClient.instance.waitFor((ev) => {
|
|
200
|
+
return ev.message.case == "setLocalName" && ev.message.value.asyncId == res.asyncId;
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
async setAttributes(attributes) {
|
|
204
|
+
const req = (0, import_protobuf.create)(import_room_pb.SetLocalAttributesRequestSchema, {
|
|
205
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
206
|
+
attributes: Array.from(Object.entries(attributes)).map(([key, value]) => {
|
|
207
|
+
return { key, value };
|
|
208
|
+
})
|
|
209
|
+
});
|
|
210
|
+
const res = import_ffi_client.FfiClient.instance.request({
|
|
211
|
+
message: { case: "setLocalAttributes", value: req }
|
|
212
|
+
});
|
|
213
|
+
await import_ffi_client.FfiClient.instance.waitFor((ev) => {
|
|
214
|
+
return ev.message.case == "setLocalAttributes" && ev.message.value.asyncId == res.asyncId;
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
async publishTrack(track, options) {
|
|
218
|
+
const req = (0, import_protobuf.create)(import_room_pb.PublishTrackRequestSchema, {
|
|
219
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
220
|
+
trackHandle: track.ffi_handle.handle,
|
|
221
|
+
options
|
|
222
|
+
});
|
|
223
|
+
const res = import_ffi_client.FfiClient.instance.request({
|
|
224
|
+
message: { case: "publishTrack", value: req }
|
|
225
|
+
});
|
|
226
|
+
const cb = await import_ffi_client.FfiClient.instance.waitFor((ev) => {
|
|
227
|
+
return ev.message.case == "publishTrack" && ev.message.value.asyncId == res.asyncId;
|
|
228
|
+
});
|
|
229
|
+
if (cb.message.case !== "publication") {
|
|
230
|
+
throw new Error(cb.message.value ?? "Unknown Error");
|
|
231
|
+
}
|
|
232
|
+
const track_publication = new import_track_publication.LocalTrackPublication(cb.message.value);
|
|
233
|
+
track_publication.track = track;
|
|
234
|
+
this.trackPublications.set(track_publication.sid, track_publication);
|
|
235
|
+
return track_publication;
|
|
236
|
+
}
|
|
237
|
+
async unpublishTrack(trackSid) {
|
|
238
|
+
const req = (0, import_protobuf.create)(import_room_pb.UnpublishTrackRequestSchema, {
|
|
239
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
240
|
+
trackSid
|
|
241
|
+
});
|
|
242
|
+
const res = import_ffi_client.FfiClient.instance.request({
|
|
243
|
+
message: { case: "unpublishTrack", value: req }
|
|
244
|
+
});
|
|
245
|
+
const cb = await import_ffi_client.FfiClient.instance.waitFor((ev) => {
|
|
246
|
+
return ev.message.case == "unpublishTrack" && ev.message.value.asyncId == res.asyncId;
|
|
247
|
+
});
|
|
248
|
+
if (cb.error) {
|
|
249
|
+
throw new Error(cb.error);
|
|
250
|
+
}
|
|
251
|
+
const pub = this.trackPublications.get(trackSid);
|
|
252
|
+
if (pub) {
|
|
253
|
+
pub.track = void 0;
|
|
254
|
+
}
|
|
255
|
+
this.trackPublications.delete(trackSid);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Initiate an RPC call to a remote participant.
|
|
259
|
+
* @param params - Parameters for initiating the RPC call, see {@link PerformRpcParams}
|
|
260
|
+
* @returns A promise that resolves with the response payload or rejects with an error.
|
|
261
|
+
* @throws Error on failure. Details in `message`.
|
|
262
|
+
*/
|
|
263
|
+
async performRpc({
|
|
264
|
+
destinationIdentity,
|
|
265
|
+
method,
|
|
266
|
+
payload,
|
|
267
|
+
responseTimeout
|
|
268
|
+
}) {
|
|
269
|
+
const req = (0, import_protobuf.create)(import_rpc_pb.PerformRpcRequestSchema, {
|
|
270
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
271
|
+
destinationIdentity,
|
|
272
|
+
method,
|
|
273
|
+
payload,
|
|
274
|
+
responseTimeoutMs: responseTimeout
|
|
275
|
+
});
|
|
276
|
+
const res = import_ffi_client.FfiClient.instance.request({
|
|
277
|
+
message: { case: "performRpc", value: req }
|
|
278
|
+
});
|
|
279
|
+
const cb = await import_ffi_client.FfiClient.instance.waitFor((ev) => {
|
|
280
|
+
return ev.message.case === "performRpc" && ev.message.value.asyncId === res.asyncId;
|
|
281
|
+
});
|
|
282
|
+
if (cb.error) {
|
|
283
|
+
throw import_rpc.RpcError.fromProto(cb.error);
|
|
284
|
+
}
|
|
285
|
+
return cb.payload;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Establishes the participant as a receiver for calls of the specified RPC method.
|
|
289
|
+
* Will overwrite any existing callback for the same method.
|
|
290
|
+
*
|
|
291
|
+
* @param method - The name of the indicated RPC method
|
|
292
|
+
* @param handler - Will be invoked when an RPC request for this method is received
|
|
293
|
+
* @returns A promise that resolves when the method is successfully registered
|
|
294
|
+
*
|
|
295
|
+
* @example
|
|
296
|
+
* ```typescript
|
|
297
|
+
* room.localParticipant?.registerRpcMethod(
|
|
298
|
+
* 'greet',
|
|
299
|
+
* async (data: RpcInvocationData) => {
|
|
300
|
+
* console.log(`Received greeting from ${data.callerIdentity}: ${data.payload}`);
|
|
301
|
+
* return `Hello, ${data.callerIdentity}!`;
|
|
302
|
+
* }
|
|
303
|
+
* );
|
|
304
|
+
* ```
|
|
305
|
+
*
|
|
306
|
+
* See {@link RpcInvocationData} for more details on invocation params.
|
|
307
|
+
*
|
|
308
|
+
* The handler should return a Promise that resolves to a string.
|
|
309
|
+
* If unable to respond within `responseTimeout`, the request will result in an error on the caller's side.
|
|
310
|
+
*
|
|
311
|
+
* You may throw errors of type `RpcError` with a string `message` in the handler,
|
|
312
|
+
* and they will be received on the caller's side with the message intact.
|
|
313
|
+
* Other errors thrown in your handler will not be transmitted as-is, and will instead arrive to the caller as `1500` ("Application Error").
|
|
314
|
+
*/
|
|
315
|
+
registerRpcMethod(method, handler) {
|
|
316
|
+
this.rpcHandlers.set(method, handler);
|
|
317
|
+
const req = (0, import_protobuf.create)(import_rpc_pb.RegisterRpcMethodRequestSchema, {
|
|
318
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
319
|
+
method
|
|
320
|
+
});
|
|
321
|
+
import_ffi_client.FfiClient.instance.request({
|
|
322
|
+
message: { case: "registerRpcMethod", value: req }
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Unregisters a previously registered RPC method.
|
|
327
|
+
*
|
|
328
|
+
* @param method - The name of the RPC method to unregister
|
|
329
|
+
*/
|
|
330
|
+
unregisterRpcMethod(method) {
|
|
331
|
+
this.rpcHandlers.delete(method);
|
|
332
|
+
const req = (0, import_protobuf.create)(import_rpc_pb.UnregisterRpcMethodRequestSchema, {
|
|
333
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
334
|
+
method
|
|
335
|
+
});
|
|
336
|
+
import_ffi_client.FfiClient.instance.request({
|
|
337
|
+
message: { case: "unregisterRpcMethod", value: req }
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
/** @internal */
|
|
341
|
+
async handleRpcMethodInvocation(invocationId, method, requestId, callerIdentity, payload, responseTimeout) {
|
|
342
|
+
let responseError = null;
|
|
343
|
+
let responsePayload = null;
|
|
344
|
+
const handler = this.rpcHandlers.get(method);
|
|
345
|
+
if (!handler) {
|
|
346
|
+
responseError = import_rpc.RpcError.builtIn("UNSUPPORTED_METHOD");
|
|
347
|
+
} else {
|
|
348
|
+
try {
|
|
349
|
+
responsePayload = await handler({ requestId, callerIdentity, payload, responseTimeout });
|
|
350
|
+
} catch (error) {
|
|
351
|
+
if (error instanceof import_rpc.RpcError) {
|
|
352
|
+
responseError = error;
|
|
353
|
+
} else {
|
|
354
|
+
console.warn(
|
|
355
|
+
`Uncaught error returned by RPC handler for ${method}. Returning APPLICATION_ERROR instead.`,
|
|
356
|
+
error
|
|
357
|
+
);
|
|
358
|
+
responseError = import_rpc.RpcError.builtIn("APPLICATION_ERROR");
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
const req = (0, import_protobuf.create)(import_rpc_pb.RpcMethodInvocationResponseRequestSchema, {
|
|
363
|
+
localParticipantHandle: this.ffi_handle.handle,
|
|
364
|
+
invocationId,
|
|
365
|
+
error: responseError ? responseError.toProto() : void 0,
|
|
366
|
+
payload: responsePayload ?? void 0
|
|
367
|
+
});
|
|
368
|
+
const res = import_ffi_client.FfiClient.instance.request({
|
|
369
|
+
message: { case: "rpcMethodInvocationResponse", value: req }
|
|
370
|
+
});
|
|
371
|
+
if (res.error) {
|
|
372
|
+
console.warn(`error sending rpc method invocation response: ${res.error}`);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
class RemoteParticipant extends Participant {
|
|
377
|
+
constructor(owned_info) {
|
|
378
|
+
super(owned_info);
|
|
379
|
+
this.trackPublications = /* @__PURE__ */ new Map();
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
383
|
+
0 && (module.exports = {
|
|
384
|
+
LocalParticipant,
|
|
385
|
+
Participant,
|
|
386
|
+
RemoteParticipant
|
|
387
|
+
});
|
|
388
|
+
//# sourceMappingURL=participant.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/participant.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { create } from '@bufbuild/protobuf';\nimport { FfiClient, FfiHandle } from './ffi_client.js';\nimport type { OwnedParticipant, ParticipantInfo, ParticipantKind } from './proto/participant_pb.js';\nimport type {\n PublishDataCallback,\n PublishDataResponse,\n PublishSipDtmfCallback,\n PublishSipDtmfResponse,\n PublishTrackCallback,\n PublishTrackResponse,\n PublishTranscriptionCallback,\n PublishTranscriptionResponse,\n SendChatMessageCallback,\n SendChatMessageResponse,\n SetLocalAttributesCallback,\n SetLocalAttributesResponse,\n SetLocalMetadataCallback,\n SetLocalMetadataResponse,\n SetLocalNameCallback,\n SetLocalNameResponse,\n TrackPublishOptions,\n UnpublishTrackCallback,\n UnpublishTrackResponse,\n} from './proto/room_pb.js';\nimport {\n ChatMessageSchema,\n EditChatMessageRequestSchema,\n PublishDataRequestSchema,\n PublishSipDtmfRequestSchema,\n PublishTrackRequestSchema,\n PublishTranscriptionRequestSchema,\n SendChatMessageRequestSchema,\n SetLocalAttributesRequestSchema,\n SetLocalMetadataRequestSchema,\n SetLocalNameRequestSchema,\n UnpublishTrackRequestSchema,\n} from './proto/room_pb.js';\nimport { TranscriptionSegmentSchema } from './proto/room_pb.js';\nimport {\n PerformRpcRequestSchema,\n RegisterRpcMethodRequestSchema,\n RpcMethodInvocationResponseRequestSchema,\n UnregisterRpcMethodRequestSchema,\n} from './proto/rpc_pb.js';\nimport type {\n PerformRpcCallback,\n PerformRpcResponse,\n RegisterRpcMethodResponse,\n RpcMethodInvocationResponseResponse,\n UnregisterRpcMethodResponse,\n} from './proto/rpc_pb.js';\nimport { type PerformRpcParams, RpcError, type RpcInvocationData } from './rpc.js';\nimport type { LocalTrack } from './track.js';\nimport type { RemoteTrackPublication, TrackPublication } from './track_publication.js';\nimport { LocalTrackPublication } from './track_publication.js';\nimport type { Transcription } from './transcription.js';\nimport type { ChatMessage } from './types.js';\n\nexport abstract class Participant {\n /** @internal */\n info: ParticipantInfo;\n\n /** @internal */\n ffi_handle: FfiHandle;\n\n trackPublications = new Map<string, TrackPublication>();\n\n constructor(owned_info: OwnedParticipant) {\n this.info = owned_info.info!;\n this.ffi_handle = new FfiHandle(owned_info.handle!.id);\n }\n\n get sid(): string {\n return this.info.sid;\n }\n\n get name(): string {\n return this.info.name;\n }\n\n get identity(): string {\n return this.info.identity;\n }\n\n get metadata(): string {\n return this.info.metadata;\n }\n\n get attributes(): Record<string, string> {\n return this.info.attributes;\n }\n\n get kind(): ParticipantKind {\n return this.info.kind;\n }\n}\n\nexport type DataPublishOptions = {\n /**\n * whether to send this as reliable or lossy.\n * For data that you need delivery guarantee (such as chat messages), use Reliable.\n * For data that should arrive as quickly as possible, but you are ok with dropped\n * packets, use Lossy.\n */\n reliable?: boolean;\n /**\n * the identities of participants who will receive the message, will be sent to every one if empty\n */\n destination_identities?: string[];\n /** the topic under which the message gets published */\n topic?: string;\n};\n\nexport class LocalParticipant extends Participant {\n private rpcHandlers: Map<string, (data: RpcInvocationData) => Promise<string>> = new Map();\n\n trackPublications: Map<string, LocalTrackPublication> = new Map();\n\n async publishData(data: Uint8Array, options: DataPublishOptions) {\n const req = create(PublishDataRequestSchema, {\n localParticipantHandle: this.ffi_handle.handle,\n dataPtr: FfiClient.instance.retrievePtr(data),\n dataLen: BigInt(data.byteLength),\n reliable: options.reliable,\n topic: options.topic,\n destinationIdentities: options.destination_identities,\n });\n\n const res = FfiClient.instance.request<PublishDataResponse>({\n message: { case: 'publishData', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishDataCallback>((ev) => {\n return ev.message.case == 'publishData' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async publishDtmf(code: number, digit: string) {\n const req = create(PublishSipDtmfRequestSchema, {\n localParticipantHandle: this.ffi_handle.handle,\n code,\n digit,\n });\n\n const res = FfiClient.instance.request<PublishSipDtmfResponse>({\n message: { case: 'publishSipDtmf', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishSipDtmfCallback>((ev) => {\n return ev.message.case == 'publishSipDtmf' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async publishTranscription(transcription: Transcription) {\n const req = create(PublishTranscriptionRequestSchema, {\n localParticipantHandle: this.ffi_handle.handle,\n participantIdentity: transcription.participantIdentity,\n segments: transcription.segments.map((s) =>\n create(TranscriptionSegmentSchema, {\n id: s.id,\n text: s.text,\n startTime: s.startTime,\n endTime: s.endTime,\n final: s.final,\n language: s.language,\n }),\n ),\n trackId: transcription.trackSid,\n });\n\n const res = FfiClient.instance.request<PublishTranscriptionResponse>({\n message: { case: 'publishTranscription', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishTranscriptionCallback>((ev) => {\n return ev.message.case == 'publishTranscription' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n }\n\n async updateMetadata(metadata: string) {\n const req = create(SetLocalMetadataRequestSchema, {\n localParticipantHandle: this.ffi_handle.handle,\n metadata: metadata,\n });\n\n const res = FfiClient.instance.request<SetLocalMetadataResponse>({\n message: { case: 'setLocalMetadata', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalMetadataCallback>((ev) => {\n return ev.message.case == 'setLocalMetadata' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n /**\n * Sends a chat message to participants in the room\n *\n * @param text - The text content of the chat message.\n * @param destinationIdentities - An optional array of recipient identities to whom the message will be sent. If omitted, the message is broadcast to all participants.\n * @param senderIdentity - An optional identity of the sender. If omitted, the default sender identity is used.\n *\n */\n async sendChatMessage(\n text: string,\n destinationIdentities?: Array<string>,\n senderIdentity?: string,\n ): Promise<ChatMessage> {\n const req = create(SendChatMessageRequestSchema, {\n localParticipantHandle: this.ffi_handle.handle,\n message: text,\n destinationIdentities,\n senderIdentity,\n });\n\n const res = FfiClient.instance.request<SendChatMessageResponse>({\n message: { case: 'sendChatMessage', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendChatMessageCallback>((ev) => {\n return ev.message.case == 'chatMessage' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.message.case !== 'chatMessage') {\n throw new Error(cb.message.value ?? 'Unknown Error');\n }\n const { id, timestamp, editTimestamp, message } = cb.message.value;\n return { id, timestamp: Number(timestamp), editTimestamp: Number(editTimestamp), message };\n }\n\n /**\n * @experimental\n */\n async editChatMessage(\n editText: string,\n originalMessage: ChatMessage,\n destinationIdentities?: Array<string>,\n senderIdentity?: string,\n ): Promise<ChatMessage> {\n const req = create(EditChatMessageRequestSchema, {\n localParticipantHandle: this.ffi_handle.handle,\n editText,\n originalMessage: create(ChatMessageSchema, {\n ...originalMessage,\n timestamp: BigInt(originalMessage.timestamp),\n editTimestamp: originalMessage.editTimestamp\n ? BigInt(originalMessage.editTimestamp)\n : undefined,\n }),\n destinationIdentities,\n senderIdentity,\n });\n\n const res = FfiClient.instance.request<SendChatMessageResponse>({\n message: { case: 'editChatMessage', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<SendChatMessageCallback>((ev) => {\n return ev.message.case == 'chatMessage' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.message.case !== 'chatMessage') {\n throw new Error(cb.message.value ?? 'Unknown Error');\n }\n const { id, timestamp, editTimestamp, message } = cb.message.value;\n return { id, timestamp: Number(timestamp), editTimestamp: Number(editTimestamp), message };\n }\n\n async updateName(name: string) {\n const req = create(SetLocalNameRequestSchema, {\n localParticipantHandle: this.ffi_handle.handle,\n name: name,\n });\n\n const res = FfiClient.instance.request<SetLocalNameResponse>({\n message: { case: 'setLocalName', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalNameCallback>((ev) => {\n return ev.message.case == 'setLocalName' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n async setAttributes(attributes: Record<string, string>) {\n const req = create(SetLocalAttributesRequestSchema, {\n localParticipantHandle: this.ffi_handle.handle,\n attributes: Array.from(Object.entries(attributes)).map(([key, value]) => {\n return { key, value };\n }),\n });\n\n const res = FfiClient.instance.request<SetLocalAttributesResponse>({\n message: { case: 'setLocalAttributes', value: req },\n });\n\n await FfiClient.instance.waitFor<SetLocalAttributesCallback>((ev) => {\n return ev.message.case == 'setLocalAttributes' && ev.message.value.asyncId == res.asyncId;\n });\n }\n\n async publishTrack(\n track: LocalTrack,\n options: TrackPublishOptions,\n ): Promise<LocalTrackPublication> {\n const req = create(PublishTrackRequestSchema, {\n localParticipantHandle: this.ffi_handle.handle,\n trackHandle: track.ffi_handle.handle,\n options: options,\n });\n\n const res = FfiClient.instance.request<PublishTrackResponse>({\n message: { case: 'publishTrack', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PublishTrackCallback>((ev) => {\n return ev.message.case == 'publishTrack' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.message.case !== 'publication') {\n throw new Error(cb.message.value ?? 'Unknown Error');\n }\n\n const track_publication = new LocalTrackPublication(cb.message.value!);\n track_publication.track = track;\n this.trackPublications.set(track_publication.sid, track_publication);\n\n return track_publication;\n }\n\n async unpublishTrack(trackSid: string) {\n const req = create(UnpublishTrackRequestSchema, {\n localParticipantHandle: this.ffi_handle.handle,\n trackSid: trackSid,\n });\n\n const res = FfiClient.instance.request<UnpublishTrackResponse>({\n message: { case: 'unpublishTrack', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<UnpublishTrackCallback>((ev) => {\n return ev.message.case == 'unpublishTrack' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.error) {\n throw new Error(cb.error);\n }\n\n const pub = this.trackPublications.get(trackSid);\n if (pub) {\n pub.track = undefined;\n }\n this.trackPublications.delete(trackSid);\n }\n\n /**\n * Initiate an RPC call to a remote participant.\n * @param params - Parameters for initiating the RPC call, see {@link PerformRpcParams}\n * @returns A promise that resolves with the response payload or rejects with an error.\n * @throws Error on failure. Details in `message`.\n */\n async performRpc({\n destinationIdentity,\n method,\n payload,\n responseTimeout,\n }: PerformRpcParams): Promise<string> {\n const req = create(PerformRpcRequestSchema, {\n localParticipantHandle: this.ffi_handle.handle,\n destinationIdentity,\n method,\n payload,\n responseTimeoutMs: responseTimeout,\n });\n\n const res = FfiClient.instance.request<PerformRpcResponse>({\n message: { case: 'performRpc', value: req },\n });\n\n const cb = await FfiClient.instance.waitFor<PerformRpcCallback>((ev) => {\n return ev.message.case === 'performRpc' && ev.message.value.asyncId === res.asyncId;\n });\n\n if (cb.error) {\n throw RpcError.fromProto(cb.error);\n }\n\n return cb.payload;\n }\n\n /**\n * Establishes the participant as a receiver for calls of the specified RPC method.\n * Will overwrite any existing callback for the same method.\n *\n * @param method - The name of the indicated RPC method\n * @param handler - Will be invoked when an RPC request for this method is received\n * @returns A promise that resolves when the method is successfully registered\n *\n * @example\n * ```typescript\n * room.localParticipant?.registerRpcMethod(\n * 'greet',\n * async (data: RpcInvocationData) => {\n * console.log(`Received greeting from ${data.callerIdentity}: ${data.payload}`);\n * return `Hello, ${data.callerIdentity}!`;\n * }\n * );\n * ```\n *\n * See {@link RpcInvocationData} for more details on invocation params.\n *\n * The handler should return a Promise that resolves to a string.\n * If unable to respond within `responseTimeout`, the request will result in an error on the caller's side.\n *\n * You may throw errors of type `RpcError` with a string `message` in the handler,\n * and they will be received on the caller's side with the message intact.\n * Other errors thrown in your handler will not be transmitted as-is, and will instead arrive to the caller as `1500` (\"Application Error\").\n */\n registerRpcMethod(method: string, handler: (data: RpcInvocationData) => Promise<string>) {\n this.rpcHandlers.set(method, handler);\n\n const req = create(RegisterRpcMethodRequestSchema, {\n localParticipantHandle: this.ffi_handle.handle,\n method,\n });\n\n FfiClient.instance.request<RegisterRpcMethodResponse>({\n message: { case: 'registerRpcMethod', value: req },\n });\n }\n\n /**\n * Unregisters a previously registered RPC method.\n *\n * @param method - The name of the RPC method to unregister\n */\n unregisterRpcMethod(method: string) {\n this.rpcHandlers.delete(method);\n\n const req = create(UnregisterRpcMethodRequestSchema, {\n localParticipantHandle: this.ffi_handle.handle,\n method,\n });\n\n FfiClient.instance.request<UnregisterRpcMethodResponse>({\n message: { case: 'unregisterRpcMethod', value: req },\n });\n }\n\n /** @internal */\n async handleRpcMethodInvocation(\n invocationId: bigint,\n method: string,\n requestId: string,\n callerIdentity: string,\n payload: string,\n responseTimeout: number,\n ) {\n let responseError: RpcError | null = null;\n let responsePayload: string | null = null;\n\n const handler = this.rpcHandlers.get(method);\n\n if (!handler) {\n responseError = RpcError.builtIn('UNSUPPORTED_METHOD');\n } else {\n try {\n responsePayload = await handler({ requestId, callerIdentity, payload, responseTimeout });\n } catch (error) {\n if (error instanceof RpcError) {\n responseError = error;\n } else {\n console.warn(\n `Uncaught error returned by RPC handler for ${method}. Returning APPLICATION_ERROR instead.`,\n error,\n );\n responseError = RpcError.builtIn('APPLICATION_ERROR');\n }\n }\n }\n\n const req = create(RpcMethodInvocationResponseRequestSchema, {\n localParticipantHandle: this.ffi_handle.handle,\n invocationId,\n error: responseError ? responseError.toProto() : undefined,\n payload: responsePayload ?? undefined,\n });\n\n const res = FfiClient.instance.request<RpcMethodInvocationResponseResponse>({\n message: { case: 'rpcMethodInvocationResponse', value: req },\n });\n\n if (res.error) {\n console.warn(`error sending rpc method invocation response: ${res.error}`);\n }\n }\n}\n\nexport class RemoteParticipant extends Participant {\n trackPublications: Map<string, RemoteTrackPublication> = new Map();\n\n constructor(owned_info: OwnedParticipant) {\n super(owned_info);\n }\n}\n"],"mappings":"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","names":["import_room_pb"]}
|