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