Skip to content
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
258 changes: 205 additions & 53 deletions scripts/binance-orderbook-trade.user.js

Large diffs are not rendered by default.

32 changes: 32 additions & 0 deletions src/binance-orderbook-trade/core/abort.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
function getAbortReason(signal) {
if (signal?.reason instanceof Error) return signal.reason;
const error = new Error('Operation aborted');
error.name = 'AbortError';
return error;
}

export function throwIfAborted(signal) {
if (signal?.aborted) throw getAbortReason(signal);
}

export function waitForPromiseOrAbort(task, signal) {
if (!signal) return Promise.resolve(task);
throwIfAborted(signal);

return new Promise((resolve, reject) => {
let settled = false;
const finish = (callback, value) => {
if (settled) return;
settled = true;
signal.removeEventListener('abort', onAbort);
callback(value);
};
const onAbort = () => finish(reject, getAbortReason(signal));

signal.addEventListener('abort', onAbort, { once: true });
Promise.resolve(task).then(
(value) => finish(resolve, value),
(error) => finish(reject, error),
);
});
}
18 changes: 16 additions & 2 deletions src/binance-orderbook-trade/dom/account-orders.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ import {
parseBinanceTabCount,
startsWithBinancePageText,
} from '../contracts/binance-page-text.js';
import {
throwIfAborted,
waitForPromiseOrAbort,
} from '../core/abort.js';

function getNormalizedText(el) {
return normalizeText(el?.textContent || '');
Expand Down Expand Up @@ -62,7 +66,13 @@ export function createAccountOrdersMutationSignal(observationRoot) {
};
}

export async function waitForAccountOrdersMutationState(observationRoot, readState, timeoutMs) {
export async function waitForAccountOrdersMutationState(
observationRoot,
readState,
timeoutMs,
abortSignal = null,
) {
throwIfAborted(abortSignal);
const currentState = readState();
if (currentState) return currentState;
const signal = createAccountOrdersMutationSignal(observationRoot);
Expand All @@ -71,12 +81,16 @@ export async function waitForAccountOrdersMutationState(observationRoot, readSta

try {
while (true) {
throwIfAborted(abortSignal);
const version = signal.version;
const state = readState();
if (state) return state;
const remainingMs = deadline - Date.now();
if (remainingMs <= 0) return readState();
await signal.waitForChange(version, remainingMs);
await waitForPromiseOrAbort(
signal.waitForChange(version, remainingMs),
abortSignal,
);
}
} finally {
signal.dispose();
Expand Down
18 changes: 16 additions & 2 deletions src/binance-orderbook-trade/dom/cancel-all-dialog.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ import {
BINANCE_PAGE_TEXT,
includesBinancePageText,
} from '../contracts/binance-page-text.js';
import {
throwIfAborted,
waitForPromiseOrAbort,
} from '../core/abort.js';

const CANCEL_ALL_DIALOG_CANDIDATE_SELECTOR =
'[role="dialog"], [class*="modal"], [class*="Modal"]';
Expand Down Expand Up @@ -125,7 +129,13 @@ export function createDialogMutationSignal(document) {
};
}

export async function waitForDialogMutationState(document, readState, timeoutMs) {
export async function waitForDialogMutationState(
document,
readState,
timeoutMs,
abortSignal = null,
) {
throwIfAborted(abortSignal);
const currentState = readState();
if (currentState) return currentState;
const signal = createDialogMutationSignal(document);
Expand All @@ -134,12 +144,16 @@ export async function waitForDialogMutationState(document, readState, timeoutMs)

try {
while (true) {
throwIfAborted(abortSignal);
const version = signal.version;
const state = readState();
if (state) return state;
const remainingMs = deadline - Date.now();
if (remainingMs <= 0) return readState();
await signal.waitForChange(version, remainingMs);
await waitForPromiseOrAbort(
signal.waitForChange(version, remainingMs),
abortSignal,
);
}
} finally {
signal.dispose();
Expand Down
Loading
Loading