@protontech/drive-sdk 0.13.0 → 0.14.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/interface/events.d.ts +1 -1
- package/dist/interface/telemetry.d.ts +9 -4
- package/dist/interface/telemetry.js +1 -0
- package/dist/interface/telemetry.js.map +1 -1
- package/dist/internal/apiService/driveTypes.d.ts +52 -0
- package/dist/internal/download/telemetry.js +6 -1
- package/dist/internal/download/telemetry.js.map +1 -1
- package/dist/internal/download/telemetry.test.js +5 -0
- package/dist/internal/download/telemetry.test.js.map +1 -1
- package/dist/internal/events/index.js +2 -2
- package/dist/internal/events/index.js.map +1 -1
- package/dist/internal/events/interface.d.ts +1 -1
- package/dist/internal/nodes/cryptoReporter.js +2 -2
- package/dist/internal/nodes/cryptoReporter.js.map +1 -1
- package/dist/internal/photos/addToAlbum.d.ts +6 -0
- package/dist/internal/photos/addToAlbum.js +1 -0
- package/dist/internal/photos/addToAlbum.js.map +1 -1
- package/dist/internal/photos/albumsManager.d.ts +4 -1
- package/dist/internal/photos/albumsManager.js +22 -2
- package/dist/internal/photos/albumsManager.js.map +1 -1
- package/dist/internal/photos/albumsManager.test.js +41 -1
- package/dist/internal/photos/albumsManager.test.js.map +1 -1
- package/dist/internal/photos/apiService.d.ts +1 -0
- package/dist/internal/photos/apiService.js +59 -5
- package/dist/internal/photos/apiService.js.map +1 -1
- package/dist/internal/photos/apiService.test.js +137 -0
- package/dist/internal/photos/apiService.test.js.map +1 -1
- package/dist/internal/photos/errors.d.ts +5 -0
- package/dist/internal/photos/errors.js +10 -1
- package/dist/internal/photos/errors.js.map +1 -1
- package/dist/internal/photos/index.js +1 -1
- package/dist/internal/photos/index.js.map +1 -1
- package/dist/internal/photos/photosManager.d.ts +1 -0
- package/dist/internal/photos/photosManager.js +42 -4
- package/dist/internal/photos/photosManager.js.map +1 -1
- package/dist/internal/photos/photosManager.test.js +35 -0
- package/dist/internal/photos/photosManager.test.js.map +1 -1
- package/dist/internal/photos/photosTransferPayloadBuilder.d.ts +1 -0
- package/dist/internal/photos/photosTransferPayloadBuilder.js +1 -0
- package/dist/internal/photos/photosTransferPayloadBuilder.js.map +1 -1
- package/dist/internal/sharing/apiService.js +1 -1
- package/dist/internal/sharing/apiService.js.map +1 -1
- package/dist/internal/upload/manager.js +3 -2
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +1 -1
- package/dist/internal/upload/manager.test.js.map +1 -1
- package/dist/internal/upload/telemetry.js +4 -1
- package/dist/internal/upload/telemetry.js.map +1 -1
- package/dist/internal/upload/telemetry.test.js +6 -0
- package/dist/internal/upload/telemetry.test.js.map +1 -1
- package/dist/protonDrivePhotosClient.d.ts +4 -3
- package/dist/protonDrivePhotosClient.js +3 -3
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/dist/telemetry.d.ts +1 -0
- package/dist/telemetry.js +21 -0
- package/dist/telemetry.js.map +1 -1
- package/dist/telemetry.test.d.ts +1 -0
- package/dist/telemetry.test.js +37 -0
- package/dist/telemetry.test.js.map +1 -0
- package/package.json +1 -1
- package/src/interface/events.ts +1 -1
- package/src/interface/telemetry.ts +9 -4
- package/src/internal/apiService/driveTypes.ts +52 -0
- package/src/internal/download/telemetry.test.ts +5 -0
- package/src/internal/download/telemetry.ts +7 -3
- package/src/internal/events/index.ts +2 -2
- package/src/internal/events/interface.ts +1 -1
- package/src/internal/nodes/cryptoReporter.ts +4 -2
- package/src/internal/photos/addToAlbum.ts +1 -1
- package/src/internal/photos/albumsManager.test.ts +61 -1
- package/src/internal/photos/albumsManager.ts +23 -3
- package/src/internal/photos/apiService.test.ts +155 -0
- package/src/internal/photos/apiService.ts +92 -3
- package/src/internal/photos/errors.ts +11 -0
- package/src/internal/photos/index.ts +1 -1
- package/src/internal/photos/photosManager.test.ts +43 -1
- package/src/internal/photos/photosManager.ts +61 -3
- package/src/internal/photos/photosTransferPayloadBuilder.ts +3 -1
- package/src/internal/sharing/apiService.ts +5 -5
- package/src/internal/upload/manager.test.ts +1 -1
- package/src/internal/upload/manager.ts +3 -2
- package/src/internal/upload/telemetry.test.ts +6 -0
- package/src/internal/upload/telemetry.ts +5 -3
- package/src/protonDrivePhotosClient.ts +4 -4
- package/src/telemetry.test.ts +40 -0
- package/src/telemetry.ts +22 -0
package/dist/telemetry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const telemetry_1 = require("./telemetry");
|
|
4
|
+
describe('reduceSizePrecision', () => {
|
|
5
|
+
it('returns 0 for size 0', () => {
|
|
6
|
+
expect((0, telemetry_1.reduceSizePrecision)(0)).toBe(0);
|
|
7
|
+
});
|
|
8
|
+
it('returns 4095 for very small files (size < 4096)', () => {
|
|
9
|
+
expect((0, telemetry_1.reduceSizePrecision)(1)).toBe(4095);
|
|
10
|
+
expect((0, telemetry_1.reduceSizePrecision)(100)).toBe(4095);
|
|
11
|
+
expect((0, telemetry_1.reduceSizePrecision)(4095)).toBe(4095);
|
|
12
|
+
});
|
|
13
|
+
it('returns precision (100_000) for sizes from 4096 to below precision', () => {
|
|
14
|
+
expect((0, telemetry_1.reduceSizePrecision)(4096)).toBe(100_000);
|
|
15
|
+
expect((0, telemetry_1.reduceSizePrecision)(50_000)).toBe(100_000);
|
|
16
|
+
expect((0, telemetry_1.reduceSizePrecision)(99_999)).toBe(100_000);
|
|
17
|
+
});
|
|
18
|
+
it('returns size unchanged when size equals precision', () => {
|
|
19
|
+
expect((0, telemetry_1.reduceSizePrecision)(100_000)).toBe(100_000);
|
|
20
|
+
});
|
|
21
|
+
it('rounds down to nearest 100_000 for sizes above precision', () => {
|
|
22
|
+
expect((0, telemetry_1.reduceSizePrecision)(100_001)).toBe(100_000);
|
|
23
|
+
expect((0, telemetry_1.reduceSizePrecision)(150_000)).toBe(100_000);
|
|
24
|
+
expect((0, telemetry_1.reduceSizePrecision)(199_999)).toBe(100_000);
|
|
25
|
+
expect((0, telemetry_1.reduceSizePrecision)(200_000)).toBe(200_000);
|
|
26
|
+
expect((0, telemetry_1.reduceSizePrecision)(250_000)).toBe(200_000);
|
|
27
|
+
expect((0, telemetry_1.reduceSizePrecision)(299_999)).toBe(200_000);
|
|
28
|
+
expect((0, telemetry_1.reduceSizePrecision)(300_000)).toBe(300_000);
|
|
29
|
+
});
|
|
30
|
+
it('handles large sizes', () => {
|
|
31
|
+
expect((0, telemetry_1.reduceSizePrecision)(1_000_000)).toBe(1_000_000);
|
|
32
|
+
expect((0, telemetry_1.reduceSizePrecision)(1_500_000)).toBe(1_500_000);
|
|
33
|
+
expect((0, telemetry_1.reduceSizePrecision)(1_999_999)).toBe(1_900_000);
|
|
34
|
+
expect((0, telemetry_1.reduceSizePrecision)(10_000_000)).toBe(10_000_000);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=telemetry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../src/telemetry.test.ts"],"names":[],"mappings":";;AAAA,2CAAkD;AAElD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,IAAA,+BAAmB,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,IAAA,+BAAmB,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAA,+BAAmB,EAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAA,+BAAmB,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,IAAA,+BAAmB,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,CAAC,IAAA,+BAAmB,EAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,IAAA,+BAAmB,EAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,IAAA,+BAAmB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,IAAA,+BAAmB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,IAAA,+BAAmB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,IAAA,+BAAmB,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
package/src/interface/events.ts
CHANGED
|
@@ -34,9 +34,11 @@ export interface MetricDebounceLongWaitEvent {
|
|
|
34
34
|
|
|
35
35
|
export interface MetricUploadEvent {
|
|
36
36
|
eventName: 'upload';
|
|
37
|
-
volumeType
|
|
37
|
+
volumeType: MetricVolumeType;
|
|
38
38
|
uploadedSize: number;
|
|
39
|
+
approximateUploadedSize: number;
|
|
39
40
|
expectedSize: number;
|
|
41
|
+
approximateExpectedSize: number;
|
|
40
42
|
error?: MetricsUploadErrorType;
|
|
41
43
|
originalError?: unknown;
|
|
42
44
|
}
|
|
@@ -50,9 +52,11 @@ export type MetricsUploadErrorType =
|
|
|
50
52
|
|
|
51
53
|
export interface MetricDownloadEvent {
|
|
52
54
|
eventName: 'download';
|
|
53
|
-
volumeType
|
|
55
|
+
volumeType: MetricVolumeType;
|
|
54
56
|
downloadedSize: number;
|
|
57
|
+
approximateDownloadedSize: number;
|
|
55
58
|
claimedFileSize?: number;
|
|
59
|
+
approximateClaimedFileSize?: number;
|
|
56
60
|
error?: MetricsDownloadErrorType;
|
|
57
61
|
originalError?: unknown;
|
|
58
62
|
}
|
|
@@ -67,7 +71,7 @@ export type MetricsDownloadErrorType =
|
|
|
67
71
|
|
|
68
72
|
export interface MetricDecryptionErrorEvent {
|
|
69
73
|
eventName: 'decryptionError';
|
|
70
|
-
volumeType
|
|
74
|
+
volumeType: MetricVolumeType;
|
|
71
75
|
field: MetricsDecryptionErrorField;
|
|
72
76
|
fromBefore2024?: boolean;
|
|
73
77
|
error?: unknown;
|
|
@@ -85,7 +89,7 @@ export type MetricsDecryptionErrorField =
|
|
|
85
89
|
|
|
86
90
|
export interface MetricVerificationErrorEvent {
|
|
87
91
|
eventName: 'verificationError';
|
|
88
|
-
volumeType
|
|
92
|
+
volumeType: MetricVolumeType;
|
|
89
93
|
field: MetricVerificationErrorField;
|
|
90
94
|
addressMatchingDefaultShare?: boolean;
|
|
91
95
|
fromBefore2024?: boolean;
|
|
@@ -114,6 +118,7 @@ export interface MetricVolumeEventsSubscriptionsChangedEvent {
|
|
|
114
118
|
}
|
|
115
119
|
|
|
116
120
|
export enum MetricVolumeType {
|
|
121
|
+
Unknown = 'unknown',
|
|
117
122
|
OwnVolume = 'own_volume',
|
|
118
123
|
OwnPhotoVolume = 'own_photo_volume',
|
|
119
124
|
Shared = 'shared',
|
|
@@ -2644,6 +2644,26 @@ export interface paths {
|
|
|
2644
2644
|
patch?: never;
|
|
2645
2645
|
trace?: never;
|
|
2646
2646
|
};
|
|
2647
|
+
"/drive/shares/{shareID}/editors-can-share": {
|
|
2648
|
+
parameters: {
|
|
2649
|
+
query?: never;
|
|
2650
|
+
header?: never;
|
|
2651
|
+
path?: never;
|
|
2652
|
+
cookie?: never;
|
|
2653
|
+
};
|
|
2654
|
+
get?: never;
|
|
2655
|
+
/**
|
|
2656
|
+
* Update editorsCanShare property of a share
|
|
2657
|
+
* @description Only allowed to volume owners and members with Admin rights on the Parent
|
|
2658
|
+
*/
|
|
2659
|
+
put: operations["put_drive-shares-{shareID}-editors-can-share"];
|
|
2660
|
+
post?: never;
|
|
2661
|
+
delete?: never;
|
|
2662
|
+
options?: never;
|
|
2663
|
+
head?: never;
|
|
2664
|
+
patch?: never;
|
|
2665
|
+
trace?: never;
|
|
2666
|
+
};
|
|
2647
2667
|
"/drive/shares/{shareID}/owner": {
|
|
2648
2668
|
parameters: {
|
|
2649
2669
|
query?: never;
|
|
@@ -2676,6 +2696,7 @@ export interface paths {
|
|
|
2676
2696
|
put?: never;
|
|
2677
2697
|
/**
|
|
2678
2698
|
* Update properties of a share
|
|
2699
|
+
* @deprecated
|
|
2679
2700
|
* @description Update the values on one or more properties of the Share. For now, only allowed changing editorsCanShare attribute
|
|
2680
2701
|
*/
|
|
2681
2702
|
post: operations["post_drive-shares-{shareID}-property"];
|
|
@@ -6390,6 +6411,10 @@ export interface components {
|
|
|
6390
6411
|
*/
|
|
6391
6412
|
Code: 1000;
|
|
6392
6413
|
};
|
|
6414
|
+
UpdateShareEditorsCanShareRequestDto: {
|
|
6415
|
+
/** @description Indicates if editor members of this share could reshare it or not */
|
|
6416
|
+
Value: boolean;
|
|
6417
|
+
};
|
|
6393
6418
|
TransferInput: {
|
|
6394
6419
|
/** @description The ID of the new address */
|
|
6395
6420
|
AddressID: string;
|
|
@@ -12354,6 +12379,33 @@ export interface operations {
|
|
|
12354
12379
|
};
|
|
12355
12380
|
};
|
|
12356
12381
|
};
|
|
12382
|
+
"put_drive-shares-{shareID}-editors-can-share": {
|
|
12383
|
+
parameters: {
|
|
12384
|
+
query?: never;
|
|
12385
|
+
header?: never;
|
|
12386
|
+
path: {
|
|
12387
|
+
shareID: string;
|
|
12388
|
+
};
|
|
12389
|
+
cookie?: never;
|
|
12390
|
+
};
|
|
12391
|
+
requestBody?: {
|
|
12392
|
+
content: {
|
|
12393
|
+
"application/json": components["schemas"]["UpdateShareEditorsCanShareRequestDto"];
|
|
12394
|
+
};
|
|
12395
|
+
};
|
|
12396
|
+
responses: {
|
|
12397
|
+
/** @description Success */
|
|
12398
|
+
200: {
|
|
12399
|
+
headers: {
|
|
12400
|
+
"x-pm-code": 1000;
|
|
12401
|
+
[name: string]: unknown;
|
|
12402
|
+
};
|
|
12403
|
+
content: {
|
|
12404
|
+
"application/json": components["schemas"]["SuccessfulResponse"];
|
|
12405
|
+
};
|
|
12406
|
+
};
|
|
12407
|
+
};
|
|
12408
|
+
};
|
|
12357
12409
|
"post_drive-shares-{shareID}-owner": {
|
|
12358
12410
|
parameters: {
|
|
12359
12411
|
query?: never;
|
|
@@ -38,6 +38,7 @@ describe('DownloadTelemetry', () => {
|
|
|
38
38
|
eventName: 'download',
|
|
39
39
|
volumeType: 'own_volume',
|
|
40
40
|
downloadedSize: 0,
|
|
41
|
+
approximateDownloadedSize: 0,
|
|
41
42
|
error: 'unknown',
|
|
42
43
|
originalError: error,
|
|
43
44
|
});
|
|
@@ -51,7 +52,9 @@ describe('DownloadTelemetry', () => {
|
|
|
51
52
|
eventName: 'download',
|
|
52
53
|
volumeType: 'own_volume',
|
|
53
54
|
downloadedSize: 123,
|
|
55
|
+
approximateDownloadedSize: 4095,
|
|
54
56
|
claimedFileSize: 456,
|
|
57
|
+
approximateClaimedFileSize: 4095,
|
|
55
58
|
error: 'unknown',
|
|
56
59
|
originalError: error,
|
|
57
60
|
});
|
|
@@ -64,7 +67,9 @@ describe('DownloadTelemetry', () => {
|
|
|
64
67
|
eventName: 'download',
|
|
65
68
|
volumeType: 'own_volume',
|
|
66
69
|
downloadedSize: 500,
|
|
70
|
+
approximateDownloadedSize: 4095,
|
|
67
71
|
claimedFileSize: 500,
|
|
72
|
+
approximateClaimedFileSize: 4095,
|
|
68
73
|
});
|
|
69
74
|
});
|
|
70
75
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { RateLimitedError, ValidationError, DecryptionError, IntegrityError } from '../../errors';
|
|
2
|
-
import { ProtonDriveTelemetry, MetricsDownloadErrorType, Logger } from '../../interface';
|
|
3
|
-
import { LoggerWithPrefix } from '../../telemetry';
|
|
2
|
+
import { ProtonDriveTelemetry, MetricsDownloadErrorType, Logger, MetricVolumeType } from '../../interface';
|
|
3
|
+
import { LoggerWithPrefix, reduceSizePrecision } from '../../telemetry';
|
|
4
4
|
import { APIHTTPError } from '../apiService';
|
|
5
5
|
import { splitNodeRevisionUid, splitNodeUid } from '../uids';
|
|
6
6
|
import { SharesService } from './interface';
|
|
@@ -73,7 +73,7 @@ export class DownloadTelemetry {
|
|
|
73
73
|
originalError?: unknown;
|
|
74
74
|
},
|
|
75
75
|
) {
|
|
76
|
-
let volumeType;
|
|
76
|
+
let volumeType = MetricVolumeType.Unknown;
|
|
77
77
|
try {
|
|
78
78
|
volumeType = await this.sharesService.getVolumeMetricContext(volumeId);
|
|
79
79
|
} catch (error: unknown) {
|
|
@@ -83,6 +83,10 @@ export class DownloadTelemetry {
|
|
|
83
83
|
this.telemetry.recordMetric({
|
|
84
84
|
eventName: 'download',
|
|
85
85
|
volumeType,
|
|
86
|
+
approximateDownloadedSize: reduceSizePrecision(options.downloadedSize),
|
|
87
|
+
approximateClaimedFileSize: options.claimedFileSize
|
|
88
|
+
? reduceSizePrecision(options.claimedFileSize)
|
|
89
|
+
: undefined,
|
|
86
90
|
...options,
|
|
87
91
|
});
|
|
88
92
|
}
|
|
@@ -62,7 +62,7 @@ export class DriveEventsService {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
const coreEventManager = new CoreEventManager(this.logger, this.apiService);
|
|
65
|
-
const latestEventId = this.latestEventIdProvider.getLatestEventId('core')
|
|
65
|
+
const latestEventId = await this.latestEventIdProvider.getLatestEventId('core');
|
|
66
66
|
const eventManager = new EventManager(coreEventManager, CORE_POLLING_INTERVAL, latestEventId);
|
|
67
67
|
|
|
68
68
|
for (const listener of this.cacheEventListeners) {
|
|
@@ -105,7 +105,7 @@ export class DriveEventsService {
|
|
|
105
105
|
|
|
106
106
|
const isOwnVolume = await this.sharesService.isOwnVolume(volumeId);
|
|
107
107
|
const pollingInterval = this.getDefaultVolumePollingInterval(isOwnVolume);
|
|
108
|
-
const latestEventId = this.latestEventIdProvider.getLatestEventId(volumeId);
|
|
108
|
+
const latestEventId = await this.latestEventIdProvider.getLatestEventId(volumeId);
|
|
109
109
|
const eventManager = new EventManager<DriveEvent>(volumeEventManager, pollingInterval, latestEventId);
|
|
110
110
|
|
|
111
111
|
for (const listener of this.cacheEventListeners) {
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
Logger,
|
|
9
9
|
MetricsDecryptionErrorField,
|
|
10
10
|
MetricVerificationErrorField,
|
|
11
|
+
MetricVolumeType,
|
|
11
12
|
} from '../../interface';
|
|
12
13
|
import { getVerificationMessage, isNotApplicationError } from '../errors';
|
|
13
14
|
import { splitNodeUid } from '../uids';
|
|
@@ -63,7 +64,8 @@ export class NodesCryptoReporter {
|
|
|
63
64
|
|
|
64
65
|
const fromBefore2024 = node.creationTime < new Date('2024-01-01');
|
|
65
66
|
|
|
66
|
-
let addressMatchingDefaultShare,
|
|
67
|
+
let addressMatchingDefaultShare,
|
|
68
|
+
volumeType = MetricVolumeType.Unknown;
|
|
67
69
|
try {
|
|
68
70
|
const { volumeId } = splitNodeUid(node.uid);
|
|
69
71
|
const { email } = await this.shareService.getMyFilesShareMemberEmailKey();
|
|
@@ -99,7 +101,7 @@ export class NodesCryptoReporter {
|
|
|
99
101
|
|
|
100
102
|
const fromBefore2024 = node.creationTime < new Date('2024-01-01');
|
|
101
103
|
|
|
102
|
-
let volumeType;
|
|
104
|
+
let volumeType = MetricVolumeType.Unknown;
|
|
103
105
|
try {
|
|
104
106
|
const { volumeId } = splitNodeUid(node.uid);
|
|
105
107
|
volumeType = await this.shareService.getVolumeMetricContext(volumeId);
|
|
@@ -211,7 +211,7 @@ function splitByVolume(
|
|
|
211
211
|
* Groups payloads into batches respecting the API limit.
|
|
212
212
|
* Each payload's size counts itself plus its related photos.
|
|
213
213
|
*/
|
|
214
|
-
function* createBatches(payloads: TransferEncryptedPhotoPayload[]): Generator<TransferEncryptedPhotoPayload[]> {
|
|
214
|
+
export function* createBatches(payloads: TransferEncryptedPhotoPayload[]): Generator<TransferEncryptedPhotoPayload[]> {
|
|
215
215
|
let batch: TransferEncryptedPhotoPayload[] = [];
|
|
216
216
|
let batchSize = 0;
|
|
217
217
|
|
|
@@ -4,8 +4,10 @@ import { getMockTelemetry } from '../../tests/telemetry';
|
|
|
4
4
|
import { AlbumsManager } from './albumsManager';
|
|
5
5
|
import { AlbumsCryptoService } from './albumsCrypto';
|
|
6
6
|
import { PhotosAPIService } from './apiService';
|
|
7
|
+
import { AlbumContainsPhotosNotInTimelineError } from './errors';
|
|
7
8
|
import { DecryptedPhotoNode } from './interface';
|
|
8
9
|
import { PhotosNodesAccess } from './nodes';
|
|
10
|
+
import { PhotosManager } from './photosManager';
|
|
9
11
|
import { PhotoSharesManager } from './shares';
|
|
10
12
|
|
|
11
13
|
describe('Albums', () => {
|
|
@@ -13,6 +15,7 @@ describe('Albums', () => {
|
|
|
13
15
|
let cryptoService: AlbumsCryptoService;
|
|
14
16
|
let photoShares: PhotoSharesManager;
|
|
15
17
|
let nodesService: PhotosNodesAccess;
|
|
18
|
+
let photosService: PhotosManager;
|
|
16
19
|
let albums: AlbumsManager;
|
|
17
20
|
|
|
18
21
|
let nodes: { [uid: string]: DecryptedPhotoNode };
|
|
@@ -97,7 +100,19 @@ describe('Albums', () => {
|
|
|
97
100
|
notifyChildCreated: jest.fn(),
|
|
98
101
|
};
|
|
99
102
|
|
|
100
|
-
|
|
103
|
+
// @ts-expect-error No need to implement all methods for mocking
|
|
104
|
+
photosService = {
|
|
105
|
+
saveToTimeline: jest.fn(),
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
albums = new AlbumsManager(
|
|
109
|
+
getMockTelemetry(),
|
|
110
|
+
apiService,
|
|
111
|
+
cryptoService,
|
|
112
|
+
photoShares,
|
|
113
|
+
nodesService,
|
|
114
|
+
photosService,
|
|
115
|
+
);
|
|
101
116
|
});
|
|
102
117
|
|
|
103
118
|
describe('createAlbum', () => {
|
|
@@ -231,6 +246,51 @@ describe('Albums', () => {
|
|
|
231
246
|
expect(apiService.deleteAlbum).toHaveBeenCalledWith('albumNodeUid', { force: true });
|
|
232
247
|
expect(nodesService.notifyNodeDeleted).toHaveBeenCalledWith('albumNodeUid');
|
|
233
248
|
});
|
|
249
|
+
|
|
250
|
+
it('when saveToTimeline is true, saves photos then retries delete', async () => {
|
|
251
|
+
const notInTimelineError = new AlbumContainsPhotosNotInTimelineError('msg', 1, ['p1', 'p2']);
|
|
252
|
+
(apiService.deleteAlbum as jest.Mock)
|
|
253
|
+
.mockRejectedValueOnce(notInTimelineError)
|
|
254
|
+
.mockResolvedValueOnce(undefined);
|
|
255
|
+
|
|
256
|
+
photosService.saveToTimeline = jest.fn().mockImplementation(async function* () {
|
|
257
|
+
yield { uid: 'p1', ok: true };
|
|
258
|
+
yield { uid: 'p2', ok: true };
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
await albums.deleteAlbum('albumNodeUid', { saveToTimeline: true });
|
|
262
|
+
|
|
263
|
+
expect(apiService.deleteAlbum).toHaveBeenCalledTimes(2);
|
|
264
|
+
expect(photosService.saveToTimeline).toHaveBeenCalledWith(['p1', 'p2']);
|
|
265
|
+
expect(nodesService.notifyNodeDeleted).toHaveBeenCalledTimes(1);
|
|
266
|
+
expect(nodesService.notifyNodeDeleted).toHaveBeenCalledWith('albumNodeUid');
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
it('throws AlbumContainsPhotosNotInTimelineError when saveToTimeline is false', async () => {
|
|
270
|
+
const notInTimelineError = new AlbumContainsPhotosNotInTimelineError('msg', 1, ['p1']);
|
|
271
|
+
(apiService.deleteAlbum as jest.Mock).mockRejectedValueOnce(notInTimelineError);
|
|
272
|
+
|
|
273
|
+
await expect(albums.deleteAlbum('albumNodeUid')).rejects.toBe(notInTimelineError);
|
|
274
|
+
|
|
275
|
+
expect(apiService.deleteAlbum).toHaveBeenCalledTimes(1);
|
|
276
|
+
expect(photosService.saveToTimeline).not.toHaveBeenCalled();
|
|
277
|
+
expect(nodesService.notifyNodeDeleted).not.toHaveBeenCalled();
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
it('throws when saveToTimeline step fails with error', async () => {
|
|
281
|
+
const notInTimelineError = new AlbumContainsPhotosNotInTimelineError('msg', 1, ['p1']);
|
|
282
|
+
(apiService.deleteAlbum as jest.Mock).mockRejectedValue(notInTimelineError);
|
|
283
|
+
|
|
284
|
+
const saveError = new Error('save failed');
|
|
285
|
+
photosService.saveToTimeline = jest.fn().mockImplementation(async function* () {
|
|
286
|
+
yield { uid: 'p1', ok: false, error: saveError };
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
await expect(albums.deleteAlbum('albumNodeUid', { saveToTimeline: true })).rejects.toBe(saveError);
|
|
290
|
+
|
|
291
|
+
expect(apiService.deleteAlbum).toHaveBeenCalledTimes(1);
|
|
292
|
+
expect(nodesService.notifyNodeDeleted).not.toHaveBeenCalled();
|
|
293
|
+
});
|
|
234
294
|
});
|
|
235
295
|
|
|
236
296
|
describe('removePhotos', () => {
|
|
@@ -7,8 +7,10 @@ import { splitNodeUid } from '../uids';
|
|
|
7
7
|
import { AddToAlbumProcess } from './addToAlbum';
|
|
8
8
|
import { AlbumsCryptoService } from './albumsCrypto';
|
|
9
9
|
import { PhotosAPIService } from './apiService';
|
|
10
|
+
import { AlbumContainsPhotosNotInTimelineError } from './errors';
|
|
10
11
|
import { AlbumItem, DecryptedPhotoNode } from './interface';
|
|
11
12
|
import { PhotosNodesAccess } from './nodes';
|
|
13
|
+
import { PhotosManager } from './photosManager';
|
|
12
14
|
import { PhotoSharesManager } from './shares';
|
|
13
15
|
|
|
14
16
|
const BATCH_LOADING_SIZE = 10;
|
|
@@ -25,6 +27,7 @@ export class AlbumsManager {
|
|
|
25
27
|
private cryptoService: AlbumsCryptoService,
|
|
26
28
|
private photoShares: PhotoSharesManager,
|
|
27
29
|
private nodesService: PhotosNodesAccess,
|
|
30
|
+
private photos: PhotosManager,
|
|
28
31
|
) {
|
|
29
32
|
this.logger = telemetry.getLogger('albums');
|
|
30
33
|
this.apiService = apiService;
|
|
@@ -157,8 +160,25 @@ export class AlbumsManager {
|
|
|
157
160
|
return newNode;
|
|
158
161
|
}
|
|
159
162
|
|
|
160
|
-
async deleteAlbum(nodeUid: string, options: { force?: boolean } = {}): Promise<void> {
|
|
161
|
-
|
|
163
|
+
async deleteAlbum(nodeUid: string, options: { force?: boolean; saveToTimeline?: boolean } = {}): Promise<void> {
|
|
164
|
+
try {
|
|
165
|
+
await this.apiService.deleteAlbum(nodeUid, options);
|
|
166
|
+
} catch (error) {
|
|
167
|
+
if (
|
|
168
|
+
options.saveToTimeline &&
|
|
169
|
+
error instanceof AlbumContainsPhotosNotInTimelineError &&
|
|
170
|
+
error.photosOnlyInAlbumNodeUids.length > 0
|
|
171
|
+
) {
|
|
172
|
+
for await (const result of this.photos.saveToTimeline(error.photosOnlyInAlbumNodeUids)) {
|
|
173
|
+
if (!result.ok) {
|
|
174
|
+
throw result.error;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
await this.apiService.deleteAlbum(nodeUid, options);
|
|
178
|
+
} else {
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
162
182
|
await this.nodesService.notifyNodeDeleted(nodeUid);
|
|
163
183
|
}
|
|
164
184
|
|
|
@@ -183,7 +203,7 @@ export class AlbumsManager {
|
|
|
183
203
|
this.logger,
|
|
184
204
|
signal,
|
|
185
205
|
);
|
|
186
|
-
yield
|
|
206
|
+
yield* process.execute(photoNodeUids);
|
|
187
207
|
}
|
|
188
208
|
|
|
189
209
|
async *removePhotos(
|