@bigfootai/sdk 1.17.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/auth-state.d.ts +38 -0
- package/dist/auth-state.d.ts.map +1 -0
- package/dist/auth-state.js +84 -0
- package/dist/auth-state.js.map +1 -0
- package/dist/auth-state.test.d.ts +2 -0
- package/dist/auth-state.test.d.ts.map +1 -0
- package/dist/auth-state.test.js +64 -0
- package/dist/auth-state.test.js.map +1 -0
- 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 +7 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -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 +2 -1
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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;;;;GAQG;AAEH,oFAAoF;AACpF,MAAM,CAAC,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAEzD,yFAAyF;AACzF,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAW9C,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,EAAE,EAAE,OAAO,KAAyB,EAAE,EAAiB,EAAE;IACjH,MAAM,EAAE,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAE5D,4EAA4E;IAC5E,IAAI,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,IAAI,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,0EAA0E;QAC1E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC1B,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,2CAA2C,CAAC,CAAC;IAC9G,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ;SACtB,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;SACrF,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;SAChE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEnC,6EAA6E;IAC7E,qDAAqD;IACrD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,IAAI,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,mCAAmC,EAAE,cAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,aAAa,+CAA+C,CAAC,CAAC;IAC3F,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAA0B,EAAE;IAClE,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACR,kEAAkE;QAClE,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;IACpG,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;IACD,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;IACF,CAAC;IACD,OAAO,MAAgC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAE/F;;;GAGG;AACH,MAAM,kBAAkB,GAAG,KAAK,EAAE,QAAgB,EAAmB,EAAE;IACtE,wEAAwE;IACxE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,sCAAsC,IAAI,MAAM,CAAC;IAC1E,MAAM,GAAG,GAAG,oBAAoB,IAAI,gCAAgC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;IAEnG,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAClD,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACJ,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,gCAAgC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,OAAO,GAAG,CAAC;gBAAE,MAAM,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC;YAC5C,SAAS;QACV,CAAC;QAED,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA8B,CAAC;YAClE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;YAC5F,CAAC;YACD,OAAO,IAAI,CAAC,YAAY,CAAC;QAC1B,CAAC;QACD,gEAAgE;QAChE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,SAAS,QAAQ,GAAG,CAAC,CAAC;QAChF,CAAC;QACD,SAAS,GAAG,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,SAAS,QAAQ,GAAG,CAAC,CAAC;QACrF,IAAI,OAAO,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,sEAAsE;IACtE,MAAM,SAAS,CAAC;AACjB,CAAC,CAAC"}
|
|
@@ -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":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bigfootai/sdk",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.19.0",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
7
7
|
"LICENSE",
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"body-parser": "^2.2.2",
|
|
14
14
|
"compression": "^1.8.1",
|
|
15
15
|
"express": "^5.0.1",
|
|
16
|
+
"jose": "^6.0.13",
|
|
16
17
|
"pino": "^9.9.0",
|
|
17
18
|
"pino-http": "^10.5.0",
|
|
18
19
|
"problem-details-http": "^2.0.0",
|