@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.
- package/dist/audio_frame.cjs +94 -0
- package/dist/audio_frame.cjs.map +1 -0
- package/dist/audio_frame.js +64 -67
- package/dist/audio_frame.js.map +1 -1
- package/dist/audio_resampler.cjs +153 -0
- package/dist/audio_resampler.cjs.map +1 -0
- package/dist/audio_resampler.js +129 -134
- package/dist/audio_resampler.js.map +1 -1
- package/dist/audio_source.cjs +116 -0
- package/dist/audio_source.cjs.map +1 -0
- package/dist/audio_source.js +92 -85
- package/dist/audio_source.js.map +1 -1
- package/dist/audio_stream.cjs +104 -0
- package/dist/audio_stream.cjs.map +1 -0
- package/dist/audio_stream.js +77 -78
- package/dist/audio_stream.js.map +1 -1
- package/dist/e2ee.cjs +268 -0
- package/dist/e2ee.cjs.map +1 -0
- package/dist/e2ee.d.ts.map +1 -1
- package/dist/e2ee.js +244 -221
- package/dist/e2ee.js.map +1 -1
- package/dist/ffi_client.cjs +101 -0
- package/dist/ffi_client.cjs.map +1 -0
- package/dist/ffi_client.js +73 -48
- package/dist/ffi_client.js.map +1 -1
- package/dist/index.cjs +188 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +130 -48
- package/dist/index.js.map +1 -1
- package/dist/napi/native.d.cjs +17 -0
- package/dist/napi/native.d.cjs.map +1 -0
- package/dist/napi/native.d.js +1 -0
- package/dist/napi/native.d.js.map +1 -0
- package/dist/napi/native.d.ts +5 -5
- package/dist/native.cjs +301 -0
- package/dist/native.d.ts +19 -0
- package/dist/native.js +15 -0
- package/dist/participant.cjs +388 -0
- package/dist/participant.cjs.map +1 -0
- package/dist/participant.js +363 -339
- package/dist/participant.js.map +1 -1
- package/dist/proto/audio_frame_pb.cjs +193 -0
- package/dist/proto/audio_frame_pb.cjs.map +1 -0
- package/dist/proto/audio_frame_pb.d.ts +8 -8
- package/dist/proto/audio_frame_pb.d.ts.map +1 -1
- package/dist/proto/audio_frame_pb.js +122 -322
- package/dist/proto/audio_frame_pb.js.map +1 -1
- package/dist/proto/e2ee_pb.cjs +131 -0
- package/dist/proto/e2ee_pb.cjs.map +1 -0
- package/dist/proto/e2ee_pb.js +76 -202
- package/dist/proto/e2ee_pb.js.map +1 -1
- package/dist/proto/ffi_pb.cjs +76 -0
- package/dist/proto/ffi_pb.cjs.map +1 -0
- package/dist/proto/ffi_pb.d.ts +6 -6
- package/dist/proto/ffi_pb.d.ts.map +1 -1
- package/dist/proto/ffi_pb.js +39 -98
- package/dist/proto/ffi_pb.js.map +1 -1
- package/dist/proto/handle_pb.cjs +33 -0
- package/dist/proto/handle_pb.cjs.map +1 -0
- package/dist/proto/handle_pb.js +6 -22
- package/dist/proto/handle_pb.js.map +1 -1
- package/dist/proto/participant_pb.cjs +50 -0
- package/dist/proto/participant_pb.cjs.map +1 -0
- package/dist/proto/participant_pb.d.ts +1 -1
- package/dist/proto/participant_pb.d.ts.map +1 -1
- package/dist/proto/participant_pb.js +20 -58
- package/dist/proto/participant_pb.js.map +1 -1
- package/dist/proto/room_pb.cjs +370 -0
- package/dist/proto/room_pb.cjs.map +1 -0
- package/dist/proto/room_pb.d.ts +16 -16
- package/dist/proto/room_pb.d.ts.map +1 -1
- package/dist/proto/room_pb.js +245 -638
- package/dist/proto/room_pb.js.map +1 -1
- package/dist/proto/rpc_pb.cjs +63 -0
- package/dist/proto/rpc_pb.cjs.map +1 -0
- package/dist/proto/rpc_pb.js +26 -72
- package/dist/proto/rpc_pb.js.map +1 -1
- package/dist/proto/stats_pb.cjs +256 -0
- package/dist/proto/stats_pb.cjs.map +1 -0
- package/dist/proto/stats_pb.js +175 -456
- package/dist/proto/stats_pb.js.map +1 -1
- package/dist/proto/track_pb.cjs +116 -0
- package/dist/proto/track_pb.cjs.map +1 -0
- package/dist/proto/track_pb.d.ts +3 -3
- package/dist/proto/track_pb.d.ts.map +1 -1
- package/dist/proto/track_pb.js +68 -174
- package/dist/proto/track_pb.js.map +1 -1
- package/dist/proto/video_frame_pb.cjs +161 -0
- package/dist/proto/video_frame_pb.cjs.map +1 -0
- package/dist/proto/video_frame_pb.d.ts +5 -5
- package/dist/proto/video_frame_pb.d.ts.map +1 -1
- package/dist/proto/video_frame_pb.js +103 -271
- package/dist/proto/video_frame_pb.js.map +1 -1
- package/dist/room.cjs +440 -0
- package/dist/room.cjs.map +1 -0
- package/dist/room.js +384 -373
- package/dist/room.js.map +1 -1
- package/dist/rpc.cjs +89 -0
- package/dist/rpc.cjs.map +1 -0
- package/dist/rpc.js +59 -63
- package/dist/rpc.js.map +1 -1
- package/dist/track.cjs +100 -0
- package/dist/track.cjs.map +1 -0
- package/dist/track.js +66 -62
- package/dist/track.js.map +1 -1
- package/dist/track_publication.cjs +106 -0
- package/dist/track_publication.cjs.map +1 -0
- package/dist/track_publication.js +76 -74
- package/dist/track_publication.js.map +1 -1
- package/dist/transcription.cjs +17 -0
- package/dist/transcription.cjs.map +1 -0
- package/dist/transcription.js +0 -1
- package/dist/transcription.js.map +1 -1
- package/dist/types.cjs +17 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/dist/version.cjs +29 -0
- package/dist/version.cjs.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +4 -1
- package/dist/version.js.map +1 -1
- package/dist/video_frame.cjs +242 -0
- package/dist/video_frame.cjs.map +1 -0
- package/dist/video_frame.js +212 -201
- package/dist/video_frame.js.map +1 -1
- package/dist/video_source.cjs +63 -0
- package/dist/video_source.cjs.map +1 -0
- package/dist/video_source.d.ts.map +1 -1
- package/dist/video_source.js +42 -37
- package/dist/video_source.js.map +1 -1
- package/dist/video_stream.cjs +103 -0
- package/dist/video_stream.cjs.map +1 -0
- package/dist/video_stream.js +76 -77
- package/dist/video_stream.js.map +1 -1
- package/package.json +18 -9
- package/src/audio_frame.ts +2 -2
- package/src/audio_source.ts +2 -2
- package/src/e2ee.ts +2 -2
- package/src/napi/native.d.ts +5 -5
- package/src/proto/audio_frame_pb.ts +12 -12
- package/src/proto/e2ee_pb.ts +1 -1
- package/src/proto/ffi_pb.ts +13 -13
- package/src/proto/handle_pb.ts +1 -1
- package/src/proto/participant_pb.ts +3 -3
- package/src/proto/room_pb.ts +24 -24
- package/src/proto/rpc_pb.ts +1 -1
- package/src/proto/stats_pb.ts +1 -1
- package/src/proto/track_pb.ts +7 -7
- package/src/proto/video_frame_pb.ts +9 -9
- package/src/version.ts +1 -1
- package/src/video_frame.ts +1 -1
- package/src/video_source.ts +5 -1
package/dist/room.cjs
ADDED
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var room_exports = {};
|
|
30
|
+
__export(room_exports, {
|
|
31
|
+
ConnectError: () => ConnectError,
|
|
32
|
+
Room: () => Room,
|
|
33
|
+
RoomEvent: () => RoomEvent,
|
|
34
|
+
defaultRoomOptions: () => defaultRoomOptions,
|
|
35
|
+
defaultRtcConfiguration: () => defaultRtcConfiguration
|
|
36
|
+
});
|
|
37
|
+
module.exports = __toCommonJS(room_exports);
|
|
38
|
+
var import_protobuf = require("@bufbuild/protobuf");
|
|
39
|
+
var import_events = __toESM(require("events"), 1);
|
|
40
|
+
var import_e2ee = require("./e2ee.cjs");
|
|
41
|
+
var import_ffi_client = require("./ffi_client.cjs");
|
|
42
|
+
var import_participant = require("./participant.cjs");
|
|
43
|
+
var import_e2ee_pb = require("./proto/e2ee_pb.cjs");
|
|
44
|
+
var import_room_pb = require("./proto/room_pb.cjs");
|
|
45
|
+
var import_track_pb = require("./proto/track_pb.cjs");
|
|
46
|
+
var import_track = require("./track.cjs");
|
|
47
|
+
var import_track_publication = require("./track_publication.cjs");
|
|
48
|
+
const defaultRtcConfiguration = {
|
|
49
|
+
iceTransportType: import_room_pb.IceTransportType.TRANSPORT_ALL,
|
|
50
|
+
continualGatheringPolicy: import_room_pb.ContinualGatheringPolicy.GATHER_CONTINUALLY,
|
|
51
|
+
iceServers: []
|
|
52
|
+
};
|
|
53
|
+
const defaultRoomOptions = {
|
|
54
|
+
autoSubscribe: true,
|
|
55
|
+
dynacast: false,
|
|
56
|
+
e2ee: void 0,
|
|
57
|
+
rtcConfig: void 0,
|
|
58
|
+
adaptiveStream: false,
|
|
59
|
+
joinRetries: 1
|
|
60
|
+
};
|
|
61
|
+
class Room extends import_events.default {
|
|
62
|
+
constructor() {
|
|
63
|
+
super();
|
|
64
|
+
this.connectionState = import_room_pb.ConnectionState.CONN_DISCONNECTED;
|
|
65
|
+
this.remoteParticipants = /* @__PURE__ */ new Map();
|
|
66
|
+
this.onFfiEvent = (ffiEvent) => {
|
|
67
|
+
if (!this.localParticipant || !this.ffiHandle || !this.info) {
|
|
68
|
+
throw TypeError("cannot handle ffi events before connectCallback");
|
|
69
|
+
}
|
|
70
|
+
if (ffiEvent.message.case == "rpcMethodInvocation") {
|
|
71
|
+
if (ffiEvent.message.value.localParticipantHandle == this.localParticipant.ffi_handle.handle) {
|
|
72
|
+
this.localParticipant.handleRpcMethodInvocation(
|
|
73
|
+
ffiEvent.message.value.invocationId,
|
|
74
|
+
ffiEvent.message.value.method,
|
|
75
|
+
ffiEvent.message.value.requestId,
|
|
76
|
+
ffiEvent.message.value.callerIdentity,
|
|
77
|
+
ffiEvent.message.value.payload,
|
|
78
|
+
ffiEvent.message.value.responseTimeoutMs
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
} else if (ffiEvent.message.case != "roomEvent" || ffiEvent.message.value.roomHandle != this.ffiHandle.handle) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const ev = ffiEvent.message.value.message;
|
|
86
|
+
if (ev.case == "participantConnected") {
|
|
87
|
+
const participant = this.createRemoteParticipant(ev.value.info);
|
|
88
|
+
this.remoteParticipants.set(participant.identity, participant);
|
|
89
|
+
this.emit("participantConnected" /* ParticipantConnected */, participant);
|
|
90
|
+
} else if (ev.case == "participantDisconnected") {
|
|
91
|
+
const participant = this.remoteParticipants.get(ev.value.participantIdentity);
|
|
92
|
+
if (participant) {
|
|
93
|
+
this.remoteParticipants.delete(participant.identity);
|
|
94
|
+
this.emit("participantDisconnected" /* ParticipantDisconnected */, participant);
|
|
95
|
+
}
|
|
96
|
+
} else if (ev.case == "localTrackPublished") {
|
|
97
|
+
const publication = this.localParticipant.trackPublications.get(ev.value.trackSid);
|
|
98
|
+
if (!publication) {
|
|
99
|
+
throw new TypeError("local track publication not found");
|
|
100
|
+
}
|
|
101
|
+
this.emit("localTrackPublished" /* LocalTrackPublished */, publication, this.localParticipant);
|
|
102
|
+
} else if (ev.case == "localTrackUnpublished") {
|
|
103
|
+
const publication = this.localParticipant.trackPublications.get(ev.value.publicationSid);
|
|
104
|
+
this.localParticipant.trackPublications.delete(ev.value.publicationSid);
|
|
105
|
+
if (publication) {
|
|
106
|
+
this.emit("localTrackUnpublished" /* LocalTrackUnpublished */, publication, this.localParticipant);
|
|
107
|
+
}
|
|
108
|
+
} else if (ev.case == "localTrackSubscribed") {
|
|
109
|
+
const publication = this.localParticipant.trackPublications.get(ev.value.trackSid);
|
|
110
|
+
if (!publication) {
|
|
111
|
+
throw new TypeError("local track publication not found");
|
|
112
|
+
}
|
|
113
|
+
publication.resolveFirstSubscription();
|
|
114
|
+
this.emit("localTrackSubscribed" /* LocalTrackSubscribed */, publication.track);
|
|
115
|
+
} else if (ev.case == "trackPublished") {
|
|
116
|
+
const participant = this.requireRemoteParticipant(ev.value.participantIdentity);
|
|
117
|
+
const publication = new import_track_publication.RemoteTrackPublication(ev.value.publication);
|
|
118
|
+
participant.trackPublications.set(publication.sid, publication);
|
|
119
|
+
this.emit("trackPublished" /* TrackPublished */, publication, participant);
|
|
120
|
+
} else if (ev.case == "trackUnpublished") {
|
|
121
|
+
const participant = this.requireRemoteParticipant(ev.value.participantIdentity);
|
|
122
|
+
const publication = participant.trackPublications.get(ev.value.publicationSid);
|
|
123
|
+
participant.trackPublications.delete(ev.value.publicationSid);
|
|
124
|
+
if (publication) {
|
|
125
|
+
this.emit("trackUnpublished" /* TrackUnpublished */, publication, participant);
|
|
126
|
+
}
|
|
127
|
+
} else if (ev.case == "trackSubscribed") {
|
|
128
|
+
const ownedTrack = ev.value.track;
|
|
129
|
+
const trackInfo = ownedTrack.info;
|
|
130
|
+
const { participant, publication } = this.requirePublicationOfRemoteParticipant(
|
|
131
|
+
ev.value.participantIdentity,
|
|
132
|
+
trackInfo.sid
|
|
133
|
+
);
|
|
134
|
+
publication.subscribed = true;
|
|
135
|
+
if (trackInfo.kind == import_track_pb.TrackKind.KIND_VIDEO) {
|
|
136
|
+
publication.track = new import_track.RemoteVideoTrack(ownedTrack);
|
|
137
|
+
} else if (trackInfo.kind == import_track_pb.TrackKind.KIND_AUDIO) {
|
|
138
|
+
publication.track = new import_track.RemoteAudioTrack(ownedTrack);
|
|
139
|
+
}
|
|
140
|
+
this.emit("trackSubscribed" /* TrackSubscribed */, publication.track, publication, participant);
|
|
141
|
+
} else if (ev.case == "trackUnsubscribed") {
|
|
142
|
+
const { participant, publication } = this.requirePublicationOfRemoteParticipant(
|
|
143
|
+
ev.value.participantIdentity,
|
|
144
|
+
ev.value.trackSid
|
|
145
|
+
);
|
|
146
|
+
const track = publication.track;
|
|
147
|
+
publication.track = void 0;
|
|
148
|
+
publication.subscribed = false;
|
|
149
|
+
this.emit("trackUnsubscribed" /* TrackUnsubscribed */, track, publication, participant);
|
|
150
|
+
} else if (ev.case == "trackSubscriptionFailed") {
|
|
151
|
+
const participant = this.requireRemoteParticipant(ev.value.participantIdentity);
|
|
152
|
+
this.emit("trackSubscriptionFailed" /* TrackSubscriptionFailed */, ev.value.trackSid, participant, ev.value.error);
|
|
153
|
+
} else if (ev.case == "trackMuted") {
|
|
154
|
+
const { participant, publication } = this.requirePublicationOfParticipant(
|
|
155
|
+
ev.value.participantIdentity,
|
|
156
|
+
ev.value.trackSid
|
|
157
|
+
);
|
|
158
|
+
publication.info.muted = true;
|
|
159
|
+
if (publication.track) {
|
|
160
|
+
publication.track.info.muted = true;
|
|
161
|
+
}
|
|
162
|
+
this.emit("trackMuted" /* TrackMuted */, publication, participant);
|
|
163
|
+
} else if (ev.case == "trackUnmuted") {
|
|
164
|
+
const { participant, publication } = this.requirePublicationOfParticipant(
|
|
165
|
+
ev.value.participantIdentity,
|
|
166
|
+
ev.value.trackSid
|
|
167
|
+
);
|
|
168
|
+
publication.info.muted = false;
|
|
169
|
+
if (publication.track) {
|
|
170
|
+
publication.track.info.muted = false;
|
|
171
|
+
}
|
|
172
|
+
this.emit("trackUnmuted" /* TrackUnmuted */, publication, participant);
|
|
173
|
+
} else if (ev.case == "activeSpeakersChanged") {
|
|
174
|
+
const activeSpeakers = ev.value.participantIdentities.map(
|
|
175
|
+
(identity) => this.requireParticipantByIdentity(identity)
|
|
176
|
+
);
|
|
177
|
+
this.emit("activeSpeakersChanged" /* ActiveSpeakersChanged */, activeSpeakers);
|
|
178
|
+
} else if (ev.case == "roomMetadataChanged") {
|
|
179
|
+
this.info.metadata = ev.value.metadata;
|
|
180
|
+
this.emit("roomMetadataChanged" /* RoomMetadataChanged */, this.info.metadata);
|
|
181
|
+
} else if (ev.case == "participantMetadataChanged") {
|
|
182
|
+
const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);
|
|
183
|
+
participant.info.metadata = ev.value.metadata;
|
|
184
|
+
this.emit("participantMetadataChanged" /* ParticipantMetadataChanged */, participant.metadata, participant);
|
|
185
|
+
} else if (ev.case == "participantNameChanged") {
|
|
186
|
+
const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);
|
|
187
|
+
participant.info.name = ev.value.name;
|
|
188
|
+
this.emit("participantNameChanged" /* ParticipantNameChanged */, participant.name, participant);
|
|
189
|
+
} else if (ev.case == "participantAttributesChanged") {
|
|
190
|
+
const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);
|
|
191
|
+
participant.info.attributes = ev.value.attributes.reduce(
|
|
192
|
+
(acc, value) => {
|
|
193
|
+
acc[value.key] = value.value;
|
|
194
|
+
return acc;
|
|
195
|
+
},
|
|
196
|
+
{}
|
|
197
|
+
);
|
|
198
|
+
if (Object.keys(ev.value.changedAttributes).length > 0) {
|
|
199
|
+
const changedAttributes = ev.value.changedAttributes.reduce(
|
|
200
|
+
(acc, value) => {
|
|
201
|
+
acc[value.key] = value.value;
|
|
202
|
+
return acc;
|
|
203
|
+
},
|
|
204
|
+
{}
|
|
205
|
+
);
|
|
206
|
+
this.emit("participantAttributesChanged" /* ParticipantAttributesChanged */, changedAttributes, participant);
|
|
207
|
+
}
|
|
208
|
+
} else if (ev.case == "connectionQualityChanged") {
|
|
209
|
+
const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);
|
|
210
|
+
this.emit("connectionQualityChanged" /* ConnectionQualityChanged */, ev.value.quality, participant);
|
|
211
|
+
} else if (ev.case == "chatMessage") {
|
|
212
|
+
const participant = this.retrieveParticipantByIdentity(ev.value.participantIdentity);
|
|
213
|
+
const { id, message: messageText, timestamp, editTimestamp, generated } = ev.value.message;
|
|
214
|
+
const message = {
|
|
215
|
+
id,
|
|
216
|
+
message: messageText,
|
|
217
|
+
timestamp: Number(timestamp),
|
|
218
|
+
editTimestamp: Number(editTimestamp),
|
|
219
|
+
generated
|
|
220
|
+
};
|
|
221
|
+
this.emit("chatMessage" /* ChatMessage */, message, participant);
|
|
222
|
+
} else if (ev.case == "dataPacketReceived") {
|
|
223
|
+
const participant = this.remoteParticipants.get(ev.value.participantIdentity);
|
|
224
|
+
const dataPacket = ev.value.value;
|
|
225
|
+
switch (dataPacket.case) {
|
|
226
|
+
case "user":
|
|
227
|
+
const data = dataPacket.value.data.data;
|
|
228
|
+
const buffer = import_ffi_client.FfiClient.instance.copyBuffer(data.dataPtr, Number(data.dataLen));
|
|
229
|
+
new import_ffi_client.FfiHandle(dataPacket.value.data.handle.id).dispose();
|
|
230
|
+
this.emit(
|
|
231
|
+
"dataReceived" /* DataReceived */,
|
|
232
|
+
buffer,
|
|
233
|
+
participant,
|
|
234
|
+
ev.value.kind,
|
|
235
|
+
dataPacket.value.topic
|
|
236
|
+
);
|
|
237
|
+
break;
|
|
238
|
+
case "sipDtmf":
|
|
239
|
+
const { code, digit } = dataPacket.value;
|
|
240
|
+
this.emit("dtmfReceived" /* DtmfReceived */, code, digit, participant);
|
|
241
|
+
break;
|
|
242
|
+
default:
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
} else if (ev.case == "e2eeStateChanged") {
|
|
246
|
+
if (ev.value.state == import_e2ee_pb.EncryptionState.INTERNAL_ERROR) {
|
|
247
|
+
this.emit("encryptionError" /* EncryptionError */, new Error("internal server error"));
|
|
248
|
+
}
|
|
249
|
+
} else if (ev.case == "connectionStateChanged") {
|
|
250
|
+
this.connectionState = ev.value.state;
|
|
251
|
+
this.emit("connectionStateChanged" /* ConnectionStateChanged */, this.connectionState);
|
|
252
|
+
} else if (ev.case == "disconnected") {
|
|
253
|
+
this.emit("disconnected" /* Disconnected */, ev.value.reason);
|
|
254
|
+
} else if (ev.case == "reconnecting") {
|
|
255
|
+
this.emit("reconnecting" /* Reconnecting */);
|
|
256
|
+
} else if (ev.case == "reconnected") {
|
|
257
|
+
this.emit("reconnected" /* Reconnected */);
|
|
258
|
+
} else if (ev.case == "roomSidChanged") {
|
|
259
|
+
this.emit("roomSidChanged" /* RoomSidChanged */, ev.value.sid);
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
get name() {
|
|
264
|
+
var _a;
|
|
265
|
+
return (_a = this.info) == null ? void 0 : _a.name;
|
|
266
|
+
}
|
|
267
|
+
get metadata() {
|
|
268
|
+
var _a;
|
|
269
|
+
return (_a = this.info) == null ? void 0 : _a.metadata;
|
|
270
|
+
}
|
|
271
|
+
get isConnected() {
|
|
272
|
+
return this.ffiHandle != void 0 && this.connectionState != import_room_pb.ConnectionState.CONN_DISCONNECTED;
|
|
273
|
+
}
|
|
274
|
+
async getSid() {
|
|
275
|
+
if (!this.isConnected) {
|
|
276
|
+
return "";
|
|
277
|
+
}
|
|
278
|
+
if (this.info && this.info.sid !== "") {
|
|
279
|
+
return this.info.sid;
|
|
280
|
+
}
|
|
281
|
+
return new Promise((resolve, reject) => {
|
|
282
|
+
const handleRoomUpdate = (sid) => {
|
|
283
|
+
if (sid !== "") {
|
|
284
|
+
this.off("roomSidChanged" /* RoomSidChanged */, handleRoomUpdate);
|
|
285
|
+
resolve(sid);
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
this.on("roomSidChanged" /* RoomSidChanged */, handleRoomUpdate);
|
|
289
|
+
this.once("disconnected" /* Disconnected */, () => {
|
|
290
|
+
this.off("roomSidChanged" /* RoomSidChanged */, handleRoomUpdate);
|
|
291
|
+
reject("Room disconnected before room server id was available");
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
async connect(url, token, opts) {
|
|
296
|
+
const options = { ...defaultRoomOptions, ...opts };
|
|
297
|
+
const req = (0, import_protobuf.create)(import_room_pb.ConnectRequestSchema, {
|
|
298
|
+
url,
|
|
299
|
+
token,
|
|
300
|
+
options
|
|
301
|
+
});
|
|
302
|
+
const res = import_ffi_client.FfiClient.instance.request({
|
|
303
|
+
message: {
|
|
304
|
+
case: "connect",
|
|
305
|
+
value: req
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
const cb = await import_ffi_client.FfiClient.instance.waitFor((ev) => {
|
|
309
|
+
return ev.message.case == "connect" && ev.message.value.asyncId == res.asyncId;
|
|
310
|
+
});
|
|
311
|
+
if (cb.message.case !== "result") {
|
|
312
|
+
throw new ConnectError(cb.message.value ?? "Unknown error");
|
|
313
|
+
}
|
|
314
|
+
const { room, localParticipant, participants } = cb.message.value;
|
|
315
|
+
this.ffiHandle = new import_ffi_client.FfiHandle(room.handle.id);
|
|
316
|
+
if (options.e2ee) {
|
|
317
|
+
this.e2eeManager = new import_e2ee.E2EEManager(this.ffiHandle.handle, options.e2ee);
|
|
318
|
+
}
|
|
319
|
+
this.info = room.info;
|
|
320
|
+
this.connectionState = import_room_pb.ConnectionState.CONN_CONNECTED;
|
|
321
|
+
this.localParticipant = new import_participant.LocalParticipant(localParticipant);
|
|
322
|
+
for (const pt of participants) {
|
|
323
|
+
const rp = this.createRemoteParticipant(pt.participant);
|
|
324
|
+
for (const pub of pt.publications) {
|
|
325
|
+
const publication = new import_track_publication.RemoteTrackPublication(pub);
|
|
326
|
+
rp.trackPublications.set(publication.sid, publication);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
import_ffi_client.FfiClient.instance.on(import_ffi_client.FfiClientEvent.FfiEvent, this.onFfiEvent);
|
|
330
|
+
}
|
|
331
|
+
async disconnect() {
|
|
332
|
+
if (!this.isConnected || !this.ffiHandle) {
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
import_ffi_client.FfiClient.instance.request({
|
|
336
|
+
message: {
|
|
337
|
+
case: "disconnect",
|
|
338
|
+
value: {
|
|
339
|
+
roomHandle: this.ffiHandle.handle
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
import_ffi_client.FfiClient.instance.removeListener(import_ffi_client.FfiClientEvent.FfiEvent, this.onFfiEvent);
|
|
344
|
+
this.removeAllListeners();
|
|
345
|
+
}
|
|
346
|
+
retrieveParticipantByIdentity(identity) {
|
|
347
|
+
var _a;
|
|
348
|
+
if (((_a = this.localParticipant) == null ? void 0 : _a.identity) === identity) {
|
|
349
|
+
return this.localParticipant;
|
|
350
|
+
} else {
|
|
351
|
+
return this.remoteParticipants.get(identity);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
requireParticipantByIdentity(identity) {
|
|
355
|
+
var _a;
|
|
356
|
+
if (((_a = this.localParticipant) == null ? void 0 : _a.identity) === identity) {
|
|
357
|
+
return this.localParticipant;
|
|
358
|
+
} else if (this.remoteParticipants.has(identity)) {
|
|
359
|
+
return this.remoteParticipants.get(identity);
|
|
360
|
+
} else {
|
|
361
|
+
throw new TypeError(`participant ${identity} not found`);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
requireRemoteParticipant(identity) {
|
|
365
|
+
const participant = this.remoteParticipants.get(identity);
|
|
366
|
+
if (!participant) {
|
|
367
|
+
throw new TypeError(`participant ${identity} not found`);
|
|
368
|
+
}
|
|
369
|
+
return participant;
|
|
370
|
+
}
|
|
371
|
+
requirePublicationOfParticipant(identity, trackSid) {
|
|
372
|
+
const participant = this.requireParticipantByIdentity(identity);
|
|
373
|
+
const publication = participant.trackPublications.get(trackSid);
|
|
374
|
+
if (!publication) {
|
|
375
|
+
throw new TypeError(`publication ${trackSid} not found`);
|
|
376
|
+
}
|
|
377
|
+
return { participant, publication };
|
|
378
|
+
}
|
|
379
|
+
requirePublicationOfRemoteParticipant(identity, trackSid) {
|
|
380
|
+
const participant = this.requireRemoteParticipant(identity);
|
|
381
|
+
const publication = participant.trackPublications.get(trackSid);
|
|
382
|
+
if (!publication) {
|
|
383
|
+
throw new TypeError(`publication ${trackSid} not found`);
|
|
384
|
+
}
|
|
385
|
+
return { participant, publication };
|
|
386
|
+
}
|
|
387
|
+
createRemoteParticipant(ownedInfo) {
|
|
388
|
+
if (this.remoteParticipants.has(ownedInfo.info.identity)) {
|
|
389
|
+
throw new Error("Participant already exists");
|
|
390
|
+
}
|
|
391
|
+
const participant = new import_participant.RemoteParticipant(ownedInfo);
|
|
392
|
+
this.remoteParticipants.set(ownedInfo.info.identity, participant);
|
|
393
|
+
return participant;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
class ConnectError extends Error {
|
|
397
|
+
constructor(message) {
|
|
398
|
+
super(message);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
var RoomEvent = /* @__PURE__ */ ((RoomEvent2) => {
|
|
402
|
+
RoomEvent2["ParticipantConnected"] = "participantConnected";
|
|
403
|
+
RoomEvent2["ParticipantDisconnected"] = "participantDisconnected";
|
|
404
|
+
RoomEvent2["LocalTrackPublished"] = "localTrackPublished";
|
|
405
|
+
RoomEvent2["LocalTrackUnpublished"] = "localTrackUnpublished";
|
|
406
|
+
RoomEvent2["LocalTrackSubscribed"] = "localTrackSubscribed";
|
|
407
|
+
RoomEvent2["TrackPublished"] = "trackPublished";
|
|
408
|
+
RoomEvent2["TrackUnpublished"] = "trackUnpublished";
|
|
409
|
+
RoomEvent2["TrackSubscribed"] = "trackSubscribed";
|
|
410
|
+
RoomEvent2["TrackUnsubscribed"] = "trackUnsubscribed";
|
|
411
|
+
RoomEvent2["TrackSubscriptionFailed"] = "trackSubscriptionFailed";
|
|
412
|
+
RoomEvent2["TrackMuted"] = "trackMuted";
|
|
413
|
+
RoomEvent2["TrackUnmuted"] = "trackUnmuted";
|
|
414
|
+
RoomEvent2["ActiveSpeakersChanged"] = "activeSpeakersChanged";
|
|
415
|
+
RoomEvent2["RoomMetadataChanged"] = "roomMetadataChanged";
|
|
416
|
+
RoomEvent2["RoomSidChanged"] = "roomSidChanged";
|
|
417
|
+
RoomEvent2["ParticipantMetadataChanged"] = "participantMetadataChanged";
|
|
418
|
+
RoomEvent2["ParticipantNameChanged"] = "participantNameChanged";
|
|
419
|
+
RoomEvent2["ParticipantAttributesChanged"] = "participantAttributesChanged";
|
|
420
|
+
RoomEvent2["ConnectionQualityChanged"] = "connectionQualityChanged";
|
|
421
|
+
RoomEvent2["DataReceived"] = "dataReceived";
|
|
422
|
+
RoomEvent2["ChatMessage"] = "chatMessage";
|
|
423
|
+
RoomEvent2["DtmfReceived"] = "dtmfReceived";
|
|
424
|
+
RoomEvent2["EncryptionError"] = "encryptionError";
|
|
425
|
+
RoomEvent2["ConnectionStateChanged"] = "connectionStateChanged";
|
|
426
|
+
RoomEvent2["Connected"] = "connected";
|
|
427
|
+
RoomEvent2["Disconnected"] = "disconnected";
|
|
428
|
+
RoomEvent2["Reconnecting"] = "reconnecting";
|
|
429
|
+
RoomEvent2["Reconnected"] = "reconnected";
|
|
430
|
+
return RoomEvent2;
|
|
431
|
+
})(RoomEvent || {});
|
|
432
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
433
|
+
0 && (module.exports = {
|
|
434
|
+
ConnectError,
|
|
435
|
+
Room,
|
|
436
|
+
RoomEvent,
|
|
437
|
+
defaultRoomOptions,
|
|
438
|
+
defaultRtcConfiguration
|
|
439
|
+
});
|
|
440
|
+
//# sourceMappingURL=room.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/room.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { create } from '@bufbuild/protobuf';\nimport type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';\nimport EventEmitter from 'events';\nimport type { E2EEOptions } from './e2ee.js';\nimport { E2EEManager } from './e2ee.js';\nimport { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.js';\nimport type { Participant } from './participant.js';\nimport { LocalParticipant, RemoteParticipant } from './participant.js';\nimport { EncryptionState } from './proto/e2ee_pb.js';\nimport type { FfiEvent } from './proto/ffi_pb.js';\nimport type { OwnedParticipant } from './proto/participant_pb.js';\nimport type {\n ConnectCallback,\n ConnectResponse,\n ConnectionQuality,\n DataPacketKind,\n DisconnectReason,\n DisconnectResponse,\n RoomOptions as FfiRoomOptions,\n IceServer,\n RoomInfo,\n} from './proto/room_pb.js';\nimport {\n ConnectRequestSchema,\n ConnectionState,\n ContinualGatheringPolicy,\n IceTransportType,\n} from './proto/room_pb.js';\nimport { TrackKind } from './proto/track_pb.js';\nimport type { LocalTrack, RemoteTrack } from './track.js';\nimport { RemoteAudioTrack, RemoteVideoTrack } from './track.js';\nimport type { LocalTrackPublication, TrackPublication } from './track_publication.js';\nimport { RemoteTrackPublication } from './track_publication.js';\nimport type { ChatMessage } from './types.js';\n\nexport interface RtcConfiguration {\n iceTransportType: IceTransportType;\n continualGatheringPolicy: ContinualGatheringPolicy;\n iceServers: IceServer[];\n}\n\nexport const defaultRtcConfiguration: RtcConfiguration = {\n iceTransportType: IceTransportType.TRANSPORT_ALL,\n continualGatheringPolicy: ContinualGatheringPolicy.GATHER_CONTINUALLY,\n iceServers: [],\n};\n\nexport interface RoomOptions {\n autoSubscribe: boolean;\n dynacast: boolean;\n e2ee?: E2EEOptions;\n rtcConfig?: RtcConfiguration;\n}\n\nexport const defaultRoomOptions = {\n autoSubscribe: true,\n dynacast: false,\n e2ee: undefined,\n rtcConfig: undefined,\n adaptiveStream: false,\n joinRetries: 1,\n} satisfies Omit<FfiRoomOptions, '$typeName'>;\n\nexport class Room extends (EventEmitter as new () => TypedEmitter<RoomCallbacks>) {\n private info?: RoomInfo;\n private ffiHandle?: FfiHandle;\n\n e2eeManager?: E2EEManager;\n connectionState: ConnectionState = ConnectionState.CONN_DISCONNECTED;\n\n remoteParticipants: Map<string, RemoteParticipant> = new Map();\n localParticipant?: LocalParticipant;\n\n constructor() {\n super();\n }\n\n get name(): string | undefined {\n return this.info?.name;\n }\n\n get metadata(): string | undefined {\n return this.info?.metadata;\n }\n\n get isConnected(): boolean {\n return this.ffiHandle != undefined && this.connectionState != ConnectionState.CONN_DISCONNECTED;\n }\n\n async getSid(): Promise<string> {\n if (!this.isConnected) {\n return '';\n }\n if (this.info && this.info.sid !== '') {\n return this.info.sid;\n }\n return new Promise((resolve, reject) => {\n const handleRoomUpdate = (sid: string) => {\n if (sid !== '') {\n this.off(RoomEvent.RoomSidChanged, handleRoomUpdate);\n resolve(sid);\n }\n };\n this.on(RoomEvent.RoomSidChanged, handleRoomUpdate);\n this.once(RoomEvent.Disconnected, () => {\n this.off(RoomEvent.RoomSidChanged, handleRoomUpdate);\n reject('Room disconnected before room server id was available');\n });\n });\n }\n\n async connect(url: string, token: string, opts?: RoomOptions) {\n const options = { ...defaultRoomOptions, ...opts };\n\n const req = create(ConnectRequestSchema, {\n url: url,\n token: token,\n options,\n });\n\n const res = FfiClient.instance.request<ConnectResponse>({\n message: {\n case: 'connect',\n value: req,\n },\n });\n\n const cb = await FfiClient.instance.waitFor<ConnectCallback>((ev: FfiEvent) => {\n return ev.message.case == 'connect' && ev.message.value.asyncId == res.asyncId;\n });\n\n if (cb.message.case !== 'result') {\n throw new ConnectError(cb.message.value ?? 'Unknown error');\n }\n\n const { room, localParticipant, participants } = cb.message.value;\n\n this.ffiHandle = new FfiHandle(room!.handle!.id);\n if (options.e2ee) {\n this.e2eeManager = new E2EEManager(this.ffiHandle.handle, options.e2ee);\n }\n\n this.info = room!.info;\n this.connectionState = ConnectionState.CONN_CONNECTED;\n this.localParticipant = new LocalParticipant(localParticipant!);\n\n for (const pt of participants) {\n const rp = this.createRemoteParticipant(pt.participant!);\n\n for (const pub of pt.publications) {\n const publication = new RemoteTrackPublication(pub);\n rp.trackPublications.set(publication.sid, publication);\n }\n }\n\n FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onFfiEvent);\n }\n\n async disconnect() {\n if (!this.isConnected || !this.ffiHandle) {\n return;\n }\n\n FfiClient.instance.request<DisconnectResponse>({\n message: {\n case: 'disconnect',\n value: {\n roomHandle: this.ffiHandle.handle,\n },\n },\n });\n\n FfiClient.instance.removeListener(FfiClientEvent.FfiEvent, this.onFfiEvent);\n this.removeAllListeners();\n }\n\n private onFfiEvent = (ffiEvent: FfiEvent) => {\n if (!this.localParticipant || !this.ffiHandle || !this.info) {\n throw TypeError('cannot handle ffi events before connectCallback');\n }\n\n if (ffiEvent.message.case == 'rpcMethodInvocation') {\n if (\n ffiEvent.message.value.localParticipantHandle == this.localParticipant.ffi_handle.handle\n ) {\n this.localParticipant.handleRpcMethodInvocation(\n ffiEvent.message.value.invocationId,\n ffiEvent.message.value.method,\n ffiEvent.message.value.requestId,\n ffiEvent.message.value.callerIdentity,\n ffiEvent.message.value.payload,\n ffiEvent.message.value.responseTimeoutMs,\n );\n }\n return;\n } else if (\n ffiEvent.message.case != 'roomEvent' ||\n ffiEvent.message.value.roomHandle != this.ffiHandle.handle\n ) {\n return;\n }\n\n const ev = ffiEvent.message.value.message;\n if (ev.case == 'participantConnected') {\n const participant = this.createRemoteParticipant(ev.value.info!);\n this.remoteParticipants.set(participant.identity, participant);\n this.emit(RoomEvent.ParticipantConnected, participant);\n } else if (ev.case == 'participantDisconnected') {\n const participant = this.remoteParticipants.get(ev.value.participantIdentity);\n if (participant) {\n this.remoteParticipants.delete(participant.identity);\n this.emit(RoomEvent.ParticipantDisconnected, participant);\n }\n } else if (ev.case == 'localTrackPublished') {\n const publication = this.localParticipant.trackPublications.get(ev.value.trackSid);\n if (!publication) {\n throw new TypeError('local track publication not found');\n }\n this.emit(RoomEvent.LocalTrackPublished, publication, this.localParticipant);\n } else if (ev.case == 'localTrackUnpublished') {\n const publication = this.localParticipant.trackPublications.get(ev.value.publicationSid);\n this.localParticipant.trackPublications.delete(ev.value.publicationSid);\n if (publication) {\n this.emit(RoomEvent.LocalTrackUnpublished, publication, this.localParticipant);\n }\n } else if (ev.case == 'localTrackSubscribed') {\n const publication = this.localParticipant.trackPublications.get(ev.value.trackSid);\n if (!publication) {\n throw new TypeError('local track publication not found');\n }\n publication.resolveFirstSubscription();\n this.emit(RoomEvent.LocalTrackSubscribed, publication.track!);\n } else if (ev.case == 'trackPublished') {\n const participant = this.requireRemoteParticipant(ev.value.participantIdentity);\n const publication = new RemoteTrackPublication(ev.value.publication!);\n participant.trackPublications.set(publication.sid, publication);\n this.emit(RoomEvent.TrackPublished, publication, participant);\n } else if (ev.case == 'trackUnpublished') {\n const participant = this.requireRemoteParticipant(ev.value.participantIdentity);\n const publication = participant.trackPublications.get(ev.value.publicationSid);\n participant.trackPublications.delete(ev.value.publicationSid);\n if (publication) {\n this.emit(RoomEvent.TrackUnpublished, publication, participant);\n }\n } else if (ev.case == 'trackSubscribed') {\n const ownedTrack = ev.value.track!;\n const trackInfo = ownedTrack.info!;\n const { participant, publication } = this.requirePublicationOfRemoteParticipant(\n ev.value.participantIdentity,\n trackInfo.sid,\n );\n publication.subscribed = true;\n if (trackInfo.kind == TrackKind.KIND_VIDEO) {\n publication.track = new RemoteVideoTrack(ownedTrack);\n } else if (trackInfo.kind == TrackKind.KIND_AUDIO) {\n publication.track = new RemoteAudioTrack(ownedTrack);\n }\n\n this.emit(RoomEvent.TrackSubscribed, publication.track!, publication, participant);\n } else if (ev.case == 'trackUnsubscribed') {\n const { participant, publication } = this.requirePublicationOfRemoteParticipant(\n ev.value.participantIdentity,\n ev.value.trackSid,\n );\n const track = publication.track!;\n publication.track = undefined;\n publication.subscribed = false;\n this.emit(RoomEvent.TrackUnsubscribed, track, publication, participant);\n } else if (ev.case == 'trackSubscriptionFailed') {\n const participant = this.requireRemoteParticipant(ev.value.participantIdentity);\n this.emit(RoomEvent.TrackSubscriptionFailed, ev.value.trackSid, participant, ev.value.error);\n } else if (ev.case == 'trackMuted') {\n const { participant, publication } = this.requirePublicationOfParticipant(\n ev.value.participantIdentity,\n ev.value.trackSid,\n );\n publication.info.muted = true;\n if (publication.track) {\n publication.track.info.muted = true;\n }\n this.emit(RoomEvent.TrackMuted, publication, participant);\n } else if (ev.case == 'trackUnmuted') {\n const { participant, publication } = this.requirePublicationOfParticipant(\n ev.value.participantIdentity,\n ev.value.trackSid,\n );\n publication.info.muted = false;\n if (publication.track) {\n publication.track.info.muted = false;\n }\n this.emit(RoomEvent.TrackUnmuted, publication, participant);\n } else if (ev.case == 'activeSpeakersChanged') {\n const activeSpeakers = ev.value.participantIdentities.map((identity) =>\n this.requireParticipantByIdentity(identity),\n );\n this.emit(RoomEvent.ActiveSpeakersChanged, activeSpeakers);\n } else if (ev.case == 'roomMetadataChanged') {\n this.info.metadata = ev.value.metadata;\n this.emit(RoomEvent.RoomMetadataChanged, this.info.metadata);\n } else if (ev.case == 'participantMetadataChanged') {\n const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);\n participant.info.metadata = ev.value.metadata;\n this.emit(RoomEvent.ParticipantMetadataChanged, participant.metadata, participant);\n } else if (ev.case == 'participantNameChanged') {\n const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);\n participant.info.name = ev.value.name;\n this.emit(RoomEvent.ParticipantNameChanged, participant.name, participant);\n } else if (ev.case == 'participantAttributesChanged') {\n const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);\n participant.info.attributes = ev.value.attributes.reduce(\n (acc, value) => {\n acc[value.key] = value.value;\n return acc;\n },\n {} as Record<string, string>,\n );\n if (Object.keys(ev.value.changedAttributes).length > 0) {\n const changedAttributes = ev.value.changedAttributes.reduce(\n (acc, value) => {\n acc[value.key] = value.value;\n return acc;\n },\n {} as Record<string, string>,\n );\n this.emit(RoomEvent.ParticipantAttributesChanged, changedAttributes, participant);\n }\n } else if (ev.case == 'connectionQualityChanged') {\n const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);\n this.emit(RoomEvent.ConnectionQualityChanged, ev.value.quality, participant);\n } else if (ev.case == 'chatMessage') {\n const participant = this.retrieveParticipantByIdentity(ev.value.participantIdentity);\n const { id, message: messageText, timestamp, editTimestamp, generated } = ev.value.message!;\n const message: ChatMessage = {\n id,\n message: messageText,\n timestamp: Number(timestamp),\n editTimestamp: Number(editTimestamp),\n generated,\n };\n this.emit(RoomEvent.ChatMessage, message, participant);\n } else if (ev.case == 'dataPacketReceived') {\n // Can be undefined if the data is sent from a Server SDK\n const participant = this.remoteParticipants.get(ev.value.participantIdentity);\n const dataPacket = ev.value.value;\n switch (dataPacket.case) {\n case 'user':\n const data = dataPacket.value.data!.data!;\n const buffer = FfiClient.instance.copyBuffer(data.dataPtr, Number(data.dataLen));\n new FfiHandle(dataPacket.value.data!.handle!.id).dispose();\n this.emit(\n RoomEvent.DataReceived,\n buffer,\n participant,\n ev.value.kind,\n dataPacket.value.topic,\n );\n break;\n case 'sipDtmf':\n const { code, digit } = dataPacket.value;\n this.emit(RoomEvent.DtmfReceived, code, digit, participant);\n break;\n default:\n break;\n }\n } else if (ev.case == 'e2eeStateChanged') {\n if (ev.value.state == EncryptionState.INTERNAL_ERROR) {\n // throw generic error until Rust SDK is updated to supply the error alongside INTERNAL_ERROR\n this.emit(RoomEvent.EncryptionError, new Error('internal server error'));\n }\n } else if (ev.case == 'connectionStateChanged') {\n this.connectionState = ev.value.state;\n this.emit(RoomEvent.ConnectionStateChanged, this.connectionState);\n /*} else if (ev.case == 'connected') {\n this.emit(RoomEvent.Connected);*/\n } else if (ev.case == 'disconnected') {\n this.emit(RoomEvent.Disconnected, ev.value.reason);\n } else if (ev.case == 'reconnecting') {\n this.emit(RoomEvent.Reconnecting);\n } else if (ev.case == 'reconnected') {\n this.emit(RoomEvent.Reconnected);\n } else if (ev.case == 'roomSidChanged') {\n this.emit(RoomEvent.RoomSidChanged, ev.value.sid);\n }\n };\n\n private retrieveParticipantByIdentity(identity: string): Participant | undefined {\n if (this.localParticipant?.identity === identity) {\n return this.localParticipant;\n } else {\n return this.remoteParticipants.get(identity);\n }\n }\n\n private requireParticipantByIdentity(identity: string): Participant {\n if (this.localParticipant?.identity === identity) {\n return this.localParticipant;\n } else if (this.remoteParticipants.has(identity)) {\n return this.remoteParticipants.get(identity)!;\n } else {\n throw new TypeError(`participant ${identity} not found`);\n }\n }\n\n private requireRemoteParticipant(identity: string) {\n const participant = this.remoteParticipants.get(identity);\n if (!participant) {\n throw new TypeError(`participant ${identity} not found`);\n }\n return participant;\n }\n\n private requirePublicationOfParticipant(identity: string, trackSid: string) {\n const participant = this.requireParticipantByIdentity(identity);\n const publication = participant.trackPublications.get(trackSid);\n if (!publication) {\n throw new TypeError(`publication ${trackSid} not found`);\n }\n return { participant, publication };\n }\n\n private requirePublicationOfRemoteParticipant(identity: string, trackSid: string) {\n const participant = this.requireRemoteParticipant(identity);\n const publication = participant.trackPublications.get(trackSid);\n if (!publication) {\n throw new TypeError(`publication ${trackSid} not found`);\n }\n return { participant, publication };\n }\n\n private createRemoteParticipant(ownedInfo: OwnedParticipant) {\n if (this.remoteParticipants.has(ownedInfo.info!.identity)) {\n throw new Error('Participant already exists');\n }\n\n const participant = new RemoteParticipant(ownedInfo);\n this.remoteParticipants.set(ownedInfo.info!.identity, participant);\n return participant;\n }\n}\n\nexport class ConnectError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\nexport type RoomCallbacks = {\n participantConnected: (participant: RemoteParticipant) => void;\n participantDisconnected: (participant: RemoteParticipant) => void;\n localTrackPublished: (publication: LocalTrackPublication, participant: LocalParticipant) => void;\n localTrackUnpublished: (\n publication: LocalTrackPublication,\n participant: LocalParticipant,\n ) => void;\n localTrackSubscribed: (track: LocalTrack) => void;\n trackPublished: (publication: RemoteTrackPublication, participant: RemoteParticipant) => void;\n trackUnpublished: (publication: RemoteTrackPublication, participant: RemoteParticipant) => void;\n trackSubscribed: (\n track: RemoteTrack,\n publication: RemoteTrackPublication,\n participant: RemoteParticipant,\n ) => void;\n trackUnsubscribed: (\n track: RemoteTrack,\n publication: RemoteTrackPublication,\n participant: RemoteParticipant,\n ) => void;\n trackSubscriptionFailed: (\n trackSid: string,\n participant: RemoteParticipant,\n reason?: string,\n ) => void;\n trackMuted: (publication: TrackPublication, participant: Participant) => void;\n trackUnmuted: (publication: TrackPublication, participant: Participant) => void;\n activeSpeakersChanged: (speakers: Participant[]) => void;\n roomMetadataChanged: (metadata: string) => void;\n roomInfoUpdated: (info: RoomInfo) => void;\n participantMetadataChanged: (metadata: string | undefined, participant: Participant) => void;\n participantNameChanged: (name: string, participant: Participant) => void;\n participantAttributesChanged: (\n changedAttributes: Record<string, string>,\n participant: Participant,\n ) => void;\n connectionQualityChanged: (quality: ConnectionQuality, participant: Participant) => void;\n dataReceived: (\n payload: Uint8Array,\n participant?: RemoteParticipant,\n kind?: DataPacketKind,\n topic?: string,\n ) => void;\n chatMessage: (message: ChatMessage, participant?: Participant) => void;\n dtmfReceived: (code: number, digit: string, participant?: RemoteParticipant) => void;\n encryptionError: (error: Error) => void;\n connectionStateChanged: (state: ConnectionState) => void;\n connected: () => void;\n disconnected: (reason: DisconnectReason) => void;\n reconnecting: () => void;\n reconnected: () => void;\n roomSidChanged: (sid: string) => void;\n};\n\nexport enum RoomEvent {\n ParticipantConnected = 'participantConnected',\n ParticipantDisconnected = 'participantDisconnected',\n LocalTrackPublished = 'localTrackPublished',\n LocalTrackUnpublished = 'localTrackUnpublished',\n LocalTrackSubscribed = 'localTrackSubscribed',\n TrackPublished = 'trackPublished',\n TrackUnpublished = 'trackUnpublished',\n TrackSubscribed = 'trackSubscribed',\n TrackUnsubscribed = 'trackUnsubscribed',\n TrackSubscriptionFailed = 'trackSubscriptionFailed',\n TrackMuted = 'trackMuted',\n TrackUnmuted = 'trackUnmuted',\n ActiveSpeakersChanged = 'activeSpeakersChanged',\n RoomMetadataChanged = 'roomMetadataChanged',\n RoomSidChanged = 'roomSidChanged',\n ParticipantMetadataChanged = 'participantMetadataChanged',\n ParticipantNameChanged = 'participantNameChanged',\n ParticipantAttributesChanged = 'participantAttributesChanged',\n ConnectionQualityChanged = 'connectionQualityChanged',\n DataReceived = 'dataReceived',\n ChatMessage = 'chatMessage',\n DtmfReceived = 'dtmfReceived',\n EncryptionError = 'encryptionError',\n ConnectionStateChanged = 'connectionStateChanged',\n Connected = 'connected',\n Disconnected = 'disconnected',\n Reconnecting = 'reconnecting',\n Reconnected = 'reconnected',\n}\n"],"mappings":"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","names":["EventEmitter","RoomEvent"]}
|