difftreelog
tests: allow returning result from usingApi
in: master
1 file changed
tests/src/substrate/substrate-api.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//56import { WsProvider, ApiPromise } from "@polkadot/api";7import { EventRecord } from '@polkadot/types/interfaces/system/types';8import { ExtrinsicStatus } from '@polkadot/types/interfaces/author/types';9import { IKeyringPair } from "@polkadot/types/types";1011import config from "../config";12import promisifySubstrate from "./promisify-substrate";13import { ApiOptions, SubmittableExtrinsic, ApiTypes } from "@polkadot/api/types";14import rtt from "../../../runtime_types.json";1516function defaultApiOptions(): ApiOptions {17 const wsProvider = new WsProvider(config.substrateUrl);18 return { provider: wsProvider, types: rtt };19}2021export default async function usingApi(action: (api: ApiPromise) => Promise<void>, settings: ApiOptions | undefined = undefined): Promise<void> {22 settings = settings || defaultApiOptions();23 let api: ApiPromise = new ApiPromise(settings);2425 // TODO: Remove, this is temporary: Filter unneeded API output 26 // (Jaco promised it will be removed in the next version)27 const consoleLog = console.log;28 console.log = (message: string) => {29 if (message.includes("API/INIT: Capabilities detected") || message.includes("2021-")) {}30 else if (message.includes("StorageChangeSet:: WebSocket is not connected") || message.includes("2021-")) {}31 else consoleLog(message);32 };33 const consoleErr = console.error;34 console.error = (message: string) => {35 if (message.includes("StorageChangeSet:: WebSocket is not connected") || message.includes("2021-")) {}36 else consoleErr(message);37 };3839 try {40 await promisifySubstrate(api, async () => {41 if(api) {42 await api.isReadyOrError;43 await action(api);44 }45 })();46 } finally {47 await api.disconnect();48 console.log = consoleLog;49 console.error = consoleErr;50 }51}5253enum TransactionStatus {54 Success,55 Fail,56 NotReady57}5859function getTransactionStatus(events: EventRecord[], status: ExtrinsicStatus): TransactionStatus {60 if (status.isReady) {61 return TransactionStatus.NotReady;62 }63 if (status.isBroadcast) {64 return TransactionStatus.NotReady;65 } 66 if (status.isInBlock || status.isFinalized) {67 if(events.filter(e => e.event.data.method === 'ExtrinsicFailed').length > 0) {68 return TransactionStatus.Fail;69 }70 if(events.filter(e => e.event.data.method === 'ExtrinsicSuccess').length > 0) {71 return TransactionStatus.Success;72 }73 }7475 return TransactionStatus.Fail;76}7778export function79submitTransactionAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {80 return new Promise(async (resolve, reject) => {81 try {82 await transaction.signAndSend(sender, ({ events = [], status }) => {83 const transactionStatus = getTransactionStatus(events, status);8485 if (transactionStatus === TransactionStatus.Success) {86 resolve(events);87 } else if (transactionStatus === TransactionStatus.Fail) {88 console.log(`Something went wrong with transaction. Status: ${status}`);89 reject(events);90 }91 });92 } catch (e) {93 console.log('Error: ', e);94 reject(e);95 }96 });97}9899export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {100 const consoleError = console.error;101 const consoleLog = console.log;102 console.error = () => {};103 console.log = () => {};104105 return new Promise<EventRecord[]>(async function(res, rej) {106 const resolve = (rec: EventRecord[]) => {107 setTimeout(() => {108 res(rec);109 console.error = consoleError;110 console.log = consoleLog;111 });112 };113 const reject = (errror: any) => {114 setTimeout(() => {115 rej(errror);116 console.error = consoleError;117 console.log = consoleLog;118 });119 };120 try {121 await transaction.signAndSend(sender, ({ events = [], status }) => {122 const transactionStatus = getTransactionStatus(events, status);123124 // console.log('transactionStatus', transactionStatus, 'events', events);125126 if (transactionStatus === TransactionStatus.Success) {127 resolve(events);128 } else if (transactionStatus === TransactionStatus.Fail) {129 reject(events);130 }131 });132 } catch (e) {133 reject(e);134 }135 });136}1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//56import { WsProvider, ApiPromise } from "@polkadot/api";7import { EventRecord } from '@polkadot/types/interfaces/system/types';8import { ExtrinsicStatus } from '@polkadot/types/interfaces/author/types';9import { IKeyringPair } from "@polkadot/types/types";1011import config from "../config";12import promisifySubstrate from "./promisify-substrate";13import { ApiOptions, SubmittableExtrinsic, ApiTypes } from "@polkadot/api/types";14import rtt from "../../../runtime_types.json";1516function defaultApiOptions(): ApiOptions {17 const wsProvider = new WsProvider(config.substrateUrl);18 return { provider: wsProvider, types: rtt };19}2021export default async function usingApi<T = void>(action: (api: ApiPromise) => Promise<T>, settings: ApiOptions | undefined = undefined): Promise<T> {22 settings = settings || defaultApiOptions();23 let api: ApiPromise = new ApiPromise(settings);24 let result: T = null as unknown as T;2526 // TODO: Remove, this is temporary: Filter unneeded API output 27 // (Jaco promised it will be removed in the next version)28 const consoleLog = console.log;29 console.log = (message: string) => {30 if (message.includes("API/INIT: Capabilities detected") || message.includes("2021-")) {}31 else if (message.includes("StorageChangeSet:: WebSocket is not connected") || message.includes("2021-")) {}32 else consoleLog(message);33 };34 const consoleErr = console.error;35 console.error = (message: string) => {36 if (message.includes("StorageChangeSet:: WebSocket is not connected") || message.includes("2021-")) {}37 else consoleErr(message);38 };3940 try {41 await promisifySubstrate(api, async () => {42 if (api) {43 await api.isReadyOrError;44 result = await action(api);45 }46 })();47 } finally {48 await api.disconnect();49 console.log = consoleLog;50 console.error = consoleErr;51 }52 return result as T;53}5455enum TransactionStatus {56 Success,57 Fail,58 NotReady59}6061function getTransactionStatus(events: EventRecord[], status: ExtrinsicStatus): TransactionStatus {62 if (status.isReady) {63 return TransactionStatus.NotReady;64 }65 if (status.isBroadcast) {66 return TransactionStatus.NotReady;67 } 68 if (status.isInBlock || status.isFinalized) {69 if(events.filter(e => e.event.data.method === 'ExtrinsicFailed').length > 0) {70 return TransactionStatus.Fail;71 }72 if(events.filter(e => e.event.data.method === 'ExtrinsicSuccess').length > 0) {73 return TransactionStatus.Success;74 }75 }7677 return TransactionStatus.Fail;78}7980export function81submitTransactionAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {82 return new Promise(async (resolve, reject) => {83 try {84 await transaction.signAndSend(sender, ({ events = [], status }) => {85 const transactionStatus = getTransactionStatus(events, status);8687 if (transactionStatus === TransactionStatus.Success) {88 resolve(events);89 } else if (transactionStatus === TransactionStatus.Fail) {90 console.log(`Something went wrong with transaction. Status: ${status}`);91 reject(events);92 }93 });94 } catch (e) {95 console.log('Error: ', e);96 reject(e);97 }98 });99}100101export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {102 const consoleError = console.error;103 const consoleLog = console.log;104 console.error = () => {};105 console.log = () => {};106107 return new Promise<EventRecord[]>(async function(res, rej) {108 const resolve = (rec: EventRecord[]) => {109 setTimeout(() => {110 res(rec);111 console.error = consoleError;112 console.log = consoleLog;113 });114 };115 const reject = (errror: any) => {116 setTimeout(() => {117 rej(errror);118 console.error = consoleError;119 console.log = consoleLog;120 });121 };122 try {123 await transaction.signAndSend(sender, ({ events = [], status }) => {124 const transactionStatus = getTransactionStatus(events, status);125126 // console.log('transactionStatus', transactionStatus, 'events', events);127128 if (transactionStatus === TransactionStatus.Success) {129 resolve(events);130 } else if (transactionStatus === TransactionStatus.Fail) {131 reject(events);132 }133 });134 } catch (e) {135 reject(e);136 }137 });138}