Skip to content

Commit 74470de

Browse files
committed
Fixed abundant UnhandledRejectErrors in provider polling (#1084, #1208, #1221, #1235).
1 parent 8175c83 commit 74470de

File tree

1 file changed

+32
-10
lines changed

1 file changed

+32
-10
lines changed

packages/providers/src.ts/base-provider.ts

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -587,10 +587,18 @@ export class BaseProvider extends Provider implements EnsProvider {
587587

588588
const internalBlockNumber = this._internalBlockNumber;
589589

590-
if (maxAge > 0 && this._internalBlockNumber) {
591-
const result = await internalBlockNumber;
592-
if ((getTime() - result.respTime) <= maxAge) {
593-
return result.blockNumber;
590+
if (maxAge > 0 && internalBlockNumber) {
591+
try {
592+
const result = await internalBlockNumber;
593+
if ((getTime() - result.respTime) <= maxAge) {
594+
return result.blockNumber;
595+
}
596+
} catch(error) {
597+
// Don't null the dead (rejected) fetch, if it has already been updated
598+
if (this._internalBlockNumber === internalBlockNumber) {
599+
this._internalBlockNumber = null;
600+
}
601+
throw error;
594602
}
595603
}
596604

@@ -620,6 +628,14 @@ export class BaseProvider extends Provider implements EnsProvider {
620628

621629
this._internalBlockNumber = checkInternalBlockNumber;
622630

631+
// Swallow unhandled exceptions; if needed they are handled else where
632+
checkInternalBlockNumber.catch((error) => {
633+
// Don't null the dead (rejected) fetch, if it has already been updated
634+
if (this._internalBlockNumber === checkInternalBlockNumber) {
635+
this._internalBlockNumber = null;
636+
}
637+
});
638+
623639
return (await checkInternalBlockNumber).blockNumber;
624640
}
625641

@@ -629,7 +645,13 @@ export class BaseProvider extends Provider implements EnsProvider {
629645
// Track all running promises, so we can trigger a post-poll once they are complete
630646
const runners: Array<Promise<void>> = [];
631647

632-
const blockNumber = await this._getInternalBlockNumber(100 + this.pollingInterval / 2);
648+
let blockNumber: number = null;
649+
try {
650+
blockNumber = await this._getInternalBlockNumber(100 + this.pollingInterval / 2);
651+
} catch (error) {
652+
this.emit("error", error);
653+
return;
654+
}
633655
this._setFastBlockNumber(blockNumber);
634656

635657
// Emit a poll event after we have the latest (fast) block number
@@ -733,9 +755,9 @@ export class BaseProvider extends Provider implements EnsProvider {
733755
// Once all events for this loop have been processed, emit "didPoll"
734756
Promise.all(runners).then(() => {
735757
this.emit("didPoll", pollId);
736-
});
758+
}).catch((error) => { this.emit("error", error); });
737759

738-
return null;
760+
return;
739761
}
740762

741763
// Deprecated; do not use this
@@ -804,7 +826,7 @@ export class BaseProvider extends Provider implements EnsProvider {
804826
get blockNumber(): number {
805827
this._getInternalBlockNumber(100 + this.pollingInterval / 2).then((blockNumber) => {
806828
this._setFastBlockNumber(blockNumber);
807-
});
829+
}, (error) => { });
808830

809831
return (this._fastBlockNumber != null) ? this._fastBlockNumber: -1;
810832
}
@@ -815,7 +837,7 @@ export class BaseProvider extends Provider implements EnsProvider {
815837

816838
set polling(value: boolean) {
817839
if (value && !this._poller) {
818-
this._poller = setInterval(this.poll.bind(this), this.pollingInterval);
840+
this._poller = setInterval(() => { this.poll(); }, this.pollingInterval);
819841

820842
if (!this._bootstrapPoll) {
821843
this._bootstrapPoll = setTimeout(() => {
@@ -853,7 +875,7 @@ export class BaseProvider extends Provider implements EnsProvider {
853875

854876
if (this._poller) {
855877
clearInterval(this._poller);
856-
this._poller = setInterval(() => { this.poll() }, this._pollingInterval);
878+
this._poller = setInterval(() => { this.poll(); }, this._pollingInterval);
857879
}
858880
}
859881

0 commit comments

Comments
 (0)