Skip to content

Commit 5eb3a77

Browse files
add request options to constructor
1 parent 43c0b13 commit 5eb3a77

2 files changed

Lines changed: 94 additions & 135 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "mcutils-js-api",
3-
"version": "2.0.36",
3+
"version": "2.0.37",
44
"module": "dist/index.js",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",

src/index.ts

Lines changed: 93 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,42 @@ import { StatisticsResponse } from "./types/response/statistics-response";
1212
import { Skin } from "./types/player/skin/skin";
1313
import { Page } from "./types/pagination/pagination";
1414

15+
type RequestOptions = RequestInit & { responseType?: "json" | "arrayBuffer" };
16+
1517
export class McUtilsAPI {
1618
private readonly endpoint: string;
19+
private readonly fetchOptions?: RequestInit;
1720

18-
constructor(endpoint: string = "https://mc.fascinated.cc/api") {
21+
constructor(
22+
endpoint: string = "https://mc.fascinated.cc/api",
23+
fetchOptions?: RequestInit
24+
) {
1925
this.endpoint = endpoint;
26+
this.fetchOptions = fetchOptions;
27+
}
28+
29+
/**
30+
* Requests data from the API.
31+
*
32+
* @param path the path to the API endpoint
33+
* @param options the options for the request
34+
* @returns the data or the error (if one occurred)
35+
*/
36+
private async request<T>(
37+
path: string,
38+
options?: RequestOptions
39+
): Promise<{ data?: T; error?: ErrorResponse }> {
40+
const { responseType = "json", ...init } = options ?? {};
41+
const url = path.startsWith("http") ? path : `${this.endpoint}${path}`;
42+
const response = await fetch(url, { ...this.fetchOptions, ...init });
43+
44+
if (!response.ok) {
45+
return { error: (await response.json()) as ErrorResponse };
46+
}
47+
48+
const data =
49+
responseType === "arrayBuffer" ? await response.arrayBuffer() : await response.json();
50+
return { data: data as T };
2051
}
2152

2253
/**
@@ -41,15 +72,10 @@ export class McUtilsAPI {
4172
host: string,
4273
type: ServerPlatform
4374
): Promise<{ server?: JavaServer | BedrockServer; error?: ErrorResponse }> {
44-
const response = await fetch(`${this.endpoint}/servers/${type}/${host}`);
45-
if (response.ok) {
46-
return {
47-
server: (await response.json()) as JavaServer | BedrockServer,
48-
};
49-
}
50-
return {
51-
error: (await response.json()) as ErrorResponse,
52-
};
75+
const { data, error } = await this.request<JavaServer | BedrockServer>(
76+
`/servers/${type}/${host}`
77+
);
78+
return error ? { error } : { server: data };
5379
}
5480

5581
/**
@@ -61,15 +87,8 @@ export class McUtilsAPI {
6187
async fetchJavaServer(
6288
host: string
6389
): Promise<{ server?: JavaServer; error?: ErrorResponse }> {
64-
const response = await fetch(`${this.endpoint}/servers/java/${host}`);
65-
if (response.ok) {
66-
return {
67-
server: (await response.json()) as JavaServer,
68-
};
69-
}
70-
return {
71-
error: (await response.json()) as ErrorResponse,
72-
};
90+
const { data, error } = await this.request<JavaServer>(`/servers/java/${host}`);
91+
return error ? { error } : { server: data };
7392
}
7493

7594
/**
@@ -81,15 +100,10 @@ export class McUtilsAPI {
81100
async fetchBedrockServer(
82101
host: string
83102
): Promise<{ server?: BedrockServer; error?: ErrorResponse }> {
84-
const response = await fetch(`${this.endpoint}/servers/bedrock/${host}`);
85-
if (response.ok) {
86-
return {
87-
server: (await response.json()) as BedrockServer,
88-
};
89-
}
90-
return {
91-
error: (await response.json()) as ErrorResponse,
92-
};
103+
const { data, error } = await this.request<BedrockServer>(
104+
`/servers/bedrock/${host}`
105+
);
106+
return error ? { error } : { server: data };
93107
}
94108

95109
/**
@@ -101,14 +115,11 @@ export class McUtilsAPI {
101115
async fetchServerBlocked(
102116
host: string
103117
): Promise<{ blocked?: boolean; error?: ErrorResponse }> {
104-
const response = await fetch(`${this.endpoint}/servers/blocked/${host}`);
105-
if (response.ok) {
106-
const json = (await response.json()) as ServerBlockedResponse;
107-
return { blocked: json.blocked };
108-
}
109-
return {
110-
error: (await response.json()) as ErrorResponse,
111-
};
118+
const { data, error } = await this.request<ServerBlockedResponse>(
119+
`/servers/blocked/${host}`
120+
);
121+
if (error) return { error };
122+
return { blocked: data!.blocked };
112123
}
113124

114125
/**
@@ -120,13 +131,7 @@ export class McUtilsAPI {
120131
async fetchIpLookup(
121132
query: string
122133
): Promise<{ data?: IpLookup; error?: ErrorResponse }> {
123-
const response = await fetch(`${this.endpoint}/ips/${query}`);
124-
if (response.ok) {
125-
return { data: (await response.json()) as IpLookup };
126-
}
127-
return {
128-
error: (await response.json()) as ErrorResponse,
129-
};
134+
return this.request<IpLookup>(`/ips/${query}`);
130135
}
131136

132137
/**
@@ -138,15 +143,8 @@ export class McUtilsAPI {
138143
async fetchPlayer(
139144
id: string
140145
): Promise<{ player?: Player; error?: ErrorResponse }> {
141-
const response = await fetch(`${this.endpoint}/players/${id}`);
142-
if (response.ok) {
143-
return {
144-
player: (await response.json()) as Player,
145-
};
146-
}
147-
return {
148-
error: (await response.json()) as ErrorResponse,
149-
};
146+
const { data, error } = await this.request<Player>(`/players/${id}`);
147+
return error ? { error } : { player: data };
150148
}
151149

152150
/**
@@ -158,15 +156,10 @@ export class McUtilsAPI {
158156
async fetchPlayerUuid(
159157
id: string
160158
): Promise<{ playerName?: CachedPlayerName; error?: ErrorResponse }> {
161-
const response = await fetch(`${this.endpoint}/players/uuid/${id}`);
162-
if (response.ok) {
163-
return {
164-
playerName: (await response.json()) as CachedPlayerName,
165-
};
166-
}
167-
return {
168-
error: (await response.json()) as ErrorResponse,
169-
};
159+
const { data, error } = await this.request<CachedPlayerName>(
160+
`/players/uuid/${id}`
161+
);
162+
return error ? { error } : { playerName: data };
170163
}
171164

172165
/**
@@ -178,13 +171,11 @@ export class McUtilsAPI {
178171
async fetchServerIcon(
179172
host: string
180173
): Promise<{ image?: ArrayBuffer; error?: ErrorResponse }> {
181-
const response = await fetch(`${this.endpoint}/servers/icon/${host}`);
182-
if (response.ok) {
183-
return { image: await response.arrayBuffer() };
184-
}
185-
return {
186-
error: (await response.json()) as ErrorResponse,
187-
};
174+
const { data, error } = await this.request<ArrayBuffer>(
175+
`/servers/icon/${host}`,
176+
{ responseType: "arrayBuffer" }
177+
);
178+
return error ? { error } : { image: data };
188179
}
189180

190181
/**
@@ -200,15 +191,11 @@ export class McUtilsAPI {
200191
host: string,
201192
size = 768
202193
): Promise<{ image?: ArrayBuffer; error?: ErrorResponse }> {
203-
const response = await fetch(
204-
`${this.endpoint}/servers/${platform}/preview/${host}${this.buildParams({ size: String(size) })}`
194+
const { data, error } = await this.request<ArrayBuffer>(
195+
`/servers/${platform}/preview/${host}${this.buildParams({ size: String(size) })}`,
196+
{ responseType: "arrayBuffer" }
205197
);
206-
if (response.ok) {
207-
return { image: await response.arrayBuffer() };
208-
}
209-
return {
210-
error: (await response.json()) as ErrorResponse,
211-
};
198+
return error ? { error } : { image: data };
212199
}
213200

214201
/**
@@ -220,13 +207,11 @@ export class McUtilsAPI {
220207
async fetchPlayerSkinTexture(
221208
id: string
222209
): Promise<{ image?: ArrayBuffer; error?: ErrorResponse }> {
223-
const response = await fetch(`${this.endpoint}/skins/${id}/texture.png`);
224-
if (response.ok) {
225-
return { image: await response.arrayBuffer() };
226-
}
227-
return {
228-
error: (await response.json()) as ErrorResponse,
229-
};
210+
const { data, error } = await this.request<ArrayBuffer>(
211+
`/skins/${id}/texture.png`,
212+
{ responseType: "arrayBuffer" }
213+
);
214+
return error ? { error } : { image: data };
230215
}
231216

232217
/**
@@ -244,15 +229,11 @@ export class McUtilsAPI {
244229
size = 768,
245230
overlays = true
246231
): Promise<{ image?: ArrayBuffer; error?: ErrorResponse }> {
247-
const response = await fetch(
248-
`${this.endpoint}/skins/${id}/${part}.png${this.buildParams({ size: String(size), overlays: String(overlays) })}`
232+
const { data, error } = await this.request<ArrayBuffer>(
233+
`/skins/${id}/${part}.png${this.buildParams({ size: String(size), overlays: String(overlays) })}`,
234+
{ responseType: "arrayBuffer" }
249235
);
250-
if (response.ok) {
251-
return { image: await response.arrayBuffer() };
252-
}
253-
return {
254-
error: (await response.json()) as ErrorResponse,
255-
};
236+
return error ? { error } : { image: data };
256237
}
257238

258239
/**
@@ -264,13 +245,8 @@ export class McUtilsAPI {
264245
capes?: Cape[];
265246
error?: ErrorResponse;
266247
}> {
267-
const response = await fetch(`${this.endpoint}/capes`);
268-
if (response.ok) {
269-
return { capes: (await response.json()) as Cape[] };
270-
}
271-
return {
272-
error: (await response.json()) as ErrorResponse,
273-
};
248+
const { data, error } = await this.request<Cape[]>(`/capes`);
249+
return error ? { error } : { capes: data };
274250
}
275251

276252
/**
@@ -282,13 +258,11 @@ export class McUtilsAPI {
282258
async fetchCapeTexture(
283259
query: string
284260
): Promise<{ image?: ArrayBuffer; error?: ErrorResponse }> {
285-
const response = await fetch(`${this.endpoint}/capes/${query}/texture.png`);
286-
if (response.ok) {
287-
return { image: await response.arrayBuffer() };
288-
}
289-
return {
290-
error: (await response.json()) as ErrorResponse,
291-
};
261+
const { data, error } = await this.request<ArrayBuffer>(
262+
`/capes/${query}/texture.png`,
263+
{ responseType: "arrayBuffer" }
264+
);
265+
return error ? { error } : { image: data };
292266
}
293267

294268
/**
@@ -304,15 +278,11 @@ export class McUtilsAPI {
304278
type: string,
305279
size = 768
306280
): Promise<{ image?: ArrayBuffer; error?: ErrorResponse }> {
307-
const response = await fetch(
308-
`${this.endpoint}/capes/${query}/${type}.png${this.buildParams({ size: String(size) })}`
281+
const { data, error } = await this.request<ArrayBuffer>(
282+
`/capes/${query}/${type}.png${this.buildParams({ size: String(size) })}`,
283+
{ responseType: "arrayBuffer" }
309284
);
310-
if (response.ok) {
311-
return { image: await response.arrayBuffer() };
312-
}
313-
return {
314-
error: (await response.json()) as ErrorResponse,
315-
};
285+
return error ? { error } : { image: data };
316286
}
317287

318288
/**
@@ -322,13 +292,10 @@ export class McUtilsAPI {
322292
* @returns the list of server registry entries or the error (if one occurred)
323293
*/
324294
async fetchServerRegistryEntries(query: string): Promise<{ entries?: ServerRegistryEntry[]; error?: ErrorResponse }> {
325-
const response = await fetch(`${this.endpoint}/servers${this.buildParams({ query: query })}`);
326-
if (response.ok) {
327-
return { entries: (await response.json()) as ServerRegistryEntry[] };
328-
}
329-
return {
330-
error: (await response.json()) as ErrorResponse,
331-
};
295+
const { data, error } = await this.request<ServerRegistryEntry[]>(
296+
`/servers${this.buildParams({ query: query })}`
297+
);
298+
return error ? { error } : { entries: data };
332299
}
333300

334301
/**
@@ -337,13 +304,8 @@ export class McUtilsAPI {
337304
* @returns the statistics or the error (if one occurred)
338305
*/
339306
async fetchStatistics(): Promise<{ statistics?: StatisticsResponse; error?: ErrorResponse }> {
340-
const response = await fetch(`${this.endpoint}/statistics`);
341-
if (response.ok) {
342-
return { statistics: (await response.json()) as StatisticsResponse };
343-
}
344-
return {
345-
error: (await response.json()) as ErrorResponse,
346-
};
307+
const { data, error } = await this.request<StatisticsResponse>(`/statistics`);
308+
return error ? { error } : { statistics: data };
347309
}
348310

349311
/**
@@ -353,13 +315,10 @@ export class McUtilsAPI {
353315
* @returns the list of skins or the error (if one occurred)
354316
*/
355317
async fetchSkins(page: number = 1): Promise<{ skins?: Page<Skin>; error?: ErrorResponse }> {
356-
const response = await fetch(`${this.endpoint}/skins${this.buildParams({ page: String(page) })}`);
357-
if (response.ok) {
358-
return { skins: (await response.json()) as Page<Skin> };
359-
}
360-
return {
361-
error: (await response.json()) as ErrorResponse,
362-
};
318+
const { data, error } = await this.request<Page<Skin>>(
319+
`/skins${this.buildParams({ page: String(page) })}`
320+
);
321+
return error ? { error } : { skins: data };
363322
}
364323
}
365324

0 commit comments

Comments
 (0)