envio
Version:
A latency and sync speed optimized, developer friendly blockchain data indexer.
134 lines (125 loc) • 4.33 kB
JavaScript
// Generated by ReScript, PLEASE EDIT WITH CARE
;
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 */