@fabric-es/fabric-cqrs
Version:
Hyperledger Fabric middleware for event sourcing and cqrs pattern
51 lines • 2.39 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.dispatcher = void 0;
const util_1 = __importDefault(require("util"));
const utils_1 = require("../store/utils");
const dispatcher = (actionDispatcher, options, onSuccess) => (args) => new Promise((resolve, reject) => {
const { name, store, slice, SuccessAction, typeGuard, ErrorAction, logger } = options;
const tid = utils_1.generateToken();
const unsubscribe = store.subscribe(() => {
const { tx_id, error, type } = store.getState()[slice];
const result = store.getState()[slice].result;
if (tx_id === tid && type === SuccessAction) {
unsubscribe();
const data = onSuccess ? onSuccess(result) : result;
if (typeGuard)
if (result === null) {
logger.info(util_1.default.format('actionName %s, tx_id: %s resolved', name, tx_id));
resolve({ data: null });
}
else if (typeGuard(result)) {
logger.info(util_1.default.format('actionName %s, tx_id: %s resolved', name, tx_id));
resolve({ data });
}
else {
logger.error(util_1.default.format('fail to pass TypeGuard, %s, %j', name, result));
reject(`fail to pass TypeGuard: ${name}`);
}
else {
logger.info(util_1.default.format('actionName %s, tx_id: %s resolved', name, tx_id));
resolve({ data });
}
}
if (tx_id === tid && type === ErrorAction) {
logger.warn(util_1.default.format('[dispatcher] ErrorAction: [%s], tx_id: %s, %s, %j', name, tid, ErrorAction, error));
unsubscribe();
reject(new Error(util_1.default.format('%s, %j', type, error)));
}
});
store.dispatch(actionDispatcher({ tx_id: tid, args }));
logger.info(util_1.default.format('[dispatcher] actionName: %s, tx_id: %s dispatched', name, tid));
})
.then(({ data }) => ({
status: 'OK',
data,
}))
.catch((error) => ({ status: 'ERROR', data: null, error }));
exports.dispatcher = dispatcher;
//# sourceMappingURL=dispatcher.js.map