bendwidth / backend / socketServer.js
socketServer.js
Raw
// all our socketServer stuff happens here.

const io = require('./server').io;

const allConnectedInquirers = {}
const allConnectedRespondents = {}
const allKnownOffers = {}

io.on('connection', socket => {
    console.log(socket.id, "has connected.")
    console.log(socket.handshake.auth.userInfo)

    // check if socket is valid.
    if (!socket.handshake.auth.userInfo) {
        // socket is invalid, disconnect.
        socket.disconnect()
        console.log("could not find a valid auth object")
        return;
    }
    const {uuid, userName, userEmail, isRespondent, isInquirer, translatingFrom, localB47, languageCode } = socket.handshake.auth.userInfo;
     
    // add the user to their category.
    if (isInquirer) {
        console.log("UUID inquirer", uuid)
        console.log(translatingFrom)
        allConnectedInquirers[uuid] = {
            userName, userEmail, isInquirer, socketId: socket.id, translatingFrom, localB47, languageCode
        }
    } else if (isRespondent) {
        console.log("UUID respondent", uuid)
        allConnectedRespondents[uuid] = {
            userName, userEmail, isRespondent, socketId: socket.id, translatingFrom, localB47, languageCode
        }
        console.log("sent respondent connection event")
        if (uuid in allConnectedInquirers) {
            const socketId = allConnectedInquirers[uuid].socketId
            console.log("sending language to inquirer", translatingFrom)
            socket.to(socketId).emit("someRespondentConnected", {uuid, translatingFrom});
        }

    }

    // listen for any new offers.
    socket.on('newOffer', ({ offer, uuid }) => {
        // add the offer to the list of all the known offers.
        allKnownOffers[uuid] = {
            uuid,
            offer,
            offererIceCandidates: [],
            answer: null,
            answerIceCandidates: []
        }

        // filter the respondent from the list of all respondents.
        const respondentToSendTo = allConnectedRespondents[uuid];

        console.log(allConnectedRespondents[uuid])
        // check if the respondent exists.
        if (respondentToSendTo) {
            const socketId = respondentToSendTo.socketId;
            const translatingFrom = allConnectedInquirers[uuid]["translatingFrom"]
            console.log("sending inquirer language to respondent.", translatingFrom)
            socket.to(socketId).emit('newOfferAwaiting', {offerData:allKnownOffers[uuid], translatingFrom: translatingFrom})
        }
        else {
            console.log("The respondent could not be found.")
        }

    })

    // listen for a new answer.
    socket.on('newAnswer', ({ answer, uuid }) => {
        // find the inquirer to send the answer to.
        const inquirerToSendTo = allConnectedInquirers[uuid];
        const translatingFrom = allConnectedRespondents[uuid]["translatingFrom"]
        // check if the inquirer exists.
        if (inquirerToSendTo) {
            const socketId = inquirerToSendTo.socketId;
            console.log("sending language to resp")
            socket.to(socketId).emit('answerToInquirer', {answer, translatingFrom});
        }
        else {
            console.log("The inquirer could not be found.");
        }

        const targetOffer = allKnownOffers[uuid];
        targetOffer["answer"] = answer;

    });

    // listen for ice candidate from respondent
    socket.on("iceFromRespondentToInquirer", ({ iceCandidate, uuid }) => {

        const targetOffer = allKnownOffers[uuid];
        targetOffer.answerIceCandidates.push(iceCandidate);

    })

    // listen for ice candidate from inquirer
    socket.on("iceFromInquirerToRespondent", ({ iceCandidate, uuid }) => { 
        const targetOffer = allKnownOffers[uuid];
        targetOffer.offererIceCandidates.push(iceCandidate);
    })

    // request inquirer ICE.
    socket.on("requestForInquirerIce", (uuid, ackFunc) => {
        const targetOffer = allKnownOffers[uuid];
        let iceCandidates = targetOffer["offererIceCandidates"];
        console.log(iceCandidates, "ice was requested inquirer");
        ackFunc(iceCandidates);
    })

    

    // request  for respondent ICE
    socket.on("requestForRespondentIce", (uuid, ackFunc) => {
        const targetOffer = allKnownOffers[uuid];
        let iceCandidates = targetOffer["answerIceCandidates"];
        console.log(iceCandidates, "ice was requested respondent");
        ackFunc(iceCandidates);
    })

    // check if respondent is here.
    socket.on("isRespondentConnected", (uuid, ackFunc)=> {
        const targetRespondent = allConnectedRespondents[uuid];
        const translatingFrom = targetRespondent?.translatingFrom;
        if (targetRespondent) {
            ackFunc({res:true, translatingFrom: translatingFrom});
        } else {
            ackFunc({res:false, translatingFrom: null});
        }
    })

    socket.on("getCodes", ({uuid, isRespondent},ackFunc)=> {
        if (isRespondent) {
            const {localB47, languageCode, ...rest} = allConnectedInquirers[uuid];
            console.log(localB47, languageCode, "respondent")
            ackFunc({localB47, languageCode}); 
        } else {
            const {localB47, languageCode, ...rest}= allConnectedRespondents[uuid];
            ackFunc({localB47, languageCode})
            console.log(localB47, languageCode, "inquirer")
        }
    })
})
module.exports = allConnectedRespondents;