var RemixDebug = require('remix-debug-debugtest'); var CmdLine = RemixDebug.CmdLine; const async = require('async'); class DebuggerManager { constructor(nodeUrl) { this.nodeUrl = nodeUrl this.outputJson = {} this.inputJson = {} } setInputJson(inputJson) { this.inputJson = inputJson } setOutputJson(outputJson) { this.outputJson = outputJson } createDebuggerSession(txHash, filename, cb) { return this.debug(txHash, filename, cb) } debug(txHash, filename, cb) { console.dir("debugging tx " + txHash) var cmd_line = new CmdLine() this.cmd_line = cmd_line cmd_line.connect("http", this.nodeUrl) cmd_line.loadCompilationData(this.inputJson, this.outputJson) cmd_line.initDebugger(() => { this.isDebugging = true cmd_line.startDebug(txHash, filename, () => { if (cb) { cmd_line.triggerSourceUpdate() cb() } }) }) return cmd_line } getLastLine(txHash, filename, outputCb) { const self = this; let cmd_line = new CmdLine() async.waterfall([ function initDebugger(next) { cmd_line = new CmdLine() cmd_line.connect("http", self.nodeUrl) cmd_line.loadCompilationData(self.inputJson, self.outputJson) cmd_line.initDebugger(() => { // self.isDebugging = true next() }) }, function startDebug(next) { let debuggerData = {} cmd_line.events.on("locals", (data) => { debuggerData.locals = self.simplifyDebuggerVars(data) }); cmd_line.events.on("globals", (data) => { debuggerData.contract = self.simplifyDebuggerVars(data) }) cmd_line.startDebug(txHash, filename, () => { cmd_line.events.on("source", () => { let lines = cmd_line.getSource() // TODO: this is a bit of a hack let line = lines.filter((x) => x.indexOf("=>") === 0)[0]; outputCb(lines, line, debuggerData) }) let total_size = cmd_line.getTraceLength() cmd_line.jumpTo(total_size - 1) cmd_line.unload() next() }) } ], () => { }) } // TODO: this is duplicated in debugger/index.js simplifyDebuggerVars(data) { let new_data = {}; for (let key in data) { let field = data[key]; new_data[`${key} (${field.type})`] = field.value } return new_data } } module.exports = DebuggerManager;