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
4 changes: 2 additions & 2 deletions libs/rest/src/Bucket.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { discordFetch, DiscordFetchOptions, StringRecord } from './Fetch';
import { discordFetch, DiscordFetchOptions, StringRecord, RequestBodyData } 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 StringRecord, Q extends StringRecord>(req: DiscordFetchOptions<D, Q>): Promise<T> {
public async make<T, D extends RequestBodyData, Q extends StringRecord>(req: DiscordFetchOptions<D, Q>): Promise<T> {
this.manager.emit('request', req);

const timeout = setTimeout(() => req.controller.abort(), this.manager.abortAfter);
Expand Down
8 changes: 6 additions & 2 deletions libs/rest/src/Fetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,14 @@ export interface File {

export type StringRecord = Record<string, string>;

export interface RequestBodyData {
[key: string]: string | number | boolean | RequestBodyData;
}

/**
* Presents the base options that may be needed for making a request to Discord
*/
export interface DiscordFetchOptions<D extends StringRecord = StringRecord, Q extends StringRecord = StringRecord> {
export interface DiscordFetchOptions<D extends RequestBodyData = RequestBodyData, Q extends StringRecord = StringRecord> {
path: string;
method: string;
headers: Headers;
Expand All @@ -38,7 +42,7 @@ export interface DiscordFetchOptions<D extends StringRecord = StringRecord, Q ex
* Makes the actual HTTP request
* @param options Options for the request
*/
export const discordFetch = <D extends StringRecord, Q extends StringRecord>(options: DiscordFetchOptions<D, Q>) => {
export const discordFetch = <D extends RequestBodyData, Q extends StringRecord>(options: DiscordFetchOptions<D, Q>) => {
let { path, method, headers, controller, query, files, data } = options;

let queryString: string | null = null;
Expand Down
14 changes: 7 additions & 7 deletions libs/rest/src/RestManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { EventEmitter } from 'events';
import { Headers } from 'node-fetch';
import { Mutex, MemoryMutex } from './mutex';
import AbortController from 'abort-controller';
import type { DiscordFetchOptions, File, StringRecord } from './Fetch';
import type { DiscordFetchOptions, File, RequestBodyData, StringRecord } from './Fetch';

/**
* Options for constructing a rest manager
Expand Down Expand Up @@ -66,7 +66,7 @@ export interface RestManager {
/**
* Options used for making a request
*/
export interface RequestOptions<D extends StringRecord, Q extends StringRecord> {
export interface RequestOptions<D extends RequestBodyData, Q extends StringRecord> {
/**
* 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 StringRecord = StringRecord, Q extends StringRecord = StringRecord>(options: RequestOptions<D, Q>): Promise<T> {
public make<T, D extends RequestBodyData = RequestBodyData, Q extends StringRecord = StringRecord>(options: RequestOptions<D, Q>): Promise<T> {
const route = Bucket.makeRoute(options.method, options.path);

let bucket = this._buckets.get(route);
Expand Down Expand Up @@ -175,7 +175,7 @@ export class RestManager extends EventEmitter {
* @param options Other options for the request
*/
/* istanbul ignore next */
public delete<T, D extends StringRecord = StringRecord>(path: string, options: { data?: D; reason?: string } = {}): Promise<T> {
public delete<T, D extends RequestBodyData = 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 StringRecord = StringRecord>(path: string, options: { data: D; reason?: string }): Promise<T> {
public patch<T, D extends RequestBodyData = 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 StringRecord = StringRecord>(path: string, options: { data: D; reason?: string }): Promise<T> {
public put<T, D extends RequestBodyData = 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 StringRecord = StringRecord>(path: string, options: { data: D; reason?: string; files: File[] }): Promise<T> {
public post<T, D extends RequestBodyData = 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 } from '@cordis/rest';
import type { File, StringRecord, RequestBodyData } from '@cordis/rest';

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