UNPKG

bitcore-node

Version:

A blockchain indexing node with extended capabilities using bitcore

148 lines 6.05 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const express_1 = __importDefault(require("express")); const logger_1 = __importDefault(require("../../logger")); const coin_1 = require("../../models/coin"); const transaction_1 = require("../../models/transaction"); const chain_state_1 = require("../../providers/chain-state"); const middleware_1 = require("../middleware"); const router = express_1.default.Router({ mergeParams: true }); router.get('/', async function (req, res) { let { chain, network } = req.params; let { sinceBlock, date, limit, since, direction, paging } = req.query; if (limit) { limit = parseInt(limit) || undefined; // if limit is NaN or null, set it to undefined so it'll fallback to CSP default } try { let payload = { chain, network, sinceBlock, args: { date, limit, since, direction, paging }, req, res }; return chain_state_1.ChainStateProvider.streamBlocks(payload); } catch (err) { logger_1.default.error('Error getting blocks: %o', err.stack || err.message || err); return res.status(500).send(err.message || err); } }); router.get('/tip', async function (req, res) { let { chain, network } = req.params; try { let tip = await chain_state_1.ChainStateProvider.getLocalTip({ chain, network }); return res.json(tip); } catch (err) { logger_1.default.error('Error getting tip block: %o:%o: %o', chain, network, err.stack || err.message || err); return res.status(500).send(err.message || err); } }); router.get('/:blockId', async function (req, res) { let { chain, network, blockId } = req.params; try { let block = await chain_state_1.ChainStateProvider.getBlock({ chain, network, blockId }); if (!block) { return res.status(404).send('block not found'); } const tip = await chain_state_1.ChainStateProvider.getLocalTip({ chain, network }); if (block && tip && tip.height - block.height > middleware_1.Confirmations.Deep) { (0, middleware_1.SetCache)(res, middleware_1.CacheTimes.Month); } return res.json(block); } catch (err) { logger_1.default.error('Error getting blockId: %o', err.stack || err.message || err); return res.status(500).send(err.message || err); } }); // return all { txids, inputs, ouputs} for a blockHash paginated at max 500 per page, to limit reqs and overload router.get('/:blockHash/coins/:limit/:pgnum', async function (req, res) { let { chain, network, blockHash, limit, pgnum } = req.params; let pageNumber; let maxLimit; try { pageNumber = parseInt(pgnum, 10); maxLimit = parseInt(limit, 10); if (maxLimit) { if (maxLimit > 500) maxLimit = 500; } } catch (err) { console.log(err); } let skips = maxLimit * (pageNumber - 1); let numOfTxs = await transaction_1.TransactionStorage.collection.find({ chain, network, blockHash }).count(); try { let txs = numOfTxs < maxLimit ? await transaction_1.TransactionStorage.collection.find({ chain, network, blockHash }).toArray() : await transaction_1.TransactionStorage.collection .find({ chain, network, blockHash }) .skip(skips) .limit(maxLimit) .toArray(); if (!txs) { return res.status(422).send('No txs for page'); } const txidIndexes = {}; let txids = txs.map((tx, index) => { txidIndexes[index] = tx.txid; return tx.txid; }); let inputs = await coin_1.CoinStorage.collection .find({ chain, network, spentTxid: { $in: txids } }) .addCursorFlag('noCursorTimeout', true) .toArray(); let outputs = await coin_1.CoinStorage.collection .find({ chain, network, mintTxid: { $in: txids } }) .addCursorFlag('noCursorTimeout', true) .toArray(); let prevPageNum; let nxtPageNum; let previous = ''; let next = ''; if (pageNumber !== 1) { prevPageNum = parseInt(pageNumber) - 1; previous = `/block/${blockHash}/coins/${maxLimit}/${prevPageNum}`; } if (numOfTxs - maxLimit * pageNumber > 0) { nxtPageNum = pageNumber + 1; next = `/block/${blockHash}/coins/${maxLimit}/${nxtPageNum}`; } const sanitize = (coins) => coins.map(c => coin_1.CoinStorage._apiTransform(c, { object: true })); return res.json({ txids, inputs: sanitize(inputs), outputs: sanitize(outputs), previous, next }); } catch (err) { logger_1.default.error('Error getting block hash data: %o', err.stack || err.message || err); return res.status(500).send(err.message || err); } }); router.get('/before-time/:time', async function (req, res) { let { chain, network, time } = req.params; try { const block = await chain_state_1.ChainStateProvider.getBlockBeforeTime({ chain, network, time }); if (!block) { return res.status(404).send('block not found'); } const tip = await chain_state_1.ChainStateProvider.getLocalTip({ chain, network }); if (block && tip && tip.height - block.height > middleware_1.Confirmations.Deep) { (0, middleware_1.SetCache)(res, middleware_1.CacheTimes.Month); } return res.json(block); } catch (err) { logger_1.default.error('Error getting blocks before time: %o', err.stack || err.message || err); return res.status(500).send(err.message || err); } }); module.exports = { router, path: '/block' }; //# sourceMappingURL=block.js.map