@sintaxi/dnsd
Version:
Dynamic authoritative name server for Iris services
213 lines (189 loc) • 4.59 kB
JavaScript
// Copyright 2012 Iris Couch, all rights reserved.
//
// Looking up and converting between various constants
var util = require('util')
module.exports = { 'type' : swap_type
, 'class' : swap_class
, 'type_to_label' : type_to_label
, 'type_to_number' : type_to_number
, 'class_to_label' : class_to_label
, 'class_to_number': class_to_number
// For testing
, 'transpose' : transpose
, 'mk_type_labels': mk_type_labels
}
var TYPE_LABELS = mk_type_labels()
, CLASS_LABELS = mk_class_labels()
, TYPE_NUMBERS = transpose(TYPE_LABELS)
, CLASS_NUMBERS = transpose(CLASS_LABELS)
function swap_type(obj) {
return (typeof obj == 'string') ? type_to_number(obj) : type_to_label(obj)
}
function swap_class(obj) {
return (typeof obj == 'string') ? class_to_number(obj) : class_to_label(obj)
}
function type_to_label(type) {
if(isNaN(type) || typeof type != 'number' || type < 1 || type > 65535)
throw new Error('Invalid record type: ' + type)
return TYPE_LABELS[type]
}
function type_to_number(type) {
if(typeof type != 'string')
throw new Error('Type must be string: ' + type)
var num = TYPE_NUMBERS[type]
if(!num)
throw new Error('No such type label: ' + type)
else
return num
}
function class_to_label(clas) {
if(isNaN(clas) || typeof clas != 'number' || clas < 1 || clas > 65535)
throw new Error('Invalid record class: ' + clas)
return CLASS_LABELS[clas]
}
function class_to_number(clas) {
if(typeof clas != 'string')
throw new Error('Type must be string: ' + clas)
var num = CLASS_NUMBERS[clas]
if(!num)
throw new Error('No such clas label: ' + clas)
else
return num
}
//
// Utilities
//
function transpose(obj) {
var result = {}
Object.keys(obj).forEach(function(key) {
var val = obj[key]
if(typeof val == 'string')
result[val] = +key
})
return result
}
function mk_class_labels() {
var classes =
{ 0: 'reserved'
, 1: 'IN'
, 2: null
, 3: 'CH'
, 4: 'HS'
// 5 - 127 unassigned classes
// 128 - 253 unassigned qclasses
, 254: 'NONE'
, 255: '*'
// 256 - 32767 unassigned
// 32768 - 57343 unassigned
// 57344 - 65279 unassigned qclasses and metaclasses
// 65280 - 65534 Private use
, 65535: 'reserved'
}
var unassigned = [ [5,253], [256,65279] ]
unassigned.forEach(function(pair) {
var start = pair[0], stop = pair[1]
for(var i = start; i <= stop; i++)
classes[i] = null
})
for(var i = 65280; i <= 65534; i++)
classes[i] = 'Private use'
return classes
}
function mk_type_labels() {
var types =
{ 0: null
, 1: 'A'
, 2: 'NS'
, 3: 'MD'
, 4: 'MF'
, 5: 'CNAME'
, 6: 'SOA'
, 7: 'MB'
, 8: 'MG'
, 9: 'MR'
, 10: 'NULL'
, 11: 'WKS'
, 12: 'PTR'
, 13: 'HINFO'
, 14: 'MINFO'
, 15: 'MX'
, 16: 'TXT'
, 17: 'RP'
, 18: 'AFSDB'
, 19: 'X25'
, 20: 'ISDN'
, 21: 'RT'
, 22: 'NSAP'
, 23: 'NSAP-PTR'
, 24: 'SIG'
, 25: 'KEY'
, 26: 'PX'
, 27: 'GPOS'
, 28: 'AAAA'
, 29: 'LOC'
, 30: 'NXT'
, 31: 'EID'
, 32: 'NIMLOC'
, 33: 'SRV'
, 34: 'ATMA'
, 35: 'NAPTR'
, 36: 'KX'
, 37: 'CERT'
, 38: 'A6'
, 39: 'DNAME'
, 40: 'SINK'
, 41: 'OPT'
, 42: 'APL'
, 43: 'DS'
, 44: 'SSHFP'
, 45: 'IPSECKEY'
, 46: 'RRSIG'
, 47: 'NSEC'
, 48: 'DNSKEY'
, 49: 'DHCID'
, 50: 'NSEC3'
, 51: 'NSEC3PARAM'
, 52: 'TLSA'
// 53 - 54 unassigned
, 55: 'HIP'
, 56: 'NINFO'
, 57: 'RKEY'
, 58: 'TALINK'
, 59: 'CDS'
// 60 - 98 unassigned
, 99: 'SPF'
, 100: 'UINFO'
, 101: 'UID'
, 102: 'GID'
, 103: 'UNSPEC'
, 104: 'NID'
, 105: 'L32'
, 106: 'L64'
, 107: 'LP'
// 108 - 248 unassigned
, 249: 'TKEY'
, 250: 'TSIG'
, 251: 'IXFR'
, 252: 'AXFR'
, 253: 'MAILB'
, 254: 'MAILA'
, 255: '*'
, 256: 'URI'
, 257: 'CAA'
// 258 - 32767 unassigned
, 32768: 'TA'
, 32769: 'DLV'
// 32770 - 65279 unassigned
// 65280 - 65534 Private use
, 65535: 'Reserved'
}
var unassigned = [ [53,54], [60,98], [108,248], [258,32767], [32770,65279] ]
unassigned.forEach(function(pair) {
var start = pair[0], stop = pair[1]
for(var i = start; i <= stop; i++)
types[i] = null
})
for(var i = 65280; i <= 65534; i++)
types[i] = 'Private use'
return types
}