@protontech/drive-sdk 0.13.0 → 0.14.0

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 (86) hide show
  1. package/dist/interface/events.d.ts +1 -1
  2. package/dist/interface/telemetry.d.ts +9 -4
  3. package/dist/interface/telemetry.js +1 -0
  4. package/dist/interface/telemetry.js.map +1 -1
  5. package/dist/internal/apiService/driveTypes.d.ts +52 -0
  6. package/dist/internal/download/telemetry.js +6 -1
  7. package/dist/internal/download/telemetry.js.map +1 -1
  8. package/dist/internal/download/telemetry.test.js +5 -0
  9. package/dist/internal/download/telemetry.test.js.map +1 -1
  10. package/dist/internal/events/index.js +2 -2
  11. package/dist/internal/events/index.js.map +1 -1
  12. package/dist/internal/events/interface.d.ts +1 -1
  13. package/dist/internal/nodes/cryptoReporter.js +2 -2
  14. package/dist/internal/nodes/cryptoReporter.js.map +1 -1
  15. package/dist/internal/photos/addToAlbum.d.ts +6 -0
  16. package/dist/internal/photos/addToAlbum.js +1 -0
  17. package/dist/internal/photos/addToAlbum.js.map +1 -1
  18. package/dist/internal/photos/albumsManager.d.ts +4 -1
  19. package/dist/internal/photos/albumsManager.js +22 -2
  20. package/dist/internal/photos/albumsManager.js.map +1 -1
  21. package/dist/internal/photos/albumsManager.test.js +41 -1
  22. package/dist/internal/photos/albumsManager.test.js.map +1 -1
  23. package/dist/internal/photos/apiService.d.ts +1 -0
  24. package/dist/internal/photos/apiService.js +59 -5
  25. package/dist/internal/photos/apiService.js.map +1 -1
  26. package/dist/internal/photos/apiService.test.js +137 -0
  27. package/dist/internal/photos/apiService.test.js.map +1 -1
  28. package/dist/internal/photos/errors.d.ts +5 -0
  29. package/dist/internal/photos/errors.js +10 -1
  30. package/dist/internal/photos/errors.js.map +1 -1
  31. package/dist/internal/photos/index.js +1 -1
  32. package/dist/internal/photos/index.js.map +1 -1
  33. package/dist/internal/photos/photosManager.d.ts +1 -0
  34. package/dist/internal/photos/photosManager.js +42 -4
  35. package/dist/internal/photos/photosManager.js.map +1 -1
  36. package/dist/internal/photos/photosManager.test.js +35 -0
  37. package/dist/internal/photos/photosManager.test.js.map +1 -1
  38. package/dist/internal/photos/photosTransferPayloadBuilder.d.ts +1 -0
  39. package/dist/internal/photos/photosTransferPayloadBuilder.js +1 -0
  40. package/dist/internal/photos/photosTransferPayloadBuilder.js.map +1 -1
  41. package/dist/internal/sharing/apiService.js +1 -1
  42. package/dist/internal/sharing/apiService.js.map +1 -1
  43. package/dist/internal/upload/manager.js +3 -2
  44. package/dist/internal/upload/manager.js.map +1 -1
  45. package/dist/internal/upload/manager.test.js +1 -1
  46. package/dist/internal/upload/manager.test.js.map +1 -1
  47. package/dist/internal/upload/telemetry.js +4 -1
  48. package/dist/internal/upload/telemetry.js.map +1 -1
  49. package/dist/internal/upload/telemetry.test.js +6 -0
  50. package/dist/internal/upload/telemetry.test.js.map +1 -1
  51. package/dist/protonDrivePhotosClient.d.ts +4 -3
  52. package/dist/protonDrivePhotosClient.js +3 -3
  53. package/dist/protonDrivePhotosClient.js.map +1 -1
  54. package/dist/telemetry.d.ts +1 -0
  55. package/dist/telemetry.js +21 -0
  56. package/dist/telemetry.js.map +1 -1
  57. package/dist/telemetry.test.d.ts +1 -0
  58. package/dist/telemetry.test.js +37 -0
  59. package/dist/telemetry.test.js.map +1 -0
  60. package/package.json +1 -1
  61. package/src/interface/events.ts +1 -1
  62. package/src/interface/telemetry.ts +9 -4
  63. package/src/internal/apiService/driveTypes.ts +52 -0
  64. package/src/internal/download/telemetry.test.ts +5 -0
  65. package/src/internal/download/telemetry.ts +7 -3
  66. package/src/internal/events/index.ts +2 -2
  67. package/src/internal/events/interface.ts +1 -1
  68. package/src/internal/nodes/cryptoReporter.ts +4 -2
  69. package/src/internal/photos/addToAlbum.ts +1 -1
  70. package/src/internal/photos/albumsManager.test.ts +61 -1
  71. package/src/internal/photos/albumsManager.ts +23 -3
  72. package/src/internal/photos/apiService.test.ts +155 -0
  73. package/src/internal/photos/apiService.ts +92 -3
  74. package/src/internal/photos/errors.ts +11 -0
  75. package/src/internal/photos/index.ts +1 -1
  76. package/src/internal/photos/photosManager.test.ts +43 -1
  77. package/src/internal/photos/photosManager.ts +61 -3
  78. package/src/internal/photos/photosTransferPayloadBuilder.ts +3 -1
  79. package/src/internal/sharing/apiService.ts +5 -5
  80. package/src/internal/upload/manager.test.ts +1 -1
  81. package/src/internal/upload/manager.ts +3 -2
  82. package/src/internal/upload/telemetry.test.ts +6 -0
  83. package/src/internal/upload/telemetry.ts +5 -3
  84. package/src/protonDrivePhotosClient.ts +4 -4
  85. package/src/telemetry.test.ts +40 -0
  86. package/src/telemetry.ts +22 -0
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":";;;AAmWA,kDAoBC;AA7WD,IAAY,QAKX;AALD,WAAY,QAAQ;IAChB,2BAAe,CAAA;IACf,yBAAa,CAAA;IACb,+BAAmB,CAAA;IACnB,2BAAe,CAAA;AACnB,CAAC,EALW,QAAQ,wBAAR,QAAQ,QAKnB;AAuBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAa,SAAS;IACV,SAAS,CAAY;IACrB,WAAW,CAAe;IAC1B,cAAc,CAAqB;IAE3C,YAAY,OAAoG;QAC5G,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,SAAS,EAAE,CAAC;QACvD,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,SAAS,CAAC,IAAY;QAClB,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9D,CAAC;IAED,YAAY,CAAC,KAAQ;QACjB,MAAM,MAAM,GAAG;YACX,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,KAAK;SACR,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,CAAC;CACJ;AAtBD,8BAsBC;AAED;;;;;GAKG;AACH,MAAM,MAAM;IAEI;IACA;IACA;IAHZ,YACY,IAAY,EACZ,MAAiB,EACjB,QAAsB;QAFtB,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAW;QACjB,aAAQ,GAAR,QAAQ,CAAc;QAE9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,OAAe;QACjB,IAAI,CAAC,GAAG,CAAC;YACL,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,UAAU,EAAE,IAAI,CAAC,IAAI;YACrB,OAAO;SACV,CAAC,CAAC;IACP,CAAC;IAED,IAAI,CAAC,OAAe;QAChB,IAAI,CAAC,GAAG,CAAC;YACL,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,KAAK,EAAE,QAAQ,CAAC,IAAI;YACpB,UAAU,EAAE,IAAI,CAAC,IAAI;YACrB,OAAO;SACV,CAAC,CAAC;IACP,CAAC;IAED,IAAI,CAAC,OAAe;QAChB,IAAI,CAAC,GAAG,CAAC;YACL,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,KAAK,EAAE,QAAQ,CAAC,OAAO;YACvB,UAAU,EAAE,IAAI,CAAC,IAAI;YACrB,OAAO;SACV,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,KAAe;QAClC,IAAI,CAAC,GAAG,CAAC;YACL,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,UAAU,EAAE,IAAI,CAAC,IAAI;YACrB,OAAO;YACP,KAAK;SACR,CAAC,CAAC;IACP,CAAC;IAEO,GAAG,CAAC,GAAc;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO;QACX,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;CACJ;AAED;;;;;;;;;;GAUG;AACH,MAAa,gBAAgB;IAEb;IACA;IAFZ,YACY,MAAuB,EACvB,MAAc;QADd,WAAM,GAAN,MAAM,CAAiB;QACvB,WAAM,GAAN,MAAM,CAAQ;QAEtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,OAAe;QAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,OAAe;QACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,CAAC,OAAe;QAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,KAAe;QAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;CACJ;AAxBD,4CAwBC;AAED;;;;;;GAMG;AACH,MAAa,SAAS;IACV,WAAW,GAAG;QAClB,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,CAAC;QACP,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,CAAC;KACX,CAAC;IAEM,WAAW,CAAS;IACpB,YAAY,CAAmC;IAEvD,YAAY,OAAuF;QAC/F,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3E,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW,CAClC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;YACrE,UAAU;YACV,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;SAC1B,CAAC,CACL,CAAC;IACN,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAc;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAnCD,8BAmCC;AAED;;;;GAIG;AACH,MAAa,iBAAiB;IAClB,WAAW,GAAG;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,iCAAiC;QACvD,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,iCAAiC;QACrD,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,iCAAiC;QACxD,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,iCAAiC;KAC1D,CAAC;IAEM,SAAS,CAAe;IAEhC,YAAY,SAAwB;QAChC,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,iBAAiB,EAAE,CAAC;IAC1D,CAAC;IAED,GAAG,CAAC,GAAc;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;CACJ;AAlBD,8CAkBC;AAED;;;;;;;;GAQG;AACH,MAAa,gBAAgB;IAOb;IANJ,IAAI,GAAa,EAAE,CAAC;IAEpB,SAAS,CAAe;IAEhC,YACI,SAAwB,EAChB,UAAU,KAAK;QAAf,YAAO,GAAP,OAAO,CAAQ;QAEvB,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACrD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,GAAc;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAExB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;IACL,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,KAAK;QACD,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC;CACJ;AA7BD,4CA6BC;AAED;;;;GAIG;AACH,MAAa,gBAAgB;IACzB,MAAM,CAAC,GAAc;QACjB,IAAI,GAAG,CAAC,KAAK,YAAY,KAAK,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,SAAS,CAAC;gBAClB,GAAG,GAAG;gBACN,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO;gBACxB,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK;aACzB,CAAC,CAAC;QACP,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;CACJ;AAXD,4CAWC;AAED;;;;GAIG;AACH,MAAa,iBAAiB;IAC1B,MAAM,CAAC,GAAc;QACjB,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,YAAY;gBACR,GAAG,CAAC,KAAK,YAAY,KAAK;oBACtB,CAAC,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,OAAO,aAAa,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE;oBAC7D,CAAC,CAAC,YAAY,GAAG,CAAC,KAAK,EAAE,CAAC;QACtC,CAAC;QACD,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,OAAO,GAAG,YAAY,EAAE,CAAC;IACtG,CAAC;CACJ;AAXD,8CAWC;AAED,MAAM,oBAAoB;IACtB,OAAO,CAAC,MAAuB;QAC3B,sCAAsC;QACtC,OAAO,CAAC,IAAI,CACR,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CACjI,CAAC;IACN,CAAC;CACJ;AAED,SAAgB,mBAAmB,CAAC,IAAY;IAC5C,6DAA6D;IAC7D,oEAAoE;IACpE,sEAAsE;IACtE,gEAAgE;IAChE,qDAAqD;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,QAAQ;IAEnC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACb,OAAO,CAAC,CAAC;IACb,CAAC;IACD,wEAAwE;IACxE,4DAA4D;IAC5D,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,IAAI,GAAG,SAAS,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;AACpD,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const telemetry_1 = require("./telemetry");
4
+ describe('reduceSizePrecision', () => {
5
+ it('returns 0 for size 0', () => {
6
+ expect((0, telemetry_1.reduceSizePrecision)(0)).toBe(0);
7
+ });
8
+ it('returns 4095 for very small files (size < 4096)', () => {
9
+ expect((0, telemetry_1.reduceSizePrecision)(1)).toBe(4095);
10
+ expect((0, telemetry_1.reduceSizePrecision)(100)).toBe(4095);
11
+ expect((0, telemetry_1.reduceSizePrecision)(4095)).toBe(4095);
12
+ });
13
+ it('returns precision (100_000) for sizes from 4096 to below precision', () => {
14
+ expect((0, telemetry_1.reduceSizePrecision)(4096)).toBe(100_000);
15
+ expect((0, telemetry_1.reduceSizePrecision)(50_000)).toBe(100_000);
16
+ expect((0, telemetry_1.reduceSizePrecision)(99_999)).toBe(100_000);
17
+ });
18
+ it('returns size unchanged when size equals precision', () => {
19
+ expect((0, telemetry_1.reduceSizePrecision)(100_000)).toBe(100_000);
20
+ });
21
+ it('rounds down to nearest 100_000 for sizes above precision', () => {
22
+ expect((0, telemetry_1.reduceSizePrecision)(100_001)).toBe(100_000);
23
+ expect((0, telemetry_1.reduceSizePrecision)(150_000)).toBe(100_000);
24
+ expect((0, telemetry_1.reduceSizePrecision)(199_999)).toBe(100_000);
25
+ expect((0, telemetry_1.reduceSizePrecision)(200_000)).toBe(200_000);
26
+ expect((0, telemetry_1.reduceSizePrecision)(250_000)).toBe(200_000);
27
+ expect((0, telemetry_1.reduceSizePrecision)(299_999)).toBe(200_000);
28
+ expect((0, telemetry_1.reduceSizePrecision)(300_000)).toBe(300_000);
29
+ });
30
+ it('handles large sizes', () => {
31
+ expect((0, telemetry_1.reduceSizePrecision)(1_000_000)).toBe(1_000_000);
32
+ expect((0, telemetry_1.reduceSizePrecision)(1_500_000)).toBe(1_500_000);
33
+ expect((0, telemetry_1.reduceSizePrecision)(1_999_999)).toBe(1_900_000);
34
+ expect((0, telemetry_1.reduceSizePrecision)(10_000_000)).toBe(10_000_000);
35
+ });
36
+ });
37
+ //# sourceMappingURL=telemetry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../src/telemetry.test.ts"],"names":[],"mappings":";;AAAA,2CAAkD;AAElD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,IAAA,+BAAmB,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,IAAA,+BAAmB,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAA,+BAAmB,EAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAA,+BAAmB,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,IAAA,+BAAmB,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,CAAC,IAAA,+BAAmB,EAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,IAAA,+BAAmB,EAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,IAAA,+BAAmB,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,IAAA,+BAAmB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,IAAA,+BAAmB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,IAAA,+BAAmB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,IAAA,+BAAmB,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@protontech/drive-sdk",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "Proton Drive SDK",
5
5
  "license": "GPL-3.0",
6
6
  "main": "dist/index.js",
@@ -6,7 +6,7 @@ export enum SDKEvent {
6
6
  }
7
7
 
8
8
  export interface LatestEventIdProvider {
9
- getLatestEventId(treeEventScopeId: string): string | null;
9
+ getLatestEventId(treeEventScopeId: string): Promise<string | null>;
10
10
  }
11
11
 
12
12
  /**
@@ -34,9 +34,11 @@ export interface MetricDebounceLongWaitEvent {
34
34
 
35
35
  export interface MetricUploadEvent {
36
36
  eventName: 'upload';
37
- volumeType?: MetricVolumeType;
37
+ volumeType: MetricVolumeType;
38
38
  uploadedSize: number;
39
+ approximateUploadedSize: number;
39
40
  expectedSize: number;
41
+ approximateExpectedSize: number;
40
42
  error?: MetricsUploadErrorType;
41
43
  originalError?: unknown;
42
44
  }
@@ -50,9 +52,11 @@ export type MetricsUploadErrorType =
50
52
 
51
53
  export interface MetricDownloadEvent {
52
54
  eventName: 'download';
53
- volumeType?: MetricVolumeType;
55
+ volumeType: MetricVolumeType;
54
56
  downloadedSize: number;
57
+ approximateDownloadedSize: number;
55
58
  claimedFileSize?: number;
59
+ approximateClaimedFileSize?: number;
56
60
  error?: MetricsDownloadErrorType;
57
61
  originalError?: unknown;
58
62
  }
@@ -67,7 +71,7 @@ export type MetricsDownloadErrorType =
67
71
 
68
72
  export interface MetricDecryptionErrorEvent {
69
73
  eventName: 'decryptionError';
70
- volumeType?: MetricVolumeType;
74
+ volumeType: MetricVolumeType;
71
75
  field: MetricsDecryptionErrorField;
72
76
  fromBefore2024?: boolean;
73
77
  error?: unknown;
@@ -85,7 +89,7 @@ export type MetricsDecryptionErrorField =
85
89
 
86
90
  export interface MetricVerificationErrorEvent {
87
91
  eventName: 'verificationError';
88
- volumeType?: MetricVolumeType;
92
+ volumeType: MetricVolumeType;
89
93
  field: MetricVerificationErrorField;
90
94
  addressMatchingDefaultShare?: boolean;
91
95
  fromBefore2024?: boolean;
@@ -114,6 +118,7 @@ export interface MetricVolumeEventsSubscriptionsChangedEvent {
114
118
  }
115
119
 
116
120
  export enum MetricVolumeType {
121
+ Unknown = 'unknown',
117
122
  OwnVolume = 'own_volume',
118
123
  OwnPhotoVolume = 'own_photo_volume',
119
124
  Shared = 'shared',
@@ -2644,6 +2644,26 @@ export interface paths {
2644
2644
  patch?: never;
2645
2645
  trace?: never;
2646
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
+ };
2647
2667
  "/drive/shares/{shareID}/owner": {
2648
2668
  parameters: {
2649
2669
  query?: never;
@@ -2676,6 +2696,7 @@ export interface paths {
2676
2696
  put?: never;
2677
2697
  /**
2678
2698
  * Update properties of a share
2699
+ * @deprecated
2679
2700
  * @description Update the values on one or more properties of the Share. For now, only allowed changing editorsCanShare attribute
2680
2701
  */
2681
2702
  post: operations["post_drive-shares-{shareID}-property"];
@@ -6390,6 +6411,10 @@ export interface components {
6390
6411
  */
6391
6412
  Code: 1000;
6392
6413
  };
6414
+ UpdateShareEditorsCanShareRequestDto: {
6415
+ /** @description Indicates if editor members of this share could reshare it or not */
6416
+ Value: boolean;
6417
+ };
6393
6418
  TransferInput: {
6394
6419
  /** @description The ID of the new address */
6395
6420
  AddressID: string;
@@ -12354,6 +12379,33 @@ export interface operations {
12354
12379
  };
12355
12380
  };
12356
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
+ };
12357
12409
  "post_drive-shares-{shareID}-owner": {
12358
12410
  parameters: {
12359
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
- import { ProtonDriveTelemetry, MetricsDownloadErrorType, Logger } from '../../interface';
3
- import { LoggerWithPrefix } from '../../telemetry';
2
+ import { ProtonDriveTelemetry, MetricsDownloadErrorType, Logger, MetricVolumeType } from '../../interface';
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';
@@ -73,7 +73,7 @@ export class DownloadTelemetry {
73
73
  originalError?: unknown;
74
74
  },
75
75
  ) {
76
- let volumeType;
76
+ let volumeType = MetricVolumeType.Unknown;
77
77
  try {
78
78
  volumeType = await this.sharesService.getVolumeMetricContext(volumeId);
79
79
  } catch (error: unknown) {
@@ -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
  /**
@@ -8,6 +8,7 @@ import {
8
8
  Logger,
9
9
  MetricsDecryptionErrorField,
10
10
  MetricVerificationErrorField,
11
+ MetricVolumeType,
11
12
  } from '../../interface';
12
13
  import { getVerificationMessage, isNotApplicationError } from '../errors';
13
14
  import { splitNodeUid } from '../uids';
@@ -63,7 +64,8 @@ export class NodesCryptoReporter {
63
64
 
64
65
  const fromBefore2024 = node.creationTime < new Date('2024-01-01');
65
66
 
66
- let addressMatchingDefaultShare, volumeType;
67
+ let addressMatchingDefaultShare,
68
+ volumeType = MetricVolumeType.Unknown;
67
69
  try {
68
70
  const { volumeId } = splitNodeUid(node.uid);
69
71
  const { email } = await this.shareService.getMyFilesShareMemberEmailKey();
@@ -99,7 +101,7 @@ export class NodesCryptoReporter {
99
101
 
100
102
  const fromBefore2024 = node.creationTime < new Date('2024-01-01');
101
103
 
102
- let volumeType;
104
+ let volumeType = MetricVolumeType.Unknown;
103
105
  try {
104
106
  const { volumeId } = splitNodeUid(node.uid);
105
107
  volumeType = await this.shareService.getVolumeMetricContext(volumeId);
@@ -211,7 +211,7 @@ function splitByVolume(
211
211
  * Groups payloads into batches respecting the API limit.
212
212
  * Each payload's size counts itself plus its related photos.
213
213
  */
214
- function* createBatches(payloads: TransferEncryptedPhotoPayload[]): Generator<TransferEncryptedPhotoPayload[]> {
214
+ export function* createBatches(payloads: TransferEncryptedPhotoPayload[]): Generator<TransferEncryptedPhotoPayload[]> {
215
215
  let batch: TransferEncryptedPhotoPayload[] = [];
216
216
  let batchSize = 0;
217
217
 
@@ -4,8 +4,10 @@ import { getMockTelemetry } from '../../tests/telemetry';
4
4
  import { AlbumsManager } from './albumsManager';
5
5
  import { AlbumsCryptoService } from './albumsCrypto';
6
6
  import { PhotosAPIService } from './apiService';
7
+ import { AlbumContainsPhotosNotInTimelineError } from './errors';
7
8
  import { DecryptedPhotoNode } from './interface';
8
9
  import { PhotosNodesAccess } from './nodes';
10
+ import { PhotosManager } from './photosManager';
9
11
  import { PhotoSharesManager } from './shares';
10
12
 
11
13
  describe('Albums', () => {
@@ -13,6 +15,7 @@ describe('Albums', () => {
13
15
  let cryptoService: AlbumsCryptoService;
14
16
  let photoShares: PhotoSharesManager;
15
17
  let nodesService: PhotosNodesAccess;
18
+ let photosService: PhotosManager;
16
19
  let albums: AlbumsManager;
17
20
 
18
21
  let nodes: { [uid: string]: DecryptedPhotoNode };
@@ -97,7 +100,19 @@ describe('Albums', () => {
97
100
  notifyChildCreated: jest.fn(),
98
101
  };
99
102
 
100
- albums = new AlbumsManager(getMockTelemetry(), apiService, cryptoService, photoShares, nodesService);
103
+ // @ts-expect-error No need to implement all methods for mocking
104
+ photosService = {
105
+ saveToTimeline: jest.fn(),
106
+ };
107
+
108
+ albums = new AlbumsManager(
109
+ getMockTelemetry(),
110
+ apiService,
111
+ cryptoService,
112
+ photoShares,
113
+ nodesService,
114
+ photosService,
115
+ );
101
116
  });
102
117
 
103
118
  describe('createAlbum', () => {
@@ -231,6 +246,51 @@ describe('Albums', () => {
231
246
  expect(apiService.deleteAlbum).toHaveBeenCalledWith('albumNodeUid', { force: true });
232
247
  expect(nodesService.notifyNodeDeleted).toHaveBeenCalledWith('albumNodeUid');
233
248
  });
249
+
250
+ it('when saveToTimeline is true, saves photos then retries delete', async () => {
251
+ const notInTimelineError = new AlbumContainsPhotosNotInTimelineError('msg', 1, ['p1', 'p2']);
252
+ (apiService.deleteAlbum as jest.Mock)
253
+ .mockRejectedValueOnce(notInTimelineError)
254
+ .mockResolvedValueOnce(undefined);
255
+
256
+ photosService.saveToTimeline = jest.fn().mockImplementation(async function* () {
257
+ yield { uid: 'p1', ok: true };
258
+ yield { uid: 'p2', ok: true };
259
+ });
260
+
261
+ await albums.deleteAlbum('albumNodeUid', { saveToTimeline: true });
262
+
263
+ expect(apiService.deleteAlbum).toHaveBeenCalledTimes(2);
264
+ expect(photosService.saveToTimeline).toHaveBeenCalledWith(['p1', 'p2']);
265
+ expect(nodesService.notifyNodeDeleted).toHaveBeenCalledTimes(1);
266
+ expect(nodesService.notifyNodeDeleted).toHaveBeenCalledWith('albumNodeUid');
267
+ });
268
+
269
+ it('throws AlbumContainsPhotosNotInTimelineError when saveToTimeline is false', async () => {
270
+ const notInTimelineError = new AlbumContainsPhotosNotInTimelineError('msg', 1, ['p1']);
271
+ (apiService.deleteAlbum as jest.Mock).mockRejectedValueOnce(notInTimelineError);
272
+
273
+ await expect(albums.deleteAlbum('albumNodeUid')).rejects.toBe(notInTimelineError);
274
+
275
+ expect(apiService.deleteAlbum).toHaveBeenCalledTimes(1);
276
+ expect(photosService.saveToTimeline).not.toHaveBeenCalled();
277
+ expect(nodesService.notifyNodeDeleted).not.toHaveBeenCalled();
278
+ });
279
+
280
+ it('throws when saveToTimeline step fails with error', async () => {
281
+ const notInTimelineError = new AlbumContainsPhotosNotInTimelineError('msg', 1, ['p1']);
282
+ (apiService.deleteAlbum as jest.Mock).mockRejectedValue(notInTimelineError);
283
+
284
+ const saveError = new Error('save failed');
285
+ photosService.saveToTimeline = jest.fn().mockImplementation(async function* () {
286
+ yield { uid: 'p1', ok: false, error: saveError };
287
+ });
288
+
289
+ await expect(albums.deleteAlbum('albumNodeUid', { saveToTimeline: true })).rejects.toBe(saveError);
290
+
291
+ expect(apiService.deleteAlbum).toHaveBeenCalledTimes(1);
292
+ expect(nodesService.notifyNodeDeleted).not.toHaveBeenCalled();
293
+ });
234
294
  });
235
295
 
236
296
  describe('removePhotos', () => {
@@ -7,8 +7,10 @@ import { splitNodeUid } from '../uids';
7
7
  import { AddToAlbumProcess } from './addToAlbum';
8
8
  import { AlbumsCryptoService } from './albumsCrypto';
9
9
  import { PhotosAPIService } from './apiService';
10
+ import { AlbumContainsPhotosNotInTimelineError } from './errors';
10
11
  import { AlbumItem, DecryptedPhotoNode } from './interface';
11
12
  import { PhotosNodesAccess } from './nodes';
13
+ import { PhotosManager } from './photosManager';
12
14
  import { PhotoSharesManager } from './shares';
13
15
 
14
16
  const BATCH_LOADING_SIZE = 10;
@@ -25,6 +27,7 @@ export class AlbumsManager {
25
27
  private cryptoService: AlbumsCryptoService,
26
28
  private photoShares: PhotoSharesManager,
27
29
  private nodesService: PhotosNodesAccess,
30
+ private photos: PhotosManager,
28
31
  ) {
29
32
  this.logger = telemetry.getLogger('albums');
30
33
  this.apiService = apiService;
@@ -157,8 +160,25 @@ export class AlbumsManager {
157
160
  return newNode;
158
161
  }
159
162
 
160
- async deleteAlbum(nodeUid: string, options: { force?: boolean } = {}): Promise<void> {
161
- await this.apiService.deleteAlbum(nodeUid, options);
163
+ async deleteAlbum(nodeUid: string, options: { force?: boolean; saveToTimeline?: boolean } = {}): Promise<void> {
164
+ try {
165
+ await this.apiService.deleteAlbum(nodeUid, options);
166
+ } catch (error) {
167
+ if (
168
+ options.saveToTimeline &&
169
+ error instanceof AlbumContainsPhotosNotInTimelineError &&
170
+ error.photosOnlyInAlbumNodeUids.length > 0
171
+ ) {
172
+ for await (const result of this.photos.saveToTimeline(error.photosOnlyInAlbumNodeUids)) {
173
+ if (!result.ok) {
174
+ throw result.error;
175
+ }
176
+ }
177
+ await this.apiService.deleteAlbum(nodeUid, options);
178
+ } else {
179
+ throw error;
180
+ }
181
+ }
162
182
  await this.nodesService.notifyNodeDeleted(nodeUid);
163
183
  }
164
184
 
@@ -183,7 +203,7 @@ export class AlbumsManager {
183
203
  this.logger,
184
204
  signal,
185
205
  );
186
- yield * process.execute(photoNodeUids);
206
+ yield* process.execute(photoNodeUids);
187
207
  }
188
208
 
189
209
  async *removePhotos(