UNPKG

dns-packet-typescript

Version:

An abstract-encoding compliant module for encoding / decoding DNS packets

80 lines 2.55 kB
"use strict"; 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