document-drive 1.19.1 → 1.20.0

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 (252) hide show
  1. package/README.md +4 -0
  2. package/dist/index.d.ts +28 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +18 -0
  5. package/dist/src/cache/memory.d.ts +10 -0
  6. package/dist/src/cache/memory.d.ts.map +1 -0
  7. package/dist/src/cache/memory.js +26 -0
  8. package/dist/src/cache/redis.d.ts +14 -0
  9. package/dist/src/cache/redis.d.ts.map +1 -0
  10. package/dist/src/cache/redis.js +40 -0
  11. package/dist/src/cache/types.d.ts +7 -0
  12. package/dist/src/cache/types.d.ts.map +1 -0
  13. package/dist/src/cache/types.js +1 -0
  14. package/dist/src/drive-document-model/constants.d.ts +2 -0
  15. package/dist/src/drive-document-model/constants.d.ts.map +1 -0
  16. package/dist/src/drive-document-model/constants.js +1 -0
  17. package/dist/src/drive-document-model/gen/actions.d.ts +7 -0
  18. package/dist/src/drive-document-model/gen/actions.d.ts.map +1 -0
  19. package/dist/src/drive-document-model/gen/actions.js +2 -0
  20. package/dist/src/drive-document-model/gen/constants.d.ts +7 -0
  21. package/dist/src/drive-document-model/gen/constants.d.ts.map +1 -0
  22. package/dist/src/drive-document-model/gen/constants.js +16 -0
  23. package/dist/src/drive-document-model/gen/creators.d.ts +3 -0
  24. package/dist/src/drive-document-model/gen/creators.d.ts.map +1 -0
  25. package/dist/src/drive-document-model/gen/creators.js +2 -0
  26. package/dist/src/drive-document-model/gen/document-model.d.ts +3 -0
  27. package/dist/src/drive-document-model/gen/document-model.d.ts.map +1 -0
  28. package/dist/src/drive-document-model/gen/document-model.js +210 -0
  29. package/dist/src/drive-document-model/gen/drive/actions.d.ts +12 -0
  30. package/dist/src/drive-document-model/gen/drive/actions.d.ts.map +1 -0
  31. package/dist/src/drive-document-model/gen/drive/actions.js +1 -0
  32. package/dist/src/drive-document-model/gen/drive/creators.d.ts +11 -0
  33. package/dist/src/drive-document-model/gen/drive/creators.d.ts.map +1 -0
  34. package/dist/src/drive-document-model/gen/drive/creators.js +10 -0
  35. package/dist/src/drive-document-model/gen/drive/error.d.ts +2 -0
  36. package/dist/src/drive-document-model/gen/drive/error.d.ts.map +1 -0
  37. package/dist/src/drive-document-model/gen/drive/error.js +1 -0
  38. package/dist/src/drive-document-model/gen/drive/object.d.ts +14 -0
  39. package/dist/src/drive-document-model/gen/drive/object.d.ts.map +1 -0
  40. package/dist/src/drive-document-model/gen/drive/object.js +28 -0
  41. package/dist/src/drive-document-model/gen/drive/operations.d.ts +14 -0
  42. package/dist/src/drive-document-model/gen/drive/operations.d.ts.map +1 -0
  43. package/dist/src/drive-document-model/gen/drive/operations.js +1 -0
  44. package/dist/src/drive-document-model/gen/node/actions.d.ts +11 -0
  45. package/dist/src/drive-document-model/gen/node/actions.d.ts.map +1 -0
  46. package/dist/src/drive-document-model/gen/node/actions.js +1 -0
  47. package/dist/src/drive-document-model/gen/node/creators.d.ts +10 -0
  48. package/dist/src/drive-document-model/gen/node/creators.d.ts.map +1 -0
  49. package/dist/src/drive-document-model/gen/node/creators.js +9 -0
  50. package/dist/src/drive-document-model/gen/node/error.d.ts +2 -0
  51. package/dist/src/drive-document-model/gen/node/error.d.ts.map +1 -0
  52. package/dist/src/drive-document-model/gen/node/error.js +1 -0
  53. package/dist/src/drive-document-model/gen/node/object.d.ts +13 -0
  54. package/dist/src/drive-document-model/gen/node/object.d.ts.map +1 -0
  55. package/dist/src/drive-document-model/gen/node/object.js +25 -0
  56. package/dist/src/drive-document-model/gen/node/operations.d.ts +13 -0
  57. package/dist/src/drive-document-model/gen/node/operations.d.ts.map +1 -0
  58. package/dist/src/drive-document-model/gen/node/operations.js +1 -0
  59. package/dist/src/drive-document-model/gen/object.d.ts +21 -0
  60. package/dist/src/drive-document-model/gen/object.d.ts.map +1 -0
  61. package/dist/src/drive-document-model/gen/object.js +28 -0
  62. package/dist/src/drive-document-model/gen/reducer.d.ts +4 -0
  63. package/dist/src/drive-document-model/gen/reducer.d.ts.map +1 -0
  64. package/dist/src/drive-document-model/gen/reducer.js +74 -0
  65. package/dist/src/drive-document-model/gen/schema/types.d.ts +176 -0
  66. package/dist/src/drive-document-model/gen/schema/types.d.ts.map +1 -0
  67. package/dist/src/drive-document-model/gen/schema/types.js +1 -0
  68. package/dist/src/drive-document-model/gen/schema/zod.d.ts +87 -0
  69. package/dist/src/drive-document-model/gen/schema/zod.d.ts.map +1 -0
  70. package/dist/src/drive-document-model/gen/schema/zod.js +203 -0
  71. package/dist/src/drive-document-model/gen/types.d.ts +9 -0
  72. package/dist/src/drive-document-model/gen/types.d.ts.map +1 -0
  73. package/dist/src/drive-document-model/gen/types.js +1 -0
  74. package/dist/src/drive-document-model/gen/utils.d.ts +10 -0
  75. package/dist/src/drive-document-model/gen/utils.d.ts.map +1 -0
  76. package/dist/src/drive-document-model/gen/utils.js +27 -0
  77. package/dist/src/drive-document-model/index.d.ts +2 -0
  78. package/dist/src/drive-document-model/index.d.ts.map +1 -0
  79. package/dist/src/drive-document-model/index.js +1 -0
  80. package/dist/src/drive-document-model/module.d.ts +3 -0
  81. package/dist/src/drive-document-model/module.d.ts.map +1 -0
  82. package/dist/src/drive-document-model/module.js +12 -0
  83. package/dist/src/drive-document-model/src/reducers/drive.d.ts +8 -0
  84. package/dist/src/drive-document-model/src/reducers/drive.d.ts.map +1 -0
  85. package/dist/src/drive-document-model/src/reducers/drive.js +37 -0
  86. package/dist/src/drive-document-model/src/reducers/node.d.ts +8 -0
  87. package/dist/src/drive-document-model/src/reducers/node.d.ts.map +1 -0
  88. package/dist/src/drive-document-model/src/reducers/node.js +185 -0
  89. package/dist/src/drive-document-model/src/utils.d.ts +34 -0
  90. package/dist/src/drive-document-model/src/utils.d.ts.map +1 -0
  91. package/dist/src/drive-document-model/src/utils.js +146 -0
  92. package/dist/src/queue/base.d.ts +43 -0
  93. package/dist/src/queue/base.d.ts.map +1 -0
  94. package/dist/src/queue/base.js +241 -0
  95. package/dist/src/queue/redis.d.ts +28 -0
  96. package/dist/src/queue/redis.d.ts.map +1 -0
  97. package/dist/src/queue/redis.js +110 -0
  98. package/dist/src/queue/types.d.ts +55 -0
  99. package/dist/src/queue/types.d.ts.map +1 -0
  100. package/dist/src/queue/types.js +6 -0
  101. package/dist/src/read-mode/errors.d.ts +12 -0
  102. package/dist/src/read-mode/errors.d.ts.map +1 -0
  103. package/dist/src/read-mode/errors.js +17 -0
  104. package/dist/src/read-mode/server.d.ts +4 -0
  105. package/dist/src/read-mode/server.d.ts.map +1 -0
  106. package/dist/src/read-mode/server.js +78 -0
  107. package/dist/src/read-mode/service.d.ts +18 -0
  108. package/dist/src/read-mode/service.d.ts.map +1 -0
  109. package/dist/src/read-mode/service.js +112 -0
  110. package/dist/src/read-mode/types.d.ts +35 -0
  111. package/dist/src/read-mode/types.d.ts.map +1 -0
  112. package/dist/src/read-mode/types.js +1 -0
  113. package/dist/src/server/base-server.d.ts +112 -0
  114. package/dist/src/server/base-server.d.ts.map +1 -0
  115. package/dist/src/server/base-server.js +1280 -0
  116. package/dist/src/server/builder.d.ts +30 -0
  117. package/dist/src/server/builder.d.ts.map +1 -0
  118. package/dist/src/server/builder.js +89 -0
  119. package/dist/src/server/constants.d.ts +2 -0
  120. package/dist/src/server/constants.d.ts.map +1 -0
  121. package/dist/src/server/constants.js +1 -0
  122. package/dist/src/server/error.d.ts +30 -0
  123. package/dist/src/server/error.d.ts.map +1 -0
  124. package/dist/src/server/error.js +47 -0
  125. package/dist/src/server/event-emitter.d.ts +8 -0
  126. package/dist/src/server/event-emitter.d.ts.map +1 -0
  127. package/dist/src/server/event-emitter.js +10 -0
  128. package/dist/src/server/listener/index.d.ts +2 -0
  129. package/dist/src/server/listener/index.d.ts.map +1 -0
  130. package/dist/src/server/listener/index.js +1 -0
  131. package/dist/src/server/listener/listener-manager.d.ts +27 -0
  132. package/dist/src/server/listener/listener-manager.d.ts.map +1 -0
  133. package/dist/src/server/listener/listener-manager.js +401 -0
  134. package/dist/src/server/listener/transmitter/factory.d.ts +8 -0
  135. package/dist/src/server/listener/transmitter/factory.d.ts.map +1 -0
  136. package/dist/src/server/listener/transmitter/factory.js +25 -0
  137. package/dist/src/server/listener/transmitter/internal.d.ts +34 -0
  138. package/dist/src/server/listener/transmitter/internal.d.ts.map +1 -0
  139. package/dist/src/server/listener/transmitter/internal.js +87 -0
  140. package/dist/src/server/listener/transmitter/pull-responder.d.ts +38 -0
  141. package/dist/src/server/listener/transmitter/pull-responder.d.ts.map +1 -0
  142. package/dist/src/server/listener/transmitter/pull-responder.js +256 -0
  143. package/dist/src/server/listener/transmitter/switchboard-push.d.ts +9 -0
  144. package/dist/src/server/listener/transmitter/switchboard-push.d.ts.map +1 -0
  145. package/dist/src/server/listener/transmitter/switchboard-push.js +77 -0
  146. package/dist/src/server/listener/transmitter/types.d.ts +20 -0
  147. package/dist/src/server/listener/transmitter/types.d.ts.map +1 -0
  148. package/dist/src/server/listener/transmitter/types.js +1 -0
  149. package/dist/src/server/listener/util.d.ts +2 -0
  150. package/dist/src/server/listener/util.d.ts.map +1 -0
  151. package/dist/src/server/listener/util.js +22 -0
  152. package/dist/src/server/sync-manager.d.ts +30 -0
  153. package/dist/src/server/sync-manager.d.ts.map +1 -0
  154. package/dist/src/server/sync-manager.js +287 -0
  155. package/dist/src/server/types.d.ts +308 -0
  156. package/dist/src/server/types.d.ts.map +1 -0
  157. package/dist/src/server/types.js +12 -0
  158. package/dist/src/server/utils.d.ts +8 -0
  159. package/dist/src/server/utils.d.ts.map +1 -0
  160. package/dist/src/server/utils.js +47 -0
  161. package/dist/src/storage/base.d.ts +36 -0
  162. package/dist/src/storage/base.d.ts.map +1 -0
  163. package/dist/src/storage/base.js +4 -0
  164. package/dist/src/storage/browser.d.ts +36 -0
  165. package/dist/src/storage/browser.d.ts.map +1 -0
  166. package/dist/src/storage/browser.js +155 -0
  167. package/dist/src/storage/filesystem.d.ts +33 -0
  168. package/dist/src/storage/filesystem.d.ts.map +1 -0
  169. package/dist/src/storage/filesystem.js +197 -0
  170. package/dist/src/storage/memory.d.ts +33 -0
  171. package/dist/src/storage/memory.d.ts.map +1 -0
  172. package/dist/src/storage/memory.js +139 -0
  173. package/dist/src/storage/prisma.d.ts +67 -0
  174. package/dist/src/storage/prisma.d.ts.map +1 -0
  175. package/dist/src/storage/prisma.js +445 -0
  176. package/dist/src/storage/sequelize.d.ts +32 -0
  177. package/dist/src/storage/sequelize.d.ts.map +1 -0
  178. package/dist/src/storage/sequelize.js +373 -0
  179. package/dist/src/storage/types.d.ts +43 -0
  180. package/dist/src/storage/types.d.ts.map +1 -0
  181. package/dist/src/storage/types.js +1 -0
  182. package/dist/src/utils/default-drives-manager.d.ts +29 -0
  183. package/dist/src/utils/default-drives-manager.d.ts.map +1 -0
  184. package/dist/src/utils/default-drives-manager.js +208 -0
  185. package/dist/src/utils/graphql.d.ts +34 -0
  186. package/dist/src/utils/graphql.d.ts.map +1 -0
  187. package/dist/src/utils/graphql.js +183 -0
  188. package/dist/src/utils/logger.d.ts +27 -0
  189. package/dist/src/utils/logger.d.ts.map +1 -0
  190. package/dist/src/utils/logger.js +105 -0
  191. package/dist/src/utils/migrations.d.ts +4 -0
  192. package/dist/src/utils/migrations.d.ts.map +1 -0
  193. package/dist/src/utils/migrations.js +41 -0
  194. package/dist/src/utils/misc.d.ts +11 -0
  195. package/dist/src/utils/misc.d.ts.map +1 -0
  196. package/dist/src/utils/misc.js +43 -0
  197. package/dist/src/utils/run-asap.d.ts +12 -0
  198. package/dist/src/utils/run-asap.d.ts.map +1 -0
  199. package/dist/src/utils/run-asap.js +131 -0
  200. package/dist/test/document-helpers/utils.d.ts +8 -0
  201. package/dist/test/document-helpers/utils.d.ts.map +1 -0
  202. package/dist/test/document-helpers/utils.js +21 -0
  203. package/dist/test/utils.d.ts +48 -0
  204. package/dist/test/utils.d.ts.map +1 -0
  205. package/dist/test/utils.js +132 -0
  206. package/dist/test/vitest-setup.d.ts +2 -0
  207. package/dist/test/vitest-setup.d.ts.map +1 -0
  208. package/dist/test/vitest-setup.js +4 -0
  209. package/dist/tsconfig.tsbuildinfo +1 -0
  210. package/dist/vitest.config.d.ts +3 -0
  211. package/dist/vitest.config.d.ts.map +1 -0
  212. package/dist/vitest.config.js +20 -0
  213. package/package.json +20 -38
  214. package/src/cache/index.ts +0 -2
  215. package/src/cache/memory.ts +0 -33
  216. package/src/cache/redis.ts +0 -56
  217. package/src/cache/types.ts +0 -9
  218. package/src/index.ts +0 -4
  219. package/src/queue/base.ts +0 -320
  220. package/src/queue/index.ts +0 -2
  221. package/src/queue/redis.ts +0 -144
  222. package/src/queue/types.ts +0 -79
  223. package/src/read-mode/errors.ts +0 -19
  224. package/src/read-mode/index.ts +0 -125
  225. package/src/read-mode/service.ts +0 -207
  226. package/src/read-mode/types.ts +0 -108
  227. package/src/server/error.ts +0 -70
  228. package/src/server/index.ts +0 -2444
  229. package/src/server/listener/index.ts +0 -2
  230. package/src/server/listener/manager.ts +0 -652
  231. package/src/server/listener/transmitter/index.ts +0 -4
  232. package/src/server/listener/transmitter/internal.ts +0 -143
  233. package/src/server/listener/transmitter/pull-responder.ts +0 -462
  234. package/src/server/listener/transmitter/switchboard-push.ts +0 -125
  235. package/src/server/listener/transmitter/types.ts +0 -27
  236. package/src/server/types.ts +0 -596
  237. package/src/server/utils.ts +0 -82
  238. package/src/storage/base.ts +0 -81
  239. package/src/storage/browser.ts +0 -238
  240. package/src/storage/filesystem.ts +0 -297
  241. package/src/storage/index.ts +0 -2
  242. package/src/storage/memory.ts +0 -211
  243. package/src/storage/prisma.ts +0 -653
  244. package/src/storage/sequelize.ts +0 -498
  245. package/src/storage/types.ts +0 -97
  246. package/src/utils/default-drives-manager.ts +0 -341
  247. package/src/utils/document-helpers.ts +0 -21
  248. package/src/utils/graphql.ts +0 -301
  249. package/src/utils/index.ts +0 -90
  250. package/src/utils/logger.ts +0 -38
  251. package/src/utils/migrations.ts +0 -58
  252. package/src/utils/run-asap.ts +0 -156
@@ -0,0 +1,287 @@
1
+ import { isFileNode } from "#drive-document-model/src/utils";
2
+ import { logger } from "#utils/logger";
3
+ import { isBefore, isDocumentDrive } from "#utils/misc";
4
+ import { garbageCollectDocumentOperations, replayDocument, } from "document-model";
5
+ import { SynchronizationUnitNotFoundError } from "./error.js";
6
+ export default class SynchronizationManager {
7
+ storage;
8
+ cache;
9
+ documentModelModules;
10
+ eventEmitter;
11
+ syncStatus = new Map();
12
+ constructor(storage, cache, documentModelModules, eventEmitter) {
13
+ this.storage = storage;
14
+ this.cache = cache;
15
+ this.documentModelModules = documentModelModules;
16
+ this.eventEmitter = eventEmitter;
17
+ }
18
+ async getSynchronizationUnits(driveId, documentId, scope, branch, documentType) {
19
+ const synchronizationUnitsQuery = await this.getSynchronizationUnitsIds(driveId, documentId, scope, branch, documentType);
20
+ return this.getSynchronizationUnitsRevision(driveId, synchronizationUnitsQuery);
21
+ }
22
+ async getSynchronizationUnitsRevision(driveId, syncUnitsQuery) {
23
+ const drive = await this.getDrive(driveId);
24
+ const revisions = await this.storage.getSynchronizationUnitsRevision(syncUnitsQuery);
25
+ const synchronizationUnits = syncUnitsQuery.map((s) => ({
26
+ ...s,
27
+ lastUpdated: drive.created,
28
+ revision: -1,
29
+ }));
30
+ for (const revision of revisions) {
31
+ const syncUnit = synchronizationUnits.find((s) => revision.driveId === s.driveId &&
32
+ revision.documentId === s.documentId &&
33
+ revision.scope === s.scope &&
34
+ revision.branch === s.branch);
35
+ if (syncUnit) {
36
+ syncUnit.revision = revision.revision;
37
+ syncUnit.lastUpdated = revision.lastUpdated;
38
+ }
39
+ }
40
+ return synchronizationUnits;
41
+ }
42
+ async getSynchronizationUnitsIds(driveId, documentId, scope, branch, documentType) {
43
+ const drive = await this.getDrive(driveId);
44
+ const nodes = drive.state.global.nodes.filter((node) => isFileNode(node) &&
45
+ (!documentId?.length ||
46
+ documentId.includes(node.id) ||
47
+ documentId.includes("*")) &&
48
+ (!documentType?.length ||
49
+ documentType.includes(node.documentType) ||
50
+ documentType.includes("*")));
51
+ // checks if document drive synchronization unit should be added
52
+ if ((!documentId || documentId.includes("*") || documentId.includes("")) &&
53
+ (!documentType?.length ||
54
+ documentType.includes("powerhouse/document-drive") ||
55
+ documentType.includes("*"))) {
56
+ nodes.unshift({
57
+ id: "",
58
+ documentType: "powerhouse/document-drive",
59
+ synchronizationUnits: [
60
+ {
61
+ syncId: "0",
62
+ scope: "global",
63
+ branch: "main",
64
+ },
65
+ ],
66
+ });
67
+ }
68
+ const synchronizationUnitsQuery = [];
69
+ for (const node of nodes) {
70
+ const nodeUnits = scope?.length || branch?.length
71
+ ? node.synchronizationUnits.filter((unit) => (!scope?.length ||
72
+ scope.includes(unit.scope) ||
73
+ scope.includes("*")) &&
74
+ (!branch?.length ||
75
+ branch.includes(unit.branch) ||
76
+ branch.includes("*")))
77
+ : node.synchronizationUnits;
78
+ if (!nodeUnits.length) {
79
+ continue;
80
+ }
81
+ synchronizationUnitsQuery.push(...nodeUnits.map((n) => ({
82
+ driveId,
83
+ documentId: node.id,
84
+ syncId: n.syncId,
85
+ documentType: node.documentType,
86
+ scope: n.scope,
87
+ branch: n.branch,
88
+ })));
89
+ }
90
+ return synchronizationUnitsQuery;
91
+ }
92
+ async getSynchronizationUnitIdInfo(driveId, syncId) {
93
+ const drive = await this.getDrive(driveId);
94
+ const node = drive.state.global.nodes.find((node) => isFileNode(node) &&
95
+ node.synchronizationUnits.find((unit) => unit.syncId === syncId));
96
+ if (!node || !isFileNode(node)) {
97
+ return undefined;
98
+ }
99
+ const syncUnit = node.synchronizationUnits.find((unit) => unit.syncId === syncId);
100
+ if (!syncUnit) {
101
+ return undefined;
102
+ }
103
+ return {
104
+ syncId,
105
+ scope: syncUnit.scope,
106
+ branch: syncUnit.branch,
107
+ driveId,
108
+ documentId: node.id,
109
+ documentType: node.documentType,
110
+ };
111
+ }
112
+ async getSynchronizationUnit(driveId, syncId) {
113
+ const syncUnit = await this.getSynchronizationUnitIdInfo(driveId, syncId);
114
+ if (!syncUnit) {
115
+ return undefined;
116
+ }
117
+ const { scope, branch, documentId, documentType } = syncUnit;
118
+ // TODO: REPLACE WITH GET DOCUMENT OPERATIONS
119
+ const document = await this.getDocument(driveId, documentId);
120
+ const operations = document.operations[scope] ?? [];
121
+ const lastOperation = operations[operations.length - 1];
122
+ return {
123
+ syncId,
124
+ scope,
125
+ branch,
126
+ driveId,
127
+ documentId,
128
+ documentType,
129
+ lastUpdated: lastOperation.timestamp ?? document.lastModified,
130
+ revision: lastOperation.index ?? 0,
131
+ };
132
+ }
133
+ async getOperationData(driveId, syncId, filter) {
134
+ const syncUnit = syncId === "0"
135
+ ? { documentId: "", scope: "global" }
136
+ : await this.getSynchronizationUnitIdInfo(driveId, syncId);
137
+ if (!syncUnit) {
138
+ throw new Error(`Invalid Sync Id ${syncId} in drive ${driveId}`);
139
+ }
140
+ const document = syncId === "0"
141
+ ? await this.getDrive(driveId)
142
+ : await this.getDocument(driveId, syncUnit.documentId); // TODO replace with getDocumentOperations
143
+ const operations = document.operations[syncUnit.scope] ?? []; // TODO filter by branch also
144
+ const filteredOperations = operations.filter((operation) => Object.keys(filter).length === 0 ||
145
+ ((filter.since === undefined ||
146
+ isBefore(filter.since, operation.timestamp)) &&
147
+ (filter.fromRevision === undefined ||
148
+ operation.index > filter.fromRevision)));
149
+ const limitedOperations = filter.limit
150
+ ? filteredOperations.slice(0, filter.limit)
151
+ : filteredOperations;
152
+ return limitedOperations.map((operation) => ({
153
+ hash: operation.hash,
154
+ index: operation.index,
155
+ timestamp: operation.timestamp,
156
+ type: operation.type,
157
+ input: operation.input,
158
+ skip: operation.skip,
159
+ context: operation.context,
160
+ id: operation.id,
161
+ }));
162
+ }
163
+ async getDrive(driveId) {
164
+ try {
165
+ const cachedDocument = await this.cache.getDocument("drives", driveId);
166
+ if (cachedDocument && isDocumentDrive(cachedDocument)) {
167
+ return cachedDocument;
168
+ }
169
+ }
170
+ catch (e) {
171
+ logger.error("Error getting drive from cache", e);
172
+ }
173
+ const driveStorage = await this.storage.getDrive(driveId);
174
+ const result = this._buildDocument(driveStorage);
175
+ if (!isDocumentDrive(result)) {
176
+ throw new Error(`Document with id ${driveId} is not a Document Drive`);
177
+ }
178
+ return result;
179
+ }
180
+ async getDocument(driveId, documentId) {
181
+ try {
182
+ const cachedDocument = await this.cache.getDocument(driveId, documentId);
183
+ if (cachedDocument) {
184
+ return cachedDocument;
185
+ }
186
+ }
187
+ catch (e) {
188
+ logger.error("Error getting document from cache", e);
189
+ }
190
+ const documentStorage = await this.storage.getDocument(driveId, documentId);
191
+ return this._buildDocument(documentStorage);
192
+ }
193
+ _buildDocument(documentStorage) {
194
+ const documentModelModule = this.getDocumentModelModule(documentStorage.documentType);
195
+ const operations = garbageCollectDocumentOperations(documentStorage.operations);
196
+ return replayDocument(documentStorage.initialState, operations, documentModelModule.reducer, undefined, documentStorage, undefined, {
197
+ checkHashes: true,
198
+ reuseOperationResultingState: true,
199
+ });
200
+ }
201
+ getDocumentModelModule(documentType) {
202
+ const documentModelModule = this.documentModelModules.find((m) => m.documentModel.id === documentType);
203
+ if (!documentModelModule) {
204
+ throw new Error(`Document type ${documentType} not supported`);
205
+ }
206
+ return documentModelModule;
207
+ }
208
+ getCombinedSyncUnitStatus(syncUnitStatus) {
209
+ if (!syncUnitStatus.pull && !syncUnitStatus.push)
210
+ return "INITIAL_SYNC";
211
+ if (syncUnitStatus.pull === "INITIAL_SYNC")
212
+ return "INITIAL_SYNC";
213
+ if (syncUnitStatus.push === "INITIAL_SYNC")
214
+ return syncUnitStatus.pull || "INITIAL_SYNC";
215
+ const order = [
216
+ "ERROR",
217
+ "MISSING",
218
+ "CONFLICT",
219
+ "SYNCING",
220
+ "SUCCESS",
221
+ ];
222
+ const sortedStatus = Object.values(syncUnitStatus).sort((a, b) => order.indexOf(a) - order.indexOf(b));
223
+ return sortedStatus[0];
224
+ }
225
+ getSyncStatus(syncUnitId) {
226
+ const status = this.syncStatus.get(syncUnitId);
227
+ if (!status) {
228
+ return new SynchronizationUnitNotFoundError(`Sync status not found for syncUnitId: ${syncUnitId}`, syncUnitId);
229
+ }
230
+ return this.getCombinedSyncUnitStatus(status);
231
+ }
232
+ updateSyncStatus(syncUnitId, status, error) {
233
+ if (status === null) {
234
+ this.syncStatus.delete(syncUnitId);
235
+ return;
236
+ }
237
+ const syncUnitStatus = this.syncStatus.get(syncUnitId);
238
+ if (!syncUnitStatus) {
239
+ this.initSyncStatus(syncUnitId, status);
240
+ return;
241
+ }
242
+ const shouldUpdateStatus = Object.entries(status).some(([key, _status]) => syncUnitStatus[key] !== _status);
243
+ if (shouldUpdateStatus) {
244
+ const newstatus = Object.entries(status).reduce((acc, [key, _status]) => {
245
+ return {
246
+ ...acc,
247
+ // do not replace initial_syncing if it has not finished yet
248
+ [key]: acc[key] === "INITIAL_SYNC" &&
249
+ _status === "SYNCING"
250
+ ? "INITIAL_SYNC"
251
+ : _status,
252
+ };
253
+ }, syncUnitStatus);
254
+ const previousCombinedStatus = this.getCombinedSyncUnitStatus(syncUnitStatus);
255
+ const newCombinedStatus = this.getCombinedSyncUnitStatus(newstatus);
256
+ this.syncStatus.set(syncUnitId, newstatus);
257
+ if (previousCombinedStatus !== newCombinedStatus && this.eventEmitter) {
258
+ this.eventEmitter.emit("syncStatus", syncUnitId, this.getCombinedSyncUnitStatus(newstatus), error, newstatus);
259
+ }
260
+ }
261
+ }
262
+ initSyncStatus(syncUnitId, status) {
263
+ const defaultSyncUnitStatus = Object.entries(status).reduce((acc, [key, _status]) => {
264
+ return {
265
+ ...acc,
266
+ [key]: _status !== "SYNCING" ? _status : "INITIAL_SYNC",
267
+ };
268
+ }, {});
269
+ this.syncStatus.set(syncUnitId, defaultSyncUnitStatus);
270
+ if (this.eventEmitter) {
271
+ this.eventEmitter.emit("syncStatus", syncUnitId, this.getCombinedSyncUnitStatus(defaultSyncUnitStatus), undefined, defaultSyncUnitStatus);
272
+ }
273
+ }
274
+ async initializeDriveSyncStatus(driveId, drive) {
275
+ const syncUnits = await this.getSynchronizationUnitsIds(driveId);
276
+ const syncStatus = {
277
+ pull: drive.state.local.triggers.length > 0 ? "INITIAL_SYNC" : undefined,
278
+ push: drive.state.local.listeners.length > 0 ? "SUCCESS" : undefined,
279
+ };
280
+ if (!syncStatus.pull && !syncStatus.push)
281
+ return;
282
+ const syncUnitsIds = [driveId, ...syncUnits.map((s) => s.syncId)];
283
+ for (const syncUnitId of syncUnitsIds) {
284
+ this.initSyncStatus(syncUnitId, syncStatus);
285
+ }
286
+ }
287
+ }
@@ -0,0 +1,308 @@
1
+ import { DocumentDriveAction, DocumentDriveDocument, DocumentDriveLocalState, DocumentDriveState, ListenerCallInfo, ListenerFilter, Trigger } from "#drive-document-model/gen/types";
2
+ import { IReadModeDriveServer } from "#read-mode/types";
3
+ import { IDefaultDrivesManager } from "#utils/default-drives-manager";
4
+ import { DriveInfo } from "#utils/graphql";
5
+ import { RunAsap } from "#utils/run-asap";
6
+ import { Action, ActionContext, BaseState, CreateChildDocumentInput, DocumentModelModule, Operation, OperationFromDocument, OperationScope, PHDocument, ReducerOptions, Signal } from "document-model";
7
+ import { Unsubscribe } from "nanoevents";
8
+ import { BaseDocumentDriveServer } from "./base-server.js";
9
+ import { OperationError, SynchronizationUnitNotFoundError } from "./error.js";
10
+ import { IInternalTransmitter, IReceiver } from "./listener/transmitter/internal.js";
11
+ import { ITransmitter, PullResponderTrigger, StrandUpdateSource } from "./listener/transmitter/types.js";
12
+ export type Constructor<T = object> = new (...args: any[]) => T;
13
+ export type Mixin<T extends Constructor, I> = T & Constructor<InstanceType<T> & I>;
14
+ export type DocumentDriveServerMixin<I> = Mixin<typeof BaseDocumentDriveServer, I>;
15
+ export type DriveInput = BaseState<Omit<DocumentDriveState, "__typename" | "id" | "nodes"> & {
16
+ id?: string;
17
+ }, DocumentDriveLocalState>;
18
+ export type RemoteDriveAccessLevel = "READ" | "WRITE";
19
+ export type RemoteDriveOptions = DocumentDriveLocalState & {
20
+ pullFilter?: ListenerFilter;
21
+ pullInterval?: number;
22
+ expectedDriveInfo?: DriveInfo;
23
+ accessLevel?: RemoteDriveAccessLevel;
24
+ };
25
+ export type CreateDocumentInput<TDocument extends PHDocument> = CreateChildDocumentInput<TDocument>;
26
+ export type SignalResult = {
27
+ signal: Signal;
28
+ result: unknown;
29
+ };
30
+ export type IOperationResult<TDocument extends PHDocument = PHDocument> = {
31
+ status: UpdateStatus;
32
+ error?: OperationError;
33
+ operations: OperationFromDocument<TDocument>[];
34
+ document: TDocument | undefined;
35
+ signals: SignalResult[];
36
+ };
37
+ export type DriveOperationResult = IOperationResult<DocumentDriveDocument>;
38
+ export type SynchronizationUnit = {
39
+ syncId: string;
40
+ driveId: string;
41
+ documentId: string;
42
+ documentType: string;
43
+ scope: string;
44
+ branch: string;
45
+ lastUpdated: string;
46
+ revision: number;
47
+ };
48
+ export type SynchronizationUnitQuery = Omit<SynchronizationUnit, "revision" | "lastUpdated">;
49
+ export type Listener = {
50
+ driveId: string;
51
+ listenerId: string;
52
+ label?: string;
53
+ block: boolean;
54
+ system: boolean;
55
+ filter: ListenerFilter;
56
+ callInfo?: ListenerCallInfo;
57
+ transmitter?: ITransmitter;
58
+ };
59
+ export type CreateListenerInput = {
60
+ driveId: string;
61
+ label?: string;
62
+ block: boolean;
63
+ system: boolean;
64
+ filter: ListenerFilter;
65
+ callInfo?: ListenerCallInfo;
66
+ };
67
+ export declare enum TransmitterType {
68
+ Internal = 0,
69
+ SwitchboardPush = 1,
70
+ PullResponder = 2,
71
+ SecureConnect = 3,
72
+ MatrixConnect = 4,
73
+ RESTWebhook = 5
74
+ }
75
+ export type ListenerRevision = {
76
+ driveId: string;
77
+ documentId: string;
78
+ scope: string;
79
+ branch: string;
80
+ status: UpdateStatus;
81
+ revision: number;
82
+ error?: string;
83
+ };
84
+ export type ListenerRevisionWithError = Omit<ListenerRevision, "error"> & {
85
+ error?: Error;
86
+ };
87
+ export type ListenerUpdate = {
88
+ listenerId: string;
89
+ listenerRevisions: ListenerRevision[];
90
+ };
91
+ export type UpdateStatus = "SUCCESS" | "CONFLICT" | "MISSING" | "ERROR";
92
+ export type ErrorStatus = Exclude<UpdateStatus, "SUCCESS">;
93
+ export type OperationUpdate = {
94
+ timestamp: string;
95
+ index: number;
96
+ skip: number;
97
+ type: string;
98
+ input: object;
99
+ hash: string;
100
+ context?: ActionContext;
101
+ id?: string;
102
+ };
103
+ export type StrandUpdate = {
104
+ driveId: string;
105
+ documentId: string;
106
+ scope: OperationScope;
107
+ branch: string;
108
+ operations: OperationUpdate[];
109
+ };
110
+ export type SyncStatus = "INITIAL_SYNC" | "SYNCING" | UpdateStatus;
111
+ export type PullSyncStatus = SyncStatus;
112
+ export type PushSyncStatus = SyncStatus;
113
+ export type SyncUnitStatusObject = {
114
+ push?: PushSyncStatus;
115
+ pull?: PullSyncStatus;
116
+ };
117
+ export type AddRemoteDriveStatus = "SUCCESS" | "ERROR" | "PENDING" | "ADDING" | "ALREADY_ADDED";
118
+ export interface DriveEvents {
119
+ syncStatus: (driveId: string, status: SyncStatus, error?: Error, syncUnitStatus?: SyncUnitStatusObject) => void;
120
+ defaultRemoteDrive: (status: AddRemoteDriveStatus, defaultDrives: Map<string, DefaultRemoteDriveInfo>, driveInput: DefaultRemoteDriveInput, driveId?: string, driveName?: string, error?: Error) => void;
121
+ strandUpdate: (update: StrandUpdate) => void;
122
+ clientStrandsError: (driveId: string, trigger: Trigger, status: number, errorMessage: string) => void;
123
+ documentModelModules: (documentModelModules: DocumentModelModule[]) => void;
124
+ driveAdded: (drive: DocumentDriveDocument) => void;
125
+ driveDeleted: (driveId: string) => void;
126
+ }
127
+ export type PartialRecord<K extends keyof any, T> = {
128
+ [P in K]?: T;
129
+ };
130
+ export type RevisionsFilter = PartialRecord<OperationScope, number>;
131
+ export type GetDocumentOptions = ReducerOptions & {
132
+ revisions?: RevisionsFilter;
133
+ checkHashes?: boolean;
134
+ };
135
+ export type AddOperationOptions = {
136
+ forceSync?: boolean;
137
+ source?: StrandUpdateSource;
138
+ };
139
+ export type DefaultRemoteDriveInput = {
140
+ url: string;
141
+ options: RemoteDriveOptions;
142
+ };
143
+ export type DefaultRemoteDriveInfo = DefaultRemoteDriveInput & {
144
+ status: AddRemoteDriveStatus;
145
+ metadata?: DriveInfo;
146
+ };
147
+ export type RemoveDriveStrategy = "remove" | "detach";
148
+ /**
149
+ * Options for removing old remote drives.
150
+ *
151
+ * Allows specifying different strategies for handling old remote drives:
152
+ *
153
+ * - `remove-all`: Remove all remote drives.
154
+ * - `preserve-all`: Preserve all remote drives (this is the default behavior).
155
+ * - `remove-by-id`: Remove the remote drives specified by their IDs.
156
+ * - `remove-by-url`: Remove the remote drives specified by their URLs.
157
+ * - `preserve-by-id`: Preserve remote drives by their IDs and remove the rest.
158
+ * - `preserve-by-url`: Preserve remote drives by their URLs and remove the rest.
159
+ * - `detach-by-id`: Detach remote drives by their IDs (changes the remote drive to a local drive).
160
+ * - `detach-by-url`: Detach remote drives by their URLs (changes the remote drive to a local drive).
161
+ * - `preserve-by-id-and-detach`: Preserve the remote drives specified by their IDs and detach the rest.
162
+ * - `preserve-by-url-and-detach`: Preserve the remote drives specified by their URLs and detach the rest.
163
+ *
164
+ * Each strategy is represented by an object with a `strategy` property and,
165
+ * depending on the strategy, additional properties such as `ids` or `urls`.
166
+ */
167
+ export type RemoveOldRemoteDrivesOption = {
168
+ strategy: "remove-all";
169
+ } | {
170
+ strategy: "preserve-all";
171
+ } | {
172
+ strategy: "remove-by-id";
173
+ ids: string[];
174
+ } | {
175
+ strategy: "remove-by-url";
176
+ urls: string[];
177
+ } | {
178
+ strategy: "preserve-by-id";
179
+ ids: string[];
180
+ } | {
181
+ strategy: "preserve-by-url";
182
+ urls: string[];
183
+ } | {
184
+ strategy: "detach-by-id";
185
+ ids: string[];
186
+ } | {
187
+ strategy: "detach-by-url";
188
+ urls: string[];
189
+ } | {
190
+ strategy: "preserve-by-id-and-detach";
191
+ ids: string[];
192
+ } | {
193
+ strategy: "preserve-by-url-and-detach";
194
+ urls: string[];
195
+ };
196
+ export type DocumentDriveServerOptions = {
197
+ defaultDrives: {
198
+ loadOnInit?: boolean;
199
+ remoteDrives?: Array<DefaultRemoteDriveInput>;
200
+ removeOldRemoteDrives?: RemoveOldRemoteDrivesOption;
201
+ };
202
+ taskQueueMethod?: RunAsap.RunAsap<unknown> | null;
203
+ listenerManager?: ListenerManagerOptions;
204
+ };
205
+ export type GetStrandsOptions = {
206
+ limit?: number;
207
+ since?: string;
208
+ fromRevision?: number;
209
+ };
210
+ export type ListenerManagerOptions = {
211
+ sequentialUpdates?: boolean;
212
+ };
213
+ export declare const DefaultListenerManagerOptions: {
214
+ sequentialUpdates: boolean;
215
+ };
216
+ export interface IBaseDocumentDriveServer {
217
+ initialize(): Promise<Error[] | null>;
218
+ setDocumentModelModules(models: DocumentModelModule[]): void;
219
+ getDrives(): Promise<string[]>;
220
+ addDrive(input: DriveInput, preferredEditor?: string): Promise<DocumentDriveDocument>;
221
+ addRemoteDrive(url: string, options: RemoteDriveOptions): Promise<DocumentDriveDocument>;
222
+ deleteDrive(driveId: string): Promise<void>;
223
+ getDrive(driveId: string, options?: GetDocumentOptions): Promise<DocumentDriveDocument>;
224
+ getDriveBySlug(slug: string): Promise<DocumentDriveDocument>;
225
+ getDocuments(driveId: string): Promise<string[]>;
226
+ getDocument<TDocument extends PHDocument>(driveId: string, documentId: string, options?: GetDocumentOptions): Promise<TDocument>;
227
+ addOperation(driveId: string, documentId: string, operation: Operation, options?: AddOperationOptions): Promise<IOperationResult>;
228
+ addOperations(driveId: string, documentId: string, operations: Operation[], options?: AddOperationOptions): Promise<IOperationResult>;
229
+ queueOperation(driveId: string, documentId: string, operation: Operation, options?: AddOperationOptions): Promise<IOperationResult>;
230
+ queueOperations(driveId: string, documentId: string, operations: Operation[], options?: AddOperationOptions): Promise<IOperationResult>;
231
+ queueAction(driveId: string, documentId: string, action: Action, options?: AddOperationOptions): Promise<IOperationResult>;
232
+ queueActions(driveId: string, documentId: string, actions: Action[], options?: AddOperationOptions): Promise<IOperationResult>;
233
+ addDriveOperation(driveId: string, operation: Operation<DocumentDriveAction>, options?: AddOperationOptions): Promise<DriveOperationResult>;
234
+ addDriveOperations(driveId: string, operations: Operation<DocumentDriveAction>[], options?: AddOperationOptions): Promise<DriveOperationResult>;
235
+ queueDriveOperation(driveId: string, operation: Operation<DocumentDriveAction>, options?: AddOperationOptions): Promise<DriveOperationResult>;
236
+ queueDriveOperations(driveId: string, operations: Operation<DocumentDriveAction>[], options?: AddOperationOptions): Promise<DriveOperationResult>;
237
+ queueDriveAction(driveId: string, action: DocumentDriveAction, options?: AddOperationOptions): Promise<IOperationResult>;
238
+ queueDriveActions(driveId: string, actions: DocumentDriveAction[], options?: AddOperationOptions): Promise<IOperationResult>;
239
+ addAction(driveId: string, documentId: string, action: Action, options?: AddOperationOptions): Promise<IOperationResult>;
240
+ addActions(driveId: string, documentId: string, actions: Action[], options?: AddOperationOptions): Promise<IOperationResult>;
241
+ addDriveAction(driveId: string, action: DocumentDriveAction, options?: AddOperationOptions): Promise<DriveOperationResult>;
242
+ addDriveActions(driveId: string, actions: DocumentDriveAction[], options?: AddOperationOptions): Promise<DriveOperationResult>;
243
+ getSyncStatus(syncUnitId: string): SyncStatus | SynchronizationUnitNotFoundError;
244
+ addInternalListener(driveId: string, receiver: IReceiver, options: {
245
+ listenerId: string;
246
+ label: string;
247
+ block: boolean;
248
+ filter: ListenerFilter;
249
+ }): Promise<IInternalTransmitter>;
250
+ /** Synchronization methods */
251
+ getSynchronizationUnits(driveId: string, documentId?: string[], scope?: string[], branch?: string[], documentType?: string[]): Promise<SynchronizationUnit[]>;
252
+ getSynchronizationUnit(driveId: string, syncId: string, loadedDrive?: DocumentDriveDocument): Promise<SynchronizationUnit | undefined>;
253
+ getSynchronizationUnitsIds(driveId: string, documentId?: string[], scope?: string[], branch?: string[], documentType?: string[]): Promise<SynchronizationUnitQuery[]>;
254
+ getOperationData(driveId: string, syncId: string, filter: GetStrandsOptions): Promise<OperationUpdate[]>;
255
+ /** Internal methods **/
256
+ getDocumentModelModules(): DocumentModelModule[];
257
+ getTransmitter(driveId: string, listenerId: string): Promise<ITransmitter | undefined>;
258
+ clearStorage(): Promise<void>;
259
+ registerPullResponderTrigger(id: string, url: string, options: Pick<RemoteDriveOptions, "pullFilter" | "pullInterval">): Promise<PullResponderTrigger>;
260
+ on<K extends keyof DriveEvents>(event: K, cb: DriveEvents[K]): Unsubscribe;
261
+ }
262
+ export type IDocumentDriveServer = IBaseDocumentDriveServer & IDefaultDrivesManager & IReadModeDriveServer;
263
+ export type DriveUpdateErrorHandler = (error: Error, driveId: string, listener: ListenerState) => void;
264
+ export interface IListenerManager {
265
+ initialize(handler: DriveUpdateErrorHandler): Promise<void>;
266
+ removeDrive(driveId: DocumentDriveState["id"]): Promise<void>;
267
+ driveHasListeners(driveId: string): boolean;
268
+ setListener(driveId: string, listener: Listener): Promise<void>;
269
+ removeListener(driveId: string, listenerId: string): Promise<boolean>;
270
+ getListenerState(driveId: string, listenerId: string): ListenerState;
271
+ getStrands(driveId: string, listenerId: string, options?: GetStrandsOptions): Promise<StrandUpdate[]>;
272
+ updateSynchronizationRevisions(driveId: string, syncUnits: SynchronizationUnit[], source: StrandUpdateSource, willUpdate?: (listeners: Listener[]) => void, onError?: (error: Error, driveId: string, listener: ListenerState) => void, forceSync?: boolean): Promise<ListenerUpdate[]>;
273
+ updateListenerRevision(listenerId: string, driveId: string, syncId: string, listenerRev: number): Promise<void>;
274
+ getListenerSyncUnitIds(driveId: string, listenerId: string): Promise<SynchronizationUnitQuery[]>;
275
+ removeSyncUnits(driveId: string, syncUnits: Pick<SynchronizationUnit, "syncId">[]): Promise<void>;
276
+ }
277
+ export type ListenerStatus = "CREATED" | "PENDING" | "SUCCESS" | "MISSING" | "CONFLICT" | "ERROR";
278
+ export interface ListenerState {
279
+ driveId: string;
280
+ block: boolean;
281
+ pendingTimeout: string;
282
+ listener: Listener;
283
+ syncUnits: Map<SynchronizationUnit["syncId"], SyncronizationUnitState>;
284
+ listenerStatus: ListenerStatus;
285
+ }
286
+ export interface SyncronizationUnitState {
287
+ listenerRev: number;
288
+ lastUpdated: string;
289
+ }
290
+ export interface ITransmitterFactory {
291
+ instance(transmitterType: string, listener: Listener, driveServer: IBaseDocumentDriveServer): ITransmitter;
292
+ }
293
+ export interface IEventEmitter {
294
+ emit<K extends keyof DriveEvents>(event: K, ...args: Parameters<DriveEvents[K]>): void;
295
+ on<K extends keyof DriveEvents>(event: K, cb: DriveEvents[K]): Unsubscribe;
296
+ }
297
+ export interface ISynchronizationManager {
298
+ getSynchronizationUnits(driveId: string, documentId?: string[], scope?: string[], branch?: string[], documentType?: string[]): Promise<SynchronizationUnit[]>;
299
+ getSynchronizationUnitsIds(driveId: string, documentId?: string[], scope?: string[], branch?: string[], documentType?: string[]): Promise<SynchronizationUnitQuery[]>;
300
+ getSynchronizationUnit(driveId: string, syncId: string): Promise<SynchronizationUnit | undefined>;
301
+ getOperationData(driveId: string, syncId: string, filter: GetStrandsOptions): Promise<OperationUpdate[]>;
302
+ getSynchronizationUnitsRevision(driveId: string, syncUnitsQuery: SynchronizationUnitQuery[]): Promise<SynchronizationUnit[]>;
303
+ getSyncStatus(syncUnitId: string): SyncStatus | SynchronizationUnitNotFoundError;
304
+ updateSyncStatus(syncUnitId: string, status: Partial<SyncUnitStatusObject> | null, error?: Error): void;
305
+ initializeDriveSyncStatus(driveId: string, drive: DocumentDriveDocument): Promise<void>;
306
+ getCombinedSyncUnitStatus(syncUnitStatus: SyncUnitStatusObject): SyncStatus;
307
+ }
308
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export var TransmitterType;
2
+ (function (TransmitterType) {
3
+ TransmitterType[TransmitterType["Internal"] = 0] = "Internal";
4
+ TransmitterType[TransmitterType["SwitchboardPush"] = 1] = "SwitchboardPush";
5
+ TransmitterType[TransmitterType["PullResponder"] = 2] = "PullResponder";
6
+ TransmitterType[TransmitterType["SecureConnect"] = 3] = "SecureConnect";
7
+ TransmitterType[TransmitterType["MatrixConnect"] = 4] = "MatrixConnect";
8
+ TransmitterType[TransmitterType["RESTWebhook"] = 5] = "RESTWebhook";
9
+ })(TransmitterType || (TransmitterType = {}));
10
+ export const DefaultListenerManagerOptions = {
11
+ sequentialUpdates: true,
12
+ };
@@ -0,0 +1,8 @@
1
+ import type { Action, DocumentOperations, PHDocument } from "document-model";
2
+ import { RevisionsFilter, StrandUpdate } from "./types.js";
3
+ export declare function buildRevisionsFilter(strands: StrandUpdate[], driveId: string, documentId: string): RevisionsFilter;
4
+ export declare function buildDocumentRevisionsFilter(document: PHDocument): RevisionsFilter;
5
+ export declare function filterOperationsByRevision<TAction extends Action = Action>(operations: DocumentOperations<TAction>, revisions?: RevisionsFilter): DocumentOperations<TAction>;
6
+ export declare function isAtRevision(document: PHDocument, revisions?: RevisionsFilter): boolean;
7
+ export declare function isAfterRevision(document: PHDocument, revisions?: RevisionsFilter): boolean;
8
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,kBAAkB,EAElB,UAAU,EACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,eAAe,CAQjB;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,UAAU,GACnB,eAAe,CAQjB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACxE,UAAU,EAAE,kBAAkB,CAAC,OAAO,CAAC,EACvC,SAAS,CAAC,EAAE,eAAe,GAC1B,kBAAkB,CAAC,OAAO,CAAC,CAgB7B;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,UAAU,EACpB,SAAS,CAAC,EAAE,eAAe,GAC1B,OAAO,CAWT;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,UAAU,EACpB,SAAS,CAAC,EAAE,eAAe,GAC1B,OAAO,CAYT"}