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

60 lines (59 loc) 2.88 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.makeObserverQueue = void 0; const event_store_types_1 = require("@schemeless/event-store-types"); const RxQueue_1 = require("./RxQueue"); const R = require("ramda"); const Rx = require("rxjs/operators"); const logEvent_1 = require("../util/logEvent"); const makeObserverMap = (successEventObservers) => { const observerMap = successEventObservers.reduce((acc, observer) => { observer.filters.forEach((filter) => { const domainType = filter.domain + '__' + filter.type; const savedObservers = acc[domainType] || []; acc[domainType] = [...savedObservers, observer]; }); return acc; }, {}); return observerMap; }; const makeObserverQueue = (successEventObservers) => { const observerQueue = (0, RxQueue_1.createRxQueue)('applySuccessEventObservers', { concurrent: 1, }); const observerMap = makeObserverMap(successEventObservers); const processed$ = observerQueue.process$.pipe(Rx.mergeMap(({ done, task: createdEvent }) => __awaiter(void 0, void 0, void 0, function* () { const thisDomainType = createdEvent.domain + '__' + createdEvent.type; const observersToApply = observerMap[thisDomainType]; if (!observersToApply || observersToApply.length === 0) { (0, logEvent_1.logEvent)(createdEvent, '👀', 'No observers to apply'); done(); return null; } else { // apply observers const orderedObserversToApply = R.sortBy(R.prop('priority'))(observersToApply); for (const observerToApply of orderedObserversToApply) { yield observerToApply.apply(createdEvent); } (0, logEvent_1.logEvent)(createdEvent, '👀', 'Applied observers'); done(); return { state: event_store_types_1.EventObserverState.success, event: createdEvent }; } })), Rx.filter((r) => !!r)); return { processed$, queueInstance: observerQueue, push: observerQueue.push.bind(observerQueue), }; }; exports.makeObserverQueue = makeObserverQueue;