tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
136 lines (116 loc) • 4.87 kB
JavaScript
// Generated by CoffeeScript 1.7.1
var EventEmitter, MessageIO, Packet, TYPE, isPacketComplete, packetHeaderLength, packetLength,
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
require('./buffertools');
EventEmitter = require('events').EventEmitter;
isPacketComplete = require('./packet').isPacketComplete;
packetLength = require('./packet').packetLength;
packetHeaderLength = require('./packet').HEADER_LENGTH;
Packet = require('./packet').Packet;
TYPE = require('./packet').TYPE;
MessageIO = (function(_super) {
__extends(MessageIO, _super);
function MessageIO(socket, _packetSize, debug) {
this.socket = socket;
this._packetSize = _packetSize;
this.debug = debug;
this.sendPacket = __bind(this.sendPacket, this);
this.eventData = __bind(this.eventData, this);
this.socket.addListener('data', this.eventData);
this.packetDataSize = this._packetSize - packetHeaderLength;
this.packetBuffer = new Buffer(0);
this.payloadBuffer = new Buffer(0);
}
MessageIO.prototype.eventData = function(data) {
var endOfMessage, length, packet, packetsData;
if (this.packetBuffer.length > 0) {
this.packetBuffer = Buffer.concat([this.packetBuffer, data]);
} else {
this.packetBuffer = data;
}
packetsData = [];
endOfMessage = false;
while (isPacketComplete(this.packetBuffer)) {
length = packetLength(this.packetBuffer);
packet = new Packet(this.packetBuffer.slice(0, length));
this.logPacket('Received', packet);
packetsData.push(packet.data());
if (packet.isLast()) {
endOfMessage = true;
}
this.packetBuffer = this.packetBuffer.slice(length);
}
if (packetsData.length > 0) {
this.emit('data', Buffer.concat(packetsData));
if (endOfMessage) {
return this.emit('message');
}
}
};
MessageIO.prototype.packetSize = function(packetSize) {
if (arguments.length > 0) {
this.debug.log("Packet size changed from " + this._packetSize + " to " + packetSize);
this._packetSize = packetSize;
this.packetDataSize = this._packetSize - packetHeaderLength;
}
return this._packetSize;
};
MessageIO.prototype.tlsNegotiationStarting = function(securePair) {
this.securePair = securePair;
return this.tlsNegotiationInProgress = true;
};
MessageIO.prototype.encryptAllFutureTraffic = function() {
this.socket.removeAllListeners('data');
this.securePair.encrypted.removeAllListeners('data');
this.socket.pipe(this.securePair.encrypted);
this.securePair.encrypted.pipe(this.socket);
this.securePair.cleartext.addListener('data', this.eventData);
return this.tlsNegotiationInProgress = false;
};
MessageIO.prototype.sendMessage = function(packetType, data, resetConnection) {
var numberOfPackets, packet, packetNumber, packetPayload, payloadEnd, payloadStart, _i, _ref, _results;
if (data) {
numberOfPackets = (Math.floor((data.length - 1) / this.packetDataSize)) + 1;
} else {
numberOfPackets = 1;
data = new Buffer(0);
}
_results = [];
for (packetNumber = _i = 0, _ref = numberOfPackets - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; packetNumber = 0 <= _ref ? ++_i : --_i) {
payloadStart = packetNumber * this.packetDataSize;
if (packetNumber < numberOfPackets - 1) {
payloadEnd = payloadStart + this.packetDataSize;
} else {
payloadEnd = data.length;
}
packetPayload = data.slice(payloadStart, payloadEnd);
packet = new Packet(packetType);
packet.last(packetNumber === numberOfPackets - 1);
packet.resetConnection(resetConnection);
packet.packetId(packetNumber + 1);
packet.addData(packetPayload);
_results.push(this.sendPacket(packet, packetType));
}
return _results;
};
MessageIO.prototype.sendPacket = function(packet, packetType) {
this.logPacket('Sent', packet);
if (this.tlsNegotiationInProgress && packetType !== TYPE.PRELOGIN) {
return this.securePair.cleartext.write(packet.buffer);
} else {
if (this.securePair && !this.tlsNegotiationInProgress) {
return this.securePair.cleartext.write(packet.buffer);
} else {
return this.socket.write(packet.buffer);
}
}
};
MessageIO.prototype.logPacket = function(direction, packet) {
this.debug.packet(direction, packet);
return this.debug.data(packet);
};
return MessageIO;
})(EventEmitter);
module.exports = MessageIO;