cycle-restart
Version:
Restart a Cycle.js application and preserve state.
175 lines (128 loc) • 4.54 kB
JavaScript
;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _restartable = require('./restartable');
var _restartable2 = _interopRequireDefault(_restartable);
var _time = require('@cycle/time');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function restart(setup, main, drivers, cb, _ref) {
var sources = _ref.sources,
sinks = _ref.sinks,
dispose = _ref.dispose;
var isolate = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
var timeToTravelTo = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;
dispose();
if (typeof isolate === 'function' && 'reset' in isolate) {
isolate.reset();
}
var realTime = (0, _time.timeDriver)();
realTime._pause();
drivers.Time = function () {
return realTime;
};
var _loop = function _loop(driverName) {
var driver = drivers[driverName];
var newDriver = function newDriver(sink$) {
return driver(sink$, realTime);
};
newDriver.replayLog = driver.replayLog;
newDriver.onPostReplay = driver.onPostReplay;
newDriver.log$ = driver.log$;
drivers[driverName] = newDriver;
if (driver.onPreReplay) {
driver.onPreReplay();
}
};
for (var driverName in drivers) {
_loop(driverName);
}
var newSourcesSinksAndRun = setup(main, drivers);
var newDispose = newSourcesSinksAndRun.run();
var sourcesAndSinksAndDispose = {
sources: newSourcesSinksAndRun.sources,
sinks: newSourcesSinksAndRun.sinks,
dispose: newDispose
};
if ((typeof cb === 'undefined' ? 'undefined' : _typeof(cb)) === 'object') {
cb.start(sourcesAndSinksAndDispose);
}
for (var driverName in drivers) {
var _driver = drivers[driverName];
if (_driver.replayLog) {
var log$ = sources[driverName].log$;
_driver.replayLog(realTime._scheduler, log$, timeToTravelTo);
}
}
var timeToRunTo = sources.Time && sources.Time._time() || null;
realTime._runVirtually(function (err) {
if (err) {
throw err;
}
for (var _driverName in drivers) {
var _driver2 = drivers[_driverName];
if (_driver2.onPostReplay) {
_driver2.onPostReplay();
}
}
if ((typeof cb === 'undefined' ? 'undefined' : _typeof(cb)) === 'object') {
cb.stop(err);
} else {
cb(err);
}
realTime._resume(timeToRunTo);
}, timeToRunTo);
return sourcesAndSinksAndDispose;
}
function rerunner(Cycle, driversFn, isolate) {
var sourcesAndSinksAndDispose = {};
var first = true;
var drivers = void 0;
function noop() {}
return function (main) {
var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;
var timeToTravelTo = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
if (first) {
(function () {
drivers = driversFn();
var realTime = (0, _time.timeDriver)();
drivers.Time = function () {
return realTime;
};
var _loop2 = function _loop2(driverName) {
var driver = drivers[driverName];
var newDriver = function newDriver(sink$) {
return driver(sink$, realTime);
};
drivers[driverName] = newDriver;
};
for (var driverName in drivers) {
_loop2(driverName);
}
var _Cycle = Cycle(main, drivers),
sources = _Cycle.sources,
sinks = _Cycle.sinks,
run = _Cycle.run;
realTime = sources.Time;
var dispose = run();
sourcesAndSinksAndDispose = { sources: sources, sinks: sinks, dispose: dispose };
first = false;
if ((typeof cb === 'undefined' ? 'undefined' : _typeof(cb)) === 'object') {
cb.start(sourcesAndSinksAndDispose);
}
if ((typeof cb === 'undefined' ? 'undefined' : _typeof(cb)) === 'object') {
cb.stop();
} else {
cb();
}
})();
} else {
drivers = driversFn();
sourcesAndSinksAndDispose = restart(Cycle, main, drivers, cb, sourcesAndSinksAndDispose, isolate, timeToTravelTo);
}
return sourcesAndSinksAndDispose;
};
}
module.exports = {
restart: restart,
restartable: _restartable2.default,
rerunner: rerunner
};