document-drive 1.29.0-dev.1 → 1.29.0-dev.3

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 (37) hide show
  1. package/dist/src/cache/memory.d.ts +15 -8
  2. package/dist/src/cache/memory.d.ts.map +1 -1
  3. package/dist/src/cache/memory.js +53 -29
  4. package/dist/src/cache/redis.d.ts +15 -8
  5. package/dist/src/cache/redis.d.ts.map +1 -1
  6. package/dist/src/cache/redis.js +67 -27
  7. package/dist/src/cache/types.d.ts +10 -3
  8. package/dist/src/cache/types.d.ts.map +1 -1
  9. package/dist/src/cache/util.d.ts +3 -0
  10. package/dist/src/cache/util.d.ts.map +1 -0
  11. package/dist/src/cache/util.js +13 -0
  12. package/dist/src/drive-document-model/gen/schema/zod.d.ts +8 -8
  13. package/dist/src/drive-document-model/gen/schema/zod.d.ts.map +1 -1
  14. package/dist/src/server/base-server.d.ts.map +1 -1
  15. package/dist/src/server/base-server.js +35 -15
  16. package/dist/src/server/sync-manager.js +2 -2
  17. package/dist/src/storage/browser.d.ts +6 -1
  18. package/dist/src/storage/browser.d.ts.map +1 -1
  19. package/dist/src/storage/browser.js +56 -4
  20. package/dist/src/storage/filesystem.d.ts +5 -1
  21. package/dist/src/storage/filesystem.d.ts.map +1 -1
  22. package/dist/src/storage/filesystem.js +59 -6
  23. package/dist/src/storage/ipfs.d.ts +4 -0
  24. package/dist/src/storage/ipfs.d.ts.map +1 -1
  25. package/dist/src/storage/ipfs.js +58 -5
  26. package/dist/src/storage/memory.d.ts +5 -1
  27. package/dist/src/storage/memory.d.ts.map +1 -1
  28. package/dist/src/storage/memory.js +47 -15
  29. package/dist/src/storage/prisma/factory.d.ts +2 -2
  30. package/dist/src/storage/prisma/factory.d.ts.map +1 -1
  31. package/dist/src/storage/prisma/index.d.ts +10 -4
  32. package/dist/src/storage/prisma/index.d.ts.map +1 -1
  33. package/dist/src/storage/prisma/index.js +209 -128
  34. package/dist/src/storage/types.d.ts +5 -4
  35. package/dist/src/storage/types.d.ts.map +1 -1
  36. package/dist/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/storage/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC3B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAG9D,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EAET,UAAU,EACX,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAOvE,qBAAa,cAAe,YAAW,aAAa,EAAE,gBAAgB;IACpE,OAAO,CAAC,EAAE,CAAuB;IAEjC,MAAM,CAAC,MAAM,SAAqB;IAClC,MAAM,CAAC,GAAG,SAAO;IACjB,MAAM,CAAC,YAAY,SAAc;IACjC,MAAM,CAAC,YAAY,SAAc;gBAErB,SAAS,CAAC,EAAE,MAAM;IAcxB,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS5C,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/D,GAAG,CAAC,SAAS,SAAS,UAAU,EACpC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,CAAC;IAiBrB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAI1D,gBAAgB;YAQhB,mBAAmB;IAQ3B,YAAY,CAAC,KAAK,EAAE,MAAM;IAK1B,WAAW,CAAC,SAAS,SAAS,UAAU,EAC5C,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,SAAS,CAAC;IAIf,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU;IAW9D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAYxC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,qBAAqB,CACzB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;IAgBV,SAAS;IAYT,QAAQ,CAAC,EAAE,EAAE,MAAM;IAYnB,cAAc,CAAC,IAAI,EAAE,MAAM;IAa3B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB;IAqBpD,WAAW,CAAC,EAAE,EAAE,MAAM;IAatB,kBAAkB,CACtB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,SAAS,CAAC,mBAAmB,CAAC,EAAE,EAC5C,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;IAYV,+BAA+B,CACnC,KAAK,EAAE,wBAAwB,EAAE,GAChC,OAAO,CACR;QACE,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CACJ;IAyCK,0BAA0B;YAYlB,YAAY;YAWZ,eAAe;IAe7B,gBAAgB,CAAC,UAAU,EAAE,MAAM;IAInC,gBAAgB,CAAC,OAAO,EAAE,MAAM;CAGjC"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/storage/browser.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,10 @@ export class BrowserStorage {
15
15
  : BrowserStorage.DBName,
16
16
  }));
17
17
  }
18
+ async clear() {
19
+ const db = await this.db;
20
+ await db.clear();
21
+ }
18
22
  ////////////////////////////////
19
23
  // IDocumentStorage
20
24
  ////////////////////////////////
@@ -35,13 +39,61 @@ export class BrowserStorage {
35
39
  }
36
40
  return document;
37
41
  }
42
+ async delete(documentId) {
43
+ const db = await this.db;
44
+ const document = await db.getItem(this.buildDocumentKey(documentId));
45
+ if (!document) {
46
+ return false;
47
+ }
48
+ // delete the document from all other drive manifests
49
+ const drives = await this.getDrives();
50
+ for (const driveId of drives) {
51
+ if (driveId === documentId)
52
+ continue;
53
+ await this.removeChild(driveId, documentId);
54
+ }
55
+ // delete any manifest for this document
56
+ await db.removeItem(this.buildManifestKey(documentId));
57
+ // finally, delete the specified document
58
+ await db.removeItem(this.buildDocumentKey(documentId));
59
+ return true;
60
+ }
61
+ async removeChild(parentId, childId) {
62
+ const manifest = await this.getManifest(parentId);
63
+ const docIndex = manifest.documentIds.indexOf(childId);
64
+ if (docIndex !== -1) {
65
+ manifest.documentIds.splice(docIndex, 1);
66
+ await this.updateDriveManifest(parentId, manifest);
67
+ return true;
68
+ }
69
+ return false;
70
+ }
71
+ async addChild(parentId, childId) {
72
+ if (parentId === childId) {
73
+ throw new Error("Cannot associate a document with itself");
74
+ }
75
+ // check if the child is a parent of the parent
76
+ const children = await this.getChildren(childId);
77
+ if (children.includes(parentId)) {
78
+ throw new Error("Cannot associate a document with its child");
79
+ }
80
+ const manifest = await this.getManifest(parentId);
81
+ if (!manifest.documentIds.includes(childId)) {
82
+ manifest.documentIds.push(childId);
83
+ await this.updateDriveManifest(parentId, manifest);
84
+ }
85
+ }
86
+ async getChildren(parentId) {
87
+ const manifest = await this.getManifest(parentId);
88
+ return manifest.documentIds;
89
+ }
38
90
  ////////////////////////////////
39
91
  // IDriveStorage
40
92
  ////////////////////////////////
41
93
  checkDocumentExists(drive, documentId) {
42
94
  return this.exists(documentId);
43
95
  }
44
- async getDriveManifest(driveId) {
96
+ async getManifest(driveId) {
45
97
  const db = await this.db;
46
98
  const manifest = await db.getItem(this.buildManifestKey(driveId));
47
99
  return manifest || { documentIds: [] };
@@ -51,7 +103,7 @@ export class BrowserStorage {
51
103
  await db.setItem(this.buildManifestKey(driveId), manifest);
52
104
  }
53
105
  async getDocuments(drive) {
54
- const manifest = await this.getDriveManifest(drive);
106
+ const manifest = await this.getManifest(drive);
55
107
  return manifest.documentIds;
56
108
  }
57
109
  async getDocument(driveId, id) {
@@ -60,7 +112,7 @@ export class BrowserStorage {
60
112
  async createDocument(drive, id, document) {
61
113
  await this.create(id, document);
62
114
  // Update the drive manifest to include this document
63
- const manifest = await this.getDriveManifest(drive);
115
+ const manifest = await this.getManifest(drive);
64
116
  if (!manifest.documentIds.includes(id)) {
65
117
  manifest.documentIds.push(id);
66
118
  await this.updateDriveManifest(drive, manifest);
@@ -69,7 +121,7 @@ export class BrowserStorage {
69
121
  async deleteDocument(drive, id) {
70
122
  await (await this.db).removeItem(this.buildDocumentKey(id));
71
123
  // Update the drive manifest to remove this document
72
- const manifest = await this.getDriveManifest(drive);
124
+ const manifest = await this.getManifest(drive);
73
125
  const docIndex = manifest.documentIds.indexOf(id);
74
126
  if (docIndex !== -1) {
75
127
  manifest.documentIds.splice(docIndex, 1);
@@ -8,6 +8,10 @@ export declare class FilesystemStorage implements IDriveStorage, IDocumentStorag
8
8
  exists(documentId: string): Promise<boolean>;
9
9
  create(documentId: string, document: PHDocument): Promise<void>;
10
10
  get<TDocument extends PHDocument>(documentId: string): Promise<TDocument>;
11
+ delete(documentId: string): Promise<boolean>;
12
+ addChild(parentId: string, childId: string): Promise<void>;
13
+ removeChild(parentId: string, childId: string): Promise<boolean>;
14
+ getChildren(parentId: string): Promise<string[]>;
11
15
  getDocuments(drive: string): Promise<string[]>;
12
16
  checkDocumentExists(drive: string, id: string): Promise<boolean>;
13
17
  getDocument<TDocument extends PHDocument>(drive: string, id: string): Promise<TDocument>;
@@ -30,7 +34,7 @@ export declare class FilesystemStorage implements IDriveStorage, IDocumentStorag
30
34
  }[]>;
31
35
  private _buildDocumentPath;
32
36
  private _buildManifestPath;
33
- private getDriveManifest;
37
+ private getManifest;
34
38
  private updateDriveManifest;
35
39
  }
36
40
  //# sourceMappingURL=filesystem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../../src/storage/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC3B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAE9D,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,SAAS,EAEd,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAavE,qBAAa,iBAAkB,YAAW,aAAa,EAAE,gBAAgB;IACvE,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAS5B,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5C,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU;IAS/C,GAAG,CAAC,SAAS,SAAS,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAgBnE,YAAY,CAAC,KAAK,EAAE,MAAM;IAKhC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI1D,WAAW,CAAC,SAAS,SAAS,UAAU,EAC5C,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,SAAS,CAAC;IAIf,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU;IAgB9D,YAAY;IAeZ,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IA0BxC,qBAAqB,CACzB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,cAAc;IAuBlB,SAAS;IAWT,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IASpD,cAAc,CAAC,IAAI,EAAE,MAAM;IAmB3B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB;IAqBpD,WAAW,CAAC,EAAE,EAAE,MAAM;IAYtB,kBAAkB,CACtB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,SAAS,CAAC,mBAAmB,CAAC,EAAE,EAC5C,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;IAqBV,+BAA+B,CACnC,KAAK,EAAE,wBAAwB,EAAE,GAChC,OAAO,CACR;QACE,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CACJ;IA4CD,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,kBAAkB;YAIZ,gBAAgB;YAWhB,mBAAmB;CAOlC"}
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../../src/storage/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC3B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAE9D,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,SAAS,EAEd,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AAWxB,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAavE,qBAAa,iBAAkB,YAAW,aAAa,EAAE,gBAAgB;IACvE,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAS5B,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5C,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU;IAS/C,GAAG,CAAC,SAAS,SAAS,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAYnE,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2B5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB1D,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYhE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAShD,YAAY,CAAC,KAAK,EAAE,MAAM;IAKhC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI1D,WAAW,CAAC,SAAS,SAAS,UAAU,EAC5C,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,SAAS,CAAC;IAIf,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU;IAgB9D,YAAY;IAeZ,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IA0BxC,qBAAqB,CACzB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,cAAc;IAuBlB,SAAS;IAWT,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IASpD,cAAc,CAAC,IAAI,EAAE,MAAM;IAmB3B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB;IAqBpD,WAAW,CAAC,EAAE,EAAE,MAAM;IAYtB,kBAAkB,CACtB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,SAAS,CAAC,mBAAmB,CAAC,EAAE,EAC5C,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;IAqBV,+BAA+B,CACnC,KAAK,EAAE,wBAAwB,EAAE,GAChC,OAAO,CACR;QACE,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CACJ;IA4CD,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,kBAAkB;YAIZ,WAAW;YAWX,mBAAmB;CAOlC"}
@@ -1,6 +1,6 @@
1
1
  import { DriveNotFoundError } from "#server/error";
2
2
  import { mergeOperations } from "#utils/misc";
3
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
3
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync, } from "fs";
4
4
  import fs from "fs/promises";
5
5
  import stringify from "json-stringify-deterministic";
6
6
  import path from "path";
@@ -40,11 +40,64 @@ export class FilesystemStorage {
40
40
  throw new Error(`Document with id ${documentId} not found`);
41
41
  }
42
42
  }
43
+ async delete(documentId) {
44
+ // delete the document from all other drive manifests
45
+ const drives = await this.getDrives();
46
+ for (const driveId of drives) {
47
+ if (driveId === documentId)
48
+ continue;
49
+ await this.removeChild(driveId, documentId);
50
+ }
51
+ // delete any manifest for this document
52
+ try {
53
+ await fs.rm(this._buildManifestPath(documentId));
54
+ }
55
+ catch (error) {
56
+ // there may be no manifest for this document
57
+ }
58
+ // finally, delete the specified document
59
+ const documentPath = this._buildDocumentPath(documentId);
60
+ if (existsSync(documentPath)) {
61
+ unlinkSync(documentPath);
62
+ return Promise.resolve(true);
63
+ }
64
+ return Promise.resolve(false);
65
+ }
66
+ async addChild(parentId, childId) {
67
+ if (parentId === childId) {
68
+ throw new Error("Cannot associate a document with itself");
69
+ }
70
+ // check if the child is a parent of the parent
71
+ const children = await this.getChildren(childId);
72
+ if (children.includes(parentId)) {
73
+ throw new Error("Cannot associate a document with its child");
74
+ }
75
+ // Update the drive manifest to include this document
76
+ const manifest = await this.getManifest(parentId);
77
+ if (!manifest.documentIds.includes(childId)) {
78
+ manifest.documentIds.push(childId);
79
+ await this.updateDriveManifest(parentId, manifest);
80
+ }
81
+ }
82
+ async removeChild(parentId, childId) {
83
+ const manifest = await this.getManifest(parentId);
84
+ const docIndex = manifest.documentIds.indexOf(childId);
85
+ if (docIndex !== -1) {
86
+ manifest.documentIds.splice(docIndex, 1);
87
+ await this.updateDriveManifest(parentId, manifest);
88
+ return true;
89
+ }
90
+ return false;
91
+ }
92
+ async getChildren(parentId) {
93
+ const manifest = await this.getManifest(parentId);
94
+ return manifest.documentIds;
95
+ }
43
96
  ////////////////////////////////
44
97
  // IDriveStorage
45
98
  ////////////////////////////////
46
99
  async getDocuments(drive) {
47
- const manifest = await this.getDriveManifest(drive);
100
+ const manifest = await this.getManifest(drive);
48
101
  return manifest.documentIds;
49
102
  }
50
103
  checkDocumentExists(drive, id) {
@@ -59,7 +112,7 @@ export class FilesystemStorage {
59
112
  encoding: "utf-8",
60
113
  });
61
114
  // Update the drive manifest to include this document
62
- const manifest = await this.getDriveManifest(drive);
115
+ const manifest = await this.getManifest(drive);
63
116
  if (!manifest.documentIds.includes(id)) {
64
117
  manifest.documentIds.push(id);
65
118
  await this.updateDriveManifest(drive, manifest);
@@ -77,7 +130,7 @@ export class FilesystemStorage {
77
130
  }
78
131
  async deleteDocument(drive, id) {
79
132
  // Update the drive manifest to remove this document
80
- const manifest = await this.getDriveManifest(drive);
133
+ const manifest = await this.getManifest(drive);
81
134
  const docIndex = manifest.documentIds.indexOf(id);
82
135
  if (docIndex !== -1) {
83
136
  manifest.documentIds.splice(docIndex, 1);
@@ -89,7 +142,7 @@ export class FilesystemStorage {
89
142
  for (const driveId of drives) {
90
143
  if (driveId === drive)
91
144
  continue;
92
- const otherManifest = await this.getDriveManifest(driveId);
145
+ const otherManifest = await this.getManifest(driveId);
93
146
  if (otherManifest.documentIds.includes(id)) {
94
147
  // Document still referenced by another drive, don't delete the file
95
148
  return Promise.resolve();
@@ -219,7 +272,7 @@ export class FilesystemStorage {
219
272
  _buildManifestPath(driveId) {
220
273
  return `${this.basePath}/manifest-${driveId}.json`;
221
274
  }
222
- async getDriveManifest(driveId) {
275
+ async getManifest(driveId) {
223
276
  const manifestPath = this._buildManifestPath(driveId);
224
277
  try {
225
278
  const content = readFileSync(manifestPath, { encoding: "utf-8" });
@@ -9,6 +9,10 @@ export declare class IPFSStorage implements IStorage, IDocumentStorage {
9
9
  exists(documentId: string): Promise<boolean>;
10
10
  create(documentId: string, document: PHDocument): Promise<void>;
11
11
  get<TDocument extends PHDocument>(documentId: string): Promise<TDocument>;
12
+ delete(documentId: string): Promise<boolean>;
13
+ addChild(parentId: string, childId: string): Promise<void>;
14
+ removeChild(parentId: string, childId: string): Promise<boolean>;
15
+ getChildren(parentId: string): Promise<string[]>;
12
16
  checkDocumentExists(drive: string, id: string): Promise<boolean>;
13
17
  getDocuments(drive: string): Promise<string[]>;
14
18
  getDocument<TDocument extends PHDocument>(drive: string, id: string): Promise<TDocument>;
@@ -1 +1 @@
1
- {"version":3,"file":"ipfs.d.ts","sourceRoot":"","sources":["../../../src/storage/ipfs.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC3B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAG9D,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,SAAS,EAEd,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAEnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAO7D,qBAAa,WAAY,YAAW,QAAQ,EAAE,gBAAgB;IAC5D,OAAO,CAAC,EAAE,CAAM;gBAEJ,KAAK,EAAE,KAAK;IAQlB,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB5C,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/D,GAAG,CAAC,SAAS,SAAS,UAAU,EACpC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,CAAC;IAsBf,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK9C,WAAW,CAAC,SAAS,SAAS,UAAU,EAC5C,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,SAAS,CAAC;IAIf,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,UAAU,GACnB,OAAO,CAAC,IAAI,CAAC;IAaV,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCxD,qBAAqB,CAAC,SAAS,SAAS,UAAU,EACtD,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;IAeV,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAoB9B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAepD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAkB5D,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BtC,kBAAkB,CACtB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,SAAS,CAAC,mBAAmB,CAAC,EAAE,EAC5C,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;IAcV,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAa7B,+BAA+B,CACnC,KAAK,EAAE,wBAAwB,EAAE,GAChC,OAAO,CACR;QACE,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CACJ;IA4CD,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,uBAAuB;YAIjB,gBAAgB;YAgBhB,mBAAmB;CASlC"}
1
+ {"version":3,"file":"ipfs.d.ts","sourceRoot":"","sources":["../../../src/storage/ipfs.ts"],"names":[],"mappings":"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"}
@@ -45,7 +45,59 @@ export class IPFSStorage {
45
45
  throw new Error(`Document with id ${documentId} not found`);
46
46
  }
47
47
  }
48
- ////////////////////////////////s
48
+ async delete(documentId) {
49
+ // delete the document from all other drive manifests
50
+ const drives = await this.getDrives();
51
+ for (const driveId of drives) {
52
+ if (driveId === documentId)
53
+ continue;
54
+ await this.removeChild(driveId, documentId);
55
+ }
56
+ // delete any manifest for this document
57
+ try {
58
+ await this.fs.rm(this._buildDriveManifestPath(documentId));
59
+ }
60
+ catch (error) {
61
+ // there may be no manifest for this document
62
+ }
63
+ // finally, delete the specified document
64
+ try {
65
+ await this.fs.rm(this._buildDocumentPath(documentId));
66
+ return true;
67
+ }
68
+ catch (error) {
69
+ return false;
70
+ }
71
+ }
72
+ async addChild(parentId, childId) {
73
+ if (parentId === childId) {
74
+ throw new Error("Cannot associate a document with itself");
75
+ }
76
+ // check if the child is a parent of the parent
77
+ const children = await this.getChildren(childId);
78
+ if (children.includes(parentId)) {
79
+ throw new Error("Cannot associate a document with its child");
80
+ }
81
+ const manifest = await this.getDriveManifest(parentId);
82
+ if (!manifest.documentIds.includes(childId)) {
83
+ manifest.documentIds.push(childId);
84
+ await this.updateDriveManifest(parentId, manifest);
85
+ }
86
+ }
87
+ async removeChild(parentId, childId) {
88
+ const manifest = await this.getDriveManifest(parentId);
89
+ const docIndex = manifest.documentIds.indexOf(childId);
90
+ if (docIndex !== -1) {
91
+ manifest.documentIds.splice(docIndex, 1);
92
+ await this.updateDriveManifest(parentId, manifest);
93
+ return true;
94
+ }
95
+ return false;
96
+ }
97
+ async getChildren(parentId) {
98
+ const manifest = await this.getDriveManifest(parentId);
99
+ return manifest.documentIds;
100
+ }
49
101
  // IDriveStorage
50
102
  ////////////////////////////////
51
103
  async checkDocumentExists(drive, id) {
@@ -115,10 +167,11 @@ export class IPFSStorage {
115
167
  // List all files in root directory
116
168
  const drives = [];
117
169
  for await (const entry of this.fs.ls("/")) {
118
- if (entry.type === "file" &&
119
- entry.name.startsWith("drive-") &&
170
+ if (entry.name.startsWith("manifest-") &&
120
171
  entry.name.endsWith(".json")) {
121
- const driveId = entry.name.replace("drive-", "").replace(".json", "");
172
+ const driveId = entry.name
173
+ .replace("manifest-", "")
174
+ .replace(".json", "");
122
175
  drives.push(driveId);
123
176
  }
124
177
  }
@@ -269,6 +322,6 @@ export class IPFSStorage {
269
322
  const manifestPath = this._buildDriveManifestPath(driveId);
270
323
  const manifestContent = stringify(manifest);
271
324
  const manifestBuffer = new TextEncoder().encode(manifestContent);
272
- await this.fs.writeBytes(manifestBuffer, manifestPath);
325
+ await this.fs.writeBytes(manifestBuffer, manifestPath, { force: true });
273
326
  }
274
327
  }
@@ -9,6 +9,10 @@ export declare class MemoryStorage implements IDriveStorage, IDocumentStorage {
9
9
  exists(documentId: string): Promise<boolean>;
10
10
  create(documentId: string, document: PHDocument): Promise<void>;
11
11
  get<TDocument extends PHDocument>(documentId: string): Promise<TDocument>;
12
+ delete(documentId: string): Promise<boolean>;
13
+ addChild(parentId: string, childId: string): Promise<void>;
14
+ removeChild(parentId: string, childId: string): Promise<boolean>;
15
+ getChildren(parentId: string): Promise<string[]>;
12
16
  checkDocumentExists(drive: string, id: string): Promise<boolean>;
13
17
  getDocuments(drive: string): Promise<string[]>;
14
18
  getDocument<TDocument extends PHDocument>(driveId: string, id: string): Promise<TDocument>;
@@ -29,7 +33,7 @@ export declare class MemoryStorage implements IDriveStorage, IDocumentStorage {
29
33
  lastUpdated: string;
30
34
  revision: number;
31
35
  }[]>;
32
- private getDriveManifest;
36
+ private getManifest;
33
37
  private updateDriveManifest;
34
38
  }
35
39
  //# sourceMappingURL=memory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/storage/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAE9D,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,qBAAqB,EAE1B,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAMvE,qBAAa,aAAc,YAAW,aAAa,EAAE,gBAAgB;IACnE,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,cAAc,CAAgC;;IAWtD,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM5C,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU;IAM/C,GAAG,CAAC,SAAS,SAAS,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAkBzE,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhE,YAAY,CAAC,KAAK,EAAE,MAAM;IAK1B,WAAW,CAAC,SAAS,SAAS,UAAU,EACtC,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,SAAS,CAAC;IAIf,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU;IAS9D,qBAAqB,CACzB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;IAeV,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAcxC,SAAS;IAIT,QAAQ,CAAC,EAAE,EAAE,MAAM;IAQnB,cAAc,CAAC,IAAI,EAAE,MAAM;IAW3B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB;IAqBpD,kBAAkB,CACtB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,qBAAqB,CAAC,qBAAqB,CAAC,EAAE,EAC1D,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;IAcV,WAAW,CAAC,EAAE,EAAE,MAAM;IA4BtB,+BAA+B,CACnC,KAAK,EAAE,wBAAwB,EAAE,GAChC,OAAO,CACR;QACE,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CACJ;IA4CD,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,mBAAmB;CAG5B"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/storage/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAE9D,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,qBAAqB,EAE1B,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAMvE,qBAAa,aAAc,YAAW,aAAa,EAAE,gBAAgB;IACnE,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,cAAc,CAAgC;;IAWtD,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM5C,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU;IAM/C,GAAG,CAAC,SAAS,SAAS,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAcnE,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqB5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAgB1C,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAU7C,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAStD,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhE,YAAY,CAAC,KAAK,EAAE,MAAM;IAK1B,WAAW,CAAC,SAAS,SAAS,UAAU,EACtC,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,SAAS,CAAC;IAIf,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU;IAS9D,qBAAqB,CACzB,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;IAeV,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAIxC,SAAS;IAIT,QAAQ,CAAC,EAAE,EAAE,MAAM;IAQnB,cAAc,CAAC,IAAI,EAAE,MAAM;IAW3B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB;IAqBpD,kBAAkB,CACtB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,qBAAqB,CAAC,qBAAqB,CAAC,EAAE,EAC1D,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;IAcV,WAAW,CAAC,EAAE,EAAE,MAAM;IA4BtB,+BAA+B,CACnC,KAAK,EAAE,wBAAwB,EAAE,GAChC,OAAO,CACR;QACE,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CACJ;IA4CD,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,mBAAmB;CAG5B"}
@@ -28,6 +28,47 @@ export class MemoryStorage {
28
28
  }
29
29
  return Promise.resolve(document);
30
30
  }
31
+ async delete(documentId) {
32
+ // delete the document from all other drive manifests
33
+ const drives = await this.getDrives();
34
+ for (const driveId of drives) {
35
+ if (driveId === documentId)
36
+ continue;
37
+ await this.removeChild(driveId, documentId);
38
+ }
39
+ // delete any manifest for this document
40
+ delete this.driveManifests[documentId];
41
+ if (this.documents[documentId]) {
42
+ delete this.documents[documentId];
43
+ return Promise.resolve(true);
44
+ }
45
+ return Promise.resolve(false);
46
+ }
47
+ async addChild(parentId, childId) {
48
+ if (parentId === childId) {
49
+ throw new Error("Cannot associate a document with itself");
50
+ }
51
+ // check if the child is a parent of the parent
52
+ const children = await this.getChildren(childId);
53
+ if (children.includes(parentId)) {
54
+ throw new Error("Cannot associate a document with its child");
55
+ }
56
+ const manifest = this.getManifest(parentId);
57
+ manifest.documentIds.add(childId);
58
+ this.updateDriveManifest(parentId, manifest);
59
+ }
60
+ async removeChild(parentId, childId) {
61
+ const manifest = this.getManifest(parentId);
62
+ if (manifest.documentIds.delete(childId)) {
63
+ this.updateDriveManifest(parentId, manifest);
64
+ return true;
65
+ }
66
+ return false;
67
+ }
68
+ async getChildren(parentId) {
69
+ const manifest = this.getManifest(parentId);
70
+ return [...manifest.documentIds];
71
+ }
31
72
  ////////////////////////////////
32
73
  // IDriveStorage
33
74
  ////////////////////////////////
@@ -35,7 +76,7 @@ export class MemoryStorage {
35
76
  return this.exists(id);
36
77
  }
37
78
  getDocuments(drive) {
38
- const manifest = this.getDriveManifest(drive);
79
+ const manifest = this.getManifest(drive);
39
80
  return Promise.resolve([...manifest.documentIds]);
40
81
  }
41
82
  getDocument(driveId, id) {
@@ -48,7 +89,7 @@ export class MemoryStorage {
48
89
  async createDocument(drive, id, document) {
49
90
  await this.create(id, document);
50
91
  // Update the drive manifest
51
- const manifest = this.getDriveManifest(drive);
92
+ const manifest = this.getManifest(drive);
52
93
  manifest.documentIds.add(id);
53
94
  this.updateDriveManifest(drive, manifest);
54
95
  }
@@ -65,16 +106,7 @@ export class MemoryStorage {
65
106
  };
66
107
  }
67
108
  async deleteDocument(drive, id) {
68
- // delete the document from all drive manifests
69
- const drives = await this.getDrives();
70
- for (const driveId of drives) {
71
- const manifest = this.getDriveManifest(driveId);
72
- if (manifest.documentIds.has(id)) {
73
- manifest.documentIds.delete(id);
74
- this.updateDriveManifest(driveId, manifest);
75
- }
76
- }
77
- delete this.documents[id];
109
+ this.delete(id);
78
110
  }
79
111
  async getDrives() {
80
112
  return Object.keys(this.driveManifests);
@@ -125,7 +157,7 @@ export class MemoryStorage {
125
157
  }
126
158
  async deleteDrive(id) {
127
159
  // Get all documents in this drive
128
- const manifest = this.getDriveManifest(id);
160
+ const manifest = this.getManifest(id);
129
161
  // delete each document that belongs only to this drive
130
162
  const drives = await this.getDrives();
131
163
  await Promise.all([...manifest.documentIds].map((docId) => {
@@ -133,7 +165,7 @@ export class MemoryStorage {
133
165
  if (driveId === id) {
134
166
  continue;
135
167
  }
136
- const manifest = this.getDriveManifest(driveId);
168
+ const manifest = this.getManifest(driveId);
137
169
  if (manifest.documentIds.has(docId)) {
138
170
  return;
139
171
  }
@@ -176,7 +208,7 @@ export class MemoryStorage {
176
208
  ////////////////////////////////
177
209
  // Private
178
210
  ////////////////////////////////
179
- getDriveManifest(driveId) {
211
+ getManifest(driveId) {
180
212
  if (!this.driveManifests[driveId]) {
181
213
  this.driveManifests[driveId] = { documentIds: new Set() };
182
214
  }
@@ -1,9 +1,9 @@
1
+ import { ICache } from "#cache/types";
1
2
  import { PrismaStorage } from "#storage/prisma/index";
2
- import { IOperationsCache } from "#storage/types";
3
3
  export declare class PrismaStorageFactory {
4
4
  private readonly prisma;
5
5
  private readonly cache;
6
- constructor(dbUrl: string, cache: IOperationsCache);
6
+ constructor(dbUrl: string, cache: ICache);
7
7
  build(): PrismaStorage;
8
8
  }
9
9
  //# sourceMappingURL=factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../src/storage/prisma/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIlD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;gBAE7B,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB;IAWlD,KAAK;CAGN"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../src/storage/prisma/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAItD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAWxC,KAAK;CAGN"}
@@ -1,9 +1,10 @@
1
1
  import { type Prisma, type PrismaClient } from "@prisma/client";
2
2
  import type { BaseStateFromDocument, DocumentHeader, Operation, OperationFromDocument, PHDocument } from "document-model";
3
3
  import { type IBackOffOptions } from "exponential-backoff";
4
+ import { ICache } from "../../cache/types.js";
4
5
  import { type DocumentDriveAction, type DocumentDriveDocument } from "../../drive-document-model/gen/types.js";
5
6
  import { type SynchronizationUnitQuery } from "../../server/types.js";
6
- import type { IDocumentStorage, IDriveStorage, IOperationsCache } from "../types.js";
7
+ import type { IDocumentStorage, IDriveStorage } from "../types.js";
7
8
  export * from "./factory.js";
8
9
  type Transaction = Omit<PrismaClient<Prisma.PrismaClientOptions, never>, "$connect" | "$disconnect" | "$on" | "$transaction" | "$use" | "$extends"> | ExtendedPrismaClient;
9
10
  export type PrismaStorageOptions = {
@@ -26,12 +27,17 @@ declare function getRetryTransactionsClient<T extends PrismaClient>(prisma: T, b
26
27
  }, {}>;
27
28
  type ExtendedPrismaClient = ReturnType<typeof getRetryTransactionsClient<PrismaClient>>;
28
29
  export declare class PrismaStorage implements IDriveStorage, IDocumentStorage {
30
+ private logger;
29
31
  private db;
30
32
  private cache;
31
- constructor(db: PrismaClient, cache: IOperationsCache, options?: PrismaStorageOptions);
33
+ constructor(db: PrismaClient, cache: ICache, options?: PrismaStorageOptions);
32
34
  exists(documentId: string): Promise<boolean>;
33
35
  create(documentId: string, document: PHDocument): Promise<void>;
34
- get<TDocument extends PHDocument>(documentId: string): Promise<TDocument>;
36
+ get<TDocument extends PHDocument>(documentId: string, tx?: Transaction): Promise<TDocument>;
37
+ delete(documentId: string): Promise<boolean>;
38
+ addChild(parentId: string, childId: string): Promise<void>;
39
+ removeChild(parentId: string, childId: string): Promise<boolean>;
40
+ getChildren(parentId: string): Promise<string[]>;
35
41
  createDrive(id: string, drive: DocumentDriveDocument): Promise<void>;
36
42
  addDriveOperations(id: string, operations: Operation<DocumentDriveAction>[], header: DocumentHeader): Promise<void>;
37
43
  addDriveOperationsWithTransaction(drive: string, callback: (document: DocumentDriveDocument) => Promise<{
@@ -48,7 +54,7 @@ export declare class PrismaStorage implements IDriveStorage, IDocumentStorage {
48
54
  addDocumentOperations(drive: string, id: string, operations: Operation[], header: DocumentHeader): Promise<void>;
49
55
  getDocuments(drive: string): Promise<string[]>;
50
56
  checkDocumentExists(driveId: string, id: string): Promise<boolean>;
51
- getDocument<TDocument extends PHDocument>(driveId: string, id: string, tx?: Transaction): Promise<TDocument>;
57
+ getDocument<TDocument extends PHDocument>(driveId: string, documentId: string, tx?: Transaction): Promise<TDocument>;
52
58
  deleteDocument(drive: string, id: string): Promise<void>;
53
59
  getDrives(): Promise<string[]>;
54
60
  getDrive(id: string): Promise<DocumentDriveDocument>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/prisma/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/prisma/index.ts"],"names":[],"mappings":"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"}