@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.
Files changed (104) hide show
  1. package/CHANGELOG.md +5 -71
  2. package/lib/api-key-validation/ApiKeyValidationService.d.ts +4 -0
  3. package/lib/api-key-validation/ApiKeyValidationService.js +3 -0
  4. package/lib/api-key-validation/ApiKeyValidationService.js.map +1 -0
  5. package/lib/api-key-validation/CloudflareApiKeyService.d.ts +17 -0
  6. package/lib/api-key-validation/CloudflareApiKeyService.js +72 -0
  7. package/lib/api-key-validation/CloudflareApiKeyService.js.map +1 -0
  8. package/lib/api-key-validation/CloudflareApiKeyService.spec.d.ts +1 -0
  9. package/lib/api-key-validation/CloudflareApiKeyService.spec.js +93 -0
  10. package/lib/api-key-validation/CloudflareApiKeyService.spec.js.map +1 -0
  11. package/lib/api-key-validation/DevelopmentApiKeyService.d.ts +5 -0
  12. package/lib/api-key-validation/DevelopmentApiKeyService.js +13 -0
  13. package/lib/api-key-validation/DevelopmentApiKeyService.js.map +1 -0
  14. package/lib/api-key-validation/DevelopmentApiKeyService.spec.d.ts +1 -0
  15. package/lib/api-key-validation/DevelopmentApiKeyService.spec.js +17 -0
  16. package/lib/api-key-validation/DevelopmentApiKeyService.spec.js.map +1 -0
  17. package/lib/api-key-validation/getApiKeyService.d.ts +6 -0
  18. package/lib/api-key-validation/getApiKeyService.js +23 -0
  19. package/lib/api-key-validation/getApiKeyService.js.map +1 -0
  20. package/lib/api-key-validation/getApiKeyService.spec.d.ts +1 -0
  21. package/lib/api-key-validation/getApiKeyService.spec.js +24 -0
  22. package/lib/api-key-validation/getApiKeyService.spec.js.map +1 -0
  23. package/lib/cache/applyDefaultRulesToCacheControlObject.d.ts +19 -0
  24. package/lib/cache/applyDefaultRulesToCacheControlObject.js +21 -0
  25. package/lib/cache/applyDefaultRulesToCacheControlObject.js.map +1 -0
  26. package/lib/cache/applyDefaultRulesToCacheControlObject.spec.d.ts +1 -0
  27. package/lib/cache/applyDefaultRulesToCacheControlObject.spec.js +97 -0
  28. package/lib/cache/applyDefaultRulesToCacheControlObject.spec.js.map +1 -0
  29. package/lib/cache/cacheControlToString.d.ts +2 -0
  30. package/lib/cache/cacheControlToString.js +24 -0
  31. package/lib/cache/cacheControlToString.js.map +1 -0
  32. package/lib/cache/cacheControlToString.spec.d.ts +1 -0
  33. package/lib/cache/cacheControlToString.spec.js +34 -0
  34. package/lib/cache/cacheControlToString.spec.js.map +1 -0
  35. package/lib/cache/index.d.ts +4 -0
  36. package/lib/cache/index.js +21 -0
  37. package/lib/cache/index.js.map +1 -0
  38. package/lib/cache/parseAndSanitiseCacheControlHeader.d.ts +5 -0
  39. package/lib/cache/parseAndSanitiseCacheControlHeader.js +26 -0
  40. package/lib/cache/parseAndSanitiseCacheControlHeader.js.map +1 -0
  41. package/lib/cache/parseAndSanitiseCacheControlHeader.spec.d.ts +1 -0
  42. package/lib/cache/parseAndSanitiseCacheControlHeader.spec.js +21 -0
  43. package/lib/cache/parseAndSanitiseCacheControlHeader.spec.js.map +1 -0
  44. package/lib/cache/parseCacheControl.d.ts +19 -0
  45. package/lib/cache/parseCacheControl.js +46 -0
  46. package/lib/cache/parseCacheControl.js.map +1 -0
  47. package/lib/cache/parseCacheControl.spec.d.ts +1 -0
  48. package/lib/cache/parseCacheControl.spec.js +70 -0
  49. package/lib/cache/parseCacheControl.spec.js.map +1 -0
  50. package/lib/error/InvalidTokenError.d.ts +5 -0
  51. package/lib/error/InvalidTokenError.js +12 -0
  52. package/lib/error/InvalidTokenError.js.map +1 -0
  53. package/lib/error/UnAuthenticatedRequestError.d.ts +4 -0
  54. package/lib/error/UnAuthenticatedRequestError.js +11 -0
  55. package/lib/error/UnAuthenticatedRequestError.js.map +1 -0
  56. package/lib/error/UnprivilegedError.d.ts +5 -0
  57. package/lib/error/UnprivilegedError.js +12 -0
  58. package/lib/error/UnprivilegedError.js.map +1 -0
  59. package/lib/error/index.d.ts +3 -0
  60. package/lib/error/index.js +3 -0
  61. package/lib/error/index.js.map +1 -1
  62. package/lib/formatted-text/formattedTextToHtmlSting.d.ts +4 -0
  63. package/lib/formatted-text/formattedTextToHtmlSting.js +85 -0
  64. package/lib/formatted-text/formattedTextToHtmlSting.js.map +1 -0
  65. package/lib/formatted-text/formattedTextToHtmlSting.spec.d.ts +1 -0
  66. package/lib/formatted-text/formattedTextToHtmlSting.spec.js +212 -0
  67. package/lib/formatted-text/formattedTextToHtmlSting.spec.js.map +1 -0
  68. package/lib/index.d.ts +7 -0
  69. package/lib/index.js +7 -0
  70. package/lib/index.js.map +1 -1
  71. package/lib/server-utils/apiKeyMiddleware.d.ts +3 -0
  72. package/lib/server-utils/apiKeyMiddleware.js +20 -0
  73. package/lib/server-utils/apiKeyMiddleware.js.map +1 -0
  74. package/lib/server-utils/apiKeyMiddleware.spec.d.ts +1 -0
  75. package/lib/server-utils/apiKeyMiddleware.spec.js +39 -0
  76. package/lib/server-utils/apiKeyMiddleware.spec.js.map +1 -0
  77. package/package.json +9 -7
  78. package/src/api-key-validation/ApiKeyValidationService.ts +4 -0
  79. package/src/api-key-validation/CloudflareApiKeyService.spec.ts +122 -0
  80. package/src/api-key-validation/CloudflareApiKeyService.ts +96 -0
  81. package/src/api-key-validation/DevelopmentApiKeyService.spec.ts +17 -0
  82. package/src/api-key-validation/DevelopmentApiKeyService.ts +10 -0
  83. package/src/api-key-validation/getApiKeyService.spec.ts +32 -0
  84. package/src/api-key-validation/getApiKeyService.ts +27 -0
  85. package/src/cache/applyDefaultRulesToCacheControlObject.spec.ts +126 -0
  86. package/src/cache/applyDefaultRulesToCacheControlObject.ts +23 -0
  87. package/src/cache/cacheControlToString.spec.ts +43 -0
  88. package/src/cache/cacheControlToString.ts +22 -0
  89. package/src/cache/index.ts +4 -0
  90. package/src/cache/parseAndSanitiseCacheControlHeader.spec.ts +25 -0
  91. package/src/cache/parseAndSanitiseCacheControlHeader.ts +28 -0
  92. package/src/cache/parseCacheControl.spec.ts +89 -0
  93. package/src/cache/parseCacheControl.ts +74 -0
  94. package/src/error/InvalidTokenError.ts +8 -0
  95. package/src/error/UnAuthenticatedRequestError.ts +7 -0
  96. package/src/error/UnprivilegedError.ts +8 -0
  97. package/src/error/index.ts +4 -0
  98. package/src/formatted-text/formattedTextToHtmlSting.spec.ts +235 -0
  99. package/src/formatted-text/formattedTextToHtmlSting.ts +100 -0
  100. package/src/index.ts +7 -0
  101. package/src/server-utils/apiKeyMiddleware.spec.ts +50 -0
  102. package/src/server-utils/apiKeyMiddleware.ts +23 -0
  103. package/tsconfig.json +1 -1
  104. 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.12](https://gitlab.squiz.net/developer-experience/cmp/compare/v1.2.2...v1.2.12) (2022-11-24)
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,4 @@
1
+ export interface ApiKeyValidationService {
2
+ keyIsValid(key: string | undefined): boolean;
3
+ matrixKeyIsValid(key: string | undefined): boolean;
4
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ApiKeyValidationService.js.map
@@ -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,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":";;AAAA,4EAA8F;AAC9F,sFAAmF;AACnF,uEAAoE;AAEpE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,6CAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAEnE,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAElC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,MAAM,OAAO,GAAG,IAAI,iDAAuB,CAAC,gBAAgB,CAAC,CAAC;IAE9D,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YACvF,OAAO,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;YAEpF,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CACzD,IAAI,KAAK,CAAC,4CAA4C,CAAC,CACxD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;YACzF,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;YACvF,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;YAE/B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC/E,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,8CAAqB,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,CAAC,IAAI,EAAE,EAAE;YACrE,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,sBAAsB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAC;YACnG,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;YAElD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;YAC7B,MAAM,CAAC,WAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB;YACtE,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAE5B,MAAM,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAE/B,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,UAAU,CAAC,GAAG,EAAE;gBACd,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACvD,IAAI,EAAE,CAAC;YACT,CAAC,EAAE,CAAC,CAAC,CAAC;QACR,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;YAC1C,SAAS,CAAC,KAAK,IAAI,EAAE;gBACnB,OAAO,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;gBACnF,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,8GAA8G,EAAE,GAAG,EAAE;gBACtH,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CACvD,IAAI,yDAA2B,CAAC,8BAA8B,CAAC,CAChE,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACvC,SAAS,CAAC,KAAK,IAAI,EAAE;gBACnB,OAAO,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAC9B,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,sEAAsE,EAAE,CAAC,CAC1G,CAAC;gBACF,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;YACjC,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,8FAA8F,EAAE,GAAG,EAAE;gBACtG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACnD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,mGAAmG,EAAE,KAAK,IAAI,EAAE;gBACjH,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;gBAChE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;YAC1C,SAAS,CAAC,KAAK,IAAI,EAAE;gBACnB,OAAO,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,+BAA+B,EAAE,CAAC,CAAC,CAAC;gBACrG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,8GAA8G,EAAE,GAAG,EAAE;gBACtH,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAC7D,IAAI,yDAA2B,CAAC,8BAA8B,CAAC,CAChE,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACvC,SAAS,CAAC,KAAK,IAAI,EAAE;gBACnB,OAAO,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAC9B,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,sEAAsE,EAAE,CAAC,CAC1G,CAAC;gBACF,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qGAAqG,EAAE,GAAG,EAAE;gBAC7G,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,0GAA0G,EAAE,KAAK,IAAI,EAAE;gBACxH,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;gBAC9D,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC1D,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { ApiKeyValidationService } from './ApiKeyValidationService';
2
+ export declare class DevelopmentApiKeyService implements ApiKeyValidationService {
3
+ keyIsValid(): boolean;
4
+ matrixKeyIsValid(): boolean;
5
+ }
@@ -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,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,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