@@ -379,11 +379,50 @@ class Server {
379
379
}
380
380
381
381
/**
382
- * @param {string } gateway
382
+ * @param {string } gatewayOrFamily or family
383
+ * @param {boolean } [isInternal=false] ip should be internal
383
384
* @returns {string | undefined }
384
385
*/
385
- static findIp ( gateway ) {
386
- const gatewayIp = ipaddr . parse ( gateway ) ;
386
+ static findIp ( gatewayOrFamily , isInternal = false ) {
387
+ if ( gatewayOrFamily === "v4" || gatewayOrFamily === "v6" ) {
388
+ let host ;
389
+
390
+ Object . values ( os . networkInterfaces ( ) )
391
+ . flatMap ( ( networks ) => networks ?? [ ] )
392
+ . filter ( ( network ) => {
393
+ if ( ! network || ! network . address ) {
394
+ return false ;
395
+ }
396
+
397
+ if ( network . family !== `IP${ gatewayOrFamily } ` ) {
398
+ return false ;
399
+ }
400
+
401
+ if ( network . internal !== isInternal ) {
402
+ return false ;
403
+ }
404
+
405
+ if ( gatewayOrFamily === "v6" ) {
406
+ const range = ipaddr . parse ( network . address ) . range ( ) ;
407
+
408
+ if ( range !== "ipv4Mapped" && range !== "uniqueLocal" ) {
409
+ return false ;
410
+ }
411
+ }
412
+
413
+ return network . address ;
414
+ } )
415
+ . forEach ( ( network ) => {
416
+ host = network . address ;
417
+ if ( host . includes ( ":" ) ) {
418
+ host = `[${ host } ]` ;
419
+ }
420
+ } ) ;
421
+
422
+ return host ;
423
+ }
424
+
425
+ const gatewayIp = ipaddr . parse ( gatewayOrFamily ) ;
387
426
388
427
// Look for the matching interface in all local interfaces.
389
428
for ( const addresses of Object . values ( os . networkInterfaces ( ) ) ) {
@@ -403,32 +442,22 @@ class Server {
403
442
}
404
443
}
405
444
445
+ // TODO remove me in the next major release, we have `findIp`
406
446
/**
407
447
* @param {"v4" | "v6" } family
408
448
* @returns {Promise<string | undefined> }
409
449
*/
410
450
static async internalIP ( family ) {
411
- try {
412
- const { gateway } = await require ( "default-gateway" ) [ family ] ( ) ;
413
-
414
- return Server . findIp ( gateway ) ;
415
- } catch {
416
- // ignore
417
- }
451
+ return Server . findIp ( family ) ;
418
452
}
419
453
454
+ // TODO remove me in the next major release, we have `findIp`
420
455
/**
421
456
* @param {"v4" | "v6" } family
422
457
* @returns {string | undefined }
423
458
*/
424
459
static internalIPSync ( family ) {
425
- try {
426
- const { gateway } = require ( "default-gateway" ) [ family ] . sync ( ) ;
427
-
428
- return Server . findIp ( gateway ) ;
429
- } catch {
430
- // ignore
431
- }
460
+ return Server . findIp ( family ) ;
432
461
}
433
462
434
463
/**
@@ -437,15 +466,11 @@ class Server {
437
466
*/
438
467
static async getHostname ( hostname ) {
439
468
if ( hostname === "local-ip" ) {
440
- return (
441
- ( await Server . internalIP ( "v4" ) ) ||
442
- ( await Server . internalIP ( "v6" ) ) ||
443
- "0.0.0.0"
444
- ) ;
469
+ return Server . findIp ( "v4" ) || Server . findIp ( "v6" ) || "0.0.0.0" ;
445
470
} else if ( hostname === "local-ipv4" ) {
446
- return ( await Server . internalIP ( "v4" ) ) || "0.0.0.0" ;
471
+ return Server . findIp ( "v4" ) || "0.0.0.0" ;
447
472
} else if ( hostname === "local-ipv6" ) {
448
- return ( await Server . internalIP ( "v6" ) ) || "::" ;
473
+ return Server . findIp ( "v6" ) || "::" ;
449
474
}
450
475
451
476
return hostname ;
@@ -2777,13 +2802,13 @@ class Server {
2777
2802
if ( parsedIP . range ( ) === "unspecified" ) {
2778
2803
localhost = prettyPrintURL ( "localhost" ) ;
2779
2804
2780
- const networkIPv4 = await Server . internalIP ( "v4" ) ;
2805
+ const networkIPv4 = Server . findIp ( "v4" ) ;
2781
2806
2782
2807
if ( networkIPv4 ) {
2783
2808
networkUrlIPv4 = prettyPrintURL ( networkIPv4 ) ;
2784
2809
}
2785
2810
2786
- const networkIPv6 = await Server . internalIP ( "v6" ) ;
2811
+ const networkIPv6 = Server . findIp ( "v6" ) ;
2787
2812
2788
2813
if ( networkIPv6 ) {
2789
2814
networkUrlIPv6 = prettyPrintURL ( networkIPv6 ) ;
0 commit comments