diff --git a/www/common/outer/async-store.js b/www/common/outer/async-store.js index f091c62f9..a9947f3b2 100644 --- a/www/common/outer/async-store.js +++ b/www/common/outer/async-store.js @@ -761,18 +761,42 @@ define([ * - attr (Array) * - value (String) */ + var getAllStores = function () { + var stores = [store]; + var teamModule = store.modules['team']; + if (teamModule) { + var teams = teamModule.getTeams().map(function (id) { + return teamModule.getTeam(id); + }); + Array.prototype.push.apply(stores, teams); + } + return stores; + }; Store.setPadAttribute = function (clientId, data, cb) { - store.manager.setPadAttribute(data, function () { - sendDriveEvent('DRIVE_CHANGE', { - path: ['drive', UserObject.FILES_DATA] - }, clientId); - onSync(cb); + getAllStores.forEach(function (s) { + s.manager.setPadAttribute(data, function () { + var send = s.id ? s.sendEvent : sendDriveEvent; + send('DRIVE_CHANGE', { + path: ['drive', UserObject.FILES_DATA] + }, clientId); + onSync(s.id, cb); + }); }); }; Store.getPadAttribute = function (clientId, data, cb) { - store.manager.getPadAttribute(data, function (err, val) { - if (err) { return void cb({error: err}); } - cb(val); + var res = {}; + nThen(function (waitFor) { + getAllStores.forEach(function (s) { + s.manager.getPadAttribute(data, waitFor(function (err, val) { + if (err) { return; } + if (!res.value || res.atime < val.atime) { + res.atime = val.atime; + res.value = val.value; + } + })); + }); + }).nThen(function () { + cb(res.value); }); }; diff --git a/www/common/outer/team.js b/www/common/outer/team.js index 83527bbe8..9adcf99f9 100644 --- a/www/common/outer/team.js +++ b/www/common/outer/team.js @@ -37,11 +37,13 @@ define([ // load shared folders // ~resetPins for the team? // getPinLimit + ctx.teams[id] = team; + cb(); }; - var openChannel = function (ctx, team, id, cb) { + var openChannel = function (ctx, teamData, id, cb) { // XXX team password? - var secret = Hash.getSecrets('team', team.href); + var secret = Hash.getSecrets('team', teamData.href); var crypto = Crypto.createEncryptor(secret.keys); var cfg = { @@ -65,7 +67,8 @@ define([ // types are DRIVE_CHANGE, DRIVE_REMOVE and DRIVE_LOG }; - ctx.teams[id] = { + var team = { + id: id, proxy: lm.proxy, listmap: lm, clients: [], @@ -78,6 +81,7 @@ define([ onReady(ctx, team, id, function () { // TODO + cb(); }); if (ctx.onReadyHandlers.length) { ctx.onReadyHandlers.forEach(function (f) { @@ -145,6 +149,9 @@ define([ team.getTeam = function (id) { return ctx.teams[id]; }; + team.getTeams = function () { + return Object.keys(ctx.teams); + }; team.removeClient = function (clientId) { removeClient(ctx, clientId); }; diff --git a/www/common/proxy-manager.js b/www/common/proxy-manager.js index e15517f52..1c813304a 100644 --- a/www/common/proxy-manager.js +++ b/www/common/proxy-manager.js @@ -736,11 +736,15 @@ define([ // We're going to return the value with the most recent atime. The attributes may have been // updated in a shared folder by another user, so the most recent one is more likely to be the // correct one. + // NOTE: we also return the atime, so that we can also check with each team manager var getPadAttribute = function (Env, data, cb) { cb = cb || function () {}; var sfId = Env.user.userObject.getSFIdFromHref(data.href); if (sfId) { - return void cb(null, Env.user.proxy[UserObject.SHARED_FOLDERS][sfId][data.attr]); + setTimeout(function () { + cb(null, Env.user.proxy[UserObject.SHARED_FOLDERS][sfId][data.attr]); + }); + return; } var datas = findHref(Env, data.href); var res = {}; @@ -753,7 +757,9 @@ define([ res.value = value; } }); - cb(null, res.value); + setTimeout(function () { + cb(null, res); + }); }; var getTagsList = function (Env) {