import { merge, defer } from 'rxjs'; import { AnySocketEpic, BackgroundEpic, SocketEpic, InputOfEpic, OutputOfEpic, DependenciesOfBackgroundEpic, DependenciesOfSocketEpic, } from './kit'; import { retryWithBackoff } from './retryWithBackoff'; import { Utils } from '@aimee-blue/ab-shared'; export function mergeBackgroundEpics( ...epics: E[] ): BackgroundEpic< InputOfEpic, OutputOfEpic, DependenciesOfBackgroundEpic > { return ((...[events, ctx, ...rest]: Parameters) => { return merge( ...epics.map(epic => defer(() => epic(events, { ...(epic.buildDeps?.() ?? {}), ...ctx }, ...rest) ).pipe( retryWithBackoff({ sourceDescription: `${epic.name} epic`, logger: ctx.logger, }) ) ) ); }) as BackgroundEpic< InputOfEpic, OutputOfEpic, DependenciesOfBackgroundEpic >; } export function mergeEpics( name: string, ...epics: E[] ): SocketEpic, OutputOfEpic, DependenciesOfSocketEpic> { const mergedEpic = Utils.setFunctionName( name, (...[commands, ctx, ...rest]) => { return merge( ...epics.map(epic => defer(() => epic(commands, { ...(epic.buildDeps?.() ?? {}), ...ctx }, ...rest) ).pipe( retryWithBackoff({ sourceDescription: `${epic.name} epic`, logger: ctx.logger, }) ) ) ); } ) as SocketEpic, OutputOfEpic, DependenciesOfSocketEpic>; return mergedEpic; } export const mergeActionEpics = mergeEpics;