https://github.com/tinovyatkin/smithy-node-native-fetch
Node.js 18+ optimized native fetch support for Smithy clients like AWS SDK v3
https://github.com/tinovyatkin/smithy-node-native-fetch
aws fetch nodejs smithy
Last synced: 10 months ago
JSON representation
Node.js 18+ optimized native fetch support for Smithy clients like AWS SDK v3
- Host: GitHub
- URL: https://github.com/tinovyatkin/smithy-node-native-fetch
- Owner: tinovyatkin
- License: apache-2.0
- Created: 2023-12-29T12:48:01.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2025-09-10T02:49:07.000Z (10 months ago)
- Last Synced: 2025-09-10T05:55:14.960Z (10 months ago)
- Topics: aws, fetch, nodejs, smithy
- Language: JavaScript
- Homepage:
- Size: 3.1 MB
- Stars: 2
- Watchers: 2
- Forks: 0
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# smithy-node-native-fetch [](https://codecov.io/gh/tinovyatkin/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](https://undici.nodejs.org/#/) 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](https://mswjs.io/) or [undici global dispatcher](https://undici.nodejs.org/#/docs/api/MockAgent) (see tests for this module).
## Usage
Simplest way with default settings (keepAlive is enabled and no timeout set) is as below:
```ts
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:
```ts
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 module
- `SmithyNodeNativeAspect` - an Aspect that deploys a singleton lambda layer and automatically add it to all supported lambda in a scope.
Use is as below:
```ts
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());
```