@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,120 +1,205 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const logger_1 = require("../../tests/logger");
|
|
4
|
-
const apiService_1 = require("../apiService");
|
|
5
4
|
const eventManager_1 = require("./eventManager");
|
|
5
|
+
const interface_1 = require("./interface");
|
|
6
6
|
jest.useFakeTimers();
|
|
7
|
+
const POLLING_INTERVAL = 1;
|
|
7
8
|
describe("EventManager", () => {
|
|
8
9
|
let manager;
|
|
9
|
-
const
|
|
10
|
+
const getLatestEventIdMock = jest.fn();
|
|
10
11
|
const getEventsMock = jest.fn();
|
|
11
|
-
const updateLatestEventIdMock = jest.fn();
|
|
12
12
|
const listenerMock = jest.fn();
|
|
13
|
+
const mockLogger = (0, logger_1.getMockLogger)();
|
|
14
|
+
const subscriptions = [];
|
|
13
15
|
beforeEach(() => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
manager = new eventManager_1.EventManager((0, logger_1.getMockLogger)(), getLastEventIdMock, getEventsMock, updateLatestEventIdMock);
|
|
23
|
-
manager.addListener(listenerMock);
|
|
16
|
+
const mockEventManager = {
|
|
17
|
+
getLogger: () => mockLogger,
|
|
18
|
+
getLatestEventId: getLatestEventIdMock,
|
|
19
|
+
getEvents: getEventsMock,
|
|
20
|
+
};
|
|
21
|
+
manager = new eventManager_1.EventManager(mockEventManager, POLLING_INTERVAL, null);
|
|
22
|
+
const subscription = manager.addListener(listenerMock);
|
|
23
|
+
subscriptions.push(subscription);
|
|
24
24
|
});
|
|
25
25
|
afterEach(async () => {
|
|
26
26
|
await manager.stop();
|
|
27
|
+
while (subscriptions.length > 0) {
|
|
28
|
+
const subscription = subscriptions.pop();
|
|
29
|
+
subscription?.dispose();
|
|
30
|
+
}
|
|
31
|
+
jest.clearAllMocks();
|
|
27
32
|
});
|
|
28
|
-
it("should
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
it("should start polling when started", async () => {
|
|
34
|
+
getLatestEventIdMock.mockResolvedValue('EventId1');
|
|
35
|
+
const mockEvents = [
|
|
36
|
+
[{
|
|
37
|
+
type: interface_1.DriveEventType.FastForward,
|
|
38
|
+
treeEventScopeId: 'volume1',
|
|
39
|
+
eventId: 'EventId2',
|
|
40
|
+
}],
|
|
41
|
+
[{
|
|
42
|
+
type: interface_1.DriveEventType.FastForward,
|
|
43
|
+
treeEventScopeId: 'volume1',
|
|
44
|
+
eventId: 'EventId3',
|
|
45
|
+
}],
|
|
46
|
+
];
|
|
47
|
+
getEventsMock.mockImplementationOnce(async function* () {
|
|
48
|
+
yield* mockEvents[0];
|
|
49
|
+
}).mockImplementationOnce(async function* () {
|
|
50
|
+
yield* mockEvents[1];
|
|
51
|
+
}).mockImplementationOnce(async function* () {
|
|
52
|
+
});
|
|
53
|
+
expect(getLatestEventIdMock).toHaveBeenCalledTimes(0);
|
|
39
54
|
expect(getEventsMock).toHaveBeenCalledTimes(0);
|
|
40
|
-
expect(
|
|
41
|
-
expect(
|
|
42
|
-
expect(
|
|
43
|
-
updateLatestEventIdMock.mockClear();
|
|
55
|
+
expect(await manager.start()).toBeUndefined();
|
|
56
|
+
expect(getLatestEventIdMock).toHaveBeenCalledTimes(1);
|
|
57
|
+
expect(getEventsMock).toHaveBeenCalledWith('EventId1');
|
|
44
58
|
await jest.runOnlyPendingTimersAsync();
|
|
45
|
-
expect(getEventsMock).toHaveBeenCalledTimes(
|
|
46
|
-
expect(
|
|
47
|
-
expect(updateLatestEventIdMock).toHaveBeenCalledTimes(1);
|
|
48
|
-
expect(updateLatestEventIdMock).toHaveBeenCalledWith('eventId2');
|
|
59
|
+
expect(getEventsMock).toHaveBeenCalledTimes(2);
|
|
60
|
+
expect(getEventsMock).toHaveBeenCalledWith('EventId2');
|
|
49
61
|
});
|
|
50
|
-
it("should
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
62
|
+
it("should stop polling when stopped", async () => {
|
|
63
|
+
getLatestEventIdMock.mockResolvedValue('eventId1');
|
|
64
|
+
getEventsMock.mockImplementation(async function* () {
|
|
65
|
+
yield {
|
|
66
|
+
type: interface_1.DriveEventType.FastForward,
|
|
67
|
+
treeEventScopeId: 'volume1',
|
|
68
|
+
eventId: 'eventId1',
|
|
69
|
+
};
|
|
70
|
+
});
|
|
57
71
|
await manager.start();
|
|
58
72
|
await jest.runOnlyPendingTimersAsync();
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
expect(
|
|
64
|
-
expect(updateLatestEventIdMock).toHaveBeenCalledWith('eventId1');
|
|
65
|
-
expect(updateLatestEventIdMock).toHaveBeenCalledWith('eventId2');
|
|
66
|
-
expect(updateLatestEventIdMock).toHaveBeenCalledWith('eventId3');
|
|
73
|
+
const callsBeforeStop = getEventsMock.mock.calls.length;
|
|
74
|
+
await manager.stop();
|
|
75
|
+
await jest.runOnlyPendingTimersAsync();
|
|
76
|
+
// Should not have made additional calls after stopping
|
|
77
|
+
expect(getEventsMock).toHaveBeenCalledTimes(callsBeforeStop);
|
|
67
78
|
});
|
|
68
|
-
it("should
|
|
69
|
-
|
|
70
|
-
|
|
79
|
+
it("should notify all listeners when getting events", async () => {
|
|
80
|
+
getLatestEventIdMock.mockResolvedValue('eventId1');
|
|
81
|
+
const mockEvents = [
|
|
82
|
+
{
|
|
83
|
+
type: interface_1.DriveEventType.NodeCreated,
|
|
84
|
+
nodeUid: 'node1',
|
|
85
|
+
parentNodeUid: 'parent1',
|
|
86
|
+
isTrashed: false,
|
|
87
|
+
isShared: false,
|
|
88
|
+
treeEventScopeId: 'volume1',
|
|
89
|
+
eventId: 'eventId2',
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
getEventsMock.mockImplementationOnce(async function* () {
|
|
93
|
+
yield* mockEvents;
|
|
94
|
+
}).mockImplementation(async function* () {
|
|
95
|
+
});
|
|
96
|
+
expect(await manager.start()).toBeUndefined();
|
|
71
97
|
await jest.runOnlyPendingTimersAsync();
|
|
72
|
-
expect(getLastEventIdMock).toHaveBeenCalledTimes(2);
|
|
73
98
|
expect(listenerMock).toHaveBeenCalledTimes(1);
|
|
74
|
-
expect(listenerMock).
|
|
75
|
-
expect(updateLatestEventIdMock).toHaveBeenCalledTimes(1);
|
|
76
|
-
expect(updateLatestEventIdMock).toHaveBeenCalledWith('eventId1');
|
|
99
|
+
expect(listenerMock).toHaveBeenNthCalledWith(1, mockEvents[0]);
|
|
77
100
|
});
|
|
78
|
-
it("should
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
101
|
+
it("should propagate unsubscription errors", async () => {
|
|
102
|
+
getLatestEventIdMock.mockImplementation(() => {
|
|
103
|
+
throw new interface_1.UnsubscribeFromEventsSourceError("Not found");
|
|
104
|
+
});
|
|
105
|
+
await expect(manager.start()).rejects.toThrow(interface_1.UnsubscribeFromEventsSourceError);
|
|
106
|
+
expect(getLatestEventIdMock).toHaveBeenCalledTimes(1);
|
|
107
|
+
expect(listenerMock).toHaveBeenCalledTimes(0);
|
|
108
|
+
expect(getEventsMock).toHaveBeenCalledTimes(0);
|
|
109
|
+
});
|
|
110
|
+
it("should continue processing multiple events", async () => {
|
|
111
|
+
getLatestEventIdMock.mockResolvedValue('eventId1');
|
|
112
|
+
const mockEvents = [
|
|
113
|
+
{
|
|
114
|
+
type: interface_1.DriveEventType.NodeCreated,
|
|
115
|
+
nodeUid: 'node1',
|
|
116
|
+
parentNodeUid: 'parent1',
|
|
117
|
+
isTrashed: false,
|
|
118
|
+
isShared: false,
|
|
119
|
+
treeEventScopeId: 'volume1',
|
|
120
|
+
eventId: 'eventId2',
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
type: interface_1.DriveEventType.NodeCreated,
|
|
124
|
+
nodeUid: 'node2',
|
|
125
|
+
parentNodeUid: 'parent1',
|
|
126
|
+
isTrashed: false,
|
|
127
|
+
isShared: false,
|
|
128
|
+
treeEventScopeId: 'volume1',
|
|
129
|
+
eventId: 'eventId3',
|
|
84
130
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
});
|
|
131
|
+
];
|
|
132
|
+
getEventsMock.mockImplementationOnce(async function* () {
|
|
133
|
+
yield* mockEvents;
|
|
134
|
+
}).mockImplementation(async function* () {
|
|
135
|
+
// Empty generator for subsequent calls
|
|
91
136
|
});
|
|
92
137
|
await manager.start();
|
|
93
|
-
updateLatestEventIdMock.mockClear();
|
|
94
|
-
// First failure.
|
|
95
138
|
await jest.runOnlyPendingTimersAsync();
|
|
96
|
-
expect(listenerMock).toHaveBeenCalledTimes(
|
|
97
|
-
expect(
|
|
98
|
-
|
|
139
|
+
expect(listenerMock).toHaveBeenCalledTimes(2);
|
|
140
|
+
expect(listenerMock).toHaveBeenNthCalledWith(1, mockEvents[0]);
|
|
141
|
+
expect(listenerMock).toHaveBeenNthCalledWith(2, mockEvents[1]);
|
|
142
|
+
getEventsMock.mockImplementationOnce(async function* () {
|
|
143
|
+
yield* mockEvents;
|
|
144
|
+
});
|
|
99
145
|
await jest.runOnlyPendingTimersAsync();
|
|
100
|
-
expect(listenerMock).toHaveBeenCalledTimes(
|
|
101
|
-
expect(
|
|
102
|
-
|
|
146
|
+
expect(listenerMock).toHaveBeenCalledTimes(4);
|
|
147
|
+
expect(listenerMock).toHaveBeenNthCalledWith(1, mockEvents[0]);
|
|
148
|
+
expect(listenerMock).toHaveBeenNthCalledWith(2, mockEvents[1]);
|
|
149
|
+
});
|
|
150
|
+
it("should retry on error with exponential backoff", async () => {
|
|
151
|
+
getLatestEventIdMock.mockResolvedValue('eventId1');
|
|
152
|
+
let callCount = 0;
|
|
153
|
+
getEventsMock.mockImplementation(async function* () {
|
|
154
|
+
callCount++;
|
|
155
|
+
if (callCount <= 3) {
|
|
156
|
+
throw new Error("Network error");
|
|
157
|
+
}
|
|
158
|
+
yield {
|
|
159
|
+
type: interface_1.DriveEventType.FastForward,
|
|
160
|
+
treeEventScopeId: 'volume1',
|
|
161
|
+
eventId: 'eventId3',
|
|
162
|
+
};
|
|
163
|
+
});
|
|
164
|
+
expect(manager['retryIndex']).toEqual(0);
|
|
165
|
+
expect(await manager.start()).toBeUndefined();
|
|
166
|
+
expect(getEventsMock).toHaveBeenCalledTimes(1);
|
|
167
|
+
expect(manager['retryIndex']).toEqual(1);
|
|
168
|
+
await jest.runOnlyPendingTimersAsync();
|
|
169
|
+
expect(getEventsMock).toHaveBeenCalledTimes(2);
|
|
170
|
+
expect(manager['retryIndex']).toEqual(2);
|
|
103
171
|
await jest.runOnlyPendingTimersAsync();
|
|
172
|
+
expect(manager['retryIndex']).toEqual(3);
|
|
104
173
|
expect(listenerMock).toHaveBeenCalledTimes(0);
|
|
105
|
-
expect(manager.nextPollTimeout).toBe(90000);
|
|
106
|
-
// And now it passes.
|
|
107
174
|
await jest.runOnlyPendingTimersAsync();
|
|
108
175
|
expect(listenerMock).toHaveBeenCalledTimes(1);
|
|
109
|
-
|
|
110
|
-
expect(
|
|
111
|
-
expect(updateLatestEventIdMock).toHaveBeenCalledWith('eventId2');
|
|
176
|
+
// After success, retry index should reset
|
|
177
|
+
expect(manager['retryIndex']).toEqual(0);
|
|
112
178
|
});
|
|
113
|
-
it("should stop polling", async () => {
|
|
114
|
-
|
|
179
|
+
it("should stop polling when stopped immediately", async () => {
|
|
180
|
+
getLatestEventIdMock.mockResolvedValue('eventId1');
|
|
181
|
+
getEventsMock.mockImplementation(async function* () {
|
|
182
|
+
yield {
|
|
183
|
+
type: interface_1.DriveEventType.FastForward,
|
|
184
|
+
treeEventScopeId: 'volume1',
|
|
185
|
+
eventId: 'eventId1',
|
|
186
|
+
};
|
|
187
|
+
});
|
|
188
|
+
expect(await manager.start()).toBeUndefined();
|
|
189
|
+
expect(getEventsMock).toHaveBeenCalledTimes(1);
|
|
115
190
|
await manager.stop();
|
|
116
191
|
await jest.runOnlyPendingTimersAsync();
|
|
117
|
-
|
|
192
|
+
// getEvents should have been called once during start, but not again after stop
|
|
193
|
+
expect(getEventsMock).toHaveBeenCalledTimes(1);
|
|
194
|
+
});
|
|
195
|
+
it("should handle empty event streams", async () => {
|
|
196
|
+
getLatestEventIdMock.mockResolvedValue('eventId1');
|
|
197
|
+
getEventsMock.mockImplementation(async function* () {
|
|
198
|
+
// Empty generator - no events
|
|
199
|
+
});
|
|
200
|
+
await manager.start();
|
|
201
|
+
await jest.runOnlyPendingTimersAsync();
|
|
202
|
+
expect(listenerMock).toHaveBeenCalledTimes(0);
|
|
118
203
|
});
|
|
119
204
|
});
|
|
120
205
|
//# sourceMappingURL=eventManager.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventManager.test.js","sourceRoot":"","sources":["../../../src/internal/events/eventManager.test.ts"],"names":[],"mappings":";;AAAA,+CAAmD;AACnD,
|
|
1
|
+
{"version":3,"file":"eventManager.test.js","sourceRoot":"","sources":["../../../src/internal/events/eventManager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ProtonDriveTelemetry } from "../../interface";
|
|
2
2
|
import { DriveAPIService } from "../apiService";
|
|
3
|
-
import { DriveListener } from "./interface";
|
|
3
|
+
import { DriveListener, EventSubscription, LatestEventIdProvider } from "./interface";
|
|
4
|
+
import { SharesManager } from "../shares/manager";
|
|
4
5
|
export type { DriveEvent, DriveListener } from "./interface";
|
|
5
6
|
export { DriveEventType } from "./interface";
|
|
6
7
|
/**
|
|
@@ -10,41 +11,20 @@ export { DriveEventType } from "./interface";
|
|
|
10
11
|
*/
|
|
11
12
|
export declare class DriveEventsService {
|
|
12
13
|
private telemetry;
|
|
14
|
+
private shareManagement;
|
|
15
|
+
private cacheEventListeners;
|
|
16
|
+
private latestEventIdProvider?;
|
|
13
17
|
private apiService;
|
|
14
|
-
private
|
|
15
|
-
private
|
|
16
|
-
private listeners;
|
|
17
|
-
private coreEvents;
|
|
18
|
-
private volumesEvents;
|
|
18
|
+
private coreEvents?;
|
|
19
|
+
private volumeEventManagers;
|
|
19
20
|
private logger;
|
|
20
|
-
constructor(telemetry: ProtonDriveTelemetry, apiService: DriveAPIService,
|
|
21
|
+
constructor(telemetry: ProtonDriveTelemetry, apiService: DriveAPIService, shareManagement: SharesManager, cacheEventListeners?: DriveListener[], latestEventIdProvider?: LatestEventIdProvider | undefined);
|
|
21
22
|
/**
|
|
22
|
-
*
|
|
23
|
-
* cache and starts listening to their events. Any additional volume
|
|
24
|
-
* that is subscribed to later will be automatically started.
|
|
23
|
+
* Subscribe to drive events. The treeEventScopeId can be obtained from a node.
|
|
25
24
|
*/
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
* Subscribe to given volume. The volume will be polled for events
|
|
29
|
-
* with the polling interval depending on the type of the volume.
|
|
30
|
-
* Own volumes are polled with highest frequency, while others are
|
|
31
|
-
* polled with lower frequency depending on the total number of
|
|
32
|
-
* subscriptions.
|
|
33
|
-
*
|
|
34
|
-
* @param isOwnVolume - Owned volumes are polled with higher frequency.
|
|
35
|
-
*/
|
|
36
|
-
listenToVolume(volumeId: string, isOwnVolume?: boolean): Promise<void>;
|
|
37
|
-
private loadSubscribedVolumeEventServices;
|
|
25
|
+
subscribeToTreeEvents(treeEventScopeId: string, callback: DriveListener): Promise<EventSubscription>;
|
|
26
|
+
subscribeToCoreEvents(callback: DriveListener): Promise<EventSubscription>;
|
|
38
27
|
private sendNumberOfVolumeSubscriptionsToTelemetry;
|
|
39
28
|
private createVolumeEventManager;
|
|
40
|
-
|
|
41
|
-
* Listen to the drive events. The listener will be called with the
|
|
42
|
-
* new events as they arrive.
|
|
43
|
-
*
|
|
44
|
-
* One call always provides events from withing the same volume. The
|
|
45
|
-
* second argument of the callback `fullRefreshVolumeId` is thus single
|
|
46
|
-
* ID and if multiple volumes must be fully refreshed, client will
|
|
47
|
-
* receive multiple calls.
|
|
48
|
-
*/
|
|
49
|
-
addListener(callback: DriveListener): void;
|
|
29
|
+
private getDefaultVolumePollingInterval;
|
|
50
30
|
}
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DriveEventsService = exports.DriveEventType = void 0;
|
|
4
4
|
const apiService_1 = require("./apiService");
|
|
5
|
-
const cache_1 = require("./cache");
|
|
6
5
|
const coreEventManager_1 = require("./coreEventManager");
|
|
7
6
|
const volumeEventManager_1 = require("./volumeEventManager");
|
|
7
|
+
const eventManager_1 = require("./eventManager");
|
|
8
8
|
var interface_1 = require("./interface");
|
|
9
9
|
Object.defineProperty(exports, "DriveEventType", { enumerable: true, get: function () { return interface_1.DriveEventType; } });
|
|
10
10
|
const OWN_VOLUME_POLLING_INTERVAL = 30;
|
|
11
11
|
const OTHER_VOLUME_POLLING_INTERVAL = 60;
|
|
12
|
+
const CORE_POLLING_INTERVAL = 30;
|
|
12
13
|
/**
|
|
13
14
|
* Service for listening to drive events. The service is responsible for
|
|
14
15
|
* managing the subscriptions to the events and notifying the listeners
|
|
@@ -16,101 +17,84 @@ const OTHER_VOLUME_POLLING_INTERVAL = 60;
|
|
|
16
17
|
*/
|
|
17
18
|
class DriveEventsService {
|
|
18
19
|
telemetry;
|
|
20
|
+
shareManagement;
|
|
21
|
+
cacheEventListeners;
|
|
22
|
+
latestEventIdProvider;
|
|
19
23
|
apiService;
|
|
20
|
-
cache;
|
|
21
|
-
subscribedToRemoteDataUpdates = false;
|
|
22
|
-
listeners = [];
|
|
23
24
|
coreEvents;
|
|
24
|
-
|
|
25
|
+
volumeEventManagers;
|
|
25
26
|
logger;
|
|
26
|
-
constructor(telemetry, apiService,
|
|
27
|
+
constructor(telemetry, apiService, shareManagement, cacheEventListeners = [], latestEventIdProvider) {
|
|
27
28
|
this.telemetry = telemetry;
|
|
29
|
+
this.shareManagement = shareManagement;
|
|
30
|
+
this.cacheEventListeners = cacheEventListeners;
|
|
31
|
+
this.latestEventIdProvider = latestEventIdProvider;
|
|
28
32
|
this.telemetry = telemetry;
|
|
29
33
|
this.logger = telemetry.getLogger('events');
|
|
30
34
|
this.apiService = new apiService_1.EventsAPIService(apiService);
|
|
31
|
-
this.
|
|
32
|
-
// FIXME: Allow to pass own core events manager from the public interface.
|
|
33
|
-
this.coreEvents = new coreEventManager_1.CoreEventManager(this.logger, this.apiService, this.cache);
|
|
34
|
-
this.volumesEvents = {};
|
|
35
|
+
this.volumeEventManagers = {};
|
|
35
36
|
}
|
|
36
37
|
/**
|
|
37
|
-
*
|
|
38
|
-
* cache and starts listening to their events. Any additional volume
|
|
39
|
-
* that is subscribed to later will be automatically started.
|
|
38
|
+
* Subscribe to drive events. The treeEventScopeId can be obtained from a node.
|
|
40
39
|
*/
|
|
41
|
-
async
|
|
42
|
-
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
await this.loadSubscribedVolumeEventServices();
|
|
46
|
-
this.sendNumberOfVolumeSubscriptionsToTelemetry();
|
|
47
|
-
this.subscribedToRemoteDataUpdates = true;
|
|
48
|
-
await this.coreEvents.startSubscription();
|
|
49
|
-
await Promise.all(Object.values(this.volumesEvents)
|
|
50
|
-
.map((volumeEvents) => volumeEvents.startSubscription()));
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Subscribe to given volume. The volume will be polled for events
|
|
54
|
-
* with the polling interval depending on the type of the volume.
|
|
55
|
-
* Own volumes are polled with highest frequency, while others are
|
|
56
|
-
* polled with lower frequency depending on the total number of
|
|
57
|
-
* subscriptions.
|
|
58
|
-
*
|
|
59
|
-
* @param isOwnVolume - Owned volumes are polled with higher frequency.
|
|
60
|
-
*/
|
|
61
|
-
async listenToVolume(volumeId, isOwnVolume = false) {
|
|
62
|
-
await this.loadSubscribedVolumeEventServices();
|
|
63
|
-
if (this.volumesEvents[volumeId]) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
40
|
+
async subscribeToTreeEvents(treeEventScopeId, callback) {
|
|
41
|
+
const volumeId = treeEventScopeId;
|
|
66
42
|
this.logger.debug(`Creating volume event manager for volume ${volumeId}`);
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
manager
|
|
70
|
-
|
|
71
|
-
|
|
43
|
+
let manager = this.volumeEventManagers[volumeId];
|
|
44
|
+
let started = true;
|
|
45
|
+
if (manager === undefined) {
|
|
46
|
+
manager = await this.createVolumeEventManager(volumeId);
|
|
47
|
+
this.volumeEventManagers[volumeId] = manager;
|
|
48
|
+
started = false;
|
|
72
49
|
this.sendNumberOfVolumeSubscriptionsToTelemetry();
|
|
73
50
|
}
|
|
51
|
+
const eventSubscription = manager.addListener(callback);
|
|
52
|
+
if (!started) {
|
|
53
|
+
await manager.start();
|
|
54
|
+
}
|
|
55
|
+
return eventSubscription;
|
|
74
56
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
57
|
+
// FIXME: Allow to pass own core events manager from the public interface.
|
|
58
|
+
async subscribeToCoreEvents(callback) {
|
|
59
|
+
if (this.latestEventIdProvider === null || this.latestEventIdProvider === undefined) {
|
|
60
|
+
throw new Error('Cannot subscribe to events without passing a latestEventIdProvider in ProtonDriveClient initialization');
|
|
61
|
+
}
|
|
62
|
+
if (this.coreEvents === undefined) {
|
|
63
|
+
const coreEventManager = new coreEventManager_1.CoreEventManager(this.logger, this.apiService);
|
|
64
|
+
const latestEventId = this.latestEventIdProvider.getLatestEventId('core') ?? null;
|
|
65
|
+
this.coreEvents = new eventManager_1.EventManager(coreEventManager, CORE_POLLING_INTERVAL, latestEventId);
|
|
66
|
+
for (const listener of this.cacheEventListeners) {
|
|
67
|
+
this.coreEvents.addListener(listener);
|
|
80
68
|
}
|
|
81
69
|
}
|
|
70
|
+
const eventSubscription = this.coreEvents.addListener(callback);
|
|
71
|
+
await this.coreEvents.start();
|
|
72
|
+
return eventSubscription;
|
|
82
73
|
}
|
|
83
74
|
sendNumberOfVolumeSubscriptionsToTelemetry() {
|
|
84
75
|
this.telemetry.logEvent({
|
|
85
76
|
eventName: 'volumeEventsSubscriptionsChanged',
|
|
86
|
-
numberOfVolumeSubscriptions: Object.keys(this.
|
|
77
|
+
numberOfVolumeSubscriptions: Object.keys(this.volumeEventManagers).length,
|
|
87
78
|
});
|
|
88
79
|
}
|
|
89
|
-
createVolumeEventManager(volumeId
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
manager.addListener(listener);
|
|
80
|
+
async createVolumeEventManager(volumeId) {
|
|
81
|
+
if (this.latestEventIdProvider === null || this.latestEventIdProvider === undefined) {
|
|
82
|
+
throw new Error('Cannot subscribe to events without passing a latestEventIdProvider in ProtonDriveClient initialization');
|
|
93
83
|
}
|
|
94
|
-
this.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
* One call always provides events from withing the same volume. The
|
|
102
|
-
* second argument of the callback `fullRefreshVolumeId` is thus single
|
|
103
|
-
* ID and if multiple volumes must be fully refreshed, client will
|
|
104
|
-
* receive multiple calls.
|
|
105
|
-
*/
|
|
106
|
-
addListener(callback) {
|
|
107
|
-
// Add new listener to the list for any new event manager.
|
|
108
|
-
this.listeners.push(callback);
|
|
109
|
-
// Add new listener to all existings managers.
|
|
110
|
-
this.coreEvents.addListener(callback);
|
|
111
|
-
for (const volumeEvents of Object.values(this.volumesEvents)) {
|
|
112
|
-
volumeEvents.addListener(callback);
|
|
84
|
+
const isOwnVolume = await this.shareManagement.isOwnVolume(volumeId);
|
|
85
|
+
const pollingInterval = this.getDefaultVolumePollingInterval(isOwnVolume);
|
|
86
|
+
const volumeEventManager = new volumeEventManager_1.VolumeEventManager(this.logger, this.apiService, volumeId);
|
|
87
|
+
const latestEventId = this.latestEventIdProvider.getLatestEventId(volumeId);
|
|
88
|
+
const eventManager = new eventManager_1.EventManager(volumeEventManager, pollingInterval, latestEventId);
|
|
89
|
+
for (const listener of this.cacheEventListeners) {
|
|
90
|
+
eventManager.addListener(listener);
|
|
113
91
|
}
|
|
92
|
+
await eventManager.start();
|
|
93
|
+
this.volumeEventManagers[volumeId] = eventManager;
|
|
94
|
+
return eventManager;
|
|
95
|
+
}
|
|
96
|
+
getDefaultVolumePollingInterval(isOwnVolume) {
|
|
97
|
+
return isOwnVolume ? OWN_VOLUME_POLLING_INTERVAL : OTHER_VOLUME_POLLING_INTERVAL;
|
|
114
98
|
}
|
|
115
99
|
}
|
|
116
100
|
exports.DriveEventsService = DriveEventsService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/internal/events/index.ts"],"names":[],"mappings":";;;AAGA,6CAAgD;AAChD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/internal/events/index.ts"],"names":[],"mappings":"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"}
|