@livekit/rtc-node 0.13.2 → 0.13.4
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/data_streams/index.cjs +25 -0
- package/dist/data_streams/index.cjs.map +1 -0
- package/dist/data_streams/index.d.cts +11 -0
- package/dist/data_streams/index.d.ts +11 -0
- package/dist/data_streams/index.d.ts.map +1 -0
- package/dist/data_streams/index.js +3 -0
- package/dist/data_streams/index.js.map +1 -0
- package/dist/data_streams/stream_reader.cjs +145 -0
- package/dist/data_streams/stream_reader.cjs.map +1 -0
- package/dist/data_streams/stream_reader.d.cts +10 -0
- package/dist/data_streams/stream_reader.d.ts +10 -0
- package/dist/data_streams/stream_reader.d.ts.map +1 -0
- package/dist/data_streams/stream_reader.js +120 -0
- package/dist/data_streams/stream_reader.js.map +1 -0
- package/dist/data_streams/stream_writer.cjs +51 -0
- package/dist/data_streams/stream_writer.cjs.map +1 -0
- package/dist/data_streams/stream_writer.d.cts +26 -0
- package/dist/data_streams/stream_writer.d.ts +26 -0
- package/dist/data_streams/stream_writer.d.ts.map +1 -0
- package/dist/data_streams/stream_writer.js +26 -0
- package/dist/data_streams/stream_writer.js.map +1 -0
- package/dist/data_streams/types.cjs +17 -0
- package/dist/data_streams/types.cjs.map +1 -0
- package/dist/data_streams/types.d.cts +10 -0
- package/dist/data_streams/types.d.ts +10 -0
- package/dist/data_streams/types.d.ts.map +1 -0
- package/dist/data_streams/types.js +1 -0
- package/dist/data_streams/types.js.map +1 -0
- package/dist/index.cjs +7 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/log.cjs +42 -0
- package/dist/log.cjs.map +1 -0
- package/dist/log.d.cts +7 -0
- package/dist/log.d.ts +7 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +18 -0
- package/dist/log.js.map +1 -0
- package/dist/napi/native.d.cjs.map +1 -1
- package/dist/napi/native.d.ts +5 -5
- package/dist/native.d.ts +5 -5
- package/dist/participant.cjs +260 -16
- package/dist/participant.cjs.map +1 -1
- package/dist/participant.d.cts +40 -6
- package/dist/participant.d.ts +40 -6
- package/dist/participant.d.ts.map +1 -1
- package/dist/participant.js +263 -5
- package/dist/participant.js.map +1 -1
- package/dist/proto/ffi_pb.cjs +14 -3
- package/dist/proto/ffi_pb.cjs.map +1 -1
- package/dist/proto/ffi_pb.d.cts +81 -7
- package/dist/proto/ffi_pb.d.ts +81 -7
- package/dist/proto/ffi_pb.d.ts.map +1 -1
- package/dist/proto/ffi_pb.js +15 -4
- package/dist/proto/ffi_pb.js.map +1 -1
- package/dist/proto/room_pb.cjs +488 -30
- package/dist/proto/room_pb.cjs.map +1 -1
- package/dist/proto/room_pb.d.cts +412 -50
- package/dist/proto/room_pb.d.ts +412 -50
- package/dist/proto/room_pb.d.ts.map +1 -1
- package/dist/proto/room_pb.js +471 -29
- package/dist/proto/room_pb.js.map +1 -1
- package/dist/proto/video_frame_pb.cjs.map +1 -1
- package/dist/proto/video_frame_pb.d.cts +3 -0
- package/dist/proto/video_frame_pb.d.ts +3 -0
- package/dist/proto/video_frame_pb.d.ts.map +1 -1
- package/dist/proto/video_frame_pb.js.map +1 -1
- package/dist/room.cjs +202 -45
- package/dist/room.cjs.map +1 -1
- package/dist/room.d.cts +21 -3
- package/dist/room.d.ts +21 -3
- package/dist/room.d.ts.map +1 -1
- package/dist/room.js +203 -45
- package/dist/room.js.map +1 -1
- package/dist/types-BWsKf9LP.d.cts +93 -0
- package/dist/types-Ca3IVRvo.d.ts +93 -0
- package/dist/utils.cjs +51 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +7 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +25 -0
- package/dist/utils.js.map +1 -0
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.cts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/video_frame.cjs +2 -0
- package/dist/video_frame.cjs.map +1 -1
- package/dist/video_frame.d.ts.map +1 -1
- package/dist/video_frame.js +2 -0
- package/dist/video_frame.js.map +1 -1
- package/package.json +9 -7
- package/src/data_streams/index.ts +7 -0
- package/src/data_streams/stream_reader.ts +166 -0
- package/src/data_streams/stream_writer.ts +36 -0
- package/src/data_streams/types.ts +61 -0
- package/src/index.ts +1 -0
- package/src/log.ts +25 -0
- package/src/napi/native.d.ts +5 -5
- package/src/participant.ts +351 -29
- package/src/proto/ffi_pb.ts +86 -1
- package/src/proto/room_pb.ts +788 -68
- package/src/proto/video_frame_pb.ts +3 -0
- package/src/room.ts +251 -68
- package/src/utils.ts +33 -0
- package/src/version.ts +1 -1
- package/src/video_frame.ts +2 -0
package/dist/room.d.ts
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { TypedEventEmitter } from '@livekit/typed-emitter';
|
|
2
|
-
import {
|
|
2
|
+
import { h as TextStreamHandler, g as ByteStreamHandler } from './types-Ca3IVRvo.js';
|
|
3
|
+
import { E2EEManager, E2EEOptions } from './e2ee.js';
|
|
3
4
|
import { RemoteParticipant, LocalParticipant, Participant } from './participant.js';
|
|
4
5
|
import { DisconnectReason } from './proto/participant_pb.js';
|
|
5
|
-
import { IceTransportType, ContinualGatheringPolicy, IceServer, RoomOptions as RoomOptions$1
|
|
6
|
+
import { RoomInfo, ConnectionQuality, DataPacketKind, ConnectionState, IceTransportType, ContinualGatheringPolicy, IceServer, RoomOptions as RoomOptions$1 } from './proto/room_pb.js';
|
|
6
7
|
import { LocalTrack, RemoteTrack } from './track.js';
|
|
7
8
|
import { LocalTrackPublication, RemoteTrackPublication, TrackPublication } from './track_publication.js';
|
|
8
9
|
import { ChatMessage } from './types.js';
|
|
10
|
+
import 'node:stream/web';
|
|
9
11
|
import './proto/e2ee_pb.js';
|
|
10
12
|
import '@bufbuild/protobuf';
|
|
13
|
+
import 'node:fs';
|
|
14
|
+
import './data_streams/stream_writer.js';
|
|
11
15
|
import './napi/native.d.js';
|
|
12
16
|
import './rpc.js';
|
|
13
17
|
import './proto/rpc_pb.js';
|
|
@@ -39,6 +43,10 @@ declare const Room_base: new () => TypedEventEmitter<RoomCallbacks>;
|
|
|
39
43
|
declare class Room extends Room_base {
|
|
40
44
|
private info?;
|
|
41
45
|
private ffiHandle?;
|
|
46
|
+
private byteStreamControllers;
|
|
47
|
+
private textStreamControllers;
|
|
48
|
+
private byteStreamHandlers;
|
|
49
|
+
private textStreamHandlers;
|
|
42
50
|
e2eeManager?: E2EEManager;
|
|
43
51
|
connectionState: ConnectionState;
|
|
44
52
|
remoteParticipants: Map<string, RemoteParticipant>;
|
|
@@ -47,9 +55,13 @@ declare class Room extends Room_base {
|
|
|
47
55
|
get name(): string | undefined;
|
|
48
56
|
get metadata(): string | undefined;
|
|
49
57
|
get isConnected(): boolean;
|
|
50
|
-
getSid(): Promise<string
|
|
58
|
+
getSid(): Promise<string>;
|
|
51
59
|
connect(url: string, token: string, opts?: RoomOptions): Promise<void>;
|
|
52
60
|
disconnect(): Promise<void>;
|
|
61
|
+
registerTextStreamHandler(topic: string, callback: TextStreamHandler): void;
|
|
62
|
+
unregisterTextStreamHandler(topic: string): void;
|
|
63
|
+
registerByteStreamHandler(topic: string, callback: ByteStreamHandler): void;
|
|
64
|
+
unregisterByteStreamHandler(topic: string): void;
|
|
53
65
|
private onFfiEvent;
|
|
54
66
|
private retrieveParticipantByIdentity;
|
|
55
67
|
private requireParticipantByIdentity;
|
|
@@ -57,6 +69,9 @@ declare class Room extends Room_base {
|
|
|
57
69
|
private requirePublicationOfParticipant;
|
|
58
70
|
private requirePublicationOfRemoteParticipant;
|
|
59
71
|
private createRemoteParticipant;
|
|
72
|
+
private handleStreamHeader;
|
|
73
|
+
private handleStreamChunk;
|
|
74
|
+
private handleStreamTrailer;
|
|
60
75
|
}
|
|
61
76
|
declare class ConnectError extends Error {
|
|
62
77
|
constructor(message: string);
|
|
@@ -76,6 +91,7 @@ type RoomCallbacks = {
|
|
|
76
91
|
trackUnmuted: (publication: TrackPublication, participant: Participant) => void;
|
|
77
92
|
activeSpeakersChanged: (speakers: Participant[]) => void;
|
|
78
93
|
roomMetadataChanged: (metadata: string) => void;
|
|
94
|
+
roomInfoUpdated: (info: RoomInfo) => void;
|
|
79
95
|
participantMetadataChanged: (metadata: string | undefined, participant: Participant) => void;
|
|
80
96
|
participantNameChanged: (name: string, participant: Participant) => void;
|
|
81
97
|
participantAttributesChanged: (changedAttributes: Record<string, string>, participant: Participant) => void;
|
|
@@ -89,6 +105,7 @@ type RoomCallbacks = {
|
|
|
89
105
|
disconnected: (reason: DisconnectReason) => void;
|
|
90
106
|
reconnecting: () => void;
|
|
91
107
|
reconnected: () => void;
|
|
108
|
+
roomSidChanged: (sid: string) => void;
|
|
92
109
|
};
|
|
93
110
|
declare enum RoomEvent {
|
|
94
111
|
ParticipantConnected = "participantConnected",
|
|
@@ -105,6 +122,7 @@ declare enum RoomEvent {
|
|
|
105
122
|
TrackUnmuted = "trackUnmuted",
|
|
106
123
|
ActiveSpeakersChanged = "activeSpeakersChanged",
|
|
107
124
|
RoomMetadataChanged = "roomMetadataChanged",
|
|
125
|
+
RoomSidChanged = "roomSidChanged",
|
|
108
126
|
ParticipantMetadataChanged = "participantMetadataChanged",
|
|
109
127
|
ParticipantNameChanged = "participantNameChanged",
|
|
110
128
|
ParticipantAttributesChanged = "participantAttributesChanged",
|
package/dist/room.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"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"}
|
package/dist/room.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import EventEmitter from "events";
|
|
2
|
+
import { ReadableStream } from "node:stream/web";
|
|
3
|
+
import { ByteStreamReader, TextStreamReader } from "./data_streams/stream_reader.js";
|
|
2
4
|
import { E2EEManager, defaultE2EEOptions } from "./e2ee.js";
|
|
3
5
|
import { FfiClient, FfiClientEvent, FfiHandle } from "./ffi_client.js";
|
|
6
|
+
import { log } from "./log.js";
|
|
4
7
|
import { LocalParticipant, RemoteParticipant } from "./participant.js";
|
|
5
8
|
import { EncryptionState } from "./proto/e2ee_pb.js";
|
|
6
9
|
import {
|
|
10
|
+
DataStream_Trailer,
|
|
7
11
|
RoomOptions as FfiRoomOptions
|
|
8
12
|
} from "./proto/room_pb.js";
|
|
9
13
|
import {
|
|
@@ -15,6 +19,7 @@ import {
|
|
|
15
19
|
import { TrackKind } from "./proto/track_pb.js";
|
|
16
20
|
import { RemoteAudioTrack, RemoteVideoTrack } from "./track.js";
|
|
17
21
|
import { RemoteTrackPublication } from "./track_publication.js";
|
|
22
|
+
import { bigIntToNumber } from "./utils.js";
|
|
18
23
|
const defaultRtcConfiguration = {
|
|
19
24
|
iceTransportType: IceTransportType.TRANSPORT_ALL,
|
|
20
25
|
continualGatheringPolicy: ContinualGatheringPolicy.GATHER_CONTINUALLY,
|
|
@@ -31,11 +36,29 @@ const defaultRoomOptions = new FfiRoomOptions({
|
|
|
31
36
|
class Room extends EventEmitter {
|
|
32
37
|
constructor() {
|
|
33
38
|
super();
|
|
39
|
+
this.byteStreamControllers = /* @__PURE__ */ new Map();
|
|
40
|
+
this.textStreamControllers = /* @__PURE__ */ new Map();
|
|
41
|
+
this.byteStreamHandlers = /* @__PURE__ */ new Map();
|
|
42
|
+
this.textStreamHandlers = /* @__PURE__ */ new Map();
|
|
34
43
|
this.connectionState = ConnectionState.CONN_DISCONNECTED;
|
|
35
44
|
this.remoteParticipants = /* @__PURE__ */ new Map();
|
|
36
45
|
this.onFfiEvent = (ffiEvent) => {
|
|
37
|
-
|
|
38
|
-
|
|
46
|
+
if (!this.localParticipant || !this.ffiHandle || !this.info) {
|
|
47
|
+
throw TypeError("cannot handle ffi events before connectCallback");
|
|
48
|
+
}
|
|
49
|
+
if (ffiEvent.message.case == "rpcMethodInvocation") {
|
|
50
|
+
if (ffiEvent.message.value.localParticipantHandle == this.localParticipant.ffi_handle.handle) {
|
|
51
|
+
this.localParticipant.handleRpcMethodInvocation(
|
|
52
|
+
ffiEvent.message.value.invocationId,
|
|
53
|
+
ffiEvent.message.value.method,
|
|
54
|
+
ffiEvent.message.value.requestId,
|
|
55
|
+
ffiEvent.message.value.callerIdentity,
|
|
56
|
+
ffiEvent.message.value.payload,
|
|
57
|
+
ffiEvent.message.value.responseTimeoutMs
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
return;
|
|
61
|
+
} else if (ffiEvent.message.case != "roomEvent" || ffiEvent.message.value.roomHandle != this.ffiHandle.handle) {
|
|
39
62
|
return;
|
|
40
63
|
}
|
|
41
64
|
const ev = ffiEvent.message.value.message;
|
|
@@ -64,46 +87,53 @@ class Room extends EventEmitter {
|
|
|
64
87
|
participant.trackPublications.set(publication.sid, publication);
|
|
65
88
|
this.emit("trackPublished" /* TrackPublished */, publication, participant);
|
|
66
89
|
} else if (ev.case == "trackUnpublished") {
|
|
67
|
-
const participant = this.
|
|
90
|
+
const participant = this.requireRemoteParticipant(ev.value.participantIdentity);
|
|
68
91
|
const publication = participant.trackPublications.get(ev.value.publicationSid);
|
|
69
92
|
participant.trackPublications.delete(ev.value.publicationSid);
|
|
70
|
-
|
|
93
|
+
if (publication) {
|
|
94
|
+
this.emit("trackUnpublished" /* TrackUnpublished */, publication, participant);
|
|
95
|
+
}
|
|
71
96
|
} else if (ev.case == "trackSubscribed") {
|
|
72
97
|
const ownedTrack = ev.value.track;
|
|
73
|
-
const
|
|
74
|
-
const publication =
|
|
98
|
+
const trackInfo = ownedTrack.info;
|
|
99
|
+
const { participant, publication } = this.requirePublicationOfRemoteParticipant(
|
|
100
|
+
ev.value.participantIdentity,
|
|
101
|
+
trackInfo.sid
|
|
102
|
+
);
|
|
75
103
|
publication.subscribed = true;
|
|
76
|
-
if (
|
|
104
|
+
if (trackInfo.kind == TrackKind.KIND_VIDEO) {
|
|
77
105
|
publication.track = new RemoteVideoTrack(ownedTrack);
|
|
78
|
-
} else if (
|
|
106
|
+
} else if (trackInfo.kind == TrackKind.KIND_AUDIO) {
|
|
79
107
|
publication.track = new RemoteAudioTrack(ownedTrack);
|
|
80
108
|
}
|
|
81
109
|
this.emit("trackSubscribed" /* TrackSubscribed */, publication.track, publication, participant);
|
|
82
110
|
} else if (ev.case == "trackUnsubscribed") {
|
|
83
|
-
const participant = this.
|
|
84
|
-
|
|
111
|
+
const { participant, publication } = this.requirePublicationOfRemoteParticipant(
|
|
112
|
+
ev.value.participantIdentity,
|
|
113
|
+
ev.value.trackSid
|
|
114
|
+
);
|
|
115
|
+
const track = publication.track;
|
|
85
116
|
publication.track = void 0;
|
|
86
117
|
publication.subscribed = false;
|
|
87
|
-
this.emit("trackUnsubscribed" /* TrackUnsubscribed */,
|
|
118
|
+
this.emit("trackUnsubscribed" /* TrackUnsubscribed */, track, publication, participant);
|
|
88
119
|
} else if (ev.case == "trackSubscriptionFailed") {
|
|
89
|
-
const participant = this.
|
|
90
|
-
this.emit(
|
|
91
|
-
"trackSubscriptionFailed" /* TrackSubscriptionFailed */,
|
|
92
|
-
ev.value.trackSid,
|
|
93
|
-
participant,
|
|
94
|
-
ev.value.error
|
|
95
|
-
);
|
|
120
|
+
const participant = this.requireRemoteParticipant(ev.value.participantIdentity);
|
|
121
|
+
this.emit("trackSubscriptionFailed" /* TrackSubscriptionFailed */, ev.value.trackSid, participant, ev.value.error);
|
|
96
122
|
} else if (ev.case == "trackMuted") {
|
|
97
|
-
const participant = this.
|
|
98
|
-
|
|
123
|
+
const { participant, publication } = this.requirePublicationOfParticipant(
|
|
124
|
+
ev.value.participantIdentity,
|
|
125
|
+
ev.value.trackSid
|
|
126
|
+
);
|
|
99
127
|
publication.info.muted = true;
|
|
100
128
|
if (publication.track) {
|
|
101
129
|
publication.track.info.muted = true;
|
|
102
130
|
}
|
|
103
131
|
this.emit("trackMuted" /* TrackMuted */, publication, participant);
|
|
104
132
|
} else if (ev.case == "trackUnmuted") {
|
|
105
|
-
const participant = this.
|
|
106
|
-
|
|
133
|
+
const { participant, publication } = this.requirePublicationOfParticipant(
|
|
134
|
+
ev.value.participantIdentity,
|
|
135
|
+
ev.value.trackSid
|
|
136
|
+
);
|
|
107
137
|
publication.info.muted = false;
|
|
108
138
|
if (publication.track) {
|
|
109
139
|
publication.track.info.muted = false;
|
|
@@ -111,47 +141,41 @@ class Room extends EventEmitter {
|
|
|
111
141
|
this.emit("trackUnmuted" /* TrackUnmuted */, publication, participant);
|
|
112
142
|
} else if (ev.case == "activeSpeakersChanged") {
|
|
113
143
|
const activeSpeakers = ev.value.participantIdentities.map(
|
|
114
|
-
(identity) => this.
|
|
115
|
-
);
|
|
116
|
-
this.emit(
|
|
117
|
-
"activeSpeakersChanged" /* ActiveSpeakersChanged */,
|
|
118
|
-
activeSpeakers.map((s) => s)
|
|
144
|
+
(identity) => this.requireParticipantByIdentity(identity)
|
|
119
145
|
);
|
|
146
|
+
this.emit("activeSpeakersChanged" /* ActiveSpeakersChanged */, activeSpeakers);
|
|
120
147
|
} else if (ev.case == "roomMetadataChanged") {
|
|
121
148
|
this.info.metadata = ev.value.metadata;
|
|
122
149
|
this.emit("roomMetadataChanged" /* RoomMetadataChanged */, this.info.metadata);
|
|
123
150
|
} else if (ev.case == "participantMetadataChanged") {
|
|
124
|
-
const participant = this.
|
|
151
|
+
const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);
|
|
125
152
|
participant.info.metadata = ev.value.metadata;
|
|
126
153
|
this.emit("participantMetadataChanged" /* ParticipantMetadataChanged */, participant.metadata, participant);
|
|
127
154
|
} else if (ev.case == "participantNameChanged") {
|
|
128
|
-
const participant = this.
|
|
155
|
+
const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);
|
|
129
156
|
participant.info.name = ev.value.name;
|
|
130
157
|
this.emit("participantNameChanged" /* ParticipantNameChanged */, participant.name, participant);
|
|
131
158
|
} else if (ev.case == "participantAttributesChanged") {
|
|
132
|
-
const participant = this.
|
|
159
|
+
const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);
|
|
133
160
|
participant.info.attributes = ev.value.attributes.reduce(
|
|
134
|
-
(
|
|
135
|
-
|
|
136
|
-
return
|
|
161
|
+
(acc, value) => {
|
|
162
|
+
acc[value.key] = value.value;
|
|
163
|
+
return acc;
|
|
137
164
|
},
|
|
138
165
|
{}
|
|
139
166
|
);
|
|
140
167
|
if (Object.keys(ev.value.changedAttributes).length > 0) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
},
|
|
148
|
-
{}
|
|
149
|
-
),
|
|
150
|
-
participant
|
|
168
|
+
const changedAttributes = ev.value.changedAttributes.reduce(
|
|
169
|
+
(acc, value) => {
|
|
170
|
+
acc[value.key] = value.value;
|
|
171
|
+
return acc;
|
|
172
|
+
},
|
|
173
|
+
{}
|
|
151
174
|
);
|
|
175
|
+
this.emit("participantAttributesChanged" /* ParticipantAttributesChanged */, changedAttributes, participant);
|
|
152
176
|
}
|
|
153
177
|
} else if (ev.case == "connectionQualityChanged") {
|
|
154
|
-
const participant = this.
|
|
178
|
+
const participant = this.requireParticipantByIdentity(ev.value.participantIdentity);
|
|
155
179
|
this.emit("connectionQualityChanged" /* ConnectionQualityChanged */, ev.value.quality, participant);
|
|
156
180
|
} else if (ev.case == "chatMessage") {
|
|
157
181
|
const participant = this.retrieveParticipantByIdentity(ev.value.participantIdentity);
|
|
@@ -202,6 +226,14 @@ class Room extends EventEmitter {
|
|
|
202
226
|
this.emit("reconnecting" /* Reconnecting */);
|
|
203
227
|
} else if (ev.case == "reconnected") {
|
|
204
228
|
this.emit("reconnected" /* Reconnected */);
|
|
229
|
+
} else if (ev.case == "roomSidChanged") {
|
|
230
|
+
this.emit("roomSidChanged" /* RoomSidChanged */, ev.value.sid);
|
|
231
|
+
} else if (ev.case === "streamHeaderReceived" && ev.value.header) {
|
|
232
|
+
this.handleStreamHeader(ev.value.header, ev.value.participantIdentity);
|
|
233
|
+
} else if (ev.case === "streamChunkReceived" && ev.value.chunk) {
|
|
234
|
+
this.handleStreamChunk(ev.value.chunk);
|
|
235
|
+
} else if (ev.case === "streamTrailerReceived" && ev.value.trailer) {
|
|
236
|
+
this.handleStreamTrailer(ev.value.trailer);
|
|
205
237
|
}
|
|
206
238
|
};
|
|
207
239
|
}
|
|
@@ -218,7 +250,25 @@ class Room extends EventEmitter {
|
|
|
218
250
|
}
|
|
219
251
|
async getSid() {
|
|
220
252
|
var _a;
|
|
221
|
-
|
|
253
|
+
if (!this.isConnected) {
|
|
254
|
+
return "";
|
|
255
|
+
}
|
|
256
|
+
if (((_a = this.info) == null ? void 0 : _a.sid) && this.info.sid !== "") {
|
|
257
|
+
return this.info.sid;
|
|
258
|
+
}
|
|
259
|
+
return new Promise((resolve, reject) => {
|
|
260
|
+
const handleRoomUpdate = (sid) => {
|
|
261
|
+
if (sid !== "") {
|
|
262
|
+
this.off("roomSidChanged" /* RoomSidChanged */, handleRoomUpdate);
|
|
263
|
+
resolve(sid);
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
this.on("roomSidChanged" /* RoomSidChanged */, handleRoomUpdate);
|
|
267
|
+
this.once("disconnected" /* Disconnected */, () => {
|
|
268
|
+
this.off("roomSidChanged" /* RoomSidChanged */, handleRoomUpdate);
|
|
269
|
+
reject("Room disconnected before room server id was available");
|
|
270
|
+
});
|
|
271
|
+
});
|
|
222
272
|
}
|
|
223
273
|
async connect(url, token, opts) {
|
|
224
274
|
const options = { ...defaultRoomOptions, ...opts };
|
|
@@ -274,6 +324,24 @@ class Room extends EventEmitter {
|
|
|
274
324
|
FfiClient.instance.removeListener(FfiClientEvent.FfiEvent, this.onFfiEvent);
|
|
275
325
|
this.removeAllListeners();
|
|
276
326
|
}
|
|
327
|
+
registerTextStreamHandler(topic, callback) {
|
|
328
|
+
if (this.textStreamHandlers.has(topic)) {
|
|
329
|
+
throw new Error(`A text stream handler for topic "${topic}" has already been set.`);
|
|
330
|
+
}
|
|
331
|
+
this.textStreamHandlers.set(topic, callback);
|
|
332
|
+
}
|
|
333
|
+
unregisterTextStreamHandler(topic) {
|
|
334
|
+
this.textStreamHandlers.delete(topic);
|
|
335
|
+
}
|
|
336
|
+
registerByteStreamHandler(topic, callback) {
|
|
337
|
+
if (this.byteStreamHandlers.has(topic)) {
|
|
338
|
+
throw new Error(`A byte stream handler for topic "${topic}" has already been set.`);
|
|
339
|
+
}
|
|
340
|
+
this.byteStreamHandlers.set(topic, callback);
|
|
341
|
+
}
|
|
342
|
+
unregisterByteStreamHandler(topic) {
|
|
343
|
+
this.byteStreamHandlers.delete(topic);
|
|
344
|
+
}
|
|
277
345
|
retrieveParticipantByIdentity(identity) {
|
|
278
346
|
var _a;
|
|
279
347
|
if (((_a = this.localParticipant) == null ? void 0 : _a.identity) === identity) {
|
|
@@ -323,6 +391,95 @@ class Room extends EventEmitter {
|
|
|
323
391
|
this.remoteParticipants.set(ownedInfo.info.identity, participant);
|
|
324
392
|
return participant;
|
|
325
393
|
}
|
|
394
|
+
handleStreamHeader(streamHeader, participantIdentity) {
|
|
395
|
+
if (streamHeader.contentHeader.case === "byteHeader") {
|
|
396
|
+
const streamHandlerCallback = this.byteStreamHandlers.get(streamHeader.topic ?? "");
|
|
397
|
+
if (!streamHandlerCallback) {
|
|
398
|
+
log.debug("ignoring incoming byte stream due to no handler for topic", streamHeader.topic);
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
let streamController;
|
|
402
|
+
const stream = new ReadableStream({
|
|
403
|
+
start: (controller) => {
|
|
404
|
+
streamController = controller;
|
|
405
|
+
this.byteStreamControllers.set(streamHeader.streamId, {
|
|
406
|
+
header: streamHeader,
|
|
407
|
+
controller: streamController,
|
|
408
|
+
startTime: Date.now()
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
});
|
|
412
|
+
const info = {
|
|
413
|
+
streamId: streamHeader.streamId,
|
|
414
|
+
name: streamHeader.contentHeader.value.name ?? "unknown",
|
|
415
|
+
mimeType: streamHeader.mimeType,
|
|
416
|
+
totalSize: streamHeader.totalLength ? Number(streamHeader.totalLength) : void 0,
|
|
417
|
+
topic: streamHeader.topic,
|
|
418
|
+
timestamp: bigIntToNumber(streamHeader.timestamp),
|
|
419
|
+
attributes: streamHeader.attributes
|
|
420
|
+
};
|
|
421
|
+
streamHandlerCallback(
|
|
422
|
+
new ByteStreamReader(info, stream, bigIntToNumber(streamHeader.totalLength)),
|
|
423
|
+
{ identity: participantIdentity }
|
|
424
|
+
);
|
|
425
|
+
} else if (streamHeader.contentHeader.case === "textHeader") {
|
|
426
|
+
const streamHandlerCallback = this.textStreamHandlers.get(streamHeader.topic ?? "");
|
|
427
|
+
if (!streamHandlerCallback) {
|
|
428
|
+
log.debug("ignoring incoming text stream due to no handler for topic", streamHeader.topic);
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
let streamController;
|
|
432
|
+
const stream = new ReadableStream({
|
|
433
|
+
start: (controller) => {
|
|
434
|
+
streamController = controller;
|
|
435
|
+
this.textStreamControllers.set(streamHeader.streamId, {
|
|
436
|
+
header: streamHeader,
|
|
437
|
+
controller: streamController,
|
|
438
|
+
startTime: Date.now()
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
const info = {
|
|
443
|
+
streamId: streamHeader.streamId,
|
|
444
|
+
mimeType: streamHeader.mimeType,
|
|
445
|
+
totalSize: streamHeader.totalLength ? Number(streamHeader.totalLength) : void 0,
|
|
446
|
+
topic: streamHeader.topic,
|
|
447
|
+
timestamp: Number(streamHeader.timestamp),
|
|
448
|
+
attributes: streamHeader.attributes
|
|
449
|
+
};
|
|
450
|
+
streamHandlerCallback(
|
|
451
|
+
new TextStreamReader(info, stream, bigIntToNumber(streamHeader.totalLength)),
|
|
452
|
+
{ identity: participantIdentity }
|
|
453
|
+
);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
handleStreamChunk(chunk) {
|
|
457
|
+
const fileBuffer = this.byteStreamControllers.get(chunk.streamId);
|
|
458
|
+
if (fileBuffer) {
|
|
459
|
+
if (chunk.content.length > 0) {
|
|
460
|
+
fileBuffer.controller.enqueue(chunk);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
const textBuffer = this.textStreamControllers.get(chunk.streamId);
|
|
464
|
+
if (textBuffer) {
|
|
465
|
+
if (chunk.content.length > 0) {
|
|
466
|
+
textBuffer.controller.enqueue(chunk);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
handleStreamTrailer(trailer) {
|
|
471
|
+
const streamId = trailer.streamId;
|
|
472
|
+
const fileBuffer = this.byteStreamControllers.get(streamId);
|
|
473
|
+
if (fileBuffer) {
|
|
474
|
+
fileBuffer.controller.close();
|
|
475
|
+
this.byteStreamControllers.delete(streamId);
|
|
476
|
+
}
|
|
477
|
+
const textBuffer = this.textStreamControllers.get(streamId);
|
|
478
|
+
if (textBuffer) {
|
|
479
|
+
textBuffer.controller.close();
|
|
480
|
+
this.byteStreamControllers.delete(streamId);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
326
483
|
}
|
|
327
484
|
class ConnectError extends Error {
|
|
328
485
|
constructor(message) {
|
|
@@ -344,6 +501,7 @@ var RoomEvent = /* @__PURE__ */ ((RoomEvent2) => {
|
|
|
344
501
|
RoomEvent2["TrackUnmuted"] = "trackUnmuted";
|
|
345
502
|
RoomEvent2["ActiveSpeakersChanged"] = "activeSpeakersChanged";
|
|
346
503
|
RoomEvent2["RoomMetadataChanged"] = "roomMetadataChanged";
|
|
504
|
+
RoomEvent2["RoomSidChanged"] = "roomSidChanged";
|
|
347
505
|
RoomEvent2["ParticipantMetadataChanged"] = "participantMetadataChanged";
|
|
348
506
|
RoomEvent2["ParticipantNameChanged"] = "participantNameChanged";
|
|
349
507
|
RoomEvent2["ParticipantAttributesChanged"] = "participantAttributesChanged";
|
package/dist/room.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/room.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';\nimport EventEmitter from 'events';\nimport type { E2EEOptions } from './e2ee.js';\nimport { E2EEManager, defaultE2EEOptions } 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 { DisconnectReason, OwnedParticipant } from './proto/participant_pb.js';\nimport {\n type ConnectCallback,\n type ConnectResponse,\n type ConnectionQuality,\n type DataPacketKind,\n type DisconnectResponse,\n RoomOptions as FfiRoomOptions,\n type IceServer,\n type RoomInfo,\n} from './proto/room_pb.js';\nimport {\n ConnectRequest,\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 = new FfiRoomOptions({\n autoSubscribe: true,\n dynacast: false,\n e2ee: undefined,\n rtcConfig: undefined,\n adaptiveStream: false,\n joinRetries: 1,\n});\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 | undefined> {\n return this.info?.sid; // TODO update this to handle async room updates once rust protocol has been updated\n }\n\n async connect(url: string, token: string, opts?: RoomOptions) {\n const options = { ...defaultRoomOptions, ...opts };\n const e2eeOptions = { ...defaultE2EEOptions, ...options.e2ee };\n\n const req = new ConnectRequest({\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 switch (cb.message.case) {\n case 'result':\n this.ffiHandle = new FfiHandle(cb.message.value.room!.handle!.id!);\n this.e2eeManager = options.e2ee && new E2EEManager(this.ffiHandle.handle, e2eeOptions);\n\n this.info = cb.message.value.room!.info;\n this.connectionState = ConnectionState.CONN_CONNECTED;\n this.localParticipant = new LocalParticipant(cb.message.value.localParticipant!);\n\n for (const pt of cb.message.value.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 break;\n case 'error':\n default:\n throw new ConnectError(cb.message.value || '');\n }\n }\n\n async disconnect() {\n if (!this.isConnected) {\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 (\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 this.remoteParticipants.delete(participant!.identity!);\n this.emit(RoomEvent.ParticipantDisconnected, participant!);\n } else if (ev.case == 'localTrackPublished') {\n const publication = this.localParticipant!.trackPublications.get(ev.value.trackSid!);\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 this.emit(RoomEvent.LocalTrackUnpublished, publication!, this.localParticipant!);\n } else if (ev.case == 'localTrackSubscribed') {\n const publication = this.localParticipant!.trackPublications.get(ev.value.trackSid!);\n publication!.resolveFirstSubscription();\n this.emit(RoomEvent.LocalTrackSubscribed, publication!.track!);\n } else if (ev.case == 'trackPublished') {\n const participant = this.remoteParticipants.get(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.remoteParticipants.get(ev.value.participantIdentity!);\n const publication = participant!.trackPublications.get(ev.value.publicationSid!);\n participant!.trackPublications.delete(ev.value.publicationSid!);\n this.emit(RoomEvent.TrackUnpublished, publication!, participant!);\n } else if (ev.case == 'trackSubscribed') {\n const ownedTrack = ev.value.track;\n const participant = this.remoteParticipants.get(ev.value.participantIdentity!);\n const publication = participant!.trackPublications.get(ownedTrack!.info!.sid!);\n publication!.subscribed = true;\n if (ownedTrack!.info!.kind == TrackKind.KIND_VIDEO) {\n publication!.track = new RemoteVideoTrack(ownedTrack!);\n } else if (ownedTrack!.info!.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 = this.remoteParticipants.get(ev.value.participantIdentity!);\n const publication = participant!.trackPublications.get(ev.value.trackSid!);\n publication!.track = undefined;\n publication!.subscribed = false;\n this.emit(RoomEvent.TrackUnsubscribed, publication!.track!, publication!, participant!);\n } else if (ev.case == 'trackSubscriptionFailed') {\n const participant = this.remoteParticipants.get(ev.value.participantIdentity!);\n this.emit(\n RoomEvent.TrackSubscriptionFailed,\n ev.value.trackSid!,\n participant!,\n ev.value.error,\n );\n } else if (ev.case == 'trackMuted') {\n const participant = this.remoteParticipants.get(ev.value.participantIdentity!);\n const publication = participant!.trackPublications.get(ev.value.trackSid!);\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 = this.retrieveParticipantByIdentity(ev.value.participantIdentity!);\n const publication = participant!.trackPublications.get(ev.value.trackSid!);\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.retrieveParticipantByIdentity(identity),\n );\n this.emit(\n RoomEvent.ActiveSpeakersChanged,\n activeSpeakers.map((s) => s!),\n );\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.retrieveParticipantByIdentity(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.retrieveParticipantByIdentity(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.retrieveParticipantByIdentity(ev.value.participantIdentity!);\n participant!.info!.attributes = ev.value.attributes.reduce(\n (obj, item) => {\n obj[item.key!] = item.value!;\n return obj;\n },\n {} as Record<string, string>,\n );\n if (Object.keys(ev.value.changedAttributes).length > 0) {\n this.emit(\n RoomEvent.ParticipantAttributesChanged,\n ev.value.changedAttributes.reduce(\n (obj, item) => {\n obj[item.key!] = item.value!;\n return obj;\n },\n {} as Record<string, string>,\n ),\n participant!,\n );\n }\n } else if (ev.case == 'connectionQualityChanged') {\n const participant = this.retrieveParticipantByIdentity(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: 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 buffer = FfiClient.instance.copyBuffer(\n dataPacket.value.data!.data!.dataPtr!,\n Number(dataPacket.value.data!.data!.dataLen),\n );\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 }\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 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};\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 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":["RoomEvent"]}
|
|
1
|
+
{"version":3,"sources":["../src/room.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';\nimport EventEmitter from 'events';\nimport { ReadableStream } from 'node:stream/web';\nimport { ByteStreamReader, TextStreamReader } from './data_streams/stream_reader.js';\nimport type {\n ByteStreamHandler,\n ByteStreamInfo,\n StreamController,\n TextStreamHandler,\n TextStreamInfo,\n} from './data_streams/types.js';\nimport type { E2EEOptions } from './e2ee.js';\nimport { E2EEManager, defaultE2EEOptions } from './e2ee.js';\nimport { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.js';\nimport { log } from './log.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 { DisconnectReason, OwnedParticipant } from './proto/participant_pb.js';\nimport {\n type ConnectCallback,\n type ConnectResponse,\n type ConnectionQuality,\n type DataPacketKind,\n type DataStream_Chunk,\n type DataStream_Header,\n DataStream_Trailer,\n type DisconnectResponse,\n RoomOptions as FfiRoomOptions,\n type IceServer,\n type RoomInfo,\n} from './proto/room_pb.js';\nimport {\n ConnectRequest,\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';\nimport { bigIntToNumber } from './utils.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 = new FfiRoomOptions({\n autoSubscribe: true,\n dynacast: false,\n e2ee: undefined,\n rtcConfig: undefined,\n adaptiveStream: false,\n joinRetries: 1,\n});\n\nexport class Room extends (EventEmitter as new () => TypedEmitter<RoomCallbacks>) {\n private info?: RoomInfo;\n private ffiHandle?: FfiHandle;\n\n private byteStreamControllers = new Map<string, StreamController<DataStream_Chunk>>();\n private textStreamControllers = new Map<string, StreamController<DataStream_Chunk>>();\n private byteStreamHandlers = new Map<string, ByteStreamHandler>();\n private textStreamHandlers = new Map<string, TextStreamHandler>();\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?.sid && 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 const e2eeOptions = { ...defaultE2EEOptions, ...options.e2ee };\n\n const req = new ConnectRequest({\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 switch (cb.message.case) {\n case 'result':\n this.ffiHandle = new FfiHandle(cb.message.value.room!.handle!.id!);\n this.e2eeManager = options.e2ee && new E2EEManager(this.ffiHandle.handle, e2eeOptions);\n\n this.info = cb.message.value.room!.info;\n this.connectionState = ConnectionState.CONN_CONNECTED;\n this.localParticipant = new LocalParticipant(cb.message.value.localParticipant!);\n\n for (const pt of cb.message.value.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 break;\n case 'error':\n default:\n throw new ConnectError(cb.message.value || '');\n }\n }\n\n async disconnect() {\n if (!this.isConnected) {\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 registerTextStreamHandler(topic: string, callback: TextStreamHandler) {\n if (this.textStreamHandlers.has(topic)) {\n throw new Error(`A text stream handler for topic \"${topic}\" has already been set.`);\n }\n this.textStreamHandlers.set(topic, callback);\n }\n\n unregisterTextStreamHandler(topic: string) {\n this.textStreamHandlers.delete(topic);\n }\n\n registerByteStreamHandler(topic: string, callback: ByteStreamHandler) {\n if (this.byteStreamHandlers.has(topic)) {\n throw new Error(`A byte stream handler for topic \"${topic}\" has already been set.`);\n }\n this.byteStreamHandlers.set(topic, callback);\n }\n\n unregisterByteStreamHandler(topic: string) {\n this.byteStreamHandlers.delete(topic);\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 this.remoteParticipants.delete(participant!.identity!);\n this.emit(RoomEvent.ParticipantDisconnected, participant!);\n } else if (ev.case == 'localTrackPublished') {\n const publication = this.localParticipant!.trackPublications.get(ev.value.trackSid!);\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 this.emit(RoomEvent.LocalTrackUnpublished, publication!, this.localParticipant!);\n } else if (ev.case == 'localTrackSubscribed') {\n const publication = this.localParticipant!.trackPublications.get(ev.value.trackSid!);\n publication!.resolveFirstSubscription();\n this.emit(RoomEvent.LocalTrackSubscribed, publication!.track!);\n } else if (ev.case == 'trackPublished') {\n const participant = this.remoteParticipants.get(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: 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 buffer = FfiClient.instance.copyBuffer(\n dataPacket.value.data!.data!.dataPtr!,\n Number(dataPacket.value.data!.data!.dataLen),\n );\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 } else if (ev.case === 'streamHeaderReceived' && ev.value.header) {\n this.handleStreamHeader(ev.value.header, ev.value.participantIdentity!);\n } else if (ev.case === 'streamChunkReceived' && ev.value.chunk) {\n this.handleStreamChunk(ev.value.chunk);\n } else if (ev.case === 'streamTrailerReceived' && ev.value.trailer) {\n this.handleStreamTrailer(ev.value.trailer);\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 private handleStreamHeader(streamHeader: DataStream_Header, participantIdentity: string) {\n if (streamHeader.contentHeader.case === 'byteHeader') {\n const streamHandlerCallback = this.byteStreamHandlers.get(streamHeader.topic ?? '');\n\n if (!streamHandlerCallback) {\n log.debug('ignoring incoming byte stream due to no handler for topic', streamHeader.topic);\n return;\n }\n let streamController: ReadableStreamDefaultController<DataStream_Chunk>;\n const stream = new ReadableStream({\n start: (controller) => {\n streamController = controller;\n this.byteStreamControllers.set(streamHeader.streamId!, {\n header: streamHeader,\n controller: streamController,\n startTime: Date.now(),\n });\n },\n });\n const info: ByteStreamInfo = {\n streamId: streamHeader.streamId!,\n name: streamHeader.contentHeader.value.name ?? 'unknown',\n mimeType: streamHeader.mimeType!,\n totalSize: streamHeader.totalLength ? Number(streamHeader.totalLength) : undefined,\n topic: streamHeader.topic!,\n timestamp: bigIntToNumber(streamHeader.timestamp!),\n attributes: streamHeader.attributes,\n };\n streamHandlerCallback(\n new ByteStreamReader(info, stream, bigIntToNumber(streamHeader.totalLength)),\n { identity: participantIdentity },\n );\n } else if (streamHeader.contentHeader.case === 'textHeader') {\n const streamHandlerCallback = this.textStreamHandlers.get(streamHeader.topic ?? '');\n\n if (!streamHandlerCallback) {\n log.debug('ignoring incoming text stream due to no handler for topic', streamHeader.topic);\n return;\n }\n let streamController: ReadableStreamDefaultController<DataStream_Chunk>;\n const stream = new ReadableStream<DataStream_Chunk>({\n start: (controller) => {\n streamController = controller;\n this.textStreamControllers.set(streamHeader.streamId!, {\n header: streamHeader,\n controller: streamController,\n startTime: Date.now(),\n });\n },\n });\n const info: TextStreamInfo = {\n streamId: streamHeader.streamId!,\n mimeType: streamHeader.mimeType!,\n totalSize: streamHeader.totalLength ? Number(streamHeader.totalLength) : undefined,\n topic: streamHeader.topic!,\n timestamp: Number(streamHeader.timestamp),\n attributes: streamHeader.attributes,\n };\n streamHandlerCallback(\n new TextStreamReader(info, stream, bigIntToNumber(streamHeader.totalLength)),\n { identity: participantIdentity },\n );\n }\n }\n\n private handleStreamChunk(chunk: DataStream_Chunk) {\n const fileBuffer = this.byteStreamControllers.get(chunk.streamId!);\n if (fileBuffer) {\n if (chunk.content!.length > 0) {\n fileBuffer.controller.enqueue(chunk);\n }\n }\n const textBuffer = this.textStreamControllers.get(chunk.streamId!);\n if (textBuffer) {\n if (chunk.content!.length > 0) {\n textBuffer.controller.enqueue(chunk);\n }\n }\n }\n\n private handleStreamTrailer(trailer: DataStream_Trailer) {\n const streamId = trailer.streamId!;\n const fileBuffer = this.byteStreamControllers.get(streamId);\n if (fileBuffer) {\n fileBuffer.controller.close();\n this.byteStreamControllers.delete(streamId);\n }\n const textBuffer = this.textStreamControllers.get(streamId);\n if (textBuffer) {\n textBuffer.controller.close();\n this.byteStreamControllers.delete(streamId);\n }\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":["RoomEvent"]}
|