An abstract-encoding compliant module for encoding and decoding DNS packets with support for all major DNS record types and transport protocols
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Type conversion utilities for DNS record types, response codes, operation codes, DNS classes, and EDNS0 option codes.
Conversion between DNS record type names and numeric values.
const types = require('dns-packet/types');
// Convert type number to string
types.toString(type);
// Convert type string to number
types.toType(name);Supported Record Types:
Usage Examples:
const types = require('dns-packet/types');
// Type to string conversion
console.log(types.toString(1)); // 'A'
console.log(types.toString(28)); // 'AAAA'
console.log(types.toString(15)); // 'MX'
console.log(types.toString(999)); // 'UNKNOWN_999'
// String to type conversion
console.log(types.toType('A')); // 1
console.log(types.toType('AAAA')); // 28
console.log(types.toType('MX')); // 15
console.log(types.toType('INVALID')); // 0
// Case insensitive
console.log(types.toType('a')); // 1
console.log(types.toType('Aaaa')); // 28
// Special handling for UNKNOWN_ prefix
console.log(types.toType('UNKNOWN_999')); // 999Conversion between DNS response code names and numeric values.
const rcodes = require('dns-packet/rcodes');
// Convert response code number to string
rcodes.toString(rcode);
// Convert response code string to number
rcodes.toRcode(code);Supported Response Codes:
Usage Examples:
const rcodes = require('dns-packet/rcodes');
// Response code to string
console.log(rcodes.toString(0)); // 'NOERROR'
console.log(rcodes.toString(3)); // 'NXDOMAIN'
console.log(rcodes.toString(2)); // 'SERVFAIL'
console.log(rcodes.toString(99)); // 'RCODE_99'
// String to response code
console.log(rcodes.toRcode('NOERROR')); // 0
console.log(rcodes.toRcode('NXDOMAIN')); // 3
console.log(rcodes.toRcode('SERVFAIL')); // 2
console.log(rcodes.toRcode('INVALID')); // 0
// Case insensitive
console.log(rcodes.toRcode('noerror')); // 0
console.log(rcodes.toRcode('NxDomain')); // 3Conversion between DNS operation code names and numeric values.
const opcodes = require('dns-packet/opcodes');
// Convert operation code number to string
opcodes.toString(opcode);
// Convert operation code string to number
opcodes.toOpcode(code);Supported Operation Codes:
Usage Examples:
const opcodes = require('dns-packet/opcodes');
// Operation code to string
console.log(opcodes.toString(0)); // 'QUERY'
console.log(opcodes.toString(4)); // 'NOTIFY'
console.log(opcodes.toString(5)); // 'UPDATE'
console.log(opcodes.toString(99)); // 'OPCODE_99'
// String to operation code
console.log(opcodes.toOpcode('QUERY')); // 0
console.log(opcodes.toOpcode('NOTIFY')); // 4
console.log(opcodes.toOpcode('UPDATE')); // 5
console.log(opcodes.toOpcode('INVALID')); // 0
// Case insensitive
console.log(opcodes.toOpcode('query')); // 0
console.log(opcodes.toOpcode('Notify')); // 4Conversion between DNS class names and numeric values.
const classes = require('dns-packet/classes');
// Convert class number to string
classes.toString(klass);
// Convert class string to number
classes.toClass(name);Supported DNS Classes:
Usage Examples:
const classes = require('dns-packet/classes');
// Class to string
console.log(classes.toString(1)); // 'IN'
console.log(classes.toString(3)); // 'CH'
console.log(classes.toString(255)); // 'ANY'
console.log(classes.toString(99)); // 'UNKNOWN_99'
// String to class
console.log(classes.toClass('IN')); // 1
console.log(classes.toClass('CH')); // 3
console.log(classes.toClass('ANY')); // 255
console.log(classes.toClass('INVALID')); // 0
// Case insensitive
console.log(classes.toClass('in')); // 1
console.log(classes.toClass('Ch')); // 3Conversion between EDNS0 option code names and numeric values.
const optioncodes = require('dns-packet/optioncodes');
// Convert option code number to string
optioncodes.toString(type);
// Convert option code string/number to number
optioncodes.toCode(name);Supported EDNS0 Options:
Usage Examples:
const optioncodes = require('dns-packet/optioncodes');
// Option code to string
console.log(optioncodes.toString(8)); // 'CLIENT_SUBNET'
console.log(optioncodes.toString(12)); // 'PADDING'
console.log(optioncodes.toString(10)); // 'COOKIE'
console.log(optioncodes.toString(999)); // 'OPTION_999'
// String/number to option code
console.log(optioncodes.toCode('CLIENT_SUBNET')); // 8
console.log(optioncodes.toCode('PADDING')); // 12
console.log(optioncodes.toCode('COOKIE')); // 10
console.log(optioncodes.toCode(12)); // 12 (number passthrough)
console.log(optioncodes.toCode('OPTION_999')); // 999
console.log(optioncodes.toCode('INVALID')); // -1
// Case insensitive
console.log(optioncodes.toCode('client_subnet')); // 8
console.log(optioncodes.toCode('Padding')); // 12
// Pattern matching for OPTION_N format
console.log(optioncodes.toCode('OPTION_123')); // 123Building a DNS Query:
const dnsPacket = require('dns-packet');
const types = require('dns-packet/types');
const classes = require('dns-packet/classes');
const packet = {
type: 'query',
id: 1234,
flags: dnsPacket.RECURSION_DESIRED,
questions: [{
type: types.toString(1), // 'A'
class: classes.toString(1), // 'IN'
name: 'example.com'
}]
};Processing a DNS Response:
const response = dnsPacket.decode(buffer);
const rcodes = require('dns-packet/rcodes');
// Check response code
const rcode = response.flags & 0x0F; // Extract RCODE from flags
if (rcode !== 0) {
console.log('DNS error:', rcodes.toString(rcode));
}
// Process answers
response.answers.forEach(answer => {
console.log(`${answer.name} ${answer.type} ${answer.data}`);
});EDNS0 Option Processing:
const optioncodes = require('dns-packet/optioncodes');
// Find OPT record in additionals
const optRecord = packet.additionals.find(r => r.type === 'OPT');
if (optRecord) {
optRecord.options.forEach(option => {
const optionName = optioncodes.toString(option.code);
console.log(`EDNS0 option: ${optionName} (${option.code})`);
});
}Install with Tessl CLI
npx tessl i tessl/npm-dns-packet