From fc5bdd3bed1e8886a26a4fdd7c47fb0f5cd08a72 Mon Sep 17 00:00:00 2001 From: yflory Date: Thu, 17 Aug 2017 15:42:26 +0200 Subject: [PATCH] Add lazy metadata to fix parse errors in pad2 --- www/common/metadata-manager.js | 41 +++++++++++++++++++++------------- www/common/toolbar3.js | 22 +++++++++--------- www/pad2/main.js | 5 ++++- 3 files changed, 40 insertions(+), 28 deletions(-) diff --git a/www/common/metadata-manager.js b/www/common/metadata-manager.js index 8a87b7f0a..0470222bd 100644 --- a/www/common/metadata-manager.js +++ b/www/common/metadata-manager.js @@ -4,10 +4,11 @@ define([], function () { var meta = UNINIT; var members = []; var metadataObj = UNINIT; + var metadataLazyObj = UNINIT; var dirty = true; var changeHandlers = []; - var checkUpdate = function () { + var checkUpdate = function (lazy) { if (!dirty) { return; } if (meta === UNINIT) { throw new Error(); } if (metadataObj === UNINIT) { @@ -17,6 +18,7 @@ define([], function () { type: meta.doc.type, users: {} }; + metadataLazyObj = JSON.parse(JSON.stringify(metadataObj)); } var mdo = {}; // We don't want to add our user data to the object multiple times. @@ -34,56 +36,65 @@ define([], function () { //if (!containsYou) { mdo[meta.user.netfluxId] = meta.user; } mdo[meta.user.netfluxId] = meta.user; metadataObj.users = mdo; + if (lazy) { + metadataLazyObj.users = mdo; + } dirty = false; changeHandlers.forEach(function (f) { f(); }); }; - var change = function () { + var change = function (lazy) { dirty = true; - setTimeout(checkUpdate); + setTimeout(function () { + checkUpdate(lazy); + }); }; sframeChan.on('EV_METADATA_UPDATE', function (ev) { meta = ev; - change(); + change(true); }); sframeChan.on('EV_RT_CONNECT', function (ev) { meta.user.netfluxId = ev.myID; members = ev.members; - change(); + change(true); }); sframeChan.on('EV_RT_JOIN', function (ev) { members.push(ev); - change(); + change(false); }); sframeChan.on('EV_RT_LEAVE', function (ev) { var idx = members.indexOf(ev); if (idx === -1) { console.log('Error: ' + ev + ' not in members'); return; } members.splice(idx, 1); - change(); + change(false); }); sframeChan.on('EV_RT_DISCONNECT', function () { members = []; - change(); + change(true); }); return Object.freeze({ updateMetadata: function (m) { if (JSON.stringify(metadataObj) === JSON.stringify(m)) { return; } metadataObj = m; - change(); + change(true); }, getMetadata: function () { - checkUpdate(); + checkUpdate(false); return metadataObj; }, - onChange: function (f) { changeHandlers.push(f); }, - getNetfluxId: function () { - return meta && meta.user && meta.user.netfluxId; + getMetadataLazy: function () { + return metadataLazyObj; }, - getUserlist: function () { + onChange: function (f) { changeHandlers.push(f); }, + isConnected : function () { + return members.indexOf(meta.user.netfluxId) !== -1; + }, + getViewers : function () { + checkUpdate(false); var list = members.slice().filter(function (m) { return m.length === 32; }); - return list; + return list.length - Object.keys(metadataObj.users).length; } }); }; diff --git a/www/common/toolbar3.js b/www/common/toolbar3.js index 7b5cd287a..247fd7b37 100644 --- a/www/common/toolbar3.js +++ b/www/common/toolbar3.js @@ -122,7 +122,7 @@ define([ // Userlist elements var getOtherUsers = function(config) { - var userList = config.userList.getUserlist(); + //var userList = config.userList.getUserlist(); var userData = config.userList.getMetadata().users; var i = 0; // duplicates counter @@ -130,12 +130,12 @@ define([ // Display only one time each user (if he is connected in multiple tabs) var uids = []; - userList.forEach(function(user) { + Object.keys(userData).forEach(function(user) { //if (user !== userNetfluxId) { var data = userData[user] || {}; var userId = data.uid; if (!userId) { return; } - data.netfluxId = user; + //data.netfluxId = user; if (uids.indexOf(userId) === -1) {// && (!myUid || userId !== myUid)) { uids.push(userId); list.push(data); @@ -176,16 +176,15 @@ define([ var $userButtons = toolbar.userlist; var $userlistContent = toolbar.userlistContent; - var userList = config.userList.getUserlist(); - var userData = config.userList.getMetadata().users; -console.log(userList, userData); - var numberOfUsers = userList.length; + var metadataMgr = config.userList; + var userData = metadataMgr.getMetadata().users; + var viewers = metadataMgr.getViewers(); // If we are using old pads (readonly unavailable), only editing users are in userList. // With new pads, we also have readonly users in userList, so we have to intersect with // the userData to have only the editing users. We can't use userData directly since it // may contain data about users that have already left the channel. - userList = config.readOnly === -1 ? userList : arrayIntersect(userList, Object.keys(userData)); + //userList = config.readOnly === -1 ? userList : arrayIntersect(userList, Object.keys(userData)); // Names of editing users var others = getOtherUsers(config); @@ -198,8 +197,8 @@ console.log(userList, userData); return na.toLowerCase() > nb.toLowerCase(); }); - var numberOfEditUsers = userList.length - duplicates; - var numberOfViewUsers = numberOfUsers - userList.length; + var numberOfEditUsers = Object.keys(userData).length - duplicates; + var numberOfViewUsers = viewers; // Update the userlist var $editUsers = $userlistContent.find('.' + USERLIST_CLS).html(''); @@ -287,8 +286,7 @@ console.log(userList, userData); //userList.change.push var metadataMgr = config.userList; metadataMgr.onChange(function () { - var users = metadataMgr.getUserlist(); - if (users.indexOf(metadataMgr.getNetfluxId()) !== -1) {toolbar.connected = true;} + if (metadataMgr.isConnected()) {toolbar.connected = true;} if (!toolbar.connected) { return; } //if (config.userList.data) { updateUserList(toolbar, config); diff --git a/www/pad2/main.js b/www/pad2/main.js index d2f72835e..fd1f87ad5 100644 --- a/www/pad2/main.js +++ b/www/pad2/main.js @@ -341,7 +341,7 @@ define([ var stringifyDOM = module.stringifyDOM = function (dom) { var hjson = Hyperjson.fromDOM(dom, isNotMagicLine, brFilter); hjson[3] = { - metadata: cpNfInner.metadataMgr.getMetadata() + metadata: cpNfInner.metadataMgr.getMetadataLazy() }; /*hjson[3] = { TODO users: UserList.userData, @@ -470,8 +470,11 @@ define([ realtimeOptions.onInit = function (info) { console.log('onInit'); + var titleCfg = { getHeadingText: getHeadingText }; + Title = Cryptpad.createTitle(titleCfg, realtimeOptions.onLocal, Cryptpad); var configTb = { displayed: ['userlist'], + //title: Title.getTitleConfig(), userList: cpNfInner.metadataMgr, readOnly: readOnly, ifrw: window,