From 77244abfb129553f4efd51b9bf0d5879a1178df4 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Thu, 6 Nov 2014 10:40:39 -0500 Subject: [PATCH] feature(config) add sockets --- lib/client/config.js | 108 ++++++++++++++++++++++++++++++++++--------- lib/cloudcmd.js | 1 + lib/server/config.js | 32 +++++++++++++ 3 files changed, 118 insertions(+), 23 deletions(-) diff --git a/lib/client/config.js b/lib/client/config.js index c3592906..427d27a8 100644 --- a/lib/client/config.js +++ b/lib/client/config.js @@ -1,4 +1,4 @@ -var CloudCmd, Util, DOM; +var CloudCmd, Util, DOM, io; (function(CloudCmd, Util, DOM) { 'use strict'; @@ -29,11 +29,57 @@ var CloudCmd, Util, DOM; function(callback) { Loading = false; Util.exec(callback); + DOM.loadSocket(initSocket); }, Config.show ]); } + function getHost() { + var l = location, + href = l.origin || l.protocol + '//' + l.host; + + return href; + } + + function initSocket(error) { + var socket, + href = getHost(), + FIVE_SECONDS = 5000, + save = function(data) { + socket.send(data); + }; + + if (!error) { + socket = io.connect(href + '/config', { + 'max reconnection attempts' : Math.pow(2, 32), + 'reconnection limit' : FIVE_SECONDS + }); + + socket.on('connect', function() { + Config.save = save; + }); + + socket.on('message', function(data) { + onSave(data); + }); + + socket.on('log', function(msg) { + Util.log(msg); + }); + + socket.on('disconnect', function() { + Config.save = saveHttp; + }); + + socket.on('err', function(error) { + Util.log(error); + }); + } + } + + Config.save = saveHttp; + this.show = function() { var prefix = CloudCmd.PREFIX, exec = Util.exec, @@ -84,10 +130,7 @@ var CloudCmd, Util, DOM; Util.forEach(inputs, function(input) { Events.add('change', input, onChange) - .addKey(input, onKey) - .addClick(input, function(event) { - event.preventDefault(); - }); + .addKey(input, onKey); }); CloudCmd.View.show(div, { @@ -122,24 +165,22 @@ var CloudCmd, Util, DOM; function onChange(event) { var data, - Config = DOM.RESTful.Config, obj = {}, el = event.target, name = el.id, type = el.type; - obj[name] = data = getValue(el); if (type === 'checkbox') if (el.id === 'localStorage') - onLocalStorageChange(data); + data = onLocalStorageChange(data); else if (el.id === 'diff') - onLSChange(data); + data = onLSChange(data); else if (el.id === 'buffer') - onLSChange(data); + data = onLSChange(data); else if (el.id === 'dirStorage') - onLSChange(data); + data = onLSChange(data); else if (el.id === 'auth') onAuthChange(data); @@ -148,10 +189,27 @@ var CloudCmd, Util, DOM; Notify.request(); } - Config.write(obj, function() { + obj[name] = data; + + Config.save(obj); + } + + function onSave(obj) { + Object.keys(obj).forEach(function(name) { + var data = obj[name]; + CONFIG[name] = data; - DOM.Files.set('config', CONFIG); - setValue(el, data); + setValue(name, data); + }); + + DOM.Files.set('config', CONFIG); + } + + function saveHttp(obj, callback) { + var RESTful = DOM.RESTful; + + RESTful.Config.write(obj, function() { + onSave(obj); }); } @@ -175,8 +233,9 @@ var CloudCmd, Util, DOM; return data; } - function setValue(el, value) { - var type = el.type; + function setValue(name, value) { + var el = DOM.getById(name, Element), + type = el.type; switch(type) { case 'checkbox': @@ -190,18 +249,20 @@ var CloudCmd, Util, DOM; } function onLocalStorageChange(checked) { - var elDiff = DOM.getById('diff', Element), + var elLocalStorage = DOM.getById('localStorage', Element), + elDiff = DOM.getById('diff', Element), elBuffer = DOM.getById('buffer', Element), elDirStorage = DOM.getById('dirStorage', Element), isChecked = elDiff.checked || elBuffer.checked || elDirStorage.checked, msg = 'Diff, Buffer and Directory Storage do not work without localStorage'; - if (!checked && isChecked) { + if (isChecked && !elLocalStorage.checked) { alert(msg); + checked = elDiff.checked = elBuffer.checked = - elDirStorage.checked = false; + elDirStorage.checked = false; onChange({ target: elDiff @@ -211,16 +272,17 @@ var CloudCmd, Util, DOM; target: elBuffer }); } + + return checked; } function onLSChange(checked) { var element = DOM.getById('localStorage', Element); - if (!element.checked && checked) { - onLocalStorageChange(element.checked); - } + if (checked && !element.checked) + checked = onLocalStorageChange(checked); - return element.checked; + return checked; } function onAuthChange(checked) { diff --git a/lib/cloudcmd.js b/lib/cloudcmd.js index b53b2300..b4c18c9e 100644 --- a/lib/cloudcmd.js +++ b/lib/cloudcmd.js @@ -58,6 +58,7 @@ }); terminal(socket); + config.socket(socket); }; function cloudcmd() { diff --git a/lib/server/config.js b/lib/server/config.js index c6bfb61f..85018c4f 100644 --- a/lib/server/config.js +++ b/lib/server/config.js @@ -31,6 +31,7 @@ module.exports = set; module.exports.save = save; + module.exports.socket = socket; function set(key, value) { var result; @@ -59,6 +60,37 @@ }); } + function socket(sock) { + Util.check(arguments, ['socket']); + + sock.of('/config') + .on('connection', function(socket) { + socket.on('message', function(json) { + var data, + is = Util.type.object(json); + + if (!is) { + socket.emit('err', Error('wrong data type')); + } else { + Object.keys(json).forEach(function(name) { + data = CloudFunc.formatMsg('config', name); + set(name, json[name]); + }); + + save(function(error) { + if (error) { + socket.emit('error', error); + } else { + socket.broadcast.send(json); + socket.send(json); + socket.emit('log', data); + } + }); + } + }); + }); + } + function middle(req, res, next) { if (req.url !== apiURL + '/config') { next();