@global-cache/core 0.2.3

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 (162) hide show
  1. package/README.md +5 -0
  2. package/dist/client/api.d.ts +21 -0
  3. package/dist/client/api.d.ts.map +1 -0
  4. package/dist/client/api.js +43 -0
  5. package/dist/client/api.js.map +1 -0
  6. package/dist/client/index.d.ts +27 -0
  7. package/dist/client/index.d.ts.map +1 -0
  8. package/dist/client/index.js +135 -0
  9. package/dist/client/index.js.map +1 -0
  10. package/dist/client/types.d.ts +12 -0
  11. package/dist/client/types.d.ts.map +1 -0
  12. package/dist/client/types.js +3 -0
  13. package/dist/client/types.js.map +1 -0
  14. package/dist/client/utils/http-error.d.ts +3 -0
  15. package/dist/client/utils/http-error.d.ts.map +1 -0
  16. package/dist/client/utils/http-error.js +13 -0
  17. package/dist/client/utils/http-error.js.map +1 -0
  18. package/dist/client/utils/http-json.d.ts +14 -0
  19. package/dist/client/utils/http-json.d.ts.map +1 -0
  20. package/dist/client/utils/http-json.js +29 -0
  21. package/dist/client/utils/http-json.js.map +1 -0
  22. package/dist/client/utils/http-query.d.ts +9 -0
  23. package/dist/client/utils/http-query.d.ts.map +1 -0
  24. package/dist/client/utils/http-query.js +25 -0
  25. package/dist/client/utils/http-query.js.map +1 -0
  26. package/dist/client/utils/preview-value.d.ts +2 -0
  27. package/dist/client/utils/preview-value.d.ts.map +1 -0
  28. package/dist/client/utils/preview-value.js +16 -0
  29. package/dist/client/utils/preview-value.js.map +1 -0
  30. package/dist/config.d.ts +28 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +57 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +8 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/server/config.d.ts +15 -0
  39. package/dist/server/config.d.ts.map +1 -0
  40. package/dist/server/config.js +18 -0
  41. package/dist/server/config.js.map +1 -0
  42. package/dist/server/error.d.ts +3 -0
  43. package/dist/server/error.d.ts.map +1 -0
  44. package/dist/server/error.js +9 -0
  45. package/dist/server/error.js.map +1 -0
  46. package/dist/server/getter.d.ts +35 -0
  47. package/dist/server/getter.d.ts.map +1 -0
  48. package/dist/server/getter.js +109 -0
  49. package/dist/server/getter.js.map +1 -0
  50. package/dist/server/index.d.ts +14 -0
  51. package/dist/server/index.d.ts.map +1 -0
  52. package/dist/server/index.js +73 -0
  53. package/dist/server/index.js.map +1 -0
  54. package/dist/server/routes/clear.d.ts +2 -0
  55. package/dist/server/routes/clear.d.ts.map +1 -0
  56. package/dist/server/routes/clear.js +15 -0
  57. package/dist/server/routes/clear.js.map +1 -0
  58. package/dist/server/routes/get-stale-list.d.ts +7 -0
  59. package/dist/server/routes/get-stale-list.d.ts.map +1 -0
  60. package/dist/server/routes/get-stale-list.js +20 -0
  61. package/dist/server/routes/get-stale-list.js.map +1 -0
  62. package/dist/server/routes/get-stale.d.ts +7 -0
  63. package/dist/server/routes/get-stale.d.ts.map +1 -0
  64. package/dist/server/routes/get-stale.js +20 -0
  65. package/dist/server/routes/get-stale.js.map +1 -0
  66. package/dist/server/routes/get.d.ts +9 -0
  67. package/dist/server/routes/get.d.ts.map +1 -0
  68. package/dist/server/routes/get.js +23 -0
  69. package/dist/server/routes/get.js.map +1 -0
  70. package/dist/server/routes/set.d.ts +9 -0
  71. package/dist/server/routes/set.d.ts.map +1 -0
  72. package/dist/server/routes/set.js +18 -0
  73. package/dist/server/routes/set.js.map +1 -0
  74. package/dist/server/setter.d.ts +12 -0
  75. package/dist/server/setter.d.ts.map +1 -0
  76. package/dist/server/setter.js +37 -0
  77. package/dist/server/setter.js.map +1 -0
  78. package/dist/server/storage/index.d.ts +6 -0
  79. package/dist/server/storage/index.d.ts.map +1 -0
  80. package/dist/server/storage/index.js +14 -0
  81. package/dist/server/storage/index.js.map +1 -0
  82. package/dist/server/storage/multi-instance/index.d.ts +9 -0
  83. package/dist/server/storage/multi-instance/index.d.ts.map +1 -0
  84. package/dist/server/storage/multi-instance/index.js +10 -0
  85. package/dist/server/storage/multi-instance/index.js.map +1 -0
  86. package/dist/server/storage/single-instance/fs.d.ts +16 -0
  87. package/dist/server/storage/single-instance/fs.d.ts.map +1 -0
  88. package/dist/server/storage/single-instance/fs.js +59 -0
  89. package/dist/server/storage/single-instance/fs.js.map +1 -0
  90. package/dist/server/storage/single-instance/index.d.ts +11 -0
  91. package/dist/server/storage/single-instance/index.d.ts.map +1 -0
  92. package/dist/server/storage/single-instance/index.js +33 -0
  93. package/dist/server/storage/single-instance/index.js.map +1 -0
  94. package/dist/server/storage/single-instance/memory.d.ts +15 -0
  95. package/dist/server/storage/single-instance/memory.d.ts.map +1 -0
  96. package/dist/server/storage/single-instance/memory.js +41 -0
  97. package/dist/server/storage/single-instance/memory.js.map +1 -0
  98. package/dist/server/storage/types.d.ts +14 -0
  99. package/dist/server/storage/types.d.ts.map +1 -0
  100. package/dist/server/storage/types.js +3 -0
  101. package/dist/server/storage/types.js.map +1 -0
  102. package/dist/server/utils/express.d.ts +8 -0
  103. package/dist/server/utils/express.d.ts.map +1 -0
  104. package/dist/server/utils/express.js +15 -0
  105. package/dist/server/utils/express.js.map +1 -0
  106. package/dist/shared/debug.d.ts +4 -0
  107. package/dist/shared/debug.d.ts.map +1 -0
  108. package/dist/shared/debug.js +14 -0
  109. package/dist/shared/debug.js.map +1 -0
  110. package/dist/shared/logger.d.ts +2 -0
  111. package/dist/shared/logger.d.ts.map +1 -0
  112. package/dist/shared/logger.js +5 -0
  113. package/dist/shared/logger.js.map +1 -0
  114. package/dist/shared/sig.d.ts +23 -0
  115. package/dist/shared/sig.d.ts.map +1 -0
  116. package/dist/shared/sig.js +53 -0
  117. package/dist/shared/sig.js.map +1 -0
  118. package/dist/shared/ttl.d.ts +8 -0
  119. package/dist/shared/ttl.d.ts.map +1 -0
  120. package/dist/shared/ttl.js +25 -0
  121. package/dist/shared/ttl.js.map +1 -0
  122. package/dist/shared/utils/object.d.ts +2 -0
  123. package/dist/shared/utils/object.d.ts.map +1 -0
  124. package/dist/shared/utils/object.js +9 -0
  125. package/dist/shared/utils/object.js.map +1 -0
  126. package/dist/shared/value-info.d.ts +18 -0
  127. package/dist/shared/value-info.d.ts.map +1 -0
  128. package/dist/shared/value-info.js +32 -0
  129. package/dist/shared/value-info.js.map +1 -0
  130. package/package.json +41 -0
  131. package/src/client/api.ts +51 -0
  132. package/src/client/index.ts +137 -0
  133. package/src/client/types.ts +14 -0
  134. package/src/client/utils/http-error.ts +8 -0
  135. package/src/client/utils/http-json.ts +32 -0
  136. package/src/client/utils/http-query.ts +24 -0
  137. package/src/client/utils/preview-value.ts +10 -0
  138. package/src/config.ts +79 -0
  139. package/src/index.ts +2 -0
  140. package/src/server/config.ts +29 -0
  141. package/src/server/error.ts +7 -0
  142. package/src/server/getter.ts +138 -0
  143. package/src/server/index.ts +81 -0
  144. package/src/server/routes/clear.ts +15 -0
  145. package/src/server/routes/get-stale-list.ts +27 -0
  146. package/src/server/routes/get-stale.ts +27 -0
  147. package/src/server/routes/get.ts +31 -0
  148. package/src/server/routes/set.ts +27 -0
  149. package/src/server/setter.ts +35 -0
  150. package/src/server/storage/index.ts +16 -0
  151. package/src/server/storage/multi-instance/index.ts +7 -0
  152. package/src/server/storage/single-instance/fs.ts +64 -0
  153. package/src/server/storage/single-instance/index.ts +32 -0
  154. package/src/server/storage/single-instance/memory.ts +43 -0
  155. package/src/server/storage/types.ts +13 -0
  156. package/src/server/utils/express.ts +14 -0
  157. package/src/shared/debug.ts +7 -0
  158. package/src/shared/logger.ts +1 -0
  159. package/src/shared/sig.ts +84 -0
  160. package/src/shared/ttl.ts +19 -0
  161. package/src/shared/utils/object.ts +4 -0
  162. package/src/shared/value-info.ts +40 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/server/error.ts"],"names":[],"mappings":";;AAGA,oCAGC;AAJD,sCAAsC;AACtC,SAAgB,YAAY,CAAC,GAAY,EAAE,IAAa,EAAE,GAAa,EAAE,KAAmB;IAC1F,MAAM,OAAO,GAAI,GAAa,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;IACvD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { TestRunValueInfo } from '../shared/value-info';
2
+ import { IPersistentStorage, ITestRunStorage } from './storage/types';
3
+ type GetterCacheMiss = {
4
+ result: 'cache-miss';
5
+ message: string;
6
+ };
7
+ type GetterCacheHit = {
8
+ result: 'cache-hit';
9
+ valueInfo: TestRunValueInfo;
10
+ };
11
+ type GetterError = {
12
+ result: 'error';
13
+ message: string;
14
+ };
15
+ type GetterSingatureMismatch = {
16
+ result: 'sig-mismatch';
17
+ message: string;
18
+ };
19
+ export type GetterResult = GetterCacheMiss | GetterCacheHit | GetterError | GetterSingatureMismatch;
20
+ export declare class Getter {
21
+ private testRunStorage;
22
+ private persistentStorage;
23
+ constructor(testRunStorage: ITestRunStorage, persistentStorage: IPersistentStorage);
24
+ get(key: string, sig: string, ttl?: number): Promise<GetterResult>;
25
+ private handleSignatureMismatch;
26
+ private handleComputed;
27
+ private handleError;
28
+ private handleSignatureChanged;
29
+ private handleExpired;
30
+ private handleNoValue;
31
+ private handleDefault;
32
+ private updateValueInfo;
33
+ }
34
+ export {};
35
+ //# sourceMappingURL=getter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getter.d.ts","sourceRoot":"","sources":["../../src/server/getter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEtE,KAAK,eAAe,GAAG;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AACjE,KAAK,cAAc,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAC3E,KAAK,WAAW,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AACxD,KAAK,uBAAuB,GAAG;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,cAAc,GAAG,WAAW,GAAG,uBAAuB,CAAC;AAEpG,qBAAa,MAAM;IAEf,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,iBAAiB;gBADjB,cAAc,EAAE,eAAe,EAC/B,iBAAiB,EAAE,kBAAkB;IAIzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAmDxE,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,WAAW;YAIL,sBAAsB;YAetB,aAAa;YAUb,aAAa;YAKb,aAAa;YAMb,eAAe;CAI9B"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Getter = void 0;
4
+ /**
5
+ * Handles "get" request for single-instance storage.
6
+ */
7
+ const sig_1 = require("../shared/sig");
8
+ const ttl_1 = require("../shared/ttl");
9
+ class Getter {
10
+ constructor(testRunStorage, persistentStorage) {
11
+ this.testRunStorage = testRunStorage;
12
+ this.persistentStorage = persistentStorage;
13
+ }
14
+ // eslint-disable-next-line visual/complexity, max-statements
15
+ async get(key, sig, ttl) {
16
+ let valueInfo = await this.testRunStorage.load(key);
17
+ // check signature (for already accessed value)
18
+ if (valueInfo) {
19
+ const signatureMismatch = (0, sig_1.checkSignature)(key, valueInfo.sig, sig);
20
+ if (signatureMismatch) {
21
+ return this.handleSignatureMismatch(key, signatureMismatch);
22
+ }
23
+ }
24
+ // wait if computing
25
+ if (valueInfo?.state === 'computing') {
26
+ valueInfo = await this.testRunStorage.wait(key);
27
+ return valueInfo.state === 'computed'
28
+ ? this.handleComputed(valueInfo)
29
+ : this.handleError(valueInfo);
30
+ }
31
+ // load from persistent storage
32
+ if (!valueInfo && ttl) {
33
+ valueInfo = await this.persistentStorage.load(key);
34
+ if (valueInfo) {
35
+ const signatureMismatch = (0, sig_1.checkSignature)(key, valueInfo.sig, sig);
36
+ // eslint-disable-next-line max-depth
37
+ if (signatureMismatch) {
38
+ return this.handleSignatureChanged(valueInfo, sig, signatureMismatch);
39
+ }
40
+ }
41
+ }
42
+ // check expired
43
+ if (valueInfo?.state === 'computed' && valueInfo.persistent && ttl) {
44
+ if ((0, ttl_1.isExpired)(valueInfo.computedAt, ttl)) {
45
+ return this.handleExpired(valueInfo, ttl);
46
+ }
47
+ }
48
+ // normal cache hit
49
+ if (valueInfo?.state === 'computed') {
50
+ return this.handleComputed(valueInfo);
51
+ }
52
+ // no value
53
+ if (!valueInfo) {
54
+ return this.handleNoValue(key, sig, ttl);
55
+ }
56
+ return this.handleDefault(valueInfo);
57
+ }
58
+ handleSignatureMismatch(key, signatureMismatch) {
59
+ return { result: 'sig-mismatch', message: buildSignatureError(key, signatureMismatch) };
60
+ }
61
+ handleComputed(valueInfo) {
62
+ return { result: 'cache-hit', valueInfo };
63
+ }
64
+ handleError(valueInfo) {
65
+ return { result: 'error', message: valueInfo.errorMessage || 'Unknown error' };
66
+ }
67
+ async handleSignatureChanged(loadedValueInfo, newSig, { field }) {
68
+ await this.updateValueInfo(loadedValueInfo, {
69
+ state: 'computing',
70
+ sig: newSig,
71
+ prevValue: loadedValueInfo.value,
72
+ value: undefined,
73
+ computedAt: undefined,
74
+ });
75
+ return { result: 'cache-miss', message: `signature changed: ${field}` };
76
+ }
77
+ async handleExpired(valueInfo, ttl) {
78
+ await this.updateValueInfo(valueInfo, {
79
+ state: 'computing',
80
+ prevValue: valueInfo.value,
81
+ value: undefined,
82
+ computedAt: undefined,
83
+ });
84
+ return { result: 'cache-miss', message: `expired: ${ttl}` };
85
+ }
86
+ async handleNoValue(key, sig, ttl) {
87
+ await this.updateValueInfo({ key, state: 'computing', sig, persistent: Boolean(ttl) });
88
+ return { result: 'cache-miss', message: 'no cached value' };
89
+ }
90
+ async handleDefault(valueInfo) {
91
+ const message = `old state: ${valueInfo.state}`;
92
+ await this.updateValueInfo(valueInfo, { state: 'computing' });
93
+ return { result: 'cache-miss', message };
94
+ }
95
+ async updateValueInfo(valueInfo, props) {
96
+ Object.assign(valueInfo, props);
97
+ await this.testRunStorage.save(valueInfo);
98
+ }
99
+ }
100
+ exports.Getter = Getter;
101
+ function buildSignatureError(key, { field, value1, value2 }) {
102
+ return [
103
+ `Signature mismatch (${field}). `,
104
+ `Please ensure you don't call globalCache.get("${key}") from multiple places.\n`,
105
+ `1-st call ${field}: ${value1}\n`,
106
+ `2-nd call ${field}: ${value2}`,
107
+ ].join('');
108
+ }
109
+ //# sourceMappingURL=getter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getter.js","sourceRoot":"","sources":["../../src/server/getter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { GlobalCacheServerConfig } from './config';
2
+ export declare class GlobalCacheServer {
3
+ private app;
4
+ private server;
5
+ constructor();
6
+ get port(): number;
7
+ get localUrl(): string;
8
+ get isRunning(): boolean;
9
+ start(config: GlobalCacheServerConfig): Promise<void>;
10
+ stop(): Promise<void>;
11
+ clearTestRun(runId: string): Promise<void>;
12
+ }
13
+ export declare const globalCacheServer: GlobalCacheServer;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAa,uBAAuB,EAAa,MAAM,UAAU,CAAC;AAIzE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,MAAM,CAA4B;;IAiB1C,IAAI,IAAI,WAGP;IAED,IAAI,QAAQ,WAEX;IAED,IAAI,SAAS,YAEZ;IAEK,KAAK,CAAC,MAAM,EAAE,uBAAuB;IAQrC,IAAI;IAUJ,YAAY,CAAC,KAAK,EAAE,MAAM;CAMjC;AAGD,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.globalCacheServer = exports.GlobalCacheServer = void 0;
7
+ const express_1 = __importDefault(require("express"));
8
+ const debug_1 = require("../shared/debug");
9
+ const get_1 = require("./routes/get");
10
+ const set_1 = require("./routes/set");
11
+ const get_stale_1 = require("./routes/get-stale");
12
+ const get_stale_list_1 = require("./routes/get-stale-list");
13
+ const clear_1 = require("./routes/clear");
14
+ const error_1 = require("./error");
15
+ const config_1 = require("./config");
16
+ const storage_1 = require("./storage");
17
+ const express_2 = require("./utils/express");
18
+ class GlobalCacheServer {
19
+ constructor() {
20
+ this.app = (0, express_1.default)();
21
+ this.server = null;
22
+ this.app.use(express_1.default.json());
23
+ this.app.use('/', get_1.router);
24
+ this.app.use('/', set_1.router);
25
+ this.app.use('/', get_stale_1.router);
26
+ this.app.use('/', get_stale_list_1.router);
27
+ this.app.use('/', clear_1.router);
28
+ // todo:
29
+ // this.app.get('/', (req, res) => {
30
+ // res.send('Global Storage Server is running.');
31
+ // });
32
+ // Must be after all other middleware and routes
33
+ this.app.use(error_1.errorHandler);
34
+ }
35
+ get port() {
36
+ const { port = 0 } = this.server ? this.server.address() : {};
37
+ return port;
38
+ }
39
+ get localUrl() {
40
+ return `http://localhost:${this.port}`;
41
+ }
42
+ get isRunning() {
43
+ return Boolean(this.server?.listening);
44
+ }
45
+ async start(config) {
46
+ // todo: if server is already running?
47
+ (0, debug_1.debug)('Starting server...');
48
+ (0, config_1.setConfig)(this.app, config);
49
+ this.server = await (0, express_2.startExpressServer)(this.app, config.port);
50
+ (0, debug_1.debug)(`Server started on port: ${this.port}`);
51
+ }
52
+ async stop() {
53
+ if (!this.isRunning)
54
+ return;
55
+ (0, debug_1.debug)('Stopping server...');
56
+ await new Promise((resolve, reject) => {
57
+ this.server?.close((err) => (err ? reject(err) : resolve()));
58
+ });
59
+ this.server = null;
60
+ (0, debug_1.debug)('Server stopped.');
61
+ }
62
+ async clearTestRun(runId) {
63
+ if (!this.isRunning)
64
+ return;
65
+ const config = (0, config_1.getConfig)(this.app);
66
+ const { testRunStorage } = (0, storage_1.getStorage)(config, runId);
67
+ await testRunStorage.clear();
68
+ }
69
+ }
70
+ exports.GlobalCacheServer = GlobalCacheServer;
71
+ /* Export a default instance - convenient for usage */
72
+ exports.globalCacheServer = new GlobalCacheServer();
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const router: import("express-serve-static-core").Router;
2
+ //# sourceMappingURL=clear.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear.d.ts","sourceRoot":"","sources":["../../../src/server/routes/clear.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,MAAM,4CAAW,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.router = void 0;
4
+ const express_1 = require("express");
5
+ const config_1 = require("../config");
6
+ const storage_1 = require("../storage");
7
+ exports.router = (0, express_1.Router)();
8
+ exports.router.post('/run/:runId/clear', async (req, res) => {
9
+ const { runId } = req.params;
10
+ const config = (0, config_1.getConfig)(req.app);
11
+ const { testRunStorage } = (0, storage_1.getStorage)(config, runId);
12
+ await testRunStorage.clear();
13
+ res.end();
14
+ });
15
+ //# sourceMappingURL=clear.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear.js","sourceRoot":"","sources":["../../../src/server/routes/clear.ts"],"names":[],"mappings":";;;AAAA,qCAA0C;AAC1C,sCAAsC;AACtC,wCAAwC;AAE3B,QAAA,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAE/B,cAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAClD,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAA,kBAAS,EAAC,GAAG,CAAC,GAAc,CAAC,CAAC;IAE7C,MAAM,EAAE,cAAc,EAAE,GAAG,IAAA,oBAAU,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrD,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;IAE7B,GAAG,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { TestRunValueInfo } from '../../shared/value-info';
2
+ export declare const router: import("express-serve-static-core").Router;
3
+ export type GetStaleListParams = {
4
+ prefix: string;
5
+ };
6
+ export type SetStaleListResponse = TestRunValueInfo[];
7
+ //# sourceMappingURL=get-stale-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-stale-list.d.ts","sourceRoot":"","sources":["../../../src/server/routes/get-stale-list.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,eAAO,MAAM,MAAM,4CAAW,CAAC;AAE/B,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.router = void 0;
4
+ const express_1 = require("express");
5
+ const config_1 = require("../config");
6
+ const storage_1 = require("../storage");
7
+ exports.router = (0, express_1.Router)();
8
+ /**
9
+ * Returns a list of stale values by prefix.
10
+ * For stale we return only values used in this test-run.
11
+ */
12
+ exports.router.get('/run/:runId/get-stale-list', async (req, res) => {
13
+ const { runId } = req.params;
14
+ const { prefix } = req.query;
15
+ const config = (0, config_1.getConfig)(req.app);
16
+ const { testRunStorage } = (0, storage_1.getStorage)(config, runId);
17
+ const valueInfoList = await testRunStorage.loadByPrefix(prefix);
18
+ res.json(valueInfoList);
19
+ });
20
+ //# sourceMappingURL=get-stale-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-stale-list.js","sourceRoot":"","sources":["../../../src/server/routes/get-stale-list.ts"],"names":[],"mappings":";;;AAAA,qCAA0C;AAC1C,sCAAsC;AACtC,wCAAwC;AAG3B,QAAA,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAQ/B;;;GAGG;AACH,cAAM,CAAC,GAAG,CAAC,4BAA4B,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC1D,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,KAA2B,CAAC;IACnD,MAAM,MAAM,GAAG,IAAA,kBAAS,EAAC,GAAG,CAAC,GAAc,CAAC,CAAC;IAE7C,MAAM,EAAE,cAAc,EAAE,GAAG,IAAA,oBAAU,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAEhE,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { TestRunValueInfo } from '../../shared/value-info';
2
+ export declare const router: import("express-serve-static-core").Router;
3
+ export type GetStaleParams = {
4
+ key: string;
5
+ };
6
+ export type SetStaleResponse = TestRunValueInfo | null;
7
+ //# sourceMappingURL=get-stale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-stale.d.ts","sourceRoot":"","sources":["../../../src/server/routes/get-stale.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,eAAO,MAAM,MAAM,4CAAW,CAAC;AAE/B,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,IAAI,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.router = void 0;
4
+ const express_1 = require("express");
5
+ const config_1 = require("../config");
6
+ const storage_1 = require("../storage");
7
+ exports.router = (0, express_1.Router)();
8
+ /**
9
+ * Returns a stale value.
10
+ * For stale we return only values used in this test-run.
11
+ */
12
+ exports.router.get('/run/:runId/get-stale', async (req, res) => {
13
+ const { runId } = req.params;
14
+ const { key } = req.query;
15
+ const config = (0, config_1.getConfig)(req.app);
16
+ const { testRunStorage } = (0, storage_1.getStorage)(config, runId);
17
+ const valueInfo = await testRunStorage.load(key);
18
+ res.json(valueInfo ?? null);
19
+ });
20
+ //# sourceMappingURL=get-stale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-stale.js","sourceRoot":"","sources":["../../../src/server/routes/get-stale.ts"],"names":[],"mappings":";;;AAAA,qCAA0C;AAC1C,sCAAsC;AACtC,wCAAwC;AAG3B,QAAA,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAQ/B;;;GAGG;AACH,cAAM,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACrD,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IAC7B,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAuB,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAA,kBAAS,EAAC,GAAG,CAAC,GAAc,CAAC,CAAC;IAE7C,MAAM,EAAE,cAAc,EAAE,GAAG,IAAA,oBAAU,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEjD,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { GetterResult } from '../getter';
2
+ export declare const router: import("express-serve-static-core").Router;
3
+ export type GetValueParams = {
4
+ key: string;
5
+ sig: string;
6
+ ttl?: string;
7
+ };
8
+ export type GetValueResponse = GetterResult;
9
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/server/routes/get.ts"],"names":[],"mappings":"AAGA,OAAO,EAAU,YAAY,EAAE,MAAM,WAAW,CAAC;AAGjD,eAAO,MAAM,MAAM,4CAAW,CAAC;AAE/B,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.router = void 0;
4
+ const express_1 = require("express");
5
+ const ttl_1 = require("../../shared/ttl");
6
+ const config_1 = require("../config");
7
+ const getter_1 = require("../getter");
8
+ const storage_1 = require("../storage");
9
+ exports.router = (0, express_1.Router)();
10
+ /**
11
+ * Route for geting a value.
12
+ */
13
+ exports.router.get('/run/:runId/get', async (req, res) => {
14
+ const { runId } = req.params;
15
+ const { key, sig, ttl: ttlParam } = req.query;
16
+ const config = (0, config_1.getConfig)(req.app);
17
+ const ttl = (0, ttl_1.parseTTL)(ttlParam);
18
+ const { testRunStorage, persistentStorage } = (0, storage_1.getStorage)(config, runId);
19
+ const getter = new getter_1.Getter(testRunStorage, persistentStorage);
20
+ const data = await getter.get(key, sig, ttl);
21
+ res.json(data);
22
+ });
23
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/server/routes/get.ts"],"names":[],"mappings":";;;AAAA,qCAA0C;AAC1C,0CAA4C;AAC5C,sCAAsC;AACtC,sCAAiD;AACjD,wCAAwC;AAE3B,QAAA,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAU/B;;GAEG;AACH,cAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC/C,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IAC7B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,KAAuB,CAAC;IAChE,MAAM,MAAM,GAAG,IAAA,kBAAS,EAAC,GAAG,CAAC,GAAc,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAA,cAAQ,EAAC,QAAQ,CAAC,CAAC;IAE/B,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,IAAA,oBAAU,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAE7C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { TestRunValueInfo } from '../../shared/value-info';
2
+ export declare const router: import("express-serve-static-core").Router;
3
+ export type SetValueParams = {
4
+ key: string;
5
+ value?: unknown;
6
+ error?: string;
7
+ };
8
+ export type SetValueResponse = TestRunValueInfo;
9
+ //# sourceMappingURL=set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../src/server/routes/set.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAI3D,eAAO,MAAM,MAAM,4CAAW,CAAC;AAE/B,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.router = void 0;
4
+ const express_1 = require("express");
5
+ const config_1 = require("../config");
6
+ const setter_1 = require("../setter");
7
+ const storage_1 = require("../storage");
8
+ exports.router = (0, express_1.Router)();
9
+ exports.router.post('/run/:runId/set', async (req, res) => {
10
+ const { runId } = req.params;
11
+ const { key, value, error } = req.body;
12
+ const config = (0, config_1.getConfig)(req.app);
13
+ const { testRunStorage, persistentStorage } = (0, storage_1.getStorage)(config, runId);
14
+ const setter = new setter_1.Setter(testRunStorage, persistentStorage);
15
+ const valueInfo = await setter.set({ key, value, error });
16
+ res.json(valueInfo);
17
+ });
18
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/server/routes/set.ts"],"names":[],"mappings":";;;AAAA,qCAA0C;AAC1C,sCAAsC;AAEtC,sCAAmC;AACnC,wCAAwC;AAE3B,QAAA,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAU/B,cAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAChD,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IAC7B,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,IAAsB,CAAC;IACzD,MAAM,MAAM,GAAG,IAAA,kBAAS,EAAC,GAAG,CAAC,GAAc,CAAC,CAAC;IAE7C,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,IAAA,oBAAU,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAE1D,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACtB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { IPersistentStorage, ITestRunStorage } from './storage/types';
2
+ export declare class Setter {
3
+ private testRunStorage;
4
+ private persistentStorage;
5
+ constructor(testRunStorage: ITestRunStorage, persistentStorage: IPersistentStorage);
6
+ set({ key, value, error }: {
7
+ key: string;
8
+ value?: unknown;
9
+ error?: string;
10
+ }): Promise<import("../shared/value-info").TestRunValueInfo>;
11
+ }
12
+ //# sourceMappingURL=setter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setter.d.ts","sourceRoot":"","sources":["../../src/server/setter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEtE,qBAAa,MAAM;IAEf,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,iBAAiB;gBADjB,cAAc,EAAE,eAAe,EAC/B,iBAAiB,EAAE,kBAAkB;IAIzC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;CAwBlF"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Setter = void 0;
4
+ const value_info_1 = require("../shared/value-info");
5
+ class Setter {
6
+ constructor(testRunStorage, persistentStorage) {
7
+ this.testRunStorage = testRunStorage;
8
+ this.persistentStorage = persistentStorage;
9
+ }
10
+ // eslint-disable-next-line visual/complexity, max-statements
11
+ async set({ key, value, error }) {
12
+ const valueInfo = await this.testRunStorage.load(key);
13
+ // todo: convert to warnings?
14
+ if (!valueInfo) {
15
+ throw new Error(`Cannot set value for key "${key}" that is not loaded.`);
16
+ }
17
+ if (valueInfo.state !== 'computing') {
18
+ throw new Error(`Cannot set value for key "${key}" that is not in "computing" state.`);
19
+ }
20
+ if (error) {
21
+ (0, value_info_1.setError)(valueInfo, error);
22
+ await this.testRunStorage.save(valueInfo, { notify: true });
23
+ // We delete file on error, as error may be related to the invalid value.
24
+ if (valueInfo.persistent)
25
+ await this.persistentStorage.delete(key);
26
+ }
27
+ else {
28
+ (0, value_info_1.setComputed)(valueInfo, value);
29
+ await this.testRunStorage.save(valueInfo, { notify: true });
30
+ if (valueInfo.persistent)
31
+ await this.persistentStorage.save(valueInfo);
32
+ }
33
+ return valueInfo;
34
+ }
35
+ }
36
+ exports.Setter = Setter;
37
+ //# sourceMappingURL=setter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setter.js","sourceRoot":"","sources":["../../src/server/setter.ts"],"names":[],"mappings":";;;AAAA,qDAA6D;AAG7D,MAAa,MAAM;IACjB,YACU,cAA+B,EAC/B,iBAAqC;QADrC,mBAAc,GAAd,cAAc,CAAiB;QAC/B,sBAAiB,GAAjB,iBAAiB,CAAoB;IAC5C,CAAC;IAEJ,6DAA6D;IAC7D,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAoD;QAC/E,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEtD,6BAA6B;QAC7B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,uBAAuB,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,SAAS,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,qCAAqC,CAAC,CAAC;QACzF,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,IAAA,qBAAQ,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,yEAAyE;YACzE,IAAI,SAAS,CAAC,UAAU;gBAAE,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,IAAA,wBAAW,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,IAAI,SAAS,CAAC,UAAU;gBAAE,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AA/BD,wBA+BC"}
@@ -0,0 +1,6 @@
1
+ import { GlobalCacheServerConfigResolved } from '../config';
2
+ export declare function getStorage({ multiInstance, basePath }: GlobalCacheServerConfigResolved, runId: string): {
3
+ testRunStorage: import("./single-instance/memory").MemoryStorage;
4
+ persistentStorage: import("./single-instance/fs").FilesystemStorage;
5
+ };
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,WAAW,CAAC;AAG5D,wBAAgB,UAAU,CACxB,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,+BAA+B,EAC5D,KAAK,EAAE,MAAM;;;EAUd"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getStorage = getStorage;
4
+ const single_instance_1 = require("./single-instance");
5
+ function getStorage({ multiInstance, basePath }, runId) {
6
+ if (multiInstance) {
7
+ throw new Error('Multi-instance mode is not implemented yet.');
8
+ }
9
+ return {
10
+ testRunStorage: (0, single_instance_1.getMemoryStorage)(runId),
11
+ persistentStorage: (0, single_instance_1.getFsStorage)(basePath),
12
+ };
13
+ }
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/storage/index.ts"],"names":[],"mappings":";;AAGA,gCAYC;AAdD,uDAAmE;AAEnE,SAAgB,UAAU,CACxB,EAAE,aAAa,EAAE,QAAQ,EAAmC,EAC5D,KAAa;IAEb,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,OAAO;QACL,cAAc,EAAE,IAAA,kCAAgB,EAAC,KAAK,CAAC;QACvC,iBAAiB,EAAE,IAAA,8BAAY,EAAC,QAAQ,CAAC;KAC1C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export {};
2
+ /**
3
+ * Multi-instance mode of Global Storage Server.
4
+ * - can't reliably write to fs
5
+ * - can't wait for value via memory, as "set" request can land on another instance
6
+ * - both non-persistent and persistent values are stored in the external storage (redis/firebase)
7
+ * - compute-listeners are implemented via redis/firebase notification features
8
+ */
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/storage/multi-instance/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Multi-instance mode of Global Storage Server.
5
+ * - can't reliably write to fs
6
+ * - can't wait for value via memory, as "set" request can land on another instance
7
+ * - both non-persistent and persistent values are stored in the external storage (redis/firebase)
8
+ * - compute-listeners are implemented via redis/firebase notification features
9
+ */
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/storage/multi-instance/index.ts"],"names":[],"mappings":";;AAAA;;;;;;GAMG"}
@@ -0,0 +1,16 @@
1
+ import { IPersistentStorage } from '../types';
2
+ import { TestRunValueInfo } from '../../../shared/value-info';
3
+ export type StoredInfo = {
4
+ computedAt: number;
5
+ sig: string;
6
+ value: unknown;
7
+ };
8
+ export declare class FilesystemStorage implements IPersistentStorage {
9
+ private basePath;
10
+ constructor(basePath: string);
11
+ load(key: string): Promise<TestRunValueInfo | undefined>;
12
+ save({ key, value, sig }: TestRunValueInfo): Promise<void>;
13
+ delete(key: string): Promise<void>;
14
+ private getFilePath;
15
+ }
16
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../../../src/server/storage/single-instance/fs.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,qBAAa,iBAAkB,YAAW,kBAAkB;IAC9C,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAE9B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAmBxD,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,gBAAgB;IAS1C,MAAM,CAAC,GAAG,EAAE,MAAM;IAOxB,OAAO,CAAC,WAAW;CAGpB"}