@fishjam-cloud/composition 0.29.0-rc.1 → 0.29.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/chunk-XAZDKX25.mjs +301 -0
- package/dist/core.d.mts +84 -0
- package/dist/core.d.ts +84 -0
- package/dist/core.js +327 -0
- package/dist/core.mjs +6 -0
- package/dist/index.d.mts +30 -1
- package/dist/index.d.ts +30 -1
- package/dist/index.js +336 -2
- package/dist/index.mjs +34 -2
- package/dist/types-LgEdO1AS.d.mts +45 -0
- package/dist/types-LgEdO1AS.d.ts +45 -0
- package/package.json +23 -6
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
// src/store.ts
|
|
2
|
+
var EMPTY_SNAPSHOT = { peers: [], vad: {} };
|
|
3
|
+
var assertNever = (event) => {
|
|
4
|
+
throw new Error(`Unhandled composition event: ${JSON.stringify(event)}`);
|
|
5
|
+
};
|
|
6
|
+
var normalizeMetadata = (raw) => {
|
|
7
|
+
if (raw == null) return {};
|
|
8
|
+
if (typeof raw === "string") {
|
|
9
|
+
try {
|
|
10
|
+
const parsed = JSON.parse(raw);
|
|
11
|
+
return parsed && typeof parsed === "object" ? parsed : {};
|
|
12
|
+
} catch {
|
|
13
|
+
return {};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return raw;
|
|
17
|
+
};
|
|
18
|
+
var splitMetadata = (raw) => {
|
|
19
|
+
const obj = normalizeMetadata(raw);
|
|
20
|
+
return { peer: obj.peer, server: obj.server };
|
|
21
|
+
};
|
|
22
|
+
var roleOf = (stream) => {
|
|
23
|
+
const type = stream.video?.metadata.type ?? stream.audio?.metadata.type;
|
|
24
|
+
if (type === "camera" || type === "microphone") return "camera";
|
|
25
|
+
if (type === "screenShareVideo" || type === "screenShareAudio") return "screenShare";
|
|
26
|
+
return "custom";
|
|
27
|
+
};
|
|
28
|
+
var CompositionStore = class {
|
|
29
|
+
peers = /* @__PURE__ */ new Map();
|
|
30
|
+
roomId;
|
|
31
|
+
vad = /* @__PURE__ */ new Map();
|
|
32
|
+
listeners = /* @__PURE__ */ new Set();
|
|
33
|
+
cachedSnapshot = EMPTY_SNAPSHOT;
|
|
34
|
+
cachedPeers = EMPTY_SNAPSHOT.peers;
|
|
35
|
+
subscribe = (cb) => {
|
|
36
|
+
this.listeners.add(cb);
|
|
37
|
+
return () => this.listeners.delete(cb);
|
|
38
|
+
};
|
|
39
|
+
getSnapshot = () => {
|
|
40
|
+
if (this.cachedSnapshot === null) {
|
|
41
|
+
this.cachedSnapshot = { peers: this.cachedPeers, roomId: this.roomId, vad: this.vadRecord() };
|
|
42
|
+
}
|
|
43
|
+
return this.cachedSnapshot;
|
|
44
|
+
};
|
|
45
|
+
getPeers = () => this.cachedPeers;
|
|
46
|
+
getPeer = (peerId) => this.getPeers().find((peer) => peer.id === peerId);
|
|
47
|
+
getRoomId = () => this.roomId;
|
|
48
|
+
getVadStatus = (peerId) => {
|
|
49
|
+
const peer = this.peers.get(peerId);
|
|
50
|
+
if (!peer) return "silence";
|
|
51
|
+
for (const track of peer.tracks.values())
|
|
52
|
+
if (track.type === "audio" && track.inputId && this.vad.get(track.inputId) === "speech") return "speech";
|
|
53
|
+
return "silence";
|
|
54
|
+
};
|
|
55
|
+
reset() {
|
|
56
|
+
this.peers.clear();
|
|
57
|
+
this.vad.clear();
|
|
58
|
+
this.roomId = void 0;
|
|
59
|
+
this.cachedSnapshot = null;
|
|
60
|
+
this.cachedPeers = [];
|
|
61
|
+
this.commit();
|
|
62
|
+
}
|
|
63
|
+
seedFromRoom(room) {
|
|
64
|
+
this.peers.clear();
|
|
65
|
+
this.vad.clear();
|
|
66
|
+
this.roomId = room.id;
|
|
67
|
+
for (const peer of room.peers) {
|
|
68
|
+
const internal = {
|
|
69
|
+
id: peer.id,
|
|
70
|
+
metadata: splitMetadata(peer.metadata),
|
|
71
|
+
tracks: /* @__PURE__ */ new Map()
|
|
72
|
+
};
|
|
73
|
+
for (const track of peer.tracks ?? []) {
|
|
74
|
+
if (!track.id) continue;
|
|
75
|
+
internal.tracks.set(track.id, { id: track.id, metadata: normalizeMetadata(track.metadata), type: track.type });
|
|
76
|
+
}
|
|
77
|
+
this.peers.set(peer.id, internal);
|
|
78
|
+
}
|
|
79
|
+
this.rebuildPeers();
|
|
80
|
+
this.commit();
|
|
81
|
+
}
|
|
82
|
+
applyNotification(event) {
|
|
83
|
+
if (event.data.roomId !== this.roomId) return;
|
|
84
|
+
let changed;
|
|
85
|
+
switch (event.type) {
|
|
86
|
+
case "peerConnected":
|
|
87
|
+
changed = this.onPeerConnected(event.data);
|
|
88
|
+
break;
|
|
89
|
+
case "peerDisconnected":
|
|
90
|
+
changed = this.onPeerDisconnected(event.data);
|
|
91
|
+
break;
|
|
92
|
+
case "peerMetadataUpdated":
|
|
93
|
+
changed = this.onPeerMetadataUpdated(event.data);
|
|
94
|
+
break;
|
|
95
|
+
case "trackAdded":
|
|
96
|
+
changed = this.onTrackAdded(event.data);
|
|
97
|
+
break;
|
|
98
|
+
case "trackRemoved":
|
|
99
|
+
changed = this.onTrackRemoved(event.data);
|
|
100
|
+
break;
|
|
101
|
+
case "trackMetadataUpdated":
|
|
102
|
+
changed = this.onTrackMetadataUpdated(event.data);
|
|
103
|
+
break;
|
|
104
|
+
case "trackForwarding":
|
|
105
|
+
changed = this.onTrackForwarding(event.data);
|
|
106
|
+
break;
|
|
107
|
+
case "trackForwardingRemoved":
|
|
108
|
+
changed = this.onTrackForwardingRemoved(event.data);
|
|
109
|
+
break;
|
|
110
|
+
case "vadNotification":
|
|
111
|
+
changed = this.onVadNotification(event.data);
|
|
112
|
+
break;
|
|
113
|
+
default:
|
|
114
|
+
return assertNever(event);
|
|
115
|
+
}
|
|
116
|
+
if (changed) this.commit();
|
|
117
|
+
}
|
|
118
|
+
ensurePeer(peerId) {
|
|
119
|
+
let peer = this.peers.get(peerId);
|
|
120
|
+
if (!peer) {
|
|
121
|
+
peer = { id: peerId, metadata: { peer: void 0, server: void 0 }, tracks: /* @__PURE__ */ new Map() };
|
|
122
|
+
this.peers.set(peerId, peer);
|
|
123
|
+
}
|
|
124
|
+
return peer;
|
|
125
|
+
}
|
|
126
|
+
onPeerConnected(data) {
|
|
127
|
+
if (this.peers.has(data.peerId)) return false;
|
|
128
|
+
this.ensurePeer(data.peerId);
|
|
129
|
+
this.replacePeer(data.peerId);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
onPeerDisconnected(data) {
|
|
133
|
+
const peer = this.peers.get(data.peerId);
|
|
134
|
+
if (!peer) return false;
|
|
135
|
+
for (const { inputId } of peer.tracks.values()) if (inputId) this.vad.delete(inputId);
|
|
136
|
+
this.peers.delete(data.peerId);
|
|
137
|
+
this.replacePeer(data.peerId);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
onPeerMetadataUpdated(data) {
|
|
141
|
+
this.ensurePeer(data.peerId).metadata = splitMetadata(data.metadata);
|
|
142
|
+
this.replacePeer(data.peerId);
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
onTrackAdded(data) {
|
|
146
|
+
if (!data.peerId || !data.track) return false;
|
|
147
|
+
const peer = this.ensurePeer(data.peerId);
|
|
148
|
+
peer.tracks.set(data.track.id, {
|
|
149
|
+
id: data.track.id,
|
|
150
|
+
metadata: normalizeMetadata(data.track.metadata),
|
|
151
|
+
type: data.track.type
|
|
152
|
+
});
|
|
153
|
+
this.replacePeer(data.peerId);
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
onTrackMetadataUpdated(data) {
|
|
157
|
+
if (!data.peerId || !data.track) return false;
|
|
158
|
+
const peer = this.peers.get(data.peerId);
|
|
159
|
+
if (!peer) return false;
|
|
160
|
+
const metadata = normalizeMetadata(data.track.metadata);
|
|
161
|
+
const inputId = peer.tracks.get(data.track.id)?.inputId;
|
|
162
|
+
peer.tracks.set(data.track.id, { id: data.track.id, metadata, type: data.track.type, inputId });
|
|
163
|
+
this.replacePeer(data.peerId);
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
onTrackRemoved(data) {
|
|
167
|
+
if (!data.peerId || !data.track) return false;
|
|
168
|
+
const peer = this.peers.get(data.peerId);
|
|
169
|
+
if (!peer) return false;
|
|
170
|
+
const track = peer.tracks.get(data.track.id);
|
|
171
|
+
if (!track) return false;
|
|
172
|
+
peer.tracks.delete(data.track.id);
|
|
173
|
+
if (track.type === "audio" && track.inputId) this.vad.delete(track.inputId);
|
|
174
|
+
this.replacePeer(data.peerId);
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
onTrackForwarding(data) {
|
|
178
|
+
const peer = this.ensurePeer(data.peerId);
|
|
179
|
+
if (data.videoTrack) {
|
|
180
|
+
peer.tracks.set(data.videoTrack.id, {
|
|
181
|
+
id: data.videoTrack.id,
|
|
182
|
+
metadata: normalizeMetadata(data.videoTrack.metadata),
|
|
183
|
+
inputId: data.inputId,
|
|
184
|
+
type: data.videoTrack.type
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
if (data.audioTrack) {
|
|
188
|
+
peer.tracks.set(data.audioTrack.id, {
|
|
189
|
+
id: data.audioTrack.id,
|
|
190
|
+
metadata: normalizeMetadata(data.audioTrack.metadata),
|
|
191
|
+
inputId: data.inputId,
|
|
192
|
+
type: data.audioTrack.type
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
this.replacePeer(data.peerId);
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
onTrackForwardingRemoved(data) {
|
|
199
|
+
let changed = this.vad.delete(data.inputId);
|
|
200
|
+
const peer = this.peers.get(data.peerId);
|
|
201
|
+
if (!peer) {
|
|
202
|
+
if (changed) this.cachedSnapshot = null;
|
|
203
|
+
return changed;
|
|
204
|
+
}
|
|
205
|
+
for (const track of peer.tracks.values()) {
|
|
206
|
+
if (track.inputId === data.inputId) {
|
|
207
|
+
track.inputId = void 0;
|
|
208
|
+
changed = true;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (changed) this.replacePeer(data.peerId);
|
|
212
|
+
return changed;
|
|
213
|
+
}
|
|
214
|
+
onVadNotification(data) {
|
|
215
|
+
const peer = this.peers.get(data.peerId);
|
|
216
|
+
if (!peer) return false;
|
|
217
|
+
const track = peer.tracks.get(data.trackId);
|
|
218
|
+
if (!track || !track.inputId) return false;
|
|
219
|
+
if (this.vad.get(track.inputId) === data.status) return false;
|
|
220
|
+
this.vad.set(track.inputId, data.status);
|
|
221
|
+
this.cachedSnapshot = null;
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
commit() {
|
|
225
|
+
for (const cb of this.listeners) cb();
|
|
226
|
+
}
|
|
227
|
+
replacePeer(peerId) {
|
|
228
|
+
const internal = this.peers.get(peerId);
|
|
229
|
+
const next = this.cachedPeers.slice();
|
|
230
|
+
const idx = next.findIndex((peer) => peer.id === peerId);
|
|
231
|
+
if (!internal) {
|
|
232
|
+
if (idx >= 0) next.splice(idx, 1);
|
|
233
|
+
} else if (idx >= 0) {
|
|
234
|
+
next[idx] = this.derivePeer(internal);
|
|
235
|
+
} else {
|
|
236
|
+
next.push(this.derivePeer(internal));
|
|
237
|
+
}
|
|
238
|
+
this.cachedPeers = next;
|
|
239
|
+
this.cachedSnapshot = null;
|
|
240
|
+
}
|
|
241
|
+
rebuildPeers() {
|
|
242
|
+
this.cachedPeers = Array.from(this.peers.values(), (peer) => this.derivePeer(peer));
|
|
243
|
+
this.cachedSnapshot = null;
|
|
244
|
+
}
|
|
245
|
+
vadRecord() {
|
|
246
|
+
const vad = {};
|
|
247
|
+
for (const [inputId, status] of this.vad) vad[inputId] = status;
|
|
248
|
+
return vad;
|
|
249
|
+
}
|
|
250
|
+
derivePeer(peer) {
|
|
251
|
+
const streams = /* @__PURE__ */ new Map();
|
|
252
|
+
let cameraStream;
|
|
253
|
+
let screenShareStream;
|
|
254
|
+
const customStreams = [];
|
|
255
|
+
for (const track of peer.tracks.values()) {
|
|
256
|
+
if (!track.inputId) continue;
|
|
257
|
+
const stream = streams.get(track.inputId) || { inputId: track.inputId };
|
|
258
|
+
if (track.type === "audio")
|
|
259
|
+
stream.audio = {
|
|
260
|
+
id: track.id,
|
|
261
|
+
paused: Boolean(track.metadata.paused),
|
|
262
|
+
metadata: track.metadata,
|
|
263
|
+
type: "audio"
|
|
264
|
+
};
|
|
265
|
+
else
|
|
266
|
+
stream.video = {
|
|
267
|
+
id: track.id,
|
|
268
|
+
paused: Boolean(track.metadata.paused),
|
|
269
|
+
metadata: track.metadata,
|
|
270
|
+
type: "video"
|
|
271
|
+
};
|
|
272
|
+
streams.set(track.inputId, stream);
|
|
273
|
+
}
|
|
274
|
+
for (const stream of streams.values()) {
|
|
275
|
+
const role = roleOf(stream);
|
|
276
|
+
switch (role) {
|
|
277
|
+
case "camera":
|
|
278
|
+
cameraStream = stream;
|
|
279
|
+
break;
|
|
280
|
+
case "screenShare":
|
|
281
|
+
screenShareStream = stream;
|
|
282
|
+
break;
|
|
283
|
+
default:
|
|
284
|
+
customStreams.push(stream);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
id: peer.id,
|
|
289
|
+
metadata: peer.metadata,
|
|
290
|
+
streams: Array.from(streams.values()),
|
|
291
|
+
cameraStream,
|
|
292
|
+
screenShareStream,
|
|
293
|
+
customStreams
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
var compositionStore = new CompositionStore();
|
|
298
|
+
|
|
299
|
+
export {
|
|
300
|
+
compositionStore
|
|
301
|
+
};
|
package/dist/core.d.mts
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Room, PeerConnected, PeerDisconnected, PeerMetadataUpdated, TrackAdded, TrackRemoved, TrackMetadataUpdated, TrackForwarding, TrackForwardingRemoved, VadNotification, VadStatus } from '@fishjam-cloud/js-server-sdk';
|
|
2
|
+
import { P as PeerWithStreams } from './types-LgEdO1AS.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Discriminated notifier event accepted by {@link CompositionStore.applyNotification}.
|
|
6
|
+
* Each `FishjamWSNotifier` listener maps to one of these variants.
|
|
7
|
+
*/
|
|
8
|
+
type CompositionEvent = {
|
|
9
|
+
type: 'peerConnected';
|
|
10
|
+
data: PeerConnected;
|
|
11
|
+
} | {
|
|
12
|
+
type: 'peerDisconnected';
|
|
13
|
+
data: PeerDisconnected;
|
|
14
|
+
} | {
|
|
15
|
+
type: 'peerMetadataUpdated';
|
|
16
|
+
data: PeerMetadataUpdated;
|
|
17
|
+
} | {
|
|
18
|
+
type: 'trackAdded';
|
|
19
|
+
data: TrackAdded;
|
|
20
|
+
} | {
|
|
21
|
+
type: 'trackRemoved';
|
|
22
|
+
data: TrackRemoved;
|
|
23
|
+
} | {
|
|
24
|
+
type: 'trackMetadataUpdated';
|
|
25
|
+
data: TrackMetadataUpdated;
|
|
26
|
+
} | {
|
|
27
|
+
type: 'trackForwarding';
|
|
28
|
+
data: TrackForwarding;
|
|
29
|
+
} | {
|
|
30
|
+
type: 'trackForwardingRemoved';
|
|
31
|
+
data: TrackForwardingRemoved;
|
|
32
|
+
} | {
|
|
33
|
+
type: 'vadNotification';
|
|
34
|
+
data: VadNotification;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Complete snapshot of a linked room's state at a given moment.
|
|
38
|
+
*/
|
|
39
|
+
type RoomSnapshot = {
|
|
40
|
+
peers: PeerWithStreams[];
|
|
41
|
+
roomId?: string;
|
|
42
|
+
/** per-`inputId` voice activity, resolved per peer by `useSpeakingState`. */
|
|
43
|
+
vad: Record<string, VadStatus>;
|
|
44
|
+
};
|
|
45
|
+
interface CompositionStoreFeed {
|
|
46
|
+
seedFromRoom(room: Room): void;
|
|
47
|
+
applyNotification(event: CompositionEvent): void;
|
|
48
|
+
reset(): void;
|
|
49
|
+
}
|
|
50
|
+
declare class CompositionStore implements CompositionStoreFeed {
|
|
51
|
+
private peers;
|
|
52
|
+
private roomId;
|
|
53
|
+
private vad;
|
|
54
|
+
private listeners;
|
|
55
|
+
private cachedSnapshot;
|
|
56
|
+
private cachedPeers;
|
|
57
|
+
readonly subscribe: (cb: () => void) => (() => void);
|
|
58
|
+
readonly getSnapshot: () => RoomSnapshot;
|
|
59
|
+
readonly getPeers: () => PeerWithStreams[];
|
|
60
|
+
readonly getPeer: (peerId: string) => PeerWithStreams | undefined;
|
|
61
|
+
readonly getRoomId: () => string | undefined;
|
|
62
|
+
readonly getVadStatus: (peerId: string) => VadStatus;
|
|
63
|
+
reset(): void;
|
|
64
|
+
seedFromRoom(room: Room): void;
|
|
65
|
+
applyNotification(event: CompositionEvent): void;
|
|
66
|
+
private ensurePeer;
|
|
67
|
+
private onPeerConnected;
|
|
68
|
+
private onPeerDisconnected;
|
|
69
|
+
private onPeerMetadataUpdated;
|
|
70
|
+
private onTrackAdded;
|
|
71
|
+
private onTrackMetadataUpdated;
|
|
72
|
+
private onTrackRemoved;
|
|
73
|
+
private onTrackForwarding;
|
|
74
|
+
private onTrackForwardingRemoved;
|
|
75
|
+
private onVadNotification;
|
|
76
|
+
private commit;
|
|
77
|
+
private replacePeer;
|
|
78
|
+
private rebuildPeers;
|
|
79
|
+
private vadRecord;
|
|
80
|
+
private derivePeer;
|
|
81
|
+
}
|
|
82
|
+
declare const compositionStore: CompositionStore;
|
|
83
|
+
|
|
84
|
+
export { type CompositionEvent, type CompositionStoreFeed, type RoomSnapshot, compositionStore };
|
package/dist/core.d.ts
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Room, PeerConnected, PeerDisconnected, PeerMetadataUpdated, TrackAdded, TrackRemoved, TrackMetadataUpdated, TrackForwarding, TrackForwardingRemoved, VadNotification, VadStatus } from '@fishjam-cloud/js-server-sdk';
|
|
2
|
+
import { P as PeerWithStreams } from './types-LgEdO1AS.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Discriminated notifier event accepted by {@link CompositionStore.applyNotification}.
|
|
6
|
+
* Each `FishjamWSNotifier` listener maps to one of these variants.
|
|
7
|
+
*/
|
|
8
|
+
type CompositionEvent = {
|
|
9
|
+
type: 'peerConnected';
|
|
10
|
+
data: PeerConnected;
|
|
11
|
+
} | {
|
|
12
|
+
type: 'peerDisconnected';
|
|
13
|
+
data: PeerDisconnected;
|
|
14
|
+
} | {
|
|
15
|
+
type: 'peerMetadataUpdated';
|
|
16
|
+
data: PeerMetadataUpdated;
|
|
17
|
+
} | {
|
|
18
|
+
type: 'trackAdded';
|
|
19
|
+
data: TrackAdded;
|
|
20
|
+
} | {
|
|
21
|
+
type: 'trackRemoved';
|
|
22
|
+
data: TrackRemoved;
|
|
23
|
+
} | {
|
|
24
|
+
type: 'trackMetadataUpdated';
|
|
25
|
+
data: TrackMetadataUpdated;
|
|
26
|
+
} | {
|
|
27
|
+
type: 'trackForwarding';
|
|
28
|
+
data: TrackForwarding;
|
|
29
|
+
} | {
|
|
30
|
+
type: 'trackForwardingRemoved';
|
|
31
|
+
data: TrackForwardingRemoved;
|
|
32
|
+
} | {
|
|
33
|
+
type: 'vadNotification';
|
|
34
|
+
data: VadNotification;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Complete snapshot of a linked room's state at a given moment.
|
|
38
|
+
*/
|
|
39
|
+
type RoomSnapshot = {
|
|
40
|
+
peers: PeerWithStreams[];
|
|
41
|
+
roomId?: string;
|
|
42
|
+
/** per-`inputId` voice activity, resolved per peer by `useSpeakingState`. */
|
|
43
|
+
vad: Record<string, VadStatus>;
|
|
44
|
+
};
|
|
45
|
+
interface CompositionStoreFeed {
|
|
46
|
+
seedFromRoom(room: Room): void;
|
|
47
|
+
applyNotification(event: CompositionEvent): void;
|
|
48
|
+
reset(): void;
|
|
49
|
+
}
|
|
50
|
+
declare class CompositionStore implements CompositionStoreFeed {
|
|
51
|
+
private peers;
|
|
52
|
+
private roomId;
|
|
53
|
+
private vad;
|
|
54
|
+
private listeners;
|
|
55
|
+
private cachedSnapshot;
|
|
56
|
+
private cachedPeers;
|
|
57
|
+
readonly subscribe: (cb: () => void) => (() => void);
|
|
58
|
+
readonly getSnapshot: () => RoomSnapshot;
|
|
59
|
+
readonly getPeers: () => PeerWithStreams[];
|
|
60
|
+
readonly getPeer: (peerId: string) => PeerWithStreams | undefined;
|
|
61
|
+
readonly getRoomId: () => string | undefined;
|
|
62
|
+
readonly getVadStatus: (peerId: string) => VadStatus;
|
|
63
|
+
reset(): void;
|
|
64
|
+
seedFromRoom(room: Room): void;
|
|
65
|
+
applyNotification(event: CompositionEvent): void;
|
|
66
|
+
private ensurePeer;
|
|
67
|
+
private onPeerConnected;
|
|
68
|
+
private onPeerDisconnected;
|
|
69
|
+
private onPeerMetadataUpdated;
|
|
70
|
+
private onTrackAdded;
|
|
71
|
+
private onTrackMetadataUpdated;
|
|
72
|
+
private onTrackRemoved;
|
|
73
|
+
private onTrackForwarding;
|
|
74
|
+
private onTrackForwardingRemoved;
|
|
75
|
+
private onVadNotification;
|
|
76
|
+
private commit;
|
|
77
|
+
private replacePeer;
|
|
78
|
+
private rebuildPeers;
|
|
79
|
+
private vadRecord;
|
|
80
|
+
private derivePeer;
|
|
81
|
+
}
|
|
82
|
+
declare const compositionStore: CompositionStore;
|
|
83
|
+
|
|
84
|
+
export { type CompositionEvent, type CompositionStoreFeed, type RoomSnapshot, compositionStore };
|