UNPKG

tedious

Version:

A TDS driver, for connecting to MS SQLServer databases.

84 lines (70 loc) 2.29 kB
"use strict"; const BufferList = require('bl'); const _require = require('readable-stream'), Duplex = _require.Duplex; const _require2 = require('./packet'), Packet = _require2.Packet, HEADER_LENGTH = _require2.HEADER_LENGTH; class OutgoingMessageStream extends Duplex { constructor(debug, { packetSize }) { super({ writableObjectMode: true }); this.packetSize = packetSize; this.debug = debug; this.bl = new BufferList(); // When the writable side is ended, push `null` // to also end the readable side. this.on('finish', () => { this.push(null); }); } _write(message, encoding, callback) { const length = this.packetSize - HEADER_LENGTH; let packetNumber = 0; this.currentMessage = message; this.currentMessage.on('data', data => { if (this.currentMessage.ignore) { return; } this.bl.append(data); while (this.bl.length > length) { const data = this.bl.slice(0, length); this.bl.consume(length); // TODO: Get rid of creating `Packet` instances here. const packet = new Packet(message.type); packet.packetId(packetNumber += 1); packet.resetConnection(message.resetConnection); packet.addData(data); this.debug.packet('Sent', packet); this.debug.data(packet); if (this.push(packet.buffer) === false) { this.currentMessage.pause(); } } }); this.currentMessage.on('end', () => { const data = this.bl.slice(); this.bl.consume(data.length); // TODO: Get rid of creating `Packet` instances here. const packet = new Packet(message.type); packet.packetId(packetNumber += 1); packet.resetConnection(message.resetConnection); packet.last(true); packet.ignore(message.ignore); packet.addData(data); this.debug.packet('Sent', packet); this.debug.data(packet); this.push(packet.buffer); this.currentMessage = undefined; callback(); }); } _read(size) { // If we do have a message, resume it and get data flowing. // Otherwise, there is nothing to do. if (this.currentMessage) { this.currentMessage.resume(); } } } module.exports = OutgoingMessageStream;