smithy-node-native-fetch
v1.2.1
Published
Node 18+ optimized native fetch handler for Smithy clients (like AWS SDK)
Downloads
90
Readme
smithy-node-native-fetch
Node.js 18+ optimized native fetch support for Smithy clients like AWS SDK v3
Why
Smithy (and so AWS SDK) provides fetch
request handler only for browsers with a lot of compatibility workarounds and yet it doesn't work in modern Node.js runtimes with native global fetch
and web streams support.
Node 18+ fetch
is based on undici which benchmarks as top performing HTTP/1.1 client for Node. In additional, using native fetch
with AWS SDK allows to prepare to the moment when in Node.js response.Body
may be a standard web stream also.
This handler also allows you to use modern request mocking tooling such as msw 2.x or undici global dispatcher (see tests for this module).
Usage
Simplest way with default settings (keepAlive is enabled and no timeout set) is as below:
import { S3Client } from "@aws-sdk/client-s3";
import * as nodeNativeFetch from "smithy-node-native-fetch";
const s3 = new S3Client({
retryMode: "adaptive", // or whatever else settings
...nodeNativeFetch,
});
If you want to customize settings then use specific imports:
import { S3Client } from "@aws-sdk/client-s3";
import {
sdkStreamMixin,
streamCollector,
NodeNativeFetchHttpHandler,
} from "./fetch-http-handler";
const s3 = new S3Client({
retryMode: "adaptive", // or whatever else settings
requestHandler: new NodeNativeFetchHttpHandler({
requestTimeout: 5000, // default is no timeout
keepAlive: true, // default is false
}),
sdkStreamMixin,
streamCollector,
});
Usage with CDK / Lambda
This modules also provides two small AWS CDK construct to simplify it's usage on AWS Lambda:
SmithyNodeNativeFetchLayer
- deploys lambda layer with this moduleSmithyNodeNativeAspect
- an Aspect that deploys a singleton lambda layer and automatically add it to all supported lambda in a scope.
Use is as below:
import * as cdk from "aws-cdk-lib";
import { SmithyNodeNativeAspect } from "smithy-node-native-fetch/cdk";
const app = new cdk.App();
cdk.Aspects.of(app).add(new SmithyNodeNativeAspect());