UNPKG

eventric

Version:

Build JavaScript applications with Behaviour-driven Domain Design. Based on DDD, BDD, CQRS and EventSourcing.

103 lines (91 loc) 4.13 kB
var ProcessManagerService; ProcessManagerService = (function() { function ProcessManagerService() { this._processManagerInstances = {}; } /** * * @description Process Manager * * @param {String} processManagerName Name of the ProcessManager * @param {Object} processManagerObject Object containing `initializeWhen` and `class` */ ProcessManagerService.prototype.add = function(processManagerName, processManagerObj, index) { var contextName, domainEventName, domainEventNames, _ref, _results; _ref = processManagerObj.initializeWhen; _results = []; for (contextName in _ref) { domainEventNames = _ref[contextName]; _results.push((function() { var _i, _len, _results1; _results1 = []; for (_i = 0, _len = domainEventNames.length; _i < _len; _i++) { domainEventName = domainEventNames[_i]; _results1.push(index.subscribeToDomainEvent(contextName, domainEventName, (function(_this) { return function(domainEvent) { return _this._spawnProcessManager(processManagerName, processManagerObj["class"], contextName, domainEvent, index); }; })(this))); } return _results1; }).call(this)); } return _results; }; ProcessManagerService.prototype._spawnProcessManager = function(processManagerName, ProcessManagerClass, contextName, domainEvent, index) { var handleContextDomainEventNames, key, processManager, processManagerId, value, _base, _base1; processManagerId = index.generateUid(); processManager = new ProcessManagerClass; processManager.$endProcess = (function(_this) { return function() { return _this._endProcessManager(processManagerName, processManagerId); }; })(this); handleContextDomainEventNames = []; for (key in processManager) { value = processManager[key]; if ((key.indexOf('from')) === 0 && (typeof value === 'function')) { handleContextDomainEventNames.push(key); } } this._subscribeProcessManagerToDomainEvents(processManager, handleContextDomainEventNames, index); processManager.initialize(domainEvent); if ((_base = this._processManagerInstances)[processManagerName] == null) { _base[processManagerName] = {}; } if ((_base1 = this._processManagerInstances[processManagerName])[processManagerId] == null) { _base1[processManagerId] = {}; } return this._processManagerInstances[processManagerName][processManagerId] = processManager; }; ProcessManagerService.prototype._endProcessManager = function(processManagerName, processManagerId) { return delete this._processManagerInstances[processManagerName][processManagerId]; }; ProcessManagerService.prototype._subscribeProcessManagerToDomainEvents = function(processManager, handleContextDomainEventNames, index) { return index.subscribeToDomainEvent((function(_this) { return function(domainEvent) { var handleContextDomainEventName, _i, _len, _results; _results = []; for (_i = 0, _len = handleContextDomainEventNames.length; _i < _len; _i++) { handleContextDomainEventName = handleContextDomainEventNames[_i]; if (("from" + domainEvent.context + "_handle" + domainEvent.name) === handleContextDomainEventName) { _results.push(_this._applyDomainEventToProcessManager(handleContextDomainEventName, domainEvent, processManager)); } else { _results.push(void 0); } } return _results; }; })(this)); }; ProcessManagerService.prototype._applyDomainEventToProcessManager = function(handleContextDomainEventName, domainEvent, processManager) { var err; if (!processManager[handleContextDomainEventName]) { return err = new Error("Tried to apply DomainEvent '" + domainEventName + "' to Projection without a matching handle method"); } else { return processManager[handleContextDomainEventName](domainEvent); } }; return ProcessManagerService; })(); module.exports = new ProcessManagerService;