@protontech/drive-sdk 0.1.0 → 0.1.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 (447) hide show
  1. package/dist/cache/memoryCache.js +0 -1
  2. package/dist/cache/memoryCache.js.map +1 -1
  3. package/dist/cache/memoryCache.test.js +2 -4
  4. package/dist/cache/memoryCache.test.js.map +1 -1
  5. package/dist/cache/nullCache.js +0 -1
  6. package/dist/cache/nullCache.js.map +1 -1
  7. package/dist/crypto/driveCrypto.d.ts +2 -5
  8. package/dist/crypto/driveCrypto.js +7 -12
  9. package/dist/crypto/driveCrypto.js.map +1 -1
  10. package/dist/crypto/driveCrypto.test.js +14 -14
  11. package/dist/crypto/openPGPCrypto.js +3 -3
  12. package/dist/crypto/openPGPCrypto.js.map +1 -1
  13. package/dist/diagnostic/eventsGenerator.js +1 -1
  14. package/dist/diagnostic/eventsGenerator.js.map +1 -1
  15. package/dist/diagnostic/httpClient.d.ts +1 -1
  16. package/dist/diagnostic/httpClient.js.map +1 -1
  17. package/dist/diagnostic/index.d.ts +3 -3
  18. package/dist/diagnostic/index.js.map +1 -1
  19. package/dist/diagnostic/integrityVerificationStream.js +1 -1
  20. package/dist/diagnostic/integrityVerificationStream.js.map +1 -1
  21. package/dist/diagnostic/interface.d.ts +2 -2
  22. package/dist/diagnostic/sdkDiagnostic.d.ts +3 -3
  23. package/dist/diagnostic/sdkDiagnostic.js +8 -2
  24. package/dist/diagnostic/sdkDiagnostic.js.map +1 -1
  25. package/dist/diagnostic/sdkDiagnosticFull.d.ts +4 -4
  26. package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -1
  27. package/dist/diagnostic/telemetry.js.map +1 -1
  28. package/dist/diagnostic/zipGenerators.js +2 -2
  29. package/dist/diagnostic/zipGenerators.js.map +1 -1
  30. package/dist/diagnostic/zipGenerators.test.js +1 -1
  31. package/dist/diagnostic/zipGenerators.test.js.map +1 -1
  32. package/dist/interface/events.d.ts +2 -4
  33. package/dist/interface/events.js.map +1 -1
  34. package/dist/interface/index.d.ts +5 -5
  35. package/dist/interface/index.js +0 -1
  36. package/dist/interface/index.js.map +1 -1
  37. package/dist/interface/result.js.map +1 -1
  38. package/dist/interface/sharing.d.ts +1 -0
  39. package/dist/interface/sharing.js.map +1 -1
  40. package/dist/interface/telemetry.js +0 -8
  41. package/dist/interface/telemetry.js.map +1 -1
  42. package/dist/interface/thumbnail.js.map +1 -1
  43. package/dist/interface/upload.d.ts +1 -1
  44. package/dist/internal/apiService/apiService.d.ts +1 -1
  45. package/dist/internal/apiService/apiService.js +7 -11
  46. package/dist/internal/apiService/apiService.js.map +1 -1
  47. package/dist/internal/apiService/apiService.test.js +55 -48
  48. package/dist/internal/apiService/apiService.test.js.map +1 -1
  49. package/dist/internal/apiService/coreTypes.d.ts +2356 -2356
  50. package/dist/internal/apiService/driveTypes.d.ts +1680 -1680
  51. package/dist/internal/apiService/errors.js +14 -8
  52. package/dist/internal/apiService/errors.js.map +1 -1
  53. package/dist/internal/apiService/errors.test.js +17 -12
  54. package/dist/internal/apiService/errors.test.js.map +1 -1
  55. package/dist/internal/apiService/transformers.d.ts +1 -1
  56. package/dist/internal/apiService/transformers.js +1 -1
  57. package/dist/internal/asyncIteratorMap.test.js +2 -2
  58. package/dist/internal/asyncIteratorMap.test.js.map +1 -1
  59. package/dist/internal/asyncIteratorRace.d.ts +13 -0
  60. package/dist/internal/asyncIteratorRace.js +59 -0
  61. package/dist/internal/asyncIteratorRace.js.map +1 -0
  62. package/dist/internal/asyncIteratorRace.test.d.ts +1 -0
  63. package/dist/internal/asyncIteratorRace.test.js +119 -0
  64. package/dist/internal/asyncIteratorRace.test.js.map +1 -0
  65. package/dist/internal/batch.d.ts +1 -0
  66. package/dist/internal/batch.js +12 -0
  67. package/dist/internal/batch.js.map +1 -0
  68. package/dist/internal/batch.test.d.ts +1 -0
  69. package/dist/internal/batch.test.js +41 -0
  70. package/dist/internal/batch.test.js.map +1 -0
  71. package/dist/internal/batchLoading.js.map +1 -1
  72. package/dist/internal/batchLoading.test.js +13 -13
  73. package/dist/internal/batchLoading.test.js.map +1 -1
  74. package/dist/internal/devices/apiService.d.ts +3 -3
  75. package/dist/internal/devices/apiService.js +2 -2
  76. package/dist/internal/devices/apiService.js.map +1 -1
  77. package/dist/internal/devices/cryptoService.js +1 -2
  78. package/dist/internal/devices/cryptoService.js.map +1 -1
  79. package/dist/internal/devices/index.d.ts +5 -5
  80. package/dist/internal/devices/index.js.map +1 -1
  81. package/dist/internal/devices/interface.d.ts +3 -3
  82. package/dist/internal/devices/manager.js +2 -2
  83. package/dist/internal/devices/manager.js.map +1 -1
  84. package/dist/internal/devices/manager.test.js +38 -7
  85. package/dist/internal/devices/manager.test.js.map +1 -1
  86. package/dist/internal/download/apiService.d.ts +4 -4
  87. package/dist/internal/download/apiService.js +0 -1
  88. package/dist/internal/download/apiService.js.map +1 -1
  89. package/dist/internal/download/cryptoService.d.ts +4 -4
  90. package/dist/internal/download/cryptoService.js +6 -5
  91. package/dist/internal/download/cryptoService.js.map +1 -1
  92. package/dist/internal/download/fileDownloader.d.ts +4 -4
  93. package/dist/internal/download/fileDownloader.js +3 -2
  94. package/dist/internal/download/fileDownloader.js.map +1 -1
  95. package/dist/internal/download/fileDownloader.test.js +1 -1
  96. package/dist/internal/download/fileDownloader.test.js.map +1 -1
  97. package/dist/internal/download/index.d.ts +5 -5
  98. package/dist/internal/download/index.js +5 -5
  99. package/dist/internal/download/index.js.map +1 -1
  100. package/dist/internal/download/interface.d.ts +3 -4
  101. package/dist/internal/download/telemetry.d.ts +3 -3
  102. package/dist/internal/download/telemetry.js +4 -2
  103. package/dist/internal/download/telemetry.js.map +1 -1
  104. package/dist/internal/download/telemetry.test.js +8 -8
  105. package/dist/internal/download/telemetry.test.js.map +1 -1
  106. package/dist/internal/download/thumbnailDownloader.d.ts +4 -4
  107. package/dist/internal/download/thumbnailDownloader.js +6 -6
  108. package/dist/internal/download/thumbnailDownloader.js.map +1 -1
  109. package/dist/internal/download/thumbnailDownloader.test.js.map +1 -1
  110. package/dist/internal/errors.d.ts +1 -1
  111. package/dist/internal/errors.js +1 -3
  112. package/dist/internal/errors.js.map +1 -1
  113. package/dist/internal/events/apiService.d.ts +2 -2
  114. package/dist/internal/events/apiService.js +9 -5
  115. package/dist/internal/events/apiService.js.map +1 -1
  116. package/dist/internal/events/coreEventManager.d.ts +3 -3
  117. package/dist/internal/events/coreEventManager.js.map +1 -1
  118. package/dist/internal/events/coreEventManager.test.js +14 -14
  119. package/dist/internal/events/eventManager.d.ts +1 -1
  120. package/dist/internal/events/eventManager.js +0 -1
  121. package/dist/internal/events/eventManager.js.map +1 -1
  122. package/dist/internal/events/eventManager.test.js +34 -25
  123. package/dist/internal/events/eventManager.test.js.map +1 -1
  124. package/dist/internal/events/index.d.ts +6 -6
  125. package/dist/internal/events/index.js.map +1 -1
  126. package/dist/internal/events/interface.d.ts +1 -1
  127. package/dist/internal/events/interface.js +0 -1
  128. package/dist/internal/events/interface.js.map +1 -1
  129. package/dist/internal/events/volumeEventManager.d.ts +3 -3
  130. package/dist/internal/events/volumeEventManager.js.map +1 -1
  131. package/dist/internal/events/volumeEventManager.test.js +55 -55
  132. package/dist/internal/events/volumeEventManager.test.js.map +1 -1
  133. package/dist/internal/nodes/apiService.d.ts +4 -3
  134. package/dist/internal/nodes/apiService.js +36 -15
  135. package/dist/internal/nodes/apiService.js.map +1 -1
  136. package/dist/internal/nodes/apiService.test.js +60 -41
  137. package/dist/internal/nodes/apiService.test.js.map +1 -1
  138. package/dist/internal/nodes/cache.d.ts +5 -5
  139. package/dist/internal/nodes/cache.js +14 -7
  140. package/dist/internal/nodes/cache.js.map +1 -1
  141. package/dist/internal/nodes/cache.test.js +31 -9
  142. package/dist/internal/nodes/cache.test.js.map +1 -1
  143. package/dist/internal/nodes/cryptoCache.d.ts +2 -2
  144. package/dist/internal/nodes/cryptoCache.js.map +1 -1
  145. package/dist/internal/nodes/cryptoCache.test.js +24 -4
  146. package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
  147. package/dist/internal/nodes/cryptoService.d.ts +3 -3
  148. package/dist/internal/nodes/cryptoService.js +11 -17
  149. package/dist/internal/nodes/cryptoService.js.map +1 -1
  150. package/dist/internal/nodes/cryptoService.test.js +320 -241
  151. package/dist/internal/nodes/cryptoService.test.js.map +1 -1
  152. package/dist/internal/nodes/events.d.ts +3 -3
  153. package/dist/internal/nodes/events.js.map +1 -1
  154. package/dist/internal/nodes/events.test.js +27 -21
  155. package/dist/internal/nodes/events.test.js.map +1 -1
  156. package/dist/internal/nodes/extendedAttributes.d.ts +1 -1
  157. package/dist/internal/nodes/extendedAttributes.js +3 -1
  158. package/dist/internal/nodes/extendedAttributes.js.map +1 -1
  159. package/dist/internal/nodes/extendedAttributes.test.js +7 -10
  160. package/dist/internal/nodes/extendedAttributes.test.js.map +1 -1
  161. package/dist/internal/nodes/index.d.ts +10 -10
  162. package/dist/internal/nodes/index.js.map +1 -1
  163. package/dist/internal/nodes/index.test.d.ts +1 -0
  164. package/dist/internal/nodes/index.test.js +106 -0
  165. package/dist/internal/nodes/index.test.js.map +1 -0
  166. package/dist/internal/nodes/interface.d.ts +2 -2
  167. package/dist/internal/nodes/nodesAccess.d.ts +7 -7
  168. package/dist/internal/nodes/nodesAccess.js +28 -16
  169. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  170. package/dist/internal/nodes/nodesAccess.test.js +39 -13
  171. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  172. package/dist/internal/nodes/nodesManagement.d.ts +6 -6
  173. package/dist/internal/nodes/nodesManagement.js +9 -7
  174. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  175. package/dist/internal/nodes/nodesManagement.test.js +9 -9
  176. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  177. package/dist/internal/nodes/nodesRevisions.d.ts +4 -4
  178. package/dist/internal/nodes/nodesRevisions.js.map +1 -1
  179. package/dist/internal/photos/albums.d.ts +3 -3
  180. package/dist/internal/photos/albums.js.map +1 -1
  181. package/dist/internal/photos/apiService.d.ts +1 -1
  182. package/dist/internal/photos/apiService.js +3 -6
  183. package/dist/internal/photos/apiService.js.map +1 -1
  184. package/dist/internal/photos/cache.d.ts +1 -1
  185. package/dist/internal/photos/index.d.ts +5 -5
  186. package/dist/internal/photos/index.js.map +1 -1
  187. package/dist/internal/photos/interface.d.ts +2 -2
  188. package/dist/internal/photos/photosTimeline.d.ts +3 -3
  189. package/dist/internal/photos/photosTimeline.js +1 -2
  190. package/dist/internal/photos/photosTimeline.js.map +1 -1
  191. package/dist/internal/sdkEvents.d.ts +1 -1
  192. package/dist/internal/sdkEvents.js +2 -7
  193. package/dist/internal/sdkEvents.js.map +1 -1
  194. package/dist/internal/sdkEvents.test.js +8 -8
  195. package/dist/internal/shares/apiService.d.ts +2 -2
  196. package/dist/internal/shares/apiService.js +5 -3
  197. package/dist/internal/shares/apiService.js.map +1 -1
  198. package/dist/internal/shares/cache.d.ts +2 -2
  199. package/dist/internal/shares/cache.js +12 -6
  200. package/dist/internal/shares/cache.js.map +1 -1
  201. package/dist/internal/shares/cache.test.js.map +1 -1
  202. package/dist/internal/shares/cryptoCache.d.ts +2 -2
  203. package/dist/internal/shares/cryptoCache.test.js +8 -2
  204. package/dist/internal/shares/cryptoCache.test.js.map +1 -1
  205. package/dist/internal/shares/cryptoService.d.ts +3 -3
  206. package/dist/internal/shares/cryptoService.js.map +1 -1
  207. package/dist/internal/shares/cryptoService.test.js +42 -42
  208. package/dist/internal/shares/cryptoService.test.js.map +1 -1
  209. package/dist/internal/shares/index.d.ts +4 -4
  210. package/dist/internal/shares/index.js.map +1 -1
  211. package/dist/internal/shares/interface.d.ts +2 -2
  212. package/dist/internal/shares/manager.d.ts +7 -7
  213. package/dist/internal/shares/manager.js.map +1 -1
  214. package/dist/internal/shares/manager.test.js +71 -63
  215. package/dist/internal/shares/manager.test.js.map +1 -1
  216. package/dist/internal/sharing/apiService.d.ts +4 -4
  217. package/dist/internal/sharing/apiService.js +4 -3
  218. package/dist/internal/sharing/apiService.js.map +1 -1
  219. package/dist/internal/sharing/cache.d.ts +1 -1
  220. package/dist/internal/sharing/cache.test.js +33 -33
  221. package/dist/internal/sharing/cryptoService.d.ts +3 -3
  222. package/dist/internal/sharing/cryptoService.js +3 -5
  223. package/dist/internal/sharing/cryptoService.js.map +1 -1
  224. package/dist/internal/sharing/cryptoService.test.js +39 -39
  225. package/dist/internal/sharing/cryptoService.test.js.map +1 -1
  226. package/dist/internal/sharing/events.d.ts +4 -4
  227. package/dist/internal/sharing/events.js +0 -1
  228. package/dist/internal/sharing/events.js.map +1 -1
  229. package/dist/internal/sharing/events.test.js +39 -40
  230. package/dist/internal/sharing/events.test.js.map +1 -1
  231. package/dist/internal/sharing/index.d.ts +6 -6
  232. package/dist/internal/sharing/index.js.map +1 -1
  233. package/dist/internal/sharing/interface.d.ts +5 -4
  234. package/dist/internal/sharing/sharingAccess.d.ts +6 -6
  235. package/dist/internal/sharing/sharingAccess.js +8 -4
  236. package/dist/internal/sharing/sharingAccess.js.map +1 -1
  237. package/dist/internal/sharing/sharingAccess.test.js +45 -39
  238. package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
  239. package/dist/internal/sharing/sharingManagement.d.ts +4 -4
  240. package/dist/internal/sharing/sharingManagement.js +5 -7
  241. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  242. package/dist/internal/sharing/sharingManagement.test.js +297 -248
  243. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  244. package/dist/internal/uids.js.map +1 -1
  245. package/dist/internal/upload/apiService.d.ts +3 -3
  246. package/dist/internal/upload/apiService.js +1 -1
  247. package/dist/internal/upload/apiService.js.map +1 -1
  248. package/dist/internal/upload/blockVerifier.d.ts +3 -3
  249. package/dist/internal/upload/blockVerifier.js +1 -1
  250. package/dist/internal/upload/blockVerifier.js.map +1 -1
  251. package/dist/internal/upload/chunkStreamReader.test.js +6 -6
  252. package/dist/internal/upload/cryptoService.d.ts +4 -4
  253. package/dist/internal/upload/cryptoService.js +4 -4
  254. package/dist/internal/upload/cryptoService.js.map +1 -1
  255. package/dist/internal/upload/digests.js.map +1 -1
  256. package/dist/internal/upload/fileUploader.d.ts +6 -6
  257. package/dist/internal/upload/fileUploader.js.map +1 -1
  258. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  259. package/dist/internal/upload/index.d.ts +5 -5
  260. package/dist/internal/upload/index.js.map +1 -1
  261. package/dist/internal/upload/interface.d.ts +3 -3
  262. package/dist/internal/upload/manager.d.ts +4 -4
  263. package/dist/internal/upload/manager.js +7 -5
  264. package/dist/internal/upload/manager.js.map +1 -1
  265. package/dist/internal/upload/manager.test.js +137 -123
  266. package/dist/internal/upload/manager.test.js.map +1 -1
  267. package/dist/internal/upload/streamUploader.d.ts +6 -6
  268. package/dist/internal/upload/streamUploader.js +8 -6
  269. package/dist/internal/upload/streamUploader.js.map +1 -1
  270. package/dist/internal/upload/streamUploader.test.js +16 -11
  271. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  272. package/dist/internal/upload/telemetry.d.ts +3 -3
  273. package/dist/internal/upload/telemetry.js +5 -3
  274. package/dist/internal/upload/telemetry.js.map +1 -1
  275. package/dist/internal/upload/telemetry.test.js +8 -8
  276. package/dist/internal/upload/telemetry.test.js.map +1 -1
  277. package/dist/protonDriveClient.d.ts +8 -8
  278. package/dist/protonDriveClient.js +12 -9
  279. package/dist/protonDriveClient.js.map +1 -1
  280. package/dist/protonDrivePhotosClient.js.map +1 -1
  281. package/dist/telemetry.js +18 -15
  282. package/dist/telemetry.js.map +1 -1
  283. package/dist/tests/logger.js.map +1 -1
  284. package/dist/tests/telemetry.d.ts +1 -1
  285. package/dist/transformers.js +4 -2
  286. package/dist/transformers.js.map +1 -1
  287. package/package.json +1 -1
  288. package/src/cache/interface.ts +22 -22
  289. package/src/cache/memoryCache.test.ts +7 -7
  290. package/src/cache/memoryCache.ts +4 -4
  291. package/src/cache/nullCache.ts +1 -1
  292. package/src/config.ts +5 -5
  293. package/src/crypto/driveCrypto.test.ts +15 -15
  294. package/src/crypto/driveCrypto.ts +120 -156
  295. package/src/crypto/hmac.ts +1 -1
  296. package/src/crypto/interface.ts +63 -72
  297. package/src/crypto/openPGPCrypto.ts +74 -94
  298. package/src/crypto/utils.ts +1 -1
  299. package/src/diagnostic/eventsGenerator.ts +2 -2
  300. package/src/diagnostic/httpClient.ts +6 -2
  301. package/src/diagnostic/index.ts +12 -10
  302. package/src/diagnostic/integrityVerificationStream.ts +3 -4
  303. package/src/diagnostic/interface.ts +81 -81
  304. package/src/diagnostic/sdkDiagnostic.ts +35 -24
  305. package/src/diagnostic/sdkDiagnosticFull.ts +16 -19
  306. package/src/diagnostic/telemetry.ts +4 -1
  307. package/src/diagnostic/zipGenerators.test.ts +1 -1
  308. package/src/diagnostic/zipGenerators.ts +3 -3
  309. package/src/errors.ts +21 -21
  310. package/src/index.ts +3 -3
  311. package/src/interface/account.ts +10 -10
  312. package/src/interface/author.ts +6 -6
  313. package/src/interface/config.ts +4 -4
  314. package/src/interface/devices.ts +6 -6
  315. package/src/interface/download.ts +12 -9
  316. package/src/interface/events.ts +45 -39
  317. package/src/interface/httpClient.ts +11 -11
  318. package/src/interface/index.ts +76 -19
  319. package/src/interface/nodes.ts +47 -49
  320. package/src/interface/result.ts +1 -3
  321. package/src/interface/sharing.ts +60 -57
  322. package/src/interface/telemetry.ts +74 -74
  323. package/src/interface/thumbnail.ts +5 -6
  324. package/src/interface/upload.ts +20 -12
  325. package/src/internal/apiService/apiService.test.ts +109 -76
  326. package/src/internal/apiService/apiService.ts +40 -26
  327. package/src/internal/apiService/coreTypes.ts +2474 -2463
  328. package/src/internal/apiService/driveTypes.ts +1868 -1822
  329. package/src/internal/apiService/errorCodes.ts +4 -4
  330. package/src/internal/apiService/errors.test.ts +25 -23
  331. package/src/internal/apiService/errors.ts +15 -9
  332. package/src/internal/apiService/index.ts +1 -1
  333. package/src/internal/apiService/transformers.ts +2 -2
  334. package/src/internal/asyncIteratorMap.test.ts +4 -4
  335. package/src/internal/asyncIteratorMap.ts +1 -1
  336. package/src/internal/asyncIteratorRace.test.ts +149 -0
  337. package/src/internal/asyncIteratorRace.ts +79 -0
  338. package/src/internal/batch.test.ts +50 -0
  339. package/src/internal/batch.ts +9 -0
  340. package/src/internal/batchLoading.test.ts +13 -14
  341. package/src/internal/batchLoading.ts +8 -8
  342. package/src/internal/devices/apiService.ts +58 -51
  343. package/src/internal/devices/cryptoService.ts +22 -17
  344. package/src/internal/devices/index.ts +17 -10
  345. package/src/internal/devices/interface.ts +21 -12
  346. package/src/internal/devices/manager.test.ts +40 -9
  347. package/src/internal/devices/manager.ts +3 -3
  348. package/src/internal/download/apiService.ts +66 -49
  349. package/src/internal/download/cryptoService.ts +34 -18
  350. package/src/internal/download/fileDownloader.test.ts +25 -9
  351. package/src/internal/download/fileDownloader.ts +36 -18
  352. package/src/internal/download/index.ts +19 -19
  353. package/src/internal/download/interface.ts +19 -20
  354. package/src/internal/download/queue.ts +3 -3
  355. package/src/internal/download/telemetry.test.ts +11 -11
  356. package/src/internal/download/telemetry.ts +24 -14
  357. package/src/internal/download/thumbnailDownloader.test.ts +11 -6
  358. package/src/internal/download/thumbnailDownloader.ts +43 -32
  359. package/src/internal/errors.ts +7 -5
  360. package/src/internal/events/apiService.ts +30 -17
  361. package/src/internal/events/coreEventManager.test.ts +18 -18
  362. package/src/internal/events/coreEventManager.ts +9 -6
  363. package/src/internal/events/eventManager.test.ts +51 -46
  364. package/src/internal/events/eventManager.ts +6 -5
  365. package/src/internal/events/index.ts +24 -14
  366. package/src/internal/events/interface.ts +47 -39
  367. package/src/internal/events/volumeEventManager.test.ts +61 -65
  368. package/src/internal/events/volumeEventManager.ts +18 -9
  369. package/src/internal/nodes/apiService.test.ts +197 -147
  370. package/src/internal/nodes/apiService.ts +288 -174
  371. package/src/internal/nodes/cache.test.ts +48 -20
  372. package/src/internal/nodes/cache.ts +60 -44
  373. package/src/internal/nodes/cryptoCache.test.ts +34 -14
  374. package/src/internal/nodes/cryptoCache.ts +10 -5
  375. package/src/internal/nodes/cryptoService.test.ts +492 -351
  376. package/src/internal/nodes/cryptoService.ts +170 -88
  377. package/src/internal/nodes/events.test.ts +38 -28
  378. package/src/internal/nodes/events.ts +7 -5
  379. package/src/internal/nodes/extendedAttributes.test.ts +28 -24
  380. package/src/internal/nodes/extendedAttributes.ts +20 -15
  381. package/src/internal/nodes/index.test.ts +133 -0
  382. package/src/internal/nodes/index.ts +27 -15
  383. package/src/internal/nodes/interface.ts +42 -29
  384. package/src/internal/nodes/nodesAccess.test.ts +124 -58
  385. package/src/internal/nodes/nodesAccess.ts +73 -49
  386. package/src/internal/nodes/nodesManagement.test.ts +32 -31
  387. package/src/internal/nodes/nodesManagement.ts +39 -32
  388. package/src/internal/nodes/nodesRevisions.ts +7 -7
  389. package/src/internal/nodes/validations.ts +2 -2
  390. package/src/internal/photos/albums.ts +5 -5
  391. package/src/internal/photos/apiService.ts +4 -7
  392. package/src/internal/photos/cache.ts +1 -1
  393. package/src/internal/photos/index.ts +8 -8
  394. package/src/internal/photos/interface.ts +2 -2
  395. package/src/internal/photos/photosTimeline.ts +4 -5
  396. package/src/internal/sdkEvents.test.ts +10 -10
  397. package/src/internal/sdkEvents.ts +5 -13
  398. package/src/internal/shares/apiService.ts +44 -33
  399. package/src/internal/shares/cache.test.ts +6 -4
  400. package/src/internal/shares/cache.ts +21 -12
  401. package/src/internal/shares/cryptoCache.test.ts +17 -11
  402. package/src/internal/shares/cryptoCache.ts +4 -4
  403. package/src/internal/shares/cryptoService.test.ts +72 -74
  404. package/src/internal/shares/cryptoService.ts +48 -23
  405. package/src/internal/shares/index.ts +23 -11
  406. package/src/internal/shares/interface.ts +8 -8
  407. package/src/internal/shares/manager.test.ts +88 -80
  408. package/src/internal/shares/manager.ts +19 -19
  409. package/src/internal/sharing/apiService.ts +282 -175
  410. package/src/internal/sharing/cache.test.ts +35 -35
  411. package/src/internal/sharing/cache.ts +2 -2
  412. package/src/internal/sharing/cryptoService.test.ts +58 -46
  413. package/src/internal/sharing/cryptoService.ts +121 -84
  414. package/src/internal/sharing/events.test.ts +45 -49
  415. package/src/internal/sharing/events.ts +9 -6
  416. package/src/internal/sharing/index.ts +22 -11
  417. package/src/internal/sharing/interface.ts +40 -40
  418. package/src/internal/sharing/sharingAccess.test.ts +71 -65
  419. package/src/internal/sharing/sharingAccess.ts +39 -21
  420. package/src/internal/sharing/sharingManagement.test.ts +398 -298
  421. package/src/internal/sharing/sharingManagement.ts +138 -65
  422. package/src/internal/uids.ts +1 -1
  423. package/src/internal/upload/apiService.ts +167 -117
  424. package/src/internal/upload/blockVerifier.ts +8 -6
  425. package/src/internal/upload/chunkStreamReader.test.ts +7 -7
  426. package/src/internal/upload/cryptoService.ts +42 -36
  427. package/src/internal/upload/digests.ts +2 -2
  428. package/src/internal/upload/fileUploader.test.ts +15 -3
  429. package/src/internal/upload/fileUploader.ts +39 -17
  430. package/src/internal/upload/index.ts +13 -14
  431. package/src/internal/upload/interface.ts +78 -78
  432. package/src/internal/upload/manager.test.ts +170 -153
  433. package/src/internal/upload/manager.ts +59 -35
  434. package/src/internal/upload/queue.ts +3 -3
  435. package/src/internal/upload/streamUploader.test.ts +40 -26
  436. package/src/internal/upload/streamUploader.ts +87 -69
  437. package/src/internal/upload/telemetry.test.ts +11 -11
  438. package/src/internal/upload/telemetry.ts +25 -15
  439. package/src/internal/wait.test.ts +1 -1
  440. package/src/internal/wait.ts +3 -3
  441. package/src/protonDriveClient.ts +121 -39
  442. package/src/protonDrivePhotosClient.ts +16 -10
  443. package/src/telemetry.ts +60 -52
  444. package/src/tests/logger.ts +1 -1
  445. package/src/tests/telemetry.ts +2 -2
  446. package/src/transformers.ts +27 -21
  447. package/src/version.ts +0 -1
@@ -1,27 +1,40 @@
1
1
  import { c } from 'ttag';
2
2
 
3
- import { DriveCrypto, PrivateKey, PublicKey, SessionKey, uint8ArrayToBase64String, VERIFICATION_STATUS } from "../../crypto";
4
- import { ProtonDriveAccount, Revision } from "../../interface";
5
- import { DecryptionError, IntegrityError } from "../../errors";
6
- import { getErrorMessage } from "../errors";
7
- import { mergeUint8Arrays } from "../utils";
8
- import { RevisionKeys } from "./interface";
3
+ import {
4
+ DriveCrypto,
5
+ PrivateKey,
6
+ PublicKey,
7
+ SessionKey,
8
+ uint8ArrayToBase64String,
9
+ VERIFICATION_STATUS,
10
+ } from '../../crypto';
11
+ import { ProtonDriveAccount, Revision } from '../../interface';
12
+ import { DecryptionError, IntegrityError } from '../../errors';
13
+ import { getErrorMessage } from '../errors';
14
+ import { mergeUint8Arrays } from '../utils';
15
+ import { RevisionKeys } from './interface';
9
16
 
10
17
  export class DownloadCryptoService {
11
- constructor(private driveCrypto: DriveCrypto, private account: ProtonDriveAccount) {
18
+ constructor(
19
+ private driveCrypto: DriveCrypto,
20
+ private account: ProtonDriveAccount,
21
+ ) {
12
22
  this.account = account;
13
23
  this.driveCrypto = driveCrypto;
14
24
  }
15
25
 
16
- async getRevisionKeys(nodeKey: { key: PrivateKey, contentKeyPacketSessionKey: SessionKey }, revision: Revision): Promise<RevisionKeys> {
26
+ async getRevisionKeys(
27
+ nodeKey: { key: PrivateKey; contentKeyPacketSessionKey: SessionKey },
28
+ revision: Revision,
29
+ ): Promise<RevisionKeys> {
17
30
  const verificationKeys = await this.getRevisionVerificationKeys(revision);
18
31
  return {
19
32
  ...nodeKey,
20
33
  verificationKeys,
21
- }
34
+ };
22
35
  }
23
36
 
24
- async decryptBlock(encryptedBlock: Uint8Array, armoredSignature: string, revisionKeys: RevisionKeys): Promise<Uint8Array> {
37
+ async decryptBlock(encryptedBlock: Uint8Array, revisionKeys: RevisionKeys): Promise<Uint8Array> {
25
38
  let decryptedBlock;
26
39
  try {
27
40
  // We do not verify signatures on blocks. We only verify
@@ -30,14 +43,10 @@ export class DownloadCryptoService {
30
43
  // We plan to drop signatures of individual blocks
31
44
  // completely in the future. Any issue on the blocks
32
45
  // should be considered serious integrity issue.
33
- const result = await this.driveCrypto.decryptBlock(
46
+ decryptedBlock = await this.driveCrypto.decryptBlock(
34
47
  encryptedBlock,
35
- armoredSignature,
36
- revisionKeys.key,
37
48
  revisionKeys.contentKeyPacketSessionKey,
38
- revisionKeys.verificationKeys,
39
49
  );
40
- decryptedBlock = result.decryptedBlock;
41
50
  } catch (error: unknown) {
42
51
  const message = getErrorMessage(error);
43
52
  throw new DecryptionError(c('Error').t`Failed to decrypt block: ${message}`);
@@ -75,8 +84,13 @@ export class DownloadCryptoService {
75
84
  }
76
85
  }
77
86
 
78
- async verifyManifest(revision: Revision, nodeKey: PrivateKey, allBlockHashes: Uint8Array[], armoredManifestSignature?: string): Promise<void> {
79
- const verificationKeys = await this.getRevisionVerificationKeys(revision) || nodeKey;
87
+ async verifyManifest(
88
+ revision: Revision,
89
+ nodeKey: PrivateKey,
90
+ allBlockHashes: Uint8Array[],
91
+ armoredManifestSignature?: string,
92
+ ): Promise<void> {
93
+ const verificationKeys = (await this.getRevisionVerificationKeys(revision)) || nodeKey;
80
94
  const hash = mergeUint8Arrays(allBlockHashes);
81
95
 
82
96
  if (!armoredManifestSignature) {
@@ -90,7 +104,9 @@ export class DownloadCryptoService {
90
104
  }
91
105
 
92
106
  private async getRevisionVerificationKeys(revision: Revision): Promise<PublicKey[] | undefined> {
93
- const signatureEmail = revision.contentAuthor.ok ? revision.contentAuthor.value : revision.contentAuthor.error.claimedAuthor;
107
+ const signatureEmail = revision.contentAuthor.ok
108
+ ? revision.contentAuthor.value
109
+ : revision.contentAuthor.error.claimedAuthor;
94
110
  return signatureEmail ? await this.account.getPublicKeys(signatureEmail) : undefined;
95
111
  }
96
112
  }
@@ -99,7 +99,7 @@ describe('FileDownloader', () => {
99
99
  expect(telemetry.downloadFinished).toHaveBeenCalledWith('revisionUid', fileProgress);
100
100
  expect(telemetry.downloadFailed).not.toHaveBeenCalled();
101
101
  expect(onFinish).toHaveBeenCalledTimes(1);
102
- }
102
+ };
103
103
 
104
104
  const verifyFailure = async (error: string, downloadedBytes: number | undefined) => {
105
105
  const controller = downloader.writeToStream(stream, onProgress);
@@ -136,12 +136,20 @@ describe('FileDownloader', () => {
136
136
  write: jest.fn(),
137
137
  close: jest.fn(),
138
138
  abort: jest.fn(),
139
- }
139
+ };
140
140
  // @ts-expect-error Mocking WritableStream
141
141
  stream = {
142
142
  getWriter: () => writer,
143
- }
144
- downloader = new FileDownloader(telemetry, apiService, cryptoService, nodeKey as any, revision, undefined, onFinish);
143
+ };
144
+ downloader = new FileDownloader(
145
+ telemetry,
146
+ apiService,
147
+ cryptoService,
148
+ nodeKey as any,
149
+ revision,
150
+ undefined,
151
+ onFinish,
152
+ );
145
153
  });
146
154
 
147
155
  it('should reject two download starts', async () => {
@@ -178,9 +186,9 @@ describe('FileDownloader', () => {
178
186
  yield { type: 'block', index: 9, bareUrl: 'url', token: 'token3', base64sha256Hash: 'aGFzaDM=' };
179
187
  yield { type: 'block', index: 10, bareUrl: 'url', token: 'token1', base64sha256Hash: 'aGFzaDE=' };
180
188
  yield { type: 'block', index: 11, bareUrl: 'url', token: 'token2', base64sha256Hash: 'aGFzaDI=' };
181
- })
189
+ });
182
190
  apiService.downloadBlock = jest.fn().mockImplementation(async function (bareUrl, token, onProgress) {
183
- await new Promise(resolve => setTimeout(resolve, timeouts[count++]));
191
+ await new Promise((resolve) => setTimeout(resolve, timeouts[count++]));
184
192
  return mockBlockDownload(bareUrl, token, onProgress);
185
193
  });
186
194
 
@@ -353,12 +361,20 @@ describe('FileDownloader', () => {
353
361
  write: jest.fn(),
354
362
  close: jest.fn(),
355
363
  abort: jest.fn(),
356
- }
364
+ };
357
365
  // @ts-expect-error Mocking WritableStream
358
366
  stream = {
359
367
  getWriter: () => writer,
360
- }
361
- downloader = new FileDownloader(telemetry, apiService, cryptoService, nodeKey as any, revision, undefined, onFinish);
368
+ };
369
+ downloader = new FileDownloader(
370
+ telemetry,
371
+ apiService,
372
+ cryptoService,
373
+ nodeKey as any,
374
+ revision,
375
+ undefined,
376
+ onFinish,
377
+ );
362
378
  });
363
379
 
364
380
  it('should skip verification steps', async () => {
@@ -1,10 +1,10 @@
1
- import { PrivateKey, SessionKey, base64StringToUint8Array } from "../../crypto";
2
- import { Logger, Revision } from "../../interface";
3
- import { LoggerWithPrefix } from "../../telemetry";
1
+ import { PrivateKey, SessionKey, base64StringToUint8Array } from '../../crypto';
2
+ import { Logger, Revision } from '../../interface';
3
+ import { LoggerWithPrefix } from '../../telemetry';
4
4
  import { APIHTTPError, HTTPErrorCode } from '../apiService';
5
- import { DownloadAPIService } from "./apiService";
5
+ import { DownloadAPIService } from './apiService';
6
6
  import { DownloadController } from './controller';
7
- import { DownloadCryptoService } from "./cryptoService";
7
+ import { DownloadCryptoService } from './cryptoService';
8
8
  import { BlockMetadata, RevisionKeys } from './interface';
9
9
  import { DownloadTelemetry } from './telemetry';
10
10
 
@@ -20,16 +20,19 @@ export class FileDownloader {
20
20
 
21
21
  private controller: DownloadController;
22
22
  private nextBlockIndex = 1;
23
- private ongoingDownloads = new Map<number, {
24
- downloadPromise: Promise<void>,
25
- decryptedBufferedBlock?: Uint8Array,
26
- }>();
23
+ private ongoingDownloads = new Map<
24
+ number,
25
+ {
26
+ downloadPromise: Promise<void>;
27
+ decryptedBufferedBlock?: Uint8Array;
28
+ }
29
+ >();
27
30
 
28
31
  constructor(
29
32
  private telemetry: DownloadTelemetry,
30
33
  private apiService: DownloadAPIService,
31
34
  private cryptoService: DownloadCryptoService,
32
- private nodeKey: { key: PrivateKey, contentKeyPacketSessionKey: SessionKey },
35
+ private nodeKey: { key: PrivateKey; contentKeyPacketSessionKey: SessionKey },
33
36
  private revision: Revision,
34
37
  private signal?: AbortSignal,
35
38
  private onFinish?: () => void,
@@ -127,7 +130,12 @@ export class FileDownloader {
127
130
  this.logger.warn('Skipping manifest check');
128
131
  } else {
129
132
  this.logger.debug(`Verifying manifest`);
130
- await this.cryptoService.verifyManifest(this.revision, this.nodeKey.key, allBlockHashes, armoredManifestSignature);
133
+ await this.cryptoService.verifyManifest(
134
+ this.revision,
135
+ this.nodeKey.key,
136
+ allBlockHashes,
137
+ armoredManifestSignature,
138
+ );
131
139
  }
132
140
 
133
141
  await writer.close();
@@ -161,10 +169,15 @@ export class FileDownloader {
161
169
  logger.debug(`Downloading`);
162
170
  await this.controller.waitWhilePaused();
163
171
  try {
164
- const encryptedBlock = await this.apiService.downloadBlock(blockMetadata.bareUrl, blockMetadata.token, (downloadedBytes) => {
165
- blockProgress += downloadedBytes;
166
- onProgress?.(downloadedBytes);
167
- }, this.signal);
172
+ const encryptedBlock = await this.apiService.downloadBlock(
173
+ blockMetadata.bareUrl,
174
+ blockMetadata.token,
175
+ (downloadedBytes) => {
176
+ blockProgress += downloadedBytes;
177
+ onProgress?.(downloadedBytes);
178
+ },
179
+ this.signal,
180
+ );
168
181
 
169
182
  if (ignoreIntegrityErrors) {
170
183
  logger.warn('Skipping hash check');
@@ -174,7 +187,7 @@ export class FileDownloader {
174
187
  }
175
188
 
176
189
  logger.debug(`Decrypting`);
177
- decryptedBlock = await this.cryptoService.decryptBlock(encryptedBlock, blockMetadata.armoredSignature!, cryptoKeys);
190
+ decryptedBlock = await this.cryptoService.decryptBlock(encryptedBlock, cryptoKeys);
178
191
  } catch (error) {
179
192
  if (blockProgress !== 0) {
180
193
  onProgress?.(-blockProgress);
@@ -183,7 +196,11 @@ export class FileDownloader {
183
196
 
184
197
  if (error instanceof APIHTTPError && error.statusCode === HTTPErrorCode.NOT_FOUND) {
185
198
  logger.warn(`Token expired, fetching new token and retrying`);
186
- blockMetadata = await this.apiService.getRevisionBlockToken(this.revision.uid, blockMetadata.index, this.signal);
199
+ blockMetadata = await this.apiService.getRevisionBlockToken(
200
+ this.revision.uid,
201
+ blockMetadata.index,
202
+ this.signal,
203
+ );
187
204
  continue;
188
205
  }
189
206
 
@@ -255,7 +272,8 @@ export class FileDownloader {
255
272
  }
256
273
 
257
274
  private get ongoingDownloadPromises() {
258
- return this.ongoingDownloads.values()
275
+ return this.ongoingDownloads
276
+ .values()
259
277
  .filter((value) => value.decryptedBufferedBlock === undefined)
260
278
  .map((value) => value.downloadPromise);
261
279
  }
@@ -1,16 +1,16 @@
1
1
  import { c } from 'ttag';
2
2
 
3
- import { DriveCrypto } from "../../crypto";
4
- import { ValidationError } from "../../errors";
5
- import { ProtonDriveAccount, ProtonDriveTelemetry, NodeType, ThumbnailType, ThumbnailResult } from "../../interface";
6
- import { DriveAPIService } from "../apiService";
7
- import { DownloadAPIService } from "./apiService";
8
- import { DownloadCryptoService } from "./cryptoService";
9
- import { NodesService, RevisionsService, SharesService } from "./interface";
10
- import { FileDownloader } from "./fileDownloader";
11
- import { DownloadQueue } from "./queue";
12
- import { DownloadTelemetry } from "./telemetry";
13
- import { makeNodeUidFromRevisionUid } from "../uids";
3
+ import { DriveCrypto } from '../../crypto';
4
+ import { ValidationError } from '../../errors';
5
+ import { ProtonDriveAccount, ProtonDriveTelemetry, NodeType, ThumbnailType, ThumbnailResult } from '../../interface';
6
+ import { DriveAPIService } from '../apiService';
7
+ import { DownloadAPIService } from './apiService';
8
+ import { DownloadCryptoService } from './cryptoService';
9
+ import { NodesService, RevisionsService, SharesService } from './interface';
10
+ import { FileDownloader } from './fileDownloader';
11
+ import { DownloadQueue } from './queue';
12
+ import { DownloadTelemetry } from './telemetry';
13
+ import { makeNodeUidFromRevisionUid } from '../uids';
14
14
  import { ThumbnailDownloader } from './thumbnailDownloader';
15
15
 
16
16
  export function initDownloadModule(
@@ -36,13 +36,13 @@ export function initDownloadModule(
36
36
  nodeKey = await nodesService.getNodeKeys(nodeUid);
37
37
 
38
38
  if (node.type === NodeType.Folder) {
39
- throw new ValidationError(c("Error").t`Cannot download a folder`);
39
+ throw new ValidationError(c('Error').t`Cannot download a folder`);
40
40
  }
41
41
  if (!nodeKey.contentKeyPacketSessionKey) {
42
- throw new ValidationError(c("Error").t`File has no content key`);
42
+ throw new ValidationError(c('Error').t`File has no content key`);
43
43
  }
44
44
  if (!node.activeRevision?.ok || !node.activeRevision.value) {
45
- throw new ValidationError(c("Error").t`File has no active revision`);
45
+ throw new ValidationError(c('Error').t`File has no active revision`);
46
46
  }
47
47
  } catch (error: unknown) {
48
48
  queue.releaseCapacity();
@@ -76,12 +76,12 @@ export function initDownloadModule(
76
76
  node = await nodesService.getNode(nodeUid);
77
77
  nodeKey = await nodesService.getNodeKeys(nodeUid);
78
78
  revision = await revisionsService.getRevision(nodeRevisionUid);
79
-
79
+
80
80
  if (node.type === NodeType.Folder) {
81
- throw new ValidationError(c("Error").t`Cannot download a folder`);
81
+ throw new ValidationError(c('Error').t`Cannot download a folder`);
82
82
  }
83
83
  if (!nodeKey.contentKeyPacketSessionKey) {
84
- throw new ValidationError(c("Error").t`File has no content key`);
84
+ throw new ValidationError(c('Error').t`File has no content key`);
85
85
  }
86
86
  } catch (error: unknown) {
87
87
  queue.releaseCapacity();
@@ -105,7 +105,7 @@ export function initDownloadModule(
105
105
  );
106
106
  }
107
107
 
108
- async function *iterateThumbnails(
108
+ async function* iterateThumbnails(
109
109
  nodeUids: string[],
110
110
  thumbnailType?: ThumbnailType,
111
111
  signal?: AbortSignal,
@@ -118,5 +118,5 @@ export function initDownloadModule(
118
118
  getFileDownloader,
119
119
  getFileRevisionDownloader,
120
120
  iterateThumbnails,
121
- }
121
+ };
122
122
  }
@@ -1,38 +1,37 @@
1
- import { PrivateKey, PublicKey, SessionKey } from "../../crypto";
2
- import { NodeType, Result, Revision, MissingNode, MetricVolumeType } from "../../interface";
3
- import { DecryptedNode } from "../nodes";
1
+ import { PrivateKey, PublicKey, SessionKey } from '../../crypto';
2
+ import { NodeType, Result, Revision, MissingNode, MetricVolumeType } from '../../interface';
3
+ import { DecryptedNode } from '../nodes';
4
4
 
5
5
  export type BlockMetadata = {
6
- index: number,
7
- bareUrl: string,
8
- token: string,
9
- base64sha256Hash: string,
10
- signatureEmail?: string,
11
- armoredSignature?: string,
6
+ index: number;
7
+ bareUrl: string;
8
+ token: string;
9
+ base64sha256Hash: string;
10
+ signatureEmail?: string;
12
11
  };
13
12
 
14
13
  export type RevisionKeys = {
15
- key: PrivateKey,
16
- contentKeyPacketSessionKey: SessionKey,
17
- verificationKeys?: PublicKey[],
18
- }
14
+ key: PrivateKey;
15
+ contentKeyPacketSessionKey: SessionKey;
16
+ verificationKeys?: PublicKey[];
17
+ };
19
18
 
20
19
  export interface SharesService {
21
- getVolumeMetricContext(volumeId: string): Promise<MetricVolumeType>,
20
+ getVolumeMetricContext(volumeId: string): Promise<MetricVolumeType>;
22
21
  }
23
22
 
24
23
  export interface NodesService {
25
- getNode(nodeUid: string): Promise<NodesServiceNode>,
26
- getNodeKeys(nodeUid: string): Promise<{ key: PrivateKey, contentKeyPacketSessionKey?: SessionKey; }>,
24
+ getNode(nodeUid: string): Promise<NodesServiceNode>;
25
+ getNodeKeys(nodeUid: string): Promise<{ key: PrivateKey; contentKeyPacketSessionKey?: SessionKey }>;
27
26
  iterateNodes(nodeUids: string[], signal?: AbortSignal): AsyncGenerator<DecryptedNode | MissingNode>;
28
27
  }
29
28
 
30
29
  export interface NodesServiceNode {
31
- uid: string,
32
- type: NodeType,
33
- activeRevision?: Result<Revision, Error>,
30
+ uid: string;
31
+ type: NodeType;
32
+ activeRevision?: Result<Revision, Error>;
34
33
  }
35
34
 
36
35
  export interface RevisionsService {
37
- getRevision(nodeRevisionUid: string): Promise<Revision>,
36
+ getRevision(nodeRevisionUid: string): Promise<Revision>;
38
37
  }
@@ -2,13 +2,13 @@ import { waitForCondition } from '../wait';
2
2
 
3
3
  /**
4
4
  * A queue that limits the number of concurrent downloads.
5
- *
5
+ *
6
6
  * This is used to limit the number of concurrent downloads to avoid
7
7
  * overloading the server, or get rate limited.
8
- *
8
+ *
9
9
  * Each file download consumes memory and is limited by the number of
10
10
  * concurrent block downloads for each file.
11
- *
11
+ *
12
12
  * This queue is straitforward and does not have any priority mechanism
13
13
  * or other features, such as limiting total number of blocks being
14
14
  * downloaded. That is something we want to add in the future to be
@@ -25,7 +25,7 @@ describe('DownloadTelemetry', () => {
25
25
 
26
26
  sharesService = {
27
27
  getVolumeMetricContext: jest.fn().mockResolvedValue('own_volume'),
28
- }
28
+ };
29
29
 
30
30
  downloadTelemetry = new DownloadTelemetry(mockTelemetry, sharesService);
31
31
  });
@@ -35,10 +35,10 @@ describe('DownloadTelemetry', () => {
35
35
  await downloadTelemetry.downloadInitFailed(nodeUid, error);
36
36
 
37
37
  expect(mockTelemetry.logEvent).toHaveBeenCalledWith({
38
- eventName: "download",
39
- volumeType: "own_volume",
38
+ eventName: 'download',
39
+ volumeType: 'own_volume',
40
40
  downloadedSize: 0,
41
- error: "unknown",
41
+ error: 'unknown',
42
42
  originalError: error,
43
43
  });
44
44
  });
@@ -48,11 +48,11 @@ describe('DownloadTelemetry', () => {
48
48
  await downloadTelemetry.downloadFailed(revisionUid, error, 123, 456);
49
49
 
50
50
  expect(mockTelemetry.logEvent).toHaveBeenCalledWith({
51
- eventName: "download",
52
- volumeType: "own_volume",
51
+ eventName: 'download',
52
+ volumeType: 'own_volume',
53
53
  downloadedSize: 123,
54
54
  claimedFileSize: 456,
55
- error: "unknown",
55
+ error: 'unknown',
56
56
  originalError: error,
57
57
  });
58
58
  });
@@ -61,8 +61,8 @@ describe('DownloadTelemetry', () => {
61
61
  await downloadTelemetry.downloadFinished(revisionUid, 500);
62
62
 
63
63
  expect(mockTelemetry.logEvent).toHaveBeenCalledWith({
64
- eventName: "download",
65
- volumeType: "own_volume",
64
+ eventName: 'download',
65
+ volumeType: 'own_volume',
66
66
  downloadedSize: 500,
67
67
  claimedFileSize: 500,
68
68
  });
@@ -73,9 +73,9 @@ describe('DownloadTelemetry', () => {
73
73
  expect(mockTelemetry.logEvent).toHaveBeenCalledWith(
74
74
  expect.objectContaining({
75
75
  error,
76
- })
76
+ }),
77
77
  );
78
- }
78
+ };
79
79
 
80
80
  it('should ignore ValidationError', async () => {
81
81
  const error = new ValidationError('Validation error');
@@ -1,16 +1,19 @@
1
- import { RateLimitedError, ValidationError, DecryptionError, IntegrityError } from "../../errors";
2
- import { ProtonDriveTelemetry, MetricsDownloadErrorType, Logger } from "../../interface";
3
- import { LoggerWithPrefix } from "../../telemetry";
1
+ import { RateLimitedError, ValidationError, DecryptionError, IntegrityError } from '../../errors';
2
+ import { ProtonDriveTelemetry, MetricsDownloadErrorType, Logger } from '../../interface';
3
+ import { LoggerWithPrefix } from '../../telemetry';
4
4
  import { APIHTTPError } from '../apiService';
5
- import { splitNodeRevisionUid, splitNodeUid } from "../uids";
6
- import { SharesService } from "./interface";
5
+ import { splitNodeRevisionUid, splitNodeUid } from '../uids';
6
+ import { SharesService } from './interface';
7
7
 
8
8
  export class DownloadTelemetry {
9
9
  private logger: Logger;
10
10
 
11
- constructor(private telemetry: ProtonDriveTelemetry, private sharesService: SharesService) {
11
+ constructor(
12
+ private telemetry: ProtonDriveTelemetry,
13
+ private sharesService: SharesService,
14
+ ) {
12
15
  this.telemetry = telemetry;
13
- this.logger = this.telemetry.getLogger("download");
16
+ this.logger = this.telemetry.getLogger('download');
14
17
  this.sharesService = sharesService;
15
18
  }
16
19
 
@@ -61,12 +64,15 @@ export class DownloadTelemetry {
61
64
  });
62
65
  }
63
66
 
64
- private async sendTelemetry(volumeId: string, options: {
65
- downloadedSize: number,
66
- claimedFileSize?: number,
67
- error?: MetricsDownloadErrorType,
68
- originalError?: unknown,
69
- }) {
67
+ private async sendTelemetry(
68
+ volumeId: string,
69
+ options: {
70
+ downloadedSize: number;
71
+ claimedFileSize?: number;
72
+ error?: MetricsDownloadErrorType;
73
+ originalError?: unknown;
74
+ },
75
+ ) {
70
76
  let volumeType;
71
77
  try {
72
78
  volumeType = await this.sharesService.getVolumeMetricContext(volumeId);
@@ -107,7 +113,11 @@ function getErrorCategory(error: unknown): MetricsDownloadErrorType | undefined
107
113
  if (error.name === 'TimeoutError') {
108
114
  return 'server_error';
109
115
  }
110
- if (error.name === 'OfflineError' || error.name === 'NetworkError' || error.message?.toLowerCase() === 'network error') {
116
+ if (
117
+ error.name === 'OfflineError' ||
118
+ error.name === 'NetworkError' ||
119
+ error.message?.toLowerCase() === 'network error'
120
+ ) {
111
121
  return 'network_error';
112
122
  }
113
123
  if (error.name === 'AbortError') {
@@ -1,5 +1,5 @@
1
1
  import { ProtonDriveTelemetry } from '../../interface';
2
- import { getMockTelemetry } from "../../tests/telemetry";
2
+ import { getMockTelemetry } from '../../tests/telemetry';
3
3
  import { ThumbnailDownloader } from './thumbnailDownloader';
4
4
  import { DownloadAPIService } from './apiService';
5
5
  import { DownloadCryptoService } from './cryptoService';
@@ -28,7 +28,7 @@ describe('ThumbnailDownloader', () => {
28
28
  thumbnails: [{ type: 1, uid: `thumb-${nodeUid}` }],
29
29
  },
30
30
  },
31
- }
31
+ };
32
32
  }
33
33
  }),
34
34
  getNodeKeys: jest.fn().mockReturnValue({
@@ -45,7 +45,7 @@ describe('ThumbnailDownloader', () => {
45
45
  ok: true,
46
46
  bareUrl: `url-${thumbnailUid}`,
47
47
  token: `token-${thumbnailUid}`,
48
- }
48
+ };
49
49
  }
50
50
  }),
51
51
  downloadBlock: jest.fn().mockResolvedValue(new Uint8Array([1, 2, 3])),
@@ -68,11 +68,17 @@ describe('ThumbnailDownloader', () => {
68
68
  { nodeUid: 'node3', ok: true, thumbnail: new Uint8Array([1, 2, 3]) },
69
69
  ]);
70
70
  expect(nodesService.iterateNodes).toHaveBeenCalledWith(['node1', 'node2', 'node3'], undefined);
71
- expect(apiService.iterateThumbnails).toHaveBeenCalledWith(['thumb-node1', 'thumb-node2', 'thumb-node3'], undefined);
71
+ expect(apiService.iterateThumbnails).toHaveBeenCalledWith(
72
+ ['thumb-node1', 'thumb-node2', 'thumb-node3'],
73
+ undefined,
74
+ );
72
75
  expect(nodesService.getNodeKeys).toHaveBeenCalledTimes(3);
73
76
  expect(apiService.downloadBlock).toHaveBeenCalledTimes(3);
74
77
  expect(cryptoService.decryptThumbnail).toHaveBeenCalledTimes(3);
75
- expect(cryptoService.decryptThumbnail).toHaveBeenCalledWith(new Uint8Array([1, 2, 3]), 'contentKeyPacketSessionKey');
78
+ expect(cryptoService.decryptThumbnail).toHaveBeenCalledWith(
79
+ new Uint8Array([1, 2, 3]),
80
+ 'contentKeyPacketSessionKey',
81
+ );
76
82
  });
77
83
 
78
84
  it('should handle no requested node', async () => {
@@ -115,7 +121,6 @@ describe('ThumbnailDownloader', () => {
115
121
  expect(apiService.iterateThumbnails).not.toHaveBeenCalled();
116
122
  });
117
123
 
118
-
119
124
  it('should handle node without requested thumbnail', async () => {
120
125
  nodesService.iterateNodes = jest.fn().mockImplementation(async function* () {
121
126
  yield { uid: 'node1', type: 'file', activeRevision: { ok: true, value: { thumbnails: [] } } };