53 lines
No EOL
1.8 KiB
JavaScript
53 lines
No EOL
1.8 KiB
JavaScript
import { Parser } from "./parser.js";
|
|
// See https://stackoverflow.com/questions/166132/maximum-length-of-the-textual-representation-of-an-ipv6-address
|
|
const MAX_IPV6_LENGTH = 45;
|
|
const MAX_IPV4_LENGTH = 15;
|
|
const parser = new Parser();
|
|
/** Parse `input` into IPv4 bytes. */
|
|
export function parseIPv4(input) {
|
|
if (input.length > MAX_IPV4_LENGTH) {
|
|
return undefined;
|
|
}
|
|
return parser.new(input).parseWith(() => parser.readIPv4Addr());
|
|
}
|
|
/** Parse IPv4 `input` into IPv6 with IPv4-mapped bytes, eg ::ffff:1.2.3.4 */
|
|
export function parseIPv4Mapped(input) {
|
|
if (input.length > MAX_IPV4_LENGTH) {
|
|
return undefined;
|
|
}
|
|
const ipv4 = parser.new(input).parseWith(() => parser.readIPv4Addr());
|
|
if (ipv4 === undefined) {
|
|
return undefined;
|
|
}
|
|
return Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, ipv4[0], ipv4[1], ipv4[2], ipv4[3]]);
|
|
}
|
|
/** Parse `input` into IPv6 bytes. */
|
|
export function parseIPv6(input) {
|
|
// strip zone index if it is present
|
|
if (input.includes("%")) {
|
|
input = input.split("%")[0];
|
|
}
|
|
if (input.length > MAX_IPV6_LENGTH) {
|
|
return undefined;
|
|
}
|
|
return parser.new(input).parseWith(() => parser.readIPv6Addr());
|
|
}
|
|
/** Parse `input` into IPv4 or IPv6 bytes. */
|
|
export function parseIP(input, mapIPv4ToIPv6 = false) {
|
|
// strip zone index if it is present
|
|
if (input.includes("%")) {
|
|
input = input.split("%")[0];
|
|
}
|
|
if (input.length > MAX_IPV6_LENGTH) {
|
|
return undefined;
|
|
}
|
|
const addr = parser.new(input).parseWith(() => parser.readIPAddr());
|
|
if (!addr) {
|
|
return undefined;
|
|
}
|
|
if (mapIPv4ToIPv6 && addr.length === 4) {
|
|
return Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, addr[0], addr[1], addr[2], addr[3]]);
|
|
}
|
|
return addr;
|
|
}
|
|
//# sourceMappingURL=parse.js.map
|