@protontech/drive-sdk 0.0.10

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 (594) hide show
  1. package/README.md +17 -0
  2. package/dist/cache/index.d.ts +2 -0
  3. package/dist/cache/index.js +6 -0
  4. package/dist/cache/index.js.map +1 -0
  5. package/dist/cache/interface.d.ts +105 -0
  6. package/dist/cache/interface.js +3 -0
  7. package/dist/cache/interface.js.map +1 -0
  8. package/dist/cache/memoryCache.d.ts +18 -0
  9. package/dist/cache/memoryCache.js +78 -0
  10. package/dist/cache/memoryCache.js.map +1 -0
  11. package/dist/cache/memoryCache.test.d.ts +1 -0
  12. package/dist/cache/memoryCache.test.js +121 -0
  13. package/dist/cache/memoryCache.test.js.map +1 -0
  14. package/dist/config.d.ts +2 -0
  15. package/dist/config.js +11 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/crypto/driveCrypto.d.ts +209 -0
  18. package/dist/crypto/driveCrypto.js +364 -0
  19. package/dist/crypto/driveCrypto.js.map +1 -0
  20. package/dist/crypto/driveCrypto.test.d.ts +1 -0
  21. package/dist/crypto/driveCrypto.test.js +42 -0
  22. package/dist/crypto/driveCrypto.test.js.map +1 -0
  23. package/dist/crypto/hmac.d.ts +22 -0
  24. package/dist/crypto/hmac.js +44 -0
  25. package/dist/crypto/hmac.js.map +1 -0
  26. package/dist/crypto/index.d.ts +6 -0
  27. package/dist/crypto/index.js +13 -0
  28. package/dist/crypto/index.js.map +1 -0
  29. package/dist/crypto/interface.d.ts +125 -0
  30. package/dist/crypto/interface.js +10 -0
  31. package/dist/crypto/interface.js.map +1 -0
  32. package/dist/crypto/openPGPCrypto.d.ts +145 -0
  33. package/dist/crypto/openPGPCrypto.js +250 -0
  34. package/dist/crypto/openPGPCrypto.js.map +1 -0
  35. package/dist/crypto/utils.d.ts +2 -0
  36. package/dist/crypto/utils.js +35 -0
  37. package/dist/crypto/utils.js.map +1 -0
  38. package/dist/errors.d.ts +138 -0
  39. package/dist/errors.js +163 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/index.d.ts +24 -0
  42. package/dist/index.js +48 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/interface/account.d.ts +36 -0
  45. package/dist/interface/account.js +3 -0
  46. package/dist/interface/account.js.map +1 -0
  47. package/dist/interface/author.d.ts +26 -0
  48. package/dist/interface/author.js +3 -0
  49. package/dist/interface/author.js.map +1 -0
  50. package/dist/interface/devices.d.ts +18 -0
  51. package/dist/interface/devices.js +10 -0
  52. package/dist/interface/devices.js.map +1 -0
  53. package/dist/interface/download.d.ts +29 -0
  54. package/dist/interface/download.js +3 -0
  55. package/dist/interface/download.js.map +1 -0
  56. package/dist/interface/events.d.ts +26 -0
  57. package/dist/interface/events.js +11 -0
  58. package/dist/interface/events.js.map +1 -0
  59. package/dist/interface/httpClient.d.ts +38 -0
  60. package/dist/interface/httpClient.js +3 -0
  61. package/dist/interface/httpClient.js.map +1 -0
  62. package/dist/interface/index.d.ts +43 -0
  63. package/dist/interface/index.js +22 -0
  64. package/dist/interface/index.js.map +1 -0
  65. package/dist/interface/nodes.d.ts +161 -0
  66. package/dist/interface/nodes.js +21 -0
  67. package/dist/interface/nodes.js.map +1 -0
  68. package/dist/interface/result.d.ts +9 -0
  69. package/dist/interface/result.js +11 -0
  70. package/dist/interface/result.js.map +1 -0
  71. package/dist/interface/sharing.d.ts +73 -0
  72. package/dist/interface/sharing.js +9 -0
  73. package/dist/interface/sharing.js.map +1 -0
  74. package/dist/interface/telemetry.d.ts +61 -0
  75. package/dist/interface/telemetry.js +18 -0
  76. package/dist/interface/telemetry.js.map +1 -0
  77. package/dist/interface/thumbnail.d.ts +17 -0
  78. package/dist/interface/thumbnail.js +9 -0
  79. package/dist/interface/thumbnail.js.map +1 -0
  80. package/dist/interface/upload.d.ts +16 -0
  81. package/dist/interface/upload.js +3 -0
  82. package/dist/interface/upload.js.map +1 -0
  83. package/dist/internal/apiService/apiService.d.ts +51 -0
  84. package/dist/internal/apiService/apiService.js +305 -0
  85. package/dist/internal/apiService/apiService.js.map +1 -0
  86. package/dist/internal/apiService/apiService.test.d.ts +1 -0
  87. package/dist/internal/apiService/apiService.test.js +237 -0
  88. package/dist/internal/apiService/apiService.test.js.map +1 -0
  89. package/dist/internal/apiService/coreTypes.d.ts +24438 -0
  90. package/dist/internal/apiService/coreTypes.js +7 -0
  91. package/dist/internal/apiService/coreTypes.js.map +1 -0
  92. package/dist/internal/apiService/driveTypes.d.ts +11840 -0
  93. package/dist/internal/apiService/driveTypes.js +7 -0
  94. package/dist/internal/apiService/driveTypes.js.map +1 -0
  95. package/dist/internal/apiService/errorCodes.d.ts +30 -0
  96. package/dist/internal/apiService/errorCodes.js +11 -0
  97. package/dist/internal/apiService/errorCodes.js.map +1 -0
  98. package/dist/internal/apiService/errors.d.ts +19 -0
  99. package/dist/internal/apiService/errors.js +76 -0
  100. package/dist/internal/apiService/errors.js.map +1 -0
  101. package/dist/internal/apiService/errors.test.d.ts +1 -0
  102. package/dist/internal/apiService/errors.test.js +69 -0
  103. package/dist/internal/apiService/errors.test.js.map +1 -0
  104. package/dist/internal/apiService/index.d.ts +7 -0
  105. package/dist/internal/apiService/index.js +30 -0
  106. package/dist/internal/apiService/index.js.map +1 -0
  107. package/dist/internal/apiService/observerStream.d.ts +3 -0
  108. package/dist/internal/apiService/observerStream.js +15 -0
  109. package/dist/internal/apiService/observerStream.js.map +1 -0
  110. package/dist/internal/apiService/transformers.d.ts +4 -0
  111. package/dist/internal/apiService/transformers.js +48 -0
  112. package/dist/internal/apiService/transformers.js.map +1 -0
  113. package/dist/internal/batchLoading.d.ts +34 -0
  114. package/dist/internal/batchLoading.js +68 -0
  115. package/dist/internal/batchLoading.js.map +1 -0
  116. package/dist/internal/batchLoading.test.d.ts +1 -0
  117. package/dist/internal/batchLoading.test.js +50 -0
  118. package/dist/internal/batchLoading.test.js.map +1 -0
  119. package/dist/internal/devices/apiService.d.ts +38 -0
  120. package/dist/internal/devices/apiService.js +105 -0
  121. package/dist/internal/devices/apiService.js.map +1 -0
  122. package/dist/internal/devices/cryptoService.d.ts +30 -0
  123. package/dist/internal/devices/cryptoService.js +47 -0
  124. package/dist/internal/devices/cryptoService.js.map +1 -0
  125. package/dist/internal/devices/index.d.ts +15 -0
  126. package/dist/internal/devices/index.js +22 -0
  127. package/dist/internal/devices/index.js.map +1 -0
  128. package/dist/internal/devices/interface.d.ts +31 -0
  129. package/dist/internal/devices/interface.js +3 -0
  130. package/dist/internal/devices/interface.js.map +1 -0
  131. package/dist/internal/devices/manager.d.ts +18 -0
  132. package/dist/internal/devices/manager.js +103 -0
  133. package/dist/internal/devices/manager.js.map +1 -0
  134. package/dist/internal/devices/manager.test.d.ts +1 -0
  135. package/dist/internal/devices/manager.test.js +100 -0
  136. package/dist/internal/devices/manager.test.js.map +1 -0
  137. package/dist/internal/download/apiService.d.ts +27 -0
  138. package/dist/internal/download/apiService.js +110 -0
  139. package/dist/internal/download/apiService.js.map +1 -0
  140. package/dist/internal/download/controller.d.ts +8 -0
  141. package/dist/internal/download/controller.js +22 -0
  142. package/dist/internal/download/controller.js.map +1 -0
  143. package/dist/internal/download/cryptoService.d.ts +17 -0
  144. package/dist/internal/download/cryptoService.js +82 -0
  145. package/dist/internal/download/cryptoService.js.map +1 -0
  146. package/dist/internal/download/fileDownloader.d.ts +33 -0
  147. package/dist/internal/download/fileDownloader.js +226 -0
  148. package/dist/internal/download/fileDownloader.js.map +1 -0
  149. package/dist/internal/download/fileDownloader.test.d.ts +1 -0
  150. package/dist/internal/download/fileDownloader.test.js +324 -0
  151. package/dist/internal/download/fileDownloader.test.js.map +1 -0
  152. package/dist/internal/download/index.d.ts +10 -0
  153. package/dist/internal/download/index.js +82 -0
  154. package/dist/internal/download/index.js.map +1 -0
  155. package/dist/internal/download/interface.d.ts +35 -0
  156. package/dist/internal/download/interface.js +3 -0
  157. package/dist/internal/download/interface.js.map +1 -0
  158. package/dist/internal/download/queue.d.ts +5 -0
  159. package/dist/internal/download/queue.js +31 -0
  160. package/dist/internal/download/queue.js.map +1 -0
  161. package/dist/internal/download/telemetry.d.ts +14 -0
  162. package/dist/internal/download/telemetry.js +106 -0
  163. package/dist/internal/download/telemetry.js.map +1 -0
  164. package/dist/internal/download/telemetry.test.d.ts +1 -0
  165. package/dist/internal/download/telemetry.test.js +111 -0
  166. package/dist/internal/download/telemetry.test.js.map +1 -0
  167. package/dist/internal/download/thumbnailDownloader.d.ts +19 -0
  168. package/dist/internal/download/thumbnailDownloader.js +198 -0
  169. package/dist/internal/download/thumbnailDownloader.js.map +1 -0
  170. package/dist/internal/download/thumbnailDownloader.test.d.ts +1 -0
  171. package/dist/internal/download/thumbnailDownloader.test.js +179 -0
  172. package/dist/internal/download/thumbnailDownloader.test.js.map +1 -0
  173. package/dist/internal/errors.d.ts +6 -0
  174. package/dist/internal/errors.js +28 -0
  175. package/dist/internal/errors.js.map +1 -0
  176. package/dist/internal/errors.test.d.ts +1 -0
  177. package/dist/internal/errors.test.js +22 -0
  178. package/dist/internal/errors.test.js.map +1 -0
  179. package/dist/internal/events/apiService.d.ts +18 -0
  180. package/dist/internal/events/apiService.js +81 -0
  181. package/dist/internal/events/apiService.js.map +1 -0
  182. package/dist/internal/events/cache.d.ts +28 -0
  183. package/dist/internal/events/cache.js +67 -0
  184. package/dist/internal/events/cache.js.map +1 -0
  185. package/dist/internal/events/cache.test.d.ts +1 -0
  186. package/dist/internal/events/cache.test.js +43 -0
  187. package/dist/internal/events/cache.test.js.map +1 -0
  188. package/dist/internal/events/coreEventManager.d.ts +25 -0
  189. package/dist/internal/events/coreEventManager.js +63 -0
  190. package/dist/internal/events/coreEventManager.js.map +1 -0
  191. package/dist/internal/events/eventManager.d.ts +62 -0
  192. package/dist/internal/events/eventManager.js +159 -0
  193. package/dist/internal/events/eventManager.js.map +1 -0
  194. package/dist/internal/events/eventManager.test.d.ts +1 -0
  195. package/dist/internal/events/eventManager.test.js +120 -0
  196. package/dist/internal/events/eventManager.test.js.map +1 -0
  197. package/dist/internal/events/index.d.ts +50 -0
  198. package/dist/internal/events/index.js +117 -0
  199. package/dist/internal/events/index.js.map +1 -0
  200. package/dist/internal/events/interface.d.ts +47 -0
  201. package/dist/internal/events/interface.js +12 -0
  202. package/dist/internal/events/interface.js.map +1 -0
  203. package/dist/internal/events/volumeEventManager.d.ts +27 -0
  204. package/dist/internal/events/volumeEventManager.js +69 -0
  205. package/dist/internal/events/volumeEventManager.js.map +1 -0
  206. package/dist/internal/nodes/apiService.d.ts +54 -0
  207. package/dist/internal/nodes/apiService.js +308 -0
  208. package/dist/internal/nodes/apiService.js.map +1 -0
  209. package/dist/internal/nodes/apiService.test.d.ts +1 -0
  210. package/dist/internal/nodes/apiService.test.js +344 -0
  211. package/dist/internal/nodes/apiService.test.js.map +1 -0
  212. package/dist/internal/nodes/cache.d.ts +57 -0
  213. package/dist/internal/nodes/cache.js +226 -0
  214. package/dist/internal/nodes/cache.js.map +1 -0
  215. package/dist/internal/nodes/cache.test.d.ts +1 -0
  216. package/dist/internal/nodes/cache.test.js +160 -0
  217. package/dist/internal/nodes/cache.test.js.map +1 -0
  218. package/dist/internal/nodes/cryptoCache.d.ts +16 -0
  219. package/dist/internal/nodes/cryptoCache.js +50 -0
  220. package/dist/internal/nodes/cryptoCache.js.map +1 -0
  221. package/dist/internal/nodes/cryptoCache.test.d.ts +1 -0
  222. package/dist/internal/nodes/cryptoCache.test.js +79 -0
  223. package/dist/internal/nodes/cryptoCache.test.js.map +1 -0
  224. package/dist/internal/nodes/cryptoService.d.ts +75 -0
  225. package/dist/internal/nodes/cryptoService.js +409 -0
  226. package/dist/internal/nodes/cryptoService.js.map +1 -0
  227. package/dist/internal/nodes/cryptoService.test.d.ts +1 -0
  228. package/dist/internal/nodes/cryptoService.test.js +698 -0
  229. package/dist/internal/nodes/cryptoService.test.js.map +1 -0
  230. package/dist/internal/nodes/events.d.ts +91 -0
  231. package/dist/internal/nodes/events.js +243 -0
  232. package/dist/internal/nodes/events.js.map +1 -0
  233. package/dist/internal/nodes/events.test.d.ts +1 -0
  234. package/dist/internal/nodes/events.test.js +318 -0
  235. package/dist/internal/nodes/events.test.js.map +1 -0
  236. package/dist/internal/nodes/extendedAttributes.d.ts +23 -0
  237. package/dist/internal/nodes/extendedAttributes.js +117 -0
  238. package/dist/internal/nodes/extendedAttributes.js.map +1 -0
  239. package/dist/internal/nodes/extendedAttributes.test.d.ts +1 -0
  240. package/dist/internal/nodes/extendedAttributes.test.js +176 -0
  241. package/dist/internal/nodes/extendedAttributes.test.js.map +1 -0
  242. package/dist/internal/nodes/index.d.ts +26 -0
  243. package/dist/internal/nodes/index.js +40 -0
  244. package/dist/internal/nodes/index.js.map +1 -0
  245. package/dist/internal/nodes/index.test.d.ts +1 -0
  246. package/dist/internal/nodes/index.test.js +112 -0
  247. package/dist/internal/nodes/index.test.js.map +1 -0
  248. package/dist/internal/nodes/interface.d.ts +135 -0
  249. package/dist/internal/nodes/interface.js +3 -0
  250. package/dist/internal/nodes/interface.js.map +1 -0
  251. package/dist/internal/nodes/mediaTypes.d.ts +2 -0
  252. package/dist/internal/nodes/mediaTypes.js +13 -0
  253. package/dist/internal/nodes/mediaTypes.js.map +1 -0
  254. package/dist/internal/nodes/nodesAccess.d.ts +49 -0
  255. package/dist/internal/nodes/nodesAccess.js +332 -0
  256. package/dist/internal/nodes/nodesAccess.js.map +1 -0
  257. package/dist/internal/nodes/nodesAccess.test.d.ts +1 -0
  258. package/dist/internal/nodes/nodesAccess.test.js +487 -0
  259. package/dist/internal/nodes/nodesAccess.test.js.map +1 -0
  260. package/dist/internal/nodes/nodesManagement.d.ts +33 -0
  261. package/dist/internal/nodes/nodesManagement.js +222 -0
  262. package/dist/internal/nodes/nodesManagement.js.map +1 -0
  263. package/dist/internal/nodes/nodesManagement.test.d.ts +1 -0
  264. package/dist/internal/nodes/nodesManagement.test.js +178 -0
  265. package/dist/internal/nodes/nodesManagement.test.js.map +1 -0
  266. package/dist/internal/nodes/nodesRevisions.d.ts +18 -0
  267. package/dist/internal/nodes/nodesRevisions.js +55 -0
  268. package/dist/internal/nodes/nodesRevisions.js.map +1 -0
  269. package/dist/internal/nodes/validations.d.ts +4 -0
  270. package/dist/internal/nodes/validations.js +21 -0
  271. package/dist/internal/nodes/validations.js.map +1 -0
  272. package/dist/internal/photos/albums.d.ts +13 -0
  273. package/dist/internal/photos/albums.js +30 -0
  274. package/dist/internal/photos/albums.js.map +1 -0
  275. package/dist/internal/photos/apiService.d.ts +8 -0
  276. package/dist/internal/photos/apiService.js +18 -0
  277. package/dist/internal/photos/apiService.js.map +1 -0
  278. package/dist/internal/photos/cache.d.ts +6 -0
  279. package/dist/internal/photos/cache.js +15 -0
  280. package/dist/internal/photos/cache.js.map +1 -0
  281. package/dist/internal/photos/index.d.ts +9 -0
  282. package/dist/internal/photos/index.js +18 -0
  283. package/dist/internal/photos/index.js.map +1 -0
  284. package/dist/internal/photos/interface.d.ts +6 -0
  285. package/dist/internal/photos/interface.js +3 -0
  286. package/dist/internal/photos/interface.js.map +1 -0
  287. package/dist/internal/photos/photosTimeline.d.ts +10 -0
  288. package/dist/internal/photos/photosTimeline.js +20 -0
  289. package/dist/internal/photos/photosTimeline.js.map +1 -0
  290. package/dist/internal/sdkEvents.d.ts +12 -0
  291. package/dist/internal/sdkEvents.js +44 -0
  292. package/dist/internal/sdkEvents.js.map +1 -0
  293. package/dist/internal/sdkEvents.test.d.ts +1 -0
  294. package/dist/internal/sdkEvents.test.js +45 -0
  295. package/dist/internal/sdkEvents.test.js.map +1 -0
  296. package/dist/internal/shares/apiService.d.ts +51 -0
  297. package/dist/internal/shares/apiService.js +128 -0
  298. package/dist/internal/shares/apiService.js.map +1 -0
  299. package/dist/internal/shares/cache.d.ts +15 -0
  300. package/dist/internal/shares/cache.js +63 -0
  301. package/dist/internal/shares/cache.js.map +1 -0
  302. package/dist/internal/shares/cache.test.d.ts +1 -0
  303. package/dist/internal/shares/cache.test.js +54 -0
  304. package/dist/internal/shares/cache.test.js.map +1 -0
  305. package/dist/internal/shares/cryptoCache.d.ts +20 -0
  306. package/dist/internal/shares/cryptoCache.js +35 -0
  307. package/dist/internal/shares/cryptoCache.js.map +1 -0
  308. package/dist/internal/shares/cryptoCache.test.d.ts +1 -0
  309. package/dist/internal/shares/cryptoCache.test.js +58 -0
  310. package/dist/internal/shares/cryptoCache.test.js.map +1 -0
  311. package/dist/internal/shares/cryptoService.d.ts +42 -0
  312. package/dist/internal/shares/cryptoService.js +126 -0
  313. package/dist/internal/shares/cryptoService.js.map +1 -0
  314. package/dist/internal/shares/cryptoService.test.d.ts +1 -0
  315. package/dist/internal/shares/cryptoService.test.js +120 -0
  316. package/dist/internal/shares/cryptoService.test.js.map +1 -0
  317. package/dist/internal/shares/index.d.ts +15 -0
  318. package/dist/internal/shares/index.js +26 -0
  319. package/dist/internal/shares/index.js.map +1 -0
  320. package/dist/internal/shares/interface.d.ts +94 -0
  321. package/dist/internal/shares/interface.js +11 -0
  322. package/dist/internal/shares/interface.js.map +1 -0
  323. package/dist/internal/shares/manager.d.ts +68 -0
  324. package/dist/internal/shares/manager.js +186 -0
  325. package/dist/internal/shares/manager.js.map +1 -0
  326. package/dist/internal/shares/manager.test.d.ts +1 -0
  327. package/dist/internal/shares/manager.test.js +176 -0
  328. package/dist/internal/shares/manager.test.js.map +1 -0
  329. package/dist/internal/sharing/apiService.d.ts +80 -0
  330. package/dist/internal/sharing/apiService.js +325 -0
  331. package/dist/internal/sharing/apiService.js.map +1 -0
  332. package/dist/internal/sharing/cache.d.ts +37 -0
  333. package/dist/internal/sharing/cache.js +105 -0
  334. package/dist/internal/sharing/cache.js.map +1 -0
  335. package/dist/internal/sharing/cache.test.d.ts +1 -0
  336. package/dist/internal/sharing/cache.test.js +82 -0
  337. package/dist/internal/sharing/cache.test.js.map +1 -0
  338. package/dist/internal/sharing/cryptoService.d.ts +112 -0
  339. package/dist/internal/sharing/cryptoService.js +269 -0
  340. package/dist/internal/sharing/cryptoService.js.map +1 -0
  341. package/dist/internal/sharing/events.d.ts +57 -0
  342. package/dist/internal/sharing/events.js +153 -0
  343. package/dist/internal/sharing/events.js.map +1 -0
  344. package/dist/internal/sharing/events.test.d.ts +1 -0
  345. package/dist/internal/sharing/events.test.js +246 -0
  346. package/dist/internal/sharing/events.test.js.map +1 -0
  347. package/dist/internal/sharing/index.d.ts +20 -0
  348. package/dist/internal/sharing/index.js +30 -0
  349. package/dist/internal/sharing/index.js.map +1 -0
  350. package/dist/internal/sharing/interface.d.ts +169 -0
  351. package/dist/internal/sharing/interface.js +9 -0
  352. package/dist/internal/sharing/interface.js.map +1 -0
  353. package/dist/internal/sharing/sharingAccess.d.ts +32 -0
  354. package/dist/internal/sharing/sharingAccess.js +119 -0
  355. package/dist/internal/sharing/sharingAccess.js.map +1 -0
  356. package/dist/internal/sharing/sharingAccess.test.d.ts +1 -0
  357. package/dist/internal/sharing/sharingAccess.test.js +84 -0
  358. package/dist/internal/sharing/sharingAccess.test.js.map +1 -0
  359. package/dist/internal/sharing/sharingManagement.d.ts +43 -0
  360. package/dist/internal/sharing/sharingManagement.js +439 -0
  361. package/dist/internal/sharing/sharingManagement.js.map +1 -0
  362. package/dist/internal/sharing/sharingManagement.test.d.ts +1 -0
  363. package/dist/internal/sharing/sharingManagement.test.js +788 -0
  364. package/dist/internal/sharing/sharingManagement.test.js.map +1 -0
  365. package/dist/internal/uids.d.ts +38 -0
  366. package/dist/internal/uids.js +85 -0
  367. package/dist/internal/uids.js.map +1 -0
  368. package/dist/internal/upload/apiService.d.ts +65 -0
  369. package/dist/internal/upload/apiService.js +137 -0
  370. package/dist/internal/upload/apiService.js.map +1 -0
  371. package/dist/internal/upload/blockVerifier.d.ts +16 -0
  372. package/dist/internal/upload/blockVerifier.js +33 -0
  373. package/dist/internal/upload/blockVerifier.js.map +1 -0
  374. package/dist/internal/upload/chunkStreamReader.d.ts +13 -0
  375. package/dist/internal/upload/chunkStreamReader.js +46 -0
  376. package/dist/internal/upload/chunkStreamReader.js.map +1 -0
  377. package/dist/internal/upload/chunkStreamReader.test.d.ts +1 -0
  378. package/dist/internal/upload/chunkStreamReader.test.js +75 -0
  379. package/dist/internal/upload/chunkStreamReader.test.js.map +1 -0
  380. package/dist/internal/upload/controller.d.ts +8 -0
  381. package/dist/internal/upload/controller.js +25 -0
  382. package/dist/internal/upload/controller.js.map +1 -0
  383. package/dist/internal/upload/cryptoService.d.ts +29 -0
  384. package/dist/internal/upload/cryptoService.js +104 -0
  385. package/dist/internal/upload/cryptoService.js.map +1 -0
  386. package/dist/internal/upload/digests.d.ts +8 -0
  387. package/dist/internal/upload/digests.js +22 -0
  388. package/dist/internal/upload/digests.js.map +1 -0
  389. package/dist/internal/upload/fileUploader.d.ts +65 -0
  390. package/dist/internal/upload/fileUploader.js +463 -0
  391. package/dist/internal/upload/fileUploader.js.map +1 -0
  392. package/dist/internal/upload/fileUploader.test.d.ts +1 -0
  393. package/dist/internal/upload/fileUploader.test.js +393 -0
  394. package/dist/internal/upload/fileUploader.test.js.map +1 -0
  395. package/dist/internal/upload/index.d.ts +16 -0
  396. package/dist/internal/upload/index.js +77 -0
  397. package/dist/internal/upload/index.js.map +1 -0
  398. package/dist/internal/upload/interface.d.ts +117 -0
  399. package/dist/internal/upload/interface.js +3 -0
  400. package/dist/internal/upload/interface.js.map +1 -0
  401. package/dist/internal/upload/manager.d.ts +31 -0
  402. package/dist/internal/upload/manager.js +250 -0
  403. package/dist/internal/upload/manager.js.map +1 -0
  404. package/dist/internal/upload/manager.test.d.ts +1 -0
  405. package/dist/internal/upload/manager.test.js +349 -0
  406. package/dist/internal/upload/manager.test.js.map +1 -0
  407. package/dist/internal/upload/queue.d.ts +5 -0
  408. package/dist/internal/upload/queue.js +32 -0
  409. package/dist/internal/upload/queue.js.map +1 -0
  410. package/dist/internal/upload/telemetry.d.ts +15 -0
  411. package/dist/internal/upload/telemetry.js +111 -0
  412. package/dist/internal/upload/telemetry.js.map +1 -0
  413. package/dist/internal/upload/telemetry.test.d.ts +1 -0
  414. package/dist/internal/upload/telemetry.test.js +107 -0
  415. package/dist/internal/upload/telemetry.test.js.map +1 -0
  416. package/dist/internal/utils.d.ts +1 -0
  417. package/dist/internal/utils.js +13 -0
  418. package/dist/internal/utils.js.map +1 -0
  419. package/dist/internal/wait.d.ts +3 -0
  420. package/dist/internal/wait.js +28 -0
  421. package/dist/internal/wait.js.map +1 -0
  422. package/dist/internal/wait.test.d.ts +1 -0
  423. package/dist/internal/wait.test.js +21 -0
  424. package/dist/internal/wait.test.js.map +1 -0
  425. package/dist/protonDriveClient.d.ts +593 -0
  426. package/dist/protonDriveClient.js +768 -0
  427. package/dist/protonDriveClient.js.map +1 -0
  428. package/dist/protonDrivePhotosClient.d.ts +16 -0
  429. package/dist/protonDrivePhotosClient.js +46 -0
  430. package/dist/protonDrivePhotosClient.js.map +1 -0
  431. package/dist/telemetry.d.ts +187 -0
  432. package/dist/telemetry.js +297 -0
  433. package/dist/telemetry.js.map +1 -0
  434. package/dist/tests/logger.d.ts +2 -0
  435. package/dist/tests/logger.js +12 -0
  436. package/dist/tests/logger.js.map +1 -0
  437. package/dist/tests/telemetry.d.ts +2 -0
  438. package/dist/tests/telemetry.js +11 -0
  439. package/dist/tests/telemetry.js.map +1 -0
  440. package/dist/transformers.d.ts +17 -0
  441. package/dist/transformers.js +77 -0
  442. package/dist/transformers.js.map +1 -0
  443. package/dist/version.d.ts +1 -0
  444. package/dist/version.js +6 -0
  445. package/dist/version.js.map +1 -0
  446. package/package.json +49 -0
  447. package/src/cache/index.ts +2 -0
  448. package/src/cache/interface.ts +104 -0
  449. package/src/cache/memoryCache.test.ts +150 -0
  450. package/src/cache/memoryCache.ts +85 -0
  451. package/src/config.ts +9 -0
  452. package/src/crypto/driveCrypto.test.ts +45 -0
  453. package/src/crypto/driveCrypto.ts +696 -0
  454. package/src/crypto/hmac.ts +46 -0
  455. package/src/crypto/index.ts +6 -0
  456. package/src/crypto/interface.ts +230 -0
  457. package/src/crypto/openPGPCrypto.ts +398 -0
  458. package/src/crypto/utils.ts +40 -0
  459. package/src/errors.ts +168 -0
  460. package/src/index.ts +30 -0
  461. package/src/interface/account.ts +38 -0
  462. package/src/interface/author.ts +29 -0
  463. package/src/interface/devices.ts +21 -0
  464. package/src/interface/download.ts +32 -0
  465. package/src/interface/events.ts +30 -0
  466. package/src/interface/httpClient.ts +42 -0
  467. package/src/interface/index.ts +46 -0
  468. package/src/interface/nodes.ts +168 -0
  469. package/src/interface/result.ts +11 -0
  470. package/src/interface/sharing.ts +87 -0
  471. package/src/interface/telemetry.ts +107 -0
  472. package/src/interface/thumbnail.ts +14 -0
  473. package/src/interface/upload.ts +19 -0
  474. package/src/internal/apiService/apiService.test.ts +285 -0
  475. package/src/internal/apiService/apiService.ts +353 -0
  476. package/src/internal/apiService/coreTypes.ts +24439 -0
  477. package/src/internal/apiService/driveTypes.ts +11841 -0
  478. package/src/internal/apiService/errorCodes.ts +38 -0
  479. package/src/internal/apiService/errors.test.ts +63 -0
  480. package/src/internal/apiService/errors.ts +91 -0
  481. package/src/internal/apiService/index.ts +7 -0
  482. package/src/internal/apiService/observerStream.ts +10 -0
  483. package/src/internal/apiService/transformers.ts +45 -0
  484. package/src/internal/batchLoading.test.ts +58 -0
  485. package/src/internal/batchLoading.ts +74 -0
  486. package/src/internal/devices/apiService.ts +142 -0
  487. package/src/internal/devices/cryptoService.ts +65 -0
  488. package/src/internal/devices/index.ts +31 -0
  489. package/src/internal/devices/interface.ts +28 -0
  490. package/src/internal/devices/manager.test.ts +129 -0
  491. package/src/internal/devices/manager.ts +113 -0
  492. package/src/internal/download/apiService.ts +145 -0
  493. package/src/internal/download/controller.ts +22 -0
  494. package/src/internal/download/cryptoService.ts +96 -0
  495. package/src/internal/download/fileDownloader.test.ts +381 -0
  496. package/src/internal/download/fileDownloader.ts +266 -0
  497. package/src/internal/download/index.ts +122 -0
  498. package/src/internal/download/interface.ts +38 -0
  499. package/src/internal/download/queue.ts +30 -0
  500. package/src/internal/download/telemetry.test.ts +134 -0
  501. package/src/internal/download/telemetry.ts +115 -0
  502. package/src/internal/download/thumbnailDownloader.test.ts +226 -0
  503. package/src/internal/download/thumbnailDownloader.ts +250 -0
  504. package/src/internal/errors.test.ts +21 -0
  505. package/src/internal/errors.ts +28 -0
  506. package/src/internal/events/apiService.ts +87 -0
  507. package/src/internal/events/cache.test.ts +47 -0
  508. package/src/internal/events/cache.ts +80 -0
  509. package/src/internal/events/coreEventManager.ts +69 -0
  510. package/src/internal/events/eventManager.test.ts +139 -0
  511. package/src/internal/events/eventManager.ts +168 -0
  512. package/src/internal/events/index.ts +131 -0
  513. package/src/internal/events/interface.ts +51 -0
  514. package/src/internal/events/volumeEventManager.ts +74 -0
  515. package/src/internal/nodes/apiService.test.ts +394 -0
  516. package/src/internal/nodes/apiService.ts +455 -0
  517. package/src/internal/nodes/cache.test.ts +197 -0
  518. package/src/internal/nodes/cache.ts +240 -0
  519. package/src/internal/nodes/cryptoCache.test.ts +92 -0
  520. package/src/internal/nodes/cryptoCache.ts +47 -0
  521. package/src/internal/nodes/cryptoService.test.ts +814 -0
  522. package/src/internal/nodes/cryptoService.ts +550 -0
  523. package/src/internal/nodes/events.test.ts +383 -0
  524. package/src/internal/nodes/events.ts +271 -0
  525. package/src/internal/nodes/extendedAttributes.test.ts +177 -0
  526. package/src/internal/nodes/extendedAttributes.ts +180 -0
  527. package/src/internal/nodes/index.test.ts +135 -0
  528. package/src/internal/nodes/index.ts +52 -0
  529. package/src/internal/nodes/interface.ts +152 -0
  530. package/src/internal/nodes/mediaTypes.ts +10 -0
  531. package/src/internal/nodes/nodesAccess.test.ts +555 -0
  532. package/src/internal/nodes/nodesAccess.ts +360 -0
  533. package/src/internal/nodes/nodesManagement.test.ts +221 -0
  534. package/src/internal/nodes/nodesManagement.ts +272 -0
  535. package/src/internal/nodes/nodesRevisions.ts +58 -0
  536. package/src/internal/nodes/validations.ts +26 -0
  537. package/src/internal/photos/albums.ts +29 -0
  538. package/src/internal/photos/apiService.ts +16 -0
  539. package/src/internal/photos/cache.ts +11 -0
  540. package/src/internal/photos/index.ts +23 -0
  541. package/src/internal/photos/interface.ts +7 -0
  542. package/src/internal/photos/photosTimeline.ts +18 -0
  543. package/src/internal/sdkEvents.test.ts +55 -0
  544. package/src/internal/sdkEvents.ts +52 -0
  545. package/src/internal/shares/apiService.ts +176 -0
  546. package/src/internal/shares/cache.test.ts +58 -0
  547. package/src/internal/shares/cache.ts +64 -0
  548. package/src/internal/shares/cryptoCache.test.ts +70 -0
  549. package/src/internal/shares/cryptoCache.ts +35 -0
  550. package/src/internal/shares/cryptoService.test.ts +137 -0
  551. package/src/internal/shares/cryptoService.ts +143 -0
  552. package/src/internal/shares/index.ts +35 -0
  553. package/src/internal/shares/interface.ts +104 -0
  554. package/src/internal/shares/manager.test.ts +210 -0
  555. package/src/internal/shares/manager.ts +213 -0
  556. package/src/internal/sharing/apiService.ts +483 -0
  557. package/src/internal/sharing/cache.test.ts +99 -0
  558. package/src/internal/sharing/cache.ts +109 -0
  559. package/src/internal/sharing/cryptoService.ts +378 -0
  560. package/src/internal/sharing/events.test.ts +268 -0
  561. package/src/internal/sharing/events.ts +166 -0
  562. package/src/internal/sharing/index.ts +43 -0
  563. package/src/internal/sharing/interface.ts +177 -0
  564. package/src/internal/sharing/sharingAccess.test.ts +102 -0
  565. package/src/internal/sharing/sharingAccess.ts +133 -0
  566. package/src/internal/sharing/sharingManagement.test.ts +895 -0
  567. package/src/internal/sharing/sharingManagement.ts +521 -0
  568. package/src/internal/uids.ts +83 -0
  569. package/src/internal/upload/apiService.ts +243 -0
  570. package/src/internal/upload/blockVerifier.ts +40 -0
  571. package/src/internal/upload/chunkStreamReader.test.ts +89 -0
  572. package/src/internal/upload/chunkStreamReader.ts +49 -0
  573. package/src/internal/upload/controller.ts +25 -0
  574. package/src/internal/upload/cryptoService.ts +162 -0
  575. package/src/internal/upload/digests.ts +18 -0
  576. package/src/internal/upload/fileUploader.test.ts +513 -0
  577. package/src/internal/upload/fileUploader.ts +576 -0
  578. package/src/internal/upload/index.ts +126 -0
  579. package/src/internal/upload/interface.ts +128 -0
  580. package/src/internal/upload/manager.test.ts +390 -0
  581. package/src/internal/upload/manager.ts +320 -0
  582. package/src/internal/upload/queue.ts +31 -0
  583. package/src/internal/upload/telemetry.test.ts +129 -0
  584. package/src/internal/upload/telemetry.ts +121 -0
  585. package/src/internal/utils.ts +9 -0
  586. package/src/internal/wait.test.ts +21 -0
  587. package/src/internal/wait.ts +26 -0
  588. package/src/protonDriveClient.ts +861 -0
  589. package/src/protonDrivePhotosClient.ts +56 -0
  590. package/src/telemetry.ts +346 -0
  591. package/src/tests/logger.ts +10 -0
  592. package/src/tests/telemetry.ts +9 -0
  593. package/src/transformers.ts +98 -0
  594. package/src/version.ts +4 -0
@@ -0,0 +1,139 @@
1
+ import { getMockLogger } from "../../tests/logger";
2
+ import { NotFoundAPIError } from "../apiService";
3
+ import { EventManager } from "./eventManager";
4
+
5
+ jest.useFakeTimers();
6
+
7
+ describe("EventManager", () => {
8
+ let manager: EventManager<string>;
9
+
10
+ const getLastEventIdMock = jest.fn();
11
+ const getEventsMock = jest.fn();
12
+ const updateLatestEventIdMock = jest.fn();
13
+ const listenerMock = jest.fn();
14
+
15
+ beforeEach(() => {
16
+ jest.clearAllMocks();
17
+
18
+ getLastEventIdMock.mockImplementation(() => Promise.resolve("eventId1"));
19
+ getEventsMock.mockImplementation(() => Promise.resolve({
20
+ lastEventId: "eventId2",
21
+ more: false,
22
+ refresh: false,
23
+ events: ["event1", "event2"],
24
+ }));
25
+
26
+ manager = new EventManager(
27
+ getMockLogger(),
28
+ getLastEventIdMock,
29
+ getEventsMock,
30
+ updateLatestEventIdMock,
31
+ );
32
+ manager.addListener(listenerMock);
33
+ });
34
+
35
+ afterEach(async () => {
36
+ await manager.stop();
37
+ });
38
+
39
+ it("should get latest event ID on first run only", async () => {
40
+ await manager.start();
41
+ expect(getLastEventIdMock).toHaveBeenCalledTimes(1);
42
+ expect(getEventsMock).toHaveBeenCalledTimes(0);
43
+ expect(listenerMock).toHaveBeenCalledTimes(0);
44
+ expect(updateLatestEventIdMock).toHaveBeenCalledTimes(1);
45
+ expect(updateLatestEventIdMock).toHaveBeenCalledWith('eventId1');
46
+ });
47
+
48
+ it("should notify about events in the next run", async () => {
49
+ await manager.start();
50
+ expect(getLastEventIdMock).toHaveBeenCalledTimes(1);
51
+ expect(getEventsMock).toHaveBeenCalledTimes(0);
52
+ expect(listenerMock).toHaveBeenCalledTimes(0);
53
+ expect(updateLatestEventIdMock).toHaveBeenCalledTimes(1);
54
+ expect(updateLatestEventIdMock).toHaveBeenCalledWith('eventId1');
55
+ updateLatestEventIdMock.mockClear();
56
+ await jest.runOnlyPendingTimersAsync();
57
+ expect(getEventsMock).toHaveBeenCalledTimes(1);
58
+ expect(listenerMock).toHaveBeenCalledTimes(1);
59
+ expect(updateLatestEventIdMock).toHaveBeenCalledTimes(1);
60
+ expect(updateLatestEventIdMock).toHaveBeenCalledWith('eventId2');
61
+ });
62
+
63
+ it("should continue with more events", async () => {
64
+ getEventsMock.mockImplementation((lastEventId: string) => Promise.resolve({
65
+ lastEventId: lastEventId === "eventId1" ? "eventId2" : "eventId3",
66
+ more: lastEventId === "eventId1" ? true : false,
67
+ refresh: false,
68
+ events: lastEventId === "eventId1" ? ["event1", "event2"] : ["event3"],
69
+ }));
70
+ await manager.start();
71
+ await jest.runOnlyPendingTimersAsync();
72
+ expect(getEventsMock).toHaveBeenCalledTimes(2);
73
+ expect(listenerMock).toHaveBeenCalledTimes(2);
74
+ expect(listenerMock).toHaveBeenCalledWith(["event1", "event2"], false);
75
+ expect(listenerMock).toHaveBeenCalledWith(["event3"], false);
76
+ expect(updateLatestEventIdMock).toHaveBeenCalledTimes(3);
77
+ expect(updateLatestEventIdMock).toHaveBeenCalledWith('eventId1');
78
+ expect(updateLatestEventIdMock).toHaveBeenCalledWith('eventId2');
79
+ expect(updateLatestEventIdMock).toHaveBeenCalledWith('eventId3');
80
+ });
81
+
82
+ it("should refresh if event does not exist", async () => {
83
+ getEventsMock.mockImplementation(() => Promise.reject(new NotFoundAPIError('Event not found', 2501)));
84
+ await manager.start();
85
+ await jest.runOnlyPendingTimersAsync();
86
+ expect(getLastEventIdMock).toHaveBeenCalledTimes(2);
87
+ expect(listenerMock).toHaveBeenCalledTimes(1);
88
+ expect(listenerMock).toHaveBeenCalledWith([], true);
89
+ expect(updateLatestEventIdMock).toHaveBeenCalledTimes(1);
90
+ expect(updateLatestEventIdMock).toHaveBeenCalledWith('eventId1');
91
+ });
92
+
93
+ it("should retry on error", async () => {
94
+ let index = 0;
95
+ getEventsMock.mockImplementation(() => {
96
+ index++;
97
+ if (index <= 3) {
98
+ return Promise.reject(new Error("Error"));
99
+ }
100
+ return Promise.resolve({
101
+ lastEventId: "eventId2",
102
+ more: false,
103
+ refresh: false,
104
+ events: ["event1", "event2"],
105
+ });
106
+ });
107
+ await manager.start();
108
+ updateLatestEventIdMock.mockClear();
109
+
110
+ // First failure.
111
+ await jest.runOnlyPendingTimersAsync();
112
+ expect(listenerMock).toHaveBeenCalledTimes(0);
113
+ expect(manager.nextPollTimeout).toBe(30000);
114
+
115
+ // Second failure.
116
+ await jest.runOnlyPendingTimersAsync();
117
+ expect(listenerMock).toHaveBeenCalledTimes(0);
118
+ expect(manager.nextPollTimeout).toBe(60000);
119
+
120
+ // Third failure.
121
+ await jest.runOnlyPendingTimersAsync();
122
+ expect(listenerMock).toHaveBeenCalledTimes(0);
123
+ expect(manager.nextPollTimeout).toBe(90000);
124
+
125
+ // And now it passes.
126
+ await jest.runOnlyPendingTimersAsync();
127
+ expect(listenerMock).toHaveBeenCalledTimes(1);
128
+ expect(listenerMock).toHaveBeenCalledWith(["event1", "event2"], false);
129
+ expect(updateLatestEventIdMock).toHaveBeenCalledTimes(1);
130
+ expect(updateLatestEventIdMock).toHaveBeenCalledWith('eventId2');
131
+ });
132
+
133
+ it("should stop polling", async () => {
134
+ await manager.start();
135
+ await manager.stop();
136
+ await jest.runOnlyPendingTimersAsync();
137
+ expect(getEventsMock).toHaveBeenCalledTimes(0);
138
+ });
139
+ });
@@ -0,0 +1,168 @@
1
+ import { Logger } from "../../interface";
2
+ import { NotFoundAPIError } from "../apiService";
3
+ import { Events } from "./interface";
4
+
5
+ const DEFAULT_POLLING_INTERVAL_IN_SECONDS = 30;
6
+ const FIBONACCI_LIST = [1, 1, 2, 3, 5, 8, 13];
7
+
8
+ /**
9
+ * `fullRefresh` is true when the event manager has requested a full
10
+ * refresh of the data. That can happen if there is too many events
11
+ * to be processed or the last event ID is too old.
12
+ */
13
+ type Listener<T> = (events: T[], fullRefresh: boolean) => Promise<void>;
14
+
15
+ /**
16
+ * Event manager general helper that is responsible for fetching events
17
+ * from the server and notifying listeners about the events.
18
+ *
19
+ * The specific implementation of fetching the events from the API must
20
+ * be passed as dependency and can be used for any type of events that
21
+ * supports the same structure.
22
+ *
23
+ * The manager will not start fetching events until the `start` method is
24
+ * called. Once started, the manager will fetch events in a loop with
25
+ * a timeout between each fetch. The default timeout is 30 seconds and
26
+ * additional jitter is used in case of failure.
27
+ *
28
+ * Example of usage:
29
+ *
30
+ * ```typescript
31
+ * const manager = new EventManager(
32
+ * logger,
33
+ * () => apiService.getLatestEventId(),
34
+ * (eventId) => apiService.getEvents(eventId),
35
+ * );
36
+ *
37
+ * manager.addListener((events, fullRefresh) => {
38
+ * // Process the events
39
+ * });
40
+ *
41
+ * manager.start();
42
+ * ```
43
+ */
44
+ export class EventManager<T> {
45
+ private latestEventId?: string;
46
+ private timeoutHandle?: ReturnType<typeof setTimeout>;
47
+ private processPromise?: Promise<void>;
48
+ private listeners: Listener<T>[] = [];
49
+ private retryIndex: number = 0;
50
+
51
+ pollingIntervalInSeconds = DEFAULT_POLLING_INTERVAL_IN_SECONDS;
52
+
53
+ constructor(
54
+ private logger: Logger,
55
+ private getLatestEventId: () => Promise<string>,
56
+ private getEvents: (eventId: string) => Promise<Events<T>>,
57
+ private updateLatestEventId: (lastEventId: string) => Promise<void>,
58
+ ) {
59
+ this.logger = logger;
60
+ this.getLatestEventId = getLatestEventId;
61
+ this.getEvents = getEvents;
62
+ this.updateLatestEventId = updateLatestEventId;
63
+ }
64
+
65
+ addListener(callback: Listener<T>): void {
66
+ this.listeners.push(callback);
67
+ }
68
+
69
+ async start(): Promise<void> {
70
+ this.logger.info(`Starting event manager with polling interval ${this.pollingIntervalInSeconds} seconds`);
71
+ await this.stop();
72
+ this.processPromise = this.processEvents();
73
+ }
74
+
75
+ private async processEvents() {
76
+ try {
77
+ if (!this.latestEventId) {
78
+ this.latestEventId = await this.getLatestEventId();
79
+ await this.updateLatestEventId(this.latestEventId);
80
+ } else {
81
+ while (true) {
82
+ let result;
83
+ try {
84
+ result = await this.getEvents(this.latestEventId);
85
+ } catch (error: unknown) {
86
+ // If last event ID is not found, we need to refresh the data.
87
+ // Caller is notified via standard event update with refresh flag.
88
+ if (error instanceof NotFoundAPIError) {
89
+ this.logger.warn(`Last event ID not found, refreshing data`);
90
+ result = {
91
+ lastEventId: await this.getLatestEventId(),
92
+ more: false,
93
+ refresh: true,
94
+ events: [],
95
+ };
96
+ } else {
97
+ // Any other error is considered as a failure and we will retry
98
+ // with backoff policy.
99
+ throw error;
100
+ }
101
+ }
102
+ await this.notifyListeners(result);
103
+ if (result.lastEventId !== this.latestEventId) {
104
+ await this.updateLatestEventId(result.lastEventId);
105
+ this.latestEventId = result.lastEventId;
106
+ }
107
+ if (!result.more) {
108
+ break;
109
+ }
110
+ }
111
+ }
112
+ this.retryIndex = 0;
113
+ } catch (error: unknown) {
114
+ this.logger.error(`Failed to process events: ${error instanceof Error ? error.message : error} (retry ${this.retryIndex}, last event ID: ${this.latestEventId})`);
115
+ this.retryIndex++;
116
+ }
117
+
118
+ this.timeoutHandle = setTimeout(() => {
119
+ this.processPromise = this.processEvents();
120
+ }, this.nextPollTimeout);
121
+ };
122
+
123
+ private async notifyListeners(result: Events<T>): Promise<void> {
124
+ if (result.events.length === 0 && !result.refresh) {
125
+ return;
126
+ }
127
+ if (!this.listeners.length) {
128
+ return;
129
+ }
130
+
131
+ this.logger.debug(`Notifying listeners about ${result.events.length} events`);
132
+
133
+ for (const listener of this.listeners) {
134
+ try {
135
+ await listener(result.events, result.refresh);
136
+ } catch (error: unknown) {
137
+ this.logger.error(`Failed to process events: ${error instanceof Error ? error.message : error} (last event ID: ${result.lastEventId}, refresh: ${result.refresh})`);
138
+ throw error;
139
+ }
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Polling timeout is using exponential backoff with Fibonacci sequence.
145
+ *
146
+ * The timeout is public for testing purposes only.
147
+ */
148
+ get nextPollTimeout(): number {
149
+ const retryIndex = Math.min(this.retryIndex, FIBONACCI_LIST.length - 1);
150
+ return this.pollingIntervalInSeconds * 1000 * FIBONACCI_LIST[retryIndex];
151
+ }
152
+
153
+ async stop(): Promise<void> {
154
+ if (this.processPromise) {
155
+ this.logger.info(`Stopping event manager`);
156
+ try {
157
+ await this.processPromise;
158
+ } catch {}
159
+ }
160
+
161
+ if (!this.timeoutHandle) {
162
+ return;
163
+ }
164
+
165
+ clearTimeout(this.timeoutHandle);
166
+ this.timeoutHandle = undefined;
167
+ }
168
+ }
@@ -0,0 +1,131 @@
1
+ import { ProtonDriveEntitiesCache, Logger, ProtonDriveTelemetry } from "../../interface";
2
+ import { DriveAPIService } from "../apiService";
3
+ import { DriveListener } from "./interface";
4
+ import { EventsAPIService } from "./apiService";
5
+ import { EventsCache } from "./cache";
6
+ import { CoreEventManager } from "./coreEventManager";
7
+ import { VolumeEventManager } from "./volumeEventManager";
8
+
9
+ export type { DriveEvent, DriveListener } from "./interface";
10
+ export { DriveEventType } from "./interface";
11
+
12
+ const OWN_VOLUME_POLLING_INTERVAL = 30;
13
+ const OTHER_VOLUME_POLLING_INTERVAL = 60;
14
+
15
+ /**
16
+ * Service for listening to drive events. The service is responsible for
17
+ * managing the subscriptions to the events and notifying the listeners
18
+ * about the new events.
19
+ */
20
+ export class DriveEventsService {
21
+ private apiService: EventsAPIService;
22
+ private cache: EventsCache;
23
+ private subscribedToRemoteDataUpdates: boolean = false;
24
+ private listeners: DriveListener[] = [];
25
+ private coreEvents: CoreEventManager;
26
+ private volumesEvents: { [volumeId: string]: VolumeEventManager };
27
+ private logger: Logger;
28
+
29
+ constructor(private telemetry: ProtonDriveTelemetry, apiService: DriveAPIService, driveEntitiesCache: ProtonDriveEntitiesCache) {
30
+ this.telemetry = telemetry;
31
+ this.logger = telemetry.getLogger('events');
32
+ this.apiService = new EventsAPIService(apiService);
33
+ this.cache = new EventsCache(driveEntitiesCache);
34
+
35
+ // FIXME: Allow to pass own core events manager from the public interface.
36
+ this.coreEvents = new CoreEventManager(this.logger, this.apiService, this.cache);
37
+ this.volumesEvents = {};
38
+ }
39
+
40
+ /**
41
+ * Loads all the subscribed volumes (including core events) from the
42
+ * cache and starts listening to their events. Any additional volume
43
+ * that is subscribed to later will be automatically started.
44
+ */
45
+ async subscribeToRemoteDataUpdates(): Promise<void> {
46
+ if (this.subscribedToRemoteDataUpdates) {
47
+ return;
48
+ }
49
+
50
+ await this.loadSubscribedVolumeEventServices();
51
+ this.sendNumberOfVolumeSubscriptionsToTelemetry();
52
+
53
+ this.subscribedToRemoteDataUpdates = true;
54
+ await this.coreEvents.startSubscription();
55
+ await Promise.all(
56
+ Object.values(this.volumesEvents)
57
+ .map((volumeEvents) => volumeEvents.startSubscription())
58
+ );
59
+ }
60
+
61
+ /**
62
+ * Subscribe to given volume. The volume will be polled for events
63
+ * with the polling interval depending on the type of the volume.
64
+ * Own volumes are polled with highest frequency, while others are
65
+ * polled with lower frequency depending on the total number of
66
+ * subscriptions.
67
+ *
68
+ * @param isOwnVolume - Owned volumes are polled with higher frequency.
69
+ */
70
+ async listenToVolume(volumeId: string, isOwnVolume = false): Promise<void> {
71
+ await this.loadSubscribedVolumeEventServices();
72
+
73
+ if (this.volumesEvents[volumeId]) {
74
+ return;
75
+ }
76
+ this.logger.debug(`Creating volume event manager for volume ${volumeId}`);
77
+ const manager = this.createVolumeEventManager(volumeId, isOwnVolume);
78
+
79
+ // FIXME: Use dynamic algorithm to determine polling interval for non-own volumes.
80
+ manager.setPollingInterval(isOwnVolume ? OWN_VOLUME_POLLING_INTERVAL : OTHER_VOLUME_POLLING_INTERVAL);
81
+ if (this.subscribedToRemoteDataUpdates) {
82
+ await manager.startSubscription();
83
+ this.sendNumberOfVolumeSubscriptionsToTelemetry();
84
+ }
85
+ }
86
+
87
+ private async loadSubscribedVolumeEventServices() {
88
+ for (const volumeId of await this.cache.getSubscribedVolumeIds()) {
89
+ if (!this.volumesEvents[volumeId]) {
90
+ const isOwnVolume = await this.cache.isOwnVolume(volumeId) || false;
91
+ this.createVolumeEventManager(volumeId, isOwnVolume);
92
+ }
93
+ }
94
+ }
95
+
96
+ private sendNumberOfVolumeSubscriptionsToTelemetry() {
97
+ this.telemetry.logEvent({
98
+ eventName: 'volumeEventsSubscriptionsChanged',
99
+ numberOfVolumeSubscriptions: Object.keys(this.volumesEvents).length,
100
+ });
101
+ }
102
+
103
+ private createVolumeEventManager(volumeId: string, isOwnVolume: boolean): VolumeEventManager {
104
+ const manager = new VolumeEventManager(this.logger, this.apiService, this.cache, volumeId, isOwnVolume);
105
+ for (const listener of this.listeners) {
106
+ manager.addListener(listener);
107
+ }
108
+ this.volumesEvents[volumeId] = manager;
109
+ return manager;
110
+ }
111
+
112
+ /**
113
+ * Listen to the drive events. The listener will be called with the
114
+ * new events as they arrive.
115
+ *
116
+ * One call always provides events from withing the same volume. The
117
+ * second argument of the callback `fullRefreshVolumeId` is thus single
118
+ * ID and if multiple volumes must be fully refreshed, client will
119
+ * receive multiple calls.
120
+ */
121
+ addListener(callback: DriveListener): void {
122
+ // Add new listener to the list for any new event manager.
123
+ this.listeners.push(callback);
124
+
125
+ // Add new listener to all existings managers.
126
+ this.coreEvents.addListener(callback);
127
+ for (const volumeEvents of Object.values(this.volumesEvents)) {
128
+ volumeEvents.addListener(callback);
129
+ }
130
+ }
131
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Callback that accepts list of Drive events and flag whether no
3
+ * event should be processed, but rather full cache refresh should be
4
+ * performed.
5
+ *
6
+ * @param fullRefreshVolumeId - ID of the volume that should be fully refreshed.
7
+ */
8
+ export type DriveListener = (events: DriveEvent[], fullRefreshVolumeId?: string) => Promise<void>;
9
+
10
+ /**
11
+ * Generic internal event interface representing a list of events
12
+ * with metadata about the last event ID, whether there are more
13
+ * events to fetch, or whether the listener should refresh its state.
14
+ */
15
+ export type Events<T> = {
16
+ lastEventId: string,
17
+ more: boolean,
18
+ refresh: boolean,
19
+ events: T[],
20
+ }
21
+
22
+ /**
23
+ * Internal event interface representing a list of specific Drive events.
24
+ */
25
+ export type DriveEvents = Events<DriveEvent>;
26
+
27
+ export type DriveEvent = {
28
+ type: DriveEventType.NodeCreated | DriveEventType.NodeUpdated | DriveEventType.NodeUpdatedMetadata,
29
+ nodeUid: string,
30
+ parentNodeUid?: string,
31
+ isTrashed: boolean,
32
+ isShared: boolean,
33
+ isOwnVolume: boolean,
34
+ } | {
35
+ type: DriveEventType.NodeDeleted,
36
+ nodeUid: string,
37
+ parentNodeUid?: string,
38
+ isTrashed?: boolean,
39
+ isShared?: boolean,
40
+ isOwnVolume: boolean,
41
+ } | {
42
+ type: DriveEventType.ShareWithMeUpdated,
43
+ }
44
+
45
+ export enum DriveEventType {
46
+ NodeCreated = 'node_created',
47
+ NodeUpdated = 'node_updated',
48
+ NodeUpdatedMetadata = 'node_updated_metadata',
49
+ NodeDeleted = 'node_deleted',
50
+ ShareWithMeUpdated = 'share_with_me_updated',
51
+ }
@@ -0,0 +1,74 @@
1
+ import { Logger } from "../../interface";
2
+ import { LoggerWithPrefix } from "../../telemetry";
3
+ import { EventsAPIService } from "./apiService";
4
+ import { EventsCache } from "./cache";
5
+ import { DriveEvent, DriveListener } from "./interface";
6
+ import { EventManager } from "./eventManager";
7
+
8
+ /**
9
+ * Combines API and event manager to provide a service for listening to
10
+ * volume events. Volume events are all about nodes updates. Whenever
11
+ * there is update to the node metadata or content, the event is emitted.
12
+ */
13
+ export class VolumeEventManager {
14
+ private manager: EventManager<DriveEvent>;
15
+
16
+ constructor(logger: Logger, private apiService: EventsAPIService, private cache: EventsCache, private volumeId: string, isOwnVolume: boolean) {
17
+ this.apiService = apiService;
18
+ this.volumeId = volumeId;
19
+
20
+ this.manager = new EventManager(
21
+ new LoggerWithPrefix(logger, `volume ${volumeId}`),
22
+ () => this.getLastEventId(),
23
+ (eventId) => this.apiService.getVolumeEvents(volumeId, eventId, isOwnVolume),
24
+ (lastEventId) => this.cache.setLastEventId(volumeId, {
25
+ lastEventId,
26
+ pollingIntervalInSeconds: this.manager.pollingIntervalInSeconds,
27
+ isOwnVolume
28
+ }),
29
+ );
30
+ this.cache.getPollingIntervalInSeconds(volumeId)
31
+ .then((pollingIntervalInSeconds) => {
32
+ if (pollingIntervalInSeconds) {
33
+ this.manager.pollingIntervalInSeconds = pollingIntervalInSeconds;
34
+ }
35
+ })
36
+ .catch(() => {});
37
+ }
38
+
39
+ private async getLastEventId(): Promise<string> {
40
+ const lastEventId = await this.cache.getLastEventId(this.volumeId);
41
+ if (lastEventId) {
42
+ return lastEventId;
43
+ }
44
+ return this.apiService.getVolumeLatestEventId(this.volumeId);
45
+ }
46
+
47
+ /**
48
+ * There is a limit how many volume subscribtions can be active at
49
+ * the same time. The manager of all volume managers should set the
50
+ * intervals for each volume accordingly depending on the volume
51
+ * type or the total number of subscriptions.
52
+ */
53
+ setPollingInterval(pollingIntervalInSeconds: number): void {
54
+ this.manager.pollingIntervalInSeconds = pollingIntervalInSeconds;
55
+ }
56
+
57
+ async startSubscription(): Promise<void> {
58
+ await this.manager.start();
59
+ }
60
+
61
+ async stopSubscription(): Promise<void> {
62
+ await this.manager.stop();
63
+ }
64
+
65
+ addListener(callback: DriveListener): void {
66
+ this.manager.addListener(async (events, fullRefresh) => {
67
+ if (fullRefresh) {
68
+ await callback([], this.volumeId);
69
+ } else {
70
+ await callback(events);
71
+ }
72
+ });
73
+ }
74
+ }