eth-json-rpc-middleware
Version:
Ethereum-related json-rpc-engine middleware.
51 lines • 2.4 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createBlockRefMiddleware = void 0;
const json_rpc_engine_1 = require("json-rpc-engine");
const clone_1 = __importDefault(require("clone"));
const pify_1 = __importDefault(require("pify"));
const logging_utils_1 = require("./logging-utils");
const cache_1 = require("./utils/cache");
const log = logging_utils_1.createModuleLogger(logging_utils_1.projectLogger, 'block-ref');
function createBlockRefMiddleware({ provider, blockTracker, } = {}) {
if (!provider) {
throw Error('BlockRefMiddleware - mandatory "provider" option is missing.');
}
if (!blockTracker) {
throw Error('BlockRefMiddleware - mandatory "blockTracker" option is missing.');
}
return json_rpc_engine_1.createAsyncMiddleware(async (req, res, next) => {
var _a, _b;
const blockRefIndex = cache_1.blockTagParamIndex(req);
// skip if method does not include blockRef
if (blockRefIndex === undefined) {
return next();
}
const blockRef = (_b = (_a = req.params) === null || _a === void 0 ? void 0 : _a[blockRefIndex]) !== null && _b !== void 0 ? _b : 'latest';
// skip if not "latest"
if (blockRef !== 'latest') {
log('blockRef is not "latest", carrying request forward');
return next();
}
// lookup latest block
const latestBlockNumber = await blockTracker.getLatestBlock();
log(`blockRef is "latest", setting param ${blockRefIndex} to latest block ${latestBlockNumber}`);
// create child request with specific block-ref
const childRequest = clone_1.default(req);
if (childRequest.params) {
childRequest.params[blockRefIndex] = latestBlockNumber;
}
// perform child request
log('Performing another request %o', childRequest);
const childRes = await pify_1.default(provider.sendAsync).call(provider, childRequest);
// copy child response onto original response
res.result = childRes.result;
res.error = childRes.error;
return undefined;
});
}
exports.createBlockRefMiddleware = createBlockRefMiddleware;
//# sourceMappingURL=block-ref.js.map
;