UNPKG

envio

Version:

A latency and sync speed optimized, developer friendly blockchain data indexer.

134 lines (125 loc) 4.33 kB
// Generated by ReScript, PLEASE EDIT WITH CARE 'use strict'; var Utils = require("./Utils.res.js"); var Caml_obj = require("rescript/lib/js/caml_obj.js"); var ChainMap = require("./ChainMap.res.js"); var Belt_Array = require("rescript/lib/js/belt_Array.js"); var EventUtils = require("./EventUtils.res.js"); var FetchState = require("./FetchState.res.js"); function getQueueItemComparitor(earliestQueueItem, chain) { if (earliestQueueItem.TAG === "Item") { return EventUtils.getOrderedBatchItemComparator(earliestQueueItem._0.item); } var match = earliestQueueItem.latestFetchedBlock; return [ match.blockTimestamp, chain, match.blockNumber, 0 ]; } function isQueueItemEarlier(a, b) { return Caml_obj.lessthan(getQueueItemComparitor(a.earliestEvent, a.chain), getQueueItemComparitor(b.earliestEvent, b.chain)); } function getOrderedNextItem(fetchStates) { return Belt_Array.reduce(ChainMap.entries(fetchStates), undefined, (function (accum, param) { var fetchState = param[1]; if (!FetchState.isActivelyIndexing(fetchState)) { return accum; } var earliestEvent = FetchState.getEarliestEvent(fetchState); var current_chain = param[0]; var current = { chain: current_chain, earliestEvent: earliestEvent }; if (accum !== undefined && isQueueItemEarlier(accum, current)) { return accum; } else { return current; } })); } function hasUnorderedNextItem(fetchStates) { return ChainMap.values(fetchStates).some(function (fetchState) { if (!FetchState.isActivelyIndexing(fetchState)) { return false; } var match = FetchState.getEarliestEvent(fetchState); if (match.TAG === "Item") { return true; } else { return false; } }); } function popOrderedBatchItems(maxBatchSize, fetchStates, sizePerChain) { var items = []; var loop = function () { while(true) { if (items.length >= maxBatchSize) { return ; } var match = getOrderedNextItem(fetchStates); if (match === undefined) { return ; } var earliestEvent = match.earliestEvent; if (earliestEvent.TAG !== "Item") { return ; } var match$1 = earliestEvent._0; match$1.popItemOffQueue(); items.push(match$1.item); Utils.Dict.incrementByInt(sizePerChain, match.chain); continue ; }; }; loop(); return items; } function popUnorderedBatchItems(maxBatchSize, fetchStates, sizePerChain) { var items = []; var preparedFetchStates = FetchState.filterAndSortForUnorderedBatch(ChainMap.values(fetchStates), maxBatchSize); var idx = 0; var preparedNumber = preparedFetchStates.length; var batchSize = { contents: 0 }; while(batchSize.contents < maxBatchSize && idx < preparedNumber) { var fetchState = preparedFetchStates[idx]; var batchSizeBeforeTheChain = batchSize.contents; var loop = (function(fetchState){ return function loop() { while(true) { if (batchSize.contents >= maxBatchSize) { return ; } var earliestEvent = FetchState.getEarliestEvent(fetchState); if (earliestEvent.TAG !== "Item") { return ; } var match = earliestEvent._0; match.popItemOffQueue(); items.push(match.item); batchSize.contents = batchSize.contents + 1 | 0; continue ; }; } }(fetchState)); loop(); var chainBatchSize = batchSize.contents - batchSizeBeforeTheChain | 0; if (chainBatchSize > 0) { sizePerChain[fetchState.chainId] = chainBatchSize; } idx = idx + 1 | 0; }; return items; } exports.getQueueItemComparitor = getQueueItemComparitor; exports.isQueueItemEarlier = isQueueItemEarlier; exports.getOrderedNextItem = getOrderedNextItem; exports.hasUnorderedNextItem = hasUnorderedNextItem; exports.popOrderedBatchItems = popOrderedBatchItems; exports.popUnorderedBatchItems = popUnorderedBatchItems; /* Utils Not a pure module */