diff --git a/packages/api/src/promise/index.ts b/packages/api/src/promise/index.ts index 679c140438..3756c97ed7 100644 --- a/packages/api/src/promise/index.ts +++ b/packages/api/src/promise/index.ts @@ -211,7 +211,19 @@ export class ApiPromise extends ApiBase<'promise'> { * ``` */ public static create (options?: ApiOptions): Promise { - return new ApiPromise(options).isReady; + const instance = new ApiPromise(options); + + if (options && options.throwOnConnect) { + return instance.isReadyOrError; + } + + // Swallow any rejections on isReadyOrError + // (in Node 15.x this creates issues, when not being looked at) + instance.isReadyOrError.catch(() => { + // ignore + }); + + return instance.isReady; } /** @@ -235,18 +247,14 @@ export class ApiPromise extends ApiBase<'promise'> { super(options, 'promise', decorateMethod); this.#isReadyPromise = new Promise((resolve): void => { - super.once('ready', (): void => { - resolve(this); - }); + super.once('ready', () => resolve(this)); }); this.#isReadyOrErrorPromise = new Promise((resolve, reject): void => { - super.once('ready', (): void => { - resolve(this); - }); - super.once('error', (e): void => { - reject(e); - }); + const tracker = promiseTracker(resolve, reject); + + super.once('ready', () => tracker.resolve(this)); + super.once('error', (e) => tracker.reject(e)); }); } diff --git a/packages/api/src/types/index.ts b/packages/api/src/types/index.ts index 3cf1db073a..8e31df31df 100644 --- a/packages/api/src/types/index.ts +++ b/packages/api/src/types/index.ts @@ -69,6 +69,10 @@ export interface ApiOptions extends RegisteredTypes { * @description The source object to use for runtime information (only used when cloning) */ source?: ApiBase; + /** + * @description Throws an error when the initial connection fails (same as isReadyOrError) + */ + throwOnConnect?: boolean; } // A smaller interface of ApiRx, used in derive and in SubmittableExtrinsic