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,79 +0,0 @@
1
- import { Action, Operation } from "document-model/document";
2
- import type { Unsubscribe } from "nanoevents";
3
- import { AddOperationOptions, IOperationResult } from "../server";
4
-
5
- export interface BaseJob {
6
- driveId: string;
7
- documentId?: string;
8
- actions?: Action[];
9
- options?: AddOperationOptions;
10
- }
11
-
12
- export interface OperationJob extends BaseJob {
13
- operations: Operation[];
14
- }
15
-
16
- export interface ActionJob extends BaseJob {
17
- actions: Action[];
18
- }
19
-
20
- export type Job = OperationJob | ActionJob;
21
-
22
- export type JobId = string;
23
-
24
- export interface QueueEvents {
25
- jobCompleted: (job: IJob<Job>, result: IOperationResult) => void;
26
- jobFailed: (job: IJob<Job>, error: Error) => void;
27
- queueRemoved: (queueId: string) => void;
28
- }
29
-
30
- export interface IServerDelegate {
31
- checkDocumentExists: (
32
- driveId: string,
33
- documentId: string,
34
- ) => Promise<boolean>;
35
- processJob: (job: Job) => Promise<IOperationResult>;
36
- }
37
-
38
- export interface IQueueManager {
39
- addJob(job: Job): Promise<JobId>;
40
- getQueue(driveId: string, document?: string): IQueue<Job, IOperationResult>;
41
- removeQueue(driveId: string, documentId?: string): void;
42
- getQueueByIndex(index: number): IQueue<Job, IOperationResult> | null;
43
- getQueues(): string[];
44
- init(
45
- delegate: IServerDelegate,
46
- onError: (error: Error) => void,
47
- ): Promise<void>;
48
- on<K extends keyof QueueEvents>(
49
- this: this,
50
- event: K,
51
- cb: QueueEvents[K],
52
- ): Unsubscribe;
53
- }
54
-
55
- export type IJob<T> = { jobId: JobId } & T;
56
-
57
- export interface IQueue<T, R> {
58
- addJob(data: IJob<T>): Promise<void>;
59
- getNextJob(): Promise<IJob<T> | undefined>;
60
- amountOfJobs(): Promise<number>;
61
- getId(): string;
62
- setBlocked(blocked: boolean): Promise<void>;
63
- isBlocked(): Promise<boolean>;
64
- isDeleted(): Promise<boolean>;
65
- setDeleted(deleted: boolean): Promise<void>;
66
- getJobs(): Promise<IJob<T>[]>;
67
- addDependencies(job: IJob<Job>): Promise<void>;
68
- removeDependencies(job: IJob<Job>): Promise<void>;
69
- }
70
-
71
- export type IJobQueue = IQueue<Job, IOperationResult>;
72
-
73
- export function isOperationJob(job: Job): job is OperationJob {
74
- return "operations" in job;
75
- }
76
-
77
- export function isActionJob(job: Job): job is ActionJob {
78
- return "actions" in job;
79
- }
@@ -1,19 +0,0 @@
1
- export abstract class ReadDriveError extends Error {}
2
-
3
- export class ReadDriveNotFoundError extends ReadDriveError {
4
- constructor(driveId: string) {
5
- super(`Read drive ${driveId} not found.`);
6
- }
7
- }
8
-
9
- export class ReadDriveSlugNotFoundError extends ReadDriveError {
10
- constructor(slug: string) {
11
- super(`Read drive with slug ${slug} not found.`);
12
- }
13
- }
14
-
15
- export class ReadDocumentNotFoundError extends ReadDriveError {
16
- constructor(drive: string, id: string) {
17
- super(`Document with id ${id} not found on read drive ${drive}.`);
18
- }
19
- }
@@ -1,125 +0,0 @@
1
- import { Document } from "document-model/document";
2
- import { DocumentDriveServerConstructor, RemoteDriveOptions } from "../server";
3
- import { logger } from "../utils/logger";
4
- import { ReadDriveSlugNotFoundError } from "./errors";
5
- import { ReadModeService } from "./service";
6
- import {
7
- IReadModeDriveServer,
8
- IReadModeDriveService,
9
- ReadDrive,
10
- ReadDriveOptions,
11
- ReadDrivesListener,
12
- ReadModeDriveServerMixin,
13
- } from "./types";
14
-
15
- export * from "./errors";
16
- export * from "./types";
17
-
18
- export function ReadModeServer<TBase extends DocumentDriveServerConstructor>(
19
- Base: TBase,
20
- ): ReadModeDriveServerMixin {
21
- return class ReadMode extends Base implements IReadModeDriveServer {
22
- #readModeStorage: IReadModeDriveService;
23
- #listeners = new Set<ReadDrivesListener>();
24
-
25
- constructor(...args: any[]) {
26
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
27
- super(...args);
28
-
29
- this.#readModeStorage = new ReadModeService(
30
- this.getDocumentModel.bind(this),
31
- );
32
-
33
- this.#buildDrives()
34
- .then((drives) => {
35
- if (drives.length) {
36
- this.#notifyListeners(drives, "add");
37
- }
38
- })
39
- .catch(logger.error);
40
- }
41
-
42
- async #buildDrives() {
43
- const driveIds = await this.getReadDrives();
44
- const drives = (
45
- await Promise.all(driveIds.map((driveId) => this.getReadDrive(driveId)))
46
- ).filter((drive) => !(drive instanceof Error)) as ReadDrive[];
47
- return drives;
48
- }
49
-
50
- #notifyListeners(drives: ReadDrive[], operation: "add" | "delete") {
51
- this.#listeners.forEach((listener) => listener(drives, operation));
52
- }
53
-
54
- getReadDrives(): Promise<string[]> {
55
- return this.#readModeStorage.getReadDrives();
56
- }
57
-
58
- getReadDrive(id: string) {
59
- return this.#readModeStorage.getReadDrive(id);
60
- }
61
-
62
- getReadDriveBySlug(
63
- slug: string,
64
- ): Promise<ReadDrive | ReadDriveSlugNotFoundError> {
65
- return this.#readModeStorage.getReadDriveBySlug(slug);
66
- }
67
-
68
- getReadDriveContext(id: string) {
69
- return this.#readModeStorage.getReadDriveContext(id);
70
- }
71
-
72
- async addReadDrive(url: string, options?: ReadDriveOptions) {
73
- await this.#readModeStorage.addReadDrive(url, options);
74
- this.#notifyListeners(await this.#buildDrives(), "add");
75
- }
76
-
77
- fetchDrive(id: string) {
78
- return this.#readModeStorage.fetchDrive(id);
79
- }
80
-
81
- fetchDocument<D extends Document>(
82
- driveId: string,
83
- documentId: string,
84
- documentType: string,
85
- ) {
86
- return this.#readModeStorage.fetchDocument<D>(
87
- driveId,
88
- documentId,
89
- documentType,
90
- );
91
- }
92
-
93
- async deleteReadDrive(id: string) {
94
- const error = await this.#readModeStorage.deleteReadDrive(id);
95
- if (error) {
96
- return error;
97
- }
98
-
99
- this.#notifyListeners(await this.#buildDrives(), "delete");
100
- }
101
-
102
- async migrateReadDrive(id: string, options: RemoteDriveOptions) {
103
- const result = await this.getReadDriveContext(id);
104
- if (result instanceof Error) {
105
- return result;
106
- }
107
-
108
- const { url, ...readOptions } = result;
109
- try {
110
- const newDrive = await this.addRemoteDrive(url, options);
111
- return newDrive;
112
- } catch (error) {
113
- // if an error is thrown, then add the read drive again
114
- logger.error(error);
115
- await this.addReadDrive(result.url, readOptions);
116
- throw error;
117
- }
118
- }
119
-
120
- onReadDrivesUpdate(listener: ReadDrivesListener) {
121
- this.#listeners.add(listener);
122
- return Promise.resolve(() => this.#listeners.delete(listener));
123
- }
124
- };
125
- }
@@ -1,207 +0,0 @@
1
- import type { DocumentDriveDocument } from "document-model-libs/document-drive";
2
- import * as DocumentDrive from "document-model-libs/document-drive";
3
- import { Document, DocumentModel } from "document-model/document";
4
- import { GraphQLError } from "graphql";
5
- import { DocumentModelNotFoundError } from "../server/error";
6
- import { fetchDocument, requestPublicDrive } from "../utils/graphql";
7
- import {
8
- ReadDocumentNotFoundError,
9
- ReadDriveError,
10
- ReadDriveNotFoundError,
11
- ReadDriveSlugNotFoundError,
12
- } from "./errors";
13
- import {
14
- GetDocumentModel,
15
- InferDocumentLocalState,
16
- InferDocumentOperation,
17
- InferDocumentState,
18
- IReadModeDriveService,
19
- ReadDrive,
20
- ReadDriveContext,
21
- ReadDriveOptions,
22
- } from "./types";
23
-
24
- export class ReadModeService implements IReadModeDriveService {
25
- #getDocumentModel: GetDocumentModel;
26
- #drives = new Map<
27
- string,
28
- { drive: Omit<ReadDrive, "readContext">; context: ReadDriveContext }
29
- >();
30
-
31
- constructor(getDocumentModel: GetDocumentModel) {
32
- this.#getDocumentModel = getDocumentModel;
33
- }
34
-
35
- #parseGraphQLErrors(
36
- errors: GraphQLError[],
37
- driveId: string,
38
- documentId?: string,
39
- ) {
40
- for (const error of errors) {
41
- if (error.message === `Drive with id ${driveId} not found`) {
42
- return new ReadDriveNotFoundError(driveId);
43
- } else if (
44
- documentId &&
45
- error.message === `Document with id ${documentId} not found`
46
- ) {
47
- return new ReadDocumentNotFoundError(driveId, documentId);
48
- }
49
- }
50
- const firstError = errors.at(0);
51
- if (firstError) {
52
- return firstError;
53
- }
54
- }
55
-
56
- async #fetchDrive(id: string, url: string) {
57
- const { errors, document } = await fetchDocument<DocumentDriveDocument>(
58
- url,
59
- id,
60
- DocumentDrive,
61
- );
62
- const error = errors ? this.#parseGraphQLErrors(errors, id) : undefined;
63
- return error || document;
64
- }
65
-
66
- async fetchDrive(id: string): Promise<ReadDrive | ReadDriveNotFoundError> {
67
- const drive = this.#drives.get(id);
68
- if (!drive) {
69
- return new ReadDriveNotFoundError(id);
70
- }
71
- const document = await this.fetchDocument<DocumentDriveDocument>(
72
- id,
73
- id,
74
- DocumentDrive.documentModel.id,
75
- );
76
- if (document instanceof Error) {
77
- return document;
78
- }
79
- const result = { ...document, readContext: drive.context };
80
- drive.drive = result;
81
- return result;
82
- }
83
-
84
- async fetchDocument<D extends Document>(
85
- driveId: string,
86
- documentId: string,
87
- documentType: DocumentModel<
88
- InferDocumentState<D>,
89
- InferDocumentOperation<D>,
90
- InferDocumentLocalState<D>
91
- >["documentModel"]["id"],
92
- ): Promise<
93
- | Document<
94
- InferDocumentState<D>,
95
- InferDocumentOperation<D>,
96
- InferDocumentLocalState<D>
97
- >
98
- | DocumentModelNotFoundError
99
- | ReadDriveNotFoundError
100
- | ReadDocumentNotFoundError
101
- > {
102
- const drive = this.#drives.get(driveId);
103
- if (!drive) {
104
- return new ReadDriveNotFoundError(driveId);
105
- }
106
-
107
- let documentModel:
108
- | DocumentModel<
109
- InferDocumentState<D>,
110
- InferDocumentOperation<D>,
111
- InferDocumentLocalState<D>
112
- >
113
- | undefined = undefined;
114
- try {
115
- documentModel = this.#getDocumentModel(
116
- documentType,
117
- ) as unknown as DocumentModel<
118
- InferDocumentState<D>,
119
- InferDocumentOperation<D>,
120
- InferDocumentLocalState<D>
121
- >;
122
- } catch (error) {
123
- return new DocumentModelNotFoundError(documentType, error);
124
- }
125
-
126
- const { url } = drive.context;
127
- const { errors, document } = await fetchDocument<D>(
128
- url,
129
- documentId,
130
- documentModel,
131
- );
132
-
133
- if (errors) {
134
- const error = this.#parseGraphQLErrors(errors, driveId, documentId);
135
- if (error instanceof ReadDriveError) {
136
- return error;
137
- } else if (error) {
138
- throw error;
139
- }
140
- }
141
-
142
- if (!document) {
143
- return new ReadDocumentNotFoundError(driveId, documentId);
144
- }
145
-
146
- return document;
147
- }
148
-
149
- async addReadDrive(url: string, options?: ReadDriveOptions): Promise<void> {
150
- const { id } =
151
- options?.expectedDriveInfo ?? (await requestPublicDrive(url));
152
-
153
- const result = await this.#fetchDrive(id, url);
154
- if (result instanceof Error) {
155
- throw result;
156
- } else if (!result) {
157
- throw new Error(`Drive "${id}" not found at ${url}`);
158
- }
159
- this.#drives.set(id, {
160
- drive: result as unknown as ReadDrive,
161
- context: {
162
- ...options,
163
- url,
164
- },
165
- });
166
- }
167
-
168
- async getReadDrives() {
169
- return Promise.resolve([...this.#drives.keys()]);
170
- }
171
-
172
- async getReadDrive(id: string) {
173
- const result = this.#drives.get(id);
174
- return Promise.resolve(
175
- result
176
- ? { ...result.drive, readContext: result.context }
177
- : new ReadDriveNotFoundError(id),
178
- );
179
- }
180
-
181
- async getReadDriveBySlug(
182
- slug: string,
183
- ): Promise<ReadDrive | ReadDriveSlugNotFoundError> {
184
- const readDrive = [...this.#drives.values()].find(
185
- ({ drive }) => drive.state.global.slug === slug,
186
- );
187
-
188
- return Promise.resolve(
189
- readDrive
190
- ? { ...readDrive.drive, readContext: readDrive.context }
191
- : new ReadDriveSlugNotFoundError(slug),
192
- );
193
- }
194
-
195
- getReadDriveContext(id: string) {
196
- return Promise.resolve(
197
- this.#drives.get(id)?.context ?? new ReadDriveNotFoundError(id),
198
- );
199
- }
200
-
201
- deleteReadDrive(id: string): Promise<ReadDriveNotFoundError | undefined> {
202
- const deleted = this.#drives.delete(id);
203
- return Promise.resolve(
204
- deleted ? undefined : new ReadDriveNotFoundError(id),
205
- );
206
- }
207
- }
@@ -1,108 +0,0 @@
1
- import {
2
- DocumentDriveDocument,
3
- ListenerFilter,
4
- } from "document-model-libs/document-drive";
5
- import { Action, Document, DocumentModel } from "document-model/document";
6
- import { DocumentDriveServerMixin, RemoteDriveOptions } from "../server";
7
- import { DocumentModelNotFoundError } from "../server/error";
8
- import { DriveInfo } from "../utils/graphql";
9
- import {
10
- ReadDocumentNotFoundError,
11
- ReadDriveNotFoundError,
12
- ReadDriveSlugNotFoundError,
13
- } from "./errors";
14
-
15
- // TODO: move these types to the document-model package
16
- export type InferDocumentState<D extends Document> =
17
- D extends Document<infer S> ? S : never;
18
-
19
- export type InferDocumentOperation<D extends Document> =
20
- D extends Document<unknown, infer A> ? A : never;
21
-
22
- export type InferDocumentLocalState<D extends Document> =
23
- D extends Document<unknown, Action, infer L> ? L : never;
24
-
25
- export type InferDocumentGenerics<D extends Document> = {
26
- state: InferDocumentState<D>;
27
- action: InferDocumentOperation<D>;
28
- logger: InferDocumentLocalState<D>;
29
- };
30
-
31
- export type ReadModeDriveServerMixin =
32
- DocumentDriveServerMixin<IReadModeDriveServer>;
33
-
34
- export type ReadDrivesListener = (
35
- drives: ReadDrive[],
36
- operation: "add" | "delete",
37
- ) => void;
38
-
39
- export type ReadDrivesListenerUnsubscribe = () => void;
40
-
41
- export interface IReadModeDriveServer extends IReadModeDriveService {
42
- migrateReadDrive(
43
- id: string,
44
- options: RemoteDriveOptions,
45
- ): Promise<DocumentDriveDocument | ReadDriveNotFoundError>;
46
- onReadDrivesUpdate(
47
- listener: ReadDrivesListener,
48
- ): Promise<ReadDrivesListenerUnsubscribe>; // TODO: make DriveEvents extensible and reuse event emitter
49
- }
50
-
51
- export type ReadDriveOptions = {
52
- expectedDriveInfo?: DriveInfo;
53
- filter?: ListenerFilter;
54
- };
55
-
56
- export type ReadDriveContext = {
57
- url: string;
58
- } & ReadDriveOptions;
59
-
60
- export type ReadDrive = DocumentDriveDocument & {
61
- readContext: ReadDriveContext;
62
- };
63
-
64
- export type IsDocument<D extends Document> =
65
- (<G>() => G extends D ? 1 : 2) extends <G>() => G extends Document ? 1 : 2
66
- ? true
67
- : false;
68
-
69
- export interface IReadModeDriveService {
70
- addReadDrive(url: string, options?: ReadDriveOptions): Promise<void>;
71
-
72
- getReadDrives(): Promise<string[]>;
73
-
74
- getReadDriveBySlug(
75
- slug: string,
76
- ): Promise<ReadDrive | ReadDriveSlugNotFoundError>;
77
-
78
- getReadDrive(id: string): Promise<ReadDrive | ReadDriveNotFoundError>;
79
-
80
- getReadDriveContext(
81
- id: string,
82
- ): Promise<ReadDriveContext | ReadDriveNotFoundError>;
83
-
84
- fetchDrive(id: string): Promise<ReadDrive | ReadDriveNotFoundError>;
85
-
86
- fetchDocument<D extends Document>(
87
- driveId: string,
88
- documentId: string,
89
- documentType: DocumentModel<
90
- InferDocumentState<D>,
91
- InferDocumentOperation<D>,
92
- InferDocumentLocalState<D>
93
- >["documentModel"]["id"],
94
- ): Promise<
95
- | Document<
96
- InferDocumentState<D>,
97
- InferDocumentOperation<D>,
98
- InferDocumentLocalState<D>
99
- >
100
- | DocumentModelNotFoundError
101
- | ReadDriveNotFoundError
102
- | ReadDocumentNotFoundError
103
- >;
104
-
105
- deleteReadDrive(id: string): Promise<ReadDriveNotFoundError | undefined>;
106
- }
107
-
108
- export type GetDocumentModel = (documentType: string) => DocumentModel;
@@ -1,70 +0,0 @@
1
- import type { Operation } from "document-model/document";
2
- import type { ErrorStatus } from "./types";
3
-
4
- export class DocumentModelNotFoundError extends Error {
5
- constructor(
6
- public id: string,
7
- cause?: unknown,
8
- ) {
9
- super(`Document model "${id}" not found`, { cause });
10
- }
11
- }
12
- export class OperationError extends Error {
13
- status: ErrorStatus;
14
- operation: Operation | undefined;
15
-
16
- constructor(
17
- status: ErrorStatus,
18
- operation?: Operation,
19
- message?: string,
20
- cause?: unknown,
21
- ) {
22
- super(message, { cause: cause ?? operation });
23
- this.status = status;
24
- this.operation = operation;
25
- }
26
- }
27
-
28
- export class ConflictOperationError extends OperationError {
29
- constructor(existingOperation: Operation, newOperation: Operation) {
30
- super(
31
- "CONFLICT",
32
- newOperation,
33
- `Conflicting operation on index ${newOperation.index}`,
34
- { existingOperation, newOperation },
35
- );
36
- }
37
- }
38
-
39
- export class MissingOperationError extends OperationError {
40
- constructor(index: number, operation: Operation) {
41
- super("MISSING", operation, `Missing operation on index ${index}`);
42
- }
43
- }
44
-
45
- export class DriveAlreadyExistsError extends Error {
46
- driveId: string;
47
-
48
- constructor(driveId: string) {
49
- super(`Drive already exists. ID: ${driveId}`);
50
- this.driveId = driveId;
51
- }
52
- }
53
-
54
- export class DriveNotFoundError extends Error {
55
- driveId: string;
56
-
57
- constructor(driveId: string) {
58
- super(`Drive with id ${driveId} not found`);
59
- this.driveId = driveId;
60
- }
61
- }
62
-
63
- export class SynchronizationUnitNotFoundError extends Error {
64
- syncUnitId: string;
65
-
66
- constructor(message: string, syncUnitId: string) {
67
- super(message);
68
- this.syncUnitId = syncUnitId;
69
- }
70
- }