@protontech/drive-sdk 0.0.13 → 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 (234) 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 +2 -1
  43. package/dist/errors.js +3 -1
  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 +8 -4
  54. package/dist/interface/index.js +2 -1
  55. package/dist/interface/index.js.map +1 -1
  56. package/dist/interface/nodes.d.ts +9 -0
  57. package/dist/interface/nodes.js.map +1 -1
  58. package/dist/interface/sharing.d.ts +1 -0
  59. package/dist/interface/upload.d.ts +6 -0
  60. package/dist/internal/download/apiService.js +32 -31
  61. package/dist/internal/download/apiService.js.map +1 -1
  62. package/dist/internal/download/fileDownloader.d.ts +2 -2
  63. package/dist/internal/download/fileDownloader.js.map +1 -1
  64. package/dist/internal/events/apiService.d.ts +4 -6
  65. package/dist/internal/events/apiService.js +15 -22
  66. package/dist/internal/events/apiService.js.map +1 -1
  67. package/dist/internal/events/coreEventManager.d.ts +7 -10
  68. package/dist/internal/events/coreEventManager.js +19 -36
  69. package/dist/internal/events/coreEventManager.js.map +1 -1
  70. package/dist/internal/events/coreEventManager.test.js +87 -0
  71. package/dist/internal/events/coreEventManager.test.js.map +1 -0
  72. package/dist/internal/events/eventManager.d.ts +11 -36
  73. package/dist/internal/events/eventManager.js +59 -105
  74. package/dist/internal/events/eventManager.js.map +1 -1
  75. package/dist/internal/events/eventManager.test.js +167 -82
  76. package/dist/internal/events/eventManager.test.js.map +1 -1
  77. package/dist/internal/events/index.d.ts +13 -33
  78. package/dist/internal/events/index.js +56 -72
  79. package/dist/internal/events/index.js.map +1 -1
  80. package/dist/internal/events/interface.d.ts +59 -14
  81. package/dist/internal/events/interface.js +13 -3
  82. package/dist/internal/events/interface.js.map +1 -1
  83. package/dist/internal/events/volumeEventManager.d.ts +7 -17
  84. package/dist/internal/events/volumeEventManager.js +58 -45
  85. package/dist/internal/events/volumeEventManager.js.map +1 -1
  86. package/dist/internal/events/volumeEventManager.test.d.ts +1 -0
  87. package/dist/internal/events/volumeEventManager.test.js +203 -0
  88. package/dist/internal/events/volumeEventManager.test.js.map +1 -0
  89. package/dist/internal/nodes/cache.d.ts +10 -1
  90. package/dist/internal/nodes/cache.js +17 -0
  91. package/dist/internal/nodes/cache.js.map +1 -1
  92. package/dist/internal/nodes/cryptoService.d.ts +1 -1
  93. package/dist/internal/nodes/cryptoService.js.map +1 -1
  94. package/dist/internal/nodes/events.d.ts +7 -83
  95. package/dist/internal/nodes/events.js +43 -217
  96. package/dist/internal/nodes/events.js.map +1 -1
  97. package/dist/internal/nodes/events.test.js +27 -277
  98. package/dist/internal/nodes/events.test.js.map +1 -1
  99. package/dist/internal/nodes/index.d.ts +3 -4
  100. package/dist/internal/nodes/index.js +5 -5
  101. package/dist/internal/nodes/index.js.map +1 -1
  102. package/dist/internal/nodes/nodesAccess.d.ts +15 -0
  103. package/dist/internal/nodes/nodesAccess.js +37 -0
  104. package/dist/internal/nodes/nodesAccess.js.map +1 -1
  105. package/dist/internal/nodes/nodesAccess.test.js +131 -93
  106. package/dist/internal/nodes/nodesAccess.test.js.map +1 -1
  107. package/dist/internal/nodes/nodesManagement.d.ts +1 -3
  108. package/dist/internal/nodes/nodesManagement.js +12 -26
  109. package/dist/internal/nodes/nodesManagement.js.map +1 -1
  110. package/dist/internal/nodes/nodesManagement.test.js +35 -14
  111. package/dist/internal/nodes/nodesManagement.test.js.map +1 -1
  112. package/dist/internal/shares/cache.d.ts +2 -0
  113. package/dist/internal/shares/cache.js +2 -0
  114. package/dist/internal/shares/cache.js.map +1 -1
  115. package/dist/internal/shares/manager.d.ts +1 -0
  116. package/dist/internal/shares/manager.js +3 -0
  117. package/dist/internal/shares/manager.js.map +1 -1
  118. package/dist/internal/sharing/apiService.js +1 -0
  119. package/dist/internal/sharing/apiService.js.map +1 -1
  120. package/dist/internal/sharing/cryptoService.js +1 -0
  121. package/dist/internal/sharing/cryptoService.js.map +1 -1
  122. package/dist/internal/sharing/events.d.ts +23 -55
  123. package/dist/internal/sharing/events.js +46 -138
  124. package/dist/internal/sharing/events.js.map +1 -1
  125. package/dist/internal/sharing/events.test.js +77 -180
  126. package/dist/internal/sharing/events.test.js.map +1 -1
  127. package/dist/internal/sharing/index.d.ts +4 -5
  128. package/dist/internal/sharing/index.js +5 -5
  129. package/dist/internal/sharing/index.js.map +1 -1
  130. package/dist/internal/sharing/interface.d.ts +3 -0
  131. package/dist/internal/sharing/sharingManagement.d.ts +2 -3
  132. package/dist/internal/sharing/sharingManagement.js +7 -9
  133. package/dist/internal/sharing/sharingManagement.js.map +1 -1
  134. package/dist/internal/sharing/sharingManagement.test.js +9 -39
  135. package/dist/internal/sharing/sharingManagement.test.js.map +1 -1
  136. package/dist/internal/upload/apiService.d.ts +2 -3
  137. package/dist/internal/upload/apiService.js +7 -4
  138. package/dist/internal/upload/apiService.js.map +1 -1
  139. package/dist/internal/upload/index.d.ts +2 -2
  140. package/dist/internal/upload/index.js +3 -3
  141. package/dist/internal/upload/index.js.map +1 -1
  142. package/dist/internal/upload/interface.d.ts +2 -0
  143. package/dist/internal/upload/manager.d.ts +5 -5
  144. package/dist/internal/upload/manager.js +19 -50
  145. package/dist/internal/upload/manager.js.map +1 -1
  146. package/dist/internal/upload/manager.test.js +68 -44
  147. package/dist/internal/upload/manager.test.js.map +1 -1
  148. package/dist/internal/upload/streamUploader.js +1 -2
  149. package/dist/internal/upload/streamUploader.js.map +1 -1
  150. package/dist/internal/upload/streamUploader.test.js +1 -1
  151. package/dist/internal/upload/streamUploader.test.js.map +1 -1
  152. package/dist/protonDriveClient.d.ts +19 -162
  153. package/dist/protonDriveClient.js +26 -190
  154. package/dist/protonDriveClient.js.map +1 -1
  155. package/dist/protonDrivePhotosClient.js +3 -2
  156. package/dist/protonDrivePhotosClient.js.map +1 -1
  157. package/package.json +3 -3
  158. package/src/cache/index.ts +1 -0
  159. package/src/cache/memoryCache.ts +1 -1
  160. package/src/cache/nullCache.ts +38 -0
  161. package/src/config.ts +17 -2
  162. package/src/crypto/openPGPCrypto.ts +2 -0
  163. package/src/diagnostic/eventsGenerator.ts +48 -0
  164. package/src/diagnostic/httpClient.ts +80 -0
  165. package/src/diagnostic/index.ts +38 -0
  166. package/src/diagnostic/integrityVerificationStream.ts +56 -0
  167. package/src/diagnostic/interface.ts +158 -0
  168. package/src/diagnostic/sdkDiagnostic.ts +238 -0
  169. package/src/diagnostic/sdkDiagnosticFull.ts +40 -0
  170. package/src/diagnostic/telemetry.ts +71 -0
  171. package/src/diagnostic/zipGenerators.test.ts +177 -0
  172. package/src/diagnostic/zipGenerators.ts +70 -0
  173. package/src/errors.ts +4 -1
  174. package/src/interface/config.ts +28 -0
  175. package/src/interface/download.ts +2 -2
  176. package/src/interface/events.ts +66 -21
  177. package/src/interface/httpClient.ts +0 -16
  178. package/src/interface/index.ts +8 -4
  179. package/src/interface/nodes.ts +21 -12
  180. package/src/interface/sharing.ts +1 -0
  181. package/src/interface/upload.ts +6 -0
  182. package/src/internal/download/apiService.ts +11 -8
  183. package/src/internal/download/fileDownloader.ts +2 -2
  184. package/src/internal/events/apiService.ts +25 -28
  185. package/src/internal/events/coreEventManager.test.ts +101 -0
  186. package/src/internal/events/coreEventManager.ts +20 -45
  187. package/src/internal/events/eventManager.test.ts +201 -88
  188. package/src/internal/events/eventManager.ts +69 -115
  189. package/src/internal/events/index.ts +54 -84
  190. package/src/internal/events/interface.ts +70 -15
  191. package/src/internal/events/volumeEventManager.test.ts +243 -0
  192. package/src/internal/events/volumeEventManager.ts +55 -53
  193. package/src/internal/nodes/cache.ts +20 -2
  194. package/src/internal/nodes/cryptoService.ts +1 -1
  195. package/src/internal/nodes/events.test.ts +29 -335
  196. package/src/internal/nodes/events.ts +45 -253
  197. package/src/internal/nodes/index.ts +6 -8
  198. package/src/internal/nodes/interface.ts +2 -2
  199. package/src/internal/nodes/nodesAccess.test.ts +132 -91
  200. package/src/internal/nodes/nodesAccess.ts +40 -1
  201. package/src/internal/nodes/nodesManagement.test.ts +39 -15
  202. package/src/internal/nodes/nodesManagement.ts +12 -30
  203. package/src/internal/shares/cache.ts +4 -2
  204. package/src/internal/shares/manager.ts +9 -5
  205. package/src/internal/sharing/apiService.ts +1 -0
  206. package/src/internal/sharing/cache.ts +1 -1
  207. package/src/internal/sharing/cryptoService.ts +1 -0
  208. package/src/internal/sharing/events.test.ts +89 -195
  209. package/src/internal/sharing/events.ts +42 -156
  210. package/src/internal/sharing/index.ts +6 -9
  211. package/src/internal/sharing/interface.ts +6 -2
  212. package/src/internal/sharing/sharingManagement.test.ts +10 -40
  213. package/src/internal/sharing/sharingManagement.ts +7 -11
  214. package/src/internal/upload/apiService.ts +5 -6
  215. package/src/internal/upload/index.ts +5 -5
  216. package/src/internal/upload/interface.ts +2 -0
  217. package/src/internal/upload/manager.test.ts +75 -45
  218. package/src/internal/upload/manager.ts +24 -54
  219. package/src/internal/upload/streamUploader.test.ts +0 -1
  220. package/src/internal/upload/streamUploader.ts +0 -2
  221. package/src/protonDriveClient.ts +75 -244
  222. package/src/protonDrivePhotosClient.ts +4 -3
  223. package/dist/internal/events/cache.d.ts +0 -28
  224. package/dist/internal/events/cache.js +0 -67
  225. package/dist/internal/events/cache.js.map +0 -1
  226. package/dist/internal/events/cache.test.js +0 -43
  227. package/dist/internal/events/cache.test.js.map +0 -1
  228. package/dist/internal/nodes/index.test.js +0 -114
  229. package/dist/internal/nodes/index.test.js.map +0 -1
  230. package/src/internal/events/cache.test.ts +0 -47
  231. package/src/internal/events/cache.ts +0 -80
  232. package/src/internal/nodes/index.test.ts +0 -137
  233. /package/dist/{internal/events/cache.test.d.ts → diagnostic/zipGenerators.test.d.ts} +0 -0
  234. /package/dist/internal/{nodes/index.test.d.ts → events/coreEventManager.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":"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"}
@@ -1,114 +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
- getMyFilesIDs: jest.fn().mockResolvedValue({ volumeId: 'volumeId' }),
55
- };
56
- nodesModule = (0, index_1.initNodesModule)((0, telemetry_1.getMockTelemetry)(), apiService, driveEntitiesCache, driveCryptoCache, account, driveCrypto, driveEvents, sharesService);
57
- });
58
- test('should move node from one folder to another after move event', async () => {
59
- // Prepare two folders (original and target) and a node in the original folder.
60
- const originalFolderUid = (0, uids_1.makeNodeUid)('volumeId', 'originalFolder');
61
- await driveEntitiesCache.setEntity(`node-${originalFolderUid}`, generateSerializedNode(originalFolderUid));
62
- await driveEntitiesCache.setEntity(`node-children-${originalFolderUid}`, 'loaded');
63
- const targetFolderUid = (0, uids_1.makeNodeUid)('volumeId', 'targetFolder');
64
- await driveEntitiesCache.setEntity(`node-${targetFolderUid}`, generateSerializedNode(targetFolderUid));
65
- await driveEntitiesCache.setEntity(`node-children-${targetFolderUid}`, 'loaded');
66
- const nodeUid = (0, uids_1.makeNodeUid)('volumeId', 'node1');
67
- await driveEntitiesCache.setEntity(`node-${nodeUid}`, generateSerializedNode(nodeUid, originalFolderUid), [`nodeParentUid:${originalFolderUid}`]);
68
- // Mock the API services to return the moved node.
69
- // This is called when listing the children of the target folder after
70
- // move event (when node marked as stale).
71
- apiService.post = jest.fn().mockImplementation(async (url, body) => {
72
- expect(url).toBe(`drive/v2/volumes/volumeId/links`);
73
- return {
74
- Links: [{
75
- Link: {
76
- LinkID: 'node1',
77
- ParentLinkID: 'targetFolder',
78
- NameHash: 'hash',
79
- Type: 2,
80
- },
81
- File: {
82
- ActiveRevision: {},
83
- },
84
- }],
85
- };
86
- });
87
- jest.spyOn(nodesModule.access, 'getParentKeys').mockResolvedValue({ key: { _idx: 32131 } });
88
- // Verify the inital state before move event is sent.
89
- const originalBeforeMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(originalFolderUid));
90
- expect(originalBeforeMove).toMatchObject([{ uid: nodeUid, parentUid: originalFolderUid }]);
91
- const targetBeforeMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(targetFolderUid));
92
- expect(targetBeforeMove).toMatchObject([]);
93
- // Send the move event that updates the cache.
94
- const events = [
95
- {
96
- type: events_1.DriveEventType.NodeUpdated,
97
- nodeUid,
98
- parentNodeUid: targetFolderUid,
99
- isTrashed: false,
100
- isShared: false,
101
- isOwnVolume: true,
102
- },
103
- ];
104
- await Promise.all(eventCallbacks.map((callback) => callback(events)));
105
- // Verify the state after the move event, including when API service is called.
106
- const originalAfterMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(originalFolderUid));
107
- expect(originalAfterMove).toMatchObject([]);
108
- expect(apiService.post).not.toHaveBeenCalled();
109
- const targetAfterMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(targetFolderUid));
110
- expect(targetAfterMove).toMatchObject([{ uid: nodeUid, parentUid: targetFolderUid }]);
111
- expect(apiService.post).toHaveBeenCalledTimes(1);
112
- });
113
- });
114
- //# 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,137 +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
- getMyFilesIDs: jest.fn().mockResolvedValue({ volumeId: 'volumeId' }),
60
- }
61
-
62
- nodesModule = initNodesModule(
63
- getMockTelemetry(),
64
- apiService,
65
- driveEntitiesCache,
66
- driveCryptoCache,
67
- account,
68
- driveCrypto,
69
- driveEvents,
70
- sharesService,
71
- );
72
- });
73
-
74
- test('should move node from one folder to another after move event', async () => {
75
- // Prepare two folders (original and target) and a node in the original folder.
76
- const originalFolderUid = makeNodeUid('volumeId', 'originalFolder');
77
- await driveEntitiesCache.setEntity(`node-${originalFolderUid}`, generateSerializedNode(originalFolderUid));
78
- await driveEntitiesCache.setEntity(`node-children-${originalFolderUid}`, 'loaded');
79
-
80
- const targetFolderUid = makeNodeUid('volumeId', 'targetFolder');
81
- await driveEntitiesCache.setEntity(`node-${targetFolderUid}`, generateSerializedNode(targetFolderUid));
82
- await driveEntitiesCache.setEntity(`node-children-${targetFolderUid}`, 'loaded');
83
-
84
- const nodeUid = makeNodeUid('volumeId', 'node1');
85
- await driveEntitiesCache.setEntity(`node-${nodeUid}`, generateSerializedNode(nodeUid, originalFolderUid), [`nodeParentUid:${originalFolderUid}`]);
86
-
87
- // Mock the API services to return the moved node.
88
- // This is called when listing the children of the target folder after
89
- // move event (when node marked as stale).
90
- apiService.post = jest.fn().mockImplementation(async (url, body) => {
91
- expect(url).toBe(`drive/v2/volumes/volumeId/links`);
92
- return {
93
- Links: [{
94
- Link: {
95
- LinkID: 'node1',
96
- ParentLinkID: 'targetFolder',
97
- NameHash: 'hash',
98
- Type: 2,
99
- },
100
- File: {
101
- ActiveRevision: {},
102
- },
103
- }],
104
- };
105
- });
106
- jest.spyOn(nodesModule.access, 'getParentKeys').mockResolvedValue({ key: { _idx: 32131 } } as any);
107
-
108
- // Verify the inital state before move event is sent.
109
- const originalBeforeMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(originalFolderUid));
110
- expect(originalBeforeMove).toMatchObject([{ uid: nodeUid, parentUid: originalFolderUid }]);
111
-
112
- const targetBeforeMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(targetFolderUid));
113
- expect(targetBeforeMove).toMatchObject([]);
114
-
115
- // Send the move event that updates the cache.
116
- const events: DriveEvent[] = [
117
- {
118
- type: DriveEventType.NodeUpdated,
119
- nodeUid,
120
- parentNodeUid: targetFolderUid,
121
- isTrashed: false,
122
- isShared: false,
123
- isOwnVolume: true,
124
- },
125
- ]
126
- await Promise.all(eventCallbacks.map((callback) => callback(events)));
127
-
128
- // Verify the state after the move event, including when API service is called.
129
- const originalAfterMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(originalFolderUid));
130
- expect(originalAfterMove).toMatchObject([]);
131
- expect(apiService.post).not.toHaveBeenCalled();
132
-
133
- const targetAfterMove = await Array.fromAsync(nodesModule.access.iterateFolderChildren(targetFolderUid));
134
- expect(targetAfterMove).toMatchObject([{ uid: nodeUid, parentUid: targetFolderUid }]);
135
- expect(apiService.post).toHaveBeenCalledTimes(1);
136
- });
137
- });