@protontech/drive-sdk 0.14.10 → 0.15.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 (366) 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 +8 -12
  6. package/dist/crypto/driveCrypto.js +36 -39
  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 +4 -4
  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 +4 -4
  118. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  119. package/dist/internal/nodes/nodesManagement.test.js +7 -7
  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/nodes/validations.d.ts +1 -1
  124. package/dist/internal/nodes/validations.js +1 -4
  125. package/dist/internal/nodes/validations.js.map +1 -1
  126. package/dist/internal/photos/addToAlbum.d.ts +1 -1
  127. package/dist/internal/photos/addToAlbum.js.map +1 -1
  128. package/dist/internal/photos/albumsCrypto.js.map +1 -1
  129. package/dist/internal/photos/albumsManager.js +1 -1
  130. package/dist/internal/photos/albumsManager.js.map +1 -1
  131. package/dist/internal/photos/albumsManager.test.js +3 -3
  132. package/dist/internal/photos/albumsManager.test.js.map +1 -1
  133. package/dist/internal/photos/apiService.js +1 -1
  134. package/dist/internal/photos/index.d.ts +2 -2
  135. package/dist/internal/photos/index.js +5 -5
  136. package/dist/internal/photos/index.js.map +1 -1
  137. package/dist/internal/photos/interface.d.ts +2 -2
  138. package/dist/internal/photos/nodes.d.ts +2 -2
  139. package/dist/internal/photos/nodes.js +11 -1
  140. package/dist/internal/photos/nodes.js.map +1 -1
  141. package/dist/internal/photos/nodes.test.js +17 -3
  142. package/dist/internal/photos/nodes.test.js.map +1 -1
  143. package/dist/internal/photos/photosManager.d.ts +1 -1
  144. package/dist/internal/photos/photosManager.js +1 -1
  145. package/dist/internal/photos/photosManager.js.map +1 -1
  146. package/dist/internal/photos/photosManager.test.js +1 -1
  147. package/dist/internal/photos/photosManager.test.js.map +1 -1
  148. package/dist/internal/photos/photosTransferPayloadBuilder.test.js.map +1 -1
  149. package/dist/internal/photos/timeline.test.js.map +1 -1
  150. package/dist/internal/photos/upload.d.ts +1 -1
  151. package/dist/internal/shares/apiService.d.ts +1 -1
  152. package/dist/internal/shares/cache.d.ts +1 -1
  153. package/dist/internal/shares/cryptoCache.test.js.map +1 -1
  154. package/dist/internal/shares/cryptoService.d.ts +2 -2
  155. package/dist/internal/shares/cryptoService.js +1 -1
  156. package/dist/internal/shares/cryptoService.js.map +1 -1
  157. package/dist/internal/shares/cryptoService.test.js +1 -1
  158. package/dist/internal/shares/cryptoService.test.js.map +1 -1
  159. package/dist/internal/shares/index.d.ts +2 -2
  160. package/dist/internal/shares/index.js +1 -1
  161. package/dist/internal/shares/index.js.map +1 -1
  162. package/dist/internal/shares/manager.d.ts +2 -2
  163. package/dist/internal/shares/manager.js.map +1 -1
  164. package/dist/internal/sharing/apiService.d.ts +2 -2
  165. package/dist/internal/sharing/cryptoService.d.ts +2 -3
  166. package/dist/internal/sharing/cryptoService.js +14 -34
  167. package/dist/internal/sharing/cryptoService.js.map +1 -1
  168. package/dist/internal/sharing/cryptoService.test.js +3 -3
  169. package/dist/internal/sharing/cryptoService.test.js.map +1 -1
  170. package/dist/internal/sharing/index.d.ts +3 -3
  171. package/dist/internal/sharing/index.js +1 -1
  172. package/dist/internal/sharing/index.js.map +1 -1
  173. package/dist/internal/sharing/interface.d.ts +2 -2
  174. package/dist/internal/sharing/sharingAccess.d.ts +1 -1
  175. package/dist/internal/sharing/sharingAccess.js +1 -1
  176. package/dist/internal/sharing/sharingAccess.js.map +1 -1
  177. package/dist/internal/sharing/sharingAccess.test.js +1 -1
  178. package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
  179. package/dist/internal/sharing/sharingManagement.d.ts +3 -3
  180. package/dist/internal/sharing/sharingManagement.js +1 -1
  181. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  182. package/dist/internal/sharing/sharingManagement.test.js +2 -2
  183. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  184. package/dist/internal/sharingPublic/cryptoReporter.d.ts +1 -1
  185. package/dist/internal/sharingPublic/cryptoReporter.js +1 -1
  186. package/dist/internal/sharingPublic/cryptoReporter.js.map +1 -1
  187. package/dist/internal/sharingPublic/index.d.ts +2 -2
  188. package/dist/internal/sharingPublic/index.js +3 -3
  189. package/dist/internal/sharingPublic/index.js.map +1 -1
  190. package/dist/internal/sharingPublic/nodes.d.ts +4 -4
  191. package/dist/internal/sharingPublic/nodes.js +4 -1
  192. package/dist/internal/sharingPublic/nodes.js.map +1 -1
  193. package/dist/internal/sharingPublic/session/apiService.d.ts +1 -1
  194. package/dist/internal/sharingPublic/session/manager.d.ts +1 -1
  195. package/dist/internal/upload/apiService.d.ts +1 -1
  196. package/dist/internal/upload/apiService.js +13 -6
  197. package/dist/internal/upload/apiService.js.map +1 -1
  198. package/dist/internal/upload/cryptoService.d.ts +1 -1
  199. package/dist/internal/upload/cryptoService.js +5 -4
  200. package/dist/internal/upload/cryptoService.js.map +1 -1
  201. package/dist/internal/upload/fileUploader.test.js +1 -1
  202. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  203. package/dist/internal/upload/index.d.ts +2 -2
  204. package/dist/internal/upload/index.js.map +1 -1
  205. package/dist/internal/upload/interface.d.ts +1 -1
  206. package/dist/internal/upload/manager.d.ts +1 -1
  207. package/dist/internal/upload/manager.js +1 -1
  208. package/dist/internal/upload/manager.js.map +1 -1
  209. package/dist/internal/upload/smallFileUploader.test.js +1 -1
  210. package/dist/internal/upload/smallFileUploader.test.js.map +1 -1
  211. package/dist/internal/upload/streamUploader.d.ts +3 -3
  212. package/dist/internal/upload/streamUploader.js +1 -1
  213. package/dist/internal/upload/streamUploader.js.map +1 -1
  214. package/dist/internal/upload/streamUploader.test.js +2 -2
  215. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  216. package/dist/internal/upload/telemetry.d.ts +1 -1
  217. package/dist/internal/upload/telemetry.js +2 -3
  218. package/dist/internal/upload/telemetry.js.map +1 -1
  219. package/dist/internal/upload/telemetry.test.js +5 -0
  220. package/dist/internal/upload/telemetry.test.js.map +1 -1
  221. package/dist/polyfill.d.ts +1 -0
  222. package/dist/polyfill.js +4 -0
  223. package/dist/polyfill.js.map +1 -0
  224. package/dist/protonDriveClient.d.ts +1 -1
  225. package/dist/protonDriveClient.js +3 -3
  226. package/dist/protonDriveClient.js.map +1 -1
  227. package/dist/protonDrivePhotosClient.d.ts +7 -1
  228. package/dist/protonDrivePhotosClient.js +13 -4
  229. package/dist/protonDrivePhotosClient.js.map +1 -1
  230. package/dist/protonDrivePublicLinkClient.d.ts +3 -3
  231. package/dist/protonDrivePublicLinkClient.js +3 -3
  232. package/dist/protonDrivePublicLinkClient.js.map +1 -1
  233. package/dist/transformers.d.ts +1 -1
  234. package/package.json +8 -4
  235. package/src/cache/index.ts +1 -1
  236. package/src/cache/memoryCache.ts +1 -1
  237. package/src/cache/nullCache.ts +1 -1
  238. package/src/crypto/driveCrypto.test.ts +1 -24
  239. package/src/crypto/driveCrypto.ts +39 -36
  240. package/src/crypto/index.ts +2 -4
  241. package/src/crypto/interface.ts +3 -49
  242. package/src/crypto/openPGPCrypto.ts +4 -88
  243. package/src/diagnostic/index.ts +3 -3
  244. package/src/diagnostic/integrityVerificationStream.ts +1 -2
  245. package/src/diagnostic/interface.ts +1 -1
  246. package/src/diagnostic/nodeUtils.ts +1 -1
  247. package/src/diagnostic/sdkDiagnosticBase.ts +6 -6
  248. package/src/diagnostic/sdkDiagnosticMain.ts +2 -2
  249. package/src/diagnostic/sdkDiagnosticPhotos.ts +2 -2
  250. package/src/diagnostic/telemetry.ts +1 -1
  251. package/src/index.ts +4 -3
  252. package/src/interface/account.ts +1 -1
  253. package/src/interface/devices.ts +1 -1
  254. package/src/interface/index.ts +40 -40
  255. package/src/interface/nodes.ts +1 -1
  256. package/src/interface/photos.ts +1 -1
  257. package/src/interface/sharing.ts +2 -2
  258. package/src/internal/apiService/apiService.test.ts +2 -2
  259. package/src/internal/apiService/apiService.ts +3 -3
  260. package/src/internal/apiService/coreTypes.ts +8641 -7349
  261. package/src/internal/apiService/driveTypes.ts +47 -92
  262. package/src/internal/apiService/errors.test.ts +2 -2
  263. package/src/internal/apiService/index.ts +4 -4
  264. package/src/internal/apiService/transformers.ts +1 -1
  265. package/src/internal/devices/index.ts +1 -1
  266. package/src/internal/devices/manager.test.ts +2 -2
  267. package/src/internal/download/cryptoService.ts +6 -11
  268. package/src/internal/download/fileDownloader.test.ts +3 -3
  269. package/src/internal/download/fileDownloader.ts +8 -6
  270. package/src/internal/download/index.ts +3 -3
  271. package/src/internal/download/interface.ts +1 -1
  272. package/src/internal/download/seekableStream.test.ts +1 -1
  273. package/src/internal/download/telemetry.test.ts +7 -1
  274. package/src/internal/download/telemetry.ts +4 -7
  275. package/src/internal/download/thumbnailDownloader.test.ts +1 -1
  276. package/src/internal/download/thumbnailDownloader.ts +2 -2
  277. package/src/internal/errors.ts +15 -0
  278. package/src/internal/events/apiService.ts +2 -2
  279. package/src/internal/events/coreEventManager.test.ts +1 -1
  280. package/src/internal/events/eventManager.ts +2 -1
  281. package/src/internal/events/index.ts +2 -2
  282. package/src/internal/events/interface.ts +8 -0
  283. package/src/internal/events/volumeEventManager.test.ts +1 -1
  284. package/src/internal/events/volumeEventManager.ts +1 -1
  285. package/src/internal/nodes/apiService.test.ts +8 -3
  286. package/src/internal/nodes/apiService.ts +22 -7
  287. package/src/internal/nodes/cache.test.ts +1 -1
  288. package/src/internal/nodes/cache.ts +1 -1
  289. package/src/internal/nodes/cryptoCache.test.ts +1 -1
  290. package/src/internal/nodes/cryptoCache.ts +1 -1
  291. package/src/internal/nodes/cryptoReporter.ts +4 -4
  292. package/src/internal/nodes/cryptoService.test.ts +2 -2
  293. package/src/internal/nodes/cryptoService.ts +14 -15
  294. package/src/internal/nodes/events.test.ts +1 -1
  295. package/src/internal/nodes/extendedAttributes.test.ts +3 -3
  296. package/src/internal/nodes/index.test.ts +8 -8
  297. package/src/internal/nodes/index.ts +6 -6
  298. package/src/internal/nodes/interface.ts +6 -6
  299. package/src/internal/nodes/nodeName.test.ts +1 -1
  300. package/src/internal/nodes/nodesAccess.test.ts +5 -5
  301. package/src/internal/nodes/nodesAccess.ts +6 -6
  302. package/src/internal/nodes/nodesManagement.test.ts +5 -5
  303. package/src/internal/nodes/nodesManagement.ts +8 -8
  304. package/src/internal/nodes/nodesRevisions.ts +1 -1
  305. package/src/internal/nodes/validations.ts +1 -4
  306. package/src/internal/photos/addToAlbum.ts +1 -1
  307. package/src/internal/photos/albumsCrypto.ts +1 -0
  308. package/src/internal/photos/albumsManager.test.ts +4 -4
  309. package/src/internal/photos/albumsManager.ts +1 -1
  310. package/src/internal/photos/apiService.ts +1 -1
  311. package/src/internal/photos/index.ts +7 -7
  312. package/src/internal/photos/interface.ts +2 -2
  313. package/src/internal/photos/nodes.test.ts +22 -6
  314. package/src/internal/photos/nodes.ts +16 -9
  315. package/src/internal/photos/photosManager.test.ts +5 -5
  316. package/src/internal/photos/photosManager.ts +4 -4
  317. package/src/internal/photos/photosTransferPayloadBuilder.test.ts +1 -1
  318. package/src/internal/photos/timeline.test.ts +1 -1
  319. package/src/internal/photos/upload.ts +3 -3
  320. package/src/internal/sdkEvents.ts +1 -1
  321. package/src/internal/shares/apiService.ts +1 -1
  322. package/src/internal/shares/cache.ts +1 -1
  323. package/src/internal/shares/cryptoCache.test.ts +1 -1
  324. package/src/internal/shares/cryptoService.test.ts +1 -1
  325. package/src/internal/shares/cryptoService.ts +8 -8
  326. package/src/internal/shares/index.ts +5 -5
  327. package/src/internal/shares/manager.ts +2 -2
  328. package/src/internal/sharing/apiService.ts +10 -10
  329. package/src/internal/sharing/cryptoService.test.ts +4 -4
  330. package/src/internal/sharing/cryptoService.ts +16 -40
  331. package/src/internal/sharing/events.test.ts +2 -2
  332. package/src/internal/sharing/index.ts +3 -3
  333. package/src/internal/sharing/interface.ts +2 -2
  334. package/src/internal/sharing/sharingAccess.test.ts +4 -4
  335. package/src/internal/sharing/sharingAccess.ts +3 -3
  336. package/src/internal/sharing/sharingManagement.test.ts +4 -4
  337. package/src/internal/sharing/sharingManagement.ts +9 -9
  338. package/src/internal/sharingPublic/cryptoReporter.ts +7 -7
  339. package/src/internal/sharingPublic/index.ts +6 -6
  340. package/src/internal/sharingPublic/nodes.ts +7 -4
  341. package/src/internal/sharingPublic/session/apiService.ts +1 -1
  342. package/src/internal/sharingPublic/session/manager.ts +1 -1
  343. package/src/internal/upload/apiService.ts +17 -8
  344. package/src/internal/upload/cryptoService.ts +8 -6
  345. package/src/internal/upload/fileUploader.test.ts +4 -4
  346. package/src/internal/upload/index.ts +3 -3
  347. package/src/internal/upload/interface.ts +1 -2
  348. package/src/internal/upload/manager.ts +4 -4
  349. package/src/internal/upload/smallFileUploader.test.ts +4 -4
  350. package/src/internal/upload/streamUploader.test.ts +5 -5
  351. package/src/internal/upload/streamUploader.ts +4 -4
  352. package/src/internal/upload/telemetry.test.ts +7 -1
  353. package/src/internal/upload/telemetry.ts +5 -8
  354. package/src/polyfill.ts +1 -0
  355. package/src/protonDriveClient.ts +32 -32
  356. package/src/protonDrivePhotosClient.ts +42 -32
  357. package/src/protonDrivePublicLinkClient.ts +25 -25
  358. package/src/transformers.ts +9 -9
  359. package/dist/crypto/hmac.d.ts +0 -22
  360. package/dist/crypto/hmac.js +0 -44
  361. package/dist/crypto/hmac.js.map +0 -1
  362. package/dist/crypto/utils.d.ts +0 -2
  363. package/dist/crypto/utils.js +0 -35
  364. package/dist/crypto/utils.js.map +0 -1
  365. package/src/crypto/hmac.ts +0 -46
  366. 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;
@@ -134,11 +134,11 @@ describe('nodesAccess', () => {
134
134
  const decryptedUnparsedNode = {
135
135
  uid: 'volumeId~nodeId',
136
136
  parentUid: 'volumeId~parentNodeid',
137
- name: { ok: true, value: 'foo/bar' },
137
+ name: { ok: true, value: '' },
138
138
  } as DecryptedUnparsedNode;
139
139
  const decryptedNode = {
140
140
  ...decryptedUnparsedNode,
141
- name: { ok: false, error: { name: 'foo/bar', error: "Name must not contain the character '/'" } },
141
+ name: { ok: false, error: { name: '', error: "Name must not be empty" } },
142
142
  treeEventScopeId: 'volumeId',
143
143
  } as DecryptedNode;
144
144
  const decryptedKeys = { key: 'key' } as any as DecryptedNodeKeys;
@@ -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;
@@ -426,7 +426,7 @@ describe('NodesManagement', () => {
426
426
  });
427
427
 
428
428
  it('copyNode throws error if name is invalid', async () => {
429
- const promise = management.copyNode('nodeUid', 'newParentNodeUid', 'invalid/name');
429
+ const promise = management.copyNode('nodeUid', 'newParentNodeUid', '');
430
430
  await expect(promise).rejects.toThrow(ValidationError);
431
431
  });
432
432
 
@@ -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;
@@ -236,12 +236,12 @@ export abstract class NodesManagementBase<
236
236
  }
237
237
 
238
238
  async copyNode(nodeUid: string, newParentUid: string, name?: string): Promise<TDecryptedNode> {
239
- if (name) {
239
+ if (name !== undefined) {
240
240
  validateNodeName(name);
241
241
  }
242
242
 
243
243
  const node = await this.nodesAccess.getNode(nodeUid);
244
- const nodeName = name ? resultOk<string, Error | InvalidNameError>(name) : node.name;
244
+ const nodeName = name !== undefined ? resultOk<string, Error | InvalidNameError>(name) : node.name;
245
245
 
246
246
  const [keys, newParentKeys, signingKeys] = await Promise.all([
247
247
  this.nodesAccess.getNodePrivateAndSessionKeys(nodeUid),
@@ -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.