@bigfootai/sdk 1.18.0 → 1.19.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/dist/configuration.d.ts +114 -0
- package/dist/configuration.d.ts.map +1 -0
- package/dist/configuration.js +210 -0
- package/dist/configuration.js.map +1 -0
- package/dist/configuration.test.d.ts +2 -0
- package/dist/configuration.test.d.ts.map +1 -0
- package/dist/configuration.test.js +187 -0
- package/dist/configuration.test.js.map +1 -0
- package/dist/index.d.ts +5 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -56
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +12 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +57 -0
- package/dist/logger.js.map +1 -0
- package/dist/secrets.d.ts +21 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +101 -0
- package/dist/secrets.js.map +1 -0
- package/dist/secrets.test.d.ts +2 -0
- package/dist/secrets.test.d.ts.map +1 -0
- package/dist/secrets.test.js +107 -0
- package/dist/secrets.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { type Logger } from './logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves a provider's configuration before the HTTP server starts, whichever
|
|
4
|
+
* runtime the provider is running on.
|
|
5
|
+
*
|
|
6
|
+
* - **ECS** injects the values as environment variables through the task
|
|
7
|
+
* definition's `secrets` block. The task agent resolves the Secrets Manager
|
|
8
|
+
* reference at task start, so the value never lands in Terraform state or in
|
|
9
|
+
* the service definition. This module finds them already in `process.env`.
|
|
10
|
+
* - **Lambda** has no equivalent injection, so the image carries the AWS
|
|
11
|
+
* Parameters and Secrets Lambda Extension. It serves the secret as JSON over
|
|
12
|
+
* `http://localhost:2773` and caches it (five minutes by default). This module
|
|
13
|
+
* reads it from there and merges the keys into `process.env`.
|
|
14
|
+
*
|
|
15
|
+
* A provider therefore makes one call — `await loadConfiguration({ required })`
|
|
16
|
+
* — and does not know which runtime it is on. `SECRETS_MANAGER_SECRET_ID` names
|
|
17
|
+
* the secret to read on Lambda; it is not a secret value and may live in the
|
|
18
|
+
* function configuration.
|
|
19
|
+
*
|
|
20
|
+
* Missing values fail closed: if a required key is absent after resolution (or
|
|
21
|
+
* the secret cannot be read or parsed) startup throws, naming the key but never
|
|
22
|
+
* the value.
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Names the Secrets Manager secret holding the provider's secret-shaped
|
|
26
|
+
* configuration, as a flat JSON object of string key/value pairs. Unset locally,
|
|
27
|
+
* and set on Lambda in the function configuration. On ECS the values are injected
|
|
28
|
+
* directly and this variable carries no meaning, so it may be left unset.
|
|
29
|
+
*/
|
|
30
|
+
export declare const SECRET_ID_VAR = "SECRETS_MANAGER_SECRET_ID";
|
|
31
|
+
/** Set by the Lambda runtime. Its presence is how the SDK tells Lambda from ECS. */
|
|
32
|
+
export declare const LAMBDA_FUNCTION_NAME_VAR = "AWS_LAMBDA_FUNCTION_NAME";
|
|
33
|
+
/**
|
|
34
|
+
* The token the extension requires on every request. The Lambda runtime sets it
|
|
35
|
+
* in the execution environment; it authenticates the caller as this function and
|
|
36
|
+
* is never the secret value itself.
|
|
37
|
+
*/
|
|
38
|
+
export declare const EXTENSION_TOKEN_VAR = "AWS_SESSION_TOKEN";
|
|
39
|
+
/** Port of the extension's local HTTP server. Defaults in the extension to 2773. */
|
|
40
|
+
export declare const EXTENSION_PORT_VAR = "PARAMETERS_SECRETS_EXTENSION_HTTP_PORT";
|
|
41
|
+
export declare const DEFAULT_EXTENSION_PORT = 2773;
|
|
42
|
+
/**
|
|
43
|
+
* A configuration requirement. A bare string names one required key; an array
|
|
44
|
+
* names alternatives, and the requirement is met when any one of them is
|
|
45
|
+
* present (`['AIRTABLE_CLIENT_SECRET', 'AIRTABLE_PKCE_SECRET']`).
|
|
46
|
+
*/
|
|
47
|
+
export type ConfigurationRequirement = string | readonly string[];
|
|
48
|
+
export interface LoadConfigurationOptions {
|
|
49
|
+
/**
|
|
50
|
+
* The keys the provider cannot run without. Anything absent after resolution
|
|
51
|
+
* aborts startup. Each entry is one key, or a set of alternatives.
|
|
52
|
+
*/
|
|
53
|
+
required?: readonly ConfigurationRequirement[];
|
|
54
|
+
/**
|
|
55
|
+
* The secret to read on Lambda. Defaults to `SECRETS_MANAGER_SECRET_ID`.
|
|
56
|
+
* Exposed for tests and for a provider that reads more than one secret.
|
|
57
|
+
*/
|
|
58
|
+
secretId?: string;
|
|
59
|
+
/** Overrides the default logger. */
|
|
60
|
+
logger?: Logger;
|
|
61
|
+
/** The number of times to try the extension before giving up. Defaults to 5. */
|
|
62
|
+
attempts?: number;
|
|
63
|
+
/** Delay between extension attempts, in milliseconds. Defaults to 200. */
|
|
64
|
+
retryDelayMs?: number;
|
|
65
|
+
/**
|
|
66
|
+
* Reads the raw `SecretString` for a secret id from the extension. Injectable
|
|
67
|
+
* so the tests exercise the resolution logic with no network and no Lambda.
|
|
68
|
+
*/
|
|
69
|
+
fetchSecret?: (secretId: string) => Promise<string>;
|
|
70
|
+
}
|
|
71
|
+
/** Reads the raw `SecretString` for a secret id from somewhere. */
|
|
72
|
+
export type SecretFetcher = (secretId: string) => Promise<string>;
|
|
73
|
+
/**
|
|
74
|
+
* Reads a secret from the extension, retrying the retryable failures. The
|
|
75
|
+
* extension only reports ready after the runtime bootstraps, so the first read
|
|
76
|
+
* after a cold start can race it.
|
|
77
|
+
*/
|
|
78
|
+
export declare const readSecretFromExtension: (secretId: string, { attempts, retryDelayMs }?: {
|
|
79
|
+
attempts?: number;
|
|
80
|
+
retryDelayMs?: number;
|
|
81
|
+
}) => Promise<string>;
|
|
82
|
+
/** Reads the raw `SecretString` for a secret id from the extension. */
|
|
83
|
+
export declare const fetchSecretFromExtension: SecretFetcher;
|
|
84
|
+
/**
|
|
85
|
+
* Parses the secret payload into key/value pairs, rejecting anything that is not
|
|
86
|
+
* a flat JSON object of strings. Error messages describe the shape problem only —
|
|
87
|
+
* they never quote the payload, which would put secret material into logs and
|
|
88
|
+
* stack traces.
|
|
89
|
+
*/
|
|
90
|
+
export declare const parseSecretPayload: (raw: string) => Record<string, string>;
|
|
91
|
+
/**
|
|
92
|
+
* Merges resolved values into the environment. Secrets Manager is authoritative:
|
|
93
|
+
* a stale value left behind in the task definition must never win over the
|
|
94
|
+
* managed one, so this overwrites rather than filling in gaps.
|
|
95
|
+
*/
|
|
96
|
+
export declare const applyConfiguration: (values: Record<string, string>, env?: NodeJS.ProcessEnv) => void;
|
|
97
|
+
/**
|
|
98
|
+
* The requirements still unmet, each named by its alternatives ("A or B").
|
|
99
|
+
* Names only — never values.
|
|
100
|
+
*/
|
|
101
|
+
export declare const findMissingConfiguration: (required: readonly ConfigurationRequirement[], env?: NodeJS.ProcessEnv) => string[];
|
|
102
|
+
/** True when the process is running as a Lambda function. */
|
|
103
|
+
export declare const isLambda: (env?: NodeJS.ProcessEnv) => boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Resolves the provider's configuration and fails closed when it is incomplete.
|
|
106
|
+
*
|
|
107
|
+
* On Lambda the secret named by `SECRETS_MANAGER_SECRET_ID` is read through the
|
|
108
|
+
* extension and merged into `process.env`, so every provider continues to read
|
|
109
|
+
* its settings from the environment. On ECS the values are already injected
|
|
110
|
+
* there. Either way a missing required key throws, naming the key but never the
|
|
111
|
+
* value.
|
|
112
|
+
*/
|
|
113
|
+
export declare const loadConfiguration: (options?: LoadConfigurationOptions) => Promise<void>;
|
|
114
|
+
//# sourceMappingURL=configuration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration.d.ts","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAuB,MAAM,aAAa,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,aAAa,8BAA8B,CAAC;AAEzD,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AAEnE;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AAEvD,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,2CAA2C,CAAC;AAE3E,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;AAElE,MAAM,WAAW,wBAAwB;IACxC;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACpD;AASD,mEAAmE;AACnE,MAAM,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAiDlE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,aACzB,MAAM,+BACsB;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,KAChF,OAAO,CAAC,MAAM,CAyBhB,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,wBAAwB,EAAE,aAA+D,CAAC;AAEvG;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,QAAS,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAqBrE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,WAAY,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAO,MAAM,CAAC,UAAU,KAAiB,IAIzG,CAAC;AAIF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,aAC1B,SAAS,wBAAwB,EAAE,QACxC,MAAM,CAAC,UAAU,KACpB,MAAM,EAOR,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,QAAQ,SAAS,MAAM,CAAC,UAAU,KAAiB,OACR,CAAC;AAEzD;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,aAAmB,wBAAwB,KAAQ,OAAO,CAAC,IAAI,CAwC5F,CAAC"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { logger as sdkLogger } from './logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves a provider's configuration before the HTTP server starts, whichever
|
|
4
|
+
* runtime the provider is running on.
|
|
5
|
+
*
|
|
6
|
+
* - **ECS** injects the values as environment variables through the task
|
|
7
|
+
* definition's `secrets` block. The task agent resolves the Secrets Manager
|
|
8
|
+
* reference at task start, so the value never lands in Terraform state or in
|
|
9
|
+
* the service definition. This module finds them already in `process.env`.
|
|
10
|
+
* - **Lambda** has no equivalent injection, so the image carries the AWS
|
|
11
|
+
* Parameters and Secrets Lambda Extension. It serves the secret as JSON over
|
|
12
|
+
* `http://localhost:2773` and caches it (five minutes by default). This module
|
|
13
|
+
* reads it from there and merges the keys into `process.env`.
|
|
14
|
+
*
|
|
15
|
+
* A provider therefore makes one call — `await loadConfiguration({ required })`
|
|
16
|
+
* — and does not know which runtime it is on. `SECRETS_MANAGER_SECRET_ID` names
|
|
17
|
+
* the secret to read on Lambda; it is not a secret value and may live in the
|
|
18
|
+
* function configuration.
|
|
19
|
+
*
|
|
20
|
+
* Missing values fail closed: if a required key is absent after resolution (or
|
|
21
|
+
* the secret cannot be read or parsed) startup throws, naming the key but never
|
|
22
|
+
* the value.
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Names the Secrets Manager secret holding the provider's secret-shaped
|
|
26
|
+
* configuration, as a flat JSON object of string key/value pairs. Unset locally,
|
|
27
|
+
* and set on Lambda in the function configuration. On ECS the values are injected
|
|
28
|
+
* directly and this variable carries no meaning, so it may be left unset.
|
|
29
|
+
*/
|
|
30
|
+
export const SECRET_ID_VAR = 'SECRETS_MANAGER_SECRET_ID';
|
|
31
|
+
/** Set by the Lambda runtime. Its presence is how the SDK tells Lambda from ECS. */
|
|
32
|
+
export const LAMBDA_FUNCTION_NAME_VAR = 'AWS_LAMBDA_FUNCTION_NAME';
|
|
33
|
+
/**
|
|
34
|
+
* The token the extension requires on every request. The Lambda runtime sets it
|
|
35
|
+
* in the execution environment; it authenticates the caller as this function and
|
|
36
|
+
* is never the secret value itself.
|
|
37
|
+
*/
|
|
38
|
+
export const EXTENSION_TOKEN_VAR = 'AWS_SESSION_TOKEN';
|
|
39
|
+
/** Port of the extension's local HTTP server. Defaults in the extension to 2773. */
|
|
40
|
+
export const EXTENSION_PORT_VAR = 'PARAMETERS_SECRETS_EXTENSION_HTTP_PORT';
|
|
41
|
+
export const DEFAULT_EXTENSION_PORT = 2773;
|
|
42
|
+
/**
|
|
43
|
+
* Raised when the extension is reachable but not yet serving — the connection
|
|
44
|
+
* was refused, or it answered as unavailable. Retried; every other failure is
|
|
45
|
+
* terminal.
|
|
46
|
+
*/
|
|
47
|
+
class ExtensionUnavailableError extends Error {
|
|
48
|
+
}
|
|
49
|
+
const isRetryableStatus = (status) => status === 429 || status >= 500;
|
|
50
|
+
/**
|
|
51
|
+
* One round trip to the extension. Distinguishes "not ready yet" (retryable)
|
|
52
|
+
* from "this request will never succeed" (terminal), and never quotes the
|
|
53
|
+
* secret or the token in a message.
|
|
54
|
+
*/
|
|
55
|
+
const readSecretOnce = async (secretId, token, port) => {
|
|
56
|
+
const url = `http://localhost:${port}/secretsmanager/get?secretId=${encodeURIComponent(secretId)}`;
|
|
57
|
+
let response;
|
|
58
|
+
try {
|
|
59
|
+
response = await fetch(url, {
|
|
60
|
+
headers: { 'X-Aws-Parameters-Secrets-Token': token },
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
65
|
+
throw new ExtensionUnavailableError(`the extension is not reachable yet: ${reason}`);
|
|
66
|
+
}
|
|
67
|
+
if (isRetryableStatus(response.status)) {
|
|
68
|
+
throw new ExtensionUnavailableError(`the extension answered HTTP ${response.status}`);
|
|
69
|
+
}
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
throw new Error(`the extension rejected the request for secret "${secretId}" with HTTP ${response.status}`);
|
|
72
|
+
}
|
|
73
|
+
let body;
|
|
74
|
+
try {
|
|
75
|
+
body = await response.json();
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
throw new Error('the extension returned a response that is not JSON');
|
|
79
|
+
}
|
|
80
|
+
if (typeof body !== 'object' ||
|
|
81
|
+
body === null ||
|
|
82
|
+
!('SecretString' in body) ||
|
|
83
|
+
typeof body.SecretString !== 'string') {
|
|
84
|
+
throw new Error('the secret has no SecretString value (binary secrets are not supported)');
|
|
85
|
+
}
|
|
86
|
+
return body.SecretString;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Reads a secret from the extension, retrying the retryable failures. The
|
|
90
|
+
* extension only reports ready after the runtime bootstraps, so the first read
|
|
91
|
+
* after a cold start can race it.
|
|
92
|
+
*/
|
|
93
|
+
export const readSecretFromExtension = async (secretId, { attempts = 5, retryDelayMs = 200 } = {}) => {
|
|
94
|
+
const token = process.env[EXTENSION_TOKEN_VAR];
|
|
95
|
+
if (!token || token.trim().length === 0) {
|
|
96
|
+
throw new Error(`${EXTENSION_TOKEN_VAR} is not set, so the AWS Parameters and Secrets Lambda Extension cannot be authenticated. It is set by the Lambda runtime and must not be configured by hand.`);
|
|
97
|
+
}
|
|
98
|
+
const port = Number(process.env[EXTENSION_PORT_VAR]) || DEFAULT_EXTENSION_PORT;
|
|
99
|
+
let lastError;
|
|
100
|
+
for (let attempt = 1; attempt <= attempts; attempt += 1) {
|
|
101
|
+
try {
|
|
102
|
+
return await readSecretOnce(secretId, token, port);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (!(error instanceof ExtensionUnavailableError) || attempt === attempts) {
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
lastError = error;
|
|
109
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelayMs * attempt));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Unreachable: the loop either returns or throws. Kept for the type checker.
|
|
113
|
+
throw lastError instanceof Error ? lastError : new Error('the extension could not be read');
|
|
114
|
+
};
|
|
115
|
+
/** Reads the raw `SecretString` for a secret id from the extension. */
|
|
116
|
+
export const fetchSecretFromExtension = (secretId) => readSecretFromExtension(secretId);
|
|
117
|
+
/**
|
|
118
|
+
* Parses the secret payload into key/value pairs, rejecting anything that is not
|
|
119
|
+
* a flat JSON object of strings. Error messages describe the shape problem only —
|
|
120
|
+
* they never quote the payload, which would put secret material into logs and
|
|
121
|
+
* stack traces.
|
|
122
|
+
*/
|
|
123
|
+
export const parseSecretPayload = (raw) => {
|
|
124
|
+
let parsed;
|
|
125
|
+
try {
|
|
126
|
+
parsed = JSON.parse(raw);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
throw new Error('the secret is not valid JSON (expected a flat object, e.g. {"DATABASE_URL": "..."})');
|
|
130
|
+
}
|
|
131
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
132
|
+
throw new Error('the secret must be a flat JSON object of string key/value pairs');
|
|
133
|
+
}
|
|
134
|
+
const values = {};
|
|
135
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
136
|
+
if (typeof value !== 'string') {
|
|
137
|
+
throw new Error(`the secret value for "${key}" must be a string`);
|
|
138
|
+
}
|
|
139
|
+
values[key] = value;
|
|
140
|
+
}
|
|
141
|
+
return values;
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Merges resolved values into the environment. Secrets Manager is authoritative:
|
|
145
|
+
* a stale value left behind in the task definition must never win over the
|
|
146
|
+
* managed one, so this overwrites rather than filling in gaps.
|
|
147
|
+
*/
|
|
148
|
+
export const applyConfiguration = (values, env = process.env) => {
|
|
149
|
+
for (const [key, value] of Object.entries(values)) {
|
|
150
|
+
env[key] = value;
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
const isPresent = (key, env) => (env[key] ?? '').trim().length > 0;
|
|
154
|
+
/**
|
|
155
|
+
* The requirements still unmet, each named by its alternatives ("A or B").
|
|
156
|
+
* Names only — never values.
|
|
157
|
+
*/
|
|
158
|
+
export const findMissingConfiguration = (required, env = process.env) => {
|
|
159
|
+
const alternativesOf = (requirement) => typeof requirement === 'string' ? [requirement] : requirement;
|
|
160
|
+
return required
|
|
161
|
+
.filter((requirement) => !alternativesOf(requirement).some((key) => isPresent(key, env)))
|
|
162
|
+
.map((requirement) => alternativesOf(requirement).join(' or '));
|
|
163
|
+
};
|
|
164
|
+
/** True when the process is running as a Lambda function. */
|
|
165
|
+
export const isLambda = (env = process.env) => (env[LAMBDA_FUNCTION_NAME_VAR] ?? '').trim().length > 0;
|
|
166
|
+
/**
|
|
167
|
+
* Resolves the provider's configuration and fails closed when it is incomplete.
|
|
168
|
+
*
|
|
169
|
+
* On Lambda the secret named by `SECRETS_MANAGER_SECRET_ID` is read through the
|
|
170
|
+
* extension and merged into `process.env`, so every provider continues to read
|
|
171
|
+
* its settings from the environment. On ECS the values are already injected
|
|
172
|
+
* there. Either way a missing required key throws, naming the key but never the
|
|
173
|
+
* value.
|
|
174
|
+
*/
|
|
175
|
+
export const loadConfiguration = async (options = {}) => {
|
|
176
|
+
const log = options.logger ?? sdkLogger;
|
|
177
|
+
const secretId = (options.secretId ?? process.env[SECRET_ID_VAR])?.trim();
|
|
178
|
+
if (secretId && isLambda()) {
|
|
179
|
+
log.info({ secretId }, 'Reading provider configuration from the AWS Parameters and Secrets Lambda Extension');
|
|
180
|
+
let raw;
|
|
181
|
+
try {
|
|
182
|
+
raw = await (options.fetchSecret
|
|
183
|
+
? options.fetchSecret(secretId)
|
|
184
|
+
: readSecretFromExtension(secretId, {
|
|
185
|
+
attempts: options.attempts,
|
|
186
|
+
retryDelayMs: options.retryDelayMs,
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
191
|
+
throw new Error(`Unable to read configuration from secret "${secretId}": ${reason}`);
|
|
192
|
+
}
|
|
193
|
+
let values;
|
|
194
|
+
try {
|
|
195
|
+
values = parseSecretPayload(raw);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
199
|
+
throw new Error(`The secret "${secretId}" could not be used: ${reason}`);
|
|
200
|
+
}
|
|
201
|
+
applyConfiguration(values);
|
|
202
|
+
// Key names only — never values.
|
|
203
|
+
log.info({ keys: Object.keys(values).sort(), secretId }, 'Loaded provider configuration');
|
|
204
|
+
}
|
|
205
|
+
const missing = findMissingConfiguration(options.required ?? []);
|
|
206
|
+
if (missing.length > 0) {
|
|
207
|
+
throw new Error(`The provider configuration is incomplete; missing: ${missing.join(', ')}. Supply these values in the environment, or on Lambda via the secret named by ${SECRET_ID_VAR}.`);
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
//# sourceMappingURL=configuration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration.js","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,MAAM,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAEzD,oFAAoF;AACpF,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAA0B,CAAC;AAEnE;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AAEvD,oFAAoF;AACpF,MAAM,CAAC,MAAM,kBAAkB,GAAG,wCAAwC,CAAC;AAE3E,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAiC3C;;;;GAIG;AACH,MAAM,yBAA0B,SAAQ,KAAK;CAAG;AAKhD,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAW,EAAE,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,CAAC;AAEvF;;;;GAIG;AACH,MAAM,cAAc,GAAG,KAAK,EAAE,QAAgB,EAAE,KAAa,EAAE,IAAY,EAAmB,EAAE;IAC/F,MAAM,GAAG,GAAG,oBAAoB,IAAI,gCAAgC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAEnG,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACJ,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,OAAO,EAAE,EAAE,gCAAgC,EAAE,KAAK,EAAE;SACpD,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,yBAAyB,CAAC,uCAAuC,MAAM,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,yBAAyB,CAAC,+BAA+B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,kDAAkD,QAAQ,eAAe,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7G,CAAC;IAED,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACJ,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACvE,CAAC;IAED,IACC,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,CAAC,CAAC,cAAc,IAAI,IAAI,CAAC;QACzB,OAAQ,IAAmC,CAAC,YAAY,KAAK,QAAQ,EACpE,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC5F,CAAC;IAED,OAAQ,IAAiC,CAAC,YAAY,CAAC;AACxD,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAC3C,QAAgB,EAChB,EAAE,QAAQ,GAAG,CAAC,EAAE,YAAY,GAAG,GAAG,KAAmD,EAAE,EACrE,EAAE;IACpB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACd,GAAG,mBAAmB,8JAA8J,CACpL,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,sBAAsB,CAAC;IAE/E,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,QAAQ,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC;YACJ,OAAO,MAAM,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,KAAK,YAAY,yBAAyB,CAAC,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC3E,MAAM,KAAK,CAAC;YACb,CAAC;YACD,SAAS,GAAG,KAAK,CAAC;YAClB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC;QAC7E,CAAC;IACF,CAAC;IAED,6EAA6E;IAC7E,MAAM,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;AAC7F,CAAC,CAAC;AAEF,uEAAuE;AACvE,MAAM,CAAC,MAAM,wBAAwB,GAAkB,CAAC,QAAQ,EAAE,EAAE,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;AAEvG;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAA0B,EAAE;IACzE,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,oBAAoB,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAA8B,EAAE,MAAyB,OAAO,CAAC,GAAG,EAAQ,EAAE;IAChH,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAClB,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,GAAsB,EAAW,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAEvG;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACvC,QAA6C,EAC7C,MAAyB,OAAO,CAAC,GAAG,EACzB,EAAE;IACb,MAAM,cAAc,GAAG,CAAC,WAAqC,EAAqB,EAAE,CACnF,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;IAE/D,OAAO,QAAQ;SACb,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;SACxF,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAClE,CAAC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAW,EAAE,CACzE,CAAC,GAAG,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAEzD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,UAAoC,EAAE,EAAiB,EAAE;IAChG,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;IACxC,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAE1E,IAAI,QAAQ,IAAI,QAAQ,EAAE,EAAE,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,qFAAqF,CAAC,CAAC;QAE9G,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACJ,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW;gBAC/B,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;gBAC/B,CAAC,CAAC,uBAAuB,CAAC,QAAQ,EAAE;oBAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;iBAClC,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,6CAA6C,QAAQ,MAAM,MAAM,EAAE,CAAC,CAAC;QACtF,CAAC;QAED,IAAI,MAA8B,CAAC;QACnC,IAAI,CAAC;YACJ,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,eAAe,QAAQ,wBAAwB,MAAM,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE3B,iCAAiC;QACjC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,+BAA+B,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,OAAO,GAAG,wBAAwB,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACd,sDAAsD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,kFAAkF,aAAa,GAAG,CAC1K,CAAC;IACH,CAAC;AACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration.test.d.ts","sourceRoot":"","sources":["../src/configuration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { EXTENSION_PORT_VAR, EXTENSION_TOKEN_VAR, LAMBDA_FUNCTION_NAME_VAR, SECRET_ID_VAR, applyConfiguration, findMissingConfiguration, isLambda, loadConfiguration, parseSecretPayload, } from './configuration.js';
|
|
3
|
+
/** A logger that swallows output so the assertions read the behaviour, not the logs. */
|
|
4
|
+
const silentLogger = {
|
|
5
|
+
info: () => { },
|
|
6
|
+
warn: () => { },
|
|
7
|
+
error: () => { },
|
|
8
|
+
debug: () => { },
|
|
9
|
+
trace: () => { },
|
|
10
|
+
fatal: () => { },
|
|
11
|
+
};
|
|
12
|
+
const SECRET_ID = 'bigfoot-example/dev';
|
|
13
|
+
const TOKEN = 'session-token-value';
|
|
14
|
+
/** Environment keys this suite touches, cleared before and after every test. */
|
|
15
|
+
const MANAGED_VARS = [
|
|
16
|
+
SECRET_ID_VAR,
|
|
17
|
+
LAMBDA_FUNCTION_NAME_VAR,
|
|
18
|
+
EXTENSION_TOKEN_VAR,
|
|
19
|
+
EXTENSION_PORT_VAR,
|
|
20
|
+
'BIGFOOT_API_KEY',
|
|
21
|
+
'DATABASE_URL',
|
|
22
|
+
'CLIENT_SECRET',
|
|
23
|
+
'EXTRA',
|
|
24
|
+
'PRESENT',
|
|
25
|
+
'OTHER',
|
|
26
|
+
];
|
|
27
|
+
const clearEnv = () => {
|
|
28
|
+
for (const name of MANAGED_VARS) {
|
|
29
|
+
delete process.env[name];
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const asLambda = () => {
|
|
33
|
+
process.env[LAMBDA_FUNCTION_NAME_VAR] = 'bigfoot-example';
|
|
34
|
+
process.env[SECRET_ID_VAR] = SECRET_ID;
|
|
35
|
+
process.env[EXTENSION_TOKEN_VAR] = TOKEN;
|
|
36
|
+
};
|
|
37
|
+
const jsonResponse = (body, status = 200) => new Response(JSON.stringify(body), { status, headers: { 'Content-Type': 'application/json' } });
|
|
38
|
+
beforeEach(() => {
|
|
39
|
+
clearEnv();
|
|
40
|
+
});
|
|
41
|
+
afterEach(() => {
|
|
42
|
+
clearEnv();
|
|
43
|
+
vi.unstubAllGlobals();
|
|
44
|
+
vi.restoreAllMocks();
|
|
45
|
+
});
|
|
46
|
+
describe('parseSecretPayload', () => {
|
|
47
|
+
it('parses a flat JSON object of string values', () => {
|
|
48
|
+
expect(parseSecretPayload('{"BIGFOOT_API_KEY": "abc", "DATABASE_URL": "postgres://x"}')).toEqual({
|
|
49
|
+
BIGFOOT_API_KEY: 'abc',
|
|
50
|
+
DATABASE_URL: 'postgres://x',
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
it('rejects a payload that is not JSON without quoting it', () => {
|
|
54
|
+
expect(() => parseSecretPayload('super-secret-not-json')).toThrow(/not valid JSON/);
|
|
55
|
+
try {
|
|
56
|
+
parseSecretPayload('super-secret-not-json');
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
expect(error.message).not.toContain('super-secret-not-json');
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
it('rejects a JSON array or a nested object', () => {
|
|
63
|
+
expect(() => parseSecretPayload('["a"]')).toThrow(/flat JSON object/);
|
|
64
|
+
expect(() => parseSecretPayload('null')).toThrow(/flat JSON object/);
|
|
65
|
+
});
|
|
66
|
+
it('rejects a non-string value and names the offending key', () => {
|
|
67
|
+
expect(() => parseSecretPayload('{"PORT": 5000}')).toThrow(/"PORT" must be a string/);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('findMissingConfiguration', () => {
|
|
71
|
+
it('treats a bare key as required', () => {
|
|
72
|
+
expect(findMissingConfiguration(['BIGFOOT_API_KEY'], {})).toEqual(['BIGFOOT_API_KEY']);
|
|
73
|
+
});
|
|
74
|
+
it('treats blank and whitespace-only values as missing', () => {
|
|
75
|
+
expect(findMissingConfiguration(['A'], { A: ' ' })).toEqual(['A']);
|
|
76
|
+
expect(findMissingConfiguration(['A'], { A: 'value' })).toEqual([]);
|
|
77
|
+
});
|
|
78
|
+
it('is satisfied when any alternative is present, and names them when none is', () => {
|
|
79
|
+
expect(findMissingConfiguration([['CLIENT_SECRET', 'PKCE_SECRET']], { PKCE_SECRET: 'x' })).toEqual([]);
|
|
80
|
+
expect(findMissingConfiguration([['CLIENT_SECRET', 'PKCE_SECRET']], {})).toEqual(['CLIENT_SECRET or PKCE_SECRET']);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('isLambda', () => {
|
|
84
|
+
it('is true only when the runtime sets its function name', () => {
|
|
85
|
+
expect(isLambda({})).toBe(false);
|
|
86
|
+
expect(isLambda({ [LAMBDA_FUNCTION_NAME_VAR]: 'bigfoot-example' })).toBe(true);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe('applyConfiguration', () => {
|
|
90
|
+
it('overwrites existing values, because the managed secret is authoritative', () => {
|
|
91
|
+
const env = { DATABASE_URL: 'stale' };
|
|
92
|
+
applyConfiguration({ DATABASE_URL: 'fresh' }, env);
|
|
93
|
+
expect(env.DATABASE_URL).toBe('fresh');
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe('loadConfiguration on ECS', () => {
|
|
97
|
+
it('reads values already injected into the environment and does not call the extension', async () => {
|
|
98
|
+
const fetchMock = vi.fn();
|
|
99
|
+
vi.stubGlobal('fetch', fetchMock);
|
|
100
|
+
process.env.BIGFOOT_API_KEY = 'from-the-task-definition';
|
|
101
|
+
await loadConfiguration({ required: ['BIGFOOT_API_KEY'], logger: silentLogger });
|
|
102
|
+
expect(fetchMock).not.toHaveBeenCalled();
|
|
103
|
+
});
|
|
104
|
+
it('fails closed when a required key is missing, naming the key but not a value', async () => {
|
|
105
|
+
process.env.CLIENT_SECRET = 'a-value-that-must-not-be-named';
|
|
106
|
+
const error = await loadConfiguration({
|
|
107
|
+
required: ['BIGFOOT_API_KEY', 'CLIENT_SECRET'],
|
|
108
|
+
logger: silentLogger,
|
|
109
|
+
}).catch((e) => e);
|
|
110
|
+
expect(error).toBeInstanceOf(Error);
|
|
111
|
+
expect(error.message).toContain('BIGFOOT_API_KEY');
|
|
112
|
+
expect(error.message).not.toContain('CLIENT_SECRET');
|
|
113
|
+
expect(error.message).not.toContain('a-value-that-must-not-be-named');
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe('loadConfiguration on Lambda', () => {
|
|
117
|
+
it('reads the secret from the extension, authenticates with the runtime token, and merges every key', async () => {
|
|
118
|
+
asLambda();
|
|
119
|
+
const fetchMock = vi.fn().mockResolvedValue(jsonResponse({
|
|
120
|
+
SecretString: JSON.stringify({ BIGFOOT_API_KEY: 'platform-key', EXTRA: 'also-merged' }),
|
|
121
|
+
}));
|
|
122
|
+
vi.stubGlobal('fetch', fetchMock);
|
|
123
|
+
await loadConfiguration({ required: ['BIGFOOT_API_KEY'], logger: silentLogger });
|
|
124
|
+
expect(process.env.BIGFOOT_API_KEY).toBe('platform-key');
|
|
125
|
+
expect(process.env.EXTRA).toBe('also-merged');
|
|
126
|
+
const [url, init] = fetchMock.mock.calls[0];
|
|
127
|
+
expect(url).toBe(`http://localhost:2773/secretsmanager/get?secretId=${encodeURIComponent(SECRET_ID)}`);
|
|
128
|
+
expect(init.headers['X-Aws-Parameters-Secrets-Token']).toBe(TOKEN);
|
|
129
|
+
});
|
|
130
|
+
it('honours a custom extension port', async () => {
|
|
131
|
+
asLambda();
|
|
132
|
+
process.env[EXTENSION_PORT_VAR] = '9999';
|
|
133
|
+
const fetchMock = vi.fn().mockResolvedValue(jsonResponse({ SecretString: '{}' }));
|
|
134
|
+
vi.stubGlobal('fetch', fetchMock);
|
|
135
|
+
await loadConfiguration({ required: [], logger: silentLogger });
|
|
136
|
+
expect(fetchMock.mock.calls[0][0]).toContain('http://localhost:9999/');
|
|
137
|
+
});
|
|
138
|
+
it('retries while the extension is not yet serving, then succeeds', async () => {
|
|
139
|
+
asLambda();
|
|
140
|
+
const fetchMock = vi
|
|
141
|
+
.fn()
|
|
142
|
+
.mockRejectedValueOnce(new Error('connect ECONNREFUSED'))
|
|
143
|
+
.mockRejectedValueOnce(new Error('connect ECONNREFUSED'))
|
|
144
|
+
.mockResolvedValue(jsonResponse({ SecretString: JSON.stringify({ BIGFOOT_API_KEY: 'platform-key' }) }));
|
|
145
|
+
vi.stubGlobal('fetch', fetchMock);
|
|
146
|
+
await loadConfiguration({ required: ['BIGFOOT_API_KEY'], retryDelayMs: 0, logger: silentLogger });
|
|
147
|
+
expect(fetchMock).toHaveBeenCalledTimes(3);
|
|
148
|
+
expect(process.env.BIGFOOT_API_KEY).toBe('platform-key');
|
|
149
|
+
});
|
|
150
|
+
it('does not retry a request the extension rejected', async () => {
|
|
151
|
+
asLambda();
|
|
152
|
+
const fetchMock = vi.fn().mockResolvedValue(new Response('not found', { status: 404 }));
|
|
153
|
+
vi.stubGlobal('fetch', fetchMock);
|
|
154
|
+
await expect(loadConfiguration({ required: [], retryDelayMs: 0, logger: silentLogger })).rejects.toThrow(/HTTP 404/);
|
|
155
|
+
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
156
|
+
});
|
|
157
|
+
it('fails when the secret carries no SecretString', async () => {
|
|
158
|
+
asLambda();
|
|
159
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue(jsonResponse({ SecretBinary: 'AAAA' })));
|
|
160
|
+
await expect(loadConfiguration({ required: [], retryDelayMs: 0, logger: silentLogger })).rejects.toThrow(/SecretString/);
|
|
161
|
+
});
|
|
162
|
+
it('fails closed when a required key is absent from the secret, naming the key but not a value', async () => {
|
|
163
|
+
asLambda();
|
|
164
|
+
vi.stubGlobal('fetch', vi
|
|
165
|
+
.fn()
|
|
166
|
+
.mockResolvedValue(jsonResponse({ SecretString: JSON.stringify({ PRESENT: 'a-value-that-must-not-be-named' }) })));
|
|
167
|
+
const error = await loadConfiguration({ required: ['BIGFOOT_API_KEY'], logger: silentLogger }).catch((e) => e);
|
|
168
|
+
expect(error.message).toContain('BIGFOOT_API_KEY');
|
|
169
|
+
expect(error.message).not.toContain('a-value-that-must-not-be-named');
|
|
170
|
+
});
|
|
171
|
+
it('accepts an injected fetcher, so the logic needs no Lambda and no network', async () => {
|
|
172
|
+
asLambda();
|
|
173
|
+
const fetchSecret = vi.fn().mockResolvedValue(JSON.stringify({ BIGFOOT_API_KEY: 'injected' }));
|
|
174
|
+
await loadConfiguration({ required: ['BIGFOOT_API_KEY'], fetchSecret, logger: silentLogger });
|
|
175
|
+
expect(fetchSecret).toHaveBeenCalledWith(SECRET_ID);
|
|
176
|
+
expect(process.env.BIGFOOT_API_KEY).toBe('injected');
|
|
177
|
+
});
|
|
178
|
+
it('does not attempt the extension when the process is not on Lambda', async () => {
|
|
179
|
+
process.env[SECRET_ID_VAR] = SECRET_ID;
|
|
180
|
+
const fetchMock = vi.fn();
|
|
181
|
+
vi.stubGlobal('fetch', fetchMock);
|
|
182
|
+
process.env.BIGFOOT_API_KEY = 'from-the-environment';
|
|
183
|
+
await loadConfiguration({ required: ['BIGFOOT_API_KEY'], logger: silentLogger });
|
|
184
|
+
expect(fetchMock).not.toHaveBeenCalled();
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
//# sourceMappingURL=configuration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration.test.js","sourceRoot":"","sources":["../src/configuration.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,9 @@
|
|
|
1
1
|
import { type AuthCheckResult, type AuthRefreshProviderResponse, type Calendar, type CommentFilter, type ConnectedProvider, type ConnectedProviderRegistration, type Credential, type Email, type EmailFilter, type ExecuteFunctionProviderRequest, type ExecuteFunctionProviderResponse, type ExecuteQueryProviderRequest, type ExecuteQueryProviderResponse, type ExternalNote, type ExternalObjectWithUrl, type ExternalTagReferenceRequest, type InsightFilter, type LinkSubscriptionProviderRequest, type LinkSubscriptionProviderResponse, type ListFunctionMetadataProviderRequest, type ListFunctionMetadataProviderResponse, type Message, type ResolveFunctionInputsProviderRequest, type ResolveFunctionInputsProviderResponse, type StandardSyncResponse, type SyncCalendarProviderRequest, type SyncCommentItem, type SyncExternalIdLinksProviderRequest, type SyncInsightProviderRequest, type SyncTableMetadataProviderRequest, type SyncTableProviderRequest, type SyncThreadItem, type Table, type Tag, type TagInsightResponse, type TagType, type ThreadFilter, type Transcription, type TranscriptionFilter, type UpsertMessageProviderRequest, type UpsertNotesProviderRequest, type UpsertTableProviderRequest } from '@bigfootai/bigfoot-types';
|
|
2
2
|
import { type Express } from 'express';
|
|
3
3
|
import { CredentialsExpiredError, ValidationError } from './errors.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
* shapes actually logged (`{ credential }`, `{ connectedProvider: { credential } }`,
|
|
8
|
-
* `{ req: { headers } }`). The whole `credential` object is redacted rather
|
|
9
|
-
* than its individual fields, so a credential shape that gains a new token
|
|
10
|
-
* field later is still covered.
|
|
11
|
-
*/
|
|
12
|
-
export declare const LOG_REDACT_PATHS: string[];
|
|
13
|
-
export declare const logger: import("pino").Logger<never, boolean>;
|
|
14
|
-
export type Logger = typeof logger;
|
|
4
|
+
import { type Logger } from './logger.js';
|
|
5
|
+
export { LOG_REDACT_PATHS, logger } from './logger.js';
|
|
6
|
+
export type { Logger } from './logger.js';
|
|
15
7
|
/**
|
|
16
8
|
* Drops the query string from a request URL. Used for logging: the OAuth
|
|
17
9
|
* callback carries the authorization code and state there.
|
|
@@ -362,5 +354,7 @@ export declare function startServer(options: StartServerOptions): Promise<Expres
|
|
|
362
354
|
export { CredentialsExpiredError, ValidationError };
|
|
363
355
|
export { decodeAuthState, encodeAuthState } from './auth-state.js';
|
|
364
356
|
export type { AuthStatePayload, DecodedAuthState, EncodeAuthStateOptions } from './auth-state.js';
|
|
357
|
+
export { SECRET_ID_VAR, loadSecrets } from './secrets.js';
|
|
358
|
+
export type { LoadSecretsOptions } from './secrets.js';
|
|
365
359
|
export declare const sendCredentialsToBigfoot: (providerRegistration: ConnectedProviderRegistration) => Promise<void>;
|
|
366
360
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAGN,KAAK,eAAe,EAEpB,KAAK,2BAA2B,EAChC,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,6BAA6B,EAClC,KAAK,UAAU,EACf,KAAK,KAAK,EACV,KAAK,WAAW,EAChB,KAAK,8BAA8B,EACnC,KAAK,+BAA+B,EACpC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAOhC,KAAK,aAAa,EAClB,KAAK,+BAA+B,EACpC,KAAK,gCAAgC,EACrC,KAAK,mCAAmC,EACxC,KAAK,oCAAoC,EACzC,KAAK,OAAO,EAEZ,KAAK,oCAAoC,EACzC,KAAK,qCAAqC,EAC1C,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,eAAe,EAGpB,KAAK,kCAAkC,EACvC,KAAK,0BAA0B,EAC/B,KAAK,gCAAgC,EACrC,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EAGnB,KAAK,KAAK,EACV,KAAK,GAAG,EACR,KAAK,kBAAkB,EAEvB,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,MAAM,0BAA0B,CAAC;AAGlC,OAAgB,EAAE,KAAK,OAAO,EAA+B,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,67 +3,13 @@ import { ProcessingStage, } from '@bigfootai/bigfoot-types';
|
|
|
3
3
|
import bodyParser from 'body-parser';
|
|
4
4
|
import compression from 'compression';
|
|
5
5
|
import express from 'express';
|
|
6
|
-
import { pino } from 'pino';
|
|
7
6
|
import { pinoHttp } from 'pino-http';
|
|
8
7
|
import { CredentialsExpiredError, ValidationError, errorHandler } from './errors.js';
|
|
9
8
|
import { getConnectionErrorHtml } from './html.js';
|
|
9
|
+
import { logger } from './logger.js';
|
|
10
10
|
import { payloadSizeGuard } from './payload-limits.js';
|
|
11
11
|
import { createPlatformAuthMiddleware, resolvePlatformKey } from './platform-auth.js';
|
|
12
|
-
|
|
13
|
-
* Field names whose values must never appear in log output in clear text.
|
|
14
|
-
*
|
|
15
|
-
* This is defence in depth, not the primary control. The primary control is
|
|
16
|
-
* that no log statement in this SDK passes a credential to the logger in the
|
|
17
|
-
* first place, and that the HTTP request serializer emits only method and
|
|
18
|
-
* path. Redaction is the backstop: if a future log statement — here or in a
|
|
19
|
-
* provider built on this SDK — ever includes one of these fields, pino masks
|
|
20
|
-
* the value before it reaches the log store rather than relying on every
|
|
21
|
-
* author to remember.
|
|
22
|
-
*/
|
|
23
|
-
const SENSITIVE_FIELD_NAMES = [
|
|
24
|
-
'access_token',
|
|
25
|
-
'accessToken',
|
|
26
|
-
'api_key',
|
|
27
|
-
'apiKey',
|
|
28
|
-
'authorization',
|
|
29
|
-
'client_secret',
|
|
30
|
-
'clientSecret',
|
|
31
|
-
'cookie',
|
|
32
|
-
'id_token',
|
|
33
|
-
'idToken',
|
|
34
|
-
'password',
|
|
35
|
-
'refresh_token',
|
|
36
|
-
'refreshToken',
|
|
37
|
-
'secret',
|
|
38
|
-
'token',
|
|
39
|
-
];
|
|
40
|
-
/**
|
|
41
|
-
* Redaction paths applied to every log record. Each sensitive field name is
|
|
42
|
-
* matched at the top level and up to two levels of nesting, which covers the
|
|
43
|
-
* shapes actually logged (`{ credential }`, `{ connectedProvider: { credential } }`,
|
|
44
|
-
* `{ req: { headers } }`). The whole `credential` object is redacted rather
|
|
45
|
-
* than its individual fields, so a credential shape that gains a new token
|
|
46
|
-
* field later is still covered.
|
|
47
|
-
*/
|
|
48
|
-
export const LOG_REDACT_PATHS = [
|
|
49
|
-
...SENSITIVE_FIELD_NAMES,
|
|
50
|
-
...SENSITIVE_FIELD_NAMES.map((field) => `*.${field}`),
|
|
51
|
-
...SENSITIVE_FIELD_NAMES.map((field) => `*.*.${field}`),
|
|
52
|
-
'credential',
|
|
53
|
-
'*.credential',
|
|
54
|
-
'req.headers.authorization',
|
|
55
|
-
'req.headers.cookie',
|
|
56
|
-
];
|
|
57
|
-
export const logger = pino({
|
|
58
|
-
redact: {
|
|
59
|
-
censor: '[Redacted]',
|
|
60
|
-
paths: LOG_REDACT_PATHS,
|
|
61
|
-
},
|
|
62
|
-
// Emit the level as a word: Datadog only maps the words, so a numeric level reads as info.
|
|
63
|
-
formatters: {
|
|
64
|
-
level: (label) => ({ level: label }),
|
|
65
|
-
},
|
|
66
|
-
});
|
|
12
|
+
export { LOG_REDACT_PATHS, logger } from './logger.js';
|
|
67
13
|
/**
|
|
68
14
|
* Drops the query string from a request URL. Used for logging: the OAuth
|
|
69
15
|
* callback carries the authorization code and state there.
|
|
@@ -543,6 +489,7 @@ export async function startServer(options) {
|
|
|
543
489
|
}
|
|
544
490
|
export { CredentialsExpiredError, ValidationError };
|
|
545
491
|
export { decodeAuthState, encodeAuthState } from './auth-state.js';
|
|
492
|
+
export { SECRET_ID_VAR, loadSecrets } from './secrets.js';
|
|
546
493
|
export const sendCredentialsToBigfoot = async (providerRegistration) => {
|
|
547
494
|
// Now that we have the provider registration, we send it back to Bigfoot to keep for us
|
|
548
495
|
const response = await fetch(`${process.env.BIGFOOT_ENVIRONMENT_URL}/api/v1/provider/credentials`, {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redaction paths applied to every log record. Each sensitive field name is
|
|
3
|
+
* matched at the top level and up to two levels of nesting, which covers the
|
|
4
|
+
* shapes actually logged (`{ credential }`, `{ connectedProvider: { credential } }`,
|
|
5
|
+
* `{ req: { headers } }`). The whole `credential` object is redacted rather
|
|
6
|
+
* than its individual fields, so a credential shape that gains a new token
|
|
7
|
+
* field later is still covered.
|
|
8
|
+
*/
|
|
9
|
+
export declare const LOG_REDACT_PATHS: string[];
|
|
10
|
+
export declare const logger: import("pino").Logger<never, boolean>;
|
|
11
|
+
export type Logger = typeof logger;
|
|
12
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AA+BA;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,UAQ5B,CAAC;AAEF,eAAO,MAAM,MAAM,uCASjB,CAAC;AACH,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { pino } from 'pino';
|
|
2
|
+
/**
|
|
3
|
+
* Field names whose values must never appear in log output in clear text.
|
|
4
|
+
*
|
|
5
|
+
* This is defence in depth, not the primary control. The primary control is
|
|
6
|
+
* that no log statement in this SDK passes a credential to the logger in the
|
|
7
|
+
* first place, and that the HTTP request serializer emits only method and
|
|
8
|
+
* path. Redaction is the backstop: if a future log statement — here or in a
|
|
9
|
+
* provider built on this SDK — ever includes one of these fields, pino masks
|
|
10
|
+
* the value before it reaches the log store rather than relying on every
|
|
11
|
+
* author to remember.
|
|
12
|
+
*/
|
|
13
|
+
const SENSITIVE_FIELD_NAMES = [
|
|
14
|
+
'access_token',
|
|
15
|
+
'accessToken',
|
|
16
|
+
'api_key',
|
|
17
|
+
'apiKey',
|
|
18
|
+
'authorization',
|
|
19
|
+
'client_secret',
|
|
20
|
+
'clientSecret',
|
|
21
|
+
'cookie',
|
|
22
|
+
'id_token',
|
|
23
|
+
'idToken',
|
|
24
|
+
'password',
|
|
25
|
+
'refresh_token',
|
|
26
|
+
'refreshToken',
|
|
27
|
+
'secret',
|
|
28
|
+
'token',
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Redaction paths applied to every log record. Each sensitive field name is
|
|
32
|
+
* matched at the top level and up to two levels of nesting, which covers the
|
|
33
|
+
* shapes actually logged (`{ credential }`, `{ connectedProvider: { credential } }`,
|
|
34
|
+
* `{ req: { headers } }`). The whole `credential` object is redacted rather
|
|
35
|
+
* than its individual fields, so a credential shape that gains a new token
|
|
36
|
+
* field later is still covered.
|
|
37
|
+
*/
|
|
38
|
+
export const LOG_REDACT_PATHS = [
|
|
39
|
+
...SENSITIVE_FIELD_NAMES,
|
|
40
|
+
...SENSITIVE_FIELD_NAMES.map((field) => `*.${field}`),
|
|
41
|
+
...SENSITIVE_FIELD_NAMES.map((field) => `*.*.${field}`),
|
|
42
|
+
'credential',
|
|
43
|
+
'*.credential',
|
|
44
|
+
'req.headers.authorization',
|
|
45
|
+
'req.headers.cookie',
|
|
46
|
+
];
|
|
47
|
+
export const logger = pino({
|
|
48
|
+
redact: {
|
|
49
|
+
censor: '[Redacted]',
|
|
50
|
+
paths: LOG_REDACT_PATHS,
|
|
51
|
+
},
|
|
52
|
+
// Emit the level as a word: Datadog only maps the words, so a numeric level reads as info.
|
|
53
|
+
formatters: {
|
|
54
|
+
level: (label) => ({ level: label }),
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B;;;;;;;;;;GAUG;AACH,MAAM,qBAAqB,GAAG;IAC7B,cAAc;IACd,aAAa;IACb,SAAS;IACT,QAAQ;IACR,eAAe;IACf,eAAe;IACf,cAAc;IACd,QAAQ;IACR,UAAU;IACV,SAAS;IACT,UAAU;IACV,eAAe;IACf,cAAc;IACd,QAAQ;IACR,OAAO;CACP,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC/B,GAAG,qBAAqB;IACxB,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;IACrD,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC;IACvD,YAAY;IACZ,cAAc;IACd,2BAA2B;IAC3B,oBAAoB;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE;QACP,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,gBAAgB;KACvB;IACD,2FAA2F;IAC3F,UAAU,EAAE;QACX,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;KACpC;CACD,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves a provider's secret configuration before the server starts.
|
|
3
|
+
*
|
|
4
|
+
* On Lambda the secret named by `SECRETS_MANAGER_SECRET_ID` is read through the
|
|
5
|
+
* AWS Parameters and Secrets Lambda Extension and merged into `process.env`. On
|
|
6
|
+
* ECS the task definition has already injected the values there, so there is
|
|
7
|
+
* nothing to fetch. A provider calls this once and does not know which runtime
|
|
8
|
+
* it is on.
|
|
9
|
+
*/
|
|
10
|
+
/** Names the Secrets Manager secret to read on Lambda. Unset on ECS and locally. */
|
|
11
|
+
export declare const SECRET_ID_VAR = "SECRETS_MANAGER_SECRET_ID";
|
|
12
|
+
export interface LoadSecretsOptions {
|
|
13
|
+
/** The secret to read. Defaults to `SECRETS_MANAGER_SECRET_ID`. */
|
|
14
|
+
secretId?: string;
|
|
15
|
+
/** Keys the provider needs: a key, or alternatives, any one of which satisfies it. */
|
|
16
|
+
required?: readonly (string | readonly string[])[];
|
|
17
|
+
/** Reads the raw `SecretString`. Injectable so tests need no Lambda and no network. */
|
|
18
|
+
fetcher?: (secretId: string) => Promise<string>;
|
|
19
|
+
}
|
|
20
|
+
export declare const loadSecrets: ({ secretId, required, fetcher }?: LoadSecretsOptions) => Promise<void>;
|
|
21
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,oFAAoF;AACpF,eAAO,MAAM,aAAa,8BAA8B,CAAC;AAKzD,MAAM,WAAW,kBAAkB;IAClC,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,QAAQ,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;IACnD,uFAAuF;IACvF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,WAAW,qCAAgD,kBAAkB,KAAQ,OAAO,CAAC,IAAI,CA0B7G,CAAC"}
|
package/dist/secrets.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { logger } from './logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves a provider's secret configuration before the server starts.
|
|
4
|
+
*
|
|
5
|
+
* On Lambda the secret named by `SECRETS_MANAGER_SECRET_ID` is read through the
|
|
6
|
+
* AWS Parameters and Secrets Lambda Extension and merged into `process.env`. On
|
|
7
|
+
* ECS the task definition has already injected the values there, so there is
|
|
8
|
+
* nothing to fetch. A provider calls this once and does not know which runtime
|
|
9
|
+
* it is on.
|
|
10
|
+
*/
|
|
11
|
+
/** Names the Secrets Manager secret to read on Lambda. Unset on ECS and locally. */
|
|
12
|
+
export const SECRET_ID_VAR = 'SECRETS_MANAGER_SECRET_ID';
|
|
13
|
+
/** Set by the Lambda runtime; its presence is how we know the extension is available. */
|
|
14
|
+
const LAMBDA_VAR = 'AWS_LAMBDA_FUNCTION_NAME';
|
|
15
|
+
export const loadSecrets = async ({ secretId, required = [], fetcher } = {}) => {
|
|
16
|
+
const id = (secretId ?? process.env[SECRET_ID_VAR])?.trim();
|
|
17
|
+
// ECS and local: the value is already in the environment. Nothing to fetch.
|
|
18
|
+
if (id && process.env[LAMBDA_VAR]) {
|
|
19
|
+
const values = parseSecretPayload(await (fetcher ?? fetchFromExtension)(id));
|
|
20
|
+
// Secrets Manager is authoritative: it overwrites a stale injected value.
|
|
21
|
+
for (const [key, value] of Object.entries(values)) {
|
|
22
|
+
process.env[key] = value;
|
|
23
|
+
}
|
|
24
|
+
logger.info({ keys: Object.keys(values).sort(), secretId: id }, 'Loaded configuration from Secrets Manager');
|
|
25
|
+
}
|
|
26
|
+
const missing = required
|
|
27
|
+
.map((requirement) => (typeof requirement === 'string' ? [requirement] : requirement))
|
|
28
|
+
.filter((keys) => keys.every((key) => !process.env[key]?.trim()))
|
|
29
|
+
.map((keys) => keys.join(' or '));
|
|
30
|
+
// Deployed, a missing value aborts startup. Locally, warn so one integration
|
|
31
|
+
// is not blocked by configuration another one needs.
|
|
32
|
+
if (missing.length > 0) {
|
|
33
|
+
if (id) {
|
|
34
|
+
throw new Error(`Incomplete configuration after "${id}": missing ${missing.join(', ')}`);
|
|
35
|
+
}
|
|
36
|
+
logger.warn({ missing }, `${SECRET_ID_VAR} is not set; these values are missing locally`);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const parseSecretPayload = (raw) => {
|
|
40
|
+
let parsed;
|
|
41
|
+
try {
|
|
42
|
+
parsed = JSON.parse(raw);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Never quote the payload: JSON.parse's own error can include it.
|
|
46
|
+
throw new Error('the secret is not valid JSON (expected a flat object of string key/value pairs)');
|
|
47
|
+
}
|
|
48
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
49
|
+
throw new Error('the secret must be a flat JSON object of string key/value pairs');
|
|
50
|
+
}
|
|
51
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
52
|
+
if (typeof value !== 'string') {
|
|
53
|
+
throw new Error(`the secret value for "${key}" must be a string`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return parsed;
|
|
57
|
+
};
|
|
58
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
59
|
+
/**
|
|
60
|
+
* Reads the secret from the extension, retrying while it finishes booting: a
|
|
61
|
+
* refused connection, 5xx or 429 is transient, any other 4xx is terminal.
|
|
62
|
+
*/
|
|
63
|
+
const fetchFromExtension = async (secretId) => {
|
|
64
|
+
// Read the token per call so it stays fresh across a SnapStart restore.
|
|
65
|
+
const token = process.env.AWS_SESSION_TOKEN;
|
|
66
|
+
if (!token) {
|
|
67
|
+
throw new Error('AWS_SESSION_TOKEN is not set; the extension requires it');
|
|
68
|
+
}
|
|
69
|
+
const port = process.env.PARAMETERS_SECRETS_EXTENSION_HTTP_PORT ?? '2773';
|
|
70
|
+
const url = `http://localhost:${port}/secretsmanager/get?secretId=${encodeURIComponent(secretId)}`;
|
|
71
|
+
let lastError;
|
|
72
|
+
for (let attempt = 1; attempt <= 5; attempt += 1) {
|
|
73
|
+
let response;
|
|
74
|
+
try {
|
|
75
|
+
response = await fetch(url, { headers: { 'X-Aws-Parameters-Secrets-Token': token } });
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
lastError = error;
|
|
79
|
+
if (attempt < 5)
|
|
80
|
+
await sleep(200 * attempt);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (response.ok) {
|
|
84
|
+
const body = (await response.json());
|
|
85
|
+
if (!body.SecretString) {
|
|
86
|
+
throw new Error('the secret has no SecretString value (binary secrets are not supported)');
|
|
87
|
+
}
|
|
88
|
+
return body.SecretString;
|
|
89
|
+
}
|
|
90
|
+
// 5xx and 429 mean "still starting"; any other 4xx is terminal.
|
|
91
|
+
if (response.status !== 429 && response.status < 500) {
|
|
92
|
+
throw new Error(`the extension returned ${response.status} for "${secretId}"`);
|
|
93
|
+
}
|
|
94
|
+
lastError = new Error(`the extension returned ${response.status} for "${secretId}"`);
|
|
95
|
+
if (attempt < 5)
|
|
96
|
+
await sleep(200 * attempt);
|
|
97
|
+
}
|
|
98
|
+
// Unreachable: the loop returns or throws. Kept for the type checker.
|
|
99
|
+
throw lastError;
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.test.d.ts","sourceRoot":"","sources":["../src/secrets.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { logger } from './logger.js';
|
|
3
|
+
import { SECRET_ID_VAR, loadSecrets } from './secrets.js';
|
|
4
|
+
const SECRET_ID = 'bigfoot-example/dev';
|
|
5
|
+
const TOKEN = 'session-token-value';
|
|
6
|
+
const MANAGED_VARS = [
|
|
7
|
+
SECRET_ID_VAR,
|
|
8
|
+
'AWS_LAMBDA_FUNCTION_NAME',
|
|
9
|
+
'AWS_SESSION_TOKEN',
|
|
10
|
+
'PARAMETERS_SECRETS_EXTENSION_HTTP_PORT',
|
|
11
|
+
'BIGFOOT_API_KEY',
|
|
12
|
+
'CLIENT_SECRET',
|
|
13
|
+
'PKCE_SECRET',
|
|
14
|
+
'EXTRA',
|
|
15
|
+
];
|
|
16
|
+
const clearEnv = () => {
|
|
17
|
+
for (const name of MANAGED_VARS) {
|
|
18
|
+
delete process.env[name];
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const asLambda = () => {
|
|
22
|
+
process.env.AWS_LAMBDA_FUNCTION_NAME = 'bigfoot-example';
|
|
23
|
+
process.env[SECRET_ID_VAR] = SECRET_ID;
|
|
24
|
+
process.env.AWS_SESSION_TOKEN = TOKEN;
|
|
25
|
+
};
|
|
26
|
+
const jsonResponse = (body, status = 200) => new Response(JSON.stringify(body), { status, headers: { 'Content-Type': 'application/json' } });
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
clearEnv();
|
|
29
|
+
});
|
|
30
|
+
afterEach(() => {
|
|
31
|
+
clearEnv();
|
|
32
|
+
vi.unstubAllGlobals();
|
|
33
|
+
vi.restoreAllMocks();
|
|
34
|
+
});
|
|
35
|
+
describe('loadSecrets', () => {
|
|
36
|
+
it('reads the secret on Lambda, merges every key and logs key names only', async () => {
|
|
37
|
+
asLambda();
|
|
38
|
+
const info = vi.spyOn(logger, 'info');
|
|
39
|
+
const fetchMock = vi
|
|
40
|
+
.fn()
|
|
41
|
+
.mockResolvedValue(jsonResponse({ SecretString: JSON.stringify({ BIGFOOT_API_KEY: 'k', EXTRA: 'x' }) }));
|
|
42
|
+
vi.stubGlobal('fetch', fetchMock);
|
|
43
|
+
await loadSecrets({ required: ['BIGFOOT_API_KEY'] });
|
|
44
|
+
expect(process.env.BIGFOOT_API_KEY).toBe('k');
|
|
45
|
+
expect(process.env.EXTRA).toBe('x');
|
|
46
|
+
const [url, init] = fetchMock.mock.calls[0];
|
|
47
|
+
expect(url).toBe(`http://localhost:2773/secretsmanager/get?secretId=${encodeURIComponent(SECRET_ID)}`);
|
|
48
|
+
expect(init.headers['X-Aws-Parameters-Secrets-Token']).toBe(TOKEN);
|
|
49
|
+
expect(info).toHaveBeenCalledWith({ keys: ['BIGFOOT_API_KEY', 'EXTRA'], secretId: SECRET_ID }, expect.any(String));
|
|
50
|
+
});
|
|
51
|
+
it('does not fetch off Lambda, where ECS has already injected the values', async () => {
|
|
52
|
+
process.env[SECRET_ID_VAR] = SECRET_ID;
|
|
53
|
+
process.env.BIGFOOT_API_KEY = 'injected';
|
|
54
|
+
const fetchMock = vi.fn();
|
|
55
|
+
vi.stubGlobal('fetch', fetchMock);
|
|
56
|
+
await loadSecrets({ required: ['BIGFOOT_API_KEY'] });
|
|
57
|
+
expect(fetchMock).not.toHaveBeenCalled();
|
|
58
|
+
});
|
|
59
|
+
it('fails closed off Lambda when a required key is missing, naming the key but never a value', async () => {
|
|
60
|
+
process.env[SECRET_ID_VAR] = SECRET_ID;
|
|
61
|
+
process.env.CLIENT_SECRET = 'a-value-that-must-not-be-named';
|
|
62
|
+
const error = await loadSecrets({ required: ['BIGFOOT_API_KEY', 'CLIENT_SECRET'] }).catch((e) => e);
|
|
63
|
+
expect(error.message).toContain('BIGFOOT_API_KEY');
|
|
64
|
+
expect(error.message).not.toContain('a-value-that-must-not-be-named');
|
|
65
|
+
});
|
|
66
|
+
it('only warns locally, so one integration is not blocked by another', async () => {
|
|
67
|
+
const warn = vi.spyOn(logger, 'warn');
|
|
68
|
+
await expect(loadSecrets({ required: ['BIGFOOT_API_KEY'] })).resolves.toBeUndefined();
|
|
69
|
+
expect(warn).toHaveBeenCalled();
|
|
70
|
+
});
|
|
71
|
+
it('accepts alternatives, satisfied when any one is present', async () => {
|
|
72
|
+
process.env[SECRET_ID_VAR] = SECRET_ID;
|
|
73
|
+
process.env.PKCE_SECRET = 'value';
|
|
74
|
+
await expect(loadSecrets({ required: [['CLIENT_SECRET', 'PKCE_SECRET']] })).resolves.toBeUndefined();
|
|
75
|
+
});
|
|
76
|
+
it('does not quote the payload when the secret is malformed', async () => {
|
|
77
|
+
asLambda();
|
|
78
|
+
const secret = 'super-secret-not-json';
|
|
79
|
+
const error = await loadSecrets({ fetcher: async () => secret }).catch((e) => e);
|
|
80
|
+
expect(error.message).toMatch(/not valid JSON/);
|
|
81
|
+
expect(error.message).not.toContain(secret);
|
|
82
|
+
});
|
|
83
|
+
it('retries the extension while it finishes booting', async () => {
|
|
84
|
+
asLambda();
|
|
85
|
+
const fetchMock = vi
|
|
86
|
+
.fn()
|
|
87
|
+
.mockRejectedValueOnce(new Error('connect ECONNREFUSED'))
|
|
88
|
+
.mockResolvedValue(jsonResponse({ SecretString: JSON.stringify({ BIGFOOT_API_KEY: 'k' }) }));
|
|
89
|
+
vi.stubGlobal('fetch', fetchMock);
|
|
90
|
+
await loadSecrets({ required: ['BIGFOOT_API_KEY'] });
|
|
91
|
+
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
92
|
+
expect(process.env.BIGFOOT_API_KEY).toBe('k');
|
|
93
|
+
});
|
|
94
|
+
it('does not retry a request the extension rejected', async () => {
|
|
95
|
+
asLambda();
|
|
96
|
+
const fetchMock = vi.fn().mockResolvedValue(new Response('not found', { status: 404 }));
|
|
97
|
+
vi.stubGlobal('fetch', fetchMock);
|
|
98
|
+
await expect(loadSecrets()).rejects.toThrow(/returned 404/);
|
|
99
|
+
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
100
|
+
});
|
|
101
|
+
it('fails when the secret has no SecretString', async () => {
|
|
102
|
+
asLambda();
|
|
103
|
+
vi.stubGlobal('fetch', vi.fn().mockResolvedValue(jsonResponse({ SecretBinary: 'AAAA' })));
|
|
104
|
+
await expect(loadSecrets()).rejects.toThrow(/SecretString/);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=secrets.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.test.js","sourceRoot":"","sources":["../src/secrets.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,SAAS,GAAG,qBAAqB,CAAC;AACxC,MAAM,KAAK,GAAG,qBAAqB,CAAC;AAEpC,MAAM,YAAY,GAAG;IACpB,aAAa;IACb,0BAA0B;IAC1B,mBAAmB;IACnB,wCAAwC;IACxC,iBAAiB;IACjB,eAAe;IACf,aAAa;IACb,OAAO;CACE,CAAC;AAEX,MAAM,QAAQ,GAAG,GAAG,EAAE;IACrB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,GAAG,EAAE;IACrB,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,iBAAiB,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,KAAK,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG,EAAY,EAAE,CAC9D,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAEjG,UAAU,CAAC,GAAG,EAAE;IACf,QAAQ,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACd,QAAQ,EAAE,CAAC;IACX,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACtB,EAAE,CAAC,eAAe,EAAE,CAAC;AACtB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACrF,QAAQ,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,EAAE;aAClB,EAAE,EAAE;aACJ,iBAAiB,CAAC,YAAY,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1G,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAElC,MAAM,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAErD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,qDAAqD,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACvG,MAAM,CAAE,IAAI,CAAC,OAAkC,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/F,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,CAAC,iBAAiB,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACpH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACrF,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,UAAU,CAAC;QACzC,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1B,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAElC,MAAM,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAErD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;QACzG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,gCAAgC,CAAC;QAE7D,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,iBAAiB,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3G,MAAM,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC9D,MAAM,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAEtC,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QACtF,MAAM,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACxE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC;QAElC,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IACtG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACxE,QAAQ,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,uBAAuB,CAAC;QAEvC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAExF,MAAM,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC3D,MAAM,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAChE,QAAQ,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,EAAE;aAClB,EAAE,EAAE;aACJ,qBAAqB,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;aACxD,iBAAiB,CAAC,YAAY,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9F,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAElC,MAAM,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAErD,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAChE,QAAQ,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACxF,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAElC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC1D,QAAQ,EAAE,CAAC;QACX,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QAE1F,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|