podchat-browser
Version:
Javascript SDK to use POD's Chat Service - Browser Only
140 lines (123 loc) • 4.66 kB
JavaScript
import {CallUser, CallScreenShare} from "./callUser";
function CallUsers({app, callId}) {
const config = {
list: {},
callId
};
function getHTMLElements() {
return Object.values(config.list).map(item => item.getHTMLElements())
}
function getUser(userId) {
return config.list[userId];
}
const publicized = {
addItem(memberObject, type = "user") {
if (type == 'user')
config.list[memberObject.userId] = new CallUser(app, memberObject);
else if (type == 'screenShare') {
config.list[memberObject.userId] = new CallScreenShare(app, memberObject);
}
},
async removeItem(userId) {
if (config.list[userId]) {
await config.list[userId].destroy();
delete config.list[userId];
}
},
get: getUser,
getAll() {
return config.list
},
userExists(userId) {
return !! config.list[userId];
},
getHTMLElements,
generateCallUIList: function () {
let me = app.store.user.get().id
, callUIElements = {};
if (!app.callsManager.get(config.callId))
return;
for (let i in config.list) {
let tags = {};
let HTMLElements = config.list[i].getHTMLElements();
if (config.list[i] && HTMLElements) {
tags.container = HTMLElements.container;
if ((i === 'screenShare' && app.call.currentCall().screenShareInfo.isStarted())
|| i != 'screenShare' && config.list[i].user().video && HTMLElements[config.list[i].user().videoTopicName]) {
tags.video = HTMLElements[config.list[i].user().videoTopicName];
tags.videoStream = config.list[i].getVideoStream();
}
callUIElements[i] = tags;
}
}
return {
uiElements: callUIElements,
};
},
generateCallStreamsList() {
let me = app.store.user.get().id
, callUIElements = {};
if (!app.call.currentCall())
return;
for (let i in config.list) {
let tags = {};
if (config.list[i]) {
if (
(i === 'screenShare' && app.call.currentCall().screenShareInfo.isStarted())
|| i != 'screenShare' && config.list[i].user().video
) {
tags.video = config.list[i].getVideoStream();
}
callUIElements[i] = tags;
}
}
return {
streams: callUIElements,
};
},
findUserIdByTopic(topic) {
for (let i in config.list) {
if (config.list[i] && (config.list[i].user().videoTopicName === topic || config.list[i].user().audioTopicName === topic)) {
return i;
}
}
},
destroy() {
return new Promise(resolve => {
let promises = [];
for (let i in config.list) {
let user = config.list[i];
if (user) {
promises.push(user.destroy())
}
// delete config.list[i];
}
Promise.all(promises).then(() => {
for (let i in config.list) {
delete config.list[i];
}
resolve();
})
})
},
switchSpeakers(deviceId, callback) {
let audioFound = false;
for (let i in config.list) {
let user = config.list[i];
if (user && !user.isMe()) {
if(!user.isScreenShare() && user.audioTopicManager()) {
audioFound = true
user?.switchSpeaker(deviceId);
}
}
}
if(!audioFound) {
throw new Error('[SDK] No active audio receiver found.');
} else {
callback && callback({hasError: false});
}
}
}
return publicized;
}
export default CallUsers