fcdns 0.5.9 → 0.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.
Files changed (46) hide show
  1. package/CHANGELOG.md +267 -0
  2. package/README.md +8 -8
  3. package/lib/cli.js +113 -0
  4. package/lib/cli.js.map +1 -0
  5. package/lib/dao/clear.js +8 -0
  6. package/lib/dao/clear.js.map +1 -0
  7. package/lib/dao/get-poison-test-result.js +18 -0
  8. package/lib/dao/get-poison-test-result.js.map +1 -0
  9. package/lib/dao/get-route-result.js +19 -0
  10. package/lib/dao/get-route-result.js.map +1 -0
  11. package/lib/dao/upsert-poison-test-result.js +14 -0
  12. package/lib/dao/upsert-poison-test-result.js.map +1 -0
  13. package/lib/dao/upsert-route-result.js +14 -0
  14. package/lib/dao/upsert-route-result.js.map +1 -0
  15. package/lib/database.js +44 -0
  16. package/lib/database.js.map +1 -0
  17. package/lib/hostnames.js +25 -0
  18. package/lib/hostnames.js.map +1 -0
  19. package/lib/ip-ranges.js +77 -0
  20. package/lib/ip-ranges.js.map +1 -0
  21. package/lib/poison-tester.js +55 -0
  22. package/lib/poison-tester.js.map +1 -0
  23. package/lib/record-types.js +77 -0
  24. package/lib/record-types.js.map +1 -0
  25. package/lib/router.js +63 -0
  26. package/lib/router.js.map +1 -0
  27. package/lib/server.js +84 -0
  28. package/lib/server.js.map +1 -0
  29. package/lib/utils/create-dns-resolver.js +7 -0
  30. package/lib/utils/create-dns-resolver.js.map +1 -0
  31. package/lib/utils/hostname-pattern.js +11 -0
  32. package/lib/utils/hostname-pattern.js.map +1 -0
  33. package/lib/utils/is-ipv4-address.js +4 -0
  34. package/lib/utils/is-ipv4-address.js.map +1 -0
  35. package/lib/utils/is-ipv6-address.js +4 -0
  36. package/lib/utils/is-ipv6-address.js.map +1 -0
  37. package/lib/utils/is-server-online.js +21 -0
  38. package/lib/utils/is-server-online.js.map +1 -0
  39. package/lib/utils/package.js +16 -0
  40. package/lib/utils/package.js.map +1 -0
  41. package/lib/utils/parse-server-info.js +8 -0
  42. package/lib/utils/parse-server-info.js.map +1 -0
  43. package/lib/utils/resolve-a.js +14 -0
  44. package/lib/utils/resolve-a.js.map +1 -0
  45. package/package.json +52 -45
  46. package/dist/cli.cjs +0 -48308
@@ -0,0 +1,77 @@
1
+ import { IPv4AddressRange, IPv6AddressRange } from 'address-range';
2
+ import { isIPv4Address } from "./utils/is-ipv4-address.js";
3
+ import { isIPv6Address } from "./utils/is-ipv6-address.js";
4
+ import { promises as fs } from 'fs';
5
+ import { groupBy } from 'iterable-operator';
6
+ export class IPRanges {
7
+ constructor(...args) {
8
+ if (args.length === 1) {
9
+ const [ranges] = args;
10
+ const groups = groupBy(ranges, element => {
11
+ if (element instanceof IPv4AddressRange) {
12
+ return 'ipv4';
13
+ }
14
+ else {
15
+ return 'ipv6';
16
+ }
17
+ });
18
+ this.ipv4 = groups.get('ipv4');
19
+ this.ipv6 = groups.get('ipv6');
20
+ }
21
+ else {
22
+ const [ipv4, ipv6] = args;
23
+ this.ipv4 = ipv4;
24
+ this.ipv6 = ipv6;
25
+ }
26
+ }
27
+ static async fromFile(filename) {
28
+ const ipv4 = [];
29
+ const ipv6 = [];
30
+ const text = await fs.readFile(filename, 'utf-8');
31
+ text.split('\n')
32
+ .filter(x => x.trim())
33
+ .filter(x => x !== '')
34
+ .forEach(x => {
35
+ if (isIPv4Address(x)) {
36
+ ipv4.push(IPv4AddressRange.from(x, x));
37
+ }
38
+ if (isIPv6Address(x)) {
39
+ ipv6.push(IPv6AddressRange.from(x, x));
40
+ }
41
+ if (isIPv4AddressRange(x)) {
42
+ const [startAddress, endAddress] = x.split('-');
43
+ ipv4.push(IPv4AddressRange.from(startAddress, endAddress));
44
+ }
45
+ if (isIPv6AddressRange(x)) {
46
+ const [startAddress, endAddress] = x.split('-');
47
+ ipv6.push(IPv6AddressRange.from(startAddress, endAddress));
48
+ }
49
+ });
50
+ return new IPRanges(ipv4, ipv6);
51
+ }
52
+ async toFile(filename) {
53
+ const ipv4 = this.ipv4
54
+ .map(range => range.toString())
55
+ .join('\n');
56
+ const ipv6 = this.ipv6
57
+ .map(range => range.toString())
58
+ .join('\n');
59
+ await fs.writeFile(filename, [ipv4, ipv6].join('\n'));
60
+ }
61
+ includes(address) {
62
+ if (isIPv4Address(address)) {
63
+ return this.ipv4.some(x => x.includes(address));
64
+ }
65
+ if (isIPv6Address(address)) {
66
+ return this.ipv6.some(x => x.includes(address));
67
+ }
68
+ return false;
69
+ }
70
+ }
71
+ function isIPv4AddressRange(text) {
72
+ return /^[\d\.]+-[\d\.]+$/.test(text);
73
+ }
74
+ function isIPv6AddressRange(text) {
75
+ return /^[\da-f:]+-[\da-f:]+$/.test(text);
76
+ }
77
+ //# sourceMappingURL=ip-ranges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip-ranges.js","sourceRoot":"","sources":["../src/ip-ranges.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { isServerOnline } from "./utils/is-server-online.js";
2
+ import { createDNSResolver } from "./utils/create-dns-resolver.js";
3
+ import { resolveA } from "./utils/resolve-a.js";
4
+ import { CustomError } from '@blackglory/errors';
5
+ import { isSuccessPromise } from 'return-style';
6
+ import { isntNull } from '@blackglory/prelude';
7
+ import { getPoisonResult } from "./dao/get-poison-test-result.js";
8
+ import { upsertPoisonTestResult } from "./dao/upsert-poison-test-result.js";
9
+ export var PoisonTestResult;
10
+ (function (PoisonTestResult) {
11
+ PoisonTestResult[PoisonTestResult["NotPoisoned"] = 0] = "NotPoisoned";
12
+ PoisonTestResult[PoisonTestResult["Poisoned"] = 1] = "Poisoned";
13
+ })(PoisonTestResult = PoisonTestResult || (PoisonTestResult = {}));
14
+ export class ServerUnreachable extends CustomError {
15
+ constructor() {
16
+ super('The test server is unreachable or not sending a echo reply in time');
17
+ }
18
+ }
19
+ export class PoisonTester {
20
+ constructor(options) {
21
+ this.server = options.server;
22
+ this.timeout = options.timeout;
23
+ this.testResolver = createDNSResolver(this.server);
24
+ }
25
+ async isHostnamePoisoned(hostname) {
26
+ const result = getPoisonResult(hostname);
27
+ if (isntNull(result)) {
28
+ return poisonTestResultToIsPoisoned(result);
29
+ }
30
+ else {
31
+ const [alive, poisoned] = await Promise.all([
32
+ isServerOnline(this.server, this.timeout),
33
+ isSuccessPromise(resolveA(this.testResolver, hostname, this.timeout))
34
+ ]);
35
+ if (alive) {
36
+ const result = poisoned
37
+ ? PoisonTestResult.Poisoned
38
+ : PoisonTestResult.NotPoisoned;
39
+ upsertPoisonTestResult(hostname, result);
40
+ return poisonTestResultToIsPoisoned(result);
41
+ }
42
+ else {
43
+ throw new ServerUnreachable();
44
+ }
45
+ }
46
+ }
47
+ }
48
+ function poisonTestResultToIsPoisoned(result) {
49
+ switch (result) {
50
+ case PoisonTestResult.Poisoned: return true;
51
+ case PoisonTestResult.NotPoisoned: return false;
52
+ default: throw new Error('Unknown poision test result');
53
+ }
54
+ }
55
+ //# sourceMappingURL=poison-tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poison-tester.js","sourceRoot":"","sources":["../src/poison-tester.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,oCAAkC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,uCAAqC;AACjE,OAAO,EAAE,QAAQ,EAAE,6BAA2B;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,OAAO,EAAE,eAAe,EAAE,wCAAsC;AAChE,OAAO,EAAE,sBAAsB,EAAE,2CAAyC;AAE1E,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,qEAAe,CAAA;IACf,+DAAY,CAAA;AACd,CAAC,EAHW,gBAAgB,GAAhB,gBAAgB,KAAhB,gBAAgB,QAG3B;AAED,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IAChD;QACE,KAAK,CAAC,oEAAoE,CAAC,CAAA;IAC7E,CAAC;CACF;AAED,MAAM,OAAO,YAAY;IAKvB,YAAY,OAGX;QACC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;QAC9B,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACpD,CAAC;IAKD,KAAK,CAAC,kBAAkB,CAAC,QAAgB;QACvC,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;QACxC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;YACpB,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAA;SAC5C;aAAM;YACL,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC1C,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC;gBACzC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;aACtE,CAAC,CAAA;YACF,IAAI,KAAK,EAAE;gBACT,MAAM,MAAM,GAAG,QAAQ;oBACrB,CAAC,CAAC,gBAAgB,CAAC,QAAQ;oBAC3B,CAAC,CAAC,gBAAgB,CAAC,WAAW,CAAA;gBAChC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBACxC,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAA;aAC5C;iBAAM;gBACL,MAAM,IAAI,iBAAiB,EAAE,CAAA;aAC9B;SACF;IACH,CAAC;CACF;AAED,SAAS,4BAA4B,CAAC,MAAwB;IAC5D,QAAQ,MAAM,EAAE;QACd,KAAK,gBAAgB,CAAC,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAA;QAC3C,KAAK,gBAAgB,CAAC,WAAW,CAAC,CAAC,OAAO,KAAK,CAAA;QAC/C,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;KACxD;AACH,CAAC"}
@@ -0,0 +1,77 @@
1
+ export var RecordType;
2
+ (function (RecordType) {
3
+ RecordType[RecordType["A"] = 1] = "A";
4
+ RecordType[RecordType["NS"] = 2] = "NS";
5
+ RecordType[RecordType["MD"] = 3] = "MD";
6
+ RecordType[RecordType["MF"] = 4] = "MF";
7
+ RecordType[RecordType["CNAME"] = 5] = "CNAME";
8
+ RecordType[RecordType["SOA"] = 6] = "SOA";
9
+ RecordType[RecordType["MB"] = 7] = "MB";
10
+ RecordType[RecordType["MG"] = 8] = "MG";
11
+ RecordType[RecordType["MR"] = 9] = "MR";
12
+ RecordType[RecordType["NULL"] = 10] = "NULL";
13
+ RecordType[RecordType["WKS"] = 11] = "WKS";
14
+ RecordType[RecordType["PTR"] = 12] = "PTR";
15
+ RecordType[RecordType["HINFO"] = 13] = "HINFO";
16
+ RecordType[RecordType["MINFO"] = 14] = "MINFO";
17
+ RecordType[RecordType["MX"] = 15] = "MX";
18
+ RecordType[RecordType["TXT"] = 16] = "TXT";
19
+ RecordType[RecordType["RP"] = 17] = "RP";
20
+ RecordType[RecordType["AFSDB"] = 18] = "AFSDB";
21
+ RecordType[RecordType["X25"] = 19] = "X25";
22
+ RecordType[RecordType["ISDN"] = 20] = "ISDN";
23
+ RecordType[RecordType["RT"] = 21] = "RT";
24
+ RecordType[RecordType["NSAP"] = 22] = "NSAP";
25
+ RecordType[RecordType["NSAP-PTR"] = 23] = "NSAP-PTR";
26
+ RecordType[RecordType["SIG"] = 24] = "SIG";
27
+ RecordType[RecordType["KEY"] = 25] = "KEY";
28
+ RecordType[RecordType["PX"] = 26] = "PX";
29
+ RecordType[RecordType["GPOS"] = 27] = "GPOS";
30
+ RecordType[RecordType["AAAA"] = 28] = "AAAA";
31
+ RecordType[RecordType["LOC"] = 29] = "LOC";
32
+ RecordType[RecordType["NXT"] = 30] = "NXT";
33
+ RecordType[RecordType["EID"] = 31] = "EID";
34
+ RecordType[RecordType["NIMLOC"] = 32] = "NIMLOC";
35
+ RecordType[RecordType["SRV"] = 33] = "SRV";
36
+ RecordType[RecordType["ATMA"] = 34] = "ATMA";
37
+ RecordType[RecordType["NAPTR"] = 35] = "NAPTR";
38
+ RecordType[RecordType["KX"] = 36] = "KX";
39
+ RecordType[RecordType["CERT"] = 37] = "CERT";
40
+ RecordType[RecordType["A6"] = 38] = "A6";
41
+ RecordType[RecordType["DNAME"] = 39] = "DNAME";
42
+ RecordType[RecordType["SINK"] = 40] = "SINK";
43
+ RecordType[RecordType["OPT"] = 41] = "OPT";
44
+ RecordType[RecordType["APL"] = 42] = "APL";
45
+ RecordType[RecordType["DS"] = 43] = "DS";
46
+ RecordType[RecordType["SSHFP"] = 44] = "SSHFP";
47
+ RecordType[RecordType["IPSECKEY"] = 45] = "IPSECKEY";
48
+ RecordType[RecordType["RRSIG"] = 46] = "RRSIG";
49
+ RecordType[RecordType["NSEC"] = 47] = "NSEC";
50
+ RecordType[RecordType["DNSKEY"] = 48] = "DNSKEY";
51
+ RecordType[RecordType["DHCID"] = 49] = "DHCID";
52
+ RecordType[RecordType["NSEC3"] = 50] = "NSEC3";
53
+ RecordType[RecordType["NSEC3PARAM"] = 51] = "NSEC3PARAM";
54
+ RecordType[RecordType["TLSA"] = 52] = "TLSA";
55
+ RecordType[RecordType["HIP"] = 55] = "HIP";
56
+ RecordType[RecordType["NINFO"] = 56] = "NINFO";
57
+ RecordType[RecordType["RKEY"] = 57] = "RKEY";
58
+ RecordType[RecordType["TALINK"] = 58] = "TALINK";
59
+ RecordType[RecordType["CDS"] = 59] = "CDS";
60
+ RecordType[RecordType["SPF"] = 99] = "SPF";
61
+ RecordType[RecordType["UINFO"] = 100] = "UINFO";
62
+ RecordType[RecordType["UID"] = 101] = "UID";
63
+ RecordType[RecordType["GID"] = 102] = "GID";
64
+ RecordType[RecordType["UNSPEC"] = 103] = "UNSPEC";
65
+ RecordType[RecordType["TKEY"] = 249] = "TKEY";
66
+ RecordType[RecordType["TSIG"] = 250] = "TSIG";
67
+ RecordType[RecordType["IXFR"] = 251] = "IXFR";
68
+ RecordType[RecordType["AXFR"] = 252] = "AXFR";
69
+ RecordType[RecordType["MAILB"] = 253] = "MAILB";
70
+ RecordType[RecordType["MAILA"] = 254] = "MAILA";
71
+ RecordType[RecordType["ANY"] = 255] = "ANY";
72
+ RecordType[RecordType["URI"] = 256] = "URI";
73
+ RecordType[RecordType["CAA"] = 257] = "CAA";
74
+ RecordType[RecordType["TA"] = 32768] = "TA";
75
+ RecordType[RecordType["DLV"] = 32769] = "DLV";
76
+ })(RecordType = RecordType || (RecordType = {}));
77
+ //# sourceMappingURL=record-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-types.js","sourceRoot":"","sources":["../src/record-types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,UA0EX;AA1ED,WAAY,UAAU;IACpB,qCAAK,CAAA;IACL,uCAAM,CAAA;IACN,uCAAM,CAAA;IACN,uCAAM,CAAA;IACN,6CAAS,CAAA;IACT,yCAAO,CAAA;IACP,uCAAM,CAAA;IACN,uCAAM,CAAA;IACN,uCAAM,CAAA;IACN,4CAAS,CAAA;IACT,0CAAQ,CAAA;IACR,0CAAQ,CAAA;IACR,8CAAU,CAAA;IACV,8CAAU,CAAA;IACV,wCAAO,CAAA;IACP,0CAAQ,CAAA;IACR,wCAAO,CAAA;IACP,8CAAU,CAAA;IACV,0CAAQ,CAAA;IACR,4CAAS,CAAA;IACT,wCAAO,CAAA;IACP,4CAAS,CAAA;IACT,oDAAe,CAAA;IACf,0CAAQ,CAAA;IACR,0CAAQ,CAAA;IACR,wCAAO,CAAA;IACP,4CAAS,CAAA;IACT,4CAAS,CAAA;IACT,0CAAQ,CAAA;IACR,0CAAQ,CAAA;IACR,0CAAQ,CAAA;IACR,gDAAW,CAAA;IACX,0CAAQ,CAAA;IACR,4CAAS,CAAA;IACT,8CAAU,CAAA;IACV,wCAAO,CAAA;IACP,4CAAS,CAAA;IACT,wCAAO,CAAA;IACP,8CAAU,CAAA;IACV,4CAAS,CAAA;IACT,0CAAQ,CAAA;IACR,0CAAQ,CAAA;IACR,wCAAO,CAAA;IACP,8CAAU,CAAA;IACV,oDAAa,CAAA;IACb,8CAAU,CAAA;IACV,4CAAS,CAAA;IACT,gDAAW,CAAA;IACX,8CAAU,CAAA;IACV,8CAAU,CAAA;IACV,wDAAe,CAAA;IACf,4CAAS,CAAA;IACT,0CAAQ,CAAA;IACR,8CAAU,CAAA;IACV,4CAAS,CAAA;IACT,gDAAW,CAAA;IACX,0CAAQ,CAAA;IACR,0CAAQ,CAAA;IACR,+CAAW,CAAA;IACX,2CAAS,CAAA;IACT,2CAAS,CAAA;IACT,iDAAY,CAAA;IACZ,6CAAU,CAAA;IACV,6CAAU,CAAA;IACV,6CAAU,CAAA;IACV,6CAAU,CAAA;IACV,+CAAW,CAAA;IACX,+CAAW,CAAA;IACX,2CAAS,CAAA;IACT,2CAAS,CAAA;IACT,2CAAS,CAAA;IACT,2CAAU,CAAA;IACV,6CAAW,CAAA;AACb,CAAC,EA1EW,UAAU,GAAV,UAAU,KAAV,UAAU,QA0ErB"}
package/lib/router.js ADDED
@@ -0,0 +1,63 @@
1
+ import { resolveA } from "./utils/resolve-a.js";
2
+ import { isntNull } from '@blackglory/prelude';
3
+ import { getRouteResult } from "./dao/get-route-result.js";
4
+ import { upsertRouteResult } from "./dao/upsert-route-result.js";
5
+ export var RouteResult;
6
+ (function (RouteResult) {
7
+ RouteResult[RouteResult["UntrustedServer"] = 0] = "UntrustedServer";
8
+ RouteResult[RouteResult["TrustedServer"] = 1] = "TrustedServer";
9
+ RouteResult[RouteResult["Unresolved"] = 2] = "Unresolved";
10
+ })(RouteResult = RouteResult || (RouteResult = {}));
11
+ export class Router {
12
+ constructor(options) {
13
+ this.poisonTester = options.poisonTester;
14
+ this.untrustedResolver = options.untrustedResolver;
15
+ this.ipWhitelist = options.ipWhitelist;
16
+ this.hostnameWhitelist = options.hostnameWhitelist;
17
+ this.hostnameBlacklist = options.hostnameBlacklist;
18
+ }
19
+ async route(hostname) {
20
+ if (this.inHostnameWhitelist(hostname))
21
+ return RouteResult.UntrustedServer;
22
+ if (this.inHostnameBlacklist(hostname))
23
+ return RouteResult.TrustedServer;
24
+ const result = getRouteResult(hostname);
25
+ if (isntNull(result)) {
26
+ return result;
27
+ }
28
+ else {
29
+ const result = await this.resolveRoute(hostname);
30
+ upsertRouteResult(hostname, result);
31
+ return result;
32
+ }
33
+ }
34
+ async resolveRoute(hostname) {
35
+ if (await this.poisonTester.isHostnamePoisoned(hostname)) {
36
+ return RouteResult.TrustedServer;
37
+ }
38
+ else {
39
+ const addresses = await resolveA(this.untrustedResolver, hostname);
40
+ if (addresses.length > 0) {
41
+ if (this.inIPWhitelist(addresses)) {
42
+ return RouteResult.UntrustedServer;
43
+ }
44
+ else {
45
+ return RouteResult.TrustedServer;
46
+ }
47
+ }
48
+ else {
49
+ return RouteResult.Unresolved;
50
+ }
51
+ }
52
+ }
53
+ inIPWhitelist(addresses) {
54
+ return addresses.some(x => this.ipWhitelist.includes(x));
55
+ }
56
+ inHostnameWhitelist(hostname) {
57
+ return this.hostnameWhitelist.includes(hostname);
58
+ }
59
+ inHostnameBlacklist(hostname) {
60
+ return this.hostnameBlacklist.includes(hostname);
61
+ }
62
+ }
63
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,6BAA2B;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,kCAAgC;AACzD,OAAO,EAAE,iBAAiB,EAAE,qCAAmC;AAE/D,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,mEAAmB,CAAA;IACnB,+DAAiB,CAAA;IACjB,yDAAc,CAAA;AAChB,CAAC,EAJW,WAAW,GAAX,WAAW,KAAX,WAAW,QAItB;AAED,MAAM,OAAO,MAAM;IAOjB,YAAY,OAMX;QACC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAA;QACxC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAA;QAClD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAA;QACtC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAA;QAClD,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAA;IACpD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAgB;QAC1B,IAAI,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;YAAE,OAAO,WAAW,CAAC,eAAe,CAAA;QAC1E,IAAI,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;YAAE,OAAO,WAAW,CAAC,aAAa,CAAA;QAExE,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;YACpB,OAAO,MAAM,CAAA;SACd;aAAM;YACL,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;YAChD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YACnC,OAAO,MAAM,CAAA;SACd;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAAgB;QACzC,IAAI,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE;YACxD,OAAO,WAAW,CAAC,aAAa,CAAA;SACjC;aAAM;YACL,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAA;YAClE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBACxB,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE;oBACjC,OAAO,WAAW,CAAC,eAAe,CAAA;iBACnC;qBAAM;oBACL,OAAO,WAAW,CAAC,aAAa,CAAA;iBACjC;aACF;iBAAM;gBAEL,OAAO,WAAW,CAAC,UAAU,CAAA;aAC9B;SACF;IACH,CAAC;IAEO,aAAa,CAAC,SAAmB;QACvC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1D,CAAC;IAEO,mBAAmB,CAAC,QAAgB;QAC1C,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAClD,CAAC;IAEO,mBAAmB,CAAC,QAAgB;QAC1C,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAClD,CAAC;CACF"}
package/lib/server.js ADDED
@@ -0,0 +1,84 @@
1
+ import { RouteResult } from './router.js';
2
+ import * as dns from 'native-node-dns';
3
+ import { getErrorResultAsync } from 'return-style';
4
+ import chalk from 'chalk';
5
+ import { RecordType } from './record-types.js';
6
+ import { go } from '@blackglory/prelude';
7
+ export function startServer({ logger, port, timeout, router, trustedServer, untrustedServer }) {
8
+ const server = dns.createServer();
9
+ server.on('error', console.error);
10
+ server.on('socketError', console.error);
11
+ server.on('request', async (req, res) => {
12
+ logger.trace(`request: ${JSON.stringify(req)}`);
13
+ res.header.rcode = dns.consts.NAME_TO_RCODE.SERVFAIL;
14
+ const question = req.question[0];
15
+ const startTime = Date.now();
16
+ const [err, result] = await getErrorResultAsync(() => router.route(question.name));
17
+ if (err) {
18
+ logger.error(`${formatHostname(question.name)} ${err}`, getElapsed(startTime));
19
+ }
20
+ else {
21
+ logger.debug(`${formatHostname(question.name)} ${RouteResult[result]}`, getElapsed(startTime));
22
+ const server = go(() => {
23
+ switch (result) {
24
+ case RouteResult.TrustedServer: return trustedServer;
25
+ case RouteResult.UntrustedServer: return untrustedServer;
26
+ case RouteResult.Unresolved: return untrustedServer;
27
+ default: throw new Error('Unknown route result');
28
+ }
29
+ });
30
+ const [err, response] = await getErrorResultAsync(() => resolve(server, question, timeout));
31
+ if (err) {
32
+ logger.error(`${formatHostname(question.name)} ${err}`, getElapsed(startTime));
33
+ }
34
+ else {
35
+ logger.info(`${formatHostname(question.name)} ${RecordType[question.type]}`, getElapsed(startTime));
36
+ res.header.rcode = response.header.rcode;
37
+ res.answer = response.answer;
38
+ res.authority = response.authority;
39
+ }
40
+ }
41
+ logger.trace(`response: ${JSON.stringify(res)}`);
42
+ res.send();
43
+ });
44
+ server.serve(port);
45
+ }
46
+ function resolve(server, question, timeout) {
47
+ return new Promise((resolve, reject) => {
48
+ let response;
49
+ const request = dns.Request({
50
+ question,
51
+ server: {
52
+ address: server.host,
53
+ port: server.port,
54
+ type: 'udp'
55
+ },
56
+ timeout,
57
+ cache: false,
58
+ try_edns: true
59
+ });
60
+ request.on('timeout', () => reject(new Error('timeout')));
61
+ request.on('cancelled', () => reject(new Error('cancelled')));
62
+ request.on('end', () => {
63
+ if (response) {
64
+ resolve(response);
65
+ }
66
+ else {
67
+ reject(new Error('No response'));
68
+ }
69
+ });
70
+ request.on('message', (err, msg) => {
71
+ if (err)
72
+ return reject(err);
73
+ response = msg;
74
+ });
75
+ request.send();
76
+ });
77
+ }
78
+ function formatHostname(hostname) {
79
+ return chalk.cyan(hostname);
80
+ }
81
+ function getElapsed(startTime) {
82
+ return Date.now() - startTime;
83
+ }
84
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { promises as dns } from 'dns';
2
+ export function createDNSResolver(...servers) {
3
+ const resolver = new dns.Resolver();
4
+ resolver.setServers(servers);
5
+ return resolver;
6
+ }
7
+ //# sourceMappingURL=create-dns-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-dns-resolver.js","sourceRoot":"","sources":["../../src/utils/create-dns-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,KAAK,CAAA;AAErC,MAAM,UAAU,iBAAiB,CAAC,GAAG,OAAiB;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAA;IACnC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAC5B,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -0,0 +1,11 @@
1
+ export class HostnamePattern {
2
+ constructor(pattern) {
3
+ const re = pattern.replace(/\./g, '\\.')
4
+ .replace(/\*/g, '.*');
5
+ this.re = new RegExp(`^${re}$`, 'i');
6
+ }
7
+ match(hostname) {
8
+ return this.re.test(hostname);
9
+ }
10
+ }
11
+ //# sourceMappingURL=hostname-pattern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostname-pattern.js","sourceRoot":"","sources":["../../src/utils/hostname-pattern.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAe;IAG1B,YAAY,OAAe;QACzB,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACvC,IAAI,CAAC,EAAE,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,QAAgB;QACpB,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export function isIPv4Address(text) {
2
+ return /^[\d\.]+$/.test(text);
3
+ }
4
+ //# sourceMappingURL=is-ipv4-address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-ipv4-address.js","sourceRoot":"","sources":["../../src/utils/is-ipv4-address.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export function isIPv6Address(text) {
2
+ return /^[\da-f:]+$/.test(text);
3
+ }
4
+ //# sourceMappingURL=is-ipv6-address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-ipv6-address.js","sourceRoot":"","sources":["../../src/utils/is-ipv6-address.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { timeout, TimeoutError } from 'extra-promise';
2
+ import ping from 'ping';
3
+ import { go } from '@blackglory/prelude';
4
+ export async function isServerOnline(address, timeoutMsecs) {
5
+ try {
6
+ const result = await Promise.race([
7
+ go(async () => {
8
+ const res = await ping.promise.probe(address);
9
+ return res.alive;
10
+ }),
11
+ timeout(timeoutMsecs)
12
+ ]);
13
+ return result;
14
+ }
15
+ catch (e) {
16
+ if (e instanceof TimeoutError)
17
+ return false;
18
+ throw e;
19
+ }
20
+ }
21
+ //# sourceMappingURL=is-server-online.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-server-online.js","sourceRoot":"","sources":["../../src/utils/is-server-online.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAA;AAExC,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,YAAoB;IAEpB,IAAI;QACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAChC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACZ,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;gBAC7C,OAAO,GAAG,CAAC,KAAK,CAAA;YAClB,CAAC,CAAC;YACF,OAAO,CAAC,YAAY,CAAC;SACtB,CAAC,CAAA;QACF,OAAO,MAAM,CAAA;KACd;IAAC,OAAO,CAAC,EAAE;QACV,IAAI,CAAC,YAAY,YAAY;YAAE,OAAO,KAAK,CAAA;QAE3C,MAAM,CAAC,CAAA;KACR;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { fileURLToPath } from 'node:url';
2
+ import { readJSONFileSync, findUpPackageFilenameSync } from 'extra-filesystem';
3
+ import { assert, isString } from '@blackglory/prelude';
4
+ import path from 'path';
5
+ const pkgFilename = findUpPackageFilenameSync(fileURLToPath(new URL(import.meta.url)));
6
+ assert(pkgFilename, 'The package.json is not found');
7
+ export const pkgDirname = path.dirname(pkgFilename);
8
+ const pkg = readJSONFileSync(pkgFilename);
9
+ export const name = pkg.name;
10
+ assert(isString(name), 'The name is not found in package.json');
11
+ export const description = pkg.description;
12
+ assert(isString(description), 'The description is not found in package.json');
13
+ export const version = pkg.version;
14
+ assert(isString(version), 'The version is not found in package.json');
15
+ assert(/^\d+\.\d+\.\d+$/.test(version), 'The version is invalid');
16
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/utils/package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,WAAW,GAAG,yBAAyB,CAC3C,aAAa,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CACxC,CAAA;AACD,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC,CAAA;AAEpD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;AAEnD,MAAM,GAAG,GAAG,gBAAgB,CAAyB,WAAW,CAAC,CAAA;AAEjE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;AAC5B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,uCAAuC,CAAC,CAAA;AAE/D,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAA;AAC1C,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,8CAA8C,CAAC,CAAA;AAE7E,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAA0C,CAAA;AACrE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,0CAA0C,CAAC,CAAA;AACrE,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,wBAAwB,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ export function parseServerInfo(server) {
2
+ const [host, port] = server.split(':');
3
+ return {
4
+ host,
5
+ port: port ? Number.parseInt(port, 10) : undefined
6
+ };
7
+ }
8
+ //# sourceMappingURL=parse-server-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-server-info.js","sourceRoot":"","sources":["../../src/utils/parse-server-info.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAiC,CAAA;IACtE,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;KACnD,CAAA;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { timeout } from 'extra-promise';
2
+ export { TimeoutError } from 'extra-promise';
3
+ export async function resolveA(resolver, hostname, timeoutMsecs) {
4
+ if (timeoutMsecs) {
5
+ return await Promise.race([
6
+ resolver.resolve4(hostname),
7
+ timeout(timeoutMsecs)
8
+ ]);
9
+ }
10
+ else {
11
+ return await resolver.resolve4(hostname);
12
+ }
13
+ }
14
+ //# sourceMappingURL=resolve-a.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-a.js","sourceRoot":"","sources":["../../src/utils/resolve-a.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAM5C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAsB,EACtB,QAAgB,EAChB,YAAqB;IAErB,IAAI,YAAY,EAAE;QAChB,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,OAAO,CAAC,YAAY,CAAC;SACtB,CAAC,CAAA;KACH;SAAM;QACL,OAAO,MAAM,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;KACzC;AACH,CAAC"}