50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import ContractBase from './contracts/ContractBase'
|
|
|
|
interface EventEmitter {
|
|
subscribe: Function
|
|
unsubscribe: Function
|
|
}
|
|
|
|
export interface ContractEventSubscription {
|
|
unsubscribe: () => void
|
|
}
|
|
|
|
export class ContractEvent {
|
|
constructor(
|
|
private eventEmitter: EventEmitter,
|
|
private contract: ContractBase,
|
|
private eventName: string,
|
|
private filter: { [key: string]: any }
|
|
) {}
|
|
|
|
public subscribe(callback: (events: any[]) => void): ContractEventSubscription {
|
|
const onEvent = async (blockNumber: number) => {
|
|
const events = await this.contract.getEventData(this.eventName, {
|
|
filter: this.filter,
|
|
fromBlock: blockNumber,
|
|
toBlock: 'latest'
|
|
})
|
|
if (events.length) {
|
|
callback(events)
|
|
}
|
|
}
|
|
|
|
this.eventEmitter.subscribe(onEvent)
|
|
return {
|
|
unsubscribe: () => this.eventEmitter.unsubscribe(onEvent)
|
|
}
|
|
}
|
|
|
|
public once(callback?: (events: any[]) => void) {
|
|
return new Promise((resolve) => {
|
|
const subscription = this.subscribe((events) => {
|
|
subscription.unsubscribe()
|
|
if (callback) {
|
|
callback(events)
|
|
}
|
|
resolve(events)
|
|
})
|
|
})
|
|
}
|
|
}
|