@squiz/dx-common-lib 1.2.12 → 1.2.13-alpha.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.
- package/CHANGELOG.md +5 -71
- package/lib/api-key-validation/ApiKeyValidationService.d.ts +4 -0
- package/lib/api-key-validation/ApiKeyValidationService.js +3 -0
- package/lib/api-key-validation/ApiKeyValidationService.js.map +1 -0
- package/lib/api-key-validation/CloudflareApiKeyService.d.ts +17 -0
- package/lib/api-key-validation/CloudflareApiKeyService.js +72 -0
- package/lib/api-key-validation/CloudflareApiKeyService.js.map +1 -0
- package/lib/api-key-validation/CloudflareApiKeyService.spec.d.ts +1 -0
- package/lib/api-key-validation/CloudflareApiKeyService.spec.js +93 -0
- package/lib/api-key-validation/CloudflareApiKeyService.spec.js.map +1 -0
- package/lib/api-key-validation/DevelopmentApiKeyService.d.ts +5 -0
- package/lib/api-key-validation/DevelopmentApiKeyService.js +13 -0
- package/lib/api-key-validation/DevelopmentApiKeyService.js.map +1 -0
- package/lib/api-key-validation/DevelopmentApiKeyService.spec.d.ts +1 -0
- package/lib/api-key-validation/DevelopmentApiKeyService.spec.js +17 -0
- package/lib/api-key-validation/DevelopmentApiKeyService.spec.js.map +1 -0
- package/lib/api-key-validation/getApiKeyService.d.ts +6 -0
- package/lib/api-key-validation/getApiKeyService.js +23 -0
- package/lib/api-key-validation/getApiKeyService.js.map +1 -0
- package/lib/api-key-validation/getApiKeyService.spec.d.ts +1 -0
- package/lib/api-key-validation/getApiKeyService.spec.js +24 -0
- package/lib/api-key-validation/getApiKeyService.spec.js.map +1 -0
- package/lib/cache/applyDefaultRulesToCacheControlObject.d.ts +19 -0
- package/lib/cache/applyDefaultRulesToCacheControlObject.js +21 -0
- package/lib/cache/applyDefaultRulesToCacheControlObject.js.map +1 -0
- package/lib/cache/applyDefaultRulesToCacheControlObject.spec.d.ts +1 -0
- package/lib/cache/applyDefaultRulesToCacheControlObject.spec.js +97 -0
- package/lib/cache/applyDefaultRulesToCacheControlObject.spec.js.map +1 -0
- package/lib/cache/cacheControlToString.d.ts +2 -0
- package/lib/cache/cacheControlToString.js +24 -0
- package/lib/cache/cacheControlToString.js.map +1 -0
- package/lib/cache/cacheControlToString.spec.d.ts +1 -0
- package/lib/cache/cacheControlToString.spec.js +34 -0
- package/lib/cache/cacheControlToString.spec.js.map +1 -0
- package/lib/cache/index.d.ts +4 -0
- package/lib/cache/index.js +21 -0
- package/lib/cache/index.js.map +1 -0
- package/lib/cache/parseAndSanitiseCacheControlHeader.d.ts +5 -0
- package/lib/cache/parseAndSanitiseCacheControlHeader.js +26 -0
- package/lib/cache/parseAndSanitiseCacheControlHeader.js.map +1 -0
- package/lib/cache/parseAndSanitiseCacheControlHeader.spec.d.ts +1 -0
- package/lib/cache/parseAndSanitiseCacheControlHeader.spec.js +21 -0
- package/lib/cache/parseAndSanitiseCacheControlHeader.spec.js.map +1 -0
- package/lib/cache/parseCacheControl.d.ts +19 -0
- package/lib/cache/parseCacheControl.js +46 -0
- package/lib/cache/parseCacheControl.js.map +1 -0
- package/lib/cache/parseCacheControl.spec.d.ts +1 -0
- package/lib/cache/parseCacheControl.spec.js +70 -0
- package/lib/cache/parseCacheControl.spec.js.map +1 -0
- package/lib/error/InvalidTokenError.d.ts +5 -0
- package/lib/error/InvalidTokenError.js +12 -0
- package/lib/error/InvalidTokenError.js.map +1 -0
- package/lib/error/UnAuthenticatedRequestError.d.ts +4 -0
- package/lib/error/UnAuthenticatedRequestError.js +11 -0
- package/lib/error/UnAuthenticatedRequestError.js.map +1 -0
- package/lib/error/UnprivilegedError.d.ts +5 -0
- package/lib/error/UnprivilegedError.js +12 -0
- package/lib/error/UnprivilegedError.js.map +1 -0
- package/lib/error/index.d.ts +3 -0
- package/lib/error/index.js +3 -0
- package/lib/error/index.js.map +1 -1
- package/lib/formatted-text/formattedTextToHtmlSting.d.ts +4 -0
- package/lib/formatted-text/formattedTextToHtmlSting.js +85 -0
- package/lib/formatted-text/formattedTextToHtmlSting.js.map +1 -0
- package/lib/formatted-text/formattedTextToHtmlSting.spec.d.ts +1 -0
- package/lib/formatted-text/formattedTextToHtmlSting.spec.js +212 -0
- package/lib/formatted-text/formattedTextToHtmlSting.spec.js.map +1 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +7 -0
- package/lib/index.js.map +1 -1
- package/lib/server-utils/apiKeyMiddleware.d.ts +3 -0
- package/lib/server-utils/apiKeyMiddleware.js +20 -0
- package/lib/server-utils/apiKeyMiddleware.js.map +1 -0
- package/lib/server-utils/apiKeyMiddleware.spec.d.ts +1 -0
- package/lib/server-utils/apiKeyMiddleware.spec.js +39 -0
- package/lib/server-utils/apiKeyMiddleware.spec.js.map +1 -0
- package/package.json +9 -7
- package/src/api-key-validation/ApiKeyValidationService.ts +4 -0
- package/src/api-key-validation/CloudflareApiKeyService.spec.ts +122 -0
- package/src/api-key-validation/CloudflareApiKeyService.ts +96 -0
- package/src/api-key-validation/DevelopmentApiKeyService.spec.ts +17 -0
- package/src/api-key-validation/DevelopmentApiKeyService.ts +10 -0
- package/src/api-key-validation/getApiKeyService.spec.ts +32 -0
- package/src/api-key-validation/getApiKeyService.ts +27 -0
- package/src/cache/applyDefaultRulesToCacheControlObject.spec.ts +126 -0
- package/src/cache/applyDefaultRulesToCacheControlObject.ts +23 -0
- package/src/cache/cacheControlToString.spec.ts +43 -0
- package/src/cache/cacheControlToString.ts +22 -0
- package/src/cache/index.ts +4 -0
- package/src/cache/parseAndSanitiseCacheControlHeader.spec.ts +25 -0
- package/src/cache/parseAndSanitiseCacheControlHeader.ts +28 -0
- package/src/cache/parseCacheControl.spec.ts +89 -0
- package/src/cache/parseCacheControl.ts +74 -0
- package/src/error/InvalidTokenError.ts +8 -0
- package/src/error/UnAuthenticatedRequestError.ts +7 -0
- package/src/error/UnprivilegedError.ts +8 -0
- package/src/error/index.ts +4 -0
- package/src/formatted-text/formattedTextToHtmlSting.spec.ts +235 -0
- package/src/formatted-text/formattedTextToHtmlSting.ts +100 -0
- package/src/index.ts +7 -0
- package/src/server-utils/apiKeyMiddleware.spec.ts +50 -0
- package/src/server-utils/apiKeyMiddleware.ts +23 -0
- package/tsconfig.json +1 -1
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
@@ -3,150 +3,84 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
5
5
|
|
6
|
-
## [1.2.
|
7
|
-
|
8
|
-
**Note:** Version bump only for package @squiz/dx-common-lib
|
6
|
+
## [1.2.13-alpha.0](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.2...v1.2.13-alpha.0) (2023-01-13)
|
9
7
|
|
8
|
+
### Bug Fixes
|
10
9
|
|
10
|
+
- **deps:** update dependency constructs to v10.1.183 ([def2040](https://gitlab.squiz.net/developer-experience/cmp/commit/def204076fd709282067ccaa09f73f08824bdbf4))
|
11
11
|
|
12
|
+
## [1.2.12](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.2...v1.2.12) (2022-11-24)
|
12
13
|
|
14
|
+
**Note:** Version bump only for package @squiz/dx-common-lib
|
13
15
|
|
14
16
|
## [1.2.11](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.2...v1.2.11) (2022-11-11)
|
15
17
|
|
16
18
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
20
|
## [1.2.10](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.2...v1.2.10) (2022-11-09)
|
23
21
|
|
24
22
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
25
23
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
24
|
## [1.2.9](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.2...v1.2.9) (2022-11-04)
|
31
25
|
|
32
26
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
33
27
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
28
|
## [1.2.8](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.2...v1.2.8) (2022-10-21)
|
39
29
|
|
40
30
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
41
31
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
32
|
## [1.2.7](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.2...v1.2.7) (2022-10-20)
|
47
33
|
|
48
34
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
49
35
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
36
|
## [1.2.6](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.2...v1.2.6) (2022-10-20)
|
55
37
|
|
56
38
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
57
39
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
40
|
## [1.2.5](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.2...v1.2.5) (2022-10-18)
|
63
41
|
|
64
42
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
65
43
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
44
|
## [1.2.2](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.1...v1.2.2) (2022-09-26)
|
71
45
|
|
72
46
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
73
47
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
48
|
## [1.2.1](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.1-alpha.90...v1.2.1) (2022-09-23)
|
79
49
|
|
80
50
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
81
51
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
52
|
## [1.2.1-alpha.107](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.1-alpha.90...v1.2.1-alpha.107) (2022-09-21)
|
87
53
|
|
88
54
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
89
55
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
56
|
## [1.2.1-alpha.106](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.1-alpha.90...v1.2.1-alpha.106) (2022-09-02)
|
95
57
|
|
96
58
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
97
59
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
60
|
## [1.2.1-alpha.105](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.1-alpha.90...v1.2.1-alpha.105) (2022-08-26)
|
103
61
|
|
104
62
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
105
63
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
64
|
## [1.2.1-alpha.104](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.1-alpha.90...v1.2.1-alpha.104) (2022-08-23)
|
111
65
|
|
112
66
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
113
67
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
68
|
## [1.2.1-alpha.103](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.1-alpha.90...v1.2.1-alpha.103) (2022-08-23)
|
119
69
|
|
120
70
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
121
71
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
72
|
## [1.2.1-alpha.102](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.1-alpha.90...v1.2.1-alpha.102) (2022-08-23)
|
127
73
|
|
128
74
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
129
75
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
76
|
## [1.2.1-alpha.101](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.1-alpha.90...v1.2.1-alpha.101) (2022-08-19)
|
135
77
|
|
136
78
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
137
79
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
80
|
## [1.2.1-alpha.100](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.1-alpha.90...v1.2.1-alpha.100) (2022-08-18)
|
143
81
|
|
144
82
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
145
83
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
84
|
## [1.2.1-alpha.99](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.1-alpha.90...v1.2.1-alpha.99) (2022-08-18)
|
151
85
|
|
152
86
|
**Note:** Version bump only for package @squiz/dx-common-lib
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ApiKeyValidationService.js","sourceRoot":"","sources":["../../src/api-key-validation/ApiKeyValidationService.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { SecretsManagerClient } from '@aws-sdk/client-secrets-manager';
|
2
|
+
import { ApiKeyValidationService } from './ApiKeyValidationService';
|
3
|
+
import { Logger } from '@squiz/dx-logger-lib';
|
4
|
+
export interface CloudFlareKeys {
|
5
|
+
keys: string[];
|
6
|
+
'matrix-keys': string[];
|
7
|
+
}
|
8
|
+
export declare class CloudflareApiKeyService implements ApiKeyValidationService {
|
9
|
+
protected secretName: string;
|
10
|
+
protected secretsClient: SecretsManagerClient;
|
11
|
+
protected logger: Logger;
|
12
|
+
constructor(secretName: string, logger?: Logger);
|
13
|
+
keyIsValid(key: string): boolean;
|
14
|
+
matrixKeyIsValid(key: string): boolean;
|
15
|
+
protected getValidApiKeys(): Promise<CloudFlareKeys>;
|
16
|
+
refreshApiKeys(): Promise<void>;
|
17
|
+
}
|
@@ -0,0 +1,72 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.CloudflareApiKeyService = void 0;
|
4
|
+
const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
|
5
|
+
const UnAuthenticatedRequestError_1 = require("../error/UnAuthenticatedRequestError");
|
6
|
+
const dx_logger_lib_1 = require("@squiz/dx-logger-lib");
|
7
|
+
let validKeys = {
|
8
|
+
keys: [],
|
9
|
+
'matrix-keys': [],
|
10
|
+
};
|
11
|
+
let refreshInterval;
|
12
|
+
// number must be smaller than 24 days.
|
13
|
+
// This is because the value is int32 and maxes at than 2^31-1 milliseconds
|
14
|
+
const REFRESH_TIMER = 7 * 24 * 3600 * 1000; // days, hours, seconds, milliseconds
|
15
|
+
class CloudflareApiKeyService {
|
16
|
+
constructor(secretName, logger) {
|
17
|
+
this.secretName = secretName;
|
18
|
+
this.secretsClient = new client_secrets_manager_1.SecretsManagerClient({
|
19
|
+
region: 'ap-southeast-2',
|
20
|
+
});
|
21
|
+
if (!logger) {
|
22
|
+
logger = (0, dx_logger_lib_1.getLogger)({ name: 'CloudflareApiKeyService' });
|
23
|
+
}
|
24
|
+
this.logger = logger;
|
25
|
+
}
|
26
|
+
keyIsValid(key) {
|
27
|
+
if (validKeys.keys.length == 0) {
|
28
|
+
throw new UnAuthenticatedRequestError_1.UnAuthenticatedRequestError('No api keys to check against');
|
29
|
+
}
|
30
|
+
return validKeys.keys.includes(key);
|
31
|
+
}
|
32
|
+
matrixKeyIsValid(key) {
|
33
|
+
if (validKeys['matrix-keys'].length == 0) {
|
34
|
+
throw new UnAuthenticatedRequestError_1.UnAuthenticatedRequestError('No api keys to check against');
|
35
|
+
}
|
36
|
+
return validKeys['matrix-keys'].includes(key);
|
37
|
+
}
|
38
|
+
async getValidApiKeys() {
|
39
|
+
let secretValue;
|
40
|
+
try {
|
41
|
+
secretValue = await this.secretsClient.send(new client_secrets_manager_1.GetSecretValueCommand({
|
42
|
+
SecretId: this.secretName,
|
43
|
+
}));
|
44
|
+
}
|
45
|
+
catch (e) {
|
46
|
+
console.error(e);
|
47
|
+
throw new Error('Failed to request api key from aws' + e.message);
|
48
|
+
}
|
49
|
+
try {
|
50
|
+
const secret = JSON.parse(secretValue.SecretString);
|
51
|
+
if (secret.keys) {
|
52
|
+
return secret;
|
53
|
+
}
|
54
|
+
throw new Error('api keys retrieved and decoded successfully but contained no values');
|
55
|
+
}
|
56
|
+
catch (e) {
|
57
|
+
throw new Error('failed to decode cloudflare api key values');
|
58
|
+
}
|
59
|
+
}
|
60
|
+
async refreshApiKeys() {
|
61
|
+
this.logger.info('refreshing keys');
|
62
|
+
validKeys = await this.getValidApiKeys();
|
63
|
+
this.logger.info(`number of valid keys found: ${validKeys.keys.length}`);
|
64
|
+
if (!refreshInterval) {
|
65
|
+
refreshInterval = setInterval(async () => {
|
66
|
+
await this.refreshApiKeys();
|
67
|
+
}, REFRESH_TIMER);
|
68
|
+
}
|
69
|
+
}
|
70
|
+
}
|
71
|
+
exports.CloudflareApiKeyService = CloudflareApiKeyService;
|
72
|
+
//# sourceMappingURL=CloudflareApiKeyService.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"CloudflareApiKeyService.js","sourceRoot":"","sources":["../../src/api-key-validation/CloudflareApiKeyService.ts"],"names":[],"mappings":";;;AAAA,4EAIyC;AACzC,sFAAmF;AAEnF,wDAAyD;AAOzD,IAAI,SAAS,GAAmB;IAC9B,IAAI,EAAE,EAAE;IACR,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF,IAAI,eAA+C,CAAC;AACpD,uCAAuC;AACvC,2EAA2E;AAC3E,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,qCAAqC;AAEjF,MAAa,uBAAuB;IAIlC,YAAsB,UAAkB,EAAE,MAAe;QAAnC,eAAU,GAAV,UAAU,CAAQ;QACtC,IAAI,CAAC,aAAa,GAAG,IAAI,6CAAoB,CAAC;YAC5C,MAAM,EAAE,gBAAgB;SACzB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,GAAG,IAAA,yBAAS,EAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAAC;SACzD;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,UAAU,CAAC,GAAW;QAC3B,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE;YAC9B,MAAM,IAAI,yDAA2B,CAAC,8BAA8B,CAAC,CAAC;SACvE;QAED,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAEM,gBAAgB,CAAC,GAAW;QACjC,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE;YACxC,MAAM,IAAI,yDAA2B,CAAC,8BAA8B,CAAC,CAAC;SACvE;QAED,OAAO,SAAS,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAES,KAAK,CAAC,eAAe;QAC7B,IAAI,WAAwC,CAAC;QAE7C,IAAI;YACF,WAAW,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CACzC,IAAI,8CAAqB,CAAC;gBACxB,QAAQ,EAAE,IAAI,CAAC,UAAU;aAC1B,CAAC,CACH,CAAC;SACH;QAAC,OAAO,CAAM,EAAE;YACf,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;SACnE;QAED,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,YAAa,CAAC,CAAC;YAErD,IAAI,MAAM,CAAC,IAAI,EAAE;gBACf,OAAO,MAAM,CAAC;aACf;YAED,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;SACxF;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;SAC/D;IACH,CAAC;IAEM,KAAK,CAAC,cAAc;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACpC,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAEzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAEzE,IAAI,CAAC,eAAe,EAAE;YACpB,eAAe,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;gBACvC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC9B,CAAC,EAAE,aAAa,CAAC,CAAC;SACnB;IACH,CAAC;CACF;AAvED,0DAuEC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,93 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
|
4
|
+
const UnAuthenticatedRequestError_1 = require("../error/UnAuthenticatedRequestError");
|
5
|
+
const CloudflareApiKeyService_1 = require("./CloudflareApiKeyService");
|
6
|
+
const sendSpy = jest.spyOn(client_secrets_manager_1.SecretsManagerClient.prototype, 'send');
|
7
|
+
jest.useFakeTimers();
|
8
|
+
jest.spyOn(global, 'setInterval');
|
9
|
+
describe('CloudflareApiKeyService', () => {
|
10
|
+
const service = new CloudflareApiKeyService_1.CloudflareApiKeyService('my-secret-name');
|
11
|
+
describe('refreshApiKeys', () => {
|
12
|
+
it('should throw an error if the secret value is not in the expected format', async () => {
|
13
|
+
sendSpy.mockImplementationOnce(() => Promise.resolve({ SecretString: 'bad json' }));
|
14
|
+
await expect(service.refreshApiKeys()).rejects.toThrowError(new Error('failed to decode cloudflare api key values'));
|
15
|
+
});
|
16
|
+
it('should make a request to the aws secrets manager when refreshing the keys', async () => {
|
17
|
+
sendSpy.mockClear();
|
18
|
+
sendSpy.mockImplementationOnce(() => Promise.resolve({ SecretString: '{"keys":[]}' }));
|
19
|
+
await service.refreshApiKeys();
|
20
|
+
expect(sendSpy.mock.lastCall[0].input).toEqual({ SecretId: 'my-secret-name' });
|
21
|
+
expect(sendSpy.mock.lastCall[0]).toBeInstanceOf(client_secrets_manager_1.GetSecretValueCommand);
|
22
|
+
});
|
23
|
+
it('should start a refresh timer once called, but only once', (done) => {
|
24
|
+
sendSpy.mockClear();
|
25
|
+
sendSpy.mockImplementationOnce(() => Promise.resolve({ SecretString: '{"keys":["my-new-key"]}' }));
|
26
|
+
const spy = jest.spyOn(service, 'refreshApiKeys');
|
27
|
+
expect(spy).not.toBeCalled();
|
28
|
+
expect(setInterval).toHaveBeenCalledTimes(1); // for the above 2 tests
|
29
|
+
jest.runOnlyPendingTimers();
|
30
|
+
expect(spy).toHaveBeenCalled();
|
31
|
+
jest.useRealTimers();
|
32
|
+
setTimeout(() => {
|
33
|
+
expect(service.keyIsValid('my-new-key')).toEqual(true);
|
34
|
+
done();
|
35
|
+
}, 5);
|
36
|
+
});
|
37
|
+
});
|
38
|
+
describe('keyIsValid', () => {
|
39
|
+
describe('when there are no api keys', () => {
|
40
|
+
beforeAll(async () => {
|
41
|
+
sendSpy.mockImplementation(() => Promise.resolve({ SecretString: '{"keys":[]}' }));
|
42
|
+
await service.refreshApiKeys();
|
43
|
+
});
|
44
|
+
it('should throw an unauthenticated request error when validating a key if there are no keys to validate against', () => {
|
45
|
+
expect(() => service.keyIsValid('anything')).toThrowError(new UnAuthenticatedRequestError_1.UnAuthenticatedRequestError('No api keys to check against'));
|
46
|
+
});
|
47
|
+
});
|
48
|
+
describe('when there are api keys', () => {
|
49
|
+
beforeAll(async () => {
|
50
|
+
sendSpy.mockImplementation(() => Promise.resolve({ SecretString: '{"keys":["my-key", "my-other-key"], "matrix-keys":["my-matrix-key"]}' }));
|
51
|
+
await service.refreshApiKeys();
|
52
|
+
});
|
53
|
+
it('should return true when there are keys loaded and the input key is in the list of valid keys', () => {
|
54
|
+
expect(service.keyIsValid('my-key')).toEqual(true);
|
55
|
+
expect(service.keyIsValid('my-other-key')).toEqual(true);
|
56
|
+
});
|
57
|
+
it('should return false when there are keys loaded and the input key is not in the list of valid keys', async () => {
|
58
|
+
expect(service.keyIsValid('not-my-key')).toEqual(false);
|
59
|
+
});
|
60
|
+
it('should return false if trying to validate a matrix key', () => {
|
61
|
+
expect(service.keyIsValid('my-matrix-key')).toEqual(false);
|
62
|
+
});
|
63
|
+
});
|
64
|
+
});
|
65
|
+
describe('matrixKeyIsValid', () => {
|
66
|
+
describe('when there are no api keys', () => {
|
67
|
+
beforeAll(async () => {
|
68
|
+
sendSpy.mockImplementation(() => Promise.resolve({ SecretString: '{"keys":[], "matrix-keys":[]}' }));
|
69
|
+
await service.refreshApiKeys();
|
70
|
+
});
|
71
|
+
it('should throw an unauthenticated request error when validating a key if there are no keys to validate against', () => {
|
72
|
+
expect(() => service.matrixKeyIsValid('anything')).toThrowError(new UnAuthenticatedRequestError_1.UnAuthenticatedRequestError('No api keys to check against'));
|
73
|
+
});
|
74
|
+
});
|
75
|
+
describe('when there are api keys', () => {
|
76
|
+
beforeAll(async () => {
|
77
|
+
sendSpy.mockImplementation(() => Promise.resolve({ SecretString: '{"keys":["my-key", "my-other-key"], "matrix-keys":["my-matrix-key"]}' }));
|
78
|
+
await service.refreshApiKeys();
|
79
|
+
});
|
80
|
+
it('should return true when there are keys loaded and the input key is in the list of valid matrix keys', () => {
|
81
|
+
expect(service.matrixKeyIsValid('my-matrix-key')).toEqual(true);
|
82
|
+
});
|
83
|
+
it('should return false when there are keys loaded and the input key is not in the list of valid matrix keys', async () => {
|
84
|
+
expect(service.matrixKeyIsValid('not-my-key')).toEqual(false);
|
85
|
+
});
|
86
|
+
it('should return false when using non matrix keys', async () => {
|
87
|
+
expect(service.matrixKeyIsValid('my-key')).toEqual(false);
|
88
|
+
expect(service.matrixKeyIsValid('my-other-key')).toEqual(false);
|
89
|
+
});
|
90
|
+
});
|
91
|
+
});
|
92
|
+
});
|
93
|
+
//# sourceMappingURL=CloudflareApiKeyService.spec.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"CloudflareApiKeyService.spec.js","sourceRoot":"","sources":["../../src/api-key-validation/CloudflareApiKeyService.spec.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.DevelopmentApiKeyService = void 0;
|
4
|
+
class DevelopmentApiKeyService {
|
5
|
+
keyIsValid() {
|
6
|
+
return true;
|
7
|
+
}
|
8
|
+
matrixKeyIsValid() {
|
9
|
+
return true;
|
10
|
+
}
|
11
|
+
}
|
12
|
+
exports.DevelopmentApiKeyService = DevelopmentApiKeyService;
|
13
|
+
//# sourceMappingURL=DevelopmentApiKeyService.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"DevelopmentApiKeyService.js","sourceRoot":"","sources":["../../src/api-key-validation/DevelopmentApiKeyService.ts"],"names":[],"mappings":";;;AAEA,MAAa,wBAAwB;IAC5B,UAAU;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACM,gBAAgB;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAPD,4DAOC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,17 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const DevelopmentApiKeyService_1 = require("./DevelopmentApiKeyService");
|
4
|
+
describe('DevelopmentApiKeyService', () => {
|
5
|
+
const service = new DevelopmentApiKeyService_1.DevelopmentApiKeyService();
|
6
|
+
describe('keyIsValid', () => {
|
7
|
+
it('should always return true', () => {
|
8
|
+
expect(service.keyIsValid()).toEqual(true);
|
9
|
+
});
|
10
|
+
});
|
11
|
+
describe('matrixKeyIsValid', () => {
|
12
|
+
it('should always return true', () => {
|
13
|
+
expect(service.matrixKeyIsValid()).toEqual(true);
|
14
|
+
});
|
15
|
+
});
|
16
|
+
});
|
17
|
+
//# sourceMappingURL=DevelopmentApiKeyService.spec.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"DevelopmentApiKeyService.spec.js","sourceRoot":"","sources":["../../src/api-key-validation/DevelopmentApiKeyService.spec.ts"],"names":[],"mappings":";;AAAA,yEAAsE;AAEtE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,mDAAwB,EAAE,CAAC;IAE/C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
@@ -0,0 +1,6 @@
|
|
1
|
+
import { CloudflareApiKeyService } from './CloudflareApiKeyService';
|
2
|
+
import { DevelopmentApiKeyService } from './DevelopmentApiKeyService';
|
3
|
+
export declare function getApiKeyService(prodEnv?: {
|
4
|
+
deploymentEnvironment: string;
|
5
|
+
squizRegion: string;
|
6
|
+
}): DevelopmentApiKeyService | CloudflareApiKeyService;
|
@@ -0,0 +1,23 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.getApiKeyService = void 0;
|
4
|
+
const util_1 = require("../util");
|
5
|
+
const CloudflareApiKeyService_1 = require("./CloudflareApiKeyService");
|
6
|
+
const DevelopmentApiKeyService_1 = require("./DevelopmentApiKeyService");
|
7
|
+
function getApiKeyService(prodEnv) {
|
8
|
+
const env = (0, util_1.getNodeEnv)();
|
9
|
+
switch (env) {
|
10
|
+
// this the DX team dev environment
|
11
|
+
case 'development':
|
12
|
+
return new DevelopmentApiKeyService_1.DevelopmentApiKeyService();
|
13
|
+
case 'production':
|
14
|
+
if (prodEnv == undefined) {
|
15
|
+
throw new Error(`invalid production state, need to have deploymentEnvironment and squiz region set`);
|
16
|
+
}
|
17
|
+
return new CloudflareApiKeyService_1.CloudflareApiKeyService(`dx-${prodEnv.deploymentEnvironment}-${prodEnv.squizRegion}-cmp-cloudflare-keys`);
|
18
|
+
default:
|
19
|
+
(0, util_1.never)(env);
|
20
|
+
}
|
21
|
+
}
|
22
|
+
exports.getApiKeyService = getApiKeyService;
|
23
|
+
//# sourceMappingURL=getApiKeyService.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"getApiKeyService.js","sourceRoot":"","sources":["../../src/api-key-validation/getApiKeyService.ts"],"names":[],"mappings":";;;AAAA,kCAA4C;AAC5C,uEAAoE;AACpE,yEAAsE;AAEtE,SAAgB,gBAAgB,CAAC,OAGhC;IACC,MAAM,GAAG,GAAG,IAAA,iBAAU,GAAE,CAAC;IAEzB,QAAQ,GAAG,EAAE;QACX,mCAAmC;QACnC,KAAK,aAAa;YAChB,OAAO,IAAI,mDAAwB,EAAE,CAAC;QACxC,KAAK,YAAY;YACf,IAAI,OAAO,IAAI,SAAS,EAAE;gBACxB,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;aACtG;YAED,OAAO,IAAI,iDAAuB,CAChC,MAAM,OAAO,CAAC,qBAAqB,IAAI,OAAO,CAAC,WAAW,sBAAsB,CACjF,CAAC;QAEJ;YACE,IAAA,YAAK,EAAC,GAAG,CAAC,CAAC;KACd;AACH,CAAC;AAtBD,4CAsBC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,24 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const CloudflareApiKeyService_1 = require("./CloudflareApiKeyService");
|
4
|
+
const DevelopmentApiKeyService_1 = require("./DevelopmentApiKeyService");
|
5
|
+
const getApiKeyService_1 = require("./getApiKeyService");
|
6
|
+
describe('getApiKeyService', () => {
|
7
|
+
it('should return an instance of DevelopmentApiKeyService when NODE_ENV is development', () => {
|
8
|
+
process.env.NODE_ENV = 'development';
|
9
|
+
expect((0, getApiKeyService_1.getApiKeyService)()).toBeInstanceOf(DevelopmentApiKeyService_1.DevelopmentApiKeyService);
|
10
|
+
});
|
11
|
+
it('should return an instance of CloudflareApiKeyService when NODE_ENV is production', () => {
|
12
|
+
process.env.NODE_ENV = 'production';
|
13
|
+
expect((0, getApiKeyService_1.getApiKeyService)({ deploymentEnvironment: 'any', squizRegion: 'value' })).toBeInstanceOf(CloudflareApiKeyService_1.CloudflareApiKeyService);
|
14
|
+
});
|
15
|
+
it('should throw an error if no prodEnv values available', () => {
|
16
|
+
process.env.NODE_ENV = 'production';
|
17
|
+
expect(() => (0, getApiKeyService_1.getApiKeyService)()).toThrow(new Error(`invalid production state, need to have deploymentEnvironment and squiz region set`));
|
18
|
+
});
|
19
|
+
it('should throw an error if NODE_ENV is anything other than development or production', () => {
|
20
|
+
process.env.NODE_ENV = 'something invalid';
|
21
|
+
expect(() => (0, getApiKeyService_1.getApiKeyService)()).toThrow(new Error(`NODE_ENV env var can only be values "production" or "development"`));
|
22
|
+
});
|
23
|
+
});
|
24
|
+
//# sourceMappingURL=getApiKeyService.spec.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"getApiKeyService.spec.js","sourceRoot":"","sources":["../../src/api-key-validation/getApiKeyService.spec.ts"],"names":[],"mappings":";;AAAA,uEAAoE;AACpE,yEAAsE;AACtE,yDAAsD;AAEtD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAC;QACrC,MAAM,CAAC,IAAA,mCAAgB,GAAE,CAAC,CAAC,cAAc,CAAC,mDAAwB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC;QACpC,MAAM,CAAC,IAAA,mCAAgB,EAAC,EAAE,qBAAqB,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,cAAc,CAC7F,iDAAuB,CACxB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC;QACpC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,mCAAgB,GAAE,CAAC,CAAC,OAAO,CACtC,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAC/F,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,mBAAmB,CAAC;QAE3C,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,mCAAgB,GAAE,CAAC,CAAC,OAAO,CACtC,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAC/E,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { CacheControl } from './parseCacheControl';
|
2
|
+
export declare function applyDefaultRulesToCacheControlObject(cacheControlInput: CacheControl): {
|
3
|
+
[x: string]: string | number | boolean | undefined;
|
4
|
+
'max-age'?: number | undefined;
|
5
|
+
's-maxage'?: number | undefined;
|
6
|
+
'min-fresh'?: number | undefined;
|
7
|
+
'stale-while-revalidate'?: number | undefined;
|
8
|
+
'stale-if-error'?: number | undefined;
|
9
|
+
public?: true | undefined;
|
10
|
+
private?: true | undefined;
|
11
|
+
'no-store'?: true | undefined;
|
12
|
+
'no-cache'?: true | undefined;
|
13
|
+
'no-transform'?: true | undefined;
|
14
|
+
'must-revalidate'?: true | undefined;
|
15
|
+
'proxy-revalidate'?: true | undefined;
|
16
|
+
'must-understand'?: true | undefined;
|
17
|
+
immutable?: true | undefined;
|
18
|
+
extension?: string | undefined;
|
19
|
+
};
|
@@ -0,0 +1,21 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.applyDefaultRulesToCacheControlObject = void 0;
|
4
|
+
const parseAndSanitiseCacheControlHeader_1 = require("./parseAndSanitiseCacheControlHeader");
|
5
|
+
function applyDefaultRulesToCacheControlObject(cacheControlInput) {
|
6
|
+
const cacheControl = { ...cacheControlInput };
|
7
|
+
if (cacheControl['max-age'] !== undefined) {
|
8
|
+
cacheControl['max-age'] = (0, parseAndSanitiseCacheControlHeader_1.ensureBetween)(cacheControl['max-age'], parseAndSanitiseCacheControlHeader_1.MIN_CACHE_SECONDS, parseAndSanitiseCacheControlHeader_1.MAX_CACHE_SECONDS);
|
9
|
+
}
|
10
|
+
if (cacheControl['s-maxage'] !== undefined) {
|
11
|
+
cacheControl['s-maxage'] = (0, parseAndSanitiseCacheControlHeader_1.ensureBetween)(cacheControl['s-maxage'], parseAndSanitiseCacheControlHeader_1.MIN_CACHE_SECONDS, parseAndSanitiseCacheControlHeader_1.MAX_CACHE_SECONDS);
|
12
|
+
}
|
13
|
+
if (cacheControl['min-fresh'] !== undefined) {
|
14
|
+
cacheControl['min-fresh'] = (0, parseAndSanitiseCacheControlHeader_1.ensureBetween)(cacheControl['min-fresh'], parseAndSanitiseCacheControlHeader_1.MIN_CACHE_SECONDS, parseAndSanitiseCacheControlHeader_1.MAX_CACHE_SECONDS);
|
15
|
+
}
|
16
|
+
delete cacheControl['no-store'];
|
17
|
+
delete cacheControl['no-cache'];
|
18
|
+
return cacheControl;
|
19
|
+
}
|
20
|
+
exports.applyDefaultRulesToCacheControlObject = applyDefaultRulesToCacheControlObject;
|
21
|
+
//# sourceMappingURL=applyDefaultRulesToCacheControlObject.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"applyDefaultRulesToCacheControlObject.js","sourceRoot":"","sources":["../../src/cache/applyDefaultRulesToCacheControlObject.ts"],"names":[],"mappings":";;;AACA,6FAA2G;AAE3G,SAAgB,qCAAqC,CAAC,iBAA+B;IACnF,MAAM,YAAY,GAAG,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAE9C,IAAI,YAAY,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE;QACzC,YAAY,CAAC,SAAS,CAAC,GAAG,IAAA,kDAAa,EAAC,YAAY,CAAC,SAAS,CAAC,EAAE,sDAAiB,EAAE,sDAAiB,CAAC,CAAC;KACxG;IAED,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE;QAC1C,YAAY,CAAC,UAAU,CAAC,GAAG,IAAA,kDAAa,EAAC,YAAY,CAAC,UAAU,CAAC,EAAE,sDAAiB,EAAE,sDAAiB,CAAC,CAAC;KAC1G;IAED,IAAI,YAAY,CAAC,WAAW,CAAC,KAAK,SAAS,EAAE;QAC3C,YAAY,CAAC,WAAW,CAAC,GAAG,IAAA,kDAAa,EAAC,YAAY,CAAC,WAAW,CAAC,EAAE,sDAAiB,EAAE,sDAAiB,CAAC,CAAC;KAC5G;IAED,OAAO,YAAY,CAAC,UAAU,CAAC,CAAC;IAChC,OAAO,YAAY,CAAC,UAAU,CAAC,CAAC;IAEhC,OAAO,YAAY,CAAC;AACtB,CAAC;AAnBD,sFAmBC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,97 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const applyDefaultRulesToCacheControlObject_1 = require("./applyDefaultRulesToCacheControlObject");
|
4
|
+
describe('applyDefaultRulesToCacheControlObject', () => {
|
5
|
+
const MIN_CACHE_SECONDS = 30;
|
6
|
+
const MAX_CACHE_SECONDS = 1800;
|
7
|
+
it('should return a Cache-Control object with the max-age directive clamped to the minimum allowed value if the value is 0', () => {
|
8
|
+
expect((0, applyDefaultRulesToCacheControlObject_1.applyDefaultRulesToCacheControlObject)({
|
9
|
+
'max-age': 0,
|
10
|
+
})).toEqual({
|
11
|
+
'max-age': MIN_CACHE_SECONDS,
|
12
|
+
});
|
13
|
+
});
|
14
|
+
it('should return a Cache-Control object with the max-age directive clamped to the minimum allowed value if it is less than the minimum', () => {
|
15
|
+
expect((0, applyDefaultRulesToCacheControlObject_1.applyDefaultRulesToCacheControlObject)({
|
16
|
+
'max-age': MIN_CACHE_SECONDS - 1,
|
17
|
+
})).toEqual({
|
18
|
+
'max-age': MIN_CACHE_SECONDS,
|
19
|
+
});
|
20
|
+
});
|
21
|
+
it('should return a Cache-Control object with the max-age directive clamped to the maximum allowed value if it is greater than the maximum', () => {
|
22
|
+
expect((0, applyDefaultRulesToCacheControlObject_1.applyDefaultRulesToCacheControlObject)({
|
23
|
+
'max-age': MAX_CACHE_SECONDS + 1,
|
24
|
+
})).toEqual({
|
25
|
+
'max-age': MAX_CACHE_SECONDS,
|
26
|
+
});
|
27
|
+
});
|
28
|
+
it('should return a Cache-Control object with the s-maxage directive clamped to the minimum allowed value if the value is 0', () => {
|
29
|
+
expect((0, applyDefaultRulesToCacheControlObject_1.applyDefaultRulesToCacheControlObject)({
|
30
|
+
's-maxage': 0,
|
31
|
+
})).toEqual({
|
32
|
+
's-maxage': MIN_CACHE_SECONDS,
|
33
|
+
});
|
34
|
+
});
|
35
|
+
it('should return a Cache-Control object with the s-maxage directive clamped to the minimum allowed value if it is less than the minimum', () => {
|
36
|
+
expect((0, applyDefaultRulesToCacheControlObject_1.applyDefaultRulesToCacheControlObject)({
|
37
|
+
's-maxage': MIN_CACHE_SECONDS - 1,
|
38
|
+
})).toEqual({
|
39
|
+
's-maxage': MIN_CACHE_SECONDS,
|
40
|
+
});
|
41
|
+
});
|
42
|
+
it('should return a Cache-Control object with the s-maxage directive clamped to the maximum allowed value if it is greater than the maximum', () => {
|
43
|
+
expect((0, applyDefaultRulesToCacheControlObject_1.applyDefaultRulesToCacheControlObject)({
|
44
|
+
's-maxage': MAX_CACHE_SECONDS + 1,
|
45
|
+
})).toEqual({
|
46
|
+
's-maxage': MAX_CACHE_SECONDS,
|
47
|
+
});
|
48
|
+
});
|
49
|
+
it('should return a Cache-Control object with the min-fresh directive clamped to the minimum allowed value if the value is 0', () => {
|
50
|
+
expect((0, applyDefaultRulesToCacheControlObject_1.applyDefaultRulesToCacheControlObject)({
|
51
|
+
'min-fresh': 0,
|
52
|
+
})).toEqual({
|
53
|
+
'min-fresh': MIN_CACHE_SECONDS,
|
54
|
+
});
|
55
|
+
});
|
56
|
+
it('should return a Cache-Control object with the min-fresh directive clamped to the maximum allowed value if it is greater than the maximum', () => {
|
57
|
+
expect((0, applyDefaultRulesToCacheControlObject_1.applyDefaultRulesToCacheControlObject)({
|
58
|
+
'min-fresh': MAX_CACHE_SECONDS + 1,
|
59
|
+
})).toEqual({
|
60
|
+
'min-fresh': MAX_CACHE_SECONDS,
|
61
|
+
});
|
62
|
+
});
|
63
|
+
it('should remove the no-store directive from the input Cache-Control object', () => {
|
64
|
+
expect((0, applyDefaultRulesToCacheControlObject_1.applyDefaultRulesToCacheControlObject)({
|
65
|
+
'max-age': MAX_CACHE_SECONDS,
|
66
|
+
'no-store': true,
|
67
|
+
})).toEqual({
|
68
|
+
'max-age': MAX_CACHE_SECONDS,
|
69
|
+
});
|
70
|
+
});
|
71
|
+
it('should remove the no-cache directive from the input Cache-Control object', () => {
|
72
|
+
expect((0, applyDefaultRulesToCacheControlObject_1.applyDefaultRulesToCacheControlObject)({
|
73
|
+
'max-age': MAX_CACHE_SECONDS,
|
74
|
+
'no-cache': true,
|
75
|
+
})).toEqual({
|
76
|
+
'max-age': MAX_CACHE_SECONDS,
|
77
|
+
});
|
78
|
+
});
|
79
|
+
it('should return a Cache-Control object with all other directives unchanged from the input Cache-Control object', () => {
|
80
|
+
expect((0, applyDefaultRulesToCacheControlObject_1.applyDefaultRulesToCacheControlObject)({
|
81
|
+
'max-age': MAX_CACHE_SECONDS,
|
82
|
+
's-maxage': MAX_CACHE_SECONDS,
|
83
|
+
'min-fresh': MAX_CACHE_SECONDS,
|
84
|
+
'stale-while-revalidate': MAX_CACHE_SECONDS,
|
85
|
+
'stale-if-error': MAX_CACHE_SECONDS,
|
86
|
+
extension: 'foo',
|
87
|
+
})).toEqual({
|
88
|
+
'max-age': MAX_CACHE_SECONDS,
|
89
|
+
's-maxage': MAX_CACHE_SECONDS,
|
90
|
+
'min-fresh': MAX_CACHE_SECONDS,
|
91
|
+
'stale-while-revalidate': MAX_CACHE_SECONDS,
|
92
|
+
'stale-if-error': MAX_CACHE_SECONDS,
|
93
|
+
extension: 'foo',
|
94
|
+
});
|
95
|
+
});
|
96
|
+
});
|
97
|
+
//# sourceMappingURL=applyDefaultRulesToCacheControlObject.spec.js.map
|