UNPKG

state-trooper

Version:
134 lines (92 loc) • 4.19 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _underscore = require('underscore'); var _underscore2 = _interopRequireDefault(_underscore); var _immutable = require('immutable'); var _immutable2 = _interopRequireDefault(_immutable); var _jsCsp = require('js-csp'); var _cursor = require('./cursor'); var _cursor2 = _interopRequireDefault(_cursor); var _convert_to_native = require('./convert_to_native'); var _convert_to_native2 = _interopRequireDefault(_convert_to_native); var _put_on_chan = require('./put_on_chan'); var _put_on_chan2 = _interopRequireDefault(_put_on_chan); var _get_state_by_path = require('./get_state_by_path'); var _get_state_by_path2 = _interopRequireDefault(_get_state_by_path); var _find_closest_transmitter = require('./find_closest_transmitter'); var _find_closest_transmitter2 = _interopRequireDefault(_find_closest_transmitter); var _find_closest_fetcher_and_query = require('./find_closest_fetcher_and_query'); var _find_closest_fetcher_and_query2 = _interopRequireDefault(_find_closest_fetcher_and_query); var _apply_state_change = require('./apply_state_change'); var _apply_state_change2 = _interopRequireDefault(_apply_state_change); var each = _underscore2['default'].each; var partial = _underscore2['default'].partial; var findClosestPersister = partial(_find_closest_transmitter2['default'], 'persister'); var patrol = function patrol(stateDescriptor) { var dataStore = stateDescriptor.dataStore; var mainCursorCh = (0, _jsCsp.chan)(); var updateCh = (0, _jsCsp.chan)(); var createCursor = partial(_cursor2['default'], _underscore2['default'], [], updateCh); var currentState = _immutable2['default'].fromJS(stateDescriptor.state); var rootCursor = createCursor(currentState); var unpersistedChanges = []; // put initial blank cursor (0, _put_on_chan2['default'])(mainCursorCh, createCursor(currentState)); // fetch initial data each(dataStore, function (conf, path) { if (conf.fetcher && conf.initialFetch !== false) { conf.fetcher(rootCursor.refine(path), rootCursor, conf.query); } }); // respond to updates from the cursor (0, _jsCsp.go)(regeneratorRuntime.mark(function callee$1$0() { var update, _findClosestFetcherAndQuery, fetcher, query, persister; return regeneratorRuntime.wrap(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: update = undefined; case 1: context$2$0.next = 3; return (0, _jsCsp.take)(updateCh); case 3: if (!(update = context$2$0.sent)) { context$2$0.next = 7; break; } if (update.action === 'fetch') { _findClosestFetcherAndQuery = (0, _find_closest_fetcher_and_query2['default'])(dataStore, update.path); fetcher = _findClosestFetcherAndQuery.fetcher; query = _findClosestFetcherAndQuery.query; if (fetcher) { fetcher(rootCursor.refine(update.path), rootCursor, query); } } else if (update.action === 'persist') { persister = findClosestPersister(dataStore, update.path); if (persister) { persister(rootCursor.refine(update.path), unpersistedChanges.pop(), rootCursor); } unpersistedChanges = []; } else { unpersistedChanges.push(update); currentState = (0, _apply_state_change2['default'])(currentState, update); rootCursor = createCursor(currentState); if (typeof update.callback === 'function') { update.callback(rootCursor.refine(update.path), rootCursor); } (0, _put_on_chan2['default'])(mainCursorCh, rootCursor); } context$2$0.next = 1; break; case 7: case 'end': return context$2$0.stop(); } }, callee$1$0, this); })); return mainCursorCh; }; exports['default'] = patrol; module.exports = exports['default'];