@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
JavaScript
;
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;