@protontech/drive-sdk 0.0.13 → 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 (496) hide show
  1. package/dist/cache/index.d.ts +1 -0
  2. package/dist/cache/index.js +3 -1
  3. package/dist/cache/index.js.map +1 -1
  4. package/dist/cache/memoryCache.d.ts +1 -1
  5. package/dist/cache/memoryCache.js +0 -1
  6. package/dist/cache/memoryCache.js.map +1 -1
  7. package/dist/cache/memoryCache.test.js +2 -4
  8. package/dist/cache/memoryCache.test.js.map +1 -1
  9. package/dist/cache/nullCache.d.ts +14 -0
  10. package/dist/cache/nullCache.js +36 -0
  11. package/dist/cache/nullCache.js.map +1 -0
  12. package/dist/config.d.ts +16 -1
  13. package/dist/config.js +1 -1
  14. package/dist/config.js.map +1 -1
  15. package/dist/crypto/driveCrypto.d.ts +2 -5
  16. package/dist/crypto/driveCrypto.js +7 -12
  17. package/dist/crypto/driveCrypto.js.map +1 -1
  18. package/dist/crypto/driveCrypto.test.js +14 -14
  19. package/dist/crypto/openPGPCrypto.js +5 -3
  20. package/dist/crypto/openPGPCrypto.js.map +1 -1
  21. package/dist/diagnostic/eventsGenerator.d.ts +14 -0
  22. package/dist/diagnostic/eventsGenerator.js +49 -0
  23. package/dist/diagnostic/eventsGenerator.js.map +1 -0
  24. package/dist/diagnostic/httpClient.d.ts +16 -0
  25. package/dist/diagnostic/httpClient.js +81 -0
  26. package/dist/diagnostic/httpClient.js.map +1 -0
  27. package/dist/diagnostic/index.d.ts +10 -0
  28. package/dist/diagnostic/index.js +35 -0
  29. package/dist/diagnostic/index.js.map +1 -0
  30. package/dist/diagnostic/integrityVerificationStream.d.ts +21 -0
  31. package/dist/diagnostic/integrityVerificationStream.js +56 -0
  32. package/dist/diagnostic/integrityVerificationStream.js.map +1 -0
  33. package/dist/diagnostic/interface.d.ts +102 -0
  34. package/dist/diagnostic/interface.js +3 -0
  35. package/dist/diagnostic/interface.js.map +1 -0
  36. package/dist/diagnostic/sdkDiagnostic.d.ts +22 -0
  37. package/dist/diagnostic/sdkDiagnostic.js +222 -0
  38. package/dist/diagnostic/sdkDiagnostic.js.map +1 -0
  39. package/dist/diagnostic/sdkDiagnosticFull.d.ts +18 -0
  40. package/dist/diagnostic/sdkDiagnosticFull.js +35 -0
  41. package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -0
  42. package/dist/diagnostic/telemetry.d.ts +25 -0
  43. package/dist/diagnostic/telemetry.js +70 -0
  44. package/dist/diagnostic/telemetry.js.map +1 -0
  45. package/dist/diagnostic/zipGenerators.d.ts +9 -0
  46. package/dist/diagnostic/zipGenerators.js +64 -0
  47. package/dist/diagnostic/zipGenerators.js.map +1 -0
  48. package/dist/diagnostic/zipGenerators.test.js +144 -0
  49. package/dist/diagnostic/zipGenerators.test.js.map +1 -0
  50. package/dist/errors.d.ts +2 -1
  51. package/dist/errors.js +3 -1
  52. package/dist/errors.js.map +1 -1
  53. package/dist/interface/config.d.ts +26 -0
  54. package/dist/interface/config.js +3 -0
  55. package/dist/interface/config.js.map +1 -0
  56. package/dist/interface/download.d.ts +2 -2
  57. package/dist/interface/events.d.ts +58 -20
  58. package/dist/interface/events.js +11 -1
  59. package/dist/interface/events.js.map +1 -1
  60. package/dist/interface/httpClient.d.ts +0 -14
  61. package/dist/interface/index.d.ts +11 -7
  62. package/dist/interface/index.js +2 -2
  63. package/dist/interface/index.js.map +1 -1
  64. package/dist/interface/nodes.d.ts +9 -0
  65. package/dist/interface/nodes.js.map +1 -1
  66. package/dist/interface/result.js.map +1 -1
  67. package/dist/interface/sharing.d.ts +2 -0
  68. package/dist/interface/sharing.js.map +1 -1
  69. package/dist/interface/telemetry.js +0 -8
  70. package/dist/interface/telemetry.js.map +1 -1
  71. package/dist/interface/thumbnail.js.map +1 -1
  72. package/dist/interface/upload.d.ts +7 -1
  73. package/dist/internal/apiService/apiService.d.ts +1 -1
  74. package/dist/internal/apiService/apiService.js +7 -11
  75. package/dist/internal/apiService/apiService.js.map +1 -1
  76. package/dist/internal/apiService/apiService.test.js +55 -48
  77. package/dist/internal/apiService/apiService.test.js.map +1 -1
  78. package/dist/internal/apiService/coreTypes.d.ts +2356 -2356
  79. package/dist/internal/apiService/driveTypes.d.ts +1680 -1680
  80. package/dist/internal/apiService/errors.js +14 -8
  81. package/dist/internal/apiService/errors.js.map +1 -1
  82. package/dist/internal/apiService/errors.test.js +17 -12
  83. package/dist/internal/apiService/errors.test.js.map +1 -1
  84. package/dist/internal/apiService/transformers.d.ts +1 -1
  85. package/dist/internal/apiService/transformers.js +1 -1
  86. package/dist/internal/asyncIteratorMap.test.js +2 -2
  87. package/dist/internal/asyncIteratorMap.test.js.map +1 -1
  88. package/dist/internal/asyncIteratorRace.d.ts +13 -0
  89. package/dist/internal/asyncIteratorRace.js +59 -0
  90. package/dist/internal/asyncIteratorRace.js.map +1 -0
  91. package/dist/internal/asyncIteratorRace.test.d.ts +1 -0
  92. package/dist/internal/asyncIteratorRace.test.js +119 -0
  93. package/dist/internal/asyncIteratorRace.test.js.map +1 -0
  94. package/dist/internal/batch.d.ts +1 -0
  95. package/dist/internal/batch.js +12 -0
  96. package/dist/internal/batch.js.map +1 -0
  97. package/dist/internal/batch.test.d.ts +1 -0
  98. package/dist/internal/batch.test.js +41 -0
  99. package/dist/internal/batch.test.js.map +1 -0
  100. package/dist/internal/batchLoading.js.map +1 -1
  101. package/dist/internal/batchLoading.test.js +13 -13
  102. package/dist/internal/batchLoading.test.js.map +1 -1
  103. package/dist/internal/devices/apiService.d.ts +3 -3
  104. package/dist/internal/devices/apiService.js +2 -2
  105. package/dist/internal/devices/apiService.js.map +1 -1
  106. package/dist/internal/devices/cryptoService.js +1 -2
  107. package/dist/internal/devices/cryptoService.js.map +1 -1
  108. package/dist/internal/devices/index.d.ts +5 -5
  109. package/dist/internal/devices/index.js.map +1 -1
  110. package/dist/internal/devices/interface.d.ts +3 -3
  111. package/dist/internal/devices/manager.js +2 -2
  112. package/dist/internal/devices/manager.js.map +1 -1
  113. package/dist/internal/devices/manager.test.js +38 -7
  114. package/dist/internal/devices/manager.test.js.map +1 -1
  115. package/dist/internal/download/apiService.d.ts +4 -4
  116. package/dist/internal/download/apiService.js +32 -32
  117. package/dist/internal/download/apiService.js.map +1 -1
  118. package/dist/internal/download/cryptoService.d.ts +4 -4
  119. package/dist/internal/download/cryptoService.js +6 -5
  120. package/dist/internal/download/cryptoService.js.map +1 -1
  121. package/dist/internal/download/fileDownloader.d.ts +6 -6
  122. package/dist/internal/download/fileDownloader.js +3 -2
  123. package/dist/internal/download/fileDownloader.js.map +1 -1
  124. package/dist/internal/download/fileDownloader.test.js +1 -1
  125. package/dist/internal/download/fileDownloader.test.js.map +1 -1
  126. package/dist/internal/download/index.d.ts +5 -5
  127. package/dist/internal/download/index.js +5 -5
  128. package/dist/internal/download/index.js.map +1 -1
  129. package/dist/internal/download/interface.d.ts +3 -4
  130. package/dist/internal/download/telemetry.d.ts +3 -3
  131. package/dist/internal/download/telemetry.js +4 -2
  132. package/dist/internal/download/telemetry.js.map +1 -1
  133. package/dist/internal/download/telemetry.test.js +8 -8
  134. package/dist/internal/download/telemetry.test.js.map +1 -1
  135. package/dist/internal/download/thumbnailDownloader.d.ts +4 -4
  136. package/dist/internal/download/thumbnailDownloader.js +6 -6
  137. package/dist/internal/download/thumbnailDownloader.js.map +1 -1
  138. package/dist/internal/download/thumbnailDownloader.test.js.map +1 -1
  139. package/dist/internal/errors.d.ts +1 -1
  140. package/dist/internal/errors.js +1 -3
  141. package/dist/internal/errors.js.map +1 -1
  142. package/dist/internal/events/apiService.d.ts +5 -7
  143. package/dist/internal/events/apiService.js +19 -22
  144. package/dist/internal/events/apiService.js.map +1 -1
  145. package/dist/internal/events/coreEventManager.d.ts +9 -12
  146. package/dist/internal/events/coreEventManager.js +19 -36
  147. package/dist/internal/events/coreEventManager.js.map +1 -1
  148. package/dist/internal/events/coreEventManager.test.d.ts +1 -0
  149. package/dist/internal/events/coreEventManager.test.js +87 -0
  150. package/dist/internal/events/coreEventManager.test.js.map +1 -0
  151. package/dist/internal/events/eventManager.d.ts +11 -36
  152. package/dist/internal/events/eventManager.js +59 -106
  153. package/dist/internal/events/eventManager.js.map +1 -1
  154. package/dist/internal/events/eventManager.test.js +177 -83
  155. package/dist/internal/events/eventManager.test.js.map +1 -1
  156. package/dist/internal/events/index.d.ts +16 -36
  157. package/dist/internal/events/index.js +56 -72
  158. package/dist/internal/events/index.js.map +1 -1
  159. package/dist/internal/events/interface.d.ts +59 -14
  160. package/dist/internal/events/interface.js +12 -3
  161. package/dist/internal/events/interface.js.map +1 -1
  162. package/dist/internal/events/volumeEventManager.d.ts +9 -19
  163. package/dist/internal/events/volumeEventManager.js +58 -45
  164. package/dist/internal/events/volumeEventManager.js.map +1 -1
  165. package/dist/internal/events/volumeEventManager.test.d.ts +1 -0
  166. package/dist/internal/events/volumeEventManager.test.js +203 -0
  167. package/dist/internal/events/volumeEventManager.test.js.map +1 -0
  168. package/dist/internal/nodes/apiService.d.ts +4 -3
  169. package/dist/internal/nodes/apiService.js +36 -15
  170. package/dist/internal/nodes/apiService.js.map +1 -1
  171. package/dist/internal/nodes/apiService.test.js +60 -41
  172. package/dist/internal/nodes/apiService.test.js.map +1 -1
  173. package/dist/internal/nodes/cache.d.ts +14 -5
  174. package/dist/internal/nodes/cache.js +31 -7
  175. package/dist/internal/nodes/cache.js.map +1 -1
  176. package/dist/internal/nodes/cache.test.js +31 -9
  177. package/dist/internal/nodes/cache.test.js.map +1 -1
  178. package/dist/internal/nodes/cryptoCache.d.ts +2 -2
  179. package/dist/internal/nodes/cryptoCache.js.map +1 -1
  180. package/dist/internal/nodes/cryptoCache.test.js +24 -4
  181. package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
  182. package/dist/internal/nodes/cryptoService.d.ts +4 -4
  183. package/dist/internal/nodes/cryptoService.js +11 -17
  184. package/dist/internal/nodes/cryptoService.js.map +1 -1
  185. package/dist/internal/nodes/cryptoService.test.js +320 -241
  186. package/dist/internal/nodes/cryptoService.test.js.map +1 -1
  187. package/dist/internal/nodes/events.d.ts +8 -84
  188. package/dist/internal/nodes/events.js +43 -217
  189. package/dist/internal/nodes/events.js.map +1 -1
  190. package/dist/internal/nodes/events.test.js +35 -279
  191. package/dist/internal/nodes/events.test.js.map +1 -1
  192. package/dist/internal/nodes/extendedAttributes.d.ts +1 -1
  193. package/dist/internal/nodes/extendedAttributes.js +3 -1
  194. package/dist/internal/nodes/extendedAttributes.js.map +1 -1
  195. package/dist/internal/nodes/extendedAttributes.test.js +7 -10
  196. package/dist/internal/nodes/extendedAttributes.test.js.map +1 -1
  197. package/dist/internal/nodes/index.d.ts +12 -13
  198. package/dist/internal/nodes/index.js +5 -5
  199. package/dist/internal/nodes/index.js.map +1 -1
  200. package/dist/internal/nodes/index.test.js +24 -32
  201. package/dist/internal/nodes/index.test.js.map +1 -1
  202. package/dist/internal/nodes/interface.d.ts +2 -2
  203. package/dist/internal/nodes/nodesAccess.d.ts +22 -7
  204. package/dist/internal/nodes/nodesAccess.js +65 -16
  205. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  206. package/dist/internal/nodes/nodesAccess.test.js +165 -101
  207. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  208. package/dist/internal/nodes/nodesManagement.d.ts +7 -9
  209. package/dist/internal/nodes/nodesManagement.js +21 -33
  210. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  211. package/dist/internal/nodes/nodesManagement.test.js +42 -21
  212. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  213. package/dist/internal/nodes/nodesRevisions.d.ts +4 -4
  214. package/dist/internal/nodes/nodesRevisions.js.map +1 -1
  215. package/dist/internal/photos/albums.d.ts +3 -3
  216. package/dist/internal/photos/albums.js.map +1 -1
  217. package/dist/internal/photos/apiService.d.ts +1 -1
  218. package/dist/internal/photos/apiService.js +3 -6
  219. package/dist/internal/photos/apiService.js.map +1 -1
  220. package/dist/internal/photos/cache.d.ts +1 -1
  221. package/dist/internal/photos/index.d.ts +5 -5
  222. package/dist/internal/photos/index.js.map +1 -1
  223. package/dist/internal/photos/interface.d.ts +2 -2
  224. package/dist/internal/photos/photosTimeline.d.ts +3 -3
  225. package/dist/internal/photos/photosTimeline.js +1 -2
  226. package/dist/internal/photos/photosTimeline.js.map +1 -1
  227. package/dist/internal/sdkEvents.d.ts +1 -1
  228. package/dist/internal/sdkEvents.js +2 -7
  229. package/dist/internal/sdkEvents.js.map +1 -1
  230. package/dist/internal/sdkEvents.test.js +8 -8
  231. package/dist/internal/shares/apiService.d.ts +2 -2
  232. package/dist/internal/shares/apiService.js +5 -3
  233. package/dist/internal/shares/apiService.js.map +1 -1
  234. package/dist/internal/shares/cache.d.ts +4 -2
  235. package/dist/internal/shares/cache.js +14 -6
  236. package/dist/internal/shares/cache.js.map +1 -1
  237. package/dist/internal/shares/cache.test.js.map +1 -1
  238. package/dist/internal/shares/cryptoCache.d.ts +2 -2
  239. package/dist/internal/shares/cryptoCache.test.js +8 -2
  240. package/dist/internal/shares/cryptoCache.test.js.map +1 -1
  241. package/dist/internal/shares/cryptoService.d.ts +3 -3
  242. package/dist/internal/shares/cryptoService.js.map +1 -1
  243. package/dist/internal/shares/cryptoService.test.js +42 -42
  244. package/dist/internal/shares/cryptoService.test.js.map +1 -1
  245. package/dist/internal/shares/index.d.ts +4 -4
  246. package/dist/internal/shares/index.js.map +1 -1
  247. package/dist/internal/shares/interface.d.ts +2 -2
  248. package/dist/internal/shares/manager.d.ts +8 -7
  249. package/dist/internal/shares/manager.js +3 -0
  250. package/dist/internal/shares/manager.js.map +1 -1
  251. package/dist/internal/shares/manager.test.js +71 -63
  252. package/dist/internal/shares/manager.test.js.map +1 -1
  253. package/dist/internal/sharing/apiService.d.ts +4 -4
  254. package/dist/internal/sharing/apiService.js +5 -3
  255. package/dist/internal/sharing/apiService.js.map +1 -1
  256. package/dist/internal/sharing/cache.d.ts +1 -1
  257. package/dist/internal/sharing/cache.test.js +33 -33
  258. package/dist/internal/sharing/cryptoService.d.ts +3 -3
  259. package/dist/internal/sharing/cryptoService.js +3 -4
  260. package/dist/internal/sharing/cryptoService.js.map +1 -1
  261. package/dist/internal/sharing/cryptoService.test.js +39 -39
  262. package/dist/internal/sharing/cryptoService.test.js.map +1 -1
  263. package/dist/internal/sharing/events.d.ts +24 -56
  264. package/dist/internal/sharing/events.js +45 -138
  265. package/dist/internal/sharing/events.js.map +1 -1
  266. package/dist/internal/sharing/events.test.js +85 -189
  267. package/dist/internal/sharing/events.test.js.map +1 -1
  268. package/dist/internal/sharing/index.d.ts +8 -9
  269. package/dist/internal/sharing/index.js +5 -5
  270. package/dist/internal/sharing/index.js.map +1 -1
  271. package/dist/internal/sharing/interface.d.ts +8 -4
  272. package/dist/internal/sharing/sharingAccess.d.ts +6 -6
  273. package/dist/internal/sharing/sharingAccess.js +8 -4
  274. package/dist/internal/sharing/sharingAccess.js.map +1 -1
  275. package/dist/internal/sharing/sharingAccess.test.js +45 -39
  276. package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
  277. package/dist/internal/sharing/sharingManagement.d.ts +5 -6
  278. package/dist/internal/sharing/sharingManagement.js +12 -16
  279. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  280. package/dist/internal/sharing/sharingManagement.test.js +305 -286
  281. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  282. package/dist/internal/uids.js.map +1 -1
  283. package/dist/internal/upload/apiService.d.ts +5 -6
  284. package/dist/internal/upload/apiService.js +8 -5
  285. package/dist/internal/upload/apiService.js.map +1 -1
  286. package/dist/internal/upload/blockVerifier.d.ts +3 -3
  287. package/dist/internal/upload/blockVerifier.js +1 -1
  288. package/dist/internal/upload/blockVerifier.js.map +1 -1
  289. package/dist/internal/upload/chunkStreamReader.test.js +6 -6
  290. package/dist/internal/upload/cryptoService.d.ts +4 -4
  291. package/dist/internal/upload/cryptoService.js +4 -4
  292. package/dist/internal/upload/cryptoService.js.map +1 -1
  293. package/dist/internal/upload/digests.js.map +1 -1
  294. package/dist/internal/upload/fileUploader.d.ts +6 -6
  295. package/dist/internal/upload/fileUploader.js.map +1 -1
  296. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  297. package/dist/internal/upload/index.d.ts +6 -6
  298. package/dist/internal/upload/index.js +3 -3
  299. package/dist/internal/upload/index.js.map +1 -1
  300. package/dist/internal/upload/interface.d.ts +5 -3
  301. package/dist/internal/upload/manager.d.ts +8 -8
  302. package/dist/internal/upload/manager.js +23 -52
  303. package/dist/internal/upload/manager.js.map +1 -1
  304. package/dist/internal/upload/manager.test.js +185 -147
  305. package/dist/internal/upload/manager.test.js.map +1 -1
  306. package/dist/internal/upload/streamUploader.d.ts +6 -6
  307. package/dist/internal/upload/streamUploader.js +9 -8
  308. package/dist/internal/upload/streamUploader.js.map +1 -1
  309. package/dist/internal/upload/streamUploader.test.js +17 -12
  310. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  311. package/dist/internal/upload/telemetry.d.ts +3 -3
  312. package/dist/internal/upload/telemetry.js +5 -3
  313. package/dist/internal/upload/telemetry.js.map +1 -1
  314. package/dist/internal/upload/telemetry.test.js +8 -8
  315. package/dist/internal/upload/telemetry.test.js.map +1 -1
  316. package/dist/protonDriveClient.d.ts +27 -170
  317. package/dist/protonDriveClient.js +37 -198
  318. package/dist/protonDriveClient.js.map +1 -1
  319. package/dist/protonDrivePhotosClient.js +3 -2
  320. package/dist/protonDrivePhotosClient.js.map +1 -1
  321. package/dist/telemetry.js +18 -15
  322. package/dist/telemetry.js.map +1 -1
  323. package/dist/tests/logger.js.map +1 -1
  324. package/dist/tests/telemetry.d.ts +1 -1
  325. package/dist/transformers.js +4 -2
  326. package/dist/transformers.js.map +1 -1
  327. package/package.json +3 -3
  328. package/src/cache/index.ts +1 -0
  329. package/src/cache/interface.ts +22 -22
  330. package/src/cache/memoryCache.test.ts +7 -7
  331. package/src/cache/memoryCache.ts +5 -5
  332. package/src/cache/nullCache.ts +38 -0
  333. package/src/config.ts +17 -2
  334. package/src/crypto/driveCrypto.test.ts +15 -15
  335. package/src/crypto/driveCrypto.ts +120 -156
  336. package/src/crypto/hmac.ts +1 -1
  337. package/src/crypto/interface.ts +63 -72
  338. package/src/crypto/openPGPCrypto.ts +76 -94
  339. package/src/crypto/utils.ts +1 -1
  340. package/src/diagnostic/eventsGenerator.ts +48 -0
  341. package/src/diagnostic/httpClient.ts +84 -0
  342. package/src/diagnostic/index.ts +40 -0
  343. package/src/diagnostic/integrityVerificationStream.ts +55 -0
  344. package/src/diagnostic/interface.ts +158 -0
  345. package/src/diagnostic/sdkDiagnostic.ts +249 -0
  346. package/src/diagnostic/sdkDiagnosticFull.ts +37 -0
  347. package/src/diagnostic/telemetry.ts +74 -0
  348. package/src/diagnostic/zipGenerators.test.ts +177 -0
  349. package/src/diagnostic/zipGenerators.ts +70 -0
  350. package/src/errors.ts +25 -22
  351. package/src/index.ts +3 -3
  352. package/src/interface/account.ts +10 -10
  353. package/src/interface/author.ts +6 -6
  354. package/src/interface/config.ts +28 -0
  355. package/src/interface/devices.ts +6 -6
  356. package/src/interface/download.ts +12 -9
  357. package/src/interface/events.ts +76 -25
  358. package/src/interface/httpClient.ts +11 -27
  359. package/src/interface/index.ts +81 -20
  360. package/src/interface/nodes.ts +67 -60
  361. package/src/interface/result.ts +1 -3
  362. package/src/interface/sharing.ts +60 -56
  363. package/src/interface/telemetry.ts +74 -74
  364. package/src/interface/thumbnail.ts +5 -6
  365. package/src/interface/upload.ts +25 -11
  366. package/src/internal/apiService/apiService.test.ts +109 -76
  367. package/src/internal/apiService/apiService.ts +40 -26
  368. package/src/internal/apiService/coreTypes.ts +2474 -2463
  369. package/src/internal/apiService/driveTypes.ts +1868 -1822
  370. package/src/internal/apiService/errorCodes.ts +4 -4
  371. package/src/internal/apiService/errors.test.ts +25 -23
  372. package/src/internal/apiService/errors.ts +15 -9
  373. package/src/internal/apiService/index.ts +1 -1
  374. package/src/internal/apiService/transformers.ts +2 -2
  375. package/src/internal/asyncIteratorMap.test.ts +4 -4
  376. package/src/internal/asyncIteratorMap.ts +1 -1
  377. package/src/internal/asyncIteratorRace.test.ts +149 -0
  378. package/src/internal/asyncIteratorRace.ts +79 -0
  379. package/src/internal/batch.test.ts +50 -0
  380. package/src/internal/batch.ts +9 -0
  381. package/src/internal/batchLoading.test.ts +13 -14
  382. package/src/internal/batchLoading.ts +8 -8
  383. package/src/internal/devices/apiService.ts +58 -51
  384. package/src/internal/devices/cryptoService.ts +22 -17
  385. package/src/internal/devices/index.ts +17 -10
  386. package/src/internal/devices/interface.ts +21 -12
  387. package/src/internal/devices/manager.test.ts +40 -9
  388. package/src/internal/devices/manager.ts +3 -3
  389. package/src/internal/download/apiService.ts +72 -52
  390. package/src/internal/download/cryptoService.ts +34 -18
  391. package/src/internal/download/fileDownloader.test.ts +25 -9
  392. package/src/internal/download/fileDownloader.ts +38 -20
  393. package/src/internal/download/index.ts +19 -19
  394. package/src/internal/download/interface.ts +19 -20
  395. package/src/internal/download/queue.ts +3 -3
  396. package/src/internal/download/telemetry.test.ts +11 -11
  397. package/src/internal/download/telemetry.ts +24 -14
  398. package/src/internal/download/thumbnailDownloader.test.ts +11 -6
  399. package/src/internal/download/thumbnailDownloader.ts +43 -32
  400. package/src/internal/errors.ts +7 -5
  401. package/src/internal/events/apiService.ts +46 -36
  402. package/src/internal/events/coreEventManager.test.ts +101 -0
  403. package/src/internal/events/coreEventManager.ts +26 -48
  404. package/src/internal/events/eventManager.test.ts +211 -93
  405. package/src/internal/events/eventManager.ts +72 -117
  406. package/src/internal/events/index.ts +71 -91
  407. package/src/internal/events/interface.ts +92 -29
  408. package/src/internal/events/volumeEventManager.test.ts +239 -0
  409. package/src/internal/events/volumeEventManager.ts +68 -57
  410. package/src/internal/nodes/apiService.test.ts +197 -147
  411. package/src/internal/nodes/apiService.ts +288 -174
  412. package/src/internal/nodes/cache.test.ts +48 -20
  413. package/src/internal/nodes/cache.ts +79 -45
  414. package/src/internal/nodes/cryptoCache.test.ts +34 -14
  415. package/src/internal/nodes/cryptoCache.ts +10 -5
  416. package/src/internal/nodes/cryptoService.test.ts +492 -351
  417. package/src/internal/nodes/cryptoService.ts +171 -89
  418. package/src/internal/nodes/events.test.ts +48 -344
  419. package/src/internal/nodes/events.ts +48 -254
  420. package/src/internal/nodes/extendedAttributes.test.ts +28 -24
  421. package/src/internal/nodes/extendedAttributes.ts +20 -15
  422. package/src/internal/nodes/index.test.ts +51 -55
  423. package/src/internal/nodes/index.ts +32 -22
  424. package/src/internal/nodes/interface.ts +44 -31
  425. package/src/internal/nodes/nodesAccess.test.ts +237 -130
  426. package/src/internal/nodes/nodesAccess.ts +113 -50
  427. package/src/internal/nodes/nodesManagement.test.ts +64 -39
  428. package/src/internal/nodes/nodesManagement.ts +51 -62
  429. package/src/internal/nodes/nodesRevisions.ts +7 -7
  430. package/src/internal/nodes/validations.ts +2 -2
  431. package/src/internal/photos/albums.ts +5 -5
  432. package/src/internal/photos/apiService.ts +4 -7
  433. package/src/internal/photos/cache.ts +1 -1
  434. package/src/internal/photos/index.ts +8 -8
  435. package/src/internal/photos/interface.ts +2 -2
  436. package/src/internal/photos/photosTimeline.ts +4 -5
  437. package/src/internal/sdkEvents.test.ts +10 -10
  438. package/src/internal/sdkEvents.ts +5 -13
  439. package/src/internal/shares/apiService.ts +44 -33
  440. package/src/internal/shares/cache.test.ts +6 -4
  441. package/src/internal/shares/cache.ts +25 -14
  442. package/src/internal/shares/cryptoCache.test.ts +17 -11
  443. package/src/internal/shares/cryptoCache.ts +4 -4
  444. package/src/internal/shares/cryptoService.test.ts +72 -74
  445. package/src/internal/shares/cryptoService.ts +48 -23
  446. package/src/internal/shares/index.ts +23 -11
  447. package/src/internal/shares/interface.ts +8 -8
  448. package/src/internal/shares/manager.test.ts +88 -80
  449. package/src/internal/shares/manager.ts +27 -23
  450. package/src/internal/sharing/apiService.ts +283 -175
  451. package/src/internal/sharing/cache.test.ts +35 -35
  452. package/src/internal/sharing/cache.ts +3 -3
  453. package/src/internal/sharing/cryptoService.test.ts +58 -46
  454. package/src/internal/sharing/cryptoService.ts +121 -83
  455. package/src/internal/sharing/events.test.ts +97 -207
  456. package/src/internal/sharing/events.ts +46 -157
  457. package/src/internal/sharing/index.ts +24 -16
  458. package/src/internal/sharing/interface.ts +46 -42
  459. package/src/internal/sharing/sharingAccess.test.ts +71 -65
  460. package/src/internal/sharing/sharingAccess.ts +39 -21
  461. package/src/internal/sharing/sharingManagement.test.ts +405 -335
  462. package/src/internal/sharing/sharingManagement.ts +144 -75
  463. package/src/internal/uids.ts +1 -1
  464. package/src/internal/upload/apiService.ts +168 -119
  465. package/src/internal/upload/blockVerifier.ts +8 -6
  466. package/src/internal/upload/chunkStreamReader.test.ts +7 -7
  467. package/src/internal/upload/cryptoService.ts +42 -36
  468. package/src/internal/upload/digests.ts +2 -2
  469. package/src/internal/upload/fileUploader.test.ts +15 -3
  470. package/src/internal/upload/fileUploader.ts +39 -17
  471. package/src/internal/upload/index.ts +17 -18
  472. package/src/internal/upload/interface.ts +79 -77
  473. package/src/internal/upload/manager.test.ts +222 -175
  474. package/src/internal/upload/manager.ts +74 -80
  475. package/src/internal/upload/queue.ts +3 -3
  476. package/src/internal/upload/streamUploader.test.ts +40 -27
  477. package/src/internal/upload/streamUploader.ts +87 -71
  478. package/src/internal/upload/telemetry.test.ts +11 -11
  479. package/src/internal/upload/telemetry.ts +25 -15
  480. package/src/internal/wait.test.ts +1 -1
  481. package/src/internal/wait.ts +3 -3
  482. package/src/protonDriveClient.ts +189 -276
  483. package/src/protonDrivePhotosClient.ts +20 -13
  484. package/src/telemetry.ts +60 -52
  485. package/src/tests/logger.ts +1 -1
  486. package/src/tests/telemetry.ts +2 -2
  487. package/src/transformers.ts +27 -21
  488. package/src/version.ts +0 -1
  489. package/dist/internal/events/cache.d.ts +0 -28
  490. package/dist/internal/events/cache.js +0 -67
  491. package/dist/internal/events/cache.js.map +0 -1
  492. package/dist/internal/events/cache.test.js +0 -43
  493. package/dist/internal/events/cache.test.js.map +0 -1
  494. package/src/internal/events/cache.test.ts +0 -47
  495. package/src/internal/events/cache.ts +0 -80
  496. /package/dist/{internal/events/cache.test.d.ts → diagnostic/zipGenerators.test.d.ts} +0 -0
@@ -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: 'parentUid' } 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' }),
@@ -55,100 +55,129 @@ describe('nodesAccess', () => {
55
55
 
56
56
  describe('getNode', () => {
57
57
  it('should get node from cache', async () => {
58
- const node = { uid: 'nodeId', isStale: false } as DecryptedNode;
58
+ const node = { uid: 'volumeId~nodeId', isStale: false } as DecryptedNode;
59
59
  cache.getNode = jest.fn(() => Promise.resolve(node));
60
60
 
61
- const result = await access.getNode('nodeId');
61
+ const result = await access.getNode('volumeId~nodeId');
62
62
  expect(result).toBe(node);
63
63
  expect(apiService.getNode).not.toHaveBeenCalled();
64
64
  });
65
65
 
66
- it('should get node from API when cahce is stale', async () => {
67
- const encryptedNode = { uid: 'nodeId', parentUid: 'parentUid' } as EncryptedNode;
68
- const decryptedUnparsedNode = { uid: 'nodeId', parentUid: 'parentUid', name: { ok: true, value: 'name' } } as DecryptedUnparsedNode;
66
+ it('should get node from API when cache is stale', async () => {
67
+ const encryptedNode = { uid: 'volumeId~nodeId', parentUid: 'volumeId~parentNodeid' } as EncryptedNode;
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,
79
+ treeEventScopeId: 'volumeId',
75
80
  } as DecryptedNode;
76
81
  const decryptedKeys = { key: 'key' } as any as DecryptedNodeKeys;
77
82
 
78
- cache.getNode = jest.fn(() => Promise.resolve({ uid: 'nodeId', isStale: true } as DecryptedNode));
83
+ cache.getNode = jest.fn(() => Promise.resolve({ uid: 'volumeId~nodeId', isStale: true } as DecryptedNode));
79
84
  apiService.getNode = jest.fn(() => Promise.resolve(encryptedNode));
80
85
  cryptoCache.getNodeKeys = jest.fn(() => Promise.resolve({ key: 'parentKey' } as any as DecryptedNodeKeys));
81
- cryptoService.decryptNode = jest.fn(() => Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }));
86
+ cryptoService.decryptNode = jest.fn(() =>
87
+ Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }),
88
+ );
82
89
 
83
- const result = await access.getNode('nodeId');
90
+ const result = await access.getNode('volumeId~nodeId');
84
91
  expect(result).toEqual(decryptedNode);
85
- expect(apiService.getNode).toHaveBeenCalledWith('nodeId', 'volumeId');
86
- expect(cryptoCache.getNodeKeys).toHaveBeenCalledWith('parentUid');
92
+ expect(apiService.getNode).toHaveBeenCalledWith('volumeId~nodeId', 'volumeId');
93
+ expect(cryptoCache.getNodeKeys).toHaveBeenCalledWith('volumeId~parentNodeid');
87
94
  expect(cryptoService.decryptNode).toHaveBeenCalledWith(encryptedNode, 'parentKey');
88
95
  expect(cache.setNode).toHaveBeenCalledWith(decryptedNode);
89
- expect(cryptoCache.setNodeKeys).toHaveBeenCalledWith('nodeId', decryptedKeys);
96
+ expect(cryptoCache.setNodeKeys).toHaveBeenCalledWith('volumeId~nodeId', decryptedKeys);
90
97
  });
91
98
 
92
99
  it('should get node from API missing cache', async () => {
93
- const encryptedNode = { uid: 'nodeId', parentUid: 'parentUid' } as EncryptedNode;
94
- const decryptedUnparsedNode = { uid: 'nodeId', parentUid: 'parentUid', name: { ok: true, value: 'name' } } as DecryptedUnparsedNode;
100
+ const encryptedNode = { uid: 'volumeId~nodeId', parentUid: 'volumeId~parentNodeid' } as EncryptedNode;
101
+ const decryptedUnparsedNode = {
102
+ uid: 'volumeId~nodeId',
103
+ parentUid: 'volumeId~parentNodeid',
104
+ name: { ok: true, value: 'name' },
105
+ } as DecryptedUnparsedNode;
95
106
  const decryptedNode = {
96
107
  ...decryptedUnparsedNode,
97
108
  name: { ok: true, value: 'name' },
98
109
  isStale: false,
99
110
  activeRevision: undefined,
100
111
  folder: undefined,
112
+ treeEventScopeId: 'volumeId',
101
113
  } as DecryptedNode;
102
114
  const decryptedKeys = { key: 'key' } as any as DecryptedNodeKeys;
103
115
 
104
116
  cache.getNode = jest.fn(() => Promise.reject(new Error('Entity not found')));
105
117
  apiService.getNode = jest.fn(() => Promise.resolve(encryptedNode));
106
118
  cryptoCache.getNodeKeys = jest.fn(() => Promise.resolve({ key: 'parentKey' } as any as DecryptedNodeKeys));
107
- cryptoService.decryptNode = jest.fn(() => Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }));
119
+ cryptoService.decryptNode = jest.fn(() =>
120
+ Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }),
121
+ );
108
122
 
109
- const result = await access.getNode('nodeId');
123
+ const result = await access.getNode('volumeId~nodeId');
110
124
  expect(result).toEqual(decryptedNode);
111
- expect(apiService.getNode).toHaveBeenCalledWith('nodeId', 'volumeId');
112
- expect(cryptoCache.getNodeKeys).toHaveBeenCalledWith('parentUid');
125
+ expect(apiService.getNode).toHaveBeenCalledWith('volumeId~nodeId', 'volumeId');
126
+ expect(cryptoCache.getNodeKeys).toHaveBeenCalledWith('volumeId~parentNodeid');
113
127
  expect(cryptoService.decryptNode).toHaveBeenCalledWith(encryptedNode, 'parentKey');
114
128
  expect(cache.setNode).toHaveBeenCalledWith(decryptedNode);
115
- expect(cryptoCache.setNodeKeys).toHaveBeenCalledWith('nodeId', decryptedKeys);
129
+ expect(cryptoCache.setNodeKeys).toHaveBeenCalledWith('volumeId~nodeId', decryptedKeys);
116
130
  });
117
131
 
118
132
  it('should validate node name', async () => {
119
- const encryptedNode = { uid: 'nodeId', parentUid: 'parentUid' } as EncryptedNode;
120
- const decryptedUnparsedNode = { uid: 'nodeId', parentUid: 'parentUid', name: { ok: true, value: 'foo/bar' } } as DecryptedUnparsedNode;
133
+ const encryptedNode = { uid: 'volumeId~nodeId', parentUid: 'volumeId~parentNodeid' } as EncryptedNode;
134
+ const decryptedUnparsedNode = {
135
+ uid: 'volumeId~nodeId',
136
+ parentUid: 'volumeId~parentNodeid',
137
+ name: { ok: true, value: 'foo/bar' },
138
+ } as DecryptedUnparsedNode;
121
139
  const decryptedNode = {
122
140
  ...decryptedUnparsedNode,
123
141
  name: { ok: false, error: { name: 'foo/bar', error: "Name must not contain the character '/'" } },
142
+ treeEventScopeId: 'volumeId',
124
143
  } as DecryptedNode;
125
144
  const decryptedKeys = { key: 'key' } as any as DecryptedNodeKeys;
126
145
 
127
146
  cache.getNode = jest.fn(() => Promise.reject(new Error('Entity not found')));
128
147
  apiService.getNode = jest.fn(() => Promise.resolve(encryptedNode));
129
148
  cryptoCache.getNodeKeys = jest.fn(() => Promise.resolve({ key: 'parentKey' } as any as DecryptedNodeKeys));
130
- cryptoService.decryptNode = jest.fn(() => Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }));
149
+ cryptoService.decryptNode = jest.fn(() =>
150
+ Promise.resolve({ node: decryptedUnparsedNode, keys: decryptedKeys }),
151
+ );
131
152
 
132
- const result = await access.getNode('nodeId');
153
+ const result = await access.getNode('volumeId~nodeId');
133
154
  expect(result).toMatchObject(decryptedNode);
134
155
  });
135
156
  });
136
157
 
137
158
  describe('iterate methods', () => {
138
159
  beforeEach(() => {
139
- cryptoCache.getNodeKeys = jest.fn().mockImplementation((uid: string) => Promise.resolve({ key: 'key' } as any as DecryptedNodeKeys));
140
- cryptoService.decryptNode = jest.fn().mockImplementation((encryptedNode: EncryptedNode) => Promise.resolve({
141
- node: { uid: encryptedNode.uid, isStale: false, name: { ok: true, value: 'name' } } as DecryptedNode,
142
- keys: { key: 'key' } as any as DecryptedNodeKeys,
143
- }));
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
+ );
144
173
  });
145
174
 
146
175
  describe('iterateChildren', () => {
147
- const parentNode = { uid: 'parentUid', isStale: false } as DecryptedNode;
148
- const node1 = { uid: 'node1', isStale: false } as DecryptedNode;
149
- const node2 = { uid: 'node2', isStale: false } as DecryptedNode;
150
- const node3 = { uid: 'node3', isStale: false } as DecryptedNode;
151
- const node4 = { uid: 'node4', isStale: false } as DecryptedNode;
176
+ const parentNode = { uid: 'volumeId~parentNodeid', isStale: false } as DecryptedNode;
177
+ const node1 = { uid: 'volumeId~node1', isStale: false } as DecryptedNode;
178
+ const node2 = { uid: 'volumeId~node2', isStale: false } as DecryptedNode;
179
+ const node3 = { uid: 'volumeId~node3', isStale: false } as DecryptedNode;
180
+ const node4 = { uid: 'volumeId~node4', isStale: false } as DecryptedNode;
152
181
 
153
182
  beforeEach(() => {
154
183
  cache.getNode = jest.fn().mockResolvedValue(parentNode);
@@ -163,7 +192,7 @@ describe('nodesAccess', () => {
163
192
  yield { ok: true, node: node4 };
164
193
  });
165
194
 
166
- const result = await Array.fromAsync(access.iterateFolderChildren('parentUid'));
195
+ const result = await Array.fromAsync(access.iterateFolderChildren('volumeId~parentNodeid'));
167
196
  expect(result).toMatchObject([node1, node2, node3, node4]);
168
197
  expect(apiService.iterateChildrenNodeUids).not.toHaveBeenCalled();
169
198
  expect(apiService.iterateNodes).not.toHaveBeenCalled();
@@ -178,9 +207,9 @@ describe('nodesAccess', () => {
178
207
  yield { ok: true, uid: node4.uid, node: node4 };
179
208
  });
180
209
 
181
- const result = await Array.fromAsync(access.iterateFolderChildren('parentUid'));
210
+ const result = await Array.fromAsync(access.iterateFolderChildren('volumeId~parentNodeid'));
182
211
  expect(result).toMatchObject([node1, node4, node2, node3]);
183
- expect(apiService.iterateNodes).toHaveBeenCalledWith(['node2', 'node3'], 'volumeId', undefined);
212
+ expect(apiService.iterateNodes).toHaveBeenCalledWith([node2.uid, node3.uid], 'volumeId', undefined);
184
213
  expect(cryptoService.decryptNode).toHaveBeenCalledTimes(2);
185
214
  expect(cache.setNode).toHaveBeenCalledTimes(2);
186
215
  expect(cryptoCache.setNodeKeys).toHaveBeenCalledTimes(2);
@@ -188,26 +217,26 @@ describe('nodesAccess', () => {
188
217
 
189
218
  it('should load children uids and serve nodes from cache', async () => {
190
219
  apiService.iterateChildrenNodeUids = jest.fn().mockImplementation(async function* () {
191
- yield 'node1';
192
- yield 'node2';
193
- yield 'node3';
194
- yield 'node4';
220
+ yield node1.uid;
221
+ yield node2.uid;
222
+ yield node3.uid;
223
+ yield node4.uid;
195
224
  });
196
225
  cache.getNode = jest.fn().mockImplementation((uid: string) => ({ uid, isStale: false }));
197
226
 
198
- const result = await Array.fromAsync(access.iterateFolderChildren('parentUid'));
227
+ const result = await Array.fromAsync(access.iterateFolderChildren('volumeId~parentNodeid'));
199
228
  expect(result).toMatchObject([node1, node2, node3, node4]);
200
- expect(apiService.iterateChildrenNodeUids).toHaveBeenCalledWith('parentUid', undefined);
229
+ expect(apiService.iterateChildrenNodeUids).toHaveBeenCalledWith('volumeId~parentNodeid', undefined);
201
230
  expect(apiService.iterateNodes).not.toHaveBeenCalled();
202
- expect(cache.setFolderChildrenLoaded).toHaveBeenCalledWith('parentUid');
231
+ expect(cache.setFolderChildrenLoaded).toHaveBeenCalledWith('volumeId~parentNodeid');
203
232
  });
204
233
 
205
234
  it('should load from API', async () => {
206
235
  apiService.iterateChildrenNodeUids = jest.fn().mockImplementation(async function* () {
207
- yield 'node1';
208
- yield 'node2';
209
- yield 'node3';
210
- yield 'node4';
236
+ yield node1.uid;
237
+ yield node2.uid;
238
+ yield node3.uid;
239
+ yield node4.uid;
211
240
  });
212
241
  cache.getNode = jest.fn().mockImplementation((uid: string) => {
213
242
  if (uid === parentNode.uid) {
@@ -216,21 +245,25 @@ describe('nodesAccess', () => {
216
245
  throw new Error('Entity not found');
217
246
  });
218
247
 
219
- const result = await Array.fromAsync(access.iterateFolderChildren('parentUid'));
248
+ const result = await Array.fromAsync(access.iterateFolderChildren('volumeId~parentNodeid'));
220
249
  expect(result).toMatchObject([node1, node2, node3, node4]);
221
- expect(apiService.iterateChildrenNodeUids).toHaveBeenCalledWith('parentUid', undefined);
222
- expect(apiService.iterateNodes).toHaveBeenCalledWith(['node1', 'node2', 'node3', 'node4'], 'volumeId', undefined);
250
+ expect(apiService.iterateChildrenNodeUids).toHaveBeenCalledWith('volumeId~parentNodeid', undefined);
251
+ expect(apiService.iterateNodes).toHaveBeenCalledWith(
252
+ ['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4'],
253
+ 'volumeId',
254
+ undefined,
255
+ );
223
256
  expect(cryptoService.decryptNode).toHaveBeenCalledTimes(4);
224
257
  expect(cache.setNode).toHaveBeenCalledTimes(4);
225
258
  expect(cryptoCache.setNodeKeys).toHaveBeenCalledTimes(4);
226
- expect(cache.setFolderChildrenLoaded).toHaveBeenCalledWith('parentUid');
259
+ expect(cache.setFolderChildrenLoaded).toHaveBeenCalledWith('volumeId~parentNodeid');
227
260
  });
228
261
 
229
262
  it('should remove from cache if missing on API', async () => {
230
263
  apiService.iterateChildrenNodeUids = jest.fn().mockImplementation(async function* () {
231
- yield 'node1';
232
- yield 'node2';
233
- yield 'node3';
264
+ yield node1.uid;
265
+ yield node2.uid;
266
+ yield node3.uid;
234
267
  });
235
268
  cache.getNode = jest.fn().mockImplementation((uid: string) => {
236
269
  if (uid === parentNode.uid) {
@@ -240,19 +273,19 @@ describe('nodesAccess', () => {
240
273
  });
241
274
  apiService.iterateNodes = jest.fn().mockImplementation(async function* (uids: string[]) {
242
275
  // Skip first node - make it missing.
243
- 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);
244
277
  });
245
278
 
246
- const result = await Array.fromAsync(access.iterateFolderChildren('parentUid'));
279
+ const result = await Array.fromAsync(access.iterateFolderChildren('volumeId~parentNodeid'));
247
280
  expect(result).toMatchObject([node2, node3]);
248
- expect(cache.removeNodes).toHaveBeenCalledWith(['node1']);
281
+ expect(cache.removeNodes).toHaveBeenCalledWith([node1.uid]);
249
282
  });
250
283
 
251
284
  it('should yield all decryptable children before throwing error', async () => {
252
285
  apiService.iterateChildrenNodeUids = jest.fn().mockImplementation(async function* () {
253
- yield 'node1';
254
- yield 'node2';
255
- yield 'node3';
286
+ yield 'volumeId~node1';
287
+ yield 'volumeId~node2';
288
+ yield 'volumeId~node3';
256
289
  });
257
290
  cache.getNode = jest.fn().mockImplementation((uid: string) => {
258
291
  if (uid === parentNode.uid) {
@@ -261,38 +294,40 @@ describe('nodesAccess', () => {
261
294
  throw new Error('Entity not found');
262
295
  });
263
296
  cryptoService.decryptNode = jest.fn().mockImplementation((encryptedNode: EncryptedNode) => {
264
- if (encryptedNode.uid === 'node2') {
297
+ if (encryptedNode.uid === 'volumeId~node2') {
265
298
  throw new DecryptionError('Decryption failed');
266
299
  }
267
300
  return Promise.resolve({
268
- 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,
269
306
  keys: { key: 'key' } as any as DecryptedNodeKeys,
270
307
  });
271
308
  });
272
309
 
273
- const generator = access.iterateFolderChildren('parentUid');
310
+ const generator = access.iterateFolderChildren('volumeId~parentNodeid');
274
311
  const node1 = await generator.next();
275
- expect(node1.value).toMatchObject({ uid: 'node1' });
312
+ expect(node1.value).toMatchObject({ uid: 'volumeId~node1' });
276
313
  const node2 = await generator.next();
277
- expect(node2.value).toMatchObject({ uid: 'node3' });
314
+ expect(node2.value).toMatchObject({ uid: 'volumeId~node3' });
278
315
  const node3 = generator.next();
279
316
  await expect(node3).rejects.toThrow('Failed to decrypt some nodes');
280
317
  try {
281
318
  await node3;
282
319
  } catch (error: any) {
283
- expect(error.cause).toEqual([
284
- new DecryptionError('Decryption failed'),
285
- ]);
320
+ expect(error.cause).toEqual([new DecryptionError('Decryption failed')]);
286
321
  }
287
- })
322
+ });
288
323
  });
289
324
 
290
325
  describe('iterateTrashedNodes', () => {
291
326
  const volumeId = 'volumeId';
292
- const node1 = { uid: 'node1', isStale: false } as DecryptedNode;
293
- const node2 = { uid: 'node2', isStale: false } as DecryptedNode;
294
- const node3 = { uid: 'node3', isStale: false } as DecryptedNode;
295
- const node4 = { uid: 'node4', isStale: false } as DecryptedNode;
327
+ const node1 = { uid: 'volumeId~node1', isStale: false } as DecryptedNode;
328
+ const node2 = { uid: 'volumeId~node2', isStale: false } as DecryptedNode;
329
+ const node3 = { uid: 'volumeId~node3', isStale: false } as DecryptedNode;
330
+ const node4 = { uid: 'volumeId~node4', isStale: false } as DecryptedNode;
296
331
 
297
332
  beforeEach(() => {
298
333
  shareService.getMyFilesIDs = jest.fn().mockResolvedValue({ volumeId });
@@ -321,7 +356,11 @@ describe('nodesAccess', () => {
321
356
  const result = await Array.fromAsync(access.iterateTrashedNodes());
322
357
  expect(result).toMatchObject([node1, node2, node3, node4]);
323
358
  expect(apiService.iterateTrashedNodeUids).toHaveBeenCalledWith(volumeId, undefined);
324
- expect(apiService.iterateNodes).toHaveBeenCalledWith(['node1', 'node2', 'node3', 'node4'], volumeId, undefined);
359
+ expect(apiService.iterateNodes).toHaveBeenCalledWith(
360
+ ['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4'],
361
+ volumeId,
362
+ undefined,
363
+ );
325
364
  expect(cryptoService.decryptNode).toHaveBeenCalledTimes(4);
326
365
  expect(cache.setNode).toHaveBeenCalledTimes(4);
327
366
  expect(cryptoCache.setNodeKeys).toHaveBeenCalledTimes(4);
@@ -333,20 +372,20 @@ describe('nodesAccess', () => {
333
372
  });
334
373
  apiService.iterateNodes = jest.fn().mockImplementation(async function* (uids: string[]) {
335
374
  // Skip first node - make it missing.
336
- yield* uids.slice(1).map((uid) => ({ uid, parentUid: 'parentUid' } as EncryptedNode));
375
+ yield* uids.slice(1).map((uid) => ({ uid, parentUid: 'volumeId~parentNodeid' }) as EncryptedNode);
337
376
  });
338
377
 
339
378
  const result = await Array.fromAsync(access.iterateTrashedNodes());
340
379
  expect(result).toMatchObject([node2, node3, node4]);
341
- expect(cache.removeNodes).toHaveBeenCalledWith(['node1']);
380
+ expect(cache.removeNodes).toHaveBeenCalledWith(['volumeId~node1']);
342
381
  });
343
382
  });
344
383
 
345
384
  describe('iterateNodes', () => {
346
- const node1 = { uid: 'node1', isStale: false } as DecryptedNode;
347
- const node2 = { uid: 'node2', isStale: false } as DecryptedNode;
348
- const node3 = { uid: 'node3', isStale: false } as DecryptedNode;
349
- const node4 = { uid: 'node4', isStale: false } as DecryptedNode;
385
+ const node1 = { uid: 'volumeId~node1', isStale: false, treeEventScopeId: 'volumeId' } as DecryptedNode;
386
+ const node2 = { uid: 'volumeId~node2', isStale: false, treeEventScopeId: 'volumeId' } as DecryptedNode;
387
+ const node3 = { uid: 'volumeId~node3', isStale: false, treeEventScopeId: 'volumeId' } as DecryptedNode;
388
+ const node4 = { uid: 'volume~node4', isStale: false, treeEventScopeId: 'volumeId' } as DecryptedNode;
350
389
 
351
390
  it('should serve fully from cache', async () => {
352
391
  cache.iterateNodes = jest.fn().mockImplementation(async function* () {
@@ -356,7 +395,9 @@ describe('nodesAccess', () => {
356
395
  yield { ok: true, node: node4 };
357
396
  });
358
397
 
359
- const result = await Array.fromAsync(access.iterateNodes(['node1', 'node2', 'node3', 'node4']));
398
+ const result = await Array.fromAsync(
399
+ access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4']),
400
+ );
360
401
  expect(result).toMatchObject([node1, node2, node3, node4]);
361
402
  expect(apiService.iterateNodes).not.toHaveBeenCalled();
362
403
  });
@@ -364,68 +405,87 @@ describe('nodesAccess', () => {
364
405
  it('should load from API', async () => {
365
406
  cache.iterateNodes = jest.fn().mockImplementation(async function* () {
366
407
  yield { ok: true, node: node1 };
367
- yield { ok: false, uid: 'node2' };
368
- yield { ok: false, uid: 'node3' };
408
+ yield { ok: false, uid: 'volumeId~node2' };
409
+ yield { ok: false, uid: 'volumeId~node3' };
369
410
  yield { ok: true, node: node4 };
370
411
  });
371
412
 
372
- const result = await Array.fromAsync(access.iterateNodes(['node1', 'node2', 'node3', 'node4']));
413
+ const result = await Array.fromAsync(
414
+ access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3', 'volumeId~node4']),
415
+ );
373
416
  expect(result).toMatchObject([node1, node4, node2, node3]);
374
- expect(apiService.iterateNodes).toHaveBeenCalledWith(['node2', 'node3'], 'volumeId', undefined);
417
+ expect(apiService.iterateNodes).toHaveBeenCalledWith(
418
+ ['volumeId~node2', 'volumeId~node3'],
419
+ 'volumeId',
420
+ undefined,
421
+ );
375
422
  });
376
423
 
377
424
  it('should remove from cache if missing on API and return back to caller', async () => {
378
425
  cache.iterateNodes = jest.fn().mockImplementation(async function* () {
379
- yield { ok: false, uid: 'node1' };
380
- yield { ok: false, uid: 'node2' };
381
- yield { ok: false, uid: 'node3' };
426
+ yield { ok: false, uid: 'volumeId~node1' };
427
+ yield { ok: false, uid: 'volumeId~node2' };
428
+ yield { ok: false, uid: 'volumeId~node3' };
382
429
  });
383
430
  apiService.iterateNodes = jest.fn().mockImplementation(async function* (uids: string[]) {
384
431
  // Skip first node - make it missing.
385
- yield* uids.slice(1).map((uid) => ({ uid, parentUid: 'parentUid' } as EncryptedNode));
432
+ yield* uids.slice(1).map((uid) => ({ uid, parentUid: 'volumeId~parentNodeid' }) as EncryptedNode);
386
433
  });
387
434
 
388
- const result = await Array.fromAsync(access.iterateNodes(['node1', 'node2', 'node3']));
389
- expect(result).toMatchObject([node2, node3, {missingUid: 'node1'}]);
390
- expect(cache.removeNodes).toHaveBeenCalledWith(['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' }]);
439
+ expect(cache.removeNodes).toHaveBeenCalledWith(['volumeId~node1']);
391
440
  });
392
441
 
393
442
  it('should return degraded node if parent cannot be decrypted', async () => {
394
443
  cache.iterateNodes = jest.fn().mockImplementation(async function* () {
395
- yield { ok: false, uid: 'node1' };
396
- yield { ok: false, uid: 'node2' };
397
- yield { ok: false, uid: 'node3' };
444
+ yield { ok: false, uid: 'volumeId~node1' };
445
+ yield { ok: false, uid: 'volumeId~node2' };
446
+ yield { ok: false, uid: 'volumeId~node3' };
398
447
  });
399
448
  const encryptedCrypto = {
400
449
  signatureEmail: 'signatureEmail',
401
450
  nameSignatureEmail: 'nameSignatureEmail',
402
451
  };
403
452
  apiService.iterateNodes = jest.fn().mockImplementation(async function* (uids: string[]) {
404
- yield* uids.map((uid) => ({
405
- uid,
406
- parentUid: `parentUidFor:${uid}`,
407
- encryptedCrypto,
408
- } as EncryptedNode));
453
+ yield* uids.map((uid) => {
454
+ const parentUid = uid.replace('node', 'parentOfNode');
455
+ return {
456
+ uid,
457
+ parentUid,
458
+ encryptedCrypto,
459
+ } as EncryptedNode;
460
+ });
409
461
  });
410
462
  const decryptionError = new DecryptionError('Parent cannot be decrypted');
411
463
  jest.spyOn(access, 'getParentKeys').mockImplementation(async ({ parentUid }) => {
412
- if (parentUid === 'parentUidFor:node1') {
464
+ if (parentUid === 'volumeId~parentOfNode1') {
413
465
  throw decryptionError;
414
466
  }
415
467
  return {
416
- key: {_idx: 32132},
468
+ key: { _idx: 32132 },
417
469
  } as any;
418
- } );
470
+ });
419
471
 
420
- const result = await Array.fromAsync(access.iterateNodes(['node1', 'node2', 'node3']));
472
+ const result = await Array.fromAsync(
473
+ access.iterateNodes(['volumeId~node1', 'volumeId~node2', 'volumeId~node3']),
474
+ );
421
475
  expect(result).toEqual([
422
476
  {
423
477
  ...node1,
424
478
  encryptedCrypto,
425
- parentUid: 'parentUidFor:node1',
479
+ parentUid: 'volumeId~parentOfNode1',
426
480
  name: { ok: false, error: decryptionError },
427
- keyAuthor: { ok: false, error: { claimedAuthor: 'signatureEmail', error: decryptionError.message } },
428
- 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
+ },
429
489
  errors: [decryptionError],
430
490
  },
431
491
  {
@@ -457,7 +517,7 @@ describe('nodesAccess', () => {
457
517
  it('should get node parent keys', async () => {
458
518
  cryptoCache.getNodeKeys = jest.fn(() => Promise.resolve({ key: 'parentKey' } as any as DecryptedNodeKeys));
459
519
 
460
- const result = await access.getParentKeys({ shareId: undefined, parentUid: 'parentUid' });
520
+ const result = await access.getParentKeys({ shareId: undefined, parentUid: 'volumeId~parentNodeid' });
461
521
  expect(result).toEqual({ key: 'parentKey' });
462
522
  expect(shareService.getSharePrivateKey).not.toHaveBeenCalled();
463
523
  });
@@ -465,7 +525,7 @@ describe('nodesAccess', () => {
465
525
  it('should get node parent keys even if share is set', async () => {
466
526
  cryptoCache.getNodeKeys = jest.fn(() => Promise.resolve({ key: 'parentKey' } as any as DecryptedNodeKeys));
467
527
 
468
- const result = await access.getParentKeys({ shareId: 'shareId', parentUid: 'parentUid' });
528
+ const result = await access.getParentKeys({ shareId: 'shareId', parentUid: 'volume1~parentNodeid' });
469
529
  expect(result).toEqual({ key: 'parentKey' });
470
530
  expect(shareService.getSharePrivateKey).not.toHaveBeenCalled();
471
531
  });
@@ -477,7 +537,7 @@ describe('nodesAccess', () => {
477
537
  apiService.getNode = jest.fn(() => Promise.reject(new Error('API called')));
478
538
 
479
539
  try {
480
- await access.getNodeKeys('nodeId');
540
+ await access.getNodeKeys('volumeId~nodeId');
481
541
  throw new Error('Expected error');
482
542
  } catch (error: unknown) {
483
543
  expect(`${error}`).toBe('Error: API called');
@@ -490,7 +550,7 @@ describe('nodesAccess', () => {
490
550
  const nodeUid = 'nodeUid';
491
551
  const node = {
492
552
  uid: nodeUid,
493
- parentUid: 'parentUid',
553
+ parentUid: 'volume1~parentNodeid',
494
554
  encryptedName: 'encryptedName',
495
555
  } as DecryptedNode;
496
556
 
@@ -524,33 +584,80 @@ describe('nodesAccess', () => {
524
584
  const nodeUid = 'volumeId~nodeId';
525
585
 
526
586
  it('should return node URL of document', async () => {
527
- 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
+ );
528
590
 
529
591
  const result = await access.getNodeUrl(nodeUid);
530
592
  expect(result).toBe('https://docs.proton.me/doc?type=doc&mode=open&volumeId=volumeId&linkId=nodeId');
531
593
  });
532
594
 
533
595
  it('should return node URL of sheet', async () => {
534
- 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
+ );
535
599
 
536
600
  const result = await access.getNodeUrl(nodeUid);
537
601
  expect(result).toBe('https://docs.proton.me/doc?type=sheet&mode=open&volumeId=volumeId&linkId=nodeId');
538
602
  });
539
603
 
540
604
  it('should return node URL of image', async () => {
541
- jest.spyOn(access, 'getNode').mockReturnValue(Promise.resolve({ type: NodeType.File } as any as DecryptedNode));
542
- 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
+ );
543
611
 
544
612
  const result = await access.getNodeUrl(nodeUid);
545
613
  expect(result).toBe('https://drive.proton.me/shareId/file/nodeId');
546
614
  });
547
615
 
548
616
  it('should return node URL of folder', async () => {
549
- jest.spyOn(access, 'getNode').mockReturnValue(Promise.resolve({ type: NodeType.Folder } as any as DecryptedNode));
550
- 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
+ );
551
623
 
552
624
  const result = await access.getNodeUrl(nodeUid);
553
625
  expect(result).toBe('https://drive.proton.me/shareId/folder/nodeId');
554
626
  });
555
627
  });
628
+
629
+ describe('notifyNodeChanged', () => {
630
+ it('should mark node as stale', async () => {
631
+ const node = { uid: 'volumeId~nodeId', isStale: false } as DecryptedNode;
632
+ cache.getNode = jest.fn(() => Promise.resolve(node));
633
+ cache.setNode = jest.fn();
634
+ await access.notifyNodeChanged(node.uid);
635
+ expect(cache.getNode).toHaveBeenCalledWith(node.uid);
636
+ expect(cache.setNode).toHaveBeenCalledWith({ ...node, isStale: true });
637
+ });
638
+ it('should update parent if needed', async () => {
639
+ const node = { uid: 'volumeId~nodeId', parentUid: 'v1~pn1', isStale: false } as DecryptedNode;
640
+ cache.getNode = jest.fn(() => Promise.resolve(node));
641
+ cache.setNode = jest.fn();
642
+ await access.notifyNodeChanged(node.uid, 'v1~pn2');
643
+ expect(cache.getNode).toHaveBeenCalledWith(node.uid);
644
+ expect(cache.setNode).toHaveBeenCalledWith({ ...node, parentUid: 'v1~pn2', isStale: true });
645
+ });
646
+ });
647
+
648
+ describe('notifyChildCreated', () => {
649
+ it('should reset parent listing', async () => {
650
+ const nodeUid = 'VolumeId1~NodeId1';
651
+ cache.resetFolderChildrenLoaded = jest.fn();
652
+ await access.notifyChildCreated(nodeUid);
653
+ expect(cache.resetFolderChildrenLoaded).toHaveBeenCalledWith(nodeUid);
654
+ });
655
+ });
656
+
657
+ describe('notifyNodeDeleted', () => {
658
+ it('should reset parent listing', async () => {
659
+ await access.notifyNodeDeleted('v1~n1');
660
+ expect(cache.removeNodes).toHaveBeenCalledWith(['v1~n1']);
661
+ });
662
+ });
556
663
  });