@livekit/rtc-node 0.12.2 → 0.13.1

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 (217) hide show
  1. package/dist/audio_frame.cjs +2 -2
  2. package/dist/audio_frame.cjs.map +1 -1
  3. package/dist/audio_frame.d.cts +2 -3
  4. package/dist/audio_frame.d.ts +2 -3
  5. package/dist/audio_frame.d.ts.map +1 -1
  6. package/dist/audio_frame.js +3 -3
  7. package/dist/audio_frame.js.map +1 -1
  8. package/dist/audio_resampler.cjs +10 -7
  9. package/dist/audio_resampler.cjs.map +1 -1
  10. package/dist/audio_resampler.d.cts +2 -3
  11. package/dist/audio_resampler.d.ts +2 -3
  12. package/dist/audio_resampler.d.ts.map +1 -1
  13. package/dist/audio_resampler.js +13 -10
  14. package/dist/audio_resampler.js.map +1 -1
  15. package/dist/audio_source.cjs +6 -4
  16. package/dist/audio_source.cjs.map +1 -1
  17. package/dist/audio_source.d.cts +3 -3
  18. package/dist/audio_source.d.ts +3 -3
  19. package/dist/audio_source.d.ts.map +1 -1
  20. package/dist/audio_source.js +9 -7
  21. package/dist/audio_source.js.map +1 -1
  22. package/dist/audio_stream.cjs +1 -2
  23. package/dist/audio_stream.cjs.map +1 -1
  24. package/dist/audio_stream.d.cts +2 -3
  25. package/dist/audio_stream.d.ts +2 -3
  26. package/dist/audio_stream.d.ts.map +1 -1
  27. package/dist/audio_stream.js +2 -3
  28. package/dist/audio_stream.js.map +1 -1
  29. package/dist/e2ee.cjs +19 -20
  30. package/dist/e2ee.cjs.map +1 -1
  31. package/dist/e2ee.d.cts +5 -6
  32. package/dist/e2ee.d.ts +5 -6
  33. package/dist/e2ee.d.ts.map +1 -1
  34. package/dist/e2ee.js +29 -30
  35. package/dist/e2ee.js.map +1 -1
  36. package/dist/ffi_client.cjs +6 -5
  37. package/dist/ffi_client.cjs.map +1 -1
  38. package/dist/ffi_client.d.cts +10 -10
  39. package/dist/ffi_client.d.ts +10 -10
  40. package/dist/ffi_client.d.ts.map +1 -1
  41. package/dist/ffi_client.js +6 -10
  42. package/dist/ffi_client.js.map +1 -1
  43. package/dist/index.cjs +16 -49
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.d.cts +6 -35
  46. package/dist/index.d.ts +6 -35
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +7 -46
  49. package/dist/index.js.map +1 -1
  50. package/dist/napi/native.d.cjs.map +1 -1
  51. package/dist/napi/native.d.ts +5 -5
  52. package/dist/native.d.ts +5 -5
  53. package/dist/participant.cjs +60 -36
  54. package/dist/participant.cjs.map +1 -1
  55. package/dist/participant.d.cts +11 -11
  56. package/dist/participant.d.ts +11 -11
  57. package/dist/participant.d.ts.map +1 -1
  58. package/dist/participant.js +78 -52
  59. package/dist/participant.js.map +1 -1
  60. package/dist/proto/audio_frame_pb.cjs +977 -125
  61. package/dist/proto/audio_frame_pb.cjs.map +1 -1
  62. package/dist/proto/audio_frame_pb.d.cts +502 -417
  63. package/dist/proto/audio_frame_pb.d.ts +502 -417
  64. package/dist/proto/audio_frame_pb.d.ts.map +1 -1
  65. package/dist/proto/audio_frame_pb.js +943 -85
  66. package/dist/proto/audio_frame_pb.js.map +1 -1
  67. package/dist/proto/e2ee_pb.cjs +700 -85
  68. package/dist/proto/e2ee_pb.cjs.map +1 -1
  69. package/dist/proto/e2ee_pb.d.cts +331 -263
  70. package/dist/proto/e2ee_pb.d.ts +331 -263
  71. package/dist/proto/e2ee_pb.d.ts.map +1 -1
  72. package/dist/proto/e2ee_pb.js +675 -57
  73. package/dist/proto/e2ee_pb.js.map +1 -1
  74. package/dist/proto/ffi_pb.cjs +369 -36
  75. package/dist/proto/ffi_pb.cjs.map +1 -1
  76. package/dist/proto/ffi_pb.d.cts +156 -109
  77. package/dist/proto/ffi_pb.d.ts +156 -109
  78. package/dist/proto/ffi_pb.d.ts.map +1 -1
  79. package/dist/proto/ffi_pb.js +364 -29
  80. package/dist/proto/ffi_pb.js.map +1 -1
  81. package/dist/proto/handle_pb.cjs +27 -7
  82. package/dist/proto/handle_pb.cjs.map +1 -1
  83. package/dist/proto/handle_pb.d.cts +13 -15
  84. package/dist/proto/handle_pb.d.ts +13 -15
  85. package/dist/proto/handle_pb.d.ts.map +1 -1
  86. package/dist/proto/handle_pb.js +26 -5
  87. package/dist/proto/handle_pb.js.map +1 -1
  88. package/dist/proto/participant_pb.cjs +112 -15
  89. package/dist/proto/participant_pb.cjs.map +1 -1
  90. package/dist/proto/participant_pb.d.cts +140 -52
  91. package/dist/proto/participant_pb.d.ts +140 -52
  92. package/dist/proto/participant_pb.d.ts.map +1 -1
  93. package/dist/proto/participant_pb.js +109 -11
  94. package/dist/proto/participant_pb.js.map +1 -1
  95. package/dist/proto/room_pb.cjs +2693 -302
  96. package/dist/proto/room_pb.cjs.map +1 -1
  97. package/dist/proto/room_pb.d.cts +1265 -862
  98. package/dist/proto/room_pb.d.ts +1265 -862
  99. package/dist/proto/room_pb.d.ts.map +1 -1
  100. package/dist/proto/room_pb.js +2603 -210
  101. package/dist/proto/room_pb.js.map +1 -1
  102. package/dist/proto/rpc_pb.cjs +302 -37
  103. package/dist/proto/rpc_pb.cjs.map +1 -1
  104. package/dist/proto/rpc_pb.d.cts +138 -108
  105. package/dist/proto/rpc_pb.d.ts +138 -108
  106. package/dist/proto/rpc_pb.d.ts.map +1 -1
  107. package/dist/proto/rpc_pb.js +291 -25
  108. package/dist/proto/rpc_pb.js.map +1 -1
  109. package/dist/proto/stats_pb.cjs +1253 -139
  110. package/dist/proto/stats_pb.cjs.map +1 -1
  111. package/dist/proto/stats_pb.d.cts +803 -692
  112. package/dist/proto/stats_pb.d.ts +803 -692
  113. package/dist/proto/stats_pb.d.ts.map +1 -1
  114. package/dist/proto/stats_pb.js +1216 -93
  115. package/dist/proto/stats_pb.js.map +1 -1
  116. package/dist/proto/track_pb.cjs +462 -64
  117. package/dist/proto/track_pb.cjs.map +1 -1
  118. package/dist/proto/track_pb.d.cts +250 -218
  119. package/dist/proto/track_pb.d.ts +250 -218
  120. package/dist/proto/track_pb.d.ts.map +1 -1
  121. package/dist/proto/track_pb.js +447 -45
  122. package/dist/proto/track_pb.js.map +1 -1
  123. package/dist/proto/track_publication_pb.cjs +130 -0
  124. package/dist/proto/track_publication_pb.cjs.map +1 -0
  125. package/dist/proto/track_publication_pb.d.cts +80 -0
  126. package/dist/proto/track_publication_pb.d.ts +80 -0
  127. package/dist/proto/track_publication_pb.d.ts.map +1 -0
  128. package/dist/proto/track_publication_pb.js +103 -0
  129. package/dist/proto/track_publication_pb.js.map +1 -0
  130. package/dist/proto/video_frame_pb.cjs +648 -88
  131. package/dist/proto/video_frame_pb.cjs.map +1 -1
  132. package/dist/proto/video_frame_pb.d.cts +371 -328
  133. package/dist/proto/video_frame_pb.d.ts +371 -328
  134. package/dist/proto/video_frame_pb.d.ts.map +1 -1
  135. package/dist/proto/video_frame_pb.js +626 -60
  136. package/dist/proto/video_frame_pb.js.map +1 -1
  137. package/dist/room.cjs +85 -125
  138. package/dist/room.cjs.map +1 -1
  139. package/dist/room.d.cts +6 -17
  140. package/dist/room.d.ts +6 -17
  141. package/dist/room.d.ts.map +1 -1
  142. package/dist/room.js +85 -123
  143. package/dist/room.js.map +1 -1
  144. package/dist/rpc.cjs.map +1 -1
  145. package/dist/rpc.d.cts +0 -1
  146. package/dist/rpc.d.ts +0 -1
  147. package/dist/rpc.js.map +1 -1
  148. package/dist/track.cjs +12 -8
  149. package/dist/track.cjs.map +1 -1
  150. package/dist/track.d.cts +8 -9
  151. package/dist/track.d.ts +8 -9
  152. package/dist/track.d.ts.map +1 -1
  153. package/dist/track.js +13 -9
  154. package/dist/track.js.map +1 -1
  155. package/dist/track_publication.cjs +21 -12
  156. package/dist/track_publication.cjs.map +1 -1
  157. package/dist/track_publication.d.cts +12 -13
  158. package/dist/track_publication.d.ts +12 -13
  159. package/dist/track_publication.d.ts.map +1 -1
  160. package/dist/track_publication.js +22 -13
  161. package/dist/track_publication.js.map +1 -1
  162. package/dist/version.cjs +1 -1
  163. package/dist/version.cjs.map +1 -1
  164. package/dist/version.d.cts +1 -1
  165. package/dist/version.d.ts +1 -1
  166. package/dist/version.js +1 -1
  167. package/dist/version.js.map +1 -1
  168. package/dist/video_frame.cjs +26 -45
  169. package/dist/video_frame.cjs.map +1 -1
  170. package/dist/video_frame.d.cts +2 -3
  171. package/dist/video_frame.d.ts +2 -3
  172. package/dist/video_frame.d.ts.map +1 -1
  173. package/dist/video_frame.js +29 -48
  174. package/dist/video_frame.js.map +1 -1
  175. package/dist/video_source.cjs +7 -4
  176. package/dist/video_source.cjs.map +1 -1
  177. package/dist/video_source.d.cts +4 -4
  178. package/dist/video_source.d.ts +4 -4
  179. package/dist/video_source.d.ts.map +1 -1
  180. package/dist/video_source.js +9 -6
  181. package/dist/video_source.js.map +1 -1
  182. package/dist/video_stream.cjs +16 -5
  183. package/dist/video_stream.cjs.map +1 -1
  184. package/dist/video_stream.d.cts +3 -4
  185. package/dist/video_stream.d.ts +3 -4
  186. package/dist/video_stream.d.ts.map +1 -1
  187. package/dist/video_stream.js +17 -6
  188. package/dist/video_stream.js.map +1 -1
  189. package/package.json +9 -9
  190. package/src/audio_frame.ts +10 -10
  191. package/src/audio_resampler.ts +15 -13
  192. package/src/audio_source.ts +11 -8
  193. package/src/audio_stream.ts +3 -4
  194. package/src/e2ee.ts +41 -42
  195. package/src/ffi_client.ts +8 -16
  196. package/src/index.ts +5 -68
  197. package/src/napi/native.d.ts +5 -5
  198. package/src/participant.ts +102 -73
  199. package/src/proto/audio_frame_pb.ts +1220 -496
  200. package/src/proto/e2ee_pb.ts +858 -337
  201. package/src/proto/ffi_pb.ts +442 -135
  202. package/src/proto/handle_pb.ts +33 -19
  203. package/src/proto/participant_pb.ts +225 -60
  204. package/src/proto/room_pb.ts +3149 -1013
  205. package/src/proto/rpc_pb.ts +358 -129
  206. package/src/proto/stats_pb.ts +1891 -877
  207. package/src/proto/track_pb.ts +587 -253
  208. package/src/proto/track_publication_pb.ts +180 -0
  209. package/src/proto/video_frame_pb.ts +861 -394
  210. package/src/room.ts +137 -189
  211. package/src/rpc.ts +1 -1
  212. package/src/track.ts +16 -17
  213. package/src/track_publication.ts +25 -26
  214. package/src/version.ts +1 -1
  215. package/src/video_frame.ts +48 -72
  216. package/src/video_source.ts +11 -8
  217. package/src/video_stream.ts +18 -8
@@ -1,24 +1,26 @@
1
- import { create } from "@bufbuild/protobuf";
2
1
  import { FfiClient, FfiHandle } from "./ffi_client.js";
3
2
  import {
4
- ChatMessageSchema,
5
- EditChatMessageRequestSchema,
6
- PublishDataRequestSchema,
7
- PublishSipDtmfRequestSchema,
8
- PublishTrackRequestSchema,
9
- PublishTranscriptionRequestSchema,
10
- SendChatMessageRequestSchema,
11
- SetLocalAttributesRequestSchema,
12
- SetLocalMetadataRequestSchema,
13
- SetLocalNameRequestSchema,
14
- UnpublishTrackRequestSchema
3
+ DisconnectReason
4
+ } from "./proto/participant_pb.js";
5
+ import { ChatMessage as ChatMessageModel } from "./proto/room_pb.js";
6
+ import {
7
+ EditChatMessageRequest,
8
+ TranscriptionSegment as ProtoTranscriptionSegment,
9
+ PublishDataRequest,
10
+ PublishSipDtmfRequest,
11
+ PublishTrackRequest,
12
+ PublishTranscriptionRequest,
13
+ SendChatMessageRequest,
14
+ SetLocalAttributesRequest,
15
+ SetLocalMetadataRequest,
16
+ SetLocalNameRequest,
17
+ UnpublishTrackRequest
15
18
  } from "./proto/room_pb.js";
16
- import { TranscriptionSegmentSchema } from "./proto/room_pb.js";
17
19
  import {
18
- PerformRpcRequestSchema,
19
- RegisterRpcMethodRequestSchema,
20
- RpcMethodInvocationResponseRequestSchema,
21
- UnregisterRpcMethodRequestSchema
20
+ PerformRpcRequest,
21
+ RegisterRpcMethodRequest,
22
+ RpcMethodInvocationResponseRequest,
23
+ UnregisterRpcMethodRequest
22
24
  } from "./proto/rpc_pb.js";
23
25
  import { RpcError } from "./rpc.js";
24
26
  import { LocalTrackPublication } from "./track_publication.js";
@@ -46,6 +48,12 @@ class Participant {
46
48
  get kind() {
47
49
  return this.info.kind;
48
50
  }
51
+ get disconnectReason() {
52
+ if (this.info.disconnectReason === DisconnectReason.UNKNOWN_REASON) {
53
+ return void 0;
54
+ }
55
+ return this.info.disconnectReason;
56
+ }
49
57
  }
50
58
  class LocalParticipant extends Participant {
51
59
  constructor() {
@@ -54,7 +62,7 @@ class LocalParticipant extends Participant {
54
62
  this.trackPublications = /* @__PURE__ */ new Map();
55
63
  }
56
64
  async publishData(data, options) {
57
- const req = create(PublishDataRequestSchema, {
65
+ const req = new PublishDataRequest({
58
66
  localParticipantHandle: this.ffi_handle.handle,
59
67
  dataPtr: FfiClient.instance.retrievePtr(data),
60
68
  dataLen: BigInt(data.byteLength),
@@ -73,7 +81,7 @@ class LocalParticipant extends Participant {
73
81
  }
74
82
  }
75
83
  async publishDtmf(code, digit) {
76
- const req = create(PublishSipDtmfRequestSchema, {
84
+ const req = new PublishSipDtmfRequest({
77
85
  localParticipantHandle: this.ffi_handle.handle,
78
86
  code,
79
87
  digit
@@ -89,11 +97,11 @@ class LocalParticipant extends Participant {
89
97
  }
90
98
  }
91
99
  async publishTranscription(transcription) {
92
- const req = create(PublishTranscriptionRequestSchema, {
100
+ const req = new PublishTranscriptionRequest({
93
101
  localParticipantHandle: this.ffi_handle.handle,
94
102
  participantIdentity: transcription.participantIdentity,
95
103
  segments: transcription.segments.map(
96
- (s) => create(TranscriptionSegmentSchema, {
104
+ (s) => new ProtoTranscriptionSegment({
97
105
  id: s.id,
98
106
  text: s.text,
99
107
  startTime: s.startTime,
@@ -115,7 +123,7 @@ class LocalParticipant extends Participant {
115
123
  }
116
124
  }
117
125
  async updateMetadata(metadata) {
118
- const req = create(SetLocalMetadataRequestSchema, {
126
+ const req = new SetLocalMetadataRequest({
119
127
  localParticipantHandle: this.ffi_handle.handle,
120
128
  metadata
121
129
  });
@@ -135,7 +143,7 @@ class LocalParticipant extends Participant {
135
143
  *
136
144
  */
137
145
  async sendChatMessage(text, destinationIdentities, senderIdentity) {
138
- const req = create(SendChatMessageRequestSchema, {
146
+ const req = new SendChatMessageRequest({
139
147
  localParticipantHandle: this.ffi_handle.handle,
140
148
  message: text,
141
149
  destinationIdentities,
@@ -147,20 +155,28 @@ class LocalParticipant extends Participant {
147
155
  const cb = await FfiClient.instance.waitFor((ev) => {
148
156
  return ev.message.case == "chatMessage" && ev.message.value.asyncId == res.asyncId;
149
157
  });
150
- if (cb.message.case !== "chatMessage") {
151
- throw new Error(cb.message.value ?? "Unknown Error");
158
+ switch (cb.message.case) {
159
+ case "chatMessage":
160
+ const { id, timestamp, editTimestamp, message } = cb.message.value;
161
+ return {
162
+ id,
163
+ timestamp: Number(timestamp),
164
+ editTimestamp: Number(editTimestamp),
165
+ message
166
+ };
167
+ case "error":
168
+ default:
169
+ throw new Error(cb.message.value);
152
170
  }
153
- const { id, timestamp, editTimestamp, message } = cb.message.value;
154
- return { id, timestamp: Number(timestamp), editTimestamp: Number(editTimestamp), message };
155
171
  }
156
172
  /**
157
173
  * @experimental
158
174
  */
159
175
  async editChatMessage(editText, originalMessage, destinationIdentities, senderIdentity) {
160
- const req = create(EditChatMessageRequestSchema, {
176
+ const req = new EditChatMessageRequest({
161
177
  localParticipantHandle: this.ffi_handle.handle,
162
178
  editText,
163
- originalMessage: create(ChatMessageSchema, {
179
+ originalMessage: new ChatMessageModel({
164
180
  ...originalMessage,
165
181
  timestamp: BigInt(originalMessage.timestamp),
166
182
  editTimestamp: originalMessage.editTimestamp ? BigInt(originalMessage.editTimestamp) : void 0
@@ -174,14 +190,22 @@ class LocalParticipant extends Participant {
174
190
  const cb = await FfiClient.instance.waitFor((ev) => {
175
191
  return ev.message.case == "chatMessage" && ev.message.value.asyncId == res.asyncId;
176
192
  });
177
- if (cb.message.case !== "chatMessage") {
178
- throw new Error(cb.message.value ?? "Unknown Error");
193
+ switch (cb.message.case) {
194
+ case "chatMessage":
195
+ const { id, timestamp, editTimestamp, message } = cb.message.value;
196
+ return {
197
+ id,
198
+ timestamp: Number(timestamp),
199
+ editTimestamp: Number(editTimestamp),
200
+ message
201
+ };
202
+ case "error":
203
+ default:
204
+ throw new Error(cb.message.value);
179
205
  }
180
- const { id, timestamp, editTimestamp, message } = cb.message.value;
181
- return { id, timestamp: Number(timestamp), editTimestamp: Number(editTimestamp), message };
182
206
  }
183
207
  async updateName(name) {
184
- const req = create(SetLocalNameRequestSchema, {
208
+ const req = new SetLocalNameRequest({
185
209
  localParticipantHandle: this.ffi_handle.handle,
186
210
  name
187
211
  });
@@ -193,11 +217,9 @@ class LocalParticipant extends Participant {
193
217
  });
194
218
  }
195
219
  async setAttributes(attributes) {
196
- const req = create(SetLocalAttributesRequestSchema, {
220
+ const req = new SetLocalAttributesRequest({
197
221
  localParticipantHandle: this.ffi_handle.handle,
198
- attributes: Array.from(Object.entries(attributes)).map(([key, value]) => {
199
- return { key, value };
200
- })
222
+ attributes: Object.entries(attributes).map(([key, value]) => ({ key, value }))
201
223
  });
202
224
  const res = FfiClient.instance.request({
203
225
  message: { case: "setLocalAttributes", value: req }
@@ -207,7 +229,7 @@ class LocalParticipant extends Participant {
207
229
  });
208
230
  }
209
231
  async publishTrack(track, options) {
210
- const req = create(PublishTrackRequestSchema, {
232
+ const req = new PublishTrackRequest({
211
233
  localParticipantHandle: this.ffi_handle.handle,
212
234
  trackHandle: track.ffi_handle.handle,
213
235
  options
@@ -218,18 +240,22 @@ class LocalParticipant extends Participant {
218
240
  const cb = await FfiClient.instance.waitFor((ev) => {
219
241
  return ev.message.case == "publishTrack" && ev.message.value.asyncId == res.asyncId;
220
242
  });
221
- if (cb.message.case !== "publication") {
222
- throw new Error(cb.message.value ?? "Unknown Error");
243
+ switch (cb.message.case) {
244
+ case "publication":
245
+ const track_publication = new LocalTrackPublication(cb.message.value);
246
+ track_publication.track = track;
247
+ this.trackPublications.set(track_publication.sid, track_publication);
248
+ return track_publication;
249
+ case "error":
250
+ default:
251
+ throw new Error(cb.message.value);
223
252
  }
224
- const track_publication = new LocalTrackPublication(cb.message.value);
225
- track_publication.track = track;
226
- this.trackPublications.set(track_publication.sid, track_publication);
227
- return track_publication;
228
253
  }
229
- async unpublishTrack(trackSid) {
230
- const req = create(UnpublishTrackRequestSchema, {
254
+ async unpublishTrack(trackSid, stopOnUnpublish) {
255
+ const req = new UnpublishTrackRequest({
231
256
  localParticipantHandle: this.ffi_handle.handle,
232
- trackSid
257
+ trackSid,
258
+ stopOnUnpublish: stopOnUnpublish ?? true
233
259
  });
234
260
  const res = FfiClient.instance.request({
235
261
  message: { case: "unpublishTrack", value: req }
@@ -258,7 +284,7 @@ class LocalParticipant extends Participant {
258
284
  payload,
259
285
  responseTimeout
260
286
  }) {
261
- const req = create(PerformRpcRequestSchema, {
287
+ const req = new PerformRpcRequest({
262
288
  localParticipantHandle: this.ffi_handle.handle,
263
289
  destinationIdentity,
264
290
  method,
@@ -306,7 +332,7 @@ class LocalParticipant extends Participant {
306
332
  */
307
333
  registerRpcMethod(method, handler) {
308
334
  this.rpcHandlers.set(method, handler);
309
- const req = create(RegisterRpcMethodRequestSchema, {
335
+ const req = new RegisterRpcMethodRequest({
310
336
  localParticipantHandle: this.ffi_handle.handle,
311
337
  method
312
338
  });
@@ -321,7 +347,7 @@ class LocalParticipant extends Participant {
321
347
  */
322
348
  unregisterRpcMethod(method) {
323
349
  this.rpcHandlers.delete(method);
324
- const req = create(UnregisterRpcMethodRequestSchema, {
350
+ const req = new UnregisterRpcMethodRequest({
325
351
  localParticipantHandle: this.ffi_handle.handle,
326
352
  method
327
353
  });
@@ -351,7 +377,7 @@ class LocalParticipant extends Participant {
351
377
  }
352
378
  }
353
379
  }
354
- const req = create(RpcMethodInvocationResponseRequestSchema, {
380
+ const req = new RpcMethodInvocationResponseRequest({
355
381
  localParticipantHandle: this.ffi_handle.handle,
356
382
  invocationId,
357
383
  error: responseError ? responseError.toProto() : void 0,
@@ -1 +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":[]}
1
+ {"version":3,"sources":["../src/participant.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { FfiClient, FfiHandle } from './ffi_client.js';\nimport {\n DisconnectReason,\n type OwnedParticipant,\n type ParticipantInfo,\n type ParticipantKind,\n} 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 { ChatMessage as ChatMessageModel } from './proto/room_pb.js';\nimport {\n EditChatMessageRequest,\n TranscriptionSegment as ProtoTranscriptionSegment,\n PublishDataRequest,\n PublishSipDtmfRequest,\n PublishTrackRequest,\n PublishTranscriptionRequest,\n SendChatMessageRequest,\n SetLocalAttributesRequest,\n SetLocalMetadataRequest,\n SetLocalNameRequest,\n UnpublishTrackRequest,\n} from './proto/room_pb.js';\nimport type {\n PerformRpcCallback,\n PerformRpcResponse,\n RegisterRpcMethodResponse,\n RpcMethodInvocationResponseResponse,\n UnregisterRpcMethodResponse,\n} from './proto/rpc_pb.js';\nimport {\n PerformRpcRequest,\n RegisterRpcMethodRequest,\n RpcMethodInvocationResponseRequest,\n UnregisterRpcMethodRequest,\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 | undefined {\n return this.info.sid;\n }\n\n get name(): string | undefined {\n return this.info.name;\n }\n\n get identity(): string | undefined {\n return this.info.identity;\n }\n\n get metadata(): string | undefined {\n return this.info.metadata;\n }\n\n get attributes(): Record<string, string> | undefined {\n return this.info.attributes;\n }\n\n get kind(): ParticipantKind | undefined {\n return this.info.kind;\n }\n\n get disconnectReason(): DisconnectReason | undefined {\n if (this.info.disconnectReason === DisconnectReason.UNKNOWN_REASON) {\n return undefined;\n }\n return this.info.disconnectReason;\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 = new PublishDataRequest({\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 = new PublishSipDtmfRequest({\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 = new PublishTranscriptionRequest({\n localParticipantHandle: this.ffi_handle.handle,\n participantIdentity: transcription.participantIdentity,\n segments: transcription.segments.map(\n (s) =>\n new ProtoTranscriptionSegment({\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 = new SetLocalMetadataRequest({\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 = new SendChatMessageRequest({\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 switch (cb.message.case) {\n case 'chatMessage':\n const { id, timestamp, editTimestamp, message } = cb.message.value!;\n return {\n id: id!,\n timestamp: Number(timestamp),\n editTimestamp: Number(editTimestamp),\n message: message!,\n };\n case 'error':\n default:\n throw new Error(cb.message.value);\n }\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 = new EditChatMessageRequest({\n localParticipantHandle: this.ffi_handle.handle,\n editText,\n originalMessage: new ChatMessageModel({\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 switch (cb.message.case) {\n case 'chatMessage':\n const { id, timestamp, editTimestamp, message } = cb.message.value!;\n return {\n id: id!,\n timestamp: Number(timestamp),\n editTimestamp: Number(editTimestamp),\n message: message!,\n };\n case 'error':\n default:\n throw new Error(cb.message.value);\n }\n }\n\n async updateName(name: string) {\n const req = new SetLocalNameRequest({\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 = new SetLocalAttributesRequest({\n localParticipantHandle: this.ffi_handle.handle,\n attributes: Object.entries(attributes).map(([key, value]) => ({ key, value })),\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 = new PublishTrackRequest({\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 switch (cb.message.case) {\n case 'publication':\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 case 'error':\n default:\n throw new Error(cb.message.value);\n }\n }\n\n async unpublishTrack(trackSid: string, stopOnUnpublish?: boolean) {\n const req = new UnpublishTrackRequest({\n localParticipantHandle: this.ffi_handle.handle,\n trackSid: trackSid,\n stopOnUnpublish: stopOnUnpublish ?? true,\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 = new PerformRpcRequest({\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 = new RegisterRpcMethodRequest({\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 = new UnregisterRpcMethodRequest({\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 = new RpcMethodInvocationResponseRequest({\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":"AAGA,SAAS,WAAW,iBAAiB;AACrC;AAAA,EACE;AAAA,OAIK;AAsBP,SAAS,eAAe,wBAAwB;AAChD;AAAA,EACE;AAAA,EACA,wBAAwB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAgC,gBAAwC;AAGxE,SAAS,6BAA6B;AAI/B,MAAe,YAAY;AAAA,EAShC,YAAY,YAA8B;AAF1C,6BAAoB,oBAAI,IAA8B;AAGpD,SAAK,OAAO,WAAY;AACxB,SAAK,aAAa,IAAI,UAAU,WAAW,OAAQ,EAAG;AAAA,EACxD;AAAA,EAEA,IAAI,MAA0B;AAC5B,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA,EAEA,IAAI,OAA2B;AAC7B,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA,EAEA,IAAI,WAA+B;AACjC,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA,EAEA,IAAI,WAA+B;AACjC,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA,EAEA,IAAI,aAAiD;AACnD,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA,EAEA,IAAI,OAAoC;AACtC,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA,EAEA,IAAI,mBAAiD;AACnD,QAAI,KAAK,KAAK,qBAAqB,iBAAiB,gBAAgB;AAClE,aAAO;AAAA,IACT;AACA,WAAO,KAAK,KAAK;AAAA,EACnB;AACF;AAkBO,MAAM,yBAAyB,YAAY;AAAA,EAA3C;AAAA;AACL,SAAQ,cAAyE,oBAAI,IAAI;AAEzF,6BAAwD,oBAAI,IAAI;AAAA;AAAA,EAEhE,MAAM,YAAY,MAAkB,SAA6B;AAC/D,UAAM,MAAM,IAAI,mBAAmB;AAAA,MACjC,wBAAwB,KAAK,WAAW;AAAA,MACxC,SAAS,UAAU,SAAS,YAAY,IAAI;AAAA,MAC5C,SAAS,OAAO,KAAK,UAAU;AAAA,MAC/B,UAAU,QAAQ;AAAA,MAClB,OAAO,QAAQ;AAAA,MACf,uBAAuB,QAAQ;AAAA,IACjC,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAA6B;AAAA,MAC1D,SAAS,EAAE,MAAM,eAAe,OAAO,IAAI;AAAA,IAC7C,CAAC;AAED,UAAM,KAAK,MAAM,UAAU,SAAS,QAA6B,CAAC,OAAO;AACvE,aAAO,GAAG,QAAQ,QAAQ,iBAAiB,GAAG,QAAQ,MAAM,WAAW,IAAI;AAAA,IAC7E,CAAC;AAED,QAAI,GAAG,OAAO;AACZ,YAAM,IAAI,MAAM,GAAG,KAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,MAAc,OAAe;AAC7C,UAAM,MAAM,IAAI,sBAAsB;AAAA,MACpC,wBAAwB,KAAK,WAAW;AAAA,MACxC;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAAgC;AAAA,MAC7D,SAAS,EAAE,MAAM,kBAAkB,OAAO,IAAI;AAAA,IAChD,CAAC;AAED,UAAM,KAAK,MAAM,UAAU,SAAS,QAAgC,CAAC,OAAO;AAC1E,aAAO,GAAG,QAAQ,QAAQ,oBAAoB,GAAG,QAAQ,MAAM,WAAW,IAAI;AAAA,IAChF,CAAC;AAED,QAAI,GAAG,OAAO;AACZ,YAAM,IAAI,MAAM,GAAG,KAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,qBAAqB,eAA8B;AACvD,UAAM,MAAM,IAAI,4BAA4B;AAAA,MAC1C,wBAAwB,KAAK,WAAW;AAAA,MACxC,qBAAqB,cAAc;AAAA,MACnC,UAAU,cAAc,SAAS;AAAA,QAC/B,CAAC,MACC,IAAI,0BAA0B;AAAA,UAC5B,IAAI,EAAE;AAAA,UACN,MAAM,EAAE;AAAA,UACR,WAAW,EAAE;AAAA,UACb,SAAS,EAAE;AAAA,UACX,OAAO,EAAE;AAAA,UACT,UAAU,EAAE;AAAA,QACd,CAAC;AAAA,MACL;AAAA,MACA,SAAS,cAAc;AAAA,IACzB,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAAsC;AAAA,MACnE,SAAS,EAAE,MAAM,wBAAwB,OAAO,IAAI;AAAA,IACtD,CAAC;AAED,UAAM,KAAK,MAAM,UAAU,SAAS,QAAsC,CAAC,OAAO;AAChF,aAAO,GAAG,QAAQ,QAAQ,0BAA0B,GAAG,QAAQ,MAAM,WAAW,IAAI;AAAA,IACtF,CAAC;AAED,QAAI,GAAG,OAAO;AACZ,YAAM,IAAI,MAAM,GAAG,KAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,UAAkB;AACrC,UAAM,MAAM,IAAI,wBAAwB;AAAA,MACtC,wBAAwB,KAAK,WAAW;AAAA,MACxC;AAAA,IACF,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAAkC;AAAA,MAC/D,SAAS,EAAE,MAAM,oBAAoB,OAAO,IAAI;AAAA,IAClD,CAAC;AAED,UAAM,UAAU,SAAS,QAAkC,CAAC,OAAO;AACjE,aAAO,GAAG,QAAQ,QAAQ,sBAAsB,GAAG,QAAQ,MAAM,WAAW,IAAI;AAAA,IAClF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,gBACJ,MACA,uBACA,gBACsB;AACtB,UAAM,MAAM,IAAI,uBAAuB;AAAA,MACrC,wBAAwB,KAAK,WAAW;AAAA,MACxC,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAAiC;AAAA,MAC9D,SAAS,EAAE,MAAM,mBAAmB,OAAO,IAAI;AAAA,IACjD,CAAC;AAED,UAAM,KAAK,MAAM,UAAU,SAAS,QAAiC,CAAC,OAAO;AAC3E,aAAO,GAAG,QAAQ,QAAQ,iBAAiB,GAAG,QAAQ,MAAM,WAAW,IAAI;AAAA,IAC7E,CAAC;AAED,YAAQ,GAAG,QAAQ,MAAM;AAAA,MACvB,KAAK;AACH,cAAM,EAAE,IAAI,WAAW,eAAe,QAAQ,IAAI,GAAG,QAAQ;AAC7D,eAAO;AAAA,UACL;AAAA,UACA,WAAW,OAAO,SAAS;AAAA,UAC3B,eAAe,OAAO,aAAa;AAAA,UACnC;AAAA,QACF;AAAA,MACF,KAAK;AAAA,MACL;AACE,cAAM,IAAI,MAAM,GAAG,QAAQ,KAAK;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,UACA,iBACA,uBACA,gBACsB;AACtB,UAAM,MAAM,IAAI,uBAAuB;AAAA,MACrC,wBAAwB,KAAK,WAAW;AAAA,MACxC;AAAA,MACA,iBAAiB,IAAI,iBAAiB;AAAA,QACpC,GAAG;AAAA,QACH,WAAW,OAAO,gBAAgB,SAAS;AAAA,QAC3C,eAAe,gBAAgB,gBAC3B,OAAO,gBAAgB,aAAa,IACpC;AAAA,MACN,CAAC;AAAA,MACD;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAAiC;AAAA,MAC9D,SAAS,EAAE,MAAM,mBAAmB,OAAO,IAAI;AAAA,IACjD,CAAC;AAED,UAAM,KAAK,MAAM,UAAU,SAAS,QAAiC,CAAC,OAAO;AAC3E,aAAO,GAAG,QAAQ,QAAQ,iBAAiB,GAAG,QAAQ,MAAM,WAAW,IAAI;AAAA,IAC7E,CAAC;AAED,YAAQ,GAAG,QAAQ,MAAM;AAAA,MACvB,KAAK;AACH,cAAM,EAAE,IAAI,WAAW,eAAe,QAAQ,IAAI,GAAG,QAAQ;AAC7D,eAAO;AAAA,UACL;AAAA,UACA,WAAW,OAAO,SAAS;AAAA,UAC3B,eAAe,OAAO,aAAa;AAAA,UACnC;AAAA,QACF;AAAA,MACF,KAAK;AAAA,MACL;AACE,cAAM,IAAI,MAAM,GAAG,QAAQ,KAAK;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAAc;AAC7B,UAAM,MAAM,IAAI,oBAAoB;AAAA,MAClC,wBAAwB,KAAK,WAAW;AAAA,MACxC;AAAA,IACF,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAA8B;AAAA,MAC3D,SAAS,EAAE,MAAM,gBAAgB,OAAO,IAAI;AAAA,IAC9C,CAAC;AAED,UAAM,UAAU,SAAS,QAA8B,CAAC,OAAO;AAC7D,aAAO,GAAG,QAAQ,QAAQ,kBAAkB,GAAG,QAAQ,MAAM,WAAW,IAAI;AAAA,IAC9E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAc,YAAoC;AACtD,UAAM,MAAM,IAAI,0BAA0B;AAAA,MACxC,wBAAwB,KAAK,WAAW;AAAA,MACxC,YAAY,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE;AAAA,IAC/E,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAAoC;AAAA,MACjE,SAAS,EAAE,MAAM,sBAAsB,OAAO,IAAI;AAAA,IACpD,CAAC;AAED,UAAM,UAAU,SAAS,QAAoC,CAAC,OAAO;AACnE,aAAO,GAAG,QAAQ,QAAQ,wBAAwB,GAAG,QAAQ,MAAM,WAAW,IAAI;AAAA,IACpF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aACJ,OACA,SACgC;AAChC,UAAM,MAAM,IAAI,oBAAoB;AAAA,MAClC,wBAAwB,KAAK,WAAW;AAAA,MACxC,aAAa,MAAM,WAAW;AAAA,MAC9B;AAAA,IACF,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAA8B;AAAA,MAC3D,SAAS,EAAE,MAAM,gBAAgB,OAAO,IAAI;AAAA,IAC9C,CAAC;AAED,UAAM,KAAK,MAAM,UAAU,SAAS,QAA8B,CAAC,OAAO;AACxE,aAAO,GAAG,QAAQ,QAAQ,kBAAkB,GAAG,QAAQ,MAAM,WAAW,IAAI;AAAA,IAC9E,CAAC;AAED,YAAQ,GAAG,QAAQ,MAAM;AAAA,MACvB,KAAK;AACH,cAAM,oBAAoB,IAAI,sBAAsB,GAAG,QAAQ,KAAM;AACrE,0BAAkB,QAAQ;AAC1B,aAAK,kBAAkB,IAAI,kBAAkB,KAAM,iBAAiB;AAEpE,eAAO;AAAA,MACT,KAAK;AAAA,MACL;AACE,cAAM,IAAI,MAAM,GAAG,QAAQ,KAAK;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,UAAkB,iBAA2B;AAChE,UAAM,MAAM,IAAI,sBAAsB;AAAA,MACpC,wBAAwB,KAAK,WAAW;AAAA,MACxC;AAAA,MACA,iBAAiB,mBAAmB;AAAA,IACtC,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAAgC;AAAA,MAC7D,SAAS,EAAE,MAAM,kBAAkB,OAAO,IAAI;AAAA,IAChD,CAAC;AAED,UAAM,KAAK,MAAM,UAAU,SAAS,QAAgC,CAAC,OAAO;AAC1E,aAAO,GAAG,QAAQ,QAAQ,oBAAoB,GAAG,QAAQ,MAAM,WAAW,IAAI;AAAA,IAChF,CAAC;AAED,QAAI,GAAG,OAAO;AACZ,YAAM,IAAI,MAAM,GAAG,KAAK;AAAA,IAC1B;AAEA,UAAM,MAAM,KAAK,kBAAkB,IAAI,QAAQ;AAC/C,QAAI,KAAK;AACP,UAAI,QAAQ;AAAA,IACd;AACA,SAAK,kBAAkB,OAAO,QAAQ;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAsC;AACpC,UAAM,MAAM,IAAI,kBAAkB;AAAA,MAChC,wBAAwB,KAAK,WAAW;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,MACA,mBAAmB;AAAA,IACrB,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAA4B;AAAA,MACzD,SAAS,EAAE,MAAM,cAAc,OAAO,IAAI;AAAA,IAC5C,CAAC;AAED,UAAM,KAAK,MAAM,UAAU,SAAS,QAA4B,CAAC,OAAO;AACtE,aAAO,GAAG,QAAQ,SAAS,gBAAgB,GAAG,QAAQ,MAAM,YAAY,IAAI;AAAA,IAC9E,CAAC;AAED,QAAI,GAAG,OAAO;AACZ,YAAM,SAAS,UAAU,GAAG,KAAK;AAAA,IACnC;AAEA,WAAO,GAAG;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,kBAAkB,QAAgB,SAAuD;AACvF,SAAK,YAAY,IAAI,QAAQ,OAAO;AAEpC,UAAM,MAAM,IAAI,yBAAyB;AAAA,MACvC,wBAAwB,KAAK,WAAW;AAAA,MACxC;AAAA,IACF,CAAC;AAED,cAAU,SAAS,QAAmC;AAAA,MACpD,SAAS,EAAE,MAAM,qBAAqB,OAAO,IAAI;AAAA,IACnD,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,oBAAoB,QAAgB;AAClC,SAAK,YAAY,OAAO,MAAM;AAE9B,UAAM,MAAM,IAAI,2BAA2B;AAAA,MACzC,wBAAwB,KAAK,WAAW;AAAA,MACxC;AAAA,IACF,CAAC;AAED,cAAU,SAAS,QAAqC;AAAA,MACtD,SAAS,EAAE,MAAM,uBAAuB,OAAO,IAAI;AAAA,IACrD,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,0BACJ,cACA,QACA,WACA,gBACA,SACA,iBACA;AACA,QAAI,gBAAiC;AACrC,QAAI,kBAAiC;AAErC,UAAM,UAAU,KAAK,YAAY,IAAI,MAAM;AAE3C,QAAI,CAAC,SAAS;AACZ,sBAAgB,SAAS,QAAQ,oBAAoB;AAAA,IACvD,OAAO;AACL,UAAI;AACF,0BAAkB,MAAM,QAAQ,EAAE,WAAW,gBAAgB,SAAS,gBAAgB,CAAC;AAAA,MACzF,SAAS,OAAO;AACd,YAAI,iBAAiB,UAAU;AAC7B,0BAAgB;AAAA,QAClB,OAAO;AACL,kBAAQ;AAAA,YACN,8CAA8C,MAAM;AAAA,YACpD;AAAA,UACF;AACA,0BAAgB,SAAS,QAAQ,mBAAmB;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,IAAI,mCAAmC;AAAA,MACjD,wBAAwB,KAAK,WAAW;AAAA,MACxC;AAAA,MACA,OAAO,gBAAgB,cAAc,QAAQ,IAAI;AAAA,MACjD,SAAS,mBAAmB;AAAA,IAC9B,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAA6C;AAAA,MAC1E,SAAS,EAAE,MAAM,+BAA+B,OAAO,IAAI;AAAA,IAC7D,CAAC;AAED,QAAI,IAAI,OAAO;AACb,cAAQ,KAAK,iDAAiD,IAAI,KAAK,EAAE;AAAA,IAC3E;AAAA,EACF;AACF;AAEO,MAAM,0BAA0B,YAAY;AAAA,EAGjD,YAAY,YAA8B;AACxC,UAAM,UAAU;AAHlB,6BAAyD,oBAAI,IAAI;AAAA,EAIjE;AACF;","names":[]}