Skip to content

Commit 3a22767

Browse files
committed
feat(crosscheck): support provider manager
1 parent 3974b18 commit 3a22767

File tree

11 files changed

+40
-38
lines changed

11 files changed

+40
-38
lines changed

packages/orap/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,3 @@ export * from './signal'
22
export * from './store'
33
export * from './task'
44
export * from './orap'
5-
export * from './types'

packages/orap/orap.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { ProviderManager } from '@ora-io/rek'
1+
import type { Providers } from '@ora-io/rek'
2+
import { RekProviderManager } from '@ora-io/rek'
23
import { EventSignal } from './signal/event'
3-
import type { Providers } from './types'
44

55
export interface ListenOptions {
66
wsProvider: Providers
@@ -26,9 +26,9 @@ export class Orap {
2626

2727
_listenChain(wsProvider: Providers | string, httpProvider?: Providers | string) {
2828
if (typeof wsProvider === 'string')
29-
wsProvider = new ProviderManager(wsProvider)
29+
wsProvider = new RekProviderManager(wsProvider)
3030
if (httpProvider && typeof httpProvider === 'string')
31-
httpProvider = new ProviderManager(httpProvider)
31+
httpProvider = new RekProviderManager(httpProvider)
3232
this.routes.event.forEach(es => es.listen(wsProvider as Providers, httpProvider as Providers))
3333
}
3434

packages/orap/signal/event.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import type { EventFragment, Log } from 'ethers'
22
import { ethers } from 'ethers'
3-
import { AutoCrossChecker, ONE_MINUTE_MS, ProviderManager } from '@ora-io/rek'
4-
import type { AutoCrossCheckParam } from '@ora-io/rek'
5-
import type { Providers } from '../types'
3+
import { AutoCrossChecker, ONE_MINUTE_MS, RekProviderManager } from '@ora-io/rek'
4+
import type { AutoCrossCheckParam, Providers } from '@ora-io/rek'
65
import type { Signal } from './type'
76

87
export interface EventSignalRegisterParams {
@@ -62,7 +61,7 @@ export class EventSignal implements Signal {
6261
this.provider = provider
6362

6463
// start event listener
65-
if (provider instanceof ProviderManager) {
64+
if (provider instanceof RekProviderManager) {
6665
provider.addContract(this.params.address, this.contract)
6766
provider.addListener(this.params.address, this.params.eventName, this.subscribeCallback)
6867
}
@@ -79,15 +78,13 @@ export class EventSignal implements Signal {
7978
if (this.crosscheckerOptions) {
8079
if (!crosscheckProvider)
8180
throw new Error('crosschecker set, please provide crosscheckProvider to listen function')
82-
const _crosscheckProvider = crosscheckProvider instanceof ProviderManager ? crosscheckProvider.provider : crosscheckProvider
83-
if (_crosscheckProvider)
84-
this.startCrossChecker(_crosscheckProvider)
81+
this.startCrossChecker(crosscheckProvider)
8582
}
8683

8784
return this
8885
}
8986

90-
async startCrossChecker(provider: ethers.WebSocketProvider | ethers.JsonRpcProvider) {
87+
async startCrossChecker(provider: Providers) {
9188
if (!this.crosscheckerOptions)
9289
throw new Error('no crosscheck set, can\'t start crosschecker')
9390
this.crosschecker = new AutoCrossChecker(provider, this.crosscheckerOptions)

packages/rek/event/crosschecker/autochecker.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { ethers } from 'ethers'
22
import { logger, polling, retryOnNull, sleep } from '@ora-io/utils'
33
import { ETH_BLOCK_INTERVAL_MS } from '../../constants'
4+
import type { Providers } from '../../types/w3'
45
import { CrossCheckerCacheManager } from './cache/manager'
56
import type { AutoCrossCheckParam, CrossCheckRangeParam } from './interface'
67
import { BaseCrossChecker } from './basechecker'
@@ -11,7 +12,7 @@ export class AutoCrossChecker extends BaseCrossChecker {
1112
checkpointBlockNumber = 0
1213

1314
constructor(
14-
provider: ethers.Provider,
15+
provider: Providers,
1516
options?: AutoCrossCheckParam,
1617
) {
1718
super(provider)
@@ -51,7 +52,7 @@ export class AutoCrossChecker extends BaseCrossChecker {
5152
async start(options: AutoCrossCheckParam) {
5253
this.validate(options)
5354
// TODO: use blockNumber for performance
54-
const latestblocknum = await retryOnNull(async () => await this.provider.getBlockNumber())
55+
const latestblocknum = await retryOnNull(async () => await this.provider.provider?.getBlockNumber())
5556
const {
5657
fromBlock = latestblocknum,
5758
batchBlocksCount = 10,
@@ -90,7 +91,7 @@ export class AutoCrossChecker extends BaseCrossChecker {
9091

9192
const waitNextCrosscheck = async (): Promise<boolean> => {
9293
// TODO: use blockNumber for performance
93-
const latestblocknum = (await retryOnNull(async () => await this.provider.getBlock('latest'))).number
94+
const latestblocknum = (await retryOnNull(async () => await this.provider.provider?.getBlock('latest'))).number
9495
logger.info(`[*] ccrOptions: fromBlock ${ccrOptions.fromBlock}, toBlock ${ccrOptions.toBlock}, latestblocknum ${latestblocknum}`)
9596
if (ccrOptions.toBlock + delayBlockFromLatest > latestblocknum) {
9697
// sleep until the toBlock

packages/rek/event/crosschecker/basechecker.ts

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import type { ethers } from 'ethers'
22
import { logger, retryOnNull } from '@ora-io/utils'
33
import { ETH_BLOCK_COUNT_ONE_HOUR } from '../../constants'
4+
import type { Providers } from '../../types/w3'
45
import type { CrossCheckFromParam, CrossCheckRangeParam, CrossCheckRetroParam, SimpleLog } from './interface'
56

67
export class BaseCrossChecker {
7-
provider: ethers.Provider
8-
constructor(provider: ethers.Provider) {
8+
provider: Providers
9+
constructor(provider: Providers) {
910
this.provider = provider
1011
}
1112

@@ -33,7 +34,7 @@ export class BaseCrossChecker {
3334

3435
// define from, to
3536
// TODO: use blockNumber for performance
36-
const block = await retryOnNull(async () => await this.provider.getBlock('latest'))
37+
const block = await retryOnNull(async () => await this.provider.provider?.getBlock('latest'))
3738
const options: CrossCheckRangeParam = {
3839
...ccrOptions,
3940
fromBlock: block.number - retroBlockCount,
@@ -52,7 +53,7 @@ export class BaseCrossChecker {
5253
ccfOptions: CrossCheckFromParam,
5354
) {
5455
// TODO: use blockNumber for performance
55-
const block = await retryOnNull(async () => await this.provider.getBlock('latest'))
56+
const block = await retryOnNull(async () => await this.provider.provider?.getBlock('latest'))
5657

5758
// suggest use large retroBlockCount
5859
if (block.number - ccfOptions.fromBlock < ETH_BLOCK_COUNT_ONE_HOUR)
@@ -103,16 +104,18 @@ export class BaseCrossChecker {
103104
...(address && { address }),
104105
...(topics && { topics }),
105106
}
106-
const logs = await this.provider.getLogs(params)
107-
// get ignoreLogs keys
108-
const ignoreLogs = options.ignoreLogs
107+
if (this.provider.provider) {
108+
const logs = await this.provider.provider?.getLogs(params)
109+
// get ignoreLogs keys
110+
const ignoreLogs = options.ignoreLogs
109111

110-
// crosscheck missing logs
111-
const missingLogs = ignoreLogs ? await this.diff(logs, ignoreLogs) : logs
112+
// crosscheck missing logs
113+
const missingLogs = ignoreLogs ? await this.diff(logs, ignoreLogs) : logs
112114

113-
// callback on missing logs
114-
for (const log of missingLogs)
115-
await options.onMissingLog(log)
115+
// callback on missing logs
116+
for (const log of missingLogs)
117+
await options.onMissingLog(log)
118+
}
116119
}
117120
}
118121

packages/rek/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ export * from './event/crosschecker/basechecker'
22
export * from './event/crosschecker/autochecker'
33
export * from './event/crosschecker/interface'
44
export * from './constants'
5-
export * from './managers'
5+
export * from './provider'
6+
export * from './types'
File renamed without changes.
File renamed without changes.

packages/rek/managers/provider.ts renamed to packages/rek/provider/provider.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ import { Interface, WebSocketProvider, ethers } from 'ethers'
44
import type { ErrorEvent, WebSocket } from 'ws'
55
import { ContractManager } from './contract'
66

7-
export interface ProviderManagerOptions {
7+
export interface RekProviderManagerOptions {
88
/**
99
* The interval of heartbeat, default is 10s
1010
*/
1111
heartbeatInterval?: number
1212
}
1313

14-
export type ProviderManagerEvent = 'error' | 'close'
14+
export type RekProviderManagerEvent = 'error' | 'close'
1515

16-
export class ProviderManager {
16+
export class RekProviderManager {
1717
private _provider?: ethers.JsonRpcProvider | ethers.WebSocketProvider
1818
private _contracts: Map<string, ContractManager> = new Map()
1919

@@ -23,7 +23,7 @@ export class ProviderManager {
2323

2424
private _event?: EventEmitter
2525

26-
constructor(public providerUrl: string, options?: ProviderManagerOptions) {
26+
constructor(public providerUrl: string, options?: RekProviderManagerOptions) {
2727
this.connect()
2828
if (options?.heartbeatInterval)
2929
this._heartbeatInterval = options.heartbeatInterval
@@ -99,21 +99,21 @@ export class ProviderManager {
9999
})
100100
}
101101

102-
on(event: ProviderManagerEvent, listener: (...args: any[]) => void) {
102+
on(event: RekProviderManagerEvent, listener: (...args: any[]) => void) {
103103
if (!this._event)
104104
this._event = new EventEmitter()
105105

106106
this._event?.on(event, listener)
107107
}
108108

109-
once(event: ProviderManagerEvent, listener: (...args: any[]) => void) {
109+
once(event: RekProviderManagerEvent, listener: (...args: any[]) => void) {
110110
if (!this._event)
111111
this._event = new EventEmitter()
112112

113113
this._event?.once(event, listener)
114114
}
115115

116-
removeEvent(event: ProviderManagerEvent, listener: (...args: any[]) => void) {
116+
removeEvent(event: RekProviderManagerEvent, listener: (...args: any[]) => void) {
117117
this._event?.removeListener(event, listener)
118118
}
119119

packages/rek/types/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './w3'

0 commit comments

Comments
 (0)