var sendServerChanges = function(doc, clientDoc, socket, send){ // create a diff from the current server version to the client's shadow // important: use deepcopied versions var diff = jsondiffpatch.diff(deepCopy(clientDoc.shadow.doc), deepCopy(doc.serverCopy)); var basedOnServerVersion = clientDoc.shadow.serverVersion; // add the difference to the server's edit stack if(!_.isEmpty(diff)){ clientDoc.edits.push({ serverVersion: basedOnServerVersion, localVersion: clientDoc.shadow.localVersion, diff: diff }); // update the server version clientDoc.shadow.serverVersion++; } // apply the patch to the server shadow jsondiffpatch.patch(clientDoc.shadow.doc, diff); send({ localVersion: clientDoc.shadow.localVersion, serverVersion: basedOnServerVersion, edits: clientDoc.edits }); };
self.socket.on('scanning', function(o) { if (o.reset) self.scanningFromServer = undefined; self.scanningFromServer = jsondiffpatch.patch(self.scanningFromServer, o.delta); deleteUndefineds(self.scanningFromServer); self.scanningFromServerVersion = o.version; self.emit('scanningUpdate'); });
exports.updateUser = function(req, res){ var receiveTime = Date.now(); var diffStartTime = req.body.diffStartTime; var diffEndTime = req.body.diffEndTime; var sendTime = req.body.sendTime; var delta = req.body.delta; var patchStartTime = 0; var patchEndTime = 0; switch (algorithm) { case "0": break; case "1": patchStartTime = Date.now(); jsondiffpatch.patch(users[0], delta); patchEndTime = Date.now(); break; } var totalTime = (diffEndTime - diffStartTime) + (receiveTime - sendTime) + (patchEndTime - patchStartTime); var result = (diffEndTime - diffStartTime)+',' +(receiveTime - sendTime) +',' +(patchEndTime - patchStartTime)+ ','+totalTime+'\n'; fs.writeFile('./result/'+size+'-P'+probability+'-L'+loopTimes+'-A'+algorithm+'.csv', result, {flag: 'a'}, function(err){ if(err) throw err; console.log("success"); }); res.end(); }
.then(function (beer) { try { return jdp.patch(beer, delta); } catch (e) { throw new MW.Error(400, "Malformed delta"); } })
self.socket.on('playlists', function(o) { if (o.reset) self.playlistsFromServer = undefined; self.playlistsFromServer = jsondiffpatch.patch(self.playlistsFromServer, o.delta); deleteUndefineds(self.playlistsFromServer); self.playlistsFromServerVersion = o.version; self.updatePlaylistsIndex(); self.emit('playlistsUpdate'); });
self.socket.on('queue', function(o) { if (o.reset) self.queueFromServer = undefined; self.queueFromServer = jsondiffpatch.patch(self.queueFromServer, o.delta); deleteUndefineds(self.queueFromServer); self.queueFromServerVersion = o.version; self.updateQueueIndex(); self.emit('statusupdate'); self.emit('queueUpdate'); });
transform: function(chunk, enc, next){ debug('last', last) var json = JSON.parse(chunk) debug('json', json) var diff = jdp.diff(last, json) debug('diff', diff) this.push(JSON.stringify(diff)+'\n') last = jdp.patch(last, diff) debug('newlast', last) next() },
self.get(key, function(err, original) { if(err && !(err instanceof levelup.errors.NotFoundError)) { return callback(err); } var newValue; try { var originalObject = JSON.parse(original); newValue = jsondiffpatch.patch(originalObject, diff); } catch(e) { newValue = jsondiffpatch.patch(original, diff); } var operation = { type: 'put', key: [self.dataPrefix, key].join('-'), value: newValue }; callback(null, operation); });
clientEdit.edits.forEach(function(edit){ // 2) check the version numbers if(edit.serverVersion == clientDoc.shadow.serverVersion && edit.localVersion == clientDoc.shadow.localVersion){ // versions match // backup! TODO: is this the right place to do that? clientDoc.backup = deepCopy(clientDoc.shadow); // 3) patch the shadow var snapshot = deepCopy(clientDoc.shadow.doc); jsondiffpatch.patch(snapshot, edit.diff); clientDoc.shadow.doc = snapshot; // apply the patch to the server's document snapshot = deepCopy(doc.serverCopy); jsondiffpatch.patch(snapshot, edit.diff); doc.serverCopy = snapshot; // 3.a) increase the version number for the shadow if diff not empty if(!_.isEmpty(edit.diff)){ clientDoc.shadow.localVersion++; // notify all sockets about the update, all but this one doc.registeredSockets.forEach(function(soc){ if(soc.id != socket.id){ soc.emit('updated-doc'); } }); } // 4) save a snapshot of the document saveSnapshot(clientEdit.id); }else{ console.log('error', 'patch rejected!!', edit.serverVersion, '->', clientDoc.shadow.serverVersion, ':', edit.localVersion, '->', clientDoc.shadow.localVersion); } });
self.socket.on('library', function(o) { if (o.reset) self.libraryFromServer = undefined; self.libraryFromServer = jsondiffpatch.patch(self.libraryFromServer, o.delta); deleteUndefineds(self.libraryFromServer); self.libraryFromServerVersion = o.version; self.library.clear(); for (var key in self.libraryFromServer) { var track = self.libraryFromServer[key]; self.library.addTrack(track); } self.library.rebuild(); self.updateQueueIndex(); self.haveFileListCache = true; var lastQuery = self.lastQuery; self.lastQuery = null; self.search(lastQuery); });
exports.updateUser = function(req, res){ console.log("----------------------------"); var receiveTime = Date.now(); var diffStartTime = req.body.diffStartTime; var diffEndTime = req.body.diffEndTime; var sendTime = req.body.sendTime; var delta = req.body.delta; var rate = req.body.rate; console.log(rate); var patchStartTime ; var patchEndTime ; patchStartTime = Date.now(); switch (algorithm) { case "0": comparedData = delta; break; case "1": jsondiffpatch.patch(comparedData, delta); break; case "2": jsonpatch.apply(comparedData, delta); break; case "3": comparedData = jiff.patch(delta, comparedData); break; case "4": comparedData = changeSet.apply(delta, comparedData); break; case "5": comparedData = diffjson.applyChanges(comparedData, delta); break; } patchEndTime = Date.now(); //assert the data is the same var flag = false; console.log(JSON.stringify(users[1]).length); console.log(JSON.stringify(comparedData).length); var err = test.error(function() { //assert the data assert.equal(JSON.stringify(comparedData), JSON.stringify(users[1])); //set the flag flag = true; throw new Error('OK!'); }); if(flag) { //the two data is the same writeCSV(); res.send("ok"); } else { //the two data is not the same res.send("ko"); } function writeCSV () { var totalTime = (diffEndTime - diffStartTime) + (receiveTime - sendTime) + (patchEndTime - patchStartTime); var result = (diffEndTime - diffStartTime)+',' +(receiveTime - sendTime) +',' +(patchEndTime - patchStartTime)+ ','+totalTime+','+rate+ '\n'; fs.writeFile('./result/'+size+'-P'+probability+'-A'+algorithm+'.csv', result, {flag: 'a'}, function(err){ if(err) throw err; console.log("success"); }); } }