diff options
| author | yo mama <pepper@scannerjammer.com> | 2015-03-20 17:33:43 -0700 |
|---|---|---|
| committer | yo mama <pepper@scannerjammer.com> | 2015-03-20 17:33:43 -0700 |
| commit | 2afbcf4e7d000d99fdbc582d7113684ee00e80cc (patch) | |
| tree | 6ba3313b78625735fb295e3d375e59054c31e558 /modules/webrtc.io | |
first
Diffstat (limited to 'modules/webrtc.io')
| -rw-r--r-- | modules/webrtc.io/index.js | 1 | ||||
| -rw-r--r-- | modules/webrtc.io/lib/webrtc.io.js | 286 |
2 files changed, 287 insertions, 0 deletions
diff --git a/modules/webrtc.io/index.js b/modules/webrtc.io/index.js new file mode 100644 index 0000000..8bdf9dc --- /dev/null +++ b/modules/webrtc.io/index.js @@ -0,0 +1 @@ +module.exports = require('./lib/webrtc.io'); diff --git a/modules/webrtc.io/lib/webrtc.io.js b/modules/webrtc.io/lib/webrtc.io.js new file mode 100644 index 0000000..ada9d5c --- /dev/null +++ b/modules/webrtc.io/lib/webrtc.io.js @@ -0,0 +1,286 @@ +//SERVER +var WebSocketServer = require('ws').Server + +var iolog = function() {}; + +for (var i = 0; i < process.argv.length; i++) { + var arg = process.argv[i]; + if (arg === "-debug") { + iolog = function(msg) { + console.log(msg); + }; + console.log('Debug mode on!'); + } +} + + +// Used for callback publish and subscribe +if (typeof rtc === "undefined") { + var rtc = {}; +} +//Array to store connections +rtc.sockets = []; + +rtc.rooms = {}; +rtc.users = {}; +rtc.encryption = {}; +rtc.browser = {}; +rtc.browserVer = {}; + +// Holds callbacks for certain events. +rtc._events = {}; + +rtc.on = function(eventName, callback) { + rtc._events[eventName] = rtc._events[eventName] || []; + rtc._events[eventName].push(callback); +}; + +rtc.fire = function(eventName, _) { + var events = rtc._events[eventName]; + var args = Array.prototype.slice.call(arguments, 1); + + if (!events) { + return; + } + + for (var i = 0, len = events.length; i < len; i++) { + events[i].apply(null, args); + } +}; + +module.exports.listen = function(server) { + var manager; + if (typeof server === 'number') { + manager = new WebSocketServer({ + port: server + }); + } else { + manager = new WebSocketServer({ + server: server + }); + } + + manager.rtc = rtc; + attachEvents(manager); + return manager; +}; + +function attachEvents(manager) { + + manager.on('connection', function(socket) { + iolog('connect'); + + socket.id = id(); + iolog('new socket got id: ' + socket.id); + + rtc.sockets.push(socket); + + socket.on('message', function(msg) { + var json = JSON.parse(msg); + rtc.fire(json.eventName, json.data, socket); + }); + + socket.on('close', function() { + iolog('close'); + + // find socket to remove + var i = rtc.sockets.indexOf(socket); + // remove socket + rtc.sockets.splice(i, 1); + + // remove from rooms and send remove_peer_connected to all sockets in room + for (var key in rtc.rooms) { + + var room = rtc.rooms[key]; + var exist = room.indexOf(socket.id); + + if (exist !== -1) { + room.splice(room.indexOf(socket.id), 1); + for (var j = 0; j < room.length; j++) { + console.log(room[j]); + var soc = rtc.getSocket(room[j]); + soc.send(JSON.stringify({ + "eventName": "remove_peer_connected", + "data": { + "socketId": socket.id + } + }), function(error) { + if (error) { + console.log(error); + } + }); + } + + //also remove from username list + var userList = rtc.users[key]; + delete userList[socket.id]; + + break; + } + } + // we are leaved the room so lets notify about that + rtc.fire('room_leave', room, socket.id); + + // call the disconnect callback + rtc.fire('disconnect', rtc); + + }); + + + // call the connect callback + rtc.fire('connect', rtc); + + }); + + // manages the built-in room functionality + rtc.on('join_room', function(data, socket) { + iolog('join_room'); + + if (data.room == 0){ + return; + } + + var connectionsId = []; + var usersId = []; + var roomList = rtc.rooms[data.room] || []; + var userList = rtc.users[data.room] || {}; + + roomList.push(socket.id); + rtc.rooms[data.room] = roomList; + + userList[socket.id] = data.username; + rtc.users[data.room] = userList; + + for (var i = 0; i < roomList.length; i++) { + var id = roomList[i]; + + if (id == socket.id) { + continue; + } else { + + connectionsId.push(id); + var soc = rtc.getSocket(id); + + // inform the peers that they have a new peer + if (soc) { + soc.send(JSON.stringify({ + "eventName": "new_peer_connected", + "data":{ + "socketId": socket.id, + "username": data.username + } + }), function(error) { + if (error) { + console.log(error); + } + }); + } + } + } + // send new peer a list of all prior peers + socket.send(JSON.stringify({ + "eventName": "get_peers", + "data": { + "connections": connectionsId, + "usernames": userList, + "you": socket.id + } + }), function(error) { + if (error) { + console.log(error); + } + }); + }); + + //Receive ICE candidates and send to the correct socket + rtc.on('send_ice_candidate', function(data, socket) { + iolog('send_ice_candidate'); + var soc = rtc.getSocket(data.socketId); + + if (soc) { + soc.send(JSON.stringify({ + "eventName": "receive_ice_candidate", + "data": { + "label": data.label, + "candidate": data.candidate, + "socketId": socket.id + } + }), function(error) { + if (error) { + console.log(error); + } + }); + + // call the 'recieve ICE candidate' callback + rtc.fire('receive ice candidate', rtc); + } + }); + + //Receive offer and send to correct socket + rtc.on('send_offer', function(data, socket) { + iolog('send_offer'); + var soc = rtc.getSocket(data.socketId); + + if (soc) { + soc.send(JSON.stringify({ + "eventName": "receive_offer", + "data": { + "sdp": data.sdp, + "socketId": socket.id + } + }), function(error) { + if (error) { + console.log(error); + } + }); + } + // call the 'send offer' callback + rtc.fire('send offer', rtc); + }); + + //Receive answer and send to correct socket + rtc.on('send_answer', function(data, socket) { + iolog('send_answer'); + var soc = rtc.getSocket( data.socketId); + + if (soc) { + soc.send(JSON.stringify({ + "eventName": "receive_answer", + "data" : { + "sdp": data.sdp, + "socketId": socket.id + } + }), function(error) { + if (error) { + console.log(error); + } + }); + rtc.fire('send answer', rtc); + } + }); +} + +// generate a 4 digit hex code randomly +function S4() { + return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); +} + +// make a REALLY COMPLICATED AND RANDOM id, kudos to dennis +function id() { + return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4()); +} + +rtc.getSocket = function(id) { + var connections = rtc.sockets; + if (!connections) { + // TODO: Or error, or customize + return; + } + + for (var i = 0; i < connections.length; i++) { + var socket = connections[i]; + if (id === socket.id) { + return socket; + } + } +}; |
