@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,250 @@
1
+ import { c } from 'ttag';
2
+
3
+ import { NodeType, ThumbnailType, ProtonDriveTelemetry, Logger, ThumbnailResult } from "../../interface";
4
+ import { ValidationError } from '../../errors';
5
+ import { LoggerWithPrefix } from '../../telemetry';
6
+ import { DownloadAPIService } from "./apiService";
7
+ import { DownloadCryptoService } from "./cryptoService";
8
+ import { NodesService } from "./interface";
9
+ import { getErrorMessage } from '../errors';
10
+
11
+ /**
12
+ * Maximum number of thumbnails that can be downloaded at the same time.
13
+ */
14
+ const MAX_DOWNLOAD_THUMBNAILS = 10;
15
+
16
+ /**
17
+ * Maximum number of retries for thumbnail download and decryption.
18
+ */
19
+ const MAX_THUMBNAIL_DOWNLOAD_ATTEMPTS = 2;
20
+
21
+ export class ThumbnailDownloader {
22
+ private logger: Logger;
23
+
24
+ private batchThumbnailToNodeUids = new Map<string, string>();
25
+ private ongoingDownloads = new Map<string, Promise<void>>();
26
+ private bufferedThumbnails: (
27
+ { nodeUid: string, ok: true, thumbnail: Uint8Array } |
28
+ { nodeUid: string, ok: false, error: string }
29
+ )[] = [];
30
+
31
+ constructor(
32
+ telemetry: ProtonDriveTelemetry,
33
+ private nodesService: NodesService,
34
+ private apiService: DownloadAPIService,
35
+ private cryptoService: DownloadCryptoService,
36
+ ) {
37
+ this.logger = telemetry.getLogger("download");
38
+ this.nodesService = nodesService;
39
+ this.apiService = apiService;
40
+ this.cryptoService = cryptoService;
41
+ }
42
+
43
+ async *iterateThumbnails(
44
+ nodeUids: string[],
45
+ thumbnailType = ThumbnailType.Type1,
46
+ signal?: AbortSignal,
47
+ ): AsyncGenerator<ThumbnailResult> {
48
+ if (nodeUids.length === 0) {
49
+ return;
50
+ }
51
+
52
+ for await (const result of this.iterateThumbnailUids(nodeUids, thumbnailType, signal)) {
53
+ if (!result.ok) {
54
+ yield result;
55
+ continue;
56
+ }
57
+
58
+ this.batchThumbnailToNodeUids.set(result.thumbnailUid, result.nodeUid);
59
+ if (this.batchThumbnailToNodeUids.size >= MAX_DOWNLOAD_THUMBNAILS) {
60
+ await this.requestBatchedThumbnailDownloads(signal);
61
+ }
62
+
63
+ while (this.ongoingDownloads.size >= MAX_DOWNLOAD_THUMBNAILS) {
64
+ await Promise.race(this.ongoingDownloads.values());
65
+ yield* this.bufferedThumbnails;
66
+ this.bufferedThumbnails = [];
67
+ }
68
+ }
69
+
70
+ await this.requestBatchedThumbnailDownloads(signal);
71
+
72
+ while (this.ongoingDownloads.size > 0) {
73
+ await Promise.race(this.ongoingDownloads.values());
74
+ yield* this.bufferedThumbnails;
75
+ this.bufferedThumbnails = [];
76
+ }
77
+
78
+ yield* this.bufferedThumbnails;
79
+ this.bufferedThumbnails = [];
80
+ }
81
+
82
+ private async *iterateThumbnailUids(nodeUids: string[], thumbnailType: ThumbnailType, signal?: AbortSignal): AsyncGenerator<
83
+ { nodeUid: string, ok: true, thumbnailUid: string } |
84
+ { nodeUid: string, ok: false, error: string }
85
+ > {
86
+ for await (const node of this.nodesService.iterateNodes(nodeUids, signal)) {
87
+ if ('missingUid' in node) {
88
+ yield {
89
+ nodeUid: node.missingUid,
90
+ ok: false,
91
+ error: c("Error").t`Node not found`,
92
+ }
93
+ continue;
94
+ }
95
+ if (node.type !== NodeType.File) {
96
+ yield {
97
+ nodeUid: node.uid,
98
+ ok: false,
99
+ error: c("Error").t`Node is not a file`,
100
+ }
101
+ continue;
102
+ }
103
+
104
+ let thumbnail;
105
+ if (node.activeRevision?.ok) {
106
+ thumbnail = node.activeRevision.value.thumbnails?.find(
107
+ (t) => t.type === thumbnailType,
108
+ );
109
+ }
110
+ if (!thumbnail) {
111
+ yield {
112
+ nodeUid: node.uid,
113
+ ok: false,
114
+ error: c("Error").t`Node has no thumbnail`,
115
+ }
116
+ continue;
117
+ }
118
+
119
+ yield {
120
+ nodeUid: node.uid,
121
+ ok: true,
122
+ thumbnailUid: thumbnail.uid,
123
+ }
124
+ }
125
+ }
126
+
127
+ private async requestBatchedThumbnailDownloads(signal?: AbortSignal) {
128
+ if (this.batchThumbnailToNodeUids.size === 0) {
129
+ return;
130
+ }
131
+
132
+ this.logger.debug(`Downloading thumbnail batch of size ${this.batchThumbnailToNodeUids.size}`);
133
+
134
+ for await (const downloadResult of this.iterateThumbnailDownloads(signal)) {
135
+ if (!downloadResult.ok) {
136
+ this.bufferedThumbnails.push({
137
+ nodeUid: downloadResult.nodeUid,
138
+ ok: false,
139
+ error: downloadResult.error,
140
+ });
141
+ continue;
142
+ }
143
+
144
+ this.ongoingDownloads.set(
145
+ downloadResult.nodeUid,
146
+ downloadResult.downloadPromise
147
+ .then((thumbnail) => {
148
+ this.bufferedThumbnails.push({
149
+ nodeUid: downloadResult.nodeUid,
150
+ ok: true,
151
+ thumbnail,
152
+ });
153
+ })
154
+ .catch((error) => {
155
+ this.bufferedThumbnails.push({
156
+ nodeUid: downloadResult.nodeUid,
157
+ ok: false,
158
+ error: getErrorMessage(error),
159
+ });
160
+ })
161
+ .finally(() => {
162
+ this.ongoingDownloads.delete(downloadResult.nodeUid);
163
+ }),
164
+ );
165
+ }
166
+
167
+ this.batchThumbnailToNodeUids.clear();
168
+ }
169
+
170
+ private async *iterateThumbnailDownloads(signal?: AbortSignal): AsyncGenerator<
171
+ { nodeUid: string, ok: true, downloadPromise: Promise<Uint8Array> } |
172
+ { nodeUid: string, ok: false, error: string }
173
+ > {
174
+ const missingThumbnailUids = new Set(this.batchThumbnailToNodeUids.keys());
175
+
176
+ for await (const result of this.apiService.iterateThumbnails(
177
+ Array.from(this.batchThumbnailToNodeUids.keys()),
178
+ signal,
179
+ )) {
180
+ const nodeUid = this.batchThumbnailToNodeUids.get(result.uid);
181
+ if (!nodeUid) {
182
+ this.logger.warn(`Unexpected thumbnail UID ${result.uid} returned from API`);
183
+ continue;
184
+ }
185
+
186
+ missingThumbnailUids.delete(result.uid);
187
+
188
+ if (!result.ok) {
189
+ yield {
190
+ nodeUid,
191
+ ok: false,
192
+ error: result.error,
193
+ }
194
+ continue;
195
+ }
196
+
197
+ yield {
198
+ nodeUid,
199
+ ok: true,
200
+ downloadPromise: this.downloadThumbnail(nodeUid, result.bareUrl, result.token, signal),
201
+ }
202
+ }
203
+
204
+ for (const uid of missingThumbnailUids) {
205
+ const nodeUid = this.batchThumbnailToNodeUids.get(uid)!;
206
+ this.logger.warn(`Thumbnail UID ${uid} not found in API response`);
207
+ yield {
208
+ nodeUid,
209
+ ok: false,
210
+ error: c("Error").t`Thumbnail not found`,
211
+ }
212
+ }
213
+ }
214
+
215
+ private async downloadThumbnail(nodeUid: string, bareUrl: string, token: string, signal?: AbortSignal): Promise<Uint8Array> {
216
+ const logger = new LoggerWithPrefix(this.logger, `thumbnail ${token}`);
217
+
218
+ let decryptedBlock: Uint8Array | null = null;
219
+ let attempt = 0;
220
+
221
+ while (!decryptedBlock) {
222
+ logger.debug(`Downloading`);
223
+ attempt++;
224
+
225
+ try {
226
+ const [nodeKeys, encryptedBlock] = await Promise.all([
227
+ this.nodesService.getNodeKeys(nodeUid),
228
+ this.apiService.downloadBlock(bareUrl, token, undefined, signal),
229
+ ]);
230
+
231
+ if (!nodeKeys.contentKeyPacketSessionKey) {
232
+ throw new ValidationError(c("Error").t`File has no content key`);
233
+ }
234
+
235
+ logger.debug(`Decrypting`);
236
+ decryptedBlock = await this.cryptoService.decryptThumbnail(encryptedBlock, nodeKeys.contentKeyPacketSessionKey);
237
+ } catch (error: unknown) {
238
+ if (attempt <= MAX_THUMBNAIL_DOWNLOAD_ATTEMPTS) {
239
+ logger.warn(`Thumbnail download failed #${attempt}, retrying: ${getErrorMessage(error)}`);
240
+ continue;
241
+ }
242
+
243
+ logger.error(`Thumbnail download failed`, error);
244
+ throw error;
245
+ }
246
+ }
247
+
248
+ return decryptedBlock;
249
+ }
250
+ }
@@ -0,0 +1,21 @@
1
+ import { VERIFICATION_STATUS } from '../crypto';
2
+ import { getVerificationMessage } from './errors';
3
+
4
+ describe('getVerificationMessage', () => {
5
+ const testCases: [VERIFICATION_STATUS, string | undefined, boolean, string][] = [
6
+ [VERIFICATION_STATUS.NOT_SIGNED, 'type', false, 'Missing signature for type'],
7
+ [VERIFICATION_STATUS.NOT_SIGNED, undefined, false, 'Missing signature'],
8
+ [VERIFICATION_STATUS.NOT_SIGNED, 'type', true, 'Missing signature for type'],
9
+ [VERIFICATION_STATUS.NOT_SIGNED, undefined, true, 'Missing signature'],
10
+ [VERIFICATION_STATUS.SIGNED_AND_INVALID, 'type', false, 'Signature verification for type failed'],
11
+ [VERIFICATION_STATUS.SIGNED_AND_INVALID, undefined, false, 'Signature verification failed'],
12
+ [VERIFICATION_STATUS.SIGNED_AND_INVALID, 'type', true, 'Verification keys for type are not available'],
13
+ [VERIFICATION_STATUS.SIGNED_AND_INVALID, undefined, true, 'Verification keys are not available'],
14
+ ];
15
+
16
+ for (const [status, type, notAvailable, expected] of testCases) {
17
+ it(`returns correct message for status ${status} with type ${type} and notAvailable ${notAvailable}`, () => {
18
+ expect(getVerificationMessage(status, type, notAvailable)).toBe(expected);
19
+ });
20
+ }
21
+ });
@@ -0,0 +1,28 @@
1
+ import { c } from 'ttag';
2
+
3
+ import { VERIFICATION_STATUS } from "../crypto";
4
+
5
+ export function getErrorMessage(error: unknown): string {
6
+ return error instanceof Error ? error.message : c('Error').t`Unknown error`;
7
+ }
8
+
9
+ /**
10
+ * @param signatureType - Must be translated before calling this function.
11
+ */
12
+ export function getVerificationMessage(verified: VERIFICATION_STATUS, signatureType?: string, notAvailableVerificationKeys = false): string {
13
+ if (verified === VERIFICATION_STATUS.NOT_SIGNED) {
14
+ return signatureType
15
+ ? c('Error').t`Missing signature for ${signatureType}`
16
+ : c('Error').t`Missing signature`;
17
+ }
18
+
19
+ if (notAvailableVerificationKeys) {
20
+ return signatureType
21
+ ? c('Error').t`Verification keys for ${signatureType} are not available`
22
+ : c('Error').t`Verification keys are not available`;
23
+ }
24
+
25
+ return signatureType
26
+ ? c('Error').t`Signature verification for ${signatureType} failed`
27
+ : c('Error').t`Signature verification failed`;
28
+ }
@@ -0,0 +1,87 @@
1
+ import { Logger } from "../../interface";
2
+ import { DriveAPIService, drivePaths, corePaths } from "../apiService";
3
+ import { makeNodeUid } from "../uids";
4
+ import { DriveEvents, DriveEvent, DriveEventType } from "./interface";
5
+
6
+ type GetCoreLatestEventResponse = corePaths['/core/{_version}/events/latest']['get']['responses']['200']['content']['application/json'];
7
+ type GetCoreEventResponse = corePaths['/core/{_version}/events/{id}']['get']['responses']['200']['content']['application/json'];
8
+
9
+ type GetVolumeLatestEventResponse = drivePaths['/drive/volumes/{volumeID}/events/latest']['get']['responses']['200']['content']['application/json'];
10
+ type GetVokumeEventResponse = drivePaths['/drive/v2/volumes/{volumeID}/events/{eventID}']['get']['responses']['200']['content']['application/json'];
11
+
12
+ const VOLUME_EVENT_TYPE_MAP = {
13
+ 0: DriveEventType.NodeDeleted,
14
+ 1: DriveEventType.NodeCreated,
15
+ 2: DriveEventType.NodeUpdated,
16
+ 3: DriveEventType.NodeUpdatedMetadata,
17
+ }
18
+
19
+ /**
20
+ * Provides API communication for fetching events.
21
+ *
22
+ * The service is responsible for transforming local objects to API payloads
23
+ * and vice versa. It should not contain any business logic.
24
+ */
25
+ export class EventsAPIService {
26
+ constructor(private apiService: DriveAPIService, private logger?: Logger) {
27
+ this.apiService = apiService;
28
+ this.logger = logger;
29
+ }
30
+
31
+ async getCoreLatestEventId(): Promise<string> {
32
+ const result = await this.apiService.get<GetCoreLatestEventResponse>(`core/v4/events/latest`);
33
+ return result.EventID as string;
34
+ }
35
+
36
+ async getCoreEvents(eventId: string): Promise<DriveEvents> {
37
+ // TODO: Switch to v6 endpoint: DriveShareRefresh doesnt seem to be part of it.
38
+ const result = await this.apiService.get<GetCoreEventResponse>(`core/v5/events/${eventId}`);
39
+ const events: DriveEvent[] = result.DriveShareRefresh?.Action === 2 ? [
40
+ {
41
+ type: DriveEventType.ShareWithMeUpdated,
42
+ }
43
+ ] : [];
44
+
45
+ return {
46
+ lastEventId: result.EventID,
47
+ more: result.More === 1,
48
+ refresh: result.Refresh === 1,
49
+ events,
50
+ };
51
+ }
52
+
53
+ async getVolumeLatestEventId(volumeId: string): Promise<string> {
54
+ const result = await this.apiService.get<GetVolumeLatestEventResponse>(`drive/volumes/${volumeId}/events/latest`);
55
+ return result.EventID;
56
+ }
57
+
58
+ async getVolumeEvents(volumeId: string, eventId: string, isOwnVolume = false): Promise<DriveEvents> {
59
+ const result = await this.apiService.get<GetVokumeEventResponse>(`drive/v2/volumes/${volumeId}/events/${eventId}`);
60
+ return {
61
+ lastEventId: result.EventID,
62
+ more: result.More,
63
+ refresh: result.Refresh,
64
+ events: result.Events.map((event): DriveEvent => {
65
+ const type = VOLUME_EVENT_TYPE_MAP[event.EventType];
66
+ const uids = {
67
+ nodeUid: makeNodeUid(volumeId, event.Link.LinkID),
68
+ parentNodeUid: makeNodeUid(volumeId, event.Link.ParentLinkID as string),
69
+ }
70
+ // VOLUME_EVENT_TYPE_MAP will never return this event type.
71
+ // It is here to satisfy the type checker. It is safe to do.
72
+ if (type === DriveEventType.ShareWithMeUpdated) {
73
+ return {
74
+ type,
75
+ };
76
+ }
77
+ return {
78
+ type,
79
+ ...uids,
80
+ isTrashed: event.Link.IsTrashed,
81
+ isShared: event.Link.IsShared,
82
+ isOwnVolume,
83
+ };
84
+ }),
85
+ };
86
+ }
87
+ }
@@ -0,0 +1,47 @@
1
+ import { MemoryCache } from "../../cache";
2
+ import { EventsCache } from "./cache";
3
+
4
+ describe("EventsCache", () => {
5
+ let memoryCache: MemoryCache<string>;
6
+ let cache: EventsCache;
7
+
8
+ beforeEach(() => {
9
+ memoryCache = new MemoryCache();
10
+ cache = new EventsCache(memoryCache);
11
+ });
12
+
13
+ it("should store and retrieve last event ID", async () => {
14
+ const key = "volume1";
15
+ await cache.setLastEventId(key, { lastEventId: "eventId1", pollingIntervalInSeconds: 0, isOwnVolume: true });
16
+ await cache.setLastEventId(key, { lastEventId: "eventId2", pollingIntervalInSeconds: 0, isOwnVolume: true });
17
+ const result = await cache.getLastEventId(key);
18
+ expect(result).toBe("eventId2");
19
+ });
20
+
21
+ it("should store and retrieve polling interval", async () => {
22
+ const key = "volume1";
23
+ await cache.setLastEventId(key, { lastEventId: "lastEventId", pollingIntervalInSeconds: 10, isOwnVolume: true });
24
+ await cache.setLastEventId(key, { lastEventId: "lastEventId", pollingIntervalInSeconds: 20, isOwnVolume: true });
25
+ const result = await cache.getPollingIntervalInSeconds(key);
26
+ expect(result).toBe(20);
27
+ });
28
+
29
+ it("should store and retrieve subscribed volume IDs", async () => {
30
+ await cache.setLastEventId("volume1", { lastEventId: "lastEventId", pollingIntervalInSeconds: 0, isOwnVolume: true });
31
+ await cache.setLastEventId("volume2", { lastEventId: "lastEventId", pollingIntervalInSeconds: 0, isOwnVolume: true });
32
+ const result = await cache.getSubscribedVolumeIds();
33
+ expect(result).toStrictEqual(["volume1", "volume2"]);
34
+ });
35
+
36
+ it("should not fail if cache is empty", async () => {
37
+ const result = await cache.getLastEventId("volume1");
38
+ expect(result).toBe(undefined);
39
+ });
40
+
41
+ it("should call cache only once", async () => {
42
+ const spy = jest.spyOn(memoryCache, "getEntity");
43
+ await cache.getLastEventId("volume1");
44
+ await cache.getLastEventId("volume1");
45
+ expect(spy).toHaveBeenCalledTimes(1);
46
+ });
47
+ });
@@ -0,0 +1,80 @@
1
+ import { ProtonDriveEntitiesCache } from "../../interface";
2
+
3
+ type CachedEventsData = {
4
+ // Key is either a volume ID for volume events or 'core' for core events.
5
+ [key: string]: EventsData;
6
+ };
7
+
8
+ interface EventsData {
9
+ lastEventId: string;
10
+ pollingIntervalInSeconds: number;
11
+ isOwnVolume: boolean;
12
+ }
13
+
14
+ /**
15
+ * Provides caching for events IDs.
16
+ */
17
+ export class EventsCache {
18
+ /**
19
+ * Locally cached events data to avoid unnecessary reads from the cache.
20
+ * Data about last event ID or interval might be accessed often by events
21
+ * managers.
22
+ */
23
+ private events?: CachedEventsData;
24
+
25
+ constructor(private driveCache: ProtonDriveEntitiesCache) {
26
+ this.driveCache = driveCache;
27
+ }
28
+
29
+ async setLastEventId(volumeIdOrCore: string, eventsData: EventsData): Promise<void> {
30
+ const events = await this.getEvents();
31
+ events[volumeIdOrCore] = eventsData;
32
+ await this.cacheEvents(events);
33
+ }
34
+
35
+ async getLastEventId(volumeIdOrCore: string): Promise<string | undefined> {
36
+ const events = await this.getEvents();
37
+ if (events[volumeIdOrCore]) {
38
+ return events[volumeIdOrCore].lastEventId;
39
+ }
40
+ }
41
+
42
+ async getPollingIntervalInSeconds(volumeIdOrCore: string): Promise<number | undefined> {
43
+ const events = await this.getEvents();
44
+ if (events[volumeIdOrCore]) {
45
+ return events[volumeIdOrCore].pollingIntervalInSeconds;
46
+ }
47
+ }
48
+
49
+ async isOwnVolume(volumeIdOrCore: string): Promise<boolean | undefined> {
50
+ const events = await this.getEvents();
51
+ if (events[volumeIdOrCore]) {
52
+ return events[volumeIdOrCore].isOwnVolume;
53
+ }
54
+ }
55
+
56
+ async getSubscribedVolumeIds(): Promise<string[]> {
57
+ const events = await this.getEvents();
58
+ return Object.keys(events).filter((volumeIdOrCore) => volumeIdOrCore !== 'core');
59
+ }
60
+
61
+ private async getEvents(): Promise<CachedEventsData> {
62
+ if (!this.events) {
63
+ this.events = await this.getCachedEvents();
64
+ }
65
+ return this.events;
66
+ }
67
+
68
+ private async getCachedEvents(): Promise<CachedEventsData> {
69
+ try {
70
+ const events = await this.driveCache.getEntity('events');
71
+ return JSON.parse(events);
72
+ } catch {};
73
+ return {};
74
+ }
75
+
76
+ private async cacheEvents(events: CachedEventsData): Promise<void> {
77
+ this.events = events;
78
+ await this.driveCache.setEntity('events', JSON.stringify(events));
79
+ }
80
+ }
@@ -0,0 +1,69 @@
1
+ import { Logger } from "../../interface";
2
+ import { LoggerWithPrefix } from "../../telemetry";
3
+ import { EventsAPIService } from "./apiService";
4
+ import { EventsCache } from "./cache";
5
+ import { DriveEvent, DriveEventType } from "./interface";
6
+ import { EventManager } from "./eventManager";
7
+
8
+ /**
9
+ * Combines API and event manager to provide a service for listening to
10
+ * core events. Core events are events that are not specific to any volume.
11
+ * At this moment, Drive listenes only to shares with me updates from core
12
+ * events. Such even indicates that user was invited to the new share or
13
+ * that user's membership was removed from existing one and lost access.
14
+ *
15
+ * The client might be already using own core events, thus this service
16
+ * is here only in case the client is not connected to the Proton services
17
+ * with own implementation.
18
+ */
19
+ export class CoreEventManager {
20
+ private manager: EventManager<DriveEvent>;
21
+
22
+ constructor(logger: Logger, private apiService: EventsAPIService, private cache: EventsCache) {
23
+ this.apiService = apiService;
24
+
25
+ this.manager = new EventManager(
26
+ new LoggerWithPrefix(logger, `core`),
27
+ () => this.getLastEventId(),
28
+ (eventId) => this.apiService.getCoreEvents(eventId),
29
+ (lastEventId) => this.cache.setLastEventId('core', {
30
+ lastEventId,
31
+ pollingIntervalInSeconds: this.manager.pollingIntervalInSeconds,
32
+ isOwnVolume: false,
33
+ }),
34
+ );
35
+ }
36
+
37
+ private async getLastEventId(): Promise<string> {
38
+ const lastEventId = await this.cache.getLastEventId('core');
39
+ if (lastEventId) {
40
+ return lastEventId;
41
+ }
42
+ return this.apiService.getCoreLatestEventId();
43
+ }
44
+
45
+ async startSubscription(): Promise<void> {
46
+ await this.manager.start();
47
+ }
48
+
49
+ async stopSubscription(): Promise<void> {
50
+ await this.manager.stop();
51
+ }
52
+
53
+ addListener(callback: (events: DriveEvent[]) => Promise<void>): void {
54
+ this.manager.addListener(async (events, fullRefresh) => {
55
+ if (events) {
56
+ await callback(events);
57
+ }
58
+ if (fullRefresh) {
59
+ // Because only updates about shares that are shared with me
60
+ // are listened to from core events, in the case of core full
61
+ // refresh, we don't have to refresh anything more than this
62
+ // one specific event.
63
+ await callback([{
64
+ type: DriveEventType.ShareWithMeUpdated,
65
+ }]);
66
+ }
67
+ });
68
+ }
69
+ }