Skip to content

Commit c0a9490

Browse files
committed
feat(orap): support provider manager
1 parent b205cb1 commit c0a9490

File tree

7 files changed

+41
-27
lines changed

7 files changed

+41
-27
lines changed

packages/orap/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ 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,9 +1,9 @@
1-
import type { ethers } from 'ethers'
21
import { EventSignal } from './signal/event'
2+
import type { Providers } from './types'
33

44
export interface ListenOptions {
5-
wsProvider: ethers.WebSocketProvider
6-
httpProvider?: ethers.JsonRpcProvider
5+
wsProvider: Providers
6+
httpProvider?: Providers
77
}
88

99
export class Orap {
@@ -23,7 +23,7 @@ export class Orap {
2323
return es
2424
}
2525

26-
_listenChain(wsProvider: ethers.WebSocketProvider, httpProvider?: ethers.JsonRpcProvider) {
26+
_listenChain(wsProvider: Providers, httpProvider?: Providers) {
2727
this.routes.event.forEach(es => es.listen(wsProvider, httpProvider))
2828
}
2929

packages/orap/signal/event.ts

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

78
export interface EventSignalRegisterParams {
@@ -14,7 +15,7 @@ export interface EventSignalRegisterParams {
1415
export type EventSignalCallback = ethers.Listener
1516

1617
export class EventSignal implements Signal {
17-
provider?: ethers.JsonRpcProvider | ethers.WebSocketProvider
18+
provider?: Providers
1819
contract: ethers.Contract
1920
esig: string
2021
eventFragment: EventFragment
@@ -57,28 +58,36 @@ export class EventSignal implements Signal {
5758

5859
// TODO: how to integrate crosschecker
5960
// TODO: should be wsProvider only?
60-
listen(provider: ethers.WebSocketProvider, crosscheckProvider?: ethers.JsonRpcProvider) {
61+
listen(provider: Providers, crosscheckProvider?: Providers) {
6162
this.provider = provider
6263

6364
// start event listener
64-
const listener = this.contract.connect(provider)
65-
listener?.on(
66-
this.params.eventName,
67-
// TODO: calling this seems to be async, should we make it to sequential?
68-
this.subscribeCallback,
69-
)
65+
if (provider instanceof ProviderManager) {
66+
provider.addContract(this.params.address, this.contract)
67+
provider.addListener(this.params.address, this.params.eventName, this.subscribeCallback)
68+
}
69+
else {
70+
const listener = this.contract.connect(provider)
71+
listener?.on(
72+
this.params.eventName,
73+
// TODO: calling this seems to be async, should we make it to sequential?
74+
this.subscribeCallback,
75+
)
76+
}
7077

7178
// start cross-checker if ever set
7279
if (this.crosscheckerOptions) {
7380
if (!crosscheckProvider)
7481
throw new Error('crosschecker set, please provide crosscheckProvider to listen function')
75-
this.startCrossChecker(crosscheckProvider)
82+
const _crosscheckProvider = crosscheckProvider instanceof ProviderManager ? crosscheckProvider.provider : crosscheckProvider
83+
if (_crosscheckProvider)
84+
this.startCrossChecker(_crosscheckProvider)
7685
}
7786

7887
return this
7988
}
8089

81-
async startCrossChecker(provider: ethers.JsonRpcProvider) {
90+
async startCrossChecker(provider: ethers.WebSocketProvider | ethers.JsonRpcProvider) {
8291
if (!this.crosscheckerOptions)
8392
throw new Error('no crosscheck set, can\'t start crosschecker')
8493
this.crosschecker = new AutoCrossChecker(provider, this.crosscheckerOptions)

packages/orap/types/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import type { ProviderManager } from '@ora-io/rek'
2+
import type { ethers } from 'ethers'
3+
4+
export type Providers = ethers.WebSocketProvider | ethers.JsonRpcProvider | ProviderManager

packages/rek/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ 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'

packages/rek/managers/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './contract'
2+
export * from './provider'

packages/rek/managers/provider.ts

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { EventEmitter } from 'node:events'
2-
import type { Interface, InterfaceAbi } from 'ethers'
3-
import { WebSocketProvider, ethers } from 'ethers'
2+
import type { InterfaceAbi } from 'ethers'
3+
import { Interface, WebSocketProvider, ethers } from 'ethers'
44
import type { ErrorEvent, WebSocket } from 'ws'
55
import { ContractManager } from './contract'
66

@@ -48,24 +48,21 @@ export class ProviderManager {
4848
return this._contracts
4949
}
5050

51-
async addContract(address: ethers.Contract): Promise<ContractManager | undefined>
52-
53-
async addContract(address: string, abi: Interface | InterfaceAbi): Promise<ContractManager | undefined>
54-
55-
async addContract(address: string | ethers.Contract, abi?: Interface | InterfaceAbi): Promise<ContractManager | undefined> {
51+
addContract(address: string, contract: ethers.Contract): ContractManager | undefined
52+
addContract(address: string, abi: Interface | InterfaceAbi): ContractManager | undefined
53+
addContract(address: string, abi: Interface | InterfaceAbi | ethers.Contract): ContractManager | undefined {
5654
if (this._provider) {
57-
if (typeof address === 'string') {
55+
if (abi instanceof Interface || Array.isArray(abi)) {
5856
if (!abi)
5957
throw new Error('ABI must be provided when address is a string')
6058

6159
const contract = new ContractManager(address, abi, this._provider)
6260
this._contracts.set(address, contract)
6361
return contract
6462
}
65-
else if (address instanceof ethers.Contract) {
66-
const contractAddress = await address.getAddress()
67-
const contract = new ContractManager(contractAddress, address.interface, this._provider)
68-
this._contracts.set(contractAddress, contract)
63+
else if (abi instanceof ethers.Contract) {
64+
const contract = new ContractManager(address, abi.interface, this._provider)
65+
this._contracts.set(address, contract)
6966
return contract
7067
}
7168
else {

0 commit comments

Comments
 (0)