@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,3 +1,4 @@
|
|
|
1
|
+
import { Logger } from "../../interface";
|
|
1
2
|
/**
|
|
2
3
|
* Callback that accepts list of Drive events and flag whether no
|
|
3
4
|
* event should be processed, but rather full cache refresh should be
|
|
@@ -5,14 +6,23 @@
|
|
|
5
6
|
*
|
|
6
7
|
* @param fullRefreshVolumeId - ID of the volume that should be fully refreshed.
|
|
7
8
|
*/
|
|
8
|
-
export type DriveListener = (
|
|
9
|
+
export type DriveListener = (event: DriveEvent) => Promise<void>;
|
|
10
|
+
export interface Event {
|
|
11
|
+
eventId: string;
|
|
12
|
+
}
|
|
13
|
+
export interface EventSubscription {
|
|
14
|
+
dispose(): void;
|
|
15
|
+
}
|
|
16
|
+
export interface LatestEventIdProvider {
|
|
17
|
+
getLatestEventId(treeEventScopeId: string): string | null;
|
|
18
|
+
}
|
|
9
19
|
/**
|
|
10
20
|
* Generic internal event interface representing a list of events
|
|
11
21
|
* with metadata about the last event ID, whether there are more
|
|
12
22
|
* events to fetch, or whether the listener should refresh its state.
|
|
13
23
|
*/
|
|
14
|
-
export type
|
|
15
|
-
|
|
24
|
+
export type EventsListWithStatus<T> = {
|
|
25
|
+
latestEventId: string;
|
|
16
26
|
more: boolean;
|
|
17
27
|
refresh: boolean;
|
|
18
28
|
events: T[];
|
|
@@ -20,28 +30,63 @@ export type Events<T> = {
|
|
|
20
30
|
/**
|
|
21
31
|
* Internal event interface representing a list of specific Drive events.
|
|
22
32
|
*/
|
|
23
|
-
export type
|
|
24
|
-
|
|
25
|
-
|
|
33
|
+
export type DriveEventsListWithStatus = EventsListWithStatus<DriveEvent>;
|
|
34
|
+
type NodeCruEventType = DriveEventType.NodeCreated | DriveEventType.NodeUpdated;
|
|
35
|
+
export type NodeEventType = NodeCruEventType | DriveEventType.NodeDeleted;
|
|
36
|
+
export type NodeEvent = {
|
|
37
|
+
type: NodeCruEventType;
|
|
26
38
|
nodeUid: string;
|
|
27
39
|
parentNodeUid?: string;
|
|
28
40
|
isTrashed: boolean;
|
|
29
41
|
isShared: boolean;
|
|
30
|
-
|
|
42
|
+
treeEventScopeId: string;
|
|
43
|
+
eventId: string;
|
|
31
44
|
} | {
|
|
32
45
|
type: DriveEventType.NodeDeleted;
|
|
33
46
|
nodeUid: string;
|
|
34
47
|
parentNodeUid?: string;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
type: DriveEventType.
|
|
48
|
+
treeEventScopeId: string;
|
|
49
|
+
eventId: string;
|
|
50
|
+
};
|
|
51
|
+
export type FastForwardEvent = {
|
|
52
|
+
type: DriveEventType.FastForward;
|
|
53
|
+
treeEventScopeId: string;
|
|
54
|
+
eventId: string;
|
|
55
|
+
};
|
|
56
|
+
export type TreeRefreshEvent = {
|
|
57
|
+
type: DriveEventType.TreeRefresh;
|
|
58
|
+
treeEventScopeId: string;
|
|
59
|
+
eventId: string;
|
|
40
60
|
};
|
|
61
|
+
export type TreeRemovalEvent = {
|
|
62
|
+
type: DriveEventType.TreeRemove;
|
|
63
|
+
treeEventScopeId: string;
|
|
64
|
+
eventId: 'none';
|
|
65
|
+
};
|
|
66
|
+
export type SharedWithMeUpdated = {
|
|
67
|
+
type: DriveEventType.SharedWithMeUpdated;
|
|
68
|
+
eventId: string;
|
|
69
|
+
treeEventScopeId: 'core';
|
|
70
|
+
};
|
|
71
|
+
export type DriveEvent = NodeEvent | FastForwardEvent | TreeRefreshEvent | TreeRemovalEvent | FastForwardEvent | SharedWithMeUpdated;
|
|
41
72
|
export declare enum DriveEventType {
|
|
42
73
|
NodeCreated = "node_created",
|
|
43
74
|
NodeUpdated = "node_updated",
|
|
44
|
-
NodeUpdatedMetadata = "node_updated_metadata",
|
|
45
75
|
NodeDeleted = "node_deleted",
|
|
46
|
-
|
|
76
|
+
SharedWithMeUpdated = "shared_with_me_updated",
|
|
77
|
+
TreeRefresh = "tree_refresh",
|
|
78
|
+
TreeRemove = "tree_remove",
|
|
79
|
+
FastForward = "fast_forward"
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* This can happen if all shared nodes in that volume where unshared or if the
|
|
83
|
+
* volume was deleted.
|
|
84
|
+
*/
|
|
85
|
+
export declare class UnsubscribeFromEventsSourceError extends Error {
|
|
86
|
+
}
|
|
87
|
+
export interface EventManagerInterface<T> {
|
|
88
|
+
getLatestEventId(): Promise<string>;
|
|
89
|
+
getEvents(eventId: string): AsyncIterable<T>;
|
|
90
|
+
getLogger(): Logger;
|
|
47
91
|
}
|
|
92
|
+
export {};
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DriveEventType = void 0;
|
|
3
|
+
exports.UnsubscribeFromEventsSourceError = exports.DriveEventType = void 0;
|
|
4
4
|
var DriveEventType;
|
|
5
5
|
(function (DriveEventType) {
|
|
6
6
|
DriveEventType["NodeCreated"] = "node_created";
|
|
7
7
|
DriveEventType["NodeUpdated"] = "node_updated";
|
|
8
|
-
DriveEventType["NodeUpdatedMetadata"] = "node_updated_metadata";
|
|
9
8
|
DriveEventType["NodeDeleted"] = "node_deleted";
|
|
10
|
-
DriveEventType["
|
|
9
|
+
DriveEventType["SharedWithMeUpdated"] = "shared_with_me_updated";
|
|
10
|
+
DriveEventType["TreeRefresh"] = "tree_refresh";
|
|
11
|
+
DriveEventType["TreeRemove"] = "tree_remove";
|
|
12
|
+
DriveEventType["FastForward"] = "fast_forward";
|
|
11
13
|
})(DriveEventType || (exports.DriveEventType = DriveEventType = {}));
|
|
14
|
+
/**
|
|
15
|
+
* This can happen if all shared nodes in that volume where unshared or if the
|
|
16
|
+
* volume was deleted.
|
|
17
|
+
*/
|
|
18
|
+
class UnsubscribeFromEventsSourceError extends Error {
|
|
19
|
+
}
|
|
20
|
+
exports.UnsubscribeFromEventsSourceError = UnsubscribeFromEventsSourceError;
|
|
21
|
+
;
|
|
12
22
|
//# sourceMappingURL=interface.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/internal/events/interface.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/internal/events/interface.ts"],"names":[],"mappings":";;;AAqFA,IAAY,cAQX;AARD,WAAY,cAAc;IACtB,8CAA4B,CAAA;IAC5B,8CAA4B,CAAA;IAC5B,8CAA4B,CAAA;IAC5B,gEAA8C,CAAA;IAC9C,8CAA4B,CAAA;IAC5B,4CAA0B,CAAA;IAC1B,8CAA4B,CAAA;AAChC,CAAC,EARW,cAAc,8BAAd,cAAc,QAQzB;AAED;;;GAGG;AACH,MAAa,gCAAiC,SAAQ,KAAK;CAAG;AAA9D,4EAA8D;AAAA,CAAC"}
|
|
@@ -1,27 +1,17 @@
|
|
|
1
1
|
import { Logger } from "../../interface";
|
|
2
2
|
import { EventsAPIService } from "./apiService";
|
|
3
|
-
import {
|
|
4
|
-
import { DriveListener } from "./interface";
|
|
3
|
+
import { DriveEvent, EventManagerInterface } from "./interface";
|
|
5
4
|
/**
|
|
6
5
|
* Combines API and event manager to provide a service for listening to
|
|
7
6
|
* volume events. Volume events are all about nodes updates. Whenever
|
|
8
7
|
* there is update to the node metadata or content, the event is emitted.
|
|
9
8
|
*/
|
|
10
|
-
export declare class VolumeEventManager {
|
|
9
|
+
export declare class VolumeEventManager implements EventManagerInterface<DriveEvent> {
|
|
10
|
+
private logger;
|
|
11
11
|
private apiService;
|
|
12
|
-
private cache;
|
|
13
12
|
private volumeId;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
* There is a limit how many volume subscribtions can be active at
|
|
19
|
-
* the same time. The manager of all volume managers should set the
|
|
20
|
-
* intervals for each volume accordingly depending on the volume
|
|
21
|
-
* type or the total number of subscriptions.
|
|
22
|
-
*/
|
|
23
|
-
setPollingInterval(pollingIntervalInSeconds: number): void;
|
|
24
|
-
startSubscription(): Promise<void>;
|
|
25
|
-
stopSubscription(): Promise<void>;
|
|
26
|
-
addListener(callback: DriveListener): void;
|
|
13
|
+
constructor(logger: Logger, apiService: EventsAPIService, volumeId: string);
|
|
14
|
+
getLogger(): Logger;
|
|
15
|
+
getEvents(eventId: string): AsyncIterable<DriveEvent>;
|
|
16
|
+
getLatestEventId(): Promise<string>;
|
|
27
17
|
}
|
|
@@ -2,67 +2,80 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.VolumeEventManager = void 0;
|
|
4
4
|
const telemetry_1 = require("../../telemetry");
|
|
5
|
-
const
|
|
5
|
+
const interface_1 = require("./interface");
|
|
6
|
+
const apiService_1 = require("../apiService");
|
|
6
7
|
/**
|
|
7
8
|
* Combines API and event manager to provide a service for listening to
|
|
8
9
|
* volume events. Volume events are all about nodes updates. Whenever
|
|
9
10
|
* there is update to the node metadata or content, the event is emitted.
|
|
10
11
|
*/
|
|
11
12
|
class VolumeEventManager {
|
|
13
|
+
logger;
|
|
12
14
|
apiService;
|
|
13
|
-
cache;
|
|
14
15
|
volumeId;
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
constructor(logger, apiService, volumeId) {
|
|
17
|
+
this.logger = logger;
|
|
17
18
|
this.apiService = apiService;
|
|
18
|
-
this.cache = cache;
|
|
19
19
|
this.volumeId = volumeId;
|
|
20
20
|
this.apiService = apiService;
|
|
21
21
|
this.volumeId = volumeId;
|
|
22
|
-
this.
|
|
23
|
-
lastEventId,
|
|
24
|
-
pollingIntervalInSeconds: this.manager.pollingIntervalInSeconds,
|
|
25
|
-
isOwnVolume
|
|
26
|
-
}));
|
|
27
|
-
this.cache.getPollingIntervalInSeconds(volumeId)
|
|
28
|
-
.then((pollingIntervalInSeconds) => {
|
|
29
|
-
if (pollingIntervalInSeconds) {
|
|
30
|
-
this.manager.pollingIntervalInSeconds = pollingIntervalInSeconds;
|
|
31
|
-
}
|
|
32
|
-
})
|
|
33
|
-
.catch(() => { });
|
|
34
|
-
}
|
|
35
|
-
async getLastEventId() {
|
|
36
|
-
const lastEventId = await this.cache.getLastEventId(this.volumeId);
|
|
37
|
-
if (lastEventId) {
|
|
38
|
-
return lastEventId;
|
|
39
|
-
}
|
|
40
|
-
return this.apiService.getVolumeLatestEventId(this.volumeId);
|
|
22
|
+
this.logger = new telemetry_1.LoggerWithPrefix(logger, `volume ${volumeId}`);
|
|
41
23
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
* the same time. The manager of all volume managers should set the
|
|
45
|
-
* intervals for each volume accordingly depending on the volume
|
|
46
|
-
* type or the total number of subscriptions.
|
|
47
|
-
*/
|
|
48
|
-
setPollingInterval(pollingIntervalInSeconds) {
|
|
49
|
-
this.manager.pollingIntervalInSeconds = pollingIntervalInSeconds;
|
|
24
|
+
getLogger() {
|
|
25
|
+
return this.logger;
|
|
50
26
|
}
|
|
51
|
-
async
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
27
|
+
async *getEvents(eventId) {
|
|
28
|
+
try {
|
|
29
|
+
let events;
|
|
30
|
+
let more = true;
|
|
31
|
+
while (more) {
|
|
32
|
+
events = await this.apiService.getVolumeEvents(this.volumeId, eventId);
|
|
33
|
+
more = events.more;
|
|
34
|
+
if (events.refresh) {
|
|
35
|
+
yield {
|
|
36
|
+
type: interface_1.DriveEventType.TreeRefresh,
|
|
37
|
+
treeEventScopeId: this.volumeId,
|
|
38
|
+
eventId: events.latestEventId,
|
|
39
|
+
};
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
// Update to the latest eventId to avoid inactive volumes from getting out of sync
|
|
43
|
+
if (events.events.length === 0 && events.latestEventId !== eventId) {
|
|
44
|
+
yield {
|
|
45
|
+
type: interface_1.DriveEventType.FastForward,
|
|
46
|
+
treeEventScopeId: this.volumeId,
|
|
47
|
+
eventId: events.latestEventId,
|
|
48
|
+
};
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
yield* events.events;
|
|
52
|
+
eventId = events.latestEventId;
|
|
61
53
|
}
|
|
62
|
-
|
|
63
|
-
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (error instanceof apiService_1.NotFoundAPIError) {
|
|
57
|
+
this.logger.info(`Volume events no longer accessible`);
|
|
58
|
+
yield {
|
|
59
|
+
type: interface_1.DriveEventType.TreeRemove,
|
|
60
|
+
treeEventScopeId: this.volumeId,
|
|
61
|
+
// After a TreeRemoval event, polling should stop.
|
|
62
|
+
eventId: 'none',
|
|
63
|
+
};
|
|
64
64
|
}
|
|
65
|
-
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async getLatestEventId() {
|
|
69
|
+
try {
|
|
70
|
+
return await this.apiService.getVolumeLatestEventId(this.volumeId);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
if (error instanceof apiService_1.NotFoundAPIError) {
|
|
74
|
+
this.logger.info(`Volume events no longer accessible`);
|
|
75
|
+
throw new interface_1.UnsubscribeFromEventsSourceError(error.message);
|
|
76
|
+
}
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
66
79
|
}
|
|
67
80
|
}
|
|
68
81
|
exports.VolumeEventManager = VolumeEventManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"volumeEventManager.js","sourceRoot":"","sources":["../../../src/internal/events/volumeEventManager.ts"],"names":[],"mappings":";;;AACA,+CAAmD;
|
|
1
|
+
{"version":3,"file":"volumeEventManager.js","sourceRoot":"","sources":["../../../src/internal/events/volumeEventManager.ts"],"names":[],"mappings":";;;AACA,+CAAmD;AAEnD,2CAA6I;AAC7I,8CAAiD;AAEjD;;;;GAIG;AACH,MAAa,kBAAkB;IAEP;IAAwB;IAAsC;IAAlF,YAAoB,MAAc,EAAU,UAA4B,EAAU,QAAgB;QAA9E,WAAM,GAAN,MAAM,CAAQ;QAAU,eAAU,GAAV,UAAU,CAAkB;QAAU,aAAQ,GAAR,QAAQ,CAAQ;QAC9F,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,4BAAgB,CAAC,MAAM,EAAE,UAAU,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,CAAE,SAAS,CAAC,OAAe;QAC7B,IAAI,CAAC;YACD,IAAI,MAAiC,CAAC;YACtC,IAAI,IAAI,GAAG,IAAI,CAAC;YAChB,OAAO,IAAI,EAAE,CAAC;gBACV,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACvE,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;gBACnB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjB,MAAM;wBACF,IAAI,EAAE,0BAAc,CAAC,WAAW;wBAChC,gBAAgB,EAAE,IAAI,CAAC,QAAQ;wBAC/B,OAAO,EAAE,MAAM,CAAC,aAAa;qBAChC,CAAC;oBACF,MAAM;gBACV,CAAC;gBACD,kFAAkF;gBAClF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;oBACjE,MAAM;wBACF,IAAI,EAAE,0BAAc,CAAC,WAAW;wBAChC,gBAAgB,EAAE,IAAI,CAAC,QAAQ;wBAC/B,OAAO,EAAE,MAAM,CAAC,aAAa;qBAChC,CAAC;oBACF,MAAM;gBACV,CAAC;gBACD,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;gBACrB,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC;YACnC,CAAC;QACL,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,IAAI,KAAK,YAAY,6BAAgB,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;gBACvD,MAAM;oBACF,IAAI,EAAE,0BAAc,CAAC,UAAU;oBAC/B,gBAAgB,EAAE,IAAI,CAAC,QAAQ;oBAC/B,kDAAkD;oBAClD,OAAO,EAAE,MAAM;iBAClB,CAAC;YACN,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB;QAClB,IAAI,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACtB,IAAI,KAAK,YAAY,6BAAgB,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;gBACvD,MAAM,IAAI,4CAAgC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;CACJ;AAhED,gDAgEC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const logger_1 = require("../../tests/logger");
|
|
4
|
+
const apiService_1 = require("../apiService");
|
|
5
|
+
const volumeEventManager_1 = require("./volumeEventManager");
|
|
6
|
+
const interface_1 = require("./interface");
|
|
7
|
+
jest.mock("./apiService");
|
|
8
|
+
describe("VolumeEventManager", () => {
|
|
9
|
+
let manager;
|
|
10
|
+
let mockEventsAPIService;
|
|
11
|
+
const mockLogger = (0, logger_1.getMockLogger)();
|
|
12
|
+
const volumeId = "volumeId123";
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
jest.clearAllMocks();
|
|
15
|
+
mockEventsAPIService = {
|
|
16
|
+
getVolumeLatestEventId: jest.fn(),
|
|
17
|
+
getVolumeEvents: jest.fn(),
|
|
18
|
+
getCoreLatestEventId: jest.fn(),
|
|
19
|
+
getCoreEvents: jest.fn(),
|
|
20
|
+
};
|
|
21
|
+
manager = new volumeEventManager_1.VolumeEventManager(mockLogger, mockEventsAPIService, volumeId);
|
|
22
|
+
});
|
|
23
|
+
describe("getLatestEventId", () => {
|
|
24
|
+
it("should return the latest event ID from API", async () => {
|
|
25
|
+
const expectedEventId = "eventId123";
|
|
26
|
+
mockEventsAPIService.getVolumeLatestEventId.mockResolvedValue(expectedEventId);
|
|
27
|
+
const result = await manager.getLatestEventId();
|
|
28
|
+
expect(result).toBe(expectedEventId);
|
|
29
|
+
expect(mockEventsAPIService.getVolumeLatestEventId).toHaveBeenCalledWith(volumeId);
|
|
30
|
+
});
|
|
31
|
+
it("should throw UnsubscribeFromEventsSourceError when API returns NotFoundAPIError", async () => {
|
|
32
|
+
const notFoundError = new apiService_1.NotFoundAPIError("Event not found", 2501);
|
|
33
|
+
mockEventsAPIService.getVolumeLatestEventId.mockRejectedValue(notFoundError);
|
|
34
|
+
await expect(manager.getLatestEventId()).rejects.toThrow("Event not found");
|
|
35
|
+
});
|
|
36
|
+
it("should rethrow other errors", async () => {
|
|
37
|
+
const networkError = new Error("Network error");
|
|
38
|
+
mockEventsAPIService.getVolumeLatestEventId.mockRejectedValue(networkError);
|
|
39
|
+
await expect(manager.getLatestEventId()).rejects.toThrow("Network error");
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe("getEvents", () => {
|
|
43
|
+
it("should yield events from API response", async () => {
|
|
44
|
+
const mockEventsResponse = {
|
|
45
|
+
latestEventId: "eventId456",
|
|
46
|
+
more: false,
|
|
47
|
+
refresh: false,
|
|
48
|
+
events: [
|
|
49
|
+
{
|
|
50
|
+
type: interface_1.DriveEventType.NodeCreated,
|
|
51
|
+
nodeUid: "node1",
|
|
52
|
+
parentNodeUid: "parent1",
|
|
53
|
+
isTrashed: false,
|
|
54
|
+
isShared: false,
|
|
55
|
+
treeEventScopeId: volumeId,
|
|
56
|
+
eventId: "eventId456",
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
mockEventsAPIService.getVolumeEvents.mockResolvedValue(mockEventsResponse);
|
|
61
|
+
const events = [];
|
|
62
|
+
for await (const event of manager.getEvents("startEventId")) {
|
|
63
|
+
events.push(event);
|
|
64
|
+
}
|
|
65
|
+
expect(events).toEqual(mockEventsResponse.events);
|
|
66
|
+
expect(mockEventsAPIService.getVolumeEvents).toHaveBeenCalledWith(volumeId, "startEventId");
|
|
67
|
+
});
|
|
68
|
+
it("should continue fetching when more events are available", async () => {
|
|
69
|
+
const firstResponse = {
|
|
70
|
+
latestEventId: "eventId2",
|
|
71
|
+
more: true,
|
|
72
|
+
refresh: false,
|
|
73
|
+
events: [
|
|
74
|
+
{
|
|
75
|
+
type: interface_1.DriveEventType.NodeCreated,
|
|
76
|
+
nodeUid: "node1",
|
|
77
|
+
parentNodeUid: "parent1",
|
|
78
|
+
isTrashed: false,
|
|
79
|
+
isShared: false,
|
|
80
|
+
treeEventScopeId: volumeId,
|
|
81
|
+
eventId: "eventId2",
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
};
|
|
85
|
+
const secondResponse = {
|
|
86
|
+
latestEventId: "eventId3",
|
|
87
|
+
more: false,
|
|
88
|
+
refresh: false,
|
|
89
|
+
events: [
|
|
90
|
+
{
|
|
91
|
+
type: interface_1.DriveEventType.NodeUpdated,
|
|
92
|
+
nodeUid: "node2",
|
|
93
|
+
parentNodeUid: "parent1",
|
|
94
|
+
isTrashed: false,
|
|
95
|
+
isShared: false,
|
|
96
|
+
treeEventScopeId: volumeId,
|
|
97
|
+
eventId: "eventId3",
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
};
|
|
101
|
+
mockEventsAPIService.getVolumeEvents
|
|
102
|
+
.mockResolvedValueOnce(firstResponse)
|
|
103
|
+
.mockResolvedValueOnce(secondResponse);
|
|
104
|
+
const events = [];
|
|
105
|
+
for await (const event of manager.getEvents("startEventId")) {
|
|
106
|
+
events.push(event);
|
|
107
|
+
}
|
|
108
|
+
expect(events).toHaveLength(2);
|
|
109
|
+
expect(events[0]).toEqual(firstResponse.events[0]);
|
|
110
|
+
expect(events[1]).toEqual(secondResponse.events[0]);
|
|
111
|
+
expect(mockEventsAPIService.getVolumeEvents).toHaveBeenCalledTimes(2);
|
|
112
|
+
expect(mockEventsAPIService.getVolumeEvents).toHaveBeenNthCalledWith(1, volumeId, "startEventId");
|
|
113
|
+
expect(mockEventsAPIService.getVolumeEvents).toHaveBeenNthCalledWith(2, volumeId, "eventId2");
|
|
114
|
+
});
|
|
115
|
+
it("should yield TreeRefresh event when refresh is true", async () => {
|
|
116
|
+
const mockEventsResponse = {
|
|
117
|
+
latestEventId: "eventId789",
|
|
118
|
+
more: false,
|
|
119
|
+
refresh: true,
|
|
120
|
+
events: [],
|
|
121
|
+
};
|
|
122
|
+
mockEventsAPIService.getVolumeEvents.mockResolvedValue(mockEventsResponse);
|
|
123
|
+
const events = [];
|
|
124
|
+
for await (const event of manager.getEvents("startEventId")) {
|
|
125
|
+
events.push(event);
|
|
126
|
+
}
|
|
127
|
+
expect(events).toHaveLength(1);
|
|
128
|
+
expect(events[0]).toEqual({
|
|
129
|
+
type: interface_1.DriveEventType.TreeRefresh,
|
|
130
|
+
treeEventScopeId: volumeId,
|
|
131
|
+
eventId: "eventId789",
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
it("should yield FastForward event when no events but eventId changed", async () => {
|
|
135
|
+
const mockEventsResponse = {
|
|
136
|
+
latestEventId: "newEventId",
|
|
137
|
+
more: false,
|
|
138
|
+
refresh: false,
|
|
139
|
+
events: [],
|
|
140
|
+
};
|
|
141
|
+
mockEventsAPIService.getVolumeEvents.mockResolvedValue(mockEventsResponse);
|
|
142
|
+
const events = [];
|
|
143
|
+
for await (const event of manager.getEvents("oldEventId")) {
|
|
144
|
+
events.push(event);
|
|
145
|
+
}
|
|
146
|
+
expect(events).toHaveLength(1);
|
|
147
|
+
expect(events[0]).toEqual({
|
|
148
|
+
type: interface_1.DriveEventType.FastForward,
|
|
149
|
+
treeEventScopeId: volumeId,
|
|
150
|
+
eventId: "newEventId",
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
it("should yield TreeRemove event when API returns NotFoundAPIError", async () => {
|
|
154
|
+
const notFoundError = new apiService_1.NotFoundAPIError("Volume not found", 2501);
|
|
155
|
+
mockEventsAPIService.getVolumeEvents.mockRejectedValue(notFoundError);
|
|
156
|
+
const events = [];
|
|
157
|
+
try {
|
|
158
|
+
for await (const event of manager.getEvents("startEventId")) {
|
|
159
|
+
events.push(event);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
// The error should be re-thrown, but first it should yield a TreeRemove event
|
|
164
|
+
expect(error).toBe(notFoundError);
|
|
165
|
+
}
|
|
166
|
+
expect(events).toHaveLength(1);
|
|
167
|
+
expect(events[0]).toEqual({
|
|
168
|
+
type: interface_1.DriveEventType.TreeRemove,
|
|
169
|
+
treeEventScopeId: volumeId,
|
|
170
|
+
eventId: 'none',
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
it("should rethrow non-NotFoundAPIError errors", async () => {
|
|
174
|
+
const networkError = new Error("Network error");
|
|
175
|
+
mockEventsAPIService.getVolumeEvents.mockRejectedValue(networkError);
|
|
176
|
+
const eventGenerator = manager.getEvents("startEventId");
|
|
177
|
+
const eventIterator = eventGenerator[Symbol.asyncIterator]();
|
|
178
|
+
await expect(eventIterator.next()).rejects.toThrow("Network error");
|
|
179
|
+
});
|
|
180
|
+
it("should not yield events when events array is empty and eventId unchanged", async () => {
|
|
181
|
+
const mockEventsResponse = {
|
|
182
|
+
latestEventId: "sameEventId",
|
|
183
|
+
more: false,
|
|
184
|
+
refresh: false,
|
|
185
|
+
events: [],
|
|
186
|
+
};
|
|
187
|
+
mockEventsAPIService.getVolumeEvents.mockResolvedValue(mockEventsResponse);
|
|
188
|
+
const events = [];
|
|
189
|
+
for await (const event of manager.getEvents("sameEventId")) {
|
|
190
|
+
events.push(event);
|
|
191
|
+
}
|
|
192
|
+
expect(events).toHaveLength(0);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
describe("getLogger", () => {
|
|
196
|
+
it("should return logger with prefix", () => {
|
|
197
|
+
const logger = manager.getLogger();
|
|
198
|
+
expect(logger).toBeDefined();
|
|
199
|
+
// The logger should be wrapped with LoggerWithPrefix, but we can't easily test the prefix
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
//# sourceMappingURL=volumeEventManager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volumeEventManager.test.js","sourceRoot":"","sources":["../../../src/internal/events/volumeEventManager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,8 +11,8 @@ export declare class NodeAPIService {
|
|
|
11
11
|
private logger;
|
|
12
12
|
private apiService;
|
|
13
13
|
constructor(logger: Logger, apiService: DriveAPIService);
|
|
14
|
-
getNode(nodeUid: string, signal?: AbortSignal): Promise<EncryptedNode>;
|
|
15
|
-
iterateNodes(nodeUids: string[], signal?: AbortSignal): AsyncGenerator<EncryptedNode>;
|
|
14
|
+
getNode(nodeUid: string, ownVolumeId: string, signal?: AbortSignal): Promise<EncryptedNode>;
|
|
15
|
+
iterateNodes(nodeUids: string[], ownVolumeId: string, signal?: AbortSignal): AsyncGenerator<EncryptedNode>;
|
|
16
16
|
iterateChildrenNodeUids(parentNodeUid: string, signal?: AbortSignal): AsyncGenerator<string>;
|
|
17
17
|
iterateTrashedNodeUids(volumeId: string, signal?: AbortSignal): AsyncGenerator<string>;
|
|
18
18
|
renameNode(nodeUid: string, originalNode: {
|
|
@@ -27,14 +27,14 @@ class NodeAPIService {
|
|
|
27
27
|
this.logger = logger;
|
|
28
28
|
this.apiService = apiService;
|
|
29
29
|
}
|
|
30
|
-
async getNode(nodeUid, signal) {
|
|
31
|
-
const nodesGenerator = this.iterateNodes([nodeUid], signal);
|
|
30
|
+
async getNode(nodeUid, ownVolumeId, signal) {
|
|
31
|
+
const nodesGenerator = this.iterateNodes([nodeUid], ownVolumeId, signal);
|
|
32
32
|
const result = await nodesGenerator.next();
|
|
33
33
|
await nodesGenerator.return("finish");
|
|
34
34
|
return result.value;
|
|
35
35
|
}
|
|
36
36
|
// Improvement requested: split into multiple calls for many nodes.
|
|
37
|
-
async *iterateNodes(nodeUids, signal) {
|
|
37
|
+
async *iterateNodes(nodeUids, ownVolumeId, signal) {
|
|
38
38
|
const allNodeIds = nodeUids.map(uids_1.splitNodeUid);
|
|
39
39
|
const nodeIdsByVolumeId = new Map();
|
|
40
40
|
for (const { volumeId, nodeId } of allNodeIds) {
|
|
@@ -48,12 +48,13 @@ class NodeAPIService {
|
|
|
48
48
|
// Thus we capture all errors and throw them at the end of iteration.
|
|
49
49
|
const errors = [];
|
|
50
50
|
for (const [volumeId, nodeIds] of nodeIdsByVolumeId.entries()) {
|
|
51
|
+
const isAdmin = volumeId === ownVolumeId;
|
|
51
52
|
const response = await this.apiService.post(`drive/v2/volumes/${volumeId}/links`, {
|
|
52
53
|
LinkIDs: nodeIds,
|
|
53
54
|
}, signal);
|
|
54
55
|
for (const link of response.Links) {
|
|
55
56
|
try {
|
|
56
|
-
yield linkToEncryptedNode(this.logger, volumeId, link);
|
|
57
|
+
yield linkToEncryptedNode(this.logger, volumeId, link, isAdmin);
|
|
57
58
|
}
|
|
58
59
|
catch (error) {
|
|
59
60
|
this.logger.error(`Failed to transform node ${link.Link.LinkID}`, error);
|
|
@@ -226,7 +227,7 @@ function* handleResponseErrors(nodeUids, volumeId, responses = []) {
|
|
|
226
227
|
}
|
|
227
228
|
}
|
|
228
229
|
}
|
|
229
|
-
function linkToEncryptedNode(logger, volumeId, link) {
|
|
230
|
+
function linkToEncryptedNode(logger, volumeId, link, isAdmin) {
|
|
230
231
|
const baseNodeMetadata = {
|
|
231
232
|
// Internal metadata
|
|
232
233
|
hash: link.Link.NameHash || undefined,
|
|
@@ -240,7 +241,7 @@ function linkToEncryptedNode(logger, volumeId, link) {
|
|
|
240
241
|
// Sharing node metadata
|
|
241
242
|
shareId: link.Sharing?.ShareID || undefined,
|
|
242
243
|
isShared: !!link.Sharing,
|
|
243
|
-
directMemberRole: (0, apiService_1.permissionsToDirectMemberRole)(logger, link.Membership?.Permissions),
|
|
244
|
+
directMemberRole: isAdmin ? nodes_1.MemberRole.Admin : (0, apiService_1.permissionsToDirectMemberRole)(logger, link.Membership?.Permissions),
|
|
244
245
|
};
|
|
245
246
|
const baseCryptoNodeMetadata = {
|
|
246
247
|
signatureEmail: link.Link.SignatureEmail || undefined,
|
|
@@ -284,12 +285,21 @@ function linkToEncryptedNode(logger, volumeId, link) {
|
|
|
284
285
|
},
|
|
285
286
|
};
|
|
286
287
|
}
|
|
288
|
+
if (link.Link.Type === 3) {
|
|
289
|
+
return {
|
|
290
|
+
...baseNodeMetadata,
|
|
291
|
+
encryptedCrypto: {
|
|
292
|
+
...baseCryptoNodeMetadata,
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
}
|
|
287
296
|
throw new Error(`Unknown node type: ${link.Link.Type}`);
|
|
288
297
|
}
|
|
289
298
|
function transformRevisionResponse(volumeId, nodeId, revision) {
|
|
290
299
|
return {
|
|
291
300
|
uid: (0, uids_1.makeNodeRevisionUid)(volumeId, nodeId, revision.ID),
|
|
292
301
|
state: revision.State === APIRevisionState.Active ? nodes_1.RevisionState.Active : nodes_1.RevisionState.Superseded,
|
|
302
|
+
// @ts-expect-error: API doc is wrong, CreateTime is not optional.
|
|
293
303
|
creationTime: new Date(revision.CreateTime * 1000),
|
|
294
304
|
storageSize: revision.Size,
|
|
295
305
|
signatureEmail: revision.SignatureEmail || undefined,
|