diff --git a/client/bbb-html5-client/iotest.coffee b/client/bbb-html5-client/iotest.coffee new file mode 100755 index 0000000000000000000000000000000000000000..9f7aa204291902620a6cab33b55cb8bd67f8f890 --- /dev/null +++ b/client/bbb-html5-client/iotest.coffee @@ -0,0 +1,14 @@ +postal = require('postal') +{SocketIoMessageHandler} = require './lib/clientproxy' +crypto = require 'crypto' + +io = require('socket.io').listen(3019) +sio = new SocketIoMessageHandler(io) + + + + + + + + diff --git a/client/bbb-html5-client/lib/bbblogger.coffee b/client/bbb-html5-client/lib/bbblogger.coffee new file mode 100755 index 0000000000000000000000000000000000000000..81f4acb860cf1ff50ba30c15f59eb46d6da80ec0 --- /dev/null +++ b/client/bbb-html5-client/lib/bbblogger.coffee @@ -0,0 +1,17 @@ +bunyan = require 'bunyan' + +logger = bunyan.createLogger({ + name: 'bbbnode', + streams: [ + { + level: 'debug', + stream: process.stdout, + }, + { + level: 'info', + path: '/var/log/bigbluebutton/bbbnode.log' + } + ] +}); + +module.exports = logger; diff --git a/client/bbb-html5-client/lib/clientproxy.coffee b/client/bbb-html5-client/lib/clientproxy.coffee new file mode 100755 index 0000000000000000000000000000000000000000..e00f8d8cfd750827ebdd8ac654a6aff4a4929457 --- /dev/null +++ b/client/bbb-html5-client/lib/clientproxy.coffee @@ -0,0 +1,63 @@ +{Controller} = require './controller' +log = require './bbblogger' + +MESSAGE = "message" + +class SocketIoMessageHandler + constructor: (io) -> + @io = io + @controller = new Controller(@) + @initialize() + + initialize: () -> + @io.sockets.on('connection', (socket) -> + console.log("Client has connected.") + log.debug("LOG: Client has connected.") + socket.on('message', (jsonMsg) -> + log.debug("Received message #{jsonMsg}") + handleMessage(socket, @controller, jsonMsg) + ) + socket.on('disconnect', () -> + handleClientDisconnected socket + ) + ) + +exports.SocketIoMessageHandler = SocketIoMessageHandler + +handleClientDisconnected = (socket) -> + log.debug("LOG: Client has disconnected.") + +handleMessage = (socket, controller, message) -> + if message.name? + handleValidMessage(socket, controller, message) + else + log.error({error: "Invalid message", message: JSON.stringify(message)}) + +handleValidMessage = (socket, controller, message) -> + switch message.name + when 'authenticateMessage' + handleLoginMessage socket, controller, message + when 'Sandra' + connectJackNumber 22 + when 'Toby' + connectJackNumber 9 + else + console.log('I am sorry, your call cannot be connected') + +handleLoginMessage = (socket, controller, data) -> + controller.processLoginMessage(data, (err, result) -> + if (err) + message = {name: "authenticationReply", error: err} + sendMessageToClient message + else + message = {name: "authenticationReply", data: result} + sendMessageToClient message + ) + +sendMessageToClient = (socket, message) -> + socket.emit(MESSAGE, JSON.stringify(message)) + + + + + diff --git a/client/bbb-html5-client/lib/controller.coffee b/client/bbb-html5-client/lib/controller.coffee new file mode 100755 index 0000000000000000000000000000000000000000..c1339b98b5ede9deede3fc227565d663e5768805 --- /dev/null +++ b/client/bbb-html5-client/lib/controller.coffee @@ -0,0 +1,22 @@ +bus = require './messagebus' +logger = require './bbblogger' + +class Controller + constructor: (clientProxy) -> + @proxy = clientProxy + + processLoginMessage = (data, callback) -> + bus.sendMessage(data, (err, result) -> + if (err) + errLog = {message: "Authentication Failure", reason: err, data: data} + log.error(JSON.stringify(errLog)) + callback(err, null) + else + console.log("SUCCESS: #{result}") + if result.error? + callback(result.error, null) + else + callback(null, result.data) + ) + +exports.Controller = Controller \ No newline at end of file diff --git a/client/bbb-html5-client/lib/messagebus.coffee b/client/bbb-html5-client/lib/messagebus.coffee new file mode 100755 index 0000000000000000000000000000000000000000..be8662456ba585a340514cc8a0a7f30ce3fd9f54 --- /dev/null +++ b/client/bbb-html5-client/lib/messagebus.coffee @@ -0,0 +1,50 @@ +postal = require('postal') +redisrpc = require './redispubsub' +crypto = require 'crypto' + +io = require('socket.io').listen(3009) + +io.sockets.on('connection', (socket) -> + console.log("Connected") + socket.on('login', (data) -> + console.log("User login #{data}") + sendMessage(data, (err, result) -> + if (err) + console.log("ERROR: #{err}") + else + console.log("SUCCESS: #{result}") + socket.emit('authenticated', JSON.stringify(result)) + ) + ) + + socket.on('event', (data) -> + console.log("Server received event.") + ) + + socket.on('disconnect', () -> + console.log("Server disconnect event.") + ) + + socket.emit('ready') +) + + +sendMessage = (data, callback) -> + replyTo = { + channel: 'model.data', + topic: 'get.' + crypto.randomBytes(16).toString('hex') + }; + + postal.subscribe({ + channel: replyTo.channel, + topic: replyTo.topic, + callback: (msg, envelope) -> + callback( msg.err, msg.data ) + }).once() + + postal.publish({ + channel: 'publishChannel', + topic: 'broadcast', + replyTo: replyTo, + data: data + }) \ No newline at end of file diff --git a/client/bbb-html5-client/lib/redispubsub.coffee b/client/bbb-html5-client/lib/redispubsub.coffee new file mode 100755 index 0000000000000000000000000000000000000000..e5551a75e92a81b73182ad39bd5bcb64cd84a012 --- /dev/null +++ b/client/bbb-html5-client/lib/redispubsub.coffee @@ -0,0 +1,95 @@ +redis = require 'redis' +crypto = require 'crypto' +postal = require 'postal' + +# default timeout to wait for response +TIMEOUT = 5000; + +pubClient = redis.createClient() +subClient = redis.createClient() + +# hash to store requests waiting for response +pendingRequests = {}; + +initialize = () -> + postal.subscribe({ + channel: 'publishChannel', + topic: 'broadcast', + callback: ( msg, envelope ) -> + if (envelope.replyTo?) + sendAndWaitForReply(msg, envelope) + else + sendMessage(msg, envelope) + }) + +sendAndWaitForReply = (message, envelope) -> + # generate a unique correlation id for this call + correlationId = crypto.randomBytes(16).toString('hex'); + + # create a timeout for what should happen if we don't get a response + timeoutId = setTimeout( (correlationId) -> + response = {} + #if this ever gets called we didn't get a response in a + #timely fashion + error = {code: "503", message: "Waiting for reply timeout.", description: "Waiting for reply timeout."} + response.err = error + postal.publish({ + channel: envelope.replyTo.channel, + topic: envelope.replyTo.topic, + data: response + }) + # delete the entry from hash + delete pendingRequests[correlationId]; + , TIMEOUT, correlationId) + + # create a request entry to store in a hash + entry = { + replyTo: envelope.replyTo, + timeout: timeoutId #the id for the timeout so we can clear it + }; + + # put the entry in the hash so we can match the response later + pendingRequests[correlationId] = entry; + console.log("Publishing #{message}") + + message.correlationId = correlationId + + pubClient.publish("bigbluebuttonAppChannel", JSON.stringify(message)) + +subClient.on("subscribe", (channel, count) -> + console.log("Subscribed to #{channel}") +) + +subClient.on("message", (channel, jsonMsg) -> + console.log("Received message on [channel] = #{channel} [message] = #{jsonMsg}") + message = JSON.parse(jsonMsg) + + if (message.correlationId?) + #retreive the request entry + entry = pendingRequests[message.correlationId]; + #make sure we don't timeout by clearing it + clearTimeout(entry.timeout); + #delete the entry from hash + delete pendingRequests[message.correlationId]; + response = {} + response.data = message + postal.publish({ + channel: entry.replyTo.channel, + topic: entry.replyTo.topic, + data: response + }) + else + if message.meetingId? + postal.publish({ + channel: "bigbluebuttonAppChannel" + topic: message.meetingId, + data: message + }) + else + console.log("Invalid message: #{jsonMsg}") +) + +initialize() + +console.log("RPC: Subscribing message on channel [responseChannel]") +subClient.subscribe("responseChannel") diff --git a/client/bbb-html5-client/package.json b/client/bbb-html5-client/package.json old mode 100644 new mode 100755 index 55ef66218ab6919c4db1b6d58bcf7c344587b8bb..8d0022edddd8c73281cd306b343cea5316dffa41 --- a/client/bbb-html5-client/package.json +++ b/client/bbb-html5-client/package.json @@ -9,8 +9,11 @@ "connect-redis": "1.4.5", "connect": "2.8.5", "socket.io": "0.9.16", - "redis": "0.9.0", - "hiredis": "0.1.15", + "postal" : "0.9.0-rc1", + "redis": "0.10.1", + "hiredis": "0.1.16", + "bunyan": "0.22.2", + "crypto-js": "3.1.2-3", "sanitizer": "0.0.15", "hat": "0.0.3", "imagemagick": "0.1.3",