feat: REST#raw (#7929)

This commit is contained in:
DD
2022-05-17 17:31:19 +03:00
committed by GitHub
parent 5e9b757a37
commit dfe449c253
5 changed files with 19 additions and 8 deletions

View File

@@ -5,4 +5,4 @@ export * from './lib/errors/RateLimitError';
export * from './lib/RequestManager';
export * from './lib/REST';
export * from './lib/utils/constants';
export { makeURLSearchParams } from './lib/utils/utils';
export { makeURLSearchParams, parseResponse } from './lib/utils/utils';

View File

@@ -13,6 +13,7 @@ import {
import type { HashData } from './RequestManager';
import type { IHandler } from './handlers/IHandler';
import { DefaultRestOptions, RESTEvents } from './utils/constants';
import { parseResponse } from './utils/utils';
/**
* Options to be passed when creating the REST instance
@@ -314,7 +315,16 @@ export class REST extends EventEmitter {
* Runs a request from the api
* @param options Request options
*/
public request(options: InternalRequest) {
public async request(options: InternalRequest) {
const response = await this.raw(options);
return parseResponse(response);
}
/**
* Runs a request from the API, yielding the raw Response object
* @param options Request options
*/
public raw(options: InternalRequest) {
return this.requestManager.queueRequest(options);
}
}

View File

@@ -294,7 +294,7 @@ export class RequestManager extends EventEmitter {
* @param request All the information needed to make a request
* @returns The response from the api request
*/
public async queueRequest(request: InternalRequest): Promise<unknown> {
public async queueRequest(request: InternalRequest): Promise<Dispatcher.ResponseData> {
// Generalize the endpoint to its route data
const routeId = RequestManager.generateRouteData(request.fullRoute, request.method);
// Get the bucket hash for the generic route, or point to a global route otherwise

View File

@@ -1,3 +1,4 @@
import type { Dispatcher } from 'undici';
import type { RequestOptions } from '../REST';
import type { HandlerRequestData, RouteData } from '../RequestManager';
@@ -7,7 +8,7 @@ export interface IHandler {
url: string,
options: RequestOptions,
requestData: HandlerRequestData,
) => Promise<unknown>;
) => Promise<Dispatcher.ResponseData>;
// eslint-disable-next-line @typescript-eslint/method-signature-style -- This is meant to be a getter returning a bool
get inactive(): boolean;
readonly id: string;

View File

@@ -170,7 +170,7 @@ export class SequentialHandler implements IHandler {
url: string,
options: RequestOptions,
requestData: HandlerRequestData,
): Promise<unknown> {
): Promise<Dispatcher.ResponseData> {
let queue = this.#asyncQueue;
let queueType = QueueType.Standard;
// Separate sublimited requests when already sublimited
@@ -228,7 +228,7 @@ export class SequentialHandler implements IHandler {
options: RequestOptions,
requestData: HandlerRequestData,
retries = 0,
): Promise<unknown> {
): Promise<Dispatcher.ResponseData> {
/*
* After calculations have been done, pre-emptively stop further requests
* Potentially loop until this task can run if e.g. the global rate limit is hit twice
@@ -392,7 +392,7 @@ export class SequentialHandler implements IHandler {
}
if (status >= 200 && status < 300) {
return parseResponse(res);
return res;
} else if (status === 429) {
// A rate limit was hit - this may happen if the route isn't associated with an official bucket hash yet, or when first globally rate limited
const isGlobal = this.globalLimited;
@@ -474,7 +474,7 @@ export class SequentialHandler implements IHandler {
// throw the API error
throw new DiscordAPIError(data, 'code' in data ? data.code : data.error, status, method, url, requestData);
}
return null;
return res;
}
}
}