*CALLEE*
- close existing peer connections
- disconnect peerjs, if connected
- connect to PeerJS
- on connect, emit "startCall", with peer id, to CALLER to call CALLEE
// reset peer
resetPeer();
// initiate peer
initializePeer();
上記の2つのメッソドを使って音声が聞こえない場合一度切って再度peerにアクセスする仕組みですが、
聞かない場合が多いです。
もし接続確立やdisconnectの際に他のメッソドなどを使ったほうがよかったりしますか?
function resetPeer(){
/* reset peer */
try {
/* drop all previous connections */
if (
typeof connect.peer.connections !== 'undefined' &&
connect.peer.connections.length !== 0
) {
console.warn("[RESET_PEER] resetting peer connections");
var connectedPeers = connect.peer.connections;
/* loop through previous connections */
for (var peerConnections in connectedPeers) {
/* if had multiple connections */
if (connectedPeers[peerConnections].length !== 0) {
for (var i = 0; i < connectedPeers[peerConnections].length; i++) {
if (typeof connectedPeers[peerConnections][i] === 'undefined') { continue; }
console.warn("[RESET_PEER] closing peer connection -> " + peerConnections + " || " + connectedPeers[peerConnections][i].open);
connectedPeers[peerConnections][i].close();
}
}
}
}
connect.peer.disconnect();
/* catch error */
} catch (ex){}
}
/* initialize peer */
con.initializePeer = function(callback){
/* connect to the peerjs server */
element.peer = new Peer(connect.config.peerID, {
host: element.signalHost,
port: element.signalPort,
debug: 2,
path: '/peerjs',
secure: true,
config: { iceServers: element.iceServers } // THIS IS USING TWILIO ICE SERVERS
});
element = this;
/* catch peerjs events */
element.peer
/* catch when connection is opened */
.off('open').on('open', function(id){
/* set the peerID */
element.config.peerID = id;
/* if student, inform the teacher to call him/her */
if (element.config.memberType == 'CALLEE') { callee.startCall(id); }
/* if teacher, call student */
if (element.config.memberType == 'CALLER' && connect.peerID !== false) {
caller.callCallee({content: {peerID: connect.peerID}});
}
/* if has callback execute callback */
if ($.isFunction(callback)) { callback(); }
})
/* catch when a call is received */
.off('call').on('call', function(call){
/* answer and stream the call */
call.answer(connect.cameraStream);
call.off('stream').on('stream', function(stream){
/* set needed vars */
connect.peerStream = stream;
/* peer camera */
$(constant.peerCamera).prop("src", window.URL.createObjectURL(stream)).show();
})
/* catch when the current call is dropped */
.off('close').on('close', function(){
console.warn("[PEER_CALL] connection was dropped");
});
})
/* catch when peerJS closes. this is also triggered when the peer closes his/her connection */
.off('close').on('close', function(){
console.warn("[PEER_CALL] connection was closed");
})
/* catch if any errors occur during peer connection */
.off('error').on('error', function(error){
console.warn("[PEERJS ERROR] " + error);
try { element.peer.disconnect(); } catch (ex) {}
});
};
*CALLER*
- receive "startCall" emit with peer id
- if not connected to PeerServer, connect. else, skip
- on connect call CALLEE
connect.socket.on("startCall", function(id){
// reset peer
resetPeer();
// traps here
if (connect.peer !== null && connect.peer.disconnected === false) {
caller.callCallee(id);
return;
}
// initiate peer
initializePeer();
})
caller.callCallee = function(peerID){
/* call student */
connect.peer.call(
peerID,
connect.cameraStream,
{
'constraints': {
'mandatory': {
'OfferToReceiveAudio': true,
'OfferToReceiveVideo': true
}
}
}
);
}
後、peer serverを独自で立てていますが特別なことはやっておりません。
*PEER SERVER (independent)
```
/* set server functions */
var server = require('https').createServer(ssl.options, app);
var io = require("
socket.io").listen(server, socketConfig);
var socket = io.sockets;
var peer = require("peer").ExpressPeerServer;
/* set app engine */
app.use('/peerjs', peer(server, {debug: true}));
/* listen to default port 0.0.0.0 */
var server = server.listen(ssl.port, "0.0.0.0", function(){
util.log("[SOCKET] listening to port " + ssl.port, 'green');
logger.dbInit(db);
});
```