@protontech/drive-sdk 0.0.12 → 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 +8 -3
- package/dist/errors.js +11 -4
- 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 +9 -5
- package/dist/interface/index.js +2 -1
- package/dist/interface/index.js.map +1 -1
- package/dist/interface/nodes.d.ts +21 -1
- package/dist/interface/nodes.js +11 -0
- package/dist/interface/nodes.js.map +1 -1
- package/dist/interface/sharing.d.ts +1 -0
- package/dist/interface/upload.d.ts +57 -3
- package/dist/internal/apiService/driveTypes.d.ts +1341 -465
- package/dist/internal/apiService/errors.js +2 -2
- package/dist/internal/apiService/errors.js.map +1 -1
- package/dist/internal/apiService/transformers.js +2 -0
- package/dist/internal/apiService/transformers.js.map +1 -1
- package/dist/internal/asyncIteratorMap.d.ts +15 -0
- package/dist/internal/asyncIteratorMap.js +59 -0
- package/dist/internal/asyncIteratorMap.js.map +1 -0
- package/dist/internal/asyncIteratorMap.test.js +120 -0
- package/dist/internal/asyncIteratorMap.test.js.map +1 -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.d.ts +1 -0
- 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/apiService.d.ts +2 -2
- package/dist/internal/nodes/apiService.js +16 -6
- package/dist/internal/nodes/apiService.js.map +1 -1
- package/dist/internal/nodes/apiService.test.js +30 -8
- package/dist/internal/nodes/apiService.test.js.map +1 -1
- package/dist/internal/nodes/cache.d.ts +10 -1
- package/dist/internal/nodes/cache.js +18 -0
- package/dist/internal/nodes/cache.js.map +1 -1
- package/dist/internal/nodes/cache.test.js +1 -0
- package/dist/internal/nodes/cache.test.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/cryptoService.test.js +34 -0
- package/dist/internal/nodes/cryptoService.test.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/interface.d.ts +3 -1
- package/dist/internal/nodes/nodesAccess.d.ts +15 -0
- package/dist/internal/nodes/nodesAccess.js +65 -7
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +132 -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 +20 -2
- 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/fileUploader.d.ts +49 -53
- package/dist/internal/upload/fileUploader.js +91 -395
- package/dist/internal/upload/fileUploader.js.map +1 -1
- package/dist/internal/upload/fileUploader.test.js +38 -292
- package/dist/internal/upload/fileUploader.test.js.map +1 -1
- package/dist/internal/upload/index.d.ts +5 -5
- package/dist/internal/upload/index.js +23 -44
- 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 +6 -6
- package/dist/internal/upload/manager.js +32 -66
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +100 -117
- package/dist/internal/upload/manager.test.js.map +1 -1
- package/dist/internal/upload/streamUploader.d.ts +62 -0
- package/dist/internal/upload/streamUploader.js +440 -0
- package/dist/internal/upload/streamUploader.js.map +1 -0
- package/dist/internal/upload/streamUploader.test.d.ts +1 -0
- package/dist/internal/upload/streamUploader.test.js +358 -0
- package/dist/internal/upload/streamUploader.test.js.map +1 -0
- package/dist/protonDriveClient.d.ts +22 -165
- package/dist/protonDriveClient.js +27 -191
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePhotosClient.js +3 -2
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/package.json +4 -4
- 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 +13 -4
- 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 +9 -5
- package/src/interface/nodes.ts +32 -12
- package/src/interface/sharing.ts +1 -0
- package/src/interface/upload.ts +59 -3
- package/src/internal/apiService/driveTypes.ts +1341 -465
- package/src/internal/apiService/errors.ts +3 -2
- package/src/internal/apiService/transformers.ts +2 -0
- package/src/internal/asyncIteratorMap.test.ts +150 -0
- package/src/internal/asyncIteratorMap.ts +64 -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/apiService.test.ts +36 -7
- package/src/internal/nodes/apiService.ts +19 -7
- package/src/internal/nodes/cache.test.ts +1 -0
- package/src/internal/nodes/cache.ts +21 -2
- package/src/internal/nodes/cryptoService.test.ts +38 -0
- 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 +6 -3
- package/src/internal/nodes/nodesAccess.test.ts +133 -91
- package/src/internal/nodes/nodesAccess.ts +70 -8
- 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 +25 -2
- 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/fileUploader.test.ts +46 -376
- package/src/internal/upload/fileUploader.ts +114 -494
- package/src/internal/upload/index.ts +30 -54
- package/src/internal/upload/interface.ts +2 -0
- package/src/internal/upload/manager.test.ts +107 -124
- package/src/internal/upload/manager.ts +48 -80
- package/src/internal/upload/streamUploader.test.ts +468 -0
- package/src/internal/upload/streamUploader.ts +550 -0
- package/src/protonDriveClient.ts +80 -248
- 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 -112
- 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 -135
- /package/dist/{internal/events/cache.test.d.ts → diagnostic/zipGenerators.test.d.ts} +0 -0
- /package/dist/internal/{nodes/index.test.d.ts → asyncIteratorMap.test.d.ts} +0 -0
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EventsCache = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Provides caching for events IDs.
|
|
6
|
-
*/
|
|
7
|
-
class EventsCache {
|
|
8
|
-
driveCache;
|
|
9
|
-
/**
|
|
10
|
-
* Locally cached events data to avoid unnecessary reads from the cache.
|
|
11
|
-
* Data about last event ID or interval might be accessed often by events
|
|
12
|
-
* managers.
|
|
13
|
-
*/
|
|
14
|
-
events;
|
|
15
|
-
constructor(driveCache) {
|
|
16
|
-
this.driveCache = driveCache;
|
|
17
|
-
this.driveCache = driveCache;
|
|
18
|
-
}
|
|
19
|
-
async setLastEventId(volumeIdOrCore, eventsData) {
|
|
20
|
-
const events = await this.getEvents();
|
|
21
|
-
events[volumeIdOrCore] = eventsData;
|
|
22
|
-
await this.cacheEvents(events);
|
|
23
|
-
}
|
|
24
|
-
async getLastEventId(volumeIdOrCore) {
|
|
25
|
-
const events = await this.getEvents();
|
|
26
|
-
if (events[volumeIdOrCore]) {
|
|
27
|
-
return events[volumeIdOrCore].lastEventId;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
async getPollingIntervalInSeconds(volumeIdOrCore) {
|
|
31
|
-
const events = await this.getEvents();
|
|
32
|
-
if (events[volumeIdOrCore]) {
|
|
33
|
-
return events[volumeIdOrCore].pollingIntervalInSeconds;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
async isOwnVolume(volumeIdOrCore) {
|
|
37
|
-
const events = await this.getEvents();
|
|
38
|
-
if (events[volumeIdOrCore]) {
|
|
39
|
-
return events[volumeIdOrCore].isOwnVolume;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
async getSubscribedVolumeIds() {
|
|
43
|
-
const events = await this.getEvents();
|
|
44
|
-
return Object.keys(events).filter((volumeIdOrCore) => volumeIdOrCore !== 'core');
|
|
45
|
-
}
|
|
46
|
-
async getEvents() {
|
|
47
|
-
if (!this.events) {
|
|
48
|
-
this.events = await this.getCachedEvents();
|
|
49
|
-
}
|
|
50
|
-
return this.events;
|
|
51
|
-
}
|
|
52
|
-
async getCachedEvents() {
|
|
53
|
-
try {
|
|
54
|
-
const events = await this.driveCache.getEntity('events');
|
|
55
|
-
return JSON.parse(events);
|
|
56
|
-
}
|
|
57
|
-
catch { }
|
|
58
|
-
;
|
|
59
|
-
return {};
|
|
60
|
-
}
|
|
61
|
-
async cacheEvents(events) {
|
|
62
|
-
this.events = events;
|
|
63
|
-
await this.driveCache.setEntity('events', JSON.stringify(events));
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
exports.EventsCache = EventsCache;
|
|
67
|
-
//# sourceMappingURL=cache.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/internal/events/cache.ts"],"names":[],"mappings":";;;AAaA;;GAEG;AACH,MAAa,WAAW;IAQA;IAPpB;;;;OAIG;IACK,MAAM,CAAoB;IAElC,YAAoB,UAAoC;QAApC,eAAU,GAAV,UAAU,CAA0B;QACpD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,cAAsB,EAAE,UAAsB;QAC/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,MAAM,CAAC,cAAc,CAAC,GAAG,UAAU,CAAC;QACpC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,cAAsB;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC;QAC9C,CAAC;IACL,CAAC;IAED,KAAK,CAAC,2BAA2B,CAAC,cAAsB;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC,wBAAwB,CAAC;QAC3D,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,cAAsB;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC;QAC9C,CAAC;IACL,CAAC;IAED,KAAK,CAAC,sBAAsB;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC;IACrF,CAAC;IAEO,KAAK,CAAC,SAAS;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,eAAe;QACzB,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAAA,CAAC;QACX,OAAO,EAAE,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,MAAwB;QAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,CAAC;CACJ;AA/DD,kCA+DC"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const cache_1 = require("../../cache");
|
|
4
|
-
const cache_2 = require("./cache");
|
|
5
|
-
describe("EventsCache", () => {
|
|
6
|
-
let memoryCache;
|
|
7
|
-
let cache;
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
memoryCache = new cache_1.MemoryCache();
|
|
10
|
-
cache = new cache_2.EventsCache(memoryCache);
|
|
11
|
-
});
|
|
12
|
-
it("should store and retrieve last event ID", async () => {
|
|
13
|
-
const key = "volume1";
|
|
14
|
-
await cache.setLastEventId(key, { lastEventId: "eventId1", pollingIntervalInSeconds: 0, isOwnVolume: true });
|
|
15
|
-
await cache.setLastEventId(key, { lastEventId: "eventId2", pollingIntervalInSeconds: 0, isOwnVolume: true });
|
|
16
|
-
const result = await cache.getLastEventId(key);
|
|
17
|
-
expect(result).toBe("eventId2");
|
|
18
|
-
});
|
|
19
|
-
it("should store and retrieve polling interval", async () => {
|
|
20
|
-
const key = "volume1";
|
|
21
|
-
await cache.setLastEventId(key, { lastEventId: "lastEventId", pollingIntervalInSeconds: 10, isOwnVolume: true });
|
|
22
|
-
await cache.setLastEventId(key, { lastEventId: "lastEventId", pollingIntervalInSeconds: 20, isOwnVolume: true });
|
|
23
|
-
const result = await cache.getPollingIntervalInSeconds(key);
|
|
24
|
-
expect(result).toBe(20);
|
|
25
|
-
});
|
|
26
|
-
it("should store and retrieve subscribed volume IDs", async () => {
|
|
27
|
-
await cache.setLastEventId("volume1", { lastEventId: "lastEventId", pollingIntervalInSeconds: 0, isOwnVolume: true });
|
|
28
|
-
await cache.setLastEventId("volume2", { lastEventId: "lastEventId", pollingIntervalInSeconds: 0, isOwnVolume: true });
|
|
29
|
-
const result = await cache.getSubscribedVolumeIds();
|
|
30
|
-
expect(result).toStrictEqual(["volume1", "volume2"]);
|
|
31
|
-
});
|
|
32
|
-
it("should not fail if cache is empty", async () => {
|
|
33
|
-
const result = await cache.getLastEventId("volume1");
|
|
34
|
-
expect(result).toBe(undefined);
|
|
35
|
-
});
|
|
36
|
-
it("should call cache only once", async () => {
|
|
37
|
-
const spy = jest.spyOn(memoryCache, "getEntity");
|
|
38
|
-
await cache.getLastEventId("volume1");
|
|
39
|
-
await cache.getLastEventId("volume1");
|
|
40
|
-
expect(spy).toHaveBeenCalledTimes(1);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
//# sourceMappingURL=cache.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.test.js","sourceRoot":"","sources":["../../../src/internal/events/cache.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const interface_1 = require("../../interface");
|
|
4
|
-
const cache_1 = require("../../cache");
|
|
5
|
-
const telemetry_1 = require("../../tests/telemetry");
|
|
6
|
-
const events_1 = require("../events");
|
|
7
|
-
const uids_1 = require("../uids");
|
|
8
|
-
const index_1 = require("./index");
|
|
9
|
-
function generateSerializedNode(uid, parentUid = 'volumeId~root', params = {}) {
|
|
10
|
-
return JSON.stringify(generateNode(uid, parentUid, params));
|
|
11
|
-
}
|
|
12
|
-
function generateNode(uid, parentUid = 'volumeId~root', params = {}) {
|
|
13
|
-
return {
|
|
14
|
-
uid,
|
|
15
|
-
parentUid,
|
|
16
|
-
directMemberRole: interface_1.MemberRole.Admin,
|
|
17
|
-
type: interface_1.NodeType.File,
|
|
18
|
-
mediaType: "text",
|
|
19
|
-
isShared: false,
|
|
20
|
-
creationTime: new Date(),
|
|
21
|
-
trashTime: undefined,
|
|
22
|
-
isStale: false,
|
|
23
|
-
...params,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
describe('nodesModules integration tests', () => {
|
|
27
|
-
let apiService;
|
|
28
|
-
let driveEntitiesCache;
|
|
29
|
-
let driveCryptoCache;
|
|
30
|
-
let account;
|
|
31
|
-
let driveCrypto;
|
|
32
|
-
let eventCallbacks;
|
|
33
|
-
let driveEvents;
|
|
34
|
-
let sharesService;
|
|
35
|
-
let nodesModule;
|
|
36
|
-
beforeEach(() => {
|
|
37
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
38
|
-
apiService = {};
|
|
39
|
-
driveEntitiesCache = new cache_1.MemoryCache();
|
|
40
|
-
driveCryptoCache = new cache_1.MemoryCache();
|
|
41
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
42
|
-
account = {};
|
|
43
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
44
|
-
driveCrypto = {};
|
|
45
|
-
eventCallbacks = [];
|
|
46
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
47
|
-
driveEvents = {
|
|
48
|
-
addListener: jest.fn().mockImplementation((callback) => {
|
|
49
|
-
eventCallbacks.push(callback);
|
|
50
|
-
}),
|
|
51
|
-
};
|
|
52
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
53
|
-
sharesService = {};
|
|
54
|
-
nodesModule = (0, index_1.initNodesModule)((0, telemetry_1.getMockTelemetry)(), apiService, driveEntitiesCache, driveCryptoCache, account, driveCrypto, driveEvents, sharesService);
|
|
55
|
-
});
|
|
56
|
-
test('should move node from one folder to another after move event', async () => {
|
|
57
|
-
// Prepare two folders (original and target) and a node in the original folder.
|
|
58
|
-
const originalFolderUid = (0, uids_1.makeNodeUid)('volumeId', 'originalFolder');
|
|
59
|
-
await driveEntitiesCache.setEntity(`node-${originalFolderUid}`, generateSerializedNode(originalFolderUid));
|
|
60
|
-
await driveEntitiesCache.setEntity(`node-children-${originalFolderUid}`, 'loaded');
|
|
61
|
-
const targetFolderUid = (0, uids_1.makeNodeUid)('volumeId', 'targetFolder');
|
|
62
|
-
await driveEntitiesCache.setEntity(`node-${targetFolderUid}`, generateSerializedNode(targetFolderUid));
|
|
63
|
-
await driveEntitiesCache.setEntity(`node-children-${targetFolderUid}`, 'loaded');
|
|
64
|
-
const nodeUid = (0, uids_1.makeNodeUid)('volumeId', 'node1');
|
|
65
|
-
await driveEntitiesCache.setEntity(`node-${nodeUid}`, generateSerializedNode(nodeUid, originalFolderUid), [`nodeParentUid:${originalFolderUid}`]);
|
|
66
|
-
// Mock the API services to return the moved node.
|
|
67
|
-
// This is called when listing the children of the target folder after
|
|
68
|
-
// move event (when node marked as stale).
|
|
69
|
-
apiService.post = jest.fn().mockImplementation(async (url, body) => {
|
|
70
|
-
expect(url).toBe(`drive/v2/volumes/volumeId/links`);
|
|
71
|
-
return {
|
|
72
|
-
Links: [{
|
|
73
|
-
Link: {
|
|
74
|
-
LinkID: 'node1',
|
|
75
|
-
ParentLinkID: 'targetFolder',
|
|
76
|
-
NameHash: 'hash',
|
|
77
|
-
Type: 2,
|
|
78
|
-
},
|
|
79
|
-
File: {
|
|
80
|
-
ActiveRevision: {},
|
|
81
|
-
},
|
|
82
|
-
}],
|
|
83
|
-
};
|
|
84
|
-
});
|
|
85
|
-
jest.spyOn(nodesModule.access, 'getParentKeys').mockResolvedValue({ key: { _idx: 32131 } });
|
|
86
|
-
// Verify the inital state before move event is sent.
|
|
87
|
-
const originalBeforeMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(originalFolderUid));
|
|
88
|
-
expect(originalBeforeMove).toMatchObject([{ uid: nodeUid, parentUid: originalFolderUid }]);
|
|
89
|
-
const targetBeforeMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(targetFolderUid));
|
|
90
|
-
expect(targetBeforeMove).toMatchObject([]);
|
|
91
|
-
// Send the move event that updates the cache.
|
|
92
|
-
const events = [
|
|
93
|
-
{
|
|
94
|
-
type: events_1.DriveEventType.NodeUpdated,
|
|
95
|
-
nodeUid,
|
|
96
|
-
parentNodeUid: targetFolderUid,
|
|
97
|
-
isTrashed: false,
|
|
98
|
-
isShared: false,
|
|
99
|
-
isOwnVolume: true,
|
|
100
|
-
},
|
|
101
|
-
];
|
|
102
|
-
await Promise.all(eventCallbacks.map((callback) => callback(events)));
|
|
103
|
-
// Verify the state after the move event, including when API service is called.
|
|
104
|
-
const originalAfterMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(originalFolderUid));
|
|
105
|
-
expect(originalAfterMove).toMatchObject([]);
|
|
106
|
-
expect(apiService.post).not.toHaveBeenCalled();
|
|
107
|
-
const targetAfterMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(targetFolderUid));
|
|
108
|
-
expect(targetAfterMove).toMatchObject([{ uid: nodeUid, parentUid: targetFolderUid }]);
|
|
109
|
-
expect(apiService.post).toHaveBeenCalledTimes(1);
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
//# sourceMappingURL=index.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/internal/nodes/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { MemoryCache } from "../../cache";
|
|
2
|
-
import { EventsCache } from "./cache";
|
|
3
|
-
|
|
4
|
-
describe("EventsCache", () => {
|
|
5
|
-
let memoryCache: MemoryCache<string>;
|
|
6
|
-
let cache: EventsCache;
|
|
7
|
-
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
memoryCache = new MemoryCache();
|
|
10
|
-
cache = new EventsCache(memoryCache);
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
it("should store and retrieve last event ID", async () => {
|
|
14
|
-
const key = "volume1";
|
|
15
|
-
await cache.setLastEventId(key, { lastEventId: "eventId1", pollingIntervalInSeconds: 0, isOwnVolume: true });
|
|
16
|
-
await cache.setLastEventId(key, { lastEventId: "eventId2", pollingIntervalInSeconds: 0, isOwnVolume: true });
|
|
17
|
-
const result = await cache.getLastEventId(key);
|
|
18
|
-
expect(result).toBe("eventId2");
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it("should store and retrieve polling interval", async () => {
|
|
22
|
-
const key = "volume1";
|
|
23
|
-
await cache.setLastEventId(key, { lastEventId: "lastEventId", pollingIntervalInSeconds: 10, isOwnVolume: true });
|
|
24
|
-
await cache.setLastEventId(key, { lastEventId: "lastEventId", pollingIntervalInSeconds: 20, isOwnVolume: true });
|
|
25
|
-
const result = await cache.getPollingIntervalInSeconds(key);
|
|
26
|
-
expect(result).toBe(20);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it("should store and retrieve subscribed volume IDs", async () => {
|
|
30
|
-
await cache.setLastEventId("volume1", { lastEventId: "lastEventId", pollingIntervalInSeconds: 0, isOwnVolume: true });
|
|
31
|
-
await cache.setLastEventId("volume2", { lastEventId: "lastEventId", pollingIntervalInSeconds: 0, isOwnVolume: true });
|
|
32
|
-
const result = await cache.getSubscribedVolumeIds();
|
|
33
|
-
expect(result).toStrictEqual(["volume1", "volume2"]);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it("should not fail if cache is empty", async () => {
|
|
37
|
-
const result = await cache.getLastEventId("volume1");
|
|
38
|
-
expect(result).toBe(undefined);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
it("should call cache only once", async () => {
|
|
42
|
-
const spy = jest.spyOn(memoryCache, "getEntity");
|
|
43
|
-
await cache.getLastEventId("volume1");
|
|
44
|
-
await cache.getLastEventId("volume1");
|
|
45
|
-
expect(spy).toHaveBeenCalledTimes(1);
|
|
46
|
-
});
|
|
47
|
-
});
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { ProtonDriveEntitiesCache } from "../../interface";
|
|
2
|
-
|
|
3
|
-
type CachedEventsData = {
|
|
4
|
-
// Key is either a volume ID for volume events or 'core' for core events.
|
|
5
|
-
[key: string]: EventsData;
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
interface EventsData {
|
|
9
|
-
lastEventId: string;
|
|
10
|
-
pollingIntervalInSeconds: number;
|
|
11
|
-
isOwnVolume: boolean;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Provides caching for events IDs.
|
|
16
|
-
*/
|
|
17
|
-
export class EventsCache {
|
|
18
|
-
/**
|
|
19
|
-
* Locally cached events data to avoid unnecessary reads from the cache.
|
|
20
|
-
* Data about last event ID or interval might be accessed often by events
|
|
21
|
-
* managers.
|
|
22
|
-
*/
|
|
23
|
-
private events?: CachedEventsData;
|
|
24
|
-
|
|
25
|
-
constructor(private driveCache: ProtonDriveEntitiesCache) {
|
|
26
|
-
this.driveCache = driveCache;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async setLastEventId(volumeIdOrCore: string, eventsData: EventsData): Promise<void> {
|
|
30
|
-
const events = await this.getEvents();
|
|
31
|
-
events[volumeIdOrCore] = eventsData;
|
|
32
|
-
await this.cacheEvents(events);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
async getLastEventId(volumeIdOrCore: string): Promise<string | undefined> {
|
|
36
|
-
const events = await this.getEvents();
|
|
37
|
-
if (events[volumeIdOrCore]) {
|
|
38
|
-
return events[volumeIdOrCore].lastEventId;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
async getPollingIntervalInSeconds(volumeIdOrCore: string): Promise<number | undefined> {
|
|
43
|
-
const events = await this.getEvents();
|
|
44
|
-
if (events[volumeIdOrCore]) {
|
|
45
|
-
return events[volumeIdOrCore].pollingIntervalInSeconds;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
async isOwnVolume(volumeIdOrCore: string): Promise<boolean | undefined> {
|
|
50
|
-
const events = await this.getEvents();
|
|
51
|
-
if (events[volumeIdOrCore]) {
|
|
52
|
-
return events[volumeIdOrCore].isOwnVolume;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
async getSubscribedVolumeIds(): Promise<string[]> {
|
|
57
|
-
const events = await this.getEvents();
|
|
58
|
-
return Object.keys(events).filter((volumeIdOrCore) => volumeIdOrCore !== 'core');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
private async getEvents(): Promise<CachedEventsData> {
|
|
62
|
-
if (!this.events) {
|
|
63
|
-
this.events = await this.getCachedEvents();
|
|
64
|
-
}
|
|
65
|
-
return this.events;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
private async getCachedEvents(): Promise<CachedEventsData> {
|
|
69
|
-
try {
|
|
70
|
-
const events = await this.driveCache.getEntity('events');
|
|
71
|
-
return JSON.parse(events);
|
|
72
|
-
} catch {};
|
|
73
|
-
return {};
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
private async cacheEvents(events: CachedEventsData): Promise<void> {
|
|
77
|
-
this.events = events;
|
|
78
|
-
await this.driveCache.setEntity('events', JSON.stringify(events));
|
|
79
|
-
}
|
|
80
|
-
}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { ProtonDriveEntitiesCache, ProtonDriveCryptoCache, ProtonDriveAccount, MemberRole, NodeType } from "../../interface";
|
|
2
|
-
import { DriveCrypto } from "../../crypto";
|
|
3
|
-
import { MemoryCache } from "../../cache";
|
|
4
|
-
import { getMockTelemetry } from "../../tests/telemetry";
|
|
5
|
-
import { DriveAPIService } from "../apiService";
|
|
6
|
-
import { DriveEventsService, DriveListener, DriveEvent, DriveEventType } from "../events";
|
|
7
|
-
import { makeNodeUid } from "../uids";
|
|
8
|
-
import { SharesService, DecryptedNode } from "./interface";
|
|
9
|
-
import { initNodesModule } from './index';
|
|
10
|
-
|
|
11
|
-
function generateSerializedNode(uid: string, parentUid = 'volumeId~root', params: Partial<DecryptedNode> = {}): string {
|
|
12
|
-
return JSON.stringify(generateNode(uid, parentUid, params));
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function generateNode(uid: string, parentUid = 'volumeId~root', params: Partial<DecryptedNode> = {}): DecryptedNode {
|
|
16
|
-
return {
|
|
17
|
-
uid,
|
|
18
|
-
parentUid,
|
|
19
|
-
directMemberRole: MemberRole.Admin,
|
|
20
|
-
type: NodeType.File,
|
|
21
|
-
mediaType: "text",
|
|
22
|
-
isShared: false,
|
|
23
|
-
creationTime: new Date(),
|
|
24
|
-
trashTime: undefined,
|
|
25
|
-
isStale: false,
|
|
26
|
-
...params,
|
|
27
|
-
} as DecryptedNode;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
describe('nodesModules integration tests', () => {
|
|
31
|
-
let apiService: DriveAPIService;
|
|
32
|
-
let driveEntitiesCache: ProtonDriveEntitiesCache;
|
|
33
|
-
let driveCryptoCache: ProtonDriveCryptoCache;
|
|
34
|
-
let account: ProtonDriveAccount;
|
|
35
|
-
let driveCrypto: DriveCrypto;
|
|
36
|
-
let eventCallbacks: DriveListener[];
|
|
37
|
-
let driveEvents: DriveEventsService;
|
|
38
|
-
let sharesService: SharesService;
|
|
39
|
-
let nodesModule: ReturnType<typeof initNodesModule>;
|
|
40
|
-
|
|
41
|
-
beforeEach(() => {
|
|
42
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
43
|
-
apiService = {}
|
|
44
|
-
driveEntitiesCache = new MemoryCache();
|
|
45
|
-
driveCryptoCache = new MemoryCache();
|
|
46
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
47
|
-
account = {}
|
|
48
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
49
|
-
driveCrypto = {}
|
|
50
|
-
eventCallbacks = [];
|
|
51
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
52
|
-
driveEvents = {
|
|
53
|
-
addListener: jest.fn().mockImplementation((callback) => {
|
|
54
|
-
eventCallbacks.push(callback);
|
|
55
|
-
}),
|
|
56
|
-
}
|
|
57
|
-
// @ts-expect-error No need to implement all methods for mocking
|
|
58
|
-
sharesService = {}
|
|
59
|
-
|
|
60
|
-
nodesModule = initNodesModule(
|
|
61
|
-
getMockTelemetry(),
|
|
62
|
-
apiService,
|
|
63
|
-
driveEntitiesCache,
|
|
64
|
-
driveCryptoCache,
|
|
65
|
-
account,
|
|
66
|
-
driveCrypto,
|
|
67
|
-
driveEvents,
|
|
68
|
-
sharesService,
|
|
69
|
-
);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
test('should move node from one folder to another after move event', async () => {
|
|
73
|
-
// Prepare two folders (original and target) and a node in the original folder.
|
|
74
|
-
const originalFolderUid = makeNodeUid('volumeId', 'originalFolder');
|
|
75
|
-
await driveEntitiesCache.setEntity(`node-${originalFolderUid}`, generateSerializedNode(originalFolderUid));
|
|
76
|
-
await driveEntitiesCache.setEntity(`node-children-${originalFolderUid}`, 'loaded');
|
|
77
|
-
|
|
78
|
-
const targetFolderUid = makeNodeUid('volumeId', 'targetFolder');
|
|
79
|
-
await driveEntitiesCache.setEntity(`node-${targetFolderUid}`, generateSerializedNode(targetFolderUid));
|
|
80
|
-
await driveEntitiesCache.setEntity(`node-children-${targetFolderUid}`, 'loaded');
|
|
81
|
-
|
|
82
|
-
const nodeUid = makeNodeUid('volumeId', 'node1');
|
|
83
|
-
await driveEntitiesCache.setEntity(`node-${nodeUid}`, generateSerializedNode(nodeUid, originalFolderUid), [`nodeParentUid:${originalFolderUid}`]);
|
|
84
|
-
|
|
85
|
-
// Mock the API services to return the moved node.
|
|
86
|
-
// This is called when listing the children of the target folder after
|
|
87
|
-
// move event (when node marked as stale).
|
|
88
|
-
apiService.post = jest.fn().mockImplementation(async (url, body) => {
|
|
89
|
-
expect(url).toBe(`drive/v2/volumes/volumeId/links`);
|
|
90
|
-
return {
|
|
91
|
-
Links: [{
|
|
92
|
-
Link: {
|
|
93
|
-
LinkID: 'node1',
|
|
94
|
-
ParentLinkID: 'targetFolder',
|
|
95
|
-
NameHash: 'hash',
|
|
96
|
-
Type: 2,
|
|
97
|
-
},
|
|
98
|
-
File: {
|
|
99
|
-
ActiveRevision: {},
|
|
100
|
-
},
|
|
101
|
-
}],
|
|
102
|
-
};
|
|
103
|
-
});
|
|
104
|
-
jest.spyOn(nodesModule.access, 'getParentKeys').mockResolvedValue({ key: { _idx: 32131 } } as any);
|
|
105
|
-
|
|
106
|
-
// Verify the inital state before move event is sent.
|
|
107
|
-
const originalBeforeMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(originalFolderUid));
|
|
108
|
-
expect(originalBeforeMove).toMatchObject([{ uid: nodeUid, parentUid: originalFolderUid }]);
|
|
109
|
-
|
|
110
|
-
const targetBeforeMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(targetFolderUid));
|
|
111
|
-
expect(targetBeforeMove).toMatchObject([]);
|
|
112
|
-
|
|
113
|
-
// Send the move event that updates the cache.
|
|
114
|
-
const events: DriveEvent[] = [
|
|
115
|
-
{
|
|
116
|
-
type: DriveEventType.NodeUpdated,
|
|
117
|
-
nodeUid,
|
|
118
|
-
parentNodeUid: targetFolderUid,
|
|
119
|
-
isTrashed: false,
|
|
120
|
-
isShared: false,
|
|
121
|
-
isOwnVolume: true,
|
|
122
|
-
},
|
|
123
|
-
]
|
|
124
|
-
await Promise.all(eventCallbacks.map((callback) => callback(events)));
|
|
125
|
-
|
|
126
|
-
// Verify the state after the move event, including when API service is called.
|
|
127
|
-
const originalAfterMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(originalFolderUid));
|
|
128
|
-
expect(originalAfterMove).toMatchObject([]);
|
|
129
|
-
expect(apiService.post).not.toHaveBeenCalled();
|
|
130
|
-
|
|
131
|
-
const targetAfterMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(targetFolderUid));
|
|
132
|
-
expect(targetAfterMove).toMatchObject([{ uid: nodeUid, parentUid: targetFolderUid }]);
|
|
133
|
-
expect(apiService.post).toHaveBeenCalledTimes(1);
|
|
134
|
-
});
|
|
135
|
-
});
|
|
File without changes
|
|
File without changes
|