@aiao/rxdb-plugin-sync 0.0.0-stage → 0.0.28

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.
Files changed (88) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -2
  3. package/dist/SyncManager.d.ts +426 -0
  4. package/dist/SyncManager.d.ts.map +1 -0
  5. package/dist/branch-change-id.d.ts +31 -0
  6. package/dist/branch-change-id.d.ts.map +1 -0
  7. package/dist/branch-materialization-source.d.ts +22 -0
  8. package/dist/branch-materialization-source.d.ts.map +1 -0
  9. package/dist/branch-utils.d.ts +40 -0
  10. package/dist/branch-utils.d.ts.map +1 -0
  11. package/dist/bulk-sync.d.ts +117 -0
  12. package/dist/bulk-sync.d.ts.map +1 -0
  13. package/dist/cascade-blocking.d.ts +38 -0
  14. package/dist/cascade-blocking.d.ts.map +1 -0
  15. package/dist/check-repository-updates.d.ts +47 -0
  16. package/dist/check-repository-updates.d.ts.map +1 -0
  17. package/dist/cleanup-expired.d.ts +56 -0
  18. package/dist/cleanup-expired.d.ts.map +1 -0
  19. package/dist/dependency-graph.d.ts +128 -0
  20. package/dist/dependency-graph.d.ts.map +1 -0
  21. package/dist/get-all-repository-sync-status.d.ts +58 -0
  22. package/dist/get-all-repository-sync-status.d.ts.map +1 -0
  23. package/dist/get-repository-sync-status.d.ts +68 -0
  24. package/dist/get-repository-sync-status.d.ts.map +1 -0
  25. package/dist/index.d.ts +39 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +3773 -0
  28. package/dist/plugin.d.ts +74 -0
  29. package/dist/plugin.d.ts.map +1 -0
  30. package/dist/pull-ancestor-changes.d.ts +41 -0
  31. package/dist/pull-ancestor-changes.d.ts.map +1 -0
  32. package/dist/pull-batch.d.ts +16 -0
  33. package/dist/pull-batch.d.ts.map +1 -0
  34. package/dist/pull-conflict-utils.d.ts +43 -0
  35. package/dist/pull-conflict-utils.d.ts.map +1 -0
  36. package/dist/pull-repository.d.ts +55 -0
  37. package/dist/pull-repository.d.ts.map +1 -0
  38. package/dist/pull-round.d.ts +41 -0
  39. package/dist/pull-round.d.ts.map +1 -0
  40. package/dist/pull.d.ts +16 -0
  41. package/dist/pull.d.ts.map +1 -0
  42. package/dist/push-branch.d.ts +22 -0
  43. package/dist/push-branch.d.ts.map +1 -0
  44. package/dist/push-repository.d.ts +79 -0
  45. package/dist/push-repository.d.ts.map +1 -0
  46. package/dist/push.d.ts +14 -0
  47. package/dist/push.d.ts.map +1 -0
  48. package/dist/query-cache-outbox.d.ts +120 -0
  49. package/dist/query-cache-outbox.d.ts.map +1 -0
  50. package/dist/sync-branches.d.ts +81 -0
  51. package/dist/sync-branches.d.ts.map +1 -0
  52. package/dist/sync-listeners.d.ts +20 -0
  53. package/dist/sync-listeners.d.ts.map +1 -0
  54. package/dist/sync-manager.utils.d.ts +36 -0
  55. package/dist/sync-manager.utils.d.ts.map +1 -0
  56. package/dist/sync-repository.d.ts +64 -0
  57. package/dist/sync-repository.d.ts.map +1 -0
  58. package/dist/topological-sort.d.ts +126 -0
  59. package/dist/topological-sort.d.ts.map +1 -0
  60. package/package.json +60 -3
  61. package/src/SyncManager.ts +690 -0
  62. package/src/branch-change-id.ts +70 -0
  63. package/src/branch-materialization-source.ts +445 -0
  64. package/src/branch-utils.ts +74 -0
  65. package/src/bulk-sync.ts +349 -0
  66. package/src/cascade-blocking.ts +61 -0
  67. package/src/check-repository-updates.ts +143 -0
  68. package/src/cleanup-expired.ts +285 -0
  69. package/src/dependency-graph.ts +324 -0
  70. package/src/get-all-repository-sync-status.ts +115 -0
  71. package/src/get-repository-sync-status.ts +237 -0
  72. package/src/index.ts +58 -0
  73. package/src/plugin.ts +132 -0
  74. package/src/pull-ancestor-changes.ts +61 -0
  75. package/src/pull-batch.ts +386 -0
  76. package/src/pull-conflict-utils.ts +284 -0
  77. package/src/pull-repository.ts +700 -0
  78. package/src/pull-round.ts +103 -0
  79. package/src/pull.ts +204 -0
  80. package/src/push-branch.ts +62 -0
  81. package/src/push-repository.ts +1541 -0
  82. package/src/push.ts +106 -0
  83. package/src/query-cache-outbox.ts +939 -0
  84. package/src/sync-branches.ts +276 -0
  85. package/src/sync-listeners.ts +309 -0
  86. package/src/sync-manager.utils.ts +48 -0
  87. package/src/sync-repository.ts +307 -0
  88. package/src/topological-sort.ts +246 -0
@@ -0,0 +1,117 @@
1
+ import { RxDB } from '@aiao/rxdb';
2
+ import { RepositoryIdentifier } from './dependency-graph.js';
3
+ import { PullRepositoryOptions } from './pull-repository.js';
4
+ import { PushRepositoryOptions } from './push-repository.js';
5
+ import { SyncRepositoryResult } from './sync-repository.js';
6
+ /**
7
+ * 批量同步选项
8
+ */
9
+ export interface BulkSyncOptions {
10
+ /**
11
+ * 同步操作类型
12
+ * @default 'sync'
13
+ */
14
+ operation?: 'pull' | 'push' | 'sync';
15
+ /**
16
+ * 目标仓库列表
17
+ * 如果为空,则同步所有启用的仓库
18
+ */
19
+ repositories?: RepositoryIdentifier[];
20
+ /**
21
+ * 拉取选项(应用于所有仓库)
22
+ */
23
+ pull?: PullRepositoryOptions;
24
+ /**
25
+ * 推送选项(应用于所有仓库)
26
+ */
27
+ push?: PushRepositoryOptions;
28
+ /**
29
+ * 是否并发执行
30
+ * @default false
31
+ */
32
+ concurrent?: boolean;
33
+ /**
34
+ * 并发限制(只有 concurrent=true 时生效)
35
+ * @default 3
36
+ */
37
+ concurrency?: number;
38
+ }
39
+ /**
40
+ * 批量同步结果
41
+ */
42
+ export interface BulkSyncResult {
43
+ /**
44
+ * 成功的仓库数量
45
+ */
46
+ succeeded: number;
47
+ /**
48
+ * 失败的仓库数量
49
+ */
50
+ failed: number;
51
+ /**
52
+ * 每个仓库的详细结果
53
+ */
54
+ results: Array<{
55
+ repository: RepositoryIdentifier;
56
+ success: boolean;
57
+ result?: SyncRepositoryResult;
58
+ error?: Error;
59
+ }>;
60
+ /**
61
+ * 总耗时(毫秒)
62
+ */
63
+ durationMs: number;
64
+ }
65
+ /**
66
+ * 获取需要同步的仓库列表
67
+ *
68
+ * 如果 options.repositories 有值则使用该值;否则从 rxdb.config.entities 中挑出**真正能同步**的仓库。
69
+ *
70
+ * @param rxdb - RxDB 实例
71
+ * @param options - 批量同步选项
72
+ * @returns 需要同步的仓库列表
73
+ *
74
+ * @remarks
75
+ * 这里是枚举路径,资格不足一律**跳过**(单仓入口才抛错)。两条过滤:
76
+ * - 能力矩阵:两个方向都不可同步的(`none` / `local`)没有理由进队列。此前只跳
77
+ * `none`,`local` 会一路走到 `syncRepository` 才被 `shouldPull` / `shouldPush`
78
+ * 双双判负,凭空多出一条「同步了 0 条」的结果。
79
+ * - `RxDBSync.enabled`:被用户关掉的仓库跳过。留着它只会在 `pullRepository` /
80
+ * `pushRepository` 里抛错,把「我关的」变成一条同步失败。
81
+ *
82
+ * @internal
83
+ */
84
+ export declare function getRepositoriesToSync(rxdb: RxDB, options: BulkSyncOptions): Promise<RepositoryIdentifier[]>;
85
+ /**
86
+ * 对多个仓库执行批量同步
87
+ *
88
+ * 支持顺序和并发两种执行模式。
89
+ * 在顺序模式下,仓库将被逐个同步。
90
+ * 在并发模式下,可以同时并发同步多个仓库。
91
+ *
92
+ * @param rxdb - RxDB 实例
93
+ * @param options - 批量同步选项
94
+ * @returns 带有成功/失败计数的批量同步结果
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * // 顺序同步所有启用的仓库
99
+ * const result = await bulkSync(rxdb);
100
+ *
101
+ * // 同步指定仓库
102
+ * const result = await bulkSync(rxdb, {
103
+ * repositories: [
104
+ * { namespace: 'public', entity: 'Todo' },
105
+ * { namespace: 'public', entity: 'User' }
106
+ * ]
107
+ * });
108
+ *
109
+ * // 并发同步并限制并发数
110
+ * const result = await bulkSync(rxdb, {
111
+ * concurrent: true,
112
+ * concurrency: 3
113
+ * });
114
+ * ```
115
+ */
116
+ export declare function bulkSync(rxdb: RxDB, options?: BulkSyncOptions): Promise<BulkSyncResult>;
117
+ //# sourceMappingURL=bulk-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-sync.d.ts","sourceRoot":"","sources":["../src/bulk-sync.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAML,KAAK,IAAI,EAIV,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,KAAK,qBAAqB,EAAwB,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAA8C,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE7G;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAErC;;;OAGG;IACH,YAAY,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAEtC;;OAEG;IACH,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAE7B;;OAEG;IACH,IAAI,CAAC,EAAE,qBAAqB,CAAC;IAE7B;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,OAAO,EAAE,KAAK,CAAC;QACb,UAAU,EAAE,oBAAoB,CAAC;QACjC,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,oBAAoB,CAAC;QAC9B,KAAK,CAAC,EAAE,KAAK,CAAC;KACf,CAAC,CAAC;IAEH;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA8BjH;AA0HD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAuDjG"}
@@ -0,0 +1,38 @@
1
+ import { RepositoryIdentifier } from '@aiao/rxdb';
2
+ import { DependencyGraph } from './dependency-graph.js';
3
+ import { DependencyEdge } from './topological-sort.js';
4
+ /**
5
+ * 被依赖失败阻断的仓库,及其阻断来源
6
+ */
7
+ export interface CascadeBlock {
8
+ /** 直接导致阻断的依赖仓库 */
9
+ dependency: RepositoryIdentifier;
10
+ /** 该依赖仓库失败的错误 */
11
+ cause: Error;
12
+ }
13
+ /**
14
+ * 在依赖图上查找阻断当前仓库的第一个失败依赖
15
+ *
16
+ * @param graph - 依赖图
17
+ * @param repoKey - 当前仓库的 `namespace:entity` 键
18
+ * @param failed - 已失败仓库到其错误的映射(键同为 `namespace:entity`)
19
+ * @param edge - 本相位沿哪条依赖边判定阻断,取自 `dependencyEdgeForAction`。
20
+ * **没有默认值是刻意的**:这个值必须和本相位的
21
+ * 拓扑序同源,随手给一个默认就等于允许两者各说各话。
22
+ * @returns 存在失败依赖时返回该依赖与其错误;否则返回 `undefined`
23
+ *
24
+ * @remarks
25
+ * 只看直接邻居:级联按拓扑序执行,间接依赖的失败会先把中间那一层标成失败,
26
+ * 再经由这一层传导下来。
27
+ *
28
+ * 边必须跟着相位走,不能一律取 `dependsOn`:
29
+ *
30
+ * - **INSERT/UPDATE** 父先子后,父建不出来子就挂不上外键 → 子被 `dependsOn` 阻断;
31
+ * - **DELETE** 子先父后,子删不掉父就删不得(外键还指着它)→ 父被 `requiredBy` 阻断。
32
+ *
33
+ * 此前两个相位都取 `dependsOn`,等于把 DELETE 的方向反过来看:子仓删除失败时
34
+ * 父仓照删不误,远端要么直接违反外键约束、要么留下指向已删父行的孤儿;反过来
35
+ * 父仓删除失败又会白白挡住子仓——删子从来不会破坏父。
36
+ */
37
+ export declare function findBlockingDependency(graph: DependencyGraph, repoKey: string, failed: ReadonlyMap<string, Error>, edge: DependencyEdge): CascadeBlock | undefined;
38
+ //# sourceMappingURL=cascade-blocking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascade-blocking.d.ts","sourceRoot":"","sources":["../src/cascade-blocking.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,oBAAoB,EAAiB,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,kBAAkB;IAClB,UAAU,EAAE,oBAAoB,CAAC;IAEjC,iBAAiB;IACjB,KAAK,EAAE,KAAK,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,EAClC,IAAI,EAAE,cAAc,GACnB,YAAY,GAAG,SAAS,CAU1B"}
@@ -0,0 +1,47 @@
1
+ import { RepositoryIdentifier, RxDB } from '@aiao/rxdb';
2
+ export type { RepositoryIdentifier };
3
+ /**
4
+ * 仓库更新检查结果。
5
+ */
6
+ export interface CheckRepositoryUpdatesResult {
7
+ /**
8
+ * Repository 标识
9
+ */
10
+ repository: RepositoryIdentifier;
11
+ /**
12
+ * 远程最新的 changeId
13
+ */
14
+ remoteLatestChangeId: number;
15
+ /**
16
+ * 本地最后拉取的远程 changeId
17
+ */
18
+ localLastPullRemoteChangeId: number | null;
19
+ /**
20
+ * 待拉取的变更数量
21
+ */
22
+ pendingCount: number;
23
+ /**
24
+ * 是否有更新
25
+ */
26
+ hasUpdates: boolean;
27
+ }
28
+ /**
29
+ * 预检远程更新(不下载数据)
30
+ *
31
+ * @param rxdb - RxDB 实例
32
+ * @param namespace - 命名空间
33
+ * @param entity - 实体名称
34
+ * @returns 更新检查结果
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * // 检查 Todo 是否有远程更新
39
+ * const result = await checkRepositoryUpdates(rxdb, 'public', 'Todo');
40
+ * if (result.hasUpdates) {
41
+ * console.log(`有 ${result.pendingCount} 条更新待拉取`);
42
+ * // 用户点击"更新"按钮后再调用 pullRepository()
43
+ * }
44
+ * ```
45
+ */
46
+ export declare function checkRepositoryUpdates(rxdb: RxDB, namespace: string, entity: string): Promise<CheckRepositoryUpdatesResult>;
47
+ //# sourceMappingURL=check-repository-updates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-repository-updates.d.ts","sourceRoot":"","sources":["../src/check-repository-updates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAgC,KAAK,oBAAoB,EAAE,KAAK,IAAI,EAAY,MAAM,YAAY,CAAC;AAI1G,YAAY,EAAE,oBAAoB,EAAE,CAAC;AAErC;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;OAEG;IACH,UAAU,EAAE,oBAAoB,CAAC;IAEjC;;OAEG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3C;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,4BAA4B,CAAC,CA4EvC"}
@@ -0,0 +1,56 @@
1
+ import { RuleGroup, RxDBEntityId } from '@aiao/rxdb';
2
+ import { SyncManager } from './SyncManager.js';
3
+ /**
4
+ * 过期数据清理选项
5
+ */
6
+ export interface CleanupExpiredOptions {
7
+ /**
8
+ * 过滤条件(可选)
9
+ * 如果不提供,从实体元数据的 sync.remote.filter() 获取
10
+ */
11
+ filter?: RuleGroup;
12
+ /**
13
+ * 干跑模式,只返回将被删除的数量
14
+ * @default false
15
+ */
16
+ dryRun?: boolean;
17
+ }
18
+ /**
19
+ * 过期数据清理结果
20
+ */
21
+ export interface CleanupExpiredResult {
22
+ /**
23
+ * 被清理的记录数量
24
+ */
25
+ removed: number;
26
+ /**
27
+ * 被清理的实体 ID 列表(仅 dryRun 模式或实际删除时)
28
+ */
29
+ removedIds?: RxDBEntityId[];
30
+ }
31
+ /**
32
+ * 清理不再满足过滤条件的本地过期数据
33
+ *
34
+ * 注意: 删除操作不会记录到 RxDBChange,因此不会同步到远程
35
+ * 这适用于"只保留最近 N 天数据"的场景
36
+ *
37
+ * @param sm - SyncManager 实例
38
+ * @param namespace - 命名空间
39
+ * @param entityName - 实体名
40
+ * @param options - 清理选项
41
+ * @returns 清理结果
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);
46
+ * const { removed } = await cleanupExpired(sm, 'public', 'Order', {
47
+ * filter: {
48
+ * combinator: 'and',
49
+ * rules: [{ field: 'updatedAt', operator: '>=', value: thirtyDaysAgo }]
50
+ * }
51
+ * });
52
+ * console.log(`Removed ${removed} expired records`);
53
+ * ```
54
+ */
55
+ export declare function cleanupExpired(sm: SyncManager, namespace: string, entityName: string, options?: CleanupExpiredOptions): Promise<CleanupExpiredResult>;
56
+ //# sourceMappingURL=cleanup-expired.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup-expired.d.ts","sourceRoot":"","sources":["../src/cleanup-expired.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EASL,KAAK,SAAS,EAEd,KAAK,YAAY,EAIlB,MAAM,YAAY,CAAC;AASpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,WAAW,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAiI/B"}
@@ -0,0 +1,128 @@
1
+ import { RelationKind, RepositoryIdentifier } from '@aiao/rxdb';
2
+ interface DependencyGraphEntityRelation {
3
+ kind: RelationKind;
4
+ mappedEntity: string;
5
+ mappedNamespace?: string;
6
+ }
7
+ interface DependencyGraphEntityMetadata {
8
+ name: string;
9
+ namespace: string;
10
+ relations?: readonly DependencyGraphEntityRelation[];
11
+ }
12
+ export type { RepositoryIdentifier };
13
+ /**
14
+ * Repository 依赖关系
15
+ */
16
+ export interface RepositoryDependency {
17
+ /**
18
+ * 当前 repository
19
+ */
20
+ repository: RepositoryIdentifier;
21
+ /**
22
+ * 依赖的 repository(外键指向的实体)
23
+ * Pull 时必须先同步这些实体
24
+ */
25
+ dependsOn: RepositoryIdentifier[];
26
+ /**
27
+ * 被依赖的 repository(指向当前实体的外键)
28
+ * Push 时必须等待这些实体同步完成
29
+ */
30
+ requiredBy: RepositoryIdentifier[];
31
+ }
32
+ /**
33
+ * 依赖图
34
+ * 键:`{namespace}:{entity}`。
35
+ */
36
+ export type DependencyGraph = Map<string, RepositoryDependency>;
37
+ /**
38
+ * 构建依赖图
39
+ *
40
+ * @param entities - 实体元数据数组
41
+ * @returns 依赖图
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * const entities = entityManager.getEntities();
46
+ * const graph = buildDependencyGraph(entities);
47
+ *
48
+ * // 查询 Todo 的依赖
49
+ * const todoDep = graph.get('public:Todo');
50
+ * console.log(todoDep.dependsOn); // [{ namespace: 'public', entity: 'User' }]
51
+ * ```
52
+ */
53
+ export declare function buildDependencyGraph(entities: readonly DependencyGraphEntityMetadata[]): DependencyGraph;
54
+ /**
55
+ * 检测循环依赖
56
+ *
57
+ * 注意:自引用(self-reference)不算循环依赖,因为树形结构是合法的
58
+ * 例如:RxDBBranch -> RxDBBranch (parent-child 关系)
59
+ *
60
+ * @param graph - 依赖图
61
+ * @throws {RxDBError} 如果检测到循环依赖
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * // 抛出错误示例:
66
+ * // User -> Profile -> User (循环依赖)
67
+ * detectCycles(graph); // 抛出 RxDBError
68
+ *
69
+ * // 允许的情况:
70
+ * // RxDBBranch -> RxDBBranch (自引用,树形结构)
71
+ * ```
72
+ */
73
+ export declare function detectCycles(graph: DependencyGraph): void;
74
+ /**
75
+ * 获取 repository 的所有依赖(包括间接依赖)
76
+ *
77
+ * 注意:自引用会被跳过,避免无限递归
78
+ *
79
+ * @param namespace - 命名空间
80
+ * @param entity - 实体名称
81
+ * @param graph - 依赖图
82
+ * @returns 所有依赖的 repository(拓扑排序,父在前)
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * // Comment -> Todo -> User
87
+ * const deps = getAllDependencies('public', 'Comment', graph);
88
+ * // 返回: [User, Todo, Comment]
89
+ * ```
90
+ */
91
+ export declare function getAllDependencies(namespace: string, entity: string, graph: DependencyGraph): RepositoryIdentifier[];
92
+ /**
93
+ * 获取 repository 的所有被依赖方(包括间接被依赖)
94
+ *
95
+ * 注意:自引用会被跳过,避免无限递归
96
+ *
97
+ * @param namespace - 命名空间
98
+ * @param entity - 实体名称
99
+ * @param graph - 依赖图
100
+ * @returns 所有被依赖的 repository(拓扑排序,子在前)
101
+ *
102
+ * @example
103
+ * ```ts
104
+ * // User <- Todo <- Comment
105
+ * const requiredBy = getAllRequiredBy('public', 'User', graph);
106
+ * // 返回: [Comment, Todo, User]
107
+ * ```
108
+ */
109
+ export declare function getAllRequiredBy(namespace: string, entity: string, graph: DependencyGraph): RepositoryIdentifier[];
110
+ /**
111
+ * 获取 repository 的直接父实体(一层依赖)
112
+ *
113
+ * @param namespace - 命名空间
114
+ * @param entity - 实体名称
115
+ * @param graph - 依赖图
116
+ * @returns 直接父实体列表
117
+ */
118
+ export declare function getDirectParents(namespace: string, entity: string, graph: DependencyGraph): RepositoryIdentifier[];
119
+ /**
120
+ * 获取 repository 的直接子实体(一层被依赖)
121
+ *
122
+ * @param namespace - 命名空间
123
+ * @param entity - 实体名称
124
+ * @param graph - 依赖图
125
+ * @returns 直接子实体列表
126
+ */
127
+ export declare function getDirectChildren(namespace: string, entity: string, graph: DependencyGraph): RepositoryIdentifier[];
128
+ //# sourceMappingURL=dependency-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-graph.d.ts","sourceRoot":"","sources":["../src/dependency-graph.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,oBAAoB,EAAa,MAAM,YAAY,CAAC;AAEhF,UAAU,6BAA6B;IACrC,IAAI,EAAE,YAAY,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,6BAA6B;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,6BAA6B,EAAE,CAAC;CACtD;AAED,YAAY,EAAE,oBAAoB,EAAE,CAAC;AAErC;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,UAAU,EAAE,oBAAoB,CAAC;IAEjC;;;OAGG;IACH,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAElC;;;OAGG;IACH,UAAU,EAAE,oBAAoB,EAAE,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;AAEhE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,SAAS,6BAA6B,EAAE,GAAG,eAAe,CA6CxG;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CA+CzD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,oBAAoB,EAAE,CAmCpH;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,oBAAoB,EAAE,CAmClH;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,oBAAoB,EAAE,CAOlH;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,oBAAoB,EAAE,CAOnH"}
@@ -0,0 +1,58 @@
1
+ import { RxDB } from '@aiao/rxdb';
2
+ import { RepositorySyncStatus, SyncTypeValue } from './get-repository-sync-status.js';
3
+ /**
4
+ * getAllRepositorySyncStatus 的过滤选项
5
+ */
6
+ export interface GetAllRepositorySyncStatusFilter {
7
+ /**
8
+ * 按同步类型过滤
9
+ * 如果提供,则仅返回这些同步类型的仓库
10
+ */
11
+ syncType?: SyncTypeValue[];
12
+ /**
13
+ * 按启用状态过滤
14
+ * 如果为 true,则仅返回启用的仓库
15
+ * 如果为 false,则仅返回禁用的仓库
16
+ * 如果为 undefined,则返回全部
17
+ */
18
+ enabled?: boolean;
19
+ /**
20
+ * 按待处理变更过滤
21
+ * 如果为 true,则仅返回 pushableCount > 0 或 pullableCount > 0 的仓库
22
+ * 如果为 false,则仅返回没有待处理变更的仓库
23
+ * 如果为 undefined,则返回全部
24
+ */
25
+ hasPendingChanges?: boolean;
26
+ }
27
+ /**
28
+ * 获取所有仓库的同步状态
29
+ *
30
+ * 遍历所有注册实体并查询它们的同步状态,支持按 syncType、启用状态和待处理变更进行过滤。
31
+ *
32
+ * @param rxdb - RxDB 实例
33
+ * @param filter - 可选的过滤条件
34
+ * @returns 仓库同步状态数组
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * // 获取所有仓库状态
39
+ * const statuses = await getAllRepositorySyncStatus(rxdb);
40
+ *
41
+ * // 仅获取启用的仓库
42
+ * const statuses = await getAllRepositorySyncStatus(rxdb, {
43
+ * enabled: true
44
+ * });
45
+ *
46
+ * // 仅获取有待处理变更的仓库
47
+ * const statuses = await getAllRepositorySyncStatus(rxdb, {
48
+ * hasPendingChanges: true
49
+ * });
50
+ *
51
+ * // 仅获取 full/remote 同步类型的仓库
52
+ * const statuses = await getAllRepositorySyncStatus(rxdb, {
53
+ * syncType: ['full', 'remote']
54
+ * });
55
+ * ```
56
+ */
57
+ export declare function getAllRepositorySyncStatus(rxdb: RxDB, filter?: GetAllRepositorySyncStatusFilter): Promise<RepositorySyncStatus[]>;
58
+ //# sourceMappingURL=get-all-repository-sync-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-all-repository-sync-status.d.ts","sourceRoot":"","sources":["../src/get-all-repository-sync-status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAqB,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAE3B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,gCAAgC,GACxC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAyCjC"}
@@ -0,0 +1,68 @@
1
+ import { RepositoryIdentifier, RxDB } from '@aiao/rxdb';
2
+ export type { RepositoryIdentifier };
3
+ /**
4
+ * 同步类型的取值
5
+ */
6
+ export type SyncTypeValue = 'full' | 'filter' | 'querycache' | 'remote' | 'local' | 'none';
7
+ /**
8
+ * 仓库同步状态
9
+ */
10
+ export interface RepositorySyncStatus {
11
+ /**
12
+ * 仓库标识
13
+ */
14
+ repository: RepositoryIdentifier;
15
+ /**
16
+ * 分支 ID
17
+ */
18
+ branchId: string;
19
+ /**
20
+ * 同步类型
21
+ */
22
+ syncType: SyncTypeValue;
23
+ /**
24
+ * 是否启用同步
25
+ */
26
+ enabled: boolean;
27
+ /**
28
+ * 最后一次推送的 changeId
29
+ */
30
+ lastPushedChangeId: number | null;
31
+ /**
32
+ * 最后一次推送时间戳
33
+ */
34
+ lastPushedAt: Date | null;
35
+ /**
36
+ * 最后一次拉取时间戳
37
+ */
38
+ lastPulledAt: Date | null;
39
+ /**
40
+ * 最后一次拉取到的远端 changeId
41
+ */
42
+ lastPullRemoteChangeId: number | null;
43
+ /**
44
+ * 待推送的变更数量
45
+ */
46
+ pushableCount: number;
47
+ /**
48
+ * 可供拉取的变更数量
49
+ */
50
+ pullableCount: number;
51
+ }
52
+ /**
53
+ * 获取单个仓库的同步状态
54
+ *
55
+ * @param rxdb - RxDB 实例
56
+ * @param namespace - 实体命名空间
57
+ * @param entity - 实体名称
58
+ * @returns 仓库同步状态
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * const status = await getRepositorySyncStatus(rxdb, 'public', 'Todo');
63
+ * console.log(`Sync type: ${status.syncType}`);
64
+ * console.log(`Pushable: ${status.pushableCount}, Pullable: ${status.pullableCount}`);
65
+ * ```
66
+ */
67
+ export declare function getRepositorySyncStatus(rxdb: RxDB, namespace: string, entity: string): Promise<RepositorySyncStatus>;
68
+ //# sourceMappingURL=get-repository-sync-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-repository-sync-status.d.ts","sourceRoot":"","sources":["../src/get-repository-sync-status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAKL,KAAK,oBAAoB,EACzB,KAAK,IAAI,EAKV,MAAM,YAAY,CAAC;AAIpB,YAAY,EAAE,oBAAoB,EAAE,CAAC;AAErC;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3F;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,UAAU,EAAE,oBAAoB,CAAC;IAEjC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,QAAQ,EAAE,aAAa,CAAC;IAExB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC;;OAEG;IACH,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAE1B;;OAEG;IACH,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAE1B;;OAEG;IACH,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IAEtC;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAwED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC,CAgE/B"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * `@aiao/rxdb-plugin-sync` —— 推拉同步、冲突处理与仓库依赖序。
4
+ *
5
+ * @remarks
6
+ * 核心 `@aiao/rxdb` 只保留**原语**:`RxDBSync` 水位表、变更编解码、冲突模型
7
+ * (`ConflictResolution` / `RxDBConflictError`)与同步资格判定。搬进本包的是**消费者**:
8
+ * 整库与单仓库两个粒度的 push / pull / sync、冲突落地、依赖拓扑序、过期清理与出站队列。
9
+ *
10
+ * US-025 阶段 D 之前这些入口挂在 `@aiao/rxdb-plugin-history` 的 `VersionManager` 上。
11
+ * 两件事的生命周期本就不同:撤销重做要在第一条 `rxdb_change` 之前就位,推拉同步则只在
12
+ * 配了远端时才有意义,所以它们各自成包。
13
+ *
14
+ * 本包 `inject: ['plugin:history']`,反向没有依赖——历史包不认识本包。这条单向耦合只走
15
+ * 一张窄接口:一次往返结束时 undo 边界要作废、待拉计数要结算,而那些状态的主人在历史侧。
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { rxDBPluginHistory } from '@aiao/rxdb-plugin-history';
20
+ * import { rxDBPluginSync } from '@aiao/rxdb-plugin-sync';
21
+ *
22
+ * rxdb.use(rxDBPluginHistory);
23
+ * rxdb.use(rxDBPluginSync);
24
+ * await rxdb.connect();
25
+ *
26
+ * await rxdb.syncManager.sync();
27
+ * ```
28
+ */
29
+ export * from './plugin.js';
30
+ export type { BulkSyncOptions, BulkSyncResult } from './bulk-sync.js';
31
+ export type { CheckRepositoryUpdatesResult } from './check-repository-updates.js';
32
+ export type { CleanupExpiredOptions, CleanupExpiredResult } from './cleanup-expired.js';
33
+ export type { DependencyGraph } from './dependency-graph.js';
34
+ export type { GetAllRepositorySyncStatusFilter } from './get-all-repository-sync-status.js';
35
+ export type { RepositorySyncStatus } from './get-repository-sync-status.js';
36
+ export { countQueryCacheOutbox, flushQueryCacheOutbox, pendingQueryCacheWriteIds, type QueryCacheOutboxFailure, type QueryCacheOutboxResult } from './query-cache-outbox.js';
37
+ export type { SyncBranchSkipReason, SyncBranchesResult } from './sync-branches.js';
38
+ export type { SyncManager } from './SyncManager.js';
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,cAAc,aAAa,CAAC;AAE5B,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEtE,YAAY,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAIlF,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAExF,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,YAAY,EAAE,gCAAgC,EAAE,MAAM,qCAAqC,CAAC;AAE5F,YAAY,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAI5E,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC5B,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEnF,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}