expansejs-blockstream
TypeScript icon, indicating that this package has built-in type declarations

2.0.4 • Public • Published

NPM Package Build Status Coverage Status A library to turn an unreliable remote source of Expanse blocks into a reliable stream of blocks. Handles block and log removals on chain reorganization and block and log backfills on skipped blocks.

Usage

Full Example

// blockRetention is how many blocks of history to keep in memory.  it defaults to 100 if not supplied
const configuration = { blockRetention: 100 };
function getBlockByHash(hash: string): Promise<Block|null> {
    return fetch("http://localhost:9656", {
        method: "POST",
        headers: new Headers({"Content-Type": "application/json"}),
        body: { jsonrpc: "2.0", id: 1, method: "eth_getBlockByHash", params: [hash, false] }
    }).then(response => response.json());
}
//function getBlockByHashCallbackStyle(hash: string, callback: (error?: Error, block?: Block|null) => void): void {
//    fetch("http://localhost:9656", {
//        method: "POST",
//        headers: new Headers({"Content-Type": "application/json"}),
//        body: { jsonrpc: "2.0", id: 1, method: "eth_getBlockByHash", params: [hash, false] }
//    })
//    .then(response => response.json())
//    .then(block => callback(undefined, block))
//    .catch(error => callback(error, undefined));
//}
function getLogs(filterOptions: FilterOptions): Promise<Log[]> {
    return fetch("http://localhost:9656", {
        method: "POST",
        headers: new Headers({"Content-Type": "application/json"}),
        body: { jsonrpc: "2.0", id: 1, method: "eth_getLogs", params: [filterOptions] }
    }).then(response => response.json());
}
//function getLogsCallbackStyle(filterOptions: FilterOptions, callback: (error?: Error, logs?: Log[]) => void): void {
//    return fetch("http://localhost:9656", {
//        method: "POST",
//        headers: new Headers({"Content-Type": "application/json"}),
//        body: { jsonrpc: "2.0", id: 1, method: "eth_getLogs", params: [filterOptions] }
//    })
//    .then(response => response.json())
//    .then(logs => callback(undefined, logs)
//    .catch(error => callback(error, undefined));
//}
function getLatestBlock(): Promise<Block> {
    return fetch("http://localhost:9656", {
        method: "POST",
        headers: new Headers({"Content-Type": "application/json"}),
        body: { jsonrpc: "2.0", id: 1, method: "eth_getBlockByNumber", params: ["latest", false] }
    }).then(response => response.json());
}
const blockAndLogStreamer = new BlockAndLogStreamer(getBlockByHash, getLogs, configuration);
// const blockAndLogStreamer = BlockAndLogStreamer.createCallbackStyle(getBlockByHashCallbackStyle, getLogsCallbackStyle, configuration);
const onBlockAddedSubscriptionToken = blockAndLogStreamer.subscribeToOnBlockAdded(block => console.log(block));
const onLogAddedSubscriptionToken = blockAndLogStreamer.subscribeToOnLogAdded(log => console.log(log));
const onBlockRemovedSubscriptionToken = blockAndLogStreamer.subscribeToOnBlockRemoved(block => console.log(block));
const onLogRemovedSubscriptionToken = blockAndLogStreamer.subscribeToOnLogRemoved(log => console.log(log));
const logFilterToken = blockAndLogStreamer.addLogFilter({address: "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef", topics: ["0xbadf00dbadf00dbadf00dbadf00dbadf00dbadf00dbadf00dbadf00dbaadf00d"]});
blockAndLogStreamer.reconcileNewBlock(getLatestBlock());
// you will get a callback for the block and any logs that match the filter here
triggerBlockMining();
triggerBlockMining();
triggerBlockMining();
blockAndLogStreamer.reconcileNewBlock(getLatestBlock());
// you will get a callback for all blocks and logs that match the filter that have been added to the chain since the previous call to reconcileNewBlock
triggerChainReorg();
blockAndLogStreamer.reconcileNewBlock(getLatestBlock());
// you will get a callback for block/log removals that occurred due to the chain re-org, followed by block/log additions
blockAndLogStreamer.unsubscribeFromOnBlockAdded(onBlockAddedSubscriptionToken);
blockAndLogStreamer.unsubscribeFromOnBlockRemoved(onBlockRemovedSubscriptionToken);
blockAndLogStreamer.unsubscribeFromOnLogAdded(onLogAddedSubscriptionToken);
blockAndLogStreamer.unsubscribeFromOnLogRemoved(onLogRemovedSubscriptionToken);
blockAndLogStreamer.removeLogFilter(logFilterToken);
console.log(blockAndLogStreamer.getLatestReconciledBlock());

Signatures

Note: if you have a TypeScript aware editor this will all be available in the tooltip

Development

Build

docker build -t blockstream .

or

npm run build

Test

docker run blockstream

or

npm run test

Readme

Keywords

none

Package Sidebar

Install

npm i expansejs-blockstream

Weekly Downloads

0

Version

2.0.4

License

CC0-1.0

Last publish

Collaborators

  • expanse