mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-11 00:53:31 +01:00
feat: @discordjs/proxy (#7925)
Co-authored-by: Parbez <imranbarbhuiya.fsd@gmail.com>
This commit is contained in:
54
packages/proxy/src/util/responseHelpers.ts
Normal file
54
packages/proxy/src/util/responseHelpers.ts
Normal file
@@ -0,0 +1,54 @@
|
||||
import type { ServerResponse } from 'node:http';
|
||||
import { pipeline } from 'node:stream/promises';
|
||||
import type { DiscordAPIError, HTTPError, RateLimitError } from '@discordjs/rest';
|
||||
import type { Dispatcher } from 'undici';
|
||||
|
||||
/**
|
||||
* Populates a server response with the data from a Discord 2xx REST response
|
||||
* @param res The server response to populate
|
||||
* @param data The data to populate the response with
|
||||
*/
|
||||
export async function populateSuccessfulResponse(res: ServerResponse, data: Dispatcher.ResponseData): Promise<void> {
|
||||
res.statusCode = data.statusCode;
|
||||
|
||||
for (const header of Object.keys(data.headers)) {
|
||||
// Strip ratelimit headers
|
||||
if (header.startsWith('x-ratelimit')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
res.setHeader(header, data.headers[header]!);
|
||||
}
|
||||
|
||||
await pipeline(data.body, res);
|
||||
}
|
||||
|
||||
/**
|
||||
* Populates a server response with the data from a Discord non-2xx REST response that is NOT a 429
|
||||
* @param res The server response to populate
|
||||
* @param error The error to populate the response with
|
||||
*/
|
||||
export function populateGeneralErrorResponse(res: ServerResponse, error: DiscordAPIError | HTTPError): void {
|
||||
res.statusCode = error.status;
|
||||
res.statusMessage = error.message;
|
||||
|
||||
if ('rawError' in error) {
|
||||
res.setHeader('Content-Type', 'application/json');
|
||||
res.write(JSON.stringify(error.rawError));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Populates a server response with the data from a Discord 429 REST response
|
||||
* @param res The server response to populate
|
||||
* @param error The error to populate the response with
|
||||
*/
|
||||
export function populateRatelimitErrorResponse(res: ServerResponse, error: RateLimitError): void {
|
||||
res.statusCode = 429;
|
||||
res.setHeader('Retry-After', error.timeToReset / 1000);
|
||||
}
|
||||
|
||||
export function populateAbortErrorResponse(res: ServerResponse): void {
|
||||
res.statusCode = 504;
|
||||
res.statusMessage = 'Upstream timed out';
|
||||
}
|
||||
10
packages/proxy/src/util/util.ts
Normal file
10
packages/proxy/src/util/util.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import type { IncomingMessage, ServerResponse } from 'node:http';
|
||||
|
||||
/**
|
||||
* Represents a potentially awaitable value
|
||||
*/
|
||||
export type Awaitable<T> = T | PromiseLike<T>;
|
||||
/**
|
||||
* Represents a simple HTTP request handler
|
||||
*/
|
||||
export type RequestHandler = (req: IncomingMessage, res: ServerResponse) => Awaitable<void>;
|
||||
Reference in New Issue
Block a user