@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.
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.js +3 -1
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/memoryCache.d.ts +1 -1
- package/dist/cache/nullCache.d.ts +14 -0
- package/dist/cache/nullCache.js +37 -0
- package/dist/cache/nullCache.js.map +1 -0
- package/dist/config.d.ts +16 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/crypto/openPGPCrypto.js +2 -0
- package/dist/crypto/openPGPCrypto.js.map +1 -1
- package/dist/diagnostic/eventsGenerator.d.ts +14 -0
- package/dist/diagnostic/eventsGenerator.js +49 -0
- package/dist/diagnostic/eventsGenerator.js.map +1 -0
- package/dist/diagnostic/httpClient.d.ts +16 -0
- package/dist/diagnostic/httpClient.js +81 -0
- package/dist/diagnostic/httpClient.js.map +1 -0
- package/dist/diagnostic/index.d.ts +10 -0
- package/dist/diagnostic/index.js +35 -0
- package/dist/diagnostic/index.js.map +1 -0
- package/dist/diagnostic/integrityVerificationStream.d.ts +21 -0
- package/dist/diagnostic/integrityVerificationStream.js +56 -0
- package/dist/diagnostic/integrityVerificationStream.js.map +1 -0
- package/dist/diagnostic/interface.d.ts +102 -0
- package/dist/diagnostic/interface.js +3 -0
- package/dist/diagnostic/interface.js.map +1 -0
- package/dist/diagnostic/sdkDiagnostic.d.ts +22 -0
- package/dist/diagnostic/sdkDiagnostic.js +216 -0
- package/dist/diagnostic/sdkDiagnostic.js.map +1 -0
- package/dist/diagnostic/sdkDiagnosticFull.d.ts +18 -0
- package/dist/diagnostic/sdkDiagnosticFull.js +35 -0
- package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -0
- package/dist/diagnostic/telemetry.d.ts +25 -0
- package/dist/diagnostic/telemetry.js +70 -0
- package/dist/diagnostic/telemetry.js.map +1 -0
- package/dist/diagnostic/zipGenerators.d.ts +9 -0
- package/dist/diagnostic/zipGenerators.js +64 -0
- package/dist/diagnostic/zipGenerators.js.map +1 -0
- package/dist/diagnostic/zipGenerators.test.js +144 -0
- package/dist/diagnostic/zipGenerators.test.js.map +1 -0
- package/dist/errors.d.ts +2 -1
- package/dist/errors.js +3 -1
- package/dist/errors.js.map +1 -1
- package/dist/interface/config.d.ts +26 -0
- package/dist/interface/config.js +3 -0
- package/dist/interface/config.js.map +1 -0
- package/dist/interface/download.d.ts +2 -2
- package/dist/interface/events.d.ts +60 -20
- package/dist/interface/events.js +11 -1
- package/dist/interface/events.js.map +1 -1
- package/dist/interface/httpClient.d.ts +0 -14
- package/dist/interface/index.d.ts +8 -4
- package/dist/interface/index.js +2 -1
- package/dist/interface/index.js.map +1 -1
- package/dist/interface/nodes.d.ts +9 -0
- package/dist/interface/nodes.js.map +1 -1
- package/dist/interface/sharing.d.ts +1 -0
- package/dist/interface/upload.d.ts +6 -0
- package/dist/internal/download/apiService.js +32 -31
- package/dist/internal/download/apiService.js.map +1 -1
- package/dist/internal/download/fileDownloader.d.ts +2 -2
- package/dist/internal/download/fileDownloader.js.map +1 -1
- package/dist/internal/events/apiService.d.ts +4 -6
- package/dist/internal/events/apiService.js +15 -22
- package/dist/internal/events/apiService.js.map +1 -1
- package/dist/internal/events/coreEventManager.d.ts +7 -10
- package/dist/internal/events/coreEventManager.js +19 -36
- package/dist/internal/events/coreEventManager.js.map +1 -1
- package/dist/internal/events/coreEventManager.test.js +87 -0
- package/dist/internal/events/coreEventManager.test.js.map +1 -0
- package/dist/internal/events/eventManager.d.ts +11 -36
- package/dist/internal/events/eventManager.js +59 -105
- package/dist/internal/events/eventManager.js.map +1 -1
- package/dist/internal/events/eventManager.test.js +167 -82
- package/dist/internal/events/eventManager.test.js.map +1 -1
- package/dist/internal/events/index.d.ts +13 -33
- package/dist/internal/events/index.js +56 -72
- package/dist/internal/events/index.js.map +1 -1
- package/dist/internal/events/interface.d.ts +59 -14
- package/dist/internal/events/interface.js +13 -3
- package/dist/internal/events/interface.js.map +1 -1
- package/dist/internal/events/volumeEventManager.d.ts +7 -17
- package/dist/internal/events/volumeEventManager.js +58 -45
- package/dist/internal/events/volumeEventManager.js.map +1 -1
- package/dist/internal/events/volumeEventManager.test.d.ts +1 -0
- package/dist/internal/events/volumeEventManager.test.js +203 -0
- package/dist/internal/events/volumeEventManager.test.js.map +1 -0
- package/dist/internal/nodes/cache.d.ts +10 -1
- package/dist/internal/nodes/cache.js +17 -0
- package/dist/internal/nodes/cache.js.map +1 -1
- package/dist/internal/nodes/cryptoService.d.ts +1 -1
- package/dist/internal/nodes/cryptoService.js.map +1 -1
- package/dist/internal/nodes/events.d.ts +7 -83
- package/dist/internal/nodes/events.js +43 -217
- package/dist/internal/nodes/events.js.map +1 -1
- package/dist/internal/nodes/events.test.js +27 -277
- package/dist/internal/nodes/events.test.js.map +1 -1
- package/dist/internal/nodes/index.d.ts +3 -4
- package/dist/internal/nodes/index.js +5 -5
- package/dist/internal/nodes/index.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.d.ts +15 -0
- package/dist/internal/nodes/nodesAccess.js +37 -0
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +131 -93
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.d.ts +1 -3
- package/dist/internal/nodes/nodesManagement.js +12 -26
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.test.js +35 -14
- package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
- package/dist/internal/shares/cache.d.ts +2 -0
- package/dist/internal/shares/cache.js +2 -0
- package/dist/internal/shares/cache.js.map +1 -1
- package/dist/internal/shares/manager.d.ts +1 -0
- package/dist/internal/shares/manager.js +3 -0
- package/dist/internal/shares/manager.js.map +1 -1
- package/dist/internal/sharing/apiService.js +1 -0
- package/dist/internal/sharing/apiService.js.map +1 -1
- package/dist/internal/sharing/cryptoService.js +1 -0
- package/dist/internal/sharing/cryptoService.js.map +1 -1
- package/dist/internal/sharing/events.d.ts +23 -55
- package/dist/internal/sharing/events.js +46 -138
- package/dist/internal/sharing/events.js.map +1 -1
- package/dist/internal/sharing/events.test.js +77 -180
- package/dist/internal/sharing/events.test.js.map +1 -1
- package/dist/internal/sharing/index.d.ts +4 -5
- package/dist/internal/sharing/index.js +5 -5
- package/dist/internal/sharing/index.js.map +1 -1
- package/dist/internal/sharing/interface.d.ts +3 -0
- package/dist/internal/sharing/sharingManagement.d.ts +2 -3
- package/dist/internal/sharing/sharingManagement.js +7 -9
- package/dist/internal/sharing/sharingManagement.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.test.js +9 -39
- package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
- package/dist/internal/upload/apiService.d.ts +2 -3
- package/dist/internal/upload/apiService.js +7 -4
- package/dist/internal/upload/apiService.js.map +1 -1
- package/dist/internal/upload/index.d.ts +2 -2
- package/dist/internal/upload/index.js +3 -3
- package/dist/internal/upload/index.js.map +1 -1
- package/dist/internal/upload/interface.d.ts +2 -0
- package/dist/internal/upload/manager.d.ts +5 -5
- package/dist/internal/upload/manager.js +19 -50
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +68 -44
- package/dist/internal/upload/manager.test.js.map +1 -1
- package/dist/internal/upload/streamUploader.js +1 -2
- package/dist/internal/upload/streamUploader.js.map +1 -1
- package/dist/internal/upload/streamUploader.test.js +1 -1
- package/dist/internal/upload/streamUploader.test.js.map +1 -1
- package/dist/protonDriveClient.d.ts +19 -162
- package/dist/protonDriveClient.js +26 -190
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePhotosClient.js +3 -2
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/package.json +3 -3
- package/src/cache/index.ts +1 -0
- package/src/cache/memoryCache.ts +1 -1
- package/src/cache/nullCache.ts +38 -0
- package/src/config.ts +17 -2
- package/src/crypto/openPGPCrypto.ts +2 -0
- package/src/diagnostic/eventsGenerator.ts +48 -0
- package/src/diagnostic/httpClient.ts +80 -0
- package/src/diagnostic/index.ts +38 -0
- package/src/diagnostic/integrityVerificationStream.ts +56 -0
- package/src/diagnostic/interface.ts +158 -0
- package/src/diagnostic/sdkDiagnostic.ts +238 -0
- package/src/diagnostic/sdkDiagnosticFull.ts +40 -0
- package/src/diagnostic/telemetry.ts +71 -0
- package/src/diagnostic/zipGenerators.test.ts +177 -0
- package/src/diagnostic/zipGenerators.ts +70 -0
- package/src/errors.ts +4 -1
- package/src/interface/config.ts +28 -0
- package/src/interface/download.ts +2 -2
- package/src/interface/events.ts +66 -21
- package/src/interface/httpClient.ts +0 -16
- package/src/interface/index.ts +8 -4
- package/src/interface/nodes.ts +21 -12
- package/src/interface/sharing.ts +1 -0
- package/src/interface/upload.ts +6 -0
- package/src/internal/download/apiService.ts +11 -8
- package/src/internal/download/fileDownloader.ts +2 -2
- package/src/internal/events/apiService.ts +25 -28
- package/src/internal/events/coreEventManager.test.ts +101 -0
- package/src/internal/events/coreEventManager.ts +20 -45
- package/src/internal/events/eventManager.test.ts +201 -88
- package/src/internal/events/eventManager.ts +69 -115
- package/src/internal/events/index.ts +54 -84
- package/src/internal/events/interface.ts +70 -15
- package/src/internal/events/volumeEventManager.test.ts +243 -0
- package/src/internal/events/volumeEventManager.ts +55 -53
- package/src/internal/nodes/cache.ts +20 -2
- package/src/internal/nodes/cryptoService.ts +1 -1
- package/src/internal/nodes/events.test.ts +29 -335
- package/src/internal/nodes/events.ts +45 -253
- package/src/internal/nodes/index.ts +6 -8
- package/src/internal/nodes/interface.ts +2 -2
- package/src/internal/nodes/nodesAccess.test.ts +132 -91
- package/src/internal/nodes/nodesAccess.ts +40 -1
- package/src/internal/nodes/nodesManagement.test.ts +39 -15
- package/src/internal/nodes/nodesManagement.ts +12 -30
- package/src/internal/shares/cache.ts +4 -2
- package/src/internal/shares/manager.ts +9 -5
- package/src/internal/sharing/apiService.ts +1 -0
- package/src/internal/sharing/cache.ts +1 -1
- package/src/internal/sharing/cryptoService.ts +1 -0
- package/src/internal/sharing/events.test.ts +89 -195
- package/src/internal/sharing/events.ts +42 -156
- package/src/internal/sharing/index.ts +6 -9
- package/src/internal/sharing/interface.ts +6 -2
- package/src/internal/sharing/sharingManagement.test.ts +10 -40
- package/src/internal/sharing/sharingManagement.ts +7 -11
- package/src/internal/upload/apiService.ts +5 -6
- package/src/internal/upload/index.ts +5 -5
- package/src/internal/upload/interface.ts +2 -0
- package/src/internal/upload/manager.test.ts +75 -45
- package/src/internal/upload/manager.ts +24 -54
- package/src/internal/upload/streamUploader.test.ts +0 -1
- package/src/internal/upload/streamUploader.ts +0 -2
- package/src/protonDriveClient.ts +75 -244
- package/src/protonDrivePhotosClient.ts +4 -3
- package/dist/internal/events/cache.d.ts +0 -28
- package/dist/internal/events/cache.js +0 -67
- package/dist/internal/events/cache.js.map +0 -1
- package/dist/internal/events/cache.test.js +0 -43
- package/dist/internal/events/cache.test.js.map +0 -1
- package/dist/internal/nodes/index.test.js +0 -114
- package/dist/internal/nodes/index.test.js.map +0 -1
- package/src/internal/events/cache.test.ts +0 -47
- package/src/internal/events/cache.ts +0 -80
- package/src/internal/nodes/index.test.ts +0 -137
- /package/dist/{internal/events/cache.test.d.ts → diagnostic/zipGenerators.test.d.ts} +0 -0
- /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
|
-
|
|
55
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|