@protontech/drive-sdk 0.14.10 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/README.md +5 -0
  2. package/dist/cache/index.d.ts +1 -1
  3. package/dist/cache/memoryCache.d.ts +1 -1
  4. package/dist/cache/nullCache.d.ts +1 -1
  5. package/dist/crypto/driveCrypto.d.ts +7 -11
  6. package/dist/crypto/driveCrypto.js +35 -38
  7. package/dist/crypto/driveCrypto.js.map +1 -1
  8. package/dist/crypto/driveCrypto.test.js +1 -21
  9. package/dist/crypto/driveCrypto.test.js.map +1 -1
  10. package/dist/crypto/index.d.ts +2 -4
  11. package/dist/crypto/index.js +3 -6
  12. package/dist/crypto/index.js.map +1 -1
  13. package/dist/crypto/interface.d.ts +3 -35
  14. package/dist/crypto/interface.js +0 -7
  15. package/dist/crypto/interface.js.map +1 -1
  16. package/dist/crypto/openPGPCrypto.d.ts +10 -106
  17. package/dist/crypto/openPGPCrypto.js +2 -4
  18. package/dist/crypto/openPGPCrypto.js.map +1 -1
  19. package/dist/diagnostic/index.d.ts +1 -1
  20. package/dist/diagnostic/index.js +1 -1
  21. package/dist/diagnostic/index.js.map +1 -1
  22. package/dist/diagnostic/integrityVerificationStream.js +1 -2
  23. package/dist/diagnostic/integrityVerificationStream.js.map +1 -1
  24. package/dist/diagnostic/interface.d.ts +1 -1
  25. package/dist/diagnostic/nodeUtils.d.ts +1 -1
  26. package/dist/diagnostic/sdkDiagnosticBase.d.ts +2 -2
  27. package/dist/diagnostic/sdkDiagnosticBase.js.map +1 -1
  28. package/dist/diagnostic/sdkDiagnosticMain.js +1 -1
  29. package/dist/diagnostic/sdkDiagnosticMain.js.map +1 -1
  30. package/dist/diagnostic/sdkDiagnosticPhotos.js +1 -1
  31. package/dist/diagnostic/sdkDiagnosticPhotos.js.map +1 -1
  32. package/dist/index.d.ts +4 -3
  33. package/dist/index.js +2 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/interface/account.d.ts +1 -1
  36. package/dist/interface/devices.d.ts +1 -1
  37. package/dist/interface/index.d.ts +15 -15
  38. package/dist/interface/index.js +7 -7
  39. package/dist/interface/index.js.map +1 -1
  40. package/dist/interface/nodes.d.ts +1 -1
  41. package/dist/interface/photos.d.ts +1 -1
  42. package/dist/interface/sharing.d.ts +2 -2
  43. package/dist/internal/apiService/apiService.js +1 -1
  44. package/dist/internal/apiService/apiService.js.map +1 -1
  45. package/dist/internal/apiService/coreTypes.d.ts +8552 -7249
  46. package/dist/internal/apiService/driveTypes.d.ts +47 -92
  47. package/dist/internal/apiService/errors.test.js +1 -1
  48. package/dist/internal/apiService/errors.test.js.map +1 -1
  49. package/dist/internal/apiService/index.d.ts +4 -4
  50. package/dist/internal/apiService/index.js +5 -5
  51. package/dist/internal/apiService/index.js.map +1 -1
  52. package/dist/internal/apiService/transformers.d.ts +1 -1
  53. package/dist/internal/devices/index.d.ts +1 -1
  54. package/dist/internal/devices/manager.test.js +1 -1
  55. package/dist/internal/devices/manager.test.js.map +1 -1
  56. package/dist/internal/download/cryptoService.js +3 -2
  57. package/dist/internal/download/cryptoService.js.map +1 -1
  58. package/dist/internal/download/fileDownloader.js +8 -7
  59. package/dist/internal/download/fileDownloader.js.map +1 -1
  60. package/dist/internal/download/fileDownloader.test.js +1 -1
  61. package/dist/internal/download/fileDownloader.test.js.map +1 -1
  62. package/dist/internal/download/index.d.ts +2 -2
  63. package/dist/internal/download/index.js +1 -1
  64. package/dist/internal/download/index.js.map +1 -1
  65. package/dist/internal/download/interface.d.ts +1 -1
  66. package/dist/internal/download/telemetry.js +2 -3
  67. package/dist/internal/download/telemetry.js.map +1 -1
  68. package/dist/internal/download/telemetry.test.js +5 -0
  69. package/dist/internal/download/telemetry.test.js.map +1 -1
  70. package/dist/internal/download/thumbnailDownloader.d.ts +1 -1
  71. package/dist/internal/download/thumbnailDownloader.js +1 -1
  72. package/dist/internal/download/thumbnailDownloader.js.map +1 -1
  73. package/dist/internal/download/thumbnailDownloader.test.js.map +1 -1
  74. package/dist/internal/errors.d.ts +1 -0
  75. package/dist/internal/errors.js +11 -0
  76. package/dist/internal/errors.js.map +1 -1
  77. package/dist/internal/events/coreEventManager.test.js +1 -1
  78. package/dist/internal/events/coreEventManager.test.js.map +1 -1
  79. package/dist/internal/events/eventManager.d.ts +1 -1
  80. package/dist/internal/events/eventManager.js +1 -0
  81. package/dist/internal/events/eventManager.js.map +1 -1
  82. package/dist/internal/events/index.js +1 -1
  83. package/dist/internal/events/index.js.map +1 -1
  84. package/dist/internal/events/interface.d.ts +8 -0
  85. package/dist/internal/events/interface.js.map +1 -1
  86. package/dist/internal/events/volumeEventManager.js +1 -1
  87. package/dist/internal/events/volumeEventManager.js.map +1 -1
  88. package/dist/internal/events/volumeEventManager.test.js +1 -1
  89. package/dist/internal/events/volumeEventManager.test.js.map +1 -1
  90. package/dist/internal/nodes/apiService.d.ts +10 -4
  91. package/dist/internal/nodes/apiService.js +6 -2
  92. package/dist/internal/nodes/apiService.js.map +1 -1
  93. package/dist/internal/nodes/apiService.test.js +6 -2
  94. package/dist/internal/nodes/apiService.test.js.map +1 -1
  95. package/dist/internal/nodes/cache.d.ts +1 -1
  96. package/dist/internal/nodes/cryptoCache.d.ts +1 -1
  97. package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
  98. package/dist/internal/nodes/cryptoReporter.d.ts +1 -1
  99. package/dist/internal/nodes/cryptoService.d.ts +2 -2
  100. package/dist/internal/nodes/cryptoService.js +2 -2
  101. package/dist/internal/nodes/cryptoService.js.map +1 -1
  102. package/dist/internal/nodes/cryptoService.test.js +1 -1
  103. package/dist/internal/nodes/cryptoService.test.js.map +1 -1
  104. package/dist/internal/nodes/events.test.js.map +1 -1
  105. package/dist/internal/nodes/index.d.ts +4 -4
  106. package/dist/internal/nodes/index.js +2 -2
  107. package/dist/internal/nodes/index.js.map +1 -1
  108. package/dist/internal/nodes/index.test.js +3 -3
  109. package/dist/internal/nodes/index.test.js.map +1 -1
  110. package/dist/internal/nodes/interface.d.ts +1 -1
  111. package/dist/internal/nodes/nodesAccess.d.ts +2 -2
  112. package/dist/internal/nodes/nodesAccess.js +3 -3
  113. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  114. package/dist/internal/nodes/nodesAccess.test.js +2 -2
  115. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  116. package/dist/internal/nodes/nodesManagement.d.ts +1 -1
  117. package/dist/internal/nodes/nodesManagement.js +2 -2
  118. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  119. package/dist/internal/nodes/nodesManagement.test.js +6 -6
  120. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  121. package/dist/internal/nodes/nodesRevisions.d.ts +1 -1
  122. package/dist/internal/nodes/nodesRevisions.js.map +1 -1
  123. package/dist/internal/photos/addToAlbum.d.ts +1 -1
  124. package/dist/internal/photos/addToAlbum.js.map +1 -1
  125. package/dist/internal/photos/albumsCrypto.js.map +1 -1
  126. package/dist/internal/photos/albumsManager.test.js +1 -1
  127. package/dist/internal/photos/albumsManager.test.js.map +1 -1
  128. package/dist/internal/photos/apiService.js +1 -1
  129. package/dist/internal/photos/index.d.ts +2 -2
  130. package/dist/internal/photos/index.js +5 -5
  131. package/dist/internal/photos/index.js.map +1 -1
  132. package/dist/internal/photos/interface.d.ts +2 -2
  133. package/dist/internal/photos/nodes.d.ts +2 -2
  134. package/dist/internal/photos/nodes.js +11 -1
  135. package/dist/internal/photos/nodes.js.map +1 -1
  136. package/dist/internal/photos/nodes.test.js +17 -3
  137. package/dist/internal/photos/nodes.test.js.map +1 -1
  138. package/dist/internal/photos/photosManager.d.ts +1 -1
  139. package/dist/internal/photos/photosManager.js +1 -1
  140. package/dist/internal/photos/photosManager.js.map +1 -1
  141. package/dist/internal/photos/photosManager.test.js +1 -1
  142. package/dist/internal/photos/photosManager.test.js.map +1 -1
  143. package/dist/internal/photos/photosTransferPayloadBuilder.test.js.map +1 -1
  144. package/dist/internal/photos/timeline.test.js.map +1 -1
  145. package/dist/internal/photos/upload.d.ts +1 -1
  146. package/dist/internal/shares/apiService.d.ts +1 -1
  147. package/dist/internal/shares/cache.d.ts +1 -1
  148. package/dist/internal/shares/cryptoCache.test.js.map +1 -1
  149. package/dist/internal/shares/cryptoService.d.ts +2 -2
  150. package/dist/internal/shares/cryptoService.js +1 -1
  151. package/dist/internal/shares/cryptoService.js.map +1 -1
  152. package/dist/internal/shares/cryptoService.test.js +1 -1
  153. package/dist/internal/shares/cryptoService.test.js.map +1 -1
  154. package/dist/internal/shares/index.d.ts +2 -2
  155. package/dist/internal/shares/index.js +1 -1
  156. package/dist/internal/shares/index.js.map +1 -1
  157. package/dist/internal/shares/manager.d.ts +2 -2
  158. package/dist/internal/shares/manager.js.map +1 -1
  159. package/dist/internal/sharing/apiService.d.ts +2 -2
  160. package/dist/internal/sharing/cryptoService.d.ts +2 -3
  161. package/dist/internal/sharing/cryptoService.js +10 -31
  162. package/dist/internal/sharing/cryptoService.js.map +1 -1
  163. package/dist/internal/sharing/cryptoService.test.js.map +1 -1
  164. package/dist/internal/sharing/index.d.ts +3 -3
  165. package/dist/internal/sharing/index.js +1 -1
  166. package/dist/internal/sharing/index.js.map +1 -1
  167. package/dist/internal/sharing/interface.d.ts +2 -2
  168. package/dist/internal/sharing/sharingAccess.d.ts +1 -1
  169. package/dist/internal/sharing/sharingAccess.js +1 -1
  170. package/dist/internal/sharing/sharingAccess.js.map +1 -1
  171. package/dist/internal/sharing/sharingAccess.test.js +1 -1
  172. package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
  173. package/dist/internal/sharing/sharingManagement.d.ts +3 -3
  174. package/dist/internal/sharing/sharingManagement.js +1 -1
  175. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  176. package/dist/internal/sharing/sharingManagement.test.js +2 -2
  177. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  178. package/dist/internal/sharingPublic/cryptoReporter.d.ts +1 -1
  179. package/dist/internal/sharingPublic/cryptoReporter.js +1 -1
  180. package/dist/internal/sharingPublic/cryptoReporter.js.map +1 -1
  181. package/dist/internal/sharingPublic/index.d.ts +2 -2
  182. package/dist/internal/sharingPublic/index.js +3 -3
  183. package/dist/internal/sharingPublic/index.js.map +1 -1
  184. package/dist/internal/sharingPublic/nodes.d.ts +4 -4
  185. package/dist/internal/sharingPublic/nodes.js +4 -1
  186. package/dist/internal/sharingPublic/nodes.js.map +1 -1
  187. package/dist/internal/sharingPublic/session/apiService.d.ts +1 -1
  188. package/dist/internal/sharingPublic/session/manager.d.ts +1 -1
  189. package/dist/internal/upload/apiService.d.ts +1 -1
  190. package/dist/internal/upload/apiService.js +13 -6
  191. package/dist/internal/upload/apiService.js.map +1 -1
  192. package/dist/internal/upload/cryptoService.d.ts +1 -1
  193. package/dist/internal/upload/cryptoService.js +5 -4
  194. package/dist/internal/upload/cryptoService.js.map +1 -1
  195. package/dist/internal/upload/fileUploader.test.js +1 -1
  196. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  197. package/dist/internal/upload/index.d.ts +2 -2
  198. package/dist/internal/upload/index.js.map +1 -1
  199. package/dist/internal/upload/interface.d.ts +1 -1
  200. package/dist/internal/upload/manager.d.ts +1 -1
  201. package/dist/internal/upload/manager.js +1 -1
  202. package/dist/internal/upload/manager.js.map +1 -1
  203. package/dist/internal/upload/smallFileUploader.test.js +1 -1
  204. package/dist/internal/upload/smallFileUploader.test.js.map +1 -1
  205. package/dist/internal/upload/streamUploader.d.ts +3 -3
  206. package/dist/internal/upload/streamUploader.js +1 -1
  207. package/dist/internal/upload/streamUploader.js.map +1 -1
  208. package/dist/internal/upload/streamUploader.test.js +2 -2
  209. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  210. package/dist/internal/upload/telemetry.d.ts +1 -1
  211. package/dist/internal/upload/telemetry.js +2 -3
  212. package/dist/internal/upload/telemetry.js.map +1 -1
  213. package/dist/internal/upload/telemetry.test.js +5 -0
  214. package/dist/internal/upload/telemetry.test.js.map +1 -1
  215. package/dist/polyfill.d.ts +1 -0
  216. package/dist/polyfill.js +4 -0
  217. package/dist/polyfill.js.map +1 -0
  218. package/dist/protonDriveClient.d.ts +1 -1
  219. package/dist/protonDriveClient.js +3 -3
  220. package/dist/protonDriveClient.js.map +1 -1
  221. package/dist/protonDrivePhotosClient.d.ts +7 -1
  222. package/dist/protonDrivePhotosClient.js +13 -4
  223. package/dist/protonDrivePhotosClient.js.map +1 -1
  224. package/dist/protonDrivePublicLinkClient.d.ts +3 -3
  225. package/dist/protonDrivePublicLinkClient.js +3 -3
  226. package/dist/protonDrivePublicLinkClient.js.map +1 -1
  227. package/dist/transformers.d.ts +1 -1
  228. package/package.json +8 -4
  229. package/src/cache/index.ts +1 -1
  230. package/src/cache/memoryCache.ts +1 -1
  231. package/src/cache/nullCache.ts +1 -1
  232. package/src/crypto/driveCrypto.test.ts +1 -24
  233. package/src/crypto/driveCrypto.ts +37 -35
  234. package/src/crypto/index.ts +2 -4
  235. package/src/crypto/interface.ts +3 -49
  236. package/src/crypto/openPGPCrypto.ts +4 -88
  237. package/src/diagnostic/index.ts +3 -3
  238. package/src/diagnostic/integrityVerificationStream.ts +1 -2
  239. package/src/diagnostic/interface.ts +1 -1
  240. package/src/diagnostic/nodeUtils.ts +1 -1
  241. package/src/diagnostic/sdkDiagnosticBase.ts +6 -6
  242. package/src/diagnostic/sdkDiagnosticMain.ts +2 -2
  243. package/src/diagnostic/sdkDiagnosticPhotos.ts +2 -2
  244. package/src/diagnostic/telemetry.ts +1 -1
  245. package/src/index.ts +4 -3
  246. package/src/interface/account.ts +1 -1
  247. package/src/interface/devices.ts +1 -1
  248. package/src/interface/index.ts +40 -40
  249. package/src/interface/nodes.ts +1 -1
  250. package/src/interface/photos.ts +1 -1
  251. package/src/interface/sharing.ts +2 -2
  252. package/src/internal/apiService/apiService.test.ts +2 -2
  253. package/src/internal/apiService/apiService.ts +3 -3
  254. package/src/internal/apiService/coreTypes.ts +8641 -7349
  255. package/src/internal/apiService/driveTypes.ts +47 -92
  256. package/src/internal/apiService/errors.test.ts +2 -2
  257. package/src/internal/apiService/index.ts +4 -4
  258. package/src/internal/apiService/transformers.ts +1 -1
  259. package/src/internal/devices/index.ts +1 -1
  260. package/src/internal/devices/manager.test.ts +2 -2
  261. package/src/internal/download/cryptoService.ts +6 -11
  262. package/src/internal/download/fileDownloader.test.ts +3 -3
  263. package/src/internal/download/fileDownloader.ts +8 -6
  264. package/src/internal/download/index.ts +3 -3
  265. package/src/internal/download/interface.ts +1 -1
  266. package/src/internal/download/seekableStream.test.ts +1 -1
  267. package/src/internal/download/telemetry.test.ts +7 -1
  268. package/src/internal/download/telemetry.ts +4 -7
  269. package/src/internal/download/thumbnailDownloader.test.ts +1 -1
  270. package/src/internal/download/thumbnailDownloader.ts +2 -2
  271. package/src/internal/errors.ts +15 -0
  272. package/src/internal/events/apiService.ts +2 -2
  273. package/src/internal/events/coreEventManager.test.ts +1 -1
  274. package/src/internal/events/eventManager.ts +2 -1
  275. package/src/internal/events/index.ts +2 -2
  276. package/src/internal/events/interface.ts +8 -0
  277. package/src/internal/events/volumeEventManager.test.ts +1 -1
  278. package/src/internal/events/volumeEventManager.ts +1 -1
  279. package/src/internal/nodes/apiService.test.ts +8 -3
  280. package/src/internal/nodes/apiService.ts +22 -7
  281. package/src/internal/nodes/cache.test.ts +1 -1
  282. package/src/internal/nodes/cache.ts +1 -1
  283. package/src/internal/nodes/cryptoCache.test.ts +1 -1
  284. package/src/internal/nodes/cryptoCache.ts +1 -1
  285. package/src/internal/nodes/cryptoReporter.ts +4 -4
  286. package/src/internal/nodes/cryptoService.test.ts +2 -2
  287. package/src/internal/nodes/cryptoService.ts +14 -15
  288. package/src/internal/nodes/events.test.ts +1 -1
  289. package/src/internal/nodes/extendedAttributes.test.ts +3 -3
  290. package/src/internal/nodes/index.test.ts +8 -8
  291. package/src/internal/nodes/index.ts +6 -6
  292. package/src/internal/nodes/interface.ts +6 -6
  293. package/src/internal/nodes/nodeName.test.ts +1 -1
  294. package/src/internal/nodes/nodesAccess.test.ts +3 -3
  295. package/src/internal/nodes/nodesAccess.ts +6 -6
  296. package/src/internal/nodes/nodesManagement.test.ts +4 -4
  297. package/src/internal/nodes/nodesManagement.ts +6 -6
  298. package/src/internal/nodes/nodesRevisions.ts +1 -1
  299. package/src/internal/photos/addToAlbum.ts +1 -1
  300. package/src/internal/photos/albumsCrypto.ts +1 -0
  301. package/src/internal/photos/albumsManager.test.ts +2 -2
  302. package/src/internal/photos/apiService.ts +1 -1
  303. package/src/internal/photos/index.ts +7 -7
  304. package/src/internal/photos/interface.ts +2 -2
  305. package/src/internal/photos/nodes.test.ts +22 -6
  306. package/src/internal/photos/nodes.ts +16 -9
  307. package/src/internal/photos/photosManager.test.ts +5 -5
  308. package/src/internal/photos/photosManager.ts +4 -4
  309. package/src/internal/photos/photosTransferPayloadBuilder.test.ts +1 -1
  310. package/src/internal/photos/timeline.test.ts +1 -1
  311. package/src/internal/photos/upload.ts +3 -3
  312. package/src/internal/sdkEvents.ts +1 -1
  313. package/src/internal/shares/apiService.ts +1 -1
  314. package/src/internal/shares/cache.ts +1 -1
  315. package/src/internal/shares/cryptoCache.test.ts +1 -1
  316. package/src/internal/shares/cryptoService.test.ts +1 -1
  317. package/src/internal/shares/cryptoService.ts +8 -8
  318. package/src/internal/shares/index.ts +5 -5
  319. package/src/internal/shares/manager.ts +2 -2
  320. package/src/internal/sharing/apiService.ts +10 -10
  321. package/src/internal/sharing/cryptoService.test.ts +1 -1
  322. package/src/internal/sharing/cryptoService.ts +12 -37
  323. package/src/internal/sharing/events.test.ts +2 -2
  324. package/src/internal/sharing/index.ts +3 -3
  325. package/src/internal/sharing/interface.ts +2 -2
  326. package/src/internal/sharing/sharingAccess.test.ts +4 -4
  327. package/src/internal/sharing/sharingAccess.ts +3 -3
  328. package/src/internal/sharing/sharingManagement.test.ts +4 -4
  329. package/src/internal/sharing/sharingManagement.ts +9 -9
  330. package/src/internal/sharingPublic/cryptoReporter.ts +7 -7
  331. package/src/internal/sharingPublic/index.ts +6 -6
  332. package/src/internal/sharingPublic/nodes.ts +7 -4
  333. package/src/internal/sharingPublic/session/apiService.ts +1 -1
  334. package/src/internal/sharingPublic/session/manager.ts +1 -1
  335. package/src/internal/upload/apiService.ts +17 -8
  336. package/src/internal/upload/cryptoService.ts +8 -6
  337. package/src/internal/upload/fileUploader.test.ts +4 -4
  338. package/src/internal/upload/index.ts +3 -3
  339. package/src/internal/upload/interface.ts +1 -2
  340. package/src/internal/upload/manager.ts +4 -4
  341. package/src/internal/upload/smallFileUploader.test.ts +4 -4
  342. package/src/internal/upload/streamUploader.test.ts +5 -5
  343. package/src/internal/upload/streamUploader.ts +4 -4
  344. package/src/internal/upload/telemetry.test.ts +7 -1
  345. package/src/internal/upload/telemetry.ts +5 -8
  346. package/src/polyfill.ts +1 -0
  347. package/src/protonDriveClient.ts +32 -32
  348. package/src/protonDrivePhotosClient.ts +42 -32
  349. package/src/protonDrivePublicLinkClient.ts +25 -25
  350. package/src/transformers.ts +9 -9
  351. package/dist/crypto/hmac.d.ts +0 -22
  352. package/dist/crypto/hmac.js +0 -44
  353. package/dist/crypto/hmac.js.map +0 -1
  354. package/dist/crypto/utils.d.ts +0 -2
  355. package/dist/crypto/utils.js +0 -35
  356. package/dist/crypto/utils.js.map +0 -1
  357. package/src/crypto/hmac.ts +0 -46
  358. package/src/crypto/utils.ts +0 -40
@@ -67,3 +67,18 @@ export function isNotApplicationError(error?: unknown): boolean {
67
67
 
68
68
  return false;
69
69
  }
70
+
71
+ export function isNetworkError(error: unknown): boolean {
72
+ if (!(error instanceof Error)) {
73
+ return false;
74
+ }
75
+ return (
76
+ error.name === 'OfflineError' ||
77
+ error.name === 'NetworkError' ||
78
+ error.message?.toLowerCase() === 'network error' ||
79
+ (error.name === 'TypeError' &&
80
+ ['Failed to fetch', 'NetworkError when attempting to fetch resource', 'Load failed'].includes(
81
+ error.message,
82
+ ))
83
+ );
84
+ }
@@ -1,6 +1,6 @@
1
- import { DriveAPIService, drivePaths, corePaths } from '../apiService';
1
+ import { corePaths, DriveAPIService, drivePaths } from '../apiService';
2
2
  import { makeNodeUid } from '../uids';
3
- import { DriveEventsListWithStatus, DriveEvent, DriveEventType, NodeEvent, NodeEventType } from './interface';
3
+ import { DriveEvent, DriveEventsListWithStatus, DriveEventType, NodeEvent, NodeEventType } from './interface';
4
4
 
5
5
  type GetCoreLatestEventResponse =
6
6
  corePaths['/core/{_version}/events/latest']['get']['responses']['200']['content']['application/json'];
@@ -1,7 +1,7 @@
1
1
  import { getMockLogger } from '../../tests/logger';
2
2
  import { EventsAPIService } from './apiService';
3
- import { DriveEvent, DriveEventsListWithStatus, DriveEventType } from './interface';
4
3
  import { CoreEventManager } from './coreEventManager';
4
+ import { DriveEvent, DriveEventsListWithStatus, DriveEventType } from './interface';
5
5
 
6
6
  describe('CoreEventManager', () => {
7
7
  let mockApiService: jest.Mocked<EventsAPIService>;
@@ -1,5 +1,5 @@
1
1
  import { Logger } from '../../interface';
2
- import { EventManagerInterface, Event, EventSubscription } from './interface';
2
+ import { Event, EventManagerInterface, EventSubscription } from './interface';
3
3
 
4
4
  const FIBONACCI_LIST = [1, 1, 2, 3, 5, 8, 13];
5
5
 
@@ -54,6 +54,7 @@ export class EventManager<T extends Event> {
54
54
  const index = this.listeners.indexOf(callback);
55
55
  this.listeners.splice(index, 1);
56
56
  },
57
+ getLatestEventId: () => this.latestEventId ?? null,
57
58
  };
58
59
  }
59
60
 
@@ -1,10 +1,10 @@
1
1
  import { Logger, ProtonDriveTelemetry } from '../../interface';
2
2
  import { DriveAPIService } from '../apiService';
3
- import { DriveEvent, DriveListener, EventSubscription, LatestEventIdProvider, SharesService } from './interface';
4
3
  import { EventsAPIService } from './apiService';
5
4
  import { CoreEventManager } from './coreEventManager';
6
- import { VolumeEventManager } from './volumeEventManager';
7
5
  import { EventManager } from './eventManager';
6
+ import { DriveEvent, DriveListener, EventSubscription, LatestEventIdProvider, SharesService } from './interface';
7
+ import { VolumeEventManager } from './volumeEventManager';
8
8
 
9
9
  export type { DriveEvent, DriveListener, EventSubscription } from './interface';
10
10
  export { DriveEventType } from './interface';
@@ -15,6 +15,14 @@ export interface Event {
15
15
 
16
16
  export interface EventSubscription {
17
17
  dispose(): void;
18
+ /**
19
+ * Returns the latest event ID for the subscription.
20
+ *
21
+ * @deprecated This is experimental to provide a way to the client to know
22
+ * the latest event ID before getting any events. It will be removed and
23
+ * replaced with a more robust solution.
24
+ */
25
+ getLatestEventId(): string | null;
18
26
  }
19
27
 
20
28
  export interface LatestEventIdProvider {
@@ -1,8 +1,8 @@
1
1
  import { getMockLogger } from '../../tests/logger';
2
2
  import { NotFoundAPIError } from '../apiService';
3
3
  import { EventsAPIService } from './apiService';
4
- import { VolumeEventManager } from './volumeEventManager';
5
4
  import { DriveEventsListWithStatus, DriveEventType } from './interface';
5
+ import { VolumeEventManager } from './volumeEventManager';
6
6
 
7
7
  jest.mock('./apiService');
8
8
 
@@ -1,5 +1,6 @@
1
1
  import { Logger } from '../../interface';
2
2
  import { LoggerWithPrefix } from '../../telemetry';
3
+ import { NotFoundAPIError } from '../apiService';
3
4
  import { EventsAPIService } from './apiService';
4
5
  import {
5
6
  DriveEvent,
@@ -8,7 +9,6 @@ import {
8
9
  EventManagerInterface,
9
10
  UnsubscribeFromEventsSourceError,
10
11
  } from './interface';
11
- import { NotFoundAPIError } from '../apiService';
12
12
 
13
13
  /**
14
14
  * Combines API and event manager to provide a service for listening to
@@ -2,10 +2,10 @@ import { NodeWithSameNameExistsValidationError, ValidationError } from '../../er
2
2
  import { MemberRole, NodeType } from '../../interface';
3
3
  import { getMockLogger } from '../../tests/logger';
4
4
  import { DriveAPIService, ErrorCode, InvalidRequirementsAPIError } from '../apiService';
5
- import { NodeAPIService, groupNodeUidsByVolumeAndIteratePerBatch } from './apiService';
5
+ import { groupNodeUidsByVolumeAndIteratePerBatch, NodeAPIService } from './apiService';
6
6
  import { NodeOutOfSyncError } from './errors';
7
7
 
8
- function generateAPIFileNode(linkOverrides = {}, overrides = {}) {
8
+ function generateAPIFileNode(linkOverrides = {}, overrides = {}, fileOverrides = {}) {
9
9
  const node = generateAPINode();
10
10
  return {
11
11
  Link: {
@@ -25,6 +25,7 @@ function generateAPIFileNode(linkOverrides = {}, overrides = {}) {
25
25
  XAttr: '{file}',
26
26
  EncryptedSize: 12,
27
27
  },
28
+ ...fileOverrides,
28
29
  },
29
30
  ...overrides,
30
31
  };
@@ -225,7 +226,7 @@ describe('nodeAPIService', () => {
225
226
  );
226
227
 
227
228
  const nodes = await Array.fromAsync(api.iterateNodes(['volumeId~nodeId'], ownVolumeId));
228
- expect(nodes).toStrictEqual([expectedNode]);
229
+ expect(nodes).toStrictEqual(expectedNode ? [expectedNode] : []);
229
230
  }
230
231
 
231
232
  it('should get folder node', async () => {
@@ -243,6 +244,10 @@ describe('nodeAPIService', () => {
243
244
  await testIterateNodes(generateAPIFileNode(), generateFileNode());
244
245
  });
245
246
 
247
+ fit('should skip file draft node without an error', async () => {
248
+ await testIterateNodes(generateAPIFileNode({}, {}, { ActiveRevision: null }), undefined);
249
+ });
250
+
246
251
  it('should get album node', async () => {
247
252
  await testIterateNodes(generateAPIAlbumNode(), generateAlbumNode());
248
253
  });
@@ -1,7 +1,7 @@
1
1
  import { c } from 'ttag';
2
2
 
3
3
  import { NodeWithSameNameExistsValidationError, ProtonDriveError, ValidationError } from '../../errors';
4
- import { Logger, NodeResult, MemberRole, RevisionState, AnonymousUser } from '../../interface';
4
+ import { AnonymousUser, Logger, MemberRole, NodeResult, RevisionState } from '../../interface';
5
5
  import {
6
6
  DriveAPIService,
7
7
  drivePaths,
@@ -13,7 +13,7 @@ import {
13
13
  } from '../apiService';
14
14
  import { asyncIteratorRace } from '../asyncIteratorRace';
15
15
  import { batch } from '../batch';
16
- import { splitNodeUid, makeNodeUid, makeNodeRevisionUid, splitNodeRevisionUid, makeNodeThumbnailUid } from '../uids';
16
+ import { makeNodeRevisionUid, makeNodeThumbnailUid, makeNodeUid, splitNodeRevisionUid, splitNodeUid } from '../uids';
17
17
  import { NodeOutOfSyncError } from './errors';
18
18
  import { EncryptedNode, EncryptedRevision, FilterOptions, Thumbnail } from './interface';
19
19
 
@@ -212,7 +212,7 @@ export abstract class NodeAPIServiceBase<
212
212
  for (const link of responseLinks) {
213
213
  try {
214
214
  const encryptedNode = this.linkToEncryptedNode(volumeId, link, isOwnVolumeId);
215
- if (filterOptions?.type && encryptedNode.type !== filterOptions.type) {
215
+ if (!encryptedNode || (filterOptions?.type && encryptedNode.type !== filterOptions.type)) {
216
216
  continue;
217
217
  }
218
218
  yield encryptedNode;
@@ -232,7 +232,17 @@ export abstract class NodeAPIServiceBase<
232
232
  signal?: AbortSignal,
233
233
  ): Promise<TMetadataResponseLink[]>;
234
234
 
235
- protected abstract linkToEncryptedNode(volumeId: string, link: TMetadataResponseLink, isOwnVolumeId: boolean): T;
235
+ /**
236
+ * Converts a link from the API payload to an encrypted node entity.
237
+ *
238
+ * Returns undefined if the link is a draft as drafts are not exposed
239
+ * to the client and are internal to upload module only.
240
+ */
241
+ protected abstract linkToEncryptedNode(
242
+ volumeId: string,
243
+ link: TMetadataResponseLink,
244
+ isOwnVolumeId: boolean,
245
+ ): T | undefined;
236
246
 
237
247
  // Improvement requested: load next page sooner before all IDs are yielded.
238
248
  async *iterateChildrenNodeUids(
@@ -623,7 +633,7 @@ export class NodeAPIService extends NodeAPIServiceBase {
623
633
  volumeId: string,
624
634
  link: PostLoadLinksMetadataResponse['Links'][0],
625
635
  isOwnVolumeId: boolean,
626
- ): EncryptedNode {
636
+ ): EncryptedNode | undefined {
627
637
  return linkToEncryptedNode(this.logger, volumeId, link, isOwnVolumeId);
628
638
  }
629
639
  }
@@ -683,7 +693,7 @@ export function linkToEncryptedNode(
683
693
  volumeId: string,
684
694
  link: Pick<PostLoadLinksMetadataResponse['Links'][0], 'Link' | 'Membership' | 'Sharing' | 'Folder' | 'File'>,
685
695
  isAdmin: boolean,
686
- ): EncryptedNode {
696
+ ): EncryptedNode | undefined {
687
697
  const { baseNodeMetadata, baseCryptoNodeMetadata } = linkToEncryptedNodeBaseMetadata(
688
698
  logger,
689
699
  volumeId,
@@ -704,7 +714,12 @@ export function linkToEncryptedNode(
704
714
  };
705
715
  }
706
716
 
707
- if (link.Link.Type === 2 && link.File && link.File.ActiveRevision) {
717
+ if (link.Link.Type === 2 && link.File) {
718
+ if (!link.File.ActiveRevision) {
719
+ logger.warn(`Requested draft file node, skipping from the result`);
720
+ return undefined;
721
+ }
722
+
708
723
  return {
709
724
  ...baseNodeMetadata,
710
725
  totalStorageSize: link.File.TotalEncryptedSize,
@@ -1,5 +1,5 @@
1
1
  import { MemoryCache } from '../../cache';
2
- import { NodeType, MemberRole, RevisionState, resultOk, Result } from '../../interface';
2
+ import { MemberRole, NodeType, Result, resultOk, RevisionState } from '../../interface';
3
3
  import { getMockLogger } from '../../tests/logger';
4
4
  import { CACHE_TAG_KEYS, NodesCache } from './cache';
5
5
  import { DecryptedNode, DecryptedRevision } from './interface';
@@ -1,5 +1,5 @@
1
1
  import { EntityResult } from '../../cache';
2
- import { ProtonDriveEntitiesCache, Logger, resultOk, Result } from '../../interface';
2
+ import { Logger, ProtonDriveEntitiesCache, Result, resultOk } from '../../interface';
3
3
  import { splitNodeUid } from '../uids';
4
4
  import { DecryptedNode, DecryptedRevision } from './interface';
5
5
 
@@ -1,5 +1,5 @@
1
- import { PrivateKey, SessionKey } from '../../crypto';
2
1
  import { MemoryCache } from '../../cache';
2
+ import { PrivateKey, SessionKey } from '../../crypto';
3
3
  import { CachedCryptoMaterial } from '../../interface';
4
4
  import { getMockLogger } from '../../tests/logger';
5
5
  import { NodesCryptoCache } from './cryptoCache';
@@ -1,4 +1,4 @@
1
- import { ProtonDriveCryptoCache, Logger } from '../../interface';
1
+ import { Logger, ProtonDriveCryptoCache } from '../../interface';
2
2
  import { DecryptedNodeKeys } from './interface';
3
3
 
4
4
  /**
@@ -1,14 +1,14 @@
1
1
  import { VERIFICATION_STATUS } from '../../crypto';
2
2
  import {
3
- resultOk,
4
- resultError,
5
- Author,
6
3
  AnonymousUser,
7
- ProtonDriveTelemetry,
4
+ Author,
8
5
  Logger,
9
6
  MetricsDecryptionErrorField,
10
7
  MetricVerificationErrorField,
11
8
  MetricVolumeType,
9
+ ProtonDriveTelemetry,
10
+ resultError,
11
+ resultOk,
12
12
  } from '../../interface';
13
13
  import { getVerificationMessage, isNotApplicationError } from '../errors';
14
14
  import { splitNodeUid } from '../uids';
@@ -1,6 +1,8 @@
1
1
  import { DriveCrypto, PrivateKey, PublicKey, SessionKey, VERIFICATION_STATUS } from '../../crypto';
2
2
  import { MemberRole, ProtonDriveAccount, ProtonDriveTelemetry, RevisionState } from '../../interface';
3
3
  import { getMockTelemetry } from '../../tests/telemetry';
4
+ import { NodesCryptoReporter } from './cryptoReporter';
5
+ import { NodesCryptoService } from './cryptoService';
4
6
  import {
5
7
  DecryptedNode,
6
8
  DecryptedNodeKeys,
@@ -9,8 +11,6 @@ import {
9
11
  NodeSigningKeys,
10
12
  SharesService,
11
13
  } from './interface';
12
- import { NodesCryptoService } from './cryptoService';
13
- import { NodesCryptoReporter } from './cryptoReporter';
14
14
 
15
15
  describe('nodesCryptoService', () => {
16
16
  let telemetry: ProtonDriveTelemetry;
@@ -1,41 +1,40 @@
1
1
  import { c } from 'ttag';
2
2
 
3
3
  import {
4
- base64StringToUint8Array,
5
4
  DriveCrypto,
6
5
  PrivateKey,
7
6
  PublicKey,
8
7
  SessionKey,
9
8
  VERIFICATION_STATUS,
10
9
  } from '../../crypto';
10
+ import { ValidationError } from '../../errors';
11
11
  import {
12
- resultOk,
13
- resultError,
14
- Result,
15
- Author,
16
12
  AnonymousUser,
17
- ProtonDriveTelemetry,
13
+ Author,
18
14
  Logger,
15
+ Membership,
19
16
  MetricsDecryptionErrorField,
20
17
  MetricVerificationErrorField,
21
- Membership,
22
18
  ProtonDriveAccount,
19
+ ProtonDriveTelemetry,
20
+ Result,
21
+ resultError,
22
+ resultOk,
23
23
  } from '../../interface';
24
- import { ValidationError } from '../../errors';
25
24
  import { getErrorMessage } from '../errors';
25
+ import { splitNodeUid } from '../uids';
26
26
  import {
27
- EncryptedNode,
28
- EncryptedNodeFolderCrypto,
29
- DecryptedUnparsedNode,
30
27
  DecryptedNode,
31
28
  DecryptedNodeKeys,
32
- EncryptedRevision,
29
+ DecryptedUnparsedNode,
33
30
  DecryptedUnparsedRevision,
34
- NodeSigningKeys,
31
+ EncryptedNode,
35
32
  EncryptedNodeFileCrypto,
33
+ EncryptedNodeFolderCrypto,
34
+ EncryptedRevision,
35
+ NodeSigningKeys,
36
36
  SharesService,
37
37
  } from './interface';
38
- import { splitNodeUid } from '../uids';
39
38
 
40
39
  export interface NodesCryptoReporter {
41
40
  handleClaimedAuthor(
@@ -213,7 +212,7 @@ export class NodesCryptoService {
213
212
  let contentKeyPacketAuthor;
214
213
  let contentKeyPacket: Uint8Array<ArrayBuffer> | undefined;
215
214
  if ('file' in node.encryptedCrypto) {
216
- contentKeyPacket = base64StringToUint8Array(node.encryptedCrypto.file.base64ContentKeyPacket);
215
+ contentKeyPacket = Uint8Array.fromBase64(node.encryptedCrypto.file.base64ContentKeyPacket);
217
216
  const [activeRevisionPromise, contentKeyPacketSessionKeyPromise] = [
218
217
  this.decryptRevision(node.uid, node.encryptedCrypto.activeRevision, key),
219
218
  this.decryptContentKeyPacket(node, node.encryptedCrypto, key, keyVerificationKeys),
@@ -1,8 +1,8 @@
1
1
  import { getMockLogger } from '../../tests/logger';
2
2
  import { DriveEvent, DriveEventType } from '../events';
3
+ import { NodesCache } from './cache';
3
4
  import { NodesEventsHandler } from './events';
4
5
  import { DecryptedNode } from './interface';
5
- import { NodesCache } from './cache';
6
6
 
7
7
  describe('NodesEventsHandler', () => {
8
8
  const logger = getMockLogger();
@@ -1,11 +1,11 @@
1
1
  import { getMockLogger } from '../../tests/logger';
2
2
  import {
3
- FolderExtendedAttributes,
4
3
  FileExtendedAttributesParsed,
5
- generateFolderExtendedAttributes,
4
+ FolderExtendedAttributes,
6
5
  generateFileExtendedAttributes,
7
- parseFolderExtendedAttributes,
6
+ generateFolderExtendedAttributes,
8
7
  parseFileExtendedAttributes,
8
+ parseFolderExtendedAttributes,
9
9
  } from './extendedAttributes';
10
10
 
11
11
  describe('extended attrbiutes', () => {
@@ -1,20 +1,20 @@
1
+ import { MemoryCache } from '../../cache';
2
+ import { DriveCrypto } from '../../crypto';
1
3
  import {
2
- ProtonDriveEntitiesCache,
3
- ProtonDriveCryptoCache,
4
- ProtonDriveAccount,
5
4
  MemberRole,
6
5
  NodeType,
6
+ ProtonDriveAccount,
7
+ ProtonDriveCryptoCache,
8
+ ProtonDriveEntitiesCache,
7
9
  } from '../../interface';
8
- import { DriveCrypto } from '../../crypto';
9
- import { MemoryCache } from '../../cache';
10
+ import { getMockLogger } from '../../tests/logger';
10
11
  import { getMockTelemetry } from '../../tests/telemetry';
11
12
  import { DriveAPIService } from '../apiService';
12
13
  import { DriveEventType } from '../events';
13
14
  import { makeNodeUid } from '../uids';
14
- import { SharesService, DecryptedNode } from './interface';
15
- import { initNodesModule } from './index';
16
15
  import { NodesCache } from './cache';
17
- import { getMockLogger } from '../../tests/logger';
16
+ import { initNodesModule } from './index';
17
+ import { DecryptedNode, SharesService } from './interface';
18
18
 
19
19
  function generateNode(uid: string, parentUid = 'volumeId~root', params: Partial<DecryptedNode> = {}): DecryptedNode {
20
20
  return {
@@ -1,24 +1,24 @@
1
- import { DriveAPIService } from '../apiService';
2
1
  import { DriveCrypto } from '../../crypto';
3
2
  import {
4
- ProtonDriveEntitiesCache,
5
- ProtonDriveCryptoCache,
6
3
  ProtonDriveAccount,
4
+ ProtonDriveCryptoCache,
5
+ ProtonDriveEntitiesCache,
7
6
  ProtonDriveTelemetry,
8
7
  } from '../../interface';
8
+ import { DriveAPIService } from '../apiService';
9
9
  import { NodeAPIService } from './apiService';
10
10
  import { NodesCache } from './cache';
11
11
  import { NodesCryptoCache } from './cryptoCache';
12
- import { NodesCryptoService } from './cryptoService';
13
12
  import { NodesCryptoReporter } from './cryptoReporter';
13
+ import { NodesCryptoService } from './cryptoService';
14
+ import { NodesEventsHandler } from './events';
14
15
  import { SharesService } from './interface';
15
16
  import { NodesAccess } from './nodesAccess';
16
17
  import { NodesManagement } from './nodesManagement';
17
18
  import { NodesRevisons } from './nodesRevisions';
18
- import { NodesEventsHandler } from './events';
19
19
 
20
- export type { DecryptedNode, DecryptedRevision } from './interface';
21
20
  export { generateFileExtendedAttributes } from './extendedAttributes';
21
+ export type { DecryptedNode, DecryptedRevision } from './interface';
22
22
 
23
23
  /**
24
24
  * Provides facade for the whole nodes module.
@@ -1,16 +1,16 @@
1
1
  import { PrivateKey, SessionKey } from '../../crypto';
2
2
  import {
3
- NodeEntity,
4
- Result,
5
- InvalidNameError,
3
+ AnonymousUser,
6
4
  Author,
5
+ InvalidNameError,
7
6
  MemberRole,
8
- NodeType,
9
- ThumbnailType,
10
7
  MetricVolumeType,
8
+ NodeEntity,
9
+ NodeType,
10
+ Result,
11
11
  Revision,
12
12
  RevisionState,
13
- AnonymousUser,
13
+ ThumbnailType,
14
14
  } from '../../interface';
15
15
 
16
16
  export type FilterOptions = {
@@ -1,4 +1,4 @@
1
- import { splitExtension, joinNameAndExtension } from './nodeName';
1
+ import { joinNameAndExtension, splitExtension } from './nodeName';
2
2
 
3
3
  describe('nodeName', () => {
4
4
  describe('splitExtension', () => {
@@ -1,13 +1,13 @@
1
- import { getMockTelemetry } from '../../tests/telemetry';
2
1
  import { PrivateKey } from '../../crypto';
3
2
  import { DecryptionError, ProtonDriveError } from '../../errors';
3
+ import { NodeType } from '../../interface';
4
+ import { getMockTelemetry } from '../../tests/telemetry';
4
5
  import { NodeAPIService } from './apiService';
5
6
  import { NodesCache } from './cache';
6
7
  import { NodesCryptoCache } from './cryptoCache';
7
8
  import { NodesCryptoService } from './cryptoService';
9
+ import { DecryptedNode, DecryptedNodeKeys, DecryptedUnparsedNode, EncryptedNode, SharesService } from './interface';
8
10
  import { NodesAccess } from './nodesAccess';
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;
@@ -1,6 +1,7 @@
1
1
  import { c } from 'ttag';
2
2
 
3
3
  import { PrivateKey, SessionKey } from '../../crypto';
4
+ import { DecryptionError, ProtonDriveError } from '../../errors';
4
5
  import {
5
6
  InvalidNameError,
6
7
  Logger,
@@ -11,10 +12,9 @@ import {
11
12
  resultError,
12
13
  resultOk,
13
14
  } from '../../interface';
14
- import { DecryptionError, ProtonDriveError } from '../../errors';
15
15
  import { asyncIteratorMap } from '../asyncIteratorMap';
16
- import { getErrorMessage } from '../errors';
17
16
  import { BatchLoading } from '../batchLoading';
17
+ import { getErrorMessage } from '../errors';
18
18
  import { makeNodeUid, splitNodeUid } from '../uids';
19
19
  import { NodeAPIServiceBase } from './apiService';
20
20
  import { NodesCacheBase } from './cache';
@@ -23,16 +23,16 @@ import { NodesCryptoService } from './cryptoService';
23
23
  import { NodesDebouncer } from './debouncer';
24
24
  import { parseFileExtendedAttributes, parseFolderExtendedAttributes } from './extendedAttributes';
25
25
  import {
26
- SharesService,
27
- EncryptedNode,
28
- DecryptedUnparsedNode,
29
26
  DecryptedNode,
30
27
  DecryptedNodeKeys,
28
+ DecryptedUnparsedNode,
29
+ EncryptedNode,
31
30
  FilterOptions,
32
31
  NodeSigningKeys,
32
+ SharesService,
33
33
  } from './interface';
34
- import { validateNodeName } from './validations';
35
34
  import { isProtonDocument, isProtonSheet } from './mediaTypes';
35
+ import { validateNodeName } from './validations';
36
36
 
37
37
  // This is the number of nodes that are loaded in parallel.
38
38
  // It is a trade-off between initial wait time and overhead of API calls.
@@ -1,12 +1,12 @@
1
+ import { NodeWithSameNameExistsValidationError, ValidationError } from '../../errors';
2
+ import { NodeResult, NodeResultWithError } from '../../interface';
1
3
  import { NodeAPIService } from './apiService';
2
4
  import { NodesCryptoCache } from './cryptoCache';
3
5
  import { NodesCryptoService } from './cryptoService';
4
- import { NodesAccess } from './nodesAccess';
6
+ import { NodeOutOfSyncError } from './errors';
5
7
  import { DecryptedNode } from './interface';
8
+ import { NodesAccess } from './nodesAccess';
6
9
  import { NodesManagement } from './nodesManagement';
7
- import { NodeResult, NodeResultWithError } from '../../interface';
8
- import { NodeOutOfSyncError } from './errors';
9
- import { NodeWithSameNameExistsValidationError, ValidationError } from '../../errors';
10
10
 
11
11
  describe('NodesManagement', () => {
12
12
  let apiService: NodeAPIService;
@@ -1,15 +1,15 @@
1
1
  import { c } from 'ttag';
2
2
 
3
+ import { AbortError, ValidationError } from '../../errors';
3
4
  import {
5
+ InvalidNameError,
4
6
  MemberRole,
5
- NodeType,
6
7
  NodeResult,
8
+ NodeResultWithError,
7
9
  NodeResultWithNewUid,
10
+ NodeType,
8
11
  resultOk,
9
- InvalidNameError,
10
- NodeResultWithError,
11
12
  } from '../../interface';
12
- import { AbortError, ValidationError } from '../../errors';
13
13
  import { createErrorFromUnknown, getErrorMessage } from '../errors';
14
14
  import { splitNodeUid } from '../uids';
15
15
  import { NodeAPIServiceBase } from './apiService';
@@ -18,9 +18,9 @@ import { NodesCryptoService } from './cryptoService';
18
18
  import { NodeOutOfSyncError } from './errors';
19
19
  import { generateFolderExtendedAttributes } from './extendedAttributes';
20
20
  import { DecryptedNode, EncryptedNode } from './interface';
21
- import { splitExtension, joinNameAndExtension } from './nodeName';
22
- import { NodesAccessBase } from './nodesAccess';
23
21
  import { FOLDER_MEDIA_TYPE } from './mediaTypes';
22
+ import { joinNameAndExtension, splitExtension } from './nodeName';
23
+ import { NodesAccessBase } from './nodesAccess';
24
24
  import { validateNodeName } from './validations';
25
25
 
26
26
  const AVAILABLE_NAME_BATCH_SIZE = 10;
@@ -2,9 +2,9 @@ import { Logger } from '../../interface';
2
2
  import { makeNodeUidFromRevisionUid } from '../uids';
3
3
  import { NodeAPIServiceBase } from './apiService';
4
4
  import { NodesCryptoService } from './cryptoService';
5
- import { NodesAccess } from './nodesAccess';
6
5
  import { parseFileExtendedAttributes } from './extendedAttributes';
7
6
  import { DecryptedRevision } from './interface';
7
+ import { NodesAccess } from './nodesAccess';
8
8
 
9
9
  /**
10
10
  * Provides access to revisions metadata.
@@ -6,8 +6,8 @@ import { splitNodeUid } from '../uids';
6
6
  import { AlbumsCryptoService } from './albumsCrypto';
7
7
  import { PhotosAPIService } from './apiService';
8
8
  import { MissingRelatedPhotosError } from './errors';
9
- import { PhotoTransferPayloadBuilder, TransferEncryptedPhotoPayload } from './photosTransferPayloadBuilder';
10
9
  import { PhotosNodesAccess } from './nodes';
10
+ import { PhotoTransferPayloadBuilder, TransferEncryptedPhotoPayload } from './photosTransferPayloadBuilder';
11
11
 
12
12
  /**
13
13
  * The number of photos that are loaded in parallel to prepare the payloads.
@@ -1,4 +1,5 @@
1
1
  import { c } from 'ttag';
2
+
2
3
  import { DriveCrypto, PrivateKey, SessionKey } from '../../crypto';
3
4
  import { ValidationError } from '../../errors';
4
5
  import { InvalidNameError, Result } from '../../interface';
@@ -1,8 +1,8 @@
1
- import { NodeType } from '../../interface';
2
1
  import { ValidationError } from '../../errors';
2
+ import { NodeType } from '../../interface';
3
3
  import { getMockTelemetry } from '../../tests/telemetry';
4
- import { AlbumsManager } from './albumsManager';
5
4
  import { AlbumsCryptoService } from './albumsCrypto';
5
+ import { AlbumsManager } from './albumsManager';
6
6
  import { PhotosAPIService } from './apiService';
7
7
  import { AlbumContainsPhotosNotInTimelineError } from './errors';
8
8
  import { DecryptedPhotoNode } from './interface';
@@ -494,7 +494,7 @@ export class PhotosAPIService {
494
494
  ): AsyncGenerator<NodeResultWithError> {
495
495
  const { volumeId, nodeId: albumLinkId } = splitNodeUid(albumNodeUid);
496
496
 
497
- const batchSize = 50;
497
+ const batchSize = 10;
498
498
 
499
499
  for (const photoNodeUidsBatch of batch(photoNodeUids, batchSize)) {
500
500
  const linkIds = photoNodeUidsBatch.map((nodeUid) => splitNodeUid(nodeUid).nodeId);