@protontech/drive-sdk 0.1.0 → 0.1.2

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 (452) hide show
  1. package/dist/cache/memoryCache.js +0 -1
  2. package/dist/cache/memoryCache.js.map +1 -1
  3. package/dist/cache/memoryCache.test.js +2 -4
  4. package/dist/cache/memoryCache.test.js.map +1 -1
  5. package/dist/cache/nullCache.js +0 -1
  6. package/dist/cache/nullCache.js.map +1 -1
  7. package/dist/crypto/driveCrypto.d.ts +2 -5
  8. package/dist/crypto/driveCrypto.js +7 -12
  9. package/dist/crypto/driveCrypto.js.map +1 -1
  10. package/dist/crypto/driveCrypto.test.js +14 -14
  11. package/dist/crypto/openPGPCrypto.js +3 -3
  12. package/dist/crypto/openPGPCrypto.js.map +1 -1
  13. package/dist/diagnostic/eventsGenerator.js +1 -1
  14. package/dist/diagnostic/eventsGenerator.js.map +1 -1
  15. package/dist/diagnostic/httpClient.d.ts +1 -1
  16. package/dist/diagnostic/httpClient.js.map +1 -1
  17. package/dist/diagnostic/index.d.ts +3 -3
  18. package/dist/diagnostic/index.js.map +1 -1
  19. package/dist/diagnostic/integrityVerificationStream.js +1 -1
  20. package/dist/diagnostic/integrityVerificationStream.js.map +1 -1
  21. package/dist/diagnostic/interface.d.ts +2 -2
  22. package/dist/diagnostic/sdkDiagnostic.d.ts +3 -3
  23. package/dist/diagnostic/sdkDiagnostic.js +8 -2
  24. package/dist/diagnostic/sdkDiagnostic.js.map +1 -1
  25. package/dist/diagnostic/sdkDiagnosticFull.d.ts +4 -4
  26. package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -1
  27. package/dist/diagnostic/telemetry.js.map +1 -1
  28. package/dist/diagnostic/zipGenerators.js +2 -2
  29. package/dist/diagnostic/zipGenerators.js.map +1 -1
  30. package/dist/diagnostic/zipGenerators.test.js +1 -1
  31. package/dist/diagnostic/zipGenerators.test.js.map +1 -1
  32. package/dist/interface/events.d.ts +2 -4
  33. package/dist/interface/events.js.map +1 -1
  34. package/dist/interface/index.d.ts +5 -5
  35. package/dist/interface/index.js +0 -1
  36. package/dist/interface/index.js.map +1 -1
  37. package/dist/interface/result.js.map +1 -1
  38. package/dist/interface/sharing.d.ts +1 -0
  39. package/dist/interface/sharing.js.map +1 -1
  40. package/dist/interface/telemetry.js +0 -8
  41. package/dist/interface/telemetry.js.map +1 -1
  42. package/dist/interface/thumbnail.js.map +1 -1
  43. package/dist/interface/upload.d.ts +1 -1
  44. package/dist/internal/apiService/apiService.d.ts +1 -1
  45. package/dist/internal/apiService/apiService.js +7 -11
  46. package/dist/internal/apiService/apiService.js.map +1 -1
  47. package/dist/internal/apiService/apiService.test.js +55 -48
  48. package/dist/internal/apiService/apiService.test.js.map +1 -1
  49. package/dist/internal/apiService/coreTypes.d.ts +2356 -2356
  50. package/dist/internal/apiService/driveTypes.d.ts +1680 -1680
  51. package/dist/internal/apiService/errors.js +14 -8
  52. package/dist/internal/apiService/errors.js.map +1 -1
  53. package/dist/internal/apiService/errors.test.js +17 -12
  54. package/dist/internal/apiService/errors.test.js.map +1 -1
  55. package/dist/internal/apiService/transformers.d.ts +1 -1
  56. package/dist/internal/apiService/transformers.js +1 -1
  57. package/dist/internal/asyncIteratorMap.test.js +2 -2
  58. package/dist/internal/asyncIteratorMap.test.js.map +1 -1
  59. package/dist/internal/asyncIteratorRace.d.ts +13 -0
  60. package/dist/internal/asyncIteratorRace.js +59 -0
  61. package/dist/internal/asyncIteratorRace.js.map +1 -0
  62. package/dist/internal/asyncIteratorRace.test.d.ts +1 -0
  63. package/dist/internal/asyncIteratorRace.test.js +119 -0
  64. package/dist/internal/asyncIteratorRace.test.js.map +1 -0
  65. package/dist/internal/batch.d.ts +1 -0
  66. package/dist/internal/batch.js +12 -0
  67. package/dist/internal/batch.js.map +1 -0
  68. package/dist/internal/batch.test.d.ts +1 -0
  69. package/dist/internal/batch.test.js +41 -0
  70. package/dist/internal/batch.test.js.map +1 -0
  71. package/dist/internal/batchLoading.js.map +1 -1
  72. package/dist/internal/batchLoading.test.js +13 -13
  73. package/dist/internal/batchLoading.test.js.map +1 -1
  74. package/dist/internal/devices/apiService.d.ts +3 -3
  75. package/dist/internal/devices/apiService.js +2 -2
  76. package/dist/internal/devices/apiService.js.map +1 -1
  77. package/dist/internal/devices/cryptoService.js +1 -2
  78. package/dist/internal/devices/cryptoService.js.map +1 -1
  79. package/dist/internal/devices/index.d.ts +5 -5
  80. package/dist/internal/devices/index.js.map +1 -1
  81. package/dist/internal/devices/interface.d.ts +3 -3
  82. package/dist/internal/devices/manager.js +2 -2
  83. package/dist/internal/devices/manager.js.map +1 -1
  84. package/dist/internal/devices/manager.test.js +38 -7
  85. package/dist/internal/devices/manager.test.js.map +1 -1
  86. package/dist/internal/download/apiService.d.ts +4 -4
  87. package/dist/internal/download/apiService.js +0 -1
  88. package/dist/internal/download/apiService.js.map +1 -1
  89. package/dist/internal/download/cryptoService.d.ts +4 -4
  90. package/dist/internal/download/cryptoService.js +6 -5
  91. package/dist/internal/download/cryptoService.js.map +1 -1
  92. package/dist/internal/download/fileDownloader.d.ts +4 -4
  93. package/dist/internal/download/fileDownloader.js +3 -2
  94. package/dist/internal/download/fileDownloader.js.map +1 -1
  95. package/dist/internal/download/fileDownloader.test.js +1 -1
  96. package/dist/internal/download/fileDownloader.test.js.map +1 -1
  97. package/dist/internal/download/index.d.ts +5 -5
  98. package/dist/internal/download/index.js +5 -5
  99. package/dist/internal/download/index.js.map +1 -1
  100. package/dist/internal/download/interface.d.ts +3 -4
  101. package/dist/internal/download/telemetry.d.ts +3 -3
  102. package/dist/internal/download/telemetry.js +4 -2
  103. package/dist/internal/download/telemetry.js.map +1 -1
  104. package/dist/internal/download/telemetry.test.js +8 -8
  105. package/dist/internal/download/telemetry.test.js.map +1 -1
  106. package/dist/internal/download/thumbnailDownloader.d.ts +4 -4
  107. package/dist/internal/download/thumbnailDownloader.js +6 -6
  108. package/dist/internal/download/thumbnailDownloader.js.map +1 -1
  109. package/dist/internal/download/thumbnailDownloader.test.js.map +1 -1
  110. package/dist/internal/errors.d.ts +1 -1
  111. package/dist/internal/errors.js +1 -3
  112. package/dist/internal/errors.js.map +1 -1
  113. package/dist/internal/events/apiService.d.ts +2 -2
  114. package/dist/internal/events/apiService.js +9 -5
  115. package/dist/internal/events/apiService.js.map +1 -1
  116. package/dist/internal/events/coreEventManager.d.ts +3 -3
  117. package/dist/internal/events/coreEventManager.js.map +1 -1
  118. package/dist/internal/events/coreEventManager.test.js +14 -14
  119. package/dist/internal/events/eventManager.d.ts +2 -1
  120. package/dist/internal/events/eventManager.js +9 -1
  121. package/dist/internal/events/eventManager.js.map +1 -1
  122. package/dist/internal/events/eventManager.test.js +84 -60
  123. package/dist/internal/events/eventManager.test.js.map +1 -1
  124. package/dist/internal/events/index.d.ts +10 -9
  125. package/dist/internal/events/index.js +38 -32
  126. package/dist/internal/events/index.js.map +1 -1
  127. package/dist/internal/events/interface.d.ts +1 -1
  128. package/dist/internal/events/interface.js +0 -1
  129. package/dist/internal/events/interface.js.map +1 -1
  130. package/dist/internal/events/volumeEventManager.d.ts +3 -3
  131. package/dist/internal/events/volumeEventManager.js.map +1 -1
  132. package/dist/internal/events/volumeEventManager.test.js +55 -55
  133. package/dist/internal/events/volumeEventManager.test.js.map +1 -1
  134. package/dist/internal/nodes/apiService.d.ts +4 -3
  135. package/dist/internal/nodes/apiService.js +36 -15
  136. package/dist/internal/nodes/apiService.js.map +1 -1
  137. package/dist/internal/nodes/apiService.test.js +60 -41
  138. package/dist/internal/nodes/apiService.test.js.map +1 -1
  139. package/dist/internal/nodes/cache.d.ts +5 -5
  140. package/dist/internal/nodes/cache.js +14 -7
  141. package/dist/internal/nodes/cache.js.map +1 -1
  142. package/dist/internal/nodes/cache.test.js +31 -9
  143. package/dist/internal/nodes/cache.test.js.map +1 -1
  144. package/dist/internal/nodes/cryptoCache.d.ts +2 -2
  145. package/dist/internal/nodes/cryptoCache.js.map +1 -1
  146. package/dist/internal/nodes/cryptoCache.test.js +24 -4
  147. package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
  148. package/dist/internal/nodes/cryptoService.d.ts +3 -3
  149. package/dist/internal/nodes/cryptoService.js +11 -17
  150. package/dist/internal/nodes/cryptoService.js.map +1 -1
  151. package/dist/internal/nodes/cryptoService.test.js +320 -241
  152. package/dist/internal/nodes/cryptoService.test.js.map +1 -1
  153. package/dist/internal/nodes/events.d.ts +3 -3
  154. package/dist/internal/nodes/events.js +7 -7
  155. package/dist/internal/nodes/events.js.map +1 -1
  156. package/dist/internal/nodes/events.test.js +27 -21
  157. package/dist/internal/nodes/events.test.js.map +1 -1
  158. package/dist/internal/nodes/extendedAttributes.d.ts +1 -1
  159. package/dist/internal/nodes/extendedAttributes.js +3 -1
  160. package/dist/internal/nodes/extendedAttributes.js.map +1 -1
  161. package/dist/internal/nodes/extendedAttributes.test.js +7 -10
  162. package/dist/internal/nodes/extendedAttributes.test.js.map +1 -1
  163. package/dist/internal/nodes/index.d.ts +10 -10
  164. package/dist/internal/nodes/index.js.map +1 -1
  165. package/dist/internal/nodes/index.test.d.ts +1 -0
  166. package/dist/internal/nodes/index.test.js +106 -0
  167. package/dist/internal/nodes/index.test.js.map +1 -0
  168. package/dist/internal/nodes/interface.d.ts +2 -2
  169. package/dist/internal/nodes/nodesAccess.d.ts +7 -7
  170. package/dist/internal/nodes/nodesAccess.js +28 -16
  171. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  172. package/dist/internal/nodes/nodesAccess.test.js +39 -13
  173. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  174. package/dist/internal/nodes/nodesManagement.d.ts +6 -6
  175. package/dist/internal/nodes/nodesManagement.js +9 -7
  176. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  177. package/dist/internal/nodes/nodesManagement.test.js +9 -9
  178. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  179. package/dist/internal/nodes/nodesRevisions.d.ts +4 -4
  180. package/dist/internal/nodes/nodesRevisions.js.map +1 -1
  181. package/dist/internal/photos/albums.d.ts +3 -3
  182. package/dist/internal/photos/albums.js.map +1 -1
  183. package/dist/internal/photos/apiService.d.ts +1 -1
  184. package/dist/internal/photos/apiService.js +3 -6
  185. package/dist/internal/photos/apiService.js.map +1 -1
  186. package/dist/internal/photos/cache.d.ts +1 -1
  187. package/dist/internal/photos/index.d.ts +5 -5
  188. package/dist/internal/photos/index.js.map +1 -1
  189. package/dist/internal/photos/interface.d.ts +2 -2
  190. package/dist/internal/photos/photosTimeline.d.ts +3 -3
  191. package/dist/internal/photos/photosTimeline.js +1 -2
  192. package/dist/internal/photos/photosTimeline.js.map +1 -1
  193. package/dist/internal/sdkEvents.d.ts +1 -1
  194. package/dist/internal/sdkEvents.js +2 -7
  195. package/dist/internal/sdkEvents.js.map +1 -1
  196. package/dist/internal/sdkEvents.test.js +8 -8
  197. package/dist/internal/shares/apiService.d.ts +2 -2
  198. package/dist/internal/shares/apiService.js +5 -3
  199. package/dist/internal/shares/apiService.js.map +1 -1
  200. package/dist/internal/shares/cache.d.ts +2 -2
  201. package/dist/internal/shares/cache.js +12 -6
  202. package/dist/internal/shares/cache.js.map +1 -1
  203. package/dist/internal/shares/cache.test.js.map +1 -1
  204. package/dist/internal/shares/cryptoCache.d.ts +2 -2
  205. package/dist/internal/shares/cryptoCache.test.js +8 -2
  206. package/dist/internal/shares/cryptoCache.test.js.map +1 -1
  207. package/dist/internal/shares/cryptoService.d.ts +3 -3
  208. package/dist/internal/shares/cryptoService.js.map +1 -1
  209. package/dist/internal/shares/cryptoService.test.js +42 -42
  210. package/dist/internal/shares/cryptoService.test.js.map +1 -1
  211. package/dist/internal/shares/index.d.ts +4 -4
  212. package/dist/internal/shares/index.js.map +1 -1
  213. package/dist/internal/shares/interface.d.ts +2 -2
  214. package/dist/internal/shares/manager.d.ts +7 -7
  215. package/dist/internal/shares/manager.js.map +1 -1
  216. package/dist/internal/shares/manager.test.js +71 -63
  217. package/dist/internal/shares/manager.test.js.map +1 -1
  218. package/dist/internal/sharing/apiService.d.ts +4 -4
  219. package/dist/internal/sharing/apiService.js +4 -3
  220. package/dist/internal/sharing/apiService.js.map +1 -1
  221. package/dist/internal/sharing/cache.d.ts +2 -1
  222. package/dist/internal/sharing/cache.js +9 -0
  223. package/dist/internal/sharing/cache.js.map +1 -1
  224. package/dist/internal/sharing/cache.test.js +33 -33
  225. package/dist/internal/sharing/cryptoService.d.ts +3 -3
  226. package/dist/internal/sharing/cryptoService.js +3 -5
  227. package/dist/internal/sharing/cryptoService.js.map +1 -1
  228. package/dist/internal/sharing/cryptoService.test.js +39 -39
  229. package/dist/internal/sharing/cryptoService.test.js.map +1 -1
  230. package/dist/internal/sharing/events.d.ts +5 -4
  231. package/dist/internal/sharing/events.js +28 -19
  232. package/dist/internal/sharing/events.js.map +1 -1
  233. package/dist/internal/sharing/events.test.js +101 -88
  234. package/dist/internal/sharing/events.test.js.map +1 -1
  235. package/dist/internal/sharing/index.d.ts +6 -6
  236. package/dist/internal/sharing/index.js.map +1 -1
  237. package/dist/internal/sharing/interface.d.ts +5 -4
  238. package/dist/internal/sharing/sharingAccess.d.ts +6 -6
  239. package/dist/internal/sharing/sharingAccess.js +8 -4
  240. package/dist/internal/sharing/sharingAccess.js.map +1 -1
  241. package/dist/internal/sharing/sharingAccess.test.js +45 -39
  242. package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
  243. package/dist/internal/sharing/sharingManagement.d.ts +4 -4
  244. package/dist/internal/sharing/sharingManagement.js +5 -7
  245. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  246. package/dist/internal/sharing/sharingManagement.test.js +297 -248
  247. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  248. package/dist/internal/uids.js.map +1 -1
  249. package/dist/internal/upload/apiService.d.ts +3 -3
  250. package/dist/internal/upload/apiService.js +1 -1
  251. package/dist/internal/upload/apiService.js.map +1 -1
  252. package/dist/internal/upload/blockVerifier.d.ts +3 -3
  253. package/dist/internal/upload/blockVerifier.js +1 -1
  254. package/dist/internal/upload/blockVerifier.js.map +1 -1
  255. package/dist/internal/upload/chunkStreamReader.test.js +6 -6
  256. package/dist/internal/upload/cryptoService.d.ts +4 -4
  257. package/dist/internal/upload/cryptoService.js +4 -4
  258. package/dist/internal/upload/cryptoService.js.map +1 -1
  259. package/dist/internal/upload/digests.js.map +1 -1
  260. package/dist/internal/upload/fileUploader.d.ts +6 -6
  261. package/dist/internal/upload/fileUploader.js.map +1 -1
  262. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  263. package/dist/internal/upload/index.d.ts +5 -5
  264. package/dist/internal/upload/index.js.map +1 -1
  265. package/dist/internal/upload/interface.d.ts +4 -3
  266. package/dist/internal/upload/manager.d.ts +5 -5
  267. package/dist/internal/upload/manager.js +15 -9
  268. package/dist/internal/upload/manager.js.map +1 -1
  269. package/dist/internal/upload/manager.test.js +139 -128
  270. package/dist/internal/upload/manager.test.js.map +1 -1
  271. package/dist/internal/upload/streamUploader.d.ts +6 -6
  272. package/dist/internal/upload/streamUploader.js +9 -7
  273. package/dist/internal/upload/streamUploader.js.map +1 -1
  274. package/dist/internal/upload/streamUploader.test.js +17 -12
  275. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  276. package/dist/internal/upload/telemetry.d.ts +3 -3
  277. package/dist/internal/upload/telemetry.js +5 -3
  278. package/dist/internal/upload/telemetry.js.map +1 -1
  279. package/dist/internal/upload/telemetry.test.js +8 -8
  280. package/dist/internal/upload/telemetry.test.js.map +1 -1
  281. package/dist/protonDriveClient.d.ts +8 -8
  282. package/dist/protonDriveClient.js +12 -9
  283. package/dist/protonDriveClient.js.map +1 -1
  284. package/dist/protonDrivePhotosClient.js.map +1 -1
  285. package/dist/telemetry.js +18 -15
  286. package/dist/telemetry.js.map +1 -1
  287. package/dist/tests/logger.js.map +1 -1
  288. package/dist/tests/telemetry.d.ts +1 -1
  289. package/dist/transformers.d.ts +1 -1
  290. package/dist/transformers.js +5 -2
  291. package/dist/transformers.js.map +1 -1
  292. package/package.json +1 -1
  293. package/src/cache/interface.ts +22 -22
  294. package/src/cache/memoryCache.test.ts +7 -7
  295. package/src/cache/memoryCache.ts +4 -4
  296. package/src/cache/nullCache.ts +1 -1
  297. package/src/config.ts +5 -5
  298. package/src/crypto/driveCrypto.test.ts +15 -15
  299. package/src/crypto/driveCrypto.ts +120 -156
  300. package/src/crypto/hmac.ts +1 -1
  301. package/src/crypto/interface.ts +63 -72
  302. package/src/crypto/openPGPCrypto.ts +74 -94
  303. package/src/crypto/utils.ts +1 -1
  304. package/src/diagnostic/eventsGenerator.ts +2 -2
  305. package/src/diagnostic/httpClient.ts +6 -2
  306. package/src/diagnostic/index.ts +12 -10
  307. package/src/diagnostic/integrityVerificationStream.ts +3 -4
  308. package/src/diagnostic/interface.ts +81 -81
  309. package/src/diagnostic/sdkDiagnostic.ts +35 -24
  310. package/src/diagnostic/sdkDiagnosticFull.ts +16 -19
  311. package/src/diagnostic/telemetry.ts +4 -1
  312. package/src/diagnostic/zipGenerators.test.ts +1 -1
  313. package/src/diagnostic/zipGenerators.ts +3 -3
  314. package/src/errors.ts +21 -21
  315. package/src/index.ts +3 -3
  316. package/src/interface/account.ts +10 -10
  317. package/src/interface/author.ts +6 -6
  318. package/src/interface/config.ts +4 -4
  319. package/src/interface/devices.ts +6 -6
  320. package/src/interface/download.ts +12 -9
  321. package/src/interface/events.ts +45 -39
  322. package/src/interface/httpClient.ts +11 -11
  323. package/src/interface/index.ts +76 -19
  324. package/src/interface/nodes.ts +47 -49
  325. package/src/interface/result.ts +1 -3
  326. package/src/interface/sharing.ts +60 -57
  327. package/src/interface/telemetry.ts +74 -74
  328. package/src/interface/thumbnail.ts +5 -6
  329. package/src/interface/upload.ts +20 -12
  330. package/src/internal/apiService/apiService.test.ts +109 -76
  331. package/src/internal/apiService/apiService.ts +40 -26
  332. package/src/internal/apiService/coreTypes.ts +2474 -2463
  333. package/src/internal/apiService/driveTypes.ts +1868 -1822
  334. package/src/internal/apiService/errorCodes.ts +4 -4
  335. package/src/internal/apiService/errors.test.ts +25 -23
  336. package/src/internal/apiService/errors.ts +15 -9
  337. package/src/internal/apiService/index.ts +1 -1
  338. package/src/internal/apiService/transformers.ts +2 -2
  339. package/src/internal/asyncIteratorMap.test.ts +4 -4
  340. package/src/internal/asyncIteratorMap.ts +1 -1
  341. package/src/internal/asyncIteratorRace.test.ts +149 -0
  342. package/src/internal/asyncIteratorRace.ts +79 -0
  343. package/src/internal/batch.test.ts +50 -0
  344. package/src/internal/batch.ts +9 -0
  345. package/src/internal/batchLoading.test.ts +13 -14
  346. package/src/internal/batchLoading.ts +8 -8
  347. package/src/internal/devices/apiService.ts +58 -51
  348. package/src/internal/devices/cryptoService.ts +22 -17
  349. package/src/internal/devices/index.ts +17 -10
  350. package/src/internal/devices/interface.ts +21 -12
  351. package/src/internal/devices/manager.test.ts +40 -9
  352. package/src/internal/devices/manager.ts +3 -3
  353. package/src/internal/download/apiService.ts +66 -49
  354. package/src/internal/download/cryptoService.ts +34 -18
  355. package/src/internal/download/fileDownloader.test.ts +25 -9
  356. package/src/internal/download/fileDownloader.ts +36 -18
  357. package/src/internal/download/index.ts +19 -19
  358. package/src/internal/download/interface.ts +19 -20
  359. package/src/internal/download/queue.ts +3 -3
  360. package/src/internal/download/telemetry.test.ts +11 -11
  361. package/src/internal/download/telemetry.ts +24 -14
  362. package/src/internal/download/thumbnailDownloader.test.ts +11 -6
  363. package/src/internal/download/thumbnailDownloader.ts +43 -32
  364. package/src/internal/errors.ts +7 -5
  365. package/src/internal/events/apiService.ts +30 -17
  366. package/src/internal/events/coreEventManager.test.ts +18 -18
  367. package/src/internal/events/coreEventManager.ts +9 -6
  368. package/src/internal/events/eventManager.test.ts +108 -82
  369. package/src/internal/events/eventManager.ts +16 -5
  370. package/src/internal/events/index.ts +75 -47
  371. package/src/internal/events/interface.ts +47 -39
  372. package/src/internal/events/volumeEventManager.test.ts +61 -65
  373. package/src/internal/events/volumeEventManager.ts +18 -9
  374. package/src/internal/nodes/apiService.test.ts +197 -147
  375. package/src/internal/nodes/apiService.ts +288 -174
  376. package/src/internal/nodes/cache.test.ts +48 -20
  377. package/src/internal/nodes/cache.ts +60 -44
  378. package/src/internal/nodes/cryptoCache.test.ts +34 -14
  379. package/src/internal/nodes/cryptoCache.ts +10 -5
  380. package/src/internal/nodes/cryptoService.test.ts +492 -351
  381. package/src/internal/nodes/cryptoService.ts +170 -88
  382. package/src/internal/nodes/events.test.ts +38 -28
  383. package/src/internal/nodes/events.ts +13 -12
  384. package/src/internal/nodes/extendedAttributes.test.ts +28 -24
  385. package/src/internal/nodes/extendedAttributes.ts +20 -15
  386. package/src/internal/nodes/index.test.ts +133 -0
  387. package/src/internal/nodes/index.ts +27 -15
  388. package/src/internal/nodes/interface.ts +42 -29
  389. package/src/internal/nodes/nodesAccess.test.ts +124 -58
  390. package/src/internal/nodes/nodesAccess.ts +73 -49
  391. package/src/internal/nodes/nodesManagement.test.ts +32 -31
  392. package/src/internal/nodes/nodesManagement.ts +39 -32
  393. package/src/internal/nodes/nodesRevisions.ts +7 -7
  394. package/src/internal/nodes/validations.ts +2 -2
  395. package/src/internal/photos/albums.ts +5 -5
  396. package/src/internal/photos/apiService.ts +4 -7
  397. package/src/internal/photos/cache.ts +1 -1
  398. package/src/internal/photos/index.ts +8 -8
  399. package/src/internal/photos/interface.ts +2 -2
  400. package/src/internal/photos/photosTimeline.ts +4 -5
  401. package/src/internal/sdkEvents.test.ts +10 -10
  402. package/src/internal/sdkEvents.ts +5 -13
  403. package/src/internal/shares/apiService.ts +44 -33
  404. package/src/internal/shares/cache.test.ts +6 -4
  405. package/src/internal/shares/cache.ts +21 -12
  406. package/src/internal/shares/cryptoCache.test.ts +17 -11
  407. package/src/internal/shares/cryptoCache.ts +4 -4
  408. package/src/internal/shares/cryptoService.test.ts +72 -74
  409. package/src/internal/shares/cryptoService.ts +48 -23
  410. package/src/internal/shares/index.ts +23 -11
  411. package/src/internal/shares/interface.ts +8 -8
  412. package/src/internal/shares/manager.test.ts +88 -80
  413. package/src/internal/shares/manager.ts +19 -19
  414. package/src/internal/sharing/apiService.ts +282 -175
  415. package/src/internal/sharing/cache.test.ts +35 -35
  416. package/src/internal/sharing/cache.ts +11 -2
  417. package/src/internal/sharing/cryptoService.test.ts +58 -46
  418. package/src/internal/sharing/cryptoService.ts +121 -84
  419. package/src/internal/sharing/events.test.ts +113 -102
  420. package/src/internal/sharing/events.ts +42 -24
  421. package/src/internal/sharing/index.ts +22 -11
  422. package/src/internal/sharing/interface.ts +40 -40
  423. package/src/internal/sharing/sharingAccess.test.ts +71 -65
  424. package/src/internal/sharing/sharingAccess.ts +39 -21
  425. package/src/internal/sharing/sharingManagement.test.ts +398 -298
  426. package/src/internal/sharing/sharingManagement.ts +138 -65
  427. package/src/internal/uids.ts +1 -1
  428. package/src/internal/upload/apiService.ts +167 -117
  429. package/src/internal/upload/blockVerifier.ts +8 -6
  430. package/src/internal/upload/chunkStreamReader.test.ts +7 -7
  431. package/src/internal/upload/cryptoService.ts +42 -36
  432. package/src/internal/upload/digests.ts +2 -2
  433. package/src/internal/upload/fileUploader.test.ts +15 -3
  434. package/src/internal/upload/fileUploader.ts +39 -17
  435. package/src/internal/upload/index.ts +13 -14
  436. package/src/internal/upload/interface.ts +79 -78
  437. package/src/internal/upload/manager.test.ts +170 -156
  438. package/src/internal/upload/manager.ts +66 -39
  439. package/src/internal/upload/queue.ts +3 -3
  440. package/src/internal/upload/streamUploader.test.ts +40 -26
  441. package/src/internal/upload/streamUploader.ts +87 -69
  442. package/src/internal/upload/telemetry.test.ts +11 -11
  443. package/src/internal/upload/telemetry.ts +25 -15
  444. package/src/internal/wait.test.ts +1 -1
  445. package/src/internal/wait.ts +3 -3
  446. package/src/protonDriveClient.ts +121 -39
  447. package/src/protonDrivePhotosClient.ts +16 -10
  448. package/src/telemetry.ts +60 -52
  449. package/src/tests/logger.ts +1 -1
  450. package/src/tests/telemetry.ts +2 -2
  451. package/src/transformers.ts +29 -21
  452. package/src/version.ts +0 -1
@@ -1,32 +1,24 @@
1
- import { getMockLogger } from "../../tests/logger";
2
- import { EventManager } from "./eventManager";
3
- import { DriveEvent, DriveEventType, EventSubscription, UnsubscribeFromEventsSourceError } from "./interface";
1
+ import { getMockLogger } from '../../tests/logger';
2
+ import { EventManager } from './eventManager';
3
+ import { DriveEvent, DriveEventType, EventSubscription, UnsubscribeFromEventsSourceError } from './interface';
4
4
 
5
5
  jest.useFakeTimers();
6
6
 
7
7
  const POLLING_INTERVAL = 1;
8
8
 
9
- describe("EventManager", () => {
9
+ describe('EventManager', () => {
10
10
  let manager: EventManager<DriveEvent>;
11
11
 
12
- const getLatestEventIdMock = jest.fn();
13
- const getEventsMock = jest.fn();
14
12
  const listenerMock = jest.fn();
15
- const mockLogger = getMockLogger();
16
13
  const subscriptions: EventSubscription[] = [];
14
+ const mockEventManager = {
15
+ getLogger: () => getMockLogger(),
16
+ getLatestEventId: jest.fn(),
17
+ getEvents: jest.fn(),
18
+ };
17
19
 
18
20
  beforeEach(() => {
19
- const mockEventManager = {
20
- getLogger: () => mockLogger,
21
- getLatestEventId: getLatestEventIdMock,
22
- getEvents: getEventsMock,
23
- };
24
-
25
- manager = new EventManager(
26
- mockEventManager as any,
27
- POLLING_INTERVAL,
28
- null,
29
- );
21
+ manager = new EventManager(mockEventManager, POLLING_INTERVAL, null);
30
22
  const subscription = manager.addListener(listenerMock);
31
23
  subscriptions.push(subscription);
32
24
  });
@@ -40,45 +32,52 @@ describe("EventManager", () => {
40
32
  jest.clearAllMocks();
41
33
  });
42
34
 
43
- it("should start polling when started", async () => {
44
- getLatestEventIdMock.mockResolvedValue('EventId1');
35
+ it('should start polling when started', async () => {
36
+ mockEventManager.getLatestEventId.mockResolvedValue('EventId1');
45
37
 
46
38
  const mockEvents: DriveEvent[][] = [
47
- [{
48
- type: DriveEventType.FastForward,
49
- treeEventScopeId: 'volume1',
50
- eventId: 'EventId2',
51
- }],
52
- [{
53
- type: DriveEventType.FastForward,
54
- treeEventScopeId: 'volume1',
55
- eventId: 'EventId3',
56
- }],
39
+ [
40
+ {
41
+ type: DriveEventType.FastForward,
42
+ treeEventScopeId: 'volume1',
43
+ eventId: 'EventId2',
44
+ },
45
+ ],
46
+ [
47
+ {
48
+ type: DriveEventType.FastForward,
49
+ treeEventScopeId: 'volume1',
50
+ eventId: 'EventId3',
51
+ },
52
+ ],
57
53
  ];
58
54
 
59
- getEventsMock.mockImplementationOnce(async function* () {
60
- yield* mockEvents[0];
61
- }).mockImplementationOnce(async function* () {
62
- yield* mockEvents[1];
63
- }).mockImplementationOnce(async function* () {
64
- });
55
+ mockEventManager.getEvents
56
+ .mockImplementationOnce(async function* () {
57
+ yield* mockEvents[0];
58
+ })
59
+ .mockImplementationOnce(async function* () {
60
+ yield* mockEvents[1];
61
+ })
62
+ .mockImplementationOnce(async function* () {});
65
63
 
66
- expect(getLatestEventIdMock).toHaveBeenCalledTimes(0);
67
- expect(getEventsMock).toHaveBeenCalledTimes(0);
64
+ expect(mockEventManager.getLatestEventId).toHaveBeenCalledTimes(0);
65
+ expect(mockEventManager.getEvents).toHaveBeenCalledTimes(0);
68
66
 
69
67
  expect(await manager.start()).toBeUndefined();
68
+ await jest.runOnlyPendingTimersAsync();
70
69
 
71
- expect(getLatestEventIdMock).toHaveBeenCalledTimes(1);
72
- expect(getEventsMock).toHaveBeenCalledWith('EventId1');
70
+ expect(mockEventManager.getLatestEventId).toHaveBeenCalledTimes(1);
71
+ expect(mockEventManager.getEvents).toHaveBeenCalledWith('EventId1');
73
72
 
74
73
  await jest.runOnlyPendingTimersAsync();
75
- expect(getEventsMock).toHaveBeenCalledTimes(2);
76
- expect(getEventsMock).toHaveBeenCalledWith('EventId2');
74
+ expect(mockEventManager.getEvents).toHaveBeenCalledTimes(2);
75
+ expect(mockEventManager.getEvents).toHaveBeenCalledWith('EventId2');
77
76
  });
78
77
 
79
- it("should stop polling when stopped", async () => {
80
- getLatestEventIdMock.mockResolvedValue('eventId1');
81
- getEventsMock.mockImplementation(async function* () {
78
+ it('should stop polling when stopped', async () => {
79
+ mockEventManager.getLatestEventId.mockResolvedValue('eventId1');
80
+ mockEventManager.getEvents.mockImplementation(async function* () {
82
81
  yield {
83
82
  type: DriveEventType.FastForward,
84
83
  treeEventScopeId: 'volume1',
@@ -89,16 +88,16 @@ describe("EventManager", () => {
89
88
  await manager.start();
90
89
  await jest.runOnlyPendingTimersAsync();
91
90
 
92
- const callsBeforeStop = getEventsMock.mock.calls.length;
91
+ const callsBeforeStop = mockEventManager.getEvents.mock.calls.length;
93
92
  await manager.stop();
94
93
  await jest.runOnlyPendingTimersAsync();
95
94
 
96
95
  // Should not have made additional calls after stopping
97
- expect(getEventsMock).toHaveBeenCalledTimes(callsBeforeStop);
96
+ expect(mockEventManager.getEvents).toHaveBeenCalledTimes(callsBeforeStop);
98
97
  });
99
98
 
100
- it("should notify all listeners when getting events", async () => {
101
- getLatestEventIdMock.mockResolvedValue('eventId1');
99
+ it('should notify all listeners when getting events', async () => {
100
+ mockEventManager.getLatestEventId.mockResolvedValue('eventId1');
102
101
 
103
102
  const mockEvents: DriveEvent[] = [
104
103
  {
@@ -112,10 +111,11 @@ describe("EventManager", () => {
112
111
  },
113
112
  ];
114
113
 
115
- getEventsMock.mockImplementationOnce(async function* () {
116
- yield* mockEvents;
117
- }).mockImplementation(async function* () {
118
- });
114
+ mockEventManager.getEvents
115
+ .mockImplementationOnce(async function* () {
116
+ yield* mockEvents;
117
+ })
118
+ .mockImplementation(async function* () {});
119
119
 
120
120
  expect(await manager.start()).toBeUndefined();
121
121
  await jest.runOnlyPendingTimersAsync();
@@ -123,20 +123,20 @@ describe("EventManager", () => {
123
123
  expect(listenerMock).toHaveBeenNthCalledWith(1, mockEvents[0]);
124
124
  });
125
125
 
126
- it("should propagate unsubscription errors", async () => {
127
- getLatestEventIdMock.mockImplementation(() => {
128
- throw new UnsubscribeFromEventsSourceError("Not found");
126
+ it('should propagate unsubscription errors', async () => {
127
+ mockEventManager.getLatestEventId.mockImplementation(() => {
128
+ throw new UnsubscribeFromEventsSourceError('Not found');
129
129
  });
130
130
 
131
131
  await expect(manager.start()).rejects.toThrow(UnsubscribeFromEventsSourceError);
132
132
 
133
- expect(getLatestEventIdMock).toHaveBeenCalledTimes(1);
133
+ expect(mockEventManager.getLatestEventId).toHaveBeenCalledTimes(1);
134
134
  expect(listenerMock).toHaveBeenCalledTimes(0);
135
- expect(getEventsMock).toHaveBeenCalledTimes(0);
135
+ expect(mockEventManager.getEvents).toHaveBeenCalledTimes(0);
136
136
  });
137
137
 
138
- it("should continue processing multiple events", async () => {
139
- getLatestEventIdMock.mockResolvedValue('eventId1');
138
+ it('should continue processing multiple events', async () => {
139
+ mockEventManager.getLatestEventId.mockResolvedValue('eventId1');
140
140
 
141
141
  const mockEvents: DriveEvent[] = [
142
142
  {
@@ -156,14 +156,16 @@ describe("EventManager", () => {
156
156
  isShared: false,
157
157
  treeEventScopeId: 'volume1',
158
158
  eventId: 'eventId3',
159
- }
159
+ },
160
160
  ];
161
161
 
162
- getEventsMock.mockImplementationOnce(async function* () {
163
- yield* mockEvents;
164
- }).mockImplementation(async function* () {
165
- // Empty generator for subsequent calls
166
- });
162
+ mockEventManager.getEvents
163
+ .mockImplementationOnce(async function* () {
164
+ yield* mockEvents;
165
+ })
166
+ .mockImplementation(async function* () {
167
+ // Empty generator for subsequent calls
168
+ });
167
169
 
168
170
  await manager.start();
169
171
  await jest.runOnlyPendingTimersAsync();
@@ -172,23 +174,23 @@ describe("EventManager", () => {
172
174
  expect(listenerMock).toHaveBeenNthCalledWith(1, mockEvents[0]);
173
175
  expect(listenerMock).toHaveBeenNthCalledWith(2, mockEvents[1]);
174
176
 
175
- getEventsMock.mockImplementationOnce(async function* () {
177
+ mockEventManager.getEvents.mockImplementationOnce(async function* () {
176
178
  yield* mockEvents;
177
- })
179
+ });
178
180
  await jest.runOnlyPendingTimersAsync();
179
181
  expect(listenerMock).toHaveBeenCalledTimes(4);
180
182
  expect(listenerMock).toHaveBeenNthCalledWith(1, mockEvents[0]);
181
183
  expect(listenerMock).toHaveBeenNthCalledWith(2, mockEvents[1]);
182
184
  });
183
185
 
184
- it("should retry on error with exponential backoff", async () => {
185
- getLatestEventIdMock.mockResolvedValue('eventId1');
186
+ it('should retry on error with exponential backoff', async () => {
187
+ mockEventManager.getLatestEventId.mockResolvedValue('eventId1');
186
188
 
187
189
  let callCount = 0;
188
- getEventsMock.mockImplementation(async function* () {
190
+ mockEventManager.getEvents.mockImplementation(async function* () {
189
191
  callCount++;
190
192
  if (callCount <= 3) {
191
- throw new Error("Network error");
193
+ throw new Error('Network error');
192
194
  }
193
195
  yield {
194
196
  type: DriveEventType.FastForward,
@@ -200,11 +202,12 @@ describe("EventManager", () => {
200
202
  expect(manager['retryIndex']).toEqual(0);
201
203
 
202
204
  expect(await manager.start()).toBeUndefined();
203
- expect(getEventsMock).toHaveBeenCalledTimes(1);
205
+ await jest.runOnlyPendingTimersAsync();
206
+ expect(mockEventManager.getEvents).toHaveBeenCalledTimes(1);
204
207
  expect(manager['retryIndex']).toEqual(1);
205
208
 
206
209
  await jest.runOnlyPendingTimersAsync();
207
- expect(getEventsMock).toHaveBeenCalledTimes(2);
210
+ expect(mockEventManager.getEvents).toHaveBeenCalledTimes(2);
208
211
  expect(manager['retryIndex']).toEqual(2);
209
212
 
210
213
  await jest.runOnlyPendingTimersAsync();
@@ -218,9 +221,9 @@ describe("EventManager", () => {
218
221
  expect(manager['retryIndex']).toEqual(0);
219
222
  });
220
223
 
221
- it("should stop polling when stopped immediately", async () => {
222
- getLatestEventIdMock.mockResolvedValue('eventId1');
223
- getEventsMock.mockImplementation(async function* () {
224
+ it('should stop polling when stopped immediately', async () => {
225
+ mockEventManager.getLatestEventId.mockResolvedValue('eventId1');
226
+ mockEventManager.getEvents.mockImplementation(async function* () {
224
227
  yield {
225
228
  type: DriveEventType.FastForward,
226
229
  treeEventScopeId: 'volume1',
@@ -229,18 +232,19 @@ describe("EventManager", () => {
229
232
  });
230
233
 
231
234
  expect(await manager.start()).toBeUndefined();
232
- expect(getEventsMock).toHaveBeenCalledTimes(1);
235
+ await jest.runOnlyPendingTimersAsync();
236
+ expect(mockEventManager.getEvents).toHaveBeenCalledTimes(1);
233
237
  await manager.stop();
234
238
  await jest.runOnlyPendingTimersAsync();
235
239
 
236
240
  // getEvents should have been called once during start, but not again after stop
237
- expect(getEventsMock).toHaveBeenCalledTimes(1);
241
+ expect(mockEventManager.getEvents).toHaveBeenCalledTimes(1);
238
242
  });
239
243
 
240
- it("should handle empty event streams", async () => {
241
- getLatestEventIdMock.mockResolvedValue('eventId1');
244
+ it('should handle empty event streams', async () => {
245
+ mockEventManager.getLatestEventId.mockResolvedValue('eventId1');
242
246
 
243
- getEventsMock.mockImplementation(async function* () {
247
+ mockEventManager.getEvents.mockImplementation(async function* () {
244
248
  // Empty generator - no events
245
249
  });
246
250
 
@@ -249,4 +253,26 @@ describe("EventManager", () => {
249
253
 
250
254
  expect(listenerMock).toHaveBeenCalledTimes(0);
251
255
  });
256
+
257
+ it('should poll right away after start if latestEventId is passed', async () => {
258
+ manager = new EventManager(mockEventManager, POLLING_INTERVAL, 'eventId1');
259
+
260
+ await manager.start();
261
+
262
+ // Right after the start it is called.
263
+ expect(mockEventManager.getEvents).toHaveBeenCalledTimes(1);
264
+ });
265
+
266
+ it('should not poll right away after start if latestEventId is not passed', async () => {
267
+ manager = new EventManager(mockEventManager, POLLING_INTERVAL, null);
268
+
269
+ await manager.start();
270
+
271
+ // Right after the start it is not called.
272
+ expect(mockEventManager.getEvents).not.toHaveBeenCalled();
273
+
274
+ // But it is scheduled to be called after the polling interval.
275
+ await jest.runOnlyPendingTimersAsync();
276
+ expect(mockEventManager.getEvents).toHaveBeenCalledTimes(1);
277
+ });
252
278
  });
@@ -1,11 +1,10 @@
1
- import { Logger } from "../../interface";
2
- import { EventManagerInterface, Event, EventSubscription } from "./interface";
1
+ import { Logger } from '../../interface';
2
+ import { EventManagerInterface, Event, EventSubscription } from './interface';
3
3
 
4
4
  const FIBONACCI_LIST = [1, 1, 2, 3, 5, 8, 13];
5
5
 
6
6
  type Listener<T> = (event: T) => Promise<void>;
7
7
 
8
-
9
8
  /**
10
9
  * Event manager general helper that is responsible for fetching events
11
10
  * from the server and notifying listeners about the events.
@@ -39,8 +38,11 @@ export class EventManager<T extends Event> {
39
38
  }
40
39
 
41
40
  async start(): Promise<void> {
41
+ this.logger.info(`Starting event manager with latestEventId: ${this.latestEventId}`);
42
42
  if (this.latestEventId === undefined) {
43
43
  this.latestEventId = await this.specializedEventManager.getLatestEventId();
44
+ this.scheduleNextPoll();
45
+ return;
44
46
  }
45
47
  this.processPromise = this.processEvents();
46
48
  }
@@ -99,17 +101,26 @@ export class EventManager<T extends Event> {
99
101
  this.retryIndex = 0;
100
102
  } catch (error: unknown) {
101
103
  // This could be improved to catch api specific errors and let the listener errors bubble up directly
102
- this.logger.error(`Failed to process events: ${error instanceof Error ? error.message : error} (retry ${this.retryIndex}, last event ID: ${this.latestEventId})`);
104
+ this.logger.error(
105
+ `Failed to process events: ${error instanceof Error ? error.message : error} (retry ${this.retryIndex}, last event ID: ${this.latestEventId})`,
106
+ );
103
107
  this.retryIndex++;
104
108
  }
105
109
  if (listenerError) {
106
110
  throw listenerError;
107
111
  }
108
112
 
113
+ this.scheduleNextPoll();
114
+ }
115
+
116
+ private scheduleNextPoll() {
117
+ if (this.timeoutHandle) {
118
+ clearTimeout(this.timeoutHandle);
119
+ }
109
120
  this.timeoutHandle = setTimeout(() => {
110
121
  this.processPromise = this.processEvents();
111
122
  }, this.nextPollTimeout);
112
- };
123
+ }
113
124
 
114
125
  /**
115
126
  * Polling timeout is using exponential backoff with Fibonacci sequence.
@@ -1,14 +1,14 @@
1
- import { Logger, ProtonDriveTelemetry } from "../../interface";
2
- import { DriveAPIService } from "../apiService";
3
- import { DriveEvent, DriveListener, EventSubscription, LatestEventIdProvider } from "./interface";
4
- import { EventsAPIService } from "./apiService";
5
- import { CoreEventManager } from "./coreEventManager";
6
- import { VolumeEventManager } from "./volumeEventManager";
7
- import { EventManager } from "./eventManager";
8
- import { SharesManager } from "../shares/manager";
9
-
10
- export type { DriveEvent, DriveListener } from "./interface";
11
- export { DriveEventType } from "./interface";
1
+ import { Logger, ProtonDriveTelemetry } from '../../interface';
2
+ import { DriveAPIService } from '../apiService';
3
+ import { DriveEvent, DriveListener, EventSubscription, LatestEventIdProvider } from './interface';
4
+ import { EventsAPIService } from './apiService';
5
+ import { CoreEventManager } from './coreEventManager';
6
+ import { VolumeEventManager } from './volumeEventManager';
7
+ import { EventManager } from './eventManager';
8
+ import { SharesManager } from '../shares/manager';
9
+
10
+ export type { DriveEvent, DriveListener } from './interface';
11
+ export { DriveEventType } from './interface';
12
12
 
13
13
  const OWN_VOLUME_POLLING_INTERVAL = 30;
14
14
  const OTHER_VOLUME_POLLING_INTERVAL = 60;
@@ -21,81 +21,109 @@ const CORE_POLLING_INTERVAL = 30;
21
21
  */
22
22
  export class DriveEventsService {
23
23
  private apiService: EventsAPIService;
24
- private coreEvents?: EventManager<DriveEvent>;
24
+ private coreEventManager?: EventManager<DriveEvent>;
25
25
  private volumeEventManagers: { [volumeId: string]: EventManager<DriveEvent> };
26
26
  private logger: Logger;
27
27
 
28
- constructor(private telemetry: ProtonDriveTelemetry, apiService: DriveAPIService, private shareManagement: SharesManager, private cacheEventListeners: DriveListener[] = [], private latestEventIdProvider?: LatestEventIdProvider) {
28
+ constructor(
29
+ private telemetry: ProtonDriveTelemetry,
30
+ apiService: DriveAPIService,
31
+ private shareManagement: SharesManager,
32
+ private cacheEventListeners: DriveListener[] = [],
33
+ private latestEventIdProvider?: LatestEventIdProvider,
34
+ ) {
29
35
  this.telemetry = telemetry;
30
36
  this.logger = telemetry.getLogger('events');
31
37
  this.apiService = new EventsAPIService(apiService);
32
38
  this.volumeEventManagers = {};
33
39
  }
34
40
 
41
+ // FIXME: Allow to pass own core events manager from the public interface.
42
+ async subscribeToCoreEvents(callback: DriveListener): Promise<EventSubscription> {
43
+ let manager = this.coreEventManager;
44
+ const started = !!manager;
45
+
46
+ if (manager === undefined) {
47
+ manager = await this.createCoreEventManager();
48
+ this.coreEventManager = manager;
49
+ }
50
+
51
+ const eventSubscription = manager.addListener(callback);
52
+ if (!started) {
53
+ await manager.start();
54
+ }
55
+ return eventSubscription;
56
+ }
57
+
58
+ private async createCoreEventManager() {
59
+ if (!this.latestEventIdProvider) {
60
+ throw new Error(
61
+ 'Cannot subscribe to events without passing a latestEventIdProvider in ProtonDriveClient initialization',
62
+ );
63
+ }
64
+
65
+ const coreEventManager = new CoreEventManager(this.logger, this.apiService);
66
+ const latestEventId = this.latestEventIdProvider.getLatestEventId('core') ?? null;
67
+ const eventManager = new EventManager(coreEventManager, CORE_POLLING_INTERVAL, latestEventId);
68
+
69
+ for (const listener of this.cacheEventListeners) {
70
+ eventManager.addListener(listener);
71
+ }
72
+
73
+ return eventManager;
74
+ }
75
+
35
76
  /**
36
77
  * Subscribe to drive events. The treeEventScopeId can be obtained from a node.
37
78
  */
38
79
  async subscribeToTreeEvents(treeEventScopeId: string, callback: DriveListener): Promise<EventSubscription> {
39
80
  const volumeId = treeEventScopeId;
40
- this.logger.debug(`Creating volume event manager for volume ${volumeId}`);
41
81
  let manager = this.volumeEventManagers[volumeId];
42
- let started = true;
82
+ const started = !!manager;
83
+
43
84
  if (manager === undefined) {
44
85
  manager = await this.createVolumeEventManager(volumeId);
45
86
  this.volumeEventManagers[volumeId] = manager;
46
- started = false;
47
- this.sendNumberOfVolumeSubscriptionsToTelemetry();
48
87
  }
88
+
49
89
  const eventSubscription = manager.addListener(callback);
50
90
  if (!started) {
51
91
  await manager.start();
92
+ this.sendNumberOfVolumeSubscriptionsToTelemetry();
52
93
  }
53
94
  return eventSubscription;
54
95
  }
55
96
 
56
- // FIXME: Allow to pass own core events manager from the public interface.
57
- async subscribeToCoreEvents(callback: DriveListener): Promise<EventSubscription> {
58
- if (this.latestEventIdProvider === null || this.latestEventIdProvider === undefined) {
59
- throw new Error('Cannot subscribe to events without passing a latestEventIdProvider in ProtonDriveClient initialization');
60
- }
61
- if (this.coreEvents === undefined) {
62
- const coreEventManager = new CoreEventManager(this.logger, this.apiService);
63
- const latestEventId = this.latestEventIdProvider.getLatestEventId('core') ?? null;
64
- this.coreEvents = new EventManager(coreEventManager, CORE_POLLING_INTERVAL, latestEventId);
65
- for (const listener of this.cacheEventListeners) {
66
- this.coreEvents.addListener(listener);
67
- }
97
+ private async createVolumeEventManager(volumeId: string): Promise<EventManager<DriveEvent>> {
98
+ if (!this.latestEventIdProvider) {
99
+ throw new Error(
100
+ 'Cannot subscribe to events without passing a latestEventIdProvider in ProtonDriveClient initialization',
101
+ );
68
102
  }
69
- const eventSubscription = this.coreEvents.addListener(callback);
70
- await this.coreEvents.start();
71
- return eventSubscription;
72
- }
73
103
 
74
- private sendNumberOfVolumeSubscriptionsToTelemetry() {
75
- this.telemetry.logEvent({
76
- eventName: 'volumeEventsSubscriptionsChanged',
77
- numberOfVolumeSubscriptions: Object.keys(this.volumeEventManagers).length,
78
- });
79
- }
104
+ this.logger.debug(`Creating volume event manager for volume ${volumeId}`);
105
+ const volumeEventManager = new VolumeEventManager(this.logger, this.apiService, volumeId);
80
106
 
81
- private async createVolumeEventManager(volumeId: string): Promise<EventManager<DriveEvent>> {
82
- if (this.latestEventIdProvider === null || this.latestEventIdProvider === undefined) {
83
- throw new Error('Cannot subscribe to events without passing a latestEventIdProvider in ProtonDriveClient initialization');
84
- }
85
107
  const isOwnVolume = await this.shareManagement.isOwnVolume(volumeId);
86
108
  const pollingInterval = this.getDefaultVolumePollingInterval(isOwnVolume);
87
- const volumeEventManager = new VolumeEventManager(this.logger, this.apiService, volumeId);
88
109
  const latestEventId = this.latestEventIdProvider.getLatestEventId(volumeId);
89
110
  const eventManager = new EventManager<DriveEvent>(volumeEventManager, pollingInterval, latestEventId);
111
+
90
112
  for (const listener of this.cacheEventListeners) {
91
113
  eventManager.addListener(listener);
92
114
  }
93
- await eventManager.start();
94
- this.volumeEventManagers[volumeId] = eventManager;
115
+
95
116
  return eventManager;
96
117
  }
97
118
 
98
119
  private getDefaultVolumePollingInterval(isOwnVolume: boolean): number {
99
- return isOwnVolume ? OWN_VOLUME_POLLING_INTERVAL : OTHER_VOLUME_POLLING_INTERVAL
120
+ return isOwnVolume ? OWN_VOLUME_POLLING_INTERVAL : OTHER_VOLUME_POLLING_INTERVAL;
121
+ }
122
+
123
+ private sendNumberOfVolumeSubscriptionsToTelemetry() {
124
+ this.telemetry.logEvent({
125
+ eventName: 'volumeEventsSubscriptionsChanged',
126
+ numberOfVolumeSubscriptions: Object.keys(this.volumeEventManagers).length,
127
+ });
100
128
  }
101
129
  }
@@ -1,4 +1,4 @@
1
- import { Logger } from "../../interface";
1
+ import { Logger } from '../../interface';
2
2
 
3
3
  /**
4
4
  * Callback that accepts list of Drive events and flag whether no
@@ -27,11 +27,11 @@ export interface LatestEventIdProvider {
27
27
  * events to fetch, or whether the listener should refresh its state.
28
28
  */
29
29
  export type EventsListWithStatus<T> = {
30
- latestEventId: string,
31
- more: boolean,
32
- refresh: boolean,
33
- events: T[],
34
- }
30
+ latestEventId: string;
31
+ more: boolean;
32
+ refresh: boolean;
33
+ events: T[];
34
+ };
35
35
 
36
36
  /**
37
37
  * Internal event interface representing a list of specific Drive events.
@@ -41,47 +41,55 @@ export type DriveEventsListWithStatus = EventsListWithStatus<DriveEvent>;
41
41
  type NodeCruEventType = DriveEventType.NodeCreated | DriveEventType.NodeUpdated;
42
42
  export type NodeEventType = NodeCruEventType | DriveEventType.NodeDeleted;
43
43
 
44
- export type NodeEvent = {
45
- type: NodeCruEventType,
46
- nodeUid: string,
47
- parentNodeUid?: string,
48
- isTrashed: boolean,
49
- isShared: boolean,
50
- treeEventScopeId: string,
51
- eventId: string,
52
- } | {
53
- type: DriveEventType.NodeDeleted,
54
- nodeUid: string,
55
- parentNodeUid?: string,
56
- treeEventScopeId: string,
57
- eventId: string,
58
- }
44
+ export type NodeEvent =
45
+ | {
46
+ type: NodeCruEventType;
47
+ nodeUid: string;
48
+ parentNodeUid?: string;
49
+ isTrashed: boolean;
50
+ isShared: boolean;
51
+ treeEventScopeId: string;
52
+ eventId: string;
53
+ }
54
+ | {
55
+ type: DriveEventType.NodeDeleted;
56
+ nodeUid: string;
57
+ parentNodeUid?: string;
58
+ treeEventScopeId: string;
59
+ eventId: string;
60
+ };
59
61
 
60
62
  export type FastForwardEvent = {
61
- type: DriveEventType.FastForward,
62
- treeEventScopeId: string,
63
- eventId: string,
64
- }
63
+ type: DriveEventType.FastForward;
64
+ treeEventScopeId: string;
65
+ eventId: string;
66
+ };
65
67
 
66
68
  export type TreeRefreshEvent = {
67
- type: DriveEventType.TreeRefresh,
68
- treeEventScopeId: string,
69
- eventId: string,
70
- }
69
+ type: DriveEventType.TreeRefresh;
70
+ treeEventScopeId: string;
71
+ eventId: string;
72
+ };
71
73
 
72
74
  export type TreeRemovalEvent = {
73
- type: DriveEventType.TreeRemove,
74
- treeEventScopeId: string,
75
- eventId: 'none',
76
- }
75
+ type: DriveEventType.TreeRemove;
76
+ treeEventScopeId: string;
77
+ eventId: 'none';
78
+ };
77
79
 
78
80
  export type SharedWithMeUpdated = {
79
- type: DriveEventType.SharedWithMeUpdated,
80
- eventId: string,
81
- treeEventScopeId: 'core',
82
- }
81
+ type: DriveEventType.SharedWithMeUpdated;
82
+ eventId: string;
83
+ treeEventScopeId: 'core';
84
+ };
83
85
 
84
- export type DriveEvent = NodeEvent | FastForwardEvent | TreeRefreshEvent | TreeRemovalEvent | FastForwardEvent | SharedWithMeUpdated;
86
+ export type DriveEvent =
87
+ | NodeEvent
88
+ | FastForwardEvent
89
+ | TreeRefreshEvent
90
+ | TreeRemovalEvent
91
+ | FastForwardEvent
92
+ | SharedWithMeUpdated;
85
93
 
86
94
  export enum DriveEventType {
87
95
  NodeCreated = 'node_created',
@@ -97,7 +105,7 @@ export enum DriveEventType {
97
105
  * This can happen if all shared nodes in that volume where unshared or if the
98
106
  * volume was deleted.
99
107
  */
100
- export class UnsubscribeFromEventsSourceError extends Error {};
108
+ export class UnsubscribeFromEventsSourceError extends Error {}
101
109
 
102
110
  export interface EventManagerInterface<T> {
103
111
  getLatestEventId(): Promise<string>;