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

61 lines (60 loc) 2.31 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createRxQueue = void 0; const Queue = require("react-native-better-queue"); const rxjs_1 = require("rxjs"); const logger_1 = require("../util/logger"); const Rx = require("rxjs/operators"); const R = require("ramda"); const makeEventQueueObservable = (queue, queueEventType, queueId = 'unnamed') => { return new rxjs_1.Observable((observer) => { queue.on(queueEventType, (...args) => { logger_1.logger.debug(`Queue Event: ${queueId} - ${queueEventType}`); observer.next(args.length === 0 ? [queue] : [queue, ...args]); }); }); }; const makeFailedEventQueueObservable = (queue) => { return new rxjs_1.Observable((observer) => { queue.on('task_failed', (id, error) => { logger_1.logger.warn('EventQueueObservable error'); // logger.fatal('%o', error); observer.error(error); }); }); }; const makeQueue = (fn, queueOptions) => new Queue(fn, queueOptions); const createRxQueue = (id, queueOptions) => { const process$ = new rxjs_1.Subject(); const callback = (task, done) => { process$.next({ task: task, done }); // todo fixme }; const queueSizeInput$ = new rxjs_1.Subject(); const queueSizeOutput$ = new rxjs_1.BehaviorSubject(null); queueSizeInput$.pipe(Rx.scan((acc, curr) => (acc || 0) + curr, null)).subscribe(queueSizeOutput$); const customPush = (task, cb) => { queueSizeInput$.next(+1); queue .push(task, cb) .on('finish', () => { queueSizeInput$.next(-1); }) .on('failed', () => { queueSizeInput$.next(-1); }); }; const queue = makeQueue(callback, Object.assign(queueOptions || {}, { id: id })); return { id, queueInstance: queue, push: customPush, process$, task$: process$.pipe(Rx.map(R.prop('task'))), done$: process$.pipe(Rx.map(R.prop('done'))), drained$: makeEventQueueObservable(queue, 'drain', id), empty$: makeEventQueueObservable(queue, 'empty', id), taskFailed$: makeFailedEventQueueObservable(queue), queueSize$: queueSizeOutput$, }; }; exports.createRxQueue = createRxQueue;