middy-rds
Version:
Simple RDS manager for the middy framework
106 lines (102 loc) • 3.14 kB
JavaScript
// clients/pg.js
import { canPrefetch, getInternal, processCache } from "@middy/util";
// lib/iam-token.js
import { Signer } from "@aws-sdk/rds-signer";
var iam_token_default = async (config) => {
const params = {
region: process.env.AWS_REGION ?? process.env.AWS_DEFAULT_REGION,
hostname: config.host ?? config.hostname ?? process.env.DBHOST ?? process.env.PGHOST,
port: Number.parseInt(
config.port ?? process.env.DBPORT ?? process.env.PGPORT
),
username: config.user ?? config.username ?? process.env.DBUSER ?? process.env.PGUSER
};
const client = new Signer(params);
return client.getAuthToken().then((token) => {
if (!token.includes("X-Amz-Security-Token=")) {
throw new Error("X-Amz-Security-Token Missing", {
cause: { package: "middy-rds", data: params }
});
}
return token;
});
};
// lib/ssl.js
import { checkServerIdentity } from "tls";
var ssl_default = {
rejectUnauthorized: true,
ca: void 0,
checkServerIdentity: (host, cert) => {
const error = checkServerIdentity(host, cert);
if (error && !cert.subject.CN.endsWith(".rds.amazonaws.com")) {
return error;
}
}
};
// clients/pg.js
var defaults = {
client: void 0,
config: {},
forceConnection: false,
internalData: void 0,
contextKey: "rds",
disablePrefetch: false,
cacheKey: "rds",
cacheExpiry: 15 * 60 * 1e3 - 1
// IAM token lasts for 15min
};
var defaultConnection = {
application_name: process.env.AWS_LAMBDA_FUNCTION_NAME,
ssl: ssl_default
};
var rdsMiddleware = (opts = {}) => {
const options = { ...defaults, ...opts };
if (!options.client) throw new Error("client option missing");
const fetch = async (request) => {
var _a, _b;
const values = await getInternal(options.internalData, request);
options.config = {
...defaultConnection,
...options.config,
...values,
ssl: { ...defaultConnection.ssl, ...options.config.ssl }
};
(_a = options.config).port ?? (_a.port = Number.parseInt(process.env.PGPORT ?? 5432));
(_b = options.config).password ?? (_b.password = await iam_token_default(options.config));
const Client = options.client;
const pool = new Client(options.config);
options.config.password = void 0;
if (options.forceConnection) {
await pool.query("SELECT 1");
}
return pool;
};
if (canPrefetch(options)) {
processCache(options, fetch);
}
const rdsMiddlewareBefore = async (request) => {
const { value } = processCache(options, fetch, request);
Object.assign(request.context, {
[options.contextKey]: await value
// for transactions, use `client = await pool.connect(); client.release()`
});
};
const rdsMiddlewareAfter = async (request) => {
try {
if (options.cacheExpiry === 0) {
await request.context[options.contextKey].end();
}
} catch (e) {
}
};
const rdsMiddlewareOnError = rdsMiddlewareAfter;
return {
before: rdsMiddlewareBefore,
after: rdsMiddlewareAfter,
onError: rdsMiddlewareOnError
};
};
var pg_default = rdsMiddleware;
export {
pg_default as default
};