Skip to content

Commit 12bb88a

Browse files
committed
perf: remove done signal for abortable helper
1 parent 0ebf370 commit 12bb88a

File tree

2 files changed

+20
-27
lines changed

2 files changed

+20
-27
lines changed

src/cmap/connection.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1243,7 +1243,7 @@ export async function writeCommand(
12431243
connection: ModernConnection,
12441244
command: WriteProtocolMessageType,
12451245
options: Partial<Pick<OperationDescription, 'agreedCompressor' | 'zlibCompressionLevel'>> & {
1246-
signal?: AbortSignal;
1246+
signal: AbortSignal;
12471247
}
12481248
): Promise<void> {
12491249
const finalCommand =

src/utils.ts

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,36 +1314,29 @@ export function isHostMatch(match: RegExp, host?: string): boolean {
13141314
*/
13151315
export async function abortable<T>(
13161316
promise: Promise<T>,
1317-
{ signal }: { signal?: AbortSignal } = {}
1317+
{ signal }: { signal: AbortSignal }
13181318
): Promise<T> {
1319-
const { abort, done } = aborted(signal);
1319+
const { promise: aborted, reject } = promiseWithResolvers<never>();
1320+
1321+
function rejectOnAbort() {
1322+
reject(signal.reason);
1323+
}
1324+
signal.addEventListener('abort', rejectOnAbort, { once: true });
1325+
13201326
try {
1321-
return await Promise.race([promise, abort]);
1327+
return await Promise.race([promise, aborted]);
13221328
} finally {
1323-
done.abort();
1329+
signal.removeEventListener('abort', rejectOnAbort);
13241330
}
13251331
}
13261332

1327-
/**
1328-
* Takes an AbortSignal and creates a promise that will reject when the signal aborts
1329-
* If the argument provided is nullish the returned promise will **never** resolve.
1330-
* Also returns a done controller - abort the done controller when your task is done to remove the abort listeners
1331-
* @param signal - an optional abort signal to link to a promise rejection
1332-
*/
1333-
function aborted(signal?: AbortSignal): {
1334-
abort: Promise<any>;
1335-
done: AbortController;
1336-
} {
1337-
const done = new AbortController();
1338-
if (signal?.aborted) {
1339-
return { abort: Promise.reject(signal.reason), done };
1340-
}
1341-
const abort = new Promise<void>((_, reject) =>
1342-
signal?.addEventListener('abort', () => reject(signal.reason), {
1343-
once: true,
1344-
// @ts-expect-error: @types/node erroneously claim this does not exist
1345-
signal: done.signal
1346-
})
1347-
);
1348-
return { abort, done };
1333+
function promiseWithResolvers<T>() {
1334+
let resolve: Parameters<ConstructorParameters<typeof Promise<T>>[0]>[0];
1335+
let reject: Parameters<ConstructorParameters<typeof Promise<T>>[0]>[1];
1336+
const promise = new Promise<T>(function withResolversExecutor(promiseResolve, promiseReject) {
1337+
resolve = promiseResolve;
1338+
reject = promiseReject;
1339+
});
1340+
// @ts-expect-error: TS does not know what I know
1341+
return { promise, resolve, reject } as const;
13491342
}

0 commit comments

Comments
 (0)