fetch-aws4
Version:
Fetch wrap to add AWS v4 signature to the request
32 lines • 1.18 kB
JavaScript
import aws4 from 'aws4';
const normalizeHeaders = (signedOptions) => {
const normalizedHeaders = {};
for (const key in signedOptions?.headers) {
normalizedHeaders[key] = String(signedOptions?.headers[key]);
}
return normalizedHeaders;
};
export const wrapper = (fetch) => {
return async (url, init) => {
if (!init?.awsCredentials && !process.env.AWS_ACCESS_KEY_ID && !process.env.AWS_SECRET_ACCESS_KEY) {
throw new Error('Credentials not defined.');
}
const parsedUrl = new URL(url.toString());
const match = /([^.]+)\.(?:([^.]*)\.)?amazonaws\.com(\.cn)?$/.exec(parsedUrl.host);
let options = {
...init,
host: parsedUrl.host,
path: parsedUrl.pathname + parsedUrl.search,
};
if (!init?.service && !match) {
options = { ...options, service: 'execute-api' };
}
const signedOptions = aws4.sign(options, init?.awsCredentials);
return fetch(url, {
...signedOptions,
headers: normalizeHeaders(signedOptions),
});
};
};
export default wrapper(fetch);
//# sourceMappingURL=fetch.js.map