@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,11 +1,11 @@
1
1
  import { c } from 'ttag';
2
2
 
3
- import { NodeType, ThumbnailType, ProtonDriveTelemetry, Logger, ThumbnailResult } from "../../interface";
3
+ import { NodeType, ThumbnailType, ProtonDriveTelemetry, Logger, ThumbnailResult } from '../../interface';
4
4
  import { ValidationError } from '../../errors';
5
5
  import { LoggerWithPrefix } from '../../telemetry';
6
- import { DownloadAPIService } from "./apiService";
7
- import { DownloadCryptoService } from "./cryptoService";
8
- import { NodesService } from "./interface";
6
+ import { DownloadAPIService } from './apiService';
7
+ import { DownloadCryptoService } from './cryptoService';
8
+ import { NodesService } from './interface';
9
9
  import { getErrorMessage } from '../errors';
10
10
 
11
11
  /**
@@ -24,8 +24,8 @@ export class ThumbnailDownloader {
24
24
  private batchThumbnailToNodeUids = new Map<string, string>();
25
25
  private ongoingDownloads = new Map<string, Promise<void>>();
26
26
  private bufferedThumbnails: (
27
- { nodeUid: string, ok: true, thumbnail: Uint8Array } |
28
- { nodeUid: string, ok: false, error: string }
27
+ | { nodeUid: string; ok: true; thumbnail: Uint8Array }
28
+ | { nodeUid: string; ok: false; error: string }
29
29
  )[] = [];
30
30
 
31
31
  constructor(
@@ -34,7 +34,7 @@ export class ThumbnailDownloader {
34
34
  private apiService: DownloadAPIService,
35
35
  private cryptoService: DownloadCryptoService,
36
36
  ) {
37
- this.logger = telemetry.getLogger("download");
37
+ this.logger = telemetry.getLogger('download');
38
38
  this.nodesService = nodesService;
39
39
  this.apiService = apiService;
40
40
  this.cryptoService = cryptoService;
@@ -79,40 +79,41 @@ export class ThumbnailDownloader {
79
79
  this.bufferedThumbnails = [];
80
80
  }
81
81
 
82
- private async *iterateThumbnailUids(nodeUids: string[], thumbnailType: ThumbnailType, signal?: AbortSignal): AsyncGenerator<
83
- { nodeUid: string, ok: true, thumbnailUid: string } |
84
- { nodeUid: string, ok: false, error: string }
82
+ private async *iterateThumbnailUids(
83
+ nodeUids: string[],
84
+ thumbnailType: ThumbnailType,
85
+ signal?: AbortSignal,
86
+ ): AsyncGenerator<
87
+ { nodeUid: string; ok: true; thumbnailUid: string } | { nodeUid: string; ok: false; error: string }
85
88
  > {
86
89
  for await (const node of this.nodesService.iterateNodes(nodeUids, signal)) {
87
90
  if ('missingUid' in node) {
88
91
  yield {
89
92
  nodeUid: node.missingUid,
90
93
  ok: false,
91
- error: c("Error").t`Node not found`,
92
- }
94
+ error: c('Error').t`Node not found`,
95
+ };
93
96
  continue;
94
97
  }
95
98
  if (node.type !== NodeType.File) {
96
99
  yield {
97
100
  nodeUid: node.uid,
98
101
  ok: false,
99
- error: c("Error").t`Node is not a file`,
100
- }
102
+ error: c('Error').t`Node is not a file`,
103
+ };
101
104
  continue;
102
105
  }
103
106
 
104
107
  let thumbnail;
105
108
  if (node.activeRevision?.ok) {
106
- thumbnail = node.activeRevision.value.thumbnails?.find(
107
- (t) => t.type === thumbnailType,
108
- );
109
+ thumbnail = node.activeRevision.value.thumbnails?.find((t) => t.type === thumbnailType);
109
110
  }
110
111
  if (!thumbnail) {
111
112
  yield {
112
113
  nodeUid: node.uid,
113
114
  ok: false,
114
- error: c("Error").t`Node has no thumbnail`,
115
- }
115
+ error: c('Error').t`Node has no thumbnail`,
116
+ };
116
117
  continue;
117
118
  }
118
119
 
@@ -120,7 +121,7 @@ export class ThumbnailDownloader {
120
121
  nodeUid: node.uid,
121
122
  ok: true,
122
123
  thumbnailUid: thumbnail.uid,
123
- }
124
+ };
124
125
  }
125
126
  }
126
127
 
@@ -163,13 +164,15 @@ export class ThumbnailDownloader {
163
164
  }),
164
165
  );
165
166
  }
166
-
167
+
167
168
  this.batchThumbnailToNodeUids.clear();
168
169
  }
169
170
 
170
- private async *iterateThumbnailDownloads(signal?: AbortSignal): AsyncGenerator<
171
- { nodeUid: string, ok: true, downloadPromise: Promise<Uint8Array> } |
172
- { nodeUid: string, ok: false, error: string }
171
+ private async *iterateThumbnailDownloads(
172
+ signal?: AbortSignal,
173
+ ): AsyncGenerator<
174
+ | { nodeUid: string; ok: true; downloadPromise: Promise<Uint8Array> }
175
+ | { nodeUid: string; ok: false; error: string }
173
176
  > {
174
177
  const missingThumbnailUids = new Set(this.batchThumbnailToNodeUids.keys());
175
178
 
@@ -190,7 +193,7 @@ export class ThumbnailDownloader {
190
193
  nodeUid,
191
194
  ok: false,
192
195
  error: result.error,
193
- }
196
+ };
194
197
  continue;
195
198
  }
196
199
 
@@ -198,7 +201,7 @@ export class ThumbnailDownloader {
198
201
  nodeUid,
199
202
  ok: true,
200
203
  downloadPromise: this.downloadThumbnail(nodeUid, result.bareUrl, result.token, signal),
201
- }
204
+ };
202
205
  }
203
206
 
204
207
  for (const uid of missingThumbnailUids) {
@@ -207,14 +210,19 @@ export class ThumbnailDownloader {
207
210
  yield {
208
211
  nodeUid,
209
212
  ok: false,
210
- error: c("Error").t`Thumbnail not found`,
211
- }
213
+ error: c('Error').t`Thumbnail not found`,
214
+ };
212
215
  }
213
216
  }
214
217
 
215
- private async downloadThumbnail(nodeUid: string, bareUrl: string, token: string, signal?: AbortSignal): Promise<Uint8Array> {
218
+ private async downloadThumbnail(
219
+ nodeUid: string,
220
+ bareUrl: string,
221
+ token: string,
222
+ signal?: AbortSignal,
223
+ ): Promise<Uint8Array> {
216
224
  const logger = new LoggerWithPrefix(this.logger, `thumbnail ${token}`);
217
-
225
+
218
226
  let decryptedBlock: Uint8Array | null = null;
219
227
  let attempt = 0;
220
228
 
@@ -229,11 +237,14 @@ export class ThumbnailDownloader {
229
237
  ]);
230
238
 
231
239
  if (!nodeKeys.contentKeyPacketSessionKey) {
232
- throw new ValidationError(c("Error").t`File has no content key`);
240
+ throw new ValidationError(c('Error').t`File has no content key`);
233
241
  }
234
242
 
235
243
  logger.debug(`Decrypting`);
236
- decryptedBlock = await this.cryptoService.decryptThumbnail(encryptedBlock, nodeKeys.contentKeyPacketSessionKey);
244
+ decryptedBlock = await this.cryptoService.decryptThumbnail(
245
+ encryptedBlock,
246
+ nodeKeys.contentKeyPacketSessionKey,
247
+ );
237
248
  } catch (error: unknown) {
238
249
  if (attempt <= MAX_THUMBNAIL_DOWNLOAD_ATTEMPTS) {
239
250
  logger.warn(`Thumbnail download failed #${attempt}, retrying: ${getErrorMessage(error)}`);
@@ -1,6 +1,6 @@
1
1
  import { c } from 'ttag';
2
2
 
3
- import { VERIFICATION_STATUS } from "../crypto";
3
+ import { VERIFICATION_STATUS } from '../crypto';
4
4
 
5
5
  export function getErrorMessage(error: unknown): string {
6
6
  return error instanceof Error ? error.message : c('Error').t`Unknown error`;
@@ -9,11 +9,13 @@ export function getErrorMessage(error: unknown): string {
9
9
  /**
10
10
  * @param signatureType - Must be translated before calling this function.
11
11
  */
12
- export function getVerificationMessage(verified: VERIFICATION_STATUS, signatureType?: string, notAvailableVerificationKeys = false): string {
12
+ export function getVerificationMessage(
13
+ verified: VERIFICATION_STATUS,
14
+ signatureType?: string,
15
+ notAvailableVerificationKeys = false,
16
+ ): string {
13
17
  if (verified === VERIFICATION_STATUS.NOT_SIGNED) {
14
- return signatureType
15
- ? c('Error').t`Missing signature for ${signatureType}`
16
- : c('Error').t`Missing signature`;
18
+ return signatureType ? c('Error').t`Missing signature for ${signatureType}` : c('Error').t`Missing signature`;
17
19
  }
18
20
 
19
21
  if (notAvailableVerificationKeys) {
@@ -1,31 +1,36 @@
1
- import { Logger } from "../../interface";
2
- import { DriveAPIService, drivePaths, corePaths } from "../apiService";
3
- import { makeNodeUid } from "../uids";
4
- import { DriveEvents, DriveEvent, DriveEventType } from "./interface";
1
+ import { DriveAPIService, drivePaths, corePaths } from '../apiService';
2
+ import { makeNodeUid } from '../uids';
3
+ import { DriveEventsListWithStatus, DriveEvent, DriveEventType, NodeEvent, NodeEventType } from './interface';
5
4
 
6
- type GetCoreLatestEventResponse = corePaths['/core/{_version}/events/latest']['get']['responses']['200']['content']['application/json'];
7
- type GetCoreEventResponse = corePaths['/core/{_version}/events/{id}']['get']['responses']['200']['content']['application/json'];
5
+ type GetCoreLatestEventResponse =
6
+ corePaths['/core/{_version}/events/latest']['get']['responses']['200']['content']['application/json'];
7
+ type GetCoreEventResponse =
8
+ corePaths['/core/{_version}/events/{id}']['get']['responses']['200']['content']['application/json'];
8
9
 
9
- type GetVolumeLatestEventResponse = drivePaths['/drive/volumes/{volumeID}/events/latest']['get']['responses']['200']['content']['application/json'];
10
- type GetVokumeEventResponse = drivePaths['/drive/v2/volumes/{volumeID}/events/{eventID}']['get']['responses']['200']['content']['application/json'];
10
+ type GetVolumeLatestEventResponse =
11
+ drivePaths['/drive/volumes/{volumeID}/events/latest']['get']['responses']['200']['content']['application/json'];
12
+ type GetVolumeEventResponse =
13
+ drivePaths['/drive/v2/volumes/{volumeID}/events/{eventID}']['get']['responses']['200']['content']['application/json'];
11
14
 
12
- const VOLUME_EVENT_TYPE_MAP = {
15
+ interface VolumeEventTypeMap {
16
+ [key: number]: NodeEventType;
17
+ }
18
+ const VOLUME_EVENT_TYPE_MAP: VolumeEventTypeMap = {
13
19
  0: DriveEventType.NodeDeleted,
14
20
  1: DriveEventType.NodeCreated,
15
21
  2: DriveEventType.NodeUpdated,
16
- 3: DriveEventType.NodeUpdatedMetadata,
17
- }
22
+ 3: DriveEventType.NodeUpdated,
23
+ };
18
24
 
19
25
  /**
20
26
  * Provides API communication for fetching events.
21
- *
27
+ *
22
28
  * The service is responsible for transforming local objects to API payloads
23
29
  * and vice versa. It should not contain any business logic.
24
30
  */
25
31
  export class EventsAPIService {
26
- constructor(private apiService: DriveAPIService, private logger?: Logger) {
32
+ constructor(private apiService: DriveAPIService) {
27
33
  this.apiService = apiService;
28
- this.logger = logger;
29
34
  }
30
35
 
31
36
  async getCoreLatestEventId(): Promise<string> {
@@ -33,17 +38,24 @@ export class EventsAPIService {
33
38
  return result.EventID as string;
34
39
  }
35
40
 
36
- async getCoreEvents(eventId: string): Promise<DriveEvents> {
37
- // TODO: Switch to v6 endpoint: DriveShareRefresh doesnt seem to be part of it.
41
+ async getCoreEvents(eventId: string): Promise<DriveEventsListWithStatus> {
42
+ // TODO: Switch to v6 endpoint?
38
43
  const result = await this.apiService.get<GetCoreEventResponse>(`core/v5/events/${eventId}`);
39
- const events: DriveEvent[] = result.DriveShareRefresh?.Action === 2 ? [
40
- {
41
- type: DriveEventType.ShareWithMeUpdated,
42
- }
43
- ] : [];
44
+ // in core/v5/events, refresh is always all apps, value 255
45
+ const refresh = result.Refresh > 0;
46
+ const events: DriveEvent[] =
47
+ refresh || result.DriveShareRefresh?.Action === 2
48
+ ? [
49
+ {
50
+ type: DriveEventType.SharedWithMeUpdated,
51
+ eventId: result.EventID,
52
+ treeEventScopeId: 'core',
53
+ },
54
+ ]
55
+ : [];
44
56
 
45
57
  return {
46
- lastEventId: result.EventID,
58
+ latestEventId: result.EventID,
47
59
  more: result.More === 1,
48
60
  refresh: result.Refresh === 1,
49
61
  events,
@@ -51,35 +63,33 @@ export class EventsAPIService {
51
63
  }
52
64
 
53
65
  async getVolumeLatestEventId(volumeId: string): Promise<string> {
54
- const result = await this.apiService.get<GetVolumeLatestEventResponse>(`drive/volumes/${volumeId}/events/latest`);
66
+ const result = await this.apiService.get<GetVolumeLatestEventResponse>(
67
+ `drive/volumes/${volumeId}/events/latest`,
68
+ );
55
69
  return result.EventID;
56
70
  }
57
71
 
58
- async getVolumeEvents(volumeId: string, eventId: string, isOwnVolume = false): Promise<DriveEvents> {
59
- const result = await this.apiService.get<GetVokumeEventResponse>(`drive/v2/volumes/${volumeId}/events/${eventId}`);
72
+ async getVolumeEvents(volumeId: string, eventId: string): Promise<DriveEventsListWithStatus> {
73
+ const result = await this.apiService.get<GetVolumeEventResponse>(
74
+ `drive/v2/volumes/${volumeId}/events/${eventId}`,
75
+ );
60
76
  return {
61
- lastEventId: result.EventID,
77
+ latestEventId: result.EventID,
62
78
  more: result.More,
63
79
  refresh: result.Refresh,
64
- events: result.Events.map((event): DriveEvent => {
80
+ events: result.Events.map((event): NodeEvent => {
65
81
  const type = VOLUME_EVENT_TYPE_MAP[event.EventType];
66
82
  const uids = {
67
83
  nodeUid: makeNodeUid(volumeId, event.Link.LinkID),
68
84
  parentNodeUid: makeNodeUid(volumeId, event.Link.ParentLinkID as string),
69
- }
70
- // VOLUME_EVENT_TYPE_MAP will never return this event type.
71
- // It is here to satisfy the type checker. It is safe to do.
72
- if (type === DriveEventType.ShareWithMeUpdated) {
73
- return {
74
- type,
75
- };
76
- }
85
+ };
77
86
  return {
78
87
  type,
79
88
  ...uids,
80
89
  isTrashed: event.Link.IsTrashed,
81
90
  isShared: event.Link.IsShared,
82
- isOwnVolume,
91
+ eventId: event.EventID,
92
+ treeEventScopeId: volumeId,
83
93
  };
84
94
  }),
85
95
  };
@@ -0,0 +1,101 @@
1
+ import { getMockLogger } from '../../tests/logger';
2
+ import { EventsAPIService } from './apiService';
3
+ import { DriveEvent, DriveEventsListWithStatus, DriveEventType } from './interface';
4
+ import { CoreEventManager } from './coreEventManager';
5
+
6
+ describe('CoreEventManager', () => {
7
+ let mockApiService: jest.Mocked<EventsAPIService>;
8
+ let coreEventManager: CoreEventManager;
9
+ const mockLogger = getMockLogger();
10
+
11
+ beforeEach(() => {
12
+ // Reset mocks
13
+ jest.clearAllMocks();
14
+
15
+ mockApiService = {
16
+ getCoreLatestEventId: jest.fn(),
17
+ getCoreEvents: jest.fn(),
18
+ getVolumeLatestEventId: jest.fn(),
19
+ getVolumeEvents: jest.fn(),
20
+ } as unknown as jest.Mocked<EventsAPIService>;
21
+
22
+ coreEventManager = new CoreEventManager(mockLogger, mockApiService);
23
+ });
24
+
25
+ describe('getLatestEventId', () => {
26
+ it('should return the latest event ID from API service', async () => {
27
+ const expectedEventId = 'event-123';
28
+ mockApiService.getCoreLatestEventId.mockResolvedValue(expectedEventId);
29
+
30
+ const result = await coreEventManager.getLatestEventId();
31
+
32
+ expect(result).toBe(expectedEventId);
33
+ expect(mockApiService.getCoreLatestEventId).toHaveBeenCalledTimes(1);
34
+ });
35
+
36
+ it('should handle API service errors', async () => {
37
+ const error = new Error('API error');
38
+ mockApiService.getCoreLatestEventId.mockRejectedValue(error);
39
+
40
+ await expect(coreEventManager.getLatestEventId()).rejects.toThrow('API error');
41
+ expect(mockApiService.getCoreLatestEventId).toHaveBeenCalledTimes(1);
42
+ });
43
+ });
44
+
45
+ describe('getEvents', () => {
46
+ const eventId = 'event1';
47
+ const latestEventId = 'event2';
48
+
49
+ it('should yield ShareWithMeUpdated event when refresh is true', async () => {
50
+ const mockEvents: DriveEventsListWithStatus = {
51
+ latestEventId,
52
+ more: false,
53
+ refresh: true,
54
+ events: [],
55
+ };
56
+ mockApiService.getCoreEvents.mockResolvedValue(mockEvents);
57
+
58
+ const events = [];
59
+ for await (const event of coreEventManager.getEvents(eventId)) {
60
+ events.push(event);
61
+ }
62
+
63
+ expect(events).toHaveLength(1);
64
+ expect(events[0]).toEqual({
65
+ type: DriveEventType.SharedWithMeUpdated,
66
+ treeEventScopeId: 'core',
67
+ eventId: latestEventId,
68
+ });
69
+ expect(mockApiService.getCoreEvents).toHaveBeenCalledWith(eventId);
70
+ });
71
+
72
+ it('should yield all events when there are actual events', async () => {
73
+ const mockEvent1: DriveEvent = {
74
+ type: DriveEventType.SharedWithMeUpdated,
75
+ eventId: 'event-1',
76
+ treeEventScopeId: 'core',
77
+ };
78
+ const mockEvent2: DriveEvent = {
79
+ type: DriveEventType.SharedWithMeUpdated,
80
+ eventId: 'event-2',
81
+ treeEventScopeId: 'core',
82
+ };
83
+ const mockEvents: DriveEventsListWithStatus = {
84
+ latestEventId,
85
+ more: false,
86
+ refresh: false,
87
+ events: [mockEvent1, mockEvent2],
88
+ };
89
+ mockApiService.getCoreEvents.mockResolvedValue(mockEvents);
90
+
91
+ const events = [];
92
+ for await (const event of coreEventManager.getEvents(eventId)) {
93
+ events.push(event);
94
+ }
95
+
96
+ expect(events).toHaveLength(2);
97
+ expect(events[0]).toEqual(mockEvent1);
98
+ expect(events[1]).toEqual(mockEvent2);
99
+ });
100
+ });
101
+ });
@@ -1,9 +1,7 @@
1
- import { Logger } from "../../interface";
2
- import { LoggerWithPrefix } from "../../telemetry";
3
- import { EventsAPIService } from "./apiService";
4
- import { EventsCache } from "./cache";
5
- import { DriveEvent, DriveEventType } from "./interface";
6
- import { EventManager } from "./eventManager";
1
+ import { Logger } from '../../interface';
2
+ import { LoggerWithPrefix } from '../../telemetry';
3
+ import { EventsAPIService } from './apiService';
4
+ import { DriveEvent, DriveEventType, EventManagerInterface } from './interface';
7
5
 
8
6
  /**
9
7
  * Combines API and event manager to provide a service for listening to
@@ -11,59 +9,39 @@ import { EventManager } from "./eventManager";
11
9
  * At this moment, Drive listenes only to shares with me updates from core
12
10
  * events. Such even indicates that user was invited to the new share or
13
11
  * that user's membership was removed from existing one and lost access.
14
- *
12
+ *
15
13
  * The client might be already using own core events, thus this service
16
14
  * is here only in case the client is not connected to the Proton services
17
15
  * with own implementation.
18
16
  */
19
- export class CoreEventManager {
20
- private manager: EventManager<DriveEvent>;
21
-
22
- constructor(logger: Logger, private apiService: EventsAPIService, private cache: EventsCache) {
17
+ export class CoreEventManager implements EventManagerInterface<DriveEvent> {
18
+ constructor(
19
+ private logger: Logger,
20
+ private apiService: EventsAPIService,
21
+ ) {
23
22
  this.apiService = apiService;
24
23
 
25
- this.manager = new EventManager(
26
- new LoggerWithPrefix(logger, `core`),
27
- () => this.getLastEventId(),
28
- (eventId) => this.apiService.getCoreEvents(eventId),
29
- (lastEventId) => this.cache.setLastEventId('core', {
30
- lastEventId,
31
- pollingIntervalInSeconds: this.manager.pollingIntervalInSeconds,
32
- isOwnVolume: false,
33
- }),
34
- );
24
+ this.logger = new LoggerWithPrefix(logger, `core`);
35
25
  }
36
26
 
37
- private async getLastEventId(): Promise<string> {
38
- const lastEventId = await this.cache.getLastEventId('core');
39
- if (lastEventId) {
40
- return lastEventId;
41
- }
42
- return this.apiService.getCoreLatestEventId();
27
+ async getLatestEventId(): Promise<string> {
28
+ return await this.apiService.getCoreLatestEventId();
43
29
  }
44
30
 
45
- async startSubscription(): Promise<void> {
46
- await this.manager.start();
47
- }
48
-
49
- async stopSubscription(): Promise<void> {
50
- await this.manager.stop();
31
+ async *getEvents(eventId: string): AsyncIterable<DriveEvent> {
32
+ const events = await this.apiService.getCoreEvents(eventId);
33
+ if (events.events.length === 0 && events.latestEventId !== eventId) {
34
+ yield {
35
+ type: DriveEventType.SharedWithMeUpdated,
36
+ treeEventScopeId: 'core',
37
+ eventId: events.latestEventId,
38
+ };
39
+ return;
40
+ }
41
+ yield* events.events;
51
42
  }
52
43
 
53
- addListener(callback: (events: DriveEvent[]) => Promise<void>): void {
54
- this.manager.addListener(async (events, fullRefresh) => {
55
- if (events) {
56
- await callback(events);
57
- }
58
- if (fullRefresh) {
59
- // Because only updates about shares that are shared with me
60
- // are listened to from core events, in the case of core full
61
- // refresh, we don't have to refresh anything more than this
62
- // one specific event.
63
- await callback([{
64
- type: DriveEventType.ShareWithMeUpdated,
65
- }]);
66
- }
67
- });
44
+ getLogger(): Logger {
45
+ return this.logger;
68
46
  }
69
47
  }