1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- import { getNumber } from "../utils/index.js";
- import type { Subscriber } from "./abstract-provider.js";
- //#TODO: Temp
- import type { Provider } from "./provider.js";
- /**
- * @TODO
- *
- * @_docloc: api/providers/abstract-provider
- */
- export interface ConnectionRpcProvider extends Provider {
- //send(method: string, params: Array<any>): Promise<any>;
- _subscribe(param: Array<any>, processFunc: (result: any) => void): number;
- _unsubscribe(filterId: number): void;
- }
- /**
- * @TODO
- *
- * @_docloc: api/providers/abstract-provider
- */
- export class BlockConnectionSubscriber implements Subscriber {
- #provider: ConnectionRpcProvider;
- #blockNumber: number;
- #running: boolean;
- #filterId: null | number;
- constructor(provider: ConnectionRpcProvider) {
- this.#provider = provider;
- this.#blockNumber = -2;
- this.#running = false;
- this.#filterId = null;
- }
- start(): void {
- if (this.#running) { return; }
- this.#running = true;
- this.#filterId = this.#provider._subscribe([ "newHeads" ], (result: any) => {
- const blockNumber = getNumber(result.number);
- const initial = (this.#blockNumber === -2) ? blockNumber: (this.#blockNumber + 1)
- for (let b = initial; b <= blockNumber; b++) {
- this.#provider.emit("block", b);
- }
- this.#blockNumber = blockNumber;
- });
- }
- stop(): void {
- if (!this.#running) { return; }
- this.#running = false;
- if (this.#filterId != null) {
- this.#provider._unsubscribe(this.#filterId);
- this.#filterId = null;
- }
- }
- pause(dropWhilePaused?: boolean): void {
- if (dropWhilePaused) { this.#blockNumber = -2; }
- this.stop();
- }
- resume(): void {
- this.start();
- }
- }
|