191 lines
22 KiB
JavaScript
191 lines
22 KiB
JavaScript
|
|
"use strict";
|
||
|
|
|
||
|
|
Object.defineProperty(exports, "__esModule", {
|
||
|
|
value: true
|
||
|
|
});
|
||
|
|
exports.TYPE = exports.Packet = exports.OFFSET = exports.HEADER_LENGTH = void 0;
|
||
|
|
exports.isPacketComplete = isPacketComplete;
|
||
|
|
exports.packetLength = packetLength;
|
||
|
|
var _sprintfJs = require("sprintf-js");
|
||
|
|
const HEADER_LENGTH = exports.HEADER_LENGTH = 8;
|
||
|
|
const TYPE = exports.TYPE = {
|
||
|
|
SQL_BATCH: 0x01,
|
||
|
|
RPC_REQUEST: 0x03,
|
||
|
|
TABULAR_RESULT: 0x04,
|
||
|
|
ATTENTION: 0x06,
|
||
|
|
BULK_LOAD: 0x07,
|
||
|
|
TRANSACTION_MANAGER: 0x0E,
|
||
|
|
LOGIN7: 0x10,
|
||
|
|
NTLMAUTH_PKT: 0x11,
|
||
|
|
PRELOGIN: 0x12,
|
||
|
|
FEDAUTH_TOKEN: 0x08
|
||
|
|
};
|
||
|
|
const typeByValue = {};
|
||
|
|
for (const name in TYPE) {
|
||
|
|
typeByValue[TYPE[name]] = name;
|
||
|
|
}
|
||
|
|
const STATUS = {
|
||
|
|
NORMAL: 0x00,
|
||
|
|
EOM: 0x01,
|
||
|
|
IGNORE: 0x02,
|
||
|
|
RESETCONNECTION: 0x08,
|
||
|
|
RESETCONNECTIONSKIPTRAN: 0x10
|
||
|
|
};
|
||
|
|
const OFFSET = exports.OFFSET = {
|
||
|
|
Type: 0,
|
||
|
|
Status: 1,
|
||
|
|
Length: 2,
|
||
|
|
SPID: 4,
|
||
|
|
PacketID: 6,
|
||
|
|
Window: 7
|
||
|
|
};
|
||
|
|
const DEFAULT_SPID = 0;
|
||
|
|
const DEFAULT_PACKETID = 1;
|
||
|
|
const DEFAULT_WINDOW = 0;
|
||
|
|
const NL = '\n';
|
||
|
|
class Packet {
|
||
|
|
constructor(typeOrBuffer) {
|
||
|
|
if (typeOrBuffer instanceof Buffer) {
|
||
|
|
this.buffer = typeOrBuffer;
|
||
|
|
} else {
|
||
|
|
const type = typeOrBuffer;
|
||
|
|
this.buffer = Buffer.alloc(HEADER_LENGTH, 0);
|
||
|
|
this.buffer.writeUInt8(type, OFFSET.Type);
|
||
|
|
this.buffer.writeUInt8(STATUS.NORMAL, OFFSET.Status);
|
||
|
|
this.buffer.writeUInt16BE(DEFAULT_SPID, OFFSET.SPID);
|
||
|
|
this.buffer.writeUInt8(DEFAULT_PACKETID, OFFSET.PacketID);
|
||
|
|
this.buffer.writeUInt8(DEFAULT_WINDOW, OFFSET.Window);
|
||
|
|
this.setLength();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
setLength() {
|
||
|
|
this.buffer.writeUInt16BE(this.buffer.length, OFFSET.Length);
|
||
|
|
}
|
||
|
|
length() {
|
||
|
|
return this.buffer.readUInt16BE(OFFSET.Length);
|
||
|
|
}
|
||
|
|
resetConnection(reset) {
|
||
|
|
let status = this.buffer.readUInt8(OFFSET.Status);
|
||
|
|
if (reset) {
|
||
|
|
status |= STATUS.RESETCONNECTION;
|
||
|
|
} else {
|
||
|
|
status &= 0xFF - STATUS.RESETCONNECTION;
|
||
|
|
}
|
||
|
|
this.buffer.writeUInt8(status, OFFSET.Status);
|
||
|
|
}
|
||
|
|
last(last) {
|
||
|
|
let status = this.buffer.readUInt8(OFFSET.Status);
|
||
|
|
if (arguments.length > 0) {
|
||
|
|
if (last) {
|
||
|
|
status |= STATUS.EOM;
|
||
|
|
} else {
|
||
|
|
status &= 0xFF - STATUS.EOM;
|
||
|
|
}
|
||
|
|
this.buffer.writeUInt8(status, OFFSET.Status);
|
||
|
|
}
|
||
|
|
return this.isLast();
|
||
|
|
}
|
||
|
|
ignore(last) {
|
||
|
|
let status = this.buffer.readUInt8(OFFSET.Status);
|
||
|
|
if (last) {
|
||
|
|
status |= STATUS.IGNORE;
|
||
|
|
} else {
|
||
|
|
status &= 0xFF - STATUS.IGNORE;
|
||
|
|
}
|
||
|
|
this.buffer.writeUInt8(status, OFFSET.Status);
|
||
|
|
}
|
||
|
|
isLast() {
|
||
|
|
return !!(this.buffer.readUInt8(OFFSET.Status) & STATUS.EOM);
|
||
|
|
}
|
||
|
|
packetId(packetId) {
|
||
|
|
if (packetId) {
|
||
|
|
this.buffer.writeUInt8(packetId % 256, OFFSET.PacketID);
|
||
|
|
}
|
||
|
|
return this.buffer.readUInt8(OFFSET.PacketID);
|
||
|
|
}
|
||
|
|
addData(data) {
|
||
|
|
this.buffer = Buffer.concat([this.buffer, data]);
|
||
|
|
this.setLength();
|
||
|
|
return this;
|
||
|
|
}
|
||
|
|
data() {
|
||
|
|
return this.buffer.slice(HEADER_LENGTH);
|
||
|
|
}
|
||
|
|
type() {
|
||
|
|
return this.buffer.readUInt8(OFFSET.Type);
|
||
|
|
}
|
||
|
|
statusAsString() {
|
||
|
|
const status = this.buffer.readUInt8(OFFSET.Status);
|
||
|
|
const statuses = [];
|
||
|
|
for (const name in STATUS) {
|
||
|
|
const value = STATUS[name];
|
||
|
|
if (status & value) {
|
||
|
|
statuses.push(name);
|
||
|
|
} else {
|
||
|
|
statuses.push(undefined);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return statuses.join(' ').trim();
|
||
|
|
}
|
||
|
|
headerToString(indent = '') {
|
||
|
|
const text = (0, _sprintfJs.sprintf)('type:0x%02X(%s), status:0x%02X(%s), length:0x%04X, spid:0x%04X, packetId:0x%02X, window:0x%02X', this.buffer.readUInt8(OFFSET.Type), typeByValue[this.buffer.readUInt8(OFFSET.Type)], this.buffer.readUInt8(OFFSET.Status), this.statusAsString(), this.buffer.readUInt16BE(OFFSET.Length), this.buffer.readUInt16BE(OFFSET.SPID), this.buffer.readUInt8(OFFSET.PacketID), this.buffer.readUInt8(OFFSET.Window));
|
||
|
|
return indent + text;
|
||
|
|
}
|
||
|
|
dataToString(indent = '') {
|
||
|
|
const BYTES_PER_GROUP = 0x04;
|
||
|
|
const CHARS_PER_GROUP = 0x08;
|
||
|
|
const BYTES_PER_LINE = 0x20;
|
||
|
|
const data = this.data();
|
||
|
|
let dataDump = '';
|
||
|
|
let chars = '';
|
||
|
|
for (let offset = 0; offset < data.length; offset++) {
|
||
|
|
if (offset % BYTES_PER_LINE === 0) {
|
||
|
|
dataDump += indent;
|
||
|
|
dataDump += (0, _sprintfJs.sprintf)('%04X ', offset);
|
||
|
|
}
|
||
|
|
if (data[offset] < 0x20 || data[offset] > 0x7E) {
|
||
|
|
chars += '.';
|
||
|
|
if ((offset + 1) % CHARS_PER_GROUP === 0 && !((offset + 1) % BYTES_PER_LINE === 0)) {
|
||
|
|
chars += ' ';
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
chars += String.fromCharCode(data[offset]);
|
||
|
|
}
|
||
|
|
if (data[offset] != null) {
|
||
|
|
dataDump += (0, _sprintfJs.sprintf)('%02X', data[offset]);
|
||
|
|
}
|
||
|
|
if ((offset + 1) % BYTES_PER_GROUP === 0 && !((offset + 1) % BYTES_PER_LINE === 0)) {
|
||
|
|
dataDump += ' ';
|
||
|
|
}
|
||
|
|
if ((offset + 1) % BYTES_PER_LINE === 0) {
|
||
|
|
dataDump += ' ' + chars;
|
||
|
|
chars = '';
|
||
|
|
if (offset < data.length - 1) {
|
||
|
|
dataDump += NL;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (chars.length) {
|
||
|
|
dataDump += ' ' + chars;
|
||
|
|
}
|
||
|
|
return dataDump;
|
||
|
|
}
|
||
|
|
toString(indent = '') {
|
||
|
|
return this.headerToString(indent) + '\n' + this.dataToString(indent + indent);
|
||
|
|
}
|
||
|
|
payloadString() {
|
||
|
|
return '';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
exports.Packet = Packet;
|
||
|
|
function isPacketComplete(potentialPacketBuffer) {
|
||
|
|
if (potentialPacketBuffer.length < HEADER_LENGTH) {
|
||
|
|
return false;
|
||
|
|
} else {
|
||
|
|
return potentialPacketBuffer.length >= potentialPacketBuffer.readUInt16BE(OFFSET.Length);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
function packetLength(potentialPacketBuffer) {
|
||
|
|
return potentialPacketBuffer.readUInt16BE(OFFSET.Length);
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3ByaW50ZkpzIiwicmVxdWlyZSIsIkhFQURFUl9MRU5HVEgiLCJleHBvcnRzIiwiVFlQRSIsIlNRTF9CQVRDSCIsIlJQQ19SRVFVRVNUIiwiVEFCVUxBUl9SRVNVTFQiLCJBVFRFTlRJT04iLCJCVUxLX0xPQUQiLCJUUkFOU0FDVElPTl9NQU5BR0VSIiwiTE9HSU43IiwiTlRMTUFVVEhfUEtUIiwiUFJFTE9HSU4iLCJGRURBVVRIX1RPS0VOIiwidHlwZUJ5VmFsdWUiLCJuYW1lIiwiU1RBVFVTIiwiTk9STUFMIiwiRU9NIiwiSUdOT1JFIiwiUkVTRVRDT05ORUNUSU9OIiwiUkVTRVRDT05ORUNUSU9OU0tJUFRSQU4iLCJPRkZTRVQiLCJUeXBlIiwiU3RhdHVzIiwiTGVuZ3RoIiwiU1BJRCIsIlBhY2tldElEIiwiV2luZG93IiwiREVGQVVMVF9TUElEIiwiREVGQVVMVF9QQUNLRVRJRCIsIkRFRkFVTFRfV0lORE9XIiwiTkwiLCJQYWNrZXQiLCJjb25zdHJ1Y3RvciIsInR5cGVPckJ1ZmZlciIsIkJ1ZmZlciIsImJ1ZmZlciIsInR5cGUiLCJhbGxvYyIsIndyaXRlVUludDgiLCJ3cml0ZVVJbnQxNkJFIiwic2V0TGVuZ3RoIiwibGVuZ3RoIiwicmVhZFVJbnQxNkJFIiwicmVzZXRDb25uZWN0aW9uIiwicmVzZXQiLCJzdGF0dXMiLCJyZWFkVUludDgiLCJsYXN0IiwiYXJndW1lbnRzIiwiaXNMYXN0IiwiaWdub3JlIiwicGFja2V0SWQiLCJhZGREYXRhIiwiZGF0YSIsImNvbmNhdCIsInNsaWNlIiwic3RhdHVzQXNTdHJpbmciLCJzdGF0dXNlcyIsInZhbHVlIiwicHVzaCIsInVuZGVmaW5lZCIsImpvaW4iLCJ0cmltIiwiaGVhZGVyVG9TdHJpbmciLCJpbmRlbnQiLCJ0ZXh0Iiwic3ByaW50ZiIsImRhdGFUb1N0cmluZyIsIkJZVEVTX1BFUl9HUk9VUCIsIkNIQVJTX1BFUl9HUk9VUCIsIkJZVEVTX1BFUl9MSU5FIiwiZGF0YUR1bXAiLCJjaGFycyIsIm9mZnNldCIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsInRvU3RyaW5nIiwicGF5bG9hZFN0cmluZyIsImlzUGFja2V0Q29tcGxldGUiLCJwb3RlbnRpYWxQYWNrZXRCdWZmZXIiLCJwYWNrZXRMZW5ndGgiXSwic291cmNlcyI6WyIuLi9zcmMvcGFja2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwcmludGYgfSBmcm9tICdzcHJpbnRmLWpzJztcblxuZXhwb3J0IGNvbnN0IEhFQURFUl9MRU5HVEggPSA4O1xuXG5leHBvcnQgY29uc3QgVFlQRTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHtcbiAgU1FMX0JBVENIOiAweDAxLFxuICBSUENfUkVRVUVTVDogMHgwMyxcbiAgVEFCVUxBUl9SRVNVTFQ6IDB4MDQsXG4gIEFUVEVOVElPTjogMHgwNixcbiAgQlVMS19MT0FEOiAweDA3LFxuICBUUkFOU0FDVElPTl9NQU5BR0VSOiAweDBFLFxuICBMT0dJTjc6IDB4MTAsXG4gIE5UTE1BVVRIX1BLVDogMHgxMSxcbiAgUFJFTE9HSU46IDB4MTIsXG4gIEZFREFVVEhfVE9LRU46IDB4MDhcbn07XG5cbmNvbnN0IHR5cGVCeVZhbHVlOiB7IFtrZXk6IG51bWJlcl06IHN0cmluZyB9ID0ge307XG5cbmZvciAoY29uc3QgbmFtZSBpbiBUWVBFKSB7XG4gIHR5cGVCeVZhbHVlW1RZUEVbbmFtZV1dID0gbmFtZTtcbn1cblxuY29uc3QgU1RBVFVTOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge1xuICBOT1JNQUw6IDB4MDAsXG4gIEVPTTogMHgwMSxcbiAgSUdOT1JFOiAweDAyLFxuICBSRVNFVENPTk5FQ1RJT046IDB4MDgsXG4gIFJFU0VUQ09OTkVDVElPTlNLSVBUUkFOOiAweDEwXG59O1xuXG5leHBvcnQgY29uc3QgT0ZGU0VUID0ge1xuICBUeXBlOiAwLFxuICBTdGF0dXM6IDEsXG4gIExlbmd0aDogMixcbiAgU1BJRDogNCxcbiAgUGFja2V0SUQ6IDYsXG4gIFdpbmRvdzogN1xufTtcblxuY29uc3QgREVGQVVMVF9TUElEID0gMDtcblxuY29uc3QgREVGQVVMVF9QQUNLRVRJRCA9IDE7XG5cbmNvbnN0IERFRkFVTFRfV0lORE9XID0gMDtcblxuY29uc3QgTkwgPSAnXFxuJztcblxuZXhwb3J0IGNsYXNzIFBhY2tldCB7XG4gIGRlY2xhcmUgYnVmZmVyOiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3IodHlwZU9yQnVmZmVyOiBCdWZmZXIgfCBudW1iZXIpIHtcbiAgICBpZiAodHlwZU9yQnVmZmVyIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IHR5cGVPckJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9IHR5cGVPckJ1ZmZlcjtcbiAgICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jKEhFQURFUl9MRU5HVEgsIDApO1xuICAgICAgdGhpcy5idWZmZXIud3JpdGVVSW50OCh0eXBlLCBPRkZTRVQuVHlwZSk7XG4gICAgICB0aGlzLmJ1ZmZlci53cml0ZVVJbnQ4KFNUQVRVUy5OT1JNQUwsIE9GRlNFVC5TdGF0dXMpO1xuICAgICAgdGhpcy5idWZmZXIud3JpdGVVSW50MTZCRShERUZBVUxUX1NQSUQsIE9GRlNFVC5TUElEKTtcbiAgICAgIHRoaXMuYnVmZmVyLndyaXRlVUludDgoREVGQVVMVF9QQUNLRVRJRCwgT0ZGU0VULlBhY2tldElEKTtcbiAgICAgIHRoaXMuYnVmZmVyLndyaXRlVUludDgoREVGQVVMVF9XSU5ET1csIE9GRlNFVC5XaW5kb3cpO1xuICAgICAgdGhpcy5zZXRMZW5ndGgoKTtcbiAgICB9XG4gIH1cblxuICBzZXRMZW5ndGgoKSB7XG4gICAgdGhpcy5idWZmZXIud3JpdGVVSW50MTZCRSh0aGlzLmJ1ZmZlci5sZW5ndGgsIE9GRlNFVC5MZW5ndGgpO1xuICB9XG5cbiAgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5yZWFkVUludDE2QkUoT0ZGU0VULkxlbmd0aCk7XG4gIH1cblxuICByZXNldENvbm5lY3Rpb24ocmVzZXQ6IGJvb2xlYW4pIHtcbiAgICBsZXQgc3RhdHVzID0gdGhpcy5idWZmZXIucmVhZFVJbnQ4KE9GRlNFVC5TdGF0dXMpO1xuICAgIGlmIChyZXNldCkge1xuICAgICAgc3RhdHVzIHw9IFNUQVRVUy5SRVNFVENPTk5FQ1RJT047XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1cyAmPSAweEZGIC0gU1RBVFVTLlJFU0VUQ09OTkVDVElPTjtcbiAgICB9XG4gICAgdGhpcy5idWZmZXIud3JpdGVVSW50OChzdGF0dXMsIE9GRlNFVC5TdGF0dXMpO1xuICB9XG5cbiAgbGFzdChsYXN0PzogYm9vbGVhbikge1xuICAgIGxldCBzdGF0dXMgPSB
|