@aiao/rxdb-plugin-sync 0.0.0-stage → 0.0.26
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/LICENSE +21 -0
- package/README.md +81 -2
- package/dist/SyncManager.d.ts +412 -0
- package/dist/SyncManager.d.ts.map +1 -0
- package/dist/branch-change-id.d.ts +31 -0
- package/dist/branch-change-id.d.ts.map +1 -0
- package/dist/branch-utils.d.ts +8 -0
- package/dist/branch-utils.d.ts.map +1 -0
- package/dist/bulk-sync.d.ts +117 -0
- package/dist/bulk-sync.d.ts.map +1 -0
- package/dist/cascade-blocking.d.ts +38 -0
- package/dist/cascade-blocking.d.ts.map +1 -0
- package/dist/check-repository-updates.d.ts +47 -0
- package/dist/check-repository-updates.d.ts.map +1 -0
- package/dist/cleanup-expired.d.ts +56 -0
- package/dist/cleanup-expired.d.ts.map +1 -0
- package/dist/dependency-graph.d.ts +128 -0
- package/dist/dependency-graph.d.ts.map +1 -0
- package/dist/get-all-repository-sync-status.d.ts +58 -0
- package/dist/get-all-repository-sync-status.d.ts.map +1 -0
- package/dist/get-repository-sync-status.d.ts +68 -0
- package/dist/get-repository-sync-status.d.ts.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3273 -0
- package/dist/plugin.d.ts +70 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/pull-ancestor-changes.d.ts +41 -0
- package/dist/pull-ancestor-changes.d.ts.map +1 -0
- package/dist/pull-batch.d.ts +16 -0
- package/dist/pull-batch.d.ts.map +1 -0
- package/dist/pull-conflict-utils.d.ts +43 -0
- package/dist/pull-conflict-utils.d.ts.map +1 -0
- package/dist/pull-repository.d.ts +36 -0
- package/dist/pull-repository.d.ts.map +1 -0
- package/dist/pull.d.ts +16 -0
- package/dist/pull.d.ts.map +1 -0
- package/dist/push-branch.d.ts +22 -0
- package/dist/push-branch.d.ts.map +1 -0
- package/dist/push-repository.d.ts +63 -0
- package/dist/push-repository.d.ts.map +1 -0
- package/dist/push.d.ts +14 -0
- package/dist/push.d.ts.map +1 -0
- package/dist/query-cache-outbox.d.ts +120 -0
- package/dist/query-cache-outbox.d.ts.map +1 -0
- package/dist/sync-branches.d.ts +35 -0
- package/dist/sync-branches.d.ts.map +1 -0
- package/dist/sync-listeners.d.ts +20 -0
- package/dist/sync-listeners.d.ts.map +1 -0
- package/dist/sync-manager.utils.d.ts +36 -0
- package/dist/sync-manager.utils.d.ts.map +1 -0
- package/dist/sync-repository.d.ts +63 -0
- package/dist/sync-repository.d.ts.map +1 -0
- package/dist/topological-sort.d.ts +126 -0
- package/dist/topological-sort.d.ts.map +1 -0
- package/dist/version.utils.d.ts +3 -0
- package/dist/version.utils.d.ts.map +1 -0
- package/package.json +58 -3
- package/src/SyncManager.ts +662 -0
- package/src/branch-change-id.ts +70 -0
- package/src/branch-utils.ts +37 -0
- package/src/bulk-sync.ts +338 -0
- package/src/cascade-blocking.ts +61 -0
- package/src/check-repository-updates.ts +143 -0
- package/src/cleanup-expired.ts +271 -0
- package/src/dependency-graph.ts +324 -0
- package/src/get-all-repository-sync-status.ts +115 -0
- package/src/get-repository-sync-status.ts +237 -0
- package/src/index.ts +53 -0
- package/src/plugin.ts +124 -0
- package/src/pull-ancestor-changes.ts +61 -0
- package/src/pull-batch.ts +410 -0
- package/src/pull-conflict-utils.ts +280 -0
- package/src/pull-repository.ts +701 -0
- package/src/pull.ts +204 -0
- package/src/push-branch.ts +61 -0
- package/src/push-repository.ts +1002 -0
- package/src/push.ts +104 -0
- package/src/query-cache-outbox.ts +866 -0
- package/src/sync-branches.ts +156 -0
- package/src/sync-listeners.ts +289 -0
- package/src/sync-manager.utils.ts +48 -0
- package/src/sync-repository.ts +302 -0
- package/src/topological-sort.ts +246 -0
- package/src/version.utils.ts +20 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Aiao Team
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,82 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @aiao/rxdb-plugin-sync
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> Implements: [US-025 核心插件化外移](https://github.com/aiao-io/rxdb/blob/main/requirements/stories/core/US-025-core-plugin-extraction.md)
|
|
4
|
+
|
|
5
|
+
推拉同步、冲突落地与仓库依赖序。装上它,`rxdb.syncManager` 才存在。
|
|
6
|
+
|
|
7
|
+
核心 `@aiao/rxdb` 保留的是**原语**:`RxDBSync` 水位表、变更编解码、冲突模型(`ConflictResolution` / `RxDBConflictError`)与同步资格判定。搬进本包的是**消费者**:整库与单仓库两个粒度的 push / pull / sync、冲突落地、依赖拓扑序、过期清理与 QueryCache 出站队列。
|
|
8
|
+
|
|
9
|
+
## 安装
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pnpm add @aiao/rxdb @aiao/rxdb-plugin-history @aiao/rxdb-plugin-sync
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
`@aiao/rxdb-plugin-history` 不是可选的:本包声明 `inject: ['plugin:history']`。
|
|
16
|
+
|
|
17
|
+
## 使用
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { RxDB, SyncType } from '@aiao/rxdb';
|
|
21
|
+
import { rxDBPluginHistory } from '@aiao/rxdb-plugin-history';
|
|
22
|
+
import { rxDBPluginSync } from '@aiao/rxdb-plugin-sync';
|
|
23
|
+
|
|
24
|
+
const rxdb = new RxDB({
|
|
25
|
+
dbName: 'notes',
|
|
26
|
+
entities: [Note],
|
|
27
|
+
sync: { type: SyncType.Full, local: { adapter: 'wa-sqlite' }, remote: { adapter: 'supabase' } }
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// 传工厂函数本身,不要调用它;两句 use() 的先后随意——宿主按 inject 拓扑排序
|
|
31
|
+
rxdb.use(rxDBPluginHistory).use(rxDBPluginSync).adapter('wa-sqlite' /* … */);
|
|
32
|
+
|
|
33
|
+
await rxdb.connect('wa-sqlite');
|
|
34
|
+
|
|
35
|
+
await rxdb.syncManager.sync();
|
|
36
|
+
await rxdb.syncManager.pushRepository('public', 'note');
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
`use()` 必须早于 `connect()`——`connect()` 内部就会调 `init()`。
|
|
40
|
+
|
|
41
|
+
`connect()` 返回之前本包的 `install()` 一定跑完,这一点比没有 `inject` 的插件更值得留意:声明了依赖的插件**不在** `init()` 里安装,它要等历史插件装好、状态转 `active`,宿主再对齐一趟才轮到它。`rxdb.init()` 之后紧接着读 `rxdb.syncManager` 会读到 `undefined`,那不是缺陷而是时序——`connect()` 是这条链的静止点。
|
|
42
|
+
|
|
43
|
+
## 主要能力
|
|
44
|
+
|
|
45
|
+
| 分组 | 入口 |
|
|
46
|
+
| -------- | --------------------------------------------------------------------------------------------- |
|
|
47
|
+
| 推拉 | `push()` / `pull()` / `sync()` / `pushRepository()` / `pullRepository()` / `syncRepository()` |
|
|
48
|
+
| 批量 | `bulkSync()` / `getRepositoryDependencyGraph()` / `getRepositorySyncOrder()` |
|
|
49
|
+
| 仓储状态 | `getRepositorySyncStatus()` / `getAllRepositorySyncStatus()` / `checkRepositoryUpdates()` |
|
|
50
|
+
| 分支 | `syncBranches()` |
|
|
51
|
+
| 计数 | `refreshPullableCount()` |
|
|
52
|
+
| 清理 | `cleanupExpired()` |
|
|
53
|
+
|
|
54
|
+
水位线是 `RxDBSync.lastPushedChangeId`,push 与 QueryCache 出站共用同一条——两者都在把本地变更送去远端,各记一条水位会让「已推到哪」在同一张表上有两个答案。
|
|
55
|
+
|
|
56
|
+
## 与历史插件的关系
|
|
57
|
+
|
|
58
|
+
单向:本包 `inject: ['plugin:history']`,历史包不认识本包。耦合只走一张窄接口(`SyncHistoryBridge`)——一次往返结束时 undo 边界要作废、待拉计数要结算,而那些状态的主人在历史侧。
|
|
59
|
+
|
|
60
|
+
两件事的生命周期本就不同,所以它们各自成包:撤销重做要在第一条 `rxdb_change` 之前就位(历史插件因此**不**声明任何 `inject`),推拉同步则只在配了远端时才有意义。
|
|
61
|
+
|
|
62
|
+
## 与 QueryCache 插件的关系
|
|
63
|
+
|
|
64
|
+
只有 `import type { QueryCacheRemoteAdapter }`,**不产生** `inject` 运行期依赖。装了本包、没装 `@aiao/rxdb-plugin-querycache` 且没有 QueryCache 实体的工作区照常运行。
|
|
65
|
+
|
|
66
|
+
## 没装插件时
|
|
67
|
+
|
|
68
|
+
`rxdb.syncManager` **不存在**(读到 `undefined`),核心不给一个什么都不做的空壳。
|
|
69
|
+
|
|
70
|
+
只装了本包、忘了装历史插件时,本包停在 `waiting` 永远装不上——依赖来源尘埃落定后宿主会点名一次:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
[RxDB] Plugin 'sync' is not installed: unsatisfied dependencies [plugin:history]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
`syncState` 面板上的待拉数由本包维护:远端适配器在实时订阅恢复后发 `syncState.requestPullableRefresh()`,本包接住它并调 `refreshPullableCount()`。没装本包,那个读数就是无人维护——这正是实情,不是零。
|
|
77
|
+
|
|
78
|
+
## 连接纪元
|
|
79
|
+
|
|
80
|
+
插件声明 `lifecycle: 'scoped'`,三处宿主改动全部登记在 `install(scope)` 收到的作用域上,`disconnectAll()` 时逆序释放,宿主不调用 `destroy()`:`SyncManager` 实例本身(`destroy()` 随它撤掉 `connected$` 自动回推订阅与远端事件监听)、`rxdb.syncManager` 槽位、`syncState.bindPullableRefresh()` 跳板。释放走逆拓扑序,本包先于历史插件撤销。
|
|
81
|
+
|
|
82
|
+
重新 `connect()` 装的是一个全新的管理器,而不是复活上一纪元那个——后者指向的事件总线已经拆了。
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
import { PullOptions, PullResult, PushOptions, PushResult, RxDB, SyncResult } from '@aiao/rxdb';
|
|
2
|
+
import { PushInFlightRegistry, SyncHistoryBridge } from '@aiao/rxdb-plugin-history';
|
|
3
|
+
import { BulkSyncOptions, BulkSyncResult } from './bulk-sync.js';
|
|
4
|
+
import { CheckRepositoryUpdatesResult } from './check-repository-updates.js';
|
|
5
|
+
import { CleanupExpiredOptions, CleanupExpiredResult } from './cleanup-expired.js';
|
|
6
|
+
import { DependencyGraph, RepositoryIdentifier } from './dependency-graph.js';
|
|
7
|
+
import { GetAllRepositorySyncStatusFilter } from './get-all-repository-sync-status.js';
|
|
8
|
+
import { RepositorySyncStatus } from './get-repository-sync-status.js';
|
|
9
|
+
import { PullRepositoryOptions, PullRepositoryResult } from './pull-repository.js';
|
|
10
|
+
import { PushRepositoryOptions, PushRepositoryResult } from './push-repository.js';
|
|
11
|
+
import { SyncBranchesResult } from './sync-branches.js';
|
|
12
|
+
import { SyncRepositoryOptions, SyncRepositoryResult } from './sync-repository.js';
|
|
13
|
+
import { SortDirection } from './topological-sort.js';
|
|
14
|
+
/**
|
|
15
|
+
* 同步管理器
|
|
16
|
+
*
|
|
17
|
+
* 负责整库与单仓库两个粒度的推拉同步:
|
|
18
|
+
* - `pull` / `push` / `sync`:整库
|
|
19
|
+
* - `pullRepository` / `pushRepository` / `syncRepository` / `bulkSync`:按仓库
|
|
20
|
+
* - `getRepositorySyncStatus` / `checkRepositoryUpdates` / `cleanupExpired`:状态与清理
|
|
21
|
+
* - `getRepositoryDependencyGraph` / `getRepositorySyncOrder`:依赖图与同步顺序
|
|
22
|
+
*
|
|
23
|
+
* @remarks
|
|
24
|
+
* US-025 阶段 D 之前这些入口挂在 `@aiao/rxdb-plugin-history` 的 `VersionManager` 上。
|
|
25
|
+
* 切开的理由是两件事的生命周期本就不同:撤销重做要在第一条 `rxdb_change` 之前就位,
|
|
26
|
+
* 推拉同步则只在配了远端时才有意义。
|
|
27
|
+
*
|
|
28
|
+
* 切开之后仍有一条**单向**耦合:一次同步往返结束时 undo 边界要作废、待拉计数要结算,
|
|
29
|
+
* 而那些状态的主人是历史侧。它经 {@link SyncHistoryBridge} 这一张窄接口相遇 ——
|
|
30
|
+
* 本插件 `inject: ['plugin:history']`,历史插件则对本包一无所知。
|
|
31
|
+
*/
|
|
32
|
+
export declare class SyncManager {
|
|
33
|
+
#private;
|
|
34
|
+
readonly rxdb: RxDB;
|
|
35
|
+
readonly history: SyncHistoryBridge;
|
|
36
|
+
/**
|
|
37
|
+
* 「哪些变更此刻正在飞往远端」的登记处。
|
|
38
|
+
*
|
|
39
|
+
* @remarks
|
|
40
|
+
* push 与 undo 唯一的会合点,实例的主人在历史侧(`rxdb.versionManager.pushInFlight`)。
|
|
41
|
+
* 两边读的必须是同一个,见 `PushInFlightRegistry`:push 在远端往返之前认领区间,
|
|
42
|
+
* undo 把认领区间当成已推 —— 各持一份,往返窗口内的一次撤销就会造成永久分叉。
|
|
43
|
+
*
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
get pushInFlight(): PushInFlightRegistry;
|
|
47
|
+
/**
|
|
48
|
+
* @param rxdb - 宿主实例
|
|
49
|
+
* @param history - 历史侧借来的那一小块面,由 `rxdb.versionManager.syncBridge` 提供
|
|
50
|
+
*/
|
|
51
|
+
constructor(rxdb: RxDB, history: SyncHistoryBridge);
|
|
52
|
+
/** 装上 connected$ 自动回推与远端事件计数两条链路 */
|
|
53
|
+
init(): void;
|
|
54
|
+
/** 拆掉 {@link init} 装上的全部监听与订阅 */
|
|
55
|
+
destroy(): void;
|
|
56
|
+
/** 取本地适配器上的系统表仓库 */
|
|
57
|
+
getLocalRepositories(): Promise<{
|
|
58
|
+
branchRepository: import('@aiao/rxdb').LocalRxDBBranchRepository;
|
|
59
|
+
changeRepository: import('@aiao/rxdb').LocalRxDBChangeRepository;
|
|
60
|
+
adapter: import('@aiao/rxdb').IRxDBAdapter & import('@aiao/rxdb').RxDBAdapterLocalBase;
|
|
61
|
+
}>;
|
|
62
|
+
/** 取远端适配器上的系统表仓库 */
|
|
63
|
+
getRemoteRepositories(): Promise<{
|
|
64
|
+
branchRepository: import('@aiao/rxdb').RemoteRxDBBranchRepository;
|
|
65
|
+
changeRepository: import('@aiao/rxdb').RemoteRxDBChangeRepository;
|
|
66
|
+
adapter: import('@aiao/rxdb').IRxDBAdapter & import('@aiao/rxdb').RxDBAdapterRemoteBase;
|
|
67
|
+
}>;
|
|
68
|
+
/**
|
|
69
|
+
* 取当前分支;没有激活分支时激活(或新建)`main`。
|
|
70
|
+
*
|
|
71
|
+
* @remarks
|
|
72
|
+
* 同步链路里每条远端事件都要调它(`sync-listeners` 的 `filterByBranch`),
|
|
73
|
+
* 热路径不开事务,见 `getCurrentBranch`。
|
|
74
|
+
*/
|
|
75
|
+
getCurrentBranch(): Promise<import('@aiao/rxdb').RxDBBranch>;
|
|
76
|
+
/**
|
|
77
|
+
* 从远程同步所有分支信息到本地
|
|
78
|
+
*
|
|
79
|
+
* 远程新分支 → 在本地创建(local: false, remote: true)
|
|
80
|
+
* 本地已有的远程分支 → 更新 remote 标记为 true
|
|
81
|
+
* 纯本地分支 → 不受影响
|
|
82
|
+
*
|
|
83
|
+
* @returns 同步结果
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* const result = await rxdb.syncManager.syncBranches();
|
|
88
|
+
* console.log(`新增 ${result.created},更新 ${result.updated}`);
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
syncBranches(): Promise<SyncBranchesResult>;
|
|
92
|
+
/**
|
|
93
|
+
* 从远程拉取变更并应用到本地数据库
|
|
94
|
+
*
|
|
95
|
+
* 当 autoSync=false 时,会先应用 Realtime 缓存的变更,再拉取远程变更。
|
|
96
|
+
*
|
|
97
|
+
* @param options - 可选配置
|
|
98
|
+
* @returns 拉取结果
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```typescript
|
|
102
|
+
* // 基本用法
|
|
103
|
+
* const result = await rxdb.syncManager.pull();
|
|
104
|
+
* console.log(`Pulled ${result.pulled} changes`);
|
|
105
|
+
*
|
|
106
|
+
* // 拉取所有数据
|
|
107
|
+
* const result = await rxdb.syncManager.pull({ fetchAll: true });
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
pull(options?: PullOptions): Promise<PullResult>;
|
|
111
|
+
/**
|
|
112
|
+
* 将本地未同步的变更推送到远程数据库
|
|
113
|
+
*
|
|
114
|
+
* 推送时会自动:
|
|
115
|
+
* 1. 查询 lastPushedChangeId 之后的新变更
|
|
116
|
+
* 2. 过滤已撤销的变更(revertChangeId != null)
|
|
117
|
+
* 3. 压缩变更(INSERT→DELETE 丢弃,INSERT→UPDATE* 合并为 INSERT)
|
|
118
|
+
* 4. 批量推送到远程
|
|
119
|
+
* 5. 更新 lastPushedChangeId 和 lastPushedAt
|
|
120
|
+
*
|
|
121
|
+
* @param options - 可选配置
|
|
122
|
+
* @returns 推送结果
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* // 基本用法
|
|
127
|
+
* const result = await rxdb.syncManager.push();
|
|
128
|
+
* console.log(`Pushed ${result.pushed} changes`);
|
|
129
|
+
*
|
|
130
|
+
* // 自定义批量大小
|
|
131
|
+
* const result = await rxdb.syncManager.push({ batchSize: 500 });
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
push(options?: PushOptions): Promise<PushResult>;
|
|
135
|
+
/**
|
|
136
|
+
* 执行完整的同步操作(先 pull 再 push)
|
|
137
|
+
*
|
|
138
|
+
* 推荐在重连后使用此方法,确保:
|
|
139
|
+
* 1. 先获取远程最新变更(避免覆盖他人数据)
|
|
140
|
+
* 2. 再推送本地变更
|
|
141
|
+
*
|
|
142
|
+
* @param options - 可选配置
|
|
143
|
+
* @returns 同步结果(包含 pull 和 push 结果)
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```typescript
|
|
147
|
+
* // 基本用法
|
|
148
|
+
* const result = await rxdb.syncManager.sync();
|
|
149
|
+
* console.log(`Pulled ${result.pullResult.pulled}, Pushed ${result.pushResult.pushed}`);
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
sync(options?: {
|
|
153
|
+
pull?: PullOptions;
|
|
154
|
+
push?: PushOptions;
|
|
155
|
+
}): Promise<SyncResult>;
|
|
156
|
+
/**
|
|
157
|
+
* 拉取指定 Repository 的远程变更
|
|
158
|
+
*
|
|
159
|
+
* 提供实体类型级别的精细同步控制,支持级联同步以自动拉取关联实体。
|
|
160
|
+
*
|
|
161
|
+
* @param namespace - 实体命名空间(如 "public")
|
|
162
|
+
* @param entity - 实体名称(如 "Todo")
|
|
163
|
+
* @param options - 拉取选项
|
|
164
|
+
* @returns 拉取结果
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```typescript
|
|
168
|
+
* // 拉取 Todo 并级联拉取依赖
|
|
169
|
+
* const result = await rxdb.syncManager.pullRepository('public', 'Todo', {
|
|
170
|
+
* includeRelated: true // 默认:若 Todo 有外键则自动拉取 User
|
|
171
|
+
* });
|
|
172
|
+
*
|
|
173
|
+
* // 不级联拉取
|
|
174
|
+
* const result = await rxdb.syncManager.pullRepository('public', 'Todo', {
|
|
175
|
+
* includeRelated: false // 仅拉取 Todo,可能引发外键错误
|
|
176
|
+
* });
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
pullRepository(namespace: string, entity: string, options?: PullRepositoryOptions): Promise<PullRepositoryResult>;
|
|
180
|
+
/**
|
|
181
|
+
* 推送指定 Repository 的本地变更
|
|
182
|
+
*
|
|
183
|
+
* 提供实体类型级别的精细同步控制,支持级联同步以自动推送依赖实体。
|
|
184
|
+
*
|
|
185
|
+
* @param namespace - 实体命名空间(如 "public")
|
|
186
|
+
* @param entity - 实体名称(如 "User")
|
|
187
|
+
* @param options - 推送选项
|
|
188
|
+
* @returns 推送结果
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* ```typescript
|
|
192
|
+
* // 推送 User 并级联推送依赖方
|
|
193
|
+
* const result = await rxdb.syncManager.pushRepository('public', 'User', {
|
|
194
|
+
* includeRelated: true // 默认:若 Post 引用 User 则自动推送 Post
|
|
195
|
+
* });
|
|
196
|
+
*
|
|
197
|
+
* // 不级联推送
|
|
198
|
+
* const result = await rxdb.syncManager.pushRepository('public', 'User', {
|
|
199
|
+
* includeRelated: false // 仅推送 User,依赖数据可能不完整
|
|
200
|
+
* });
|
|
201
|
+
* ```
|
|
202
|
+
*/
|
|
203
|
+
pushRepository(namespace: string, entity: string, options?: PushRepositoryOptions): Promise<PushRepositoryResult>;
|
|
204
|
+
/**
|
|
205
|
+
* 同步指定 Repository(先 pull 再 push)
|
|
206
|
+
*
|
|
207
|
+
* 将单个 Repository 的 pull 和 push 合并为一次操作,保证正确的执行顺序。
|
|
208
|
+
* 推荐在需要确保特定实体类型数据一致性时使用。
|
|
209
|
+
*
|
|
210
|
+
* @param namespace - 实体命名空间(如 "public")
|
|
211
|
+
* @param entity - 实体名称(如 "Todo")
|
|
212
|
+
* @param options - 同步选项(分别配置 pull 和 push)
|
|
213
|
+
* @returns 同步结果(包含 pull 和 push 结果)
|
|
214
|
+
*
|
|
215
|
+
* @example
|
|
216
|
+
* ```typescript
|
|
217
|
+
* // 基本用法
|
|
218
|
+
* const result = await rxdb.syncManager.syncRepository('public', 'Todo');
|
|
219
|
+
* console.log(`Pulled ${result.pullResult.pulled}, Pushed ${result.pushResult.pushed}`);
|
|
220
|
+
*
|
|
221
|
+
* // 自定义 pull 和 push 选项
|
|
222
|
+
* const result = await rxdb.syncManager.syncRepository('public', 'Todo', {
|
|
223
|
+
* pull: { limit: 500, fetchAll: true },
|
|
224
|
+
* push: { batchSize: 100 }
|
|
225
|
+
* });
|
|
226
|
+
* ```
|
|
227
|
+
*/
|
|
228
|
+
syncRepository(namespace: string, entity: string, options?: SyncRepositoryOptions): Promise<SyncRepositoryResult>;
|
|
229
|
+
/**
|
|
230
|
+
* 清理不再满足过滤条件的本地过期数据
|
|
231
|
+
*
|
|
232
|
+
* 用于 SyncType.Filter 场景,删除不满足 filter 条件的本地数据
|
|
233
|
+
* 例如:清理超过 30 天的订单数据
|
|
234
|
+
*
|
|
235
|
+
* @param namespace - 实体命名空间
|
|
236
|
+
* @param entity - 实体名称
|
|
237
|
+
* @param options - 清理选项
|
|
238
|
+
* @returns 清理结果
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* ```ts
|
|
242
|
+
* const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);
|
|
243
|
+
* const { removed } = await rxdb.syncManager.cleanupExpired('public', 'Order', {
|
|
244
|
+
* filter: {
|
|
245
|
+
* combinator: 'and',
|
|
246
|
+
* rules: [{ field: 'updatedAt', operator: '>=', value: thirtyDaysAgo }]
|
|
247
|
+
* }
|
|
248
|
+
* });
|
|
249
|
+
* console.log(`Removed ${removed} expired records`);
|
|
250
|
+
* ```
|
|
251
|
+
*/
|
|
252
|
+
cleanupExpired(namespace: string, entity: string, options?: CleanupExpiredOptions): Promise<CleanupExpiredResult>;
|
|
253
|
+
/**
|
|
254
|
+
* 检查远程是否有更新,不下载数据
|
|
255
|
+
*
|
|
256
|
+
* 仅查询远程有多少新变更,不实际拉取数据。
|
|
257
|
+
* 适用于显示「有 N 条远程更新」提示,节省带宽和时间。
|
|
258
|
+
*
|
|
259
|
+
* @param namespace - 实体命名空间(如 "public")
|
|
260
|
+
* @param entity - 实体名称(如 "Todo")
|
|
261
|
+
* @returns 更新检查结果
|
|
262
|
+
*
|
|
263
|
+
* @example
|
|
264
|
+
* ```typescript
|
|
265
|
+
* // 检查 Todo 是否有远程更新
|
|
266
|
+
* const result = await rxdb.syncManager.checkRepositoryUpdates('public', 'Todo');
|
|
267
|
+
* if (result.hasUpdates) {
|
|
268
|
+
* console.log(`有 ${result.pendingCount} 条更新可拉取`);
|
|
269
|
+
* // 用户点击「更新」按钮后再调用 pullRepository()
|
|
270
|
+
* }
|
|
271
|
+
* ```
|
|
272
|
+
*/
|
|
273
|
+
checkRepositoryUpdates(namespace: string, entity: string): Promise<CheckRepositoryUpdatesResult>;
|
|
274
|
+
/**
|
|
275
|
+
* 获取单个 Repository 的同步状态
|
|
276
|
+
*
|
|
277
|
+
* 返回完整的同步状态信息,包括:
|
|
278
|
+
* - syncType(full/remote/local/disabled)
|
|
279
|
+
* - pushableCount(待推送的本地变更数)
|
|
280
|
+
* - pullableCount(可拉取的远程变更数)
|
|
281
|
+
* - 最近同步时间戳
|
|
282
|
+
*
|
|
283
|
+
* @param namespace - 实体命名空间(如 "public")
|
|
284
|
+
* @param entity - 实体名称(如 "Todo")
|
|
285
|
+
* @returns Repository 同步状态
|
|
286
|
+
*
|
|
287
|
+
* @example
|
|
288
|
+
* ```typescript
|
|
289
|
+
* const status = await rxdb.syncManager.getRepositorySyncStatus('public', 'Todo');
|
|
290
|
+
* console.log(`同步类型: ${status.syncType}`);
|
|
291
|
+
* console.log(`待推送: ${status.pushableCount},可拉取: ${status.pullableCount}`);
|
|
292
|
+
* ```
|
|
293
|
+
*/
|
|
294
|
+
getRepositorySyncStatus(namespace: string, entity: string): Promise<RepositorySyncStatus>;
|
|
295
|
+
/**
|
|
296
|
+
* 获取所有 Repository 的同步状态
|
|
297
|
+
*
|
|
298
|
+
* 返回所有已注册实体的状态,支持可选过滤。
|
|
299
|
+
*
|
|
300
|
+
* @param filter - 可选过滤条件
|
|
301
|
+
* @returns Repository 同步状态数组
|
|
302
|
+
*
|
|
303
|
+
* @example
|
|
304
|
+
* ```typescript
|
|
305
|
+
* // 获取全部状态
|
|
306
|
+
* const statuses = await rxdb.syncManager.getAllRepositorySyncStatus();
|
|
307
|
+
*
|
|
308
|
+
* // 仅获取有待处理变更的 Repository
|
|
309
|
+
* const pending = await rxdb.syncManager.getAllRepositorySyncStatus({
|
|
310
|
+
* hasPendingChanges: true
|
|
311
|
+
* });
|
|
312
|
+
*
|
|
313
|
+
* // 仅获取已启用的全量同步 Repository
|
|
314
|
+
* const fullSync = await rxdb.syncManager.getAllRepositorySyncStatus({
|
|
315
|
+
* syncType: ['full'],
|
|
316
|
+
* enabled: true
|
|
317
|
+
* });
|
|
318
|
+
* ```
|
|
319
|
+
*/
|
|
320
|
+
getAllRepositorySyncStatus(filter?: GetAllRepositorySyncStatusFilter): Promise<RepositorySyncStatus[]>;
|
|
321
|
+
/**
|
|
322
|
+
* 按各仓库持久化的远端水位线重新计算待拉变更数
|
|
323
|
+
*
|
|
324
|
+
* @returns 当前远端待拉变更总数
|
|
325
|
+
*
|
|
326
|
+
* @remarks
|
|
327
|
+
* 远程适配器在实时订阅恢复后调用。若刷新期间又收到实时事件,保留两者中的较大值,
|
|
328
|
+
* 避免把查询快照之后到达的通知覆盖掉。
|
|
329
|
+
*/
|
|
330
|
+
refreshPullableCount(): Promise<number>;
|
|
331
|
+
/**
|
|
332
|
+
* 批量同步多个 Repository
|
|
333
|
+
*
|
|
334
|
+
* 在单次操作中同步多个 Repository,支持顺序或并发执行。
|
|
335
|
+
*
|
|
336
|
+
* @param options - 批量同步选项
|
|
337
|
+
* @returns 批量同步结果(包含成功/失败计数)
|
|
338
|
+
*
|
|
339
|
+
* @example
|
|
340
|
+
* ```typescript
|
|
341
|
+
* // 顺序同步所有已启用的 Repository
|
|
342
|
+
* const result = await rxdb.syncManager.bulkSync();
|
|
343
|
+
* console.log(`成功: ${result.succeeded},失败: ${result.failed}`);
|
|
344
|
+
*
|
|
345
|
+
* // 同步指定 Repository
|
|
346
|
+
* const result = await rxdb.syncManager.bulkSync({
|
|
347
|
+
* repositories: [
|
|
348
|
+
* { namespace: 'public', entity: 'Todo' },
|
|
349
|
+
* { namespace: 'public', entity: 'User' }
|
|
350
|
+
* ]
|
|
351
|
+
* });
|
|
352
|
+
*
|
|
353
|
+
* // 并发模式仅 pull
|
|
354
|
+
* const result = await rxdb.syncManager.bulkSync({
|
|
355
|
+
* concurrent: true,
|
|
356
|
+
* concurrency: 3,
|
|
357
|
+
* push: false
|
|
358
|
+
* });
|
|
359
|
+
*
|
|
360
|
+
* // 检查每项结果
|
|
361
|
+
* for (const item of result.results) {
|
|
362
|
+
* if (item.success) {
|
|
363
|
+
* console.log(`${item.repository.entity}: 已拉取 ${item.result?.pullResult.pulled ?? 0} 条`);
|
|
364
|
+
* } else {
|
|
365
|
+
* console.error(`${item.repository.entity}: ${item.error.message}`);
|
|
366
|
+
* }
|
|
367
|
+
* }
|
|
368
|
+
* ```
|
|
369
|
+
*/
|
|
370
|
+
bulkSync(options?: BulkSyncOptions): Promise<BulkSyncResult>;
|
|
371
|
+
/**
|
|
372
|
+
* 获取所有 Repository 的依赖图
|
|
373
|
+
*
|
|
374
|
+
* 分析实体关系(MANY_TO_ONE、ONE_TO_ONE)以构建依赖图,
|
|
375
|
+
* 展示各 Repository 之间的依赖关系。
|
|
376
|
+
*
|
|
377
|
+
* @returns 包含依赖关系的依赖图
|
|
378
|
+
*
|
|
379
|
+
* @example
|
|
380
|
+
* ```typescript
|
|
381
|
+
* const graph = rxdb.syncManager.getRepositoryDependencyGraph();
|
|
382
|
+
*
|
|
383
|
+
* // 遍历依赖关系
|
|
384
|
+
* for (const [key, dep] of graph) {
|
|
385
|
+
* console.log(`${key} 依赖:`, dep.dependsOn);
|
|
386
|
+
* console.log(`${key} 被依赖:`, dep.requiredBy);
|
|
387
|
+
* }
|
|
388
|
+
* ```
|
|
389
|
+
*/
|
|
390
|
+
getRepositoryDependencyGraph(): DependencyGraph;
|
|
391
|
+
/**
|
|
392
|
+
* 根据依赖关系获取 Repository 的同步顺序
|
|
393
|
+
*
|
|
394
|
+
* 通过拓扑排序确定基于依赖关系的正确同步顺序。
|
|
395
|
+
*
|
|
396
|
+
* @param direction - 排序方向:'pull'(父节点优先)或 'push'(子节点优先)
|
|
397
|
+
* @returns 有序的 Repository 列表
|
|
398
|
+
*
|
|
399
|
+
* @example
|
|
400
|
+
* ```typescript
|
|
401
|
+
* // 获取 pull 顺序(父节点优先)
|
|
402
|
+
* const pullOrder = rxdb.syncManager.getRepositorySyncOrder('pull');
|
|
403
|
+
* // [User, Todo, Comment]
|
|
404
|
+
*
|
|
405
|
+
* // 获取 push 顺序(子节点优先)
|
|
406
|
+
* const pushOrder = rxdb.syncManager.getRepositorySyncOrder('push');
|
|
407
|
+
* // [Comment, Todo, User]
|
|
408
|
+
* ```
|
|
409
|
+
*/
|
|
410
|
+
getRepositorySyncOrder(direction: SortDirection): RepositoryIdentifier[];
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=SyncManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncManager.d.ts","sourceRoot":"","sources":["../src/SyncManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { IRepository, RxDBChange } from '@aiao/rxdb';
|
|
2
|
+
/** 本模块只依赖 change 仓库的 `find`,用最小接口收窄,便于在事务 executor 上复用。 */
|
|
3
|
+
type ChangeFinder = Pick<IRepository<typeof RxDBChange>, 'find'>;
|
|
4
|
+
/**
|
|
5
|
+
* 本地分叉点 → 远端 change id。
|
|
6
|
+
*
|
|
7
|
+
* @param repository - 本地 `RxDBChange` 仓库
|
|
8
|
+
* @param localFromChangeId - 本地分支的 `fromChangeId`
|
|
9
|
+
* @returns 远端 id;分叉点尚未推送(`remoteId` 为空)时返回 `null`
|
|
10
|
+
* @throws RxDBError 本地压根不存在这条变更 —— 这是分支表与变更表已经不一致,不能猜
|
|
11
|
+
*
|
|
12
|
+
* @remarks
|
|
13
|
+
* 返回 `null` 表示「远端此刻确实不知道这个分叉点」,而不是「分叉点在根」。调用方要据此
|
|
14
|
+
* 决定是否在实体变更推送完成后重推一次分支,见 {@link pushBranch}。
|
|
15
|
+
*/
|
|
16
|
+
export declare const toRemoteFromChangeId: (repository: ChangeFinder, localFromChangeId: number) => Promise<number | null>;
|
|
17
|
+
/**
|
|
18
|
+
* 远端分叉点 → 本地 change id。
|
|
19
|
+
*
|
|
20
|
+
* @param repository - 本地 `RxDBChange` 仓库(事务内请传 executor 作用域的那一份)
|
|
21
|
+
* @param remoteFromChangeId - 远端分支行上的 `fromChangeId`
|
|
22
|
+
* @returns 本地 id;对应的变更尚未拉到本地时返回 `null`
|
|
23
|
+
*
|
|
24
|
+
* @remarks
|
|
25
|
+
* 返回 `null` 时**不可**退化成 `null`/`0` 写进本地分支行:`find-switch-branch-step` 会把它
|
|
26
|
+
* 当「分叉于根」处理,切换分支时应用的区间从第一条变更起算。调用方应跳过该分支,
|
|
27
|
+
* 等分叉点变更拉到本地后的下一轮再建。
|
|
28
|
+
*/
|
|
29
|
+
export declare const toLocalFromChangeId: (repository: ChangeFinder, remoteFromChangeId: number) => Promise<number | null>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=branch-change-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-change-id.d.ts","sourceRoot":"","sources":["../src/branch-change-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,WAAW,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AACrE,2DAA2D;AAC3D,KAAK,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;AAcjE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,GAC/B,YAAY,YAAY,EACxB,mBAAmB,MAAM,KACxB,OAAO,CAAC,MAAM,GAAG,IAAI,CAMvB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,GAC9B,YAAY,YAAY,EACxB,oBAAoB,MAAM,KACzB,OAAO,CAAC,MAAM,GAAG,IAAI,CAGvB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { SyncManager } from './SyncManager.js';
|
|
2
|
+
/**
|
|
3
|
+
* 获取当前分支及其所有祖先分支的 ID 列表
|
|
4
|
+
*
|
|
5
|
+
* @returns [currentBranch, parent, grandparent, ...] 例如 ['dev', 'main']
|
|
6
|
+
*/
|
|
7
|
+
export declare function getAncestorBranchIds(sm: SyncManager, branchId: string): Promise<string[]>;
|
|
8
|
+
//# sourceMappingURL=branch-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-utils.d.ts","sourceRoot":"","sources":["../src/branch-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4B/F"}
|