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.
- package/README.md +4 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/src/cache/memory.d.ts +10 -0
- package/dist/src/cache/memory.d.ts.map +1 -0
- package/dist/src/cache/memory.js +26 -0
- package/dist/src/cache/redis.d.ts +14 -0
- package/dist/src/cache/redis.d.ts.map +1 -0
- package/dist/src/cache/redis.js +40 -0
- package/dist/src/cache/types.d.ts +7 -0
- package/dist/src/cache/types.d.ts.map +1 -0
- package/dist/src/cache/types.js +1 -0
- package/dist/src/drive-document-model/constants.d.ts +2 -0
- package/dist/src/drive-document-model/constants.d.ts.map +1 -0
- package/dist/src/drive-document-model/constants.js +1 -0
- package/dist/src/drive-document-model/gen/actions.d.ts +7 -0
- package/dist/src/drive-document-model/gen/actions.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/actions.js +2 -0
- package/dist/src/drive-document-model/gen/constants.d.ts +7 -0
- package/dist/src/drive-document-model/gen/constants.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/constants.js +16 -0
- package/dist/src/drive-document-model/gen/creators.d.ts +3 -0
- package/dist/src/drive-document-model/gen/creators.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/creators.js +2 -0
- package/dist/src/drive-document-model/gen/document-model.d.ts +3 -0
- package/dist/src/drive-document-model/gen/document-model.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/document-model.js +210 -0
- package/dist/src/drive-document-model/gen/drive/actions.d.ts +12 -0
- package/dist/src/drive-document-model/gen/drive/actions.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/drive/actions.js +1 -0
- package/dist/src/drive-document-model/gen/drive/creators.d.ts +11 -0
- package/dist/src/drive-document-model/gen/drive/creators.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/drive/creators.js +10 -0
- package/dist/src/drive-document-model/gen/drive/error.d.ts +2 -0
- package/dist/src/drive-document-model/gen/drive/error.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/drive/error.js +1 -0
- package/dist/src/drive-document-model/gen/drive/object.d.ts +14 -0
- package/dist/src/drive-document-model/gen/drive/object.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/drive/object.js +28 -0
- package/dist/src/drive-document-model/gen/drive/operations.d.ts +14 -0
- package/dist/src/drive-document-model/gen/drive/operations.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/drive/operations.js +1 -0
- package/dist/src/drive-document-model/gen/node/actions.d.ts +11 -0
- package/dist/src/drive-document-model/gen/node/actions.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/node/actions.js +1 -0
- package/dist/src/drive-document-model/gen/node/creators.d.ts +10 -0
- package/dist/src/drive-document-model/gen/node/creators.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/node/creators.js +9 -0
- package/dist/src/drive-document-model/gen/node/error.d.ts +2 -0
- package/dist/src/drive-document-model/gen/node/error.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/node/error.js +1 -0
- package/dist/src/drive-document-model/gen/node/object.d.ts +13 -0
- package/dist/src/drive-document-model/gen/node/object.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/node/object.js +25 -0
- package/dist/src/drive-document-model/gen/node/operations.d.ts +13 -0
- package/dist/src/drive-document-model/gen/node/operations.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/node/operations.js +1 -0
- package/dist/src/drive-document-model/gen/object.d.ts +21 -0
- package/dist/src/drive-document-model/gen/object.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/object.js +28 -0
- package/dist/src/drive-document-model/gen/reducer.d.ts +4 -0
- package/dist/src/drive-document-model/gen/reducer.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/reducer.js +74 -0
- package/dist/src/drive-document-model/gen/schema/types.d.ts +176 -0
- package/dist/src/drive-document-model/gen/schema/types.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/schema/types.js +1 -0
- package/dist/src/drive-document-model/gen/schema/zod.d.ts +87 -0
- package/dist/src/drive-document-model/gen/schema/zod.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/schema/zod.js +203 -0
- package/dist/src/drive-document-model/gen/types.d.ts +9 -0
- package/dist/src/drive-document-model/gen/types.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/types.js +1 -0
- package/dist/src/drive-document-model/gen/utils.d.ts +10 -0
- package/dist/src/drive-document-model/gen/utils.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/utils.js +27 -0
- package/dist/src/drive-document-model/index.d.ts +2 -0
- package/dist/src/drive-document-model/index.d.ts.map +1 -0
- package/dist/src/drive-document-model/index.js +1 -0
- package/dist/src/drive-document-model/module.d.ts +3 -0
- package/dist/src/drive-document-model/module.d.ts.map +1 -0
- package/dist/src/drive-document-model/module.js +12 -0
- package/dist/src/drive-document-model/src/reducers/drive.d.ts +8 -0
- package/dist/src/drive-document-model/src/reducers/drive.d.ts.map +1 -0
- package/dist/src/drive-document-model/src/reducers/drive.js +37 -0
- package/dist/src/drive-document-model/src/reducers/node.d.ts +8 -0
- package/dist/src/drive-document-model/src/reducers/node.d.ts.map +1 -0
- package/dist/src/drive-document-model/src/reducers/node.js +185 -0
- package/dist/src/drive-document-model/src/utils.d.ts +34 -0
- package/dist/src/drive-document-model/src/utils.d.ts.map +1 -0
- package/dist/src/drive-document-model/src/utils.js +146 -0
- package/dist/src/queue/base.d.ts +43 -0
- package/dist/src/queue/base.d.ts.map +1 -0
- package/dist/src/queue/base.js +241 -0
- package/dist/src/queue/redis.d.ts +28 -0
- package/dist/src/queue/redis.d.ts.map +1 -0
- package/dist/src/queue/redis.js +110 -0
- package/dist/src/queue/types.d.ts +55 -0
- package/dist/src/queue/types.d.ts.map +1 -0
- package/dist/src/queue/types.js +6 -0
- package/dist/src/read-mode/errors.d.ts +12 -0
- package/dist/src/read-mode/errors.d.ts.map +1 -0
- package/dist/src/read-mode/errors.js +17 -0
- package/dist/src/read-mode/server.d.ts +4 -0
- package/dist/src/read-mode/server.d.ts.map +1 -0
- package/dist/src/read-mode/server.js +78 -0
- package/dist/src/read-mode/service.d.ts +18 -0
- package/dist/src/read-mode/service.d.ts.map +1 -0
- package/dist/src/read-mode/service.js +112 -0
- package/dist/src/read-mode/types.d.ts +35 -0
- package/dist/src/read-mode/types.d.ts.map +1 -0
- package/dist/src/read-mode/types.js +1 -0
- package/dist/src/server/base-server.d.ts +112 -0
- package/dist/src/server/base-server.d.ts.map +1 -0
- package/dist/src/server/base-server.js +1280 -0
- package/dist/src/server/builder.d.ts +30 -0
- package/dist/src/server/builder.d.ts.map +1 -0
- package/dist/src/server/builder.js +89 -0
- package/dist/src/server/constants.d.ts +2 -0
- package/dist/src/server/constants.d.ts.map +1 -0
- package/dist/src/server/constants.js +1 -0
- package/dist/src/server/error.d.ts +30 -0
- package/dist/src/server/error.d.ts.map +1 -0
- package/dist/src/server/error.js +47 -0
- package/dist/src/server/event-emitter.d.ts +8 -0
- package/dist/src/server/event-emitter.d.ts.map +1 -0
- package/dist/src/server/event-emitter.js +10 -0
- package/dist/src/server/listener/index.d.ts +2 -0
- package/dist/src/server/listener/index.d.ts.map +1 -0
- package/dist/src/server/listener/index.js +1 -0
- package/dist/src/server/listener/listener-manager.d.ts +27 -0
- package/dist/src/server/listener/listener-manager.d.ts.map +1 -0
- package/dist/src/server/listener/listener-manager.js +401 -0
- package/dist/src/server/listener/transmitter/factory.d.ts +8 -0
- package/dist/src/server/listener/transmitter/factory.d.ts.map +1 -0
- package/dist/src/server/listener/transmitter/factory.js +25 -0
- package/dist/src/server/listener/transmitter/internal.d.ts +34 -0
- package/dist/src/server/listener/transmitter/internal.d.ts.map +1 -0
- package/dist/src/server/listener/transmitter/internal.js +87 -0
- package/dist/src/server/listener/transmitter/pull-responder.d.ts +38 -0
- package/dist/src/server/listener/transmitter/pull-responder.d.ts.map +1 -0
- package/dist/src/server/listener/transmitter/pull-responder.js +256 -0
- package/dist/src/server/listener/transmitter/switchboard-push.d.ts +9 -0
- package/dist/src/server/listener/transmitter/switchboard-push.d.ts.map +1 -0
- package/dist/src/server/listener/transmitter/switchboard-push.js +77 -0
- package/dist/src/server/listener/transmitter/types.d.ts +20 -0
- package/dist/src/server/listener/transmitter/types.d.ts.map +1 -0
- package/dist/src/server/listener/transmitter/types.js +1 -0
- package/dist/src/server/listener/util.d.ts +2 -0
- package/dist/src/server/listener/util.d.ts.map +1 -0
- package/dist/src/server/listener/util.js +22 -0
- package/dist/src/server/sync-manager.d.ts +30 -0
- package/dist/src/server/sync-manager.d.ts.map +1 -0
- package/dist/src/server/sync-manager.js +287 -0
- package/dist/src/server/types.d.ts +308 -0
- package/dist/src/server/types.d.ts.map +1 -0
- package/dist/src/server/types.js +12 -0
- package/dist/src/server/utils.d.ts +8 -0
- package/dist/src/server/utils.d.ts.map +1 -0
- package/dist/src/server/utils.js +47 -0
- package/dist/src/storage/base.d.ts +36 -0
- package/dist/src/storage/base.d.ts.map +1 -0
- package/dist/src/storage/base.js +4 -0
- package/dist/src/storage/browser.d.ts +36 -0
- package/dist/src/storage/browser.d.ts.map +1 -0
- package/dist/src/storage/browser.js +155 -0
- package/dist/src/storage/filesystem.d.ts +33 -0
- package/dist/src/storage/filesystem.d.ts.map +1 -0
- package/dist/src/storage/filesystem.js +197 -0
- package/dist/src/storage/memory.d.ts +33 -0
- package/dist/src/storage/memory.d.ts.map +1 -0
- package/dist/src/storage/memory.js +139 -0
- package/dist/src/storage/prisma.d.ts +67 -0
- package/dist/src/storage/prisma.d.ts.map +1 -0
- package/dist/src/storage/prisma.js +445 -0
- package/dist/src/storage/sequelize.d.ts +32 -0
- package/dist/src/storage/sequelize.d.ts.map +1 -0
- package/dist/src/storage/sequelize.js +373 -0
- package/dist/src/storage/types.d.ts +43 -0
- package/dist/src/storage/types.d.ts.map +1 -0
- package/dist/src/storage/types.js +1 -0
- package/dist/src/utils/default-drives-manager.d.ts +29 -0
- package/dist/src/utils/default-drives-manager.d.ts.map +1 -0
- package/dist/src/utils/default-drives-manager.js +208 -0
- package/dist/src/utils/graphql.d.ts +34 -0
- package/dist/src/utils/graphql.d.ts.map +1 -0
- package/dist/src/utils/graphql.js +183 -0
- package/dist/src/utils/logger.d.ts +27 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +105 -0
- package/dist/src/utils/migrations.d.ts +4 -0
- package/dist/src/utils/migrations.d.ts.map +1 -0
- package/dist/src/utils/migrations.js +41 -0
- package/dist/src/utils/misc.d.ts +11 -0
- package/dist/src/utils/misc.d.ts.map +1 -0
- package/dist/src/utils/misc.js +43 -0
- package/dist/src/utils/run-asap.d.ts +12 -0
- package/dist/src/utils/run-asap.d.ts.map +1 -0
- package/dist/src/utils/run-asap.js +131 -0
- package/dist/test/document-helpers/utils.d.ts +8 -0
- package/dist/test/document-helpers/utils.d.ts.map +1 -0
- package/dist/test/document-helpers/utils.js +21 -0
- package/dist/test/utils.d.ts +48 -0
- package/dist/test/utils.d.ts.map +1 -0
- package/dist/test/utils.js +132 -0
- package/dist/test/vitest-setup.d.ts +2 -0
- package/dist/test/vitest-setup.d.ts.map +1 -0
- package/dist/test/vitest-setup.js +4 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +20 -0
- package/package.json +20 -38
- package/src/cache/index.ts +0 -2
- package/src/cache/memory.ts +0 -33
- package/src/cache/redis.ts +0 -56
- package/src/cache/types.ts +0 -9
- package/src/index.ts +0 -4
- package/src/queue/base.ts +0 -320
- package/src/queue/index.ts +0 -2
- package/src/queue/redis.ts +0 -144
- package/src/queue/types.ts +0 -79
- package/src/read-mode/errors.ts +0 -19
- package/src/read-mode/index.ts +0 -125
- package/src/read-mode/service.ts +0 -207
- package/src/read-mode/types.ts +0 -108
- package/src/server/error.ts +0 -70
- package/src/server/index.ts +0 -2444
- package/src/server/listener/index.ts +0 -2
- package/src/server/listener/manager.ts +0 -652
- package/src/server/listener/transmitter/index.ts +0 -4
- package/src/server/listener/transmitter/internal.ts +0 -143
- package/src/server/listener/transmitter/pull-responder.ts +0 -462
- package/src/server/listener/transmitter/switchboard-push.ts +0 -125
- package/src/server/listener/transmitter/types.ts +0 -27
- package/src/server/types.ts +0 -596
- package/src/server/utils.ts +0 -82
- package/src/storage/base.ts +0 -81
- package/src/storage/browser.ts +0 -238
- package/src/storage/filesystem.ts +0 -297
- package/src/storage/index.ts +0 -2
- package/src/storage/memory.ts +0 -211
- package/src/storage/prisma.ts +0 -653
- package/src/storage/sequelize.ts +0 -498
- package/src/storage/types.ts +0 -97
- package/src/utils/default-drives-manager.ts +0 -341
- package/src/utils/document-helpers.ts +0 -21
- package/src/utils/graphql.ts +0 -301
- package/src/utils/index.ts +0 -90
- package/src/utils/logger.ts +0 -38
- package/src/utils/migrations.ts +0 -58
- 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;
|
package/src/utils/graphql.ts
DELETED
|
@@ -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
|
-
}
|