Transparent HTTP/2 and HTTP/1.1 Client for Node.js
http2-client is a Node.js library designed to provide a transparent, drop-in replacement for Node's native `http` and `https` modules. It allows applications to make requests that automatically negotiate between HTTP/1.1 and HTTP/2 protocols using ALPN, without requiring changes to the existing `http.request` or `http.get` interfaces. This is particularly useful for integrating HTTP/2 capabilities into older modules or applications that are tightly coupled to the HTTP/1.1 API. The library manages connection pooling for both protocols, ensuring efficient resource utilization. The current stable version is 1.3.5. Based on the provided release history (v1.3.2, v1.3.3), the package appears to have an infrequent release cadence, suggesting a maintenance rather than actively developed status. Key differentiators include its adherence to the standard Node.js `http` module API and automatic protocol detection.
Common errors
-
TypeError: Cannot destructure property 'request' of 'require(...)' as it is undefined.
cause This error typically indicates that `http2-client` was installed or imported incorrectly, or that the Node.js environment has issues resolving the module.fixFirst, ensure `npm install http2-client` was successful. If using a bundler, verify CommonJS modules are correctly handled. If running in an ES module context, consider if `require()` is appropriate or if a different library designed for ESM is needed. -
Error: Protocol "https:" not supported. Expected "http:"
cause While `http2-client` supports HTTPS, this error might occur if an incorrect `protocol` option is explicitly set in the request options, overriding the automatic detection, or if an older Node.js version with limited HTTPS/ALPN capabilities is used.fixRemove explicit `protocol` options if you want the library to automatically handle protocol detection based on the URL. Ensure your Node.js version supports ALPN for HTTPS/2 negotiation (typically Node.js 8.8.1+).
Warnings
- gotcha The package is primarily designed for CommonJS environments. While Node.js itself supports ESM, `http2-client`'s documentation and examples exclusively use `require()`. Attempting direct ES module `import` syntax may lead to runtime errors or require bundler configuration.
- gotcha The README states 'All Http2 features are available except push.' Server push is a core HTTP/2 feature that this client explicitly does not support. Applications relying on HTTP/2 server push will need an alternative solution.
- gotcha The description claims 'it's the only http2/https compatible API for clients.' This claim is likely outdated given the evolution of Node.js's native HTTP/2 support, the introduction of `fetch` in Node.js, and other modern HTTP client libraries. Relying on this package as the *only* option might miss more current and actively maintained alternatives.
- gotcha The library automatically falls back to HTTP/1.1 if the Node.js version doesn't support HTTP/2. While convenient, this might mask underlying environment issues or unexpected performance characteristics if HTTP/2 was expected but not achieved.
Install
-
npm install http2-client -
yarn add http2-client -
pnpm add http2-client
Imports
- request
import { request } from 'http2-client';const { request } = require('http2-client'); - get
import get from 'http2-client';
const { get } = require('http2-client'); - HttpRequestManager
new http2Client.HttpRequestManager();
const { HttpRequestManager } = require('http2-client');
Quickstart
const { request } = require('http2-client');
const h1Target = 'http://www.example.com/';
const h2Target = 'https://www.google.com/'; // Using google as example.com might not support h2
console.log('Making HTTP/1.1 request...');
const req1 = request(h1Target, (res) => {
console.log(`\nUrl : ${h1Target}\nStatus : ${res.statusCode}\nHttpVersion : ${res.httpVersion}`);
res.on('data', () => {}); // Consume response data
res.on('end', () => console.log('HTTP/1.1 request ended.'));
});
req1.on('error', (e) => console.error(`HTTP/1.1 request error: ${e.message}`));
req1.end();
console.log('\nMaking HTTP/2 request...');
const req2 = request(h2Target, (res) => {
console.log(`\nUrl : ${h2Target}\nStatus : ${res.statusCode}\nHttpVersion : ${res.httpVersion}`);
res.on('data', () => {}); // Consume response data
res.on('end', () => console.log('HTTP/2 request ended.'));
});
req2.on('error', (e) => console.error(`HTTP/2 request error: ${e.message}`));
req2.end();