1 /* eslint-disable import/no-extraneous-dependencies */
2 /* eslint-disable class-methods-use-this */
3 const AWS
= require('aws-sdk');
5 const MAX_SSM_PARAMETERS_PER_REQUEST
= 10;
8 constructor(secretList
) {
9 this.secretList
= secretList
;
10 Object
.keys(secretList
).forEach((secret
) => {
11 this[secret
] = secretList
[secret
];
15 flattenParameters(params
) {
17 params
.forEach((param
) => {
18 flat
[param
.Name
.replace(/^.+\/(.+)$/, '$1')] = param
.Value
;
24 if (this.initPromise
=== undefined) {
25 this.initPromise
= new Promise((resolve
, reject
) => {
26 const shouldLoadSecretsFromSsm
= !process
.env
.IS_OFFLINE
|| process
.env
.IS_TEST
;
27 if (shouldLoadSecretsFromSsm
) {
28 this.loadSecrets().then(resolve
, reject
);
34 return this.initPromise
;
38 const ssm
= new AWS
.SSM();
39 const secretNames
= Object
.keys(this.secretList
).map(secret
=> process
.env
[secret
]);
41 // Create an array of promises of SSM getparameters requests.
44 while (secretNames
.length
> 0) {
45 const subSet
= secretNames
.splice(0, MAX_SSM_PARAMETERS_PER_REQUEST
);
46 promises
.push(ssm
.getParameters({ Names: subSet
, WithDecryption: true }).promise());
48 return Promise
.all(promises
)
50 const settingsArray
= [];
51 secrets
.forEach((secretSet
) => {
52 settingsArray
.push(...secretSet
.Parameters
);
54 const settings
= this.flattenParameters(settingsArray
);
55 Object
.keys(settings
).forEach((setting
) => {
56 this[setting
] = settings
[setting
];
62 module
.exports
= Secrets
;