123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- var Util = require('util');
- var EventEmitter = require('events').EventEmitter;
- var Packets = require('../packets');
- var ErrorConstants = require('../constants/errors');
- module.exports = Sequence;
- Util.inherits(Sequence, EventEmitter);
- function Sequence(callback) {
- EventEmitter.call(this);
- this._callback = callback;
- this._ended = false;
- // Experimental: Long stack trace support
- this._callSite = (new Error).stack.replace(/.+\n/, '');
- }
- Sequence.determinePacket = function(byte) {
- switch (byte) {
- case 0x00: return Packets.OkPacket;
- case 0xfe: return Packets.EofPacket;
- case 0xff: return Packets.ErrorPacket;
- }
- };
- Sequence.prototype.hasErrorHandler = function() {
- return this._callback || this.listeners('error').length > 1;
- };
- Sequence.prototype._packetToError = function(packet) {
- var code = ErrorConstants[packet.errno] || 'UNKNOWN_CODE_PLEASE_REPORT';
- var err = new Error(code + ': ' + packet.message);
- err.code = code;
- return err;
- };
- Sequence.prototype._addLongStackTrace = function(err) {
- var delimiter = '\n --------------------\n' ;
- if (err.stack.indexOf(delimiter) > -1) {
- return;
- }
- err.stack += delimiter + this._callSite;
- };
- Sequence.prototype.end = function(err) {
- if (this._ended) {
- return;
- }
- this._ended = true;
- if (err) {
- this._addLongStackTrace(err);
- }
- // try...finally for exception safety
- try {
- if (err) {
- this.emit('error', err);
- }
- } finally {
- try {
- if (this._callback) {
- this._callback.apply(this, arguments);
- }
- } finally {
- this.emit('end');
- }
- }
- };
- Sequence.prototype['OkPacket'] = function(packet) {
- this.end(null, packet);
- };
- Sequence.prototype['ErrorPacket'] = function(packet) {
- this.end(this._packetToError(packet));
- };
- // Implemented by child classes
- Sequence.prototype.start = function() {};
|