@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,38 @@
1
+ export const enum HTTPErrorCode {
2
+ OK = 200,
3
+ NOT_FOUND = 404,
4
+ TOO_MANY_REQUESTS = 429,
5
+ INTERNAL_SERVER_ERROR = 500,
6
+ }
7
+
8
+ export function isCodeOk(code: number): boolean {
9
+ return code === ErrorCode.OK || code === ErrorCode.OK_MANY || code === ErrorCode.OK_ASYNC;
10
+ }
11
+
12
+ export function isCodeOkAsync(code: number): boolean {
13
+ return code === ErrorCode.OK_ASYNC;
14
+ }
15
+
16
+ export const enum ErrorCode {
17
+ OK = 1000,
18
+ OK_MANY = 1001,
19
+ OK_ASYNC = 1002,
20
+ NOT_ENOUGH_PERMISSIONS = 2011,
21
+ NOT_ENOUGH_PERMISSIONS_TO_GRANT_PERMISSIONS = 2026,
22
+ // Following codes takes name from the API documentation.
23
+ ALREADY_EXISTS = 2500,
24
+ NOT_EXISTS = 2501,
25
+ INSUFFICIENT_QUOTA = 200001,
26
+ INSUFFICIENT_SPACE = 200002,
27
+ MAX_FILE_SIZE_FOR_FREE_USER = 200003,
28
+ MAX_PUBLIC_EDIT_MODE_FOR_FREE_USER = 200004,
29
+ INSUFFICIENT_VOLUME_QUOTA= 200100,
30
+ INSUFFICIENT_DEVICE_QUOTA= 200101,
31
+ ALREADY_MEMBER_OF_SHARE_IN_VOLUME_WITH_ANOTHER_ADDRESS = 200201,
32
+ TOO_MANY_CHILDREN = 200300,
33
+ NESTING_TOO_DEEP = 200301,
34
+ INSUFFICIENT_INVITATION_QUOTA = 200600,
35
+ INSUFFICIENT_SHARE_QUOTA = 200601,
36
+ INSUFFICIENT_SHARE_JOINED_QUOTA = 200602,
37
+ INSUFFICIENT_BOOKMARKS_QUOTA = 200800,
38
+ }
@@ -0,0 +1,63 @@
1
+ import { apiErrorFactory } from "./errors";
2
+ import * as errors from "./errors";
3
+ import { ErrorCode } from './errorCodes';
4
+
5
+ function mockAPIResponseAndResult(options: {
6
+ httpStatusCode?: number,
7
+ httpStatusText?: string,
8
+ code: number,
9
+ message?: string,
10
+ }) {
11
+ const {
12
+ httpStatusCode = 422,
13
+ httpStatusText = 'Unprocessable Entity',
14
+ code,
15
+ message = 'API error',
16
+ } = options;
17
+
18
+ const result = { Code: code, Error: message };
19
+ const response = new Response(JSON.stringify(result), { status: httpStatusCode, statusText: httpStatusText });
20
+
21
+ return { response, result };
22
+ }
23
+
24
+ describe("apiErrorFactory should return", () => {
25
+ it("generic APIHTTPError when there is no specifc body", () => {
26
+ const response = new Response('', { status: 404, statusText: 'Not found' });
27
+ const error = apiErrorFactory({ response });
28
+ expect(error).toBeInstanceOf(errors.APIHTTPError);
29
+ expect(error.message).toBe("Not found");
30
+ expect((error as errors.APIHTTPError).statusCode).toBe(404);
31
+ });
32
+
33
+ it("generic APIHTTPError when there 404 both in status code and body code", () => {
34
+ const error = apiErrorFactory(mockAPIResponseAndResult({ httpStatusCode: 404, httpStatusText: 'Path not found', code: 404, message: 'Not found' }));
35
+ expect(error).toBeInstanceOf(errors.APIHTTPError);
36
+ expect(error.message).toBe("Path not found");
37
+ expect((error as errors.APIHTTPError).statusCode).toBe(404);
38
+ });
39
+
40
+ it("generic APICodeError when there is body even if wrong", () => {
41
+ const result = {};
42
+ const response = new Response('', { status: 422 });
43
+ const error = apiErrorFactory({ response, result });
44
+ expectAPICodeError(error, 0, 'Unknown error');
45
+ });
46
+
47
+ it("generic APICodeError when there is body but not specific handle", () => {
48
+ const error = apiErrorFactory(mockAPIResponseAndResult({ code: 42, message: 'General error' }));
49
+ expectAPICodeError(error, 42, 'General error');
50
+ });
51
+
52
+ it("NotFoundAPIError when code is ErrorCode.NOT_EXISTS", () => {
53
+ const error = apiErrorFactory(mockAPIResponseAndResult({ code: ErrorCode.NOT_EXISTS, message: 'Not found' }));
54
+ expect(error).toBeInstanceOf(errors.NotFoundAPIError);
55
+ expectAPICodeError(error, ErrorCode.NOT_EXISTS, 'Not found');
56
+ });
57
+ });
58
+
59
+ function expectAPICodeError(error: Error, code: number, message: string) {
60
+ expect(error).toBeInstanceOf(errors.APICodeError);
61
+ expect(error.message).toBe(message);
62
+ expect((error as errors.APICodeError).code).toBe(code);
63
+ }
@@ -0,0 +1,91 @@
1
+ import { c } from 'ttag';
2
+
3
+ import { ServerError, ValidationError } from '../../errors';
4
+ import { ErrorCode, HTTPErrorCode } from './errorCodes';
5
+
6
+ export function apiErrorFactory({ response, result }: { response: Response, result?: unknown }): ServerError {
7
+ // Backend responses with 404 both in the response and body code.
8
+ // In such a case we want to stick to APIHTTPError to be very clear
9
+ // it is not NotFoundAPIError.
10
+ if (response.status === HTTPErrorCode.NOT_FOUND || !result) {
11
+ return new APIHTTPError(response.statusText, response.status);
12
+ }
13
+
14
+ const typedResult = result as {
15
+ Code?: number;
16
+ Error?: string;
17
+ exception?: string;
18
+ message?: string;
19
+ file?: string;
20
+ line?: number;
21
+ trace?: object;
22
+ };
23
+
24
+ const [code, message] = [typedResult.Code || 0, typedResult.Error || c('Error').t`Unknown error`];
25
+
26
+ const debug = typedResult.exception ? {
27
+ exception: typedResult.exception,
28
+ message: typedResult.message,
29
+ file: typedResult.file,
30
+ line: typedResult.line,
31
+ trace: typedResult.trace,
32
+ } : undefined;
33
+
34
+ switch (code) {
35
+ case ErrorCode.NOT_EXISTS:
36
+ return new NotFoundAPIError(message, code);
37
+ // ValidationError should be only when it is clearly user input error,
38
+ // otherwise it should be ServerError.
39
+ // Here we convert only general enough codes. Specific cases that are
40
+ // not clear from the code itself must be handled by each module
41
+ // separately.
42
+ case ErrorCode.NOT_ENOUGH_PERMISSIONS:
43
+ case ErrorCode.NOT_ENOUGH_PERMISSIONS_TO_GRANT_PERMISSIONS:
44
+ case ErrorCode.ALREADY_EXISTS:
45
+ case ErrorCode.INSUFFICIENT_QUOTA:
46
+ case ErrorCode.INSUFFICIENT_SPACE:
47
+ case ErrorCode.MAX_FILE_SIZE_FOR_FREE_USER:
48
+ case ErrorCode.MAX_PUBLIC_EDIT_MODE_FOR_FREE_USER:
49
+ case ErrorCode.INSUFFICIENT_VOLUME_QUOTA:
50
+ case ErrorCode.INSUFFICIENT_DEVICE_QUOTA:
51
+ case ErrorCode.ALREADY_MEMBER_OF_SHARE_IN_VOLUME_WITH_ANOTHER_ADDRESS:
52
+ case ErrorCode.TOO_MANY_CHILDREN:
53
+ case ErrorCode.NESTING_TOO_DEEP:
54
+ case ErrorCode.INSUFFICIENT_INVITATION_QUOTA:
55
+ case ErrorCode.INSUFFICIENT_SHARE_QUOTA:
56
+ case ErrorCode.INSUFFICIENT_SHARE_JOINED_QUOTA:
57
+ case ErrorCode.INSUFFICIENT_BOOKMARKS_QUOTA:
58
+ return new ValidationError(message, code);
59
+ default:
60
+ return new APICodeError(message, code, debug);
61
+ }
62
+ }
63
+
64
+ export class APIHTTPError extends ServerError {
65
+ name = 'APIHTTPError';
66
+
67
+ public readonly statusCode: number;
68
+
69
+ constructor(message: string, statusCode: number) {
70
+ super(message);
71
+ this.statusCode = statusCode;
72
+ }
73
+ }
74
+
75
+ export class APICodeError extends ServerError {
76
+ name = 'APICodeError';
77
+
78
+ public readonly code: number;
79
+
80
+ public readonly debug?: object;
81
+
82
+ constructor(message: string, code: number, debug?: object) {
83
+ super(message);
84
+ this.code = code;
85
+ this.debug = debug;
86
+ }
87
+ }
88
+
89
+ export class NotFoundAPIError extends APICodeError {
90
+ name = 'NotFoundAPIError';
91
+ }
@@ -0,0 +1,7 @@
1
+ export { DriveAPIService } from './apiService';
2
+ export type { paths as drivePaths } from './driveTypes';
3
+ export type { paths as corePaths } from './coreTypes';
4
+ export { HTTPErrorCode, ErrorCode, isCodeOk, isCodeOkAsync } from './errorCodes';
5
+ export { nodeTypeNumberToNodeType, permissionsToDirectMemberRole, memberRoleToPermission } from './transformers';
6
+ export { ObserverStream } from './observerStream';
7
+ export * from './errors';
@@ -0,0 +1,10 @@
1
+ export class ObserverStream extends TransformStream<Uint8Array, Uint8Array> {
2
+ constructor(fn?: (chunk: Uint8Array) => void) {
3
+ super({
4
+ transform(chunk, controller) {
5
+ fn?.(chunk);
6
+ controller.enqueue(chunk);
7
+ },
8
+ });
9
+ }
10
+ }
@@ -0,0 +1,45 @@
1
+ import { Logger, NodeType, MemberRole } from "../../interface";
2
+
3
+ export function nodeTypeNumberToNodeType(logger: Logger, nodeTypeNumber: number): NodeType {
4
+ switch (nodeTypeNumber) {
5
+ case 1:
6
+ return NodeType.Folder;
7
+ case 2:
8
+ return NodeType.File;
9
+ default:
10
+ logger.warn(`Unknown node type: ${nodeTypeNumber}`);
11
+ return NodeType.File;
12
+ }
13
+ }
14
+
15
+ export function permissionsToDirectMemberRole(logger: Logger, permissionsNumber?: number): MemberRole {
16
+ switch (permissionsNumber) {
17
+ case undefined:
18
+ return MemberRole.Inherited;
19
+ case 4:
20
+ return MemberRole.Viewer;
21
+ case 6:
22
+ return MemberRole.Editor;
23
+ case 22:
24
+ return MemberRole.Admin;
25
+ default:
26
+ // User have access to the data, thus at minimum it can view.
27
+ logger.warn(`Unknown sharing permissions: ${permissionsNumber}`);
28
+ return MemberRole.Viewer;
29
+ }
30
+ }
31
+
32
+ export function memberRoleToPermission(memberRole: MemberRole): 4 | 6 | 22 {
33
+ if (memberRole === MemberRole.Inherited) {
34
+ // This is developer error.
35
+ throw new Error("Cannot convert inherited role to permission");
36
+ }
37
+ switch (memberRole) {
38
+ case MemberRole.Viewer:
39
+ return 4;
40
+ case MemberRole.Editor:
41
+ return 6;
42
+ case MemberRole.Admin:
43
+ return 22;
44
+ }
45
+ }
@@ -0,0 +1,58 @@
1
+ import { BatchLoading } from './batchLoading';
2
+
3
+ describe("BatchLoading", () => {
4
+ let batchLoading: BatchLoading<string, string>;
5
+
6
+ beforeEach(() => {
7
+ jest.clearAllMocks();
8
+ });
9
+
10
+ it("should load in batches with loadItems", async () => {
11
+ const loadItems = jest.fn((items: string[]) => Promise.resolve(items.map((item) => `loaded:${item}`)));
12
+
13
+ batchLoading = new BatchLoading<string, string>({ loadItems, batchSize: 2 });
14
+
15
+ const result = [];
16
+ for (const item of ["a", "b", "c", "d", "e"]) {
17
+ for await (const loadedItem of batchLoading.load(item)) {
18
+ result.push(loadedItem);
19
+ }
20
+ }
21
+ for await (const loadedItem of batchLoading.loadRest()) {
22
+ result.push(loadedItem);
23
+ }
24
+
25
+
26
+ expect(result).toEqual(["loaded:a", "loaded:b", "loaded:c", "loaded:d", "loaded:e"]);
27
+ expect(loadItems).toHaveBeenCalledTimes(3);
28
+ expect(loadItems).toHaveBeenNthCalledWith(1, ["a", "b"]);
29
+ expect(loadItems).toHaveBeenNthCalledWith(2, ["c", "d"]);
30
+ expect(loadItems).toHaveBeenNthCalledWith(3, ["e"]);
31
+ });
32
+
33
+ it("should load in batches with iterateItems", async () => {
34
+ const iterateItems = jest.fn(async function* (items: string[]) {
35
+ for (const item of items) {
36
+ yield `loaded:${item}`;
37
+ }
38
+ });
39
+
40
+ batchLoading = new BatchLoading<string, string>({ iterateItems, batchSize: 2 });
41
+
42
+ const result = [];
43
+ for (const item of ["a", "b", "c", "d", "e"]) {
44
+ for await (const loadedItem of batchLoading.load(item)) {
45
+ result.push(loadedItem);
46
+ }
47
+ }
48
+ for await (const loadedItem of batchLoading.loadRest()) {
49
+ result.push(loadedItem);
50
+ }
51
+
52
+ expect(result).toEqual(["loaded:a", "loaded:b", "loaded:c", "loaded:d", "loaded:e"]);
53
+ expect(iterateItems).toHaveBeenCalledTimes(3);
54
+ expect(iterateItems).toHaveBeenNthCalledWith(1, ["a", "b"]);
55
+ expect(iterateItems).toHaveBeenNthCalledWith(2, ["c", "d"]);
56
+ expect(iterateItems).toHaveBeenNthCalledWith(3, ["e"]);
57
+ });
58
+ });
@@ -0,0 +1,74 @@
1
+ const DEFAULT_BATCH_LOADING = 10;
2
+
3
+ /**
4
+ * Helper class for batch loading items.
5
+ *
6
+ * The class is responsible for fetching items in batches. Any call to
7
+ * `load` will add the item to the batch (without fetching anything),
8
+ * and if the batch reaches the limit, it will fetch the items and yield
9
+ * them transparently to the caller.
10
+ *
11
+ * Example:
12
+ *
13
+ * ```typescript
14
+ * const batchLoading = new BatchLoading<string, DecryptedNode>({ loadItems: loadNodesCallback });
15
+ * for (const nodeUid of nodeUids) {
16
+ * for await (const node of batchLoading.load(nodeUid)) {
17
+ * console.log(node);
18
+ * }
19
+ * }
20
+ * for await (const node of batchLoading.loadRest()) {
21
+ * console.log(node);
22
+ * }
23
+ * ```
24
+ */
25
+ export class BatchLoading<ID, ITEM> {
26
+ private batchSize = DEFAULT_BATCH_LOADING;
27
+ private iterateItems: (ids: ID[]) => AsyncGenerator<ITEM>;
28
+
29
+ private itemsToFetch: ID[];
30
+
31
+ constructor(options: {
32
+ loadItems?: (ids: ID[]) => Promise<ITEM[]>,
33
+ iterateItems?: (ids: ID[]) => AsyncGenerator<ITEM>,
34
+ batchSize?: number,
35
+ }) {
36
+ this.itemsToFetch = [];
37
+
38
+ if (options.loadItems) {
39
+ const loadItems = options.loadItems;
40
+ this.iterateItems = async function* (ids: ID[]) {
41
+ for (const item of await loadItems(ids)) {
42
+ yield item;
43
+ }
44
+ }
45
+ } else if (options.iterateItems) {
46
+ this.iterateItems = options.iterateItems;
47
+ } else {
48
+ // This is developer error.
49
+ throw new Error('Either loadItems or iterateItems must be provided');
50
+ }
51
+
52
+ if (options.batchSize) {
53
+ this.batchSize = options.batchSize;
54
+ }
55
+ }
56
+
57
+ async *load(nodeUid: ID) {
58
+ this.itemsToFetch.push(nodeUid);
59
+
60
+ if (this.itemsToFetch.length >= this.batchSize) {
61
+ yield* this.iterateItems(this.itemsToFetch);
62
+ this.itemsToFetch = [];
63
+ }
64
+ }
65
+
66
+ async *loadRest() {
67
+ if (this.itemsToFetch.length === 0) {
68
+ return;
69
+ }
70
+
71
+ yield* this.iterateItems(this.itemsToFetch);
72
+ this.itemsToFetch = [];
73
+ }
74
+ }
@@ -0,0 +1,142 @@
1
+ import { DeviceType } from "../../interface";
2
+ import { DriveAPIService, drivePaths } from "../apiService";
3
+ import { makeDeviceUid, makeNodeUid, splitDeviceUid } from "../uids";
4
+ import { DeviceMetadata } from "./interface";
5
+
6
+ type GetDevicesResponse = drivePaths['/drive/devices']['get']['responses']['200']['content']['application/json'];
7
+
8
+ type PostCreateDeviceRequest = Extract<drivePaths['/drive/devices']['post']['requestBody'], { 'content': object }>['content']['application/json'];
9
+ type PostCreateDeviceResponse = drivePaths['/drive/devices']['post']['responses']['200']['content']['application/json'];
10
+
11
+ type PutUpdateDeviceRequest = Extract<drivePaths['/drive/devices/{deviceID}']['put']['requestBody'], { 'content': object }>['content']['application/json'];
12
+ type PutUpdateDeviceResponse = drivePaths['/drive/devices/{deviceID}']['put']['responses']['200']['content']['application/json'];
13
+
14
+ /**
15
+ * Provides API communication for managing devices.
16
+ *
17
+ * The service is responsible for transforming local objects to API payloads
18
+ * and vice versa. It should not contain any business logic.
19
+ */
20
+ export class DevicesAPIService {
21
+ constructor(private apiService: DriveAPIService) {
22
+ this.apiService = apiService;
23
+ }
24
+
25
+ async getDevices(signal?: AbortSignal): Promise<DeviceMetadata[]> {
26
+ const response = await this.apiService.get<GetDevicesResponse>('drive/devices', signal);
27
+ return response.Devices.map((device) => ({
28
+ uid: makeDeviceUid(device.Device.VolumeID, device.Device.DeviceID),
29
+ type: deviceTypeNumberToEnum(device.Device.Type),
30
+ rootFolderUid: makeNodeUid(device.Device.VolumeID, device.Share.LinkID),
31
+ creationTime: new Date(device.Device.CreateTime*1000),
32
+ lastSyncTime: device.Device.LastSyncTime ? new Date(device.Device.LastSyncTime*1000) : undefined,
33
+ hasDeprecatedName: !!device.Share.Name,
34
+ /** @deprecated to be removed once Volume-based navigation is implemented in web */
35
+ shareId: device.Share.ShareID,
36
+ }));
37
+ }
38
+
39
+ /**
40
+ * Originally the device name was on the share of the device.
41
+ * This was changed to be on the root node of the device instead.
42
+ * Old devices will still have the name on the share and when
43
+ * the client renames the device, it must be removed on the device.
44
+ */
45
+ async removeNameFromDevice(deviceUid: string): Promise<void> {
46
+ const { deviceId } = splitDeviceUid(deviceUid);
47
+ await this.apiService.put<
48
+ // Web clients do not update Device fields, that is only for desktop clients.
49
+ Omit<PutUpdateDeviceRequest, 'Device'>,
50
+ PutUpdateDeviceResponse
51
+ >(
52
+ `drive/devices/${deviceId}`,
53
+ {
54
+ Share: { Name: "" },
55
+ },
56
+ );
57
+ }
58
+
59
+ async createDevice(
60
+ device: {
61
+ volumeId: string,
62
+ type: DeviceType,
63
+ },
64
+ share: {
65
+ addressId: string,
66
+ addressKeyId: string,
67
+ armoredKey: string,
68
+ armoredSharePassphrase: string,
69
+ armoredSharePassphraseSignature: string,
70
+ },
71
+ node: {
72
+ encryptedName: string,
73
+ armoredKey: string,
74
+ armoredNodePassphrase: string,
75
+ armoredNodePassphraseSignature: string,
76
+ armoredHashKey: string,
77
+ }
78
+ ): Promise<DeviceMetadata> {
79
+ const response = await this.apiService.post<PostCreateDeviceRequest, PostCreateDeviceResponse>('drive/devices', {
80
+ // @ts-expect-error VolumeID is deprecated.
81
+ Device: {
82
+ Type: deviceTypeEnumToNumber(device.type),
83
+ SyncState: 0,
84
+ },
85
+ // @ts-expect-error Name is deprecated.
86
+ Share: {
87
+ AddressID: share.addressId,
88
+ AddressKeyID: share.addressKeyId,
89
+ Key: share.armoredKey,
90
+ Passphrase: share.armoredSharePassphrase,
91
+ PassphraseSignature: share.armoredSharePassphraseSignature,
92
+ },
93
+ Link: {
94
+ Name: node.encryptedName,
95
+ NodeKey: node.armoredKey,
96
+ NodePassphrase: node.armoredNodePassphrase,
97
+ NodePassphraseSignature: node.armoredNodePassphraseSignature,
98
+ NodeHashKey: node.armoredHashKey,
99
+ }
100
+ });
101
+
102
+ return {
103
+ uid: makeDeviceUid(device.volumeId, response.Device.DeviceID),
104
+ type: device.type,
105
+ rootFolderUid: makeNodeUid(device.volumeId, response.Device.LinkID),
106
+ creationTime: new Date(),
107
+ hasDeprecatedName: false,
108
+ shareId: response.Device.ShareID,
109
+ }
110
+ }
111
+
112
+ async deleteDevice(deviceUid: string): Promise<void> {
113
+ const { deviceId } = splitDeviceUid(deviceUid);
114
+ await this.apiService.delete(`drive/devices/${deviceId}`);
115
+ }
116
+ }
117
+
118
+ function deviceTypeNumberToEnum(deviceType: 1 | 2 | 3): DeviceType {
119
+ switch (deviceType) {
120
+ case 1:
121
+ return DeviceType.Windows;
122
+ case 2:
123
+ return DeviceType.MacOS;
124
+ case 3:
125
+ return DeviceType.Linux;
126
+ default:
127
+ throw new Error(`Unknown device type: ${deviceType}`);
128
+ }
129
+ }
130
+
131
+ function deviceTypeEnumToNumber(deviceType: DeviceType): 1 | 2 | 3 {
132
+ switch (deviceType.toLowerCase()) {
133
+ case DeviceType.Windows.toLowerCase():
134
+ return 1;
135
+ case DeviceType.MacOS.toLowerCase():
136
+ return 2;
137
+ case DeviceType.Linux.toLowerCase():
138
+ return 3;
139
+ default:
140
+ throw new Error(`Unknown device type: ${deviceType}`);
141
+ }
142
+ }
@@ -0,0 +1,65 @@
1
+ import { DriveCrypto } from '../../crypto';
2
+ import { SharesService } from './interface';
3
+
4
+ /**
5
+ * Provides crypto operations for devices.
6
+ */
7
+ export class DevicesCryptoService {
8
+ constructor(
9
+ private driveCrypto: DriveCrypto,
10
+ private sharesService: SharesService,
11
+ ) {
12
+ this.driveCrypto = driveCrypto;
13
+ this.sharesService = sharesService;
14
+ }
15
+
16
+ async createDevice(deviceName: string): Promise<{
17
+ address: {
18
+ addressId: string,
19
+ addressKeyId: string,
20
+ },
21
+ shareKey: {
22
+ armoredKey: string,
23
+ armoredPassphrase: string,
24
+ armoredPassphraseSignature: string,
25
+ },
26
+ node: {
27
+ key: {
28
+ armoredKey: string,
29
+ armoredPassphrase: string,
30
+ armoredPassphraseSignature: string,
31
+ },
32
+ encryptedName: string,
33
+ armoredHashKey: string,
34
+ }
35
+ }> {
36
+ const address = await this.sharesService.getMyFilesShareMemberEmailKey();
37
+ const addressKey = address.addressKey;
38
+
39
+ const shareKey = await this.driveCrypto.generateKey([addressKey], addressKey);
40
+ const rootNodeKey = await this.driveCrypto.generateKey([shareKey.decrypted.key], addressKey);
41
+ const { armoredNodeName } = await this.driveCrypto.encryptNodeName(deviceName, undefined, shareKey.decrypted.key, addressKey);
42
+ const { armoredHashKey } = await this.driveCrypto.generateHashKey(rootNodeKey.decrypted.key);
43
+
44
+ return {
45
+ address: {
46
+ addressId: address.addressId,
47
+ addressKeyId: address.addressKeyId,
48
+ },
49
+ shareKey: {
50
+ armoredKey: shareKey.encrypted.armoredKey,
51
+ armoredPassphrase: shareKey.encrypted.armoredPassphrase,
52
+ armoredPassphraseSignature: shareKey.encrypted.armoredPassphraseSignature,
53
+ },
54
+ node: {
55
+ key: {
56
+ armoredKey: rootNodeKey.encrypted.armoredKey,
57
+ armoredPassphrase: rootNodeKey.encrypted.armoredPassphrase,
58
+ armoredPassphraseSignature: rootNodeKey.encrypted.armoredPassphraseSignature,
59
+ },
60
+ encryptedName: armoredNodeName,
61
+ armoredHashKey,
62
+ }
63
+ };
64
+ };
65
+ }
@@ -0,0 +1,31 @@
1
+ import { DriveCrypto } from "../../crypto";
2
+ import { ProtonDriveTelemetry } from "../../interface";
3
+ import { DriveAPIService } from "../apiService";
4
+ import { DevicesAPIService } from "./apiService";
5
+ import { DevicesCryptoService } from "./cryptoService";
6
+ import { SharesService, NodesService, NodesManagementService } from "./interface";
7
+ import { DevicesManager } from "./manager";
8
+
9
+ /**
10
+ * Provides facade for the whole devices module.
11
+ *
12
+ * The devices module is responsible for handling devices metadata, including
13
+ * API communication, encryption, decryption, caching, and event handling.
14
+ *
15
+ * This facade provides internal interface that other modules can use to
16
+ * interact with the devices.
17
+ */
18
+ export function initDevicesModule(
19
+ telemetry: ProtonDriveTelemetry,
20
+ apiService: DriveAPIService,
21
+ driveCrypto: DriveCrypto,
22
+ sharesService: SharesService,
23
+ nodesService: NodesService,
24
+ nodesManagementService: NodesManagementService,
25
+ ) {
26
+ const api = new DevicesAPIService(apiService);
27
+ const cryptoService = new DevicesCryptoService(driveCrypto, sharesService);
28
+ const manager = new DevicesManager(telemetry.getLogger('devices'), api, cryptoService, sharesService, nodesService, nodesManagementService);
29
+
30
+ return manager;
31
+ }
@@ -0,0 +1,28 @@
1
+ import { PrivateKey } from "../../crypto";
2
+ import { DeviceType, MissingNode } from "../../interface";
3
+ import { DecryptedNode } from "../nodes";
4
+
5
+ export type DeviceMetadata = {
6
+ uid: string,
7
+ type: DeviceType
8
+ rootFolderUid: string,
9
+ creationTime: Date,
10
+ lastSyncTime?: Date;
11
+ hasDeprecatedName: boolean;
12
+ shareId: string;
13
+ }
14
+
15
+ export interface SharesService {
16
+ getMyFilesIDs(): Promise<{ volumeId: string }>;
17
+ getMyFilesShareMemberEmailKey(): Promise<{ addressId: string, email: string, addressKey: PrivateKey, addressKeyId: string }>,
18
+ }
19
+
20
+ export interface NodesService {
21
+ iterateNodes(nodeUids: string[], signal?: AbortSignal): AsyncGenerator<DecryptedNode | MissingNode>;
22
+ }
23
+
24
+ export interface NodesManagementService {
25
+ renameNode(nodeUid: string, newName: string, options: {
26
+ allowRenameRootNode: boolean,
27
+ }): Promise<DecryptedNode>;
28
+ }