document-drive 1.19.0 → 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
@@ -1,341 +0,0 @@
1
- import {
2
- DefaultRemoteDriveInfo,
3
- DocumentDriveServerOptions,
4
- DriveEvents,
5
- IBaseDocumentDriveServer,
6
- IReadModeDriveServer,
7
- RemoteDriveAccessLevel,
8
- RemoveDriveStrategy,
9
- RemoveOldRemoteDrivesOption,
10
- } from "../server";
11
- import { DriveNotFoundError } from "../server/error";
12
- import { requestPublicDrive } from "./graphql";
13
- import { logger } from "./logger";
14
-
15
- export interface IServerDelegateDrivesManager {
16
- emit: (...args: Parameters<DriveEvents["defaultRemoteDrive"]>) => void;
17
- detachDrive: (driveId: string) => Promise<void>;
18
- }
19
-
20
- function isReadModeDriveServer(obj: unknown): obj is IReadModeDriveServer {
21
- return typeof (obj as IReadModeDriveServer).getReadDrives === "function";
22
- }
23
-
24
- export interface IDefaultDrivesManager {
25
- initializeDefaultRemoteDrives(): Promise<void>;
26
- getDefaultRemoteDrives(): Map<string, DefaultRemoteDriveInfo>;
27
- setDefaultDriveAccessLevel(
28
- url: string,
29
- level: RemoteDriveAccessLevel,
30
- ): Promise<void>;
31
- setAllDefaultDrivesAccessLevel(level: RemoteDriveAccessLevel): Promise<void>;
32
- }
33
-
34
- export class DefaultDrivesManager implements IDefaultDrivesManager {
35
- private defaultRemoteDrives = new Map<string, DefaultRemoteDriveInfo>();
36
- private removeOldRemoteDrivesConfig: RemoveOldRemoteDrivesOption;
37
-
38
- constructor(
39
- private server:
40
- | IBaseDocumentDriveServer
41
- | (IBaseDocumentDriveServer & IReadModeDriveServer),
42
- private delegate: IServerDelegateDrivesManager,
43
- options?: Pick<DocumentDriveServerOptions, "defaultDrives">,
44
- ) {
45
- if (options?.defaultDrives.remoteDrives) {
46
- for (const defaultDrive of options.defaultDrives.remoteDrives) {
47
- this.defaultRemoteDrives.set(defaultDrive.url, {
48
- ...defaultDrive,
49
- status: "PENDING",
50
- });
51
- }
52
- }
53
-
54
- this.removeOldRemoteDrivesConfig = options?.defaultDrives
55
- .removeOldRemoteDrives || {
56
- strategy: "preserve-all",
57
- };
58
- }
59
-
60
- getDefaultRemoteDrives() {
61
- return new Map(
62
- JSON.parse(
63
- JSON.stringify(Array.from(this.defaultRemoteDrives)),
64
- ) as Iterable<[string, DefaultRemoteDriveInfo]>,
65
- );
66
- }
67
-
68
- private async deleteDriveById(driveId: string) {
69
- try {
70
- await this.server.deleteDrive(driveId);
71
- } catch (error) {
72
- if (!(error instanceof DriveNotFoundError)) {
73
- logger.error(error);
74
- }
75
- }
76
- }
77
-
78
- private async preserveDrivesById(
79
- driveIdsToPreserve: string[],
80
- drives: string[],
81
- removeStrategy: RemoveDriveStrategy = "detach",
82
- ) {
83
- const getAllDrives = drives.map((driveId) => this.server.getDrive(driveId));
84
-
85
- const drivesToRemove = (await Promise.all(getAllDrives))
86
- .filter(
87
- (drive) =>
88
- drive.state.local.listeners.length > 0 ||
89
- drive.state.local.triggers.length > 0,
90
- )
91
- .filter((drive) => !driveIdsToPreserve.includes(drive.state.global.id));
92
-
93
- const driveIds = drivesToRemove.map((drive) => drive.state.global.id);
94
-
95
- if (removeStrategy === "detach") {
96
- await this.detachDrivesById(driveIds);
97
- } else {
98
- await this.removeDrivesById(driveIds);
99
- }
100
- }
101
-
102
- private async removeDrivesById(driveIds: string[]) {
103
- for (const driveId of driveIds) {
104
- await this.deleteDriveById(driveId);
105
- }
106
- }
107
-
108
- private async detachDrivesById(driveIds: string[]) {
109
- const detachDrivesPromises = driveIds.map((driveId) =>
110
- this.delegate.detachDrive(driveId),
111
- );
112
-
113
- await Promise.all(detachDrivesPromises);
114
- }
115
-
116
- async removeOldremoteDrives() {
117
- const driveids = await this.server.getDrives();
118
-
119
- switch (this.removeOldRemoteDrivesConfig.strategy) {
120
- case "preserve-by-id-and-detach":
121
- case "preserve-by-id": {
122
- const detach: RemoveDriveStrategy =
123
- this.removeOldRemoteDrivesConfig.strategy ===
124
- "preserve-by-id-and-detach"
125
- ? "detach"
126
- : "remove";
127
-
128
- await this.preserveDrivesById(
129
- this.removeOldRemoteDrivesConfig.ids,
130
- driveids,
131
- detach,
132
- );
133
- break;
134
- }
135
- case "preserve-by-url-and-detach":
136
- case "preserve-by-url": {
137
- const detach: RemoveDriveStrategy =
138
- this.removeOldRemoteDrivesConfig.strategy ===
139
- "preserve-by-url-and-detach"
140
- ? "detach"
141
- : "remove";
142
-
143
- const getDrivesInfo = this.removeOldRemoteDrivesConfig.urls.map((url) =>
144
- requestPublicDrive(url),
145
- );
146
-
147
- const drivesIdsToPreserve = (await Promise.all(getDrivesInfo)).map(
148
- (driveInfo) => driveInfo.id,
149
- );
150
-
151
- await this.preserveDrivesById(drivesIdsToPreserve, driveids, detach);
152
- break;
153
- }
154
- case "remove-by-id": {
155
- const drivesIdsToRemove = this.removeOldRemoteDrivesConfig.ids.filter(
156
- (driveId) => driveids.includes(driveId),
157
- );
158
-
159
- await this.removeDrivesById(drivesIdsToRemove);
160
- break;
161
- }
162
- case "remove-by-url": {
163
- const getDrivesInfo = this.removeOldRemoteDrivesConfig.urls.map(
164
- (driveUrl) => requestPublicDrive(driveUrl),
165
- );
166
- const drivesInfo = await Promise.all(getDrivesInfo);
167
-
168
- const drivesIdsToRemove = drivesInfo
169
- .map((driveInfo) => driveInfo.id)
170
- .filter((driveId) => driveids.includes(driveId));
171
-
172
- await this.removeDrivesById(drivesIdsToRemove);
173
- break;
174
- }
175
- case "remove-all": {
176
- const getDrives = driveids.map((driveId) =>
177
- this.server.getDrive(driveId),
178
- );
179
- const drives = await Promise.all(getDrives);
180
- const drivesToRemove = drives
181
- .filter(
182
- (drive) =>
183
- drive.state.local.listeners.length > 0 ||
184
- drive.state.local.triggers.length > 0,
185
- )
186
- .map((drive) => drive.state.global.id);
187
-
188
- await this.removeDrivesById(drivesToRemove);
189
- break;
190
- }
191
- case "detach-by-id": {
192
- const drivesIdsToRemove = this.removeOldRemoteDrivesConfig.ids.filter(
193
- (driveId) => driveids.includes(driveId),
194
- );
195
- const detachDrivesPromises = drivesIdsToRemove.map((driveId) =>
196
- this.delegate.detachDrive(driveId),
197
- );
198
-
199
- await Promise.all(detachDrivesPromises);
200
- break;
201
- }
202
- case "detach-by-url": {
203
- const getDrivesInfo = this.removeOldRemoteDrivesConfig.urls.map(
204
- (driveUrl) => requestPublicDrive(driveUrl),
205
- );
206
- const drivesInfo = await Promise.all(getDrivesInfo);
207
-
208
- const drivesIdsToRemove = drivesInfo
209
- .map((driveInfo) => driveInfo.id)
210
- .filter((driveId) => driveids.includes(driveId));
211
-
212
- const detachDrivesPromises = drivesIdsToRemove.map((driveId) =>
213
- this.delegate.detachDrive(driveId),
214
- );
215
-
216
- await Promise.all(detachDrivesPromises);
217
- break;
218
- }
219
- }
220
- }
221
-
222
- async setAllDefaultDrivesAccessLevel(level: RemoteDriveAccessLevel) {
223
- const drives = this.defaultRemoteDrives.values();
224
- for (const drive of drives) {
225
- await this.setDefaultDriveAccessLevel(drive.url, level);
226
- }
227
- }
228
-
229
- async setDefaultDriveAccessLevel(url: string, level: RemoteDriveAccessLevel) {
230
- const drive = this.defaultRemoteDrives.get(url);
231
- if (drive && drive.options.accessLevel !== level) {
232
- const newDriveValue = {
233
- ...drive,
234
- options: { ...drive.options, accessLevel: level },
235
- };
236
- this.defaultRemoteDrives.set(url, newDriveValue);
237
- await this.initializeDefaultRemoteDrives([newDriveValue]);
238
- }
239
- }
240
-
241
- async initializeDefaultRemoteDrives(
242
- defaultDrives: DefaultRemoteDriveInfo[] = Array.from(
243
- this.defaultRemoteDrives.values(),
244
- ),
245
- ) {
246
- const drives = await this.server.getDrives();
247
- const readServer = isReadModeDriveServer(this.server)
248
- ? (this.server as IReadModeDriveServer)
249
- : undefined;
250
- const readDrives = await readServer?.getReadDrives();
251
-
252
- for (const remoteDrive of defaultDrives) {
253
- let remoteDriveInfo = { ...remoteDrive };
254
-
255
- try {
256
- const driveInfo =
257
- remoteDrive.metadata ?? (await requestPublicDrive(remoteDrive.url));
258
-
259
- remoteDriveInfo = { ...remoteDrive, metadata: driveInfo };
260
-
261
- this.defaultRemoteDrives.set(remoteDrive.url, remoteDriveInfo);
262
-
263
- const driveIsAdded = drives.includes(driveInfo.id);
264
- const readDriveIsAdded = readDrives?.includes(driveInfo.id);
265
-
266
- const hasAccessLevel = remoteDrive.options.accessLevel !== undefined;
267
- const readMode =
268
- readServer && remoteDrive.options.accessLevel === "READ";
269
- const isAdded = readMode ? readDriveIsAdded : driveIsAdded;
270
-
271
- // if the read mode has changed then existing drives
272
- // in the previous mode should be deleted
273
- const driveToDelete =
274
- hasAccessLevel && (readMode ? driveIsAdded : readDriveIsAdded);
275
- if (driveToDelete) {
276
- try {
277
- await (readMode
278
- ? this.server.deleteDrive(driveInfo.id)
279
- : readServer?.deleteReadDrive(driveInfo.id));
280
- } catch (e) {
281
- logger.error(e);
282
- }
283
- }
284
-
285
- if (isAdded) {
286
- remoteDriveInfo.status = "ALREADY_ADDED";
287
-
288
- this.defaultRemoteDrives.set(remoteDrive.url, remoteDriveInfo);
289
- this.delegate.emit(
290
- "ALREADY_ADDED",
291
- this.defaultRemoteDrives,
292
- remoteDriveInfo,
293
- driveInfo.id,
294
- driveInfo.name,
295
- );
296
- continue;
297
- }
298
-
299
- remoteDriveInfo.status = "ADDING";
300
-
301
- this.defaultRemoteDrives.set(remoteDrive.url, remoteDriveInfo);
302
- this.delegate.emit("ADDING", this.defaultRemoteDrives, remoteDriveInfo);
303
-
304
- if ((!hasAccessLevel && readServer) || readMode) {
305
- await readServer.addReadDrive(remoteDrive.url, {
306
- ...remoteDrive.options,
307
- expectedDriveInfo: driveInfo,
308
- });
309
- } else {
310
- await this.server.addRemoteDrive(remoteDrive.url, {
311
- ...remoteDrive.options,
312
- expectedDriveInfo: driveInfo,
313
- });
314
- }
315
-
316
- remoteDriveInfo.status = "SUCCESS";
317
-
318
- this.defaultRemoteDrives.set(remoteDrive.url, remoteDriveInfo);
319
- this.delegate.emit(
320
- "SUCCESS",
321
- this.defaultRemoteDrives,
322
- remoteDriveInfo,
323
- driveInfo.id,
324
- driveInfo.name,
325
- );
326
- } catch (error) {
327
- remoteDriveInfo.status = "ERROR";
328
-
329
- this.defaultRemoteDrives.set(remoteDrive.url, remoteDriveInfo);
330
- this.delegate.emit(
331
- "ERROR",
332
- this.defaultRemoteDrives,
333
- remoteDriveInfo,
334
- undefined,
335
- undefined,
336
- error as Error,
337
- );
338
- }
339
- }
340
- }
341
- }
@@ -1,21 +0,0 @@
1
- import { utils } from "document-model/document";
2
-
3
- export const {
4
- attachBranch,
5
- garbageCollect,
6
- groupOperationsByScope,
7
- merge,
8
- split,
9
- precedes,
10
- removeExistingOperations,
11
- reshuffleByTimestamp,
12
- sortOperations,
13
- addUndo,
14
- checkOperationsIntegrity,
15
- checkCleanedOperationsIntegrity,
16
- reshuffleByTimestampAndIndex,
17
- nextSkipNumber,
18
- prepareOperations,
19
- IntegrityIssueSubType,
20
- IntegrityIssueType,
21
- } = utils.documentHelpers;
@@ -1,301 +0,0 @@
1
- import { pascalCase } from "change-case";
2
- import {
3
- DocumentDriveLocalState,
4
- FileNode,
5
- FolderNode,
6
- } from "document-model-libs/document-drive";
7
- import { Document, DocumentModel, Operation } from "document-model/document";
8
- import { DocumentModelState } from "document-model/document-model";
9
- import {
10
- BuildSchemaOptions,
11
- GraphQLError,
12
- GraphQLList,
13
- GraphQLNonNull,
14
- GraphQLObjectType,
15
- GraphQLOutputType,
16
- GraphQLScalarType,
17
- GraphQLUnionType,
18
- ParseOptions,
19
- buildSchema,
20
- } from "graphql";
21
- import request, { GraphQLClient, gql } from "graphql-request";
22
- import {
23
- InferDocumentLocalState,
24
- InferDocumentOperation,
25
- InferDocumentState,
26
- } from "../read-mode/types";
27
- import { logger } from "./logger";
28
-
29
- export { gql } from "graphql-request";
30
-
31
- type ReqGraphQLError = {
32
- message: string;
33
- };
34
-
35
- export type GraphQLResult<T> = { [K in keyof T]: T[K] | null } & {
36
- errors?: GraphQLError[];
37
- };
38
-
39
- // replaces fetch so it can be used in Node and Browser envs
40
- export async function requestGraphql<T>(
41
- ...args: Parameters<typeof request>
42
- ): Promise<GraphQLResult<T>> {
43
- const [url, ...requestArgs] = args;
44
- const client = new GraphQLClient(url, { fetch });
45
- const { errors, ...response } = await client.request<
46
- { [K in keyof T]: T[K] | null } & { errors?: ReqGraphQLError[] }
47
- >(...requestArgs);
48
-
49
- const result = { ...response } as GraphQLResult<T>;
50
- if (errors?.length) {
51
- result.errors = errors.map(
52
- ({ message, ...options }) => new GraphQLError(message, options),
53
- );
54
- }
55
- return result;
56
- }
57
-
58
- export type DriveInfo = {
59
- id: string;
60
- name: string;
61
- slug: string;
62
- icon?: string;
63
- };
64
-
65
- function getFields(type: GraphQLOutputType): string {
66
- if (type instanceof GraphQLObjectType) {
67
- return Object.entries(type.getFields())
68
- .map(([fieldName, field]) => {
69
- const fieldType =
70
- field.type instanceof GraphQLNonNull ? field.type.ofType : field.type;
71
-
72
- if (
73
- fieldType instanceof GraphQLObjectType ||
74
- fieldType instanceof GraphQLUnionType
75
- ) {
76
- return `${fieldName} { ${getFields(fieldType)} }`;
77
- }
78
-
79
- if (fieldType instanceof GraphQLList) {
80
- const listItemType =
81
- fieldType.ofType instanceof GraphQLNonNull
82
- ? fieldType.ofType.ofType
83
- : fieldType.ofType;
84
-
85
- if (listItemType instanceof GraphQLScalarType) {
86
- return fieldName;
87
- } else if (
88
- listItemType instanceof GraphQLObjectType ||
89
- listItemType instanceof GraphQLUnionType
90
- ) {
91
- return `${fieldName} { ${getFields(listItemType)} }`;
92
- } else {
93
- throw new Error(
94
- `List item type ${listItemType.toString()} is not handled`,
95
- );
96
- }
97
- }
98
-
99
- return fieldName;
100
- })
101
- .join(" ");
102
- } else if (type instanceof GraphQLUnionType) {
103
- return type
104
- .getTypes()
105
- .map((unionType) => {
106
- return `... on ${unionType.name} { ${getFields(unionType)} }`;
107
- })
108
- .join(" ");
109
- }
110
- return "";
111
- }
112
-
113
- export function generateDocumentStateQueryFields(
114
- documentModel: DocumentModelState,
115
- options?: BuildSchemaOptions & ParseOptions,
116
- ): string {
117
- const name = pascalCase(documentModel.name);
118
- const spec = documentModel.specifications.at(-1);
119
- if (!spec) {
120
- throw new Error("No document model specification found");
121
- }
122
- const source = `${spec.state.global.schema} type Query { ${name}: ${name}State }`;
123
- const schema = buildSchema(source, options);
124
- const queryType = schema.getQueryType();
125
- if (!queryType) {
126
- throw new Error("No query type found");
127
- }
128
- const fields = queryType.getFields();
129
- const stateQuery = fields[name];
130
-
131
- if (!stateQuery) {
132
- throw new Error("No state query found");
133
- }
134
-
135
- const queryFields = getFields(stateQuery.type);
136
- return queryFields;
137
- }
138
-
139
- export async function requestPublicDrive(url: string): Promise<DriveInfo> {
140
- let drive: DriveInfo;
141
- try {
142
- const result = await requestGraphql<{ drive: DriveInfo }>(
143
- url,
144
- gql`
145
- query getDrive {
146
- drive {
147
- id
148
- name
149
- icon
150
- slug
151
- }
152
- }
153
- `,
154
- );
155
- if (result.errors?.length || !result.drive) {
156
- throw result.errors?.at(0) ?? new Error("Drive not found");
157
- }
158
- drive = result.drive;
159
- } catch (e) {
160
- logger.error(e);
161
- throw new Error("Couldn't find drive info");
162
- }
163
-
164
- return drive;
165
- }
166
-
167
- export type DriveState = DriveInfo &
168
- Pick<DocumentDriveLocalState, "availableOffline" | "sharingType"> & {
169
- nodes: Array<FolderNode | Omit<FileNode, "synchronizationUnits">>;
170
- };
171
-
172
- export type DocumentGraphQLResult<D extends Document> = Pick<
173
- D,
174
- "name" | "created" | "documentType" | "lastModified"
175
- > & {
176
- id: string;
177
- revision: number;
178
- state: InferDocumentState<D>;
179
- initialState: InferDocumentState<D>;
180
- operations: (Pick<
181
- Operation,
182
- | "id"
183
- | "hash"
184
- | "index"
185
- | "skip"
186
- | "timestamp"
187
- | "type"
188
- | "error"
189
- | "context"
190
- > & { inputText: string })[];
191
- };
192
-
193
- export async function fetchDocument<D extends Document>(
194
- url: string,
195
- documentId: string,
196
- documentModelLib: DocumentModel<
197
- InferDocumentState<D>,
198
- InferDocumentOperation<D>,
199
- InferDocumentLocalState<D>
200
- >,
201
- ): Promise<
202
- GraphQLResult<{
203
- document: Document<
204
- InferDocumentState<D>,
205
- InferDocumentOperation<D>,
206
- InferDocumentLocalState<D>
207
- >;
208
- }>
209
- > {
210
- const { documentModel, utils } = documentModelLib;
211
- const stateFields = generateDocumentStateQueryFields(documentModel);
212
- const name = pascalCase(documentModel.name);
213
- const result = await requestGraphql<{
214
- document: DocumentGraphQLResult<D>;
215
- }>(
216
- url,
217
- gql`
218
- query ($id: String!) {
219
- document(id: $id) {
220
- id
221
- name
222
- created
223
- documentType
224
- lastModified
225
- revision
226
- operations {
227
- id
228
- error
229
- hash
230
- index
231
- skip
232
- timestamp
233
- type
234
- inputText
235
- context {
236
- signer {
237
- user {
238
- address
239
- networkId
240
- chainId
241
- }
242
- app {
243
- name
244
- key
245
- }
246
- signatures
247
- }
248
- }
249
- }
250
- ... on ${name} {
251
- state {
252
- ${stateFields}
253
- }
254
- initialState {
255
- ${stateFields}
256
- }
257
- }
258
- }
259
- }
260
- `,
261
- { id: documentId },
262
- );
263
- const document: Document<
264
- InferDocumentState<D>,
265
- InferDocumentOperation<D>,
266
- InferDocumentLocalState<D>
267
- > | null = result.document
268
- ? {
269
- ...result.document,
270
- revision: {
271
- global: result.document.revision,
272
- local: 0,
273
- },
274
- state: utils.createState({ global: result.document.state }),
275
- operations: {
276
- global: result.document.operations.map(({ inputText, ...o }) => ({
277
- ...o,
278
- error: o.error ?? undefined,
279
- scope: "global",
280
- input: JSON.parse(inputText) as D,
281
- })),
282
- local: [],
283
- },
284
- attachments: {},
285
- initialState: utils.createExtendedState({
286
- // TODO: getDocument should return all the initial state fields
287
- created: result.document.created,
288
- lastModified: result.document.created,
289
- state: utils.createState({
290
- global: result.document.initialState,
291
- }),
292
- }),
293
- clipboard: [],
294
- }
295
- : null;
296
-
297
- return {
298
- ...result,
299
- document,
300
- };
301
- }