UNPKG

@graphql-hive/plugin-aws-sigv4

Version:
86 lines (80 loc) 3.3 kB
'use strict'; 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;