@livekit/rtc-node 0.11.0 → 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.
Files changed (153) hide show
  1. package/dist/audio_frame.cjs +94 -0
  2. package/dist/audio_frame.cjs.map +1 -0
  3. package/dist/audio_frame.js +64 -67
  4. package/dist/audio_frame.js.map +1 -1
  5. package/dist/audio_resampler.cjs +153 -0
  6. package/dist/audio_resampler.cjs.map +1 -0
  7. package/dist/audio_resampler.js +129 -134
  8. package/dist/audio_resampler.js.map +1 -1
  9. package/dist/audio_source.cjs +116 -0
  10. package/dist/audio_source.cjs.map +1 -0
  11. package/dist/audio_source.js +92 -85
  12. package/dist/audio_source.js.map +1 -1
  13. package/dist/audio_stream.cjs +104 -0
  14. package/dist/audio_stream.cjs.map +1 -0
  15. package/dist/audio_stream.js +77 -78
  16. package/dist/audio_stream.js.map +1 -1
  17. package/dist/e2ee.cjs +268 -0
  18. package/dist/e2ee.cjs.map +1 -0
  19. package/dist/e2ee.d.ts.map +1 -1
  20. package/dist/e2ee.js +244 -221
  21. package/dist/e2ee.js.map +1 -1
  22. package/dist/ffi_client.cjs +101 -0
  23. package/dist/ffi_client.cjs.map +1 -0
  24. package/dist/ffi_client.js +73 -48
  25. package/dist/ffi_client.js.map +1 -1
  26. package/dist/index.cjs +188 -0
  27. package/dist/index.cjs.map +1 -0
  28. package/dist/index.js +130 -48
  29. package/dist/index.js.map +1 -1
  30. package/dist/napi/native.d.cjs +17 -0
  31. package/dist/napi/native.d.cjs.map +1 -0
  32. package/dist/napi/native.d.js +1 -0
  33. package/dist/napi/native.d.js.map +1 -0
  34. package/dist/napi/native.d.ts +5 -5
  35. package/dist/native.cjs +301 -0
  36. package/dist/native.d.ts +19 -0
  37. package/dist/native.js +15 -0
  38. package/dist/participant.cjs +388 -0
  39. package/dist/participant.cjs.map +1 -0
  40. package/dist/participant.js +363 -339
  41. package/dist/participant.js.map +1 -1
  42. package/dist/proto/audio_frame_pb.cjs +193 -0
  43. package/dist/proto/audio_frame_pb.cjs.map +1 -0
  44. package/dist/proto/audio_frame_pb.d.ts +8 -8
  45. package/dist/proto/audio_frame_pb.d.ts.map +1 -1
  46. package/dist/proto/audio_frame_pb.js +122 -322
  47. package/dist/proto/audio_frame_pb.js.map +1 -1
  48. package/dist/proto/e2ee_pb.cjs +131 -0
  49. package/dist/proto/e2ee_pb.cjs.map +1 -0
  50. package/dist/proto/e2ee_pb.js +76 -202
  51. package/dist/proto/e2ee_pb.js.map +1 -1
  52. package/dist/proto/ffi_pb.cjs +76 -0
  53. package/dist/proto/ffi_pb.cjs.map +1 -0
  54. package/dist/proto/ffi_pb.d.ts +6 -6
  55. package/dist/proto/ffi_pb.d.ts.map +1 -1
  56. package/dist/proto/ffi_pb.js +39 -98
  57. package/dist/proto/ffi_pb.js.map +1 -1
  58. package/dist/proto/handle_pb.cjs +33 -0
  59. package/dist/proto/handle_pb.cjs.map +1 -0
  60. package/dist/proto/handle_pb.js +6 -22
  61. package/dist/proto/handle_pb.js.map +1 -1
  62. package/dist/proto/participant_pb.cjs +50 -0
  63. package/dist/proto/participant_pb.cjs.map +1 -0
  64. package/dist/proto/participant_pb.d.ts +1 -1
  65. package/dist/proto/participant_pb.d.ts.map +1 -1
  66. package/dist/proto/participant_pb.js +20 -58
  67. package/dist/proto/participant_pb.js.map +1 -1
  68. package/dist/proto/room_pb.cjs +370 -0
  69. package/dist/proto/room_pb.cjs.map +1 -0
  70. package/dist/proto/room_pb.d.ts +16 -16
  71. package/dist/proto/room_pb.d.ts.map +1 -1
  72. package/dist/proto/room_pb.js +245 -638
  73. package/dist/proto/room_pb.js.map +1 -1
  74. package/dist/proto/rpc_pb.cjs +63 -0
  75. package/dist/proto/rpc_pb.cjs.map +1 -0
  76. package/dist/proto/rpc_pb.js +26 -72
  77. package/dist/proto/rpc_pb.js.map +1 -1
  78. package/dist/proto/stats_pb.cjs +256 -0
  79. package/dist/proto/stats_pb.cjs.map +1 -0
  80. package/dist/proto/stats_pb.js +175 -456
  81. package/dist/proto/stats_pb.js.map +1 -1
  82. package/dist/proto/track_pb.cjs +116 -0
  83. package/dist/proto/track_pb.cjs.map +1 -0
  84. package/dist/proto/track_pb.d.ts +3 -3
  85. package/dist/proto/track_pb.d.ts.map +1 -1
  86. package/dist/proto/track_pb.js +68 -174
  87. package/dist/proto/track_pb.js.map +1 -1
  88. package/dist/proto/video_frame_pb.cjs +161 -0
  89. package/dist/proto/video_frame_pb.cjs.map +1 -0
  90. package/dist/proto/video_frame_pb.d.ts +5 -5
  91. package/dist/proto/video_frame_pb.d.ts.map +1 -1
  92. package/dist/proto/video_frame_pb.js +103 -271
  93. package/dist/proto/video_frame_pb.js.map +1 -1
  94. package/dist/room.cjs +440 -0
  95. package/dist/room.cjs.map +1 -0
  96. package/dist/room.js +384 -373
  97. package/dist/room.js.map +1 -1
  98. package/dist/rpc.cjs +89 -0
  99. package/dist/rpc.cjs.map +1 -0
  100. package/dist/rpc.js +59 -63
  101. package/dist/rpc.js.map +1 -1
  102. package/dist/track.cjs +100 -0
  103. package/dist/track.cjs.map +1 -0
  104. package/dist/track.js +66 -62
  105. package/dist/track.js.map +1 -1
  106. package/dist/track_publication.cjs +106 -0
  107. package/dist/track_publication.cjs.map +1 -0
  108. package/dist/track_publication.js +76 -74
  109. package/dist/track_publication.js.map +1 -1
  110. package/dist/transcription.cjs +17 -0
  111. package/dist/transcription.cjs.map +1 -0
  112. package/dist/transcription.js +0 -1
  113. package/dist/transcription.js.map +1 -1
  114. package/dist/types.cjs +17 -0
  115. package/dist/types.cjs.map +1 -0
  116. package/dist/types.js +0 -1
  117. package/dist/types.js.map +1 -1
  118. package/dist/version.cjs +29 -0
  119. package/dist/version.cjs.map +1 -0
  120. package/dist/version.d.ts +1 -1
  121. package/dist/version.js +4 -1
  122. package/dist/version.js.map +1 -1
  123. package/dist/video_frame.cjs +242 -0
  124. package/dist/video_frame.cjs.map +1 -0
  125. package/dist/video_frame.js +212 -201
  126. package/dist/video_frame.js.map +1 -1
  127. package/dist/video_source.cjs +63 -0
  128. package/dist/video_source.cjs.map +1 -0
  129. package/dist/video_source.d.ts.map +1 -1
  130. package/dist/video_source.js +42 -37
  131. package/dist/video_source.js.map +1 -1
  132. package/dist/video_stream.cjs +103 -0
  133. package/dist/video_stream.cjs.map +1 -0
  134. package/dist/video_stream.js +76 -77
  135. package/dist/video_stream.js.map +1 -1
  136. package/package.json +18 -9
  137. package/src/audio_frame.ts +2 -2
  138. package/src/audio_source.ts +2 -2
  139. package/src/e2ee.ts +2 -2
  140. package/src/napi/native.d.ts +5 -5
  141. package/src/proto/audio_frame_pb.ts +12 -12
  142. package/src/proto/e2ee_pb.ts +1 -1
  143. package/src/proto/ffi_pb.ts +13 -13
  144. package/src/proto/handle_pb.ts +1 -1
  145. package/src/proto/participant_pb.ts +3 -3
  146. package/src/proto/room_pb.ts +24 -24
  147. package/src/proto/rpc_pb.ts +1 -1
  148. package/src/proto/stats_pb.ts +1 -1
  149. package/src/proto/track_pb.ts +7 -7
  150. package/src/proto/video_frame_pb.ts +9 -9
  151. package/src/version.ts +1 -1
  152. package/src/video_frame.ts +1 -1
  153. 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"]}