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是每个用户唯一分配的一个数据结构,包含userGuidkbGuid等,保证登录后可以与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部分描述

  1. 各个结构之间关系:
  2. Users数据结构对接实现所有wiznote-sdk-js的接口函数。Users内实现的接口函数主要是将UserData及WizDb内的成员函数作为Api实现逻辑(例如createNote、logout等函数)。
  3. UserData只实现sync同步功能、下载资源、读写图片资源的逻辑,WizDb实现所有和本地笔记数据、笔记元数据、笔记资源相关的读写。二者都在登录后创建,WizDb有本地数据永久驻留数据库,UserData当user、wizDb、accountServer齐全后创建。
  4. UserData内关于数据下载同步相关的处理,都会实例化一个SyncKbTask变量,并调用其成员接口函数,实现同步、上传、下载等功能。
  5. SyncKbTask实现同步、上传、下载逻辑,调用KnowledgeServer中实现好的服务于wiznote的基础同步功能。SyncKbTask初始化的时候会实例化一个KnowledgeServer。
  6. WizDbUserData关于本地数据读写的部分都由note-data.tsnote-analysis.ts实现。
  7. 其他文件包含一些更细节的内容。
  8. onlineLogin过程: 参考思维导图(在本地未截图)。users.onlineLogin->users._processUser。
  9. 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接口保存。
  10. 两个穿越数层的函数:
    一个是user_datasetUser函数设置this.refreshToken函数:该函数为用户重登录函数;该函数传递给KnowledgeServer,再传递给ServerBase实现底层的token刷新。这样做的是因为只有userData是包含了登录信息,且为包含该信息的最底层
    一个是Users中在userData.on('syncError',...)中设置db.setDownloadNoteHandlersync/download_note_data.ts中的downloadNoteData函数:该函数传递给db,最终在(renameTag/setNoteMarkdown->fixLinkedNotesMarkdown->updateMarkdownLinkTasks)->db.getNoteMarkdown->db.downloadNoteMarkdown中使用。getNoteMarkdown中,若笔记标记需要重新下载或者判断不存在,则调用该接口下载。该handler创建task.downloadNoteData下载,并updateNoteTag。该函数也调用下载,注意加密后修改逻辑。

分析Wiznote Lite代码的初衷是为了对云端保密而加上加密过程。所以该函数应当修改。但该函数的位置设计得实在有点坑。

  1. 一个重要函数:

db.setNoteMarkdown:待后续补充,该函数用于将前端的修改同步到本地数据、数据库中。

posted @ 2021-08-21 15:28  日光散林间  阅读(37)  评论(0编辑  收藏  举报