1234567891011121314151617import {ApiPromise} from '@polkadot/api';1819type PromiseType<T> = T extends PromiseLike<infer TInner> ? TInner : T;2021export default function promisifySubstrate<T extends (...args: any[]) => any>(api: ApiPromise, action: T): (...args: Parameters<T>) => Promise<PromiseType<ReturnType<T>>> {22 return (...args: Parameters<T>) => {23 const promise = new Promise<PromiseType<ReturnType<T>>>((resolve: ((result: PromiseType<ReturnType<T>>) => void) | undefined, reject: ((error: any) => void) | undefined) => {24 const cleanup = () => {25 api.off('disconnected', fail);26 api.off('error', fail);27 resolve = undefined;28 reject = undefined;29 };3031 const success = (r: any) => {32 resolve && resolve(r);33 cleanup();34 };35 const fail = (error: any) => {36 reject && reject(error);37 cleanup();38 };3940 api.on('disconnected', fail);41 api.on('error', fail);4243 const result = action(...args);44 Promise.resolve(result)45 .then(success, fail);4647 });48 return promise as any;49 };50}