@protontech/drive-sdk 0.0.13 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (496) hide show
  1. package/dist/cache/index.d.ts +1 -0
  2. package/dist/cache/index.js +3 -1
  3. package/dist/cache/index.js.map +1 -1
  4. package/dist/cache/memoryCache.d.ts +1 -1
  5. package/dist/cache/memoryCache.js +0 -1
  6. package/dist/cache/memoryCache.js.map +1 -1
  7. package/dist/cache/memoryCache.test.js +2 -4
  8. package/dist/cache/memoryCache.test.js.map +1 -1
  9. package/dist/cache/nullCache.d.ts +14 -0
  10. package/dist/cache/nullCache.js +36 -0
  11. package/dist/cache/nullCache.js.map +1 -0
  12. package/dist/config.d.ts +16 -1
  13. package/dist/config.js +1 -1
  14. package/dist/config.js.map +1 -1
  15. package/dist/crypto/driveCrypto.d.ts +2 -5
  16. package/dist/crypto/driveCrypto.js +7 -12
  17. package/dist/crypto/driveCrypto.js.map +1 -1
  18. package/dist/crypto/driveCrypto.test.js +14 -14
  19. package/dist/crypto/openPGPCrypto.js +5 -3
  20. package/dist/crypto/openPGPCrypto.js.map +1 -1
  21. package/dist/diagnostic/eventsGenerator.d.ts +14 -0
  22. package/dist/diagnostic/eventsGenerator.js +49 -0
  23. package/dist/diagnostic/eventsGenerator.js.map +1 -0
  24. package/dist/diagnostic/httpClient.d.ts +16 -0
  25. package/dist/diagnostic/httpClient.js +81 -0
  26. package/dist/diagnostic/httpClient.js.map +1 -0
  27. package/dist/diagnostic/index.d.ts +10 -0
  28. package/dist/diagnostic/index.js +35 -0
  29. package/dist/diagnostic/index.js.map +1 -0
  30. package/dist/diagnostic/integrityVerificationStream.d.ts +21 -0
  31. package/dist/diagnostic/integrityVerificationStream.js +56 -0
  32. package/dist/diagnostic/integrityVerificationStream.js.map +1 -0
  33. package/dist/diagnostic/interface.d.ts +102 -0
  34. package/dist/diagnostic/interface.js +3 -0
  35. package/dist/diagnostic/interface.js.map +1 -0
  36. package/dist/diagnostic/sdkDiagnostic.d.ts +22 -0
  37. package/dist/diagnostic/sdkDiagnostic.js +222 -0
  38. package/dist/diagnostic/sdkDiagnostic.js.map +1 -0
  39. package/dist/diagnostic/sdkDiagnosticFull.d.ts +18 -0
  40. package/dist/diagnostic/sdkDiagnosticFull.js +35 -0
  41. package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -0
  42. package/dist/diagnostic/telemetry.d.ts +25 -0
  43. package/dist/diagnostic/telemetry.js +70 -0
  44. package/dist/diagnostic/telemetry.js.map +1 -0
  45. package/dist/diagnostic/zipGenerators.d.ts +9 -0
  46. package/dist/diagnostic/zipGenerators.js +64 -0
  47. package/dist/diagnostic/zipGenerators.js.map +1 -0
  48. package/dist/diagnostic/zipGenerators.test.js +144 -0
  49. package/dist/diagnostic/zipGenerators.test.js.map +1 -0
  50. package/dist/errors.d.ts +2 -1
  51. package/dist/errors.js +3 -1
  52. package/dist/errors.js.map +1 -1
  53. package/dist/interface/config.d.ts +26 -0
  54. package/dist/interface/config.js +3 -0
  55. package/dist/interface/config.js.map +1 -0
  56. package/dist/interface/download.d.ts +2 -2
  57. package/dist/interface/events.d.ts +58 -20
  58. package/dist/interface/events.js +11 -1
  59. package/dist/interface/events.js.map +1 -1
  60. package/dist/interface/httpClient.d.ts +0 -14
  61. package/dist/interface/index.d.ts +11 -7
  62. package/dist/interface/index.js +2 -2
  63. package/dist/interface/index.js.map +1 -1
  64. package/dist/interface/nodes.d.ts +9 -0
  65. package/dist/interface/nodes.js.map +1 -1
  66. package/dist/interface/result.js.map +1 -1
  67. package/dist/interface/sharing.d.ts +2 -0
  68. package/dist/interface/sharing.js.map +1 -1
  69. package/dist/interface/telemetry.js +0 -8
  70. package/dist/interface/telemetry.js.map +1 -1
  71. package/dist/interface/thumbnail.js.map +1 -1
  72. package/dist/interface/upload.d.ts +7 -1
  73. package/dist/internal/apiService/apiService.d.ts +1 -1
  74. package/dist/internal/apiService/apiService.js +7 -11
  75. package/dist/internal/apiService/apiService.js.map +1 -1
  76. package/dist/internal/apiService/apiService.test.js +55 -48
  77. package/dist/internal/apiService/apiService.test.js.map +1 -1
  78. package/dist/internal/apiService/coreTypes.d.ts +2356 -2356
  79. package/dist/internal/apiService/driveTypes.d.ts +1680 -1680
  80. package/dist/internal/apiService/errors.js +14 -8
  81. package/dist/internal/apiService/errors.js.map +1 -1
  82. package/dist/internal/apiService/errors.test.js +17 -12
  83. package/dist/internal/apiService/errors.test.js.map +1 -1
  84. package/dist/internal/apiService/transformers.d.ts +1 -1
  85. package/dist/internal/apiService/transformers.js +1 -1
  86. package/dist/internal/asyncIteratorMap.test.js +2 -2
  87. package/dist/internal/asyncIteratorMap.test.js.map +1 -1
  88. package/dist/internal/asyncIteratorRace.d.ts +13 -0
  89. package/dist/internal/asyncIteratorRace.js +59 -0
  90. package/dist/internal/asyncIteratorRace.js.map +1 -0
  91. package/dist/internal/asyncIteratorRace.test.d.ts +1 -0
  92. package/dist/internal/asyncIteratorRace.test.js +119 -0
  93. package/dist/internal/asyncIteratorRace.test.js.map +1 -0
  94. package/dist/internal/batch.d.ts +1 -0
  95. package/dist/internal/batch.js +12 -0
  96. package/dist/internal/batch.js.map +1 -0
  97. package/dist/internal/batch.test.d.ts +1 -0
  98. package/dist/internal/batch.test.js +41 -0
  99. package/dist/internal/batch.test.js.map +1 -0
  100. package/dist/internal/batchLoading.js.map +1 -1
  101. package/dist/internal/batchLoading.test.js +13 -13
  102. package/dist/internal/batchLoading.test.js.map +1 -1
  103. package/dist/internal/devices/apiService.d.ts +3 -3
  104. package/dist/internal/devices/apiService.js +2 -2
  105. package/dist/internal/devices/apiService.js.map +1 -1
  106. package/dist/internal/devices/cryptoService.js +1 -2
  107. package/dist/internal/devices/cryptoService.js.map +1 -1
  108. package/dist/internal/devices/index.d.ts +5 -5
  109. package/dist/internal/devices/index.js.map +1 -1
  110. package/dist/internal/devices/interface.d.ts +3 -3
  111. package/dist/internal/devices/manager.js +2 -2
  112. package/dist/internal/devices/manager.js.map +1 -1
  113. package/dist/internal/devices/manager.test.js +38 -7
  114. package/dist/internal/devices/manager.test.js.map +1 -1
  115. package/dist/internal/download/apiService.d.ts +4 -4
  116. package/dist/internal/download/apiService.js +32 -32
  117. package/dist/internal/download/apiService.js.map +1 -1
  118. package/dist/internal/download/cryptoService.d.ts +4 -4
  119. package/dist/internal/download/cryptoService.js +6 -5
  120. package/dist/internal/download/cryptoService.js.map +1 -1
  121. package/dist/internal/download/fileDownloader.d.ts +6 -6
  122. package/dist/internal/download/fileDownloader.js +3 -2
  123. package/dist/internal/download/fileDownloader.js.map +1 -1
  124. package/dist/internal/download/fileDownloader.test.js +1 -1
  125. package/dist/internal/download/fileDownloader.test.js.map +1 -1
  126. package/dist/internal/download/index.d.ts +5 -5
  127. package/dist/internal/download/index.js +5 -5
  128. package/dist/internal/download/index.js.map +1 -1
  129. package/dist/internal/download/interface.d.ts +3 -4
  130. package/dist/internal/download/telemetry.d.ts +3 -3
  131. package/dist/internal/download/telemetry.js +4 -2
  132. package/dist/internal/download/telemetry.js.map +1 -1
  133. package/dist/internal/download/telemetry.test.js +8 -8
  134. package/dist/internal/download/telemetry.test.js.map +1 -1
  135. package/dist/internal/download/thumbnailDownloader.d.ts +4 -4
  136. package/dist/internal/download/thumbnailDownloader.js +6 -6
  137. package/dist/internal/download/thumbnailDownloader.js.map +1 -1
  138. package/dist/internal/download/thumbnailDownloader.test.js.map +1 -1
  139. package/dist/internal/errors.d.ts +1 -1
  140. package/dist/internal/errors.js +1 -3
  141. package/dist/internal/errors.js.map +1 -1
  142. package/dist/internal/events/apiService.d.ts +5 -7
  143. package/dist/internal/events/apiService.js +19 -22
  144. package/dist/internal/events/apiService.js.map +1 -1
  145. package/dist/internal/events/coreEventManager.d.ts +9 -12
  146. package/dist/internal/events/coreEventManager.js +19 -36
  147. package/dist/internal/events/coreEventManager.js.map +1 -1
  148. package/dist/internal/events/coreEventManager.test.d.ts +1 -0
  149. package/dist/internal/events/coreEventManager.test.js +87 -0
  150. package/dist/internal/events/coreEventManager.test.js.map +1 -0
  151. package/dist/internal/events/eventManager.d.ts +11 -36
  152. package/dist/internal/events/eventManager.js +59 -106
  153. package/dist/internal/events/eventManager.js.map +1 -1
  154. package/dist/internal/events/eventManager.test.js +177 -83
  155. package/dist/internal/events/eventManager.test.js.map +1 -1
  156. package/dist/internal/events/index.d.ts +16 -36
  157. package/dist/internal/events/index.js +56 -72
  158. package/dist/internal/events/index.js.map +1 -1
  159. package/dist/internal/events/interface.d.ts +59 -14
  160. package/dist/internal/events/interface.js +12 -3
  161. package/dist/internal/events/interface.js.map +1 -1
  162. package/dist/internal/events/volumeEventManager.d.ts +9 -19
  163. package/dist/internal/events/volumeEventManager.js +58 -45
  164. package/dist/internal/events/volumeEventManager.js.map +1 -1
  165. package/dist/internal/events/volumeEventManager.test.d.ts +1 -0
  166. package/dist/internal/events/volumeEventManager.test.js +203 -0
  167. package/dist/internal/events/volumeEventManager.test.js.map +1 -0
  168. package/dist/internal/nodes/apiService.d.ts +4 -3
  169. package/dist/internal/nodes/apiService.js +36 -15
  170. package/dist/internal/nodes/apiService.js.map +1 -1
  171. package/dist/internal/nodes/apiService.test.js +60 -41
  172. package/dist/internal/nodes/apiService.test.js.map +1 -1
  173. package/dist/internal/nodes/cache.d.ts +14 -5
  174. package/dist/internal/nodes/cache.js +31 -7
  175. package/dist/internal/nodes/cache.js.map +1 -1
  176. package/dist/internal/nodes/cache.test.js +31 -9
  177. package/dist/internal/nodes/cache.test.js.map +1 -1
  178. package/dist/internal/nodes/cryptoCache.d.ts +2 -2
  179. package/dist/internal/nodes/cryptoCache.js.map +1 -1
  180. package/dist/internal/nodes/cryptoCache.test.js +24 -4
  181. package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
  182. package/dist/internal/nodes/cryptoService.d.ts +4 -4
  183. package/dist/internal/nodes/cryptoService.js +11 -17
  184. package/dist/internal/nodes/cryptoService.js.map +1 -1
  185. package/dist/internal/nodes/cryptoService.test.js +320 -241
  186. package/dist/internal/nodes/cryptoService.test.js.map +1 -1
  187. package/dist/internal/nodes/events.d.ts +8 -84
  188. package/dist/internal/nodes/events.js +43 -217
  189. package/dist/internal/nodes/events.js.map +1 -1
  190. package/dist/internal/nodes/events.test.js +35 -279
  191. package/dist/internal/nodes/events.test.js.map +1 -1
  192. package/dist/internal/nodes/extendedAttributes.d.ts +1 -1
  193. package/dist/internal/nodes/extendedAttributes.js +3 -1
  194. package/dist/internal/nodes/extendedAttributes.js.map +1 -1
  195. package/dist/internal/nodes/extendedAttributes.test.js +7 -10
  196. package/dist/internal/nodes/extendedAttributes.test.js.map +1 -1
  197. package/dist/internal/nodes/index.d.ts +12 -13
  198. package/dist/internal/nodes/index.js +5 -5
  199. package/dist/internal/nodes/index.js.map +1 -1
  200. package/dist/internal/nodes/index.test.js +24 -32
  201. package/dist/internal/nodes/index.test.js.map +1 -1
  202. package/dist/internal/nodes/interface.d.ts +2 -2
  203. package/dist/internal/nodes/nodesAccess.d.ts +22 -7
  204. package/dist/internal/nodes/nodesAccess.js +65 -16
  205. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  206. package/dist/internal/nodes/nodesAccess.test.js +165 -101
  207. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  208. package/dist/internal/nodes/nodesManagement.d.ts +7 -9
  209. package/dist/internal/nodes/nodesManagement.js +21 -33
  210. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  211. package/dist/internal/nodes/nodesManagement.test.js +42 -21
  212. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  213. package/dist/internal/nodes/nodesRevisions.d.ts +4 -4
  214. package/dist/internal/nodes/nodesRevisions.js.map +1 -1
  215. package/dist/internal/photos/albums.d.ts +3 -3
  216. package/dist/internal/photos/albums.js.map +1 -1
  217. package/dist/internal/photos/apiService.d.ts +1 -1
  218. package/dist/internal/photos/apiService.js +3 -6
  219. package/dist/internal/photos/apiService.js.map +1 -1
  220. package/dist/internal/photos/cache.d.ts +1 -1
  221. package/dist/internal/photos/index.d.ts +5 -5
  222. package/dist/internal/photos/index.js.map +1 -1
  223. package/dist/internal/photos/interface.d.ts +2 -2
  224. package/dist/internal/photos/photosTimeline.d.ts +3 -3
  225. package/dist/internal/photos/photosTimeline.js +1 -2
  226. package/dist/internal/photos/photosTimeline.js.map +1 -1
  227. package/dist/internal/sdkEvents.d.ts +1 -1
  228. package/dist/internal/sdkEvents.js +2 -7
  229. package/dist/internal/sdkEvents.js.map +1 -1
  230. package/dist/internal/sdkEvents.test.js +8 -8
  231. package/dist/internal/shares/apiService.d.ts +2 -2
  232. package/dist/internal/shares/apiService.js +5 -3
  233. package/dist/internal/shares/apiService.js.map +1 -1
  234. package/dist/internal/shares/cache.d.ts +4 -2
  235. package/dist/internal/shares/cache.js +14 -6
  236. package/dist/internal/shares/cache.js.map +1 -1
  237. package/dist/internal/shares/cache.test.js.map +1 -1
  238. package/dist/internal/shares/cryptoCache.d.ts +2 -2
  239. package/dist/internal/shares/cryptoCache.test.js +8 -2
  240. package/dist/internal/shares/cryptoCache.test.js.map +1 -1
  241. package/dist/internal/shares/cryptoService.d.ts +3 -3
  242. package/dist/internal/shares/cryptoService.js.map +1 -1
  243. package/dist/internal/shares/cryptoService.test.js +42 -42
  244. package/dist/internal/shares/cryptoService.test.js.map +1 -1
  245. package/dist/internal/shares/index.d.ts +4 -4
  246. package/dist/internal/shares/index.js.map +1 -1
  247. package/dist/internal/shares/interface.d.ts +2 -2
  248. package/dist/internal/shares/manager.d.ts +8 -7
  249. package/dist/internal/shares/manager.js +3 -0
  250. package/dist/internal/shares/manager.js.map +1 -1
  251. package/dist/internal/shares/manager.test.js +71 -63
  252. package/dist/internal/shares/manager.test.js.map +1 -1
  253. package/dist/internal/sharing/apiService.d.ts +4 -4
  254. package/dist/internal/sharing/apiService.js +5 -3
  255. package/dist/internal/sharing/apiService.js.map +1 -1
  256. package/dist/internal/sharing/cache.d.ts +1 -1
  257. package/dist/internal/sharing/cache.test.js +33 -33
  258. package/dist/internal/sharing/cryptoService.d.ts +3 -3
  259. package/dist/internal/sharing/cryptoService.js +3 -4
  260. package/dist/internal/sharing/cryptoService.js.map +1 -1
  261. package/dist/internal/sharing/cryptoService.test.js +39 -39
  262. package/dist/internal/sharing/cryptoService.test.js.map +1 -1
  263. package/dist/internal/sharing/events.d.ts +24 -56
  264. package/dist/internal/sharing/events.js +45 -138
  265. package/dist/internal/sharing/events.js.map +1 -1
  266. package/dist/internal/sharing/events.test.js +85 -189
  267. package/dist/internal/sharing/events.test.js.map +1 -1
  268. package/dist/internal/sharing/index.d.ts +8 -9
  269. package/dist/internal/sharing/index.js +5 -5
  270. package/dist/internal/sharing/index.js.map +1 -1
  271. package/dist/internal/sharing/interface.d.ts +8 -4
  272. package/dist/internal/sharing/sharingAccess.d.ts +6 -6
  273. package/dist/internal/sharing/sharingAccess.js +8 -4
  274. package/dist/internal/sharing/sharingAccess.js.map +1 -1
  275. package/dist/internal/sharing/sharingAccess.test.js +45 -39
  276. package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
  277. package/dist/internal/sharing/sharingManagement.d.ts +5 -6
  278. package/dist/internal/sharing/sharingManagement.js +12 -16
  279. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  280. package/dist/internal/sharing/sharingManagement.test.js +305 -286
  281. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  282. package/dist/internal/uids.js.map +1 -1
  283. package/dist/internal/upload/apiService.d.ts +5 -6
  284. package/dist/internal/upload/apiService.js +8 -5
  285. package/dist/internal/upload/apiService.js.map +1 -1
  286. package/dist/internal/upload/blockVerifier.d.ts +3 -3
  287. package/dist/internal/upload/blockVerifier.js +1 -1
  288. package/dist/internal/upload/blockVerifier.js.map +1 -1
  289. package/dist/internal/upload/chunkStreamReader.test.js +6 -6
  290. package/dist/internal/upload/cryptoService.d.ts +4 -4
  291. package/dist/internal/upload/cryptoService.js +4 -4
  292. package/dist/internal/upload/cryptoService.js.map +1 -1
  293. package/dist/internal/upload/digests.js.map +1 -1
  294. package/dist/internal/upload/fileUploader.d.ts +6 -6
  295. package/dist/internal/upload/fileUploader.js.map +1 -1
  296. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  297. package/dist/internal/upload/index.d.ts +6 -6
  298. package/dist/internal/upload/index.js +3 -3
  299. package/dist/internal/upload/index.js.map +1 -1
  300. package/dist/internal/upload/interface.d.ts +5 -3
  301. package/dist/internal/upload/manager.d.ts +8 -8
  302. package/dist/internal/upload/manager.js +23 -52
  303. package/dist/internal/upload/manager.js.map +1 -1
  304. package/dist/internal/upload/manager.test.js +185 -147
  305. package/dist/internal/upload/manager.test.js.map +1 -1
  306. package/dist/internal/upload/streamUploader.d.ts +6 -6
  307. package/dist/internal/upload/streamUploader.js +9 -8
  308. package/dist/internal/upload/streamUploader.js.map +1 -1
  309. package/dist/internal/upload/streamUploader.test.js +17 -12
  310. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  311. package/dist/internal/upload/telemetry.d.ts +3 -3
  312. package/dist/internal/upload/telemetry.js +5 -3
  313. package/dist/internal/upload/telemetry.js.map +1 -1
  314. package/dist/internal/upload/telemetry.test.js +8 -8
  315. package/dist/internal/upload/telemetry.test.js.map +1 -1
  316. package/dist/protonDriveClient.d.ts +27 -170
  317. package/dist/protonDriveClient.js +37 -198
  318. package/dist/protonDriveClient.js.map +1 -1
  319. package/dist/protonDrivePhotosClient.js +3 -2
  320. package/dist/protonDrivePhotosClient.js.map +1 -1
  321. package/dist/telemetry.js +18 -15
  322. package/dist/telemetry.js.map +1 -1
  323. package/dist/tests/logger.js.map +1 -1
  324. package/dist/tests/telemetry.d.ts +1 -1
  325. package/dist/transformers.js +4 -2
  326. package/dist/transformers.js.map +1 -1
  327. package/package.json +3 -3
  328. package/src/cache/index.ts +1 -0
  329. package/src/cache/interface.ts +22 -22
  330. package/src/cache/memoryCache.test.ts +7 -7
  331. package/src/cache/memoryCache.ts +5 -5
  332. package/src/cache/nullCache.ts +38 -0
  333. package/src/config.ts +17 -2
  334. package/src/crypto/driveCrypto.test.ts +15 -15
  335. package/src/crypto/driveCrypto.ts +120 -156
  336. package/src/crypto/hmac.ts +1 -1
  337. package/src/crypto/interface.ts +63 -72
  338. package/src/crypto/openPGPCrypto.ts +76 -94
  339. package/src/crypto/utils.ts +1 -1
  340. package/src/diagnostic/eventsGenerator.ts +48 -0
  341. package/src/diagnostic/httpClient.ts +84 -0
  342. package/src/diagnostic/index.ts +40 -0
  343. package/src/diagnostic/integrityVerificationStream.ts +55 -0
  344. package/src/diagnostic/interface.ts +158 -0
  345. package/src/diagnostic/sdkDiagnostic.ts +249 -0
  346. package/src/diagnostic/sdkDiagnosticFull.ts +37 -0
  347. package/src/diagnostic/telemetry.ts +74 -0
  348. package/src/diagnostic/zipGenerators.test.ts +177 -0
  349. package/src/diagnostic/zipGenerators.ts +70 -0
  350. package/src/errors.ts +25 -22
  351. package/src/index.ts +3 -3
  352. package/src/interface/account.ts +10 -10
  353. package/src/interface/author.ts +6 -6
  354. package/src/interface/config.ts +28 -0
  355. package/src/interface/devices.ts +6 -6
  356. package/src/interface/download.ts +12 -9
  357. package/src/interface/events.ts +76 -25
  358. package/src/interface/httpClient.ts +11 -27
  359. package/src/interface/index.ts +81 -20
  360. package/src/interface/nodes.ts +67 -60
  361. package/src/interface/result.ts +1 -3
  362. package/src/interface/sharing.ts +60 -56
  363. package/src/interface/telemetry.ts +74 -74
  364. package/src/interface/thumbnail.ts +5 -6
  365. package/src/interface/upload.ts +25 -11
  366. package/src/internal/apiService/apiService.test.ts +109 -76
  367. package/src/internal/apiService/apiService.ts +40 -26
  368. package/src/internal/apiService/coreTypes.ts +2474 -2463
  369. package/src/internal/apiService/driveTypes.ts +1868 -1822
  370. package/src/internal/apiService/errorCodes.ts +4 -4
  371. package/src/internal/apiService/errors.test.ts +25 -23
  372. package/src/internal/apiService/errors.ts +15 -9
  373. package/src/internal/apiService/index.ts +1 -1
  374. package/src/internal/apiService/transformers.ts +2 -2
  375. package/src/internal/asyncIteratorMap.test.ts +4 -4
  376. package/src/internal/asyncIteratorMap.ts +1 -1
  377. package/src/internal/asyncIteratorRace.test.ts +149 -0
  378. package/src/internal/asyncIteratorRace.ts +79 -0
  379. package/src/internal/batch.test.ts +50 -0
  380. package/src/internal/batch.ts +9 -0
  381. package/src/internal/batchLoading.test.ts +13 -14
  382. package/src/internal/batchLoading.ts +8 -8
  383. package/src/internal/devices/apiService.ts +58 -51
  384. package/src/internal/devices/cryptoService.ts +22 -17
  385. package/src/internal/devices/index.ts +17 -10
  386. package/src/internal/devices/interface.ts +21 -12
  387. package/src/internal/devices/manager.test.ts +40 -9
  388. package/src/internal/devices/manager.ts +3 -3
  389. package/src/internal/download/apiService.ts +72 -52
  390. package/src/internal/download/cryptoService.ts +34 -18
  391. package/src/internal/download/fileDownloader.test.ts +25 -9
  392. package/src/internal/download/fileDownloader.ts +38 -20
  393. package/src/internal/download/index.ts +19 -19
  394. package/src/internal/download/interface.ts +19 -20
  395. package/src/internal/download/queue.ts +3 -3
  396. package/src/internal/download/telemetry.test.ts +11 -11
  397. package/src/internal/download/telemetry.ts +24 -14
  398. package/src/internal/download/thumbnailDownloader.test.ts +11 -6
  399. package/src/internal/download/thumbnailDownloader.ts +43 -32
  400. package/src/internal/errors.ts +7 -5
  401. package/src/internal/events/apiService.ts +46 -36
  402. package/src/internal/events/coreEventManager.test.ts +101 -0
  403. package/src/internal/events/coreEventManager.ts +26 -48
  404. package/src/internal/events/eventManager.test.ts +211 -93
  405. package/src/internal/events/eventManager.ts +72 -117
  406. package/src/internal/events/index.ts +71 -91
  407. package/src/internal/events/interface.ts +92 -29
  408. package/src/internal/events/volumeEventManager.test.ts +239 -0
  409. package/src/internal/events/volumeEventManager.ts +68 -57
  410. package/src/internal/nodes/apiService.test.ts +197 -147
  411. package/src/internal/nodes/apiService.ts +288 -174
  412. package/src/internal/nodes/cache.test.ts +48 -20
  413. package/src/internal/nodes/cache.ts +79 -45
  414. package/src/internal/nodes/cryptoCache.test.ts +34 -14
  415. package/src/internal/nodes/cryptoCache.ts +10 -5
  416. package/src/internal/nodes/cryptoService.test.ts +492 -351
  417. package/src/internal/nodes/cryptoService.ts +171 -89
  418. package/src/internal/nodes/events.test.ts +48 -344
  419. package/src/internal/nodes/events.ts +48 -254
  420. package/src/internal/nodes/extendedAttributes.test.ts +28 -24
  421. package/src/internal/nodes/extendedAttributes.ts +20 -15
  422. package/src/internal/nodes/index.test.ts +51 -55
  423. package/src/internal/nodes/index.ts +32 -22
  424. package/src/internal/nodes/interface.ts +44 -31
  425. package/src/internal/nodes/nodesAccess.test.ts +237 -130
  426. package/src/internal/nodes/nodesAccess.ts +113 -50
  427. package/src/internal/nodes/nodesManagement.test.ts +64 -39
  428. package/src/internal/nodes/nodesManagement.ts +51 -62
  429. package/src/internal/nodes/nodesRevisions.ts +7 -7
  430. package/src/internal/nodes/validations.ts +2 -2
  431. package/src/internal/photos/albums.ts +5 -5
  432. package/src/internal/photos/apiService.ts +4 -7
  433. package/src/internal/photos/cache.ts +1 -1
  434. package/src/internal/photos/index.ts +8 -8
  435. package/src/internal/photos/interface.ts +2 -2
  436. package/src/internal/photos/photosTimeline.ts +4 -5
  437. package/src/internal/sdkEvents.test.ts +10 -10
  438. package/src/internal/sdkEvents.ts +5 -13
  439. package/src/internal/shares/apiService.ts +44 -33
  440. package/src/internal/shares/cache.test.ts +6 -4
  441. package/src/internal/shares/cache.ts +25 -14
  442. package/src/internal/shares/cryptoCache.test.ts +17 -11
  443. package/src/internal/shares/cryptoCache.ts +4 -4
  444. package/src/internal/shares/cryptoService.test.ts +72 -74
  445. package/src/internal/shares/cryptoService.ts +48 -23
  446. package/src/internal/shares/index.ts +23 -11
  447. package/src/internal/shares/interface.ts +8 -8
  448. package/src/internal/shares/manager.test.ts +88 -80
  449. package/src/internal/shares/manager.ts +27 -23
  450. package/src/internal/sharing/apiService.ts +283 -175
  451. package/src/internal/sharing/cache.test.ts +35 -35
  452. package/src/internal/sharing/cache.ts +3 -3
  453. package/src/internal/sharing/cryptoService.test.ts +58 -46
  454. package/src/internal/sharing/cryptoService.ts +121 -83
  455. package/src/internal/sharing/events.test.ts +97 -207
  456. package/src/internal/sharing/events.ts +46 -157
  457. package/src/internal/sharing/index.ts +24 -16
  458. package/src/internal/sharing/interface.ts +46 -42
  459. package/src/internal/sharing/sharingAccess.test.ts +71 -65
  460. package/src/internal/sharing/sharingAccess.ts +39 -21
  461. package/src/internal/sharing/sharingManagement.test.ts +405 -335
  462. package/src/internal/sharing/sharingManagement.ts +144 -75
  463. package/src/internal/uids.ts +1 -1
  464. package/src/internal/upload/apiService.ts +168 -119
  465. package/src/internal/upload/blockVerifier.ts +8 -6
  466. package/src/internal/upload/chunkStreamReader.test.ts +7 -7
  467. package/src/internal/upload/cryptoService.ts +42 -36
  468. package/src/internal/upload/digests.ts +2 -2
  469. package/src/internal/upload/fileUploader.test.ts +15 -3
  470. package/src/internal/upload/fileUploader.ts +39 -17
  471. package/src/internal/upload/index.ts +17 -18
  472. package/src/internal/upload/interface.ts +79 -77
  473. package/src/internal/upload/manager.test.ts +222 -175
  474. package/src/internal/upload/manager.ts +74 -80
  475. package/src/internal/upload/queue.ts +3 -3
  476. package/src/internal/upload/streamUploader.test.ts +40 -27
  477. package/src/internal/upload/streamUploader.ts +87 -71
  478. package/src/internal/upload/telemetry.test.ts +11 -11
  479. package/src/internal/upload/telemetry.ts +25 -15
  480. package/src/internal/wait.test.ts +1 -1
  481. package/src/internal/wait.ts +3 -3
  482. package/src/protonDriveClient.ts +189 -276
  483. package/src/protonDrivePhotosClient.ts +20 -13
  484. package/src/telemetry.ts +60 -52
  485. package/src/tests/logger.ts +1 -1
  486. package/src/tests/telemetry.ts +2 -2
  487. package/src/transformers.ts +27 -21
  488. package/src/version.ts +0 -1
  489. package/dist/internal/events/cache.d.ts +0 -28
  490. package/dist/internal/events/cache.js +0 -67
  491. package/dist/internal/events/cache.js.map +0 -1
  492. package/dist/internal/events/cache.test.js +0 -43
  493. package/dist/internal/events/cache.test.js.map +0 -1
  494. package/src/internal/events/cache.test.ts +0 -47
  495. package/src/internal/events/cache.ts +0 -80
  496. /package/dist/{internal/events/cache.test.d.ts → diagnostic/zipGenerators.test.d.ts} +0 -0
@@ -1,74 +1,85 @@
1
- import { Logger } from "../../interface";
2
- import { LoggerWithPrefix } from "../../telemetry";
3
- import { EventsAPIService } from "./apiService";
4
- import { EventsCache } from "./cache";
5
- import { DriveEvent, DriveListener } from "./interface";
6
- import { EventManager } from "./eventManager";
1
+ import { Logger } from '../../interface';
2
+ import { LoggerWithPrefix } from '../../telemetry';
3
+ import { EventsAPIService } from './apiService';
4
+ import {
5
+ DriveEvent,
6
+ DriveEventsListWithStatus,
7
+ DriveEventType,
8
+ EventManagerInterface,
9
+ UnsubscribeFromEventsSourceError,
10
+ } from './interface';
11
+ import { NotFoundAPIError } from '../apiService';
7
12
 
8
13
  /**
9
14
  * Combines API and event manager to provide a service for listening to
10
15
  * volume events. Volume events are all about nodes updates. Whenever
11
16
  * there is update to the node metadata or content, the event is emitted.
12
17
  */
13
- export class VolumeEventManager {
14
- private manager: EventManager<DriveEvent>;
15
-
16
- constructor(logger: Logger, private apiService: EventsAPIService, private cache: EventsCache, private volumeId: string, isOwnVolume: boolean) {
18
+ export class VolumeEventManager implements EventManagerInterface<DriveEvent> {
19
+ constructor(
20
+ private logger: Logger,
21
+ private apiService: EventsAPIService,
22
+ private volumeId: string,
23
+ ) {
17
24
  this.apiService = apiService;
18
25
  this.volumeId = volumeId;
19
-
20
- this.manager = new EventManager(
21
- new LoggerWithPrefix(logger, `volume ${volumeId}`),
22
- () => this.getLastEventId(),
23
- (eventId) => this.apiService.getVolumeEvents(volumeId, eventId, isOwnVolume),
24
- (lastEventId) => this.cache.setLastEventId(volumeId, {
25
- lastEventId,
26
- pollingIntervalInSeconds: this.manager.pollingIntervalInSeconds,
27
- isOwnVolume
28
- }),
29
- );
30
- this.cache.getPollingIntervalInSeconds(volumeId)
31
- .then((pollingIntervalInSeconds) => {
32
- if (pollingIntervalInSeconds) {
33
- this.manager.pollingIntervalInSeconds = pollingIntervalInSeconds;
34
- }
35
- })
36
- .catch(() => {});
37
- }
38
-
39
- private async getLastEventId(): Promise<string> {
40
- const lastEventId = await this.cache.getLastEventId(this.volumeId);
41
- if (lastEventId) {
42
- return lastEventId;
43
- }
44
- return this.apiService.getVolumeLatestEventId(this.volumeId);
45
- }
46
-
47
- /**
48
- * There is a limit how many volume subscribtions can be active at
49
- * the same time. The manager of all volume managers should set the
50
- * intervals for each volume accordingly depending on the volume
51
- * type or the total number of subscriptions.
52
- */
53
- setPollingInterval(pollingIntervalInSeconds: number): void {
54
- this.manager.pollingIntervalInSeconds = pollingIntervalInSeconds;
26
+ this.logger = new LoggerWithPrefix(logger, `volume ${volumeId}`);
55
27
  }
56
28
 
57
- async startSubscription(): Promise<void> {
58
- await this.manager.start();
29
+ getLogger(): Logger {
30
+ return this.logger;
59
31
  }
60
32
 
61
- async stopSubscription(): Promise<void> {
62
- await this.manager.stop();
33
+ async *getEvents(eventId: string): AsyncIterable<DriveEvent> {
34
+ try {
35
+ let events: DriveEventsListWithStatus;
36
+ let more = true;
37
+ while (more) {
38
+ events = await this.apiService.getVolumeEvents(this.volumeId, eventId);
39
+ more = events.more;
40
+ if (events.refresh) {
41
+ yield {
42
+ type: DriveEventType.TreeRefresh,
43
+ treeEventScopeId: this.volumeId,
44
+ eventId: events.latestEventId,
45
+ };
46
+ break;
47
+ }
48
+ // Update to the latest eventId to avoid inactive volumes from getting out of sync
49
+ if (events.events.length === 0 && events.latestEventId !== eventId) {
50
+ yield {
51
+ type: DriveEventType.FastForward,
52
+ treeEventScopeId: this.volumeId,
53
+ eventId: events.latestEventId,
54
+ };
55
+ break;
56
+ }
57
+ yield* events.events;
58
+ eventId = events.latestEventId;
59
+ }
60
+ } catch (error: unknown) {
61
+ if (error instanceof NotFoundAPIError) {
62
+ this.logger.info(`Volume events no longer accessible`);
63
+ yield {
64
+ type: DriveEventType.TreeRemove,
65
+ treeEventScopeId: this.volumeId,
66
+ // After a TreeRemoval event, polling should stop.
67
+ eventId: 'none',
68
+ };
69
+ }
70
+ throw error;
71
+ }
63
72
  }
64
73
 
65
- addListener(callback: DriveListener): void {
66
- this.manager.addListener(async (events, fullRefresh) => {
67
- if (fullRefresh) {
68
- await callback([], this.volumeId);
69
- } else {
70
- await callback(events);
74
+ async getLatestEventId(): Promise<string> {
75
+ try {
76
+ return await this.apiService.getVolumeLatestEventId(this.volumeId);
77
+ } catch (error: unknown) {
78
+ if (error instanceof NotFoundAPIError) {
79
+ this.logger.info(`Volume events no longer accessible`);
80
+ throw new UnsubscribeFromEventsSourceError(error.message);
71
81
  }
72
- });
82
+ throw error;
83
+ }
73
84
  }
74
85
  }
@@ -1,6 +1,6 @@
1
- import { MemberRole, NodeType } from "../../interface";
2
- import { getMockLogger } from "../../tests/logger";
3
- import { DriveAPIService, ErrorCode } from "../apiService";
1
+ import { MemberRole, NodeType } from '../../interface';
2
+ import { getMockLogger } from '../../tests/logger';
3
+ import { DriveAPIService, ErrorCode } from '../apiService';
4
4
  import { NodeAPIService } from './apiService';
5
5
 
6
6
  function generateAPIFileNode(linkOverrides = {}, overrides = {}) {
@@ -81,26 +81,26 @@ function generateFileNode(overrides = {}) {
81
81
  return {
82
82
  ...node,
83
83
  type: NodeType.File,
84
- mediaType: "text",
84
+ mediaType: 'text',
85
85
  totalStorageSize: 42,
86
86
  encryptedCrypto: {
87
87
  ...node.encryptedCrypto,
88
88
  file: {
89
- base64ContentKeyPacket: "contentKeyPacket",
90
- armoredContentKeyPacketSignature: "contentKeyPacketSig",
89
+ base64ContentKeyPacket: 'contentKeyPacket',
90
+ armoredContentKeyPacketSignature: 'contentKeyPacketSig',
91
91
  },
92
92
  activeRevision: {
93
- uid: "volumeId~linkId~revisionId",
94
- state: "active",
93
+ uid: 'volumeId~linkId~revisionId',
94
+ state: 'active',
95
95
  creationTime: new Date(1234567890000),
96
96
  storageSize: 12,
97
- signatureEmail: "revSigEmail",
98
- armoredExtendedAttributes: "{file}",
97
+ signatureEmail: 'revSigEmail',
98
+ armoredExtendedAttributes: '{file}',
99
99
  thumbnails: [],
100
100
  },
101
101
  },
102
- ...overrides
103
- }
102
+ ...overrides,
103
+ };
104
104
  }
105
105
 
106
106
  function generateFolderNode(overrides = {}) {
@@ -111,12 +111,12 @@ function generateFolderNode(overrides = {}) {
111
111
  encryptedCrypto: {
112
112
  ...node.encryptedCrypto,
113
113
  folder: {
114
- armoredHashKey: "nodeHashKey",
115
- armoredExtendedAttributes: "{folder}",
114
+ armoredHashKey: 'nodeHashKey',
115
+ armoredExtendedAttributes: '{folder}',
116
116
  },
117
117
  },
118
- ...overrides
119
- }
118
+ ...overrides,
119
+ };
120
120
  }
121
121
 
122
122
  function generateAlbumNode(overrides = {}) {
@@ -124,17 +124,17 @@ function generateAlbumNode(overrides = {}) {
124
124
  return {
125
125
  ...node,
126
126
  type: NodeType.Album,
127
- ...overrides
128
- }
127
+ ...overrides,
128
+ };
129
129
  }
130
130
 
131
131
  function generateNode() {
132
132
  return {
133
- hash: "nameHash",
134
- encryptedName: "encName",
133
+ hash: 'nameHash',
134
+ encryptedName: 'encName',
135
135
 
136
- uid: "volumeId~linkId",
137
- parentUid: "volumeId~parentLinkId",
136
+ uid: 'volumeId~linkId',
137
+ parentUid: 'volumeId~parentLinkId',
138
138
  creationTime: new Date(123456789000),
139
139
  trashTime: undefined,
140
140
 
@@ -143,16 +143,16 @@ function generateNode() {
143
143
  directMemberRole: MemberRole.Admin,
144
144
 
145
145
  encryptedCrypto: {
146
- armoredKey: "nodeKey",
147
- armoredNodePassphrase: "nodePass",
148
- armoredNodePassphraseSignature: "nodePassSig",
149
- nameSignatureEmail: "nameSigEmail",
150
- signatureEmail: "sigEmail",
146
+ armoredKey: 'nodeKey',
147
+ armoredNodePassphrase: 'nodePass',
148
+ armoredNodePassphraseSignature: 'nodePassSig',
149
+ nameSignatureEmail: 'nameSigEmail',
150
+ signatureEmail: 'sigEmail',
151
151
  },
152
- }
152
+ };
153
153
  }
154
154
 
155
- describe("nodeAPIService", () => {
155
+ describe('nodeAPIService', () => {
156
156
  let apiMock: DriveAPIService;
157
157
  let api: NodeAPIService;
158
158
 
@@ -172,19 +172,18 @@ describe("nodeAPIService", () => {
172
172
  describe('iterateNodes', () => {
173
173
  async function testIterateNodes(mockedLink: any, expectedNode: any, ownVolumeId = 'volumeId') {
174
174
  // @ts-expect-error Mocking for testing purposes
175
- apiMock.post = jest.fn(async () => Promise.resolve({
176
- Links: [mockedLink],
177
- }));
175
+ apiMock.post = jest.fn(async () =>
176
+ Promise.resolve({
177
+ Links: [mockedLink],
178
+ }),
179
+ );
178
180
 
179
181
  const nodes = await Array.fromAsync(api.iterateNodes(['volumeId~nodeId'], ownVolumeId));
180
182
  expect(nodes).toStrictEqual([expectedNode]);
181
183
  }
182
-
184
+
183
185
  it('should get folder node', async () => {
184
- await testIterateNodes(
185
- generateAPIFolderNode(),
186
- generateFolderNode(),
187
- );
186
+ await testIterateNodes(generateAPIFolderNode(), generateFolderNode());
188
187
  });
189
188
 
190
189
  it('should get root folder node', async () => {
@@ -193,31 +192,28 @@ describe("nodeAPIService", () => {
193
192
  generateFolderNode({ parentUid: undefined }),
194
193
  );
195
194
  });
196
-
195
+
197
196
  it('should get file node', async () => {
198
- await testIterateNodes(
199
- generateAPIFileNode(),
200
- generateFileNode(),
201
- );
197
+ await testIterateNodes(generateAPIFileNode(), generateFileNode());
202
198
  });
203
199
 
204
200
  it('should get album node', async () => {
205
- await testIterateNodes(
206
- generateAPIAlbumNode(),
207
- generateAlbumNode(),
208
- );
201
+ await testIterateNodes(generateAPIAlbumNode(), generateAlbumNode());
209
202
  });
210
203
 
211
204
  it('should get shared node', async () => {
212
205
  await testIterateNodes(
213
- generateAPIFolderNode({}, {
214
- Sharing: {
215
- ShareID: 'shareId',
216
- },
217
- Membership: {
218
- Permissions: 22,
206
+ generateAPIFolderNode(
207
+ {},
208
+ {
209
+ Sharing: {
210
+ ShareID: 'shareId',
211
+ },
212
+ Membership: {
213
+ Permissions: 22,
214
+ },
219
215
  },
220
- }),
216
+ ),
221
217
  generateFolderNode({
222
218
  isShared: true,
223
219
  shareId: 'shareId',
@@ -228,14 +224,17 @@ describe("nodeAPIService", () => {
228
224
 
229
225
  it('should get shared node with unknown permissions', async () => {
230
226
  await testIterateNodes(
231
- generateAPIFolderNode({}, {
232
- Sharing: {
233
- ShareID: 'shareId',
234
- },
235
- Membership: {
236
- Permissions: 42,
227
+ generateAPIFolderNode(
228
+ {},
229
+ {
230
+ Sharing: {
231
+ ShareID: 'shareId',
232
+ },
233
+ Membership: {
234
+ Permissions: 42,
235
+ },
237
236
  },
238
- }),
237
+ ),
239
238
  generateFolderNode({
240
239
  isShared: true,
241
240
  shareId: 'shareId',
@@ -251,23 +250,25 @@ describe("nodeAPIService", () => {
251
250
  TrashTime: 123456,
252
251
  }),
253
252
  generateFileNode({
254
- trashTime: new Date(123456000)
253
+ trashTime: new Date(123456000),
255
254
  }),
256
255
  );
257
256
  });
258
257
 
259
258
  it('should get all recognised nodes before throwing error', async () => {
260
259
  // @ts-expect-error Mocking for testing purposes
261
- apiMock.post = jest.fn(async () => Promise.resolve({
262
- Links: [
263
- generateAPIFolderNode(),
264
- // Type 42 is not recognised - should throw error.
265
- generateAPIFolderNode({ Type: 42 }),
266
- // Type 43 is not recognised - should throw error.
267
- generateAPIFileNode({ Type: 43 }),
268
- generateAPIFileNode(),
269
- ],
270
- }));
260
+ apiMock.post = jest.fn(async () =>
261
+ Promise.resolve({
262
+ Links: [
263
+ generateAPIFolderNode(),
264
+ // Type 42 is not recognised - should throw error.
265
+ generateAPIFolderNode({ Type: 42 }),
266
+ // Type 43 is not recognised - should throw error.
267
+ generateAPIFileNode({ Type: 43 }),
268
+ generateAPIFileNode(),
269
+ ],
270
+ }),
271
+ );
271
272
 
272
273
  const generator = api.iterateNodes(['volumeId~nodeId'], 'volumeId');
273
274
 
@@ -283,52 +284,95 @@ describe("nodeAPIService", () => {
283
284
  try {
284
285
  await node3;
285
286
  } catch (error: any) {
286
- expect(error.cause).toEqual([
287
- new Error('Unknown node type: 42'),
288
- new Error('Unknown node type: 43'),
289
- ]);
287
+ expect(error.cause).toEqual([new Error('Unknown node type: 42'), new Error('Unknown node type: 43')]);
290
288
  }
291
289
  });
292
290
 
293
291
  it('should get nodes across various volumes', async () => {
294
292
  // @ts-expect-error Mocking for testing purposes
295
- apiMock.post = jest.fn(async (url) => Promise.resolve({
296
- Links: [
297
- generateAPIFolderNode({
298
- LinkID: url.includes('volumeId1') ? 'nodeId1' : 'nodeId2',
299
- ParentLinkID: url.includes('volumeId1') ? 'parentNodeId1' : 'parentNodeId2',
300
- }),
301
- ],
302
- }));
303
-
304
- const nodes = await Array.fromAsync(api.iterateNodes(['volumeId1~nodeId1', 'volumeId2~nodeId2'], 'volumeId1'));
293
+ apiMock.post = jest.fn(async (url) =>
294
+ Promise.resolve({
295
+ Links: [
296
+ generateAPIFolderNode({
297
+ LinkID: url.includes('volumeId1') ? 'nodeId1' : 'nodeId2',
298
+ ParentLinkID: url.includes('volumeId1') ? 'parentNodeId1' : 'parentNodeId2',
299
+ }),
300
+ ],
301
+ }),
302
+ );
303
+
304
+ const nodes = await Array.fromAsync(
305
+ api.iterateNodes(['volumeId1~nodeId1', 'volumeId2~nodeId2'], 'volumeId1'),
306
+ );
305
307
  expect(nodes).toStrictEqual([
306
- generateFolderNode({ uid: 'volumeId1~nodeId1', parentUid: 'volumeId1~parentNodeId1', directMemberRole: MemberRole.Admin }),
307
- generateFolderNode({ uid: 'volumeId2~nodeId2', parentUid: 'volumeId2~parentNodeId2', directMemberRole: MemberRole.Inherited }),
308
+ generateFolderNode({
309
+ uid: 'volumeId1~nodeId1',
310
+ parentUid: 'volumeId1~parentNodeId1',
311
+ directMemberRole: MemberRole.Admin,
312
+ }),
313
+ generateFolderNode({
314
+ uid: 'volumeId2~nodeId2',
315
+ parentUid: 'volumeId2~parentNodeId2',
316
+ directMemberRole: MemberRole.Inherited,
317
+ }),
308
318
  ]);
309
319
  });
320
+
321
+ it('should get nodes in batches', async () => {
322
+ // @ts-expect-error Mocking for testing purposes
323
+ apiMock.post = jest.fn(async (_, { LinkIDs }) =>
324
+ Promise.resolve({
325
+ Links: LinkIDs.map((linkId: string) => generateAPIFolderNode({ LinkID: linkId })),
326
+ }),
327
+ );
328
+
329
+ const nodeUids = Array.from({ length: 250 }, (_, i) => `volumeId1~nodeId${i}`);
330
+ const nodeIds = nodeUids.map((uid) => uid.split('~')[1]);
331
+
332
+ const nodes = await Array.fromAsync(api.iterateNodes(nodeUids, 'volumeId1'));
333
+ expect(nodes).toHaveLength(nodeUids.length);
334
+
335
+ expect(apiMock.post).toHaveBeenCalledTimes(3);
336
+ expect(apiMock.post).toHaveBeenCalledWith(
337
+ 'drive/v2/volumes/volumeId1/links',
338
+ { LinkIDs: nodeIds.slice(0, 100) },
339
+ undefined,
340
+ );
341
+ expect(apiMock.post).toHaveBeenCalledWith(
342
+ 'drive/v2/volumes/volumeId1/links',
343
+ { LinkIDs: nodeIds.slice(100, 200) },
344
+ undefined,
345
+ );
346
+ expect(apiMock.post).toHaveBeenCalledWith(
347
+ 'drive/v2/volumes/volumeId1/links',
348
+ { LinkIDs: nodeIds.slice(200, 250) },
349
+ undefined,
350
+ );
351
+ });
310
352
  });
311
353
 
312
354
  describe('trashNodes', () => {
313
355
  it('should trash nodes', async () => {
314
356
  // @ts-expect-error Mocking for testing purposes
315
- apiMock.post = jest.fn(async () => Promise.resolve({
316
- Responses: [
317
- {
318
- LinkID: 'nodeId1',
319
- Response: {
320
- Code: ErrorCode.OK,
321
- }
322
- },
323
- {
324
- LinkID: 'nodeId2',
325
- Response: {
326
- Code: 2027,
327
- Error: 'INSUFFICIENT_SCOPE'
328
- }
329
- }
330
- ],
331
- }));
357
+ apiMock.post = jest.fn(async () =>
358
+ Promise.resolve({
359
+ Responses: [
360
+ {
361
+ LinkID: 'nodeId1',
362
+ Response: {
363
+ Code: ErrorCode.OK,
364
+ },
365
+ },
366
+ {
367
+ LinkID: 'nodeId2',
368
+ Response: {
369
+ Code: 2027,
370
+ Error: 'INSUFFICIENT_SCOPE',
371
+ },
372
+ },
373
+ ],
374
+ }),
375
+ );
332
376
 
333
377
  const result = await Array.fromAsync(api.trashNodes(['volumeId~nodeId1', 'volumeId~nodeId2']));
334
378
  expect(result).toEqual([
@@ -341,31 +385,35 @@ describe("nodeAPIService", () => {
341
385
  describe('restoreNodes', () => {
342
386
  it('should restore nodes', async () => {
343
387
  // @ts-expect-error Mocking for testing purposes
344
- apiMock.put = jest.fn(async () => Promise.resolve({
345
- Responses: [
346
- {
347
- LinkID: 'nodeId1',
348
- Response: {
349
- Code: ErrorCode.OK,
350
- }
351
- },
352
- {
353
- LinkID: 'nodeId2',
354
- Response: {
355
- Code: 2027,
356
- Error: 'INSUFFICIENT_SCOPE'
357
- }
358
- },
359
- {
360
- LinkID: 'nodeId3',
361
- Response: {
362
- Code: 2000,
363
- }
364
- },
365
- ],
366
- }));
388
+ apiMock.put = jest.fn(async () =>
389
+ Promise.resolve({
390
+ Responses: [
391
+ {
392
+ LinkID: 'nodeId1',
393
+ Response: {
394
+ Code: ErrorCode.OK,
395
+ },
396
+ },
397
+ {
398
+ LinkID: 'nodeId2',
399
+ Response: {
400
+ Code: 2027,
401
+ Error: 'INSUFFICIENT_SCOPE',
402
+ },
403
+ },
404
+ {
405
+ LinkID: 'nodeId3',
406
+ Response: {
407
+ Code: 2000,
408
+ },
409
+ },
410
+ ],
411
+ }),
412
+ );
367
413
 
368
- const result = await Array.fromAsync(api.restoreNodes(['volumeId~nodeId1', 'volumeId~nodeId2', 'volumeId~nodeId3']));
414
+ const result = await Array.fromAsync(
415
+ api.restoreNodes(['volumeId~nodeId1', 'volumeId~nodeId2', 'volumeId~nodeId3']),
416
+ );
369
417
  expect(result).toEqual([
370
418
  { uid: 'volumeId~nodeId1', ok: true },
371
419
  { uid: 'volumeId~nodeId2', ok: false, error: 'INSUFFICIENT_SCOPE' },
@@ -373,7 +421,7 @@ describe("nodeAPIService", () => {
373
421
  ]);
374
422
  });
375
423
 
376
- it('should fail restoring from multiple volumes', async () => {
424
+ it('should fail restoring from multiple volumes', async () => {
377
425
  try {
378
426
  await Array.fromAsync(api.restoreNodes(['volumeId1~nodeId1', 'volumeId2~nodeId2']));
379
427
  throw new Error('Should have thrown');
@@ -386,23 +434,25 @@ describe("nodeAPIService", () => {
386
434
  describe('deleteNOdes', () => {
387
435
  it('should delete nodes', async () => {
388
436
  // @ts-expect-error Mocking for testing purposes
389
- apiMock.post = jest.fn(async () => Promise.resolve({
390
- Responses: [
391
- {
392
- LinkID: 'nodeId1',
393
- Response: {
394
- Code: ErrorCode.OK,
395
- }
396
- },
397
- {
398
- LinkID: 'nodeId2',
399
- Response: {
400
- Code: 2027,
401
- Error: 'INSUFFICIENT_SCOPE'
402
- }
403
- }
404
- ],
405
- }));
437
+ apiMock.post = jest.fn(async () =>
438
+ Promise.resolve({
439
+ Responses: [
440
+ {
441
+ LinkID: 'nodeId1',
442
+ Response: {
443
+ Code: ErrorCode.OK,
444
+ },
445
+ },
446
+ {
447
+ LinkID: 'nodeId2',
448
+ Response: {
449
+ Code: 2027,
450
+ Error: 'INSUFFICIENT_SCOPE',
451
+ },
452
+ },
453
+ ],
454
+ }),
455
+ );
406
456
 
407
457
  const result = await Array.fromAsync(api.deleteNodes(['volumeId~nodeId1', 'volumeId~nodeId2']));
408
458
  expect(result).toEqual([
@@ -411,7 +461,7 @@ describe("nodeAPIService", () => {
411
461
  ]);
412
462
  });
413
463
 
414
- it('should fail deleting nodes from multiple volumes', async () => {
464
+ it('should fail deleting nodes from multiple volumes', async () => {
415
465
  try {
416
466
  await Array.fromAsync(api.deleteNodes(['volumeId1~nodeId1', 'volumeId2~nodeId2']));
417
467
  throw new Error('Should have thrown');