@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,268 @@
1
+ import { getMockLogger } from "../../tests/logger";
2
+ import { DriveEvent, DriveEventType } from "../events";
3
+ import { NodesService, SharingType } from "./interface";
4
+ import { SharingCache } from "./cache";
5
+ import { handleSharedByMeNodes, handleSharedWithMeNodes } from "./events";
6
+ import { SharingAccess } from "./sharingAccess";
7
+
8
+ describe("handleSharedByMeNodes", () => {
9
+ let cache: SharingCache;
10
+ let nodesService: NodesService;
11
+
12
+ beforeEach(() => {
13
+ jest.clearAllMocks();
14
+
15
+ // @ts-expect-error No need to implement all methods for mocking
16
+ cache = {
17
+ addSharedByMeNodeUid: jest.fn(),
18
+ removeSharedByMeNodeUid: jest.fn(),
19
+ setSharedWithMeNodeUids: jest.fn(),
20
+ };
21
+ // @ts-expect-error No need to implement all methods for mocking
22
+ nodesService = {
23
+ getNode: jest.fn().mockResolvedValue({ uid: 'nodeUid', name: { ok: true, value: 'name' } }),
24
+ };
25
+ });
26
+
27
+ const testCases: {
28
+ title: string,
29
+ existingNodeUids: string[],
30
+ event: DriveEvent,
31
+ added: boolean,
32
+ removed: boolean,
33
+ }[] = [
34
+ {
35
+ title: "should add if new own shared node is created",
36
+ existingNodeUids: [],
37
+ event: {
38
+ type: DriveEventType.NodeCreated,
39
+ nodeUid: "nodeUid",
40
+ parentNodeUid: "parentUid",
41
+ isTrashed: false,
42
+ isShared: true,
43
+ isOwnVolume: true,
44
+ },
45
+ added: true,
46
+ removed: false,
47
+ },
48
+ {
49
+ title: "should not add if new shared node is not own",
50
+ existingNodeUids: [],
51
+ event: {
52
+ type: DriveEventType.NodeCreated,
53
+ nodeUid: "nodeUid",
54
+ parentNodeUid: "parentUid",
55
+ isTrashed: false,
56
+ isShared: true,
57
+ isOwnVolume: false,
58
+ },
59
+ added: false,
60
+ removed: false,
61
+ },
62
+ {
63
+ title: "should not add if new own node is not shared",
64
+ existingNodeUids: [],
65
+ event: {
66
+ type: DriveEventType.NodeCreated,
67
+ nodeUid: "nodeUid",
68
+ parentNodeUid: "parentUid",
69
+ isTrashed: false,
70
+ isShared: false,
71
+ isOwnVolume: true,
72
+ },
73
+ added: false,
74
+ removed: false,
75
+ },
76
+ {
77
+ title: "should add if own node is updated and shared",
78
+ existingNodeUids: [],
79
+ event: {
80
+ type: DriveEventType.NodeUpdated,
81
+ nodeUid: "nodeUid",
82
+ parentNodeUid: "parentUid",
83
+ isTrashed: false,
84
+ isShared: true,
85
+ isOwnVolume: true,
86
+ },
87
+ added: true,
88
+ removed: false,
89
+ },
90
+ {
91
+ title: "should add/update if shared node is updated",
92
+ existingNodeUids: ["nodeUid"],
93
+ event: {
94
+ type: DriveEventType.NodeUpdated,
95
+ nodeUid: "nodeUid",
96
+ parentNodeUid: "parentUid",
97
+ isTrashed: false,
98
+ isShared: true,
99
+ isOwnVolume: true,
100
+ },
101
+ added: true,
102
+ removed: false,
103
+ },
104
+ {
105
+ title: "should remove if shared node is un-shared",
106
+ existingNodeUids: ["nodeUid"],
107
+ event: {
108
+ type: DriveEventType.NodeUpdated,
109
+ nodeUid: "nodeUid",
110
+ parentNodeUid: "parentUid",
111
+ isTrashed: false,
112
+ isShared: false,
113
+ isOwnVolume: true,
114
+ },
115
+ added: false,
116
+ removed: true,
117
+ },
118
+ {
119
+ title: "should not remove if non-shared node is updated",
120
+ existingNodeUids: [],
121
+ event: {
122
+ type: DriveEventType.NodeUpdated,
123
+ nodeUid: "nodeUid",
124
+ parentNodeUid: "parentUid",
125
+ isTrashed: false,
126
+ isShared: false,
127
+ isOwnVolume: true,
128
+ },
129
+ added: false,
130
+ removed: false,
131
+ },
132
+ {
133
+ title: "should remove if shared node is deleted",
134
+ existingNodeUids: ["nodeUid"],
135
+ event: {
136
+ type: DriveEventType.NodeDeleted,
137
+ nodeUid: "nodeUid",
138
+ parentNodeUid: "parentUid",
139
+ isOwnVolume: true,
140
+ },
141
+ added: false,
142
+ removed: true,
143
+ },
144
+ {
145
+ title: "should not remove if non-shared node is deleted",
146
+ existingNodeUids: [],
147
+ event: {
148
+ type: DriveEventType.NodeDeleted,
149
+ nodeUid: "nodeUid",
150
+ parentNodeUid: "parentUid",
151
+ isOwnVolume: true,
152
+ },
153
+ added: false,
154
+ removed: false,
155
+ },
156
+ ];
157
+
158
+ describe("with listeners", () => {
159
+ testCases.map(({ title, existingNodeUids, event, added, removed }) => {
160
+ it(title, async () => {
161
+ cache.getSharedByMeNodeUids = jest.fn().mockResolvedValue(existingNodeUids);
162
+ const listener = jest.fn();
163
+ const listeners = [{ type: SharingType.SharedByMe, callback: listener }];
164
+
165
+ await handleSharedByMeNodes(getMockLogger(), event, cache, listeners, nodesService);
166
+
167
+ if (added) {
168
+ expect(cache.addSharedByMeNodeUid).toHaveBeenCalledWith("nodeUid");
169
+ expect(listener).toHaveBeenCalledWith(expect.objectContaining({ type: 'update', uid: 'nodeUid' }));
170
+ } else {
171
+ expect(cache.addSharedByMeNodeUid).not.toHaveBeenCalled();
172
+ }
173
+ if (removed) {
174
+ expect(cache.removeSharedByMeNodeUid).toHaveBeenCalledWith("nodeUid");
175
+ expect(listener).toHaveBeenCalledWith({ type: 'remove', uid: 'nodeUid' });
176
+ } else {
177
+ expect(cache.removeSharedByMeNodeUid).not.toHaveBeenCalled();
178
+ }
179
+ if (!added && !removed) {
180
+ expect(listener).not.toHaveBeenCalled();
181
+ }
182
+
183
+ expect(cache.setSharedWithMeNodeUids).not.toHaveBeenCalled();
184
+ });
185
+ });
186
+ });
187
+
188
+ describe("without listeners", () => {
189
+ testCases.map(({ title, existingNodeUids, event, added, removed }) => {
190
+ it(title, async () => {
191
+ cache.getSharedByMeNodeUids = jest.fn().mockResolvedValue(existingNodeUids);
192
+ const listener = jest.fn();
193
+ const listeners = [{ type: SharingType.sharedWithMe, callback: listener }];
194
+
195
+ await handleSharedByMeNodes(getMockLogger(), event, cache, listeners, nodesService);
196
+
197
+ if (added) {
198
+ expect(cache.addSharedByMeNodeUid).toHaveBeenCalledWith("nodeUid");
199
+ } else {
200
+ expect(cache.addSharedByMeNodeUid).not.toHaveBeenCalled();
201
+ }
202
+ if (removed) {
203
+ expect(cache.removeSharedByMeNodeUid).toHaveBeenCalledWith("nodeUid");
204
+ } else {
205
+ expect(cache.removeSharedByMeNodeUid).not.toHaveBeenCalled();
206
+ }
207
+
208
+ expect(listener).not.toHaveBeenCalled();
209
+ expect(cache.setSharedWithMeNodeUids).not.toHaveBeenCalled();
210
+ });
211
+ });
212
+ });
213
+ });
214
+
215
+ describe("handleSharedWithMeNodes", () => {
216
+ let cache: SharingCache;
217
+ let sharingAccess: SharingAccess;
218
+
219
+ beforeEach(() => {
220
+ jest.clearAllMocks();
221
+
222
+ // @ts-expect-error No need to implement all methods for mocking
223
+ cache = {
224
+ getSharedWithMeNodeUids: jest.fn(),
225
+ setSharedWithMeNodeUids: jest.fn(),
226
+ };
227
+ // @ts-expect-error No need to implement all methods for mocking
228
+ sharingAccess = {
229
+ iterateSharedNodesWithMe: jest.fn(),
230
+ };
231
+ });
232
+
233
+ it("should only update cache", async () => {
234
+ const event: DriveEvent = {
235
+ type: DriveEventType.ShareWithMeUpdated,
236
+ };
237
+
238
+ await handleSharedWithMeNodes(event, cache, [], sharingAccess);
239
+
240
+ expect(cache.setSharedWithMeNodeUids).toHaveBeenCalledWith(undefined);
241
+ expect(cache.getSharedWithMeNodeUids).not.toHaveBeenCalled();
242
+ expect(sharingAccess.iterateSharedNodesWithMe).not.toHaveBeenCalled();
243
+ });
244
+
245
+ it("should update cache and notify listener", async () => {
246
+ cache.getSharedWithMeNodeUids = jest.fn().mockResolvedValue(["nodeUid1", "nodeUid4"]);
247
+ sharingAccess.iterateSharedNodesWithMe = jest.fn().mockImplementation(async function* () {
248
+ yield { uid: "nodeUid1", name: { ok: true, value: "name1" } };
249
+ yield { uid: "nodeUid2", name: { ok: true, value: "name2" } };
250
+ yield { uid: "nodeUid3", name: { ok: true, value: "name3" } };
251
+ });
252
+ const listener = jest.fn();
253
+ const event: DriveEvent = {
254
+ type: DriveEventType.ShareWithMeUpdated,
255
+ };
256
+
257
+ await handleSharedWithMeNodes(event, cache, [{ type: SharingType.sharedWithMe, callback: listener }], sharingAccess);
258
+
259
+ expect(cache.setSharedWithMeNodeUids).toHaveBeenCalledWith(undefined);
260
+ expect(cache.getSharedWithMeNodeUids).toHaveBeenCalled();
261
+ expect(sharingAccess.iterateSharedNodesWithMe).toHaveBeenCalled();
262
+ expect(listener).toHaveBeenCalledTimes(4);
263
+ expect(listener).toHaveBeenCalledWith(expect.objectContaining({ type: 'update', uid: 'nodeUid1' }));
264
+ expect(listener).toHaveBeenCalledWith(expect.objectContaining({ type: 'update', uid: 'nodeUid2' }));
265
+ expect(listener).toHaveBeenCalledWith(expect.objectContaining({ type: 'update', uid: 'nodeUid3' }));
266
+ expect(listener).toHaveBeenCalledWith({ type: 'remove', uid: 'nodeUid4' });
267
+ });
268
+ });
@@ -0,0 +1,166 @@
1
+ import { NodeEventCallback, Logger } from "../../interface";
2
+ import { convertInternalNode } from "../../transformers";
3
+ import { DriveEventsService, DriveEvent, DriveEventType } from "../events";
4
+ import { SharingCache } from "./cache";
5
+ import { SharingType, NodesService } from "./interface";
6
+ import { SharingAccess } from "./sharingAccess";
7
+
8
+ type Listeners = {
9
+ type: SharingType,
10
+ callback: NodeEventCallback,
11
+ }[];
12
+
13
+ /**
14
+ * Provides both event handling and subscription mechanism for user.
15
+ *
16
+ * The service is responsible for handling events regarding sharing listing
17
+ * from the DriveEventsService, and for providing a subscription mechanism
18
+ * for the user to listen to updates of specific group of nodes, such as
19
+ * any update to list of shared with me nodes.
20
+ */
21
+ export class SharingEvents {
22
+ private listeners: Listeners = [];
23
+
24
+ constructor(logger: Logger, events: DriveEventsService, cache: SharingCache, nodesService: NodesService, sharingAccess: SharingAccess) {
25
+ events.addListener(async (events, fullRefreshVolumeId) => {
26
+ // Technically we need to refresh only the shared by me nodes for
27
+ // own volume, and shared with me nodes only when the event comes
28
+ // as core refresh event is converted to it.
29
+ // We can optimise later, for now we refresh everything to make
30
+ // it simpler. The cache is smart enough to not do unnecessary
31
+ // requests to the API and refresh on web is rare without
32
+ // persistant cache for now.
33
+ if (fullRefreshVolumeId) {
34
+ await cache.setSharedByMeNodeUids(undefined);
35
+ await cache.setSharedWithMeNodeUids(undefined);
36
+ return
37
+ }
38
+
39
+ for (const event of events) {
40
+ await handleSharedByMeNodes(logger, event, cache, this.listeners, nodesService);
41
+ await handleSharedWithMeNodes(event, cache, this.listeners, sharingAccess);
42
+ }
43
+ });
44
+ }
45
+
46
+ subscribeToSharedNodesByMe(callback: NodeEventCallback) {
47
+ this.listeners.push({ type: SharingType.SharedByMe, callback });
48
+ return () => {
49
+ this.listeners = this.listeners.filter(listener => listener.callback !== callback);
50
+ }
51
+ }
52
+
53
+ subscribeToSharedNodesWithMe(callback: NodeEventCallback) {
54
+ this.listeners.push({ type: SharingType.sharedWithMe, callback });
55
+ return () => {
56
+ this.listeners = this.listeners.filter(listener => listener.callback !== callback);
57
+ }
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Update cache and notify listeners accordingly for any updates
63
+ * to nodes that are shared by me.
64
+ *
65
+ * Any node create or update that is being shared, is automatically
66
+ * added to the cache and the listeners are notified about the
67
+ * update of the node.
68
+ *
69
+ * Any node delete or update that is not being shared, and the cache
70
+ * includes the node, is removed from the cache and the listeners are
71
+ * notified about the removal of the node.
72
+ *
73
+ * @throws Only if the client's callback throws.
74
+ */
75
+ export async function handleSharedByMeNodes(logger: Logger, event: DriveEvent, cache: SharingCache, listeners: Listeners, nodesService: NodesService) {
76
+ if (event.type === DriveEventType.ShareWithMeUpdated || !event.isOwnVolume) {
77
+ return;
78
+ }
79
+
80
+ const subscribedListeners = listeners.filter(({ type }) => type === SharingType.SharedByMe);
81
+
82
+ if ([DriveEventType.NodeCreated, DriveEventType.NodeUpdated, DriveEventType.NodeUpdatedMetadata].includes(event.type) && event.isShared) {
83
+ try {
84
+ await cache.addSharedByMeNodeUid(event.nodeUid);
85
+ } catch (error: unknown) {
86
+ logger.error(`Skipping shared by me node cache update`, error);
87
+ }
88
+ if (subscribedListeners.length) {
89
+ let node;
90
+ try {
91
+ node = await nodesService.getNode(event.nodeUid);
92
+ } catch (error: unknown) {
93
+ logger.error(`Skipping shared by me node update event to listener`, error);
94
+ return;
95
+ }
96
+ subscribedListeners.forEach(({ callback }) => callback({ type: 'update', uid: node.uid, node: convertInternalNode(node) }));
97
+ }
98
+ }
99
+
100
+ if (
101
+ ((event.type === DriveEventType.NodeUpdated || event.type === DriveEventType.NodeUpdatedMetadata) && !event.isShared)
102
+ || event.type === DriveEventType.NodeDeleted
103
+ ) {
104
+ let nodeWasShared = false;
105
+ try {
106
+ const cachedNodeUids = await cache.getSharedByMeNodeUids();
107
+ nodeWasShared = cachedNodeUids.includes(event.nodeUid);
108
+ } catch {
109
+ // Cache can be empty.
110
+ }
111
+
112
+ if (nodeWasShared) {
113
+ try {
114
+ await cache.removeSharedByMeNodeUid(event.nodeUid);
115
+ } catch (error: unknown) {
116
+ logger.error(`Skipping shared by me node cache remove`, error);
117
+ }
118
+ subscribedListeners.forEach(({ callback }) => callback({ type: 'remove', uid: event.nodeUid }));
119
+ }
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Update cache and notify listeners accordingly for any updates
125
+ * to nodes that are shared with me.
126
+ *
127
+ * There is only one event type that is relevant for shared with me
128
+ * nodes, which is the ShareWithMeUpdated event. The event is triggered
129
+ * when the list of shared with me nodes is updated.
130
+ *
131
+ * The cache is cleared and re-populated fully when the client
132
+ * requests the list of shared with me, or is actively listening.
133
+ *
134
+ * If the client listenes to shared with me updates, the client receives
135
+ * update to the full list of shared with me nodes, including remove
136
+ * updates for nodes that are no longer shared with me, but was before.
137
+ *
138
+ * @throws Only if the client's callback throws.
139
+ */
140
+ export async function handleSharedWithMeNodes(event: DriveEvent, cache: SharingCache, listeners: Listeners, sharingAccess: SharingAccess) {
141
+ if (event.type !== DriveEventType.ShareWithMeUpdated) {
142
+ return;
143
+ }
144
+
145
+ let cachedNodeUids: string[] = [];
146
+ const subscribedListeners = listeners.filter(({ type }) => type === SharingType.sharedWithMe);
147
+ if (subscribedListeners.length) {
148
+ cachedNodeUids = await cache.getSharedWithMeNodeUids();
149
+ }
150
+
151
+ // Clearing the cache must be first, sharingAccess is no-op if cache is set.
152
+ await cache.setSharedWithMeNodeUids(undefined);
153
+
154
+ if (subscribedListeners.length) {
155
+ const nodeUids = [];
156
+ for await (const node of sharingAccess.iterateSharedNodesWithMe()) {
157
+ nodeUids.push(node.uid);
158
+ subscribedListeners.forEach(({ callback }) => callback({ type: 'update', uid: node.uid, node: convertInternalNode(node) }));
159
+ }
160
+ for (const nodeUid of cachedNodeUids) {
161
+ if (!nodeUids.includes(nodeUid)) {
162
+ subscribedListeners.forEach(({ callback }) => callback({ type: 'remove', uid: nodeUid }));
163
+ }
164
+ }
165
+ }
166
+ }
@@ -0,0 +1,43 @@
1
+ import { ProtonDriveAccount, ProtonDriveEntitiesCache, ProtonDriveTelemetry } from "../../interface";
2
+ import { DriveCrypto } from '../../crypto';
3
+ import { DriveAPIService } from "../apiService";
4
+ import { DriveEventsService } from "../events";
5
+ import { SharingAPIService } from "./apiService";
6
+ import { SharingCache } from "./cache";
7
+ import { SharingCryptoService } from "./cryptoService";
8
+ import { SharingEvents } from "./events";
9
+ import { SharingAccess } from "./sharingAccess";
10
+ import { SharingManagement } from "./sharingManagement";
11
+ import { SharesService, NodesService, NodesEvents } from "./interface";
12
+
13
+ /**
14
+ * Provides facade for the whole sharing module.
15
+ *
16
+ * The sharing module is responsible for handling invitations, bookmarks,
17
+ * standard shares, listing shared nodes, etc. It includes API communication,
18
+ * encryption, decryption, caching, and event handling.
19
+ */
20
+ export function initSharingModule(
21
+ telemetry: ProtonDriveTelemetry,
22
+ apiService: DriveAPIService,
23
+ driveEntitiesCache: ProtonDriveEntitiesCache,
24
+ account: ProtonDriveAccount,
25
+ crypto: DriveCrypto,
26
+ driveEvents: DriveEventsService,
27
+ sharesService: SharesService,
28
+ nodesService: NodesService,
29
+ nodesEvents: NodesEvents,
30
+ ) {
31
+ const api = new SharingAPIService(telemetry.getLogger('sharing-api'), apiService);
32
+ const cache = new SharingCache(driveEntitiesCache);
33
+ const cryptoService = new SharingCryptoService(crypto, account);
34
+ const sharingAccess = new SharingAccess(api, cache, cryptoService, sharesService, nodesService);
35
+ const sharingEvents = new SharingEvents(telemetry.getLogger('sharing-events'), driveEvents, cache, nodesService, sharingAccess);
36
+ const sharingManagement = new SharingManagement(telemetry.getLogger('sharing'), api, cryptoService, account, sharesService, nodesService, nodesEvents);
37
+
38
+ return {
39
+ access: sharingAccess,
40
+ events: sharingEvents,
41
+ management: sharingManagement,
42
+ };
43
+ }
@@ -0,0 +1,177 @@
1
+ import { NodeType, MemberRole, NonProtonInvitationState, MissingNode, ShareResult, PublicLink } from "../../interface";
2
+ import { PrivateKey, SessionKey } from "../../crypto";
3
+ import { EncryptedShare } from "../shares";
4
+ import { DecryptedNode } from "../nodes";
5
+
6
+ export enum SharingType {
7
+ SharedByMe = 'sharedByMe',
8
+ sharedWithMe = 'sharedWithMe',
9
+ }
10
+
11
+ /**
12
+ * Internal interface for creating new invitation.
13
+ */
14
+ export interface EncryptedInvitationRequest {
15
+ addedByEmail: string;
16
+ inviteeEmail: string;
17
+ base64KeyPacket: string;
18
+ base64KeyPacketSignature: string;
19
+ role: MemberRole;
20
+ }
21
+
22
+ /**
23
+ * Internal interface of existing invitation on the API.
24
+ *
25
+ * This interface is used only for managing the invitations. For listing
26
+ * invitations with node metadata, see `EncryptedInvitationWithNode`.
27
+ */
28
+ export interface EncryptedInvitation extends EncryptedInvitationRequest {
29
+ uid: string;
30
+ invitationTime: Date;
31
+ }
32
+
33
+ /**
34
+ * Internal interface of existing invitation with the share and node metadata.
35
+ *
36
+ * Invitation with node is used for listing shared nodes with me, so it includes
37
+ * what is being shared as well.
38
+ */
39
+ export interface EncryptedInvitationWithNode extends EncryptedInvitation {
40
+ share: {
41
+ armoredKey: string;
42
+ armoredPassphrase: string;
43
+ creatorEmail: string;
44
+ };
45
+ node: {
46
+ type: NodeType;
47
+ mediaType?: string;
48
+ encryptedName: string;
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Internal interface for creating new external invitation.
54
+ */
55
+ export interface EncryptedExternalInvitationRequest {
56
+ inviterAddressId: string;
57
+ inviteeEmail: string;
58
+ role: MemberRole;
59
+ base64Signature: string;
60
+ }
61
+
62
+ /**
63
+ * Internal interface of existing external invitation on the API.
64
+ */
65
+ export interface EncryptedExternalInvitation extends Omit<EncryptedExternalInvitationRequest, 'inviterAddressId'> {
66
+ uid: string;
67
+ invitationTime: Date;
68
+ addedByEmail: string;
69
+ state: NonProtonInvitationState;
70
+ }
71
+
72
+ /**
73
+ * Internal interface of existing member on the API.
74
+ */
75
+ export interface EncryptedMember {
76
+ uid: string;
77
+ invitationTime: Date;
78
+ addedByEmail: string;
79
+ inviteeEmail: string;
80
+ role: MemberRole;
81
+ base64KeyPacket: string;
82
+ base64KeyPacketSignature: string;
83
+ }
84
+
85
+ /**
86
+ * Internal interface of existing member with the share and node metadata.
87
+ */
88
+ export interface EncryptedBookmark {
89
+ tokenId: string;
90
+ creationTime: Date;
91
+ share: {
92
+ armoredKey: string;
93
+ armoredPassphrase: string;
94
+ };
95
+ url: {
96
+ encryptedUrlPassword?: string;
97
+ base64SharePasswordSalt: string;
98
+ };
99
+ node: {
100
+ type: NodeType;
101
+ mediaType?: string;
102
+ encryptedName: string;
103
+ armoredKey: string;
104
+ armoredNodePassphrase: string;
105
+ file: {
106
+ base64ContentKeyPacket?: string;
107
+ };
108
+ };
109
+ }
110
+
111
+ export interface EncryptedPublicLink {
112
+ uid: string,
113
+ creationTime: Date,
114
+ expirationTime?: Date,
115
+ role: MemberRole,
116
+ flags: number,
117
+ creatorEmail: string,
118
+ publicUrl: string,
119
+ armoredUrlPassword: string,
120
+ urlPasswordSalt: string,
121
+ base64SharePassphraseKeyPacket: string,
122
+ sharePassphraseSalt: string,
123
+ }
124
+
125
+ export interface EncryptedPublicLinkCrypto {
126
+ base64SharePasswordSalt: string,
127
+ base64SharePassphraseKeyPacket: string,
128
+ armoredPassword: string,
129
+ }
130
+
131
+ export interface ShareResultWithCreatorEmail extends ShareResult {
132
+ publicLink?: PublicLinkWithCreatorEmail;
133
+ }
134
+
135
+ export interface PublicLinkWithCreatorEmail extends PublicLink {
136
+ creatorEmail: string;
137
+ }
138
+
139
+
140
+ /**
141
+ * Interface describing the dependencies to the shares module.
142
+ */
143
+ export interface SharesService {
144
+ getMyFilesIDs(): Promise<{ volumeId: string }>,
145
+ loadEncryptedShare(shareId: string): Promise<EncryptedShare>,
146
+ getContextShareMemberEmailKey(shareId: string): Promise<{
147
+ email: string,
148
+ addressId: string,
149
+ addressKey: PrivateKey,
150
+ }>,
151
+ }
152
+
153
+ /**
154
+ * Interface describing the dependencies to the nodes module.
155
+ */
156
+ export interface NodesService {
157
+ getNode(nodeUid: string): Promise<DecryptedNode>,
158
+ getNodeKeys(nodeUid: string): Promise<{ key: PrivateKey }>,
159
+ getNodePrivateAndSessionKeys(nodeUid: string): Promise<{
160
+ key: PrivateKey,
161
+ passphraseSessionKey: SessionKey,
162
+ nameSessionKey: SessionKey,
163
+ }>,
164
+ getRootNodeEmailKey(nodeUid: string): Promise<{
165
+ email: string,
166
+ addressId: string,
167
+ addressKey: PrivateKey,
168
+ }>,
169
+ iterateNodes(nodeUids: string[], signal?: AbortSignal): AsyncGenerator<DecryptedNode | MissingNode>;
170
+ }
171
+
172
+ /**
173
+ * Interface describing the dependencies to the nodes module.
174
+ */
175
+ export interface NodesEvents {
176
+ nodeUpdated(partialNode: { uid: string, shareId: string | undefined, isShared: boolean }): Promise<void>,
177
+ }