@protontech/drive-sdk 0.5.1 → 0.6.1
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/diagnostic/diagnostic.d.ts +7 -4
- package/dist/diagnostic/diagnostic.js +16 -8
- package/dist/diagnostic/diagnostic.js.map +1 -1
- package/dist/diagnostic/index.d.ts +1 -1
- package/dist/diagnostic/index.js +9 -1
- package/dist/diagnostic/index.js.map +1 -1
- package/dist/diagnostic/interface.d.ts +24 -9
- package/dist/diagnostic/nodeUtils.d.ts +13 -0
- package/dist/diagnostic/nodeUtils.js +90 -0
- package/dist/diagnostic/nodeUtils.js.map +1 -0
- package/dist/diagnostic/sdkDiagnosticBase.d.ts +36 -0
- package/dist/diagnostic/sdkDiagnosticBase.js +305 -0
- package/dist/diagnostic/sdkDiagnosticBase.js.map +1 -0
- package/dist/diagnostic/sdkDiagnosticMain.d.ts +16 -0
- package/dist/diagnostic/sdkDiagnosticMain.js +79 -0
- package/dist/diagnostic/sdkDiagnosticMain.js.map +1 -0
- package/dist/diagnostic/sdkDiagnosticPhotos.d.ts +13 -0
- package/dist/diagnostic/sdkDiagnosticPhotos.js +65 -0
- package/dist/diagnostic/sdkDiagnosticPhotos.js.map +1 -0
- package/dist/interface/index.d.ts +1 -1
- package/dist/interface/upload.d.ts +1 -12
- package/dist/internal/devices/interface.d.ts +1 -1
- package/dist/internal/devices/manager.js +1 -1
- package/dist/internal/devices/manager.js.map +1 -1
- package/dist/internal/devices/manager.test.js +3 -3
- package/dist/internal/devices/manager.test.js.map +1 -1
- package/dist/internal/errors.d.ts +5 -0
- package/dist/internal/errors.js +23 -0
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/errors.test.js +53 -2
- package/dist/internal/errors.test.js.map +1 -1
- package/dist/internal/nodes/apiService.d.ts +11 -1
- package/dist/internal/nodes/apiService.js +20 -1
- package/dist/internal/nodes/apiService.js.map +1 -1
- package/dist/internal/nodes/apiService.test.js +1 -1
- package/dist/internal/nodes/apiService.test.js.map +1 -1
- package/dist/internal/nodes/cryptoReporter.js +3 -0
- package/dist/internal/nodes/cryptoReporter.js.map +1 -1
- package/dist/internal/nodes/cryptoService.d.ts +4 -0
- package/dist/internal/nodes/cryptoService.js +6 -0
- package/dist/internal/nodes/cryptoService.js.map +1 -1
- package/dist/internal/nodes/index.d.ts +1 -1
- package/dist/internal/nodes/index.js +2 -2
- package/dist/internal/nodes/index.js.map +1 -1
- package/dist/internal/nodes/index.test.js +2 -2
- package/dist/internal/nodes/index.test.js.map +1 -1
- package/dist/internal/nodes/interface.d.ts +1 -1
- package/dist/internal/nodes/nodeName.d.ts +8 -0
- package/dist/internal/nodes/nodeName.js +30 -0
- package/dist/internal/nodes/nodeName.js.map +1 -0
- package/dist/internal/nodes/nodeName.test.d.ts +1 -0
- package/dist/internal/nodes/nodeName.test.js +50 -0
- package/dist/internal/nodes/nodeName.test.js.map +1 -0
- package/dist/internal/nodes/nodesAccess.d.ts +1 -1
- package/dist/internal/nodes/nodesAccess.js +4 -4
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +2 -2
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.d.ts +1 -0
- package/dist/internal/nodes/nodesManagement.js +30 -1
- package/dist/internal/nodes/nodesManagement.js.map +1 -1
- package/dist/internal/nodes/nodesManagement.test.js +61 -0
- package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
- package/dist/internal/photos/albums.js +1 -1
- package/dist/internal/photos/albums.js.map +1 -1
- package/dist/internal/photos/apiService.d.ts +6 -0
- package/dist/internal/photos/apiService.js +16 -0
- package/dist/internal/photos/apiService.js.map +1 -1
- package/dist/internal/photos/index.d.ts +3 -1
- package/dist/internal/photos/index.js +6 -2
- package/dist/internal/photos/index.js.map +1 -1
- package/dist/internal/photos/interface.d.ts +4 -1
- package/dist/internal/photos/shares.d.ts +1 -1
- package/dist/internal/photos/shares.js +3 -3
- package/dist/internal/photos/shares.js.map +1 -1
- package/dist/internal/photos/timeline.d.ts +8 -1
- package/dist/internal/photos/timeline.js +36 -2
- package/dist/internal/photos/timeline.js.map +1 -1
- package/dist/internal/photos/timeline.test.d.ts +1 -0
- package/dist/internal/photos/timeline.test.js +99 -0
- package/dist/internal/photos/timeline.test.js.map +1 -0
- package/dist/internal/shares/cryptoService.js +3 -0
- package/dist/internal/shares/cryptoService.js.map +1 -1
- package/dist/internal/shares/index.d.ts +1 -0
- package/dist/internal/shares/index.js +3 -0
- package/dist/internal/shares/index.js.map +1 -1
- package/dist/internal/shares/interface.d.ts +8 -0
- package/dist/internal/shares/interface.js +10 -1
- package/dist/internal/shares/interface.js.map +1 -1
- package/dist/internal/shares/manager.d.ts +1 -1
- package/dist/internal/shares/manager.js +4 -4
- package/dist/internal/shares/manager.js.map +1 -1
- package/dist/internal/shares/manager.test.js +7 -7
- package/dist/internal/shares/manager.test.js.map +1 -1
- package/dist/internal/sharing/apiService.d.ts +3 -1
- package/dist/internal/sharing/apiService.js +16 -12
- package/dist/internal/sharing/apiService.js.map +1 -1
- package/dist/internal/sharing/index.d.ts +2 -1
- package/dist/internal/sharing/index.js +6 -2
- package/dist/internal/sharing/index.js.map +1 -1
- package/dist/internal/sharing/interface.d.ts +1 -1
- package/dist/internal/sharing/sharingAccess.js +1 -1
- package/dist/internal/sharing/sharingAccess.js.map +1 -1
- package/dist/internal/sharing/sharingAccess.test.js +1 -1
- package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.js +32 -14
- package/dist/internal/sharing/sharingManagement.js.map +1 -1
- package/dist/internal/sharing/sharingManagement.test.js +46 -1
- package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
- package/dist/internal/sharingPublic/cryptoReporter.js +3 -0
- package/dist/internal/sharingPublic/cryptoReporter.js.map +1 -1
- package/dist/internal/sharingPublic/index.d.ts +3 -0
- package/dist/internal/sharingPublic/index.js +5 -1
- package/dist/internal/sharingPublic/index.js.map +1 -1
- package/dist/internal/sharingPublic/shares.d.ts +1 -1
- package/dist/internal/sharingPublic/shares.js +1 -2
- package/dist/internal/sharingPublic/shares.js.map +1 -1
- package/dist/internal/upload/apiService.d.ts +0 -9
- package/dist/internal/upload/apiService.js +0 -16
- package/dist/internal/upload/apiService.js.map +1 -1
- package/dist/internal/upload/cryptoService.d.ts +0 -4
- package/dist/internal/upload/cryptoService.js +0 -6
- package/dist/internal/upload/cryptoService.js.map +1 -1
- package/dist/internal/upload/fileUploader.d.ts +0 -1
- package/dist/internal/upload/fileUploader.js +0 -4
- package/dist/internal/upload/fileUploader.js.map +1 -1
- package/dist/internal/upload/manager.d.ts +0 -1
- package/dist/internal/upload/manager.js +0 -51
- package/dist/internal/upload/manager.js.map +1 -1
- package/dist/internal/upload/manager.test.js +0 -61
- package/dist/internal/upload/manager.test.js.map +1 -1
- package/dist/protonDriveClient.d.ts +17 -2
- package/dist/protonDriveClient.js +19 -1
- package/dist/protonDriveClient.js.map +1 -1
- package/dist/protonDrivePhotosClient.d.ts +119 -4
- package/dist/protonDrivePhotosClient.js +183 -10
- package/dist/protonDrivePhotosClient.js.map +1 -1
- package/dist/protonDrivePublicLinkClient.d.ts +33 -1
- package/dist/protonDrivePublicLinkClient.js +51 -2
- package/dist/protonDrivePublicLinkClient.js.map +1 -1
- package/package.json +1 -1
- package/src/diagnostic/diagnostic.ts +27 -8
- package/src/diagnostic/index.ts +17 -2
- package/src/diagnostic/interface.ts +35 -9
- package/src/diagnostic/nodeUtils.ts +100 -0
- package/src/diagnostic/{sdkDiagnostic.ts → sdkDiagnosticBase.ts} +204 -204
- package/src/diagnostic/sdkDiagnosticMain.ts +95 -0
- package/src/diagnostic/sdkDiagnosticPhotos.ts +70 -0
- package/src/interface/index.ts +1 -1
- package/src/interface/upload.ts +1 -13
- package/src/internal/devices/interface.ts +1 -1
- package/src/internal/devices/manager.test.ts +3 -3
- package/src/internal/devices/manager.ts +1 -1
- package/src/internal/errors.test.ts +62 -1
- package/src/internal/errors.ts +27 -0
- package/src/internal/nodes/apiService.test.ts +1 -1
- package/src/internal/nodes/apiService.ts +42 -0
- package/src/internal/nodes/cryptoReporter.ts +6 -5
- package/src/internal/nodes/cryptoService.ts +9 -0
- package/src/internal/nodes/index.test.ts +2 -1
- package/src/internal/nodes/index.ts +2 -1
- package/src/internal/nodes/interface.ts +1 -1
- package/src/internal/nodes/nodeName.test.ts +57 -0
- package/src/internal/nodes/nodeName.ts +26 -0
- package/src/internal/nodes/nodesAccess.test.ts +2 -2
- package/src/internal/nodes/nodesAccess.ts +5 -5
- package/src/internal/nodes/nodesManagement.test.ts +65 -0
- package/src/internal/nodes/nodesManagement.ts +43 -1
- package/src/internal/photos/albums.ts +1 -1
- package/src/internal/photos/apiService.ts +40 -0
- package/src/internal/photos/index.ts +13 -1
- package/src/internal/photos/interface.ts +4 -1
- package/src/internal/photos/shares.ts +3 -3
- package/src/internal/photos/timeline.test.ts +116 -0
- package/src/internal/photos/timeline.ts +47 -2
- package/src/internal/shares/cryptoService.ts +5 -1
- package/src/internal/shares/index.ts +1 -0
- package/src/internal/shares/interface.ts +9 -0
- package/src/internal/shares/manager.test.ts +7 -7
- package/src/internal/shares/manager.ts +4 -4
- package/src/internal/sharing/apiService.ts +15 -12
- package/src/internal/sharing/index.ts +7 -1
- package/src/internal/sharing/interface.ts +1 -1
- package/src/internal/sharing/sharingAccess.test.ts +1 -1
- package/src/internal/sharing/sharingAccess.ts +1 -1
- package/src/internal/sharing/sharingManagement.test.ts +59 -1
- package/src/internal/sharing/sharingManagement.ts +33 -14
- package/src/internal/sharingPublic/cryptoReporter.ts +5 -1
- package/src/internal/sharingPublic/index.ts +5 -1
- package/src/internal/sharingPublic/shares.ts +1 -2
- package/src/internal/upload/apiService.ts +0 -39
- package/src/internal/upload/cryptoService.ts +0 -9
- package/src/internal/upload/fileUploader.ts +0 -5
- package/src/internal/upload/manager.test.ts +0 -65
- package/src/internal/upload/manager.ts +0 -64
- package/src/protonDriveClient.ts +21 -2
- package/src/protonDrivePhotosClient.ts +217 -9
- package/src/protonDrivePublicLinkClient.ts +77 -2
- package/dist/diagnostic/sdkDiagnostic.d.ts +0 -23
- package/dist/diagnostic/sdkDiagnostic.js +0 -320
- package/dist/diagnostic/sdkDiagnostic.js.map +0 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { MaybeNode } from '../interface';
|
|
2
2
|
import { ProtonDriveClient } from '../protonDriveClient';
|
|
3
|
+
import { ProtonDrivePhotosClient } from '../protonDrivePhotosClient';
|
|
3
4
|
import { DiagnosticHTTPClient } from './httpClient';
|
|
4
|
-
import { DiagnosticOptions, DiagnosticResult } from './interface';
|
|
5
|
+
import { DiagnosticOptions, DiagnosticProgressCallback, DiagnosticResult } from './interface';
|
|
5
6
|
import { DiagnosticTelemetry } from './telemetry';
|
|
6
7
|
/**
|
|
7
8
|
* Diagnostic tool that produces full diagnostic, including logs and metrics
|
|
@@ -11,9 +12,11 @@ export declare class Diagnostic {
|
|
|
11
12
|
private telemetry;
|
|
12
13
|
private httpClient;
|
|
13
14
|
private protonDriveClient;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
private protonDrivePhotosClient;
|
|
16
|
+
constructor(telemetry: DiagnosticTelemetry, httpClient: DiagnosticHTTPClient, protonDriveClient: ProtonDriveClient, protonDrivePhotosClient: ProtonDrivePhotosClient);
|
|
17
|
+
verifyMyFiles(options?: DiagnosticOptions, onProgress?: DiagnosticProgressCallback): AsyncGenerator<DiagnosticResult>;
|
|
18
|
+
verifyNodeTree(node: MaybeNode, options?: DiagnosticOptions, onProgress?: DiagnosticProgressCallback): AsyncGenerator<DiagnosticResult>;
|
|
19
|
+
verifyPhotosTimeline(options?: DiagnosticOptions, onProgress?: DiagnosticProgressCallback): AsyncGenerator<DiagnosticResult>;
|
|
17
20
|
private yieldEvents;
|
|
18
21
|
private internalGenerator;
|
|
19
22
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Diagnostic = void 0;
|
|
4
|
-
const
|
|
4
|
+
const sdkDiagnosticMain_1 = require("./sdkDiagnosticMain");
|
|
5
|
+
const sdkDiagnosticPhotos_1 = require("./sdkDiagnosticPhotos");
|
|
5
6
|
const zipGenerators_1 = require("./zipGenerators");
|
|
6
7
|
/**
|
|
7
8
|
* Diagnostic tool that produces full diagnostic, including logs and metrics
|
|
@@ -11,21 +12,28 @@ class Diagnostic {
|
|
|
11
12
|
telemetry;
|
|
12
13
|
httpClient;
|
|
13
14
|
protonDriveClient;
|
|
14
|
-
|
|
15
|
+
protonDrivePhotosClient;
|
|
16
|
+
constructor(telemetry, httpClient, protonDriveClient, protonDrivePhotosClient) {
|
|
15
17
|
this.telemetry = telemetry;
|
|
16
18
|
this.httpClient = httpClient;
|
|
17
19
|
this.protonDriveClient = protonDriveClient;
|
|
20
|
+
this.protonDrivePhotosClient = protonDrivePhotosClient;
|
|
18
21
|
this.telemetry = telemetry;
|
|
19
22
|
this.httpClient = httpClient;
|
|
20
23
|
this.protonDriveClient = protonDriveClient;
|
|
24
|
+
this.protonDrivePhotosClient = protonDrivePhotosClient;
|
|
21
25
|
}
|
|
22
|
-
async *verifyMyFiles(options) {
|
|
23
|
-
const diagnostic = new
|
|
24
|
-
yield* this.yieldEvents(diagnostic.verifyMyFiles(options));
|
|
26
|
+
async *verifyMyFiles(options, onProgress) {
|
|
27
|
+
const diagnostic = new sdkDiagnosticMain_1.SDKDiagnosticMain(this.protonDriveClient, options, onProgress);
|
|
28
|
+
yield* this.yieldEvents(diagnostic.verifyMyFiles(options?.expectedStructure));
|
|
25
29
|
}
|
|
26
|
-
async *verifyNodeTree(node, options) {
|
|
27
|
-
const diagnostic = new
|
|
28
|
-
yield* this.yieldEvents(diagnostic.verifyNodeTree(node, options));
|
|
30
|
+
async *verifyNodeTree(node, options, onProgress) {
|
|
31
|
+
const diagnostic = new sdkDiagnosticMain_1.SDKDiagnosticMain(this.protonDriveClient, options, onProgress);
|
|
32
|
+
yield* this.yieldEvents(diagnostic.verifyNodeTree(node, options?.expectedStructure));
|
|
33
|
+
}
|
|
34
|
+
async *verifyPhotosTimeline(options, onProgress) {
|
|
35
|
+
const diagnostic = new sdkDiagnosticPhotos_1.SDKDiagnosticPhotos(this.protonDrivePhotosClient, options, onProgress);
|
|
36
|
+
yield* this.yieldEvents(diagnostic.verifyTimeline(options?.expectedStructure));
|
|
29
37
|
}
|
|
30
38
|
async *yieldEvents(generator) {
|
|
31
39
|
yield* (0, zipGenerators_1.zipGenerators)(generator, this.internalGenerator(), { stopOnFirstDone: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../src/diagnostic/diagnostic.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../src/diagnostic/diagnostic.ts"],"names":[],"mappings":";;;AAKA,2DAAwD;AACxD,+DAA4D;AAE5D,mDAAgD;AAEhD;;;GAGG;AACH,MAAa,UAAU;IAEP;IACA;IACA;IACA;IAJZ,YACY,SAA8B,EAC9B,UAAgC,EAChC,iBAAoC,EACpC,uBAAgD;QAHhD,cAAS,GAAT,SAAS,CAAqB;QAC9B,eAAU,GAAV,UAAU,CAAsB;QAChC,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,4BAAuB,GAAvB,uBAAuB,CAAyB;QAExD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,uBAAuB,GAAG,uBAAuB,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,CAAC,aAAa,CAChB,OAA2B,EAC3B,UAAuC;QAEvC,MAAM,UAAU,GAAG,IAAI,qCAAiB,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACtF,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,CAAC,cAAc,CACjB,IAAe,EACf,OAA2B,EAC3B,UAAuC;QAEvC,MAAM,UAAU,GAAG,IAAI,qCAAiB,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACtF,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,KAAK,CAAC,CAAC,oBAAoB,CACvB,OAA2B,EAC3B,UAAuC;QAEvC,MAAM,UAAU,GAAG,IAAI,yCAAmB,CAAC,IAAI,CAAC,uBAAuB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAC9F,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACnF,CAAC;IAEO,KAAK,CAAC,CAAC,WAAW,CAAC,SAA2C;QAClE,KAAK,CAAC,CAAC,IAAA,6BAAa,EAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;IACzF,CAAC;IAEO,KAAK,CAAC,CAAC,iBAAiB;QAC5B,KAAK,CAAC,CAAC,IAAA,6BAAa,EAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1F,CAAC;CACJ;AA7CD,gCA6CC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ProtonDriveClientContructorParameters } from '../interface';
|
|
2
2
|
import { Diagnostic } from './interface';
|
|
3
|
-
export type { Diagnostic, DiagnosticResult } from './interface';
|
|
3
|
+
export type { Diagnostic, DiagnosticOptions, ExpectedTreeNode, DiagnosticProgressCallback, DiagnosticResult, } from './interface';
|
|
4
4
|
/**
|
|
5
5
|
* Initializes the diagnostic tool. It creates the instance of
|
|
6
6
|
* ProtonDriveClient with the special probes to observe the logs,
|
package/dist/diagnostic/index.js
CHANGED
|
@@ -6,6 +6,7 @@ const protonDriveClient_1 = require("../protonDriveClient");
|
|
|
6
6
|
const diagnostic_1 = require("./diagnostic");
|
|
7
7
|
const httpClient_1 = require("./httpClient");
|
|
8
8
|
const telemetry_1 = require("./telemetry");
|
|
9
|
+
const protonDrivePhotosClient_1 = require("../protonDrivePhotosClient");
|
|
9
10
|
/**
|
|
10
11
|
* Initializes the diagnostic tool. It creates the instance of
|
|
11
12
|
* ProtonDriveClient with the special probes to observe the logs,
|
|
@@ -28,6 +29,13 @@ function initDiagnostic(options) {
|
|
|
28
29
|
// Special telemetry that observes the logs and metrics.
|
|
29
30
|
telemetry,
|
|
30
31
|
});
|
|
31
|
-
|
|
32
|
+
const protonDrivePhotosClient = new protonDrivePhotosClient_1.ProtonDrivePhotosClient({
|
|
33
|
+
...options,
|
|
34
|
+
httpClient,
|
|
35
|
+
entitiesCache: new cache_1.NullCache(),
|
|
36
|
+
cryptoCache: new cache_1.MemoryCache(),
|
|
37
|
+
telemetry,
|
|
38
|
+
});
|
|
39
|
+
return new diagnostic_1.Diagnostic(telemetry, httpClient, protonDriveClient, protonDrivePhotosClient);
|
|
32
40
|
}
|
|
33
41
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/diagnostic/index.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/diagnostic/index.ts"],"names":[],"mappings":";;AAuBA,wCA6BC;AApDD,oCAAkD;AAElD,4DAAyD;AACzD,6CAA6D;AAE7D,6CAAoD;AACpD,2CAAkD;AAClD,wEAAqE;AAUrE;;;;;GAKG;AACH,SAAgB,cAAc,CAC1B,OAAmG;IAEnG,MAAM,UAAU,GAAG,IAAI,iCAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,IAAI,+BAAmB,EAAE,CAAC;IAE5C,MAAM,iBAAiB,GAAG,IAAI,qCAAiB,CAAC;QAC5C,GAAG,OAAO;QACV,UAAU;QACV,6CAA6C;QAC7C,+DAA+D;QAC/D,oDAAoD;QACpD,aAAa,EAAE,IAAI,iBAAS,EAAE;QAC9B,iEAAiE;QACjE,iDAAiD;QACjD,WAAW,EAAE,IAAI,mBAAW,EAAE;QAC9B,wDAAwD;QACxD,SAAS;KACZ,CAAC,CAAC;IAEH,MAAM,uBAAuB,GAAG,IAAI,iDAAuB,CAAC;QACxD,GAAG,OAAO;QACV,UAAU;QACV,aAAa,EAAE,IAAI,iBAAS,EAAE;QAC9B,WAAW,EAAE,IAAI,mBAAW,EAAE;QAC9B,SAAS;KACZ,CAAC,CAAC;IAEH,OAAO,IAAI,uBAAe,CAAC,SAAS,EAAE,UAAU,EAAE,iBAAiB,EAAE,uBAAuB,CAAC,CAAC;AAClG,CAAC"}
|
|
@@ -1,20 +1,33 @@
|
|
|
1
1
|
import { Author, MaybeNode, MetricEvent, NodeType, AnonymousUser } from '../interface';
|
|
2
2
|
import { LogRecord } from '../telemetry';
|
|
3
3
|
export interface Diagnostic {
|
|
4
|
-
verifyMyFiles(options?: DiagnosticOptions): AsyncGenerator<DiagnosticResult>;
|
|
5
|
-
verifyNodeTree(node: MaybeNode, options?: DiagnosticOptions): AsyncGenerator<DiagnosticResult>;
|
|
4
|
+
verifyMyFiles(options?: DiagnosticOptions, onProgress?: DiagnosticProgressCallback): AsyncGenerator<DiagnosticResult>;
|
|
5
|
+
verifyNodeTree(node: MaybeNode, options?: DiagnosticOptions, onProgress?: DiagnosticProgressCallback): AsyncGenerator<DiagnosticResult>;
|
|
6
|
+
verifyPhotosTimeline(options?: DiagnosticOptions, onProgress?: DiagnosticProgressCallback): AsyncGenerator<DiagnosticResult>;
|
|
6
7
|
}
|
|
7
8
|
export type DiagnosticOptions = {
|
|
8
|
-
verifyContent?: boolean;
|
|
9
|
+
verifyContent?: boolean | 'peakOnly';
|
|
9
10
|
verifyThumbnails?: boolean;
|
|
10
|
-
expectedStructure?:
|
|
11
|
+
expectedStructure?: ExpectedTreeNode;
|
|
11
12
|
};
|
|
12
|
-
export type
|
|
13
|
+
export type ExpectedTreeNode = {
|
|
13
14
|
name: string;
|
|
15
|
+
expectedMediaType?: string;
|
|
14
16
|
expectedSha1?: string;
|
|
15
17
|
expectedSizeInBytes?: number;
|
|
16
|
-
|
|
18
|
+
expectedAuthors?: ExpectedAuthor | {
|
|
19
|
+
key?: ExpectedAuthor;
|
|
20
|
+
name?: ExpectedAuthor;
|
|
21
|
+
content?: ExpectedAuthor;
|
|
22
|
+
};
|
|
23
|
+
children?: ExpectedTreeNode[];
|
|
17
24
|
};
|
|
25
|
+
export type ExpectedAuthor = string | 'anonymous';
|
|
26
|
+
export type DiagnosticProgressCallback = (progress: {
|
|
27
|
+
allNodesLoaded: boolean;
|
|
28
|
+
loadedNodes: number;
|
|
29
|
+
checkedNodes: number;
|
|
30
|
+
}) => void;
|
|
18
31
|
export type DiagnosticResult = FatalErrorResult | SdkErrorResult | HttpErrorResult | DegradedNodeResult | UnverifiedAuthorResult | ExtendedAttributesErrorResult | ExtendedAttributesMissingFieldResult | ContentFileMissingRevisionResult | ContentIntegrityErrorResult | ContentDownloadErrorResult | ThumbnailsErrorResult | ExpectedStructureMissingNode | ExpectedStructureUnexpectedNode | ExpectedStructureIntegrityError | LogErrorResult | LogWarningResult | MetricResult;
|
|
19
32
|
export type FatalErrorResult = {
|
|
20
33
|
type: 'fatal_error';
|
|
@@ -79,7 +92,7 @@ export type ThumbnailsErrorResult = {
|
|
|
79
92
|
} & NodeDetails;
|
|
80
93
|
export type ExpectedStructureMissingNode = {
|
|
81
94
|
type: 'expected_structure_missing_node';
|
|
82
|
-
expectedNode:
|
|
95
|
+
expectedNode: ExpectedTreeNode;
|
|
83
96
|
parentNodeUid: string;
|
|
84
97
|
};
|
|
85
98
|
export type ExpectedStructureUnexpectedNode = {
|
|
@@ -87,7 +100,7 @@ export type ExpectedStructureUnexpectedNode = {
|
|
|
87
100
|
} & NodeDetails;
|
|
88
101
|
export type ExpectedStructureIntegrityError = {
|
|
89
102
|
type: 'expected_structure_integrity_error';
|
|
90
|
-
expectedNode:
|
|
103
|
+
expectedNode: ExpectedTreeNode;
|
|
91
104
|
claimedSha1?: string;
|
|
92
105
|
claimedSizeInBytes?: number;
|
|
93
106
|
} & NodeDetails;
|
|
@@ -106,11 +119,13 @@ export type MetricResult = {
|
|
|
106
119
|
export type NodeDetails = {
|
|
107
120
|
safeNodeDetails: {
|
|
108
121
|
nodeUid: string;
|
|
109
|
-
revisionUid
|
|
122
|
+
revisionUid: string | undefined;
|
|
110
123
|
nodeType: NodeType;
|
|
124
|
+
mediaType: string | undefined;
|
|
111
125
|
nodeCreationTime: Date;
|
|
112
126
|
keyAuthor: Author;
|
|
113
127
|
nameAuthor: Author;
|
|
128
|
+
contentAuthor: Author | undefined;
|
|
114
129
|
errors: {
|
|
115
130
|
field: string;
|
|
116
131
|
error: unknown;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { MaybeNode, NodeType, Revision } from '../interface';
|
|
2
|
+
import { NodeDetails, ExpectedTreeNode } from './interface';
|
|
3
|
+
export declare function getNodeDetails(node: MaybeNode): NodeDetails;
|
|
4
|
+
export declare function getNodeUids(node: MaybeNode): {
|
|
5
|
+
nodeUid: string;
|
|
6
|
+
revisionUid: string | undefined;
|
|
7
|
+
};
|
|
8
|
+
export declare function getNodeType(node: MaybeNode): NodeType;
|
|
9
|
+
export declare function getMediaType(node: MaybeNode): string | undefined;
|
|
10
|
+
export declare function getActiveRevision(node: MaybeNode): Revision | undefined;
|
|
11
|
+
export declare function getNodeName(node: MaybeNode): string;
|
|
12
|
+
export declare function getExpectedTreeNodeDetails(expectedNode: ExpectedTreeNode): ExpectedTreeNode;
|
|
13
|
+
export declare function getTreeNodeChildByNodeName(expectedSubtree: ExpectedTreeNode | undefined, nodeName: string): ExpectedTreeNode | undefined;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getNodeDetails = getNodeDetails;
|
|
4
|
+
exports.getNodeUids = getNodeUids;
|
|
5
|
+
exports.getNodeType = getNodeType;
|
|
6
|
+
exports.getMediaType = getMediaType;
|
|
7
|
+
exports.getActiveRevision = getActiveRevision;
|
|
8
|
+
exports.getNodeName = getNodeName;
|
|
9
|
+
exports.getExpectedTreeNodeDetails = getExpectedTreeNodeDetails;
|
|
10
|
+
exports.getTreeNodeChildByNodeName = getTreeNodeChildByNodeName;
|
|
11
|
+
function getNodeDetails(node) {
|
|
12
|
+
const errors = [];
|
|
13
|
+
if (!node.ok) {
|
|
14
|
+
const degradedNode = node.error;
|
|
15
|
+
if (!degradedNode.name.ok) {
|
|
16
|
+
errors.push({
|
|
17
|
+
field: 'name',
|
|
18
|
+
error: degradedNode.name.error,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
if (degradedNode.activeRevision?.ok === false) {
|
|
22
|
+
errors.push({
|
|
23
|
+
field: 'activeRevision',
|
|
24
|
+
error: degradedNode.activeRevision.error,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
for (const error of degradedNode.errors ?? []) {
|
|
28
|
+
if (error instanceof Error) {
|
|
29
|
+
errors.push({
|
|
30
|
+
field: 'error',
|
|
31
|
+
error,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
safeNodeDetails: {
|
|
38
|
+
...getNodeUids(node),
|
|
39
|
+
nodeType: getNodeType(node),
|
|
40
|
+
mediaType: getMediaType(node),
|
|
41
|
+
nodeCreationTime: node.ok ? node.value.creationTime : node.error.creationTime,
|
|
42
|
+
keyAuthor: node.ok ? node.value.keyAuthor : node.error.keyAuthor,
|
|
43
|
+
nameAuthor: node.ok ? node.value.nameAuthor : node.error.nameAuthor,
|
|
44
|
+
contentAuthor: getActiveRevision(node)?.contentAuthor,
|
|
45
|
+
errors,
|
|
46
|
+
},
|
|
47
|
+
sensitiveNodeDetails: node,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function getNodeUids(node) {
|
|
51
|
+
const activeRevision = getActiveRevision(node);
|
|
52
|
+
return {
|
|
53
|
+
nodeUid: node.ok ? node.value.uid : node.error.uid,
|
|
54
|
+
revisionUid: activeRevision?.uid,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function getNodeType(node) {
|
|
58
|
+
return node.ok ? node.value.type : node.error.type;
|
|
59
|
+
}
|
|
60
|
+
function getMediaType(node) {
|
|
61
|
+
return node.ok ? node.value.mediaType : node.error.mediaType;
|
|
62
|
+
}
|
|
63
|
+
function getActiveRevision(node) {
|
|
64
|
+
if (node.ok) {
|
|
65
|
+
return node.value.activeRevision;
|
|
66
|
+
}
|
|
67
|
+
if (node.error.activeRevision?.ok) {
|
|
68
|
+
return node.error.activeRevision.value;
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
function getNodeName(node) {
|
|
73
|
+
if (node.ok) {
|
|
74
|
+
return node.value.name;
|
|
75
|
+
}
|
|
76
|
+
if (node.error.name.ok) {
|
|
77
|
+
return node.error.name.value;
|
|
78
|
+
}
|
|
79
|
+
return 'N/A';
|
|
80
|
+
}
|
|
81
|
+
function getExpectedTreeNodeDetails(expectedNode) {
|
|
82
|
+
return {
|
|
83
|
+
...expectedNode,
|
|
84
|
+
children: undefined,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function getTreeNodeChildByNodeName(expectedSubtree, nodeName) {
|
|
88
|
+
return expectedSubtree?.children?.find((expectedNode) => expectedNode.name === nodeName);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=nodeUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeUtils.js","sourceRoot":"","sources":["../../src/diagnostic/nodeUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { FileDownloader, MaybeNode, NodeOrUid, ThumbnailType, ThumbnailResult } from '../interface';
|
|
2
|
+
import { DiagnosticOptions, DiagnosticResult, ExpectedTreeNode, DiagnosticProgressCallback } from './interface';
|
|
3
|
+
interface SDKClient {
|
|
4
|
+
getFileDownloader(nodeOrUid: NodeOrUid): Promise<FileDownloader>;
|
|
5
|
+
iterateThumbnails(nodeUids: string[], thumbnailType: ThumbnailType): AsyncGenerator<ThumbnailResult>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Base class for all SDK diagnostic tools that verifies the integrity of
|
|
9
|
+
* the individual nodes.
|
|
10
|
+
*/
|
|
11
|
+
export declare class SDKDiagnosticBase {
|
|
12
|
+
private sdkClient;
|
|
13
|
+
private options;
|
|
14
|
+
private onProgress?;
|
|
15
|
+
private progressReportInterval;
|
|
16
|
+
protected nodesQueue: {
|
|
17
|
+
node: MaybeNode;
|
|
18
|
+
expected?: ExpectedTreeNode;
|
|
19
|
+
}[];
|
|
20
|
+
protected allNodesLoaded: boolean;
|
|
21
|
+
protected loadedNodes: number;
|
|
22
|
+
protected checkedNodes: number;
|
|
23
|
+
constructor(sdkClient: SDKClient, options?: Pick<DiagnosticOptions, 'verifyContent' | 'verifyThumbnails'>, onProgress?: DiagnosticProgressCallback);
|
|
24
|
+
protected startProgress(): void;
|
|
25
|
+
protected finishProgress(): void;
|
|
26
|
+
private reportProgress;
|
|
27
|
+
protected verifyExpectedNodeChildren(parentNodeUid: string, children: MaybeNode[], expectedStructure?: ExpectedTreeNode): AsyncGenerator<DiagnosticResult>;
|
|
28
|
+
protected verifyNodesQueue(): AsyncGenerator<DiagnosticResult>;
|
|
29
|
+
private verifyNode;
|
|
30
|
+
private verifyAuthor;
|
|
31
|
+
private verifyFileExtendedAttributes;
|
|
32
|
+
private verifyContentPeak;
|
|
33
|
+
private verifyContent;
|
|
34
|
+
private verifyThumbnails;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SDKDiagnosticBase = void 0;
|
|
4
|
+
const interface_1 = require("../interface");
|
|
5
|
+
const integrityVerificationStream_1 = require("./integrityVerificationStream");
|
|
6
|
+
const nodeUtils_1 = require("./nodeUtils");
|
|
7
|
+
const PROGRESS_REPORT_INTERVAL = 500;
|
|
8
|
+
/**
|
|
9
|
+
* Base class for all SDK diagnostic tools that verifies the integrity of
|
|
10
|
+
* the individual nodes.
|
|
11
|
+
*/
|
|
12
|
+
class SDKDiagnosticBase {
|
|
13
|
+
sdkClient;
|
|
14
|
+
options;
|
|
15
|
+
onProgress;
|
|
16
|
+
progressReportInterval;
|
|
17
|
+
nodesQueue = [];
|
|
18
|
+
allNodesLoaded = false;
|
|
19
|
+
loadedNodes = 0;
|
|
20
|
+
checkedNodes = 0;
|
|
21
|
+
constructor(sdkClient, options, onProgress) {
|
|
22
|
+
this.sdkClient = sdkClient;
|
|
23
|
+
this.sdkClient = sdkClient;
|
|
24
|
+
this.options = options || { verifyContent: false, verifyThumbnails: false };
|
|
25
|
+
this.onProgress = onProgress;
|
|
26
|
+
}
|
|
27
|
+
startProgress() {
|
|
28
|
+
this.allNodesLoaded = false;
|
|
29
|
+
this.loadedNodes = 0;
|
|
30
|
+
this.checkedNodes = 0;
|
|
31
|
+
this.reportProgress();
|
|
32
|
+
this.progressReportInterval = setInterval(() => {
|
|
33
|
+
this.reportProgress();
|
|
34
|
+
}, PROGRESS_REPORT_INTERVAL);
|
|
35
|
+
}
|
|
36
|
+
finishProgress() {
|
|
37
|
+
if (this.progressReportInterval) {
|
|
38
|
+
clearInterval(this.progressReportInterval);
|
|
39
|
+
this.progressReportInterval = undefined;
|
|
40
|
+
}
|
|
41
|
+
this.reportProgress();
|
|
42
|
+
}
|
|
43
|
+
reportProgress() {
|
|
44
|
+
this.onProgress?.({
|
|
45
|
+
allNodesLoaded: this.allNodesLoaded,
|
|
46
|
+
loadedNodes: this.loadedNodes,
|
|
47
|
+
checkedNodes: this.checkedNodes,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
async *verifyExpectedNodeChildren(parentNodeUid, children, expectedStructure) {
|
|
51
|
+
if (!expectedStructure) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const expectedNodes = expectedStructure.children ?? [];
|
|
55
|
+
const actualNodeNames = children.map((child) => (0, nodeUtils_1.getNodeName)(child));
|
|
56
|
+
for (const expectedNode of expectedNodes) {
|
|
57
|
+
if (!actualNodeNames.includes(expectedNode.name)) {
|
|
58
|
+
yield {
|
|
59
|
+
type: 'expected_structure_missing_node',
|
|
60
|
+
expectedNode: (0, nodeUtils_1.getExpectedTreeNodeDetails)(expectedNode),
|
|
61
|
+
parentNodeUid,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
for (const child of children) {
|
|
66
|
+
const childName = (0, nodeUtils_1.getNodeName)(child);
|
|
67
|
+
const isExpected = expectedNodes.some((expectedNode) => expectedNode.name === childName);
|
|
68
|
+
if (!isExpected) {
|
|
69
|
+
yield {
|
|
70
|
+
type: 'expected_structure_unexpected_node',
|
|
71
|
+
...(0, nodeUtils_1.getNodeDetails)(child),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async *verifyNodesQueue() {
|
|
77
|
+
while (this.nodesQueue.length > 0 || !this.allNodesLoaded) {
|
|
78
|
+
const result = this.nodesQueue.shift();
|
|
79
|
+
if (result) {
|
|
80
|
+
yield* this.verifyNode(result.node, result.expected);
|
|
81
|
+
this.checkedNodes++;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Wait for 100ms before checking again.
|
|
85
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async *verifyNode(node, expectedStructure) {
|
|
90
|
+
if (!node.ok) {
|
|
91
|
+
yield {
|
|
92
|
+
type: 'degraded_node',
|
|
93
|
+
...(0, nodeUtils_1.getNodeDetails)(node),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
yield* this.verifyAuthor(node.ok ? node.value.keyAuthor : node.error.keyAuthor, 'key', node, expectedStructure);
|
|
97
|
+
yield* this.verifyAuthor(node.ok ? node.value.nameAuthor : node.error.nameAuthor, 'name', node, expectedStructure);
|
|
98
|
+
const activeRevision = (0, nodeUtils_1.getActiveRevision)(node);
|
|
99
|
+
if (activeRevision) {
|
|
100
|
+
yield* this.verifyAuthor(activeRevision.contentAuthor, 'content', node, expectedStructure);
|
|
101
|
+
}
|
|
102
|
+
yield* this.verifyFileExtendedAttributes(node, expectedStructure);
|
|
103
|
+
if (this.options.verifyContent === 'peakOnly') {
|
|
104
|
+
yield* this.verifyContentPeak(node);
|
|
105
|
+
}
|
|
106
|
+
else if (this.options.verifyContent) {
|
|
107
|
+
yield* this.verifyContent(node);
|
|
108
|
+
}
|
|
109
|
+
if (this.options.verifyThumbnails) {
|
|
110
|
+
yield* this.verifyThumbnails(node);
|
|
111
|
+
}
|
|
112
|
+
if (expectedStructure?.expectedMediaType) {
|
|
113
|
+
const mediaType = (0, nodeUtils_1.getMediaType)(node);
|
|
114
|
+
if (mediaType !== expectedStructure.expectedMediaType) {
|
|
115
|
+
yield {
|
|
116
|
+
type: 'expected_structure_integrity_error',
|
|
117
|
+
expectedNode: (0, nodeUtils_1.getExpectedTreeNodeDetails)(expectedStructure),
|
|
118
|
+
...(0, nodeUtils_1.getNodeDetails)(node),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async *verifyAuthor(author, authorType, node, expectedStructure) {
|
|
124
|
+
if (!author.ok) {
|
|
125
|
+
yield {
|
|
126
|
+
type: 'unverified_author',
|
|
127
|
+
authorType,
|
|
128
|
+
claimedAuthor: author.error.claimedAuthor,
|
|
129
|
+
error: author.error.error,
|
|
130
|
+
...(0, nodeUtils_1.getNodeDetails)(node),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (expectedStructure?.expectedAuthors) {
|
|
134
|
+
let expectedEmail = typeof expectedStructure.expectedAuthors === 'string'
|
|
135
|
+
? expectedStructure.expectedAuthors
|
|
136
|
+
: expectedStructure.expectedAuthors[authorType];
|
|
137
|
+
if (expectedEmail === 'anonymous') {
|
|
138
|
+
expectedEmail = null;
|
|
139
|
+
}
|
|
140
|
+
const email = author.ok ? author.value : author.error.claimedAuthor;
|
|
141
|
+
if (expectedEmail !== undefined && email !== expectedEmail) {
|
|
142
|
+
yield {
|
|
143
|
+
type: 'expected_structure_integrity_error',
|
|
144
|
+
expectedNode: (0, nodeUtils_1.getExpectedTreeNodeDetails)(expectedStructure),
|
|
145
|
+
...(0, nodeUtils_1.getNodeDetails)(node),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async *verifyFileExtendedAttributes(node, expectedStructure) {
|
|
151
|
+
const activeRevision = (0, nodeUtils_1.getActiveRevision)(node);
|
|
152
|
+
const expectedAttributes = (0, nodeUtils_1.getNodeType)(node) === interface_1.NodeType.File;
|
|
153
|
+
const claimedSha1 = activeRevision?.claimedDigests?.sha1;
|
|
154
|
+
const claimedSizeInBytes = activeRevision?.claimedSize;
|
|
155
|
+
if (claimedSha1 && !/^[0-9a-f]{40}$/i.test(claimedSha1)) {
|
|
156
|
+
yield {
|
|
157
|
+
type: 'extended_attributes_error',
|
|
158
|
+
field: 'sha1',
|
|
159
|
+
value: claimedSha1,
|
|
160
|
+
...(0, nodeUtils_1.getNodeDetails)(node),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
if (expectedAttributes && !claimedSha1) {
|
|
164
|
+
yield {
|
|
165
|
+
type: 'extended_attributes_missing_field',
|
|
166
|
+
missingField: 'sha1',
|
|
167
|
+
...(0, nodeUtils_1.getNodeDetails)(node),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
if (expectedStructure) {
|
|
171
|
+
const expectedSha1 = expectedStructure.expectedSha1;
|
|
172
|
+
const expectedSizeInBytes = expectedStructure.expectedSizeInBytes;
|
|
173
|
+
const wrongSha1 = expectedSha1 !== undefined && claimedSha1 !== expectedSha1;
|
|
174
|
+
const wrongSizeInBytes = expectedSizeInBytes !== undefined && claimedSizeInBytes !== expectedSizeInBytes;
|
|
175
|
+
if (wrongSha1 || wrongSizeInBytes) {
|
|
176
|
+
yield {
|
|
177
|
+
type: 'expected_structure_integrity_error',
|
|
178
|
+
claimedSha1,
|
|
179
|
+
claimedSizeInBytes,
|
|
180
|
+
expectedNode: (0, nodeUtils_1.getExpectedTreeNodeDetails)(expectedStructure),
|
|
181
|
+
...(0, nodeUtils_1.getNodeDetails)(node),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async *verifyContentPeak(node) {
|
|
187
|
+
if ((0, nodeUtils_1.getNodeType)(node) !== interface_1.NodeType.File) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
let downloader;
|
|
191
|
+
try {
|
|
192
|
+
downloader = await this.sdkClient.getFileDownloader(node);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
yield {
|
|
196
|
+
type: 'sdk_error',
|
|
197
|
+
call: `getFileDownloader(${node.ok ? node.value.uid : node.error.uid})`,
|
|
198
|
+
error,
|
|
199
|
+
};
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
const stream = downloader.getSeekableStream();
|
|
204
|
+
const peak = await stream.read(1024);
|
|
205
|
+
if (peak.value.length === 0) {
|
|
206
|
+
yield {
|
|
207
|
+
type: 'content_download_error',
|
|
208
|
+
error: new Error('No data read'),
|
|
209
|
+
...(0, nodeUtils_1.getNodeDetails)(node),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
yield {
|
|
215
|
+
type: 'content_download_error',
|
|
216
|
+
error,
|
|
217
|
+
...(0, nodeUtils_1.getNodeDetails)(node),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async *verifyContent(node) {
|
|
222
|
+
if ((0, nodeUtils_1.getNodeType)(node) !== interface_1.NodeType.File) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const activeRevision = (0, nodeUtils_1.getActiveRevision)(node);
|
|
226
|
+
if (!activeRevision) {
|
|
227
|
+
yield {
|
|
228
|
+
type: 'content_file_missing_revision',
|
|
229
|
+
...(0, nodeUtils_1.getNodeDetails)(node),
|
|
230
|
+
};
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
let downloader;
|
|
234
|
+
try {
|
|
235
|
+
downloader = await this.sdkClient.getFileDownloader(node);
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
yield {
|
|
239
|
+
type: 'sdk_error',
|
|
240
|
+
call: `getFileDownloader(${node.ok ? node.value.uid : node.error.uid})`,
|
|
241
|
+
error,
|
|
242
|
+
};
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
const claimedSha1 = activeRevision.claimedDigests?.sha1;
|
|
246
|
+
const claimedSizeInBytes = downloader.getClaimedSizeInBytes();
|
|
247
|
+
const integrityVerificationStream = new integrityVerificationStream_1.IntegrityVerificationStream();
|
|
248
|
+
const controller = downloader.downloadToStream(integrityVerificationStream);
|
|
249
|
+
try {
|
|
250
|
+
await controller.completion();
|
|
251
|
+
const computedSha1 = integrityVerificationStream.computedSha1;
|
|
252
|
+
const computedSizeInBytes = integrityVerificationStream.computedSizeInBytes;
|
|
253
|
+
if (claimedSha1 !== computedSha1 || claimedSizeInBytes !== computedSizeInBytes) {
|
|
254
|
+
yield {
|
|
255
|
+
type: 'content_integrity_error',
|
|
256
|
+
claimedSha1,
|
|
257
|
+
computedSha1,
|
|
258
|
+
claimedSizeInBytes,
|
|
259
|
+
computedSizeInBytes,
|
|
260
|
+
...(0, nodeUtils_1.getNodeDetails)(node),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
yield {
|
|
266
|
+
type: 'content_download_error',
|
|
267
|
+
error,
|
|
268
|
+
...(0, nodeUtils_1.getNodeDetails)(node),
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
async *verifyThumbnails(node) {
|
|
273
|
+
if ((0, nodeUtils_1.getNodeType)(node) !== interface_1.NodeType.File) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const nodeUid = node.ok ? node.value.uid : node.error.uid;
|
|
277
|
+
try {
|
|
278
|
+
const result = await Array.fromAsync(this.sdkClient.iterateThumbnails([nodeUid], interface_1.ThumbnailType.Type1));
|
|
279
|
+
if (result.length === 0) {
|
|
280
|
+
yield {
|
|
281
|
+
type: 'sdk_error',
|
|
282
|
+
call: `iterateThumbnails(${nodeUid})`,
|
|
283
|
+
error: new Error('No thumbnails found'),
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
// TODO: We should have better way to check if the thumbnail is not expected.
|
|
287
|
+
if (!result[0].ok && result[0].error !== 'Node has no thumbnail') {
|
|
288
|
+
yield {
|
|
289
|
+
type: 'thumbnails_error',
|
|
290
|
+
error: result[0].error,
|
|
291
|
+
...(0, nodeUtils_1.getNodeDetails)(node),
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
yield {
|
|
297
|
+
type: 'sdk_error',
|
|
298
|
+
call: `iterateThumbnails(${nodeUid})`,
|
|
299
|
+
error,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
exports.SDKDiagnosticBase = SDKDiagnosticBase;
|
|
305
|
+
//# sourceMappingURL=sdkDiagnosticBase.js.map
|