mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-16 11:33:30 +01:00
feat: add AbortSignal support (#8672)
* feat: add `AbortSignal` support * fix: move the expect earlier * fix: pass signal Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
This commit is contained in:
@@ -175,7 +175,7 @@ export class SequentialHandler implements IHandler {
|
||||
}
|
||||
|
||||
// Wait for any previous requests to be completed before this one is run
|
||||
await queue.wait();
|
||||
await queue.wait({ signal: requestData.signal });
|
||||
// This set handles retroactively sublimiting requests
|
||||
if (queueType === QueueType.Standard) {
|
||||
if (this.#sublimitedQueue && hasSublimit(routeId.bucketRoute, requestData.body, options.method)) {
|
||||
@@ -293,8 +293,17 @@ export class SequentialHandler implements IHandler {
|
||||
|
||||
const controller = new AbortController();
|
||||
const timeout = setTimeout(() => controller.abort(), this.manager.options.timeout).unref();
|
||||
let res: Dispatcher.ResponseData;
|
||||
if (requestData.signal) {
|
||||
// The type polyfill is required because Node.js's types are incomplete.
|
||||
const signal = requestData.signal as PolyFillAbortSignal;
|
||||
// If the user signal was aborted, abort the controller, else abort the local signal.
|
||||
// The reason why we don't re-use the user's signal, is because users may use the same signal for multiple
|
||||
// requests, and we do not want to cause unexpected side-effects.
|
||||
if (signal.aborted) controller.abort();
|
||||
else signal.addEventListener('abort', () => controller.abort());
|
||||
}
|
||||
|
||||
let res: Dispatcher.ResponseData;
|
||||
try {
|
||||
res = await request(url, { ...options, signal: controller.signal });
|
||||
} catch (error: unknown) {
|
||||
@@ -492,3 +501,9 @@ export class SequentialHandler implements IHandler {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
interface PolyFillAbortSignal {
|
||||
readonly aborted: boolean;
|
||||
addEventListener(type: 'abort', listener: () => void): void;
|
||||
removeEventListener(type: 'abort', listener: () => void): void;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user