@protontech/drive-sdk 0.14.1 → 0.14.3
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/internal/batchLoading.d.ts +2 -0
- package/dist/internal/batchLoading.js +18 -5
- package/dist/internal/batchLoading.js.map +1 -1
- package/dist/internal/batchLoading.test.js +92 -0
- package/dist/internal/batchLoading.test.js.map +1 -1
- package/dist/internal/download/apiService.js +27 -23
- package/dist/internal/download/apiService.js.map +1 -1
- package/dist/internal/events/apiService.js +3 -1
- package/dist/internal/events/apiService.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.js +1 -1
- package/dist/internal/nodes/nodesAccess.js.map +1 -1
- package/dist/internal/nodes/nodesAccess.test.js +3 -2
- package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
- package/dist/internal/photos/index.js +3 -1
- package/dist/internal/photos/index.js.map +1 -1
- package/dist/internal/photos/upload.d.ts +1 -1
- package/dist/internal/photos/upload.js +2 -2
- package/dist/internal/photos/upload.js.map +1 -1
- package/dist/internal/sharing/events.d.ts +4 -2
- package/dist/internal/sharing/events.js +40 -9
- package/dist/internal/sharing/events.js.map +1 -1
- package/dist/internal/sharing/events.test.js +30 -2
- package/dist/internal/sharing/events.test.js.map +1 -1
- package/dist/internal/sharing/index.js +1 -1
- package/dist/internal/sharing/index.js.map +1 -1
- package/dist/internal/upload/fileUploader.d.ts +19 -3
- package/dist/internal/upload/fileUploader.js +31 -5
- package/dist/internal/upload/fileUploader.js.map +1 -1
- package/dist/internal/upload/fileUploader.test.js +1 -1
- package/dist/internal/upload/fileUploader.test.js.map +1 -1
- package/dist/internal/upload/index.js +4 -11
- package/dist/internal/upload/index.js.map +1 -1
- package/dist/internal/upload/index.test.js +104 -45
- package/dist/internal/upload/index.test.js.map +1 -1
- package/dist/internal/upload/smallFileUploader.d.ts +14 -14
- package/dist/internal/upload/smallFileUploader.js +38 -20
- package/dist/internal/upload/smallFileUploader.js.map +1 -1
- package/dist/internal/upload/smallFileUploader.test.js +35 -36
- package/dist/internal/upload/smallFileUploader.test.js.map +1 -1
- package/package.json +1 -1
- package/src/internal/batchLoading.test.ts +104 -0
- package/src/internal/batchLoading.ts +21 -5
- package/src/internal/download/apiService.ts +32 -28
- package/src/internal/events/apiService.ts +3 -1
- package/src/internal/nodes/nodesAccess.test.ts +4 -3
- package/src/internal/nodes/nodesAccess.ts +1 -1
- package/src/internal/photos/index.ts +2 -0
- package/src/internal/photos/upload.ts +13 -1
- package/src/internal/sharing/events.test.ts +35 -2
- package/src/internal/sharing/events.ts +47 -10
- package/src/internal/sharing/index.ts +1 -0
- package/src/internal/upload/fileUploader.test.ts +1 -0
- package/src/internal/upload/fileUploader.ts +60 -2
- package/src/internal/upload/index.test.ts +121 -63
- package/src/internal/upload/index.ts +4 -30
- package/src/internal/upload/smallFileUploader.test.ts +33 -40
- package/src/internal/upload/smallFileUploader.ts +47 -36
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const interface_1 = require("../../interface");
|
|
3
4
|
const telemetry_1 = require("../../tests/telemetry");
|
|
4
5
|
const fileUploader_1 = require("./fileUploader");
|
|
5
6
|
const index_1 = require("./index");
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
describe('initUploadModule - uploader selection', () => {
|
|
7
|
+
const RAW_SMALL_FILE_SIZE_LIMIT = (128 * 1024) / 1.1; // 128 KiB, must match index.ts
|
|
8
|
+
describe('initUploadModule', () => {
|
|
9
9
|
const parentFolderUid = 'parent-folder-uid';
|
|
10
10
|
const name = 'test-file.txt';
|
|
11
11
|
const nodeUid = 'node-uid';
|
|
12
12
|
let featureFlagProvider;
|
|
13
13
|
let uploadModule;
|
|
14
|
+
let initSmallFileSpy;
|
|
15
|
+
let initSmallRevisionSpy;
|
|
16
|
+
let initStreamSpy;
|
|
17
|
+
let stream;
|
|
18
|
+
const thumbnail100k = { type: interface_1.ThumbnailType.Type1, thumbnail: new Uint8Array(100_000) };
|
|
14
19
|
beforeEach(() => {
|
|
15
20
|
const apiService = {};
|
|
16
21
|
const driveCrypto = {};
|
|
@@ -20,52 +25,106 @@ describe('initUploadModule - uploader selection', () => {
|
|
|
20
25
|
isEnabled: jest.fn().mockResolvedValue(true),
|
|
21
26
|
};
|
|
22
27
|
uploadModule = (0, index_1.initUploadModule)((0, telemetry_1.getMockTelemetry)(), apiService, driveCrypto, sharesService, nodesService, featureFlagProvider);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
featureFlagProvider.isEnabled.mockResolvedValue(true);
|
|
27
|
-
const metadata = { expectedSize: 1, mediaType: 'text/plain' };
|
|
28
|
-
const uploader = await uploadModule.getFileUploader(parentFolderUid, name, metadata);
|
|
29
|
-
expect(uploader).toBeInstanceOf(smallFileUploader_1.SmallFileUploader);
|
|
30
|
-
});
|
|
31
|
-
it('returns FileUploader when feature flag is enabled but file size exceeds limit', async () => {
|
|
32
|
-
featureFlagProvider.isEnabled.mockResolvedValue(true);
|
|
33
|
-
const metadata = {
|
|
34
|
-
expectedSize: SMALL_FILE_SIZE_LIMIT,
|
|
35
|
-
mediaType: 'text/plain',
|
|
36
|
-
};
|
|
37
|
-
const uploader = await uploadModule.getFileUploader(parentFolderUid, name, metadata);
|
|
38
|
-
expect(uploader).toBeInstanceOf(fileUploader_1.FileUploader);
|
|
39
|
-
});
|
|
40
|
-
it('returns FileUploader when feature flag is disabled even for small file', async () => {
|
|
41
|
-
featureFlagProvider.isEnabled.mockResolvedValue(false);
|
|
42
|
-
const metadata = { expectedSize: 1, mediaType: 'text/plain' };
|
|
43
|
-
const uploader = await uploadModule.getFileUploader(parentFolderUid, name, metadata);
|
|
44
|
-
expect(uploader).toBeInstanceOf(fileUploader_1.FileUploader);
|
|
28
|
+
initSmallFileSpy = jest.spyOn(fileUploader_1.FileUploader.prototype, 'initSmallFileUploader').mockResolvedValue({
|
|
29
|
+
nodeRevisionUid: 'revision-uid',
|
|
30
|
+
nodeUid: 'node-uid',
|
|
45
31
|
});
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const uploader = await uploadModule.getFileRevisionUploader(nodeUid, metadata);
|
|
52
|
-
expect(uploader).toBeInstanceOf(smallFileUploader_1.SmallFileRevisionUploader);
|
|
32
|
+
initSmallRevisionSpy = jest
|
|
33
|
+
.spyOn(fileUploader_1.FileRevisionUploader.prototype, 'initSmallFileUploader')
|
|
34
|
+
.mockResolvedValue({
|
|
35
|
+
nodeRevisionUid: 'revision-uid',
|
|
36
|
+
nodeUid: 'node-uid',
|
|
53
37
|
});
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
};
|
|
60
|
-
const uploader = await uploadModule.getFileRevisionUploader(nodeUid, metadata);
|
|
61
|
-
expect(uploader).toBeInstanceOf(fileUploader_1.FileRevisionUploader);
|
|
38
|
+
initStreamSpy = jest.spyOn(fileUploader_1.Uploader.prototype, 'initStreamUploader').mockResolvedValue({
|
|
39
|
+
start: jest.fn().mockResolvedValue({
|
|
40
|
+
nodeRevisionUid: 'revision-uid',
|
|
41
|
+
nodeUid: 'node-uid',
|
|
42
|
+
}),
|
|
62
43
|
});
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
expect(uploader).toBeInstanceOf(fileUploader_1.FileRevisionUploader);
|
|
44
|
+
stream = new ReadableStream({
|
|
45
|
+
start(controller) {
|
|
46
|
+
controller.close();
|
|
47
|
+
},
|
|
68
48
|
});
|
|
69
49
|
});
|
|
50
|
+
afterEach(() => {
|
|
51
|
+
jest.restoreAllMocks();
|
|
52
|
+
});
|
|
53
|
+
async function drainUpload(controller) {
|
|
54
|
+
await controller.completion();
|
|
55
|
+
}
|
|
56
|
+
const suites = [
|
|
57
|
+
{
|
|
58
|
+
method: 'getFileUploader',
|
|
59
|
+
getUploader: (metadata) => uploadModule.getFileUploader(parentFolderUid, name, metadata),
|
|
60
|
+
expect: (option) => {
|
|
61
|
+
if (option === 'stream') {
|
|
62
|
+
expect(initStreamSpy).toHaveBeenCalled();
|
|
63
|
+
expect(initSmallFileSpy).not.toHaveBeenCalled();
|
|
64
|
+
expect(initSmallRevisionSpy).not.toHaveBeenCalled();
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
expect(initSmallFileSpy).toHaveBeenCalled();
|
|
68
|
+
expect(initStreamSpy).not.toHaveBeenCalled();
|
|
69
|
+
expect(initSmallRevisionSpy).not.toHaveBeenCalled();
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
method: 'getFileRevisionUploader',
|
|
75
|
+
getUploader: (metadata) => uploadModule.getFileRevisionUploader(nodeUid, metadata),
|
|
76
|
+
expect: (option) => {
|
|
77
|
+
if (option === 'stream') {
|
|
78
|
+
expect(initStreamSpy).toHaveBeenCalled();
|
|
79
|
+
expect(initSmallFileSpy).not.toHaveBeenCalled();
|
|
80
|
+
expect(initSmallRevisionSpy).not.toHaveBeenCalled();
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
expect(initSmallRevisionSpy).toHaveBeenCalled();
|
|
84
|
+
expect(initSmallFileSpy).not.toHaveBeenCalled();
|
|
85
|
+
expect(initStreamSpy).not.toHaveBeenCalled();
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
for (const suite of suites) {
|
|
91
|
+
describe(suite.method, () => {
|
|
92
|
+
it('uses stream path when feature flag is disabled even for small file', async () => {
|
|
93
|
+
featureFlagProvider.isEnabled.mockResolvedValue(false);
|
|
94
|
+
const metadata = { expectedSize: 1, mediaType: 'text/plain' };
|
|
95
|
+
const uploader = await suite.getUploader(metadata);
|
|
96
|
+
await drainUpload(await uploader.uploadFromStream(stream, []));
|
|
97
|
+
suite.expect('stream');
|
|
98
|
+
});
|
|
99
|
+
it('uses small-file path when flag is on and encrypted total size is below cap', async () => {
|
|
100
|
+
featureFlagProvider.isEnabled.mockResolvedValue(true);
|
|
101
|
+
const metadata = { expectedSize: 100, mediaType: 'text/plain' };
|
|
102
|
+
const uploader = await suite.getUploader(metadata);
|
|
103
|
+
await drainUpload(await uploader.uploadFromStream(stream, []));
|
|
104
|
+
suite.expect('small');
|
|
105
|
+
});
|
|
106
|
+
it('uses small-file path when flag is on and encrypted total size with thumbnails is below cap', async () => {
|
|
107
|
+
featureFlagProvider.isEnabled.mockResolvedValue(true);
|
|
108
|
+
const metadata = { expectedSize: 100, mediaType: 'image/jpeg' };
|
|
109
|
+
const uploader = await suite.getUploader(metadata);
|
|
110
|
+
await drainUpload(await uploader.uploadFromStream(stream, [thumbnail100k]));
|
|
111
|
+
suite.expect('small');
|
|
112
|
+
});
|
|
113
|
+
it('uses stream path when feature flag is enabled but raw file size exceeds limit', async () => {
|
|
114
|
+
featureFlagProvider.isEnabled.mockResolvedValue(true);
|
|
115
|
+
const metadata = { expectedSize: RAW_SMALL_FILE_SIZE_LIMIT, mediaType: 'text/plain' };
|
|
116
|
+
const uploader = await suite.getUploader(metadata);
|
|
117
|
+
await drainUpload(await uploader.uploadFromStream(stream, []));
|
|
118
|
+
suite.expect('stream');
|
|
119
|
+
});
|
|
120
|
+
it('uses stream path when thumbnail bytes push encrypted total size with thumbnail exceeds limit', async () => {
|
|
121
|
+
featureFlagProvider.isEnabled.mockResolvedValue(true);
|
|
122
|
+
const metadata = { expectedSize: 100_000, mediaType: 'image/jpeg' };
|
|
123
|
+
const uploader = await suite.getUploader(metadata);
|
|
124
|
+
await drainUpload(await uploader.uploadFromStream(stream, [thumbnail100k]));
|
|
125
|
+
suite.expect('stream');
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
}
|
|
70
129
|
});
|
|
71
130
|
//# sourceMappingURL=index.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/internal/upload/index.test.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/internal/upload/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { PrivateKey, SessionKey } from '../../crypto';
|
|
2
2
|
import { Logger, Thumbnail, ThumbnailType, UploadMetadata } from '../../interface';
|
|
3
|
-
import { UploadAPIService } from './apiService';
|
|
4
|
-
import { BlockVerifier } from './blockVerifier';
|
|
5
3
|
import { UploadCryptoService } from './cryptoService';
|
|
6
|
-
import {
|
|
7
|
-
import { NodeRevisionDraft, NodeCrypto } from './interface';
|
|
4
|
+
import { NodeCrypto } from './interface';
|
|
8
5
|
import { UploadManager } from './manager';
|
|
9
6
|
import { UploadTelemetry } from './telemetry';
|
|
10
7
|
export type NodeKeys = {
|
|
@@ -17,15 +14,17 @@ export type NodeKeys = {
|
|
|
17
14
|
* Base uploader for small file and small revision uploads.
|
|
18
15
|
* Shares the single-request flow: read content, get node crypto, encrypt, then call API.
|
|
19
16
|
*/
|
|
20
|
-
declare abstract class SmallUploader
|
|
17
|
+
declare abstract class SmallUploader {
|
|
18
|
+
protected telemetry: UploadTelemetry;
|
|
19
|
+
protected cryptoService: UploadCryptoService;
|
|
20
|
+
protected manager: UploadManager;
|
|
21
|
+
protected metadata: UploadMetadata;
|
|
22
|
+
protected onFinish: () => void;
|
|
23
|
+
protected signal: AbortSignal | undefined;
|
|
21
24
|
protected logger: Logger;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
blockVerifier: BlockVerifier;
|
|
26
|
-
}>;
|
|
27
|
-
protected deleteRevisionDraft(revisionDraft: NodeRevisionDraft): Promise<void>;
|
|
28
|
-
protected startUpload(stream: ReadableStream, thumbnails: Thumbnail[], onProgress?: (uploadedBytes: number) => void): Promise<{
|
|
25
|
+
protected abortController: AbortController;
|
|
26
|
+
constructor(telemetry: UploadTelemetry, cryptoService: UploadCryptoService, manager: UploadManager, metadata: UploadMetadata, onFinish: () => void, signal: AbortSignal | undefined);
|
|
27
|
+
upload(stream: ReadableStream, thumbnails: Thumbnail[], onProgress?: (uploadedBytes: number) => void): Promise<{
|
|
29
28
|
nodeRevisionUid: string;
|
|
30
29
|
nodeUid: string;
|
|
31
30
|
}>;
|
|
@@ -52,6 +51,7 @@ declare abstract class SmallUploader extends Uploader {
|
|
|
52
51
|
private readStreamContent;
|
|
53
52
|
private encryptThumbnails;
|
|
54
53
|
private encryptContentBlock;
|
|
54
|
+
private getManifest;
|
|
55
55
|
private encryptCommitPayload;
|
|
56
56
|
}
|
|
57
57
|
/**
|
|
@@ -60,7 +60,7 @@ declare abstract class SmallUploader extends Uploader {
|
|
|
60
60
|
export declare class SmallFileUploader extends SmallUploader {
|
|
61
61
|
private parentFolderUid;
|
|
62
62
|
private name;
|
|
63
|
-
constructor(telemetry: UploadTelemetry,
|
|
63
|
+
constructor(telemetry: UploadTelemetry, cryptoService: UploadCryptoService, manager: UploadManager, metadata: UploadMetadata, onFinish: () => void, signal: AbortSignal | undefined, parentFolderUid: string, name: string);
|
|
64
64
|
protected getTelemetryContextUid(): string;
|
|
65
65
|
protected handleUpload(stream: ReadableStream, thumbnails: Thumbnail[]): Promise<{
|
|
66
66
|
nodeUid: string;
|
|
@@ -73,7 +73,7 @@ export declare class SmallFileUploader extends SmallUploader {
|
|
|
73
73
|
*/
|
|
74
74
|
export declare class SmallFileRevisionUploader extends SmallUploader {
|
|
75
75
|
private nodeUid;
|
|
76
|
-
constructor(telemetry: UploadTelemetry,
|
|
76
|
+
constructor(telemetry: UploadTelemetry, cryptoService: UploadCryptoService, manager: UploadManager, metadata: UploadMetadata, onFinish: () => void, signal: AbortSignal | undefined, nodeUid: string);
|
|
77
77
|
protected getTelemetryContextUid(): string;
|
|
78
78
|
protected handleUpload(stream: ReadableStream, thumbnails: Thumbnail[]): Promise<{
|
|
79
79
|
nodeUid: string;
|
|
@@ -4,29 +4,35 @@ exports.SmallFileRevisionUploader = exports.SmallFileUploader = void 0;
|
|
|
4
4
|
const errors_1 = require("../../errors");
|
|
5
5
|
const errors_2 = require("../errors");
|
|
6
6
|
const nodes_1 = require("../nodes");
|
|
7
|
+
const utils_1 = require("../utils");
|
|
7
8
|
const blockVerifier_1 = require("./blockVerifier");
|
|
8
9
|
const digests_1 = require("./digests");
|
|
9
|
-
const fileUploader_1 = require("./fileUploader");
|
|
10
10
|
const streamReader_1 = require("./streamReader");
|
|
11
11
|
const streamUploader_1 = require("./streamUploader");
|
|
12
12
|
/**
|
|
13
13
|
* Base uploader for small file and small revision uploads.
|
|
14
14
|
* Shares the single-request flow: read content, get node crypto, encrypt, then call API.
|
|
15
15
|
*/
|
|
16
|
-
class SmallUploader
|
|
16
|
+
class SmallUploader {
|
|
17
|
+
telemetry;
|
|
18
|
+
cryptoService;
|
|
19
|
+
manager;
|
|
20
|
+
metadata;
|
|
21
|
+
onFinish;
|
|
22
|
+
signal;
|
|
17
23
|
logger;
|
|
18
|
-
|
|
19
|
-
|
|
24
|
+
abortController;
|
|
25
|
+
constructor(telemetry, cryptoService, manager, metadata, onFinish, signal) {
|
|
26
|
+
this.telemetry = telemetry;
|
|
27
|
+
this.cryptoService = cryptoService;
|
|
28
|
+
this.manager = manager;
|
|
29
|
+
this.metadata = metadata;
|
|
30
|
+
this.onFinish = onFinish;
|
|
31
|
+
this.signal = signal;
|
|
20
32
|
this.logger = telemetry.getLoggerForSmallUpload();
|
|
33
|
+
this.abortController = new AbortController();
|
|
21
34
|
}
|
|
22
|
-
async
|
|
23
|
-
throw new Error('Small upload does not use revision draft');
|
|
24
|
-
}
|
|
25
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
26
|
-
async deleteRevisionDraft(revisionDraft) {
|
|
27
|
-
throw new Error('Small upload does not use revision draft');
|
|
28
|
-
}
|
|
29
|
-
async startUpload(stream, thumbnails, onProgress) {
|
|
35
|
+
async upload(stream, thumbnails, onProgress) {
|
|
30
36
|
try {
|
|
31
37
|
const result = await this.handleUpload(stream, thumbnails);
|
|
32
38
|
onProgress?.(this.metadata.expectedSize);
|
|
@@ -47,7 +53,8 @@ class SmallUploader extends fileUploader_1.Uploader {
|
|
|
47
53
|
this.encryptThumbnails(nodeKeys, thumbnails),
|
|
48
54
|
this.encryptContentBlock(nodeKeys, content.data),
|
|
49
55
|
]);
|
|
50
|
-
const
|
|
56
|
+
const manifest = await this.getManifest(encryptedBlock, encryptedThumbnails);
|
|
57
|
+
const commitPayload = await this.encryptCommitPayload(nodeKeys, content.sha1, manifest);
|
|
51
58
|
return {
|
|
52
59
|
commitPayload,
|
|
53
60
|
encryptedBlock,
|
|
@@ -81,7 +88,11 @@ class SmallUploader extends fileUploader_1.Uploader {
|
|
|
81
88
|
for (const thumbnail of thumbnails) {
|
|
82
89
|
this.logger.debug(`Encrypting thumbnail ${thumbnail.type}`);
|
|
83
90
|
const enc = await this.cryptoService.encryptThumbnail(nodeKeys, thumbnail);
|
|
84
|
-
result.push({
|
|
91
|
+
result.push({
|
|
92
|
+
type: thumbnail.type,
|
|
93
|
+
encryptedData: enc.encryptedData,
|
|
94
|
+
blockHash: await enc.hashPromise,
|
|
95
|
+
});
|
|
85
96
|
}
|
|
86
97
|
return result;
|
|
87
98
|
}
|
|
@@ -128,9 +139,16 @@ class SmallUploader extends fileUploader_1.Uploader {
|
|
|
128
139
|
blockHash,
|
|
129
140
|
};
|
|
130
141
|
}
|
|
131
|
-
async
|
|
142
|
+
async getManifest(encryptedBlock, encryptedThumbnails) {
|
|
143
|
+
encryptedThumbnails.sort((a, b) => a.type - b.type);
|
|
144
|
+
const hashes = [
|
|
145
|
+
...(await Promise.all(encryptedThumbnails.map(({ blockHash }) => blockHash))),
|
|
146
|
+
...(encryptedBlock ? [encryptedBlock.blockHash] : []),
|
|
147
|
+
];
|
|
148
|
+
return (0, utils_1.mergeUint8Arrays)(hashes);
|
|
149
|
+
}
|
|
150
|
+
async encryptCommitPayload(nodeKeys, contentSha1, manifest) {
|
|
132
151
|
this.logger.debug(`Preparing commit payload`);
|
|
133
|
-
const manifest = encryptedBlock ? encryptedBlock.blockHash : new Uint8Array(0);
|
|
134
152
|
const extendedAttributes = (0, nodes_1.generateFileExtendedAttributes)({
|
|
135
153
|
modificationTime: this.metadata.modificationTime,
|
|
136
154
|
size: this.metadata.expectedSize,
|
|
@@ -150,8 +168,8 @@ class SmallUploader extends fileUploader_1.Uploader {
|
|
|
150
168
|
class SmallFileUploader extends SmallUploader {
|
|
151
169
|
parentFolderUid;
|
|
152
170
|
name;
|
|
153
|
-
constructor(telemetry,
|
|
154
|
-
super(telemetry,
|
|
171
|
+
constructor(telemetry, cryptoService, manager, metadata, onFinish, signal, parentFolderUid, name) {
|
|
172
|
+
super(telemetry, cryptoService, manager, metadata, onFinish, signal);
|
|
155
173
|
this.parentFolderUid = parentFolderUid;
|
|
156
174
|
this.name = name;
|
|
157
175
|
this.parentFolderUid = parentFolderUid;
|
|
@@ -179,8 +197,8 @@ exports.SmallFileUploader = SmallFileUploader;
|
|
|
179
197
|
*/
|
|
180
198
|
class SmallFileRevisionUploader extends SmallUploader {
|
|
181
199
|
nodeUid;
|
|
182
|
-
constructor(telemetry,
|
|
183
|
-
super(telemetry,
|
|
200
|
+
constructor(telemetry, cryptoService, manager, metadata, onFinish, signal, nodeUid) {
|
|
201
|
+
super(telemetry, cryptoService, manager, metadata, onFinish, signal);
|
|
184
202
|
this.nodeUid = nodeUid;
|
|
185
203
|
this.nodeUid = nodeUid;
|
|
186
204
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smallFileUploader.js","sourceRoot":"","sources":["../../../src/internal/upload/smallFileUploader.ts"],"names":[],"mappings":";;;AACA,yCAA0D;AAE1D,sCAA4C;AAC5C,oCAA0D;
|
|
1
|
+
{"version":3,"file":"smallFileUploader.js","sourceRoot":"","sources":["../../../src/internal/upload/smallFileUploader.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const errors_1 = require("../../errors");
|
|
4
4
|
const interface_1 = require("../../interface");
|
|
5
5
|
const smallFileUploader_1 = require("./smallFileUploader");
|
|
6
|
-
const
|
|
7
|
-
const
|
|
6
|
+
const utils_1 = require("../utils");
|
|
7
|
+
const MOCK_BLOCK_HASH = new Uint8Array(32).fill(4);
|
|
8
|
+
const MOCK_VERIFICATION_TOKEN = new Uint8Array(16).fill(5);
|
|
8
9
|
function createStream(bytes) {
|
|
9
10
|
return new ReadableStream({
|
|
10
11
|
start(controller) {
|
|
@@ -91,7 +92,7 @@ describe('SmallFileUploader', () => {
|
|
|
91
92
|
encryptedData: new Uint8Array(thumbnail.thumbnail),
|
|
92
93
|
originalSize: thumbnail.thumbnail.length,
|
|
93
94
|
encryptedSize: thumbnail.thumbnail.length + 100,
|
|
94
|
-
|
|
95
|
+
hashPromise: Promise.resolve(new Uint8Array(32).fill(thumbnail.type)),
|
|
95
96
|
})),
|
|
96
97
|
encryptBlock: jest.fn().mockImplementation(mockEncryptBlock),
|
|
97
98
|
verifyBlock: jest.fn().mockResolvedValue({ verificationToken: MOCK_VERIFICATION_TOKEN }),
|
|
@@ -115,7 +116,7 @@ describe('SmallFileUploader', () => {
|
|
|
115
116
|
abortController = new AbortController();
|
|
116
117
|
});
|
|
117
118
|
function createUploader() {
|
|
118
|
-
return new smallFileUploader_1.SmallFileUploader(telemetry,
|
|
119
|
+
return new smallFileUploader_1.SmallFileUploader(telemetry, cryptoService, uploadManager, metadata, onFinish, abortController.signal, parentFolderUid, name);
|
|
119
120
|
}
|
|
120
121
|
describe('uploadFromStream', () => {
|
|
121
122
|
const thumbnails = [];
|
|
@@ -123,19 +124,12 @@ describe('SmallFileUploader', () => {
|
|
|
123
124
|
it('should start upload and call manager.generateNewFileCrypto and manager.uploadFile', async () => {
|
|
124
125
|
const uploader = createUploader();
|
|
125
126
|
const stream = createStream([1, 2, 3]);
|
|
126
|
-
const
|
|
127
|
-
const result = await controller.completion();
|
|
127
|
+
const result = await uploader.upload(stream, thumbnails, onProgress);
|
|
128
128
|
expect(uploadManager.generateNewFileCrypto).toHaveBeenCalledWith(parentFolderUid, name);
|
|
129
129
|
expect(uploadManager.uploadFile).toHaveBeenCalledTimes(1);
|
|
130
130
|
expect(result).toEqual({ nodeUid: 'nodeUid', nodeRevisionUid: 'nodeRevisionUid' });
|
|
131
131
|
expect(onProgress).toHaveBeenCalledWith(metadata.expectedSize);
|
|
132
132
|
});
|
|
133
|
-
it('should throw if upload already started', async () => {
|
|
134
|
-
const uploader = createUploader();
|
|
135
|
-
const stream = createStream([1, 2, 3]);
|
|
136
|
-
await uploader.uploadFromStream(stream, thumbnails, onProgress);
|
|
137
|
-
await expect(uploader.uploadFromStream(stream, thumbnails, onProgress)).rejects.toThrow('Upload already started');
|
|
138
|
-
});
|
|
139
133
|
});
|
|
140
134
|
describe('buildPayloads (via upload flow)', () => {
|
|
141
135
|
it('should build commitPayload, encryptedBlock, and encryptedThumbnails from stream and pass to manager.uploadFile', async () => {
|
|
@@ -145,8 +139,7 @@ describe('SmallFileUploader', () => {
|
|
|
145
139
|
{ type: interface_1.ThumbnailType.Type1, thumbnail: new Uint8Array([10, 20]) },
|
|
146
140
|
{ type: interface_1.ThumbnailType.Type2, thumbnail: new Uint8Array([30, 40, 50]) },
|
|
147
141
|
];
|
|
148
|
-
await uploader.
|
|
149
|
-
await uploader.controller.completion();
|
|
142
|
+
await uploader.upload(stream, thumbnails, undefined);
|
|
150
143
|
expect(uploadManager.uploadFile).toHaveBeenCalledWith(parentFolderUid, mockNodeCrypto, metadata, expect.objectContaining({
|
|
151
144
|
armoredManifestSignature: 'mockManifestSignature',
|
|
152
145
|
armoredExtendedAttributes: 'mockExtendedAttributes',
|
|
@@ -155,20 +148,31 @@ describe('SmallFileUploader', () => {
|
|
|
155
148
|
armoredSignature: 'mockBlockSignature',
|
|
156
149
|
verificationToken: MOCK_VERIFICATION_TOKEN,
|
|
157
150
|
}), [
|
|
158
|
-
{
|
|
159
|
-
|
|
151
|
+
{
|
|
152
|
+
type: interface_1.ThumbnailType.Type1,
|
|
153
|
+
encryptedData: expect.any(Uint8Array),
|
|
154
|
+
blockHash: new Uint8Array(32).fill(interface_1.ThumbnailType.Type1),
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
type: interface_1.ThumbnailType.Type2,
|
|
158
|
+
encryptedData: expect.any(Uint8Array),
|
|
159
|
+
blockHash: new Uint8Array(32).fill(interface_1.ThumbnailType.Type2),
|
|
160
|
+
},
|
|
160
161
|
]);
|
|
161
162
|
expect(cryptoService.encryptBlock).toHaveBeenCalledTimes(1);
|
|
162
163
|
expect(cryptoService.encryptThumbnail).toHaveBeenCalledTimes(2);
|
|
163
|
-
expect(cryptoService.commitFile).toHaveBeenCalledWith(expect.anything(),
|
|
164
|
+
expect(cryptoService.commitFile).toHaveBeenCalledWith(expect.anything(), (0, utils_1.mergeUint8Arrays)([
|
|
165
|
+
new Uint8Array(32).fill(interface_1.ThumbnailType.Type1),
|
|
166
|
+
new Uint8Array(32).fill(interface_1.ThumbnailType.Type2),
|
|
167
|
+
MOCK_BLOCK_HASH,
|
|
168
|
+
]), expect.any(String));
|
|
164
169
|
});
|
|
165
170
|
it('should pass encrypted block data matching stream content to crypto.encryptBlock', async () => {
|
|
166
171
|
const uploader = createUploader();
|
|
167
172
|
const content = [5, 6, 7, 8, 9];
|
|
168
173
|
metadata.expectedSize = content.length;
|
|
169
174
|
const stream = createStream(content);
|
|
170
|
-
await uploader.
|
|
171
|
-
await uploader.controller.completion();
|
|
175
|
+
await uploader.upload(stream, [], undefined);
|
|
172
176
|
expect(cryptoService.encryptBlock).toHaveBeenCalledWith(expect.any(Function), expect.anything(), new Uint8Array(content), 0);
|
|
173
177
|
});
|
|
174
178
|
it('should pass each thumbnail to crypto.encryptThumbnail with nodeKeys', async () => {
|
|
@@ -177,8 +181,7 @@ describe('SmallFileUploader', () => {
|
|
|
177
181
|
{ type: interface_1.ThumbnailType.Type1, thumbnail: new Uint8Array([1]) },
|
|
178
182
|
];
|
|
179
183
|
const stream = createStream([1, 2, 3]);
|
|
180
|
-
await uploader.
|
|
181
|
-
await uploader.controller.completion();
|
|
184
|
+
await uploader.upload(stream, thumbnails, undefined);
|
|
182
185
|
expect(cryptoService.encryptThumbnail).toHaveBeenCalledWith(expect.objectContaining({
|
|
183
186
|
key: mockNodeCrypto.nodeKeys.decrypted.key,
|
|
184
187
|
contentKeyPacket: mockNodeCrypto.contentKey.encrypted.contentKeyPacket,
|
|
@@ -189,8 +192,7 @@ describe('SmallFileUploader', () => {
|
|
|
189
192
|
it('should call commitFile with manifest and extended attributes', async () => {
|
|
190
193
|
const uploader = createUploader();
|
|
191
194
|
const stream = createStream([1, 2, 3]);
|
|
192
|
-
await uploader.
|
|
193
|
-
await uploader.controller.completion();
|
|
195
|
+
await uploader.upload(stream, [], undefined);
|
|
194
196
|
const [nodeKeys, manifest, extendedAttributes] = cryptoService.commitFile.mock.calls[0];
|
|
195
197
|
expect(manifest).toEqual(MOCK_BLOCK_HASH);
|
|
196
198
|
expect(extendedAttributes).toBeDefined();
|
|
@@ -202,9 +204,9 @@ describe('SmallFileUploader', () => {
|
|
|
202
204
|
const uploader = createUploader();
|
|
203
205
|
metadata.expectedSize = 5;
|
|
204
206
|
const stream = createStream([1, 2, 3]); // only 3 bytes
|
|
205
|
-
const
|
|
206
|
-
await expect(
|
|
207
|
-
await expect(
|
|
207
|
+
const promise = uploader.upload(stream, [], undefined);
|
|
208
|
+
await expect(promise).rejects.toThrow(errors_1.IntegrityError);
|
|
209
|
+
await expect(promise).rejects.toMatchObject({
|
|
208
210
|
debug: { actual: 3, expected: 5 },
|
|
209
211
|
});
|
|
210
212
|
});
|
|
@@ -212,9 +214,9 @@ describe('SmallFileUploader', () => {
|
|
|
212
214
|
const uploader = createUploader();
|
|
213
215
|
metadata.expectedSha1 = 'a'.repeat(40); // wrong sha1
|
|
214
216
|
const stream = createStream([1, 2, 3]);
|
|
215
|
-
const
|
|
216
|
-
await expect(
|
|
217
|
-
await expect(
|
|
217
|
+
const promise = uploader.upload(stream, [], undefined);
|
|
218
|
+
await expect(promise).rejects.toThrow(errors_1.IntegrityError);
|
|
219
|
+
await expect(promise).rejects.toMatchObject({
|
|
218
220
|
debug: expect.objectContaining({
|
|
219
221
|
expectedSha1: 'a'.repeat(40),
|
|
220
222
|
}),
|
|
@@ -227,8 +229,7 @@ describe('SmallFileUploader', () => {
|
|
|
227
229
|
const uploader = createUploader();
|
|
228
230
|
const stream = createStream([]);
|
|
229
231
|
const onProgress = jest.fn();
|
|
230
|
-
const
|
|
231
|
-
const result = await controller.completion();
|
|
232
|
+
const result = await uploader.upload(stream, [], onProgress);
|
|
232
233
|
expect(result).toEqual({ nodeUid: 'nodeUid', nodeRevisionUid: 'nodeRevisionUid' });
|
|
233
234
|
expect(cryptoService.encryptBlock).not.toHaveBeenCalled();
|
|
234
235
|
expect(uploadManager.uploadFile).toHaveBeenCalledWith(parentFolderUid, mockNodeCrypto, metadata, expect.objectContaining({
|
|
@@ -321,13 +322,12 @@ describe('SmallFileRevisionUploader', () => {
|
|
|
321
322
|
abortController = new AbortController();
|
|
322
323
|
});
|
|
323
324
|
function createUploader() {
|
|
324
|
-
return new smallFileUploader_1.SmallFileRevisionUploader(telemetry,
|
|
325
|
+
return new smallFileUploader_1.SmallFileRevisionUploader(telemetry, cryptoService, uploadManager, metadata, onFinish, abortController.signal, nodeUid);
|
|
325
326
|
}
|
|
326
327
|
it('should get node crypto, build payloads, and call uploadSmallRevision', async () => {
|
|
327
328
|
const uploader = createUploader();
|
|
328
329
|
const stream = createStream([1, 2, 3]);
|
|
329
|
-
const
|
|
330
|
-
const result = await controller.completion();
|
|
330
|
+
const result = await uploader.upload(stream, [], undefined);
|
|
331
331
|
expect(result).toEqual({ nodeUid: 'nodeUid', nodeRevisionUid: 'nodeRevisionUid' });
|
|
332
332
|
expect(cryptoService.encryptBlock).toHaveBeenCalledWith(expect.any(Function), expect.anything(), Uint8Array.from([1, 2, 3]), 0);
|
|
333
333
|
expect(uploadManager.getExistingFileNodeCrypto).toHaveBeenCalledWith(nodeUid);
|
|
@@ -344,8 +344,7 @@ describe('SmallFileRevisionUploader', () => {
|
|
|
344
344
|
metadata.expectedSize = 0;
|
|
345
345
|
const uploader = createUploader();
|
|
346
346
|
const stream = createStream([]);
|
|
347
|
-
const
|
|
348
|
-
const result = await controller.completion();
|
|
347
|
+
const result = await uploader.upload(stream, [], undefined);
|
|
349
348
|
expect(result).toEqual({ nodeUid: 'nodeUid', nodeRevisionUid: 'nodeRevisionUid' });
|
|
350
349
|
expect(cryptoService.encryptBlock).not.toHaveBeenCalled();
|
|
351
350
|
expect(uploadManager.uploadSmallRevision).toHaveBeenCalledWith(nodeUid, mockNodeKeys, expect.objectContaining({
|