@nictool/dns-resource-record 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,18 @@ Notable changes to this project are documented in this file.
4
4
 
5
5
  #### Unreleased
6
6
 
7
+ ### [1.6.0] - 2026-03-26
8
+
9
+ #### Changed
10
+
11
+ - feat(getCanonical): added to RRs where missing
12
+ - feat(toWire): added wire format export
13
+ - feat: add getTags() to all RR types
14
+ - values: common, obsolete, security, dnssec
15
+ - doc(README): categorize RR types.
16
+ - added RFCs to: AAAA 5952, NAPTR 4848, SIG 3755, TLSA 7671
17
+ - TXT: 4408, 6376, 7208
18
+
7
19
  ### [1.5.0] - 2026-03-22
8
20
 
9
21
  - feat(RRSIG, SIG, TSIG): added toBind, toTinydns, fromTinydns
@@ -366,3 +378,4 @@ Notable changes to this project are documented in this file.
366
378
  [1.3.1]: https://github.com/NicTool/dns-resource-record/releases/tag/v1.3.1
367
379
  [1.4.0]: https://github.com/NicTool/dns-resource-record/releases/tag/v1.4.0
368
380
  [1.5.0]: https://github.com/NicTool/dns-resource-record/releases/tag/v1.5.0
381
+ [1.6.0]: https://github.com/NicTool/dns-resource-record/releases/tag/v1.6.0
package/README.md CHANGED
@@ -186,48 +186,54 @@ This module intends to support all current (ie, not officially deprecated) DNS R
186
186
 
187
187
  PRs are welcome, especially PRs with tests.
188
188
 
189
- | **RR** | **toBind** | **toTinydns** | **fromBind** | **fromTinydns** |
190
- | :------------: | :----------------: | :----------------: | :----------------: | :----------------: |
191
- | **A** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
192
- | **AAAA** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
193
- | **APL** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
194
- | **CAA** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
195
- | **CERT** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
196
- | **CNAME** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
197
- | **DHCID** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
198
- | **DNAME** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
199
- | **DNSKEY** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
200
- | **DS** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
201
- | **HINFO** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
202
- | **HIP** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
203
- | **HTTPS** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
204
- | **IPSECKEY** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
205
- | **KEY** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
206
- | **KX** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
207
- | **LOC** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
208
- | **MX** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
209
- | **NAPTR** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
210
- | **NS** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
211
- | **NSEC** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
212
- | **NSEC3** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
213
- | **NSEC3PARAM** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
214
- | **NXT** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
215
- | **OPENPGPKEY** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
216
- | **PTR** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
217
- | **RP** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
218
- | **RRSIG** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
219
- | **SIG** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
220
- | **SMIMEA** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
221
- | **SOA** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
222
- | **SPF** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
223
- | **SRV** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
224
- | **SSHFP** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
225
- | **SVCB** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
226
- | **TLSA** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
227
- | **TSIG** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
228
- | **TXT** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
229
- | **URI** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
230
- | **WKS** | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
189
+ | **RR** | **BIND / RFC 1035** | **Tinydns** |
190
+ | :------------: | :-----------------: | :----------------: |
191
+ | _Common_ |
192
+ | **A** | :white_check_mark: | :white_check_mark: |
193
+ | **AAAA** | :white_check_mark: | :white_check_mark: |
194
+ | **CNAME** | :white_check_mark: | :white_check_mark: |
195
+ | **HTTPS** | :white_check_mark: | :white_check_mark: |
196
+ | **MX** | :white_check_mark: | :white_check_mark: |
197
+ | **NS** | :white_check_mark: | :white_check_mark: |
198
+ | **PTR** | :white_check_mark: | :white_check_mark: |
199
+ | **SRV** | :white_check_mark: | :white_check_mark: |
200
+ | **TXT** | :white_check_mark: | :white_check_mark: |
201
+ | _Less Common_ |
202
+ | **APL** | :white_check_mark: | :white_check_mark: |
203
+ | **CERT** | :white_check_mark: | :white_check_mark: |
204
+ | **DHCID** | :white_check_mark: | :white_check_mark: |
205
+ | **DNAME** | :white_check_mark: | :white_check_mark: |
206
+ | **HIP** | :white_check_mark: | :white_check_mark: |
207
+ | **KEY** | :white_check_mark: | :white_check_mark: |
208
+ | **KX** | :white_check_mark: | :white_check_mark: |
209
+ | **LOC** | :white_check_mark: | :white_check_mark: |
210
+ | **NAPTR** | :white_check_mark: | :white_check_mark: |
211
+ | **SOA** | :white_check_mark: | :white_check_mark: |
212
+ | **SVCB** | :white_check_mark: | :white_check_mark: |
213
+ | **TSIG** | :white_check_mark: | :white_check_mark: |
214
+ | **URI** | :white_check_mark: | :white_check_mark: |
215
+ | _Security_ |
216
+ | **CAA** | :white_check_mark: | :white_check_mark: |
217
+ | **IPSECKEY** | :white_check_mark: | :white_check_mark: |
218
+ | **OPENPGPKEY** | :white_check_mark: | :white_check_mark: |
219
+ | **SMIMEA** | :white_check_mark: | :white_check_mark: |
220
+ | **SSHFP** | :white_check_mark: | :white_check_mark: |
221
+ | **TLSA** | :white_check_mark: | :white_check_mark: |
222
+ | _DNSSEC_ |
223
+ | **DNSKEY** | :white_check_mark: | :white_check_mark: |
224
+ | **DS** | :white_check_mark: | :white_check_mark: |
225
+ | **NSEC** | :white_check_mark: | :white_check_mark: |
226
+ | **NSEC3** | :white_check_mark: | :white_check_mark: |
227
+ | **NSEC3PARAM** | :white_check_mark: | :white_check_mark: |
228
+ | **RRSIG** | :white_check_mark: | :white_check_mark: |
229
+ | _Deprecated_ |
230
+ | **NXT** | :white_check_mark: | :white_check_mark: |
231
+ | **SPF** | :white_check_mark: | :white_check_mark: |
232
+ | _Obsolete_ |
233
+ | **HINFO** | :white_check_mark: | :white_check_mark: |
234
+ | **RP** | :white_check_mark: | :white_check_mark: |
235
+ | **SIG** | :white_check_mark: | :white_check_mark: |
236
+ | **WKS** | :white_check_mark: | :white_check_mark: |
231
237
 
232
238
  ## TIPS
233
239
 
package/lib/readme.js ADDED
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+ // Regenerates the Supported Records table in README.md using getTags() from each RR class.
3
+
4
+ import { readFileSync, writeFileSync } from 'fs'
5
+ import { fileURLToPath } from 'url'
6
+ import { dirname, join } from 'path'
7
+
8
+ import * as RR from '../index.js'
9
+
10
+ const __dirname = dirname(fileURLToPath(import.meta.url))
11
+
12
+ const tagToGroup = {
13
+ common: 'Common',
14
+ security: 'Security',
15
+ dnssec: 'DNSSEC',
16
+ deprecated: 'Deprecated',
17
+ obsolete: 'Obsolete',
18
+ }
19
+
20
+ const groupOrder = ['Common', 'Less Common', 'Security', 'DNSSEC', 'Deprecated', 'Obsolete']
21
+
22
+ function getGroup(instance) {
23
+ const tags = instance.getTags()
24
+ for (const [tag, group] of Object.entries(tagToGroup)) {
25
+ if (tags.includes(tag)) return group
26
+ }
27
+ return 'Less Common'
28
+ }
29
+
30
+ const groups = {}
31
+ for (const name of groupOrder) groups[name] = []
32
+
33
+ for (const [name, cls] of Object.entries(RR)) {
34
+ if (name === 'typeMap' || name === 'default') continue
35
+ if (typeof cls !== 'function') continue
36
+ const instance = new cls(null)
37
+ const group = getGroup(instance)
38
+ groups[group].push(name)
39
+ }
40
+
41
+ const check = ':white_check_mark:'
42
+ const rows = []
43
+ for (const groupName of groupOrder) {
44
+ const names = groups[groupName]
45
+ if (!names.length) continue
46
+ rows.push(`| *${groupName}* |`)
47
+ for (const name of names.sort()) {
48
+ const cls = RR[name]
49
+ const hasToBind = typeof cls.prototype.toBind === 'function'
50
+ const hasFromBind = typeof cls.prototype.fromBind === 'function'
51
+ const hasToTinydns = typeof cls.prototype.toTinydns === 'function'
52
+ const hasFromTinydns = typeof cls.prototype.fromTinydns === 'function'
53
+
54
+ const bind = hasToBind && hasFromBind ? check : ''
55
+ const tinydns = hasToTinydns && hasFromTinydns ? check : ''
56
+
57
+ rows.push(`| **${name}** | ${bind} | ${tinydns} |`)
58
+ }
59
+ }
60
+
61
+ const table = [
62
+ `| **RR** | **BIND / RFC 1035** | **Tinydns** |`,
63
+ `| :------------: | :-------------------: | :-----------------: |`,
64
+ ...rows,
65
+ ].join('\n')
66
+
67
+ const readmePath = join(__dirname, '..', 'README.md')
68
+ const readme = readFileSync(readmePath, 'utf-8')
69
+
70
+ // Replace from the table header line up to (but not including) the ## TIPS section
71
+ const tableHeaderMarker = '\n| **RR** |'
72
+ const tipsSectionMarker = '\n\n## TIPS'
73
+
74
+ const tableStart = readme.indexOf(tableHeaderMarker)
75
+ const tipsStart = readme.indexOf(tipsSectionMarker)
76
+
77
+ if (tableStart === -1 || tipsStart === -1) {
78
+ console.error('Could not locate table boundaries in README.md')
79
+ process.exit(1)
80
+ }
81
+
82
+ const newReadme = readme.slice(0, tableStart + 1) + table + '\n' + readme.slice(tipsStart)
83
+ writeFileSync(readmePath, newReadme)
84
+ console.log('README.md updated successfully')
package/lib/tinydns.js CHANGED
@@ -196,6 +196,16 @@ export function octalToIPv4(str) {
196
196
  return [24, 16, 8, 0].map((n) => (asInt >> n) & 0xff).join('.')
197
197
  }
198
198
 
199
+ export function ipv6toOctal(ip) {
200
+ return packHex(ip.replace(/:/g, ''))
201
+ }
202
+
203
+ export function octalToIPv6(str) {
204
+ return octalToHex(str)
205
+ .match(/(.{4})/g)
206
+ .join(':')
207
+ }
208
+
199
209
  export function base64toOctal(str) {
200
210
  const bytes = Buffer.from(str, 'base64')
201
211
  let escaped = ''
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nictool/dns-resource-record",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "DNS Resource Records",
5
5
  "main": "index.js",
6
6
  "files": [
@@ -11,6 +11,7 @@
11
11
  ],
12
12
  "type": "module",
13
13
  "scripts": {
14
+ "build": "node lib/readme.js",
14
15
  "format:check": "npm run prettier; npm run lint",
15
16
  "format": "npm run prettier -- --write && npm run lint:fix",
16
17
  "lint": "npx eslint **/*.js",
package/rr/a.js CHANGED
@@ -16,6 +16,10 @@ export default class A extends RR {
16
16
  return 'Address'
17
17
  }
18
18
 
19
+ getTags() {
20
+ return ['common']
21
+ }
22
+
19
23
  getRdataFields(arg) {
20
24
  return ['address']
21
25
  }
@@ -66,6 +70,10 @@ export default class A extends RR {
66
70
  }
67
71
 
68
72
  /****** EXPORTERS *******/
73
+ getWireRdata() {
74
+ return Buffer.from(this.get('address').split('.').map(Number))
75
+ }
76
+
69
77
  toTinydns() {
70
78
  return `+${this.getTinyFQDN('owner')}:${this.get('address')}:${this.getTinydnsPostamble()}\n`
71
79
  }
package/rr/aaaa.js CHANGED
@@ -22,12 +22,16 @@ export default class AAAA extends RR {
22
22
  return 'Address IPv6'
23
23
  }
24
24
 
25
+ getTags() {
26
+ return ['common']
27
+ }
28
+
25
29
  getRdataFields(arg) {
26
30
  return ['address']
27
31
  }
28
32
 
29
33
  getRFCs() {
30
- return [3596]
34
+ return [3596, 5952]
31
35
  }
32
36
 
33
37
  getTypeId() {
@@ -40,7 +44,7 @@ export default class AAAA extends RR {
40
44
  address: '2001:0db8:0020:000a:0000:0000:0000:0004',
41
45
  class: 'IN',
42
46
  ttl: 3600,
43
- type: 'A',
47
+ type: 'AAAA',
44
48
  }
45
49
  }
46
50
 
@@ -138,6 +142,10 @@ export default class AAAA extends RR {
138
142
  }
139
143
 
140
144
  /****** EXPORTERS *******/
145
+ getWireRdata() {
146
+ return Buffer.from(this.expand(this.get('address'), ''), 'hex')
147
+ }
148
+
141
149
  toBind(zone_opts) {
142
150
  return `${this.getPrefix(zone_opts)}\t${this.getCompressed()}\n`
143
151
  }
package/rr/caa.js CHANGED
@@ -62,6 +62,10 @@ export default class CAA extends RR {
62
62
  return 'Certification Authority Authorization'
63
63
  }
64
64
 
65
+ getTags() {
66
+ return ['security']
67
+ }
68
+
65
69
  getQuotedFields() {
66
70
  return ['value']
67
71
  }
package/rr/cert.js CHANGED
@@ -97,6 +97,19 @@ export default class CERT extends RR {
97
97
  return 37
98
98
  }
99
99
 
100
+ getCanonical() {
101
+ return {
102
+ owner: 'mail.example.com.',
103
+ ttl: 3600,
104
+ class: 'IN',
105
+ type: 'CERT',
106
+ 'cert type': 'PGP',
107
+ 'key tag': 0,
108
+ algorithm: 0,
109
+ certificate: 'hexidecimalkeystring1',
110
+ }
111
+ }
112
+
100
113
  /****** IMPORTERS *******/
101
114
 
102
115
  fromTinydns({ tinyline }) {
package/rr/cname.js CHANGED
@@ -25,6 +25,10 @@ export default class CNAME extends RR {
25
25
  return 'Canonical Name'
26
26
  }
27
27
 
28
+ getTags() {
29
+ return ['common']
30
+ }
31
+
28
32
  getRdataFields(arg) {
29
33
  return ['cname']
30
34
  }
@@ -37,6 +41,16 @@ export default class CNAME extends RR {
37
41
  return 5
38
42
  }
39
43
 
44
+ getCanonical() {
45
+ return {
46
+ owner: 'www.example.com.',
47
+ ttl: 3600,
48
+ class: 'IN',
49
+ type: 'CNAME',
50
+ cname: 'web.example.com.',
51
+ }
52
+ }
53
+
40
54
  /****** IMPORTERS *******/
41
55
  fromTinydns({ tinyline }) {
42
56
  // Cfqdn:p:ttl:timestamp:lo
@@ -65,6 +79,9 @@ export default class CNAME extends RR {
65
79
  }
66
80
 
67
81
  /****** EXPORTERS *******/
82
+ getWireRdata() {
83
+ return this.wirePackDomain(this.get('cname'))
84
+ }
68
85
 
69
86
  toTinydns() {
70
87
  return `C${this.getTinyFQDN('owner')}:${this.get('cname')}:${this.getTinydnsPostamble()}\n`
package/rr/dname.js CHANGED
@@ -35,6 +35,16 @@ export default class DNAME extends RR {
35
35
  return 39
36
36
  }
37
37
 
38
+ getCanonical() {
39
+ return {
40
+ owner: 'example.com.',
41
+ ttl: 3600,
42
+ class: 'IN',
43
+ type: 'DNAME',
44
+ target: 'example.net.',
45
+ }
46
+ }
47
+
38
48
  /****** IMPORTERS *******/
39
49
  fromTinydns({ tinyline }) {
40
50
  // DNAME via generic, :fqdn:n:rdata:ttl:timestamp:lo
package/rr/dnskey.js CHANGED
@@ -79,6 +79,10 @@ export default class DNSKEY extends RR {
79
79
  return 'DNS Public Key'
80
80
  }
81
81
 
82
+ getTags() {
83
+ return ['dnssec']
84
+ }
85
+
82
86
  getRdataFields(arg) {
83
87
  return ['flags', 'protocol', 'algorithm', 'publickey']
84
88
  }
@@ -91,6 +95,19 @@ export default class DNSKEY extends RR {
91
95
  return 48
92
96
  }
93
97
 
98
+ getCanonical() {
99
+ return {
100
+ owner: 'example.com.',
101
+ ttl: 3600,
102
+ class: 'IN',
103
+ type: 'DNSKEY',
104
+ flags: 256,
105
+ protocol: 3,
106
+ algorithm: 5,
107
+ publickey: 'AQPSKAsj8...',
108
+ }
109
+ }
110
+
94
111
  /****** IMPORTERS *******/
95
112
 
96
113
  fromBind({ bindline }) {
package/rr/ds.js CHANGED
@@ -50,6 +50,10 @@ export default class DS extends RR {
50
50
  return 'Delegation Signer'
51
51
  }
52
52
 
53
+ getTags() {
54
+ return ['dnssec']
55
+ }
56
+
53
57
  getRdataFields(arg) {
54
58
  return ['key tag', 'algorithm', 'digest type', 'digest']
55
59
  }
@@ -62,6 +66,19 @@ export default class DS extends RR {
62
66
  return 43
63
67
  }
64
68
 
69
+ getCanonical() {
70
+ return {
71
+ owner: 'example.com.',
72
+ ttl: 3600,
73
+ class: 'IN',
74
+ type: 'DS',
75
+ 'key tag': 12345,
76
+ algorithm: 5,
77
+ 'digest type': 1,
78
+ digest: 'ABCDEF123...',
79
+ }
80
+ }
81
+
65
82
  /****** IMPORTERS *******/
66
83
 
67
84
  fromBind({ bindline }) {
package/rr/hinfo.js CHANGED
@@ -22,6 +22,10 @@ export default class HINFO extends RR {
22
22
  return 'Host Info'
23
23
  }
24
24
 
25
+ getTags() {
26
+ return ['obsolete']
27
+ }
28
+
25
29
  getRdataFields(arg) {
26
30
  return ['cpu', 'os']
27
31
  }
@@ -34,6 +38,17 @@ export default class HINFO extends RR {
34
38
  return 13
35
39
  }
36
40
 
41
+ getCanonical() {
42
+ return {
43
+ owner: 'test.example.com.',
44
+ ttl: 3600,
45
+ class: 'IN',
46
+ type: 'HINFO',
47
+ cpu: 'DEC-2060',
48
+ os: 'TOPS20',
49
+ }
50
+ }
51
+
37
52
  getQuotedFields() {
38
53
  return ['cpu', 'os']
39
54
  }
package/rr/https.js CHANGED
@@ -32,6 +32,10 @@ export default class HTTPS extends RR {
32
32
  return 'HTTP Semantics'
33
33
  }
34
34
 
35
+ getTags() {
36
+ return ['common']
37
+ }
38
+
35
39
  getRdataFields(arg) {
36
40
  return ['priority', 'target name', 'params']
37
41
  }
@@ -44,6 +48,18 @@ export default class HTTPS extends RR {
44
48
  return 65
45
49
  }
46
50
 
51
+ getCanonical() {
52
+ return {
53
+ owner: 'example.com.',
54
+ ttl: 3600,
55
+ class: 'IN',
56
+ type: 'HTTPS',
57
+ priority: 1,
58
+ 'target name': 'example.com.',
59
+ params: 'alpn="h2,h3"',
60
+ }
61
+ }
62
+
47
63
  /****** IMPORTERS *******/
48
64
 
49
65
  fromBind({ bindline }) {
package/rr/ipseckey.js CHANGED
@@ -71,6 +71,10 @@ export default class IPSECKEY extends RR {
71
71
  return 'IPsec Keying'
72
72
  }
73
73
 
74
+ getTags() {
75
+ return ['security']
76
+ }
77
+
74
78
  getRdataFields(arg) {
75
79
  return ['precedence', 'gateway type', 'algorithm', 'gateway', 'publickey']
76
80
  }
@@ -134,7 +138,7 @@ export default class IPSECKEY extends RR {
134
138
  octalKey = rdata.slice(28)
135
139
  break
136
140
  case 2: // 16-byte IPv6
137
- gateway = TINYDNS.octalToHex(rdata.slice(12, 76))
141
+ gateway = TINYDNS.octalToIPv6(rdata.slice(12, 76))
138
142
  octalKey = rdata.slice(76)
139
143
  break
140
144
  case 3: // wire encoded domain name
package/rr/key.js CHANGED
@@ -63,6 +63,19 @@ export default class KEY extends RR {
63
63
  return 25
64
64
  }
65
65
 
66
+ getCanonical() {
67
+ return {
68
+ owner: 'example.com.',
69
+ ttl: 3600,
70
+ class: 'IN',
71
+ type: 'KEY',
72
+ flags: 256,
73
+ protocol: 3,
74
+ algorithm: 5,
75
+ publickey: 'AQPSKAsj8...',
76
+ }
77
+ }
78
+
66
79
  /****** IMPORTERS *******/
67
80
 
68
81
  fromBind({ bindline }) {
package/rr/loc.js CHANGED
@@ -48,6 +48,16 @@ export default class LOC extends RR {
48
48
  return 29
49
49
  }
50
50
 
51
+ getCanonical() {
52
+ return {
53
+ owner: 'example.com.',
54
+ ttl: 3600,
55
+ class: 'IN',
56
+ type: 'LOC',
57
+ address: '52 22 23.000 N 4 53 32.000 E 10m 100m 10m 2m',
58
+ }
59
+ }
60
+
51
61
  parseLoc(string) {
52
62
  // d1 [m1 [s1]]
53
63
  const dms = '(\\d+)\\s+(?:(\\d+)\\s+)?(?:([\\d.]+)\\s+)?'
package/rr/mx.js CHANGED
@@ -29,6 +29,10 @@ export default class MX extends RR {
29
29
  return 'Mail Exchanger'
30
30
  }
31
31
 
32
+ getTags() {
33
+ return ['common']
34
+ }
35
+
32
36
  getRdataFields(arg) {
33
37
  return ['preference', 'exchange']
34
38
  }
@@ -47,7 +51,7 @@ export default class MX extends RR {
47
51
  ttl: 43200,
48
52
  class: 'IN',
49
53
  type: 'MX',
50
- preference: 0,
54
+ preference: 10,
51
55
  exchange: 'mail.example.com.',
52
56
  }
53
57
  }
@@ -84,6 +88,12 @@ export default class MX extends RR {
84
88
  }
85
89
 
86
90
  /****** EXPORTERS *******/
91
+ getWireRdata() {
92
+ const pref = Buffer.alloc(2)
93
+ pref.writeUInt16BE(this.get('preference'))
94
+ return Buffer.concat([pref, this.wirePackDomain(this.get('exchange'))])
95
+ }
96
+
87
97
  toBind(zone_opts) {
88
98
  return `${this.getPrefix(zone_opts)}\t${this.get('preference')}\t${this.getFQDN('exchange', zone_opts)}\n`
89
99
  }
package/rr/naptr.js CHANGED
@@ -21,13 +21,28 @@ export default class NAPTR extends RR {
21
21
  }
22
22
 
23
23
  getRFCs() {
24
- return [2915, 3403]
24
+ return [2915, 3403, 4848]
25
25
  }
26
26
 
27
27
  getTypeId() {
28
28
  return 35
29
29
  }
30
30
 
31
+ getCanonical() {
32
+ return {
33
+ owner: 'cid.urn.arpa.',
34
+ ttl: 3600,
35
+ class: 'IN',
36
+ type: 'NAPTR',
37
+ order: 100,
38
+ preference: 10,
39
+ flags: 'S',
40
+ service: 'z3950+N2L+N2R',
41
+ regexp: '',
42
+ replacement: 'gatekeeper.example.com.',
43
+ }
44
+ }
45
+
31
46
  /****** Resource record specific setters *******/
32
47
  setOrder(val) {
33
48
  this.is16bitInt('NAPTR', 'order', val)
package/rr/ns.js CHANGED
@@ -21,6 +21,10 @@ export default class NS extends RR {
21
21
  return 'Name Server'
22
22
  }
23
23
 
24
+ getTags() {
25
+ return ['common']
26
+ }
27
+
24
28
  getRdataFields(arg) {
25
29
  return ['dname']
26
30
  }
@@ -33,6 +37,16 @@ export default class NS extends RR {
33
37
  return 2
34
38
  }
35
39
 
40
+ getCanonical() {
41
+ return {
42
+ owner: 'example.com.',
43
+ ttl: 3600,
44
+ class: 'IN',
45
+ type: 'NS',
46
+ dname: 'ns1.example.com.',
47
+ }
48
+ }
49
+
36
50
  /****** IMPORTERS *******/
37
51
  fromTinydns({ tinyline }) {
38
52
  // &fqdn:ip:x:ttl:timestamp:lo
@@ -63,6 +77,10 @@ export default class NS extends RR {
63
77
  }
64
78
 
65
79
  /****** EXPORTERS *******/
80
+ getWireRdata() {
81
+ return this.wirePackDomain(this.get('dname'))
82
+ }
83
+
66
84
  toBind(zone_opts) {
67
85
  return `${this.getPrefix(zone_opts)}\t${this.getFQDN('dname', zone_opts)}\n`
68
86
  }