fluid-chains
Version:
A simple way to organize asynchronous Javascript functions.
107 lines (100 loc) • 4.07 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.exists = exports.clearStorage = exports.putConfig = exports.getConfig = exports.getChains = exports.getState = exports.removeState = exports.createChainState = exports.addChainState = exports.putChain = exports.ChainStorage = undefined;
var _Chain = require('./Chain');
var _Util = require('./Util');
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var ChainStorage = exports.ChainStorage = {};
var putChain = exports.putChain = function putChain(name, chain) {
if (exists(name)) {
throw Error('A chain with the same name as "' + name + '" has already been stored.');
}
_lodash2.default.set(ChainStorage, name, function () {
return chain;
});
};
var addChainState = exports.addChainState = function addChainState(key, name, spec, param, context) {
var state = {};
if (spec && spec.length) {
var params = {};
spec.forEach(function (chainSpec) {
_lodash2.default.set(params, chainSpec.field, param[chainSpec.field] ? param[chainSpec.field]() : '');
});
_lodash2.default.set(state, 'spec', spec);
_lodash2.default.set(state, 'params', param);
}
_lodash2.default.set(state, 'context', _lodash2.default.clone(context));
if (!_lodash2.default.get(ChainStorage, key)) {
_lodash2.default.set(ChainStorage, key, {});
}
var chainState = _lodash2.default.get(ChainStorage, key);
_lodash2.default.set(chainState, name, state);
};
var createChainState = exports.createChainState = function createChainState(name, spec, param, context) {
var key = (0, _Util.generateUUID)();
addChainState(key, name, spec, param, context);
return key;
};
var removeState = exports.removeState = function removeState(key) {
_lodash2.default.unset(ChainStorage, key);
};
var getState = exports.getState = function getState(key, name, param) {
var state = _lodash2.default.get(ChainStorage, key);
var stateChain = _lodash2.default.get(state, name);
var context = undefined;
if (stateChain) {
if (stateChain.spec) {
var valid = [];
stateChain.spec.forEach(function (fieldSpec) {
if (param[fieldSpec.field]) {
valid.push(param[fieldSpec.field]() === stateChain.params[fieldSpec.field]());
} else {
valid.push('' === stateChain.params[fieldSpec.field]());
}
});
if (_lodash2.default.filter(valid, function (value) {
return value;
}).length === stateChain.spec.length) {
context = stateChain.context;
}
} else {
context = stateChain.context;
}
}
return context;
};
var getChains = exports.getChains = function getChains() {
var chains = [];
_lodash2.default.forEach(ChainStorage, function (storage) {
if (storage instanceof Function) {
var chain = storage();
if (chain instanceof _Chain.Chain) {
chains.push(chain.info().name);
}
}
});
return chains;
};
var getConfig = exports.getConfig = function getConfig() {
var config = _lodash2.default.get(ChainStorage, '$chain.$config');
if (!config) {
_lodash2.default.set(ChainStorage, '$chain.$config', {});
config = _lodash2.default.get(ChainStorage, '$chain.$config');
}
return config;
};
var putConfig = exports.putConfig = function putConfig(name, value) {
_lodash2.default.set(getConfig(), name, value);
};
var clearStorage = exports.clearStorage = function clearStorage() {
_lodash2.default.forIn(ChainStorage, function (field, key) {
_lodash2.default.unset(ChainStorage, key);
});
};
var exists = exports.exists = function exists(chainName) {
return !!_lodash2.default.get(ChainStorage, chainName);
};