Skip to content
This repository was archived by the owner on Apr 17, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions libs/rest/src/Bucket.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { discordFetch, DiscordFetchOptions, StringRecord, RequestBodyData } from './Fetch';
import { discordFetch, DiscordFetchOptions } from './Fetch';
import { CordisRestError, HTTPError } from './Error';
import { halt } from '@cordis/common';
import type { RestManager } from './RestManager';
Expand Down Expand Up @@ -54,7 +54,7 @@ export class Bucket {
* Makes a request to Discord
* @param req Request options
*/
public async make<T, D extends RequestBodyData, Q extends StringRecord>(req: DiscordFetchOptions<D, Q>): Promise<T> {
public async make<T, D, Q>(req: DiscordFetchOptions<D, Q>): Promise<T> {
this.manager.emit('request', req);

const timeout = setTimeout(() => req.controller.abort(), this.manager.abortAfter);
Expand Down Expand Up @@ -83,10 +83,10 @@ export class Bucket {
this.manager.emit('ratelimit', this.route, req.path, false, retryAfter);

await this.mutex.set(this.route, { timeout: retryAfter });
return this._retry(req);
return this._retry<T, D, Q>(req);
} else if (res.status >= 500 && res.status < 600) {
await halt(1000);
return this._retry(req);
return this._retry<T, D, Q>(req);
} else if (!res.ok) {
throw new HTTPError(res.clone(), await res.text());
}
Expand All @@ -105,7 +105,7 @@ export class Bucket {
* @param req Request options
* @param res Response given
*/
private _retry<T>(req: DiscordFetchOptions): Promise<T> {
private _retry<T, D, Q>(req: DiscordFetchOptions<D, Q>): Promise<T> {
if (req.failures) req.failures++;
else req.failures = 1;

Expand Down
4 changes: 2 additions & 2 deletions libs/rest/src/Fetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export interface RequestBodyData {
/**
* Presents the base options that may be needed for making a request to Discord
*/
export interface DiscordFetchOptions<D extends RequestBodyData = RequestBodyData, Q extends StringRecord = StringRecord> {
export interface DiscordFetchOptions<D = RequestBodyData, Q = StringRecord> {
path: string;
method: string;
headers: Headers;
Expand All @@ -42,7 +42,7 @@ export interface DiscordFetchOptions<D extends RequestBodyData = RequestBodyData
* Makes the actual HTTP request
* @param options Options for the request
*/
export const discordFetch = <D extends RequestBodyData, Q extends StringRecord>(options: DiscordFetchOptions<D, Q>) => {
export const discordFetch = <D, Q>(options: DiscordFetchOptions<D, Q>) => {
let { path, method, headers, controller, query, files, data } = options;

let queryString: string | null = null;
Expand Down
26 changes: 13 additions & 13 deletions libs/rest/src/RestManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@ export interface RestManager {
* Fired when a request is being started (pre-ratelimit checking)
* @event
*/
on(event: 'request', listener: (request: Partial<DiscordFetchOptions>) => any): this;
on(event: 'request', listener: (request: Partial<DiscordFetchOptions<any, any>>) => any): this;
/**
* Fired when Discord responds to a request
* @event
*/
on(
event: 'response',
listener: (request: Partial<DiscordFetchOptions>, response: any, ratelimit: Partial<RatelimitData>) => any
listener: (request: Partial<DiscordFetchOptions<any, any>>, response: any, ratelimit: Partial<RatelimitData>) => any
): this;
/**
* Fired when a rate limit is (about to be) hit.
Expand All @@ -46,27 +46,27 @@ export interface RestManager {
on(event: 'ratelimit', listener: (bucket: string, endpoint: string, prevented: boolean, waitingFor: number) => any): this;

/** @internal */
once(event: 'request', listener: (request: Partial<DiscordFetchOptions>) => any): this;
once(event: 'request', listener: (request: Partial<DiscordFetchOptions<any, any>>) => any): this;
/** @internal */
once(
event: 'response',
listener: (request: Partial<DiscordFetchOptions>, response: any, ratelimit: Partial<RatelimitData>) => any
listener: (request: Partial<DiscordFetchOptions<any, any>>, response: any, ratelimit: Partial<RatelimitData>) => any
): this;
/** @internal */
once(event: 'ratelimit', listener: (bucket: string, endpoint: string, prevented: boolean, waitingFor: number) => any): this;

/** @internal */
emit(event: 'request', request: Partial<DiscordFetchOptions>): boolean;
emit(event: 'request', request: Partial<DiscordFetchOptions<any, any>>): boolean;
/** @internal */
emit(event: 'response', request: Partial<DiscordFetchOptions>, response: any, ratelimit: Partial<RatelimitData>): boolean;
emit(event: 'response', request: Partial<DiscordFetchOptions<any, any>>, response: any, ratelimit: Partial<RatelimitData>): boolean;
/** @internal */
emit(event: 'ratelimit', bucket: string, endpoint: string, prevented: boolean, waitingFor: number): boolean;
}

/**
* Options used for making a request
*/
export interface RequestOptions<D extends RequestBodyData, Q extends StringRecord> {
export interface RequestOptions<D, Q> {
/**
* Path you're requesting
*/
Expand Down Expand Up @@ -139,7 +139,7 @@ export class RestManager extends EventEmitter {
* Prepares a request to Discord, associating it to the correct Bucket and attempting to prevent rate limits
* @param options Options needed for making a request; only the path is required
*/
public make<T, D extends RequestBodyData = RequestBodyData, Q extends StringRecord = StringRecord>(options: RequestOptions<D, Q>): Promise<T> {
public make<T, D = RequestBodyData, Q = StringRecord>(options: RequestOptions<D, Q>): Promise<T> {
const route = Bucket.makeRoute(options.method, options.path);

let bucket = this._buckets.get(route);
Expand All @@ -165,7 +165,7 @@ export class RestManager extends EventEmitter {
* @param options Other options for the request
*/
/* istanbul ignore next */
public get<T, Q extends StringRecord = StringRecord>(path: string, options: { query?: Q } = {}): Promise<T> {
public get<T, Q = StringRecord>(path: string, options: { query?: Q } = {}): Promise<T> {
return this.make<T, never, Q>({ path, method: 'get', ...options });
}

Expand All @@ -175,7 +175,7 @@ export class RestManager extends EventEmitter {
* @param options Other options for the request
*/
/* istanbul ignore next */
public delete<T, D extends RequestBodyData = RequestBodyData>(path: string, options: { data?: D; reason?: string } = {}): Promise<T> {
public delete<T, D = RequestBodyData>(path: string, options: { data?: D; reason?: string } = {}): Promise<T> {
return this.make<T, D, never>({ path, method: 'delete', ...options });
}

Expand All @@ -185,7 +185,7 @@ export class RestManager extends EventEmitter {
* @param options Other options for the request
*/
/* istanbul ignore next */
public patch<T, D extends RequestBodyData = RequestBodyData>(path: string, options: { data: D; reason?: string }): Promise<T> {
public patch<T, D = RequestBodyData>(path: string, options: { data: D; reason?: string }): Promise<T> {
return this.make<T, D, never>({ path, method: 'patch', ...options });
}

Expand All @@ -195,7 +195,7 @@ export class RestManager extends EventEmitter {
* @param options Other options for the request
*/
/* istanbul ignore next */
public put<T, D extends RequestBodyData = RequestBodyData>(path: string, options: { data: D; reason?: string }): Promise<T> {
public put<T, D = RequestBodyData>(path: string, options: { data: D; reason?: string }): Promise<T> {
return this.make<T, D, never>({ path, method: 'put', ...options });
}

Expand All @@ -205,7 +205,7 @@ export class RestManager extends EventEmitter {
* @param options Other options for the request
*/
/* istanbul ignore next */
public post<T, D extends RequestBodyData = RequestBodyData>(path: string, options: { data: D; reason?: string; files: File[] }): Promise<T> {
public post<T, D = RequestBodyData>(path: string, options: { data: D; reason?: string; files: File[] }): Promise<T> {
return this.make<T, D, never>({ path, method: 'post', ...options });
}
}
10 changes: 5 additions & 5 deletions libs/routers/src/IRouter.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type { File, StringRecord, RequestBodyData } from '@cordis/rest';

export type IRouter = {
get<T, Q extends StringRecord | string = StringRecord>(options?: { query?: Q }): Promise<T>;
delete<T, D extends RequestBodyData = RequestBodyData>(options?: { data?: D; reason?: string }): Promise<T>;
patch<T, D extends RequestBodyData>(options: { data: D; reason?: string }): Promise<T>;
put<T, D extends RequestBodyData>(options: { data: D; reason?: string }): Promise<T>;
post<T, D extends RequestBodyData>(options: { data: D; reason?: string; files?: File[] }): Promise<T>;
get<T, Q = StringRecord>(options?: { query?: Q }): Promise<T>;
delete<T, D = RequestBodyData>(options?: { data?: D; reason?: string }): Promise<T>;
patch<T, D = RequestBodyData>(options: { data: D; reason?: string }): Promise<T>;
put<T, D = RequestBodyData>(options: { data: D; reason?: string }): Promise<T>;
post<T, D = RequestBodyData>(options: { data: D; reason?: string; files?: File[] }): Promise<T>;
} & { [key: string]: IRouter };