@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,13 +1,13 @@
1
- import { getMockLogger } from "../../tests/logger";
2
- import { PrivateKey } from "../../crypto";
3
- import { DecryptionError } from "../../errors";
4
- import { NodeAPIService } from "./apiService";
5
- import { NodesCache } from "./cache"
6
- import { NodesCryptoCache } from "./cryptoCache";
7
- import { NodesCryptoService } from "./cryptoService";
1
+ import { getMockLogger } from '../../tests/logger';
2
+ import { PrivateKey } from '../../crypto';
3
+ import { DecryptionError } from '../../errors';
4
+ import { NodeAPIService } from './apiService';
5
+ import { NodesCache } from './cache';
6
+ import { NodesCryptoCache } from './cryptoCache';
7
+ import { NodesCryptoService } from './cryptoService';
8
8
  import { NodesAccess } from './nodesAccess';
9
- import { SharesService, DecryptedNode, DecryptedUnparsedNode, EncryptedNode, DecryptedNodeKeys } from "./interface";
10
- import { NodeType } from "../../interface";
9
+ import { SharesService, DecryptedNode, DecryptedUnparsedNode, EncryptedNode, DecryptedNodeKeys } from './interface';
10
+ import { NodeType } from '../../interface';
11
11
 
12
12
  describe('nodesAccess', () => {
13
13
  let apiService: NodeAPIService;
@@ -22,10 +22,10 @@ describe('nodesAccess', () => {
22
22
  apiService = {
23
23
  getNode: jest.fn(),
24
24
  iterateNodes: jest.fn().mockImplementation(async function* (uids: string[]) {
25
- yield* uids.map((uid => ({ uid, parentUid: 'volumeId~parentNodeId' } as EncryptedNode)));
25
+ yield* uids.map((uid) => ({ uid, parentUid: 'volumeId~parentNodeId' }) as EncryptedNode);
26
26
  }),
27
27
  iterateChildrenNodeUids: jest.fn(),
28
- }
28
+ };
29
29
  // @ts-expect-error No need to implement all methods for mocking
30
30
  cache = {
31
31
  getNode: jest.fn(),
@@ -34,16 +34,16 @@ describe('nodesAccess', () => {
34
34
  isFolderChildrenLoaded: jest.fn().mockResolvedValue(false),
35
35
  setFolderChildrenLoaded: jest.fn(),
36
36
  removeNodes: jest.fn(),
37
- }
37
+ };
38
38
  // @ts-expect-error No need to implement all methods for mocking
39
39
  cryptoCache = {
40
40
  getNodeKeys: jest.fn(),
41
41
  setNodeKeys: jest.fn(),
42
- }
42
+ };
43
43
  // @ts-expect-error No need to implement all methods for mocking
44
44
  cryptoService = {
45
45
  decryptNode: jest.fn(),
46
- }
46
+ };
47
47
  // @ts-expect-error No need to implement all methods for mocking
48
48
  shareService = {
49
49
  getMyFilesIDs: jest.fn().mockResolvedValue({ volumeId: 'volumeId' }),
@@ -65,21 +65,27 @@ describe('nodesAccess', () => {
65
65
 
66
66
  it('should get node from API when cache is stale', async () => {
67
67
  const encryptedNode = { uid: 'volumeId~nodeId', parentUid: 'volumeId~parentNodeid' } as EncryptedNode;
68
- const decryptedUnparsedNode = { uid: 'volumeId~nodeId', parentUid: 'volumeId~parentNodeid', name: { ok: true, value: 'name' } } as DecryptedUnparsedNode;
68
+ const decryptedUnparsedNode = {
69
+ uid: 'volumeId~nodeId',
70
+ parentUid: 'volumeId~parentNodeid',
71
+ name: { ok: true, value: 'name' },
72
+ } as DecryptedUnparsedNode;
69
73
  const decryptedNode = {
70
74
  ...decryptedUnparsedNode,
71
75
  name: { ok: true, value: 'name' },
72
76
  isStale: false,
73
77
  activeRevision: undefined,
74
78
  folder: undefined,
75
- treeEventScopeId: "volumeId",
79
+ treeEventScopeId: 'volumeId',
76
80
  } as DecryptedNode;
77
81
  const decryptedKeys = { key: 'key' } as any as DecryptedNodeKeys;
78
82
 
79
83
  cache.getNode = jest.fn(() => Promise.resolve({ uid: 'volumeId~nodeId', isStale: true } as DecryptedNode));
80
84
  apiService.getNode = jest.fn(() => Promise.resolve(encryptedNode));
81
85
  cryptoCache.getNodeKeys = jest.fn(() => Promise.resolve({ key: 'parentKey' } as any as DecryptedNodeKeys));
82
- cryptoService.decryptNode = jest.fn(() => Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }));
86
+ cryptoService.decryptNode = jest.fn(() =>
87
+ Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }),
88
+ );
83
89
 
84
90
  const result = await access.getNode('volumeId~nodeId');
85
91
  expect(result).toEqual(decryptedNode);
@@ -92,7 +98,11 @@ describe('nodesAccess', () => {
92
98
 
93
99
  it('should get node from API missing cache', async () => {
94
100
  const encryptedNode = { uid: 'volumeId~nodeId', parentUid: 'volumeId~parentNodeid' } as EncryptedNode;
95
- const decryptedUnparsedNode = { uid: 'volumeId~nodeId', parentUid: 'volumeId~parentNodeid', name: { ok: true, value: 'name' } } as DecryptedUnparsedNode;
101
+ const decryptedUnparsedNode = {
102
+ uid: 'volumeId~nodeId',
103
+ parentUid: 'volumeId~parentNodeid',
104
+ name: { ok: true, value: 'name' },
105
+ } as DecryptedUnparsedNode;
96
106
  const decryptedNode = {
97
107
  ...decryptedUnparsedNode,
98
108
  name: { ok: true, value: 'name' },
@@ -106,7 +116,9 @@ describe('nodesAccess', () => {
106
116
  cache.getNode = jest.fn(() => Promise.reject(new Error('Entity not found')));
107
117
  apiService.getNode = jest.fn(() => Promise.resolve(encryptedNode));
108
118
  cryptoCache.getNodeKeys = jest.fn(() => Promise.resolve({ key: 'parentKey' } as any as DecryptedNodeKeys));
109
- cryptoService.decryptNode = jest.fn(() => Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }));
119
+ cryptoService.decryptNode = jest.fn(() =>
120
+ Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }),
121
+ );
110
122
 
111
123
  const result = await access.getNode('volumeId~nodeId');
112
124
  expect(result).toEqual(decryptedNode);
@@ -119,7 +131,11 @@ describe('nodesAccess', () => {
119
131
 
120
132
  it('should validate node name', async () => {
121
133
  const encryptedNode = { uid: 'volumeId~nodeId', parentUid: 'volumeId~parentNodeid' } as EncryptedNode;
122
- const decryptedUnparsedNode = { uid: 'volumeId~nodeId', parentUid: 'volumeId~parentNodeid', name: { ok: true, value: 'foo/bar' } } as DecryptedUnparsedNode;
134
+ const decryptedUnparsedNode = {
135
+ uid: 'volumeId~nodeId',
136
+ parentUid: 'volumeId~parentNodeid',
137
+ name: { ok: true, value: 'foo/bar' },
138
+ } as DecryptedUnparsedNode;
123
139
  const decryptedNode = {
124
140
  ...decryptedUnparsedNode,
125
141
  name: { ok: false, error: { name: 'foo/bar', error: "Name must not contain the character '/'" } },
@@ -130,7 +146,9 @@ describe('nodesAccess', () => {
130
146
  cache.getNode = jest.fn(() => Promise.reject(new Error('Entity not found')));
131
147
  apiService.getNode = jest.fn(() => Promise.resolve(encryptedNode));
132
148
  cryptoCache.getNodeKeys = jest.fn(() => Promise.resolve({ key: 'parentKey' } as any as DecryptedNodeKeys));
133
- cryptoService.decryptNode = jest.fn(() => Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }));
149
+ cryptoService.decryptNode = jest.fn(() =>
150
+ Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }),
151
+ );
134
152
 
135
153
  const result = await access.getNode('volumeId~nodeId');
136
154
  expect(result).toMatchObject(decryptedNode);
@@ -139,11 +157,19 @@ describe('nodesAccess', () => {
139
157
 
140
158
  describe('iterate methods', () => {
141
159
  beforeEach(() => {
142
- cryptoCache.getNodeKeys = jest.fn().mockImplementation((uid: string) => Promise.resolve({ key: 'key' } as any as DecryptedNodeKeys));
143
- cryptoService.decryptNode = jest.fn().mockImplementation((encryptedNode: EncryptedNode) => Promise.resolve({
144
- node: { uid: encryptedNode.uid, isStale: false, name: { ok: true, value: 'name' } } as DecryptedNode,
145
- keys: { key: 'key' } as any as DecryptedNodeKeys,
146
- }));
160
+ cryptoCache.getNodeKeys = jest
161
+ .fn()
162
+ .mockImplementation((uid: string) => Promise.resolve({ key: 'key' } as any as DecryptedNodeKeys));
163
+ cryptoService.decryptNode = jest.fn().mockImplementation((encryptedNode: EncryptedNode) =>
164
+ Promise.resolve({
165
+ node: {
166
+ uid: encryptedNode.uid,
167
+ isStale: false,
168
+ name: { ok: true, value: 'name' },
169
+ } as DecryptedNode,
170
+ keys: { key: 'key' } as any as DecryptedNodeKeys,
171
+ }),
172
+ );
147
173
  });
148
174
 
149
175
  describe('iterateChildren', () => {
@@ -222,7 +248,11 @@ describe('nodesAccess', () => {
222
248
  const result = await Array.fromAsync(access.iterateFolderChildren('volumeId~parentNodeid'));
223
249
  expect(result).toMatchObject([node1, node2, node3, node4]);
224
250
  expect(apiService.iterateChildrenNodeUids).toHaveBeenCalledWith('volumeId~parentNodeid', undefined);
225
- expect(apiService.iterateNodes).toHaveBeenCalledWith(['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4'], 'volumeId', undefined);
251
+ expect(apiService.iterateNodes).toHaveBeenCalledWith(
252
+ ['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4'],
253
+ 'volumeId',
254
+ undefined,
255
+ );
226
256
  expect(cryptoService.decryptNode).toHaveBeenCalledTimes(4);
227
257
  expect(cache.setNode).toHaveBeenCalledTimes(4);
228
258
  expect(cryptoCache.setNodeKeys).toHaveBeenCalledTimes(4);
@@ -243,7 +273,7 @@ describe('nodesAccess', () => {
243
273
  });
244
274
  apiService.iterateNodes = jest.fn().mockImplementation(async function* (uids: string[]) {
245
275
  // Skip first node - make it missing.
246
- yield* uids.slice(1).map((uid) => ({ uid, parentUid: parentNode.uid } as EncryptedNode));
276
+ yield* uids.slice(1).map((uid) => ({ uid, parentUid: parentNode.uid }) as EncryptedNode);
247
277
  });
248
278
 
249
279
  const result = await Array.fromAsync(access.iterateFolderChildren('volumeId~parentNodeid'));
@@ -268,7 +298,11 @@ describe('nodesAccess', () => {
268
298
  throw new DecryptionError('Decryption failed');
269
299
  }
270
300
  return Promise.resolve({
271
- node: { uid: encryptedNode.uid, isStale: false, name: { ok: true, value: 'name' } } as DecryptedNode,
301
+ node: {
302
+ uid: encryptedNode.uid,
303
+ isStale: false,
304
+ name: { ok: true, value: 'name' },
305
+ } as DecryptedNode,
272
306
  keys: { key: 'key' } as any as DecryptedNodeKeys,
273
307
  });
274
308
  });
@@ -283,11 +317,9 @@ describe('nodesAccess', () => {
283
317
  try {
284
318
  await node3;
285
319
  } catch (error: any) {
286
- expect(error.cause).toEqual([
287
- new DecryptionError('Decryption failed'),
288
- ]);
320
+ expect(error.cause).toEqual([new DecryptionError('Decryption failed')]);
289
321
  }
290
- })
322
+ });
291
323
  });
292
324
 
293
325
  describe('iterateTrashedNodes', () => {
@@ -324,7 +356,11 @@ describe('nodesAccess', () => {
324
356
  const result = await Array.fromAsync(access.iterateTrashedNodes());
325
357
  expect(result).toMatchObject([node1, node2, node3, node4]);
326
358
  expect(apiService.iterateTrashedNodeUids).toHaveBeenCalledWith(volumeId, undefined);
327
- expect(apiService.iterateNodes).toHaveBeenCalledWith(['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4'], volumeId, undefined);
359
+ expect(apiService.iterateNodes).toHaveBeenCalledWith(
360
+ ['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4'],
361
+ volumeId,
362
+ undefined,
363
+ );
328
364
  expect(cryptoService.decryptNode).toHaveBeenCalledTimes(4);
329
365
  expect(cache.setNode).toHaveBeenCalledTimes(4);
330
366
  expect(cryptoCache.setNodeKeys).toHaveBeenCalledTimes(4);
@@ -336,7 +372,7 @@ describe('nodesAccess', () => {
336
372
  });
337
373
  apiService.iterateNodes = jest.fn().mockImplementation(async function* (uids: string[]) {
338
374
  // Skip first node - make it missing.
339
- yield* uids.slice(1).map((uid) => ({ uid, parentUid: 'volumeId~parentNodeid' } as EncryptedNode));
375
+ yield* uids.slice(1).map((uid) => ({ uid, parentUid: 'volumeId~parentNodeid' }) as EncryptedNode);
340
376
  });
341
377
 
342
378
  const result = await Array.fromAsync(access.iterateTrashedNodes());
@@ -359,7 +395,9 @@ describe('nodesAccess', () => {
359
395
  yield { ok: true, node: node4 };
360
396
  });
361
397
 
362
- const result = await Array.fromAsync(access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4']));
398
+ const result = await Array.fromAsync(
399
+ access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4']),
400
+ );
363
401
  expect(result).toMatchObject([node1, node2, node3, node4]);
364
402
  expect(apiService.iterateNodes).not.toHaveBeenCalled();
365
403
  });
@@ -372,9 +410,15 @@ describe('nodesAccess', () => {
372
410
  yield { ok: true, node: node4 };
373
411
  });
374
412
 
375
- const result = await Array.fromAsync(access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4']));
413
+ const result = await Array.fromAsync(
414
+ access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4']),
415
+ );
376
416
  expect(result).toMatchObject([node1, node4, node2, node3]);
377
- expect(apiService.iterateNodes).toHaveBeenCalledWith(['volumeId~node2', 'volumeId~node3'], 'volumeId', undefined);
417
+ expect(apiService.iterateNodes).toHaveBeenCalledWith(
418
+ ['volumeId~node2', 'volumeId~node3'],
419
+ 'volumeId',
420
+ undefined,
421
+ );
378
422
  });
379
423
 
380
424
  it('should remove from cache if missing on API and return back to caller', async () => {
@@ -385,11 +429,13 @@ describe('nodesAccess', () => {
385
429
  });
386
430
  apiService.iterateNodes = jest.fn().mockImplementation(async function* (uids: string[]) {
387
431
  // Skip first node - make it missing.
388
- yield* uids.slice(1).map((uid) => ({ uid, parentUid: 'volumeId~parentNodeid' } as EncryptedNode));
432
+ yield* uids.slice(1).map((uid) => ({ uid, parentUid: 'volumeId~parentNodeid' }) as EncryptedNode);
389
433
  });
390
434
 
391
- const result = await Array.fromAsync(access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3']));
392
- expect(result).toMatchObject([node2, node3, {missingUid: 'volumeId~node1'}]);
435
+ const result = await Array.fromAsync(
436
+ access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3']),
437
+ );
438
+ expect(result).toMatchObject([node2, node3, { missingUid: 'volumeId~node1' }]);
393
439
  expect(cache.removeNodes).toHaveBeenCalledWith(['volumeId~node1']);
394
440
  });
395
441
 
@@ -407,10 +453,10 @@ describe('nodesAccess', () => {
407
453
  yield* uids.map((uid) => {
408
454
  const parentUid = uid.replace('node', 'parentOfNode');
409
455
  return {
410
- uid,
411
- parentUid,
412
- encryptedCrypto,
413
- } as EncryptedNode
456
+ uid,
457
+ parentUid,
458
+ encryptedCrypto,
459
+ } as EncryptedNode;
414
460
  });
415
461
  });
416
462
  const decryptionError = new DecryptionError('Parent cannot be decrypted');
@@ -419,19 +465,27 @@ describe('nodesAccess', () => {
419
465
  throw decryptionError;
420
466
  }
421
467
  return {
422
- key: {_idx: 32132},
468
+ key: { _idx: 32132 },
423
469
  } as any;
424
- } );
470
+ });
425
471
 
426
- const result = await Array.fromAsync(access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3']));
472
+ const result = await Array.fromAsync(
473
+ access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3']),
474
+ );
427
475
  expect(result).toEqual([
428
476
  {
429
477
  ...node1,
430
478
  encryptedCrypto,
431
479
  parentUid: 'volumeId~parentOfNode1',
432
480
  name: { ok: false, error: decryptionError },
433
- keyAuthor: { ok: false, error: { claimedAuthor: 'signatureEmail', error: decryptionError.message } },
434
- nameAuthor: { ok: false, error: { claimedAuthor: 'nameSignatureEmail', error: decryptionError.message } },
481
+ keyAuthor: {
482
+ ok: false,
483
+ error: { claimedAuthor: 'signatureEmail', error: decryptionError.message },
484
+ },
485
+ nameAuthor: {
486
+ ok: false,
487
+ error: { claimedAuthor: 'nameSignatureEmail', error: decryptionError.message },
488
+ },
435
489
  errors: [decryptionError],
436
490
  },
437
491
  {
@@ -530,30 +584,42 @@ describe('nodesAccess', () => {
530
584
  const nodeUid = 'volumeId~nodeId';
531
585
 
532
586
  it('should return node URL of document', async () => {
533
- jest.spyOn(access, 'getNode').mockReturnValue(Promise.resolve({ mediaType: 'application/vnd.proton.doc' } as any as DecryptedNode));
587
+ jest.spyOn(access, 'getNode').mockReturnValue(
588
+ Promise.resolve({ mediaType: 'application/vnd.proton.doc' } as any as DecryptedNode),
589
+ );
534
590
 
535
591
  const result = await access.getNodeUrl(nodeUid);
536
592
  expect(result).toBe('https://docs.proton.me/doc?type=doc&mode=open&volumeId=volumeId&linkId=nodeId');
537
593
  });
538
594
 
539
595
  it('should return node URL of sheet', async () => {
540
- jest.spyOn(access, 'getNode').mockReturnValue(Promise.resolve({ mediaType: 'application/vnd.proton.sheet' } as any as DecryptedNode));
596
+ jest.spyOn(access, 'getNode').mockReturnValue(
597
+ Promise.resolve({ mediaType: 'application/vnd.proton.sheet' } as any as DecryptedNode),
598
+ );
541
599
 
542
600
  const result = await access.getNodeUrl(nodeUid);
543
601
  expect(result).toBe('https://docs.proton.me/doc?type=sheet&mode=open&volumeId=volumeId&linkId=nodeId');
544
602
  });
545
603
 
546
604
  it('should return node URL of image', async () => {
547
- jest.spyOn(access, 'getNode').mockReturnValue(Promise.resolve({ type: NodeType.File } as any as DecryptedNode));
548
- jest.spyOn(access as any, 'getRootNode').mockReturnValue(Promise.resolve({ shareId: 'shareId', type: NodeType.Folder } as any as DecryptedNode));
605
+ jest.spyOn(access, 'getNode').mockReturnValue(
606
+ Promise.resolve({ type: NodeType.File } as any as DecryptedNode),
607
+ );
608
+ jest.spyOn(access as any, 'getRootNode').mockReturnValue(
609
+ Promise.resolve({ shareId: 'shareId', type: NodeType.Folder } as any as DecryptedNode),
610
+ );
549
611
 
550
612
  const result = await access.getNodeUrl(nodeUid);
551
613
  expect(result).toBe('https://drive.proton.me/shareId/file/nodeId');
552
614
  });
553
615
 
554
616
  it('should return node URL of folder', async () => {
555
- jest.spyOn(access, 'getNode').mockReturnValue(Promise.resolve({ type: NodeType.Folder } as any as DecryptedNode));
556
- jest.spyOn(access as any, 'getRootNode').mockReturnValue(Promise.resolve({ shareId: 'shareId', type: NodeType.Folder } as any as DecryptedNode));
617
+ jest.spyOn(access, 'getNode').mockReturnValue(
618
+ Promise.resolve({ type: NodeType.Folder } as any as DecryptedNode),
619
+ );
620
+ jest.spyOn(access as any, 'getRootNode').mockReturnValue(
621
+ Promise.resolve({ shareId: 'shareId', type: NodeType.Folder } as any as DecryptedNode),
622
+ );
557
623
 
558
624
  const result = await access.getNodeUrl(nodeUid);
559
625
  expect(result).toBe('https://drive.proton.me/shareId/folder/nodeId');
@@ -567,7 +633,7 @@ describe('nodesAccess', () => {
567
633
  cache.setNode = jest.fn();
568
634
  await access.notifyNodeChanged(node.uid);
569
635
  expect(cache.getNode).toHaveBeenCalledWith(node.uid);
570
- expect(cache.setNode).toHaveBeenCalledWith({...node, isStale: true});
636
+ expect(cache.setNode).toHaveBeenCalledWith({ ...node, isStale: true });
571
637
  });
572
638
  it('should update parent if needed', async () => {
573
639
  const node = { uid: 'volumeId~nodeId', parentUid: 'v1~pn1', isStale: false } as DecryptedNode;
@@ -575,7 +641,7 @@ describe('nodesAccess', () => {
575
641
  cache.setNode = jest.fn();
576
642
  await access.notifyNodeChanged(node.uid, 'v1~pn2');
577
643
  expect(cache.getNode).toHaveBeenCalledWith(node.uid);
578
- expect(cache.setNode).toHaveBeenCalledWith({...node, parentUid: 'v1~pn2', isStale: true});
644
+ expect(cache.setNode).toHaveBeenCalledWith({ ...node, parentUid: 'v1~pn2', isStale: true });
579
645
  });
580
646
  });
581
647
 
@@ -1,19 +1,19 @@
1
1
  import { c } from 'ttag';
2
2
 
3
- import { PrivateKey, SessionKey } from "../../crypto";
4
- import { InvalidNameError, Logger, MissingNode, NodeType, Result, resultError, resultOk } from "../../interface";
5
- import { DecryptionError, ProtonDriveError } from "../../errors";
3
+ import { PrivateKey, SessionKey } from '../../crypto';
4
+ import { InvalidNameError, Logger, MissingNode, NodeType, Result, resultError, resultOk } from '../../interface';
5
+ import { DecryptionError, ProtonDriveError } from '../../errors';
6
6
  import { asyncIteratorMap } from '../asyncIteratorMap';
7
7
  import { getErrorMessage } from '../errors';
8
- import { BatchLoading } from "../batchLoading";
9
- import { makeNodeUid, splitNodeUid } from "../uids";
10
- import { NodeAPIService } from "./apiService";
11
- import { NodesCache } from "./cache"
12
- import { NodesCryptoCache } from "./cryptoCache";
13
- import { NodesCryptoService } from "./cryptoService";
14
- import { parseFileExtendedAttributes, parseFolderExtendedAttributes } from "./extendedAttributes";
15
- import { SharesService, EncryptedNode, DecryptedUnparsedNode, DecryptedNode, DecryptedNodeKeys } from "./interface";
16
- import { validateNodeName } from "./validations";
8
+ import { BatchLoading } from '../batchLoading';
9
+ import { makeNodeUid, splitNodeUid } from '../uids';
10
+ import { NodeAPIService } from './apiService';
11
+ import { NodesCache } from './cache';
12
+ import { NodesCryptoCache } from './cryptoCache';
13
+ import { NodesCryptoService } from './cryptoService';
14
+ import { parseFileExtendedAttributes, parseFolderExtendedAttributes } from './extendedAttributes';
15
+ import { SharesService, EncryptedNode, DecryptedUnparsedNode, DecryptedNode, DecryptedNodeKeys } from './interface';
16
+ import { validateNodeName } from './validations';
17
17
  import { isProtonDocument, isProtonSheet } from './mediaTypes';
18
18
 
19
19
  // This is the number of nodes that are loaded in parallel.
@@ -59,7 +59,7 @@ export class NodesAccess {
59
59
  let cachedNode;
60
60
  try {
61
61
  cachedNode = await this.cache.getNode(nodeUid);
62
- } catch { }
62
+ } catch {}
63
63
 
64
64
  if (cachedNode && !cachedNode.isStale) {
65
65
  return cachedNode;
@@ -75,7 +75,10 @@ export class NodesAccess {
75
75
  // Ensure the parent is loaded and up-to-date.
76
76
  const parentNode = await this.getNode(parentNodeUid);
77
77
 
78
- const batchLoading = new BatchLoading<string, DecryptedNode>({ iterateItems: (nodeUids) => this.loadNodes(nodeUids, signal), batchSize: BATCH_LOADING_SIZE });
78
+ const batchLoading = new BatchLoading<string, DecryptedNode>({
79
+ iterateItems: (nodeUids) => this.loadNodes(nodeUids, signal),
80
+ batchSize: BATCH_LOADING_SIZE,
81
+ });
79
82
 
80
83
  const areChildrenCached = await this.cache.isFolderChildrenLoaded(parentNodeUid);
81
84
  if (areChildrenCached) {
@@ -95,7 +98,7 @@ export class NodesAccess {
95
98
  let node;
96
99
  try {
97
100
  node = await this.cache.getNode(nodeUid);
98
- } catch { }
101
+ } catch {}
99
102
 
100
103
  if (node && !node.isStale) {
101
104
  yield node;
@@ -111,12 +114,15 @@ export class NodesAccess {
111
114
  // Improvement requested: keep status of loaded trash and leverage cache.
112
115
  async *iterateTrashedNodes(signal?: AbortSignal): AsyncGenerator<DecryptedNode> {
113
116
  const { volumeId } = await this.shareService.getMyFilesIDs();
114
- const batchLoading = new BatchLoading<string, DecryptedNode>({ iterateItems: (nodeUids) => this.loadNodes(nodeUids, signal), batchSize: BATCH_LOADING_SIZE });
117
+ const batchLoading = new BatchLoading<string, DecryptedNode>({
118
+ iterateItems: (nodeUids) => this.loadNodes(nodeUids, signal),
119
+ batchSize: BATCH_LOADING_SIZE,
120
+ });
115
121
  for await (const nodeUid of this.apiService.iterateTrashedNodeUids(volumeId, signal)) {
116
122
  let node;
117
123
  try {
118
124
  node = await this.cache.getNode(nodeUid);
119
- } catch { }
125
+ } catch {}
120
126
 
121
127
  if (node && !node.isStale) {
122
128
  yield node;
@@ -129,7 +135,10 @@ export class NodesAccess {
129
135
  }
130
136
 
131
137
  async *iterateNodes(nodeUids: string[], signal?: AbortSignal): AsyncGenerator<DecryptedNode | MissingNode> {
132
- const batchLoading = new BatchLoading<string, DecryptedNode | MissingNode>({ iterateItems: (nodeUids) => this.loadNodesWithMissingReport(nodeUids, signal), batchSize: BATCH_LOADING_SIZE });
138
+ const batchLoading = new BatchLoading<string, DecryptedNode | MissingNode>({
139
+ iterateItems: (nodeUids) => this.loadNodesWithMissingReport(nodeUids, signal),
140
+ batchSize: BATCH_LOADING_SIZE,
141
+ });
133
142
  for await (const result of this.cache.iterateNodes(nodeUids)) {
134
143
  if (result.ok && !result.node.isStale) {
135
144
  yield result.node;
@@ -176,13 +185,13 @@ export class NodesAccess {
176
185
  await this.cache.removeNodes([nodeUid]);
177
186
  }
178
187
 
179
- private async loadNode(nodeUid: string): Promise<{ node: DecryptedNode, keys?: DecryptedNodeKeys }> {
188
+ private async loadNode(nodeUid: string): Promise<{ node: DecryptedNode; keys?: DecryptedNodeKeys }> {
180
189
  const { volumeId: ownVolumeId } = await this.shareService.getMyFilesIDs();
181
190
  const encryptedNode = await this.apiService.getNode(nodeUid, ownVolumeId);
182
191
  return this.decryptNode(encryptedNode);
183
192
  }
184
193
 
185
- private async* loadNodes(nodeUids: string[], signal?: AbortSignal): AsyncGenerator<DecryptedNode> {
194
+ private async *loadNodes(nodeUids: string[], signal?: AbortSignal): AsyncGenerator<DecryptedNode> {
186
195
  for await (const result of this.loadNodesWithMissingReport(nodeUids, signal)) {
187
196
  if ('missingUid' in result) {
188
197
  continue;
@@ -191,7 +200,10 @@ export class NodesAccess {
191
200
  }
192
201
  }
193
202
 
194
- private async* loadNodesWithMissingReport(nodeUids: string[], signal?: AbortSignal): AsyncGenerator<DecryptedNode | MissingNode> {
203
+ private async *loadNodesWithMissingReport(
204
+ nodeUids: string[],
205
+ signal?: AbortSignal,
206
+ ): AsyncGenerator<DecryptedNode | MissingNode> {
195
207
  const returnedNodeUids: string[] = [];
196
208
  const errors = [];
197
209
 
@@ -207,7 +219,11 @@ export class NodesAccess {
207
219
  return resultError(error);
208
220
  }
209
221
  };
210
- const decryptedNodesIterator = asyncIteratorMap(encryptedNodesIterator, decryptNodeMapper, DECRYPTION_CONCURRENCY);
222
+ const decryptedNodesIterator = asyncIteratorMap(
223
+ encryptedNodesIterator,
224
+ decryptNodeMapper,
225
+ DECRYPTION_CONCURRENCY,
226
+ );
211
227
  for await (const node of decryptedNodesIterator) {
212
228
  if (node.ok) {
213
229
  yield node.value;
@@ -232,7 +248,9 @@ export class NodesAccess {
232
248
  }
233
249
  }
234
250
 
235
- private async decryptNode(encryptedNode: EncryptedNode): Promise<{ node: DecryptedNode, keys?: DecryptedNodeKeys }> {
251
+ private async decryptNode(
252
+ encryptedNode: EncryptedNode,
253
+ ): Promise<{ node: DecryptedNode; keys?: DecryptedNodeKeys }> {
236
254
  let parentKey;
237
255
  try {
238
256
  const parentKeys = await this.getParentKeys(encryptedNode);
@@ -299,18 +317,20 @@ export class NodesAccess {
299
317
  return {
300
318
  ...unparsedNode,
301
319
  isStale: false,
302
- activeRevision: !unparsedNode.activeRevision?.ok ? unparsedNode.activeRevision : resultOk({
303
- uid: unparsedNode.activeRevision.value.uid,
304
- state: unparsedNode.activeRevision.value.state,
305
- creationTime: unparsedNode.activeRevision.value.creationTime,
306
- storageSize: unparsedNode.activeRevision.value.storageSize,
307
- contentAuthor: unparsedNode.activeRevision.value.contentAuthor,
308
- thumbnails: unparsedNode.activeRevision.value.thumbnails,
309
- ...extendedAttributes,
310
- }),
320
+ activeRevision: !unparsedNode.activeRevision?.ok
321
+ ? unparsedNode.activeRevision
322
+ : resultOk({
323
+ uid: unparsedNode.activeRevision.value.uid,
324
+ state: unparsedNode.activeRevision.value.state,
325
+ creationTime: unparsedNode.activeRevision.value.creationTime,
326
+ storageSize: unparsedNode.activeRevision.value.storageSize,
327
+ contentAuthor: unparsedNode.activeRevision.value.contentAuthor,
328
+ thumbnails: unparsedNode.activeRevision.value.thumbnails,
329
+ ...extendedAttributes,
330
+ }),
311
331
  folder: undefined,
312
332
  treeEventScopeId: splitNodeUid(unparsedNode.uid).volumeId,
313
- }
333
+ };
314
334
  }
315
335
 
316
336
  const extendedAttributes = unparsedNode.folder?.extendedAttributes
@@ -321,14 +341,18 @@ export class NodesAccess {
321
341
  name: nodeName,
322
342
  isStale: false,
323
343
  activeRevision: undefined,
324
- folder: extendedAttributes ? {
325
- ...extendedAttributes,
326
- } : undefined,
344
+ folder: extendedAttributes
345
+ ? {
346
+ ...extendedAttributes,
347
+ }
348
+ : undefined,
327
349
  treeEventScopeId: splitNodeUid(unparsedNode.uid).volumeId,
328
- }
350
+ };
329
351
  }
330
352
 
331
- async getParentKeys(node: Pick<DecryptedNode, 'parentUid' | 'shareId'>): Promise<Pick<DecryptedNodeKeys, 'key' | 'hashKey'>> {
353
+ async getParentKeys(
354
+ node: Pick<DecryptedNode, 'parentUid' | 'shareId'>,
355
+ ): Promise<Pick<DecryptedNodeKeys, 'key' | 'hashKey'>> {
332
356
  if (node.parentUid) {
333
357
  try {
334
358
  return await this.getNodeKeys(node.parentUid);
@@ -345,7 +369,7 @@ export class NodesAccess {
345
369
  if (node.shareId) {
346
370
  return {
347
371
  key: await this.shareService.getSharePrivateKey(node.shareId),
348
- }
372
+ };
349
373
  }
350
374
  // This is bug that should not happen.
351
375
  // API cannot provide node without parent or share.
@@ -365,11 +389,11 @@ export class NodesAccess {
365
389
  }
366
390
 
367
391
  async getNodePrivateAndSessionKeys(nodeUid: string): Promise<{
368
- key: PrivateKey,
369
- passphrase: string,
370
- passphraseSessionKey: SessionKey,
371
- contentKeyPacketSessionKey?: SessionKey,
372
- nameSessionKey: SessionKey,
392
+ key: PrivateKey;
393
+ passphrase: string;
394
+ passphraseSessionKey: SessionKey;
395
+ contentKeyPacketSessionKey?: SessionKey;
396
+ nameSessionKey: SessionKey;
373
397
  }> {
374
398
  const node = await this.getNode(nodeUid);
375
399
  const { key: parentKey } = await this.getParentKeys(node);
@@ -385,10 +409,10 @@ export class NodesAccess {
385
409
  }
386
410
 
387
411
  async getRootNodeEmailKey(nodeUid: string): Promise<{
388
- email: string,
389
- addressId: string,
390
- addressKey: PrivateKey,
391
- addressKeyId: string,
412
+ email: string;
413
+ addressId: string;
414
+ addressKey: PrivateKey;
415
+ addressKeyId: string;
392
416
  }> {
393
417
  const rootNode = await this.getRootNode(nodeUid);
394
418
  if (!rootNode.shareId) {
@@ -418,5 +442,5 @@ export class NodesAccess {
418
442
  private async getRootNode(nodeUid: string): Promise<DecryptedNode> {
419
443
  const node = await this.getNode(nodeUid);
420
444
  return node.parentUid ? this.getRootNode(node.parentUid) : node;
421
- };
445
+ }
422
446
  }