@protontech/drive-sdk 0.0.13 → 0.1.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 (234) hide show
  1. package/dist/cache/index.d.ts +1 -0
  2. package/dist/cache/index.js +3 -1
  3. package/dist/cache/index.js.map +1 -1
  4. package/dist/cache/memoryCache.d.ts +1 -1
  5. package/dist/cache/nullCache.d.ts +14 -0
  6. package/dist/cache/nullCache.js +37 -0
  7. package/dist/cache/nullCache.js.map +1 -0
  8. package/dist/config.d.ts +16 -1
  9. package/dist/config.js +1 -1
  10. package/dist/config.js.map +1 -1
  11. package/dist/crypto/openPGPCrypto.js +2 -0
  12. package/dist/crypto/openPGPCrypto.js.map +1 -1
  13. package/dist/diagnostic/eventsGenerator.d.ts +14 -0
  14. package/dist/diagnostic/eventsGenerator.js +49 -0
  15. package/dist/diagnostic/eventsGenerator.js.map +1 -0
  16. package/dist/diagnostic/httpClient.d.ts +16 -0
  17. package/dist/diagnostic/httpClient.js +81 -0
  18. package/dist/diagnostic/httpClient.js.map +1 -0
  19. package/dist/diagnostic/index.d.ts +10 -0
  20. package/dist/diagnostic/index.js +35 -0
  21. package/dist/diagnostic/index.js.map +1 -0
  22. package/dist/diagnostic/integrityVerificationStream.d.ts +21 -0
  23. package/dist/diagnostic/integrityVerificationStream.js +56 -0
  24. package/dist/diagnostic/integrityVerificationStream.js.map +1 -0
  25. package/dist/diagnostic/interface.d.ts +102 -0
  26. package/dist/diagnostic/interface.js +3 -0
  27. package/dist/diagnostic/interface.js.map +1 -0
  28. package/dist/diagnostic/sdkDiagnostic.d.ts +22 -0
  29. package/dist/diagnostic/sdkDiagnostic.js +216 -0
  30. package/dist/diagnostic/sdkDiagnostic.js.map +1 -0
  31. package/dist/diagnostic/sdkDiagnosticFull.d.ts +18 -0
  32. package/dist/diagnostic/sdkDiagnosticFull.js +35 -0
  33. package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -0
  34. package/dist/diagnostic/telemetry.d.ts +25 -0
  35. package/dist/diagnostic/telemetry.js +70 -0
  36. package/dist/diagnostic/telemetry.js.map +1 -0
  37. package/dist/diagnostic/zipGenerators.d.ts +9 -0
  38. package/dist/diagnostic/zipGenerators.js +64 -0
  39. package/dist/diagnostic/zipGenerators.js.map +1 -0
  40. package/dist/diagnostic/zipGenerators.test.js +144 -0
  41. package/dist/diagnostic/zipGenerators.test.js.map +1 -0
  42. package/dist/errors.d.ts +2 -1
  43. package/dist/errors.js +3 -1
  44. package/dist/errors.js.map +1 -1
  45. package/dist/interface/config.d.ts +26 -0
  46. package/dist/interface/config.js +3 -0
  47. package/dist/interface/config.js.map +1 -0
  48. package/dist/interface/download.d.ts +2 -2
  49. package/dist/interface/events.d.ts +60 -20
  50. package/dist/interface/events.js +11 -1
  51. package/dist/interface/events.js.map +1 -1
  52. package/dist/interface/httpClient.d.ts +0 -14
  53. package/dist/interface/index.d.ts +8 -4
  54. package/dist/interface/index.js +2 -1
  55. package/dist/interface/index.js.map +1 -1
  56. package/dist/interface/nodes.d.ts +9 -0
  57. package/dist/interface/nodes.js.map +1 -1
  58. package/dist/interface/sharing.d.ts +1 -0
  59. package/dist/interface/upload.d.ts +6 -0
  60. package/dist/internal/download/apiService.js +32 -31
  61. package/dist/internal/download/apiService.js.map +1 -1
  62. package/dist/internal/download/fileDownloader.d.ts +2 -2
  63. package/dist/internal/download/fileDownloader.js.map +1 -1
  64. package/dist/internal/events/apiService.d.ts +4 -6
  65. package/dist/internal/events/apiService.js +15 -22
  66. package/dist/internal/events/apiService.js.map +1 -1
  67. package/dist/internal/events/coreEventManager.d.ts +7 -10
  68. package/dist/internal/events/coreEventManager.js +19 -36
  69. package/dist/internal/events/coreEventManager.js.map +1 -1
  70. package/dist/internal/events/coreEventManager.test.js +87 -0
  71. package/dist/internal/events/coreEventManager.test.js.map +1 -0
  72. package/dist/internal/events/eventManager.d.ts +11 -36
  73. package/dist/internal/events/eventManager.js +59 -105
  74. package/dist/internal/events/eventManager.js.map +1 -1
  75. package/dist/internal/events/eventManager.test.js +167 -82
  76. package/dist/internal/events/eventManager.test.js.map +1 -1
  77. package/dist/internal/events/index.d.ts +13 -33
  78. package/dist/internal/events/index.js +56 -72
  79. package/dist/internal/events/index.js.map +1 -1
  80. package/dist/internal/events/interface.d.ts +59 -14
  81. package/dist/internal/events/interface.js +13 -3
  82. package/dist/internal/events/interface.js.map +1 -1
  83. package/dist/internal/events/volumeEventManager.d.ts +7 -17
  84. package/dist/internal/events/volumeEventManager.js +58 -45
  85. package/dist/internal/events/volumeEventManager.js.map +1 -1
  86. package/dist/internal/events/volumeEventManager.test.d.ts +1 -0
  87. package/dist/internal/events/volumeEventManager.test.js +203 -0
  88. package/dist/internal/events/volumeEventManager.test.js.map +1 -0
  89. package/dist/internal/nodes/cache.d.ts +10 -1
  90. package/dist/internal/nodes/cache.js +17 -0
  91. package/dist/internal/nodes/cache.js.map +1 -1
  92. package/dist/internal/nodes/cryptoService.d.ts +1 -1
  93. package/dist/internal/nodes/cryptoService.js.map +1 -1
  94. package/dist/internal/nodes/events.d.ts +7 -83
  95. package/dist/internal/nodes/events.js +43 -217
  96. package/dist/internal/nodes/events.js.map +1 -1
  97. package/dist/internal/nodes/events.test.js +27 -277
  98. package/dist/internal/nodes/events.test.js.map +1 -1
  99. package/dist/internal/nodes/index.d.ts +3 -4
  100. package/dist/internal/nodes/index.js +5 -5
  101. package/dist/internal/nodes/index.js.map +1 -1
  102. package/dist/internal/nodes/nodesAccess.d.ts +15 -0
  103. package/dist/internal/nodes/nodesAccess.js +37 -0
  104. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  105. package/dist/internal/nodes/nodesAccess.test.js +131 -93
  106. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  107. package/dist/internal/nodes/nodesManagement.d.ts +1 -3
  108. package/dist/internal/nodes/nodesManagement.js +12 -26
  109. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  110. package/dist/internal/nodes/nodesManagement.test.js +35 -14
  111. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  112. package/dist/internal/shares/cache.d.ts +2 -0
  113. package/dist/internal/shares/cache.js +2 -0
  114. package/dist/internal/shares/cache.js.map +1 -1
  115. package/dist/internal/shares/manager.d.ts +1 -0
  116. package/dist/internal/shares/manager.js +3 -0
  117. package/dist/internal/shares/manager.js.map +1 -1
  118. package/dist/internal/sharing/apiService.js +1 -0
  119. package/dist/internal/sharing/apiService.js.map +1 -1
  120. package/dist/internal/sharing/cryptoService.js +1 -0
  121. package/dist/internal/sharing/cryptoService.js.map +1 -1
  122. package/dist/internal/sharing/events.d.ts +23 -55
  123. package/dist/internal/sharing/events.js +46 -138
  124. package/dist/internal/sharing/events.js.map +1 -1
  125. package/dist/internal/sharing/events.test.js +77 -180
  126. package/dist/internal/sharing/events.test.js.map +1 -1
  127. package/dist/internal/sharing/index.d.ts +4 -5
  128. package/dist/internal/sharing/index.js +5 -5
  129. package/dist/internal/sharing/index.js.map +1 -1
  130. package/dist/internal/sharing/interface.d.ts +3 -0
  131. package/dist/internal/sharing/sharingManagement.d.ts +2 -3
  132. package/dist/internal/sharing/sharingManagement.js +7 -9
  133. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  134. package/dist/internal/sharing/sharingManagement.test.js +9 -39
  135. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  136. package/dist/internal/upload/apiService.d.ts +2 -3
  137. package/dist/internal/upload/apiService.js +7 -4
  138. package/dist/internal/upload/apiService.js.map +1 -1
  139. package/dist/internal/upload/index.d.ts +2 -2
  140. package/dist/internal/upload/index.js +3 -3
  141. package/dist/internal/upload/index.js.map +1 -1
  142. package/dist/internal/upload/interface.d.ts +2 -0
  143. package/dist/internal/upload/manager.d.ts +5 -5
  144. package/dist/internal/upload/manager.js +19 -50
  145. package/dist/internal/upload/manager.js.map +1 -1
  146. package/dist/internal/upload/manager.test.js +68 -44
  147. package/dist/internal/upload/manager.test.js.map +1 -1
  148. package/dist/internal/upload/streamUploader.js +1 -2
  149. package/dist/internal/upload/streamUploader.js.map +1 -1
  150. package/dist/internal/upload/streamUploader.test.js +1 -1
  151. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  152. package/dist/protonDriveClient.d.ts +19 -162
  153. package/dist/protonDriveClient.js +26 -190
  154. package/dist/protonDriveClient.js.map +1 -1
  155. package/dist/protonDrivePhotosClient.js +3 -2
  156. package/dist/protonDrivePhotosClient.js.map +1 -1
  157. package/package.json +3 -3
  158. package/src/cache/index.ts +1 -0
  159. package/src/cache/memoryCache.ts +1 -1
  160. package/src/cache/nullCache.ts +38 -0
  161. package/src/config.ts +17 -2
  162. package/src/crypto/openPGPCrypto.ts +2 -0
  163. package/src/diagnostic/eventsGenerator.ts +48 -0
  164. package/src/diagnostic/httpClient.ts +80 -0
  165. package/src/diagnostic/index.ts +38 -0
  166. package/src/diagnostic/integrityVerificationStream.ts +56 -0
  167. package/src/diagnostic/interface.ts +158 -0
  168. package/src/diagnostic/sdkDiagnostic.ts +238 -0
  169. package/src/diagnostic/sdkDiagnosticFull.ts +40 -0
  170. package/src/diagnostic/telemetry.ts +71 -0
  171. package/src/diagnostic/zipGenerators.test.ts +177 -0
  172. package/src/diagnostic/zipGenerators.ts +70 -0
  173. package/src/errors.ts +4 -1
  174. package/src/interface/config.ts +28 -0
  175. package/src/interface/download.ts +2 -2
  176. package/src/interface/events.ts +66 -21
  177. package/src/interface/httpClient.ts +0 -16
  178. package/src/interface/index.ts +8 -4
  179. package/src/interface/nodes.ts +21 -12
  180. package/src/interface/sharing.ts +1 -0
  181. package/src/interface/upload.ts +6 -0
  182. package/src/internal/download/apiService.ts +11 -8
  183. package/src/internal/download/fileDownloader.ts +2 -2
  184. package/src/internal/events/apiService.ts +25 -28
  185. package/src/internal/events/coreEventManager.test.ts +101 -0
  186. package/src/internal/events/coreEventManager.ts +20 -45
  187. package/src/internal/events/eventManager.test.ts +201 -88
  188. package/src/internal/events/eventManager.ts +69 -115
  189. package/src/internal/events/index.ts +54 -84
  190. package/src/internal/events/interface.ts +70 -15
  191. package/src/internal/events/volumeEventManager.test.ts +243 -0
  192. package/src/internal/events/volumeEventManager.ts +55 -53
  193. package/src/internal/nodes/cache.ts +20 -2
  194. package/src/internal/nodes/cryptoService.ts +1 -1
  195. package/src/internal/nodes/events.test.ts +29 -335
  196. package/src/internal/nodes/events.ts +45 -253
  197. package/src/internal/nodes/index.ts +6 -8
  198. package/src/internal/nodes/interface.ts +2 -2
  199. package/src/internal/nodes/nodesAccess.test.ts +132 -91
  200. package/src/internal/nodes/nodesAccess.ts +40 -1
  201. package/src/internal/nodes/nodesManagement.test.ts +39 -15
  202. package/src/internal/nodes/nodesManagement.ts +12 -30
  203. package/src/internal/shares/cache.ts +4 -2
  204. package/src/internal/shares/manager.ts +9 -5
  205. package/src/internal/sharing/apiService.ts +1 -0
  206. package/src/internal/sharing/cache.ts +1 -1
  207. package/src/internal/sharing/cryptoService.ts +1 -0
  208. package/src/internal/sharing/events.test.ts +89 -195
  209. package/src/internal/sharing/events.ts +42 -156
  210. package/src/internal/sharing/index.ts +6 -9
  211. package/src/internal/sharing/interface.ts +6 -2
  212. package/src/internal/sharing/sharingManagement.test.ts +10 -40
  213. package/src/internal/sharing/sharingManagement.ts +7 -11
  214. package/src/internal/upload/apiService.ts +5 -6
  215. package/src/internal/upload/index.ts +5 -5
  216. package/src/internal/upload/interface.ts +2 -0
  217. package/src/internal/upload/manager.test.ts +75 -45
  218. package/src/internal/upload/manager.ts +24 -54
  219. package/src/internal/upload/streamUploader.test.ts +0 -1
  220. package/src/internal/upload/streamUploader.ts +0 -2
  221. package/src/protonDriveClient.ts +75 -244
  222. package/src/protonDrivePhotosClient.ts +4 -3
  223. package/dist/internal/events/cache.d.ts +0 -28
  224. package/dist/internal/events/cache.js +0 -67
  225. package/dist/internal/events/cache.js.map +0 -1
  226. package/dist/internal/events/cache.test.js +0 -43
  227. package/dist/internal/events/cache.test.js.map +0 -1
  228. package/dist/internal/nodes/index.test.js +0 -114
  229. package/dist/internal/nodes/index.test.js.map +0 -1
  230. package/src/internal/events/cache.test.ts +0 -47
  231. package/src/internal/events/cache.ts +0 -80
  232. package/src/internal/nodes/index.test.ts +0 -137
  233. /package/dist/{internal/events/cache.test.d.ts → diagnostic/zipGenerators.test.d.ts} +0 -0
  234. /package/dist/internal/{nodes/index.test.d.ts → events/coreEventManager.test.d.ts} +0 -0
@@ -2,16 +2,15 @@ import { NodeAPIService } from "./apiService";
2
2
  import { NodesCryptoCache } from "./cryptoCache";
3
3
  import { NodesCryptoService } from "./cryptoService";
4
4
  import { NodesAccess } from './nodesAccess';
5
- import { NodesEvents } from './events';
6
5
  import { DecryptedNode } from './interface';
7
6
  import { NodesManagement } from './nodesManagement';
7
+ import { NodeResult } from "../../interface";
8
8
 
9
9
  describe('NodesManagement', () => {
10
10
  let apiService: NodeAPIService;
11
11
  let cryptoCache: NodesCryptoCache;
12
12
  let cryptoService: NodesCryptoService;
13
13
  let nodesAccess: NodesAccess;
14
- let nodesEvents: NodesEvents;
15
14
  let management: NodesManagement;
16
15
 
17
16
  let nodes: { [uid: string]: DecryptedNode };
@@ -50,9 +49,15 @@ describe('NodesManagement', () => {
50
49
  apiService = {
51
50
  renameNode: jest.fn(),
52
51
  moveNode: jest.fn(),
53
- trashNodes: jest.fn(),
54
- restoreNodes: jest.fn(),
55
- deleteNodes: jest.fn(),
52
+ trashNodes: jest.fn(async function* (uids) {
53
+ yield* uids.map((uid) => ({ok: true, uid} as NodeResult))
54
+ }),
55
+ restoreNodes: jest.fn(async function* (uids) {
56
+ yield* uids.map((uid) => ({ok: true, uid} as NodeResult))
57
+ }),
58
+ deleteNodes: jest.fn(async function* (uids) {
59
+ yield* uids.map((uid) => ({ok: true, uid} as NodeResult))
60
+ }),
56
61
  createFolder: jest.fn(),
57
62
  }
58
63
  // @ts-expect-error No need to implement all methods for mocking
@@ -91,15 +96,11 @@ describe('NodesManagement', () => {
91
96
  nameSessionKey: `${uid}-nameSessionKey`,
92
97
  })),
93
98
  getRootNodeEmailKey: jest.fn().mockResolvedValue({ email: "root-email", addressKey: "root-key" }),
94
- }
95
- // @ts-expect-error No need to implement all methods for mocking
96
- nodesEvents = {
97
- nodeCreated: jest.fn(),
98
- nodeUpdated: jest.fn(),
99
- nodesDeleted: jest.fn(),
99
+ notifyNodeChanged: jest.fn(),
100
+ notifyNodeDeleted: jest.fn(),
100
101
  }
101
102
 
102
- management = new NodesManagement(apiService, cryptoCache, cryptoService, nodesAccess, nodesEvents);
103
+ management = new NodesManagement(apiService, cryptoCache, cryptoService, nodesAccess);
103
104
  });
104
105
 
105
106
  it('renameNode manages rename and updates cache', async () => {
@@ -108,6 +109,7 @@ describe('NodesManagement', () => {
108
109
  expect(newNode).toEqual({
109
110
  ...nodes.nodeUid,
110
111
  name: { ok: true, value: 'new name' },
112
+ encryptedName: 'newArmoredNodeName',
111
113
  nameAuthor: { ok: true, value: 'newSignatureEmail' },
112
114
  hash: 'newHash',
113
115
  });
@@ -123,7 +125,7 @@ describe('NodesManagement', () => {
123
125
  { hash: nodes.nodeUid.hash },
124
126
  { encryptedName: 'newArmoredNodeName', nameSignatureEmail: 'newSignatureEmail', hash: 'newHash' }
125
127
  );
126
- expect(nodesEvents.nodeUpdated).toHaveBeenCalledWith(newNode);
128
+ expect(nodesAccess.notifyNodeChanged).toHaveBeenCalledWith('nodeUid');
127
129
  });
128
130
 
129
131
  it('moveNode manages move and updates cache', async () => {
@@ -142,6 +144,7 @@ describe('NodesManagement', () => {
142
144
  expect(newNode).toEqual({
143
145
  ...nodes.nodeUid,
144
146
  parentUid: 'newParentNodeUid',
147
+ encryptedName: 'movedArmoredNodeName',
145
148
  hash: 'movedHash',
146
149
  keyAuthor: { ok: true, value: 'movedSignatureEmail' },
147
150
  nameAuthor: { ok: true, value: 'movedNameSignatureEmail' },
@@ -171,7 +174,7 @@ describe('NodesManagement', () => {
171
174
  signatureEmail: undefined,
172
175
  },
173
176
  );
174
- expect(nodesEvents.nodeUpdated).toHaveBeenCalledWith(newNode);
177
+ expect(nodesAccess.notifyNodeChanged).toHaveBeenCalledWith('nodeUid', 'newParentNodeUid');
175
178
  });
176
179
 
177
180
  it('moveNode manages move of anonymous node', async () => {
@@ -202,6 +205,7 @@ describe('NodesManagement', () => {
202
205
  expect(newNode).toEqual({
203
206
  ...nodes.anonymousNodeUid,
204
207
  parentUid: 'newParentNodeUid',
208
+ encryptedName: 'movedArmoredNodeName',
205
209
  hash: 'movedHash',
206
210
  keyAuthor: { ok: true, value: 'movedSignatureEmail' },
207
211
  nameAuthor: { ok: true, value: 'movedNameSignatureEmail' },
@@ -216,6 +220,26 @@ describe('NodesManagement', () => {
216
220
  ...encryptedCrypto
217
221
  },
218
222
  );
219
- expect(nodesEvents.nodeUpdated).toHaveBeenCalledWith(newNode);
220
223
  });
224
+
225
+ it("trashes node and updates cache", async () => {
226
+ const uids = ['v1~n1', 'v1~n2'];
227
+ const trashed = new Set();
228
+ for await (const node of management.trashNodes(uids)) {
229
+ trashed.add(node.uid);
230
+ }
231
+ expect(trashed).toEqual(new Set(uids));
232
+ expect(nodesAccess.notifyNodeChanged).toHaveBeenCalledTimes(2);
233
+ });
234
+
235
+ it("restores node and updates cache", async () => {
236
+ const uids = ['v1~n1', 'v1~n2'];
237
+ const restored = new Set();
238
+ for await (const node of management.restoreNodes(uids)) {
239
+ restored.add(node.uid);
240
+ }
241
+ expect(restored).toEqual(new Set(uids));
242
+ expect(nodesAccess.notifyNodeChanged).toHaveBeenCalledTimes(2);
243
+ });
244
+
221
245
  });
@@ -6,11 +6,11 @@ import { getErrorMessage } from '../errors';
6
6
  import { NodeAPIService } from "./apiService";
7
7
  import { NodesCryptoCache } from "./cryptoCache";
8
8
  import { NodesCryptoService } from "./cryptoService";
9
- import { NodesEvents } from './events';
10
9
  import { DecryptedNode } from "./interface";
11
10
  import { NodesAccess } from "./nodesAccess";
12
11
  import { validateNodeName } from "./validations";
13
12
  import { generateFolderExtendedAttributes } from "./extendedAttributes";
13
+ import { splitNodeUid } from '../uids';
14
14
 
15
15
  /**
16
16
  * Provides high-level actions for managing nodes.
@@ -27,13 +27,11 @@ export class NodesManagement {
27
27
  private cryptoCache: NodesCryptoCache,
28
28
  private cryptoService: NodesCryptoService,
29
29
  private nodesAccess: NodesAccess,
30
- private nodesEvents: NodesEvents,
31
30
  ) {
32
31
  this.apiService = apiService;
33
32
  this.cryptoCache = cryptoCache;
34
33
  this.cryptoService = cryptoService;
35
34
  this.nodesAccess = nodesAccess;
36
- this.nodesEvents = nodesEvents;
37
35
  }
38
36
 
39
37
  async renameNode(nodeUid: string, newName: string, options = { allowRenameRootNode: false }): Promise<DecryptedNode> {
@@ -71,13 +69,14 @@ export class NodesManagement {
71
69
  hash: hash,
72
70
  }
73
71
  );
72
+ await this.nodesAccess.notifyNodeChanged(nodeUid);
74
73
  const newNode: DecryptedNode = {
75
74
  ...node,
76
75
  name: resultOk(newName),
76
+ encryptedName: armoredNodeName,
77
77
  nameAuthor: resultOk(signatureEmail),
78
78
  hash,
79
79
  }
80
- await this.nodesEvents.nodeUpdated(newNode);
81
80
  return newNode;
82
81
  }
83
82
 
@@ -154,49 +153,30 @@ export class NodesManagement {
154
153
  );
155
154
  const newNode: DecryptedNode = {
156
155
  ...node,
156
+ encryptedName: encryptedCrypto.encryptedName,
157
157
  parentUid: newParentUid,
158
158
  hash: encryptedCrypto.hash,
159
159
  keyAuthor: resultOk(encryptedCrypto.signatureEmail),
160
160
  nameAuthor: resultOk(encryptedCrypto.nameSignatureEmail),
161
161
  };
162
- await this.nodesEvents.nodeUpdated(newNode);
162
+ await this.nodesAccess.notifyNodeChanged(node.uid, newParentUid);
163
163
  return newNode;
164
164
  }
165
165
 
166
166
  async* trashNodes(nodeUids: string[], signal?: AbortSignal): AsyncGenerator<NodeResult> {
167
- const nodesOrMissing = await Array.fromAsync(this.nodesAccess.iterateNodes(nodeUids, signal));
168
- const nodes = nodesOrMissing.filter(node => !('missingUid' in node)) as DecryptedNode[];
169
-
170
167
  for await (const result of this.apiService.trashNodes(nodeUids, signal)) {
171
168
  if (result.ok) {
172
- const node = nodes.find(node => node.uid === result.uid);
173
- if (node) {
174
- await this.nodesEvents.nodeUpdated({
175
- ...node,
176
- trashTime: new Date(),
177
- });
178
- }
169
+ await this.nodesAccess.notifyNodeChanged(result.uid);
179
170
  }
180
-
181
171
  yield result;
182
172
  }
183
173
  }
184
174
 
185
175
  async* restoreNodes(nodeUids: string[], signal?: AbortSignal): AsyncGenerator<NodeResult> {
186
- const nodesOrMissing = await Array.fromAsync(this.nodesAccess.iterateNodes(nodeUids, signal));
187
- const nodes = nodesOrMissing.filter(node => !('missingUid' in node)) as DecryptedNode[];
188
-
189
176
  for await (const result of this.apiService.restoreNodes(nodeUids, signal)) {
190
177
  if (result.ok) {
191
- const node = nodes.find(node => node.uid === result.uid);
192
- if (node) {
193
- await this.nodesEvents.nodeUpdated({
194
- ...node,
195
- trashTime: undefined,
196
- });
197
- }
178
+ await this.nodesAccess.notifyNodeChanged(result.uid);
198
179
  }
199
-
200
180
  yield result;
201
181
  }
202
182
  }
@@ -207,13 +187,13 @@ export class NodesManagement {
207
187
  for await (const result of this.apiService.deleteNodes(nodeUids, signal)) {
208
188
  if (result.ok) {
209
189
  deletedNodeUids.push(result.uid);
190
+ await this.nodesAccess.notifyNodeDeleted(result.uid);
210
191
  }
211
192
  yield result;
212
193
  }
213
-
214
- await this.nodesEvents.nodesDeleted(deletedNodeUids);
215
194
  }
216
195
 
196
+ // FIXME create test for create folder
217
197
  async createFolder(parentNodeUid: string, folderName: string, modificationTime?: Date): Promise<DecryptedNode> {
218
198
  validateNodeName(folderName);
219
199
 
@@ -242,6 +222,8 @@ export class NodesManagement {
242
222
  armoredExtendedAttributes: encryptedCrypto.folder.armoredExtendedAttributes,
243
223
  });
244
224
 
225
+ await this.nodesAccess.notifyChildCreated(parentNodeUid);
226
+
245
227
  const node: DecryptedNode = {
246
228
  // Internal metadata
247
229
  hash: encryptedCrypto.hash,
@@ -263,9 +245,9 @@ export class NodesManagement {
263
245
  keyAuthor: resultOk(encryptedCrypto.signatureEmail),
264
246
  nameAuthor: resultOk(encryptedCrypto.signatureEmail),
265
247
  name: resultOk(folderName),
248
+ treeEventScopeId: splitNodeUid(nodeUid).volumeId,
266
249
  }
267
250
 
268
- await this.nodesEvents.nodeCreated(node);
269
251
  await this.cryptoCache.setNodeKeys(nodeUid, keys);
270
252
  return node;
271
253
  }
@@ -4,8 +4,10 @@ import { Volume } from "./interface";
4
4
 
5
5
  /**
6
6
  * Provides caching for shares and volume metadata.
7
- *
7
+ *
8
8
  * The cache is responsible for serialising and deserialising volume metadata.
9
+ *
10
+ * This is only intended for the owner's main volume. There is no cache invalidation.
9
11
  */
10
12
  export class SharesCache {
11
13
  constructor(private logger: Logger, private driveCache: ProtonDriveEntitiesCache) {
@@ -61,4 +63,4 @@ function deserializeVolume(shareData: string): Volume {
61
63
  throw new Error('Invalid volume data');
62
64
  }
63
65
  return volume;
64
- }
66
+ }
@@ -43,7 +43,7 @@ export class SharesManager {
43
43
 
44
44
  /**
45
45
  * It returns the IDs of the My files section.
46
- *
46
+ *
47
47
  * If the default volume or My files section doesn't exist, it creates it.
48
48
  */
49
49
  async getMyFilesIDs(): Promise<VolumeShareNodeIDs> {
@@ -85,12 +85,12 @@ export class SharesManager {
85
85
 
86
86
  /**
87
87
  * Creates new default volume for the user.
88
- *
88
+ *
89
89
  * It generates the volume bootstrap, creates the volume on the server,
90
90
  * and caches the volume metadata.
91
- *
91
+ *
92
92
  * User can have only one default volume.
93
- *
93
+ *
94
94
  * @throws If the volume cannot be created (e.g., one already exists).
95
95
  */
96
96
  private async createVolume(): Promise<VolumeShareNodeIDs> {
@@ -117,7 +117,7 @@ export class SharesManager {
117
117
  * It is a high-level action that retrieves the private key for a share.
118
118
  * If prefers to use the cache, but if the key is not there, it fetches
119
119
  * the share from the API, decrypts it, and caches it.
120
- *
120
+ *
121
121
  * @param shareId - The ID of the share.
122
122
  * @returns The private key for the share.
123
123
  * @throws If the share is not found or cannot be decrypted, or cached.
@@ -195,6 +195,10 @@ export class SharesManager {
195
195
  };
196
196
  }
197
197
 
198
+ async isOwnVolume(volumeId: string): Promise<boolean>{
199
+ return (await this.getMyFilesIDs()).volumeId === volumeId;
200
+ }
201
+
198
202
  async getVolumeMetricContext(volumeId: string): Promise<MetricVolumeType> {
199
203
  const { volumeId: myVolumeId } = await this.getMyFilesIDs();
200
204
 
@@ -391,6 +391,7 @@ export class SharingAPIService {
391
391
  flags: shareUrl.Flags,
392
392
  creatorEmail: shareUrl.CreatorEmail,
393
393
  publicUrl: shareUrl.PublicUrl,
394
+ numberOfInitializedDownloads: shareUrl.NumAccesses,
394
395
  armoredUrlPassword: shareUrl.Password,
395
396
  urlPasswordSalt: shareUrl.UrlPasswordSalt,
396
397
  base64SharePassphraseKeyPacket: shareUrl.SharePassphraseKeyPacket,
@@ -3,7 +3,7 @@ import { SharingType } from "./interface";
3
3
 
4
4
  /**
5
5
  * Provides caching for shared by me and with me listings.
6
- *
6
+ *
7
7
  * The cache is responsible for serialising and deserialising the node
8
8
  * UIDs for each sharing type. Also, ensuring that only full lists are
9
9
  * cached.
@@ -347,6 +347,7 @@ export class SharingCryptoService {
347
347
  url: `${encryptedPublicLink.publicUrl}#${password}`,
348
348
  customPassword,
349
349
  creatorEmail: encryptedPublicLink.creatorEmail,
350
+ numberOfInitializedDownloads: encryptedPublicLink.numberOfInitializedDownloads
350
351
  }
351
352
  }
352
353