瀏覽代碼

视频聊天

LiTaohong 6 年之前
父節點
當前提交
fff3dddbc9
共有 3 個文件被更改,包括 197 次插入8 次删除
  1. 36 0
      src/server/handlers/rtcSocketHandler.js
  2. 144 8
      src/server/handlers/socket.handler.js
  3. 17 0
      src/server/models/socket.io/rtc.client.js

+ 36 - 0
src/server/handlers/rtcSocketHandler.js

@ -0,0 +1,36 @@
module.exports = function(io, streams) {
  io.on('connection', function(socket) {
    console.log('-- ' + socket.id + ' joined --');
      socket.emit('id', socket.id);
      socket.on('message', function (details) {
      var othersocket = io.sockets.connected[details.to];
      if (!othersocket) {
        return;
      }
        delete details.to;
        details.from = socket.id;
        othersocket.emit('message', details);
    });
      socket.on('readyToStream', function(options) {
      console.log('-- ' + socket.id + ' is ready to stream --');
      
      streams.addStream(socket.id, options.name); 
    });
      socket.on('update', function(options) {
      streams.update(socket.id, options.name);
    });
    function leave() {
      console.log('-- ' + socket.id + ' left --');
      streams.removeStream(socket.id);
    }
      socket.on('disconnect', leave);
      socket.on('leave', leave);
  });
};

+ 144 - 8
src/server/handlers/socket.handler.js

@ -10,9 +10,14 @@ let clientCache = require('../models/socket.io/client.cache').clientCache();
let PatientClient = require('./../models/socket.io/patient.client');
let PcDoctorClient  = require('./../models/socket.io/pcDoctor.client');
let DoctorClient  = require('./../models/socket.io/doctor.client');
let RtcClient  = require('../models/socket.io/rtc.client.js');
let Sessions = require('../models/sessions/sessions');
let Users = require('../models/user/users');
let ModelUtil = require('../util/model.util.js');
let pusher = require('../models/push/pusher.js');
let AppClient = require('../models/client/app.client.js');
let sessions = new Sessions();
let users = new Users();
@ -21,12 +26,16 @@ class SocketHandler {
        this._socketServer = socketServer;
    }
    sleep (time) {
        return new Promise((resolve) => setTimeout(resolve, time));
    }
    /**
     * 启用事件监听。
     */
    start() {
        let socketServer = this._socketServer;
        socketServer.sockets.on('connection', function (socket) {
            // 客户端注册
            socket.on('login', function (data) {
                if (!data.userId) {
@ -74,18 +83,145 @@ class SocketHandler {
                }
            });
            // 返回userid的socketid
            socket.on('getSid',function(data){
                var clientJson = null;
                if(!(data instanceof Object)){
                    clientJson = JSON.parse(data);
                }else{
                    clientJson = data;
                }
                var userId = clientJson.userId;
                var rtcClient = clientCache.findById(userId);
                if(rtcClient === undefined){
                    socketServer.sockets.emit('error', {message: 'this socket client has not ever connect '});
                    return;
                }
                var result = {'userId':userId,'sid':rtcClient._socket.id};
                log.info('request getSid,userid :'+userId);
                socket.emit('getSid',result);
            });
            // 设置userid的socketid
            socket.on('setSid',function(data){
                var clientJson = null;
                if(!(data instanceof Object)){
                    clientJson = JSON.parse(data);
                }else{
                    clientJson = data;
                }
                var userId = clientJson.userId;
                let rtcClient = new RtcClient(socket,socketServer);
                rtcClient.userId = userId;
                clientCache.addClient(rtcClient);
                var result = {'userId':userId,'sid':rtcClient._socket.id};
                log.info('request setSid,userid :'+userId);
                socket.emit('setSid',result);
            });
            // 接收客户端消息
            /**
             * 视频消息格式:
             * var payload = {
                                userId: userId,
                                sid:sid, socket.io 的id
                                targetId: targetUid,
                                type: "offer/answer/hang-up/time-out/canidate",  发起视频/接受视频/(拒绝视频|挂断视频)/超时
                                sdp: myPeerConnection.localDescription
                            };
             */
            socket.on('message', function (data) {
                log.info('Got message from ' + clientCache.findBySocket(socket).userId);
                var payload = null;
                if(!(data instanceof Object)){
                    payload = JSON.parse(data);
                }else{
                    payload = data;
                }
                // 视频聊天消息
                if(payload !== undefined && payload.type){
                    if(payload.fromSid === undefined || payload.fromSid === ''){
                        socket.emit('error', {error: 'Missing fields(s): sid.',"payload":payload});
                        return;
                    }
                    switch (payload.type) {
                        case 'video-offer':
                            let title = 'videoCall';
                            /* var getui = {
                              from:from_userId,
                              fromSid:from_sid,
                              to:to_userId,
                              msgType: "videoCall",
                          };*/
                            AppClient.getAppStatus(payload.targetId, function (err, userStatus) {
                                if (err) {
                                    ModelUtil.logError("Get user app status failed", err);
                                    socket.emit('error', {error: 'cannot get ClietnId for targetId:' + payload.targetId,"payload":payload});
                                    return;
                                }
                                pusher.pushToSingleViaAndroid(title, title, payload, userStatus.client_id, userStatus.app_in_bg, function (err, res) {
                                    if (err) {
                                        ModelUtil.logError("Send notification via Android failed", err);
                                        socket.emit('error', {error: 'Send notification via Android failed for targetId:' + payload.targetId,"payload":payload});
                                    } else {
                                        log.info("offer Send notification via Android succeed: ", JSON.stringify(res));
                                    }
                                });
                            });
                            break;
                        case 'video-answer':
                            var rtcClientSocket = clientCache.findById(payload.targetId);
                            if(rtcClientSocket === undefined){
                                socket.emit('error',{error: 'cannot find this socket client for userid:'+ payload.targetId + ' when video-answer',"payload":payload});
                                return
                            }
                            rtcClientSocket._socket.send(payload,function(client){
                            });
                            break;
                        case 'candidate':
                            var rtcClientSocket = clientCache.findById(payload.targetId);
                            if(rtcClientSocket === undefined){
                                socket.emit('error',{error: 'cannot find this socket client for userid:'+ payload.targetId + ' when candidate',"payload":payload});
                                return
                            }
                            rtcClientSocket._socket.send(payload,function(client){
                            });
                            break;
                        case 'hang-up':
                            var rtcClientSocket = clientCache.findById(payload.targetId);
                            if(rtcClientSocket === undefined){
                                socket.emit('error',{error: 'cannot find this socket client for userid:'+ payload.targetId + ' when hang-up',"payload":payload});
                                return
                            }
                            rtcClientSocket._socket.send(payload,function(client){
                            });
                        case 'time-out':
                            var rtcClientSocket = clientCache.findById(payload.targetId);
                            if(rtcClientSocket === undefined){
                                socket.emit('error',{error: 'cannot find this socket client for userid:'+ payload.targetId + ' when time-out',"payload":payload});
                                return
                            }
                            rtcClientSocket._socket.send(payload,function(client){
                            });
                            break;
                    }
                }else{
                    // 其他类型的消息
                    log.info('Got message from ' + clientCache.findBySocket(socket).userId);
                let sessionId = data.session_id;
                let message = data.message;
                message.timestamp = new Date();
                    let sessionId = data.session_id;
                    let message = data.message;
                    message.timestamp = new Date();
                /*sessions.createSession(sessionId, "Let's talk!", 1, ['504a0bcddb1e4e37a0306b39c51900b5', 'cd92414c-5b06-11e6-8344-fa163e8aee56'], function (err, res) {
                    /*sessions.createSession(sessionId, "Let's talk!", 1, ['504a0bcddb1e4e37a0306b39c51900b5', 'cd92414c-5b06-11e6-8344-fa163e8aee56'], function (err, res) {
                        sessions.saveMessageBySession(sessionId, message);
                    });*/
                    sessions.saveMessageBySession(sessionId, message);
                });*/
                sessions.saveMessageBySession(sessionId, message);
                }
            });
            socket.on('error',function(errMsg){
                log.info(JSON.stringify(errMsg));
                socket.emit(errMsg);
            });
            // 客户端退出
@ -98,7 +234,7 @@ class SocketHandler {
            });
            // 客户端断开
            socket.on('disconnect', function () {
            socket.on('disconnect', function (soc) {
                let patientClient = clientCache.findBySocket(socket);
                if (patientClient) {
                    log.info("User disconnect: ", patientClient.userId);

+ 17 - 0
src/server/models/socket.io/rtc.client.js

@ -0,0 +1,17 @@
/**
 * 视频聊天 socket.
 *
 * author: lith
 * since: 2018/08/16
 */
"use strict";
var Client = require('./client');
class RtcClient extends Client{
    constructor(socket, socketServer){
        super(socket, socketServer);
    }
}
module.exports = RtcClient;