@graphql-hive/plugin-aws-sigv4
Version:
86 lines (80 loc) • 3.3 kB
JavaScript
;
var clientSts = require('@aws-sdk/client-sts');
var fusionRuntime = require('@graphql-mesh/fusion-runtime');
var aws4 = require('aws4');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var aws4__default = /*#__PURE__*/_interopDefault(aws4);
function isBufferOrString(body) {
return typeof body === "string" || globalThis.Buffer?.isBuffer(body);
}
function useAWSSigv4(opts) {
const optionsFactory = typeof opts === "function" ? opts : () => opts || true;
return {
async onFetch({ url, options, setURL, setOptions, executionRequest }) {
const subgraphName = executionRequest && fusionRuntime.subgraphNameByExecutionRequest.get(executionRequest);
if (!isBufferOrString(options.body)) {
return;
}
const factoryResult = optionsFactory({ url, options, subgraphName });
if (factoryResult === false) {
return;
}
let signQuery = false;
let accessKeyId = process.env["AWS_ACCESS_KEY_ID"] || process.env["AWS_ACCESS_KEY"];
let secretAccessKey = process.env["AWS_SECRET_ACCESS_KEY"] || process.env["AWS_SECRET_KEY"];
let sessionToken = process.env["AWS_SESSION_TOKEN"];
let service;
let region;
let roleArn = process.env["AWS_ROLE_ARN"];
let roleSessionName = process.env["AWS_IAM_ROLE_SESSION_NAME"];
if (typeof factoryResult === "object" && factoryResult != null) {
signQuery = factoryResult.signQuery || false;
accessKeyId = factoryResult.accessKeyId || process.env["AWS_ACCESS_KEY_ID"] || process.env["AWS_ACCESS_KEY"];
secretAccessKey = factoryResult.secretAccessKey || process.env["AWS_SECRET_ACCESS_KEY"] || process.env["AWS_SECRET_KEY"];
sessionToken = factoryResult.sessionToken || process.env["AWS_SESSION_TOKEN"];
roleArn = factoryResult.roleArn;
roleSessionName = factoryResult.roleSessionName || process.env["AWS_IAM_ROLE_SESSION_NAME"];
service = factoryResult.serviceName;
region = factoryResult.region;
}
if (roleArn && roleSessionName) {
const sts = new clientSts.STS({
region
});
const { Credentials } = await sts.assumeRole({
RoleArn: roleArn,
RoleSessionName: roleSessionName
});
accessKeyId = Credentials?.AccessKeyId || accessKeyId;
secretAccessKey = Credentials?.SecretAccessKey || secretAccessKey;
sessionToken = Credentials?.SessionToken || sessionToken;
}
const parsedUrl = new URL(url);
const aws4Request = {
host: parsedUrl.host,
method: options.method,
path: `${parsedUrl.pathname}${parsedUrl.search}`,
body: options.body,
headers: options.headers,
signQuery,
service,
region
};
const modifiedAws4Request = aws4__default.default.sign(aws4Request, {
accessKeyId,
secretAccessKey,
sessionToken
});
setURL(
`${parsedUrl.protocol}//${modifiedAws4Request.host}${modifiedAws4Request.path}`
);
setOptions({
...options,
method: modifiedAws4Request.method,
headers: modifiedAws4Request.headers,
body: modifiedAws4Request.body
});
}
};
}
exports.useAWSSigv4 = useAWSSigv4;