diff --git a/json/modules.json b/json/modules.json index 9c5d1a8e..36a40b2d 100644 --- a/json/modules.json +++ b/json/modules.json @@ -5,6 +5,7 @@ "help", "config", "contact", + "socket", "console", { "name": "storage", "data": [{ diff --git a/lib/client/console.js b/lib/client/console.js index 6c29aa15..9d4d6b87 100644 --- a/lib/client/console.js +++ b/lib/client/console.js @@ -11,6 +11,7 @@ var CloudCmd, Util, DOM, CloudFunc, $; function ConsoleProto(CallBack) { var Name = 'Console', + Messages= [], Loading, jqconsole, Element, @@ -24,15 +25,16 @@ var CloudCmd, Util, DOM, CloudFunc, $; Loading = true; Util.loadOnLoad([ + addListeners, + CloudCmd.Socket, Console.show, load, CloudCmd.View, DOM.jqueryLoad, - DOM.socketLoad ]); } - this.show = function() { + this.show = function(callback) { if (!Loading) { Images.showLoad({top:true}); @@ -95,6 +97,8 @@ var CloudCmd, Util, DOM, CloudFunc, $; } }); } + + Util.exec(callback); }); } }; @@ -144,6 +148,60 @@ var CloudCmd, Util, DOM, CloudFunc, $; }); } + function addListeners(callback) { + CloudCmd.Socket.on('message', function(msg) { + var parsed = Util.parseJSON(msg); + + outToTerminal(parsed); + }); + + Util.exec(callback); + } + + function outToTerminal(pMsg) { + var i, n, lResult, lStdout, lStderr, + lConsole = CloudCmd.Console; + + DOM.Images.hideLoad(); + + if (Util.isObject(lConsole)) { + if (Messages.length) { + /* show oll msg from buffer */ + for (i = 0, n = Messages.length; i < n; i++) { + lStdout = Messages[i].stdout; + lStderr = Messages[i].stderr; + + if (lStdout) + lConsole.log(lStdout); + + if (lStderr) { + /* if it's object - convert is to string' */ + if (Util.isObject(lStderr)) + lStderr = Util.stringifyJSON(lStderr); + + lConsole.error(lStderr); + } + } + Messages = []; + } + + lStdout = pMsg.stdout; + lStderr = pMsg.stderr; + + if (lStdout) + lResult = lConsole.log(lStdout); + + if (lStderr) + lResult = lConsole.error(lStderr); + } + else + Messages.push(pMsg); + + Util.log(pMsg); + + return lResult; + } + init(); } diff --git a/lib/client/dom.js b/lib/client/dom.js index 9681621a..65ae0249 100644 --- a/lib/client/dom.js +++ b/lib/client/dom.js @@ -699,14 +699,6 @@ var CloudCmd, Util, DOM, CloudFunc, Dialog; }); }; - /** - * load socket.io - * @param pCallBack - */ - this.socketLoad = function(pCallBack) { - DOM.jsload('/lib/client/socket.js', pCallBack); - }; - /** * create new folder * diff --git a/lib/client/socket.js b/lib/client/socket.js index 8328dd4d..243aeddb 100644 --- a/lib/client/socket.js +++ b/lib/client/socket.js @@ -4,20 +4,85 @@ var CloudCmd, Util, DOM, io; (function(CloudCmd, Util, DOM) { 'use strict'; - CloudCmd.Socket = new SocketProto(CloudCmd, Util, DOM); + CloudCmd.Socket = SocketProto; - function SocketProto(CloudCmd, Util, DOM) { - var Messages = [], + function SocketProto(callback) { + var Socket = function () { + Util.exec.apply(null, arguments); + }, + AllListeners = {}, socket, - Terminal, ERROR_MSG = 'could not connect to socket.io\n'+ 'npm i socket.io'; - DOM.jsload('/socket.io/lib/socket.io.js', { - onerror : Util.retFunc(Util.log, ERROR_MSG), - onload : connect - }); + Socket.on = addListener; + Socket.addListener = addListener; + Socket.removeListener = removeListener; + Socket.send = send; + + function init(callback) { + DOM.jsload('/socket.io/lib/socket.io.js', { + onerror : Util.retFunc(Util.log, ERROR_MSG), + onload : function() { + Util.exec(callback); + + if (!socket) + connect(); + } + }); + } + + function addListener(name, func) { + var listeners = AllListeners[name]; + + if (!listeners) + listeners = AllListeners[name] = []; + + listeners.push(func); + + if (func && socket) + socket.on(name, func); + } + + function removeListener(name, func) { + var i, n, listeners; + + if (socket) + socket.removeListener(name, func); + + listeners = AllListeners[name]; + + if (listeners) { + n = listeners.length; + + for (i = 0; i < n; i++) + if (listeners[i] === func) + listeners[i] = null; + } + } + + function send(data) { + if (socket) + socket.send(data); + } + + function setListeners(all, socket) { + var i, n, name, func, listeners; + + for (name in all) { + listeners = all[name]; + n = listeners.length; + + for (i = 0; i < n; i++) { + func = listeners[i]; + + if (func && socket) + socket.on(name, func); + } + } + + } function connect() { var FIVE_SECONDS = 5000; @@ -27,70 +92,24 @@ var CloudCmd, Util, DOM, io; 'reconnection limit' : FIVE_SECONDS }); - CloudCmd.Socket = socket; - socket.on('connect', function () { - outToTerminal({stdout: 'socket connected\n'}); + Util.log('socket connected\n'); }); - socket.on('message', function (msg) { - var lMsg = Util.parseJSON(msg); - - outToTerminal(lMsg); - }); + setListeners(AllListeners, socket); socket.on('disconnect', function () { - outToTerminal({stderr: 'socket disconected\n'}); + Util.log('socket disconected\n'); }); socket.on('reconnect_failed', function () { Util.log('Could not reconnect. Reload page.'); }); } - - function outToTerminal(pMsg) { - var i, n, lResult, lStdout, lStderr, - lConsole = CloudCmd.Console; - - DOM.Images.hideLoad(); - - if (Util.isObject(lConsole)) { - if (Messages.length) { - /* show oll msg from buffer */ - for (i = 0, n = Messages.length; i < n; i++) { - lStdout = Messages[i].stdout; - lStderr = Messages[i].stderr; - - if (lStdout) - lConsole.log(lStdout); - - if (lStderr) { - /* if it's object - convert is to string' */ - if (Util.isObject(lStderr)) - lStderr = Util.stringifyJSON(lStderr); - - lConsole.error(lStderr); - } - } - Messages = []; - } - - lStdout = pMsg.stdout; - lStderr = pMsg.stderr; - - if (lStdout) - lResult = lConsole.log(lStdout); - - if (lStderr) - lResult = lConsole.error(lStderr); - } - else - Messages.push(pMsg); - - Util.log(pMsg); - - return lResult; - } + + init(callback); + + return Socket; } })(CloudCmd, Util, DOM);