
blazed.js
Blazing fast, light weight, high performance, promise based HTTP and DNS client for the Node
Features
- Fast and Efficient: Optimized for minimal CPU usage while delivering rapid, well-formatted results.
- Promise-Based: Leverages JavaScript promises for seamless asynchronous handling.
- Minimalistic Design: Offers a straightforward API for effortless integration.
- User-Friendly: Intuitive interface that simplifies the development process.
Installation
To get started with blazed.js, simply run the following command in your terminal:
npm installation command:
$ npm i blazed.js
yarn installation command:
$ yarn add blazed.js
Info
New to Promises?
If you're not familiar with promises, check out the MDN documentation to learn more.
Advanced HTTP Requests Made Easy
With blazed.js, you can send advanced HTTP requests directly from your Node.js app, featuring automatic JSON parsing and more.
Built on Top of Node.js HTTP library
Under the hood, blazed.js leverages the built-in HTTP library in Node.js, ensuring a seamless and efficient experience.
Getting started
First, require this library to your project as follows:
const blazed = require("blazed.js");
If it's an ES Module then import it to your project as follows:
import blazed from "blazed.js";
GET Request
Once you've imported blazed.js into your project, you're ready to send your first GET request.
Here's a simple example to get you started:
Note that our examples will mostly use .then and .catch blocks, but you can also use async-await syntax as an alternative.
const headers = { };
const url = 'https://jsonplaceholder.typicode.com/posts/1';
blazed.get(url, headers)
.then(response => {
console.log(response);
})
.catch(error => {
console.error(error);
});
It's actually quite similar to the native fetch api, node-fetch and axios
Point to be noted
The response object returned by any request, regardless of the HTTP method, has the following structure:
{
"data": string,
"status": number,
"statusText": string,
"transferSpeed": string,
"responseSize": string,
"responseHeaders": object,
"requestHeaders": object
}
When logging the response, you can access these properties as follows:
response.data: Server response data
response.duration: Total duration of the request (in ms)
response.status: Status code of the response
response.statusText: Status text of the status code received from the server
response.responseHeaders: All response headers
response.requestHeaders: All request headers
response.responseSize: Server response buffer size (formatted)
response.transferSpeed: Transfer speed of data (formatted)
POST Request
To send a POST request with blazed.js, you need to provide data to be sent in the request body.
Here's how you can achieve this:
const postData = {
title: 'foo',
body: 'bar',
userId: 1
};
const headers = { }
const url = 'https://jsonplaceholder.typicode.com/posts';
blazed.post(url, postData, headers)
.then(response => {
console.log(response);
})
.catch(error => {
console.error(error);
});
DELETE Request
The DELETE request is similar to the GET request, but instead, you'll use the blazed.delete() method to send a DELETE request to the server.
Here's a simple example:
const headers = { };
const url = 'https://jsonplaceholder.typicode.com/posts/1';
blazed.delete(url, headers)
.then(response => {
console.log(response);
})
.catch(error => {
console.error(error);
});
HTTP Method Support
blazed.js supports a range of HTTP methods, including TRACE, OPTIONS, HEAD, PATCH, and more.
Some examples regarding them are as follows:-
PUT request
Example demonstrating PUT request:
const putData = {
title: 'foo',
body: 'bar',
userId: 1
};
const headers = { }
const url = 'https://jsonplaceholder.typicode.com/posts';
blazed.put(url, putData, headers)
.then(response => {
console.log(response);
})
.catch(error => {
console.error(error);
});
PATCH request
Example demonstrating PATCH request:
const patchData = { };
const headers = { };
const url = 'https://example.com/api/resource';
blazed.patch(url, patchData, headers)
.then(response => {
console.log(response);
})
.catch(error => {
console.error(error);
});
HEAD Request
Example demonstrating HEAD request:
const headers = { };
const url = 'https://example.com/api/resource';
blazed.head(url, headers)
.then(response => {
console.log(response);
})
.catch(error => {
console.error(error);
});
OPTIONS request
Example demonstrating OPTIONS request:
const headers = { };
const url = 'https://example.com/api/resource';
blazed.options(url, headers)
.then(response => {
console.log(response);
})
.catch(error => {
console.error(error);
});
CONNECT Request
Example demonstrating CONNECT request:
const headers = { };
const url = 'https://example.com/api/resource';
blazed.connect(url, headers)
.then(response => {
console.log(response);
})
.catch(error => {
console.error(error);
});
Important Note: The CONNECT request behaves differently than standard HTTP requests like GET, POST, etc.
Its primary purpose is to establish a tunnel to the server.
When logging the response.data property of a CONNECT request, you'll receive a connection info object instead of the typical response data
The object has the following structure:
{
message: string,
protocol: string,
remoteAddress: string,
remotePort: number,
localAddress: string,
localFamily: string,
localPort: number
}
When logging the connection info object, you can access these properties as follows:
response.data.message: A success message indicating that the connection has been established.
response.data.protocol: The protocol used in the server's URL (e.g., http, https, etc.).
response.data.remoteAddress: The server's remote IP address.
response.data.remotePort: The remote port number used by the server.
response.data.localAddress: The IP address of the local machine.
response.data.localFamily: The address family of the local machine (e.g. "IPv4" or "IPv6").
response.data.localPort: The port number used by the local machine.
TRACE request
Example demonstrating TRACE request:
const headers = { };
const url = 'https://example.com/api/resource';
blazed.trace(url, headers)
.then(response => {
console.log(response);
})
.catch(error => {
console.error(error);
});
Other custom HTTP methods
blazed.js also provides you with the ability to perform custom HTTP requests with all the valid HTTP methods that Node.js's built-in HTTP module supports by default including but not limiting to GET, POST, PUT, TRACE, etc. requests.
To get started, simply call the blazed.request function in your code and take advantage of flexible and customizable request handling!
Please note when a method is not specified, blazed.js defaults to a GET request
Heres a simple example demonstrating a GET HTTP request method using the blazed.request() function:
blazed.request({
url: "https://httpbin.org/anything",
method: "GET",
headers: {},
body: null,
timeout: 5000,
signal: null,
limit: 5,
params: { q: "hello", tags: ["a","b"], meta: { x: 1 } }
})
.then(response => {
return console.log(response);
})
.catch(err => {
return console.error(err);
})
Configuring default settings
blazed.js also provides an way of configuring some default options before making an HTTP request.
For that you need to use the blazed.config() method to achieve this.
Here's a basic usage example:
blazed.configure({
'Keep-Alive': true,
'Serverless': false,
'Default-URL': "https://api.github.com/users",
'JSON-Parser': true,
headers: {
'User-Agent': false,
'X-Requested-With': false
}
})
blazed.get()
.then(res => console.log(res))
.catch(err => console.error(err));
The above function will throw an error if the values aren't boolean ,i.e, true/false.
Fetch Api
blazed.js provides a Fetch API compatible with the browser’s native fetch() (and Node.js / undici), allowing you to make HTTP requests using the same familiar interface.
You can use it via the blazed.fetch() function.
Basic Example
const { fetch } = blazed;
const url = "https://httpbin.org/anything";
const response = await fetch(url);
console.log("Status:", response.status);
console.log("Status Text:", response.statusText);
console.log("Headers:", response.headers);
const data = await response.json();
console.log("Data:", data);
Trace Redirects
blazed.js provides a powerful trace_redirects utility that allows you to follow a URL's redirect path (hop-by-hop), providing status codes, timing, and resolved IP addresses for every step.
blazed.trace_redirects("https://bit.ly/Wa-Dm", {
headers: {
'X-Method-From': 'blazed.js_trace_redirects',
},
limit: 50,
timeout: 8000,
})
.then(hops => {
console.table(hops)
})
.catch(error => {
console.error(error);
})
Creating Custom Instances
blazed.js allows you to create isolated instances with their own default configuration.
Each instance object contains the following 👇
{
"baseURL": string,
"timeout": number,
"headers": object,
}
This is useful when working with multiple APIs or different configurations in the same application.
Creating an Instance
Use blazed.createInstance() to create a new instance:
const postData = {
title: 'foo',
body: 'bar',
userId: 1
};
const api = blazed.createInstance({
baseURL: 'https://jsonplaceholder.typicode.com',
timeout: 8000,
headers: {
'Content-Type': 'application/json'
}
});
Making Requests with an instance
Once created, the instance supports all HTTP methods just like the main blazed.js object.
api.post("/posts", postData)
.then(res => {
console.log(res);
})
.catch(err => {
console.error(err);
});
Instance Fetch API
In addition to the global blazed.fetch(), each custom instance created with blazed.createInstance() also provides its own Fetch API.
This allows you to use a browser-compatible fetch() with instance-specific defaults such as baseURL, headers, and timeout.
This is ideal when working with multiple APIs, different authentication tokens, or isolated configurations in the same application.
Creating an Instance with Fetch
const api = blazed.createInstance({
baseURL: "https://jsonplaceholder.typicode.com",
timeout: 8000,
headers: {
"Content-Type": "application/json"
}
});
Using instance.fetch()
The instance exposes a fetch() method that follows the standard Fetch API specification (browser / undici compatible).
const response = await api.fetch("/posts/1");
console.log("Status:", response.status);
console.log("OK:", response.ok);
const data = await response.json();
console.log("Data:", data);
Because a baseURL is defined, relative paths like "/posts/1" are automatically resolved to: https://jsonplaceholder.typicode.com/posts/1
Fetch with Options
You can pass the same options you would normally pass to fetch():
const response = await api.fetch("/posts", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_TOKEN"
},
body: JSON.stringify({
title: "foo",
body: "bar",
userId: 1
})
});
const result = await response.json();
console.log(result);
Handling HTTP Errors
Like the native Fetch API, the promise only rejects on network errors.
For HTTP errors (e.g., 404, 500), you must check response.ok:
const response = await api.fetch("/invalid-endpoint");
if (!response.ok) {
throw new Error(`HTTP Error: ${response.status}`);
}
Redirect Behavior
instance.fetch() supports standard Fetch redirect modes:
await api.fetch("/redirect", {
redirect: "follow"
});
You can also configure redirect limits internally using instance options when supported.
Why Use instance.fetch()?
Using createInstance().fetch() gives you:
-
Scoped configuration (base URL, headers, timeout)
-
Browser-compatible Fetch API
-
Undici-style behavior for Node.js
-
Cleaner code for multi-API projects
Instead of repeating config:
await blazed.fetch("https://api.example.com/users", { headers: {...} });
You can simply write:
const api = blazed.createInstance({ baseURL: "https://api.example.com" });
await api.fetch("/users");
HTTP Request Cancellation
blazed.js supports convenient cancellation of ongoing HTTP requests in two ways:
-
Internal cancellation with reason using blazed.cancel() – this will immediately abort the currently running request.
-
External cancellation by passing your own AbortSignal via the signal option in the request object. This allows fine-grained control, such as timeout-based or user-triggered cancellations.
Internal cancellation example:
blazed.request({
url: "https://jsonplaceholder.typicode.com/posts/1",
method: "GET",
signal: null,
})
.then(res => {
console.log(`This request will be aborted!`);
console.log(res);
})
.catch(err => {
console.error(`This error has occured due to the request being cancelled!`)
console.error(err);
})
blazed.cancel("Test reason for cancellation");
console.log("The ongoing request has been cancelled.");
External cancellation example:
const controller = new AbortController();
setTimeout(() => controller.abort(), 3000);
blazed.request({
url: "https://httpbin.org/delay/10",
method: "GET",
signal: controller.signal,
})
.then(res => {
console.log("Request succeeded:", res);
})
.catch(err => {
if (err.name === 'AbortError') {
console.log("Request was cancelled due to timeout.");
} else {
console.error("An error occurred:", err);
}
});
Notes
-
blazed.fetch() follows the standard Fetch API specification, just like in modern browsers.
-
The API is compatible with Node.js (undici-style fetch), making your code cross-platform.
-
Like native fetch, the promise only rejects on network errors.
For HTTP errors (e.g., 404, 500), you should check response.ok.
Handling HTTP errors
const url = "https://httpbin.org/anything";
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP Error: ${response.status}`);
}
URL Parsing
The blazed.parse_url() function can be used to parse a URL.
Simply pass the URL as a parameter to this function.
Here's an simple example with .then() and .catch() statements
const blazed = require('blazed.js');
blazed.parse_url('https://example.com:3000/path?a=1&b=2')
.then((url) => {
console.log(url);
})
.catch((err) => {
console.error(err);
});
After running this code, the parsed URL values will be logged to the console.
File Paths Parsing
1. File URL → Path
The blazed.path_to_file_url() function converts a file URL into an absolute file system path.
Simply pass a valid file:// URL as a parameter, and it will return a Promise resolving to the corresponding file path.
Here's an simple example with .then() and .catch() statements
const blazed = require('blazed.js');
blazed.file_url_to_path(`file:///${__dirname}`)
.then((data) => {
console.log(data);
})
.catch((err) => {
console.error(err);
});
After running this code, the resolved file path will be logged to the console.
2. Path → File URL
The blazed.path_to_file_url() function converts a local file system path into a file URL (file:// format).
Simply pass an absolute or relative file path as a parameter, and it will return a Promise resolving to the corresponding file URL.
Here's an simple example with .then() and .catch() statements
const blazed = require('blazed.js');
blazed.path_to_file_url(`/some/foo.txt`)
.then(result => {
console.log(result);
})
.catch(err => {
console.error(err);
});
If an error occurs (for example, an invalid URL), the catch block will handle it and print the error.
Alternatively, you can use async/await syntax for more concise and readable code.
Events
blazed.js provides a range of events that are triggered regardless of the HTTP method used, allowing you to tap into the request lifecycle.
There are three key events that occur at different stages of the request process:
beforeRequest: Fired before sending an HTTP request, this event returns a callback with two parameters: url and options.
afterRequest: Triggered after the HTTP request's response has finished, this event returns a callback with two parameters: url and response.
redirect: Fired when blazed.js encounters a redirect, this event returns a callback with a single parameter object, which contains information about the redirect event.
request: Fired when blazed.js sends the HTTP request, this event returns a callback with one parameter: request. Which contains the request object.
response: Fired when blazed.js recieves a response from the connected server. This event returns a callback with one parameter: response. Which contains an response object(Not the one provided by the initial response object).
You can listen to these events using the blazed.on() function.
Here are some few examples:
blazed.on("beforeRequest", (url, options) => {
console.log(`Before request event fired for ${url}`);
console.log("Request options:");
console.log(options);
});
blazed.get("https://api.github.com/users")
.then((res) => {
console.log("GET request successful:");
console.log(res);
})
.catch((err) => {
console.error("Error making GET request:");
console.error(err);
});
blazed.on("afterRequest", (url, response) => {
console.log(`After request event fired for ${url}`);
console.log(response);
});
blazed.get("https://api.github.com/users")
.then((res) => {
console.log("GET request successful:");
console.log(res);
})
.catch((err) => {
console.error("Error making GET request:");
console.error(err);
});
blazed.on("redirect", (redirectInfo) => {
console.log(`Redirect event fired from ${redirectInfo.OriginalURL} to ${redirectInfo.RedirectURL}`);
console.log("Redirect details:");
console.log(redirectInfo);
});
blazed.get("http://api.github.com/users")
.then((res) => {
console.log("GET request successful:");
console.log(res);
})
.catch((err) => {
console.error("Error making GET request:");
console.error(err);
});
blazed.on("request", (req) => {
console.log(req)
});
blazed.get("https://api.github.com/users")
.then((res) => {
console.log("GET request successful:");
console.log(res);
})
.catch((err) => {
console.error("Error making GET request:");
console.error(err);
});
const writeStream = fs.createWriteStream("response.txt", "utf-8");
blazed.on("response", (res) => {
console.log(res);
res.pipe(writeStream);
});
blazed.get("https://api.github.com/users")
.then((res) => {
console.log("GET request successful:");
console.log(res);
})
.catch((err) => {
console.error("Error making GET request:");
console.error(err);
});
Stay up-to-date with our project for upcoming features and enhancements, including additional events that will be introduced in future releases.
DNS
DNS resolving
In addition to making HTTP requests, blazed.js also provides an asynchronous way to resolve the DNS of various hostnames.
You can use the blazed.resolve() method to achieve this. It returns a promise that resolves with an IP object containing the resolved IP addresses and its format.
The object has the following structre:
{
Format: string,
Addresses: Array,
}
Accessing IP Object Properties
When logging the IP object, you can access its properties as follows (assuming the object is named ipObj):
ipObj.format: The IP address format (e.g., 'IPv4' or 'IPv6').
ipObj.addresses: The resolved IP addresses of the host.
Example demonstrating DNS resolving:
blazed.resolve_dns({
format: "IPv4",
url: "https://www.google.com"
})
.then(ipObj => {
return console.log(ipObj);
})
.catch(err => {
return console.error(err);
});
blazed.resolve_dns({
url: "https://www.google.com"
})
.then(ipObj => {
return console.log(ipObj);
})
.catch(err => {
return console.error(err);
});
DNS reverse lookup
blazed.js also provides an asynchronous way to perform a reverse DNS query that resolves an IPv4 or IPv6 address to an array of host names.
You can use the blazed.reverse_dns() method to achieve this. It returns a promise that resolves with an Array containing the resolved host names of the respective ip address.
Example demonstrating reverse DNS lookup query:
const ip = "8.8.8.8";
blazed.reverse_dns(ip)
.then((result) => {
console.log(result);
})
.catch((err) => {
console.error(err);
});
Underlying Technology
This feature is built on top of Node.js's built-in dns module, which provides an asynchronous network wrapper for performing DNS lookups.
For more information about the dns module, please refer to the official Node.js documentation.
Validating Header Names and Values
In addition to sending requests, you can also validate header names and values using the blazed.validateHeaderName() and blazed.validateHeaderValue() functions.
Use blazed.validateHeaderName() to validate a header name. This method returns a promise that:
- Resolves with
true if the header name is valid.
- Rejects with an error if the header name is invalid.
Here's a simple example with .then and .catch statements -
const headerName = "x-my-header";
blazed.validateHeaderName(headerName)
.then((data) => {
console.log(data);
})
.catch((err) => {
console.error(err);
});
So here we can see true getting printed in the console
Let's rename the headerName to something like abc xyz
const headerName = "abc xyz";
blazed.validateHeaderName(headerName)
.then((validHeader) => {
if (!validHeader) {
console.log(`Header name '${headerName}' is invalid`);
} else {
console.log(`Header name '${headerName}' is valid`);
}
})
.catch((error) => {
console.error(error);
});
We will get the follwing error:
TypeError: Header name must be a valid HTTP token! Recieved token: ["abc xyz"]
Use blazed.validateHeaderValue() to validate a header value. This method returns a promise that:
- Resolves with an object containing the
name and value of the header if parsing is successful.
- Rejects with an error if parsing fails.
Here's a simple example with async and await statements for cleaner code and readability -
const HEADER_NAME = "x-my-header";
const HEADER_VALUE = "blazed.js";
try {
const isValidHeader = await blazed.validateHeaderName(HEADER_NAME);
if (isValidHeader) {
const parsedHeader = await blazed.validateHeaderValue(HEADER_NAME, HEADER_VALUE);
console.log(parsedHeader);
} else {
console.log(`Invalid header name: ${HEADER_NAME}`);
}
} catch (error) {
console.error(`Error processing header: ${error}`);
}
Run your script using node your-script.js.
If everything is set up correctly, you should see the following output in your console:
{ name: 'x-my-header', value: 'blazed.js' }
Error Handling
Robust Error Handling in blazed.js
blazed.js boasts advanced error handling capabilities, detecting a wide range of errors, including:
- Timeout
- Abort
- Network down
- Host unreachable
- Host down
Notably, if the response from the server or URL is null (i.e., empty), the promise is rejected, and an error is thrown with the code ERESNULL, accompanied by a descriptive error message.
To catch and handle errors as needed, use a try-catch block.
STATUS_CODES
Get an object contaning all valid HTTP status codes with blazed.STATUS_CODES.
console.log(blazed.STATUS_CODES);
METHODS
The blazed.METHODS property returns an array of all supported HTTP request methods, providing a convenient way to access the full range of valid methods.
console.log(blazed.METHODS);
ABOUT
Get package information as an object with blazed.ABOUT property.
console.log(blazed.ABOUT);
LICENSE
blazed.js is released under the MIT License.
View the full license terms here.
Bugs & Issues
Found a bug or want a new feature?
Report issues and request features on the blazed.js issue tracker.
Thanks for reading!
Have a great day ahead :D