resolve conflict in api and saga

This commit is contained in:
Jonathan Rainville 2018-10-03 16:21:59 -04:00 committed by Pascal Precht
parent e9ec0c019d
commit 324e148fa6
No known key found for this signature in database
GPG Key ID: 0EE28D8D6FD85D7D
2 changed files with 54 additions and 49 deletions

View File

@ -62,45 +62,45 @@ class ConsoleListener {
_listenForLogRequests() {
if (this.ipc.ipcRole !== 'server') return;
this.ipc.on('log', (request) => {
if (request.type === 'contract-log') {
if (!this.contractsDeployed) return;
let {address, data, transactionHash, blockNumber, gasUsed, status} = request;
const contract = this.addressToContract[address];
if (!contract) {
this._updateContractList();
return;
}
const {name, silent} = contract;
if (silent && !this.outputDone) {
return;
}
const func = contract.functions[data.substring(0, 10)];
const functionName = func.functionName;
const decodedParameters = utils.decodeParams(func.abi.inputs, data.substring(10));
let paramString = "";
if (func.abi.inputs) {
func.abi.inputs.forEach((input) => {
let quote = input.type.indexOf("int") === -1 ? '"' : '';
paramString += quote + decodedParameters[input.name] + quote + ", ";
});
paramString = paramString.substring(0, paramString.length - 2);
}
gasUsed = utils.hexToNumber(gasUsed);
blockNumber = utils.hexToNumber(blockNumber);
this.logs.push(Object.assign({}, request, {name, functionName, paramString, gasUsed, blockNumber}));
this.events.emit('contracts:log', this.logs[this.logs.length - 1]);
this.logger.info(`Blockchain>`.underline + ` ${name}.${functionName}(${paramString})`.bold + ` | ${transactionHash} | gas:${gasUsed} | blk:${blockNumber} | status:${status}`);
} else {
this.logger.info(JSON.stringify(request));
if (request.type !== 'contract-log') {
return this.logger.info(JSON.stringify(request));
}
if (!this.contractsDeployed) return;
let {address, data, transactionHash, blockNumber, gasUsed, status} = request;
const contract = this.addressToContract[address];
if (!contract) {
this._updateContractList();
return;
}
const {name, silent} = contract;
if (silent && !this.outputDone) {
return;
}
const func = contract.functions[data.substring(0, 10)];
const functionName = func.functionName;
const decodedParameters = utils.decodeParams(func.abi.inputs, data.substring(10));
let paramString = "";
if (func.abi.inputs) {
func.abi.inputs.forEach((input) => {
let quote = input.type.indexOf("int") === -1 ? '"' : '';
paramString += quote + decodedParameters[input.name] + quote + ", ";
});
paramString = paramString.substring(0, paramString.length - 2);
}
gasUsed = utils.hexToNumber(gasUsed);
blockNumber = utils.hexToNumber(blockNumber);
this.logs.push(Object.assign({}, request, {name, functionName, paramString, gasUsed, blockNumber}));
this.events.emit('contracts:log', this.logs[this.logs.length - 1]);
this.logger.info(`Blockchain>`.underline + ` ${name}.${functionName}(${paramString})`.bold + ` | ${transactionHash} | gas:${gasUsed} | blk:${blockNumber} | status:${status}`);
});
}

View File

@ -55,6 +55,7 @@ class Server {
const main = serveStatic(this.buildDir, {'index': ['index.html', 'index.htm']});
this.app = express();
const expressWs = expressWebSocket(this.app);
// Assign Logging Function
this.app.use(function(req, res, next) {
if (self.logging) {
@ -64,7 +65,6 @@ class Server {
}
next();
});
expressWebSocket(this.app);
this.app.use(helmet.noCache());
this.app.use(cors());
@ -97,16 +97,15 @@ class Server {
this.app[apiCall.method].apply(this.app, [apiCall.endpoint, this.applyAPIFunction.bind(this, apiCall.cb)]);
}
}
const wss = expressWs.getWss('/');
this.app.ws('/', function(ws, _req) {
self.events.on('outputDone', () => {
if (ws.readyState === WEB_SOCKET_STATE_OPEN) {
return ws.send('outputDone');
}
// if the socket wasn't yet opened, listen for the 'open' event,
// then send the 'outputDone' data
ws.addEventListener('open', _event => {
ws.send('outputDone');
self.events.on('outputDone', () => {
wss.clients.forEach(function (client) {
client.send('outputDone');
});
self.events.on('outputError', () => {
wss.clients.forEach(function (client) {
client.send('outputError');
});
});
});
@ -164,7 +163,13 @@ class Server {
}
applyAPIFunction (cb, req, res) {
this.events.request('authenticator:authorize', req.headers.authorization, (err) => {
// FIXME Need to not authenticate WS request as they do not pass the toekn in the header yet
const authToken = (!res.send) ? req.protocol : req.headers.authorization;
if (!res.send) {
// console.dir(arguments);
return cb(req, res);
}
this.events.request('authenticator:authorize', authToken, (err) => {
if (err) {
const send = res.send ? res.send.bind(res) : req.send.bind(req); // WS only has the first params
return send(err);