2021-08-21-补记Wiznote Lite开源代码阅读相关内容-5-wiznote-sdk-js工作流程及各个模块详解
1、主要数据结构
Users(users):
wiznote-sdk-js/src/index.ts
中包含所有接口函数,而接口函数大多都调用users的成员函数实现,除了一些关于i18n的字符串相关内容。
dataStore:
一个获取Db、user的接口数据结构。
**User(user): **
user是每个用户唯一分配的一个数据结构,包含userGuid
、kbGuid
等,保证登录后可以与server进行同步。每次当调用onlineLogin
进行登录时或者signUp
注册时,Users的处理函数会先通过AccountServer与服务器交互获取user数据结构和信息,之后调用_processUser
函数获得/创建db(WizDb)、userData(UserData),并更新db内关于用户的元信息,以及 userMap对(userGuid, userData)。
UserData(userData):
user的成员函数大多直接调用userData的成员函数实现。
userData是实际实现了各个功能函数的类,在_processUser
之后,一个用户所需要的结构体如user、db、accoutServer都已经准备好,而这些信息都在创建userData后包含在userData中,于是所有功能函数都可以在UserData类中实现。
wizdb调用这些接口进行最终的笔记读写。
WizDb(db,_db):
每个用户各自单独拥有一个db,在生成打开时会创建表(src/db/wiz-sql-commands.ts
中的内容)表来保存用户和笔记相关元信息,用于同步等。
与笔记相关的元信息处理也在这一层实现。
拥有的表有:wiz_note、wiz_db_version、wiz_meta、wiz_note_links、CREATE VIRTUAL TABLE fts_note USING fts5、以及一些触发器。
可以查看src/db/wiz-sql-commands.ts
。
noteData:
import * as noteData from'./note_data';
src/db/note_data.ts实现了实际上读写本地笔记的接口函数。包含将markdown转化为html格式的函数。还有与之相关笔记分析与转化的接口实现在wiznote-sdk-js-share/src/note\_analysis.ts
中。
SqliteDb(sqliteDb):
WizDb实际上实现在Sqlite之上,该层抽象实现了一个数据库需要的各类基础操作、以及为WizDb功能而增加的其他成员函数,例如update函数用定制好的sql命令初始化。
SyncKbTask(syncKbTask):
负责同步逻辑,调用KnowledgeServer
内功能函数,实现同步逻辑。例如,服务器与本地同步顺序与判断等,同步判断和同步判断使用到了wizDb内的成员函数syncNote、syncNoteData进行处理,因为需要比较同一个笔记在本地与服务器的状态,通过笔记元信息比较,而元信息存储在wizDb中。
KnowledgeServer(_ks):
各个函数按照约定的request请求实现基础同步功能,包含下载所有Notes列表元信息、下载单个Note内容及资源等。
ServerBase:
KnowledgeServer的父类,通过调用WizRequest.standardRequest实现了带refreshToken的requst操作。
2、wiznote-sdk-js部分描述
- 各个结构之间关系:
- Users数据结构对接实现所有wiznote-sdk-js的接口函数。Users内实现的接口函数主要是将UserData及WizDb内的成员函数作为Api实现逻辑(例如createNote、logout等函数)。
- UserData只实现sync同步功能、下载资源、读写图片资源的逻辑,WizDb实现所有和本地笔记数据、笔记元数据、笔记资源相关的读写。二者都在登录后创建,WizDb有本地数据永久驻留数据库,UserData当user、wizDb、accountServer齐全后创建。
- UserData内关于数据下载同步相关的处理,都会实例化一个SyncKbTask变量,并调用其成员接口函数,实现同步、上传、下载等功能。
- SyncKbTask实现同步、上传、下载逻辑,调用KnowledgeServer中实现好的服务于wiznote的基础同步功能。SyncKbTask初始化的时候会实例化一个KnowledgeServer。
- WizDb、UserData关于本地数据读写的部分都由note-data.ts与note-analysis.ts实现。
- 其他文件包含一些更细节的内容。
- onlineLogin过程: 参考思维导图(在本地未截图)。users.onlineLogin->users._processUser。
- syncKb同步过程: 参考思维导图(在本地未截图)。
中间一个步骤会调用SyncKbTask的syncAll函数:其中会无返回的调用this.downloadNotes和this.downloadNotesData函数。
downloadNotes:下载所有Notes的元信息对比。调用ks.downloadNotes下载Note列表元信息,修正一些信息后,调用db.syncNote(note)对每个note元信息逐一对比本地数据库,确认是否相同。若本地已经修改或者云端与本地版本相同则不修改;否则则录入云端的note元信息,若Md5值不同,设置其元信息local-status为LOCAL_STATUS_NEED_REDOWN,相同则置为LOCAL_STATUS_DOWNLOADED。
downloadNotesData:下载所有需要下载的笔记。通过wizDb的local-status属性获取需要下载的笔记元信息;然后通过this.downloadNoteData->ks.downloadNote来下载笔记数据,通过db.syncNoteData->noteData来保存; 通过this.downloadNoteResources->ks.downloadNoteResource来下载笔记附加资源,通过noteData接口保存。 - 两个穿越数层的函数:
一个是user_data
中setUser
函数设置this.refreshToken函数:该函数为用户重登录函数;该函数传递给KnowledgeServer,再传递给ServerBase实现底层的token刷新。这样做的是因为只有userData是包含了登录信息,且为包含该信息的最底层。
一个是Users
中在userData.on('syncError',...)中设置db.setDownloadNoteHandler
为sync/download_note_data.ts
中的downloadNoteData函数:该函数传递给db,最终在(renameTag/setNoteMarkdown->fixLinkedNotesMarkdown->updateMarkdownLinkTasks)->db.getNoteMarkdown->db.downloadNoteMarkdown中使用。getNoteMarkdown中,若笔记标记需要重新下载或者判断不存在,则调用该接口下载。该handler创建task.downloadNoteData下载,并updateNoteTag。该函数也调用下载,注意加密后修改逻辑。
分析Wiznote Lite代码的初衷是为了对云端保密而加上加密过程。所以该函数应当修改。但该函数的位置设计得实在有点坑。
- 一个重要函数:
db.setNoteMarkdown:待后续补充,该函数用于将前端的修改同步到本地数据、数据库中。