rpc-request
v8.0.0
Published
A simple wrapper of the Fetch API in a class (based on undici)
Downloads
22,507
Readme
rpc-request
rpc-request
is a simple wrapper of the Fetch API (based on undici) in a class.
Installation
npm install rpc-request
Usage
The Fetch
class accepts all parameters from RequestInit
plus the following
import { Fetch } from "rpc-request";
// 1. Transform the response by default
const transform = "json";
// 2. Base url for the `.fetch()` method
const base_url = new URL("http://worldtimeapi.org/");
// 3. Throws an error when `response.ok !== true`
const reject = true;
// Plus anything from `RequestInit`
const headers = { "X-TOKEN": "123" };
const client = new Fetch({ transform, base_url, reject, headers });
const response = await client.get("/api/ip");
One can easily extend it
import { Fetch } from "rpc-request";
interface IResponse1 {
bar: "bar";
}
interface IResponse2 {
foo: "foo";
}
class CustomFetch extends Fetch {
public constructor() {
super({
transform: "json",
base_url: new URL("http://www.example.com/api/v1/"),
});
}
public post<T = unknown>(
path: string,
body: Record<string, unknown> = {},
): Promise<T> {
return super.post<T>(path, {
body: JSON.stringify(body),
headers: { "Content-Type": "application/json" },
});
}
public getFoo(): Promise<IResponse1> {
return this.get<IResponse1>("/get");
}
public getBar(id: string): Promise<IResponse2> {
return this.post<IResponse2>("/post", { id });
}
}
fetch
The basic method
import { Fetch } from "rpc-request";
interface Ip {
client_ip: string;
timezone: string;
}
const base_url = new URL("http://worldtimeapi.org/api/");
const client = new Fetch({ base_url, transform: "json" });
const { client_ip, timezone } = await client.fetch<Ip>("ip");
HTTP methods.
get
interface Info {
data: string;
headers: Record<string, string | undefined>;
}
const base_url = "https://httpbin.org/";
const client = new Fetch({ transform: "json", base_url });
const { data, headers } = await client.get<Info>("anything");
post
const base_url = "https://httpbin.org/";
const client = new Fetch({
base_url,
body: JSON.stringify({ data: "Hello World!" }),
transform: "text",
});
const string = await client.post<string>("anything");
console.log(typeof string === "string");
put
const base_url = "https://httpbin.org/";
const client = new Fetch({
base_url,
body: JSON.stringify({ data: "Hello World!" }),
transform: "buffer",
reject: true,
});
const buffer = await client.put<ArrayBuffer>("anything");
console.log(buffer instanceof ArrayBuffer);
patch
import { Blob } from "node:buffer";
const base_url = "https://httpbin.org/";
const client = new Fetch({
base_url,
body: JSON.stringify({ data: "Hello World!" }),
transform: "blob",
});
const blob = await client.patch("anything");
console.log(blob instanceof Blob);
delete
const base_url = "https://httpbin.org/";
const client = new Fetch({
base_url,
body: JSON.stringify({ data: "Hello World!" }),
transform: "buffer",
reject: true,
});
const buffer = await client.delete<Buffer>("anything");
console.log(buffer instanceof Buffer);
head
const base_url = "https://httpbin.org/";
const client = new Fetch({ transform: "json", base_url });
const response = await client.head("/anything");
options
const client = new Fetch({ base_url: "https://httpbin.org/" });
const response = await client.options("/anything");