@protontech/drive-sdk 0.0.12 → 0.1.0

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 (274) hide show
  1. package/dist/cache/index.d.ts +1 -0
  2. package/dist/cache/index.js +3 -1
  3. package/dist/cache/index.js.map +1 -1
  4. package/dist/cache/memoryCache.d.ts +1 -1
  5. package/dist/cache/nullCache.d.ts +14 -0
  6. package/dist/cache/nullCache.js +37 -0
  7. package/dist/cache/nullCache.js.map +1 -0
  8. package/dist/config.d.ts +16 -1
  9. package/dist/config.js +1 -1
  10. package/dist/config.js.map +1 -1
  11. package/dist/crypto/openPGPCrypto.js +2 -0
  12. package/dist/crypto/openPGPCrypto.js.map +1 -1
  13. package/dist/diagnostic/eventsGenerator.d.ts +14 -0
  14. package/dist/diagnostic/eventsGenerator.js +49 -0
  15. package/dist/diagnostic/eventsGenerator.js.map +1 -0
  16. package/dist/diagnostic/httpClient.d.ts +16 -0
  17. package/dist/diagnostic/httpClient.js +81 -0
  18. package/dist/diagnostic/httpClient.js.map +1 -0
  19. package/dist/diagnostic/index.d.ts +10 -0
  20. package/dist/diagnostic/index.js +35 -0
  21. package/dist/diagnostic/index.js.map +1 -0
  22. package/dist/diagnostic/integrityVerificationStream.d.ts +21 -0
  23. package/dist/diagnostic/integrityVerificationStream.js +56 -0
  24. package/dist/diagnostic/integrityVerificationStream.js.map +1 -0
  25. package/dist/diagnostic/interface.d.ts +102 -0
  26. package/dist/diagnostic/interface.js +3 -0
  27. package/dist/diagnostic/interface.js.map +1 -0
  28. package/dist/diagnostic/sdkDiagnostic.d.ts +22 -0
  29. package/dist/diagnostic/sdkDiagnostic.js +216 -0
  30. package/dist/diagnostic/sdkDiagnostic.js.map +1 -0
  31. package/dist/diagnostic/sdkDiagnosticFull.d.ts +18 -0
  32. package/dist/diagnostic/sdkDiagnosticFull.js +35 -0
  33. package/dist/diagnostic/sdkDiagnosticFull.js.map +1 -0
  34. package/dist/diagnostic/telemetry.d.ts +25 -0
  35. package/dist/diagnostic/telemetry.js +70 -0
  36. package/dist/diagnostic/telemetry.js.map +1 -0
  37. package/dist/diagnostic/zipGenerators.d.ts +9 -0
  38. package/dist/diagnostic/zipGenerators.js +64 -0
  39. package/dist/diagnostic/zipGenerators.js.map +1 -0
  40. package/dist/diagnostic/zipGenerators.test.js +144 -0
  41. package/dist/diagnostic/zipGenerators.test.js.map +1 -0
  42. package/dist/errors.d.ts +8 -3
  43. package/dist/errors.js +11 -4
  44. package/dist/errors.js.map +1 -1
  45. package/dist/interface/config.d.ts +26 -0
  46. package/dist/interface/config.js +3 -0
  47. package/dist/interface/config.js.map +1 -0
  48. package/dist/interface/download.d.ts +2 -2
  49. package/dist/interface/events.d.ts +60 -20
  50. package/dist/interface/events.js +11 -1
  51. package/dist/interface/events.js.map +1 -1
  52. package/dist/interface/httpClient.d.ts +0 -14
  53. package/dist/interface/index.d.ts +9 -5
  54. package/dist/interface/index.js +2 -1
  55. package/dist/interface/index.js.map +1 -1
  56. package/dist/interface/nodes.d.ts +21 -1
  57. package/dist/interface/nodes.js +11 -0
  58. package/dist/interface/nodes.js.map +1 -1
  59. package/dist/interface/sharing.d.ts +1 -0
  60. package/dist/interface/upload.d.ts +57 -3
  61. package/dist/internal/apiService/driveTypes.d.ts +1341 -465
  62. package/dist/internal/apiService/errors.js +2 -2
  63. package/dist/internal/apiService/errors.js.map +1 -1
  64. package/dist/internal/apiService/transformers.js +2 -0
  65. package/dist/internal/apiService/transformers.js.map +1 -1
  66. package/dist/internal/asyncIteratorMap.d.ts +15 -0
  67. package/dist/internal/asyncIteratorMap.js +59 -0
  68. package/dist/internal/asyncIteratorMap.js.map +1 -0
  69. package/dist/internal/asyncIteratorMap.test.js +120 -0
  70. package/dist/internal/asyncIteratorMap.test.js.map +1 -0
  71. package/dist/internal/download/apiService.js +32 -31
  72. package/dist/internal/download/apiService.js.map +1 -1
  73. package/dist/internal/download/fileDownloader.d.ts +2 -2
  74. package/dist/internal/download/fileDownloader.js.map +1 -1
  75. package/dist/internal/events/apiService.d.ts +4 -6
  76. package/dist/internal/events/apiService.js +15 -22
  77. package/dist/internal/events/apiService.js.map +1 -1
  78. package/dist/internal/events/coreEventManager.d.ts +7 -10
  79. package/dist/internal/events/coreEventManager.js +19 -36
  80. package/dist/internal/events/coreEventManager.js.map +1 -1
  81. package/dist/internal/events/coreEventManager.test.d.ts +1 -0
  82. package/dist/internal/events/coreEventManager.test.js +87 -0
  83. package/dist/internal/events/coreEventManager.test.js.map +1 -0
  84. package/dist/internal/events/eventManager.d.ts +11 -36
  85. package/dist/internal/events/eventManager.js +59 -105
  86. package/dist/internal/events/eventManager.js.map +1 -1
  87. package/dist/internal/events/eventManager.test.js +167 -82
  88. package/dist/internal/events/eventManager.test.js.map +1 -1
  89. package/dist/internal/events/index.d.ts +13 -33
  90. package/dist/internal/events/index.js +56 -72
  91. package/dist/internal/events/index.js.map +1 -1
  92. package/dist/internal/events/interface.d.ts +59 -14
  93. package/dist/internal/events/interface.js +13 -3
  94. package/dist/internal/events/interface.js.map +1 -1
  95. package/dist/internal/events/volumeEventManager.d.ts +7 -17
  96. package/dist/internal/events/volumeEventManager.js +58 -45
  97. package/dist/internal/events/volumeEventManager.js.map +1 -1
  98. package/dist/internal/events/volumeEventManager.test.d.ts +1 -0
  99. package/dist/internal/events/volumeEventManager.test.js +203 -0
  100. package/dist/internal/events/volumeEventManager.test.js.map +1 -0
  101. package/dist/internal/nodes/apiService.d.ts +2 -2
  102. package/dist/internal/nodes/apiService.js +16 -6
  103. package/dist/internal/nodes/apiService.js.map +1 -1
  104. package/dist/internal/nodes/apiService.test.js +30 -8
  105. package/dist/internal/nodes/apiService.test.js.map +1 -1
  106. package/dist/internal/nodes/cache.d.ts +10 -1
  107. package/dist/internal/nodes/cache.js +18 -0
  108. package/dist/internal/nodes/cache.js.map +1 -1
  109. package/dist/internal/nodes/cache.test.js +1 -0
  110. package/dist/internal/nodes/cache.test.js.map +1 -1
  111. package/dist/internal/nodes/cryptoService.d.ts +1 -1
  112. package/dist/internal/nodes/cryptoService.js.map +1 -1
  113. package/dist/internal/nodes/cryptoService.test.js +34 -0
  114. package/dist/internal/nodes/cryptoService.test.js.map +1 -1
  115. package/dist/internal/nodes/events.d.ts +7 -83
  116. package/dist/internal/nodes/events.js +43 -217
  117. package/dist/internal/nodes/events.js.map +1 -1
  118. package/dist/internal/nodes/events.test.js +27 -277
  119. package/dist/internal/nodes/events.test.js.map +1 -1
  120. package/dist/internal/nodes/index.d.ts +3 -4
  121. package/dist/internal/nodes/index.js +5 -5
  122. package/dist/internal/nodes/index.js.map +1 -1
  123. package/dist/internal/nodes/interface.d.ts +3 -1
  124. package/dist/internal/nodes/nodesAccess.d.ts +15 -0
  125. package/dist/internal/nodes/nodesAccess.js +65 -7
  126. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  127. package/dist/internal/nodes/nodesAccess.test.js +132 -93
  128. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  129. package/dist/internal/nodes/nodesManagement.d.ts +1 -3
  130. package/dist/internal/nodes/nodesManagement.js +12 -26
  131. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  132. package/dist/internal/nodes/nodesManagement.test.js +35 -14
  133. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  134. package/dist/internal/shares/cache.d.ts +2 -0
  135. package/dist/internal/shares/cache.js +2 -0
  136. package/dist/internal/shares/cache.js.map +1 -1
  137. package/dist/internal/shares/manager.d.ts +1 -0
  138. package/dist/internal/shares/manager.js +3 -0
  139. package/dist/internal/shares/manager.js.map +1 -1
  140. package/dist/internal/sharing/apiService.js +20 -2
  141. package/dist/internal/sharing/apiService.js.map +1 -1
  142. package/dist/internal/sharing/cryptoService.js +1 -0
  143. package/dist/internal/sharing/cryptoService.js.map +1 -1
  144. package/dist/internal/sharing/events.d.ts +23 -55
  145. package/dist/internal/sharing/events.js +46 -138
  146. package/dist/internal/sharing/events.js.map +1 -1
  147. package/dist/internal/sharing/events.test.js +77 -180
  148. package/dist/internal/sharing/events.test.js.map +1 -1
  149. package/dist/internal/sharing/index.d.ts +4 -5
  150. package/dist/internal/sharing/index.js +5 -5
  151. package/dist/internal/sharing/index.js.map +1 -1
  152. package/dist/internal/sharing/interface.d.ts +3 -0
  153. package/dist/internal/sharing/sharingManagement.d.ts +2 -3
  154. package/dist/internal/sharing/sharingManagement.js +7 -9
  155. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  156. package/dist/internal/sharing/sharingManagement.test.js +9 -39
  157. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  158. package/dist/internal/upload/apiService.d.ts +2 -3
  159. package/dist/internal/upload/apiService.js +7 -4
  160. package/dist/internal/upload/apiService.js.map +1 -1
  161. package/dist/internal/upload/fileUploader.d.ts +49 -53
  162. package/dist/internal/upload/fileUploader.js +91 -395
  163. package/dist/internal/upload/fileUploader.js.map +1 -1
  164. package/dist/internal/upload/fileUploader.test.js +38 -292
  165. package/dist/internal/upload/fileUploader.test.js.map +1 -1
  166. package/dist/internal/upload/index.d.ts +5 -5
  167. package/dist/internal/upload/index.js +23 -44
  168. package/dist/internal/upload/index.js.map +1 -1
  169. package/dist/internal/upload/interface.d.ts +2 -0
  170. package/dist/internal/upload/manager.d.ts +6 -6
  171. package/dist/internal/upload/manager.js +32 -66
  172. package/dist/internal/upload/manager.js.map +1 -1
  173. package/dist/internal/upload/manager.test.js +100 -117
  174. package/dist/internal/upload/manager.test.js.map +1 -1
  175. package/dist/internal/upload/streamUploader.d.ts +62 -0
  176. package/dist/internal/upload/streamUploader.js +440 -0
  177. package/dist/internal/upload/streamUploader.js.map +1 -0
  178. package/dist/internal/upload/streamUploader.test.d.ts +1 -0
  179. package/dist/internal/upload/streamUploader.test.js +358 -0
  180. package/dist/internal/upload/streamUploader.test.js.map +1 -0
  181. package/dist/protonDriveClient.d.ts +22 -165
  182. package/dist/protonDriveClient.js +27 -191
  183. package/dist/protonDriveClient.js.map +1 -1
  184. package/dist/protonDrivePhotosClient.js +3 -2
  185. package/dist/protonDrivePhotosClient.js.map +1 -1
  186. package/package.json +4 -4
  187. package/src/cache/index.ts +1 -0
  188. package/src/cache/memoryCache.ts +1 -1
  189. package/src/cache/nullCache.ts +38 -0
  190. package/src/config.ts +17 -2
  191. package/src/crypto/openPGPCrypto.ts +2 -0
  192. package/src/diagnostic/eventsGenerator.ts +48 -0
  193. package/src/diagnostic/httpClient.ts +80 -0
  194. package/src/diagnostic/index.ts +38 -0
  195. package/src/diagnostic/integrityVerificationStream.ts +56 -0
  196. package/src/diagnostic/interface.ts +158 -0
  197. package/src/diagnostic/sdkDiagnostic.ts +238 -0
  198. package/src/diagnostic/sdkDiagnosticFull.ts +40 -0
  199. package/src/diagnostic/telemetry.ts +71 -0
  200. package/src/diagnostic/zipGenerators.test.ts +177 -0
  201. package/src/diagnostic/zipGenerators.ts +70 -0
  202. package/src/errors.ts +13 -4
  203. package/src/interface/config.ts +28 -0
  204. package/src/interface/download.ts +2 -2
  205. package/src/interface/events.ts +66 -21
  206. package/src/interface/httpClient.ts +0 -16
  207. package/src/interface/index.ts +9 -5
  208. package/src/interface/nodes.ts +32 -12
  209. package/src/interface/sharing.ts +1 -0
  210. package/src/interface/upload.ts +59 -3
  211. package/src/internal/apiService/driveTypes.ts +1341 -465
  212. package/src/internal/apiService/errors.ts +3 -2
  213. package/src/internal/apiService/transformers.ts +2 -0
  214. package/src/internal/asyncIteratorMap.test.ts +150 -0
  215. package/src/internal/asyncIteratorMap.ts +64 -0
  216. package/src/internal/download/apiService.ts +11 -8
  217. package/src/internal/download/fileDownloader.ts +2 -2
  218. package/src/internal/events/apiService.ts +25 -28
  219. package/src/internal/events/coreEventManager.test.ts +101 -0
  220. package/src/internal/events/coreEventManager.ts +20 -45
  221. package/src/internal/events/eventManager.test.ts +201 -88
  222. package/src/internal/events/eventManager.ts +69 -115
  223. package/src/internal/events/index.ts +54 -84
  224. package/src/internal/events/interface.ts +70 -15
  225. package/src/internal/events/volumeEventManager.test.ts +243 -0
  226. package/src/internal/events/volumeEventManager.ts +55 -53
  227. package/src/internal/nodes/apiService.test.ts +36 -7
  228. package/src/internal/nodes/apiService.ts +19 -7
  229. package/src/internal/nodes/cache.test.ts +1 -0
  230. package/src/internal/nodes/cache.ts +21 -2
  231. package/src/internal/nodes/cryptoService.test.ts +38 -0
  232. package/src/internal/nodes/cryptoService.ts +1 -1
  233. package/src/internal/nodes/events.test.ts +29 -335
  234. package/src/internal/nodes/events.ts +45 -253
  235. package/src/internal/nodes/index.ts +6 -8
  236. package/src/internal/nodes/interface.ts +6 -3
  237. package/src/internal/nodes/nodesAccess.test.ts +133 -91
  238. package/src/internal/nodes/nodesAccess.ts +70 -8
  239. package/src/internal/nodes/nodesManagement.test.ts +39 -15
  240. package/src/internal/nodes/nodesManagement.ts +12 -30
  241. package/src/internal/shares/cache.ts +4 -2
  242. package/src/internal/shares/manager.ts +9 -5
  243. package/src/internal/sharing/apiService.ts +25 -2
  244. package/src/internal/sharing/cache.ts +1 -1
  245. package/src/internal/sharing/cryptoService.ts +1 -0
  246. package/src/internal/sharing/events.test.ts +89 -195
  247. package/src/internal/sharing/events.ts +42 -156
  248. package/src/internal/sharing/index.ts +6 -9
  249. package/src/internal/sharing/interface.ts +6 -2
  250. package/src/internal/sharing/sharingManagement.test.ts +10 -40
  251. package/src/internal/sharing/sharingManagement.ts +7 -11
  252. package/src/internal/upload/apiService.ts +5 -6
  253. package/src/internal/upload/fileUploader.test.ts +46 -376
  254. package/src/internal/upload/fileUploader.ts +114 -494
  255. package/src/internal/upload/index.ts +30 -54
  256. package/src/internal/upload/interface.ts +2 -0
  257. package/src/internal/upload/manager.test.ts +107 -124
  258. package/src/internal/upload/manager.ts +48 -80
  259. package/src/internal/upload/streamUploader.test.ts +468 -0
  260. package/src/internal/upload/streamUploader.ts +550 -0
  261. package/src/protonDriveClient.ts +80 -248
  262. package/src/protonDrivePhotosClient.ts +4 -3
  263. package/dist/internal/events/cache.d.ts +0 -28
  264. package/dist/internal/events/cache.js +0 -67
  265. package/dist/internal/events/cache.js.map +0 -1
  266. package/dist/internal/events/cache.test.js +0 -43
  267. package/dist/internal/events/cache.test.js.map +0 -1
  268. package/dist/internal/nodes/index.test.js +0 -112
  269. package/dist/internal/nodes/index.test.js.map +0 -1
  270. package/src/internal/events/cache.test.ts +0 -47
  271. package/src/internal/events/cache.ts +0 -80
  272. package/src/internal/nodes/index.test.ts +0 -135
  273. /package/dist/{internal/events/cache.test.d.ts → diagnostic/zipGenerators.test.d.ts} +0 -0
  274. /package/dist/internal/{nodes/index.test.d.ts → asyncIteratorMap.test.d.ts} +0 -0
@@ -1,67 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EventsCache = void 0;
4
- /**
5
- * Provides caching for events IDs.
6
- */
7
- class EventsCache {
8
- driveCache;
9
- /**
10
- * Locally cached events data to avoid unnecessary reads from the cache.
11
- * Data about last event ID or interval might be accessed often by events
12
- * managers.
13
- */
14
- events;
15
- constructor(driveCache) {
16
- this.driveCache = driveCache;
17
- this.driveCache = driveCache;
18
- }
19
- async setLastEventId(volumeIdOrCore, eventsData) {
20
- const events = await this.getEvents();
21
- events[volumeIdOrCore] = eventsData;
22
- await this.cacheEvents(events);
23
- }
24
- async getLastEventId(volumeIdOrCore) {
25
- const events = await this.getEvents();
26
- if (events[volumeIdOrCore]) {
27
- return events[volumeIdOrCore].lastEventId;
28
- }
29
- }
30
- async getPollingIntervalInSeconds(volumeIdOrCore) {
31
- const events = await this.getEvents();
32
- if (events[volumeIdOrCore]) {
33
- return events[volumeIdOrCore].pollingIntervalInSeconds;
34
- }
35
- }
36
- async isOwnVolume(volumeIdOrCore) {
37
- const events = await this.getEvents();
38
- if (events[volumeIdOrCore]) {
39
- return events[volumeIdOrCore].isOwnVolume;
40
- }
41
- }
42
- async getSubscribedVolumeIds() {
43
- const events = await this.getEvents();
44
- return Object.keys(events).filter((volumeIdOrCore) => volumeIdOrCore !== 'core');
45
- }
46
- async getEvents() {
47
- if (!this.events) {
48
- this.events = await this.getCachedEvents();
49
- }
50
- return this.events;
51
- }
52
- async getCachedEvents() {
53
- try {
54
- const events = await this.driveCache.getEntity('events');
55
- return JSON.parse(events);
56
- }
57
- catch { }
58
- ;
59
- return {};
60
- }
61
- async cacheEvents(events) {
62
- this.events = events;
63
- await this.driveCache.setEntity('events', JSON.stringify(events));
64
- }
65
- }
66
- exports.EventsCache = EventsCache;
67
- //# sourceMappingURL=cache.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/internal/events/cache.ts"],"names":[],"mappings":";;;AAaA;;GAEG;AACH,MAAa,WAAW;IAQA;IAPpB;;;;OAIG;IACK,MAAM,CAAoB;IAElC,YAAoB,UAAoC;QAApC,eAAU,GAAV,UAAU,CAA0B;QACpD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,cAAsB,EAAE,UAAsB;QAC/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,MAAM,CAAC,cAAc,CAAC,GAAG,UAAU,CAAC;QACpC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,cAAsB;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC;QAC9C,CAAC;IACL,CAAC;IAED,KAAK,CAAC,2BAA2B,CAAC,cAAsB;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC,wBAAwB,CAAC;QAC3D,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,cAAsB;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC;QAC9C,CAAC;IACL,CAAC;IAED,KAAK,CAAC,sBAAsB;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC;IACrF,CAAC;IAEO,KAAK,CAAC,SAAS;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,eAAe;QACzB,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAAA,CAAC;QACX,OAAO,EAAE,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,MAAwB;QAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,CAAC;CACJ;AA/DD,kCA+DC"}
@@ -1,43 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const cache_1 = require("../../cache");
4
- const cache_2 = require("./cache");
5
- describe("EventsCache", () => {
6
- let memoryCache;
7
- let cache;
8
- beforeEach(() => {
9
- memoryCache = new cache_1.MemoryCache();
10
- cache = new cache_2.EventsCache(memoryCache);
11
- });
12
- it("should store and retrieve last event ID", async () => {
13
- const key = "volume1";
14
- await cache.setLastEventId(key, { lastEventId: "eventId1", pollingIntervalInSeconds: 0, isOwnVolume: true });
15
- await cache.setLastEventId(key, { lastEventId: "eventId2", pollingIntervalInSeconds: 0, isOwnVolume: true });
16
- const result = await cache.getLastEventId(key);
17
- expect(result).toBe("eventId2");
18
- });
19
- it("should store and retrieve polling interval", async () => {
20
- const key = "volume1";
21
- await cache.setLastEventId(key, { lastEventId: "lastEventId", pollingIntervalInSeconds: 10, isOwnVolume: true });
22
- await cache.setLastEventId(key, { lastEventId: "lastEventId", pollingIntervalInSeconds: 20, isOwnVolume: true });
23
- const result = await cache.getPollingIntervalInSeconds(key);
24
- expect(result).toBe(20);
25
- });
26
- it("should store and retrieve subscribed volume IDs", async () => {
27
- await cache.setLastEventId("volume1", { lastEventId: "lastEventId", pollingIntervalInSeconds: 0, isOwnVolume: true });
28
- await cache.setLastEventId("volume2", { lastEventId: "lastEventId", pollingIntervalInSeconds: 0, isOwnVolume: true });
29
- const result = await cache.getSubscribedVolumeIds();
30
- expect(result).toStrictEqual(["volume1", "volume2"]);
31
- });
32
- it("should not fail if cache is empty", async () => {
33
- const result = await cache.getLastEventId("volume1");
34
- expect(result).toBe(undefined);
35
- });
36
- it("should call cache only once", async () => {
37
- const spy = jest.spyOn(memoryCache, "getEntity");
38
- await cache.getLastEventId("volume1");
39
- await cache.getLastEventId("volume1");
40
- expect(spy).toHaveBeenCalledTimes(1);
41
- });
42
- });
43
- //# sourceMappingURL=cache.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.test.js","sourceRoot":"","sources":["../../../src/internal/events/cache.test.ts"],"names":[],"mappings":";;AAAA,uCAA0C;AAC1C,mCAAsC;AAEtC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IACzB,IAAI,WAAgC,CAAC;IACrC,IAAI,KAAkB,CAAC;IAEvB,UAAU,CAAC,GAAG,EAAE;QACZ,WAAW,GAAG,IAAI,mBAAW,EAAE,CAAC;QAChC,KAAK,GAAG,IAAI,mBAAW,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,GAAG,GAAG,SAAS,CAAC;QACtB,MAAM,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,wBAAwB,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7G,MAAM,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,wBAAwB,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7G,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,GAAG,GAAG,SAAS,CAAC;QACtB,MAAM,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,wBAAwB,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACjH,MAAM,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,wBAAwB,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACjH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,wBAAwB,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACtH,MAAM,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,wBAAwB,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACtH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,sBAAsB,EAAE,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1,112 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const interface_1 = require("../../interface");
4
- const cache_1 = require("../../cache");
5
- const telemetry_1 = require("../../tests/telemetry");
6
- const events_1 = require("../events");
7
- const uids_1 = require("../uids");
8
- const index_1 = require("./index");
9
- function generateSerializedNode(uid, parentUid = 'volumeId~root', params = {}) {
10
- return JSON.stringify(generateNode(uid, parentUid, params));
11
- }
12
- function generateNode(uid, parentUid = 'volumeId~root', params = {}) {
13
- return {
14
- uid,
15
- parentUid,
16
- directMemberRole: interface_1.MemberRole.Admin,
17
- type: interface_1.NodeType.File,
18
- mediaType: "text",
19
- isShared: false,
20
- creationTime: new Date(),
21
- trashTime: undefined,
22
- isStale: false,
23
- ...params,
24
- };
25
- }
26
- describe('nodesModules integration tests', () => {
27
- let apiService;
28
- let driveEntitiesCache;
29
- let driveCryptoCache;
30
- let account;
31
- let driveCrypto;
32
- let eventCallbacks;
33
- let driveEvents;
34
- let sharesService;
35
- let nodesModule;
36
- beforeEach(() => {
37
- // @ts-expect-error No need to implement all methods for mocking
38
- apiService = {};
39
- driveEntitiesCache = new cache_1.MemoryCache();
40
- driveCryptoCache = new cache_1.MemoryCache();
41
- // @ts-expect-error No need to implement all methods for mocking
42
- account = {};
43
- // @ts-expect-error No need to implement all methods for mocking
44
- driveCrypto = {};
45
- eventCallbacks = [];
46
- // @ts-expect-error No need to implement all methods for mocking
47
- driveEvents = {
48
- addListener: jest.fn().mockImplementation((callback) => {
49
- eventCallbacks.push(callback);
50
- }),
51
- };
52
- // @ts-expect-error No need to implement all methods for mocking
53
- sharesService = {};
54
- nodesModule = (0, index_1.initNodesModule)((0, telemetry_1.getMockTelemetry)(), apiService, driveEntitiesCache, driveCryptoCache, account, driveCrypto, driveEvents, sharesService);
55
- });
56
- test('should move node from one folder to another after move event', async () => {
57
- // Prepare two folders (original and target) and a node in the original folder.
58
- const originalFolderUid = (0, uids_1.makeNodeUid)('volumeId', 'originalFolder');
59
- await driveEntitiesCache.setEntity(`node-${originalFolderUid}`, generateSerializedNode(originalFolderUid));
60
- await driveEntitiesCache.setEntity(`node-children-${originalFolderUid}`, 'loaded');
61
- const targetFolderUid = (0, uids_1.makeNodeUid)('volumeId', 'targetFolder');
62
- await driveEntitiesCache.setEntity(`node-${targetFolderUid}`, generateSerializedNode(targetFolderUid));
63
- await driveEntitiesCache.setEntity(`node-children-${targetFolderUid}`, 'loaded');
64
- const nodeUid = (0, uids_1.makeNodeUid)('volumeId', 'node1');
65
- await driveEntitiesCache.setEntity(`node-${nodeUid}`, generateSerializedNode(nodeUid, originalFolderUid), [`nodeParentUid:${originalFolderUid}`]);
66
- // Mock the API services to return the moved node.
67
- // This is called when listing the children of the target folder after
68
- // move event (when node marked as stale).
69
- apiService.post = jest.fn().mockImplementation(async (url, body) => {
70
- expect(url).toBe(`drive/v2/volumes/volumeId/links`);
71
- return {
72
- Links: [{
73
- Link: {
74
- LinkID: 'node1',
75
- ParentLinkID: 'targetFolder',
76
- NameHash: 'hash',
77
- Type: 2,
78
- },
79
- File: {
80
- ActiveRevision: {},
81
- },
82
- }],
83
- };
84
- });
85
- jest.spyOn(nodesModule.access, 'getParentKeys').mockResolvedValue({ key: { _idx: 32131 } });
86
- // Verify the inital state before move event is sent.
87
- const originalBeforeMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(originalFolderUid));
88
- expect(originalBeforeMove).toMatchObject([{ uid: nodeUid, parentUid: originalFolderUid }]);
89
- const targetBeforeMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(targetFolderUid));
90
- expect(targetBeforeMove).toMatchObject([]);
91
- // Send the move event that updates the cache.
92
- const events = [
93
- {
94
- type: events_1.DriveEventType.NodeUpdated,
95
- nodeUid,
96
- parentNodeUid: targetFolderUid,
97
- isTrashed: false,
98
- isShared: false,
99
- isOwnVolume: true,
100
- },
101
- ];
102
- await Promise.all(eventCallbacks.map((callback) => callback(events)));
103
- // Verify the state after the move event, including when API service is called.
104
- const originalAfterMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(originalFolderUid));
105
- expect(originalAfterMove).toMatchObject([]);
106
- expect(apiService.post).not.toHaveBeenCalled();
107
- const targetAfterMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(targetFolderUid));
108
- expect(targetAfterMove).toMatchObject([{ uid: nodeUid, parentUid: targetFolderUid }]);
109
- expect(apiService.post).toHaveBeenCalledTimes(1);
110
- });
111
- });
112
- //# sourceMappingURL=index.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/internal/nodes/index.test.ts"],"names":[],"mappings":"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"}
@@ -1,47 +0,0 @@
1
- import { MemoryCache } from "../../cache";
2
- import { EventsCache } from "./cache";
3
-
4
- describe("EventsCache", () => {
5
- let memoryCache: MemoryCache<string>;
6
- let cache: EventsCache;
7
-
8
- beforeEach(() => {
9
- memoryCache = new MemoryCache();
10
- cache = new EventsCache(memoryCache);
11
- });
12
-
13
- it("should store and retrieve last event ID", async () => {
14
- const key = "volume1";
15
- await cache.setLastEventId(key, { lastEventId: "eventId1", pollingIntervalInSeconds: 0, isOwnVolume: true });
16
- await cache.setLastEventId(key, { lastEventId: "eventId2", pollingIntervalInSeconds: 0, isOwnVolume: true });
17
- const result = await cache.getLastEventId(key);
18
- expect(result).toBe("eventId2");
19
- });
20
-
21
- it("should store and retrieve polling interval", async () => {
22
- const key = "volume1";
23
- await cache.setLastEventId(key, { lastEventId: "lastEventId", pollingIntervalInSeconds: 10, isOwnVolume: true });
24
- await cache.setLastEventId(key, { lastEventId: "lastEventId", pollingIntervalInSeconds: 20, isOwnVolume: true });
25
- const result = await cache.getPollingIntervalInSeconds(key);
26
- expect(result).toBe(20);
27
- });
28
-
29
- it("should store and retrieve subscribed volume IDs", async () => {
30
- await cache.setLastEventId("volume1", { lastEventId: "lastEventId", pollingIntervalInSeconds: 0, isOwnVolume: true });
31
- await cache.setLastEventId("volume2", { lastEventId: "lastEventId", pollingIntervalInSeconds: 0, isOwnVolume: true });
32
- const result = await cache.getSubscribedVolumeIds();
33
- expect(result).toStrictEqual(["volume1", "volume2"]);
34
- });
35
-
36
- it("should not fail if cache is empty", async () => {
37
- const result = await cache.getLastEventId("volume1");
38
- expect(result).toBe(undefined);
39
- });
40
-
41
- it("should call cache only once", async () => {
42
- const spy = jest.spyOn(memoryCache, "getEntity");
43
- await cache.getLastEventId("volume1");
44
- await cache.getLastEventId("volume1");
45
- expect(spy).toHaveBeenCalledTimes(1);
46
- });
47
- });
@@ -1,80 +0,0 @@
1
- import { ProtonDriveEntitiesCache } from "../../interface";
2
-
3
- type CachedEventsData = {
4
- // Key is either a volume ID for volume events or 'core' for core events.
5
- [key: string]: EventsData;
6
- };
7
-
8
- interface EventsData {
9
- lastEventId: string;
10
- pollingIntervalInSeconds: number;
11
- isOwnVolume: boolean;
12
- }
13
-
14
- /**
15
- * Provides caching for events IDs.
16
- */
17
- export class EventsCache {
18
- /**
19
- * Locally cached events data to avoid unnecessary reads from the cache.
20
- * Data about last event ID or interval might be accessed often by events
21
- * managers.
22
- */
23
- private events?: CachedEventsData;
24
-
25
- constructor(private driveCache: ProtonDriveEntitiesCache) {
26
- this.driveCache = driveCache;
27
- }
28
-
29
- async setLastEventId(volumeIdOrCore: string, eventsData: EventsData): Promise<void> {
30
- const events = await this.getEvents();
31
- events[volumeIdOrCore] = eventsData;
32
- await this.cacheEvents(events);
33
- }
34
-
35
- async getLastEventId(volumeIdOrCore: string): Promise<string | undefined> {
36
- const events = await this.getEvents();
37
- if (events[volumeIdOrCore]) {
38
- return events[volumeIdOrCore].lastEventId;
39
- }
40
- }
41
-
42
- async getPollingIntervalInSeconds(volumeIdOrCore: string): Promise<number | undefined> {
43
- const events = await this.getEvents();
44
- if (events[volumeIdOrCore]) {
45
- return events[volumeIdOrCore].pollingIntervalInSeconds;
46
- }
47
- }
48
-
49
- async isOwnVolume(volumeIdOrCore: string): Promise<boolean | undefined> {
50
- const events = await this.getEvents();
51
- if (events[volumeIdOrCore]) {
52
- return events[volumeIdOrCore].isOwnVolume;
53
- }
54
- }
55
-
56
- async getSubscribedVolumeIds(): Promise<string[]> {
57
- const events = await this.getEvents();
58
- return Object.keys(events).filter((volumeIdOrCore) => volumeIdOrCore !== 'core');
59
- }
60
-
61
- private async getEvents(): Promise<CachedEventsData> {
62
- if (!this.events) {
63
- this.events = await this.getCachedEvents();
64
- }
65
- return this.events;
66
- }
67
-
68
- private async getCachedEvents(): Promise<CachedEventsData> {
69
- try {
70
- const events = await this.driveCache.getEntity('events');
71
- return JSON.parse(events);
72
- } catch {};
73
- return {};
74
- }
75
-
76
- private async cacheEvents(events: CachedEventsData): Promise<void> {
77
- this.events = events;
78
- await this.driveCache.setEntity('events', JSON.stringify(events));
79
- }
80
- }
@@ -1,135 +0,0 @@
1
- import { ProtonDriveEntitiesCache, ProtonDriveCryptoCache, ProtonDriveAccount, MemberRole, NodeType } from "../../interface";
2
- import { DriveCrypto } from "../../crypto";
3
- import { MemoryCache } from "../../cache";
4
- import { getMockTelemetry } from "../../tests/telemetry";
5
- import { DriveAPIService } from "../apiService";
6
- import { DriveEventsService, DriveListener, DriveEvent, DriveEventType } from "../events";
7
- import { makeNodeUid } from "../uids";
8
- import { SharesService, DecryptedNode } from "./interface";
9
- import { initNodesModule } from './index';
10
-
11
- function generateSerializedNode(uid: string, parentUid = 'volumeId~root', params: Partial<DecryptedNode> = {}): string {
12
- return JSON.stringify(generateNode(uid, parentUid, params));
13
- }
14
-
15
- function generateNode(uid: string, parentUid = 'volumeId~root', params: Partial<DecryptedNode> = {}): DecryptedNode {
16
- return {
17
- uid,
18
- parentUid,
19
- directMemberRole: MemberRole.Admin,
20
- type: NodeType.File,
21
- mediaType: "text",
22
- isShared: false,
23
- creationTime: new Date(),
24
- trashTime: undefined,
25
- isStale: false,
26
- ...params,
27
- } as DecryptedNode;
28
- }
29
-
30
- describe('nodesModules integration tests', () => {
31
- let apiService: DriveAPIService;
32
- let driveEntitiesCache: ProtonDriveEntitiesCache;
33
- let driveCryptoCache: ProtonDriveCryptoCache;
34
- let account: ProtonDriveAccount;
35
- let driveCrypto: DriveCrypto;
36
- let eventCallbacks: DriveListener[];
37
- let driveEvents: DriveEventsService;
38
- let sharesService: SharesService;
39
- let nodesModule: ReturnType<typeof initNodesModule>;
40
-
41
- beforeEach(() => {
42
- // @ts-expect-error No need to implement all methods for mocking
43
- apiService = {}
44
- driveEntitiesCache = new MemoryCache();
45
- driveCryptoCache = new MemoryCache();
46
- // @ts-expect-error No need to implement all methods for mocking
47
- account = {}
48
- // @ts-expect-error No need to implement all methods for mocking
49
- driveCrypto = {}
50
- eventCallbacks = [];
51
- // @ts-expect-error No need to implement all methods for mocking
52
- driveEvents = {
53
- addListener: jest.fn().mockImplementation((callback) => {
54
- eventCallbacks.push(callback);
55
- }),
56
- }
57
- // @ts-expect-error No need to implement all methods for mocking
58
- sharesService = {}
59
-
60
- nodesModule = initNodesModule(
61
- getMockTelemetry(),
62
- apiService,
63
- driveEntitiesCache,
64
- driveCryptoCache,
65
- account,
66
- driveCrypto,
67
- driveEvents,
68
- sharesService,
69
- );
70
- });
71
-
72
- test('should move node from one folder to another after move event', async () => {
73
- // Prepare two folders (original and target) and a node in the original folder.
74
- const originalFolderUid = makeNodeUid('volumeId', 'originalFolder');
75
- await driveEntitiesCache.setEntity(`node-${originalFolderUid}`, generateSerializedNode(originalFolderUid));
76
- await driveEntitiesCache.setEntity(`node-children-${originalFolderUid}`, 'loaded');
77
-
78
- const targetFolderUid = makeNodeUid('volumeId', 'targetFolder');
79
- await driveEntitiesCache.setEntity(`node-${targetFolderUid}`, generateSerializedNode(targetFolderUid));
80
- await driveEntitiesCache.setEntity(`node-children-${targetFolderUid}`, 'loaded');
81
-
82
- const nodeUid = makeNodeUid('volumeId', 'node1');
83
- await driveEntitiesCache.setEntity(`node-${nodeUid}`, generateSerializedNode(nodeUid, originalFolderUid), [`nodeParentUid:${originalFolderUid}`]);
84
-
85
- // Mock the API services to return the moved node.
86
- // This is called when listing the children of the target folder after
87
- // move event (when node marked as stale).
88
- apiService.post = jest.fn().mockImplementation(async (url, body) => {
89
- expect(url).toBe(`drive/v2/volumes/volumeId/links`);
90
- return {
91
- Links: [{
92
- Link: {
93
- LinkID: 'node1',
94
- ParentLinkID: 'targetFolder',
95
- NameHash: 'hash',
96
- Type: 2,
97
- },
98
- File: {
99
- ActiveRevision: {},
100
- },
101
- }],
102
- };
103
- });
104
- jest.spyOn(nodesModule.access, 'getParentKeys').mockResolvedValue({ key: { _idx: 32131 } } as any);
105
-
106
- // Verify the inital state before move event is sent.
107
- const originalBeforeMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(originalFolderUid));
108
- expect(originalBeforeMove).toMatchObject([{ uid: nodeUid, parentUid: originalFolderUid }]);
109
-
110
- const targetBeforeMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(targetFolderUid));
111
- expect(targetBeforeMove).toMatchObject([]);
112
-
113
- // Send the move event that updates the cache.
114
- const events: DriveEvent[] = [
115
- {
116
- type: DriveEventType.NodeUpdated,
117
- nodeUid,
118
- parentNodeUid: targetFolderUid,
119
- isTrashed: false,
120
- isShared: false,
121
- isOwnVolume: true,
122
- },
123
- ]
124
- await Promise.all(eventCallbacks.map((callback) => callback(events)));
125
-
126
- // Verify the state after the move event, including when API service is called.
127
- const originalAfterMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(originalFolderUid));
128
- expect(originalAfterMove).toMatchObject([]);
129
- expect(apiService.post).not.toHaveBeenCalled();
130
-
131
- const targetAfterMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(targetFolderUid));
132
- expect(targetAfterMove).toMatchObject([{ uid: nodeUid, parentUid: targetFolderUid }]);
133
- expect(apiService.post).toHaveBeenCalledTimes(1);
134
- });
135
- });