@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.
Files changed (57) hide show
  1. package/dist/internal/batchLoading.d.ts +2 -0
  2. package/dist/internal/batchLoading.js +18 -5
  3. package/dist/internal/batchLoading.js.map +1 -1
  4. package/dist/internal/batchLoading.test.js +92 -0
  5. package/dist/internal/batchLoading.test.js.map +1 -1
  6. package/dist/internal/download/apiService.js +27 -23
  7. package/dist/internal/download/apiService.js.map +1 -1
  8. package/dist/internal/events/apiService.js +3 -1
  9. package/dist/internal/events/apiService.js.map +1 -1
  10. package/dist/internal/nodes/nodesAccess.js +1 -1
  11. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  12. package/dist/internal/nodes/nodesAccess.test.js +3 -2
  13. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  14. package/dist/internal/photos/index.js +3 -1
  15. package/dist/internal/photos/index.js.map +1 -1
  16. package/dist/internal/photos/upload.d.ts +1 -1
  17. package/dist/internal/photos/upload.js +2 -2
  18. package/dist/internal/photos/upload.js.map +1 -1
  19. package/dist/internal/sharing/events.d.ts +4 -2
  20. package/dist/internal/sharing/events.js +40 -9
  21. package/dist/internal/sharing/events.js.map +1 -1
  22. package/dist/internal/sharing/events.test.js +30 -2
  23. package/dist/internal/sharing/events.test.js.map +1 -1
  24. package/dist/internal/sharing/index.js +1 -1
  25. package/dist/internal/sharing/index.js.map +1 -1
  26. package/dist/internal/upload/fileUploader.d.ts +19 -3
  27. package/dist/internal/upload/fileUploader.js +31 -5
  28. package/dist/internal/upload/fileUploader.js.map +1 -1
  29. package/dist/internal/upload/fileUploader.test.js +1 -1
  30. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  31. package/dist/internal/upload/index.js +4 -11
  32. package/dist/internal/upload/index.js.map +1 -1
  33. package/dist/internal/upload/index.test.js +104 -45
  34. package/dist/internal/upload/index.test.js.map +1 -1
  35. package/dist/internal/upload/smallFileUploader.d.ts +14 -14
  36. package/dist/internal/upload/smallFileUploader.js +38 -20
  37. package/dist/internal/upload/smallFileUploader.js.map +1 -1
  38. package/dist/internal/upload/smallFileUploader.test.js +35 -36
  39. package/dist/internal/upload/smallFileUploader.test.js.map +1 -1
  40. package/package.json +1 -1
  41. package/src/internal/batchLoading.test.ts +104 -0
  42. package/src/internal/batchLoading.ts +21 -5
  43. package/src/internal/download/apiService.ts +32 -28
  44. package/src/internal/events/apiService.ts +3 -1
  45. package/src/internal/nodes/nodesAccess.test.ts +4 -3
  46. package/src/internal/nodes/nodesAccess.ts +1 -1
  47. package/src/internal/photos/index.ts +2 -0
  48. package/src/internal/photos/upload.ts +13 -1
  49. package/src/internal/sharing/events.test.ts +35 -2
  50. package/src/internal/sharing/events.ts +47 -10
  51. package/src/internal/sharing/index.ts +1 -0
  52. package/src/internal/upload/fileUploader.test.ts +1 -0
  53. package/src/internal/upload/fileUploader.ts +60 -2
  54. package/src/internal/upload/index.test.ts +121 -63
  55. package/src/internal/upload/index.ts +4 -30
  56. package/src/internal/upload/smallFileUploader.test.ts +33 -40
  57. package/src/internal/upload/smallFileUploader.ts +47 -36
@@ -3,12 +3,11 @@ import { AbortError, IntegrityError } from '../../errors';
3
3
  import { Logger, Thumbnail, ThumbnailType, UploadMetadata } from '../../interface';
4
4
  import { getErrorMessage } from '../errors';
5
5
  import { generateFileExtendedAttributes } from '../nodes';
6
- import { UploadAPIService } from './apiService';
7
- import { BlockVerifier, verifyBlockWithContentKey } from './blockVerifier';
6
+ import { mergeUint8Arrays } from '../utils';
7
+ import { verifyBlockWithContentKey } from './blockVerifier';
8
8
  import { UploadCryptoService } from './cryptoService';
9
9
  import { UploadDigests } from './digests';
10
- import { Uploader } from './fileUploader';
11
- import { NodeRevisionDraft, NodeCrypto } from './interface';
10
+ import { NodeCrypto } from './interface';
12
11
  import { UploadManager } from './manager';
13
12
  import { readStreamToUint8Array } from './streamReader';
14
13
  import { MAX_BLOCK_ENCRYPTION_RETRIES } from './streamUploader';
@@ -25,34 +24,23 @@ export type NodeKeys = {
25
24
  * Base uploader for small file and small revision uploads.
26
25
  * Shares the single-request flow: read content, get node crypto, encrypt, then call API.
27
26
  */
28
- abstract class SmallUploader extends Uploader {
27
+ abstract class SmallUploader {
29
28
  protected logger: Logger;
29
+ protected abortController: AbortController;
30
30
 
31
31
  constructor(
32
- telemetry: UploadTelemetry,
33
- apiService: UploadAPIService,
34
- cryptoService: UploadCryptoService,
35
- manager: UploadManager,
36
- metadata: UploadMetadata,
37
- onFinish: () => void,
38
- signal: AbortSignal | undefined,
32
+ protected telemetry: UploadTelemetry,
33
+ protected cryptoService: UploadCryptoService,
34
+ protected manager: UploadManager,
35
+ protected metadata: UploadMetadata,
36
+ protected onFinish: () => void,
37
+ protected signal: AbortSignal | undefined,
39
38
  ) {
40
- super(telemetry, apiService, cryptoService, manager, metadata, onFinish, signal);
41
39
  this.logger = telemetry.getLoggerForSmallUpload();
42
- }
43
- protected async createRevisionDraft(): Promise<{
44
- revisionDraft: NodeRevisionDraft;
45
- blockVerifier: BlockVerifier;
46
- }> {
47
- throw new Error('Small upload does not use revision draft');
40
+ this.abortController = new AbortController();
48
41
  }
49
42
 
50
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
51
- protected async deleteRevisionDraft(revisionDraft: NodeRevisionDraft): Promise<void> {
52
- throw new Error('Small upload does not use revision draft');
53
- }
54
-
55
- protected async startUpload(
43
+ async upload(
56
44
  stream: ReadableStream,
57
45
  thumbnails: Thumbnail[],
58
46
  onProgress?: (uploadedBytes: number) => void,
@@ -105,7 +93,8 @@ abstract class SmallUploader extends Uploader {
105
93
  this.encryptThumbnails(nodeKeys, thumbnails),
106
94
  this.encryptContentBlock(nodeKeys, content.data),
107
95
  ]);
108
- const commitPayload = await this.encryptCommitPayload(nodeKeys, content.sha1, encryptedBlock);
96
+ const manifest = await this.getManifest(encryptedBlock, encryptedThumbnails);
97
+ const commitPayload = await this.encryptCommitPayload(nodeKeys, content.sha1, manifest);
109
98
 
110
99
  return {
111
100
  commitPayload,
@@ -147,12 +136,22 @@ abstract class SmallUploader extends Uploader {
147
136
  private async encryptThumbnails(
148
137
  nodeKeys: NodeKeys,
149
138
  thumbnails: Thumbnail[],
150
- ): Promise<{ type: ThumbnailType; encryptedData: Uint8Array<ArrayBuffer> }[]> {
139
+ ): Promise<
140
+ {
141
+ type: ThumbnailType;
142
+ encryptedData: Uint8Array<ArrayBuffer>;
143
+ blockHash: Uint8Array<ArrayBuffer>;
144
+ }[]
145
+ > {
151
146
  const result = [];
152
147
  for (const thumbnail of thumbnails) {
153
148
  this.logger.debug(`Encrypting thumbnail ${thumbnail.type}`);
154
149
  const enc = await this.cryptoService.encryptThumbnail(nodeKeys, thumbnail);
155
- result.push({ type: thumbnail.type, encryptedData: enc.encryptedData });
150
+ result.push({
151
+ type: thumbnail.type,
152
+ encryptedData: enc.encryptedData,
153
+ blockHash: await enc.hashPromise,
154
+ });
156
155
  }
157
156
  return result;
158
157
  }
@@ -228,21 +227,35 @@ abstract class SmallUploader extends Uploader {
228
227
  };
229
228
  }
230
229
 
231
- private async encryptCommitPayload(
232
- nodeKeys: NodeKeys,
233
- contentSha1: string,
230
+ private async getManifest(
234
231
  encryptedBlock:
235
232
  | {
236
233
  blockHash: Uint8Array<ArrayBuffer>;
237
234
  }
238
235
  | undefined,
236
+ encryptedThumbnails: {
237
+ type: ThumbnailType;
238
+ blockHash: Uint8Array<ArrayBuffer>;
239
+ }[],
240
+ ): Promise<Uint8Array<ArrayBuffer>> {
241
+ encryptedThumbnails.sort((a, b) => a.type - b.type);
242
+ const hashes = [
243
+ ...(await Promise.all(encryptedThumbnails.map(({ blockHash }) => blockHash))),
244
+ ...(encryptedBlock ? [encryptedBlock.blockHash] : []),
245
+ ];
246
+ return mergeUint8Arrays(hashes);
247
+ }
248
+
249
+ private async encryptCommitPayload(
250
+ nodeKeys: NodeKeys,
251
+ contentSha1: string,
252
+ manifest: Uint8Array<ArrayBuffer>,
239
253
  ): Promise<{
240
254
  armoredManifestSignature: string;
241
255
  armoredExtendedAttributes: string;
242
256
  }> {
243
257
  this.logger.debug(`Preparing commit payload`);
244
258
 
245
- const manifest = encryptedBlock ? encryptedBlock.blockHash : new Uint8Array(0);
246
259
  const extendedAttributes = generateFileExtendedAttributes(
247
260
  {
248
261
  modificationTime: this.metadata.modificationTime,
@@ -266,7 +279,6 @@ abstract class SmallUploader extends Uploader {
266
279
  export class SmallFileUploader extends SmallUploader {
267
280
  constructor(
268
281
  telemetry: UploadTelemetry,
269
- apiService: UploadAPIService,
270
282
  cryptoService: UploadCryptoService,
271
283
  manager: UploadManager,
272
284
  metadata: UploadMetadata,
@@ -275,7 +287,7 @@ export class SmallFileUploader extends SmallUploader {
275
287
  private parentFolderUid: string,
276
288
  private name: string,
277
289
  ) {
278
- super(telemetry, apiService, cryptoService, manager, metadata, onFinish, signal);
290
+ super(telemetry, cryptoService, manager, metadata, onFinish, signal);
279
291
  this.parentFolderUid = parentFolderUid;
280
292
  this.name = name;
281
293
  }
@@ -317,7 +329,6 @@ export class SmallFileUploader extends SmallUploader {
317
329
  export class SmallFileRevisionUploader extends SmallUploader {
318
330
  constructor(
319
331
  telemetry: UploadTelemetry,
320
- apiService: UploadAPIService,
321
332
  cryptoService: UploadCryptoService,
322
333
  manager: UploadManager,
323
334
  metadata: UploadMetadata,
@@ -325,7 +336,7 @@ export class SmallFileRevisionUploader extends SmallUploader {
325
336
  signal: AbortSignal | undefined,
326
337
  private nodeUid: string,
327
338
  ) {
328
- super(telemetry, apiService, cryptoService, manager, metadata, onFinish, signal);
339
+ super(telemetry, cryptoService, manager, metadata, onFinish, signal);
329
340
  this.nodeUid = nodeUid;
330
341
  }
331
342