From 783c4546d4b6910addd4aee01a77a6894d502968 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Mon, 11 Jan 2016 03:06:20 +0100 Subject: First per-pad state for global view The global view settings are send to the server with a GLOBAL_VIEW message in a COLLABROOM message. Only the changed values have to submitted to the server. On every change the server broadcasts the new state to all clients. The global view state is also contained in the clientVars to transmit the initial values for new clients. --- ep.json | 13 +++++++++++++ index.js | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 18 ++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 ep.json create mode 100644 index.js create mode 100644 package.json diff --git a/ep.json b/ep.json new file mode 100644 index 0000000..f16cf49 --- /dev/null +++ b/ep.json @@ -0,0 +1,13 @@ +{ + "parts": [ + { + "name": "main", + "client_hooks": { + }, + "hooks": { + "clientVars": "ep_global_view/index", + "handleMessage": "ep_global_view/index" + } + } + ] +} diff --git a/index.js b/index.js new file mode 100644 index 0000000..6e7e0cd --- /dev/null +++ b/index.js @@ -0,0 +1,53 @@ +var ERR = require("async-stacktrace"); +var padMessage = require("ep_etherpad-lite/node/handler/PadMessageHandler.js"); +var padManager = require("ep_etherpad-lite/node/db/PadManager.js"); + +exports.clientVars = function(hook, context, callback) +{ + var globalViewInfo = {}; + + if (context.hasOwnProperty("pad")) { + var pad = context.pad; + if (pad.hasOwnProperty("globalViewInfo")) { + globalViewInfo = pad.globalViewInfo; + } + } + + return callback({ "globalViewInfo": globalViewInfo }); +}; + +exports.handleMessage = function(hook_name, context, cb) { + if ( context.message.type == "COLLABROOM" && context.message.data.type == "GLOBAL_VIEW") { + var client = context.client; + var session = padMessage.sessioninfos[client.id]; + + padManager.getPad(session.padId, function(err, pad) { + if (ERR(err)) return cb(); + + var globalViewInfo = {}; + if (pad.hasOwnProperty("globalViewInfo")) { + globalViewInfo = pad.globalViewInfo; + } + + for (key in context.message.data.data) { + globalViewInfo[key] = context.message.data.data[key]; + } + pad.globalViewInfo = globalViewInfo; + pad.saveToDatabase(); + + var message = { + "type": "COLLABROOM", + "data": { + type: "GLOABL_VIEW", + globalViewInfo: globalViewInfo + } + }; + + client.broadcast.to(session.padId).json.send(message); + return cb([null]); + }); + } + else { + return cb(); + } +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..843e850 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "description": "Add some pad-global view settings.", + "name": "ep_global_view", + "version": "0.0.1", + "author": "Alexander Sulfrian ", + "dependencies": { + "async-stacktrace": "0.0.2" + }, + "engines": { + "node": "*" + }, + "homepage": "https://github.com/AlexanderS/ep_global_view", + "devDependencies": {}, + "repository": { + "type": "git", + "url": "https://github.com/AlexanderS/ep_global_view.git" + } +} -- cgit v1.2.3-1-g7c22