Fixed lingering events in provider after removal.
This commit is contained in:
parent
741bd05830
commit
453d2357b1
@ -80,8 +80,13 @@ class PreparedTopicFilter implements DeferredTopicFilter {
|
||||
const resolver = canResolve(runner) ? runner: null;
|
||||
this.#filter = (async function() {
|
||||
const resolvedArgs = await Promise.all(fragment.inputs.map((param, index) => {
|
||||
const arg = args[index];
|
||||
if (arg == null) { return null; }
|
||||
|
||||
return param.walkAsync(args[index], (type, value) => {
|
||||
if (type === "address") { return resolveAddress(value, resolver); }
|
||||
if (type === "address") {
|
||||
return resolveAddress(value, resolver);
|
||||
}
|
||||
return value;
|
||||
});
|
||||
}));
|
||||
@ -443,17 +448,21 @@ async function getSub(contract: BaseContract, operation: string, event: Contract
|
||||
}
|
||||
};
|
||||
|
||||
let started = false;
|
||||
let starting: Array<Promise<any>> = [ ];
|
||||
const start = () => {
|
||||
if (started) { return; }
|
||||
provider.on(filter, listener);
|
||||
started = true;
|
||||
if (starting.length) { return; }
|
||||
starting.push(provider.on(filter, listener));
|
||||
};
|
||||
const stop = () => {
|
||||
if (!started) { return; }
|
||||
|
||||
const stop = async () => {
|
||||
if (starting.length == 0) { return; }
|
||||
|
||||
let started = starting;
|
||||
starting = [ ];
|
||||
await Promise.all(started);
|
||||
provider.off(filter, listener);
|
||||
started = false;
|
||||
};
|
||||
|
||||
sub = { tag, listeners: [ ], start, stop };
|
||||
subs.set(tag, sub);
|
||||
}
|
||||
|
@ -28,6 +28,8 @@ export class FilterIdSubscriber implements Subscriber {
|
||||
|
||||
#network: null | Network;
|
||||
|
||||
#hault: boolean;
|
||||
|
||||
constructor(provider: JsonRpcApiProvider) {
|
||||
this.#provider = provider;
|
||||
|
||||
@ -35,6 +37,8 @@ export class FilterIdSubscriber implements Subscriber {
|
||||
this.#poller = this.#poll.bind(this);
|
||||
|
||||
this.#network = null;
|
||||
|
||||
this.#hault = false;
|
||||
}
|
||||
|
||||
_subscribe(provider: JsonRpcApiProvider): Promise<string> {
|
||||
@ -68,6 +72,8 @@ export class FilterIdSubscriber implements Subscriber {
|
||||
throw new Error("chaid changed");
|
||||
}
|
||||
|
||||
if (this.#hault) { return; }
|
||||
|
||||
const result = await this.#provider.send("eth_getFilterChanges", [ filterId ]);
|
||||
await this._emitResults(this.#provider, result);
|
||||
} catch (error) { console.log("@TODO", error); }
|
||||
@ -88,6 +94,7 @@ export class FilterIdSubscriber implements Subscriber {
|
||||
start(): void { this.#poll(-2); }
|
||||
|
||||
stop(): void {
|
||||
this.#hault = true;
|
||||
this.#teardown();
|
||||
this.#provider.off("block", this.#poller);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user