node.js socket.io emit не работает с ssl - PullRequest
0 голосов
/ 25 сентября 2019

Я использую socket.io в Nodejs.Я создал систему видеочата.Мне нужно было использовать ssl, чтобы открыть камеру в Chrome.Я сделал интеграцию SSL.Работая без SSL, проект перестал работать с SSL.Функция "emit" через Socket.io потеряла свою функцию.Я общался как "socket.emit ('signal', ....". Он больше не работает. И "socket.on ('signal', ...." не слушает. Я не могу понять проблему.

server.js

var fs = require('fs'),
    express = require('express.io'),
    app = express(),
    HTTPS_PORT = 443,
    options = {
        key: fs.readFileSync(__dirname + '\\key.key', 'utf8'), 
        cert: fs.readFileSync(__dirname + '\\cert.crt', 'utf8'),
        ca: fs.readFileSync(__dirname + '\\ca.ca', 'utf8')
    },
    server = require('https').createServer(options, app),
    io = require('socket.io')(server);

app.http().io();

app.use(express.static(__dirname + '/public'));

app.get('/', function (req, res) {
    res.render('index.ejs');
});

app.get('/admin', function (req, res) {
    res.render('admin.ejs');
});

app.io.route('signal', function (req) {
    req.io.join(req.data);
    app.io.room(req.data).broadcast('signal', {
        user_type: req.data.user_type,
        user_name: req.data.user_name,
        user_data: req.data.user_data,
        command: req.data.command
    });
});

server.listen(HTTPS_PORT, function() {
    console.log('server up and running at %s port', HTTPS_PORT);
});

webrtc.js

var socket = io.connect('https://siteadi.com:443', { secure: true }),
    myName = "",
    theirName = "",
    myUserType = "",
    configuration = {
        'iceServers': [{
            'url': 'stun:stun.l.google.com:19302'
        }]
    },
    rtcPeerConn,
    mainVideoArea = document.querySelector("#mainVideoTag"),
    smallVideoArea = document.querySelector("#smallVideoTag"),
    disconnected = [],
    connected = [];

socket.on('disconnect', function (x) {
    disconnected.push(x);
});
socket.on('connect', function (x) {
    connected.push(x);
});

socket.on('signal', function (data) {
    if (data.user_type == "doctor" && data.command == "joinroom") {
        console.log("DOCTOR: JOIN");
    }
    else if (data.user_type == "doctor" && data.command == "reconnect") {
        console.log("DOCTOR: RECONNECT");
    }
    else if (data.user_type == "patient" && data.command == "calldoctor") {
        console.log("PATIENT: CALLING");
    }
    else if (data.user_type == "patient" && data.command == "joinroom") {
        console.log("PATIENT: JOIN");
    }
    else if (data.user_type == 'signaling') {
        console.log("try signaling");
        if (!rtcPeerConn) startSignaling();
        var message = JSON.parse(data.user_data);
        if (message.sdp) {
            rtcPeerConn.setRemoteDescription(new RTCSessionDescription(message.sdp), function () {
                // if we received an offer, we need to answer
                if (rtcPeerConn.remoteDescription.type == 'offer') {
                    rtcPeerConn.createAnswer(sendLocalDesc, logError);
                }
            }, logError);
        }
        else {
            rtcPeerConn.addIceCandidate(new RTCIceCandidate(message.candidate));
        }
    }
});

function startSignaling() {
    console.log("starting signaling...");
    rtcPeerConn = new webkitRTCPeerConnection(configuration);

    rtcPeerConn.onicecandidate = function (evt) {
        if (evt.candidate)
            socket.emit('signal', { "user_type": "signaling", "command": "icecandidate", "user_data": JSON.stringify({ 'candidate': evt.candidate }) });
        console.log("completed sending an ice candidate...");
    };

    rtcPeerConn.onnegotiationneeded = function () {
        console.log("on negotiation called");
        rtcPeerConn.createOffer(sendLocalDesc, logError);
    };

    rtcPeerConn.onaddstream = function (evt) {
        console.log("going to add their stream...");
        mainVideoArea.srcObject = evt.stream;
    };

    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
    navigator.getUserMedia({
        'audio': false,
        'video': true
    }, function (stream) {
        console.log("going to display my stream...");
        smallVideoArea.srcObject = stream;
        rtcPeerConn.addStream(stream);
    }, logError);

}

function sendLocalDesc(desc) {
    rtcPeerConn.setLocalDescription(desc, function () {
        console.log("sending local description");
        socket.emit('signal', { "user_type": "signaling", "command": "SDP", "user_data": JSON.stringify({ 'sdp': rtcPeerConn.localDescription }) });
    }, logError);
}

function logError(error) {
}

app.js (пример кода)

socket.emit('signal', { "user_type": "patient", "user_name": "test", "user_data": "no data, just a patient", "command": "joinroom" });
...