Spaces:
Running
Running
; | |
const EventEmitter = require('events').EventEmitter; | |
const Timers = require('timers'); | |
class Command extends EventEmitter { | |
constructor() { | |
super(); | |
this.next = null; | |
} | |
// slow. debug only | |
stateName() { | |
const state = this.next; | |
for (const i in this) { | |
if (this[i] === state && i !== 'next') { | |
return i; | |
} | |
} | |
return 'unknown name'; | |
} | |
execute(packet, connection) { | |
if (!this.next) { | |
this.next = this.start; | |
connection._resetSequenceId(); | |
} | |
if (packet && packet.isError()) { | |
const err = packet.asError(connection.clientEncoding); | |
err.sql = this.sql || this.query; | |
if (this.queryTimeout) { | |
Timers.clearTimeout(this.queryTimeout); | |
this.queryTimeout = null; | |
} | |
if (this.onResult) { | |
this.onResult(err); | |
this.emit('end'); | |
} else { | |
this.emit('error', err); | |
this.emit('end'); | |
} | |
return true; | |
} | |
// TODO: don't return anything from execute, it's ugly and error-prone. Listen for 'end' event in connection | |
this.next = this.next(packet, connection); | |
if (this.next) { | |
return false; | |
} | |
this.emit('end'); | |
return true; | |
} | |
} | |
module.exports = Command; | |