diff --git a/src/chain-observers/index.ts b/src/chain-observers/index.ts index 3a728188d8c5458f7da8f9936f27ac919a9ee1fa..6f4b95c9df683fdf500d38053e1b5dd449a966f9 100644 --- a/src/chain-observers/index.ts +++ b/src/chain-observers/index.ts @@ -15,6 +15,7 @@ export type { IBlockHeaderProviderData } from "./providers/block-header-provider export type { IBlockProviderData } from "./providers/block-provider"; export type { IExchangeTransferMetadata, IExchangeTransferProviderData } from "./providers/exchange-transfer-provider"; export type { IFeedPriceData, IFeedPriceProviderData } from "./providers/feed-price-provider"; +export type { IImpactedAccountProviderData, ImpactedAccountProvider, TImpactedAccountProvided } from "./providers/impacted-account-provider"; export type { IInternalMarketCancelOperation, IInternalMarketCreateOperation, IInternalMarketProviderData, TInternalMarketOperation diff --git a/src/chain-observers/providers/impacted-account-provider.ts b/src/chain-observers/providers/impacted-account-provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..ee9efcf6c0d357f320d49ea3bdc141fb6d0d7651 --- /dev/null +++ b/src/chain-observers/providers/impacted-account-provider.ts @@ -0,0 +1,48 @@ +import { TAccountName } from "@hiveio/wax"; +import { WorkerBeeIterable } from "../../types/iterator"; +import { ImpactedAccountClassifier } from "../classifiers"; +import { TRegisterEvaluationContext } from "../classifiers/collector-classifier-base"; +import { IOperationTransactionPair } from "../classifiers/operation-classifier"; +import { DataEvaluationContext } from "../factories/data-evaluation-context"; +import { ProviderBase } from "./provider-base"; + +export type TImpactedAccountProvided<TAccounts extends Array<TAccountName>> = { + [K in TAccounts[number]]: WorkerBeeIterable<IOperationTransactionPair>; +}; + +export interface IImpactedAccountProviderData<TAccounts extends Array<TAccountName>> { + impactedAccounts: TImpactedAccountProvided<TAccounts>; +}; + +export interface IImpactedAccountProviderOptions { + accounts: string[]; +} + +export class ImpactedAccountProvider<TAccounts extends Array<TAccountName> = Array<TAccountName>> extends ProviderBase<IImpactedAccountProviderOptions> { + public readonly accounts: string[] = []; + + public pushOptions(options: IImpactedAccountProviderOptions): void { + this.accounts.push(...options.accounts); + } + + public usedContexts(): Array<TRegisterEvaluationContext> { + return [ + ImpactedAccountClassifier + ]; + } + + public async provide(data: DataEvaluationContext): Promise<IImpactedAccountProviderData<TAccounts>> { + const result = { + impactedAccounts: {} + }; + + const { impactedAccounts } = await data.get(ImpactedAccountClassifier); + for(const account of this.accounts) + if (impactedAccounts[account] === undefined) + result.impactedAccounts[account] = new WorkerBeeIterable<IOperationTransactionPair>([]); + else // Copy the array to prevent the original from being modified + result.impactedAccounts[account] = new WorkerBeeIterable<IOperationTransactionPair>(Array.from(impactedAccounts[account].operations)); + + return result as IImpactedAccountProviderData<TAccounts>; + } +} diff --git a/src/queen.ts b/src/queen.ts index ef366997976c3a31eef5d32c30f9e76884e09457..2f148041c26373674a1460cb193717dff71e2372 100644 --- a/src/queen.ts +++ b/src/queen.ts @@ -30,6 +30,7 @@ import { BlockHeaderProvider } from "./chain-observers/providers/block-header-pr import { BlockProvider } from "./chain-observers/providers/block-provider"; import { ExchangeTransferProvider } from "./chain-observers/providers/exchange-transfer-provider"; import { FeedPriceProvider } from "./chain-observers/providers/feed-price-provider"; +import { ImpactedAccountProvider } from "./chain-observers/providers/impacted-account-provider"; import { InternalMarketProvider } from "./chain-observers/providers/internal-market-provider"; import { MentionedAccountProvider } from "./chain-observers/providers/mention-provider"; import { ProviderBase } from "./chain-observers/providers/provider-base"; @@ -203,8 +204,11 @@ export class QueenBee<TPreviousSubscriberData extends object = {}> { return this; } - public onImpactedAccount(account: TAccountName): QueenBee<TPreviousSubscriberData> { + public onImpactedAccount< + TAccount extends TAccountName + >(account: TAccountName): QueenBee<TPreviousSubscriberData & Awaited<ReturnType<ImpactedAccountProvider<[TAccount]>["provide"]>>> { this.operands.push(new ImpactedAccountFilter(this.worker, account)); + this.pushProvider(ImpactedAccountProvider, { accounts: [ account ] }); return this; }