Comparing version 0.17.1 to 0.18.0
{ | ||
"name": "middy", | ||
"version": "0.17.1", | ||
"version": "0.18.0", | ||
"description": "🛵 The stylish Node.js middleware engine for AWS Lambda", | ||
@@ -5,0 +5,0 @@ "main": "./index.js", |
@@ -518,2 +518,3 @@ <div align="center"> | ||
- [`s3KeyNormalizer`](/docs/middlewares.md#s3keynormalizer): Normalizes key names in s3 events. | ||
- [`Secrets Manager`](/docs/middlewares.md#secretsmanager): Fetches parameters from AWS Secrets Manager. | ||
- [`ssm`](/docs/middlewares.md#ssm): Fetches parameters from [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-paramstore.html). | ||
@@ -520,0 +521,0 @@ - [`validator`](/docs/middlewares.md#validator): Automatically validates incoming events and outgoing responses against custom schemas |
@@ -55,2 +55,3 @@ jest.mock('aws-sdk') | ||
handler(event, context, (error, response) => { | ||
if (error) return reject(error) | ||
try { | ||
@@ -72,3 +73,3 @@ cb(error, {event, context, response}) | ||
}) | ||
promise.then(done).catch(err => done(err)) | ||
promise.then(done).catch(done) | ||
} | ||
@@ -222,2 +223,88 @@ | ||
test(`It should fail if "throwOnFailedCall" flag provided and call failed`, (done) => { | ||
const errorMessage = 'Internal Error / Secret doesn\'t exist' | ||
getSecretValueMock.mockReturnValueOnce({ | ||
promise: () => Promise.reject(new Error(errorMessage)) | ||
}) | ||
const errHandler = err => { | ||
getSecretValueMock.mockClear() | ||
expect(err.message).toEqual(errorMessage) | ||
done() | ||
} | ||
return testScenario({ | ||
mockResponse: {}, | ||
middlewareOptions: { | ||
secrets: { | ||
KEY_NAME: 'failed_call' | ||
}, | ||
throwOnFailedCall: true | ||
}, | ||
callbacks: [ | ||
() => { | ||
throw new Error('Not supposed to be called') | ||
} | ||
], | ||
done: errHandler | ||
}) | ||
}) | ||
test(`It should resolve if "throwOnFailedCall" flag not provided and call failed`, (done) => { | ||
const errorMessage = 'Internal Error / Secret doesn\'t exist' | ||
getSecretValueMock.mockReturnValueOnce({ | ||
promise: () => Promise.reject(new Error(errorMessage)) | ||
}) | ||
return testScenario({ | ||
mockResponse: {}, | ||
middlewareOptions: { | ||
secrets: { | ||
KEY_NAME: 'failed_call' | ||
} | ||
}, | ||
callbacks: [ | ||
(_, {context}) => { | ||
expect(getSecretValueMock).toBeCalled() | ||
getSecretValueMock.mockClear() | ||
} | ||
], | ||
done | ||
}) | ||
}) | ||
test(`It should resolve if "throwOnFailedCall" flag provided but item already cached`, (done) => { | ||
const errorMessage = 'Internal Error / Secret doesn\'t exist' | ||
return testScenario({ | ||
mockResponse: { | ||
SecretString: JSON.stringify({Username: 'username', Password: 'password'}) | ||
}, | ||
middlewareOptions: { | ||
secrets: { | ||
KEY_NAME: 'rds_key' | ||
}, | ||
throwOnFailedCall: true | ||
}, | ||
callbacks: [ | ||
// invocation 1: fetched | ||
(_, {context}) => { | ||
hasRDSLogin(context) | ||
expect(getSecretValueMock).toBeCalled() | ||
getSecretValueMock.mockClear() | ||
// set up next attempt to fail | ||
getSecretValueMock.mockReturnValueOnce({ | ||
promise: () => Promise.reject(new Error(errorMessage)) | ||
}) | ||
}, | ||
// invocation 2: failed but content taken from cache | ||
(_, {context}) => { | ||
hasRDSLogin(context) | ||
expect(getSecretValueMock).toBeCalled() | ||
getSecretValueMock.mockClear() | ||
} | ||
], | ||
done | ||
}) | ||
}) | ||
test(`It should only refresh once per cache expiry window`, (done) => { | ||
@@ -224,0 +311,0 @@ // with cache expiry of 50ms, test what happens when one refresh fails, and |
@@ -7,2 +7,3 @@ let secretsManagerInstance | ||
secrets: {}, // e.g. { RDS_SECRET: 'dev/rds_login', API_SECRET: '...' } | ||
throwOnFailedCall: false, | ||
cache: false, | ||
@@ -61,2 +62,6 @@ cacheExpiryInMillis: undefined, | ||
// when there's temporary problems with Secrets Manager | ||
if (options.throwOnFailedCall && !options.secretsCache) { | ||
throw err | ||
} | ||
if (options.secretsCache) { | ||
@@ -63,0 +68,0 @@ options.secretsLoadedAt = new Date() |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
158484
3987
661