state-trooper
Version:
Application State Manager
134 lines (92 loc) • 4.19 kB
JavaScript
;
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'];