@protontech/drive-sdk 0.1.0 → 0.1.2

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 (452) 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 +2 -1
  120. package/dist/internal/events/eventManager.js +9 -1
  121. package/dist/internal/events/eventManager.js.map +1 -1
  122. package/dist/internal/events/eventManager.test.js +84 -60
  123. package/dist/internal/events/eventManager.test.js.map +1 -1
  124. package/dist/internal/events/index.d.ts +10 -9
  125. package/dist/internal/events/index.js +38 -32
  126. package/dist/internal/events/index.js.map +1 -1
  127. package/dist/internal/events/interface.d.ts +1 -1
  128. package/dist/internal/events/interface.js +0 -1
  129. package/dist/internal/events/interface.js.map +1 -1
  130. package/dist/internal/events/volumeEventManager.d.ts +3 -3
  131. package/dist/internal/events/volumeEventManager.js.map +1 -1
  132. package/dist/internal/events/volumeEventManager.test.js +55 -55
  133. package/dist/internal/events/volumeEventManager.test.js.map +1 -1
  134. package/dist/internal/nodes/apiService.d.ts +4 -3
  135. package/dist/internal/nodes/apiService.js +36 -15
  136. package/dist/internal/nodes/apiService.js.map +1 -1
  137. package/dist/internal/nodes/apiService.test.js +60 -41
  138. package/dist/internal/nodes/apiService.test.js.map +1 -1
  139. package/dist/internal/nodes/cache.d.ts +5 -5
  140. package/dist/internal/nodes/cache.js +14 -7
  141. package/dist/internal/nodes/cache.js.map +1 -1
  142. package/dist/internal/nodes/cache.test.js +31 -9
  143. package/dist/internal/nodes/cache.test.js.map +1 -1
  144. package/dist/internal/nodes/cryptoCache.d.ts +2 -2
  145. package/dist/internal/nodes/cryptoCache.js.map +1 -1
  146. package/dist/internal/nodes/cryptoCache.test.js +24 -4
  147. package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
  148. package/dist/internal/nodes/cryptoService.d.ts +3 -3
  149. package/dist/internal/nodes/cryptoService.js +11 -17
  150. package/dist/internal/nodes/cryptoService.js.map +1 -1
  151. package/dist/internal/nodes/cryptoService.test.js +320 -241
  152. package/dist/internal/nodes/cryptoService.test.js.map +1 -1
  153. package/dist/internal/nodes/events.d.ts +3 -3
  154. package/dist/internal/nodes/events.js +7 -7
  155. package/dist/internal/nodes/events.js.map +1 -1
  156. package/dist/internal/nodes/events.test.js +27 -21
  157. package/dist/internal/nodes/events.test.js.map +1 -1
  158. package/dist/internal/nodes/extendedAttributes.d.ts +1 -1
  159. package/dist/internal/nodes/extendedAttributes.js +3 -1
  160. package/dist/internal/nodes/extendedAttributes.js.map +1 -1
  161. package/dist/internal/nodes/extendedAttributes.test.js +7 -10
  162. package/dist/internal/nodes/extendedAttributes.test.js.map +1 -1
  163. package/dist/internal/nodes/index.d.ts +10 -10
  164. package/dist/internal/nodes/index.js.map +1 -1
  165. package/dist/internal/nodes/index.test.d.ts +1 -0
  166. package/dist/internal/nodes/index.test.js +106 -0
  167. package/dist/internal/nodes/index.test.js.map +1 -0
  168. package/dist/internal/nodes/interface.d.ts +2 -2
  169. package/dist/internal/nodes/nodesAccess.d.ts +7 -7
  170. package/dist/internal/nodes/nodesAccess.js +28 -16
  171. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  172. package/dist/internal/nodes/nodesAccess.test.js +39 -13
  173. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  174. package/dist/internal/nodes/nodesManagement.d.ts +6 -6
  175. package/dist/internal/nodes/nodesManagement.js +9 -7
  176. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  177. package/dist/internal/nodes/nodesManagement.test.js +9 -9
  178. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  179. package/dist/internal/nodes/nodesRevisions.d.ts +4 -4
  180. package/dist/internal/nodes/nodesRevisions.js.map +1 -1
  181. package/dist/internal/photos/albums.d.ts +3 -3
  182. package/dist/internal/photos/albums.js.map +1 -1
  183. package/dist/internal/photos/apiService.d.ts +1 -1
  184. package/dist/internal/photos/apiService.js +3 -6
  185. package/dist/internal/photos/apiService.js.map +1 -1
  186. package/dist/internal/photos/cache.d.ts +1 -1
  187. package/dist/internal/photos/index.d.ts +5 -5
  188. package/dist/internal/photos/index.js.map +1 -1
  189. package/dist/internal/photos/interface.d.ts +2 -2
  190. package/dist/internal/photos/photosTimeline.d.ts +3 -3
  191. package/dist/internal/photos/photosTimeline.js +1 -2
  192. package/dist/internal/photos/photosTimeline.js.map +1 -1
  193. package/dist/internal/sdkEvents.d.ts +1 -1
  194. package/dist/internal/sdkEvents.js +2 -7
  195. package/dist/internal/sdkEvents.js.map +1 -1
  196. package/dist/internal/sdkEvents.test.js +8 -8
  197. package/dist/internal/shares/apiService.d.ts +2 -2
  198. package/dist/internal/shares/apiService.js +5 -3
  199. package/dist/internal/shares/apiService.js.map +1 -1
  200. package/dist/internal/shares/cache.d.ts +2 -2
  201. package/dist/internal/shares/cache.js +12 -6
  202. package/dist/internal/shares/cache.js.map +1 -1
  203. package/dist/internal/shares/cache.test.js.map +1 -1
  204. package/dist/internal/shares/cryptoCache.d.ts +2 -2
  205. package/dist/internal/shares/cryptoCache.test.js +8 -2
  206. package/dist/internal/shares/cryptoCache.test.js.map +1 -1
  207. package/dist/internal/shares/cryptoService.d.ts +3 -3
  208. package/dist/internal/shares/cryptoService.js.map +1 -1
  209. package/dist/internal/shares/cryptoService.test.js +42 -42
  210. package/dist/internal/shares/cryptoService.test.js.map +1 -1
  211. package/dist/internal/shares/index.d.ts +4 -4
  212. package/dist/internal/shares/index.js.map +1 -1
  213. package/dist/internal/shares/interface.d.ts +2 -2
  214. package/dist/internal/shares/manager.d.ts +7 -7
  215. package/dist/internal/shares/manager.js.map +1 -1
  216. package/dist/internal/shares/manager.test.js +71 -63
  217. package/dist/internal/shares/manager.test.js.map +1 -1
  218. package/dist/internal/sharing/apiService.d.ts +4 -4
  219. package/dist/internal/sharing/apiService.js +4 -3
  220. package/dist/internal/sharing/apiService.js.map +1 -1
  221. package/dist/internal/sharing/cache.d.ts +2 -1
  222. package/dist/internal/sharing/cache.js +9 -0
  223. package/dist/internal/sharing/cache.js.map +1 -1
  224. package/dist/internal/sharing/cache.test.js +33 -33
  225. package/dist/internal/sharing/cryptoService.d.ts +3 -3
  226. package/dist/internal/sharing/cryptoService.js +3 -5
  227. package/dist/internal/sharing/cryptoService.js.map +1 -1
  228. package/dist/internal/sharing/cryptoService.test.js +39 -39
  229. package/dist/internal/sharing/cryptoService.test.js.map +1 -1
  230. package/dist/internal/sharing/events.d.ts +5 -4
  231. package/dist/internal/sharing/events.js +28 -19
  232. package/dist/internal/sharing/events.js.map +1 -1
  233. package/dist/internal/sharing/events.test.js +101 -88
  234. package/dist/internal/sharing/events.test.js.map +1 -1
  235. package/dist/internal/sharing/index.d.ts +6 -6
  236. package/dist/internal/sharing/index.js.map +1 -1
  237. package/dist/internal/sharing/interface.d.ts +5 -4
  238. package/dist/internal/sharing/sharingAccess.d.ts +6 -6
  239. package/dist/internal/sharing/sharingAccess.js +8 -4
  240. package/dist/internal/sharing/sharingAccess.js.map +1 -1
  241. package/dist/internal/sharing/sharingAccess.test.js +45 -39
  242. package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
  243. package/dist/internal/sharing/sharingManagement.d.ts +4 -4
  244. package/dist/internal/sharing/sharingManagement.js +5 -7
  245. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  246. package/dist/internal/sharing/sharingManagement.test.js +297 -248
  247. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  248. package/dist/internal/uids.js.map +1 -1
  249. package/dist/internal/upload/apiService.d.ts +3 -3
  250. package/dist/internal/upload/apiService.js +1 -1
  251. package/dist/internal/upload/apiService.js.map +1 -1
  252. package/dist/internal/upload/blockVerifier.d.ts +3 -3
  253. package/dist/internal/upload/blockVerifier.js +1 -1
  254. package/dist/internal/upload/blockVerifier.js.map +1 -1
  255. package/dist/internal/upload/chunkStreamReader.test.js +6 -6
  256. package/dist/internal/upload/cryptoService.d.ts +4 -4
  257. package/dist/internal/upload/cryptoService.js +4 -4
  258. package/dist/internal/upload/cryptoService.js.map +1 -1
  259. package/dist/internal/upload/digests.js.map +1 -1
  260. package/dist/internal/upload/fileUploader.d.ts +6 -6
  261. package/dist/internal/upload/fileUploader.js.map +1 -1
  262. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  263. package/dist/internal/upload/index.d.ts +5 -5
  264. package/dist/internal/upload/index.js.map +1 -1
  265. package/dist/internal/upload/interface.d.ts +4 -3
  266. package/dist/internal/upload/manager.d.ts +5 -5
  267. package/dist/internal/upload/manager.js +15 -9
  268. package/dist/internal/upload/manager.js.map +1 -1
  269. package/dist/internal/upload/manager.test.js +139 -128
  270. package/dist/internal/upload/manager.test.js.map +1 -1
  271. package/dist/internal/upload/streamUploader.d.ts +6 -6
  272. package/dist/internal/upload/streamUploader.js +9 -7
  273. package/dist/internal/upload/streamUploader.js.map +1 -1
  274. package/dist/internal/upload/streamUploader.test.js +17 -12
  275. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  276. package/dist/internal/upload/telemetry.d.ts +3 -3
  277. package/dist/internal/upload/telemetry.js +5 -3
  278. package/dist/internal/upload/telemetry.js.map +1 -1
  279. package/dist/internal/upload/telemetry.test.js +8 -8
  280. package/dist/internal/upload/telemetry.test.js.map +1 -1
  281. package/dist/protonDriveClient.d.ts +8 -8
  282. package/dist/protonDriveClient.js +12 -9
  283. package/dist/protonDriveClient.js.map +1 -1
  284. package/dist/protonDrivePhotosClient.js.map +1 -1
  285. package/dist/telemetry.js +18 -15
  286. package/dist/telemetry.js.map +1 -1
  287. package/dist/tests/logger.js.map +1 -1
  288. package/dist/tests/telemetry.d.ts +1 -1
  289. package/dist/transformers.d.ts +1 -1
  290. package/dist/transformers.js +5 -2
  291. package/dist/transformers.js.map +1 -1
  292. package/package.json +1 -1
  293. package/src/cache/interface.ts +22 -22
  294. package/src/cache/memoryCache.test.ts +7 -7
  295. package/src/cache/memoryCache.ts +4 -4
  296. package/src/cache/nullCache.ts +1 -1
  297. package/src/config.ts +5 -5
  298. package/src/crypto/driveCrypto.test.ts +15 -15
  299. package/src/crypto/driveCrypto.ts +120 -156
  300. package/src/crypto/hmac.ts +1 -1
  301. package/src/crypto/interface.ts +63 -72
  302. package/src/crypto/openPGPCrypto.ts +74 -94
  303. package/src/crypto/utils.ts +1 -1
  304. package/src/diagnostic/eventsGenerator.ts +2 -2
  305. package/src/diagnostic/httpClient.ts +6 -2
  306. package/src/diagnostic/index.ts +12 -10
  307. package/src/diagnostic/integrityVerificationStream.ts +3 -4
  308. package/src/diagnostic/interface.ts +81 -81
  309. package/src/diagnostic/sdkDiagnostic.ts +35 -24
  310. package/src/diagnostic/sdkDiagnosticFull.ts +16 -19
  311. package/src/diagnostic/telemetry.ts +4 -1
  312. package/src/diagnostic/zipGenerators.test.ts +1 -1
  313. package/src/diagnostic/zipGenerators.ts +3 -3
  314. package/src/errors.ts +21 -21
  315. package/src/index.ts +3 -3
  316. package/src/interface/account.ts +10 -10
  317. package/src/interface/author.ts +6 -6
  318. package/src/interface/config.ts +4 -4
  319. package/src/interface/devices.ts +6 -6
  320. package/src/interface/download.ts +12 -9
  321. package/src/interface/events.ts +45 -39
  322. package/src/interface/httpClient.ts +11 -11
  323. package/src/interface/index.ts +76 -19
  324. package/src/interface/nodes.ts +47 -49
  325. package/src/interface/result.ts +1 -3
  326. package/src/interface/sharing.ts +60 -57
  327. package/src/interface/telemetry.ts +74 -74
  328. package/src/interface/thumbnail.ts +5 -6
  329. package/src/interface/upload.ts +20 -12
  330. package/src/internal/apiService/apiService.test.ts +109 -76
  331. package/src/internal/apiService/apiService.ts +40 -26
  332. package/src/internal/apiService/coreTypes.ts +2474 -2463
  333. package/src/internal/apiService/driveTypes.ts +1868 -1822
  334. package/src/internal/apiService/errorCodes.ts +4 -4
  335. package/src/internal/apiService/errors.test.ts +25 -23
  336. package/src/internal/apiService/errors.ts +15 -9
  337. package/src/internal/apiService/index.ts +1 -1
  338. package/src/internal/apiService/transformers.ts +2 -2
  339. package/src/internal/asyncIteratorMap.test.ts +4 -4
  340. package/src/internal/asyncIteratorMap.ts +1 -1
  341. package/src/internal/asyncIteratorRace.test.ts +149 -0
  342. package/src/internal/asyncIteratorRace.ts +79 -0
  343. package/src/internal/batch.test.ts +50 -0
  344. package/src/internal/batch.ts +9 -0
  345. package/src/internal/batchLoading.test.ts +13 -14
  346. package/src/internal/batchLoading.ts +8 -8
  347. package/src/internal/devices/apiService.ts +58 -51
  348. package/src/internal/devices/cryptoService.ts +22 -17
  349. package/src/internal/devices/index.ts +17 -10
  350. package/src/internal/devices/interface.ts +21 -12
  351. package/src/internal/devices/manager.test.ts +40 -9
  352. package/src/internal/devices/manager.ts +3 -3
  353. package/src/internal/download/apiService.ts +66 -49
  354. package/src/internal/download/cryptoService.ts +34 -18
  355. package/src/internal/download/fileDownloader.test.ts +25 -9
  356. package/src/internal/download/fileDownloader.ts +36 -18
  357. package/src/internal/download/index.ts +19 -19
  358. package/src/internal/download/interface.ts +19 -20
  359. package/src/internal/download/queue.ts +3 -3
  360. package/src/internal/download/telemetry.test.ts +11 -11
  361. package/src/internal/download/telemetry.ts +24 -14
  362. package/src/internal/download/thumbnailDownloader.test.ts +11 -6
  363. package/src/internal/download/thumbnailDownloader.ts +43 -32
  364. package/src/internal/errors.ts +7 -5
  365. package/src/internal/events/apiService.ts +30 -17
  366. package/src/internal/events/coreEventManager.test.ts +18 -18
  367. package/src/internal/events/coreEventManager.ts +9 -6
  368. package/src/internal/events/eventManager.test.ts +108 -82
  369. package/src/internal/events/eventManager.ts +16 -5
  370. package/src/internal/events/index.ts +75 -47
  371. package/src/internal/events/interface.ts +47 -39
  372. package/src/internal/events/volumeEventManager.test.ts +61 -65
  373. package/src/internal/events/volumeEventManager.ts +18 -9
  374. package/src/internal/nodes/apiService.test.ts +197 -147
  375. package/src/internal/nodes/apiService.ts +288 -174
  376. package/src/internal/nodes/cache.test.ts +48 -20
  377. package/src/internal/nodes/cache.ts +60 -44
  378. package/src/internal/nodes/cryptoCache.test.ts +34 -14
  379. package/src/internal/nodes/cryptoCache.ts +10 -5
  380. package/src/internal/nodes/cryptoService.test.ts +492 -351
  381. package/src/internal/nodes/cryptoService.ts +170 -88
  382. package/src/internal/nodes/events.test.ts +38 -28
  383. package/src/internal/nodes/events.ts +13 -12
  384. package/src/internal/nodes/extendedAttributes.test.ts +28 -24
  385. package/src/internal/nodes/extendedAttributes.ts +20 -15
  386. package/src/internal/nodes/index.test.ts +133 -0
  387. package/src/internal/nodes/index.ts +27 -15
  388. package/src/internal/nodes/interface.ts +42 -29
  389. package/src/internal/nodes/nodesAccess.test.ts +124 -58
  390. package/src/internal/nodes/nodesAccess.ts +73 -49
  391. package/src/internal/nodes/nodesManagement.test.ts +32 -31
  392. package/src/internal/nodes/nodesManagement.ts +39 -32
  393. package/src/internal/nodes/nodesRevisions.ts +7 -7
  394. package/src/internal/nodes/validations.ts +2 -2
  395. package/src/internal/photos/albums.ts +5 -5
  396. package/src/internal/photos/apiService.ts +4 -7
  397. package/src/internal/photos/cache.ts +1 -1
  398. package/src/internal/photos/index.ts +8 -8
  399. package/src/internal/photos/interface.ts +2 -2
  400. package/src/internal/photos/photosTimeline.ts +4 -5
  401. package/src/internal/sdkEvents.test.ts +10 -10
  402. package/src/internal/sdkEvents.ts +5 -13
  403. package/src/internal/shares/apiService.ts +44 -33
  404. package/src/internal/shares/cache.test.ts +6 -4
  405. package/src/internal/shares/cache.ts +21 -12
  406. package/src/internal/shares/cryptoCache.test.ts +17 -11
  407. package/src/internal/shares/cryptoCache.ts +4 -4
  408. package/src/internal/shares/cryptoService.test.ts +72 -74
  409. package/src/internal/shares/cryptoService.ts +48 -23
  410. package/src/internal/shares/index.ts +23 -11
  411. package/src/internal/shares/interface.ts +8 -8
  412. package/src/internal/shares/manager.test.ts +88 -80
  413. package/src/internal/shares/manager.ts +19 -19
  414. package/src/internal/sharing/apiService.ts +282 -175
  415. package/src/internal/sharing/cache.test.ts +35 -35
  416. package/src/internal/sharing/cache.ts +11 -2
  417. package/src/internal/sharing/cryptoService.test.ts +58 -46
  418. package/src/internal/sharing/cryptoService.ts +121 -84
  419. package/src/internal/sharing/events.test.ts +113 -102
  420. package/src/internal/sharing/events.ts +42 -24
  421. package/src/internal/sharing/index.ts +22 -11
  422. package/src/internal/sharing/interface.ts +40 -40
  423. package/src/internal/sharing/sharingAccess.test.ts +71 -65
  424. package/src/internal/sharing/sharingAccess.ts +39 -21
  425. package/src/internal/sharing/sharingManagement.test.ts +398 -298
  426. package/src/internal/sharing/sharingManagement.ts +138 -65
  427. package/src/internal/uids.ts +1 -1
  428. package/src/internal/upload/apiService.ts +167 -117
  429. package/src/internal/upload/blockVerifier.ts +8 -6
  430. package/src/internal/upload/chunkStreamReader.test.ts +7 -7
  431. package/src/internal/upload/cryptoService.ts +42 -36
  432. package/src/internal/upload/digests.ts +2 -2
  433. package/src/internal/upload/fileUploader.test.ts +15 -3
  434. package/src/internal/upload/fileUploader.ts +39 -17
  435. package/src/internal/upload/index.ts +13 -14
  436. package/src/internal/upload/interface.ts +79 -78
  437. package/src/internal/upload/manager.test.ts +170 -156
  438. package/src/internal/upload/manager.ts +66 -39
  439. package/src/internal/upload/queue.ts +3 -3
  440. package/src/internal/upload/streamUploader.test.ts +40 -26
  441. package/src/internal/upload/streamUploader.ts +87 -69
  442. package/src/internal/upload/telemetry.test.ts +11 -11
  443. package/src/internal/upload/telemetry.ts +25 -15
  444. package/src/internal/wait.test.ts +1 -1
  445. package/src/internal/wait.ts +3 -3
  446. package/src/protonDriveClient.ts +121 -39
  447. package/src/protonDrivePhotosClient.ts +16 -10
  448. package/src/telemetry.ts +60 -52
  449. package/src/tests/logger.ts +1 -1
  450. package/src/tests/telemetry.ts +2 -2
  451. package/src/transformers.ts +29 -21
  452. package/src/version.ts +0 -1
@@ -1,13 +1,13 @@
1
- import { c } from "ttag";
1
+ import { c } from 'ttag';
2
2
 
3
- import { Logger, ProtonDriveTelemetry, UploadMetadata } from "../../interface";
4
- import { ValidationError, NodeAlreadyExistsValidationError } from "../../errors";
5
- import { ErrorCode } from "../apiService";
6
- import { generateFileExtendedAttributes } from "../nodes";
7
- import { UploadAPIService } from "./apiService";
8
- import { UploadCryptoService } from "./cryptoService";
9
- import { NodeRevisionDraft, NodesService, NodeCrypto } from "./interface";
10
- import { makeNodeUid, splitNodeUid } from "../uids";
3
+ import { Logger, ProtonDriveTelemetry, UploadMetadata } from '../../interface';
4
+ import { ValidationError, NodeAlreadyExistsValidationError } from '../../errors';
5
+ import { ErrorCode } from '../apiService';
6
+ import { generateFileExtendedAttributes } from '../nodes';
7
+ import { UploadAPIService } from './apiService';
8
+ import { UploadCryptoService } from './cryptoService';
9
+ import { NodeRevisionDraft, NodesService, NodeCrypto } from './interface';
10
+ import { makeNodeUid, splitNodeUid } from '../uids';
11
11
 
12
12
  /**
13
13
  * UploadManager is responsible for creating and deleting draft nodes
@@ -75,8 +75,8 @@ export class UploadManager {
75
75
  metadata: UploadMetadata,
76
76
  generatedNodeCrypto: NodeCrypto,
77
77
  ): Promise<{
78
- nodeUid: string,
79
- nodeRevisionUid: string,
78
+ nodeUid: string;
79
+ nodeRevisionUid: string;
80
80
  }> {
81
81
  try {
82
82
  const result = await this.apiService.createDraft(parentFolderUid, {
@@ -88,7 +88,8 @@ export class UploadManager {
88
88
  armoredNodePassphrase: generatedNodeCrypto.nodeKeys.encrypted.armoredPassphrase,
89
89
  armoredNodePassphraseSignature: generatedNodeCrypto.nodeKeys.encrypted.armoredPassphraseSignature,
90
90
  base64ContentKeyPacket: generatedNodeCrypto.contentKey.encrypted.base64ContentKeyPacket,
91
- armoredContentKeyPacketSignature: generatedNodeCrypto.contentKey.encrypted.armoredContentKeyPacketSignature,
91
+ armoredContentKeyPacketSignature:
92
+ generatedNodeCrypto.contentKey.encrypted.armoredContentKeyPacketSignature,
92
93
  signatureEmail: generatedNodeCrypto.signatureAddress.email,
93
94
  });
94
95
  return result;
@@ -97,30 +98,39 @@ export class UploadManager {
97
98
  if (error.code === ErrorCode.ALREADY_EXISTS) {
98
99
  this.logger.info(`Node with given name already exists`);
99
100
 
100
- const typedDetails = error.details as {
101
- ConflictLinkID: string,
102
- ConflictRevisionID?: string,
103
- ConflictDraftRevisionID?: string,
104
- ConflictDraftClientUID?: string,
105
- } | undefined;
101
+ const typedDetails = error.details as
102
+ | {
103
+ ConflictLinkID: string;
104
+ ConflictRevisionID?: string;
105
+ ConflictDraftRevisionID?: string;
106
+ ConflictDraftClientUID?: string;
107
+ }
108
+ | undefined;
106
109
 
107
110
  // If the client doesn't specify the client UID, it should
108
111
  // never be considered own draft.
109
- const isOwnDraftConflict = (
112
+ const isOwnDraftConflict =
110
113
  typedDetails?.ConflictDraftRevisionID &&
111
114
  this.clientUid &&
112
- typedDetails?.ConflictDraftClientUID === this.clientUid
113
- );
115
+ typedDetails?.ConflictDraftClientUID === this.clientUid;
114
116
 
115
117
  // If there is existing draft created by this client,
116
118
  // automatically delete it and try to create a new one
117
119
  // with the same name again.
118
- if (typedDetails?.ConflictDraftRevisionID && (isOwnDraftConflict || metadata.overrideExistingDraftByOtherClient)) {
119
- const existingDraftNodeUid = makeNodeUid(splitNodeUid(parentFolderUid).volumeId, typedDetails.ConflictLinkID);
120
+ if (
121
+ typedDetails?.ConflictDraftRevisionID &&
122
+ (isOwnDraftConflict || metadata.overrideExistingDraftByOtherClient)
123
+ ) {
124
+ const existingDraftNodeUid = makeNodeUid(
125
+ splitNodeUid(parentFolderUid).volumeId,
126
+ typedDetails.ConflictLinkID,
127
+ );
120
128
 
121
129
  let deleteFailed = false;
122
130
  try {
123
- this.logger.warn(`Deleting existing draft node ${existingDraftNodeUid} by ${typedDetails.ConflictDraftClientUID}`);
131
+ this.logger.warn(
132
+ `Deleting existing draft node ${existingDraftNodeUid} by ${typedDetails.ConflictDraftClientUID}`,
133
+ );
124
134
  await this.apiService.deleteDraft(existingDraftNodeUid);
125
135
  } catch (deleteDraftError: unknown) {
126
136
  // Do not throw, let throw the conflict error.
@@ -128,15 +138,25 @@ export class UploadManager {
128
138
  this.logger.error('Failed to delete existing draft node', deleteDraftError);
129
139
  }
130
140
  if (!deleteFailed) {
131
- return this.createDraftOnAPI(parentFolderUid, parentHashKey, name, metadata, generatedNodeCrypto);
141
+ return this.createDraftOnAPI(
142
+ parentFolderUid,
143
+ parentHashKey,
144
+ name,
145
+ metadata,
146
+ generatedNodeCrypto,
147
+ );
132
148
  }
133
149
  }
134
150
 
135
151
  if (isOwnDraftConflict) {
136
- this.logger.warn(`Existing draft conflict by another client ${typedDetails.ConflictDraftClientUID}`);
152
+ this.logger.warn(
153
+ `Existing draft conflict by another client ${typedDetails.ConflictDraftClientUID}`,
154
+ );
137
155
  }
138
156
 
139
- const existingNodeUid = typedDetails ? makeNodeUid(splitNodeUid(parentFolderUid).volumeId, typedDetails.ConflictLinkID) : undefined;
157
+ const existingNodeUid = typedDetails
158
+ ? makeNodeUid(splitNodeUid(parentFolderUid).volumeId, typedDetails.ConflictLinkID)
159
+ : undefined;
140
160
 
141
161
  // If there is existing node, return special error
142
162
  // that includes the available name the client can use.
@@ -223,7 +243,7 @@ export class UploadManager {
223
243
  contentKeyPacketSessionKey: nodeKeys.contentKeyPacketSessionKey,
224
244
  signatureAddress: signatureAddress,
225
245
  },
226
- }
246
+ };
227
247
  }
228
248
 
229
249
  async deleteDraftRevision(nodeRevisionUid: string): Promise<void> {
@@ -240,22 +260,29 @@ export class UploadManager {
240
260
  async commitDraft(
241
261
  nodeRevisionDraft: NodeRevisionDraft,
242
262
  manifest: Uint8Array,
243
- _metadata: UploadMetadata,
244
263
  extendedAttributes: {
245
- modificationTime?: Date,
246
- size?: number,
247
- blockSizes?: number[],
264
+ modificationTime?: Date;
265
+ size?: number;
266
+ blockSizes?: number[];
248
267
  digests?: {
249
- sha1?: string,
250
- },
268
+ sha1?: string;
269
+ };
251
270
  },
252
271
  ): Promise<void> {
253
272
  const generatedExtendedAttributes = generateFileExtendedAttributes(extendedAttributes);
254
- const nodeCommitCrypto = await this.cryptoService.commitFile(nodeRevisionDraft.nodeKeys, manifest, generatedExtendedAttributes);
273
+ const nodeCommitCrypto = await this.cryptoService.commitFile(
274
+ nodeRevisionDraft.nodeKeys,
275
+ manifest,
276
+ generatedExtendedAttributes,
277
+ );
255
278
  await this.apiService.commitDraftRevision(nodeRevisionDraft.nodeRevisionUid, nodeCommitCrypto);
256
- const node = await this.nodesService.getNode(nodeRevisionDraft.nodeUid);
257
- if (node.parentUid) {
258
- await this.nodesService.notifyChildCreated(node.parentUid);
279
+
280
+ // If new revision to existing node was created, invalidate the node.
281
+ // Otherwise notify about the new child in the parent.
282
+ if (nodeRevisionDraft.newNodeInfo) {
283
+ await this.nodesService.notifyChildCreated(nodeRevisionDraft.newNodeInfo.parentUid);
284
+ } else {
285
+ await this.nodesService.notifyNodeChanged(nodeRevisionDraft.nodeUid);
259
286
  }
260
287
  }
261
288
  }
@@ -269,7 +296,7 @@ function splitExtension(filename = ''): [string, string] {
269
296
  return [filename, ''];
270
297
  }
271
298
  return [filename.slice(0, endIdx), filename.slice(endIdx + 1)];
272
- };
299
+ }
273
300
 
274
301
  /**
275
302
  * Join a filename into `name (index).extension`
@@ -2,13 +2,13 @@ import { waitForCondition } from '../wait';
2
2
 
3
3
  /**
4
4
  * A queue that limits the number of concurrent uploads.
5
- *
5
+ *
6
6
  * This is used to limit the number of concurrent uploads to avoid
7
7
  * overloading the server, or get rate limited.
8
- *
8
+ *
9
9
  * Each file upload consumes memory and is limited by the number of
10
10
  * concurrent block uploads 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
  * uploaded. That is something we want to add in the future to be
@@ -12,7 +12,12 @@ import { UploadManager } from './manager';
12
12
 
13
13
  const BLOCK_ENCRYPTION_OVERHEAD = 10000;
14
14
 
15
- async function mockEncryptBlock(verifyBlock: (block: Uint8Array) => Promise<void>, _: any, block: Uint8Array, index: number) {
15
+ async function mockEncryptBlock(
16
+ verifyBlock: (block: Uint8Array) => Promise<void>,
17
+ _: any,
18
+ block: Uint8Array,
19
+ index: number,
20
+ ) {
16
21
  await verifyBlock(block);
17
22
  return {
18
23
  index,
@@ -25,7 +30,12 @@ async function mockEncryptBlock(verifyBlock: (block: Uint8Array) => Promise<void
25
30
  };
26
31
  }
27
32
 
28
- function mockUploadBlock(_: string, __: string, encryptedBlock: Uint8Array, onProgress: (uploadedBytes: number) => void) {
33
+ function mockUploadBlock(
34
+ _: string,
35
+ __: string,
36
+ encryptedBlock: Uint8Array,
37
+ onProgress: (uploadedBytes: number) => void,
38
+ ) {
29
39
  onProgress(encryptedBlock.length);
30
40
  }
31
41
 
@@ -137,22 +147,19 @@ describe('StreamUploader', () => {
137
147
 
138
148
  const numberOfExpectedBlocks = Math.ceil(metadata.expectedSize / FILE_CHUNK_SIZE);
139
149
  expect(uploadManager.commitDraft).toHaveBeenCalledTimes(1);
140
- expect(uploadManager.commitDraft).toHaveBeenCalledWith(
141
- revisionDraft,
142
- expect.anything(),
143
- metadata,
144
- {
145
- size: metadata.expectedSize,
146
- blockSizes: metadata.expectedSize ? [
147
- ...Array(numberOfExpectedBlocks - 1).fill(FILE_CHUNK_SIZE),
148
- metadata.expectedSize % FILE_CHUNK_SIZE
149
- ] : [],
150
- modificationTime: undefined,
151
- digests: {
152
- sha1: expect.anything(),
153
- }
150
+ expect(uploadManager.commitDraft).toHaveBeenCalledWith(revisionDraft, expect.anything(), {
151
+ size: metadata.expectedSize,
152
+ blockSizes: metadata.expectedSize
153
+ ? [
154
+ ...Array(numberOfExpectedBlocks - 1).fill(FILE_CHUNK_SIZE),
155
+ metadata.expectedSize % FILE_CHUNK_SIZE,
156
+ ]
157
+ : [],
158
+ modificationTime: undefined,
159
+ digests: {
160
+ sha1: expect.anything(),
154
161
  },
155
- );
162
+ });
156
163
  expect(telemetry.uploadFinished).toHaveBeenCalledTimes(1);
157
164
  expect(telemetry.uploadFinished).toHaveBeenCalledWith('revisionUid', metadata.expectedSize + thumbnailSize);
158
165
  expect(telemetry.uploadFailed).not.toHaveBeenCalled();
@@ -160,7 +167,11 @@ describe('StreamUploader', () => {
160
167
  expect(onFinish).toHaveBeenCalledWith(false);
161
168
  };
162
169
 
163
- const verifyFailure = async (error: string, uploadedBytes: number | undefined, expectedSize = metadata.expectedSize) => {
170
+ const verifyFailure = async (
171
+ error: string,
172
+ uploadedBytes: number | undefined,
173
+ expectedSize = metadata.expectedSize,
174
+ ) => {
164
175
  const promise = uploader.start(stream, thumbnails, onProgress);
165
176
  await expect(promise).rejects.toThrow(error);
166
177
 
@@ -189,7 +200,7 @@ describe('StreamUploader', () => {
189
200
  {
190
201
  type: ThumbnailType.Type1,
191
202
  thumbnail: new Uint8Array(1024),
192
- }
203
+ },
193
204
  ];
194
205
  thumbnailSize = thumbnails.reduce((acc, thumbnail) => acc + thumbnail.thumbnail.length, 0);
195
206
  stream = new ReadableStream({
@@ -204,7 +215,7 @@ describe('StreamUploader', () => {
204
215
  });
205
216
  });
206
217
 
207
- it("should upload successfully", async () => {
218
+ it('should upload successfully', async () => {
208
219
  await verifySuccess();
209
220
  expect(apiService.requestBlockUpload).toHaveBeenCalledTimes(1);
210
221
  expect(apiService.uploadBlock).toHaveBeenCalledTimes(4); // 3 blocks + 1 thumbnail
@@ -213,7 +224,7 @@ describe('StreamUploader', () => {
213
224
  await verifyOnProgress([thumbnailSize, 4 * 1024 * 1024, 4 * 1024 * 1024, 2 * 1024 * 1024]);
214
225
  });
215
226
 
216
- it("should upload successfully empty file without thumbnail", async () => {
227
+ it('should upload successfully empty file without thumbnail', async () => {
217
228
  metadata = {
218
229
  expectedSize: 0,
219
230
  } as UploadMetadata;
@@ -242,7 +253,7 @@ describe('StreamUploader', () => {
242
253
  await verifyOnProgress([]);
243
254
  });
244
255
 
245
- it("should upload successfully empty file with thumbnail", async () => {
256
+ it('should upload successfully empty file with thumbnail', async () => {
246
257
  metadata = {
247
258
  expectedSize: 0,
248
259
  } as UploadMetadata;
@@ -395,7 +406,7 @@ describe('StreamUploader', () => {
395
406
  hash: 'blockHash',
396
407
  armoredSignature: 'signature',
397
408
  verificationToken: 'verificationToken',
398
- }
409
+ },
399
410
  ],
400
411
  },
401
412
  );
@@ -420,9 +431,12 @@ describe('StreamUploader', () => {
420
431
  });
421
432
 
422
433
  it('should report block verification error when retry helped', async () => {
423
- blockVerifier.verifyBlock = jest.fn().mockRejectedValueOnce(new IntegrityError('Block verification error')).mockResolvedValue({
424
- verificationToken: new Uint8Array(),
425
- });
434
+ blockVerifier.verifyBlock = jest
435
+ .fn()
436
+ .mockRejectedValueOnce(new IntegrityError('Block verification error'))
437
+ .mockResolvedValue({
438
+ verificationToken: new Uint8Array(),
439
+ });
426
440
  await verifySuccess();
427
441
  expect(telemetry.logBlockVerificationError).toHaveBeenCalledWith(true);
428
442
  });
@@ -1,21 +1,21 @@
1
- import { c } from "ttag";
2
-
3
- import { Thumbnail, Logger, ThumbnailType, UploadMetadata } from "../../interface";
4
- import { IntegrityError } from "../../errors";
5
- import { LoggerWithPrefix } from "../../telemetry";
6
- import { APIHTTPError, HTTPErrorCode, NotFoundAPIError } from "../apiService";
7
- import { getErrorMessage } from "../errors";
8
- import { mergeUint8Arrays } from "../utils";
1
+ import { c } from 'ttag';
2
+
3
+ import { Thumbnail, Logger, ThumbnailType, UploadMetadata } from '../../interface';
4
+ import { IntegrityError } from '../../errors';
5
+ import { LoggerWithPrefix } from '../../telemetry';
6
+ import { APIHTTPError, HTTPErrorCode, NotFoundAPIError } from '../apiService';
7
+ import { getErrorMessage } from '../errors';
8
+ import { mergeUint8Arrays } from '../utils';
9
9
  import { waitForCondition } from '../wait';
10
- import { UploadAPIService } from "./apiService";
11
- import { BlockVerifier } from "./blockVerifier";
10
+ import { UploadAPIService } from './apiService';
11
+ import { BlockVerifier } from './blockVerifier';
12
12
  import { UploadController } from './controller';
13
- import { UploadCryptoService } from "./cryptoService";
14
- import { UploadDigests } from "./digests";
15
- import { NodeRevisionDraft, EncryptedBlock, EncryptedThumbnail, EncryptedBlockMetadata } from "./interface";
13
+ import { UploadCryptoService } from './cryptoService';
14
+ import { UploadDigests } from './digests';
15
+ import { NodeRevisionDraft, EncryptedBlock, EncryptedThumbnail, EncryptedBlockMetadata } from './interface';
16
16
  import { UploadTelemetry } from './telemetry';
17
17
  import { ChunkStreamReader } from './chunkStreamReader';
18
- import { UploadManager } from "./manager";
18
+ import { UploadManager } from './manager';
19
19
 
20
20
  /**
21
21
  * File chunk size in bytes representing the size of each block.
@@ -65,10 +65,13 @@ export class StreamUploader {
65
65
  private encryptedBlocks = new Map<number, EncryptedBlock>();
66
66
  private encryptionFinished = false;
67
67
 
68
- private ongoingUploads = new Map<string, {
69
- uploadPromise: Promise<void>,
70
- encryptedBlock: EncryptedBlock | EncryptedThumbnail,
71
- }>();
68
+ private ongoingUploads = new Map<
69
+ string,
70
+ {
71
+ uploadPromise: Promise<void>;
72
+ encryptedBlock: EncryptedBlock | EncryptedThumbnail;
73
+ }
74
+ >();
72
75
  private uploadedThumbnails: ({ type: ThumbnailType } & EncryptedBlockMetadata)[] = [];
73
76
  private uploadedBlocks: ({ index: number } & EncryptedBlockMetadata)[] = [];
74
77
 
@@ -104,7 +107,11 @@ export class StreamUploader {
104
107
  this.controller = new UploadController();
105
108
  }
106
109
 
107
- async start(stream: ReadableStream, thumbnails: Thumbnail[], onProgress?: (uploadedBytes: number) => void): Promise<string> {
110
+ async start(
111
+ stream: ReadableStream,
112
+ thumbnails: Thumbnail[],
113
+ onProgress?: (uploadedBytes: number) => void,
114
+ ): Promise<string> {
108
115
  let failure = false;
109
116
 
110
117
  // File progress is tracked for telemetry - to track at what
@@ -116,7 +123,7 @@ export class StreamUploader {
116
123
  await this.encryptAndUploadBlocks(stream, thumbnails, (uploadedBytes) => {
117
124
  fileProgress += uploadedBytes;
118
125
  onProgress?.(uploadedBytes);
119
- })
126
+ });
120
127
 
121
128
  this.logger.debug(`All blocks uploaded, committing`);
122
129
  await this.commitFile(thumbnails);
@@ -126,7 +133,12 @@ export class StreamUploader {
126
133
  } catch (error: unknown) {
127
134
  failure = true;
128
135
  this.logger.error(`Upload failed`, error);
129
- void this.telemetry.uploadFailed(this.revisionDraft.nodeRevisionUid, error, fileProgress, this.metadata.expectedSize);
136
+ void this.telemetry.uploadFailed(
137
+ this.revisionDraft.nodeRevisionUid,
138
+ error,
139
+ fileProgress,
140
+ this.metadata.expectedSize,
141
+ );
130
142
  throw error;
131
143
  } finally {
132
144
  this.logger.debug(`Upload cleanup`);
@@ -145,7 +157,11 @@ export class StreamUploader {
145
157
  return this.revisionDraft.nodeRevisionUid;
146
158
  }
147
159
 
148
- private async encryptAndUploadBlocks(stream: ReadableStream, thumbnails: Thumbnail[], onProgress?: (uploadedBytes: number) => void) {
160
+ private async encryptAndUploadBlocks(
161
+ stream: ReadableStream,
162
+ thumbnails: Thumbnail[],
163
+ onProgress?: (uploadedBytes: number) => void,
164
+ ) {
149
165
  // We await for the encryption of thumbnails to finish before
150
166
  // starting the upload. This is because we need to request the
151
167
  // upload tokens for the thumbnails with the first blocks.
@@ -198,15 +214,10 @@ export class StreamUploader {
198
214
  const extendedAttributes = {
199
215
  modificationTime: this.metadata.modificationTime,
200
216
  size: this.metadata.expectedSize,
201
- blockSizes: uploadedBlocks.map(block => block.originalSize),
217
+ blockSizes: uploadedBlocks.map((block) => block.originalSize),
202
218
  digests: this.digests.digests(),
203
219
  };
204
- await this.uploadManager.commitDraft(
205
- this.revisionDraft,
206
- this.manifest,
207
- this.metadata,
208
- extendedAttributes,
209
- );
220
+ await this.uploadManager.commitDraft(this.revisionDraft, this.manifest, extendedAttributes);
210
221
  }
211
222
 
212
223
  private async encryptThumbnails(thumbnails: Thumbnail[]) {
@@ -216,7 +227,10 @@ export class StreamUploader {
216
227
 
217
228
  for (const thumbnail of thumbnails) {
218
229
  this.logger.debug(`Encrypting thumbnail ${thumbnail.type}`);
219
- const encryptedThumbnail = await this.cryptoService.encryptThumbnail(this.revisionDraft.nodeKeys, thumbnail);
230
+ const encryptedThumbnail = await this.cryptoService.encryptThumbnail(
231
+ this.revisionDraft.nodeKeys,
232
+ thumbnail,
233
+ );
220
234
  this.encryptedThumbnails.set(thumbnail.type, encryptedThumbnail);
221
235
  }
222
236
  }
@@ -256,7 +270,9 @@ export class StreamUploader {
256
270
  }
257
271
 
258
272
  if (attempt <= MAX_BLOCK_ENCRYPTION_RETRIES) {
259
- this.logger.warn(`Block encryption failed #${attempt}, retrying: ${getErrorMessage(error)}`);
273
+ this.logger.warn(
274
+ `Block encryption failed #${attempt}, retrying: ${getErrorMessage(error)}`,
275
+ );
260
276
  continue;
261
277
  }
262
278
 
@@ -280,18 +296,22 @@ export class StreamUploader {
280
296
  this.revisionDraft.nodeRevisionUid,
281
297
  this.revisionDraft.nodeKeys.signatureAddress.addressId,
282
298
  {
283
- contentBlocks: Array.from(this.encryptedBlocks.values().map(block => ({
284
- index: block.index,
285
- encryptedSize: block.encryptedSize,
286
- hash: block.hash,
287
- armoredSignature: block.armoredSignature,
288
- verificationToken: block.verificationToken,
289
- }))),
290
- thumbnails: Array.from(this.encryptedThumbnails.values().map(block => ({
291
- type: block.type,
292
- encryptedSize: block.encryptedSize,
293
- hash: block.hash,
294
- }))),
299
+ contentBlocks: Array.from(
300
+ this.encryptedBlocks.values().map((block) => ({
301
+ index: block.index,
302
+ encryptedSize: block.encryptedSize,
303
+ hash: block.hash,
304
+ armoredSignature: block.armoredSignature,
305
+ verificationToken: block.verificationToken,
306
+ })),
307
+ ),
308
+ thumbnails: Array.from(
309
+ this.encryptedThumbnails.values().map((block) => ({
310
+ type: block.type,
311
+ encryptedSize: block.encryptedSize,
312
+ hash: block.hash,
313
+ })),
314
+ ),
295
315
  },
296
316
  );
297
317
 
@@ -305,11 +325,7 @@ export class StreamUploader {
305
325
 
306
326
  const uploadKey = `thumbnail:${thumbnailToken.type}`;
307
327
  this.ongoingUploads.set(uploadKey, {
308
- uploadPromise: this.uploadThumbnail(
309
- thumbnailToken,
310
- encryptedThumbnail,
311
- onProgress,
312
- ).finally(() => {
328
+ uploadPromise: this.uploadThumbnail(thumbnailToken, encryptedThumbnail, onProgress).finally(() => {
313
329
  this.ongoingUploads.delete(uploadKey);
314
330
 
315
331
  // Help the garbage collector to clean up the memory.
@@ -329,11 +345,7 @@ export class StreamUploader {
329
345
 
330
346
  const uploadKey = `block:${blockToken.index}`;
331
347
  this.ongoingUploads.set(uploadKey, {
332
- uploadPromise: this.uploadBlock(
333
- blockToken,
334
- encryptedBlock,
335
- onProgress,
336
- ).finally(() => {
348
+ uploadPromise: this.uploadBlock(blockToken, encryptedBlock, onProgress).finally(() => {
337
349
  this.ongoingUploads.delete(uploadKey);
338
350
 
339
351
  // Help the garbage collector to clean up the memory.
@@ -345,11 +357,14 @@ export class StreamUploader {
345
357
  }
346
358
 
347
359
  private async uploadThumbnail(
348
- uploadToken: { bareUrl: string, token: string },
360
+ uploadToken: { bareUrl: string; token: string },
349
361
  encryptedThumbnail: EncryptedThumbnail,
350
362
  onProgress?: (uploadedBytes: number) => void,
351
363
  ) {
352
- const logger = new LoggerWithPrefix(this.logger, `thumbnail type ${encryptedThumbnail.type} to ${uploadToken.token}`);
364
+ const logger = new LoggerWithPrefix(
365
+ this.logger,
366
+ `thumbnail type ${encryptedThumbnail.type} to ${uploadToken.token}`,
367
+ );
353
368
  logger.info(`Upload started`);
354
369
 
355
370
  let blockProgress = 0;
@@ -368,13 +383,13 @@ export class StreamUploader {
368
383
  onProgress?.(uploadedBytes);
369
384
  },
370
385
  this.abortController.signal,
371
- )
386
+ );
372
387
  this.uploadedThumbnails.push({
373
388
  type: encryptedThumbnail.type,
374
389
  hash: encryptedThumbnail.hash,
375
390
  encryptedSize: encryptedThumbnail.encryptedSize,
376
391
  originalSize: encryptedThumbnail.originalSize,
377
- })
392
+ });
378
393
  break;
379
394
  } catch (error: unknown) {
380
395
  if (blockProgress !== 0) {
@@ -407,7 +422,7 @@ export class StreamUploader {
407
422
  }
408
423
 
409
424
  private async uploadBlock(
410
- uploadToken: { index: number, bareUrl: string, token: string },
425
+ uploadToken: { index: number; bareUrl: string; token: string },
411
426
  encryptedBlock: EncryptedBlock,
412
427
  onProgress?: (uploadedBytes: number) => void,
413
428
  ) {
@@ -430,13 +445,13 @@ export class StreamUploader {
430
445
  onProgress?.(uploadedBytes);
431
446
  },
432
447
  this.abortController.signal,
433
- )
448
+ );
434
449
  this.uploadedBlocks.push({
435
450
  index: encryptedBlock.index,
436
451
  hash: encryptedBlock.hash,
437
452
  encryptedSize: encryptedBlock.encryptedSize,
438
453
  originalSize: encryptedBlock.originalSize,
439
- })
454
+ });
440
455
  break;
441
456
  } catch (error: unknown) {
442
457
  if (blockProgress !== 0) {
@@ -446,20 +461,22 @@ export class StreamUploader {
446
461
 
447
462
  if (
448
463
  (error instanceof APIHTTPError && error.statusCode === HTTPErrorCode.NOT_FOUND) ||
449
- (error instanceof NotFoundAPIError)
464
+ error instanceof NotFoundAPIError
450
465
  ) {
451
466
  logger.warn(`Token expired, fetching new token and retrying`);
452
467
  const uploadTokens = await this.apiService.requestBlockUpload(
453
468
  this.revisionDraft.nodeRevisionUid,
454
469
  this.revisionDraft.nodeKeys.signatureAddress.addressId,
455
470
  {
456
- contentBlocks: [{
457
- index: encryptedBlock.index,
458
- encryptedSize: encryptedBlock.encryptedSize,
459
- hash: encryptedBlock.hash,
460
- armoredSignature: encryptedBlock.armoredSignature,
461
- verificationToken: encryptedBlock.verificationToken,
462
- }],
471
+ contentBlocks: [
472
+ {
473
+ index: encryptedBlock.index,
474
+ encryptedSize: encryptedBlock.encryptedSize,
475
+ hash: encryptedBlock.hash,
476
+ armoredSignature: encryptedBlock.armoredSignature,
477
+ verificationToken: encryptedBlock.verificationToken,
478
+ },
479
+ ],
463
480
  },
464
481
  );
465
482
  uploadToken = uploadTokens.blockTokens[0];
@@ -498,7 +515,8 @@ export class StreamUploader {
498
515
  }
499
516
 
500
517
  private verifyIntegrity(thumbnails: Thumbnail[]) {
501
- const expectedBlockCount = Math.ceil(this.metadata.expectedSize / FILE_CHUNK_SIZE) + (thumbnails ? thumbnails?.length : 0);
518
+ const expectedBlockCount =
519
+ Math.ceil(this.metadata.expectedSize / FILE_CHUNK_SIZE) + (thumbnails ? thumbnails?.length : 0);
502
520
  if (this.uploadedBlockCount !== expectedBlockCount) {
503
521
  throw new IntegrityError(c('Error').t`Some file parts failed to upload`, {
504
522
  uploadedBlockCount: this.uploadedBlockCount,