implement the NAPTR record (#89)

* implement the NAPTR record

* implement NAPTR record for readme

* update

* Update index.js

* Update index.js

* Update index.js

* fix test failed

* Add actual example values to README

* Update README.md

* Update README.md

---------

Co-authored-by: root <[email protected]>
Co-authored-by: silverwind <[email protected]>
This commit is contained in:
xuhjbj
2023-03-27 12:21:37 +02:00
committed by Github
co-authored by root silverwind
parent 31d3caf326
commit aca1ff751c
3 changed files with 85 additions and 0 deletions
+16
View File
@@ -366,6 +366,22 @@ The options `PADDING`, `CLIENT_SUBNET`, `TCP_KEEPALIVE` and `KEY_TAG` support en
} }
``` ```
#### `NAPTR`
``` js
{
data:
{
order: 100,
preference: 10,
flags: 's',
services: 'SIP+D2U',
regexp: '!^.*$!sip:[email protected]!',
replacement: '_sip._udp.example.com'
}
}
```
When encoding, scalar values are converted to an array and strings are converted to UTF-8 encoded Buffers. When decoding, the return value will always be an array of Buffer. When encoding, scalar values are converted to an array and strings are converted to UTF-8 encoded Buffers. When decoding, the return value will always be an array of Buffer.
If you need another record type, open an issue and we'll try to add it. If you need another record type, open an issue and we'll try to add it.
+57
View File
@@ -1353,6 +1353,62 @@ rsshfp.encodingLength = function (record) {
return 4 + Buffer.from(record.fingerprint, 'hex').byteLength return 4 + Buffer.from(record.fingerprint, 'hex').byteLength
} }
const rnaptr = exports.naptr = {}
rnaptr.encode = function (data, buf, offset) {
if (!buf) buf = Buffer.alloc(rnaptr.encodingLength(data))
if (!offset) offset = 0
const oldOffset = offset
offset += 2
buf.writeUInt16BE(data.order || 0, offset)
offset += 2
buf.writeUInt16BE(data.preference || 0, offset)
offset += 2
string.encode(data.flags, buf, offset)
offset += string.encode.bytes
string.encode(data.services, buf, offset)
offset += string.encode.bytes
string.encode(data.regexp, buf, offset)
offset += string.encode.bytes
name.encode(data.replacement, buf, offset)
offset += name.encode.bytes
rnaptr.encode.bytes = offset - oldOffset
buf.writeUInt16BE(rnaptr.encode.bytes - 2, oldOffset)
return buf
}
rnaptr.encode.bytes = 0
rnaptr.decode = function (buf, offset) {
if (!offset) offset = 0
const oldOffset = offset
const data = {}
offset += 2
data.order = buf.readUInt16BE(offset)
offset += 2
data.preference = buf.readUInt16BE(offset)
offset += 2
data.flags = string.decode(buf, offset)
offset += string.decode.bytes
data.services = string.decode(buf, offset)
offset += string.decode.bytes
data.regexp = string.decode(buf, offset)
offset += string.decode.bytes
data.replacement = name.decode(buf, offset)
offset += name.decode.bytes
rnaptr.decode.bytes = offset - oldOffset
return data
}
rnaptr.decode.bytes = 0
rnaptr.encodingLength = function (data) {
return string.encodingLength(data.flags) +
string.encodingLength(data.services) +
string.encodingLength(data.regexp) +
name.encodingLength(data.replacement) + 6
}
const renc = exports.record = function (type) { const renc = exports.record = function (type) {
switch (type.toUpperCase()) { switch (type.toUpperCase()) {
case 'A': return ra case 'A': return ra
@@ -1376,6 +1432,7 @@ const renc = exports.record = function (type) {
case 'NSEC3': return rnsec3 case 'NSEC3': return rnsec3
case 'SSHFP': return rsshfp case 'SSHFP': return rsshfp
case 'DS': return rds case 'DS': return rds
case 'NAPTR': return rnaptr
} }
return runknown return runknown
} }
+12
View File
@@ -556,6 +556,18 @@ tape('ds', function (t) {
t.end() t.end()
}) })
tape('naptr', function (t) {
testEncoder(t, packet.naptr, {
order: 1,
preference: 1,
flags: 'S',
services: 'SIP+D2T',
regexp: '!^.*$!sip:[email protected]!',
replacement: '_sip._udp.xuexample.com'
})
t.end()
})
tape('unpack', function (t) { tape('unpack', function (t) {
const buf = Buffer.from([ const buf = Buffer.from([
0x00, 0x79, 0x00, 0x79,