dsh-webdav-sync 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -3
- package/lib/client.js +618 -56
- package/lib/engine.d.ts +28 -1
- package/lib/engine.js +231 -19
- package/lib/index.js +34 -13
- package/lib/wire.d.ts +67 -0
- package/lib/wire.js +4 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -155,13 +155,15 @@ pnpm add dsh-webdav-sync
|
|
|
155
155
|
|
|
156
156
|
`order: 22` 是有意的:Settings 导航栏没有滚动条且高度固定,排太后在窗口不高时会被裁掉。
|
|
157
157
|
|
|
158
|
-
卡片的三个主要设置区依次是:**服务器**(地址、账号、密码、口令、额外请求头 —— 前四个各占一行,最后一个是多行输入框,每句说明都紧跟在它讲的那个字段的标签下面)、**自动同步**(一排选项卡:关闭同步 / 手动同步 / 3 分钟 / 15 分钟 / 30 分钟 / 1
|
|
158
|
+
卡片的三个主要设置区依次是:**服务器**(地址、账号、密码、口令、额外请求头 —— 前四个各占一行,最后一个是多行输入框,每句说明都紧跟在它讲的那个字段的标签下面)、**自动同步**(一排选项卡:关闭同步 / 手动同步 / 3 分钟 / 15 分钟 / 30 分钟 / 1 小时,选中的那个高亮)、**同步内容**(标题右边是一个只重读状态的**刷新图标**(鼠标悬停和读屏都叫「刷新状态」),下面四份各一行:前面复选框决定同步不同步,下面一行小字说这份同步的是什么,右端是「已一致 / 仅本机有改动 / 仅服务器有改动 / 两边都有改动」;最后一行是**附加目录**,复选框一样在行首、默认不勾,名称右边多一个**选择目录**文字按钮(不带框),选中的路径在下面一行一个、各带「移除」,开关开着而列表为空时不显示状态文字,读不出来的目录在列表下方按「哪条路径、为什么」说出来,密钥读不出来时同样按「哪个名字、为什么」说出来)。主表单最后还有**本机转发**:一个与其他几行同字号的复选框,开启后是三行同构的值 —— **地址**、**用户名**、**密码**,每行都是名称、等宽文字、紧跟其后的复制图标(复制成功后图标短暂变成对勾),值本身既不套框也不能编辑;端口不出现在地址之外,只有监听出问题时错误旁边才多一个「换一个端口」。同步动作(测试连接/预览/立即同步/服务器覆盖本机/撤销恢复/本机覆盖服务器)在「同步内容」末尾排成一行,「放弃改动/保存」在整张卡片最外层。六个同步动作**全部是不带框的文字按钮**,靠颜色分组:**立即同步**是强调色(这一行唯一的着色项,也就是这一行的主操作),**服务器覆盖本机**与**本机覆盖服务器**是警告色(这两个会用一边整体覆盖另一边),**测试连接**、**预览**、**撤销恢复**是普通文字色;悬停时各自浮起一层底色,键盘聚焦时有一圈焦点环。**保存**与确认框的「确定」仍是实心按钮。附加目录的「选择目录」、转发出问题时的「换一个端口」与地址、账号旁的复制图标也都是不带框的轻量按钮。
|
|
159
159
|
|
|
160
160
|
附加目录那一份的开关说的是「这台电脑带不带这一份」,不是「带哪几个目录」:关掉之后这台电脑一个附加目录都不读、不写,列表原样留在配置里,服务器上那份一个字节不动 —— 与其余四份「关掉的份原样带走」同一条规则,任何地方都不会因此删文件([0036](docs/decisions/0036-extra-directories-part.md))。它默认是关的([0056](docs/decisions/0056-drop-default-model-part.md))。「选择目录」在满 5 个之后变灰;开关开着、列表为空时这一行不显示状态文字 —— 「不同步」在其余四份里读作「开关关掉了」,而空列表只是「还没指定」。挑目录用的是这台部署已有的对话框(桌面端走它的原生桥,网页端走 workspace 服务);两者都没弹出来时,会留一个空行让你手打路径。
|
|
161
161
|
|
|
162
|
+
「同步内容」下面另有一节**手动备份**,两行同构:**导出**(左边是名称和一句「把上面这些打包成一个用口令加密的文件,带到另一台电脑」,右端是「导出…」文字按钮)和**导入**(右端是「导入…」)。点「导出…」在这一行下面展开一个小表单:**这个文件的口令**(自己设一个,不必与上面的同步口令相同 —— 导出用的口令只加密这一个文件,所以把它给别人不会连累服务器上的那份)、**保存到**(一个目录,或一个以 `.prop` 结尾的完整文件名,留空则存到用户主目录;右边是「选择目录」),最后是「导出」与「取消」。点「导入…」展开的是**文件的口令**加一个**选择文件**:选中的文件名显示在旁边,读不出来会当场说原因;确认后文件里带的每一份都写进本机,替换前的本机 setup 先封存进 `sync/`,可以接着用「撤销恢复」放回去。两行都不动上面的草稿,也不要求先「保存」——导出的内容取的是本机现在真实的样子([0060](docs/decisions/0060-manual-backup.md))。
|
|
163
|
+
|
|
162
164
|
浏览器半边不读 profile 文件、也不说 WebDAV,它只 `fetch` Host 半边在 `ROUTE_PREFIX = '/plugin/webdav-sync'` 之下的路由:
|
|
163
165
|
|
|
164
|
-
`/status`、`/config`、`/check`、`/sync`、`/preview`、`/restore`、`/undo`、`/upload`、`/dismiss`、`/off`、`/install`。
|
|
166
|
+
`/status`、`/config`、`/check`、`/sync`、`/preview`、`/restore`、`/undo`、`/upload`、`/dismiss`、`/off`、`/install`、`/export`、`/import`。
|
|
165
167
|
|
|
166
168
|
主表单最末尾是**本机转发**复选框,开启后用三行同构的文字显示地址与生成的本地 Basic 用户名、密码:每行都是名称(地址 / 用户名 / 密码)、等宽的值、紧跟其后的复制图标。它复用同一份草稿、同一个「放弃改动 / 保存」:`/status` 同时返回 `relay` 的监听状态与本地账号,`/config` 同时保存转发开关和端口并立即应用。没有 `/plugin/webdav-relay/*` 独立路由,也没有独立保存,见下节。
|
|
167
169
|
|
|
@@ -173,6 +175,7 @@ pnpm add dsh-webdav-sync
|
|
|
173
175
|
| --- | --- | --- | --- |
|
|
174
176
|
| **保存** | `/config` | 存下地址、账号与口令、额外请求头、自动同步间隔、同步内容与附加目录列表、本机转发开关与端口;首次开启转发时生成本地账号,保存后立即应用监听状态 | `sync.json`(上游密码按「记住密码」决定是否落盘;加密口令与本地转发账号仍保存在本机) |
|
|
175
177
|
| **放弃改动** | 无(只在浏览器半边) | 把表单恢复成上次从 Host 取到的状态 | 不写任何东西 |
|
|
178
|
+
| **刷新状态**(「同步内容」标题右边的图标) | `/status`(只读) | 立即重读一次本机状态:两个时间与各份的状态文字刷新,不触发同步、不碰草稿、不覆盖正在输入的口令与密码 | 不写任何东西 |
|
|
176
179
|
| **立即同步** | `/sync`(`force: true`) | 跑一次三方分片合并 | 总会写服务器(`force` 覆盖「没什么可说就不写」);本机只在合并结论需要改它时才写,且被替换的副本先封存进 `sync/` |
|
|
177
180
|
| **预览** | `/preview` | 用和真正合并同一套判断,说出每一份会取哪边 | 不写 profile、不写服务器(但会读一次服务器;若那份服务器文件是截断的、且本机有基线,会先留档一份 `-server-damaged`) |
|
|
178
181
|
| **测试连接** | `/check` | 到达服务器、报告账号能否读写、服务器上有没有我们的备份、多大、什么时候写的 | 服务器上缺 `dsh-webdav` 文件夹时会创建它(首次同步本来也要建) |
|
|
@@ -182,6 +185,8 @@ pnpm add dsh-webdav-sync
|
|
|
182
185
|
| **安装缺少的插件** | `/install` | 在 profile 目录跑 `pnpm install` | `node_modules`(同步声明后由本机拉包) |
|
|
183
186
|
| **关闭同步**(自动同步选项卡的第一个) | `/off` | 清 `url` 与上游 `password` 并立即停止本机转发监听;保留转发开关、端口及生成的本地账号,服务器上的文件保持原样 | `sync.json`(`sync-state.json` 刻意保留) |
|
|
184
187
|
| **知道了** | `/dismiss` | 收掉上次同步的「替换了内容」通知 | `sync-state.json` |
|
|
188
|
+
| **导出**(手动备份那一行) | `/export` | 把上面开着的那几份打成一个用**这个文件自己的口令**加密的 `.prop` 文件,写进你指定的目录或文件名 | 你选的那个目录里的一个文件;本机配置与服务器一个字节不动 |
|
|
189
|
+
| **导入**(手动备份那一行) | `/import` | 用文件的口令打开你选的那个备份,把它带的每一份写进本机(不看你这一台开着哪几份 —— 这是一次明确的动作) | 本机 profile 文件;替换前的 setup 先封存进 `sync/`,可用「撤销恢复」放回去。不同步基线,所以下一次同步会把这套配置推上去 |
|
|
185
190
|
|
|
186
191
|
「服务器覆盖本机」「本机覆盖服务器」「关闭同步」三个动作都要先在卡片上确认一次(「关闭同步」从「自动同步」选项卡里选,选完弹确认框);「撤销恢复」只在真的存在一次可撤销的 Restore 时才可用。
|
|
187
192
|
|
|
@@ -259,7 +264,7 @@ http://127.0.0.1:3426/dav
|
|
|
259
264
|
|
|
260
265
|
要说清楚的是:**卡片上的状态不代表服务器现在的真相**。要真知道服务器那边是什么,按「预览」—— 它用同一套合并判断去真读一次服务器,逐份说出会取哪边(见 [0029](docs/decisions/0029-status-says-only-what-it-knows.md))。
|
|
261
266
|
|
|
262
|
-
卡片底部那一行左右两个时间是**两件事**:**上次检查**(左边)是宿主**试过**同步(自动同步的每次 tick
|
|
267
|
+
卡片底部那一行左右两个时间是**两件事**:**上次检查**(左边)是宿主**试过**同步(自动同步的每次 tick 都算,哪怕两边一致、一个字节都没写),**上次同步**(右边)只在真换过东西的时候才前进(推上去、从服务器取回某一份、恢复、上传)。所以在「上次检查」在动就说明定时器活着,而「上次同步」停在很久以前只说明这段时间两边一直是一份;升级前的老状态文件没有这个时间,会显示「尚未同步过」。卡片打开着时自己每 15 秒重读一次状态(只读本机文件,不向服务器发请求),否则这两个时间永远停在打开那一刻;「同步内容」标题右边的刷新图标是同一个读取的立即执行,不等到下一个 15 秒,也不碰草稿。见 [0039](docs/decisions/0039-the-card-says-check-and-sync-apart.md)。
|
|
263
268
|
|
|
264
269
|
写到本机的 YAML 走 `yaml` 的 Document API 而不是「解析成对象再序列化」,所以一个人的注释、缩进、引号风格会在只改了一个 provider 的同步里活下来。合并结论与原文件相同时,`applyPatch` 直接把读到的原始字节还回去 —— YAML 重新序列化不是字节稳定的(`[text, image]` 会被写成 `[ text, image ]`),改写一个什么都没变的文件等于撒谎。
|
|
265
270
|
|