@xyo-network/xns-record-payload-plugins 3.0.4 → 3.0.6
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/dist/browser/DNS/Witness/Config.d.ts +12 -0
- package/dist/browser/DNS/Witness/Config.d.ts.map +1 -0
- package/dist/browser/DNS/Witness/Params.d.ts +5 -0
- package/dist/browser/DNS/Witness/Params.d.ts.map +1 -0
- package/dist/browser/DNS/Witness/Payload/Payload.d.ts +4 -0
- package/dist/browser/DNS/Witness/Payload/Payload.d.ts.map +1 -0
- package/dist/browser/DNS/Witness/Payload/Request.d.ts +9 -0
- package/dist/browser/DNS/Witness/Payload/Request.d.ts.map +1 -0
- package/dist/browser/DNS/Witness/Payload/Response.d.ts +8 -0
- package/dist/browser/DNS/Witness/Payload/Response.d.ts.map +1 -0
- package/dist/browser/DNS/Witness/Payload/index.d.ts +4 -0
- package/dist/browser/DNS/Witness/Payload/index.d.ts.map +1 -0
- package/dist/browser/DNS/Witness/Schema.d.ts +3 -0
- package/dist/browser/DNS/Witness/Schema.d.ts.map +1 -0
- package/dist/browser/DNS/Witness/index.d.ts +5 -0
- package/dist/browser/DNS/Witness/index.d.ts.map +1 -0
- package/dist/browser/DNS/index.d.ts +3 -0
- package/dist/browser/DNS/index.d.ts.map +1 -0
- package/dist/browser/DNS/types/Answer.d.ts +5 -0
- package/dist/browser/DNS/types/Answer.d.ts.map +1 -0
- package/dist/browser/DNS/types/Header.d.ts +38 -0
- package/dist/browser/DNS/types/Header.d.ts.map +1 -0
- package/dist/browser/DNS/types/OperationCodes.d.ts +4 -0
- package/dist/browser/DNS/types/OperationCodes.d.ts.map +1 -0
- package/dist/browser/DNS/types/Record.d.ts +8 -0
- package/dist/browser/DNS/types/Record.d.ts.map +1 -0
- package/dist/browser/DNS/types/Request.d.ts +13 -0
- package/dist/browser/DNS/types/Request.d.ts.map +1 -0
- package/dist/browser/DNS/types/ResourceRecord.d.ts +5 -0
- package/dist/browser/DNS/types/ResourceRecord.d.ts.map +1 -0
- package/dist/browser/DNS/types/Response.d.ts +11 -0
- package/dist/browser/DNS/types/Response.d.ts.map +1 -0
- package/dist/browser/DNS/types/ResponseCodes.d.ts +4 -0
- package/dist/browser/DNS/types/ResponseCodes.d.ts.map +1 -0
- package/dist/browser/DNS/types/index.d.ts +9 -0
- package/dist/browser/DNS/types/index.d.ts.map +1 -0
- package/dist/browser/index.d.ts +1 -0
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.mjs +341 -19
- package/dist/browser/index.mjs.map +1 -1
- package/dist/neutral/DNS/Witness/Config.d.ts +12 -0
- package/dist/neutral/DNS/Witness/Config.d.ts.map +1 -0
- package/dist/neutral/DNS/Witness/Params.d.ts +5 -0
- package/dist/neutral/DNS/Witness/Params.d.ts.map +1 -0
- package/dist/neutral/DNS/Witness/Payload/Payload.d.ts +4 -0
- package/dist/neutral/DNS/Witness/Payload/Payload.d.ts.map +1 -0
- package/dist/neutral/DNS/Witness/Payload/Request.d.ts +9 -0
- package/dist/neutral/DNS/Witness/Payload/Request.d.ts.map +1 -0
- package/dist/neutral/DNS/Witness/Payload/Response.d.ts +8 -0
- package/dist/neutral/DNS/Witness/Payload/Response.d.ts.map +1 -0
- package/dist/neutral/DNS/Witness/Payload/index.d.ts +4 -0
- package/dist/neutral/DNS/Witness/Payload/index.d.ts.map +1 -0
- package/dist/neutral/DNS/Witness/Schema.d.ts +3 -0
- package/dist/neutral/DNS/Witness/Schema.d.ts.map +1 -0
- package/dist/neutral/DNS/Witness/index.d.ts +5 -0
- package/dist/neutral/DNS/Witness/index.d.ts.map +1 -0
- package/dist/neutral/DNS/index.d.ts +3 -0
- package/dist/neutral/DNS/index.d.ts.map +1 -0
- package/dist/neutral/DNS/types/Answer.d.ts +5 -0
- package/dist/neutral/DNS/types/Answer.d.ts.map +1 -0
- package/dist/neutral/DNS/types/Header.d.ts +38 -0
- package/dist/neutral/DNS/types/Header.d.ts.map +1 -0
- package/dist/neutral/DNS/types/OperationCodes.d.ts +4 -0
- package/dist/neutral/DNS/types/OperationCodes.d.ts.map +1 -0
- package/dist/neutral/DNS/types/Record.d.ts +8 -0
- package/dist/neutral/DNS/types/Record.d.ts.map +1 -0
- package/dist/neutral/DNS/types/Request.d.ts +13 -0
- package/dist/neutral/DNS/types/Request.d.ts.map +1 -0
- package/dist/neutral/DNS/types/ResourceRecord.d.ts +5 -0
- package/dist/neutral/DNS/types/ResourceRecord.d.ts.map +1 -0
- package/dist/neutral/DNS/types/Response.d.ts +11 -0
- package/dist/neutral/DNS/types/Response.d.ts.map +1 -0
- package/dist/neutral/DNS/types/ResponseCodes.d.ts +4 -0
- package/dist/neutral/DNS/types/ResponseCodes.d.ts.map +1 -0
- package/dist/neutral/DNS/types/index.d.ts +9 -0
- package/dist/neutral/DNS/types/index.d.ts.map +1 -0
- package/dist/neutral/index.d.ts +1 -0
- package/dist/neutral/index.d.ts.map +1 -1
- package/dist/neutral/index.mjs +341 -19
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/node/DNS/Witness/Config.d.ts +12 -0
- package/dist/node/DNS/Witness/Config.d.ts.map +1 -0
- package/dist/node/DNS/Witness/Params.d.ts +5 -0
- package/dist/node/DNS/Witness/Params.d.ts.map +1 -0
- package/dist/node/DNS/Witness/Payload/Payload.d.ts +4 -0
- package/dist/node/DNS/Witness/Payload/Payload.d.ts.map +1 -0
- package/dist/node/DNS/Witness/Payload/Request.d.ts +9 -0
- package/dist/node/DNS/Witness/Payload/Request.d.ts.map +1 -0
- package/dist/node/DNS/Witness/Payload/Response.d.ts +8 -0
- package/dist/node/DNS/Witness/Payload/Response.d.ts.map +1 -0
- package/dist/node/DNS/Witness/Payload/index.d.ts +4 -0
- package/dist/node/DNS/Witness/Payload/index.d.ts.map +1 -0
- package/dist/node/DNS/Witness/Schema.d.ts +3 -0
- package/dist/node/DNS/Witness/Schema.d.ts.map +1 -0
- package/dist/node/DNS/Witness/index.d.ts +5 -0
- package/dist/node/DNS/Witness/index.d.ts.map +1 -0
- package/dist/node/DNS/index.d.ts +3 -0
- package/dist/node/DNS/index.d.ts.map +1 -0
- package/dist/node/DNS/types/Answer.d.ts +5 -0
- package/dist/node/DNS/types/Answer.d.ts.map +1 -0
- package/dist/node/DNS/types/Header.d.ts +38 -0
- package/dist/node/DNS/types/Header.d.ts.map +1 -0
- package/dist/node/DNS/types/OperationCodes.d.ts +4 -0
- package/dist/node/DNS/types/OperationCodes.d.ts.map +1 -0
- package/dist/node/DNS/types/Record.d.ts +8 -0
- package/dist/node/DNS/types/Record.d.ts.map +1 -0
- package/dist/node/DNS/types/Request.d.ts +13 -0
- package/dist/node/DNS/types/Request.d.ts.map +1 -0
- package/dist/node/DNS/types/ResourceRecord.d.ts +5 -0
- package/dist/node/DNS/types/ResourceRecord.d.ts.map +1 -0
- package/dist/node/DNS/types/Response.d.ts +11 -0
- package/dist/node/DNS/types/Response.d.ts.map +1 -0
- package/dist/node/DNS/types/ResponseCodes.d.ts +4 -0
- package/dist/node/DNS/types/ResponseCodes.d.ts.map +1 -0
- package/dist/node/DNS/types/index.d.ts +9 -0
- package/dist/node/DNS/types/index.d.ts.map +1 -0
- package/dist/node/index.d.ts +1 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.mjs +341 -19
- package/dist/node/index.mjs.map +1 -1
- package/package.json +10 -8
- package/src/DNS/Witness/Config.ts +24 -0
- package/src/DNS/Witness/Params.ts +6 -0
- package/src/DNS/Witness/Payload/Payload.ts +4 -0
- package/src/DNS/Witness/Payload/Request.ts +40 -0
- package/src/DNS/Witness/Payload/Response.ts +29 -0
- package/src/DNS/Witness/Payload/index.ts +3 -0
- package/src/DNS/Witness/Schema.ts +2 -0
- package/src/DNS/Witness/index.ts +4 -0
- package/src/DNS/index.ts +2 -0
- package/src/DNS/types/Answer.ts +5 -0
- package/src/DNS/types/Header.ts +95 -0
- package/src/DNS/types/OperationCodes.ts +13 -0
- package/src/DNS/types/Record.ts +9 -0
- package/src/DNS/types/Request.ts +38 -0
- package/src/DNS/types/ResourceRecord.ts +229 -0
- package/src/DNS/types/Response.ts +12 -0
- package/src/DNS/types/ResponseCodes.ts +34 -0
- package/src/DNS/types/index.ts +8 -0
- package/src/index.ts +1 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { PayloadWithSources } from '@xyo-network/payload-model'
|
|
2
|
+
import {
|
|
3
|
+
isPayloadOfSchemaType,
|
|
4
|
+
isPayloadOfSchemaTypeWithMeta,
|
|
5
|
+
isPayloadOfSchemaTypeWithSources,
|
|
6
|
+
} from '@xyo-network/payload-model'
|
|
7
|
+
|
|
8
|
+
import type { DNSRequestFields, DNSResourceRecordTypeValue } from '../../types/index.ts'
|
|
9
|
+
import { DNSResourceRecordTypes, getRequestFor } from '../../types/index.ts'
|
|
10
|
+
import { DNSSchema } from '../Schema.ts'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The fields of a DNSRequest payload
|
|
14
|
+
*/
|
|
15
|
+
export type DNSRequest = PayloadWithSources<DNSRequestFields, DNSSchema>
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Identity function for determining if an object is a DNSRequest payload
|
|
19
|
+
*/
|
|
20
|
+
export const isDNSRequest = isPayloadOfSchemaType<DNSRequest>(DNSSchema)
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Identity function for determining if an object is a DNSRequest payload with sources
|
|
24
|
+
*/
|
|
25
|
+
export const isDNSRequestWithSources = isPayloadOfSchemaTypeWithSources<DNSRequest>(DNSSchema)
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Identity function for determining if an object is a DNSRequest payload with meta
|
|
29
|
+
*/
|
|
30
|
+
export const isDNSRequestWithMeta = isPayloadOfSchemaTypeWithMeta<DNSRequest>(DNSSchema)
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Helper for generating a DNSRequest payload for a given domain and record type
|
|
34
|
+
* @param domain The domain to query
|
|
35
|
+
* @param type The record type to query
|
|
36
|
+
* @returns A DNSRequest payload
|
|
37
|
+
*/
|
|
38
|
+
export const getDnsRequestFor = (domain: string, type: DNSResourceRecordTypeValue = DNSResourceRecordTypes.A): DNSRequest => {
|
|
39
|
+
return { ...getRequestFor(domain, type), schema: DNSSchema }
|
|
40
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { PayloadWithSources } from '@xyo-network/payload-model'
|
|
2
|
+
import {
|
|
3
|
+
isPayloadOfSchemaType,
|
|
4
|
+
isPayloadOfSchemaTypeWithMeta,
|
|
5
|
+
isPayloadOfSchemaTypeWithSources,
|
|
6
|
+
} from '@xyo-network/payload-model'
|
|
7
|
+
|
|
8
|
+
import type { DNSResponseFields } from '../../types/index.ts'
|
|
9
|
+
import { DNSSchema } from '../Schema.ts'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The fields of a DNSResponse payload
|
|
13
|
+
*/
|
|
14
|
+
export type DNSResponse = PayloadWithSources<DNSResponseFields, DNSSchema>
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Identity function for determining if an object is a DNSResponse payload
|
|
18
|
+
*/
|
|
19
|
+
export const isDNSResponse = isPayloadOfSchemaType<DNSResponse>(DNSSchema)
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Identity function for determining if an object is a DNSResponse payload with sources
|
|
23
|
+
*/
|
|
24
|
+
export const isDNSResponseWithSources = isPayloadOfSchemaTypeWithSources<DNSResponse>(DNSSchema)
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Identity function for determining if an object is a DNSResponse payload with meta
|
|
28
|
+
*/
|
|
29
|
+
export const isDNSResponseWithMeta = isPayloadOfSchemaTypeWithMeta<DNSResponse>(DNSSchema)
|
package/src/DNS/index.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/member-ordering */
|
|
2
|
+
|
|
3
|
+
// An attempt to match compatibility with the RFC 8427 (Representing DNS Messages in JSON)
|
|
4
|
+
// https://www.rfc-editor.org/rfc/rfc8427
|
|
5
|
+
// and Google/CloudFlare's DNS over HTTPS (DoH) standard
|
|
6
|
+
// https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests/dns-json/
|
|
7
|
+
|
|
8
|
+
import { type DNSQueryOpcode, DNSQueryOpcodes } from './OperationCodes.ts'
|
|
9
|
+
import type { DNSRcode } from './ResponseCodes.ts'
|
|
10
|
+
import { DNSRcodes } from './ResponseCodes.ts'
|
|
11
|
+
|
|
12
|
+
// NOTE: The RFC says `Boolean` but uses 0/1 for the values. DNS over HTTPS (DoH) uses `true`/`false`.
|
|
13
|
+
export type NumericBoolean = 0 | 1 | true | false
|
|
14
|
+
export type NumericBooleanFalsy = 0 | false
|
|
15
|
+
export type NumericBooleanTruthy = 1 | true
|
|
16
|
+
|
|
17
|
+
export interface DNSHeader {
|
|
18
|
+
/**
|
|
19
|
+
* Transaction ID, typically a random number. Integer whose value is 0 to 65535
|
|
20
|
+
*/
|
|
21
|
+
ID?: number
|
|
22
|
+
/**
|
|
23
|
+
* Query/Response Flag (0 = Query, 1 = Response)
|
|
24
|
+
*/
|
|
25
|
+
QR?: NumericBoolean
|
|
26
|
+
/**
|
|
27
|
+
* Operation Code (0 for standard query)
|
|
28
|
+
*/
|
|
29
|
+
Opcode?: DNSQueryOpcode
|
|
30
|
+
/**
|
|
31
|
+
* Authoritative Answer (set in response)
|
|
32
|
+
*/
|
|
33
|
+
AA?: NumericBoolean
|
|
34
|
+
/**
|
|
35
|
+
* Truncated Flag
|
|
36
|
+
*/
|
|
37
|
+
TC?: NumericBoolean // Truncation
|
|
38
|
+
/**
|
|
39
|
+
* Recursion Desired
|
|
40
|
+
*/
|
|
41
|
+
RD?: NumericBoolean // Recursion Desired (set in query)
|
|
42
|
+
/**
|
|
43
|
+
* Response Code (0 for no error, non-0 for errors)
|
|
44
|
+
*/
|
|
45
|
+
RCODE?: DNSRcode
|
|
46
|
+
/**
|
|
47
|
+
* Number of questions in the query (usually 1)
|
|
48
|
+
*/
|
|
49
|
+
QDCOUNT?: number
|
|
50
|
+
/**
|
|
51
|
+
* Number of answer records in the response
|
|
52
|
+
*/
|
|
53
|
+
ANCOUNT?: number
|
|
54
|
+
/**
|
|
55
|
+
* Number of authority records in the response
|
|
56
|
+
*/
|
|
57
|
+
NSCOUNT?: number
|
|
58
|
+
/**
|
|
59
|
+
* Number of additional records in the response
|
|
60
|
+
*/
|
|
61
|
+
ARCOUNT?: number
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface DNSRequestHeader extends DNSHeader {
|
|
65
|
+
QR: NumericBooleanFalsy // Query/Response Flag (0 = Query)
|
|
66
|
+
Opcode: DNSQueryOpcode // Operation Code (0 for standard query)
|
|
67
|
+
AA: NumericBooleanFalsy // Authoritative Answer (0 in query)
|
|
68
|
+
TC: NumericBooleanFalsy // Truncation (0 for non-truncated)
|
|
69
|
+
RCODE: typeof DNSRcodes.NOERROR // Response Code (always 0 in query)
|
|
70
|
+
ANCOUNT: 0 // Number of answer records (always 0 in query)
|
|
71
|
+
NSCOUNT: 0 // Number of authority records (always 0 in query)
|
|
72
|
+
ARCOUNT: 0 // Number of additional records (always 0 in query)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export const StandardRequestHeader: Readonly<DNSRequestHeader> = {
|
|
76
|
+
ID: 0,
|
|
77
|
+
QR: 0, // Query/Response Flag (0 = Query)
|
|
78
|
+
Opcode: DNSQueryOpcodes.QUERY, // Operation Code (0 for standard query)
|
|
79
|
+
AA: 0, // Authoritative Answer (0 in query)
|
|
80
|
+
TC: 0, // Truncation (0 for non-truncated)
|
|
81
|
+
RD: 1, // Recursion Desired (1 if recursion is requested)
|
|
82
|
+
RCODE: DNSRcodes.NOERROR, // Response Code (always 0 in query)
|
|
83
|
+
QDCOUNT: 1,
|
|
84
|
+
ANCOUNT: 0,
|
|
85
|
+
NSCOUNT: 0,
|
|
86
|
+
ARCOUNT: 0,
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface DNSResponseHeader extends DNSHeader {
|
|
90
|
+
QR: NumericBooleanTruthy // Query/Response Flag (1 = Response)
|
|
91
|
+
Opcode: DNSQueryOpcode // Operation Code (0 for standard query)
|
|
92
|
+
AA: NumericBoolean // Authoritative Answer (1 if the response is authoritative)
|
|
93
|
+
TC: NumericBoolean // Truncation (1 if the message is truncated)
|
|
94
|
+
RA: NumericBoolean // Recursion Available (1 if the server supports recursion)
|
|
95
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type DNSQueryOpcode = 0 | 1 | 2 | 4 | 5 | 6 // Supported opcodes as numeric values
|
|
2
|
+
|
|
3
|
+
// Optional: Add a more descriptive union type for the opcodes.
|
|
4
|
+
export type DNSQueryOpcodeName = 'QUERY' | 'IQUERY' | 'STATUS' | 'NOTIFY' | 'UPDATE' | 'DSO'
|
|
5
|
+
|
|
6
|
+
export const DNSQueryOpcodes: Record<DNSQueryOpcodeName, DNSQueryOpcode> = {
|
|
7
|
+
QUERY: 0,
|
|
8
|
+
IQUERY: 1,
|
|
9
|
+
STATUS: 2,
|
|
10
|
+
NOTIFY: 4,
|
|
11
|
+
UPDATE: 5,
|
|
12
|
+
DSO: 6,
|
|
13
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/member-ordering */
|
|
2
|
+
import type { DNSResourceRecordTypeValue } from './ResourceRecord.ts'
|
|
3
|
+
|
|
4
|
+
export interface DNSRecord {
|
|
5
|
+
name: string // The domain name that was queried
|
|
6
|
+
type: DNSResourceRecordTypeValue // The record type (e.g., 1 for A record)
|
|
7
|
+
TTL: number // Time to Live (how long the record can be cached)
|
|
8
|
+
data: string // The actual data, such as an IP address or TXT record
|
|
9
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/member-ordering */
|
|
2
|
+
import { type DNSRequestHeader, StandardRequestHeader } from './Header.ts'
|
|
3
|
+
import type { DNSResourceRecordTypeValue } from './ResourceRecord.ts'
|
|
4
|
+
import { DNSResourceRecordTypes } from './ResourceRecord.ts'
|
|
5
|
+
|
|
6
|
+
export interface DNSQuestion {
|
|
7
|
+
name: string // The domain name that was queried
|
|
8
|
+
type: DNSResourceRecordTypeValue // The record type (e.g., 1 for A record)
|
|
9
|
+
class?: number // Query Class (typically 1 for IN - Internet)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface DNSRequestFields extends DNSRequestHeader {
|
|
13
|
+
Question: DNSQuestion[]
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Helper for generating a DNS request for a given domain and record type
|
|
18
|
+
* @param domain The domain to query
|
|
19
|
+
* @param type The record type to query
|
|
20
|
+
* @returns A DNS request
|
|
21
|
+
*/
|
|
22
|
+
export const getRequestFor = (domain: string, type: DNSResourceRecordTypeValue = DNSResourceRecordTypes.A): DNSRequestFields => {
|
|
23
|
+
return {
|
|
24
|
+
...StandardRequestHeader,
|
|
25
|
+
ID: getRandomId(),
|
|
26
|
+
Question: [{
|
|
27
|
+
name: domain, type, class: 1,
|
|
28
|
+
}],
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Used to generate a random ID for a DNS request
|
|
34
|
+
* @returns A random number between 0 and 65,535
|
|
35
|
+
*/
|
|
36
|
+
export const getRandomId = (): number => {
|
|
37
|
+
return Math.floor(Math.random() * 65_536) // Math.random() generates a number between 0 and 1, multiply by 65536 to get the range 0-65535
|
|
38
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
// https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4
|
|
2
|
+
|
|
3
|
+
export type DNSResourceRecordType =
|
|
4
|
+
| 'A'
|
|
5
|
+
| 'NS'
|
|
6
|
+
| 'MD'
|
|
7
|
+
| 'MF'
|
|
8
|
+
| 'CNAME'
|
|
9
|
+
| 'SOA'
|
|
10
|
+
| 'MB'
|
|
11
|
+
| 'MG'
|
|
12
|
+
| 'MR'
|
|
13
|
+
| 'NULL'
|
|
14
|
+
| 'WKS'
|
|
15
|
+
| 'PTR'
|
|
16
|
+
| 'HINFO'
|
|
17
|
+
| 'MINFO'
|
|
18
|
+
| 'MX'
|
|
19
|
+
| 'TXT'
|
|
20
|
+
| 'RP'
|
|
21
|
+
| 'AFSDB'
|
|
22
|
+
| 'X25'
|
|
23
|
+
| 'ISDN'
|
|
24
|
+
| 'RT'
|
|
25
|
+
| 'NSAP'
|
|
26
|
+
| 'NSAP-PTR'
|
|
27
|
+
| 'SIG'
|
|
28
|
+
| 'KEY'
|
|
29
|
+
| 'PX'
|
|
30
|
+
| 'GPOS'
|
|
31
|
+
| 'AAAA'
|
|
32
|
+
| 'LOC'
|
|
33
|
+
| 'NXT'
|
|
34
|
+
| 'EID'
|
|
35
|
+
| 'NIMLOC'
|
|
36
|
+
| 'SRV'
|
|
37
|
+
| 'ATMA'
|
|
38
|
+
| 'NAPTR'
|
|
39
|
+
| 'KX'
|
|
40
|
+
| 'CERT'
|
|
41
|
+
| 'A6'
|
|
42
|
+
| 'DNAME'
|
|
43
|
+
| 'SINK'
|
|
44
|
+
| 'OPT'
|
|
45
|
+
| 'APL'
|
|
46
|
+
| 'DS'
|
|
47
|
+
| 'SSHFP'
|
|
48
|
+
| 'IPSECKEY'
|
|
49
|
+
| 'RRSIG'
|
|
50
|
+
| 'NSEC'
|
|
51
|
+
| 'DNSKEY'
|
|
52
|
+
| 'DHCID'
|
|
53
|
+
| 'NSEC3'
|
|
54
|
+
| 'NSEC3PARAM'
|
|
55
|
+
| 'TLSA'
|
|
56
|
+
| 'SMIMEA'
|
|
57
|
+
| 'HIP'
|
|
58
|
+
| 'NINFO'
|
|
59
|
+
| 'RKEY'
|
|
60
|
+
| 'TALINK'
|
|
61
|
+
| 'CDS'
|
|
62
|
+
| 'CDNSKEY'
|
|
63
|
+
| 'OPENPGPKEY'
|
|
64
|
+
| 'CSYNC'
|
|
65
|
+
| 'ZONEMD'
|
|
66
|
+
| 'SVCB'
|
|
67
|
+
| 'HTTPS'
|
|
68
|
+
| 'SPF'
|
|
69
|
+
| 'UINFO'
|
|
70
|
+
| 'UID'
|
|
71
|
+
| 'GID'
|
|
72
|
+
| 'UNSPEC'
|
|
73
|
+
| 'NID'
|
|
74
|
+
| 'L32'
|
|
75
|
+
| 'L64'
|
|
76
|
+
| 'LP'
|
|
77
|
+
| 'EUI48'
|
|
78
|
+
| 'EUI64'
|
|
79
|
+
| 'NXNAME'
|
|
80
|
+
| 'TKEY'
|
|
81
|
+
| 'TSIG'
|
|
82
|
+
| 'IXFR'
|
|
83
|
+
| 'AXFR'
|
|
84
|
+
| 'MAILB'
|
|
85
|
+
| 'MAILA'
|
|
86
|
+
| '*'
|
|
87
|
+
| 'URI'
|
|
88
|
+
| 'CAA'
|
|
89
|
+
| 'AVC'
|
|
90
|
+
| 'DOA'
|
|
91
|
+
| 'AMTRELAY'
|
|
92
|
+
| 'RESINFO'
|
|
93
|
+
| 'WALLET'
|
|
94
|
+
| 'CLA'
|
|
95
|
+
| 'IPN'
|
|
96
|
+
| 'TA'
|
|
97
|
+
| 'DLV'
|
|
98
|
+
// NOTE: Custom types here
|
|
99
|
+
| 'XYOA'
|
|
100
|
+
| 'XYOH'
|
|
101
|
+
|
|
102
|
+
export const DNSResourceRecordTypes: Readonly<Record<DNSResourceRecordType, number>> = {
|
|
103
|
+
'A': 1, // a host address
|
|
104
|
+
'NS': 2, // an authoritative name server
|
|
105
|
+
'MD': 3, // a mail destination (OBSOLETE - use MX)
|
|
106
|
+
'MF': 4, // a mail forwarder (OBSOLETE - use MX)
|
|
107
|
+
'CNAME': 5, // the canonical name for an alias
|
|
108
|
+
'SOA': 6, // marks the start of a zone of authority
|
|
109
|
+
'MB': 7, // a mailbox domain name (EXPERIMENTAL)
|
|
110
|
+
'MG': 8, // a mail group member (EXPERIMENTAL)
|
|
111
|
+
'MR': 9, // a mail rename domain name (EXPERIMENTAL)
|
|
112
|
+
'NULL': 10, // a null RR (EXPERIMENTAL)
|
|
113
|
+
'WKS': 11, // a well known service description
|
|
114
|
+
'PTR': 12, // a domain name pointer
|
|
115
|
+
'HINFO': 13, // host information
|
|
116
|
+
'MINFO': 14, // mailbox or mail list information
|
|
117
|
+
'MX': 15, // mail exchange
|
|
118
|
+
'TXT': 16, // text strings
|
|
119
|
+
'RP': 17, // for Responsible Person
|
|
120
|
+
'AFSDB': 18, // for AFS Data Base location
|
|
121
|
+
'X25': 19, // for X.25 PSDN address
|
|
122
|
+
'ISDN': 20, // for ISDN address
|
|
123
|
+
'RT': 21, // for Route Through
|
|
124
|
+
'NSAP': 22, // for NSAP address, NSAP style A record (DEPRECATED)
|
|
125
|
+
'NSAP-PTR': 23, // for domain name pointer, NSAP style (DEPRECATED)
|
|
126
|
+
'SIG': 24, // for security signature
|
|
127
|
+
'KEY': 25, // for security key
|
|
128
|
+
'PX': 26, // X.400 mail mapping information
|
|
129
|
+
'GPOS': 27, // Geographical Position
|
|
130
|
+
'AAAA': 28, // IP6 Address
|
|
131
|
+
'LOC': 29, // Location Information
|
|
132
|
+
'NXT': 30, // Next Domain (OBSOLETE)
|
|
133
|
+
'EID': 31, // Endpoint Identifier
|
|
134
|
+
'NIMLOC': 32, // Nimrod Locator
|
|
135
|
+
'SRV': 33, // Server Selection
|
|
136
|
+
'ATMA': 34, // ATM Address
|
|
137
|
+
'NAPTR': 35, // Naming Authority Pointer
|
|
138
|
+
'KX': 36, // Key Exchanger
|
|
139
|
+
'CERT': 37, // CERT
|
|
140
|
+
'A6': 38, // A6 (OBSOLETE - use AAAA)
|
|
141
|
+
'DNAME': 39, // DNAME
|
|
142
|
+
'SINK': 40, // SINK
|
|
143
|
+
'OPT': 41, // OPT
|
|
144
|
+
'APL': 42, // APL
|
|
145
|
+
'DS': 43, // Delegation Signer
|
|
146
|
+
'SSHFP': 44, // SSH Key Fingerprint
|
|
147
|
+
'IPSECKEY': 45, // IPSECKEY
|
|
148
|
+
'RRSIG': 46, // RRSIG
|
|
149
|
+
'NSEC': 47, // NSEC
|
|
150
|
+
'DNSKEY': 48, // DNSKEY
|
|
151
|
+
'DHCID': 49, // DHCID
|
|
152
|
+
'NSEC3': 50, // NSEC3
|
|
153
|
+
'NSEC3PARAM': 51, // NSEC3PARAM
|
|
154
|
+
'TLSA': 52, // TLSA
|
|
155
|
+
'SMIMEA': 53, // S/MIME cert association
|
|
156
|
+
'HIP': 55, // Host Identity Protocol
|
|
157
|
+
'NINFO': 56, // NINFO
|
|
158
|
+
'RKEY': 57, // RKEY
|
|
159
|
+
'TALINK': 58, // Trust Anchor LINK
|
|
160
|
+
'CDS': 59, // Child DS
|
|
161
|
+
'CDNSKEY': 60, // DNSKEY(s) the Child wants reflected in DS
|
|
162
|
+
'OPENPGPKEY': 61, // OpenPGP Key
|
|
163
|
+
'CSYNC': 62, // Child-To-Parent Synchronization
|
|
164
|
+
'ZONEMD': 63, // Message Digest Over Zone Data
|
|
165
|
+
'SVCB': 64, // General-purpose service binding
|
|
166
|
+
'HTTPS': 65, // SVCB-compatible type for use with HTTP
|
|
167
|
+
'SPF': 99,
|
|
168
|
+
'UINFO': 100,
|
|
169
|
+
'UID': 101,
|
|
170
|
+
'GID': 102,
|
|
171
|
+
'UNSPEC': 103,
|
|
172
|
+
'NID': 104,
|
|
173
|
+
'L32': 105,
|
|
174
|
+
'L64': 106,
|
|
175
|
+
'LP': 107,
|
|
176
|
+
'EUI48': 108, // an EUI-48 address
|
|
177
|
+
'EUI64': 109, // an EUI-64 address
|
|
178
|
+
'NXNAME': 128, // NXDOMAIN indicator for Compact Denial of Existence
|
|
179
|
+
'TKEY': 249, // Transaction Key
|
|
180
|
+
'TSIG': 250, // Transaction Signature
|
|
181
|
+
'IXFR': 251, // incremental transfer
|
|
182
|
+
'AXFR': 252, // transfer of an entire zone
|
|
183
|
+
'MAILB': 253, // mailbox-related RRs (MB, MG or MR)
|
|
184
|
+
'MAILA': 254, // mail agent RRs (OBSOLETE - see MX)
|
|
185
|
+
'*': 255, // A request for some or all records the server has available
|
|
186
|
+
'URI': 256, // URI
|
|
187
|
+
'CAA': 257, // Certification Authority Restriction
|
|
188
|
+
'AVC': 258, // Application Visibility and Control
|
|
189
|
+
'DOA': 259, // Digital Object Architecture
|
|
190
|
+
'AMTRELAY': 260, // Automatic Multicast Tunneling Relay
|
|
191
|
+
'RESINFO': 261, // Resolver Information as Key/Value Pairs
|
|
192
|
+
'WALLET': 262, // Public wallet address
|
|
193
|
+
'CLA': 263, // BP Convergence Layer Adapter
|
|
194
|
+
'IPN': 264, // BP Node Number
|
|
195
|
+
'TA': 32_768, // DNSSEC Trust Authorities
|
|
196
|
+
'DLV': 32_769, // DNSSEC Lookaside Validation (OBSOLETE)
|
|
197
|
+
|
|
198
|
+
// NOTE: Custom types here chosen within the Private Use Range
|
|
199
|
+
// https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4
|
|
200
|
+
// https://www.rfc-editor.org/rfc/rfc5226
|
|
201
|
+
// as, per the RFC, the Private Use Range is reserved
|
|
202
|
+
// "For private or local use only, with the type and
|
|
203
|
+
// purpose defined by the local site. No attempt is made to
|
|
204
|
+
// prevent multiple sites from using the same value in
|
|
205
|
+
// different (and incompatible) ways. There is no need for
|
|
206
|
+
// IANA to review such assignments (since IANA does not record
|
|
207
|
+
// them) and assignments are not generally useful for broad
|
|
208
|
+
// interoperability. It is the responsibility of the sites
|
|
209
|
+
// making use of the Private Use range to ensure that no
|
|
210
|
+
// conflicts occur (within the intended scope of use)."
|
|
211
|
+
// If we want to apply for a custom reserved code later
|
|
212
|
+
// on, once the usage is proven enough we can absolutely
|
|
213
|
+
// do that.
|
|
214
|
+
'XYOA': 65_432, // XYO Address
|
|
215
|
+
'XYOH': 65_433, // XYO Hash
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export type DNSResourceRecordTypeValue = (typeof DNSResourceRecordTypes)[keyof typeof DNSResourceRecordTypes]
|
|
219
|
+
|
|
220
|
+
export const findDNSResourceRecordTypesByValue = (value: DNSResourceRecordTypeValue): DNSResourceRecordType | undefined => {
|
|
221
|
+
// Iterate through the keys of the record
|
|
222
|
+
for (const key in DNSResourceRecordTypes) {
|
|
223
|
+
const resourceRecordType = key as DNSResourceRecordType
|
|
224
|
+
if (DNSResourceRecordTypes[resourceRecordType] === value) {
|
|
225
|
+
return resourceRecordType // Return the key if the value matches
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return undefined // Return undefined if no matching value is found
|
|
229
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DNSAnswer } from './Answer.ts'
|
|
2
|
+
import type { DNSResponseHeader } from './Header.ts'
|
|
3
|
+
import type { DNSRecord } from './Record.ts'
|
|
4
|
+
import type { DNSQuestion } from './Request.ts'
|
|
5
|
+
|
|
6
|
+
/* eslint-disable @typescript-eslint/member-ordering */
|
|
7
|
+
export interface DNSResponseFields extends DNSResponseHeader {
|
|
8
|
+
Question: DNSQuestion[] // The questions that were asked
|
|
9
|
+
Answer: DNSAnswer[] // Reusing DNSAnswer for the Answer Section
|
|
10
|
+
Authority?: DNSRecord[]
|
|
11
|
+
Additional?: DNSRecord[]
|
|
12
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type DNSRcode = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 16 | 17 | 18
|
|
2
|
+
|
|
3
|
+
export type DNSRcodeName =
|
|
4
|
+
| 'NOERROR'
|
|
5
|
+
| 'FORMERR'
|
|
6
|
+
| 'SERVFAIL'
|
|
7
|
+
| 'NXDOMAIN'
|
|
8
|
+
| 'NOTIMP'
|
|
9
|
+
| 'REFUSED'
|
|
10
|
+
| 'YXDOMAIN'
|
|
11
|
+
| 'YXRRSET'
|
|
12
|
+
| 'NXRRSET'
|
|
13
|
+
| 'NOTAUTH'
|
|
14
|
+
| 'NOTZONE'
|
|
15
|
+
| 'BADSIG'
|
|
16
|
+
| 'BADKEY'
|
|
17
|
+
| 'BADTIME'
|
|
18
|
+
|
|
19
|
+
export const DNSRcodes: Readonly<Record<DNSRcodeName, DNSRcode>> = {
|
|
20
|
+
NOERROR: 0,
|
|
21
|
+
FORMERR: 1,
|
|
22
|
+
SERVFAIL: 2,
|
|
23
|
+
NXDOMAIN: 3,
|
|
24
|
+
NOTIMP: 4,
|
|
25
|
+
REFUSED: 5,
|
|
26
|
+
YXDOMAIN: 6,
|
|
27
|
+
YXRRSET: 7,
|
|
28
|
+
NXRRSET: 8,
|
|
29
|
+
NOTAUTH: 9,
|
|
30
|
+
NOTZONE: 10,
|
|
31
|
+
BADSIG: 16,
|
|
32
|
+
BADKEY: 17,
|
|
33
|
+
BADTIME: 18,
|
|
34
|
+
}
|