chronik-cache
Version:
A cache helper for chronik-client
43 lines (42 loc) • 1.77 kB
JavaScript
;
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = sortTxIds;
/**
* A helper function to sort transaction IDs based on corresponding transaction data
*/
function sortTxIds(txIds, getTx) {
return txIds.sort((a, b) => {
const txA = getTx(a);
const txB = getTx(b);
const txidA = txA?.txid || a;
const txidB = txB?.txid || b;
// 检查区块高度是否存在
const hasHeightA = txA.block && typeof txA.block.height !== 'undefined';
const hasHeightB = txB.block && typeof txB.block.height !== 'undefined';
// 如果两个交易都没有区块高度,按 timeFirstSeen 倒序,再按 txid 反字母序
if (!hasHeightA && !hasHeightB) {
const timeFirstSeenDiff = txB.timeFirstSeen - txA.timeFirstSeen;
if (timeFirstSeenDiff !== 0) {
return timeFirstSeenDiff;
}
return txidB.localeCompare(txidA);
}
// 没有区块高度的排在前面
if (!hasHeightA)
return -1;
if (!hasHeightB)
return 1;
// 都有区块高度,先比较高度
const heightDiff = txB.block.height - txA.block.height;
if (heightDiff !== 0)
return heightDiff;
// 同一区块内,按 timeFirstSeen 正序,再按 txid 反字母序
const timeFirstSeenDiff = txA.timeFirstSeen - txB.timeFirstSeen;
if (timeFirstSeenDiff !== 0)
return timeFirstSeenDiff;
return txidB.localeCompare(txidA);
});
}