This commit is contained in:
life
2017-01-19 11:35:51 +08:00
parent 097e4486a0
commit 2f615069c2
11 changed files with 341 additions and 183 deletions

177
node_modules/sync.js generated vendored
View File

@@ -33,7 +33,7 @@ var Sync = {
// 同步的信息, 返回给调用者
_syncInfo: {
notebook: {changeAdds: [], changeConflicts: [], adds: [], deletes: [], updates: []},
note: {changeAdds: [], changeConflicts: [], adds: [], deletes: [], updates: [], conflicts: []},
note: {changeAdds: [], changeConflicts: [], adds: [], deletes: [], updates: [], conflicts: [], errors: []},
tag: {}
},
/*
@@ -85,7 +85,7 @@ var Sync = {
// 同步信息
me._syncInfo = {
notebook: {ok: false, changeAdds: [], changeConflicts: [], changeNeedAdds: [], adds: [], deletes: [], updates: []},
note: {ok: false, adds: [], changeAdds: [], changeConflicts: [], changeUpdates:[], changeNeedAdds: [], deletes: [], updates: [], conflicts: []},
note: {ok: false, adds: [], changeAdds: [], changeConflicts: [], changeUpdates:[], changeNeedAdds: [], deletes: [], updates: [], conflicts: [], errors: []},
tag: {ok: false, adds: [], changeAdds: [], changeConflicts: [], changeNeedAdds: [], deletes: [], updates: [], conflicts: []},
};
@@ -175,7 +175,8 @@ var Sync = {
// console.log(notebook);
Notebook.getNotebookIdByServerNotebookId(notebookId, function(localNotebookId) {
Notebook.deleteNotebookForce(notebookId, function() {
me._syncInfo.notebook.deletes.push(localNotebookId);
// me._syncInfo.notebook.deletes.push(localNotebookId);
me.fixSynced('notebook', 'deletes', localNotebookId);
canCall();
})
});
@@ -188,7 +189,8 @@ var Sync = {
console.log('add addNotebookForce...')
// TODO
Notebook.addNotebookForce(notebook, function(notebook) {
me._syncInfo.notebook.adds.push(notebook);
// me._syncInfo.notebook.adds.push(notebook);
me.fixSynced('notebook', 'adds', notebook);
canCall();
});
} else {
@@ -207,7 +209,8 @@ var Sync = {
// 这里都是用服务器端的数据, 不处理冲突
Notebook.updateNotebookForce(notebook, notebookLocal, function(notebook) {
if(notebook) {
me._syncInfo.notebook.updates.push(notebook);
// me._syncInfo.notebook.updates.push(notebook);
me.fixSynced('notebook', 'updates', notebook);
}
canCall();
})
@@ -223,7 +226,7 @@ var Sync = {
return;
}
Api.getSyncNotebooks(afterUsn, me._notebookMaxEntry, function(notebooks) {
console.log('syncNotebook')
console.log(' syncNotebook')
// console.log(notebooks);
if(Common.isOk(notebooks)) {
me._totalSyncNotebookNum += notebooks.length;
@@ -237,7 +240,7 @@ var Sync = {
me.updateSyncUsn('NotebookUsn', last.Usn);
} else {
console.log('no more');
console.log(' no more notebooks');
me._syncNotebookIsLastChunk = true;
me._syncNotebookToLocal(notebooks, callback);
@@ -255,7 +258,6 @@ var Sync = {
});
},
//-------------
// note
//-------------
@@ -313,11 +315,11 @@ var Sync = {
// 1) 服务器端删除了, 本地肯定删除
if(note.IsDeleted) {
log('delete: ');
log(note);
console.log(' delete: ', note);
Note.getNoteIdByServerNoteId(noteId, function(localNoteId) {
Note.deleteNoteForce(noteId, function() {
me._syncInfo.note.deletes.push(localNoteId);
// me._syncInfo.note.deletes.push(localNoteId);
me.fixSynced('note', 'deletes', localNoteId);
canCall();
});
});
@@ -327,15 +329,16 @@ var Sync = {
Note.getNoteByServerNoteId(noteId, function(noteLocal) {
// 2.1 本地没有, 表示是新建
if(!noteLocal) {
console.log('add: ...');
console.log(' add note', note);
Note.addNoteForce(note, function(note) {
me._syncInfo.note.adds.push(note);
// me._syncInfo.note.adds.push(note);
me.fixSynced('note', 'adds', note);
return canCall();
});
} else {
// 如果Usn一样, 表示服务器端并没有修改
if(noteLocal.Usn === note.Usn) {
console.log('note 如果Usn一样, 表示服务器端并没有修改');
console.log(' note 如果Usn一样, 表示服务器端并没有修改');
return canCall();
}
@@ -343,7 +346,7 @@ var Sync = {
// 冲突, 将本地修改的笔记复制一份(设置冲突字段, ConflictNoteId), 远程的覆盖本地的
// 新方法: 冲突后, 得到最新内容, 看是否与本地内容一致, 如果一致, 则不冲突, 其它数据用服务器上的
if(noteLocal.IsDirty) {
console.log('note 冲突.... serverNoteId: ' + noteId);
console.log(' note 冲突 serverNoteId: ' + noteId, note.Title);
// console.log(noteLocal.NoteId);
// console.log(noteLocal.IsDirty);
// console.log(noteLocal);
@@ -354,7 +357,8 @@ var Sync = {
// 表示没有获取到content, 则只能标志为冲突了
// 内容不一样, 也标为冲突
if (content === false || content != noteLocal.Content) {
me._syncInfo.note.conflicts.push({server: note, local: noteLocal});
// me._syncInfo.note.conflicts.push({server: note, local: noteLocal});
me.fixSynced('note', 'conflicts', {server: note, local: noteLocal});
}
// 否则, 内容一样, 标为不冲突, 需要更新
else {
@@ -363,7 +367,8 @@ var Sync = {
// 服务器是最新的, 本地没动过, 则覆盖之
Note.updateNoteForce(note, function(note) {
if(note) {
me._syncInfo.note.updates.push(note);
// me._syncInfo.note.updates.push(note);
me.fixSynced('note', 'updates', note);
}
canCall();
}, false);
@@ -377,7 +382,8 @@ var Sync = {
// 服务器是最新的, 本地没动过, 则覆盖之
Note.updateNoteForce(note, function(note) {
if(note) {
me._syncInfo.note.updates.push(note);
// me._syncInfo.note.updates.push(note);
me.fixSynced('note', 'updates', note);
}
canCall();
});
@@ -394,9 +400,10 @@ var Sync = {
return;
}
console.log(' pull notes from server...');
Api.getSyncNotes(afterUsn, me._noteMaxEntry, function(notes) {
// console.log('syncNote---');
// console.log(notes);
console.log(' notes:', notes);
if(Common.isOk(notes)) {
me._totalSyncNoteNum += notes.length;
// 证明可能还有要同步的
@@ -413,7 +420,7 @@ var Sync = {
me.updateSyncUsn('NoteUsn', last.Usn);
} else {
log('no more');
console.log(' no more notes');
me._syncNoteIsLastChunk = true;
me._syncNoteToLocal(notes, callback);
@@ -426,8 +433,7 @@ var Sync = {
// 同步失败
me._syncInfo.note.ok = false;
me._syncInfo.note.msg = "cann't get all chunks";
console.error('eeeeeeeeeeeeeeeeeerrror')
console.error(notes);
console.error(' pull notes error', notes)
callback && callback(false);
}
});
@@ -492,7 +498,8 @@ var Sync = {
log('delete tag: ');
log(tag);
Tag.deleteTag(tag.Tag, function() {
me._syncInfo.tag.deletes.push(tag.Tag);
// me._syncInfo.tag.deletes.push(tag.Tag);
me.fixSynced('tag', 'deletes', tag.Tag);
canCall();
}, true);
return;
@@ -503,7 +510,8 @@ var Sync = {
if(!tagLocal) {
log('add tag: ...')
Tag.addOrUpdateTag(tag.Tag, function(tagAdded) {
me._syncInfo.tag.adds.push(tagAdded);
// me._syncInfo.tag.adds.push(tagAdded);
me.fixSynced('tag', 'adds', tagAdded);
return canCall();
}, true, usn);
} else {
@@ -547,7 +555,7 @@ var Sync = {
// 同步失败
me._syncInfo.tag.ok = false;
me._syncInfo.tag.msg = "cann't get all chunks";
console.error('tags eeeeeeeeeeeeeeeeeerrror')
console.error(' sync tags error...')
// console.log(tags);
callback && callback(false);
}
@@ -636,8 +644,25 @@ var Sync = {
});
},
_notebookWeb: null,
_noteWeb: null,
// 处理同步好的之后的
// mainType == notebook, note, tag
// type = changeAdds, changeConflicts, adds, deletes, updates, conflicts, errors,
fixSynced: function (mainType, type, data) {
var o = {};
if (!Common.isArray(data)) {
data = [data];
}
o[type] = data;
if (mainType == 'notebook') {
Notebook.fixConflicts(o);
} else if (mainType == 'note') {
console.error('........');
Note.fixConflicts(o);
} else {
Web.addOrDeleteTagFromSync(o);
}
},
// 处理冲突
fixConflicts: function(callback) {
var me = this;
@@ -648,6 +673,7 @@ var Sync = {
var tag = me._syncInfo.tag;
// 如果是incSync, 则要前端处理
// 不是fullSync
if(me.incrSyncStart) {
Notebook.fixConflicts(me._syncInfo.notebook);
@@ -656,7 +682,7 @@ var Sync = {
// 避免无限循环, 别send changes了
if(!me._needIncrSyncAgain) {
// alert("?")
console.log(">>>>>>>> not needIncrSyncAgain>>>>>>>>>>>>>>>>> ")
console.log(" not needIncrSyncAgain")
// send changes
callback && callback();
} else {
@@ -672,6 +698,7 @@ var Sync = {
Web.addOrDeleteTagFromSync(tag);
}
},
fixConflictsForSendChanges: function(callback) {
var me = this;
me.fixConflicts(function() {
@@ -724,39 +751,39 @@ var Sync = {
// 得到当前LastSyncUsn
User.getLastSyncState(function(lastSyncUsn, lastSyncTime) {
console.log('%cstep1 getLastSyncState', 'color: #68bc7a')
// 没有上次同步的时间, 则需要进行一次全量同步, 不可能会发生
if(!lastSyncUsn) {
console.error('getLastSyncState error!!');
console.error(' getLastSyncState error!!');
me.setSyncFinished();
return;
}
// 先从服务器上得到usn, 与本地的判断, 是否需要pull
console.log('先从服务器上得到usn, 与本地的判断, 是否需要pull');
Api.getLastSyncState(function(serverState) {
if(!serverState) {
console.error('get Server LastSyncState error!!');
console.error(' get Server LastSyncState error!!');
me.setSyncFinished();
return;
}
console.log(serverState.LastSyncUsn + ' ' + lastSyncUsn);
console.log(' get Server LastSyncState ret', serverState.LastSyncUsn + ' ' + lastSyncUsn);
if(serverState.LastSyncUsn > lastSyncUsn) {
// 需要同步笔记本
console.log('需要pull');
console.log('%cstep2 pull', 'color: #68bc7a')
// 同步笔记本
me.syncNotebook(lastSyncUsn, function(ok) {
if(ok) {
console.log('-------incr notebook ok-----------' + lastSyncUsn);
console.log(' incr notebook ok', lastSyncUsn);
me.addSyncProcessStatus(10);
console.log(' incr note start');
// 同步笔记
me.syncNote(lastSyncUsn, function(ok) {
if(ok) {
console.log('-------incr note ok-----------' + lastSyncUsn);
console.log(' incr note ok', lastSyncUsn);
me.addSyncProcessStatus(30);
// 同步标签
me.syncTag(lastSyncUsn, function() {
console.log('-------incr tag ok-----------' + lastSyncUsn);
console.log(' incr tag ok', lastSyncUsn);
me.addSyncProcessStatus(10);
// 更新上次同步时间
me.updateLastSyncState(function() {
@@ -765,7 +792,7 @@ var Sync = {
});
});
} else {
console.log('-------incr note not ok-----------')
console.log(' incr note not ok')
me.fixConflicts();
}
});
@@ -775,7 +802,7 @@ var Sync = {
});
} else {
console.log('不需要pull');
console.log('%cstep2 不需要pull, skip', 'color: #68bc7a')
me.addSyncProcessStatus(50);
me.sendChanges(again);
}
@@ -790,10 +817,14 @@ var Sync = {
// 发送笔记本的更改
sendNotebookChanges: function(callback) {
var me = this;
console.log(' 3.1: sendNotebookChanges')
// 获取所有笔记本的更改
Notebook.getDirtyNotebooks(function(notebooks) {
console.log('dirty notebooks');
console.log(notebooks);
if (!Common.isEmpty(notebooks)) {
console.log(' dirty notebooks:', notebooks);
} else {
console.log(' no dirty notebooks');
}
if(!notebooks) {
callback && callback();
} else {
@@ -805,7 +836,7 @@ var Sync = {
// 本地既是新的, 又是删除的, 删除本地的, 不要同步
// 5/4
if(notebook.LocalIsNew && notebook.LocalIsDelete) {
console.log('笔记本既是新的, 又是删除的, 不同步, 直接删除本地的');
console.log(' 笔记本既是新的, 又是删除的, 不同步, 直接删除本地的');
Notebook.deleteLocalNotebook(notebook.NotebookId);
return cb();
}
@@ -896,10 +927,14 @@ var Sync = {
// 发送笔记本的更改
sendNoteChanges: function(callback) {
var me = this;
console.log(' 3.2: sendNoteChanges');
// 获取所有笔记本的更改
Note.getDirtyNotes(function(notes) {
console.error('>>>>>>>>>>>> dirty notes <<<<<<<<<<<<<<< ');
console.log(notes);
if (!Common.isEmpty(notes)) {
console.log(' dirty notes:', notes);
} else {
console.log(' no dirty notes');
}
if(!notes) {
callback && callback();
} else {
@@ -908,7 +943,12 @@ var Sync = {
async.eachSeries(notes, function(note, cb) {
if (note.InitSync) {
console.error('InitSync is Dirty');
console.log(' InitSync is Dirty', note);
return cb();
}
if (note.ConflictNoteId && !note.ConflictFixed) {
console.log(' 未解决的冲突不同步', note.Title);
return cb();
}
@@ -916,10 +956,13 @@ var Sync = {
// 是新的, 且不是trash和删除的
if(!note.IsTrash && !note.LocalIsDelete) {
// 添加, newNote的返回不会很多值(server端)
Api.addNote(note, function(newNote) {
if(!Common.isOk(newNote)) {
Api.addNote(note, function(err, newNote) {
if(err || !Common.isOk(newNote)) {
console.log(' 添加笔记失败!', err, newNote);
me._syncInfo.note.errors.push({err: err, ret: newNote, note: note});
return cb();
}
console.log(' 添加笔记成功!', note.Title);
newNote.ServerNoteId = newNote.NoteId;
newNote.NoteId = note.NoteId;
@@ -938,13 +981,13 @@ var Sync = {
// 5/4
// 本地已经删除了, 则彻底删除之
else if(note.LocalIsDelete) {
console.log('既是新的, 又是删除的, 则删除笔记的');
console.log(' 既是新的, 又是删除的, 则删除笔记的');
Note.deleteLocalNote(note.NoteId);
return cb();
}
// isTrash, 不同步, 不删除
else {
console.log('既是新的, 又是trash的, 不要同步');
console.log(' 既是新的, 又是trash的, 不要同步');
return cb();
}
}
@@ -960,13 +1003,12 @@ var Sync = {
}
else {
// 更新
Api.updateNote(note, function(ret) {
if(!Common.isOk(ret)) {
console.log('updateNote eeeeeeeeeeror');
console.log(ret);
Api.updateNote(note, function(err, ret) {
if(err || !Common.isOk(ret)) {
console.log(' update error:' + note.Title, ret);
if(typeof ret == 'object') {
if(ret.Msg == 'conflict') {
console.error('updateNote 冲突-----------');
console.error(' updateNote 冲突');
// 这种情况有很少见, 原因是先pull, 肯定会pull过来
// 处理方法和pull一样, 看内容是否一样
@@ -999,16 +1041,21 @@ var Sync = {
}
// 其它错误, 不加, notImage 导致不能终止
else {
console.error(' updateNote error', err);
me._syncInfo.note.errors.push({err: err, ret: ret, note: note});
cb();
}
}
// 更新失败了, 服务器返回异常
else {
console.error(' updateNote error', err);
me._syncInfo.note.errors.push({err: err, ret: ret, note: note});
cb();
}
}
// 更新成功
else {
console.log(' 更新成功: ', note.Title);
ret.ServerNoteId = ret.NoteId;
ret.NoteId = note.NoteId;
Note.updateNoteForceForSendChange(ret, false);
@@ -1028,12 +1075,15 @@ var Sync = {
},
// 发送标签改变
sendTagChanges: function(callback) {
log('send note changes');
console.log(' 3.3: sendTagChanges');
var me = this;
// 获取所有笔记本的更改
Tag.getDirtyTags(function(tags) {
console.log('dirty tags');
console.log(tags);
if (!Common.isEmpty(tags)) {
console.log(' dirty tags:', tags);
} else {
console.log(' no dirty tags');
}
if(!tags) {
callback && callback();
} else {
@@ -1075,16 +1125,16 @@ var Sync = {
// again, 再一次sync, 不要send changes
sendChanges: function(again) {
var me = this;
console.log('send changes before...')
console.log('%cstep3 send changes', 'color: #68bc7a')
// 先处理冲突, 可以同时进行
if(again) {
console.error('send changes again....');
console.log(' send changes again....');
me.fixConflictsForSendChanges(function(){});
return;
}
me.fixConflicts(function() {
// send changes
console.log('send changes');
console.log(' send changes');
me._initSyncInfo(); // 重新初始化[]
async.series([
function(cb) {
@@ -1103,13 +1153,12 @@ var Sync = {
// 重新再来一次增量同步
if(me._needIncrSyncAgain) {
console.error('-- _needIncrSyncAgain -- ')
console.log('send changes 后解决冲突, 先fix, 再incSync again');
console.error(' needIncrSyncAgain')
me.fixConflictsForSendChanges(function() {
me.incrSync(true);
});
} else {
console.log('send changes 后解决冲突');
console.log(' send changes 后解决冲突');
me.fixConflictsForSendChanges(function() {
});
}