@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
@@ -1392,7 +1392,7 @@ export interface paths {
1392
1392
  put?: never;
1393
1393
  /**
1394
1394
  * Request block upload
1395
- * @description Request upload information for a set of blocks.
1395
+ * @description Request upload URLs for a set of blocks/thumbnails of a given draft revision.
1396
1396
  */
1397
1397
  post: operations["post_drive-blocks"];
1398
1398
  delete?: never;
@@ -1410,10 +1410,7 @@ export interface paths {
1410
1410
  };
1411
1411
  get?: never;
1412
1412
  put?: never;
1413
- /**
1414
- * Upload small file
1415
- * @description This does not support anonymous uploads (yet)
1416
- */
1413
+ /** Upload small file */
1417
1414
  post: operations["post_drive-v2-volumes-{volumeID}-files-small"];
1418
1415
  delete?: never;
1419
1416
  options?: never;
@@ -1430,10 +1427,7 @@ export interface paths {
1430
1427
  };
1431
1428
  get?: never;
1432
1429
  put?: never;
1433
- /**
1434
- * Upload small revision
1435
- * @description This does not support anonymous uploads (yet)
1436
- */
1430
+ /** Upload small revision */
1437
1431
  post: operations["post_drive-v2-volumes-{volumeID}-files-{linkID}-revisions-small"];
1438
1432
  delete?: never;
1439
1433
  options?: never;
@@ -2148,7 +2142,10 @@ export interface paths {
2148
2142
  path?: never;
2149
2143
  cookie?: never;
2150
2144
  };
2151
- /** List URLs on share */
2145
+ /**
2146
+ * List URLs on share
2147
+ * @description There can only be one or zero share URLs on a given share.
2148
+ */
2152
2149
  get: operations["get_drive-shares-{shareID}-urls"];
2153
2150
  put?: never;
2154
2151
  /** Share by URL */
@@ -2465,6 +2462,46 @@ export interface paths {
2465
2462
  patch?: never;
2466
2463
  trace?: never;
2467
2464
  };
2465
+ "/drive/unauth/v2/volumes/{volumeID}/files/small": {
2466
+ parameters: {
2467
+ query?: never;
2468
+ header?: never;
2469
+ path?: never;
2470
+ cookie?: never;
2471
+ };
2472
+ get?: never;
2473
+ put?: never;
2474
+ /**
2475
+ * Upload small file
2476
+ * @description See /drive/v2/volumes/{volumeID}/files/small for full documentation
2477
+ */
2478
+ post: operations["post_drive-unauth-v2-volumes-{volumeID}-files-small"];
2479
+ delete?: never;
2480
+ options?: never;
2481
+ head?: never;
2482
+ patch?: never;
2483
+ trace?: never;
2484
+ };
2485
+ "/drive/unauth/v2/volumes/{volumeID}/files/{linkID}/revisions/small": {
2486
+ parameters: {
2487
+ query?: never;
2488
+ header?: never;
2489
+ path?: never;
2490
+ cookie?: never;
2491
+ };
2492
+ get?: never;
2493
+ put?: never;
2494
+ /**
2495
+ * Upload small revision
2496
+ * @description See /drive/v2/volumes/{volumeID}/files/{linkID}/revisions/small for full documentation
2497
+ */
2498
+ post: operations["post_drive-unauth-v2-volumes-{volumeID}-files-{linkID}-revisions-small"];
2499
+ delete?: never;
2500
+ options?: never;
2501
+ head?: never;
2502
+ patch?: never;
2503
+ trace?: never;
2504
+ };
2468
2505
  "/drive/unauth/v2/volumes/{volumeID}/links/{linkID}/revisions/{revisionID}/verification": {
2469
2506
  parameters: {
2470
2507
  query?: never;
@@ -2607,6 +2644,26 @@ export interface paths {
2607
2644
  patch?: never;
2608
2645
  trace?: never;
2609
2646
  };
2647
+ "/drive/shares/{shareID}/editors-can-share": {
2648
+ parameters: {
2649
+ query?: never;
2650
+ header?: never;
2651
+ path?: never;
2652
+ cookie?: never;
2653
+ };
2654
+ get?: never;
2655
+ /**
2656
+ * Update editorsCanShare property of a share
2657
+ * @description Only allowed to volume owners and members with Admin rights on the Parent
2658
+ */
2659
+ put: operations["put_drive-shares-{shareID}-editors-can-share"];
2660
+ post?: never;
2661
+ delete?: never;
2662
+ options?: never;
2663
+ head?: never;
2664
+ patch?: never;
2665
+ trace?: never;
2666
+ };
2610
2667
  "/drive/shares/{shareID}/owner": {
2611
2668
  parameters: {
2612
2669
  query?: never;
@@ -2639,6 +2696,7 @@ export interface paths {
2639
2696
  put?: never;
2640
2697
  /**
2641
2698
  * Update properties of a share
2699
+ * @deprecated
2642
2700
  * @description Update the values on one or more properties of the Share. For now, only allowed changing editorsCanShare attribute
2643
2701
  */
2644
2702
  post: operations["post_drive-shares-{shareID}-property"];
@@ -4540,6 +4598,15 @@ export interface components {
4540
4598
  * @enum {integer}
4541
4599
  */
4542
4600
  LinkState2: 0 | 1 | 2;
4601
+ OwnedByDto: {
4602
+ /**
4603
+ * Format: email
4604
+ * @description OwnerUser email for regular and photo volumes, null otherwise
4605
+ */
4606
+ Email?: string | null;
4607
+ /** @description OwnerOrganization name for org. volumes, null otherwise */
4608
+ Organization?: string | null;
4609
+ };
4543
4610
  LinkDto: {
4544
4611
  LinkID: components["schemas"]["Id"];
4545
4612
  Type: components["schemas"]["NodeType2"];
@@ -4557,6 +4624,7 @@ export interface components {
4557
4624
  SignatureEmail?: string | null;
4558
4625
  /** Format: email */
4559
4626
  NameSignatureEmail?: string | null;
4627
+ OwnedBy: components["schemas"]["OwnedByDto"];
4560
4628
  /** @default null */
4561
4629
  DirectPermissions: number | null;
4562
4630
  };
@@ -5236,6 +5304,8 @@ export interface components {
5236
5304
  State: components["schemas"]["HealthCheckState"];
5237
5305
  };
5238
5306
  AbuseReportDto: {
5307
+ /** @description Passphrase for reported Link's Node key, unencrypted, as a string, escaped for JSON. */
5308
+ ResourcePassphrase: string;
5239
5309
  /**
5240
5310
  * @description Reported ShareURL, complete including fragment
5241
5311
  * @example https://drive.proton.me/urls/1F9BKXYDMA#yF7d7bn01GMM
@@ -5243,8 +5313,6 @@ export interface components {
5243
5313
  ShareURL: string;
5244
5314
  /** @enum {string} */
5245
5315
  AbuseCategory: "spam" | "copyright" | "child-abuse" | "stolen-data" | "malware" | "other";
5246
- /** @description Passphrase for reported Link's Node key, unencrypted, as a string, escaped for JSON. */
5247
- ResourcePassphrase: string;
5248
5316
  /**
5249
5317
  * @description Full password, including custom part, as string, escaped for JSON
5250
5318
  * @default
@@ -5984,11 +6052,10 @@ export interface components {
5984
6052
  ShareURLs: components["schemas"]["ShareURLResponseDto"][];
5985
6053
  /**
5986
6054
  * @deprecated
5987
- * @description If the Recursive query parameter is set, also returns the related links and ancestors up to the share as a dictionary by LinkID.
6055
+ * @description Unused and deprecated. Always empty.
6056
+ * @default []
5988
6057
  */
5989
- Links: {
5990
- [key: string]: components["schemas"]["ExtendedLinkTransformer"];
5991
- };
6058
+ Links: Record<string, never>;
5992
6059
  /**
5993
6060
  * ProtonResponseCode
5994
6061
  * @example 1000
@@ -6344,6 +6411,10 @@ export interface components {
6344
6411
  */
6345
6412
  Code: 1000;
6346
6413
  };
6414
+ UpdateShareEditorsCanShareRequestDto: {
6415
+ /** @description Indicates if editor members of this share could reshare it or not */
6416
+ Value: boolean;
6417
+ };
6347
6418
  TransferInput: {
6348
6419
  /** @description The ID of the new address */
6349
6420
  AddressID: string;
@@ -7275,23 +7346,6 @@ export interface operations {
7275
7346
  };
7276
7347
  };
7277
7348
  };
7278
- /** @description Failed dependency */
7279
- 424: {
7280
- headers: {
7281
- [name: string]: unknown;
7282
- };
7283
- content: {
7284
- "application/json": {
7285
- /**
7286
- * @description Potential codes:
7287
- * - 2032
7288
- *
7289
- * @enum {integer}
7290
- */
7291
- Code: 2032;
7292
- };
7293
- };
7294
- };
7295
7349
  };
7296
7350
  };
7297
7351
  "post_drive-photos-volumes": {
@@ -7333,23 +7387,6 @@ export interface operations {
7333
7387
  };
7334
7388
  };
7335
7389
  };
7336
- /** @description Failed dependency */
7337
- 424: {
7338
- headers: {
7339
- [name: string]: unknown;
7340
- };
7341
- content: {
7342
- "application/json": {
7343
- /**
7344
- * @description Potential codes:
7345
- * - 2032
7346
- *
7347
- * @enum {integer}
7348
- */
7349
- Code: 2032;
7350
- };
7351
- };
7352
- };
7353
7390
  };
7354
7391
  };
7355
7392
  "put_drive-photos-volumes-{volumeID}-albums-{linkID}": {
@@ -7393,26 +7430,6 @@ export interface operations {
7393
7430
  };
7394
7431
  };
7395
7432
  };
7396
- /** @description Failed dependency */
7397
- 424: {
7398
- headers: {
7399
- [name: string]: unknown;
7400
- };
7401
- content: {
7402
- "application/json": {
7403
- /**
7404
- * @description Potential codes:
7405
- * - 2501: File or folder not found
7406
- * - 2001: Invalid PGP message
7407
- * - 200501: Operation failed: Please retry
7408
- * - 2032
7409
- *
7410
- * @enum {integer}
7411
- */
7412
- Code: 2032;
7413
- };
7414
- };
7415
- };
7416
7433
  };
7417
7434
  };
7418
7435
  "delete_drive-photos-volumes-{volumeID}-albums-{linkID}": {
@@ -10832,23 +10849,6 @@ export interface operations {
10832
10849
  };
10833
10850
  };
10834
10851
  };
10835
- /** @description Failed dependency */
10836
- 424: {
10837
- headers: {
10838
- [name: string]: unknown;
10839
- };
10840
- content: {
10841
- "application/json": {
10842
- /**
10843
- * @description Potential codes:
10844
- * - 2032
10845
- *
10846
- * @enum {integer}
10847
- */
10848
- Code: 2032;
10849
- };
10850
- };
10851
- };
10852
10852
  };
10853
10853
  };
10854
10854
  "post_drive-urls-{token}-auth": {
@@ -11570,20 +11570,7 @@ export interface operations {
11570
11570
  };
11571
11571
  "get_drive-shares-{shareID}-urls": {
11572
11572
  parameters: {
11573
- query?: {
11574
- /**
11575
- * @deprecated
11576
- * @description By default, only shareURL pointing to the share are returned. With Recursive=1, list all shareURLs in the subtree reachable from the Share. 1 (true) or 0 (false).
11577
- */
11578
- Recursive?: 0 | 1;
11579
- /**
11580
- * @deprecated
11581
- * @description Fetch Thumbnail URLs
11582
- */
11583
- Thumbnails?: 0 | 1;
11584
- PageSize?: components["schemas"]["OffsetPagination"]["PageSize"] & unknown;
11585
- Page?: components["schemas"]["OffsetPagination"]["Page"] & unknown;
11586
- };
11573
+ query?: never;
11587
11574
  header?: never;
11588
11575
  path: {
11589
11576
  shareID: string;
@@ -12120,6 +12107,53 @@ export interface operations {
12120
12107
  };
12121
12108
  };
12122
12109
  };
12110
+ "post_drive-unauth-v2-volumes-{volumeID}-files-small": {
12111
+ parameters: {
12112
+ query?: never;
12113
+ header?: never;
12114
+ path: {
12115
+ volumeID: string;
12116
+ };
12117
+ cookie?: never;
12118
+ };
12119
+ requestBody?: never;
12120
+ responses: {
12121
+ /** @description Success */
12122
+ 200: {
12123
+ headers: {
12124
+ "x-pm-code": 1000;
12125
+ [name: string]: unknown;
12126
+ };
12127
+ content: {
12128
+ "application/json": components["schemas"]["SmallUploadResponseDto"];
12129
+ };
12130
+ };
12131
+ };
12132
+ };
12133
+ "post_drive-unauth-v2-volumes-{volumeID}-files-{linkID}-revisions-small": {
12134
+ parameters: {
12135
+ query?: never;
12136
+ header?: never;
12137
+ path: {
12138
+ volumeID: string;
12139
+ linkID: components["schemas"]["Id"];
12140
+ };
12141
+ cookie?: never;
12142
+ };
12143
+ requestBody?: never;
12144
+ responses: {
12145
+ /** @description Success */
12146
+ 200: {
12147
+ headers: {
12148
+ "x-pm-code": 1000;
12149
+ [name: string]: unknown;
12150
+ };
12151
+ content: {
12152
+ "application/json": components["schemas"]["SmallUploadResponseDto"];
12153
+ };
12154
+ };
12155
+ };
12156
+ };
12123
12157
  "get_drive-unauth-v2-volumes-{volumeID}-links-{linkID}-revisions-{revisionID}-verification": {
12124
12158
  parameters: {
12125
12159
  query?: never;
@@ -12345,6 +12379,33 @@ export interface operations {
12345
12379
  };
12346
12380
  };
12347
12381
  };
12382
+ "put_drive-shares-{shareID}-editors-can-share": {
12383
+ parameters: {
12384
+ query?: never;
12385
+ header?: never;
12386
+ path: {
12387
+ shareID: string;
12388
+ };
12389
+ cookie?: never;
12390
+ };
12391
+ requestBody?: {
12392
+ content: {
12393
+ "application/json": components["schemas"]["UpdateShareEditorsCanShareRequestDto"];
12394
+ };
12395
+ };
12396
+ responses: {
12397
+ /** @description Success */
12398
+ 200: {
12399
+ headers: {
12400
+ "x-pm-code": 1000;
12401
+ [name: string]: unknown;
12402
+ };
12403
+ content: {
12404
+ "application/json": components["schemas"]["SuccessfulResponse"];
12405
+ };
12406
+ };
12407
+ };
12408
+ };
12348
12409
  "post_drive-shares-{shareID}-owner": {
12349
12410
  parameters: {
12350
12411
  query?: never;
@@ -38,6 +38,7 @@ describe('DownloadTelemetry', () => {
38
38
  eventName: 'download',
39
39
  volumeType: 'own_volume',
40
40
  downloadedSize: 0,
41
+ approximateDownloadedSize: 0,
41
42
  error: 'unknown',
42
43
  originalError: error,
43
44
  });
@@ -51,7 +52,9 @@ describe('DownloadTelemetry', () => {
51
52
  eventName: 'download',
52
53
  volumeType: 'own_volume',
53
54
  downloadedSize: 123,
55
+ approximateDownloadedSize: 4095,
54
56
  claimedFileSize: 456,
57
+ approximateClaimedFileSize: 4095,
55
58
  error: 'unknown',
56
59
  originalError: error,
57
60
  });
@@ -64,7 +67,9 @@ describe('DownloadTelemetry', () => {
64
67
  eventName: 'download',
65
68
  volumeType: 'own_volume',
66
69
  downloadedSize: 500,
70
+ approximateDownloadedSize: 4095,
67
71
  claimedFileSize: 500,
72
+ approximateClaimedFileSize: 4095,
68
73
  });
69
74
  });
70
75
 
@@ -1,6 +1,6 @@
1
1
  import { RateLimitedError, ValidationError, DecryptionError, IntegrityError } from '../../errors';
2
2
  import { ProtonDriveTelemetry, MetricsDownloadErrorType, Logger } from '../../interface';
3
- import { LoggerWithPrefix } from '../../telemetry';
3
+ import { LoggerWithPrefix, reduceSizePrecision } from '../../telemetry';
4
4
  import { APIHTTPError } from '../apiService';
5
5
  import { splitNodeRevisionUid, splitNodeUid } from '../uids';
6
6
  import { SharesService } from './interface';
@@ -83,6 +83,10 @@ export class DownloadTelemetry {
83
83
  this.telemetry.recordMetric({
84
84
  eventName: 'download',
85
85
  volumeType,
86
+ approximateDownloadedSize: reduceSizePrecision(options.downloadedSize),
87
+ approximateClaimedFileSize: options.claimedFileSize
88
+ ? reduceSizePrecision(options.claimedFileSize)
89
+ : undefined,
86
90
  ...options,
87
91
  });
88
92
  }
@@ -62,7 +62,7 @@ export class DriveEventsService {
62
62
  }
63
63
 
64
64
  const coreEventManager = new CoreEventManager(this.logger, this.apiService);
65
- const latestEventId = this.latestEventIdProvider.getLatestEventId('core') ?? null;
65
+ const latestEventId = await this.latestEventIdProvider.getLatestEventId('core');
66
66
  const eventManager = new EventManager(coreEventManager, CORE_POLLING_INTERVAL, latestEventId);
67
67
 
68
68
  for (const listener of this.cacheEventListeners) {
@@ -105,7 +105,7 @@ export class DriveEventsService {
105
105
 
106
106
  const isOwnVolume = await this.sharesService.isOwnVolume(volumeId);
107
107
  const pollingInterval = this.getDefaultVolumePollingInterval(isOwnVolume);
108
- const latestEventId = this.latestEventIdProvider.getLatestEventId(volumeId);
108
+ const latestEventId = await this.latestEventIdProvider.getLatestEventId(volumeId);
109
109
  const eventManager = new EventManager<DriveEvent>(volumeEventManager, pollingInterval, latestEventId);
110
110
 
111
111
  for (const listener of this.cacheEventListeners) {
@@ -18,7 +18,7 @@ export interface EventSubscription {
18
18
  }
19
19
 
20
20
  export interface LatestEventIdProvider {
21
- getLatestEventId(treeEventScopeId: string): string | null;
21
+ getLatestEventId(treeEventScopeId: string): Promise<string | null>;
22
22
  }
23
23
 
24
24
  /**
@@ -74,6 +74,11 @@ function generateAPINode() {
74
74
  NodeKey: 'nodeKey',
75
75
  NodePassphrase: 'nodePass',
76
76
  NodePassphraseSignature: 'nodePassSig',
77
+
78
+ OwnedBy: {
79
+ Email: 'ownerByEmail',
80
+ Organization: null,
81
+ },
77
82
  },
78
83
  SharingSummary: null,
79
84
  };
@@ -149,6 +154,10 @@ function generateNode() {
149
154
  isSharedPublicly: false,
150
155
  directRole: MemberRole.Admin,
151
156
  membership: undefined,
157
+ ownedBy: {
158
+ email: 'ownerByEmail',
159
+ organization: undefined,
160
+ },
152
161
 
153
162
  encryptedCrypto: {
154
163
  armoredKey: 'nodeKey',
@@ -780,6 +780,10 @@ export function linkToEncryptedNodeBaseMetadata(
780
780
  inviteTime: new Date(link.Membership.InviteTime * 1000),
781
781
  }
782
782
  : undefined,
783
+ ownedBy: {
784
+ email: link.Link.OwnedBy?.Email || undefined,
785
+ organization: link.Link.OwnedBy?.Organization || undefined,
786
+ },
783
787
  };
784
788
 
785
789
  const baseCryptoNodeMetadata = {
@@ -1,6 +1,13 @@
1
1
  import { c } from 'ttag';
2
2
 
3
- import { DriveCrypto, PrivateKey, PublicKey, SessionKey, VERIFICATION_STATUS } from '../../crypto';
3
+ import {
4
+ base64StringToUint8Array,
5
+ DriveCrypto,
6
+ PrivateKey,
7
+ PublicKey,
8
+ SessionKey,
9
+ VERIFICATION_STATUS,
10
+ } from '../../crypto';
4
11
  import {
5
12
  resultOk,
6
13
  resultError,
@@ -201,7 +208,9 @@ export class NodesCryptoService {
201
208
  let activeRevision: Result<DecryptedUnparsedRevision, Error> | undefined;
202
209
  let contentKeyPacketSessionKey;
203
210
  let contentKeyPacketAuthor;
211
+ let contentKeyPacket: Uint8Array<ArrayBuffer> | undefined;
204
212
  if ('file' in node.encryptedCrypto) {
213
+ contentKeyPacket = base64StringToUint8Array(node.encryptedCrypto.file.base64ContentKeyPacket);
205
214
  const [activeRevisionPromise, contentKeyPacketSessionKeyPromise] = [
206
215
  this.decryptRevision(node.uid, node.encryptedCrypto.activeRevision, key),
207
216
  this.decryptContentKeyPacket(node, node.encryptedCrypto, key, keyVerificationKeys),
@@ -284,6 +293,7 @@ export class NodesCryptoService {
284
293
  passphrase,
285
294
  key,
286
295
  passphraseSessionKey,
296
+ contentKeyPacket,
287
297
  contentKeyPacketSessionKey,
288
298
  hashKey,
289
299
  },
@@ -51,19 +51,15 @@ describe('extended attrbiutes', () => {
51
51
  });
52
52
 
53
53
  describe('should generate file attributes without additional metadata', () => {
54
- const testCases: [object, string | undefined][] = [
55
- [{}, undefined],
54
+ const testCases: [any, string | undefined][] = [
56
55
  [
57
- { modificationTime: new Date(1234567890000) },
58
- '{"Common":{"ModificationTime":"2009-02-13T23:31:30.000Z"}}',
56
+ { size: 0, blockSizes: [], digests: { sha1: 'abcdef' } },
57
+ '{"Common":{"Size":0,"BlockSizes":[],"Digests":{"SHA1":"abcdef"}}}',
58
+ ],
59
+ [
60
+ { size: 1234, blockSizes: [1200, 34], digests: { sha1: 'gedcba' } },
61
+ '{"Common":{"Size":1234,"BlockSizes":[1200,34],"Digests":{"SHA1":"gedcba"}}}',
59
62
  ],
60
- [{ size: undefined }, undefined],
61
- [{ size: 0 }, '{"Common":{"Size":0}}'],
62
- [{ size: 1234 }, '{"Common":{"Size":1234}}'],
63
- [{ blockSizes: [] }, undefined],
64
- [{ blockSizes: [4, 4, 4, 2] }, '{"Common":{"BlockSizes":[4,4,4,2]}}'],
65
- [{ digests: {} }, undefined],
66
- [{ digests: { sha1: 'abcdef' } }, '{"Common":{"Digests":{"SHA1":"abcdef"}}}'],
67
63
  [
68
64
  {
69
65
  modificationTime: new Date(1234567890000),
@@ -75,7 +71,7 @@ describe('extended attrbiutes', () => {
75
71
  ],
76
72
  ];
77
73
  testCases.forEach(([input, expectedAttributes]) => {
78
- it(`should generate ${input}`, () => {
74
+ it(`should generate ${JSON.stringify(input)}`, () => {
79
75
  const output = generateFileExtendedAttributes(input);
80
76
  expect(output).toBe(expectedAttributes);
81
77
  });
@@ -83,24 +79,28 @@ describe('extended attrbiutes', () => {
83
79
  });
84
80
 
85
81
  describe('should generate file attributes with additional metadata', () => {
86
- const testCases: [object, string | undefined][] = [
87
- [{}, '{"Media":{"Width":100,"Height":100}}'],
88
- [{ size: undefined }, '{"Media":{"Width":100,"Height":100}}'],
89
- [{ size: 123 }, '{"Common":{"Size":123},"Media":{"Width":100,"Height":100}}'],
90
- ];
91
- testCases.forEach(([input, expectedAttributes]) => {
92
- it(`should generate ${input}`, () => {
93
- const output = generateFileExtendedAttributes(input, { Media: { Width: 100, Height: 100 } });
94
- expect(output).toBe(expectedAttributes);
95
- });
82
+ const input = {
83
+ size: 1234,
84
+ blockSizes: [1200, 34],
85
+ digests: { sha1: 'abcdef' },
86
+ };
87
+
88
+ it(`should generate ${JSON.stringify(input)}`, () => {
89
+ const output = generateFileExtendedAttributes(input, { Media: { Width: 100, Height: 100 } });
90
+ expect(output).toBe(
91
+ '{"Common":{"Size":1234,"BlockSizes":[1200,34],"Digests":{"SHA1":"abcdef"}},"Media":{"Width":100,"Height":100}}',
92
+ );
96
93
  });
97
94
  });
98
95
 
99
96
  describe('should throw an error if additional metadata contains common attributes', () => {
100
97
  it('should throw an error', () => {
101
- expect(() => generateFileExtendedAttributes({ size: 123 }, { Common: { Hello: 'World' } })).toThrow(
102
- 'Common attributes are not allowed in additional metadata',
103
- );
98
+ expect(() =>
99
+ generateFileExtendedAttributes(
100
+ { size: 123, blockSizes: [], digests: { sha1: 'abcdef' } },
101
+ { Common: { Hello: 'World' } },
102
+ ),
103
+ ).toThrow('Common attributes are not allowed in additional metadata');
104
104
  });
105
105
  });
106
106
 
@@ -86,14 +86,14 @@ export function parseFolderExtendedAttributes(logger: Logger, extendedAttributes
86
86
  export function generateFileExtendedAttributes(
87
87
  common: {
88
88
  modificationTime?: Date;
89
- size?: number;
90
- blockSizes?: number[];
91
- digests?: {
92
- sha1?: string;
89
+ size: number;
90
+ blockSizes: number[];
91
+ digests: {
92
+ sha1: string;
93
93
  };
94
94
  },
95
95
  additionalMetadata?: object,
96
- ): string | undefined {
96
+ ): string {
97
97
  if (additionalMetadata && 'Common' in additionalMetadata) {
98
98
  throw new Error('Common attributes are not allowed in additional metadata');
99
99
  }
@@ -102,20 +102,11 @@ export function generateFileExtendedAttributes(
102
102
  if (common.modificationTime) {
103
103
  commonAttributes.ModificationTime = dateToIsoString(common.modificationTime);
104
104
  }
105
- if (common.size !== undefined) {
106
- commonAttributes.Size = common.size;
107
- }
108
- if (common.blockSizes?.length) {
109
- commonAttributes.BlockSizes = common.blockSizes;
110
- }
111
- if (common.digests?.sha1) {
112
- commonAttributes.Digests = {
113
- SHA1: common.digests.sha1,
114
- };
115
- }
116
- if (!Object.keys(commonAttributes).length && !additionalMetadata) {
117
- return undefined;
118
- }
105
+ commonAttributes.Size = common.size;
106
+ commonAttributes.BlockSizes = common.blockSizes;
107
+ commonAttributes.Digests = {
108
+ SHA1: common.digests.sha1,
109
+ };
119
110
  return JSON.stringify({
120
111
  ...(Object.keys(commonAttributes).length ? { Common: commonAttributes } : {}),
121
112
  ...(additionalMetadata ? { ...additionalMetadata } : {}),
@@ -47,6 +47,10 @@ interface BaseNode {
47
47
  inviteTime: Date;
48
48
  // TODO: acceptedBy: Author;
49
49
  };
50
+ ownedBy: {
51
+ email?: string;
52
+ organization?: string;
53
+ };
50
54
  }
51
55
 
52
56
  /**
@@ -156,6 +160,7 @@ export interface DecryptedNodeKeys {
156
160
  passphrase: string;
157
161
  key: PrivateKey;
158
162
  passphraseSessionKey: SessionKey;
163
+ contentKeyPacket?: Uint8Array<ArrayBuffer>;
159
164
  contentKeyPacketSessionKey?: SessionKey;
160
165
  hashKey?: Uint8Array<ArrayBuffer>;
161
166
  }