@protontech/drive-sdk 0.1.0 → 0.1.1

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 (447) hide show
  1. package/dist/cache/memoryCache.js +0 -1
  2. package/dist/cache/memoryCache.js.map +1 -1
  3. package/dist/cache/memoryCache.test.js +2 -4
  4. package/dist/cache/memoryCache.test.js.map +1 -1
  5. package/dist/cache/nullCache.js +0 -1
  6. package/dist/cache/nullCache.js.map +1 -1
  7. package/dist/crypto/driveCrypto.d.ts +2 -5
  8. package/dist/crypto/driveCrypto.js +7 -12
  9. package/dist/crypto/driveCrypto.js.map +1 -1
  10. package/dist/crypto/driveCrypto.test.js +14 -14
  11. package/dist/crypto/openPGPCrypto.js +3 -3
  12. package/dist/crypto/openPGPCrypto.js.map +1 -1
  13. package/dist/diagnostic/eventsGenerator.js +1 -1
  14. package/dist/diagnostic/eventsGenerator.js.map +1 -1
  15. package/dist/diagnostic/httpClient.d.ts +1 -1
  16. package/dist/diagnostic/httpClient.js.map +1 -1
  17. package/dist/diagnostic/index.d.ts +3 -3
  18. package/dist/diagnostic/index.js.map +1 -1
  19. package/dist/diagnostic/integrityVerificationStream.js +1 -1
  20. package/dist/diagnostic/integrityVerificationStream.js.map +1 -1
  21. package/dist/diagnostic/interface.d.ts +2 -2
  22. package/dist/diagnostic/sdkDiagnostic.d.ts +3 -3
  23. package/dist/diagnostic/sdkDiagnostic.js +8 -2
  24. package/dist/diagnostic/sdkDiagnostic.js.map +1 -1
  25. package/dist/diagnostic/sdkDiagnosticFull.d.ts +4 -4
  26. package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -1
  27. package/dist/diagnostic/telemetry.js.map +1 -1
  28. package/dist/diagnostic/zipGenerators.js +2 -2
  29. package/dist/diagnostic/zipGenerators.js.map +1 -1
  30. package/dist/diagnostic/zipGenerators.test.js +1 -1
  31. package/dist/diagnostic/zipGenerators.test.js.map +1 -1
  32. package/dist/interface/events.d.ts +2 -4
  33. package/dist/interface/events.js.map +1 -1
  34. package/dist/interface/index.d.ts +5 -5
  35. package/dist/interface/index.js +0 -1
  36. package/dist/interface/index.js.map +1 -1
  37. package/dist/interface/result.js.map +1 -1
  38. package/dist/interface/sharing.d.ts +1 -0
  39. package/dist/interface/sharing.js.map +1 -1
  40. package/dist/interface/telemetry.js +0 -8
  41. package/dist/interface/telemetry.js.map +1 -1
  42. package/dist/interface/thumbnail.js.map +1 -1
  43. package/dist/interface/upload.d.ts +1 -1
  44. package/dist/internal/apiService/apiService.d.ts +1 -1
  45. package/dist/internal/apiService/apiService.js +7 -11
  46. package/dist/internal/apiService/apiService.js.map +1 -1
  47. package/dist/internal/apiService/apiService.test.js +55 -48
  48. package/dist/internal/apiService/apiService.test.js.map +1 -1
  49. package/dist/internal/apiService/coreTypes.d.ts +2356 -2356
  50. package/dist/internal/apiService/driveTypes.d.ts +1680 -1680
  51. package/dist/internal/apiService/errors.js +14 -8
  52. package/dist/internal/apiService/errors.js.map +1 -1
  53. package/dist/internal/apiService/errors.test.js +17 -12
  54. package/dist/internal/apiService/errors.test.js.map +1 -1
  55. package/dist/internal/apiService/transformers.d.ts +1 -1
  56. package/dist/internal/apiService/transformers.js +1 -1
  57. package/dist/internal/asyncIteratorMap.test.js +2 -2
  58. package/dist/internal/asyncIteratorMap.test.js.map +1 -1
  59. package/dist/internal/asyncIteratorRace.d.ts +13 -0
  60. package/dist/internal/asyncIteratorRace.js +59 -0
  61. package/dist/internal/asyncIteratorRace.js.map +1 -0
  62. package/dist/internal/asyncIteratorRace.test.d.ts +1 -0
  63. package/dist/internal/asyncIteratorRace.test.js +119 -0
  64. package/dist/internal/asyncIteratorRace.test.js.map +1 -0
  65. package/dist/internal/batch.d.ts +1 -0
  66. package/dist/internal/batch.js +12 -0
  67. package/dist/internal/batch.js.map +1 -0
  68. package/dist/internal/batch.test.d.ts +1 -0
  69. package/dist/internal/batch.test.js +41 -0
  70. package/dist/internal/batch.test.js.map +1 -0
  71. package/dist/internal/batchLoading.js.map +1 -1
  72. package/dist/internal/batchLoading.test.js +13 -13
  73. package/dist/internal/batchLoading.test.js.map +1 -1
  74. package/dist/internal/devices/apiService.d.ts +3 -3
  75. package/dist/internal/devices/apiService.js +2 -2
  76. package/dist/internal/devices/apiService.js.map +1 -1
  77. package/dist/internal/devices/cryptoService.js +1 -2
  78. package/dist/internal/devices/cryptoService.js.map +1 -1
  79. package/dist/internal/devices/index.d.ts +5 -5
  80. package/dist/internal/devices/index.js.map +1 -1
  81. package/dist/internal/devices/interface.d.ts +3 -3
  82. package/dist/internal/devices/manager.js +2 -2
  83. package/dist/internal/devices/manager.js.map +1 -1
  84. package/dist/internal/devices/manager.test.js +38 -7
  85. package/dist/internal/devices/manager.test.js.map +1 -1
  86. package/dist/internal/download/apiService.d.ts +4 -4
  87. package/dist/internal/download/apiService.js +0 -1
  88. package/dist/internal/download/apiService.js.map +1 -1
  89. package/dist/internal/download/cryptoService.d.ts +4 -4
  90. package/dist/internal/download/cryptoService.js +6 -5
  91. package/dist/internal/download/cryptoService.js.map +1 -1
  92. package/dist/internal/download/fileDownloader.d.ts +4 -4
  93. package/dist/internal/download/fileDownloader.js +3 -2
  94. package/dist/internal/download/fileDownloader.js.map +1 -1
  95. package/dist/internal/download/fileDownloader.test.js +1 -1
  96. package/dist/internal/download/fileDownloader.test.js.map +1 -1
  97. package/dist/internal/download/index.d.ts +5 -5
  98. package/dist/internal/download/index.js +5 -5
  99. package/dist/internal/download/index.js.map +1 -1
  100. package/dist/internal/download/interface.d.ts +3 -4
  101. package/dist/internal/download/telemetry.d.ts +3 -3
  102. package/dist/internal/download/telemetry.js +4 -2
  103. package/dist/internal/download/telemetry.js.map +1 -1
  104. package/dist/internal/download/telemetry.test.js +8 -8
  105. package/dist/internal/download/telemetry.test.js.map +1 -1
  106. package/dist/internal/download/thumbnailDownloader.d.ts +4 -4
  107. package/dist/internal/download/thumbnailDownloader.js +6 -6
  108. package/dist/internal/download/thumbnailDownloader.js.map +1 -1
  109. package/dist/internal/download/thumbnailDownloader.test.js.map +1 -1
  110. package/dist/internal/errors.d.ts +1 -1
  111. package/dist/internal/errors.js +1 -3
  112. package/dist/internal/errors.js.map +1 -1
  113. package/dist/internal/events/apiService.d.ts +2 -2
  114. package/dist/internal/events/apiService.js +9 -5
  115. package/dist/internal/events/apiService.js.map +1 -1
  116. package/dist/internal/events/coreEventManager.d.ts +3 -3
  117. package/dist/internal/events/coreEventManager.js.map +1 -1
  118. package/dist/internal/events/coreEventManager.test.js +14 -14
  119. package/dist/internal/events/eventManager.d.ts +1 -1
  120. package/dist/internal/events/eventManager.js +0 -1
  121. package/dist/internal/events/eventManager.js.map +1 -1
  122. package/dist/internal/events/eventManager.test.js +34 -25
  123. package/dist/internal/events/eventManager.test.js.map +1 -1
  124. package/dist/internal/events/index.d.ts +6 -6
  125. package/dist/internal/events/index.js.map +1 -1
  126. package/dist/internal/events/interface.d.ts +1 -1
  127. package/dist/internal/events/interface.js +0 -1
  128. package/dist/internal/events/interface.js.map +1 -1
  129. package/dist/internal/events/volumeEventManager.d.ts +3 -3
  130. package/dist/internal/events/volumeEventManager.js.map +1 -1
  131. package/dist/internal/events/volumeEventManager.test.js +55 -55
  132. package/dist/internal/events/volumeEventManager.test.js.map +1 -1
  133. package/dist/internal/nodes/apiService.d.ts +4 -3
  134. package/dist/internal/nodes/apiService.js +36 -15
  135. package/dist/internal/nodes/apiService.js.map +1 -1
  136. package/dist/internal/nodes/apiService.test.js +60 -41
  137. package/dist/internal/nodes/apiService.test.js.map +1 -1
  138. package/dist/internal/nodes/cache.d.ts +5 -5
  139. package/dist/internal/nodes/cache.js +14 -7
  140. package/dist/internal/nodes/cache.js.map +1 -1
  141. package/dist/internal/nodes/cache.test.js +31 -9
  142. package/dist/internal/nodes/cache.test.js.map +1 -1
  143. package/dist/internal/nodes/cryptoCache.d.ts +2 -2
  144. package/dist/internal/nodes/cryptoCache.js.map +1 -1
  145. package/dist/internal/nodes/cryptoCache.test.js +24 -4
  146. package/dist/internal/nodes/cryptoCache.test.js.map +1 -1
  147. package/dist/internal/nodes/cryptoService.d.ts +3 -3
  148. package/dist/internal/nodes/cryptoService.js +11 -17
  149. package/dist/internal/nodes/cryptoService.js.map +1 -1
  150. package/dist/internal/nodes/cryptoService.test.js +320 -241
  151. package/dist/internal/nodes/cryptoService.test.js.map +1 -1
  152. package/dist/internal/nodes/events.d.ts +3 -3
  153. package/dist/internal/nodes/events.js.map +1 -1
  154. package/dist/internal/nodes/events.test.js +27 -21
  155. package/dist/internal/nodes/events.test.js.map +1 -1
  156. package/dist/internal/nodes/extendedAttributes.d.ts +1 -1
  157. package/dist/internal/nodes/extendedAttributes.js +3 -1
  158. package/dist/internal/nodes/extendedAttributes.js.map +1 -1
  159. package/dist/internal/nodes/extendedAttributes.test.js +7 -10
  160. package/dist/internal/nodes/extendedAttributes.test.js.map +1 -1
  161. package/dist/internal/nodes/index.d.ts +10 -10
  162. package/dist/internal/nodes/index.js.map +1 -1
  163. package/dist/internal/nodes/index.test.d.ts +1 -0
  164. package/dist/internal/nodes/index.test.js +106 -0
  165. package/dist/internal/nodes/index.test.js.map +1 -0
  166. package/dist/internal/nodes/interface.d.ts +2 -2
  167. package/dist/internal/nodes/nodesAccess.d.ts +7 -7
  168. package/dist/internal/nodes/nodesAccess.js +28 -16
  169. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  170. package/dist/internal/nodes/nodesAccess.test.js +39 -13
  171. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  172. package/dist/internal/nodes/nodesManagement.d.ts +6 -6
  173. package/dist/internal/nodes/nodesManagement.js +9 -7
  174. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  175. package/dist/internal/nodes/nodesManagement.test.js +9 -9
  176. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  177. package/dist/internal/nodes/nodesRevisions.d.ts +4 -4
  178. package/dist/internal/nodes/nodesRevisions.js.map +1 -1
  179. package/dist/internal/photos/albums.d.ts +3 -3
  180. package/dist/internal/photos/albums.js.map +1 -1
  181. package/dist/internal/photos/apiService.d.ts +1 -1
  182. package/dist/internal/photos/apiService.js +3 -6
  183. package/dist/internal/photos/apiService.js.map +1 -1
  184. package/dist/internal/photos/cache.d.ts +1 -1
  185. package/dist/internal/photos/index.d.ts +5 -5
  186. package/dist/internal/photos/index.js.map +1 -1
  187. package/dist/internal/photos/interface.d.ts +2 -2
  188. package/dist/internal/photos/photosTimeline.d.ts +3 -3
  189. package/dist/internal/photos/photosTimeline.js +1 -2
  190. package/dist/internal/photos/photosTimeline.js.map +1 -1
  191. package/dist/internal/sdkEvents.d.ts +1 -1
  192. package/dist/internal/sdkEvents.js +2 -7
  193. package/dist/internal/sdkEvents.js.map +1 -1
  194. package/dist/internal/sdkEvents.test.js +8 -8
  195. package/dist/internal/shares/apiService.d.ts +2 -2
  196. package/dist/internal/shares/apiService.js +5 -3
  197. package/dist/internal/shares/apiService.js.map +1 -1
  198. package/dist/internal/shares/cache.d.ts +2 -2
  199. package/dist/internal/shares/cache.js +12 -6
  200. package/dist/internal/shares/cache.js.map +1 -1
  201. package/dist/internal/shares/cache.test.js.map +1 -1
  202. package/dist/internal/shares/cryptoCache.d.ts +2 -2
  203. package/dist/internal/shares/cryptoCache.test.js +8 -2
  204. package/dist/internal/shares/cryptoCache.test.js.map +1 -1
  205. package/dist/internal/shares/cryptoService.d.ts +3 -3
  206. package/dist/internal/shares/cryptoService.js.map +1 -1
  207. package/dist/internal/shares/cryptoService.test.js +42 -42
  208. package/dist/internal/shares/cryptoService.test.js.map +1 -1
  209. package/dist/internal/shares/index.d.ts +4 -4
  210. package/dist/internal/shares/index.js.map +1 -1
  211. package/dist/internal/shares/interface.d.ts +2 -2
  212. package/dist/internal/shares/manager.d.ts +7 -7
  213. package/dist/internal/shares/manager.js.map +1 -1
  214. package/dist/internal/shares/manager.test.js +71 -63
  215. package/dist/internal/shares/manager.test.js.map +1 -1
  216. package/dist/internal/sharing/apiService.d.ts +4 -4
  217. package/dist/internal/sharing/apiService.js +4 -3
  218. package/dist/internal/sharing/apiService.js.map +1 -1
  219. package/dist/internal/sharing/cache.d.ts +1 -1
  220. package/dist/internal/sharing/cache.test.js +33 -33
  221. package/dist/internal/sharing/cryptoService.d.ts +3 -3
  222. package/dist/internal/sharing/cryptoService.js +3 -5
  223. package/dist/internal/sharing/cryptoService.js.map +1 -1
  224. package/dist/internal/sharing/cryptoService.test.js +39 -39
  225. package/dist/internal/sharing/cryptoService.test.js.map +1 -1
  226. package/dist/internal/sharing/events.d.ts +4 -4
  227. package/dist/internal/sharing/events.js +0 -1
  228. package/dist/internal/sharing/events.js.map +1 -1
  229. package/dist/internal/sharing/events.test.js +39 -40
  230. package/dist/internal/sharing/events.test.js.map +1 -1
  231. package/dist/internal/sharing/index.d.ts +6 -6
  232. package/dist/internal/sharing/index.js.map +1 -1
  233. package/dist/internal/sharing/interface.d.ts +5 -4
  234. package/dist/internal/sharing/sharingAccess.d.ts +6 -6
  235. package/dist/internal/sharing/sharingAccess.js +8 -4
  236. package/dist/internal/sharing/sharingAccess.js.map +1 -1
  237. package/dist/internal/sharing/sharingAccess.test.js +45 -39
  238. package/dist/internal/sharing/sharingAccess.test.js.map +1 -1
  239. package/dist/internal/sharing/sharingManagement.d.ts +4 -4
  240. package/dist/internal/sharing/sharingManagement.js +5 -7
  241. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  242. package/dist/internal/sharing/sharingManagement.test.js +297 -248
  243. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  244. package/dist/internal/uids.js.map +1 -1
  245. package/dist/internal/upload/apiService.d.ts +3 -3
  246. package/dist/internal/upload/apiService.js +1 -1
  247. package/dist/internal/upload/apiService.js.map +1 -1
  248. package/dist/internal/upload/blockVerifier.d.ts +3 -3
  249. package/dist/internal/upload/blockVerifier.js +1 -1
  250. package/dist/internal/upload/blockVerifier.js.map +1 -1
  251. package/dist/internal/upload/chunkStreamReader.test.js +6 -6
  252. package/dist/internal/upload/cryptoService.d.ts +4 -4
  253. package/dist/internal/upload/cryptoService.js +4 -4
  254. package/dist/internal/upload/cryptoService.js.map +1 -1
  255. package/dist/internal/upload/digests.js.map +1 -1
  256. package/dist/internal/upload/fileUploader.d.ts +6 -6
  257. package/dist/internal/upload/fileUploader.js.map +1 -1
  258. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  259. package/dist/internal/upload/index.d.ts +5 -5
  260. package/dist/internal/upload/index.js.map +1 -1
  261. package/dist/internal/upload/interface.d.ts +3 -3
  262. package/dist/internal/upload/manager.d.ts +4 -4
  263. package/dist/internal/upload/manager.js +7 -5
  264. package/dist/internal/upload/manager.js.map +1 -1
  265. package/dist/internal/upload/manager.test.js +137 -123
  266. package/dist/internal/upload/manager.test.js.map +1 -1
  267. package/dist/internal/upload/streamUploader.d.ts +6 -6
  268. package/dist/internal/upload/streamUploader.js +8 -6
  269. package/dist/internal/upload/streamUploader.js.map +1 -1
  270. package/dist/internal/upload/streamUploader.test.js +16 -11
  271. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  272. package/dist/internal/upload/telemetry.d.ts +3 -3
  273. package/dist/internal/upload/telemetry.js +5 -3
  274. package/dist/internal/upload/telemetry.js.map +1 -1
  275. package/dist/internal/upload/telemetry.test.js +8 -8
  276. package/dist/internal/upload/telemetry.test.js.map +1 -1
  277. package/dist/protonDriveClient.d.ts +8 -8
  278. package/dist/protonDriveClient.js +12 -9
  279. package/dist/protonDriveClient.js.map +1 -1
  280. package/dist/protonDrivePhotosClient.js.map +1 -1
  281. package/dist/telemetry.js +18 -15
  282. package/dist/telemetry.js.map +1 -1
  283. package/dist/tests/logger.js.map +1 -1
  284. package/dist/tests/telemetry.d.ts +1 -1
  285. package/dist/transformers.js +4 -2
  286. package/dist/transformers.js.map +1 -1
  287. package/package.json +1 -1
  288. package/src/cache/interface.ts +22 -22
  289. package/src/cache/memoryCache.test.ts +7 -7
  290. package/src/cache/memoryCache.ts +4 -4
  291. package/src/cache/nullCache.ts +1 -1
  292. package/src/config.ts +5 -5
  293. package/src/crypto/driveCrypto.test.ts +15 -15
  294. package/src/crypto/driveCrypto.ts +120 -156
  295. package/src/crypto/hmac.ts +1 -1
  296. package/src/crypto/interface.ts +63 -72
  297. package/src/crypto/openPGPCrypto.ts +74 -94
  298. package/src/crypto/utils.ts +1 -1
  299. package/src/diagnostic/eventsGenerator.ts +2 -2
  300. package/src/diagnostic/httpClient.ts +6 -2
  301. package/src/diagnostic/index.ts +12 -10
  302. package/src/diagnostic/integrityVerificationStream.ts +3 -4
  303. package/src/diagnostic/interface.ts +81 -81
  304. package/src/diagnostic/sdkDiagnostic.ts +35 -24
  305. package/src/diagnostic/sdkDiagnosticFull.ts +16 -19
  306. package/src/diagnostic/telemetry.ts +4 -1
  307. package/src/diagnostic/zipGenerators.test.ts +1 -1
  308. package/src/diagnostic/zipGenerators.ts +3 -3
  309. package/src/errors.ts +21 -21
  310. package/src/index.ts +3 -3
  311. package/src/interface/account.ts +10 -10
  312. package/src/interface/author.ts +6 -6
  313. package/src/interface/config.ts +4 -4
  314. package/src/interface/devices.ts +6 -6
  315. package/src/interface/download.ts +12 -9
  316. package/src/interface/events.ts +45 -39
  317. package/src/interface/httpClient.ts +11 -11
  318. package/src/interface/index.ts +76 -19
  319. package/src/interface/nodes.ts +47 -49
  320. package/src/interface/result.ts +1 -3
  321. package/src/interface/sharing.ts +60 -57
  322. package/src/interface/telemetry.ts +74 -74
  323. package/src/interface/thumbnail.ts +5 -6
  324. package/src/interface/upload.ts +20 -12
  325. package/src/internal/apiService/apiService.test.ts +109 -76
  326. package/src/internal/apiService/apiService.ts +40 -26
  327. package/src/internal/apiService/coreTypes.ts +2474 -2463
  328. package/src/internal/apiService/driveTypes.ts +1868 -1822
  329. package/src/internal/apiService/errorCodes.ts +4 -4
  330. package/src/internal/apiService/errors.test.ts +25 -23
  331. package/src/internal/apiService/errors.ts +15 -9
  332. package/src/internal/apiService/index.ts +1 -1
  333. package/src/internal/apiService/transformers.ts +2 -2
  334. package/src/internal/asyncIteratorMap.test.ts +4 -4
  335. package/src/internal/asyncIteratorMap.ts +1 -1
  336. package/src/internal/asyncIteratorRace.test.ts +149 -0
  337. package/src/internal/asyncIteratorRace.ts +79 -0
  338. package/src/internal/batch.test.ts +50 -0
  339. package/src/internal/batch.ts +9 -0
  340. package/src/internal/batchLoading.test.ts +13 -14
  341. package/src/internal/batchLoading.ts +8 -8
  342. package/src/internal/devices/apiService.ts +58 -51
  343. package/src/internal/devices/cryptoService.ts +22 -17
  344. package/src/internal/devices/index.ts +17 -10
  345. package/src/internal/devices/interface.ts +21 -12
  346. package/src/internal/devices/manager.test.ts +40 -9
  347. package/src/internal/devices/manager.ts +3 -3
  348. package/src/internal/download/apiService.ts +66 -49
  349. package/src/internal/download/cryptoService.ts +34 -18
  350. package/src/internal/download/fileDownloader.test.ts +25 -9
  351. package/src/internal/download/fileDownloader.ts +36 -18
  352. package/src/internal/download/index.ts +19 -19
  353. package/src/internal/download/interface.ts +19 -20
  354. package/src/internal/download/queue.ts +3 -3
  355. package/src/internal/download/telemetry.test.ts +11 -11
  356. package/src/internal/download/telemetry.ts +24 -14
  357. package/src/internal/download/thumbnailDownloader.test.ts +11 -6
  358. package/src/internal/download/thumbnailDownloader.ts +43 -32
  359. package/src/internal/errors.ts +7 -5
  360. package/src/internal/events/apiService.ts +30 -17
  361. package/src/internal/events/coreEventManager.test.ts +18 -18
  362. package/src/internal/events/coreEventManager.ts +9 -6
  363. package/src/internal/events/eventManager.test.ts +51 -46
  364. package/src/internal/events/eventManager.ts +6 -5
  365. package/src/internal/events/index.ts +24 -14
  366. package/src/internal/events/interface.ts +47 -39
  367. package/src/internal/events/volumeEventManager.test.ts +61 -65
  368. package/src/internal/events/volumeEventManager.ts +18 -9
  369. package/src/internal/nodes/apiService.test.ts +197 -147
  370. package/src/internal/nodes/apiService.ts +288 -174
  371. package/src/internal/nodes/cache.test.ts +48 -20
  372. package/src/internal/nodes/cache.ts +60 -44
  373. package/src/internal/nodes/cryptoCache.test.ts +34 -14
  374. package/src/internal/nodes/cryptoCache.ts +10 -5
  375. package/src/internal/nodes/cryptoService.test.ts +492 -351
  376. package/src/internal/nodes/cryptoService.ts +170 -88
  377. package/src/internal/nodes/events.test.ts +38 -28
  378. package/src/internal/nodes/events.ts +7 -5
  379. package/src/internal/nodes/extendedAttributes.test.ts +28 -24
  380. package/src/internal/nodes/extendedAttributes.ts +20 -15
  381. package/src/internal/nodes/index.test.ts +133 -0
  382. package/src/internal/nodes/index.ts +27 -15
  383. package/src/internal/nodes/interface.ts +42 -29
  384. package/src/internal/nodes/nodesAccess.test.ts +124 -58
  385. package/src/internal/nodes/nodesAccess.ts +73 -49
  386. package/src/internal/nodes/nodesManagement.test.ts +32 -31
  387. package/src/internal/nodes/nodesManagement.ts +39 -32
  388. package/src/internal/nodes/nodesRevisions.ts +7 -7
  389. package/src/internal/nodes/validations.ts +2 -2
  390. package/src/internal/photos/albums.ts +5 -5
  391. package/src/internal/photos/apiService.ts +4 -7
  392. package/src/internal/photos/cache.ts +1 -1
  393. package/src/internal/photos/index.ts +8 -8
  394. package/src/internal/photos/interface.ts +2 -2
  395. package/src/internal/photos/photosTimeline.ts +4 -5
  396. package/src/internal/sdkEvents.test.ts +10 -10
  397. package/src/internal/sdkEvents.ts +5 -13
  398. package/src/internal/shares/apiService.ts +44 -33
  399. package/src/internal/shares/cache.test.ts +6 -4
  400. package/src/internal/shares/cache.ts +21 -12
  401. package/src/internal/shares/cryptoCache.test.ts +17 -11
  402. package/src/internal/shares/cryptoCache.ts +4 -4
  403. package/src/internal/shares/cryptoService.test.ts +72 -74
  404. package/src/internal/shares/cryptoService.ts +48 -23
  405. package/src/internal/shares/index.ts +23 -11
  406. package/src/internal/shares/interface.ts +8 -8
  407. package/src/internal/shares/manager.test.ts +88 -80
  408. package/src/internal/shares/manager.ts +19 -19
  409. package/src/internal/sharing/apiService.ts +282 -175
  410. package/src/internal/sharing/cache.test.ts +35 -35
  411. package/src/internal/sharing/cache.ts +2 -2
  412. package/src/internal/sharing/cryptoService.test.ts +58 -46
  413. package/src/internal/sharing/cryptoService.ts +121 -84
  414. package/src/internal/sharing/events.test.ts +45 -49
  415. package/src/internal/sharing/events.ts +9 -6
  416. package/src/internal/sharing/index.ts +22 -11
  417. package/src/internal/sharing/interface.ts +40 -40
  418. package/src/internal/sharing/sharingAccess.test.ts +71 -65
  419. package/src/internal/sharing/sharingAccess.ts +39 -21
  420. package/src/internal/sharing/sharingManagement.test.ts +398 -298
  421. package/src/internal/sharing/sharingManagement.ts +138 -65
  422. package/src/internal/uids.ts +1 -1
  423. package/src/internal/upload/apiService.ts +167 -117
  424. package/src/internal/upload/blockVerifier.ts +8 -6
  425. package/src/internal/upload/chunkStreamReader.test.ts +7 -7
  426. package/src/internal/upload/cryptoService.ts +42 -36
  427. package/src/internal/upload/digests.ts +2 -2
  428. package/src/internal/upload/fileUploader.test.ts +15 -3
  429. package/src/internal/upload/fileUploader.ts +39 -17
  430. package/src/internal/upload/index.ts +13 -14
  431. package/src/internal/upload/interface.ts +78 -78
  432. package/src/internal/upload/manager.test.ts +170 -153
  433. package/src/internal/upload/manager.ts +59 -35
  434. package/src/internal/upload/queue.ts +3 -3
  435. package/src/internal/upload/streamUploader.test.ts +40 -26
  436. package/src/internal/upload/streamUploader.ts +87 -69
  437. package/src/internal/upload/telemetry.test.ts +11 -11
  438. package/src/internal/upload/telemetry.ts +25 -15
  439. package/src/internal/wait.test.ts +1 -1
  440. package/src/internal/wait.ts +3 -3
  441. package/src/protonDriveClient.ts +121 -39
  442. package/src/protonDrivePhotosClient.ts +16 -10
  443. package/src/telemetry.ts +60 -52
  444. package/src/tests/logger.ts +1 -1
  445. package/src/tests/telemetry.ts +2 -2
  446. package/src/transformers.ts +27 -21
  447. package/src/version.ts +0 -1
@@ -1,11 +1,20 @@
1
- import { getMockLogger } from "../../tests/logger";
2
- import { Member, MemberRole, NonProtonInvitation, NonProtonInvitationState, ProtonDriveAccount, ProtonInvitation, PublicLink, resultOk } from "../../interface";
3
- import { SharingAPIService } from "./apiService";
4
- import { SharingCryptoService } from "./cryptoService";
5
- import { SharesService, NodesService } from "./interface";
6
- import { SharingManagement } from "./sharingManagement";
7
-
8
- describe("SharingManagement", () => {
1
+ import { getMockLogger } from '../../tests/logger';
2
+ import {
3
+ Member,
4
+ MemberRole,
5
+ NonProtonInvitation,
6
+ NonProtonInvitationState,
7
+ ProtonDriveAccount,
8
+ ProtonInvitation,
9
+ PublicLink,
10
+ resultOk,
11
+ } from '../../interface';
12
+ import { SharingAPIService } from './apiService';
13
+ import { SharingCryptoService } from './cryptoService';
14
+ import { SharesService, NodesService } from './interface';
15
+ import { SharingManagement } from './sharingManagement';
16
+
17
+ describe('SharingManagement', () => {
9
18
  let apiService: SharingAPIService;
10
19
  let cryptoService: SharingCryptoService;
11
20
  let accountService: ProtonDriveAccount;
@@ -17,19 +26,19 @@ describe("SharingManagement", () => {
17
26
  beforeEach(() => {
18
27
  // @ts-expect-error No need to implement all methods for mocking
19
28
  apiService = {
20
- createStandardShare: jest.fn().mockReturnValue("newShareId"),
29
+ createStandardShare: jest.fn().mockReturnValue('newShareId'),
21
30
  getShareInvitations: jest.fn().mockResolvedValue([]),
22
31
  getShareExternalInvitations: jest.fn().mockResolvedValue([]),
23
32
  getShareMembers: jest.fn().mockResolvedValue([]),
24
33
  inviteProtonUser: jest.fn().mockImplementation((_, invitation) => ({
25
34
  ...invitation,
26
- uid: "created-invitation",
35
+ uid: 'created-invitation',
27
36
  })),
28
37
  updateInvitation: jest.fn(),
29
38
  deleteInvitation: jest.fn(),
30
39
  inviteExternalUser: jest.fn().mockImplementation((_, invitation) => ({
31
40
  ...invitation,
32
- uid: "created-external-invitation",
41
+ uid: 'created-external-invitation',
33
42
  state: NonProtonInvitationState.Pending,
34
43
  })),
35
44
  updateExternalInvitation: jest.fn(),
@@ -42,55 +51,77 @@ describe("SharingManagement", () => {
42
51
  resendInvitationEmail: jest.fn(),
43
52
  resendExternalInvitationEmail: jest.fn(),
44
53
  createPublicLink: jest.fn().mockResolvedValue({
45
- uid: "publicLinkUid",
46
- publicUrl: "publicLinkUrl",
54
+ uid: 'publicLinkUid',
55
+ publicUrl: 'publicLinkUrl',
47
56
  }),
48
57
  updatePublicLink: jest.fn(),
49
- }
58
+ };
50
59
  // @ts-expect-error No need to implement all methods for mocking
51
60
  cryptoService = {
52
- generateShareKeys: jest.fn().mockResolvedValue({ shareKey: { encrypted: "encrypted-key", decrypted: { passphraseSessionKey: "pass-session-key", } } }),
61
+ generateShareKeys: jest
62
+ .fn()
63
+ .mockResolvedValue({
64
+ shareKey: { encrypted: 'encrypted-key', decrypted: { passphraseSessionKey: 'pass-session-key' } },
65
+ }),
53
66
  decryptShare: jest.fn().mockImplementation((share) => share),
54
67
  decryptInvitation: jest.fn().mockImplementation((invitation) => invitation),
55
68
  decryptExternalInvitation: jest.fn().mockImplementation((invitation) => invitation),
56
69
  decryptMember: jest.fn().mockImplementation((member) => member),
57
- encryptInvitation: jest.fn().mockImplementation(() => { }),
70
+ encryptInvitation: jest.fn().mockImplementation(() => {}),
58
71
  encryptExternalInvitation: jest.fn().mockImplementation((invitation) => ({
59
72
  ...invitation,
60
- base64ExternalInvitationSignature: "extenral-signature",
73
+ base64ExternalInvitationSignature: 'extenral-signature',
61
74
  })),
62
75
  decryptPublicLink: jest.fn().mockImplementation((publicLink) => publicLink),
63
- generatePublicLinkPassword: jest.fn().mockResolvedValue("generatedPassword"),
76
+ generatePublicLinkPassword: jest.fn().mockResolvedValue('generatedPassword'),
64
77
  encryptPublicLink: jest.fn().mockImplementation(() => ({
65
- crypto: "publicLinkCrypto",
66
- srp: "publicLinkSrp",
78
+ crypto: 'publicLinkCrypto',
79
+ srp: 'publicLinkSrp',
67
80
  })),
68
- }
81
+ };
69
82
  // @ts-expect-error No need to implement all methods for mocking
70
83
  accountService = {
71
84
  hasProtonAccount: jest.fn().mockResolvedValue(true),
72
- }
85
+ };
73
86
  // @ts-expect-error No need to implement all methods for mocking
74
87
  sharesService = {
75
- loadEncryptedShare: jest.fn().mockResolvedValue({ id: "shareId", addressId: "addressId", creatorEmail: "address@example.com", passphraseSessionKey: "sharePassphraseSessionKey" }),
76
- getContextShareMemberEmailKey: jest.fn().mockResolvedValue({ email: "volume-email", addressId: "addressId", addressKey: "volume-key" }),
77
- }
88
+ loadEncryptedShare: jest
89
+ .fn()
90
+ .mockResolvedValue({
91
+ id: 'shareId',
92
+ addressId: 'addressId',
93
+ creatorEmail: 'address@example.com',
94
+ passphraseSessionKey: 'sharePassphraseSessionKey',
95
+ }),
96
+ getContextShareMemberEmailKey: jest
97
+ .fn()
98
+ .mockResolvedValue({ email: 'volume-email', addressId: 'addressId', addressKey: 'volume-key' }),
99
+ };
78
100
  // @ts-expect-error No need to implement all methods for mocking
79
101
  nodesService = {
80
- getNode: jest.fn().mockImplementation((nodeUid) => ({ nodeUid, shareId: "shareId", name: { ok: true, value: "name" } })),
81
- getNodeKeys: jest.fn().mockImplementation((nodeUid) => ({ key: "node-key" })),
102
+ getNode: jest
103
+ .fn()
104
+ .mockImplementation((nodeUid) => ({ nodeUid, shareId: 'shareId', name: { ok: true, value: 'name' } })),
105
+ getNodeKeys: jest.fn().mockImplementation((nodeUid) => ({ key: 'node-key' })),
82
106
  getNodePrivateAndSessionKeys: jest.fn().mockImplementation((nodeUid) => ({})),
83
- getRootNodeEmailKey: jest.fn().mockResolvedValue({ email: "volume-email", addressKey: "volume-key" }),
107
+ getRootNodeEmailKey: jest.fn().mockResolvedValue({ email: 'volume-email', addressKey: 'volume-key' }),
84
108
  notifyNodeChanged: jest.fn(),
85
- }
109
+ };
86
110
 
87
- sharingManagement = new SharingManagement(getMockLogger(), apiService, cryptoService, accountService, sharesService, nodesService);
111
+ sharingManagement = new SharingManagement(
112
+ getMockLogger(),
113
+ apiService,
114
+ cryptoService,
115
+ accountService,
116
+ sharesService,
117
+ nodesService,
118
+ );
88
119
  });
89
120
 
90
- describe("getSharingInfo", () => {
91
- it("should return empty sharing info for unshared node", async () => {
92
- nodesService.getNode = jest.fn().mockResolvedValue({ nodeUid: "nodeUid", shareId: undefined });
93
- const sharingInfo = await sharingManagement.getSharingInfo("nodeUid");
121
+ describe('getSharingInfo', () => {
122
+ it('should return empty sharing info for unshared node', async () => {
123
+ nodesService.getNode = jest.fn().mockResolvedValue({ nodeUid: 'nodeUid', shareId: undefined });
124
+ const sharingInfo = await sharingManagement.getSharingInfo('nodeUid');
94
125
 
95
126
  expect(sharingInfo).toEqual(undefined);
96
127
  expect(apiService.getShareInvitations).not.toHaveBeenCalled();
@@ -98,13 +129,11 @@ describe("SharingManagement", () => {
98
129
  expect(apiService.getShareMembers).not.toHaveBeenCalled();
99
130
  });
100
131
 
101
- it("should return invitations", async () => {
102
- const invitation = { uid: "invitaiton", addedByEmail: "email" };
103
- apiService.getShareInvitations = jest.fn().mockResolvedValue([
104
- invitation,
105
- ]);
132
+ it('should return invitations', async () => {
133
+ const invitation = { uid: 'invitaiton', addedByEmail: 'email' };
134
+ apiService.getShareInvitations = jest.fn().mockResolvedValue([invitation]);
106
135
 
107
- const sharingInfo = await sharingManagement.getSharingInfo("nodeUid");
136
+ const sharingInfo = await sharingManagement.getSharingInfo('nodeUid');
108
137
 
109
138
  expect(sharingInfo).toEqual({
110
139
  protonInvitations: [invitation],
@@ -115,13 +144,11 @@ describe("SharingManagement", () => {
115
144
  expect(cryptoService.decryptInvitation).toHaveBeenCalledWith(invitation);
116
145
  });
117
146
 
118
- it("should return external invitations", async () => {
119
- const externalInvitation = { uid: "external-invitation", addedByEmail: "email" };
120
- apiService.getShareExternalInvitations = jest.fn().mockResolvedValue([
121
- externalInvitation,
122
- ]);
147
+ it('should return external invitations', async () => {
148
+ const externalInvitation = { uid: 'external-invitation', addedByEmail: 'email' };
149
+ apiService.getShareExternalInvitations = jest.fn().mockResolvedValue([externalInvitation]);
123
150
 
124
- const sharingInfo = await sharingManagement.getSharingInfo("nodeUid");
151
+ const sharingInfo = await sharingManagement.getSharingInfo('nodeUid');
125
152
 
126
153
  expect(sharingInfo).toEqual({
127
154
  protonInvitations: [],
@@ -132,13 +159,11 @@ describe("SharingManagement", () => {
132
159
  expect(cryptoService.decryptExternalInvitation).toHaveBeenCalledWith(externalInvitation);
133
160
  });
134
161
 
135
- it("should return members", async () => {
136
- const member = { uid: "member", addedByEmail: "email" };
137
- apiService.getShareMembers = jest.fn().mockResolvedValue([
138
- member,
139
- ]);
162
+ it('should return members', async () => {
163
+ const member = { uid: 'member', addedByEmail: 'email' };
164
+ apiService.getShareMembers = jest.fn().mockResolvedValue([member]);
140
165
 
141
- const sharingInfo = await sharingManagement.getSharingInfo("nodeUid");
166
+ const sharingInfo = await sharingManagement.getSharingInfo('nodeUid');
142
167
 
143
168
  expect(sharingInfo).toEqual({
144
169
  protonInvitations: [],
@@ -149,13 +174,13 @@ describe("SharingManagement", () => {
149
174
  expect(cryptoService.decryptMember).toHaveBeenCalledWith(member);
150
175
  });
151
176
 
152
- it("should return public link", async () => {
177
+ it('should return public link', async () => {
153
178
  const publicLink = {
154
179
  uid: 'shared~publicLink',
155
- }
180
+ };
156
181
  apiService.getPublicLink = jest.fn().mockResolvedValue(publicLink);
157
182
 
158
- const sharingInfo = await sharingManagement.getSharingInfo("nodeUid");
183
+ const sharingInfo = await sharingManagement.getSharingInfo('nodeUid');
159
184
 
160
185
  expect(sharingInfo).toEqual({
161
186
  protonInvitations: [],
@@ -167,22 +192,30 @@ describe("SharingManagement", () => {
167
192
  });
168
193
  });
169
194
 
170
- describe("shareNode with share creation", () => {
171
- const nodeUid = "volumeId~nodeUid";
195
+ describe('shareNode with share creation', () => {
196
+ const nodeUid = 'volumeId~nodeUid';
172
197
 
173
- it("should create share if no exists", async () => {
174
- nodesService.getNode = jest.fn().mockImplementation((nodeUid) => ({ nodeUid, parentUid: 'parentUid', name: { ok: true, value: "name" } }));
198
+ it('should create share if no exists', async () => {
199
+ nodesService.getNode = jest
200
+ .fn()
201
+ .mockImplementation((nodeUid) => ({
202
+ nodeUid,
203
+ parentUid: 'parentUid',
204
+ name: { ok: true, value: 'name' },
205
+ }));
175
206
  nodesService.notifyNodeChanged = jest.fn();
176
207
 
177
- const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: ["email"] });
208
+ const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: ['email'] });
178
209
 
179
210
  expect(sharingInfo).toEqual({
180
- protonInvitations: [{
181
- uid: "created-invitation",
182
- addedByEmail: { ok: true, value: "volume-email" },
183
- inviteeEmail: "email",
184
- role: "viewer",
185
- }],
211
+ protonInvitations: [
212
+ {
213
+ uid: 'created-invitation',
214
+ addedByEmail: { ok: true, value: 'volume-email' },
215
+ inviteeEmail: 'email',
216
+ role: 'viewer',
217
+ },
218
+ ],
186
219
  nonProtonInvitations: [],
187
220
  members: [],
188
221
  publicLink: undefined,
@@ -191,10 +224,10 @@ describe("SharingManagement", () => {
191
224
  expect(apiService.inviteProtonUser).toHaveBeenCalled();
192
225
  expect(nodesService.notifyNodeChanged).toHaveBeenCalledWith(nodeUid);
193
226
  });
194
- })
227
+ });
195
228
 
196
- describe("shareNode with share re-use", () => {
197
- const nodeUid = "volumeId~nodeUid";
229
+ describe('shareNode with share re-use', () => {
230
+ const nodeUid = 'volumeId~nodeUid';
198
231
 
199
232
  let invitation: ProtonInvitation;
200
233
  let externalInvitation: NonProtonInvitation;
@@ -202,56 +235,53 @@ describe("SharingManagement", () => {
202
235
 
203
236
  beforeEach(async () => {
204
237
  invitation = {
205
- uid: "invitation",
206
- addedByEmail: resultOk("added-email"),
207
- inviteeEmail: "internal-email",
238
+ uid: 'invitation',
239
+ addedByEmail: resultOk('added-email'),
240
+ inviteeEmail: 'internal-email',
208
241
  role: MemberRole.Viewer,
209
242
  invitationTime: new Date(),
210
243
  };
211
244
  externalInvitation = {
212
- uid: "external-invitation",
213
- addedByEmail: resultOk("added-email"),
214
- inviteeEmail: "external-email",
245
+ uid: 'external-invitation',
246
+ addedByEmail: resultOk('added-email'),
247
+ inviteeEmail: 'external-email',
215
248
  role: MemberRole.Viewer,
216
249
  invitationTime: new Date(),
217
250
  state: NonProtonInvitationState.Pending,
218
251
  };
219
252
  member = {
220
- uid: "member",
221
- addedByEmail: resultOk("added-email"),
222
- inviteeEmail: "member-email",
253
+ uid: 'member',
254
+ addedByEmail: resultOk('added-email'),
255
+ inviteeEmail: 'member-email',
223
256
  role: MemberRole.Viewer,
224
257
  invitationTime: new Date(),
225
258
  };
226
259
 
227
- apiService.getShareInvitations = jest.fn().mockResolvedValue([
228
- invitation,
229
- ]);
260
+ apiService.getShareInvitations = jest.fn().mockResolvedValue([invitation]);
230
261
 
231
- apiService.getShareExternalInvitations = jest.fn().mockResolvedValue([
232
- externalInvitation,
233
- ]);
262
+ apiService.getShareExternalInvitations = jest.fn().mockResolvedValue([externalInvitation]);
234
263
 
235
- apiService.getShareMembers = jest.fn().mockResolvedValue([
236
- member,
237
- ]);
264
+ apiService.getShareMembers = jest.fn().mockResolvedValue([member]);
238
265
  });
239
266
 
240
- describe("invitations", () => {
267
+ describe('invitations', () => {
241
268
  beforeEach(() => {
242
269
  accountService.hasProtonAccount = jest.fn().mockResolvedValue(true);
243
270
  });
244
271
 
245
- it("should share node with proton email with default role", async () => {
246
- const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: ["email"] });
272
+ it('should share node with proton email with default role', async () => {
273
+ const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: ['email'] });
247
274
 
248
275
  expect(sharingInfo).toEqual({
249
- protonInvitations: [invitation, {
250
- uid: "created-invitation",
251
- addedByEmail: { ok: true, value: "volume-email" },
252
- inviteeEmail: "email",
253
- role: "viewer",
254
- }],
276
+ protonInvitations: [
277
+ invitation,
278
+ {
279
+ uid: 'created-invitation',
280
+ addedByEmail: { ok: true, value: 'volume-email' },
281
+ inviteeEmail: 'email',
282
+ role: 'viewer',
283
+ },
284
+ ],
255
285
  nonProtonInvitations: [externalInvitation],
256
286
  members: [member],
257
287
  publicLink: undefined,
@@ -260,16 +290,21 @@ describe("SharingManagement", () => {
260
290
  expect(apiService.inviteProtonUser).toHaveBeenCalled();
261
291
  });
262
292
 
263
- it("should share node with proton email with specific role", async () => {
264
- const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: [{ email: "email", role: MemberRole.Editor }] });
293
+ it('should share node with proton email with specific role', async () => {
294
+ const sharingInfo = await sharingManagement.shareNode(nodeUid, {
295
+ users: [{ email: 'email', role: MemberRole.Editor }],
296
+ });
265
297
 
266
298
  expect(sharingInfo).toEqual({
267
- protonInvitations: [invitation, {
268
- uid: "created-invitation",
269
- addedByEmail: { ok: true, value: "volume-email" },
270
- inviteeEmail: "email",
271
- role: "editor",
272
- }],
299
+ protonInvitations: [
300
+ invitation,
301
+ {
302
+ uid: 'created-invitation',
303
+ addedByEmail: { ok: true, value: 'volume-email' },
304
+ inviteeEmail: 'email',
305
+ role: 'editor',
306
+ },
307
+ ],
273
308
  nonProtonInvitations: [externalInvitation],
274
309
  members: [member],
275
310
  publicLink: undefined,
@@ -278,14 +313,18 @@ describe("SharingManagement", () => {
278
313
  expect(apiService.inviteProtonUser).toHaveBeenCalled();
279
314
  });
280
315
 
281
- it("should update existing role", async () => {
282
- const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: [{ email: "internal-email", role: MemberRole.Editor }] });
316
+ it('should update existing role', async () => {
317
+ const sharingInfo = await sharingManagement.shareNode(nodeUid, {
318
+ users: [{ email: 'internal-email', role: MemberRole.Editor }],
319
+ });
283
320
 
284
321
  expect(sharingInfo).toEqual({
285
- protonInvitations: [{
286
- ...invitation,
287
- role: "editor",
288
- }],
322
+ protonInvitations: [
323
+ {
324
+ ...invitation,
325
+ role: 'editor',
326
+ },
327
+ ],
289
328
  nonProtonInvitations: [externalInvitation],
290
329
  members: [member],
291
330
  publicLink: undefined,
@@ -294,8 +333,10 @@ describe("SharingManagement", () => {
294
333
  expect(apiService.inviteProtonUser).not.toHaveBeenCalled();
295
334
  });
296
335
 
297
- it("should be no-op if no change", async () => {
298
- const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: [{ email: "internal-email", role: MemberRole.Viewer }] });
336
+ it('should be no-op if no change', async () => {
337
+ const sharingInfo = await sharingManagement.shareNode(nodeUid, {
338
+ users: [{ email: 'internal-email', role: MemberRole.Viewer }],
339
+ });
299
340
 
300
341
  expect(sharingInfo).toEqual({
301
342
  protonInvitations: [invitation],
@@ -308,23 +349,26 @@ describe("SharingManagement", () => {
308
349
  });
309
350
  });
310
351
 
311
- describe("external invitations", () => {
352
+ describe('external invitations', () => {
312
353
  beforeEach(() => {
313
354
  accountService.hasProtonAccount = jest.fn().mockResolvedValue(false);
314
355
  });
315
356
 
316
- it("should share node with external email with default role", async () => {
317
- const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: ["email"] });
357
+ it('should share node with external email with default role', async () => {
358
+ const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: ['email'] });
318
359
 
319
360
  expect(sharingInfo).toEqual({
320
361
  protonInvitations: [invitation],
321
- nonProtonInvitations: [externalInvitation, {
322
- uid: "created-external-invitation",
323
- addedByEmail: { ok: true, value: "volume-email" },
324
- inviteeEmail: "email",
325
- role: "viewer",
326
- state: "pending",
327
- }],
362
+ nonProtonInvitations: [
363
+ externalInvitation,
364
+ {
365
+ uid: 'created-external-invitation',
366
+ addedByEmail: { ok: true, value: 'volume-email' },
367
+ inviteeEmail: 'email',
368
+ role: 'viewer',
369
+ state: 'pending',
370
+ },
371
+ ],
328
372
  members: [member],
329
373
  publicLink: undefined,
330
374
  });
@@ -332,18 +376,23 @@ describe("SharingManagement", () => {
332
376
  expect(apiService.inviteExternalUser).toHaveBeenCalled();
333
377
  });
334
378
 
335
- it("should share node with external email with specific role", async () => {
336
- const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: [{ email: "email", role: MemberRole.Editor }] });
379
+ it('should share node with external email with specific role', async () => {
380
+ const sharingInfo = await sharingManagement.shareNode(nodeUid, {
381
+ users: [{ email: 'email', role: MemberRole.Editor }],
382
+ });
337
383
 
338
384
  expect(sharingInfo).toEqual({
339
385
  protonInvitations: [invitation],
340
- nonProtonInvitations: [externalInvitation, {
341
- uid: "created-external-invitation",
342
- addedByEmail: { ok: true, value: "volume-email" },
343
- inviteeEmail: "email",
344
- role: "editor",
345
- state: "pending",
346
- }],
386
+ nonProtonInvitations: [
387
+ externalInvitation,
388
+ {
389
+ uid: 'created-external-invitation',
390
+ addedByEmail: { ok: true, value: 'volume-email' },
391
+ inviteeEmail: 'email',
392
+ role: 'editor',
393
+ state: 'pending',
394
+ },
395
+ ],
347
396
  members: [member],
348
397
  publicLink: undefined,
349
398
  });
@@ -351,15 +400,19 @@ describe("SharingManagement", () => {
351
400
  expect(apiService.inviteExternalUser).toHaveBeenCalled();
352
401
  });
353
402
 
354
- it("should update existing role", async () => {
355
- const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: [{ email: "external-email", role: MemberRole.Editor }] });
403
+ it('should update existing role', async () => {
404
+ const sharingInfo = await sharingManagement.shareNode(nodeUid, {
405
+ users: [{ email: 'external-email', role: MemberRole.Editor }],
406
+ });
356
407
 
357
408
  expect(sharingInfo).toEqual({
358
409
  protonInvitations: [invitation],
359
- nonProtonInvitations: [{
360
- ...externalInvitation,
361
- role: "editor",
362
- }],
410
+ nonProtonInvitations: [
411
+ {
412
+ ...externalInvitation,
413
+ role: 'editor',
414
+ },
415
+ ],
363
416
  members: [member],
364
417
  publicLink: undefined,
365
418
  });
@@ -367,8 +420,10 @@ describe("SharingManagement", () => {
367
420
  expect(apiService.inviteExternalUser).not.toHaveBeenCalled();
368
421
  });
369
422
 
370
- it("should be no-op if no change", async () => {
371
- const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: [{ email: "external-email", role: MemberRole.Viewer }] });
423
+ it('should be no-op if no change', async () => {
424
+ const sharingInfo = await sharingManagement.shareNode(nodeUid, {
425
+ users: [{ email: 'external-email', role: MemberRole.Viewer }],
426
+ });
372
427
 
373
428
  expect(sharingInfo).toEqual({
374
429
  protonInvitations: [invitation],
@@ -381,54 +436,70 @@ describe("SharingManagement", () => {
381
436
  });
382
437
  });
383
438
 
384
- describe("mix of internal and external invitations", () => {
439
+ describe('mix of internal and external invitations', () => {
385
440
  beforeEach(() => {
386
- accountService.hasProtonAccount = jest.fn()
387
- .mockResolvedValueOnce(true)
388
- .mockResolvedValueOnce(false);
441
+ accountService.hasProtonAccount = jest.fn().mockResolvedValueOnce(true).mockResolvedValueOnce(false);
389
442
  });
390
443
 
391
- it("should share node with proton and external email with default role", async () => {
392
- const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: ["email", "email2"] });
444
+ it('should share node with proton and external email with default role', async () => {
445
+ const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: ['email', 'email2'] });
393
446
 
394
447
  expect(sharingInfo).toEqual({
395
- protonInvitations: [invitation, {
396
- uid: "created-invitation",
397
- addedByEmail: { ok: true, value: "volume-email" },
398
- inviteeEmail: "email",
399
- role: "viewer",
400
- }],
401
- nonProtonInvitations: [externalInvitation, {
402
- uid: "created-external-invitation",
403
- addedByEmail: { ok: true, value: "volume-email" },
404
- inviteeEmail: "email2",
405
- role: "viewer",
406
- state: "pending",
407
- }],
448
+ protonInvitations: [
449
+ invitation,
450
+ {
451
+ uid: 'created-invitation',
452
+ addedByEmail: { ok: true, value: 'volume-email' },
453
+ inviteeEmail: 'email',
454
+ role: 'viewer',
455
+ },
456
+ ],
457
+ nonProtonInvitations: [
458
+ externalInvitation,
459
+ {
460
+ uid: 'created-external-invitation',
461
+ addedByEmail: { ok: true, value: 'volume-email' },
462
+ inviteeEmail: 'email2',
463
+ role: 'viewer',
464
+ state: 'pending',
465
+ },
466
+ ],
408
467
  members: [member],
409
468
  publicLink: undefined,
410
469
  });
411
470
  expect(apiService.updateInvitation).not.toHaveBeenCalled();
412
- expect(apiService.inviteProtonUser).toHaveBeenCalledWith("shareId", expect.objectContaining({
413
- inviteeEmail: "email",
414
- }), expect.anything());
415
- expect(apiService.inviteExternalUser).toHaveBeenCalledWith("shareId", expect.objectContaining({
416
- inviteeEmail: "email2",
417
- }), expect.anything());
471
+ expect(apiService.inviteProtonUser).toHaveBeenCalledWith(
472
+ 'shareId',
473
+ expect.objectContaining({
474
+ inviteeEmail: 'email',
475
+ }),
476
+ expect.anything(),
477
+ );
478
+ expect(apiService.inviteExternalUser).toHaveBeenCalledWith(
479
+ 'shareId',
480
+ expect.objectContaining({
481
+ inviteeEmail: 'email2',
482
+ }),
483
+ expect.anything(),
484
+ );
418
485
  });
419
486
  });
420
487
 
421
- describe("members", () => {
422
- it("should update member via proton user", async () => {
423
- const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: [{ email: "member-email", role: MemberRole.Editor }] });
488
+ describe('members', () => {
489
+ it('should update member via proton user', async () => {
490
+ const sharingInfo = await sharingManagement.shareNode(nodeUid, {
491
+ users: [{ email: 'member-email', role: MemberRole.Editor }],
492
+ });
424
493
 
425
494
  expect(sharingInfo).toEqual({
426
495
  protonInvitations: [invitation],
427
496
  nonProtonInvitations: [externalInvitation],
428
- members: [{
429
- ...member,
430
- role: "editor",
431
- }],
497
+ members: [
498
+ {
499
+ ...member,
500
+ role: 'editor',
501
+ },
502
+ ],
432
503
  publicLink: undefined,
433
504
  });
434
505
  expect(apiService.updateMember).toHaveBeenCalled();
@@ -436,8 +507,10 @@ describe("SharingManagement", () => {
436
507
  expect(apiService.inviteProtonUser).not.toHaveBeenCalled();
437
508
  });
438
509
 
439
- it("should be no-op if no change via proton user", async () => {
440
- const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: [{ email: "member-email", role: MemberRole.Viewer }] });
510
+ it('should be no-op if no change via proton user', async () => {
511
+ const sharingInfo = await sharingManagement.shareNode(nodeUid, {
512
+ users: [{ email: 'member-email', role: MemberRole.Viewer }],
513
+ });
441
514
 
442
515
  expect(sharingInfo).toEqual({
443
516
  protonInvitations: [invitation],
@@ -450,16 +523,20 @@ describe("SharingManagement", () => {
450
523
  expect(apiService.inviteProtonUser).not.toHaveBeenCalled();
451
524
  });
452
525
 
453
- it("should update member via non-proton user", async () => {
454
- const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: [{ email: "member-email", role: MemberRole.Editor }] });
526
+ it('should update member via non-proton user', async () => {
527
+ const sharingInfo = await sharingManagement.shareNode(nodeUid, {
528
+ users: [{ email: 'member-email', role: MemberRole.Editor }],
529
+ });
455
530
 
456
531
  expect(sharingInfo).toEqual({
457
532
  protonInvitations: [invitation],
458
533
  nonProtonInvitations: [externalInvitation],
459
- members: [{
460
- ...member,
461
- role: "editor",
462
- }],
534
+ members: [
535
+ {
536
+ ...member,
537
+ role: 'editor',
538
+ },
539
+ ],
463
540
  publicLink: undefined,
464
541
  });
465
542
  expect(apiService.updateMember).toHaveBeenCalled();
@@ -467,8 +544,10 @@ describe("SharingManagement", () => {
467
544
  expect(apiService.inviteProtonUser).not.toHaveBeenCalled();
468
545
  });
469
546
 
470
- it("should be no-op if no change via non-proton user", async () => {
471
- const sharingInfo = await sharingManagement.shareNode(nodeUid, { users: [{ email: "member-email", role: MemberRole.Viewer }] });
547
+ it('should be no-op if no change via non-proton user', async () => {
548
+ const sharingInfo = await sharingManagement.shareNode(nodeUid, {
549
+ users: [{ email: 'member-email', role: MemberRole.Viewer }],
550
+ });
472
551
 
473
552
  expect(sharingInfo).toEqual({
474
553
  protonInvitations: [invitation],
@@ -482,8 +561,8 @@ describe("SharingManagement", () => {
482
561
  });
483
562
  });
484
563
 
485
- describe("public link", () => {
486
- it("should share node with public link", async () => {
564
+ describe('public link', () => {
565
+ it('should share node with public link', async () => {
487
566
  jest.useFakeTimers();
488
567
  jest.setSystemTime(new Date('2025-01-01'));
489
568
 
@@ -500,35 +579,42 @@ describe("SharingManagement", () => {
500
579
  nonProtonInvitations: [externalInvitation],
501
580
  members: [member],
502
581
  publicLink: {
503
- uid: "publicLinkUid",
582
+ uid: 'publicLinkUid',
504
583
  role: MemberRole.Viewer,
505
- url: "publicLinkUrl#generatedPassword",
584
+ url: 'publicLinkUrl#generatedPassword',
506
585
  creationTime: new Date(),
507
586
  expirationTime: undefined,
508
587
  customPassword: undefined,
509
- creatorEmail: "volume-email",
588
+ creatorEmail: 'volume-email',
510
589
  numberOfInitializedDownloads: 0,
511
590
  },
512
591
  });
513
592
  expect(cryptoService.generatePublicLinkPassword).toHaveBeenCalled();
514
- expect(cryptoService.encryptPublicLink).toHaveBeenCalledWith("volume-email", "sharePassphraseSessionKey", "generatedPassword");
515
- expect(apiService.createPublicLink).toHaveBeenCalledWith("shareId", expect.objectContaining({
516
- role: MemberRole.Viewer,
517
- includesCustomPassword: false,
518
- expirationTime: undefined,
519
- crypto: "publicLinkCrypto",
520
- srp: "publicLinkSrp",
521
- }));
593
+ expect(cryptoService.encryptPublicLink).toHaveBeenCalledWith(
594
+ 'volume-email',
595
+ 'sharePassphraseSessionKey',
596
+ 'generatedPassword',
597
+ );
598
+ expect(apiService.createPublicLink).toHaveBeenCalledWith(
599
+ 'shareId',
600
+ expect.objectContaining({
601
+ role: MemberRole.Viewer,
602
+ includesCustomPassword: false,
603
+ expirationTime: undefined,
604
+ crypto: 'publicLinkCrypto',
605
+ srp: 'publicLinkSrp',
606
+ }),
607
+ );
522
608
  });
523
609
 
524
- it("should share node with custom password and expiration", async () => {
610
+ it('should share node with custom password and expiration', async () => {
525
611
  jest.useFakeTimers();
526
612
  jest.setSystemTime(new Date('2025-01-01'));
527
613
 
528
614
  const sharingInfo = await sharingManagement.shareNode(nodeUid, {
529
615
  publicLink: {
530
616
  role: MemberRole.Viewer,
531
- customPassword: "customPassword",
617
+ customPassword: 'customPassword',
532
618
  expiration: new Date('2025-01-02'),
533
619
  },
534
620
  });
@@ -538,46 +624,53 @@ describe("SharingManagement", () => {
538
624
  nonProtonInvitations: [externalInvitation],
539
625
  members: [member],
540
626
  publicLink: {
541
- uid: "publicLinkUid",
627
+ uid: 'publicLinkUid',
542
628
  role: MemberRole.Viewer,
543
- url: "publicLinkUrl#generatedPassword",
629
+ url: 'publicLinkUrl#generatedPassword',
544
630
  creationTime: new Date(),
545
631
  expirationTime: new Date('2025-01-02'),
546
- customPassword: "customPassword",
547
- creatorEmail: "volume-email",
632
+ customPassword: 'customPassword',
633
+ creatorEmail: 'volume-email',
548
634
  numberOfInitializedDownloads: 0,
549
635
  },
550
636
  });
551
637
  expect(cryptoService.generatePublicLinkPassword).toHaveBeenCalled();
552
- expect(cryptoService.encryptPublicLink).toHaveBeenCalledWith("volume-email", "sharePassphraseSessionKey", "generatedPasswordcustomPassword");
553
- expect(apiService.createPublicLink).toHaveBeenCalledWith("shareId", expect.objectContaining({
554
- role: MemberRole.Viewer,
555
- includesCustomPassword: true,
556
- expirationTime: 1735776000,
557
- crypto: "publicLinkCrypto",
558
- srp: "publicLinkSrp",
559
- }));
638
+ expect(cryptoService.encryptPublicLink).toHaveBeenCalledWith(
639
+ 'volume-email',
640
+ 'sharePassphraseSessionKey',
641
+ 'generatedPasswordcustomPassword',
642
+ );
643
+ expect(apiService.createPublicLink).toHaveBeenCalledWith(
644
+ 'shareId',
645
+ expect.objectContaining({
646
+ role: MemberRole.Viewer,
647
+ includesCustomPassword: true,
648
+ expirationTime: 1735776000,
649
+ crypto: 'publicLinkCrypto',
650
+ srp: 'publicLinkSrp',
651
+ }),
652
+ );
560
653
  });
561
654
 
562
- it("should update public link with custom password and expiration", async () => {
655
+ it('should update public link with custom password and expiration', async () => {
563
656
  jest.useFakeTimers();
564
657
  jest.setSystemTime(new Date('2025-01-01'));
565
658
 
566
659
  const publicLink = {
567
660
  uid: 'publicLinkUid',
568
- url: "publicLinkUrl#generatedpas", // Generated password must be 12 chararacters long.
661
+ url: 'publicLinkUrl#generatedpas', // Generated password must be 12 chararacters long.
569
662
  creationTime: new Date('2025-01-01'),
570
663
  role: MemberRole.Viewer,
571
664
  customPassword: undefined,
572
665
  expirationTime: undefined,
573
- creatorEmail: "publicLinkCreatorEmail",
574
- }
666
+ creatorEmail: 'publicLinkCreatorEmail',
667
+ };
575
668
  apiService.getPublicLink = jest.fn().mockResolvedValue(publicLink);
576
669
 
577
670
  const sharingInfo = await sharingManagement.shareNode(nodeUid, {
578
671
  publicLink: {
579
672
  role: MemberRole.Editor,
580
- customPassword: "customPassword",
673
+ customPassword: 'customPassword',
581
674
  expiration: new Date('2025-01-02'),
582
675
  },
583
676
  });
@@ -587,65 +680,78 @@ describe("SharingManagement", () => {
587
680
  nonProtonInvitations: [externalInvitation],
588
681
  members: [member],
589
682
  publicLink: {
590
- uid: "publicLinkUid",
683
+ uid: 'publicLinkUid',
591
684
  role: MemberRole.Editor,
592
- url: "publicLinkUrl#generatedpas",
685
+ url: 'publicLinkUrl#generatedpas',
593
686
  creationTime: new Date('2025-01-01'),
594
687
  expirationTime: new Date('2025-01-02'),
595
- customPassword: "customPassword",
596
- creatorEmail: "publicLinkCreatorEmail",
688
+ customPassword: 'customPassword',
689
+ creatorEmail: 'publicLinkCreatorEmail',
597
690
  },
598
691
  });
599
- expect(cryptoService.encryptPublicLink).toHaveBeenCalledWith("publicLinkCreatorEmail", "sharePassphraseSessionKey", "generatedpascustomPassword");
600
- expect(apiService.updatePublicLink).toHaveBeenCalledWith("publicLinkUid", expect.objectContaining({
601
- role: MemberRole.Editor,
602
- includesCustomPassword: true,
603
- expirationTime: 1735776000,
604
- crypto: "publicLinkCrypto",
605
- srp: "publicLinkSrp",
606
- }));
692
+ expect(cryptoService.encryptPublicLink).toHaveBeenCalledWith(
693
+ 'publicLinkCreatorEmail',
694
+ 'sharePassphraseSessionKey',
695
+ 'generatedpascustomPassword',
696
+ );
697
+ expect(apiService.updatePublicLink).toHaveBeenCalledWith(
698
+ 'publicLinkUid',
699
+ expect.objectContaining({
700
+ role: MemberRole.Editor,
701
+ includesCustomPassword: true,
702
+ expirationTime: 1735776000,
703
+ crypto: 'publicLinkCrypto',
704
+ srp: 'publicLinkSrp',
705
+ }),
706
+ );
607
707
  });
608
708
 
609
- it("should not allow updating legacy public link", async () => {
709
+ it('should not allow updating legacy public link', async () => {
610
710
  apiService.getPublicLink = jest.fn().mockResolvedValue({
611
711
  uid: 'publicLinkUid',
612
- url: "publicLinkUrl#aaa", // Legacy public links doesn't have 12 chars.
712
+ url: 'publicLinkUrl#aaa', // Legacy public links doesn't have 12 chars.
613
713
  });
614
714
 
615
- await expect(sharingManagement.shareNode(nodeUid, {
616
- publicLink: true,
617
- })).rejects.toThrow("Legacy public link cannot be updated. Please re-create a new public link.");
715
+ await expect(
716
+ sharingManagement.shareNode(nodeUid, {
717
+ publicLink: true,
718
+ }),
719
+ ).rejects.toThrow('Legacy public link cannot be updated. Please re-create a new public link.');
618
720
  });
619
721
 
620
- it("should not allow updating legacy public link without generated password", async () => {
722
+ it('should not allow updating legacy public link without generated password', async () => {
621
723
  apiService.getPublicLink = jest.fn().mockResolvedValue({
622
724
  uid: 'publicLinkUid',
623
- url: "publicLinkUrl",
725
+ url: 'publicLinkUrl',
624
726
  });
625
727
 
626
- await expect(sharingManagement.shareNode(nodeUid, {
627
- publicLink: true,
628
- })).rejects.toThrow("Legacy public link cannot be updated. Please re-create a new public link.");
728
+ await expect(
729
+ sharingManagement.shareNode(nodeUid, {
730
+ publicLink: true,
731
+ }),
732
+ ).rejects.toThrow('Legacy public link cannot be updated. Please re-create a new public link.');
629
733
  });
630
734
 
631
- it("should not allow creating public link with expiration in the past", async () => {
735
+ it('should not allow creating public link with expiration in the past', async () => {
632
736
  jest.useFakeTimers();
633
737
  jest.setSystemTime(new Date('2025-01-01'));
634
738
 
635
- await expect(sharingManagement.shareNode(nodeUid, {
636
- publicLink: {
637
- role: MemberRole.Viewer,
638
- expiration: new Date('2024-01-01'),
639
- },
640
- })).rejects.toThrow("Expiration date cannot be in the past");
739
+ await expect(
740
+ sharingManagement.shareNode(nodeUid, {
741
+ publicLink: {
742
+ role: MemberRole.Viewer,
743
+ expiration: new Date('2024-01-01'),
744
+ },
745
+ }),
746
+ ).rejects.toThrow('Expiration date cannot be in the past');
641
747
  expect(apiService.createStandardShare).not.toHaveBeenCalled();
642
748
  expect(apiService.createPublicLink).not.toHaveBeenCalled();
643
749
  });
644
750
  });
645
751
  });
646
752
 
647
- describe("unshareNode", () => {
648
- const nodeUid = "volumeId~nodeUid";
753
+ describe('unshareNode', () => {
754
+ const nodeUid = 'volumeId~nodeUid';
649
755
 
650
756
  let invitation: ProtonInvitation;
651
757
  let externalInvitation: NonProtonInvitation;
@@ -654,49 +760,43 @@ describe("SharingManagement", () => {
654
760
 
655
761
  beforeEach(async () => {
656
762
  invitation = {
657
- uid: "invitation",
658
- addedByEmail: resultOk("added-email"),
659
- inviteeEmail: "internal-email",
763
+ uid: 'invitation',
764
+ addedByEmail: resultOk('added-email'),
765
+ inviteeEmail: 'internal-email',
660
766
  role: MemberRole.Viewer,
661
767
  invitationTime: new Date(),
662
768
  };
663
769
  externalInvitation = {
664
- uid: "external-invitation",
665
- addedByEmail: resultOk("added-email"),
666
- inviteeEmail: "external-email",
770
+ uid: 'external-invitation',
771
+ addedByEmail: resultOk('added-email'),
772
+ inviteeEmail: 'external-email',
667
773
  role: MemberRole.Viewer,
668
774
  invitationTime: new Date(),
669
775
  state: NonProtonInvitationState.Pending,
670
776
  };
671
777
  member = {
672
- uid: "member",
673
- addedByEmail: resultOk("added-email"),
674
- inviteeEmail: "member-email",
778
+ uid: 'member',
779
+ addedByEmail: resultOk('added-email'),
780
+ inviteeEmail: 'member-email',
675
781
  role: MemberRole.Viewer,
676
782
  invitationTime: new Date(),
677
783
  };
678
784
  publicLink = {
679
- uid: "publicLink",
785
+ uid: 'publicLink',
680
786
  creationTime: new Date(),
681
787
  role: MemberRole.Viewer,
682
- url: "url",
788
+ url: 'url',
683
789
  numberOfInitializedDownloads: 0,
684
- }
685
-
686
- apiService.getShareInvitations = jest.fn().mockResolvedValue([
687
- invitation,
688
- ]);
689
- apiService.getShareExternalInvitations = jest.fn().mockResolvedValue([
690
- externalInvitation,
691
- ]);
692
- apiService.getShareMembers = jest.fn().mockResolvedValue([
693
- member,
694
- ]);
790
+ };
791
+
792
+ apiService.getShareInvitations = jest.fn().mockResolvedValue([invitation]);
793
+ apiService.getShareExternalInvitations = jest.fn().mockResolvedValue([externalInvitation]);
794
+ apiService.getShareMembers = jest.fn().mockResolvedValue([member]);
695
795
  apiService.getPublicLink = jest.fn().mockResolvedValue(publicLink);
696
796
  });
697
797
 
698
- it("should delete invitation", async () => {
699
- const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: ["internal-email"] });
798
+ it('should delete invitation', async () => {
799
+ const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: ['internal-email'] });
700
800
 
701
801
  expect(sharingInfo).toEqual({
702
802
  protonInvitations: [],
@@ -711,8 +811,8 @@ describe("SharingManagement", () => {
711
811
  expect(apiService.removePublicLink).not.toHaveBeenCalled();
712
812
  });
713
813
 
714
- it("should delete external invitation", async () => {
715
- const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: ["external-email"] });
814
+ it('should delete external invitation', async () => {
815
+ const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: ['external-email'] });
716
816
 
717
817
  expect(sharingInfo).toEqual({
718
818
  protonInvitations: [invitation],
@@ -727,8 +827,8 @@ describe("SharingManagement", () => {
727
827
  expect(apiService.removePublicLink).not.toHaveBeenCalled();
728
828
  });
729
829
 
730
- it("should remove member", async () => {
731
- const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: ["member-email"] });
830
+ it('should remove member', async () => {
831
+ const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: ['member-email'] });
732
832
 
733
833
  expect(sharingInfo).toEqual({
734
834
  protonInvitations: [invitation],
@@ -743,8 +843,8 @@ describe("SharingManagement", () => {
743
843
  expect(apiService.removePublicLink).not.toHaveBeenCalled();
744
844
  });
745
845
 
746
- it("should be no-op if not shared with email", async () => {
747
- const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: ["non-existing-email"] });
846
+ it('should be no-op if not shared with email', async () => {
847
+ const sharingInfo = await sharingManagement.unshareNode(nodeUid, { users: ['non-existing-email'] });
748
848
 
749
849
  expect(sharingInfo).toEqual({
750
850
  protonInvitations: [invitation],
@@ -759,8 +859,8 @@ describe("SharingManagement", () => {
759
859
  expect(apiService.removePublicLink).not.toHaveBeenCalled();
760
860
  });
761
861
 
762
- it("should remove public link", async () => {
763
- const sharingInfo = await sharingManagement.unshareNode(nodeUid, { publicLink: "remove" });
862
+ it('should remove public link', async () => {
863
+ const sharingInfo = await sharingManagement.unshareNode(nodeUid, { publicLink: 'remove' });
764
864
 
765
865
  expect(sharingInfo).toEqual({
766
866
  protonInvitations: [invitation],
@@ -775,7 +875,7 @@ describe("SharingManagement", () => {
775
875
  expect(apiService.removePublicLink).toHaveBeenCalled();
776
876
  });
777
877
 
778
- it("should remove share if all is removed", async () => {
878
+ it('should remove share if all is removed', async () => {
779
879
  const sharingInfo = await sharingManagement.unshareNode(nodeUid);
780
880
 
781
881
  expect(sharingInfo).toEqual(undefined);
@@ -787,10 +887,10 @@ describe("SharingManagement", () => {
787
887
  expect(nodesService.notifyNodeChanged).toHaveBeenCalled();
788
888
  });
789
889
 
790
- it("should remove share if everything is manually removed", async () => {
890
+ it('should remove share if everything is manually removed', async () => {
791
891
  const sharingInfo = await sharingManagement.unshareNode(nodeUid, {
792
- users: ["internal-email", "external-email", "member-email"],
793
- publicLink: "remove",
892
+ users: ['internal-email', 'external-email', 'member-email'],
893
+ publicLink: 'remove',
794
894
  });
795
895
 
796
896
  expect(sharingInfo).toEqual(undefined);
@@ -802,20 +902,20 @@ describe("SharingManagement", () => {
802
902
  });
803
903
  });
804
904
 
805
- describe("resendInvitationEmail", () => {
806
- const nodeUid = "volumeId~nodeUid";
905
+ describe('resendInvitationEmail', () => {
906
+ const nodeUid = 'volumeId~nodeUid';
807
907
 
808
908
  const invitation: ProtonInvitation = {
809
- uid: "invitation",
810
- addedByEmail: resultOk("added-email"),
811
- inviteeEmail: "internal-email",
909
+ uid: 'invitation',
910
+ addedByEmail: resultOk('added-email'),
911
+ inviteeEmail: 'internal-email',
812
912
  role: MemberRole.Viewer,
813
913
  invitationTime: new Date(),
814
914
  };
815
915
  const externalInvitation: NonProtonInvitation = {
816
- uid: "external-invitation",
817
- addedByEmail: resultOk("added-email"),
818
- inviteeEmail: "external-email",
916
+ uid: 'external-invitation',
917
+ addedByEmail: resultOk('added-email'),
918
+ inviteeEmail: 'external-email',
819
919
  role: MemberRole.Viewer,
820
920
  invitationTime: new Date(),
821
921
  state: NonProtonInvitationState.Pending,
@@ -828,35 +928,35 @@ describe("SharingManagement", () => {
828
928
  apiService.getPublicLink = jest.fn().mockResolvedValue(undefined);
829
929
  });
830
930
 
831
- it("should resend email for proton invitation", async () => {
931
+ it('should resend email for proton invitation', async () => {
832
932
  await sharingManagement.resendInvitationEmail(nodeUid, invitation.uid);
833
933
 
834
934
  expect(apiService.resendInvitationEmail).toHaveBeenCalledWith(invitation.uid);
835
935
  expect(apiService.resendExternalInvitationEmail).not.toHaveBeenCalled();
836
936
  });
837
937
 
838
- it("should resend email for external invitation", async () => {
938
+ it('should resend email for external invitation', async () => {
839
939
  await sharingManagement.resendInvitationEmail(nodeUid, externalInvitation.uid);
840
940
 
841
941
  expect(apiService.resendExternalInvitationEmail).toHaveBeenCalledWith(externalInvitation.uid);
842
942
  expect(apiService.resendInvitationEmail).not.toHaveBeenCalled();
843
943
  });
844
944
 
845
- it("should throw error when no sharing found for node", async () => {
945
+ it('should throw error when no sharing found for node', async () => {
846
946
  nodesService.getNode = jest.fn().mockResolvedValue({ nodeUid, shareId: undefined });
847
947
 
848
- await expect(
849
- sharingManagement.resendInvitationEmail(nodeUid, invitation.uid)
850
- ).rejects.toThrow("Node is not shared");
948
+ await expect(sharingManagement.resendInvitationEmail(nodeUid, invitation.uid)).rejects.toThrow(
949
+ 'Node is not shared',
950
+ );
851
951
 
852
952
  expect(apiService.resendInvitationEmail).not.toHaveBeenCalled();
853
953
  expect(apiService.resendExternalInvitationEmail).not.toHaveBeenCalled();
854
954
  });
855
955
 
856
- it("should log when no invitation found", async () => {
857
- await expect(
858
- sharingManagement.resendInvitationEmail(nodeUid, "non-existent-uid")
859
- ).rejects.toThrow("Invitation not found");
956
+ it('should log when no invitation found', async () => {
957
+ await expect(sharingManagement.resendInvitationEmail(nodeUid, 'non-existent-uid')).rejects.toThrow(
958
+ 'Invitation not found',
959
+ );
860
960
 
861
961
  expect(apiService.resendInvitationEmail).not.toHaveBeenCalled();
862
962
  expect(apiService.resendExternalInvitationEmail).not.toHaveBeenCalled();