Skip to content

Commit f31ea44

Browse files
maxmiltonryoppippi
authored andcommitted
feat: Carry over node isIPv4/isIPv6 performance improvements (oven-sh#8271)
Copy over the `isIPv4`/`isIPv6` performance improvements from <nodejs/node#49568>.
1 parent a8c8db6 commit f31ea44

File tree

2 files changed

+20
-20
lines changed

2 files changed

+20
-20
lines changed

src/js/node/net.js

+10-10
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ const { Duplex } = require("node:stream");
2323
const EventEmitter = require("node:events");
2424

2525
// IPv4 Segment
26-
const v4Seg = "(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])";
27-
const v4Str = `(${v4Seg}[.]){3}${v4Seg}`;
26+
const v4Seg = "(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])";
27+
const v4Str = `(?:${v4Seg}\\.){3}${v4Seg}`;
2828
var IPv4Reg;
2929

3030
// IPv6 Segment
@@ -37,16 +37,16 @@ function isIPv4(s) {
3737

3838
function isIPv6(s) {
3939
return (IPv6Reg ??= new RegExp(
40-
"^(" +
40+
"^(?:" +
4141
`(?:${v6Seg}:){7}(?:${v6Seg}|:)|` +
4242
`(?:${v6Seg}:){6}(?:${v4Str}|:${v6Seg}|:)|` +
43-
`(?:${v6Seg}:){5}(?::${v4Str}|(:${v6Seg}){1,2}|:)|` +
44-
`(?:${v6Seg}:){4}(?:(:${v6Seg}){0,1}:${v4Str}|(:${v6Seg}){1,3}|:)|` +
45-
`(?:${v6Seg}:){3}(?:(:${v6Seg}){0,2}:${v4Str}|(:${v6Seg}){1,4}|:)|` +
46-
`(?:${v6Seg}:){2}(?:(:${v6Seg}){0,3}:${v4Str}|(:${v6Seg}){1,5}|:)|` +
47-
`(?:${v6Seg}:){1}(?:(:${v6Seg}){0,4}:${v4Str}|(:${v6Seg}){1,6}|:)|` +
48-
`(?::((?::${v6Seg}){0,5}:${v4Str}|(?::${v6Seg}){1,7}|:))` +
49-
")(%[0-9a-zA-Z-.:]{1,})?$",
43+
`(?:${v6Seg}:){5}(?::${v4Str}|(?::${v6Seg}){1,2}|:)|` +
44+
`(?:${v6Seg}:){4}(?:(?::${v6Seg}){0,1}:${v4Str}|(?::${v6Seg}){1,3}|:)|` +
45+
`(?:${v6Seg}:){3}(?:(?::${v6Seg}){0,2}:${v4Str}|(?::${v6Seg}){1,4}|:)|` +
46+
`(?:${v6Seg}:){2}(?:(?::${v6Seg}){0,3}:${v4Str}|(?::${v6Seg}){1,5}|:)|` +
47+
`(?:${v6Seg}:){1}(?:(?::${v6Seg}){0,4}:${v4Str}|(?::${v6Seg}){1,6}|:)|` +
48+
`(?::(?:(?::${v6Seg}){0,5}:${v4Str}|(?::${v6Seg}){1,7}|:))` +
49+
")(?:%[0-9a-zA-Z-.:]{1,})?$",
5050
)).test(s);
5151
}
5252

src/node-fallbacks/net.js

+10-10
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,23 @@
2020
// USE OR OTHER DEALINGS IN THE SOFTWARE.
2121

2222
// IPv4 Segment
23-
const v4Seg = "(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])";
24-
const v4Str = `(${v4Seg}[.]){3}${v4Seg}`;
23+
const v4Seg = "(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])";
24+
const v4Str = `(?:${v4Seg}\\.){3}${v4Seg}`;
2525
const IPv4Reg = new RegExp(`^${v4Str}$`);
2626

2727
// IPv6 Segment
2828
const v6Seg = "(?:[0-9a-fA-F]{1,4})";
2929
const IPv6Reg = new RegExp(
30-
"^(" +
30+
"^(?:" +
3131
`(?:${v6Seg}:){7}(?:${v6Seg}|:)|` +
3232
`(?:${v6Seg}:){6}(?:${v4Str}|:${v6Seg}|:)|` +
33-
`(?:${v6Seg}:){5}(?::${v4Str}|(:${v6Seg}){1,2}|:)|` +
34-
`(?:${v6Seg}:){4}(?:(:${v6Seg}){0,1}:${v4Str}|(:${v6Seg}){1,3}|:)|` +
35-
`(?:${v6Seg}:){3}(?:(:${v6Seg}){0,2}:${v4Str}|(:${v6Seg}){1,4}|:)|` +
36-
`(?:${v6Seg}:){2}(?:(:${v6Seg}){0,3}:${v4Str}|(:${v6Seg}){1,5}|:)|` +
37-
`(?:${v6Seg}:){1}(?:(:${v6Seg}){0,4}:${v4Str}|(:${v6Seg}){1,6}|:)|` +
38-
`(?::((?::${v6Seg}){0,5}:${v4Str}|(?::${v6Seg}){1,7}|:))` +
39-
")(%[0-9a-zA-Z-.:]{1,})?$",
33+
`(?:${v6Seg}:){5}(?::${v4Str}|(?::${v6Seg}){1,2}|:)|` +
34+
`(?:${v6Seg}:){4}(?:(?::${v6Seg}){0,1}:${v4Str}|(?::${v6Seg}){1,3}|:)|` +
35+
`(?:${v6Seg}:){3}(?:(?::${v6Seg}){0,2}:${v4Str}|(?::${v6Seg}){1,4}|:)|` +
36+
`(?:${v6Seg}:){2}(?:(?::${v6Seg}){0,3}:${v4Str}|(?::${v6Seg}){1,5}|:)|` +
37+
`(?:${v6Seg}:){1}(?:(?::${v6Seg}){0,4}:${v4Str}|(?::${v6Seg}){1,6}|:)|` +
38+
`(?::(?:(?::${v6Seg}){0,5}:${v4Str}|(?::${v6Seg}){1,7}|:))` +
39+
")(?:%[0-9a-zA-Z-.:]{1,})?$",
4040
);
4141

4242
export function isIPv4(s) {

0 commit comments

Comments
 (0)