openvidu/openvidu-testapp/src/app/components/openvidu-instance/openvidu-instance.component.ts

1675 lines
54 KiB
TypeScript
Raw Normal View History

2026-03-31 12:06:23 +02:00
import { Component, HostListener, Input, inject } from '@angular/core';
import { NgClass, KeyValuePipe } from '@angular/common';
import { FormsModule } from '@angular/forms';
2024-07-02 19:19:05 +02:00
import { RoomConf } from '../test-sessions/test-sessions.component';
import { LivekitParamsService } from 'src/app/services/livekit-params.service';
2026-03-31 12:06:23 +02:00
import { MatDialog } from '@angular/material/dialog';
import { MatCardModule } from '@angular/material/card';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatIconModule } from '@angular/material/icon';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatExpansionModule } from '@angular/material/expansion';
2018-03-01 11:25:25 +01:00
import {
2024-07-02 19:19:05 +02:00
ConnectionQuality,
ConnectionState,
CreateLocalTracksOptions,
2024-07-02 19:19:05 +02:00
DataPacket_Kind,
DataPublishOptions,
DisconnectReason,
LocalAudioTrack,
LocalDataTrack,
2024-07-02 19:19:05 +02:00
LocalParticipant,
LocalTrack,
2024-07-02 19:19:05 +02:00
LocalTrackPublication,
LocalVideoTrack,
MediaDeviceFailure,
Participant,
ParticipantEvent,
2024-07-02 19:19:05 +02:00
RemoteAudioTrack,
RemoteDataTrack,
2024-07-02 19:19:05 +02:00
RemoteParticipant,
RemoteTrack,
RemoteTrackPublication,
RemoteVideoTrack,
Room,
RoomConnectOptions,
RoomEvent,
RoomOptions,
ScreenShareCaptureOptions,
2024-07-02 19:19:05 +02:00
SubscriptionError,
TextStreamReader,
2024-07-02 19:19:05 +02:00
Track,
TrackEvent,
2024-07-02 19:19:05 +02:00
TrackPublication,
TrackPublishOptions,
2024-07-02 19:19:05 +02:00
} from 'livekit-client';
import { ParticipantPermission } from 'livekit-server-sdk';
import {
TestAppEvent,
TestFeedService,
} from 'src/app/services/test-feed.service';
import { RoomApiDialogComponent } from '../dialogs/room-api-dialog/room-api-dialog.component';
import { RoomApiService } from 'src/app/services/room-api.service';
2018-06-15 14:45:47 +02:00
import { EventsDialogComponent } from '../dialogs/events-dialog/events-dialog.component';
import { OptionsDialogComponent } from '../dialogs/options-dialog/options-dialog.component';
import { InfoDialogComponent } from '../dialogs/info-dialog/info-dialog.component';
2026-03-31 12:06:23 +02:00
import { ParticipantComponent } from '../participant/participant.component';
import { RoomEventCallbacks } from 'node_modules/livekit-client/dist/src/room/Room';
import PCTransport from 'node_modules/livekit-client/dist/src/room/PCTransport';
import {
registerParticipantEventListeners,
registerTrackEventListeners,
removeAllManagedListeners,
} from 'src/app/utils/event-listener-utils';
@Component({
selector: 'app-openvidu-instance',
templateUrl: './openvidu-instance.component.html',
2026-03-31 12:06:23 +02:00
styleUrl: './openvidu-instance.component.css',
imports: [NgClass, KeyValuePipe, FormsModule, MatCardModule, MatFormFieldModule, MatInputModule, MatIconModule, MatButtonModule, MatCheckboxModule, MatExpansionModule, ParticipantComponent],
})
2024-07-02 19:19:05 +02:00
export class OpenviduInstanceComponent {
@Input()
2024-07-02 19:19:05 +02:00
roomConf: RoomConf;
@Input()
index: number;
2024-07-02 19:19:05 +02:00
room?: Room;
roomEvents: Map<RoomEvent, Boolean> = new Map<RoomEvent, boolean>();
participantEvents: Map<ParticipantEvent, boolean> = new Map<ParticipantEvent, boolean>();
trackEvents: Map<TrackEvent, boolean> = new Map<TrackEvent, boolean>();
private roomEventListeners: Map<string, (...args: any[]) => void> = new Map();
// Early event registration: buffers events for participant/track components
// that don't yet exist when the SDK fires events during connect()
earlyParticipantEvents: Map<string, TestAppEvent[]> = new Map();
earlyParticipantListeners: Map<string, Map<string, (...args: any[]) => void>> = new Map();
earlyTrackEvents: Map<string, TestAppEvent[]> = new Map();
earlyTrackListeners: Map<string, Map<string, (...args: any[]) => void>> = new Map();
private earlyParticipantConnectedListener: ((...args: any[]) => void) | undefined;
roomName: string = 'TestRoom';
participantName: string = 'TestParticipant';
// Options
2024-07-02 19:19:05 +02:00
roomOptions: RoomOptions = {
adaptiveStream: true,
dynacast: true,
videoCaptureDefaults: {
resolution: {
width: 640,
height: 480,
frameRate: 30,
},
},
singlePeerConnection: false
2018-05-18 12:46:41 +02:00
};
2024-07-02 19:19:05 +02:00
roomConnectOptions: RoomConnectOptions = {
autoSubscribe: false,
rtcConfig: {
iceTransportPolicy: 'all',
},
};
createLocalTracksOptions: CreateLocalTracksOptions = {
audio: true,
video: {
resolution: {
width: 1920,
height: 1080,
frameRate: 30,
},
},
};
screenShareCaptureOptions: ScreenShareCaptureOptions;
trackPublishOptions: TrackPublishOptions = {};
2024-07-02 19:19:05 +02:00
localTracks: {
audioTrack: LocalAudioTrack | undefined;
videoTrack: LocalVideoTrack | undefined;
} = { audioTrack: undefined, videoTrack: undefined };
remoteTracks: Map<
string,
{
audioTrack: RemoteAudioTrack | undefined;
videoTrack: RemoteVideoTrack | undefined;
}
2024-07-02 19:19:05 +02:00
> = new Map();
2024-07-02 19:19:05 +02:00
events: TestAppEvent[] = [];
2024-07-02 19:19:05 +02:00
private decoder = new TextDecoder();
2017-10-04 10:30:15 +02:00
2026-03-31 12:06:23 +02:00
private dialog = inject(MatDialog);
constructor(
2024-07-02 19:19:05 +02:00
private livekitParamsService: LivekitParamsService,
private testFeedService: TestFeedService,
private roomApiService: RoomApiService,
) {
const roomForDefaults = new Room(this.roomOptions);
this.roomOptions = roomForDefaults.options;
this.trackPublishOptions = roomForDefaults.options.publishDefaults!;
}
2024-07-02 19:19:05 +02:00
async ngOnInit() {
for (let event of Object.keys(RoomEvent)) {
this.roomEvents.set(RoomEvent[event as keyof typeof RoomEvent], true);
this.roomEvents.set(RoomEvent.ActiveSpeakersChanged, false);
}
for (let event of Object.keys(ParticipantEvent)) {
this.participantEvents.set(ParticipantEvent[event as keyof typeof ParticipantEvent], true);
this.participantEvents.set(ParticipantEvent.IsSpeakingChanged, false);
}
for (let event of Object.keys(TrackEvent)) {
this.trackEvents.set(TrackEvent[event as keyof typeof TrackEvent], true);
this.trackEvents.set(TrackEvent.TimeSyncUpdate, false);
}
2024-07-02 19:19:05 +02:00
this.participantName += this.index;
if (this.roomConf.startSession) {
const token = await this.roomApiService.createToken(
{ roomJoin: true, canPublishData: true },
2024-07-02 19:19:05 +02:00
this.participantName,
this.roomName
);
this.connectRoom(token);
}
}
ngOnDestroy() {
2024-07-02 19:19:05 +02:00
this.disconnectRoom();
}
@HostListener('window:beforeunload')
beforeunloadHandler() {
2024-07-02 19:19:05 +02:00
this.disconnectRoom();
}
2024-07-02 19:19:05 +02:00
async createTokenAndConnectRoom() {
this.connectRoom(
await this.roomApiService.createToken(
{ roomJoin: true, canPublishData: true },
2024-07-02 19:19:05 +02:00
this.participantName,
this.roomName
)
);
}
2024-07-02 19:19:05 +02:00
async connectRoom(token: string): Promise<void> {
// creates a new room with options
this.room = new Room(this.roomOptions);
2026-05-25 18:54:46 +02:00
(window as any)['room_' + this.index] = this.room;
// Register early participant event listeners on local participant BEFORE connect
this.registerEarlyParticipantListeners(this.room.localParticipant);
// Register early participant event listeners on remote participants as they connect
// This fires during connect() for participants already in the room
this.earlyParticipantConnectedListener = (participant: RemoteParticipant) => {
this.registerEarlyParticipantListeners(participant);
};
this.room.addListener(RoomEvent.ParticipantConnected, this.earlyParticipantConnectedListener as any);
2024-07-02 19:19:05 +02:00
this.setupRoomEventListeners(new Map(), true);
2024-07-02 19:19:05 +02:00
// connect to room
await this.room.connect(
this.livekitParamsService.getParams().livekitUrl,
token,
this.roomConnectOptions
);
2023-02-08 09:49:11 +01:00
2024-07-02 19:19:05 +02:00
if (this.roomConf.publisher) {
const tracks: LocalTrack[] = [];
if (
this.createLocalTracksOptions.audio ||
this.createLocalTracksOptions.video
) {
tracks.push(
...(await this.room.localParticipant.createTracks(
this.createLocalTracksOptions
))
);
}
if (this.screenShareCaptureOptions) {
const screenTracks: LocalTrack[] =
await this.room.localParticipant.createScreenTracks(
this.screenShareCaptureOptions
);
tracks.push(...screenTracks);
}
await Promise.all(
tracks.map((track) =>
this.room!.localParticipant.publishTrack(
track,
this.trackPublishOptions
)
)
);
2024-07-02 19:19:05 +02:00
}
}
private registerRoomListener(event: RoomEvent, listener: (...args: any[]) => void) {
this.room!.addListener(event, listener as any);
this.roomEventListeners.set(event, listener);
}
private unregisterRoomListener(event: RoomEvent | string) {
const existing = this.roomEventListeners.get(event as string);
if (existing) {
this.room?.removeListener(event as RoomEvent, existing as any);
this.roomEventListeners.delete(event as string);
}
}
2024-07-02 19:19:05 +02:00
setupRoomEventListeners(oldValues: Map<string, boolean>, firstTime: boolean) {
// This is a link to the complete list of Room events
let callbacks: RoomEventCallbacks;
let events: RoomEvent;
if (
firstTime ||
this.roomEvents.get(RoomEvent.Connected) !==
oldValues.get(RoomEvent.Connected)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.Connected);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.Connected)) {
this.registerRoomListener(RoomEvent.Connected, () => {
2024-07-02 19:19:05 +02:00
this.updateEventList(RoomEvent.Connected, {}, '');
this.room!.remoteParticipants.forEach(
(remoteParticipant: RemoteParticipant) => {
if (this.roomConf.subscriber) {
// Subscribe to already existing tracks
remoteParticipant.trackPublications.forEach(
(publication: RemoteTrackPublication) => {
publication.setSubscribed(true);
}
);
}
}
);
});
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.Reconnecting) !==
oldValues.get(RoomEvent.Reconnecting)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.Reconnecting);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.Reconnecting)) {
this.registerRoomListener(RoomEvent.Reconnecting, () => {
2024-07-02 19:19:05 +02:00
this.updateEventList(RoomEvent.Reconnecting, {}, '');
});
}
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.SignalReconnecting) !==
oldValues.get(RoomEvent.SignalReconnecting)
) {
this.unregisterRoomListener(RoomEvent.SignalReconnecting);
if (this.roomEvents.get(RoomEvent.SignalReconnecting)) {
this.registerRoomListener(RoomEvent.SignalReconnecting, () => {
this.updateEventList(RoomEvent.SignalReconnecting, {}, '');
});
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.Reconnected) !==
oldValues.get(RoomEvent.Reconnected)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.Reconnected);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.Reconnected)) {
this.registerRoomListener(RoomEvent.Reconnected, () => {
2024-07-02 19:19:05 +02:00
this.updateEventList(RoomEvent.Reconnected, {}, '');
});
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.Disconnected) !==
oldValues.get(RoomEvent.Disconnected)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.Disconnected);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.Disconnected)) {
this.registerRoomListener(RoomEvent.Disconnected, (reason?: DisconnectReason) => {
this.updateEventList(
RoomEvent.Disconnected,
{},
`Reason: ${reason ? DisconnectReason[reason] : reason}`
);
2024-07-02 19:19:05 +02:00
});
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.ConnectionStateChanged) !==
oldValues.get(RoomEvent.ConnectionStateChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.ConnectionStateChanged);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.ConnectionStateChanged)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.ConnectionStateChanged,
(state: ConnectionState) => {
this.updateEventList(
RoomEvent.ConnectionStateChanged,
{ state },
state
);
}
);
}
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.Moved) !==
oldValues.get(RoomEvent.Moved)
) {
this.unregisterRoomListener(RoomEvent.Moved);
if (this.roomEvents.get(RoomEvent.Moved)) {
this.registerRoomListener(RoomEvent.Moved, (name: string) => {
this.updateEventList(
RoomEvent.Moved,
{ name },
`moved to room: ${name}`
);
});
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.MediaDevicesChanged) !==
oldValues.get(RoomEvent.MediaDevicesChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.MediaDevicesChanged);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.MediaDevicesChanged)) {
this.registerRoomListener(RoomEvent.MediaDevicesChanged, () => {
2024-07-02 19:19:05 +02:00
this.updateEventList(RoomEvent.MediaDevicesChanged, {}, '');
});
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.ParticipantConnected) !==
oldValues.get(RoomEvent.ParticipantConnected)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.ParticipantConnected);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.ParticipantConnected)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.ParticipantConnected,
(participant: RemoteParticipant) => {
this.updateEventList(
RoomEvent.ParticipantConnected,
{ participant },
participant.identity
);
}
);
}
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.ParticipantActive) !==
oldValues.get(RoomEvent.ParticipantActive)
) {
this.unregisterRoomListener(RoomEvent.ParticipantActive);
if (this.roomEvents.get(RoomEvent.ParticipantActive)) {
this.registerRoomListener(
RoomEvent.ParticipantActive,
(participant: Participant) => {
this.updateEventList(
RoomEvent.ParticipantActive,
{ participant },
participant.identity
);
}
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.ParticipantDisconnected) !==
oldValues.get(RoomEvent.ParticipantDisconnected)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.ParticipantDisconnected);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.ParticipantDisconnected)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.ParticipantDisconnected,
(participant: RemoteParticipant) => {
this.updateEventList(
RoomEvent.ParticipantDisconnected,
{ participant },
participant.identity
);
this.remoteTracks.delete(participant.identity);
}
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.TrackPublished) !==
oldValues.get(RoomEvent.TrackPublished)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.TrackPublished);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.TrackPublished)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.TrackPublished,
(
publication: RemoteTrackPublication,
participant: RemoteParticipant
) => {
this.updateEventList(
RoomEvent.TrackPublished,
{ publication, participant },
`${participant.identity} (${publication.source})`
);
if (this.roomConf.subscriber) {
publication.setSubscribed(true);
}
}
);
}
}
2017-12-11 17:09:57 +01:00
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.TrackSubscribed) !==
oldValues.get(RoomEvent.TrackSubscribed)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.TrackSubscribed);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.TrackSubscribed)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.TrackSubscribed,
(
track: RemoteTrack,
publication: RemoteTrackPublication,
participant: RemoteParticipant
) => {
this.updateEventList(
RoomEvent.TrackSubscribed,
{ track, publication, participant },
`${participant.identity} (${publication.source})`
);
if (!this.remoteTracks.has(participant.identity)) {
this.remoteTracks.set(participant.identity, {
audioTrack: undefined,
videoTrack: undefined,
});
}
if (publication.kind === Track.Kind.Video) {
this.remoteTracks.get(participant.identity)!.videoTrack =
track as RemoteVideoTrack;
} else if (publication.kind === Track.Kind.Audio) {
this.remoteTracks.get(participant.identity)!.audioTrack =
track as RemoteAudioTrack;
} else {
console.warn('Unknown track kind');
}
}
);
}
}
2018-03-01 11:25:25 +01:00
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.TrackSubscriptionFailed) !==
oldValues.get(RoomEvent.TrackSubscriptionFailed)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.TrackSubscriptionFailed);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.TrackSubscriptionFailed)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.TrackSubscriptionFailed,
(
trackSid: string,
participant: RemoteParticipant,
reason?: SubscriptionError
) => {
this.updateEventList(
RoomEvent.TrackSubscriptionFailed,
{ trackSid, participant },
`${participant.identity} (${trackSid}). Reason: ${
reason ? SubscriptionError[reason] : reason
}`
2024-07-02 19:19:05 +02:00
);
}
2024-07-02 19:19:05 +02:00
);
}
2018-03-01 11:25:25 +01:00
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.TrackUnpublished) !==
oldValues.get(RoomEvent.TrackUnpublished)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.TrackUnpublished);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.TrackUnpublished)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.TrackUnpublished,
(
publication: RemoteTrackPublication,
participant: RemoteParticipant
) => {
this.updateEventList(
RoomEvent.TrackUnpublished,
{ publication, participant },
`${participant.identity} (${publication.source})`
);
}
2024-07-02 19:19:05 +02:00
);
}
2018-03-01 11:25:25 +01:00
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.TrackUnsubscribed) !==
oldValues.get(RoomEvent.TrackUnsubscribed)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.TrackUnsubscribed);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.TrackUnsubscribed)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.TrackUnsubscribed,
(
track: Track,
publication: RemoteTrackPublication,
participant: RemoteParticipant
) => {
this.updateEventList(
RoomEvent.TrackUnsubscribed,
{ track, publication, participant },
`${participant.identity} (${publication.source})`
);
let remoteTracks = this.remoteTracks.get(participant.identity);
if (remoteTracks) {
if (publication.kind === Track.Kind.Video) {
delete remoteTracks.videoTrack;
} else if (publication.kind === Track.Kind.Audio) {
delete remoteTracks.audioTrack;
} else {
console.warn('Unknown track kind');
}
if (
remoteTracks.audioTrack === undefined &&
remoteTracks.videoTrack === undefined
) {
this.remoteTracks.delete(participant.identity);
}
}
track.detach();
}
2024-07-02 19:19:05 +02:00
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.TrackMuted) !==
oldValues.get(RoomEvent.TrackMuted)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.TrackMuted);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.TrackMuted)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.TrackMuted,
(publication: TrackPublication, participant: Participant) => {
this.updateEventList(
RoomEvent.TrackMuted,
{ publication, participant },
`${participant.identity} (${publication.source})`
);
}
);
2020-10-22 20:42:54 +02:00
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.TrackUnmuted) !==
oldValues.get(RoomEvent.TrackUnmuted)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.TrackUnmuted);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.TrackUnmuted)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.TrackUnmuted,
(publication: TrackPublication, participant: Participant) => {
this.updateEventList(
RoomEvent.TrackUnmuted,
{ publication, participant },
`${participant.identity} (${publication.source})`
);
}
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.LocalTrackPublished) !==
oldValues.get(RoomEvent.LocalTrackPublished)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.LocalTrackPublished);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.LocalTrackPublished)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.LocalTrackPublished,
(
publication: LocalTrackPublication,
participant: LocalParticipant
) => {
this.updateEventList(
RoomEvent.LocalTrackPublished,
{ publication, participant },
publication.source
);
if (publication.kind === Track.Kind.Video) {
this.localTracks.videoTrack = publication.videoTrack;
} else if (publication.kind === Track.Kind.Audio) {
this.localTracks.audioTrack = publication.audioTrack;
}
}
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.LocalTrackUnpublished) !==
oldValues.get(RoomEvent.LocalTrackUnpublished)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.LocalTrackUnpublished);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.LocalTrackUnpublished)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.LocalTrackUnpublished,
(
publication: LocalTrackPublication,
participant: LocalParticipant
) => {
this.updateEventList(
RoomEvent.LocalTrackUnpublished,
{ publication, participant },
publication.source
);
publication.track!.detach();
}
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.LocalAudioSilenceDetected) !==
oldValues.get(RoomEvent.LocalAudioSilenceDetected)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.LocalAudioSilenceDetected);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.LocalAudioSilenceDetected)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.LocalAudioSilenceDetected,
(publication: LocalTrackPublication) => {
this.updateEventList(
RoomEvent.LocalAudioSilenceDetected,
{ publication },
publication.source
);
}
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.ParticipantMetadataChanged) !==
oldValues.get(RoomEvent.ParticipantMetadataChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.ParticipantMetadataChanged);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.ParticipantMetadataChanged)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.ParticipantMetadataChanged,
(metadata: string | undefined, participant: Participant) => {
this.updateEventList(
RoomEvent.ParticipantMetadataChanged,
{ metadata, participant },
`previous: ${metadata}, new: ${participant.metadata}`
);
}
2024-07-02 19:19:05 +02:00
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.ParticipantNameChanged) !==
oldValues.get(RoomEvent.ParticipantNameChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.ParticipantNameChanged);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.ParticipantNameChanged)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.ParticipantNameChanged,
(name: string, participant: Participant) => {
this.updateEventList(
RoomEvent.ParticipantNameChanged,
{ name, participant },
`${participant.identity} (${name})`
);
}
);
}
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.ParticipantAttributesChanged) !==
oldValues.get(RoomEvent.ParticipantAttributesChanged)
) {
this.unregisterRoomListener(RoomEvent.ParticipantAttributesChanged);
if (this.roomEvents.get(RoomEvent.ParticipantAttributesChanged)) {
this.registerRoomListener(
RoomEvent.ParticipantAttributesChanged,
(
changedAttributes: Record<string, string>,
participant: RemoteParticipant | LocalParticipant
) => {
this.updateEventList(
RoomEvent.ParticipantAttributesChanged,
{ changedAttributes, participant },
`${participant.identity} ${JSON.stringify(changedAttributes)}`
);
}
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.ParticipantPermissionsChanged) !==
oldValues.get(RoomEvent.ParticipantPermissionsChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.ParticipantPermissionsChanged);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.ParticipantPermissionsChanged)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.ParticipantPermissionsChanged,
(
prevPermissions: ParticipantPermission | undefined,
participant: RemoteParticipant | LocalParticipant
) => {
this.updateEventList(
RoomEvent.ParticipantPermissionsChanged,
{ prevPermissions, participant },
`${
participant.identity
2024-07-02 19:19:05 +02:00
} (previous: ${prevPermissions}, new: ${JSON.stringify(
participant.permissions
)}`
);
}
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.ActiveSpeakersChanged) !==
oldValues.get(RoomEvent.ActiveSpeakersChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.ActiveSpeakersChanged);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.ActiveSpeakersChanged)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.ActiveSpeakersChanged,
(speakers: Participant[]) => {
this.updateEventList(
RoomEvent.ActiveSpeakersChanged,
{ speakers },
JSON.stringify(
speakers.map(
(speaker) => `${speaker.identity}: ${speaker.audioLevel}`
)
)
);
}
);
}
2018-03-02 11:36:12 +01:00
}
2018-03-01 11:25:25 +01:00
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.RoomMetadataChanged) !==
oldValues.get(RoomEvent.RoomMetadataChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.RoomMetadataChanged);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.RoomMetadataChanged)) {
this.registerRoomListener(RoomEvent.RoomMetadataChanged, (metadata: string) => {
2024-07-02 19:19:05 +02:00
this.updateEventList(
RoomEvent.RoomMetadataChanged,
{ metadata },
metadata
);
});
2018-03-02 11:36:12 +01:00
}
2018-03-01 11:25:25 +01:00
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.DataReceived) !==
oldValues.get(RoomEvent.DataReceived)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.DataReceived);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.DataReceived)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.DataReceived,
(
payload: Uint8Array,
participant?: RemoteParticipant,
kind?: DataPacket_Kind,
topic?: string
) => {
let decodedPayload = this.decoder.decode(payload);
decodedPayload += ` (kind: ${DataPacket_Kind[kind!]})`;
2024-07-02 19:19:05 +02:00
this.updateEventList(
RoomEvent.DataReceived,
{ payload: decodedPayload, participant, kind, topic },
decodedPayload
);
}
);
2023-02-06 12:45:17 +01:00
}
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.SipDTMFReceived) !==
oldValues.get(RoomEvent.SipDTMFReceived)
) {
this.unregisterRoomListener(RoomEvent.SipDTMFReceived);
if (this.roomEvents.get(RoomEvent.SipDTMFReceived)) {
this.registerRoomListener(
RoomEvent.SipDTMFReceived,
(dtmf: any, participant?: RemoteParticipant) => {
this.updateEventList(
RoomEvent.SipDTMFReceived,
{ dtmf, participant },
`${participant?.identity ?? 'unknown'} ${JSON.stringify(dtmf)}`
);
}
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.ConnectionQualityChanged) !==
oldValues.get(RoomEvent.ConnectionQualityChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.ConnectionQualityChanged);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.ConnectionQualityChanged)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.ConnectionQualityChanged,
(quality: ConnectionQuality, participant: Participant) => {
this.updateEventList(
RoomEvent.ConnectionQualityChanged,
{ quality, participant },
`${participant.identity} (${quality})`
);
}
);
2023-02-06 12:45:17 +01:00
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.MediaDevicesError) !==
oldValues.get(RoomEvent.MediaDevicesError)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.MediaDevicesError);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.MediaDevicesError)) {
this.registerRoomListener(RoomEvent.MediaDevicesError, (error: Error) => {
2024-07-02 19:19:05 +02:00
this.updateEventList(
RoomEvent.MediaDevicesError,
{
error: error.message,
failure: MediaDeviceFailure.getFailure(error),
},
`${error.message} (${MediaDeviceFailure.getFailure(error)})`
);
});
2018-03-02 11:36:12 +01:00
}
2018-03-01 11:25:25 +01:00
}
2018-03-02 11:36:12 +01:00
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.TrackStreamStateChanged) !==
oldValues.get(RoomEvent.TrackStreamStateChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.TrackStreamStateChanged);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.TrackStreamStateChanged)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.TrackStreamStateChanged,
(
publication: RemoteTrackPublication,
streamState: Track.StreamState,
participant: RemoteParticipant
) => {
this.updateEventList(
RoomEvent.TrackStreamStateChanged,
{ publication, streamState, participant },
`${participant.identity} (${publication.source}: ${streamState})`
);
}
);
}
2024-07-02 19:19:05 +02:00
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.TrackSubscriptionPermissionChanged) !==
oldValues.get(RoomEvent.TrackSubscriptionPermissionChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.TrackSubscriptionPermissionChanged
);
if (this.roomEvents.get(RoomEvent.TrackSubscriptionPermissionChanged)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.TrackSubscriptionPermissionChanged,
(
publication: RemoteTrackPublication,
status: TrackPublication.PermissionStatus,
participant: RemoteParticipant
) => {
this.updateEventList(
RoomEvent.TrackSubscriptionPermissionChanged,
{ publication, status, participant },
`${participant.identity} (${publication.source}: ${status})`
);
}
);
}
2018-03-02 11:36:12 +01:00
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.TrackSubscriptionStatusChanged) !==
oldValues.get(RoomEvent.TrackSubscriptionStatusChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.TrackSubscriptionStatusChanged);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.TrackSubscriptionStatusChanged)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.TrackSubscriptionStatusChanged,
(
publication: RemoteTrackPublication,
status: TrackPublication.SubscriptionStatus,
participant: RemoteParticipant
) => {
this.updateEventList(
RoomEvent.TrackSubscriptionStatusChanged,
{ publication, status, participant },
`${participant.identity} (${publication.source} to ${status})`
);
}
);
}
2024-07-02 19:19:05 +02:00
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.AudioPlaybackStatusChanged) !==
oldValues.get(RoomEvent.AudioPlaybackStatusChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.AudioPlaybackStatusChanged);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.AudioPlaybackStatusChanged)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.AudioPlaybackStatusChanged,
(playing: boolean) => {
this.updateEventList(
RoomEvent.AudioPlaybackStatusChanged,
{ playing },
`canPlaybackAudio: ${this.room!.canPlaybackAudio}`
);
}
2024-07-02 19:19:05 +02:00
);
}
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.VideoPlaybackStatusChanged) !==
oldValues.get(RoomEvent.VideoPlaybackStatusChanged)
) {
this.unregisterRoomListener(RoomEvent.VideoPlaybackStatusChanged);
if (this.roomEvents.get(RoomEvent.VideoPlaybackStatusChanged)) {
this.registerRoomListener(
RoomEvent.VideoPlaybackStatusChanged,
(playing: boolean) => {
this.updateEventList(
RoomEvent.VideoPlaybackStatusChanged,
{ playing },
`canPlaybackVideo: ${playing}`
);
}
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.SignalConnected) !==
oldValues.get(RoomEvent.SignalConnected)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.SignalConnected);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.SignalConnected)) {
this.registerRoomListener(RoomEvent.SignalConnected, () => {
2024-07-02 19:19:05 +02:00
this.updateEventList(RoomEvent.SignalConnected, {}, '');
});
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.RecordingStatusChanged) !==
oldValues.get(RoomEvent.RecordingStatusChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.RecordingStatusChanged);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.RecordingStatusChanged)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.RecordingStatusChanged,
(recording: boolean) => {
this.updateEventList(
RoomEvent.RecordingStatusChanged,
{ recording },
`recording: ${recording}`
);
}
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.ParticipantEncryptionStatusChanged) !==
oldValues.get(RoomEvent.ParticipantEncryptionStatusChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.ParticipantEncryptionStatusChanged
);
if (this.roomEvents.get(RoomEvent.ParticipantEncryptionStatusChanged)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.ParticipantEncryptionStatusChanged,
(encrypted: boolean, participant?: Participant) => {
this.updateEventList(
RoomEvent.ParticipantEncryptionStatusChanged,
{ encrypted, participant },
`${participant?.identity} (encrypted: ${encrypted})`
);
}
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.EncryptionError) !==
oldValues.get(RoomEvent.EncryptionError)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.EncryptionError);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.EncryptionError)) {
this.registerRoomListener(RoomEvent.EncryptionError, (error: Error) => {
2024-07-02 19:19:05 +02:00
this.updateEventList(
RoomEvent.EncryptionError,
{ error: error.message },
`${error.message}`
);
});
}
}
2018-03-01 11:25:25 +01:00
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.DCBufferStatusChanged) !==
oldValues.get(RoomEvent.DCBufferStatusChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.DCBufferStatusChanged);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.DCBufferStatusChanged)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.DCBufferStatusChanged,
(isLow: boolean, kind: any) => {
2024-07-02 19:19:05 +02:00
this.updateEventList(
RoomEvent.DCBufferStatusChanged,
{ isLow, kind },
`isLow: ${isLow} (${kind})`
);
}
2024-07-02 19:19:05 +02:00
);
}
}
2024-07-02 19:19:05 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.ActiveDeviceChanged) !==
oldValues.get(RoomEvent.ActiveDeviceChanged)
2024-07-02 19:19:05 +02:00
) {
this.unregisterRoomListener(RoomEvent.ActiveDeviceChanged);
2024-07-02 19:19:05 +02:00
if (this.roomEvents.get(RoomEvent.ActiveDeviceChanged)) {
this.registerRoomListener(
2024-07-02 19:19:05 +02:00
RoomEvent.ActiveDeviceChanged,
(kind: MediaDeviceKind, deviceId: string) => {
this.updateEventList(
RoomEvent.DCBufferStatusChanged,
{ kind, deviceId },
`${kind} (${deviceId})`
);
}
);
}
2024-07-02 19:19:05 +02:00
}
2024-09-30 15:19:33 +02:00
if (
firstTime ||
this.roomEvents.get(RoomEvent.LocalTrackSubscribed) !==
oldValues.get(RoomEvent.LocalTrackSubscribed)
2024-09-30 15:19:33 +02:00
) {
this.unregisterRoomListener(RoomEvent.LocalTrackSubscribed);
2024-09-30 15:19:33 +02:00
if (this.roomEvents.get(RoomEvent.LocalTrackSubscribed)) {
this.registerRoomListener(
2024-09-30 15:19:33 +02:00
RoomEvent.LocalTrackSubscribed,
(
publication: LocalTrackPublication,
participant: LocalParticipant
) => {
this.updateEventList(
RoomEvent.LocalTrackSubscribed,
{ publication, participant },
`${publication.source}`
);
}
);
}
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.ChatMessage) !==
oldValues.get(RoomEvent.ChatMessage)
) {
this.unregisterRoomListener(RoomEvent.ChatMessage);
if (this.roomEvents.get(RoomEvent.ChatMessage)) {
this.registerRoomListener(
RoomEvent.ChatMessage,
(message: any, participant?: RemoteParticipant | LocalParticipant) => {
this.updateEventList(
RoomEvent.ChatMessage,
{ message, participant },
`${participant?.identity ?? 'unknown'}: ${message.message}`
);
}
);
}
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.MetricsReceived) !==
oldValues.get(RoomEvent.MetricsReceived)
) {
this.unregisterRoomListener(RoomEvent.MetricsReceived);
if (this.roomEvents.get(RoomEvent.MetricsReceived)) {
this.registerRoomListener(
RoomEvent.MetricsReceived,
(metrics: any, participant?: Participant) => {
this.updateEventList(
RoomEvent.MetricsReceived,
{ metrics, participant },
`${participant?.identity ?? 'unknown'}`
);
}
);
}
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.TranscriptionReceived) !==
oldValues.get(RoomEvent.TranscriptionReceived)
) {
this.room?.unregisterTextStreamHandler('lk.transcription');
if (this.roomEvents.get(RoomEvent.TranscriptionReceived)) {
this.room?.registerTextStreamHandler(
'lk.transcription',
async (reader: TextStreamReader, participantInfo) => {
const message = await reader.readAll();
const isFinal =
reader.info.attributes!['lk.transcription_final'] === 'true';
this.updateEventList(
isFinal
? ('finalTranscription' as any)
: ('interimTranscription' as any),
{ participant: participantInfo.identity, message },
`${participantInfo.identity} ${
isFinal ? 'said' : 'is saying'
}: ${message}`,
isFinal ? 'RoomEvent' : 'RoomEvent-InterimTranscription'
);
}
);
}
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.DataTrackPublished) !==
oldValues.get(RoomEvent.DataTrackPublished)
) {
this.unregisterRoomListener(RoomEvent.DataTrackPublished);
if (this.roomEvents.get(RoomEvent.DataTrackPublished)) {
this.registerRoomListener(
RoomEvent.DataTrackPublished,
(track: RemoteDataTrack) => {
this.updateEventList(
RoomEvent.DataTrackPublished,
{ name: track.info.name, sid: track.info.sid, publisherIdentity: track.publisherIdentity },
`${track.publisherIdentity} (${track.info.name})`
);
}
);
}
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.DataTrackUnpublished) !==
oldValues.get(RoomEvent.DataTrackUnpublished)
) {
this.unregisterRoomListener(RoomEvent.DataTrackUnpublished);
if (this.roomEvents.get(RoomEvent.DataTrackUnpublished)) {
this.registerRoomListener(
RoomEvent.DataTrackUnpublished,
(sid: string) => {
this.updateEventList(
RoomEvent.DataTrackUnpublished,
{ sid },
`sid: ${sid}`
);
}
);
}
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.LocalDataTrackPublished) !==
oldValues.get(RoomEvent.LocalDataTrackPublished)
) {
this.unregisterRoomListener(RoomEvent.LocalDataTrackPublished);
if (this.roomEvents.get(RoomEvent.LocalDataTrackPublished)) {
this.registerRoomListener(
RoomEvent.LocalDataTrackPublished,
(track: LocalDataTrack) => {
this.updateEventList(
RoomEvent.LocalDataTrackPublished,
{ name: track.info?.name, sid: track.info?.sid },
`${track.info?.name}`
);
}
);
}
}
if (
firstTime ||
this.roomEvents.get(RoomEvent.LocalDataTrackUnpublished) !==
oldValues.get(RoomEvent.LocalDataTrackUnpublished)
) {
this.unregisterRoomListener(RoomEvent.LocalDataTrackUnpublished);
if (this.roomEvents.get(RoomEvent.LocalDataTrackUnpublished)) {
this.registerRoomListener(
RoomEvent.LocalDataTrackUnpublished,
(sid: string) => {
this.updateEventList(
RoomEvent.LocalDataTrackUnpublished,
{ sid },
`sid: ${sid}`
);
}
);
}
}
2024-07-02 19:19:05 +02:00
}
2024-07-02 19:19:05 +02:00
updateEventList(
eventType: RoomEvent,
eventContent: any,
eventDescription: string,
eventCategory = 'RoomEvent'
2024-07-02 19:19:05 +02:00
) {
const event: TestAppEvent = {
eventType,
eventCategory: eventCategory as any,
2024-07-02 19:19:05 +02:00
eventContent,
eventDescription,
};
this.events.push(event);
this.testFeedService.pushNewEvent({ user: this.index, event });
}
2024-07-02 19:19:05 +02:00
async disconnectRoom() {
if (this.room) {
// Clean up early listeners that were never handed off
if (this.earlyParticipantConnectedListener) {
this.room.removeListener(
RoomEvent.ParticipantConnected,
this.earlyParticipantConnectedListener as any
);
this.earlyParticipantConnectedListener = undefined;
}
for (const [key, listeners] of this.earlyParticipantListeners) {
const participant =
this.room.localParticipant.sid === key || this.room.localParticipant.identity === key
? this.room.localParticipant
: this.room.remoteParticipants.get(key);
if (participant) {
removeAllManagedListeners(participant, listeners);
}
}
this.earlyParticipantEvents.clear();
this.earlyParticipantListeners.clear();
for (const [, listeners] of this.earlyTrackListeners) {
// Track listeners are cleaned up by disconnect, but clear maps
listeners.clear();
}
this.earlyTrackEvents.clear();
this.earlyTrackListeners.clear();
2024-07-02 19:19:05 +02:00
await this.room.disconnect();
delete this.room;
delete this.localTracks.audioTrack;
delete this.localTracks.videoTrack;
this.remoteTracks.clear();
}
}
private registerEarlyParticipantListeners(participant: Participant) {
const key = participant.sid || participant.identity;
const buffer: TestAppEvent[] = [];
this.earlyParticipantEvents.set(key, buffer);
const listeners = registerParticipantEventListeners(
participant,
(eventType, eventContent, eventDescription) => {
if (this.participantEvents.size > 0 && !this.participantEvents.get(eventType)) return;
const event: TestAppEvent = {
eventType,
eventCategory: 'ParticipantEvent',
eventContent,
eventDescription,
};
buffer.push(event);
this.testFeedService.pushNewEvent({ user: this.index, event });
// When a track becomes available during early registration, register early track listeners too
if (eventType === ParticipantEvent.TrackSubscribed && eventContent.track) {
this.registerEarlyTrackListeners(eventContent.track);
} else if (eventType === ParticipantEvent.LocalTrackPublished && eventContent.publication?.track) {
this.registerEarlyTrackListeners(eventContent.publication.track);
}
},
this.decoder
);
this.earlyParticipantListeners.set(key, listeners);
}
private registerEarlyTrackListeners(track: Track) {
const key = track.sid || track.mediaStreamID;
const buffer: TestAppEvent[] = [];
this.earlyTrackEvents.set(key, buffer);
const listeners = registerTrackEventListeners(
track,
(eventType, eventContent, eventDescription) => {
if (this.trackEvents.size > 0 && !this.trackEvents.get(eventType)) return;
const event: TestAppEvent = {
eventType,
eventCategory: 'TrackEvent',
eventContent,
eventDescription,
};
buffer.push(event);
this.testFeedService.pushNewEvent({ user: this.index, event });
}
);
this.earlyTrackListeners.set(key, listeners);
}
2024-07-02 19:19:05 +02:00
async setCameraEnabled() {
this.room!.localParticipant.setCameraEnabled(true);
}
2018-05-18 12:46:41 +02:00
2024-07-02 19:19:05 +02:00
async setMicrophoneEnabled() {
this.room!.localParticipant.setMicrophoneEnabled(true);
}
openOptionsDialog() {
const dialogRef = this.dialog.open(OptionsDialogComponent, {
data: {
roomOptions: this.roomOptions,
forceRelay:
this.roomConnectOptions.rtcConfig!.iceTransportPolicy === 'relay',
createLocalTracksOptions: this.createLocalTracksOptions,
shareScreen: true,
screenShareCaptureOptions: this.screenShareCaptureOptions,
trackPublishOptions: this.trackPublishOptions,
},
});
dialogRef.afterClosed().subscribe((result) => {
if (!!result) {
this.roomOptions = result.roomOptions;
this.roomConnectOptions.rtcConfig!.iceTransportPolicy =
result.forceRelay ? 'relay' : 'all';
this.createLocalTracksOptions = result.createLocalTracksOptions;
this.screenShareCaptureOptions = result.screenShareCaptureOptions;
this.trackPublishOptions = result.trackPublishOptions;
if (
this.createLocalTracksOptions.audio != undefined &&
typeof this.createLocalTracksOptions.audio !== 'boolean'
) {
this.roomOptions.audioCaptureDefaults =
this.createLocalTracksOptions.audio;
}
if (
this.createLocalTracksOptions.video != undefined &&
typeof this.createLocalTracksOptions.video !== 'boolean'
) {
this.roomOptions.videoCaptureDefaults =
this.createLocalTracksOptions.video;
}
if (this.trackPublishOptions != undefined) {
this.roomOptions.publishDefaults = this.trackPublishOptions;
}
}
});
2018-05-18 12:46:41 +02:00
}
2024-07-02 19:19:05 +02:00
openRoomApiDialog() {
const dialogRef = this.dialog.open(RoomApiDialogComponent, {
2018-05-18 12:46:41 +02:00
data: {
2024-07-02 19:19:05 +02:00
room: this.room,
localParticipant: this.room?.localParticipant,
2018-05-18 12:46:41 +02:00
},
2024-07-02 19:19:05 +02:00
disableClose: true,
2018-05-18 12:46:41 +02:00
});
2024-07-02 19:19:05 +02:00
dialogRef.afterClosed().subscribe((result) => {
document
.getElementById('room-api-btn-' + this.index)
?.classList.remove('cdk-program-focused');
});
}
openAllEventsDialog() {
const oldRoomValues: Map<string, boolean> = new Map(
2024-07-02 19:19:05 +02:00
JSON.parse(JSON.stringify([...this.roomEvents]))
);
const dialogRef = this.dialog.open(EventsDialogComponent, {
data: {
eventGroups: [
{ label: 'RoomEvent', eventCollection: this.roomEvents },
{ label: 'ParticipantEvent', eventCollection: this.participantEvents },
{ label: 'TrackEvent', eventCollection: this.trackEvents },
],
target: 'All',
},
2024-07-02 19:19:05 +02:00
width: '800px',
autoFocus: false,
2024-07-02 19:19:05 +02:00
disableClose: true,
2018-05-18 12:46:41 +02:00
});
2024-07-02 19:19:05 +02:00
dialogRef.afterClosed().subscribe((result) => {
if (
!!this.room &&
JSON.stringify(Array.from(this.roomEvents.entries())) !==
JSON.stringify(Array.from(oldRoomValues.entries()))
2024-07-02 19:19:05 +02:00
) {
this.setupRoomEventListeners(oldRoomValues, false);
}
});
}
sendData(destinationIdentity?: string, reliable: boolean = true) {
2024-07-02 19:19:05 +02:00
let strData = `Message from ${this.room?.localParticipant.identity}`;
strData += destinationIdentity
? ` to ${destinationIdentity}`
: ' to all room';
2024-07-02 19:19:05 +02:00
const data = new TextEncoder().encode(strData);
let options: DataPublishOptions = {
reliable,
2024-07-02 19:19:05 +02:00
};
if (destinationIdentity) {
options.destinationIdentities = [destinationIdentity];
}
2024-07-02 19:19:05 +02:00
this.room?.localParticipant.publishData(data, options);
}
sendDataReliable(destinationIdentity?: string) {
this.sendData(destinationIdentity, true);
}
sendDataLossy(destinationIdentity?: string) {
this.sendData(destinationIdentity, false);
}
openInfoDialog() {
const updateFunction = async (): Promise<string> => {
const pub: PCTransport = this.getPublisherPC()!;
const sub: PCTransport = this.getSubscriberPC()!;
const info = {
PCTransports: {
publisher: {
connectedAddress: await pub.getConnectedAddress(),
connectionState: pub.getConnectionState(),
iceConnectionState: pub.getICEConnectionState(),
signallingState: pub.getSignallingState(),
},
},
RTCIceCandidateStats: {
publisher: await this.getPublisherRTCIceCandidateStats(),
}
};
if (!!sub) {
(info.PCTransports as any).subscriber = {
connectedAddress: await sub.getConnectedAddress(),
connectionState: sub.getConnectionState(),
iceConnectionState: sub.getICEConnectionState(),
signallingState: sub.getSignallingState(),
};
(info.RTCIceCandidateStats as any).subscriber = await this.getSubscriberRTCIceCandidateStats();
}
return JSON.stringify(
info,
null,
2
);
};
this.dialog.open(InfoDialogComponent, {
data: {
title: 'PCTransports info',
updateFunction,
updateInterval: 0,
},
minWidth: '50vh',
});
}
getPublisherPC(): PCTransport | undefined {
return this.room?.localParticipant.engine.pcManager?.publisher;
}
getSubscriberPC(): PCTransport | undefined {
return this.room?.localParticipant.engine.pcManager?.subscriber;
}
async getPublisherRTCIceCandidateStats() {
return this.getRTCIceCandidateStats(this.getPublisherPC()!);
}
async getSubscriberRTCIceCandidateStats() {
return this.getRTCIceCandidateStats(this.getSubscriberPC()!);
}
async getRTCIceCandidateStats(pcTransport: PCTransport) {
return new Promise(async (resolve) => {
let selectedCandidatePairId: string = '';
const stats: any = await new Promise((res) => {
const reports_stats: any[] = [];
pcTransport.getStats().then((stats: any) => {
stats.forEach((report: any) => {
console.log('Report Type:', report.type);
if (report.type === 'transport') {
if (report.selectedCandidatePairId) {
selectedCandidatePairId = report.selectedCandidatePairId;
}
}
if (report.type === 'candidate-pair') {
if (report.selected) {
selectedCandidatePairId = report.id;
}
const report_stats_object = {
report: report,
stats: stats,
};
reports_stats.push(report_stats_object);
}
});
return res(reports_stats);
});
});
const selectedCandidates = [] as any[];
for (const report_stats_object of stats) {
if (report_stats_object.report.id === selectedCandidatePairId) {
selectedCandidates.push(
report_stats_object.stats.get(
report_stats_object.report.localCandidateId
)
);
console.log(
'Selected Candidate:',
report_stats_object.stats.get(
report_stats_object.report.localCandidateId
)
);
}
}
return resolve(selectedCandidates);
});
}
}