diff --git a/www/common/outer/roster.js b/www/common/outer/roster.js index f63a09d6f..7d2092b73 100644 --- a/www/common/outer/roster.js +++ b/www/common/outer/roster.js @@ -261,7 +261,6 @@ var factory = function (Util, Hash, CPNetflux, Sortify, nThen, Crypto) { return changed; }; - // XXX what about concurrent checkpoints? Let's solve for race conditions... commands.CHECKPOINT = function (args, author, roster) { // args: complete state @@ -536,6 +535,7 @@ var factory = function (Util, Hash, CPNetflux, Sortify, nThen, Crypto) { roster.init = function (_data, _cb) { var cb = Util.once(Util.mkAsync(_cb)); if (ref.internal.initialized) { return void cb("ALREADY_INITIALIZED"); } + if (!isMap(_data)) { return void cb("INVALID_ARGUMENTS"); } var data = Util.clone(_data); data.role = 'OWNER'; var members = {}; @@ -546,16 +546,15 @@ var factory = function (Util, Hash, CPNetflux, Sortify, nThen, Crypto) { // commands roster.checkpoint = function (_cb) { var cb = Util.once(Util.mkAsync(_cb)); - //var state = ref.state; - //if (!state) { return cb("UNINITIALIZED"); } - send([ 'CHECKPOINT', ref.state], cb); + send([ 'CHECKPOINT', Util.clone(ref.state)], cb); }; - roster.add = function (data, _cb) { + roster.add = function (_data, _cb) { var cb = Util.once(Util.mkAsync(_cb)); //var state = ref.state; if (!ref.internal.initialized) { return cb("UNINITIALIZED"); } - if (!isMap(data)) { return void cb("INVALID_ARGUMENTS"); } + if (!isMap(_data)) { return void cb("INVALID_ARGUMENTS"); } + var data = Util.clone(_data); // don't add members that are already present // use DESCRIBE to amend @@ -566,12 +565,13 @@ var factory = function (Util, Hash, CPNetflux, Sortify, nThen, Crypto) { send([ 'ADD', data ], cb); }; - roster.remove = function (data, _cb) { + roster.remove = function (_data, _cb) { var cb = Util.once(Util.mkAsync(_cb)); var state = ref.state; if (!state) { return cb("UNINITIALIZED"); } - if (!Array.isArray(data)) { return void cb("INVALID_ARGUMENTS"); } + if (!Array.isArray(_data)) { return void cb("INVALID_ARGUMENTS"); } + var data = Util.clone(_data); var toRemove = []; var current = Object.keys(state.members); @@ -584,11 +584,13 @@ var factory = function (Util, Hash, CPNetflux, Sortify, nThen, Crypto) { send([ 'RM', toRemove ], cb); }; - roster.describe = function (data, _cb) { + roster.describe = function (_data, _cb) { var cb = Util.once(Util.mkAsync(_cb)); var state = ref.state; + if (!state) { return cb("UNINITIALIZED"); } - if (!isMap(data)) { return void cb("INVALID_ARGUMENTS"); } + if (!isMap(_data)) { return void cb("INVALID_ARGUMENTS"); } + var data = Util.clone(_data); Object.keys(data).forEach(function (curve) { var member = data[curve]; @@ -602,10 +604,11 @@ var factory = function (Util, Hash, CPNetflux, Sortify, nThen, Crypto) { send(['DESCRIBE', data], cb); }; - roster.metadata = function (data, _cb) { + roster.metadata = function (_data, _cb) { var cb = Util.once(Util.mkAsync(_cb)); var metadata = ref.state.metadata; - if (!isMap(data)) { return void cb("INVALID_ARGUMENTS"); } + if (!isMap(_data)) { return void cb("INVALID_ARGUMENTS"); } + var data = Util.clone(_data); Object.keys(data).forEach(function (k) { if (data[k] === metadata[k]) { delete data[k]; }