@protontech/drive-sdk 0.12.1 → 0.13.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.
Files changed (154) hide show
  1. package/dist/crypto/driveCrypto.d.ts +1 -0
  2. package/dist/crypto/driveCrypto.js +1 -0
  3. package/dist/crypto/driveCrypto.js.map +1 -1
  4. package/dist/interface/events.d.ts +1 -1
  5. package/dist/interface/featureFlags.d.ts +2 -1
  6. package/dist/interface/featureFlags.js +1 -0
  7. package/dist/interface/featureFlags.js.map +1 -1
  8. package/dist/interface/httpClient.d.ts +1 -0
  9. package/dist/interface/nodes.d.ts +7 -0
  10. package/dist/interface/nodes.js.map +1 -1
  11. package/dist/interface/telemetry.d.ts +4 -0
  12. package/dist/interface/telemetry.js.map +1 -1
  13. package/dist/internal/apiService/apiService.d.ts +1 -0
  14. package/dist/internal/apiService/apiService.js +16 -7
  15. package/dist/internal/apiService/apiService.js.map +1 -1
  16. package/dist/internal/apiService/apiService.test.js +24 -0
  17. package/dist/internal/apiService/apiService.test.js.map +1 -1
  18. package/dist/internal/apiService/driveTypes.d.ts +162 -101
  19. package/dist/internal/download/telemetry.js +4 -0
  20. package/dist/internal/download/telemetry.js.map +1 -1
  21. package/dist/internal/download/telemetry.test.js +5 -0
  22. package/dist/internal/download/telemetry.test.js.map +1 -1
  23. package/dist/internal/events/index.js +2 -2
  24. package/dist/internal/events/index.js.map +1 -1
  25. package/dist/internal/events/interface.d.ts +1 -1
  26. package/dist/internal/nodes/apiService.d.ts +4 -0
  27. package/dist/internal/nodes/apiService.js +4 -0
  28. package/dist/internal/nodes/apiService.js.map +1 -1
  29. package/dist/internal/nodes/apiService.test.js +8 -0
  30. package/dist/internal/nodes/apiService.test.js.map +1 -1
  31. package/dist/internal/nodes/cryptoService.js +3 -0
  32. package/dist/internal/nodes/cryptoService.js.map +1 -1
  33. package/dist/internal/nodes/extendedAttributes.d.ts +5 -5
  34. package/dist/internal/nodes/extendedAttributes.js +5 -14
  35. package/dist/internal/nodes/extendedAttributes.js.map +1 -1
  36. package/dist/internal/nodes/extendedAttributes.test.js +16 -22
  37. package/dist/internal/nodes/extendedAttributes.test.js.map +1 -1
  38. package/dist/internal/nodes/interface.d.ts +5 -0
  39. package/dist/internal/nodes/nodesManagement.d.ts +3 -3
  40. package/dist/internal/nodes/nodesManagement.js +7 -5
  41. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  42. package/dist/internal/photos/albumsManager.js +1 -0
  43. package/dist/internal/photos/albumsManager.js.map +1 -1
  44. package/dist/internal/photos/nodes.d.ts +1 -1
  45. package/dist/internal/photos/nodes.js +2 -2
  46. package/dist/internal/photos/nodes.js.map +1 -1
  47. package/dist/internal/photos/upload.d.ts +5 -5
  48. package/dist/internal/photos/upload.js +8 -2
  49. package/dist/internal/photos/upload.js.map +1 -1
  50. package/dist/internal/sharing/apiService.js +1 -1
  51. package/dist/internal/sharing/apiService.js.map +1 -1
  52. package/dist/internal/sharingPublic/nodes.d.ts +1 -0
  53. package/dist/internal/upload/apiService.d.ts +45 -1
  54. package/dist/internal/upload/apiService.js +69 -1
  55. package/dist/internal/upload/apiService.js.map +1 -1
  56. package/dist/internal/upload/blockVerifier.d.ts +4 -1
  57. package/dist/internal/upload/blockVerifier.js +5 -0
  58. package/dist/internal/upload/blockVerifier.js.map +1 -1
  59. package/dist/internal/upload/cryptoService.d.ts +2 -2
  60. package/dist/internal/upload/cryptoService.js +1 -3
  61. package/dist/internal/upload/cryptoService.js.map +1 -1
  62. package/dist/internal/upload/fileUploader.d.ts +4 -3
  63. package/dist/internal/upload/fileUploader.js +17 -7
  64. package/dist/internal/upload/fileUploader.js.map +1 -1
  65. package/dist/internal/upload/index.d.ts +3 -3
  66. package/dist/internal/upload/index.js +17 -1
  67. package/dist/internal/upload/index.js.map +1 -1
  68. package/dist/internal/upload/index.test.d.ts +1 -0
  69. package/dist/internal/upload/index.test.js +71 -0
  70. package/dist/internal/upload/index.test.js.map +1 -0
  71. package/dist/internal/upload/interface.d.ts +2 -0
  72. package/dist/internal/upload/manager.d.ts +41 -2
  73. package/dist/internal/upload/manager.js +126 -44
  74. package/dist/internal/upload/manager.js.map +1 -1
  75. package/dist/internal/upload/manager.test.js +268 -1
  76. package/dist/internal/upload/manager.test.js.map +1 -1
  77. package/dist/internal/upload/smallFileUploader.d.ts +83 -0
  78. package/dist/internal/upload/smallFileUploader.js +197 -0
  79. package/dist/internal/upload/smallFileUploader.js.map +1 -0
  80. package/dist/internal/upload/smallFileUploader.test.d.ts +1 -0
  81. package/dist/internal/upload/smallFileUploader.test.js +358 -0
  82. package/dist/internal/upload/smallFileUploader.test.js.map +1 -0
  83. package/dist/internal/upload/streamReader.d.ts +4 -0
  84. package/dist/internal/upload/streamReader.js +37 -0
  85. package/dist/internal/upload/streamReader.js.map +1 -0
  86. package/dist/internal/upload/streamReader.test.d.ts +1 -0
  87. package/dist/internal/upload/streamReader.test.js +90 -0
  88. package/dist/internal/upload/streamReader.test.js.map +1 -0
  89. package/dist/internal/upload/streamUploader.d.ts +6 -0
  90. package/dist/internal/upload/streamUploader.js +3 -3
  91. package/dist/internal/upload/streamUploader.js.map +1 -1
  92. package/dist/internal/upload/telemetry.d.ts +3 -2
  93. package/dist/internal/upload/telemetry.js +5 -0
  94. package/dist/internal/upload/telemetry.js.map +1 -1
  95. package/dist/internal/upload/telemetry.test.js +6 -0
  96. package/dist/internal/upload/telemetry.test.js.map +1 -1
  97. package/dist/protonDrivePhotosClient.d.ts +1 -1
  98. package/dist/protonDrivePublicLinkClient.js +3 -1
  99. package/dist/protonDrivePublicLinkClient.js.map +1 -1
  100. package/dist/telemetry.d.ts +1 -0
  101. package/dist/telemetry.js +21 -0
  102. package/dist/telemetry.js.map +1 -1
  103. package/dist/telemetry.test.d.ts +1 -0
  104. package/dist/telemetry.test.js +37 -0
  105. package/dist/telemetry.test.js.map +1 -0
  106. package/dist/transformers.d.ts +1 -1
  107. package/dist/transformers.js +1 -0
  108. package/dist/transformers.js.map +1 -1
  109. package/package.json +1 -1
  110. package/src/crypto/driveCrypto.ts +2 -0
  111. package/src/interface/events.ts +1 -1
  112. package/src/interface/featureFlags.ts +1 -0
  113. package/src/interface/httpClient.ts +1 -0
  114. package/src/interface/nodes.ts +7 -0
  115. package/src/interface/telemetry.ts +4 -0
  116. package/src/internal/apiService/apiService.test.ts +30 -0
  117. package/src/internal/apiService/apiService.ts +23 -7
  118. package/src/internal/apiService/driveTypes.ts +162 -101
  119. package/src/internal/download/telemetry.test.ts +5 -0
  120. package/src/internal/download/telemetry.ts +5 -1
  121. package/src/internal/events/index.ts +2 -2
  122. package/src/internal/events/interface.ts +1 -1
  123. package/src/internal/nodes/apiService.test.ts +9 -0
  124. package/src/internal/nodes/apiService.ts +4 -0
  125. package/src/internal/nodes/cryptoService.ts +11 -1
  126. package/src/internal/nodes/extendedAttributes.test.ts +25 -25
  127. package/src/internal/nodes/extendedAttributes.ts +10 -19
  128. package/src/internal/nodes/interface.ts +5 -0
  129. package/src/internal/nodes/nodesManagement.ts +8 -6
  130. package/src/internal/photos/albumsManager.ts +1 -0
  131. package/src/internal/photos/nodes.ts +2 -2
  132. package/src/internal/photos/upload.ts +23 -10
  133. package/src/internal/sharing/apiService.ts +5 -5
  134. package/src/internal/upload/apiService.ts +167 -2
  135. package/src/internal/upload/blockVerifier.ts +12 -0
  136. package/src/internal/upload/cryptoService.ts +10 -10
  137. package/src/internal/upload/fileUploader.ts +20 -7
  138. package/src/internal/upload/index.test.ts +99 -0
  139. package/src/internal/upload/index.ts +45 -4
  140. package/src/internal/upload/interface.ts +2 -0
  141. package/src/internal/upload/manager.test.ts +368 -2
  142. package/src/internal/upload/manager.ts +229 -78
  143. package/src/internal/upload/smallFileUploader.test.ts +491 -0
  144. package/src/internal/upload/smallFileUploader.ts +353 -0
  145. package/src/internal/upload/streamReader.test.ts +109 -0
  146. package/src/internal/upload/streamReader.ts +38 -0
  147. package/src/internal/upload/streamUploader.ts +1 -1
  148. package/src/internal/upload/telemetry.test.ts +6 -0
  149. package/src/internal/upload/telemetry.ts +8 -2
  150. package/src/protonDrivePhotosClient.ts +1 -1
  151. package/src/protonDrivePublicLinkClient.ts +2 -0
  152. package/src/telemetry.test.ts +40 -0
  153. package/src/telemetry.ts +22 -0
  154. package/src/transformers.ts +2 -0
@@ -1,12 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.initUploadModule = initUploadModule;
4
+ const interface_1 = require("../../interface");
4
5
  const apiService_1 = require("./apiService");
5
6
  const cryptoService_1 = require("./cryptoService");
6
7
  const fileUploader_1 = require("./fileUploader");
7
8
  const manager_1 = require("./manager");
8
9
  const queue_1 = require("./queue");
10
+ const smallFileUploader_1 = require("./smallFileUploader");
9
11
  const telemetry_1 = require("./telemetry");
12
+ const SMALL_FILE_SIZE_LIMIT = 128 * 1024; // 128 KiB
10
13
  /**
11
14
  * Provides facade for the upload module.
12
15
  *
@@ -14,12 +17,19 @@ const telemetry_1 = require("./telemetry");
14
17
  * metadata generation, content upload, API communication, encryption,
15
18
  * and verifications.
16
19
  */
17
- function initUploadModule(telemetry, apiService, driveCrypto, sharesService, nodesService, featureFlagProvider, clientUid) {
20
+ function initUploadModule(telemetry, apiService, driveCrypto, sharesService, nodesService, featureFlagProvider, clientUid, allowSmallFileUpload = true) {
18
21
  const api = new apiService_1.UploadAPIService(apiService, clientUid);
19
22
  const cryptoService = new cryptoService_1.UploadCryptoService(telemetry, driveCrypto, nodesService, featureFlagProvider);
20
23
  const uploadTelemetry = new telemetry_1.UploadTelemetry(telemetry, sharesService);
21
24
  const manager = new manager_1.UploadManager(telemetry, api, cryptoService, nodesService, clientUid);
22
25
  const queue = new queue_1.UploadQueue();
26
+ async function useSmallFileUpload(metadata) {
27
+ const isEnabled = allowSmallFileUpload && (await featureFlagProvider.isEnabled(interface_1.FeatureFlags.DriveSmallFileUpload));
28
+ if (!isEnabled) {
29
+ return false;
30
+ }
31
+ return metadata.expectedSize < SMALL_FILE_SIZE_LIMIT;
32
+ }
23
33
  /**
24
34
  * Returns a FileUploader instance that can be used to upload a file to
25
35
  * a parent folder.
@@ -32,6 +42,9 @@ function initUploadModule(telemetry, apiService, driveCrypto, sharesService, nod
32
42
  const onFinish = () => {
33
43
  queue.releaseCapacity(metadata.expectedSize);
34
44
  };
45
+ if (await useSmallFileUpload(metadata)) {
46
+ return new smallFileUploader_1.SmallFileUploader(uploadTelemetry, api, cryptoService, manager, metadata, onFinish, signal, parentFolderUid, name);
47
+ }
35
48
  return new fileUploader_1.FileUploader(uploadTelemetry, api, cryptoService, manager, parentFolderUid, name, metadata, onFinish, signal);
36
49
  }
37
50
  /**
@@ -46,6 +59,9 @@ function initUploadModule(telemetry, apiService, driveCrypto, sharesService, nod
46
59
  const onFinish = () => {
47
60
  queue.releaseCapacity(metadata.expectedSize);
48
61
  };
62
+ if (await useSmallFileUpload(metadata)) {
63
+ return new smallFileUploader_1.SmallFileRevisionUploader(uploadTelemetry, api, cryptoService, manager, metadata, onFinish, signal, nodeUid);
64
+ }
49
65
  return new fileUploader_1.FileRevisionUploader(uploadTelemetry, api, cryptoService, manager, nodeUid, metadata, onFinish, signal);
50
66
  }
51
67
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/internal/upload/index.ts"],"names":[],"mappings":";;AAkBA,4CAmFC;AAlGD,6CAAgD;AAChD,mDAAsD;AACtD,iDAAoE;AAEpE,uCAA0C;AAC1C,mCAAsC;AACtC,2CAA8C;AAE9C;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC5B,SAA+B,EAC/B,UAA2B,EAC3B,WAAwB,EACxB,aAA4B,EAC5B,YAA0B,EAC1B,mBAAwC,EACxC,SAAkB;IAElB,MAAM,GAAG,GAAG,IAAI,6BAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,IAAI,mCAAmB,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAEzG,MAAM,eAAe,GAAG,IAAI,2BAAe,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,IAAI,uBAAa,CAAC,SAAS,EAAE,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;IAE1F,MAAM,KAAK,GAAG,IAAI,mBAAW,EAAE,CAAC;IAEhC;;;;;;OAMG;IACH,KAAK,UAAU,eAAe,CAC1B,eAAuB,EACvB,IAAY,EACZ,QAAwB,EACxB,MAAoB;QAEpB,MAAM,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAE3D,MAAM,QAAQ,GAAG,GAAG,EAAE;YAClB,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC,CAAC;QAEF,OAAO,IAAI,2BAAY,CACnB,eAAe,EACf,GAAG,EACH,aAAa,EACb,OAAO,EACP,eAAe,EACf,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,MAAM,CACT,CAAC;IACN,CAAC;IAED;;;;;;OAMG;IACH,KAAK,UAAU,uBAAuB,CAClC,OAAe,EACf,QAAwB,EACxB,MAAoB;QAEpB,MAAM,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAE3D,MAAM,QAAQ,GAAG,GAAG,EAAE;YAClB,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC,CAAC;QAEF,OAAO,IAAI,mCAAoB,CAC3B,eAAe,EACf,GAAG,EACH,aAAa,EACb,OAAO,EACP,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,MAAM,CACT,CAAC;IACN,CAAC;IAED,OAAO;QACH,eAAe;QACf,uBAAuB;KAC1B,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/internal/upload/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const telemetry_1 = require("../../tests/telemetry");
4
+ const fileUploader_1 = require("./fileUploader");
5
+ const index_1 = require("./index");
6
+ const smallFileUploader_1 = require("./smallFileUploader");
7
+ const SMALL_FILE_SIZE_LIMIT = 128 * 1024; // 128 KiB, must match index.ts
8
+ describe('initUploadModule - uploader selection', () => {
9
+ const parentFolderUid = 'parent-folder-uid';
10
+ const name = 'test-file.txt';
11
+ const nodeUid = 'node-uid';
12
+ let featureFlagProvider;
13
+ let uploadModule;
14
+ beforeEach(() => {
15
+ const apiService = {};
16
+ const driveCrypto = {};
17
+ const sharesService = {};
18
+ const nodesService = {};
19
+ featureFlagProvider = {
20
+ isEnabled: jest.fn().mockResolvedValue(true),
21
+ };
22
+ uploadModule = (0, index_1.initUploadModule)((0, telemetry_1.getMockTelemetry)(), apiService, driveCrypto, sharesService, nodesService, featureFlagProvider);
23
+ });
24
+ describe('getFileUploader', () => {
25
+ it('returns SmallFileUploader when feature flag is enabled and file size is below limit', async () => {
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);
45
+ });
46
+ });
47
+ describe('getFileRevisionUploader', () => {
48
+ it('returns SmallFileRevisionUploader when feature flag is enabled and file size is below limit', async () => {
49
+ featureFlagProvider.isEnabled.mockResolvedValue(true);
50
+ const metadata = { expectedSize: 1, mediaType: 'text/plain' };
51
+ const uploader = await uploadModule.getFileRevisionUploader(nodeUid, metadata);
52
+ expect(uploader).toBeInstanceOf(smallFileUploader_1.SmallFileRevisionUploader);
53
+ });
54
+ it('returns FileRevisionUploader when feature flag is enabled but file size exceeds limit', async () => {
55
+ featureFlagProvider.isEnabled.mockResolvedValue(true);
56
+ const metadata = {
57
+ expectedSize: SMALL_FILE_SIZE_LIMIT + 1,
58
+ mediaType: 'text/plain',
59
+ };
60
+ const uploader = await uploadModule.getFileRevisionUploader(nodeUid, metadata);
61
+ expect(uploader).toBeInstanceOf(fileUploader_1.FileRevisionUploader);
62
+ });
63
+ it('returns FileRevisionUploader when feature flag is disabled even for small file', async () => {
64
+ featureFlagProvider.isEnabled.mockResolvedValue(false);
65
+ const metadata = { expectedSize: 1, mediaType: 'text/plain' };
66
+ const uploader = await uploadModule.getFileRevisionUploader(nodeUid, metadata);
67
+ expect(uploader).toBeInstanceOf(fileUploader_1.FileRevisionUploader);
68
+ });
69
+ });
70
+ });
71
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/internal/upload/index.test.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,7 @@ export type NodeCrypto = {
35
35
  };
36
36
  contentKey: {
37
37
  encrypted: {
38
+ contentKeyPacket: Uint8Array<ArrayBuffer>;
38
39
  base64ContentKeyPacket: string;
39
40
  armoredContentKeyPacketSignature: string;
40
41
  };
@@ -89,6 +90,7 @@ export interface NodesService {
89
90
  getNodeKeys(nodeUid: string): Promise<{
90
91
  key: PrivateKey;
91
92
  passphraseSessionKey: SessionKey;
93
+ contentKeyPacket?: Uint8Array<ArrayBuffer>;
92
94
  contentKeyPacketSessionKey?: SessionKey;
93
95
  hashKey?: Uint8Array<ArrayBuffer>;
94
96
  }>;
@@ -1,7 +1,8 @@
1
- import { Logger, ProtonDriveTelemetry, UploadMetadata } from '../../interface';
1
+ import { PrivateKey, SessionKey } from '../../crypto';
2
+ import { Logger, ProtonDriveTelemetry, ThumbnailType, UploadMetadata } from '../../interface';
2
3
  import { UploadAPIService } from './apiService';
3
4
  import { UploadCryptoService } from './cryptoService';
4
- import { NodeRevisionDraft, NodesService } from './interface';
5
+ import { NodeRevisionDraft, NodesService, NodeCrypto } from './interface';
5
6
  /**
6
7
  * UploadManager is responsible for creating and deleting draft nodes
7
8
  * on the server. It handles the creation of draft nodes, including
@@ -15,7 +16,45 @@ export declare class UploadManager {
15
16
  protected logger: Logger;
16
17
  constructor(telemetry: ProtonDriveTelemetry, apiService: UploadAPIService, cryptoService: UploadCryptoService, nodesService: NodesService, clientUid: string | undefined);
17
18
  createDraftNode(parentFolderUid: string, name: string, metadata: UploadMetadata): Promise<NodeRevisionDraft>;
19
+ generateNewFileCrypto(parentFolderUid: string, name: string): Promise<NodeCrypto & {
20
+ parentHashKey: Uint8Array<ArrayBuffer>;
21
+ }>;
22
+ getExistingFileNodeCrypto(nodeUid: string): Promise<{
23
+ key: PrivateKey;
24
+ contentKeyPacket: Uint8Array<ArrayBuffer>;
25
+ contentKeyPacketSessionKey: SessionKey;
26
+ signingKeys: NodeCrypto['signingKeys'];
27
+ }>;
18
28
  private createDraftOnAPI;
29
+ uploadFile(parentFolderUid: string, nodeCrypto: NodeCrypto, metadata: UploadMetadata, commitPayload: {
30
+ armoredManifestSignature: string;
31
+ armoredExtendedAttributes: string;
32
+ }, encryptedBlock: {
33
+ encryptedData: Uint8Array<ArrayBuffer>;
34
+ armoredSignature: string;
35
+ verificationToken: Uint8Array<ArrayBuffer>;
36
+ } | undefined, encryptedThumbnails: {
37
+ type: ThumbnailType;
38
+ encryptedData: Uint8Array<ArrayBuffer>;
39
+ }[], signal?: AbortSignal): Promise<{
40
+ nodeUid: string;
41
+ nodeRevisionUid: string;
42
+ }>;
43
+ uploadSmallRevision(nodeUid: string, nodeCrypto: Pick<NodeCrypto, 'signingKeys'>, commitPayload: {
44
+ armoredManifestSignature: string;
45
+ armoredExtendedAttributes: string;
46
+ }, encryptedBlock: {
47
+ encryptedData: Uint8Array<ArrayBuffer>;
48
+ armoredSignature: string;
49
+ verificationToken: Uint8Array<ArrayBuffer>;
50
+ } | undefined, encryptedThumbnails: {
51
+ type: ThumbnailType;
52
+ encryptedData: Uint8Array<ArrayBuffer>;
53
+ }[], signal?: AbortSignal): Promise<{
54
+ nodeUid: string;
55
+ nodeRevisionUid: string;
56
+ }>;
57
+ private handleConflictError;
19
58
  deleteDraftNode(nodeUid: string): Promise<void>;
20
59
  createDraftRevision(nodeUid: string, metadata: UploadMetadata): Promise<NodeRevisionDraft>;
21
60
  deleteDraftRevision(nodeRevisionUid: string): Promise<void>;
@@ -5,6 +5,7 @@ const ttag_1 = require("ttag");
5
5
  const errors_1 = require("../../errors");
6
6
  const nodes_1 = require("../nodes");
7
7
  const uids_1 = require("../uids");
8
+ const telemetry_1 = require("../../telemetry");
8
9
  /**
9
10
  * UploadManager is responsible for creating and deleting draft nodes
10
11
  * on the server. It handles the creation of draft nodes, including
@@ -28,12 +29,8 @@ class UploadManager {
28
29
  this.clientUid = clientUid;
29
30
  }
30
31
  async createDraftNode(parentFolderUid, name, metadata) {
31
- const parentKeys = await this.nodesService.getNodeKeys(parentFolderUid);
32
- if (!parentKeys.hashKey) {
33
- throw new errors_1.ValidationError((0, ttag_1.c)('Error').t `Creating files in non-folders is not allowed`);
34
- }
35
- const generatedNodeCrypto = await this.cryptoService.generateFileCrypto(parentFolderUid, { key: parentKeys.key, hashKey: parentKeys.hashKey }, name);
36
- const { nodeUid, nodeRevisionUid } = await this.createDraftOnAPI(parentFolderUid, parentKeys.hashKey, name, metadata, generatedNodeCrypto);
32
+ const { parentHashKey, ...generatedNodeCrypto } = await this.generateNewFileCrypto(parentFolderUid, name);
33
+ const { nodeUid, nodeRevisionUid } = await this.createDraftOnAPI(parentFolderUid, parentHashKey, name, metadata, generatedNodeCrypto);
37
34
  return {
38
35
  nodeUid,
39
36
  nodeRevisionUid,
@@ -43,7 +40,7 @@ class UploadManager {
43
40
  signingKeys: generatedNodeCrypto.signingKeys,
44
41
  },
45
42
  parentNodeKeys: {
46
- hashKey: parentKeys.hashKey,
43
+ hashKey: parentHashKey,
47
44
  },
48
45
  newNodeInfo: {
49
46
  parentUid: parentFolderUid,
@@ -53,13 +50,44 @@ class UploadManager {
53
50
  },
54
51
  };
55
52
  }
53
+ async generateNewFileCrypto(parentFolderUid, name) {
54
+ const parentKeys = await this.nodesService.getNodeKeys(parentFolderUid);
55
+ if (!parentKeys.hashKey) {
56
+ throw new errors_1.ValidationError((0, ttag_1.c)('Error').t `Creating files in non-folders is not allowed`);
57
+ }
58
+ const generatedNodeCrypto = await this.cryptoService.generateFileCrypto(parentFolderUid, { key: parentKeys.key, hashKey: parentKeys.hashKey }, name);
59
+ return {
60
+ ...generatedNodeCrypto,
61
+ parentHashKey: parentKeys.hashKey,
62
+ };
63
+ }
64
+ async getExistingFileNodeCrypto(nodeUid) {
65
+ const node = await this.nodesService.getNode(nodeUid);
66
+ const nodeKeys = await this.nodesService.getNodeKeys(nodeUid);
67
+ if (!node.activeRevision?.ok || !nodeKeys.contentKeyPacketSessionKey) {
68
+ throw new errors_1.ValidationError((0, ttag_1.c)('Error').t `Creating revisions in non-files is not allowed`);
69
+ }
70
+ if (!nodeKeys.contentKeyPacket) {
71
+ throw new errors_1.ValidationError((0, ttag_1.c)('Error').t `Content key packet is required for small revision upload`);
72
+ }
73
+ const signingKeys = await this.cryptoService.getSigningKeysForExistingNode({
74
+ nodeUid,
75
+ parentNodeUid: node.parentUid,
76
+ });
77
+ return {
78
+ key: nodeKeys.key,
79
+ contentKeyPacket: nodeKeys.contentKeyPacket,
80
+ contentKeyPacketSessionKey: nodeKeys.contentKeyPacketSessionKey,
81
+ signingKeys,
82
+ };
83
+ }
56
84
  async createDraftOnAPI(parentFolderUid, parentHashKey, name, metadata, generatedNodeCrypto) {
57
85
  try {
58
86
  const result = await this.apiService.createDraft(parentFolderUid, {
59
87
  armoredEncryptedName: generatedNodeCrypto.encryptedNode.encryptedName,
60
88
  hash: generatedNodeCrypto.encryptedNode.hash,
61
89
  mediaType: metadata.mediaType,
62
- intendedUploadSize: metadata.expectedSize,
90
+ intendedUploadSize: (0, telemetry_1.reduceSizePrecision)(metadata.expectedSize),
63
91
  armoredNodeKey: generatedNodeCrypto.nodeKeys.encrypted.armoredKey,
64
92
  armoredNodePassphrase: generatedNodeCrypto.nodeKeys.encrypted.armoredPassphrase,
65
93
  armoredNodePassphraseSignature: generatedNodeCrypto.nodeKeys.encrypted.armoredPassphraseSignature,
@@ -70,46 +98,100 @@ class UploadManager {
70
98
  return result;
71
99
  }
72
100
  catch (error) {
73
- if (error instanceof errors_1.ValidationError) {
74
- if (error.code === 2500 /* ErrorCode.ALREADY_EXISTS */) {
75
- this.logger.info(`Node with given name already exists`);
76
- const typedDetails = error.details;
77
- // If the client doesn't specify the client UID, it should
78
- // never be considered own draft.
79
- const isOwnDraftConflict = typedDetails?.ConflictDraftRevisionID &&
80
- this.clientUid &&
81
- typedDetails?.ConflictDraftClientUID === this.clientUid;
82
- // If there is existing draft created by this client,
83
- // automatically delete it and try to create a new one
84
- // with the same name again.
85
- if (typedDetails?.ConflictDraftRevisionID &&
86
- (isOwnDraftConflict || metadata.overrideExistingDraftByOtherClient)) {
87
- const existingDraftNodeUid = (0, uids_1.makeNodeUid)((0, uids_1.splitNodeUid)(parentFolderUid).volumeId, typedDetails.ConflictLinkID);
88
- let deleteFailed = false;
89
- try {
90
- this.logger.warn(`Deleting existing draft node ${existingDraftNodeUid} by ${typedDetails.ConflictDraftClientUID}`);
91
- await this.apiService.deleteDraft(existingDraftNodeUid);
92
- }
93
- catch (deleteDraftError) {
94
- // Do not throw, let throw the conflict error.
95
- deleteFailed = true;
96
- this.logger.error('Failed to delete existing draft node', deleteDraftError);
97
- }
98
- if (!deleteFailed) {
99
- return this.createDraftOnAPI(parentFolderUid, parentHashKey, name, metadata, generatedNodeCrypto);
100
- }
101
+ return this.handleConflictError(parentFolderUid, metadata, error, async () => {
102
+ return this.createDraftOnAPI(parentFolderUid, parentHashKey, name, metadata, generatedNodeCrypto);
103
+ });
104
+ }
105
+ }
106
+ async uploadFile(parentFolderUid, nodeCrypto, metadata, commitPayload, encryptedBlock, encryptedThumbnails, signal) {
107
+ try {
108
+ const result = await this.apiService.uploadSmallFile(parentFolderUid, {
109
+ armoredEncryptedName: nodeCrypto.encryptedNode.encryptedName,
110
+ hash: nodeCrypto.encryptedNode.hash,
111
+ mediaType: metadata.mediaType ?? 'application/octet-stream',
112
+ armoredNodeKey: nodeCrypto.nodeKeys.encrypted.armoredKey,
113
+ armoredNodePassphrase: nodeCrypto.nodeKeys.encrypted.armoredPassphrase,
114
+ armoredNodePassphraseSignature: nodeCrypto.nodeKeys.encrypted.armoredPassphraseSignature,
115
+ base64ContentKeyPacket: nodeCrypto.contentKey.encrypted.base64ContentKeyPacket,
116
+ armoredContentKeyPacketSignature: nodeCrypto.contentKey.encrypted.armoredContentKeyPacketSignature,
117
+ armoredExtendedAttributes: commitPayload.armoredExtendedAttributes,
118
+ signatureEmail: nodeCrypto.signingKeys.email ?? null,
119
+ }, {
120
+ armoredManifestSignature: commitPayload.armoredManifestSignature,
121
+ block: encryptedBlock
122
+ ? {
123
+ encryptedData: encryptedBlock.encryptedData,
124
+ armoredSignature: encryptedBlock.armoredSignature,
125
+ verificationToken: encryptedBlock.verificationToken,
101
126
  }
102
- if (isOwnDraftConflict) {
103
- this.logger.warn(`Existing draft conflict by another client ${typedDetails.ConflictDraftClientUID}`);
127
+ : undefined,
128
+ thumbnails: encryptedThumbnails,
129
+ }, signal);
130
+ await this.nodesService.notifyChildCreated(parentFolderUid);
131
+ return result;
132
+ }
133
+ catch (error) {
134
+ return this.handleConflictError(parentFolderUid, metadata, error, async () => {
135
+ return this.uploadFile(parentFolderUid, nodeCrypto, metadata, commitPayload, encryptedBlock, encryptedThumbnails, signal);
136
+ });
137
+ }
138
+ }
139
+ async uploadSmallRevision(nodeUid, nodeCrypto, commitPayload, encryptedBlock, encryptedThumbnails, signal) {
140
+ const node = await this.nodesService.getNode(nodeUid);
141
+ if (!node.activeRevision?.ok) {
142
+ throw new errors_1.ValidationError((0, ttag_1.c)('Error').t `File has no revision`);
143
+ }
144
+ const result = await this.apiService.uploadSmallRevision(nodeUid, node.activeRevision.value.uid, {
145
+ signatureEmail: nodeCrypto.signingKeys.email ?? null,
146
+ armoredExtendedAttributes: commitPayload.armoredExtendedAttributes,
147
+ }, {
148
+ armoredManifestSignature: commitPayload.armoredManifestSignature,
149
+ block: encryptedBlock,
150
+ thumbnails: encryptedThumbnails,
151
+ }, signal);
152
+ await this.nodesService.notifyNodeChanged(nodeUid);
153
+ return result;
154
+ }
155
+ async handleConflictError(parentFolderUid, metadata, error, onRetryAfterDraftDeleted) {
156
+ if (error instanceof errors_1.ValidationError) {
157
+ if (error.code === 2500 /* ErrorCode.ALREADY_EXISTS */) {
158
+ this.logger.info(`Node with given name already exists`);
159
+ const typedDetails = error.details;
160
+ // If the client doesn't specify the client UID, it should
161
+ // never be considered own draft.
162
+ const isOwnDraftConflict = typedDetails?.ConflictDraftRevisionID &&
163
+ this.clientUid &&
164
+ typedDetails?.ConflictDraftClientUID === this.clientUid;
165
+ // If there is existing draft created by this client,
166
+ // automatically delete it and try to create a new one
167
+ // with the same name again.
168
+ if (typedDetails?.ConflictDraftRevisionID &&
169
+ (isOwnDraftConflict || metadata.overrideExistingDraftByOtherClient)) {
170
+ const existingDraftNodeUid = (0, uids_1.makeNodeUid)((0, uids_1.splitNodeUid)(parentFolderUid).volumeId, typedDetails.ConflictLinkID);
171
+ let deleteFailed = false;
172
+ try {
173
+ this.logger.warn(`Deleting existing draft node ${existingDraftNodeUid} by ${typedDetails.ConflictDraftClientUID}`);
174
+ await this.apiService.deleteDraft(existingDraftNodeUid);
175
+ }
176
+ catch (deleteDraftError) {
177
+ // Do not throw, let throw the conflict error.
178
+ deleteFailed = true;
179
+ this.logger.error('Failed to delete existing draft node', deleteDraftError);
104
180
  }
105
- const existingNodeUid = typedDetails
106
- ? (0, uids_1.makeNodeUid)((0, uids_1.splitNodeUid)(parentFolderUid).volumeId, typedDetails.ConflictLinkID)
107
- : undefined;
108
- throw new errors_1.NodeWithSameNameExistsValidationError(error.message, error.code, existingNodeUid, !!typedDetails?.ConflictDraftRevisionID);
181
+ if (!deleteFailed) {
182
+ return onRetryAfterDraftDeleted();
183
+ }
184
+ }
185
+ if (isOwnDraftConflict) {
186
+ this.logger.warn(`Existing draft conflict by another client ${typedDetails.ConflictDraftClientUID}`);
109
187
  }
188
+ const existingNodeUid = typedDetails
189
+ ? (0, uids_1.makeNodeUid)((0, uids_1.splitNodeUid)(parentFolderUid).volumeId, typedDetails.ConflictLinkID)
190
+ : undefined;
191
+ throw new errors_1.NodeWithSameNameExistsValidationError(error.message, error.code, existingNodeUid, !!typedDetails?.ConflictDraftRevisionID);
110
192
  }
111
- throw error;
112
193
  }
194
+ throw error;
113
195
  }
114
196
  async deleteDraftNode(nodeUid) {
115
197
  try {
@@ -134,7 +216,7 @@ class UploadManager {
134
216
  });
135
217
  const { nodeRevisionUid } = await this.apiService.createDraftRevision(nodeUid, {
136
218
  currentRevisionUid: node.activeRevision.value.uid,
137
- intendedUploadSize: metadata.expectedSize,
219
+ intendedUploadSize: (0, telemetry_1.reduceSizePrecision)(metadata.expectedSize),
138
220
  });
139
221
  return {
140
222
  nodeUid,
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/internal/upload/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/internal/upload/manager.ts"],"names":[],"mappings":"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"}