@edge-base/web 0.1.5 → 0.2.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/README.md +25 -0
- package/dist/analytics.d.ts +2 -0
- package/dist/analytics.d.ts.map +1 -1
- package/dist/analytics.js +9 -2
- package/dist/analytics.js.map +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +11 -2
- package/dist/auth.js.map +1 -1
- package/dist/client.d.ts +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +9 -2
- package/dist/client.js.map +1 -1
- package/dist/database-live.d.ts +7 -0
- package/dist/database-live.d.ts.map +1 -1
- package/dist/database-live.js +63 -13
- package/dist/database-live.js.map +1 -1
- package/dist/room-cloudflare-media.d.ts +111 -0
- package/dist/room-cloudflare-media.d.ts.map +1 -0
- package/dist/room-cloudflare-media.js +406 -0
- package/dist/room-cloudflare-media.js.map +1 -0
- package/dist/room-p2p-media.d.ts +116 -0
- package/dist/room-p2p-media.d.ts.map +1 -0
- package/dist/room-p2p-media.js +691 -0
- package/dist/room-p2p-media.js.map +1 -0
- package/dist/room.d.ts +87 -0
- package/dist/room.d.ts.map +1 -1
- package/dist/room.js +179 -18
- package/dist/room.js.map +1 -1
- package/dist/token-manager.d.ts.map +1 -1
- package/dist/token-manager.js +3 -0
- package/dist/token-manager.js.map +1 -1
- package/dist/turnstile.d.ts.map +1 -1
- package/dist/turnstile.js +17 -18
- package/dist/turnstile.js.map +1 -1
- package/llms.txt +20 -2
- package/package.json +3 -2
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { RTKClientOptions, RTKParticipants, RTKSelf } from '@cloudflare/realtimekit';
|
|
2
|
+
import type { RoomCloudflareRealtimeKitCreateSessionRequest, RoomCloudflareRealtimeKitCreateSessionResponse, RoomMediaKind, RoomMediaRemoteTrackEvent, RoomMediaTransport, RoomMediaTransportConnectPayload, Subscription } from './room.js';
|
|
3
|
+
interface RoomCloudflareAudioVideoControls {
|
|
4
|
+
disable(): Promise<void>;
|
|
5
|
+
setMuted?(muted: boolean): Promise<void>;
|
|
6
|
+
enable?(payload?: {
|
|
7
|
+
trackId?: string;
|
|
8
|
+
deviceId?: string;
|
|
9
|
+
providerSessionId?: string;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
interface RoomCloudflareScreenControls {
|
|
13
|
+
stop(): Promise<void>;
|
|
14
|
+
start?(payload?: {
|
|
15
|
+
trackId?: string;
|
|
16
|
+
deviceId?: string;
|
|
17
|
+
providerSessionId?: string;
|
|
18
|
+
}): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
interface RoomCloudflareMediaAdapter {
|
|
21
|
+
media: {
|
|
22
|
+
audio: RoomCloudflareAudioVideoControls;
|
|
23
|
+
video: RoomCloudflareAudioVideoControls;
|
|
24
|
+
screen: RoomCloudflareScreenControls;
|
|
25
|
+
devices: {
|
|
26
|
+
switch(payload: {
|
|
27
|
+
audioInputId?: string;
|
|
28
|
+
videoInputId?: string;
|
|
29
|
+
screenInputId?: string;
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
};
|
|
32
|
+
cloudflareRealtimeKit: {
|
|
33
|
+
createSession(payload?: RoomCloudflareRealtimeKitCreateSessionRequest): Promise<RoomCloudflareRealtimeKitCreateSessionResponse>;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
type DisplayCaptureConstraints = NonNullable<MediaDevices['getDisplayMedia']> extends (constraints?: infer T) => Promise<MediaStream> ? T : MediaStreamConstraints;
|
|
38
|
+
export interface RoomCloudflareKitClient {
|
|
39
|
+
join(): Promise<void>;
|
|
40
|
+
leave(state?: unknown): Promise<void>;
|
|
41
|
+
readonly participants: RTKParticipants;
|
|
42
|
+
readonly self: RTKSelf;
|
|
43
|
+
}
|
|
44
|
+
export interface RoomCloudflareKitClientFactory {
|
|
45
|
+
init(options: RTKClientOptions): Promise<RoomCloudflareKitClient>;
|
|
46
|
+
}
|
|
47
|
+
export interface RoomCloudflareMediaTransportOptions {
|
|
48
|
+
autoSubscribe?: boolean;
|
|
49
|
+
turn?: boolean | {
|
|
50
|
+
ttl?: number;
|
|
51
|
+
filterBrowserIncompatibleUrls?: boolean;
|
|
52
|
+
};
|
|
53
|
+
rtcConfiguration?: RTCConfiguration;
|
|
54
|
+
peerConnectionFactory?: (configuration: RTCConfiguration) => RTCPeerConnection;
|
|
55
|
+
mediaDevices?: Pick<MediaDevices, 'getUserMedia' | 'getDisplayMedia' | 'enumerateDevices'>;
|
|
56
|
+
clientFactory?: RoomCloudflareKitClientFactory;
|
|
57
|
+
}
|
|
58
|
+
export declare class RoomCloudflareMediaTransport implements RoomMediaTransport {
|
|
59
|
+
private readonly room;
|
|
60
|
+
private readonly options;
|
|
61
|
+
private readonly localTracks;
|
|
62
|
+
private readonly remoteTrackHandlers;
|
|
63
|
+
private readonly participantListeners;
|
|
64
|
+
private readonly remoteTrackIds;
|
|
65
|
+
private clientFactoryPromise;
|
|
66
|
+
private connectPromise;
|
|
67
|
+
private lifecycleVersion;
|
|
68
|
+
private meeting;
|
|
69
|
+
private sessionId;
|
|
70
|
+
private joinedMapSubscriptionsAttached;
|
|
71
|
+
private onParticipantJoined;
|
|
72
|
+
private onParticipantLeft;
|
|
73
|
+
private onParticipantsCleared;
|
|
74
|
+
private onParticipantsUpdate;
|
|
75
|
+
constructor(room: RoomCloudflareMediaAdapter, options?: RoomCloudflareMediaTransportOptions);
|
|
76
|
+
getSessionId(): string | null;
|
|
77
|
+
getPeerConnection(): RTCPeerConnection | null;
|
|
78
|
+
connect(payload?: RoomMediaTransportConnectPayload): Promise<string>;
|
|
79
|
+
enableAudio(constraints?: MediaTrackConstraints | boolean): Promise<MediaStreamTrack>;
|
|
80
|
+
enableVideo(constraints?: MediaTrackConstraints | boolean): Promise<MediaStreamTrack>;
|
|
81
|
+
startScreenShare(_constraints?: DisplayCaptureConstraints): Promise<MediaStreamTrack>;
|
|
82
|
+
disableAudio(): Promise<void>;
|
|
83
|
+
disableVideo(): Promise<void>;
|
|
84
|
+
stopScreenShare(): Promise<void>;
|
|
85
|
+
setMuted(kind: Extract<RoomMediaKind, 'audio' | 'video'>, muted: boolean): Promise<void>;
|
|
86
|
+
switchDevices(payload: {
|
|
87
|
+
audioInputId?: string;
|
|
88
|
+
videoInputId?: string;
|
|
89
|
+
}): Promise<void>;
|
|
90
|
+
onRemoteTrack(handler: (event: RoomMediaRemoteTrackEvent) => void): Subscription;
|
|
91
|
+
destroy(): void;
|
|
92
|
+
private ensureMeeting;
|
|
93
|
+
private resolveClientFactory;
|
|
94
|
+
private createUserMediaTrack;
|
|
95
|
+
private rememberLocalTrack;
|
|
96
|
+
private releaseLocalTrack;
|
|
97
|
+
private attachParticipantMapListeners;
|
|
98
|
+
private detachParticipantMapListeners;
|
|
99
|
+
private syncAllParticipants;
|
|
100
|
+
private getParticipantMap;
|
|
101
|
+
private attachParticipant;
|
|
102
|
+
private detachParticipant;
|
|
103
|
+
private clearParticipantListeners;
|
|
104
|
+
private syncParticipantTracks;
|
|
105
|
+
private handleRemoteTrackUpdate;
|
|
106
|
+
private cleanupMeeting;
|
|
107
|
+
private assertConnectStillActive;
|
|
108
|
+
private leaveMeetingSilently;
|
|
109
|
+
}
|
|
110
|
+
export {};
|
|
111
|
+
//# sourceMappingURL=room-cloudflare-media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-cloudflare-media.d.ts","sourceRoot":"","sources":["../src/room-cloudflare-media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
function buildRemoteTrackKey(participantId, kind) {
|
|
2
|
+
return `${participantId}:${kind}`;
|
|
3
|
+
}
|
|
4
|
+
export class RoomCloudflareMediaTransport {
|
|
5
|
+
room;
|
|
6
|
+
options;
|
|
7
|
+
localTracks = new Map();
|
|
8
|
+
remoteTrackHandlers = [];
|
|
9
|
+
participantListeners = new Map();
|
|
10
|
+
remoteTrackIds = new Map();
|
|
11
|
+
clientFactoryPromise = null;
|
|
12
|
+
connectPromise = null;
|
|
13
|
+
lifecycleVersion = 0;
|
|
14
|
+
meeting = null;
|
|
15
|
+
sessionId = null;
|
|
16
|
+
joinedMapSubscriptionsAttached = false;
|
|
17
|
+
onParticipantJoined = (participant) => {
|
|
18
|
+
this.attachParticipant(participant);
|
|
19
|
+
};
|
|
20
|
+
onParticipantLeft = (participant) => {
|
|
21
|
+
this.detachParticipant(participant.id);
|
|
22
|
+
};
|
|
23
|
+
onParticipantsCleared = () => {
|
|
24
|
+
this.clearParticipantListeners();
|
|
25
|
+
};
|
|
26
|
+
onParticipantsUpdate = () => {
|
|
27
|
+
this.syncAllParticipants();
|
|
28
|
+
};
|
|
29
|
+
constructor(room, options) {
|
|
30
|
+
this.room = room;
|
|
31
|
+
this.options = {
|
|
32
|
+
autoSubscribe: options?.autoSubscribe ?? true,
|
|
33
|
+
turn: options?.turn ?? true,
|
|
34
|
+
rtcConfiguration: options?.rtcConfiguration ?? {},
|
|
35
|
+
peerConnectionFactory: options?.peerConnectionFactory
|
|
36
|
+
?? ((configuration) => new RTCPeerConnection(configuration)),
|
|
37
|
+
mediaDevices: options?.mediaDevices
|
|
38
|
+
?? (typeof navigator !== 'undefined' ? navigator.mediaDevices : undefined),
|
|
39
|
+
clientFactory: options?.clientFactory,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
getSessionId() {
|
|
43
|
+
return this.sessionId;
|
|
44
|
+
}
|
|
45
|
+
getPeerConnection() {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
async connect(payload) {
|
|
49
|
+
if (this.meeting && this.sessionId) {
|
|
50
|
+
return this.sessionId;
|
|
51
|
+
}
|
|
52
|
+
if (this.connectPromise) {
|
|
53
|
+
return this.connectPromise;
|
|
54
|
+
}
|
|
55
|
+
if (payload && typeof payload === 'object' && 'sessionDescription' in payload) {
|
|
56
|
+
throw new Error('RoomCloudflareMediaTransport.connect() does not accept sessionDescription; provider signaling is managed internally.');
|
|
57
|
+
}
|
|
58
|
+
const connectPromise = (async () => {
|
|
59
|
+
const lifecycleVersion = this.lifecycleVersion;
|
|
60
|
+
const session = await this.room.media.cloudflareRealtimeKit.createSession(payload);
|
|
61
|
+
this.assertConnectStillActive(lifecycleVersion);
|
|
62
|
+
const factory = await this.resolveClientFactory();
|
|
63
|
+
this.assertConnectStillActive(lifecycleVersion);
|
|
64
|
+
const meeting = await factory.init({
|
|
65
|
+
authToken: session.authToken,
|
|
66
|
+
defaults: {
|
|
67
|
+
audio: false,
|
|
68
|
+
video: false,
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
this.assertConnectStillActive(lifecycleVersion, meeting);
|
|
72
|
+
this.meeting = meeting;
|
|
73
|
+
this.sessionId = session.sessionId;
|
|
74
|
+
this.attachParticipantMapListeners();
|
|
75
|
+
try {
|
|
76
|
+
await meeting.join();
|
|
77
|
+
this.assertConnectStillActive(lifecycleVersion, meeting);
|
|
78
|
+
this.syncAllParticipants();
|
|
79
|
+
return session.sessionId;
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
if (this.meeting === meeting) {
|
|
83
|
+
this.cleanupMeeting();
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
this.leaveMeetingSilently(meeting);
|
|
87
|
+
}
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
})();
|
|
91
|
+
this.connectPromise = connectPromise;
|
|
92
|
+
try {
|
|
93
|
+
return await connectPromise;
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
if (this.connectPromise === connectPromise) {
|
|
97
|
+
this.connectPromise = null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async enableAudio(constraints = true) {
|
|
102
|
+
const meeting = await this.ensureMeeting();
|
|
103
|
+
const customTrack = await this.createUserMediaTrack('audio', constraints);
|
|
104
|
+
await meeting.self.enableAudio(customTrack ?? undefined);
|
|
105
|
+
const track = meeting.self.audioTrack ?? customTrack;
|
|
106
|
+
if (!track) {
|
|
107
|
+
throw new Error('RealtimeKit did not expose a local audio track after enabling audio.');
|
|
108
|
+
}
|
|
109
|
+
this.rememberLocalTrack('audio', track, track.getSettings().deviceId ?? customTrack?.getSettings().deviceId, !!customTrack);
|
|
110
|
+
await this.room.media.audio.enable?.({
|
|
111
|
+
trackId: track.id,
|
|
112
|
+
deviceId: this.localTracks.get('audio')?.deviceId,
|
|
113
|
+
providerSessionId: meeting.self.id,
|
|
114
|
+
});
|
|
115
|
+
return track;
|
|
116
|
+
}
|
|
117
|
+
async enableVideo(constraints = true) {
|
|
118
|
+
const meeting = await this.ensureMeeting();
|
|
119
|
+
const customTrack = await this.createUserMediaTrack('video', constraints);
|
|
120
|
+
await meeting.self.enableVideo(customTrack ?? undefined);
|
|
121
|
+
const track = meeting.self.videoTrack ?? customTrack;
|
|
122
|
+
if (!track) {
|
|
123
|
+
throw new Error('RealtimeKit did not expose a local video track after enabling video.');
|
|
124
|
+
}
|
|
125
|
+
this.rememberLocalTrack('video', track, track.getSettings().deviceId ?? customTrack?.getSettings().deviceId, !!customTrack);
|
|
126
|
+
await this.room.media.video.enable?.({
|
|
127
|
+
trackId: track.id,
|
|
128
|
+
deviceId: this.localTracks.get('video')?.deviceId,
|
|
129
|
+
providerSessionId: meeting.self.id,
|
|
130
|
+
});
|
|
131
|
+
return track;
|
|
132
|
+
}
|
|
133
|
+
async startScreenShare(_constraints = { video: true, audio: false }) {
|
|
134
|
+
const meeting = await this.ensureMeeting();
|
|
135
|
+
await meeting.self.enableScreenShare();
|
|
136
|
+
const track = meeting.self.screenShareTracks?.video;
|
|
137
|
+
if (!track) {
|
|
138
|
+
throw new Error('RealtimeKit did not expose a screen-share video track.');
|
|
139
|
+
}
|
|
140
|
+
track.addEventListener('ended', () => {
|
|
141
|
+
void this.stopScreenShare();
|
|
142
|
+
}, { once: true });
|
|
143
|
+
this.rememberLocalTrack('screen', track, track.getSettings().deviceId, false);
|
|
144
|
+
await this.room.media.screen.start?.({
|
|
145
|
+
trackId: track.id,
|
|
146
|
+
deviceId: track.getSettings().deviceId,
|
|
147
|
+
providerSessionId: meeting.self.id,
|
|
148
|
+
});
|
|
149
|
+
return track;
|
|
150
|
+
}
|
|
151
|
+
async disableAudio() {
|
|
152
|
+
if (!this.meeting)
|
|
153
|
+
return;
|
|
154
|
+
await this.meeting.self.disableAudio();
|
|
155
|
+
this.releaseLocalTrack('audio');
|
|
156
|
+
await this.room.media.audio.disable();
|
|
157
|
+
}
|
|
158
|
+
async disableVideo() {
|
|
159
|
+
if (!this.meeting)
|
|
160
|
+
return;
|
|
161
|
+
await this.meeting.self.disableVideo();
|
|
162
|
+
this.releaseLocalTrack('video');
|
|
163
|
+
await this.room.media.video.disable();
|
|
164
|
+
}
|
|
165
|
+
async stopScreenShare() {
|
|
166
|
+
if (!this.meeting)
|
|
167
|
+
return;
|
|
168
|
+
await this.meeting.self.disableScreenShare();
|
|
169
|
+
this.releaseLocalTrack('screen');
|
|
170
|
+
await this.room.media.screen.stop();
|
|
171
|
+
}
|
|
172
|
+
async setMuted(kind, muted) {
|
|
173
|
+
const localTrack = this.localTracks.get(kind)?.track
|
|
174
|
+
?? (kind === 'audio' ? this.meeting?.self.audioTrack : this.meeting?.self.videoTrack);
|
|
175
|
+
if (localTrack) {
|
|
176
|
+
localTrack.enabled = !muted;
|
|
177
|
+
}
|
|
178
|
+
if (kind === 'audio') {
|
|
179
|
+
await this.room.media.audio.setMuted?.(muted);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
await this.room.media.video.setMuted?.(muted);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async switchDevices(payload) {
|
|
186
|
+
const meeting = await this.ensureMeeting();
|
|
187
|
+
if (payload.audioInputId) {
|
|
188
|
+
const audioDevice = await meeting.self.getDeviceById(payload.audioInputId, 'audio');
|
|
189
|
+
await meeting.self.setDevice(audioDevice);
|
|
190
|
+
const audioTrack = meeting.self.audioTrack;
|
|
191
|
+
if (audioTrack) {
|
|
192
|
+
this.rememberLocalTrack('audio', audioTrack, payload.audioInputId, false);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (payload.videoInputId) {
|
|
196
|
+
const videoDevice = await meeting.self.getDeviceById(payload.videoInputId, 'video');
|
|
197
|
+
await meeting.self.setDevice(videoDevice);
|
|
198
|
+
const videoTrack = meeting.self.videoTrack;
|
|
199
|
+
if (videoTrack) {
|
|
200
|
+
this.rememberLocalTrack('video', videoTrack, payload.videoInputId, false);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
await this.room.media.devices.switch(payload);
|
|
204
|
+
}
|
|
205
|
+
onRemoteTrack(handler) {
|
|
206
|
+
this.remoteTrackHandlers.push(handler);
|
|
207
|
+
return {
|
|
208
|
+
unsubscribe: () => {
|
|
209
|
+
const index = this.remoteTrackHandlers.indexOf(handler);
|
|
210
|
+
if (index >= 0) {
|
|
211
|
+
this.remoteTrackHandlers.splice(index, 1);
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
destroy() {
|
|
217
|
+
this.lifecycleVersion += 1;
|
|
218
|
+
this.connectPromise = null;
|
|
219
|
+
for (const kind of this.localTracks.keys()) {
|
|
220
|
+
this.releaseLocalTrack(kind);
|
|
221
|
+
}
|
|
222
|
+
this.clearParticipantListeners();
|
|
223
|
+
this.detachParticipantMapListeners();
|
|
224
|
+
this.cleanupMeeting();
|
|
225
|
+
}
|
|
226
|
+
async ensureMeeting() {
|
|
227
|
+
if (!this.meeting) {
|
|
228
|
+
await this.connect();
|
|
229
|
+
}
|
|
230
|
+
if (!this.meeting) {
|
|
231
|
+
throw new Error('Cloudflare media transport is not connected');
|
|
232
|
+
}
|
|
233
|
+
return this.meeting;
|
|
234
|
+
}
|
|
235
|
+
async resolveClientFactory() {
|
|
236
|
+
if (this.options.clientFactory) {
|
|
237
|
+
return this.options.clientFactory;
|
|
238
|
+
}
|
|
239
|
+
this.clientFactoryPromise ??= import('@cloudflare/realtimekit')
|
|
240
|
+
.then((mod) => mod.default);
|
|
241
|
+
return this.clientFactoryPromise;
|
|
242
|
+
}
|
|
243
|
+
async createUserMediaTrack(kind, constraints) {
|
|
244
|
+
const devices = this.options.mediaDevices;
|
|
245
|
+
if (!devices?.getUserMedia || constraints === false) {
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
const stream = await devices.getUserMedia(kind === 'audio'
|
|
249
|
+
? { audio: constraints, video: false }
|
|
250
|
+
: { audio: false, video: constraints });
|
|
251
|
+
return kind === 'audio' ? stream.getAudioTracks()[0] ?? null : stream.getVideoTracks()[0] ?? null;
|
|
252
|
+
}
|
|
253
|
+
rememberLocalTrack(kind, track, deviceId, stopOnCleanup) {
|
|
254
|
+
this.releaseLocalTrack(kind);
|
|
255
|
+
this.localTracks.set(kind, {
|
|
256
|
+
kind,
|
|
257
|
+
track,
|
|
258
|
+
deviceId,
|
|
259
|
+
stopOnCleanup,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
releaseLocalTrack(kind) {
|
|
263
|
+
const local = this.localTracks.get(kind);
|
|
264
|
+
if (!local)
|
|
265
|
+
return;
|
|
266
|
+
if (local.stopOnCleanup) {
|
|
267
|
+
local.track.stop();
|
|
268
|
+
}
|
|
269
|
+
this.localTracks.delete(kind);
|
|
270
|
+
}
|
|
271
|
+
attachParticipantMapListeners() {
|
|
272
|
+
const participantMap = this.getParticipantMap();
|
|
273
|
+
if (!participantMap || !this.meeting || this.joinedMapSubscriptionsAttached) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
participantMap.on('participantJoined', this.onParticipantJoined);
|
|
277
|
+
participantMap.on('participantLeft', this.onParticipantLeft);
|
|
278
|
+
participantMap.on('participantsCleared', this.onParticipantsCleared);
|
|
279
|
+
participantMap.on('participantsUpdate', this.onParticipantsUpdate);
|
|
280
|
+
this.joinedMapSubscriptionsAttached = true;
|
|
281
|
+
}
|
|
282
|
+
detachParticipantMapListeners() {
|
|
283
|
+
const participantMap = this.getParticipantMap();
|
|
284
|
+
if (!participantMap || !this.meeting || !this.joinedMapSubscriptionsAttached) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
participantMap.off('participantJoined', this.onParticipantJoined);
|
|
288
|
+
participantMap.off('participantLeft', this.onParticipantLeft);
|
|
289
|
+
participantMap.off('participantsCleared', this.onParticipantsCleared);
|
|
290
|
+
participantMap.off('participantsUpdate', this.onParticipantsUpdate);
|
|
291
|
+
this.joinedMapSubscriptionsAttached = false;
|
|
292
|
+
}
|
|
293
|
+
syncAllParticipants() {
|
|
294
|
+
const participantMap = this.getParticipantMap();
|
|
295
|
+
if (!participantMap || !this.meeting || !this.options.autoSubscribe) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
for (const participant of participantMap.values()) {
|
|
299
|
+
this.attachParticipant(participant);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
getParticipantMap() {
|
|
303
|
+
if (!this.meeting) {
|
|
304
|
+
return null;
|
|
305
|
+
}
|
|
306
|
+
return this.meeting.participants.active ?? this.meeting.participants.joined ?? null;
|
|
307
|
+
}
|
|
308
|
+
attachParticipant(participant) {
|
|
309
|
+
if (!this.options.autoSubscribe || !this.meeting) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
if (participant.id === this.meeting.self.id || this.participantListeners.has(participant.id)) {
|
|
313
|
+
this.syncParticipantTracks(participant);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const listenerSet = {
|
|
317
|
+
participant,
|
|
318
|
+
onAudioUpdate: ({ audioEnabled, audioTrack }) => {
|
|
319
|
+
this.handleRemoteTrackUpdate('audio', participant, audioTrack, audioEnabled);
|
|
320
|
+
},
|
|
321
|
+
onVideoUpdate: ({ videoEnabled, videoTrack }) => {
|
|
322
|
+
this.handleRemoteTrackUpdate('video', participant, videoTrack, videoEnabled);
|
|
323
|
+
},
|
|
324
|
+
onScreenShareUpdate: ({ screenShareEnabled, screenShareTracks }) => {
|
|
325
|
+
this.handleRemoteTrackUpdate('screen', participant, screenShareTracks.video, screenShareEnabled);
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
participant.on('audioUpdate', listenerSet.onAudioUpdate);
|
|
329
|
+
participant.on('videoUpdate', listenerSet.onVideoUpdate);
|
|
330
|
+
participant.on('screenShareUpdate', listenerSet.onScreenShareUpdate);
|
|
331
|
+
this.participantListeners.set(participant.id, listenerSet);
|
|
332
|
+
this.syncParticipantTracks(participant);
|
|
333
|
+
}
|
|
334
|
+
detachParticipant(participantId) {
|
|
335
|
+
const listenerSet = this.participantListeners.get(participantId);
|
|
336
|
+
if (!listenerSet)
|
|
337
|
+
return;
|
|
338
|
+
listenerSet.participant.off('audioUpdate', listenerSet.onAudioUpdate);
|
|
339
|
+
listenerSet.participant.off('videoUpdate', listenerSet.onVideoUpdate);
|
|
340
|
+
listenerSet.participant.off('screenShareUpdate', listenerSet.onScreenShareUpdate);
|
|
341
|
+
this.participantListeners.delete(participantId);
|
|
342
|
+
for (const kind of ['audio', 'video', 'screen']) {
|
|
343
|
+
this.remoteTrackIds.delete(buildRemoteTrackKey(participantId, kind));
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
clearParticipantListeners() {
|
|
347
|
+
for (const participantId of Array.from(this.participantListeners.keys())) {
|
|
348
|
+
this.detachParticipant(participantId);
|
|
349
|
+
}
|
|
350
|
+
this.remoteTrackIds.clear();
|
|
351
|
+
}
|
|
352
|
+
syncParticipantTracks(participant) {
|
|
353
|
+
this.handleRemoteTrackUpdate('audio', participant, participant.audioTrack, participant.audioEnabled);
|
|
354
|
+
this.handleRemoteTrackUpdate('video', participant, participant.videoTrack, participant.videoEnabled);
|
|
355
|
+
this.handleRemoteTrackUpdate('screen', participant, participant.screenShareTracks?.video, participant.screenShareEnabled);
|
|
356
|
+
}
|
|
357
|
+
handleRemoteTrackUpdate(kind, participant, track, enabled) {
|
|
358
|
+
const key = buildRemoteTrackKey(participant.id, kind);
|
|
359
|
+
if (!enabled || !track) {
|
|
360
|
+
this.remoteTrackIds.delete(key);
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
const previousTrackId = this.remoteTrackIds.get(key);
|
|
364
|
+
if (previousTrackId === track.id) {
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
this.remoteTrackIds.set(key, track.id);
|
|
368
|
+
const payload = {
|
|
369
|
+
kind,
|
|
370
|
+
track,
|
|
371
|
+
stream: new MediaStream([track]),
|
|
372
|
+
trackName: track.id,
|
|
373
|
+
providerSessionId: participant.id,
|
|
374
|
+
participantId: participant.id,
|
|
375
|
+
customParticipantId: participant.customParticipantId,
|
|
376
|
+
userId: participant.userId,
|
|
377
|
+
};
|
|
378
|
+
for (const handler of this.remoteTrackHandlers) {
|
|
379
|
+
handler(payload);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
cleanupMeeting() {
|
|
383
|
+
const meeting = this.meeting;
|
|
384
|
+
this.detachParticipantMapListeners();
|
|
385
|
+
this.clearParticipantListeners();
|
|
386
|
+
this.meeting = null;
|
|
387
|
+
this.sessionId = null;
|
|
388
|
+
this.leaveMeetingSilently(meeting);
|
|
389
|
+
}
|
|
390
|
+
assertConnectStillActive(lifecycleVersion, meeting) {
|
|
391
|
+
if (lifecycleVersion === this.lifecycleVersion) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
if (meeting) {
|
|
395
|
+
this.leaveMeetingSilently(meeting);
|
|
396
|
+
}
|
|
397
|
+
throw new Error('Cloudflare media transport was destroyed during connect.');
|
|
398
|
+
}
|
|
399
|
+
leaveMeetingSilently(meeting) {
|
|
400
|
+
if (!meeting) {
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
void meeting.leave().catch(() => { });
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
//# sourceMappingURL=room-cloudflare-media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-cloudflare-media.js","sourceRoot":"","sources":["../src/room-cloudflare-media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { RoomMediaKind, RoomMediaMember, RoomMediaRemoteTrackEvent, RoomMediaTrack, RoomMediaTransport, RoomMediaTransportConnectPayload, RoomMember, RoomMemberLeaveReason, RoomSignalMeta, Subscription } from './room.js';
|
|
2
|
+
interface RoomP2PAudioVideoControls {
|
|
3
|
+
disable(): Promise<void>;
|
|
4
|
+
setMuted?(muted: boolean): Promise<void>;
|
|
5
|
+
enable?(payload?: {
|
|
6
|
+
trackId?: string;
|
|
7
|
+
deviceId?: string;
|
|
8
|
+
providerSessionId?: string;
|
|
9
|
+
}): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
interface RoomP2PScreenControls {
|
|
12
|
+
stop(): Promise<void>;
|
|
13
|
+
start?(payload?: {
|
|
14
|
+
trackId?: string;
|
|
15
|
+
deviceId?: string;
|
|
16
|
+
providerSessionId?: string;
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
interface RoomP2PMediaAdapter {
|
|
20
|
+
media: {
|
|
21
|
+
list(): RoomMediaMember[];
|
|
22
|
+
audio: RoomP2PAudioVideoControls;
|
|
23
|
+
video: RoomP2PAudioVideoControls;
|
|
24
|
+
screen: RoomP2PScreenControls;
|
|
25
|
+
devices: {
|
|
26
|
+
switch(payload: {
|
|
27
|
+
audioInputId?: string;
|
|
28
|
+
videoInputId?: string;
|
|
29
|
+
screenInputId?: string;
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
};
|
|
32
|
+
onTrack(handler: (track: RoomMediaTrack, member: RoomMember) => void): Subscription;
|
|
33
|
+
onTrackRemoved(handler: (track: RoomMediaTrack, member: RoomMember) => void): Subscription;
|
|
34
|
+
};
|
|
35
|
+
members: {
|
|
36
|
+
list(): RoomMember[];
|
|
37
|
+
current(): RoomMember | null;
|
|
38
|
+
onSync(handler: (members: RoomMember[]) => void): Subscription;
|
|
39
|
+
onJoin(handler: (member: RoomMember) => void): Subscription;
|
|
40
|
+
onLeave(handler: (member: RoomMember, reason: RoomMemberLeaveReason) => void): Subscription;
|
|
41
|
+
};
|
|
42
|
+
signals: {
|
|
43
|
+
sendTo(memberId: string, event: string, payload?: unknown): Promise<void>;
|
|
44
|
+
on(event: string, handler: (payload: unknown, meta: RoomSignalMeta) => void): Subscription;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
type DisplayCaptureConstraints = NonNullable<MediaDevices['getDisplayMedia']> extends (constraints?: infer T) => Promise<MediaStream> ? T : MediaStreamConstraints;
|
|
48
|
+
export interface RoomP2PMediaTransportOptions {
|
|
49
|
+
rtcConfiguration?: RTCConfiguration;
|
|
50
|
+
peerConnectionFactory?: (configuration: RTCConfiguration) => RTCPeerConnection;
|
|
51
|
+
mediaDevices?: Pick<MediaDevices, 'getUserMedia' | 'getDisplayMedia'>;
|
|
52
|
+
signalPrefix?: string;
|
|
53
|
+
}
|
|
54
|
+
export declare class RoomP2PMediaTransport implements RoomMediaTransport {
|
|
55
|
+
private readonly room;
|
|
56
|
+
private readonly options;
|
|
57
|
+
private readonly localTracks;
|
|
58
|
+
private readonly peers;
|
|
59
|
+
private readonly remoteTrackHandlers;
|
|
60
|
+
private readonly remoteTrackKinds;
|
|
61
|
+
private readonly emittedRemoteTracks;
|
|
62
|
+
private readonly pendingRemoteTracks;
|
|
63
|
+
private readonly subscriptions;
|
|
64
|
+
private localMemberId;
|
|
65
|
+
private connected;
|
|
66
|
+
constructor(room: RoomP2PMediaAdapter, options?: RoomP2PMediaTransportOptions);
|
|
67
|
+
getSessionId(): string | null;
|
|
68
|
+
getPeerConnection(): RTCPeerConnection | null;
|
|
69
|
+
connect(payload?: RoomMediaTransportConnectPayload): Promise<string>;
|
|
70
|
+
private waitForCurrentMember;
|
|
71
|
+
enableAudio(constraints?: MediaTrackConstraints | boolean): Promise<MediaStreamTrack>;
|
|
72
|
+
enableVideo(constraints?: MediaTrackConstraints | boolean): Promise<MediaStreamTrack>;
|
|
73
|
+
startScreenShare(constraints?: DisplayCaptureConstraints): Promise<MediaStreamTrack>;
|
|
74
|
+
disableAudio(): Promise<void>;
|
|
75
|
+
disableVideo(): Promise<void>;
|
|
76
|
+
stopScreenShare(): Promise<void>;
|
|
77
|
+
setMuted(kind: Extract<RoomMediaKind, 'audio' | 'video'>, muted: boolean): Promise<void>;
|
|
78
|
+
switchDevices(payload: {
|
|
79
|
+
audioInputId?: string;
|
|
80
|
+
videoInputId?: string;
|
|
81
|
+
screenInputId?: string;
|
|
82
|
+
}): Promise<void>;
|
|
83
|
+
onRemoteTrack(handler: (event: RoomMediaRemoteTrackEvent) => void): Subscription;
|
|
84
|
+
destroy(): void;
|
|
85
|
+
private attachRoomSubscriptions;
|
|
86
|
+
private hydrateRemoteTrackKinds;
|
|
87
|
+
private rememberRemoteTrackKind;
|
|
88
|
+
private ensurePeer;
|
|
89
|
+
private negotiatePeer;
|
|
90
|
+
private handleDescriptionSignal;
|
|
91
|
+
private handleIceSignal;
|
|
92
|
+
private flushPendingCandidates;
|
|
93
|
+
private syncAllPeerSenders;
|
|
94
|
+
private syncPeerSenders;
|
|
95
|
+
private emitRemoteTrack;
|
|
96
|
+
private resolveFallbackRemoteTrackKind;
|
|
97
|
+
private flushPendingRemoteTracks;
|
|
98
|
+
private getPublishedVideoLikeKinds;
|
|
99
|
+
private getNextUnassignedPublishedVideoLikeKind;
|
|
100
|
+
private closePeer;
|
|
101
|
+
private removeRemoteMember;
|
|
102
|
+
private findMember;
|
|
103
|
+
private rollbackConnectedState;
|
|
104
|
+
private destroyPeer;
|
|
105
|
+
private createUserMediaTrack;
|
|
106
|
+
private rememberLocalTrack;
|
|
107
|
+
private releaseLocalTrack;
|
|
108
|
+
private ensureConnectedMemberId;
|
|
109
|
+
private normalizeDescription;
|
|
110
|
+
private normalizeCandidate;
|
|
111
|
+
private get offerEvent();
|
|
112
|
+
private get answerEvent();
|
|
113
|
+
private get iceEvent();
|
|
114
|
+
}
|
|
115
|
+
export {};
|
|
116
|
+
//# sourceMappingURL=room-p2p-media.d.ts.map
|