@push.rocks/smartnetwork 4.8.0 → 4.9.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/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/helpers/ip.d.ts +21 -0
- package/dist_ts/helpers/ip.js +80 -1
- package/dist_ts/index.d.ts +1 -1
- package/dist_ts/index.js +2 -2
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/helpers/ip.ts +79 -0
- package/ts/index.ts +1 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartnetwork',
|
|
6
|
-
version: '4.
|
|
6
|
+
version: '4.9.0',
|
|
7
7
|
description: 'A toolkit for network diagnostics including speed tests, port availability checks, and more.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSwwQkFBMEI7SUFDaEMsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDhGQUE4RjtDQUM1RyxDQUFBIn0=
|
package/dist_ts/helpers/ip.d.ts
CHANGED
|
@@ -19,3 +19,24 @@ export declare function isValidIpv6(ip: string): boolean;
|
|
|
19
19
|
* Behaves like node:net.isIP() except that zone-indexed IPv6 is rejected.
|
|
20
20
|
*/
|
|
21
21
|
export declare function getIpVersion(ip: string): 4 | 6 | 0;
|
|
22
|
+
/**
|
|
23
|
+
* Expands a valid IPv6 address into its eight zero-padded 16-bit groups.
|
|
24
|
+
* Embedded IPv4 tails are converted to their two hex groups.
|
|
25
|
+
* Returns undefined for anything that is not a valid IPv6 address.
|
|
26
|
+
*/
|
|
27
|
+
export declare function expandIpv6(ip: string): string[] | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Returns the reverse-DNS (PTR) name for a valid IPv4 or IPv6 address:
|
|
30
|
+
* 'in-addr.arpa' for IPv4, 'ip6.arpa' with nibble ordering for IPv6.
|
|
31
|
+
* Returns undefined instead of throwing for invalid input, so lookup code
|
|
32
|
+
* can treat "no address" and "bad address" uniformly.
|
|
33
|
+
*/
|
|
34
|
+
export declare function toReverseDnsName(ip: string): string | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Returns true when the address is publicly routable: not private (RFC 1918),
|
|
37
|
+
* loopback, link-local, carrier-grade NAT, documentation, benchmarking,
|
|
38
|
+
* multicast, or otherwise reserved space. Invalid input returns false.
|
|
39
|
+
* IPv6 is public when it falls in global unicast 2000::/3 and is not the
|
|
40
|
+
* 2001:db8::/32 documentation range.
|
|
41
|
+
*/
|
|
42
|
+
export declare function isPublicIpAddress(ip: string): boolean;
|
package/dist_ts/helpers/ip.js
CHANGED
|
@@ -68,4 +68,83 @@ export function getIpVersion(ip) {
|
|
|
68
68
|
return 6;
|
|
69
69
|
return 0;
|
|
70
70
|
}
|
|
71
|
-
|
|
71
|
+
/**
|
|
72
|
+
* Expands a valid IPv6 address into its eight zero-padded 16-bit groups.
|
|
73
|
+
* Embedded IPv4 tails are converted to their two hex groups.
|
|
74
|
+
* Returns undefined for anything that is not a valid IPv6 address.
|
|
75
|
+
*/
|
|
76
|
+
export function expandIpv6(ip) {
|
|
77
|
+
if (!isValidIpv6(ip))
|
|
78
|
+
return undefined;
|
|
79
|
+
let normalized = ip;
|
|
80
|
+
const lastColon = normalized.lastIndexOf(':');
|
|
81
|
+
const tail = normalized.slice(lastColon + 1);
|
|
82
|
+
if (tail.includes('.')) {
|
|
83
|
+
const octets = tail.split('.').map(Number);
|
|
84
|
+
const hexTail = `${((octets[0] << 8) | octets[1]).toString(16)}:${((octets[2] << 8) | octets[3]).toString(16)}`;
|
|
85
|
+
normalized = `${normalized.slice(0, lastColon + 1)}${hexTail}`;
|
|
86
|
+
}
|
|
87
|
+
const halves = normalized.split('::');
|
|
88
|
+
const parseGroups = (segment) => segment === '' ? [] : segment.split(':');
|
|
89
|
+
const left = parseGroups(halves[0]);
|
|
90
|
+
const right = halves.length === 2 ? parseGroups(halves[1]) : [];
|
|
91
|
+
const missing = 8 - left.length - right.length;
|
|
92
|
+
if ((halves.length === 1 && missing !== 0) || missing < 0)
|
|
93
|
+
return undefined;
|
|
94
|
+
const groups = [...left, ...Array.from({ length: missing }, () => '0'), ...right];
|
|
95
|
+
if (groups.length !== 8)
|
|
96
|
+
return undefined;
|
|
97
|
+
return groups.map((group) => group.toLowerCase().padStart(4, '0'));
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Returns the reverse-DNS (PTR) name for a valid IPv4 or IPv6 address:
|
|
101
|
+
* 'in-addr.arpa' for IPv4, 'ip6.arpa' with nibble ordering for IPv6.
|
|
102
|
+
* Returns undefined instead of throwing for invalid input, so lookup code
|
|
103
|
+
* can treat "no address" and "bad address" uniformly.
|
|
104
|
+
*/
|
|
105
|
+
export function toReverseDnsName(ip) {
|
|
106
|
+
const family = getIpVersion(ip);
|
|
107
|
+
if (family === 4) {
|
|
108
|
+
return `${ip.split('.').reverse().join('.')}.in-addr.arpa`;
|
|
109
|
+
}
|
|
110
|
+
if (family === 6) {
|
|
111
|
+
const groups = expandIpv6(ip);
|
|
112
|
+
if (!groups)
|
|
113
|
+
return undefined;
|
|
114
|
+
return `${groups.join('').split('').reverse().join('.')}.ip6.arpa`;
|
|
115
|
+
}
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Returns true when the address is publicly routable: not private (RFC 1918),
|
|
120
|
+
* loopback, link-local, carrier-grade NAT, documentation, benchmarking,
|
|
121
|
+
* multicast, or otherwise reserved space. Invalid input returns false.
|
|
122
|
+
* IPv6 is public when it falls in global unicast 2000::/3 and is not the
|
|
123
|
+
* 2001:db8::/32 documentation range.
|
|
124
|
+
*/
|
|
125
|
+
export function isPublicIpAddress(ip) {
|
|
126
|
+
const family = getIpVersion(ip);
|
|
127
|
+
if (family === 4) {
|
|
128
|
+
const [a, b, c] = ip.split('.').map(Number);
|
|
129
|
+
return !(a === 0 || a === 10 || a === 127 || a >= 224
|
|
130
|
+
|| (a === 100 && b >= 64 && b <= 127)
|
|
131
|
+
|| (a === 169 && b === 254)
|
|
132
|
+
|| (a === 172 && b >= 16 && b <= 31)
|
|
133
|
+
|| (a === 192 && b === 0)
|
|
134
|
+
|| (a === 192 && b === 168)
|
|
135
|
+
|| (a === 198 && (b === 18 || b === 19))
|
|
136
|
+
|| (a === 198 && b === 51 && c === 100)
|
|
137
|
+
|| (a === 203 && b === 0 && c === 113));
|
|
138
|
+
}
|
|
139
|
+
if (family === 6) {
|
|
140
|
+
const groups = expandIpv6(ip);
|
|
141
|
+
if (!groups)
|
|
142
|
+
return false;
|
|
143
|
+
const firstGroup = parseInt(groups[0], 16);
|
|
144
|
+
if (firstGroup < 0x2000 || firstGroup > 0x3fff)
|
|
145
|
+
return false;
|
|
146
|
+
return !(groups[0] === '2001' && groups[1] === '0db8');
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9oZWxwZXJzL2lwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSDs7R0FFRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsRUFBVTtJQUNwQyxJQUFJLENBQUMsRUFBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNyQyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMxQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxFQUFVO0lBQ3BDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUUxQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlDLE1BQU0sY0FBYyxH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
|
package/dist_ts/index.d.ts
CHANGED
|
@@ -8,4 +8,4 @@ export { DomainIntelligence } from './smartnetwork.classes.domainintelligence.js
|
|
|
8
8
|
export type { IDomainIntelligenceResult, IDomainIntelligenceOptions } from './smartnetwork.classes.domainintelligence.js';
|
|
9
9
|
export { setLogger, getLogger } from './logging.js';
|
|
10
10
|
export { NetworkError, TimeoutError } from './errors.js';
|
|
11
|
-
export { isValidIpv4, isValidIpv6, getIpVersion } from './helpers/ip.js';
|
|
11
|
+
export { isValidIpv4, isValidIpv6, getIpVersion, expandIpv6, toReverseDnsName, isPublicIpAddress } from './helpers/ip.js';
|
package/dist_ts/index.js
CHANGED
|
@@ -5,5 +5,5 @@ export { IpIntelligence } from './smartnetwork.classes.ipintelligence.js';
|
|
|
5
5
|
export { DomainIntelligence } from './smartnetwork.classes.domainintelligence.js';
|
|
6
6
|
export { setLogger, getLogger } from './logging.js';
|
|
7
7
|
export { NetworkError, TimeoutError } from './errors.js';
|
|
8
|
-
export { isValidIpv4, isValidIpv6, getIpVersion } from './helpers/ip.js';
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
export { isValidIpv4, isValidIpv6, getIpVersion, expandIpv6, toReverseDnsName, isPublicIpAddress } from './helpers/ip.js';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHdDQUF3QyxDQUFDO0FBRXZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFMUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFbEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDIn0=
|
package/package.json
CHANGED
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/helpers/ip.ts
CHANGED
|
@@ -67,3 +67,82 @@ export function getIpVersion(ip: string): 4 | 6 | 0 {
|
|
|
67
67
|
if (isValidIpv6(ip)) return 6;
|
|
68
68
|
return 0;
|
|
69
69
|
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Expands a valid IPv6 address into its eight zero-padded 16-bit groups.
|
|
73
|
+
* Embedded IPv4 tails are converted to their two hex groups.
|
|
74
|
+
* Returns undefined for anything that is not a valid IPv6 address.
|
|
75
|
+
*/
|
|
76
|
+
export function expandIpv6(ip: string): string[] | undefined {
|
|
77
|
+
if (!isValidIpv6(ip)) return undefined;
|
|
78
|
+
|
|
79
|
+
let normalized = ip;
|
|
80
|
+
const lastColon = normalized.lastIndexOf(':');
|
|
81
|
+
const tail = normalized.slice(lastColon + 1);
|
|
82
|
+
if (tail.includes('.')) {
|
|
83
|
+
const octets = tail.split('.').map(Number);
|
|
84
|
+
const hexTail = `${((octets[0] << 8) | octets[1]).toString(16)}:${((octets[2] << 8) | octets[3]).toString(16)}`;
|
|
85
|
+
normalized = `${normalized.slice(0, lastColon + 1)}${hexTail}`;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const halves = normalized.split('::');
|
|
89
|
+
const parseGroups = (segment: string): string[] =>
|
|
90
|
+
segment === '' ? [] : segment.split(':');
|
|
91
|
+
const left = parseGroups(halves[0]);
|
|
92
|
+
const right = halves.length === 2 ? parseGroups(halves[1]) : [];
|
|
93
|
+
const missing = 8 - left.length - right.length;
|
|
94
|
+
if ((halves.length === 1 && missing !== 0) || missing < 0) return undefined;
|
|
95
|
+
const groups = [...left, ...Array.from({ length: missing }, () => '0'), ...right];
|
|
96
|
+
if (groups.length !== 8) return undefined;
|
|
97
|
+
return groups.map((group) => group.toLowerCase().padStart(4, '0'));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Returns the reverse-DNS (PTR) name for a valid IPv4 or IPv6 address:
|
|
102
|
+
* 'in-addr.arpa' for IPv4, 'ip6.arpa' with nibble ordering for IPv6.
|
|
103
|
+
* Returns undefined instead of throwing for invalid input, so lookup code
|
|
104
|
+
* can treat "no address" and "bad address" uniformly.
|
|
105
|
+
*/
|
|
106
|
+
export function toReverseDnsName(ip: string): string | undefined {
|
|
107
|
+
const family = getIpVersion(ip);
|
|
108
|
+
if (family === 4) {
|
|
109
|
+
return `${ip.split('.').reverse().join('.')}.in-addr.arpa`;
|
|
110
|
+
}
|
|
111
|
+
if (family === 6) {
|
|
112
|
+
const groups = expandIpv6(ip);
|
|
113
|
+
if (!groups) return undefined;
|
|
114
|
+
return `${groups.join('').split('').reverse().join('.')}.ip6.arpa`;
|
|
115
|
+
}
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Returns true when the address is publicly routable: not private (RFC 1918),
|
|
121
|
+
* loopback, link-local, carrier-grade NAT, documentation, benchmarking,
|
|
122
|
+
* multicast, or otherwise reserved space. Invalid input returns false.
|
|
123
|
+
* IPv6 is public when it falls in global unicast 2000::/3 and is not the
|
|
124
|
+
* 2001:db8::/32 documentation range.
|
|
125
|
+
*/
|
|
126
|
+
export function isPublicIpAddress(ip: string): boolean {
|
|
127
|
+
const family = getIpVersion(ip);
|
|
128
|
+
if (family === 4) {
|
|
129
|
+
const [a, b, c] = ip.split('.').map(Number);
|
|
130
|
+
return !(a === 0 || a === 10 || a === 127 || a >= 224
|
|
131
|
+
|| (a === 100 && b >= 64 && b <= 127)
|
|
132
|
+
|| (a === 169 && b === 254)
|
|
133
|
+
|| (a === 172 && b >= 16 && b <= 31)
|
|
134
|
+
|| (a === 192 && b === 0)
|
|
135
|
+
|| (a === 192 && b === 168)
|
|
136
|
+
|| (a === 198 && (b === 18 || b === 19))
|
|
137
|
+
|| (a === 198 && b === 51 && c === 100)
|
|
138
|
+
|| (a === 203 && b === 0 && c === 113));
|
|
139
|
+
}
|
|
140
|
+
if (family === 6) {
|
|
141
|
+
const groups = expandIpv6(ip);
|
|
142
|
+
if (!groups) return false;
|
|
143
|
+
const firstGroup = parseInt(groups[0], 16);
|
|
144
|
+
if (firstGroup < 0x2000 || firstGroup > 0x3fff) return false;
|
|
145
|
+
return !(groups[0] === '2001' && groups[1] === '0db8');
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
package/ts/index.ts
CHANGED
|
@@ -8,4 +8,4 @@ export { DomainIntelligence } from './smartnetwork.classes.domainintelligence.js
|
|
|
8
8
|
export type { IDomainIntelligenceResult, IDomainIntelligenceOptions } from './smartnetwork.classes.domainintelligence.js';
|
|
9
9
|
export { setLogger, getLogger } from './logging.js';
|
|
10
10
|
export { NetworkError, TimeoutError } from './errors.js';
|
|
11
|
-
export { isValidIpv4, isValidIpv6, getIpVersion } from './helpers/ip.js';
|
|
11
|
+
export { isValidIpv4, isValidIpv6, getIpVersion, expandIpv6, toReverseDnsName, isPublicIpAddress } from './helpers/ip.js';
|