pnpm 10.33.2 → 10.33.4
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/node_modules/.modules.yaml +66 -66
- package/dist/node_modules/.pnpm/lock.yaml +8 -8
- package/dist/node_modules/.pnpm-workspace-state-v1.json +1 -1
- package/dist/node_modules/ip-address/dist/address-error.js.map +1 -1
- package/dist/node_modules/ip-address/dist/common.js +21 -0
- package/dist/node_modules/ip-address/dist/common.js.map +1 -1
- package/dist/node_modules/ip-address/dist/ip-address.js.map +1 -1
- package/dist/node_modules/ip-address/dist/ipv4.js +193 -68
- package/dist/node_modules/ip-address/dist/ipv4.js.map +1 -1
- package/dist/node_modules/ip-address/dist/ipv6.js +345 -131
- package/dist/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/dist/node_modules/ip-address/dist/v4/constants.js.map +1 -1
- package/dist/node_modules/ip-address/dist/v6/constants.js +5 -0
- package/dist/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/dist/node_modules/ip-address/dist/v6/helpers.js +12 -3
- package/dist/node_modules/ip-address/dist/v6/helpers.js.map +1 -1
- package/dist/node_modules/ip-address/dist/v6/regular-expressions.js.map +1 -1
- package/dist/node_modules/ip-address/package.json +45 -35
- package/dist/node_modules/isexe/LICENSE +1 -1
- package/dist/node_modules/isexe/package.json +14 -79
- package/dist/node_modules/{cross-spawn/node_modules/which → node-gyp/node_modules/isexe}/LICENSE +1 -1
- package/dist/node_modules/node-gyp/node_modules/isexe/package.json +96 -0
- package/dist/node_modules/node-gyp/node_modules/which/package.json +52 -0
- package/dist/node_modules/socks/.claude/settings.local.json +26 -0
- package/dist/node_modules/socks/package.json +2 -2
- package/dist/node_modules/which/package.json +20 -29
- package/dist/pnpm.cjs +1156 -729
- package/dist/worker.js +11 -8
- package/package.json +1 -1
- package/dist/node_modules/cross-spawn/node_modules/isexe/package.json +0 -31
- package/dist/node_modules/cross-spawn/node_modules/which/package.json +0 -43
- package/dist/node_modules/ip-address/dist/address-error.d.ts.map +0 -1
- package/dist/node_modules/ip-address/dist/common.d.ts.map +0 -1
- package/dist/node_modules/ip-address/dist/ip-address.d.ts.map +0 -1
- package/dist/node_modules/ip-address/dist/ipv4.d.ts.map +0 -1
- package/dist/node_modules/ip-address/dist/ipv6.d.ts.map +0 -1
- package/dist/node_modules/ip-address/dist/v4/constants.d.ts.map +0 -1
- package/dist/node_modules/ip-address/dist/v6/constants.d.ts.map +0 -1
- package/dist/node_modules/ip-address/dist/v6/helpers.d.ts.map +0 -1
- package/dist/node_modules/ip-address/dist/v6/regular-expressions.d.ts.map +0 -1
- /package/dist/node_modules/{cross-spawn/node_modules/isexe → isexe}/index.js +0 -0
- /package/dist/node_modules/{cross-spawn/node_modules/isexe → isexe}/mode.js +0 -0
- /package/dist/node_modules/{cross-spawn/node_modules/isexe → isexe}/windows.js +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/cjs/index.d.ts.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/cjs/index.js +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/cjs/index.js.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/cjs/options.d.ts.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/cjs/options.js +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/cjs/options.js.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/cjs/package.json +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/cjs/posix.d.ts.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/cjs/posix.js +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/cjs/posix.js.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/cjs/win32.d.ts.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/cjs/win32.js +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/cjs/win32.js.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/mjs/index.d.ts.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/mjs/index.js +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/mjs/index.js.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/mjs/options.d.ts.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/mjs/options.js +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/mjs/options.js.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/mjs/package.json +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/mjs/posix.d.ts.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/mjs/posix.js +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/mjs/posix.js.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/mjs/win32.d.ts.map +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/mjs/win32.js +0 -0
- /package/dist/node_modules/{isexe → node-gyp/node_modules/isexe}/dist/mjs/win32.js.map +0 -0
- /package/dist/node_modules/{cross-spawn/node_modules/isexe → node-gyp/node_modules/which}/LICENSE +0 -0
- /package/dist/node_modules/{which → node-gyp/node_modules/which}/bin/which.js +0 -0
- /package/dist/node_modules/{which → node-gyp/node_modules/which}/lib/index.js +0 -0
- /package/dist/node_modules/{cross-spawn/node_modules/which → which}/bin/node-which +0 -0
- /package/dist/node_modules/{cross-spawn/node_modules/which → which}/which.js +0 -0
|
@@ -28,9 +28,9 @@ exports.Address4 = void 0;
|
|
|
28
28
|
const common = __importStar(require("./common"));
|
|
29
29
|
const constants = __importStar(require("./v4/constants"));
|
|
30
30
|
const address_error_1 = require("./address-error");
|
|
31
|
+
const isCorrect4 = common.isCorrect(constants.BITS);
|
|
31
32
|
/**
|
|
32
33
|
* Represents an IPv4 address
|
|
33
|
-
* @class Address4
|
|
34
34
|
* @param {string} address - An IPv4 address string
|
|
35
35
|
*/
|
|
36
36
|
class Address4 {
|
|
@@ -43,15 +43,11 @@ class Address4 {
|
|
|
43
43
|
this.v4 = true;
|
|
44
44
|
/**
|
|
45
45
|
* Returns true if the address is correct, false otherwise
|
|
46
|
-
* @memberof Address4
|
|
47
|
-
* @instance
|
|
48
46
|
* @returns {Boolean}
|
|
49
47
|
*/
|
|
50
|
-
this.isCorrect =
|
|
48
|
+
this.isCorrect = isCorrect4;
|
|
51
49
|
/**
|
|
52
50
|
* Returns true if the given address is in the subnet of the current address
|
|
53
|
-
* @memberof Address4
|
|
54
|
-
* @instance
|
|
55
51
|
* @returns {boolean}
|
|
56
52
|
*/
|
|
57
53
|
this.isInSubnet = common.isInSubnet;
|
|
@@ -69,6 +65,13 @@ class Address4 {
|
|
|
69
65
|
this.addressMinusSuffix = address;
|
|
70
66
|
this.parsedAddress = this.parse(address);
|
|
71
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Returns true if the given string is a valid IPv4 address (with optional
|
|
70
|
+
* CIDR subnet), false otherwise. Host bits in the subnet portion are
|
|
71
|
+
* allowed (e.g. `192.168.1.5/24` is valid); for strict network-address
|
|
72
|
+
* validation compare `correctForm()` to `startAddress().correctForm()`,
|
|
73
|
+
* or use `networkForm()`.
|
|
74
|
+
*/
|
|
72
75
|
static isValid(address) {
|
|
73
76
|
try {
|
|
74
77
|
// eslint-disable-next-line no-new
|
|
@@ -79,8 +82,11 @@ class Address4 {
|
|
|
79
82
|
return false;
|
|
80
83
|
}
|
|
81
84
|
}
|
|
82
|
-
|
|
83
|
-
* Parses
|
|
85
|
+
/**
|
|
86
|
+
* Parses an IPv4 address string into its four octet groups and stores the
|
|
87
|
+
* result on `this.parsedAddress`. Called automatically by the constructor;
|
|
88
|
+
* you typically don't need to call it directly. Throws `AddressError` if
|
|
89
|
+
* the input is not a valid IPv4 address.
|
|
84
90
|
*/
|
|
85
91
|
parse(address) {
|
|
86
92
|
const groups = address.split('.');
|
|
@@ -90,45 +96,110 @@ class Address4 {
|
|
|
90
96
|
return groups;
|
|
91
97
|
}
|
|
92
98
|
/**
|
|
93
|
-
* Returns the correct form
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
* @returns {String}
|
|
99
|
+
* Returns the address in correct form: octets joined with `.` and any
|
|
100
|
+
* leading zeros stripped (e.g. `192.168.1.1`). For IPv4 this matches the
|
|
101
|
+
* canonical dotted-decimal representation.
|
|
97
102
|
*/
|
|
98
103
|
correctForm() {
|
|
99
104
|
return this.parsedAddress.map((part) => parseInt(part, 10)).join('.');
|
|
100
105
|
}
|
|
101
106
|
/**
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
107
|
+
* Construct an `Address4` from an address and a dotted-decimal subnet
|
|
108
|
+
* mask given as separate strings (e.g. as returned by Node's
|
|
109
|
+
* `os.networkInterfaces()`). Throws `AddressError` if the mask is
|
|
110
|
+
* non-contiguous (e.g. `255.0.255.0`).
|
|
111
|
+
* @example
|
|
112
|
+
* var address = Address4.fromAddressAndMask('192.168.1.1', '255.255.255.0');
|
|
113
|
+
* address.subnetMask; // 24
|
|
114
|
+
*/
|
|
115
|
+
static fromAddressAndMask(address, mask) {
|
|
116
|
+
const bits = common.prefixLengthFromMask(new Address4(mask).bigInt(), constants.BITS);
|
|
117
|
+
return new Address4(`${address}/${bits}`);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Construct an `Address4` from an address and a Cisco-style wildcard mask
|
|
121
|
+
* given as separate strings (e.g. `0.0.0.255` for a `/24`). The wildcard
|
|
122
|
+
* mask is the bitwise inverse of the subnet mask. Throws `AddressError`
|
|
123
|
+
* if the mask is non-contiguous (e.g. `0.255.0.255`).
|
|
124
|
+
* @example
|
|
125
|
+
* var address = Address4.fromAddressAndWildcardMask('10.0.0.1', '0.0.0.255');
|
|
126
|
+
* address.subnetMask; // 24
|
|
127
|
+
*/
|
|
128
|
+
static fromAddressAndWildcardMask(address, wildcardMask) {
|
|
129
|
+
const wildcard = new Address4(wildcardMask).bigInt();
|
|
130
|
+
const allOnes = (BigInt(1) << BigInt(constants.BITS)) - BigInt(1);
|
|
131
|
+
// eslint-disable-next-line no-bitwise
|
|
132
|
+
const mask = wildcard ^ allOnes;
|
|
133
|
+
const bits = common.prefixLengthFromMask(mask, constants.BITS);
|
|
134
|
+
return new Address4(`${address}/${bits}`);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Construct an `Address4` from a wildcard pattern with trailing `*`
|
|
138
|
+
* octets. The number of trailing wildcards determines the prefix
|
|
139
|
+
* length: each `*` represents 8 bits.
|
|
140
|
+
*
|
|
141
|
+
* Only trailing whole-octet wildcards are supported. Partial-octet
|
|
142
|
+
* wildcards (e.g. `192.168.0.1*`) and interior wildcards (e.g.
|
|
143
|
+
* `192.*.0.1`) throw `AddressError`.
|
|
144
|
+
* @example
|
|
145
|
+
* Address4.fromWildcard('192.168.0.*').subnet; // '/24'
|
|
146
|
+
* Address4.fromWildcard('192.168.*.*').subnet; // '/16'
|
|
147
|
+
* Address4.fromWildcard('*.*.*.*').subnet; // '/0'
|
|
148
|
+
*/
|
|
149
|
+
static fromWildcard(input) {
|
|
150
|
+
const groups = input.split('.');
|
|
151
|
+
if (groups.length !== constants.GROUPS) {
|
|
152
|
+
throw new address_error_1.AddressError('Wildcard pattern must have 4 octets');
|
|
153
|
+
}
|
|
154
|
+
let firstWildcard = -1;
|
|
155
|
+
for (let i = 0; i < groups.length; i++) {
|
|
156
|
+
if (groups[i] === '*') {
|
|
157
|
+
if (firstWildcard === -1) {
|
|
158
|
+
firstWildcard = i;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else if (firstWildcard !== -1) {
|
|
162
|
+
throw new address_error_1.AddressError('Wildcard `*` must only appear in trailing octets (e.g. `192.168.0.*`)');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const trailing = firstWildcard === -1 ? 0 : groups.length - firstWildcard;
|
|
166
|
+
const replaced = groups.map((g) => (g === '*' ? '0' : g));
|
|
167
|
+
const subnetBits = constants.BITS - trailing * 8;
|
|
168
|
+
return new Address4(`${replaced.join('.')}/${subnetBits}`);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Converts a hex string to an IPv4 address object. Accepts 8 hex digits
|
|
172
|
+
* with optional `:` separators (e.g. `'7f000001'` or `'7f:00:00:01'`).
|
|
173
|
+
* Throws `AddressError` for any other length or for non-hex characters.
|
|
105
174
|
* @param {string} hex - a hex string to convert
|
|
106
175
|
* @returns {Address4}
|
|
107
176
|
*/
|
|
108
177
|
static fromHex(hex) {
|
|
109
|
-
const
|
|
178
|
+
const stripped = hex.replace(/:/g, '');
|
|
179
|
+
if (!/^[0-9a-fA-F]{8}$/.test(stripped)) {
|
|
180
|
+
throw new address_error_1.AddressError('IPv4 hex must be exactly 8 hex digits');
|
|
181
|
+
}
|
|
110
182
|
const groups = [];
|
|
111
|
-
let i;
|
|
112
|
-
|
|
113
|
-
const h = padded.slice(i, i + 2);
|
|
114
|
-
groups.push(parseInt(h, 16));
|
|
183
|
+
for (let i = 0; i < 8; i += 2) {
|
|
184
|
+
groups.push(parseInt(stripped.slice(i, i + 2), 16));
|
|
115
185
|
}
|
|
116
186
|
return new Address4(groups.join('.'));
|
|
117
187
|
}
|
|
118
188
|
/**
|
|
119
|
-
* Converts an integer into a IPv4 address object
|
|
120
|
-
*
|
|
121
|
-
*
|
|
189
|
+
* Converts an integer into a IPv4 address object. The integer must be a
|
|
190
|
+
* non-negative safe integer in the range `[0, 2**32 - 1]`; otherwise
|
|
191
|
+
* `AddressError` is thrown.
|
|
122
192
|
* @param {integer} integer - a number to convert
|
|
123
193
|
* @returns {Address4}
|
|
124
194
|
*/
|
|
125
195
|
static fromInteger(integer) {
|
|
126
|
-
|
|
196
|
+
if (!Number.isInteger(integer) || integer < 0 || integer > 0xffffffff) {
|
|
197
|
+
throw new address_error_1.AddressError('IPv4 integer must be in the range 0 to 2**32 - 1');
|
|
198
|
+
}
|
|
199
|
+
return Address4.fromHex(integer.toString(16).padStart(8, '0'));
|
|
127
200
|
}
|
|
128
201
|
/**
|
|
129
202
|
* Return an address from in-addr.arpa form
|
|
130
|
-
* @memberof Address4
|
|
131
|
-
* @static
|
|
132
203
|
* @param {string} arpaFormAddress - an 'in-addr.arpa' form ipv4 address
|
|
133
204
|
* @returns {Adress4}
|
|
134
205
|
* @example
|
|
@@ -143,17 +214,15 @@ class Address4 {
|
|
|
143
214
|
}
|
|
144
215
|
/**
|
|
145
216
|
* Converts an IPv4 address object to a hex string
|
|
146
|
-
* @memberof Address4
|
|
147
|
-
* @instance
|
|
148
217
|
* @returns {String}
|
|
149
218
|
*/
|
|
150
219
|
toHex() {
|
|
151
220
|
return this.parsedAddress.map((part) => common.stringToPaddedHex(part)).join(':');
|
|
152
221
|
}
|
|
153
222
|
/**
|
|
154
|
-
* Converts an IPv4 address object to an array of bytes
|
|
155
|
-
*
|
|
156
|
-
*
|
|
223
|
+
* Converts an IPv4 address object to an array of bytes.
|
|
224
|
+
*
|
|
225
|
+
* To get a Node.js `Buffer`, wrap the result: `Buffer.from(address.toArray())`.
|
|
157
226
|
* @returns {Array}
|
|
158
227
|
*/
|
|
159
228
|
toArray() {
|
|
@@ -161,8 +230,6 @@ class Address4 {
|
|
|
161
230
|
}
|
|
162
231
|
/**
|
|
163
232
|
* Converts an IPv4 address object to an IPv6 address group
|
|
164
|
-
* @memberof Address4
|
|
165
|
-
* @instance
|
|
166
233
|
* @returns {String}
|
|
167
234
|
*/
|
|
168
235
|
toGroup6() {
|
|
@@ -175,8 +242,6 @@ class Address4 {
|
|
|
175
242
|
}
|
|
176
243
|
/**
|
|
177
244
|
* Returns the address as a `bigint`
|
|
178
|
-
* @memberof Address4
|
|
179
|
-
* @instance
|
|
180
245
|
* @returns {bigint}
|
|
181
246
|
*/
|
|
182
247
|
bigInt() {
|
|
@@ -184,8 +249,6 @@ class Address4 {
|
|
|
184
249
|
}
|
|
185
250
|
/**
|
|
186
251
|
* Helper function getting start address.
|
|
187
|
-
* @memberof Address4
|
|
188
|
-
* @instance
|
|
189
252
|
* @returns {bigint}
|
|
190
253
|
*/
|
|
191
254
|
_startAddress() {
|
|
@@ -194,8 +257,6 @@ class Address4 {
|
|
|
194
257
|
/**
|
|
195
258
|
* The first address in the range given by this address' subnet.
|
|
196
259
|
* Often referred to as the Network Address.
|
|
197
|
-
* @memberof Address4
|
|
198
|
-
* @instance
|
|
199
260
|
* @returns {Address4}
|
|
200
261
|
*/
|
|
201
262
|
startAddress() {
|
|
@@ -204,8 +265,6 @@ class Address4 {
|
|
|
204
265
|
/**
|
|
205
266
|
* The first host address in the range given by this address's subnet ie
|
|
206
267
|
* the first address after the Network Address
|
|
207
|
-
* @memberof Address4
|
|
208
|
-
* @instance
|
|
209
268
|
* @returns {Address4}
|
|
210
269
|
*/
|
|
211
270
|
startAddressExclusive() {
|
|
@@ -214,8 +273,6 @@ class Address4 {
|
|
|
214
273
|
}
|
|
215
274
|
/**
|
|
216
275
|
* Helper function getting end address.
|
|
217
|
-
* @memberof Address4
|
|
218
|
-
* @instance
|
|
219
276
|
* @returns {bigint}
|
|
220
277
|
*/
|
|
221
278
|
_endAddress() {
|
|
@@ -224,8 +281,6 @@ class Address4 {
|
|
|
224
281
|
/**
|
|
225
282
|
* The last address in the range given by this address' subnet
|
|
226
283
|
* Often referred to as the Broadcast
|
|
227
|
-
* @memberof Address4
|
|
228
|
-
* @instance
|
|
229
284
|
* @returns {Address4}
|
|
230
285
|
*/
|
|
231
286
|
endAddress() {
|
|
@@ -234,8 +289,6 @@ class Address4 {
|
|
|
234
289
|
/**
|
|
235
290
|
* The last host address in the range given by this address's subnet ie
|
|
236
291
|
* the last address prior to the Broadcast Address
|
|
237
|
-
* @memberof Address4
|
|
238
|
-
* @instance
|
|
239
292
|
* @returns {Address4}
|
|
240
293
|
*/
|
|
241
294
|
endAddressExclusive() {
|
|
@@ -243,19 +296,47 @@ class Address4 {
|
|
|
243
296
|
return Address4.fromBigInt(this._endAddress() - adjust);
|
|
244
297
|
}
|
|
245
298
|
/**
|
|
246
|
-
*
|
|
247
|
-
*
|
|
248
|
-
* @
|
|
299
|
+
* The dotted-decimal form of the subnet mask, e.g. `255.255.240.0` for
|
|
300
|
+
* a `/20`. Returns an `Address4`; call `.correctForm()` for the string.
|
|
301
|
+
* @returns {Address4}
|
|
302
|
+
*/
|
|
303
|
+
subnetMaskAddress() {
|
|
304
|
+
return Address4.fromBigInt(BigInt(`0b${'1'.repeat(this.subnetMask)}${'0'.repeat(constants.BITS - this.subnetMask)}`));
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* The Cisco-style wildcard mask, e.g. `0.0.0.255` for a `/24`. This is
|
|
308
|
+
* the bitwise inverse of `subnetMaskAddress()`. Returns an `Address4`;
|
|
309
|
+
* call `.correctForm()` for the string.
|
|
310
|
+
* @returns {Address4}
|
|
311
|
+
*/
|
|
312
|
+
wildcardMask() {
|
|
313
|
+
return Address4.fromBigInt(BigInt(`0b${'0'.repeat(this.subnetMask)}${'1'.repeat(constants.BITS - this.subnetMask)}`));
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* The network address in CIDR string form, e.g. `192.168.1.0/24` for
|
|
317
|
+
* `192.168.1.5/24`. For an address with no explicit subnet the prefix is
|
|
318
|
+
* `/32`, e.g. `networkForm()` on `192.168.1.5` returns `192.168.1.5/32`.
|
|
319
|
+
* @returns {string}
|
|
320
|
+
*/
|
|
321
|
+
networkForm() {
|
|
322
|
+
return `${this.startAddress().correctForm()}/${this.subnetMask}`;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Converts a BigInt to a v4 address object. The value must be in the
|
|
326
|
+
* range `[0, 2**32 - 1]`; otherwise `AddressError` is thrown.
|
|
249
327
|
* @param {bigint} bigInt - a BigInt to convert
|
|
250
328
|
* @returns {Address4}
|
|
251
329
|
*/
|
|
252
330
|
static fromBigInt(bigInt) {
|
|
253
|
-
|
|
331
|
+
if (bigInt < 0n || bigInt > 0xffffffffn) {
|
|
332
|
+
throw new address_error_1.AddressError('IPv4 BigInt must be in the range 0 to 2**32 - 1');
|
|
333
|
+
}
|
|
334
|
+
return Address4.fromHex(bigInt.toString(16).padStart(8, '0'));
|
|
254
335
|
}
|
|
255
336
|
/**
|
|
256
|
-
* Convert a byte array to an Address4 object
|
|
257
|
-
*
|
|
258
|
-
*
|
|
337
|
+
* Convert a byte array to an Address4 object.
|
|
338
|
+
*
|
|
339
|
+
* To convert from a Node.js `Buffer`, spread it: `Address4.fromByteArray([...buf])`.
|
|
259
340
|
* @param {Array<number>} bytes - an array of 4 bytes (0-255)
|
|
260
341
|
* @returns {Address4}
|
|
261
342
|
*/
|
|
@@ -273,8 +354,6 @@ class Address4 {
|
|
|
273
354
|
}
|
|
274
355
|
/**
|
|
275
356
|
* Convert an unsigned byte array to an Address4 object
|
|
276
|
-
* @memberof Address4
|
|
277
|
-
* @static
|
|
278
357
|
* @param {Array<number>} bytes - an array of 4 unsigned bytes (0-255)
|
|
279
358
|
* @returns {Address4}
|
|
280
359
|
*/
|
|
@@ -288,8 +367,6 @@ class Address4 {
|
|
|
288
367
|
/**
|
|
289
368
|
* Returns the first n bits of the address, defaulting to the
|
|
290
369
|
* subnet mask
|
|
291
|
-
* @memberof Address4
|
|
292
|
-
* @instance
|
|
293
370
|
* @returns {String}
|
|
294
371
|
*/
|
|
295
372
|
mask(mask) {
|
|
@@ -300,8 +377,6 @@ class Address4 {
|
|
|
300
377
|
}
|
|
301
378
|
/**
|
|
302
379
|
* Returns the bits in the given range as a base-2 string
|
|
303
|
-
* @memberof Address4
|
|
304
|
-
* @instance
|
|
305
380
|
* @returns {string}
|
|
306
381
|
*/
|
|
307
382
|
getBitsBase2(start, end) {
|
|
@@ -309,10 +384,8 @@ class Address4 {
|
|
|
309
384
|
}
|
|
310
385
|
/**
|
|
311
386
|
* Return the reversed ip6.arpa form of the address
|
|
312
|
-
* @memberof Address4
|
|
313
387
|
* @param {Object} options
|
|
314
388
|
* @param {boolean} options.omitSuffix - omit the "in-addr.arpa" suffix
|
|
315
|
-
* @instance
|
|
316
389
|
* @returns {String}
|
|
317
390
|
*/
|
|
318
391
|
reverseForm(options) {
|
|
@@ -327,21 +400,62 @@ class Address4 {
|
|
|
327
400
|
}
|
|
328
401
|
/**
|
|
329
402
|
* Returns true if the given address is a multicast address
|
|
330
|
-
* @memberof Address4
|
|
331
|
-
* @instance
|
|
332
403
|
* @returns {boolean}
|
|
333
404
|
*/
|
|
334
405
|
isMulticast() {
|
|
335
|
-
return this.isInSubnet(
|
|
406
|
+
return this.isInSubnet(MULTICAST_V4);
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Returns true if the address is in one of the [RFC 1918](https://datatracker.ietf.org/doc/html/rfc1918) private address ranges (`10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`).
|
|
410
|
+
* @returns {boolean}
|
|
411
|
+
*/
|
|
412
|
+
isPrivate() {
|
|
413
|
+
return PRIVATE_V4.some((subnet) => this.isInSubnet(subnet));
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Returns true if the address is in the loopback range `127.0.0.0/8` ([RFC 1122](https://datatracker.ietf.org/doc/html/rfc1122)).
|
|
417
|
+
* @returns {boolean}
|
|
418
|
+
*/
|
|
419
|
+
isLoopback() {
|
|
420
|
+
return this.isInSubnet(LOOPBACK_V4);
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Returns true if the address is in the link-local range `169.254.0.0/16` ([RFC 3927](https://datatracker.ietf.org/doc/html/rfc3927)).
|
|
424
|
+
* @returns {boolean}
|
|
425
|
+
*/
|
|
426
|
+
isLinkLocal() {
|
|
427
|
+
return this.isInSubnet(LINK_LOCAL_V4);
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Returns true if the address is the unspecified address `0.0.0.0`.
|
|
431
|
+
* @returns {boolean}
|
|
432
|
+
*/
|
|
433
|
+
isUnspecified() {
|
|
434
|
+
return this.isInSubnet(UNSPECIFIED_V4);
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Returns true if the address is the limited broadcast address `255.255.255.255` ([RFC 919](https://datatracker.ietf.org/doc/html/rfc919)).
|
|
438
|
+
* @returns {boolean}
|
|
439
|
+
*/
|
|
440
|
+
isBroadcast() {
|
|
441
|
+
return this.isInSubnet(BROADCAST_V4);
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Returns true if the address is in the carrier-grade NAT range `100.64.0.0/10` ([RFC 6598](https://datatracker.ietf.org/doc/html/rfc6598)).
|
|
445
|
+
* @returns {boolean}
|
|
446
|
+
*/
|
|
447
|
+
isCGNAT() {
|
|
448
|
+
return this.isInSubnet(CGNAT_V4);
|
|
336
449
|
}
|
|
337
450
|
/**
|
|
338
451
|
* Returns a zero-padded base-2 string representation of the address
|
|
339
|
-
* @memberof Address4
|
|
340
|
-
* @instance
|
|
341
452
|
* @returns {string}
|
|
342
453
|
*/
|
|
343
454
|
binaryZeroPad() {
|
|
344
|
-
|
|
455
|
+
if (this._binaryZeroPad === undefined) {
|
|
456
|
+
this._binaryZeroPad = this.bigInt().toString(2).padStart(constants.BITS, '0');
|
|
457
|
+
}
|
|
458
|
+
return this._binaryZeroPad;
|
|
345
459
|
}
|
|
346
460
|
/**
|
|
347
461
|
* Groups an IPv4 address for inclusion at the end of an IPv6 address
|
|
@@ -357,4 +471,15 @@ class Address4 {
|
|
|
357
471
|
}
|
|
358
472
|
}
|
|
359
473
|
exports.Address4 = Address4;
|
|
474
|
+
const MULTICAST_V4 = new Address4('224.0.0.0/4');
|
|
475
|
+
const PRIVATE_V4 = [
|
|
476
|
+
new Address4('10.0.0.0/8'),
|
|
477
|
+
new Address4('172.16.0.0/12'),
|
|
478
|
+
new Address4('192.168.0.0/16'),
|
|
479
|
+
];
|
|
480
|
+
const LOOPBACK_V4 = new Address4('127.0.0.0/8');
|
|
481
|
+
const LINK_LOCAL_V4 = new Address4('169.254.0.0/16');
|
|
482
|
+
const UNSPECIFIED_V4 = new Address4('0.0.0.0/32');
|
|
483
|
+
const BROADCAST_V4 = new Address4('255.255.255.255/32');
|
|
484
|
+
const CGNAT_V4 = new Address4('100.64.0.0/10');
|
|
360
485
|
//# sourceMappingURL=ipv4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipv4.js","sourceRoot":"","sources":["../src/ipv4.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ipv4.js","sourceRoot":"","sources":["../src/ipv4.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-param-reassign */\n\nimport * as common from './common';\nimport * as constants from './v4/constants';\nimport { AddressError } from './address-error';\n\nconst isCorrect4 = common.isCorrect(constants.BITS);\n\n/**\n * Represents an IPv4 address\n * @param {string} address - An IPv4 address string\n */\nexport class Address4 {\n address: string;\n addressMinusSuffix?: string;\n groups: number = constants.GROUPS;\n parsedAddress: string[] = [];\n parsedSubnet: string = '';\n subnet: string = '/32';\n subnetMask: number = 32;\n v4: boolean = true;\n private _binaryZeroPad?: string;\n\n constructor(address: string) {\n this.address = address;\n\n const subnet = constants.RE_SUBNET_STRING.exec(address);\n\n if (subnet) {\n this.parsedSubnet = subnet[0].replace('/', '');\n this.subnetMask = parseInt(this.parsedSubnet, 10);\n this.subnet = `/${this.subnetMask}`;\n\n if (this.subnetMask < 0 || this.subnetMask > constants.BITS) {\n throw new AddressError('Invalid subnet mask.');\n }\n\n address = address.replace(constants.RE_SUBNET_STRING, '');\n }\n\n this.addressMinusSuffix = address;\n\n this.parsedAddress = this.parse(address);\n }\n\n /**\n * Returns true if the given string is a valid IPv4 address (with optional\n * CIDR subnet), false otherwise. Host bits in the subnet portion are\n * allowed (e.g. `192.168.1.5/24` is valid); for strict network-address\n * validation compare `correctForm()` to `startAddress().correctForm()`,\n * or use `networkForm()`.\n */\n static isValid(address: string): boolean {\n try {\n // eslint-disable-next-line no-new\n new Address4(address);\n\n return true;\n } catch (e) {\n return false;\n }\n }\n\n /**\n * Parses an IPv4 address string into its four octet groups and stores the\n * result on `this.parsedAddress`. Called automatically by the constructor;\n * you typically don't need to call it directly. Throws `AddressError` if\n * the input is not a valid IPv4 address.\n */\n parse(address: string) {\n const groups = address.split('.');\n\n if (!address.match(constants.RE_ADDRESS)) {\n throw new AddressError('Invalid IPv4 address.');\n }\n\n return groups;\n }\n\n /**\n * Returns the address in correct form: octets joined with `.` and any\n * leading zeros stripped (e.g. `192.168.1.1`). For IPv4 this matches the\n * canonical dotted-decimal representation.\n */\n correctForm(): string {\n return this.parsedAddress.map((part) => parseInt(part, 10)).join('.');\n }\n\n /**\n * Returns true if the address is correct, false otherwise\n * @returns {Boolean}\n */\n isCorrect = isCorrect4;\n\n /**\n * Construct an `Address4` from an address and a dotted-decimal subnet\n * mask given as separate strings (e.g. as returned by Node's\n * `os.networkInterfaces()`). Throws `AddressError` if the mask is\n * non-contiguous (e.g. `255.0.255.0`).\n * @example\n * var address = Address4.fromAddressAndMask('192.168.1.1', '255.255.255.0');\n * address.subnetMask; // 24\n */\n static fromAddressAndMask(address: string, mask: string): Address4 {\n const bits = common.prefixLengthFromMask(new Address4(mask).bigInt(), constants.BITS);\n return new Address4(`${address}/${bits}`);\n }\n\n /**\n * Construct an `Address4` from an address and a Cisco-style wildcard mask\n * given as separate strings (e.g. `0.0.0.255` for a `/24`). The wildcard\n * mask is the bitwise inverse of the subnet mask. Throws `AddressError`\n * if the mask is non-contiguous (e.g. `0.255.0.255`).\n * @example\n * var address = Address4.fromAddressAndWildcardMask('10.0.0.1', '0.0.0.255');\n * address.subnetMask; // 24\n */\n static fromAddressAndWildcardMask(address: string, wildcardMask: string): Address4 {\n const wildcard = new Address4(wildcardMask).bigInt();\n const allOnes = (BigInt(1) << BigInt(constants.BITS)) - BigInt(1);\n // eslint-disable-next-line no-bitwise\n const mask = wildcard ^ allOnes;\n const bits = common.prefixLengthFromMask(mask, constants.BITS);\n return new Address4(`${address}/${bits}`);\n }\n\n /**\n * Construct an `Address4` from a wildcard pattern with trailing `*`\n * octets. The number of trailing wildcards determines the prefix\n * length: each `*` represents 8 bits.\n *\n * Only trailing whole-octet wildcards are supported. Partial-octet\n * wildcards (e.g. `192.168.0.1*`) and interior wildcards (e.g.\n * `192.*.0.1`) throw `AddressError`.\n * @example\n * Address4.fromWildcard('192.168.0.*').subnet; // '/24'\n * Address4.fromWildcard('192.168.*.*').subnet; // '/16'\n * Address4.fromWildcard('*.*.*.*').subnet; // '/0'\n */\n static fromWildcard(input: string): Address4 {\n const groups = input.split('.');\n\n if (groups.length !== constants.GROUPS) {\n throw new AddressError('Wildcard pattern must have 4 octets');\n }\n\n let firstWildcard = -1;\n\n for (let i = 0; i < groups.length; i++) {\n if (groups[i] === '*') {\n if (firstWildcard === -1) {\n firstWildcard = i;\n }\n } else if (firstWildcard !== -1) {\n throw new AddressError(\n 'Wildcard `*` must only appear in trailing octets (e.g. `192.168.0.*`)',\n );\n }\n }\n\n const trailing = firstWildcard === -1 ? 0 : groups.length - firstWildcard;\n const replaced = groups.map((g) => (g === '*' ? '0' : g));\n const subnetBits = constants.BITS - trailing * 8;\n\n return new Address4(`${replaced.join('.')}/${subnetBits}`);\n }\n\n /**\n * Converts a hex string to an IPv4 address object. Accepts 8 hex digits\n * with optional `:` separators (e.g. `'7f000001'` or `'7f:00:00:01'`).\n * Throws `AddressError` for any other length or for non-hex characters.\n * @param {string} hex - a hex string to convert\n * @returns {Address4}\n */\n static fromHex(hex: string): Address4 {\n const stripped = hex.replace(/:/g, '');\n\n if (!/^[0-9a-fA-F]{8}$/.test(stripped)) {\n throw new AddressError('IPv4 hex must be exactly 8 hex digits');\n }\n\n const groups = [];\n\n for (let i = 0; i < 8; i += 2) {\n groups.push(parseInt(stripped.slice(i, i + 2), 16));\n }\n\n return new Address4(groups.join('.'));\n }\n\n /**\n * Converts an integer into a IPv4 address object. The integer must be a\n * non-negative safe integer in the range `[0, 2**32 - 1]`; otherwise\n * `AddressError` is thrown.\n * @param {integer} integer - a number to convert\n * @returns {Address4}\n */\n static fromInteger(integer: number): Address4 {\n if (!Number.isInteger(integer) || integer < 0 || integer > 0xffffffff) {\n throw new AddressError('IPv4 integer must be in the range 0 to 2**32 - 1');\n }\n\n return Address4.fromHex(integer.toString(16).padStart(8, '0'));\n }\n\n /**\n * Return an address from in-addr.arpa form\n * @param {string} arpaFormAddress - an 'in-addr.arpa' form ipv4 address\n * @returns {Adress4}\n * @example\n * var address = Address4.fromArpa(42.2.0.192.in-addr.arpa.)\n * address.correctForm(); // '192.0.2.42'\n */\n static fromArpa(arpaFormAddress: string): Address4 {\n // remove ending \".in-addr.arpa.\" or just \".\"\n const leader = arpaFormAddress.replace(/(\\.in-addr\\.arpa)?\\.$/, '');\n\n const address = leader.split('.').reverse().join('.');\n\n return new Address4(address);\n }\n\n /**\n * Converts an IPv4 address object to a hex string\n * @returns {String}\n */\n toHex(): string {\n return this.parsedAddress.map((part) => common.stringToPaddedHex(part)).join(':');\n }\n\n /**\n * Converts an IPv4 address object to an array of bytes.\n *\n * To get a Node.js `Buffer`, wrap the result: `Buffer.from(address.toArray())`.\n * @returns {Array}\n */\n toArray(): number[] {\n return this.parsedAddress.map((part) => parseInt(part, 10));\n }\n\n /**\n * Converts an IPv4 address object to an IPv6 address group\n * @returns {String}\n */\n toGroup6(): string {\n const output = [];\n let i;\n\n for (i = 0; i < constants.GROUPS; i += 2) {\n output.push(\n `${common.stringToPaddedHex(this.parsedAddress[i])}${common.stringToPaddedHex(\n this.parsedAddress[i + 1],\n )}`,\n );\n }\n\n return output.join(':');\n }\n\n /**\n * Returns the address as a `bigint`\n * @returns {bigint}\n */\n bigInt(): bigint {\n return BigInt(`0x${this.parsedAddress.map((n) => common.stringToPaddedHex(n)).join('')}`);\n }\n\n /**\n * Helper function getting start address.\n * @returns {bigint}\n */\n _startAddress(): bigint {\n return BigInt(`0b${this.mask() + '0'.repeat(constants.BITS - this.subnetMask)}`);\n }\n\n /**\n * The first address in the range given by this address' subnet.\n * Often referred to as the Network Address.\n * @returns {Address4}\n */\n startAddress(): Address4 {\n return Address4.fromBigInt(this._startAddress());\n }\n\n /**\n * The first host address in the range given by this address's subnet ie\n * the first address after the Network Address\n * @returns {Address4}\n */\n startAddressExclusive(): Address4 {\n const adjust = BigInt('1');\n return Address4.fromBigInt(this._startAddress() + adjust);\n }\n\n /**\n * Helper function getting end address.\n * @returns {bigint}\n */\n _endAddress(): bigint {\n return BigInt(`0b${this.mask() + '1'.repeat(constants.BITS - this.subnetMask)}`);\n }\n\n /**\n * The last address in the range given by this address' subnet\n * Often referred to as the Broadcast\n * @returns {Address4}\n */\n endAddress(): Address4 {\n return Address4.fromBigInt(this._endAddress());\n }\n\n /**\n * The last host address in the range given by this address's subnet ie\n * the last address prior to the Broadcast Address\n * @returns {Address4}\n */\n endAddressExclusive(): Address4 {\n const adjust = BigInt('1');\n return Address4.fromBigInt(this._endAddress() - adjust);\n }\n\n /**\n * The dotted-decimal form of the subnet mask, e.g. `255.255.240.0` for\n * a `/20`. Returns an `Address4`; call `.correctForm()` for the string.\n * @returns {Address4}\n */\n subnetMaskAddress(): Address4 {\n return Address4.fromBigInt(\n BigInt(`0b${'1'.repeat(this.subnetMask)}${'0'.repeat(constants.BITS - this.subnetMask)}`),\n );\n }\n\n /**\n * The Cisco-style wildcard mask, e.g. `0.0.0.255` for a `/24`. This is\n * the bitwise inverse of `subnetMaskAddress()`. Returns an `Address4`;\n * call `.correctForm()` for the string.\n * @returns {Address4}\n */\n wildcardMask(): Address4 {\n return Address4.fromBigInt(\n BigInt(`0b${'0'.repeat(this.subnetMask)}${'1'.repeat(constants.BITS - this.subnetMask)}`),\n );\n }\n\n /**\n * The network address in CIDR string form, e.g. `192.168.1.0/24` for\n * `192.168.1.5/24`. For an address with no explicit subnet the prefix is\n * `/32`, e.g. `networkForm()` on `192.168.1.5` returns `192.168.1.5/32`.\n * @returns {string}\n */\n networkForm(): string {\n return `${this.startAddress().correctForm()}/${this.subnetMask}`;\n }\n\n /**\n * Converts a BigInt to a v4 address object. The value must be in the\n * range `[0, 2**32 - 1]`; otherwise `AddressError` is thrown.\n * @param {bigint} bigInt - a BigInt to convert\n * @returns {Address4}\n */\n static fromBigInt(bigInt: bigint): Address4 {\n if (bigInt < 0n || bigInt > 0xffffffffn) {\n throw new AddressError('IPv4 BigInt must be in the range 0 to 2**32 - 1');\n }\n\n return Address4.fromHex(bigInt.toString(16).padStart(8, '0'));\n }\n\n /**\n * Convert a byte array to an Address4 object.\n *\n * To convert from a Node.js `Buffer`, spread it: `Address4.fromByteArray([...buf])`.\n * @param {Array<number>} bytes - an array of 4 bytes (0-255)\n * @returns {Address4}\n */\n static fromByteArray(bytes: Array<number>): Address4 {\n if (bytes.length !== 4) {\n throw new AddressError('IPv4 addresses require exactly 4 bytes');\n }\n\n // Validate that all bytes are within valid range (0-255)\n for (let i = 0; i < bytes.length; i++) {\n if (!Number.isInteger(bytes[i]) || bytes[i] < 0 || bytes[i] > 255) {\n throw new AddressError('All bytes must be integers between 0 and 255');\n }\n }\n\n return this.fromUnsignedByteArray(bytes);\n }\n\n /**\n * Convert an unsigned byte array to an Address4 object\n * @param {Array<number>} bytes - an array of 4 unsigned bytes (0-255)\n * @returns {Address4}\n */\n static fromUnsignedByteArray(bytes: Array<number>): Address4 {\n if (bytes.length !== 4) {\n throw new AddressError('IPv4 addresses require exactly 4 bytes');\n }\n\n const address = bytes.join('.');\n return new Address4(address);\n }\n\n /**\n * Returns the first n bits of the address, defaulting to the\n * subnet mask\n * @returns {String}\n */\n mask(mask?: number): string {\n if (mask === undefined) {\n mask = this.subnetMask;\n }\n\n return this.getBitsBase2(0, mask);\n }\n\n /**\n * Returns the bits in the given range as a base-2 string\n * @returns {string}\n */\n getBitsBase2(start: number, end: number): string {\n return this.binaryZeroPad().slice(start, end);\n }\n\n /**\n * Return the reversed ip6.arpa form of the address\n * @param {Object} options\n * @param {boolean} options.omitSuffix - omit the \"in-addr.arpa\" suffix\n * @returns {String}\n */\n reverseForm(options?: common.ReverseFormOptions): string {\n if (!options) {\n options = {};\n }\n\n const reversed = this.correctForm().split('.').reverse().join('.');\n\n if (options.omitSuffix) {\n return reversed;\n }\n\n return `${reversed}.in-addr.arpa.`;\n }\n\n /**\n * Returns true if the given address is in the subnet of the current address\n * @returns {boolean}\n */\n isInSubnet = common.isInSubnet;\n\n /**\n * Returns true if the given address is a multicast address\n * @returns {boolean}\n */\n isMulticast(): boolean {\n return this.isInSubnet(MULTICAST_V4);\n }\n\n /**\n * Returns true if the address is in one of the [RFC 1918](https://datatracker.ietf.org/doc/html/rfc1918) private address ranges (`10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`).\n * @returns {boolean}\n */\n isPrivate(): boolean {\n return PRIVATE_V4.some((subnet) => this.isInSubnet(subnet));\n }\n\n /**\n * Returns true if the address is in the loopback range `127.0.0.0/8` ([RFC 1122](https://datatracker.ietf.org/doc/html/rfc1122)).\n * @returns {boolean}\n */\n isLoopback(): boolean {\n return this.isInSubnet(LOOPBACK_V4);\n }\n\n /**\n * Returns true if the address is in the link-local range `169.254.0.0/16` ([RFC 3927](https://datatracker.ietf.org/doc/html/rfc3927)).\n * @returns {boolean}\n */\n isLinkLocal(): boolean {\n return this.isInSubnet(LINK_LOCAL_V4);\n }\n\n /**\n * Returns true if the address is the unspecified address `0.0.0.0`.\n * @returns {boolean}\n */\n isUnspecified(): boolean {\n return this.isInSubnet(UNSPECIFIED_V4);\n }\n\n /**\n * Returns true if the address is the limited broadcast address `255.255.255.255` ([RFC 919](https://datatracker.ietf.org/doc/html/rfc919)).\n * @returns {boolean}\n */\n isBroadcast(): boolean {\n return this.isInSubnet(BROADCAST_V4);\n }\n\n /**\n * Returns true if the address is in the carrier-grade NAT range `100.64.0.0/10` ([RFC 6598](https://datatracker.ietf.org/doc/html/rfc6598)).\n * @returns {boolean}\n */\n isCGNAT(): boolean {\n return this.isInSubnet(CGNAT_V4);\n }\n\n /**\n * Returns a zero-padded base-2 string representation of the address\n * @returns {string}\n */\n binaryZeroPad(): string {\n if (this._binaryZeroPad === undefined) {\n this._binaryZeroPad = this.bigInt().toString(2).padStart(constants.BITS, '0');\n }\n return this._binaryZeroPad;\n }\n\n /**\n * Groups an IPv4 address for inclusion at the end of an IPv6 address\n * @returns {String}\n */\n groupForV6(): string {\n const segments = this.parsedAddress;\n\n return this.address.replace(\n constants.RE_ADDRESS,\n `<span class=\"hover-group group-v4 group-6\">${segments\n .slice(0, 2)\n .join('.')}</span>.<span class=\"hover-group group-v4 group-7\">${segments\n .slice(2, 4)\n .join('.')}</span>`,\n );\n }\n}\n\nconst MULTICAST_V4 = new Address4('224.0.0.0/4');\nconst PRIVATE_V4 = [\n new Address4('10.0.0.0/8'),\n new Address4('172.16.0.0/12'),\n new Address4('192.168.0.0/16'),\n];\nconst LOOPBACK_V4 = new Address4('127.0.0.0/8');\nconst LINK_LOCAL_V4 = new Address4('169.254.0.0/16');\nconst UNSPECIFIED_V4 = new Address4('0.0.0.0/32');\nconst BROADCAST_V4 = new Address4('255.255.255.255/32');\nconst CGNAT_V4 = new Address4('100.64.0.0/10');\n"]}
|