UNPKG

@schemeless/event-store-react-native

Version:

React Native compatible build of the [`@schemeless/event-store`](../event-store) runtime. It mirrors the Node.js implementation but swaps the internal queue implementation to [`react-native-better-queue`](https://github.com/YahyaASadiq/react-native-better

38 lines (35 loc) 1.3 kB
import type { BaseEvent, CreatedEvent, EventFlowMap } from '@schemeless/event-store-types'; import * as Queue from 'better-queue'; import { from, of, pipe } from 'rxjs'; import * as Rx from 'rxjs/operators'; import { getEventFlow } from './getEventFlow'; import { logEvent } from '../util/logEvent'; const cancelEvent = (eventFlowMap: EventFlowMap) => async (event: CreatedEvent<any>) => { const eventFlow = getEventFlow(eventFlowMap)(event); if (eventFlow.cancelApply) { logEvent(event, '❌', 'cancel'); await eventFlow.cancelApply(event); } else { logEvent(event, '🤔️', 'noCancel?'); } return event; }; export const cleanupAndCancelFailedEvent = ( eventFlowMap: EventFlowMap, done: Queue.ProcessFunctionCb<any>, event: BaseEvent<any> ) => pipe( // call event canceler if failed Rx.concatMap(([doneEvents, eventTaskAndError]) => { if (eventTaskAndError && doneEvents.length > 0) { return of(doneEvents).pipe( Rx.concatMap((events) => from(events).pipe(Rx.mergeMap(cancelEvent(eventFlowMap)))), Rx.mapTo([doneEvents, eventTaskAndError]) ); } else { return of([doneEvents, eventTaskAndError]); } }), Rx.tap(([doneEvents, eventTaskAndError]) => done(eventTaskAndError, doneEvents)) );