dns-packet-typescript
Version:
An abstract-encoding compliant module for encoding / decoding DNS packets
80 lines • 2.55 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.encodingLength = exports.decode = exports.encode = void 0;
var types = require("./types");
function encode(typelist, buf, offset) {
if (offset === void 0) { offset = 0; }
if (!buf) {
buf = Buffer.allocUnsafe(encodingLength(typelist));
}
if (!offset) {
offset = 0;
}
var oldOffset = offset;
var typesByWindow = [];
for (var i = 0; i < typelist.length; i++) {
var typeid = types.toType(typelist[i]);
if (typesByWindow[typeid >> 8] === undefined) {
typesByWindow[typeid >> 8] = [];
}
typesByWindow[typeid >> 8][(typeid >> 3) & 0x1F] |= 1 << (7 - (typeid & 0x7));
}
for (i = 0; i < typesByWindow.length; i++) {
if (typesByWindow[i] !== undefined) {
var windowBuf = Buffer.from(typesByWindow[i]);
buf.writeUInt8(i, offset);
offset += 1;
buf.writeUInt8(windowBuf.length, offset);
offset += 1;
windowBuf.copy(buf, offset);
offset += windowBuf.length;
}
}
encode.bytes = offset - oldOffset;
return buf;
}
exports.encode = encode;
encode.bytes = 0;
function decode(buf, offset, length) {
if (!offset) {
offset = 0;
}
var oldOffset = offset;
var typelist = [];
while (offset - oldOffset < length) {
var window = buf.readUInt8(offset);
offset += 1;
var windowLength = buf.readUInt8(offset);
offset += 1;
for (var i = 0; i < windowLength; i++) {
var b = buf.readUInt8(offset + i);
for (var j = 0; j < 8; j++) {
if (b & (1 << (7 - j))) {
var typeid = types.toString((window << 8) | (i << 3) | j);
typelist.push(typeid);
}
}
}
offset += windowLength;
}
decode.bytes = offset - oldOffset;
return typelist;
}
exports.decode = decode;
decode.bytes = 0;
function encodingLength(typelist) {
var extents = [];
for (var i = 0; i < typelist.length; i++) {
var typeid = types.toType(typelist[i]);
extents[typeid >> 8] = Math.max(extents[typeid >> 8] || 0, typeid & 0xFF);
}
var len = 0;
for (i = 0; i < extents.length; i++) {
if (extents[i] !== undefined) {
len += 2 + Math.ceil((extents[i] + 1) / 8);
}
}
return len;
}
exports.encodingLength = encodingLength;
//# sourceMappingURL=typebitmap.js.map
;