front/controllers/video/index.js

/* ============================================================================ *\
|| ########################################################################## ||
|| # Auction Software Marketplace          Release: 0.6   Build 0.7         # ||
|| # ---------------------------------------------------------------------- # ||
|| # License # 35YAHCNR9344X6O666C123AB                                     # ||
|| # ---------------------------------------------------------------------- # ||
|| # Copyright ©2014–2021 Develop Scripts LLC. All Rights Reserved          # ||
|| # This file may not be redistributed in whole or significant part.       # ||
|| # ------------- AUCTION SOFTWARE IS NOT FREE SOFTWARE ------------------ # ||
|| # http://www.auctionsoftwaremarketplace.com|support@auctionsoftware.com  # ||
|| # ---------------------------------------------------------------------- # ||
|| ########################################################################## ||
\* ============================================================================ */

/* eslint-disable prefer-destructuring */
/* eslint-disable no-param-reassign */
const webrtc = require('wrtc')
const videoModule = require('../../modules/video').default

const { jsonResponse } = require('../logger')

let senderStream

function handleTrackEvent(e, peer) {
    senderStream = e.streams[0]
}
module.exports = {
    /**
     * Show video stream
     *
     * @memberOf frontend.video
     * @param {videoModule.getsenderstream} object
     */
    videoStream: async (req, res) => {
        try {
            const [results1] = await Promise.all([videoModule.getsenderstream(req, req.body)])
            if (results1.length > 0) {
                const peer = new webrtc.RTCPeerConnection({
                    iceServers: [
                        {
                            urls: global.TurnServer.url,
                            credential: global.TurnServer.credential,
                            username: global.TurnServer.username,
                        },
                    ],
                })
                const desc = new webrtc.RTCSessionDescription(req.body.sdp)
                await peer.setRemoteDescription(desc)
                senderStream.getTracks().forEach((track) => peer.addTrack(track, senderStream))
                const answer = await peer.createAnswer()
                await peer.setLocalDescription(answer)
                const payload = {
                    sdp: peer.localDescription,
                }
                jsonResponse(res, 'success', {
                    responseType: 1,
                    message: 'Details successfully retrieved!',
                    responseData: payload,
                })
            } else {
                jsonResponse(res, 'error', {
                    responseType: 3,
                    message: 'Video stream unavailable!',
                })
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * Show video stream broadcast
     *
     * @memberOf frontend.video
     * @param {videoModule.sendervideostream} module
     */
    videoBroadCast: async (req, res) => {
        try {
            const peer = new webrtc.RTCPeerConnection({
                iceServers: [
                    {
                        urls: global.TurnServer.url,
                        credential: global.TurnServer.credential,
                        username: global.TurnServer.username,
                    },
                ],
            })
            peer.ontrack = (e) => handleTrackEvent(e, peer)
            const desc = new webrtc.RTCSessionDescription(req.body.sdp)
            await peer.setRemoteDescription(desc)
            const answer = await peer.createAnswer()
            await peer.setLocalDescription(answer)
            const payload = {
                sdp: peer.localDescription,
            }
            req.body.auctionid = req.body.auctionid ? req.body.auctionid : ''
            await Promise.all([videoModule.sendervideostream(req, req.body)])
            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData: payload,
            })
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * stop video broadcaster
     *
     * @memberOf frontend.video
     * @param {videoModule.stopVideoStream} module
     */
    stopVideoBroadCaster: async (req, res) => {
        try {
            req.body.broadcaster = req.body.broadcaster ? req.body.broadcaster : ''

            await Promise.all([videoModule.stopVideoStream(req, req.body)])
            const payload = {
                broadcaster: req.body.broadcaster,
            }

            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData: payload,
            })
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * stop video broadcaster
     *
     * @memberOf frontend.video
     * @param {videoModule.newVideoStream} module
     */
    newVideoBroadCaster: async (req, res) => {
        try {
            req.body.auctionid = req.body.auctionid ? req.body.auctionid : ''
            req.body.broadcaster = req.body.broadcaster ? req.body.broadcaster : ''

            await Promise.all([videoModule.newVideoStream(req, req.body)])
            const payload = {
                auctionid: req.body.auctionid,
                broadcaster: req.body.broadcaster,
            }

            jsonResponse(res, 'success', {
                responseType: 1,
                message: 'Details successfully retrieved!',
                responseData: payload,
            })
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
    /**
     * new video stream
     *
     * @memberOf frontend.video
     * @param {videoModule.getsenderstream} module
     */
    newVideoStream: async (req, res) => {
        try {
            const [results1] = await Promise.all([videoModule.getsenderstream(req, req.body)])
            if (results1.length > 0) {
                console.log('results1', results1)
                jsonResponse(res, 'success', {
                    responseType: 1,
                    message: 'Details successfully retrieved!',
                    responseData: results1,
                })
            } else {
                jsonResponse(res, 'error', {
                    responseType: 3,
                    message: 'Video stream unavailable!',
                })
            }
        } catch (e) {
            console.error(e)
            jsonResponse(res, 'error', {
                responseType: 3,
                message: 'Internal Server error!',
            })
        }
    },
}