infobip-rtc
Version:
Infobip RTC JavaScript SDK - Infobip WebRTC API Implementation
264 lines • 11.8 kB
JavaScript
import { FlowType } from "../FlowType";
import { ApiEventEmitter } from "../../util/ApiEventEmitter";
import { CallsApiEvent } from "../event/CallsApiEvents";
import { ApplicationCallOptions } from "../options/ApplicationCallOptions";
import ValidationUtil from "./util/ValidationUtil";
import { InternalApplicationCallOptions } from "../options/InternalApplicationCallOptions";
import { getRecordingOptions } from "./util/CallOptionsUtil";
export class DefaultRoomCall {
constructor(infobipRtc, roomOptions, roomName) {
this.roomOptions = roomOptions;
this.roomName = roomName;
this.establishedEvent = null;
this.conferenceJoinedEvent = null;
this.apiEventEmitter = new ApiEventEmitter();
let applicationCallOptions = this.mapOptions(this.roomName, this.roomOptions);
this.applicationCall = infobipRtc.callApplication(roomName, applicationCallOptions);
this.initEventHandlers();
}
mapOptions(roomName, roomOptions) {
if (roomOptions === null || roomOptions === void 0 ? void 0 : roomOptions.customData) {
ValidationUtil.validateCustomData(roomOptions === null || roomOptions === void 0 ? void 0 : roomOptions.customData);
}
let internalCustomData = Object.assign({ type: FlowType.ROOM.toString(), roomName: roomName }, getRecordingOptions(roomOptions));
let applicationCallOptions = ApplicationCallOptions.builder()
.setAudio(roomOptions === null || roomOptions === void 0 ? void 0 : roomOptions.audio)
.setAudioOptions(roomOptions === null || roomOptions === void 0 ? void 0 : roomOptions.audioOptions)
.setVideo(roomOptions === null || roomOptions === void 0 ? void 0 : roomOptions.video)
.setVideoOptions(roomOptions === null || roomOptions === void 0 ? void 0 : roomOptions.videoOptions)
.setDataChannel(roomOptions === null || roomOptions === void 0 ? void 0 : roomOptions.dataChannel)
.setAutoReconnect(roomOptions === null || roomOptions === void 0 ? void 0 : roomOptions.autoReconnect)
.build();
if (roomOptions === null || roomOptions === void 0 ? void 0 : roomOptions.customData) {
applicationCallOptions.customData = roomOptions === null || roomOptions === void 0 ? void 0 : roomOptions.customData;
}
return new InternalApplicationCallOptions(applicationCallOptions, internalCustomData);
}
name() {
return this.roomName;
}
cameraOrientation() {
return this.applicationCall.cameraOrientation();
}
cameraVideo(localVideo) {
return this.applicationCall.cameraVideo(localVideo);
}
duration() {
return this.joinTime == null ? 0 : this.getDurationInSeconds(this.leaveTime() != null ? this.leaveTime() : new Date());
}
joinTime() {
return this.roomJoinTime;
}
leaveTime() {
return this.applicationCall.endTime();
}
leave() {
return this.applicationCall.hangup();
}
hasCameraVideo() {
return this.applicationCall.hasCameraVideo();
}
hasScreenShare() {
return this.applicationCall.hasScreenShare();
}
id() {
return this.applicationCall.id();
}
muted() {
return this.applicationCall.muted();
}
on(name, handler) {
if (!Object.values(CallsApiEvent)
.find(apiEvent => apiEvent === name)) {
throw new Error(`Unknown event: ${name}!`);
}
this.apiEventEmitter.on(name, handler);
}
options() {
return this.roomOptions;
}
customData() {
return this.options().customData;
}
pauseIncomingVideo() {
this.applicationCall.pauseIncomingVideo();
}
resumeIncomingVideo() {
this.applicationCall.resumeIncomingVideo();
}
screenShare(screenShare) {
return this.applicationCall.screenShare(screenShare);
}
startScreenShare(displayOptions) {
return this.applicationCall.startScreenShare(displayOptions);
}
stopScreenShare() {
return this.applicationCall.stopScreenShare();
}
sendDTMF(dtmf) {
return this.applicationCall.sendDTMF(dtmf);
}
audioFilter() {
return this.applicationCall.audioFilter();
}
setAudioFilter(audioFilter) {
return this.applicationCall.setAudioFilter(audioFilter);
}
clearAudioFilter() {
return this.applicationCall.clearAudioFilter();
}
setAudioInputDevice(deviceId) {
return this.applicationCall.setAudioInputDevice(deviceId);
}
setCameraOrientation(cameraOrientation) {
return this.applicationCall.setCameraOrientation(cameraOrientation);
}
localCapturer() {
return this.applicationCall.localCapturer();
}
serverCapturer() {
return this.applicationCall.serverCapturer();
}
dataChannel() {
return this.applicationCall.dataChannel();
}
setAudioQualityMode(audioQualityMode) {
return this.applicationCall.setAudioQualityMode(audioQualityMode);
}
audioQualityMode() {
return this.applicationCall.audioQualityMode();
}
videoFilter() {
return this.applicationCall.videoFilter();
}
setVideoFilter(videoFilter) {
return this.applicationCall.setVideoFilter(videoFilter);
}
clearVideoFilter() {
return this.applicationCall.clearVideoFilter();
}
setVideoInputDevice(deviceId) {
return this.applicationCall.setVideoInputDevice(deviceId);
}
status() {
return this.applicationCall.status();
}
mute(shouldMute) {
return this.applicationCall.mute(shouldMute);
}
getDurationInSeconds(currentTime) {
return Math.floor((currentTime.getTime() - this.roomJoinTime.getTime()) / 1000);
}
emitRoomJoinedEvent() {
if (this.conferenceJoinedEvent && this.establishedEvent) {
const roomJoinedEvent = this.createRoomJoinedEvent(this.establishedEvent, this.conferenceJoinedEvent);
this.conferenceJoinedEvent = null;
this.establishedEvent = null;
this.roomJoinTime = new Date();
this.apiEventEmitter.emit(CallsApiEvent.ROOM_JOINED, roomJoinedEvent);
}
}
initEventHandlers() {
this.applicationCall.on(CallsApiEvent.CONFERENCE_JOINED, (event) => {
this.conferenceJoinedEvent = event;
this.emitRoomJoinedEvent();
});
this.applicationCall.on(CallsApiEvent.ESTABLISHED, (event) => {
this.establishedEvent = event;
this.emitRoomJoinedEvent();
});
this.applicationCall.on(CallsApiEvent.HANGUP, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.ROOM_LEFT, event);
});
this.applicationCall.on(CallsApiEvent.ERROR, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.ERROR, event);
});
this.applicationCall.on(CallsApiEvent.CAMERA_VIDEO_ADDED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.CAMERA_VIDEO_ADDED, event);
});
this.applicationCall.on(CallsApiEvent.CAMERA_VIDEO_UPDATED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.CAMERA_VIDEO_UPDATED, event);
});
this.applicationCall.on(CallsApiEvent.CAMERA_VIDEO_REMOVED, () => {
this.apiEventEmitter.emit(CallsApiEvent.CAMERA_VIDEO_REMOVED, {});
});
this.applicationCall.on(CallsApiEvent.SCREEN_SHARE_ADDED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.SCREEN_SHARE_ADDED, event);
});
this.applicationCall.on(CallsApiEvent.SCREEN_SHARE_REMOVED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.SCREEN_SHARE_REMOVED, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_JOINING, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_JOINING, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_JOINED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_JOINED, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_MUTED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_MUTED, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_UNMUTED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_UNMUTED, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_DEAF, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_DEAF, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_UNDEAF, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_UNDEAF, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_STARTED_TALKING, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_STARTED_TALKING, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_STOPPED_TALKING, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_STOPPED_TALKING, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_CAMERA_VIDEO_ADDED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_CAMERA_VIDEO_ADDED, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_CAMERA_VIDEO_REMOVED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_CAMERA_VIDEO_REMOVED, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_SCREEN_SHARE_ADDED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_SCREEN_SHARE_ADDED, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_SCREEN_SHARE_REMOVED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_SCREEN_SHARE_REMOVED, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_LEFT, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_LEFT, event);
});
this.applicationCall.on(CallsApiEvent.NETWORK_QUALITY_CHANGED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.NETWORK_QUALITY_CHANGED, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_NETWORK_QUALITY_CHANGED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_NETWORK_QUALITY_CHANGED, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_DISCONNECTED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_DISCONNECTED, event);
});
this.applicationCall.on(CallsApiEvent.PARTICIPANT_RECONNECTED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.PARTICIPANT_RECONNECTED, event);
});
this.applicationCall.on(CallsApiEvent.RECONNECTING, () => {
this.apiEventEmitter.emit(CallsApiEvent.RECONNECTING, {});
});
this.applicationCall.on(CallsApiEvent.RECONNECTED, () => {
this.apiEventEmitter.emit(CallsApiEvent.RECONNECTED, {});
});
this.applicationCall.on(CallsApiEvent.CONFERENCE_RECORDING_STARTED, (event) => {
this.apiEventEmitter.emit(CallsApiEvent.ROOM_RECORDING_STARTED, event);
});
}
createRoomJoinedEvent(establishedEvent, conferenceJoinedEvent) {
let roomJoinedEvent = {
id: undefined,
name: undefined,
participants: undefined,
stream: undefined,
recordingType: undefined
};
Object.assign(roomJoinedEvent, establishedEvent, conferenceJoinedEvent);
return roomJoinedEvent;
}
}
//# sourceMappingURL=DefaultRoomCall.js.map