Mirror: Best-effort discovery of the machine's local network using just Node.js dgram sockets

fix: Ignore internal interfaces when probing routes (VPNs) (#7)

* Ignore internal assignments for probed routes

* Add changeset

* Determine internal interfaces with mac address as well

Changed files
+15 -2
.changeset
src
+5
.changeset/fair-cows-perform.md
···
+
---
+
'lan-network': patch
+
---
+
+
When matching a probed route, ignore internal interfaces. The probed route will match a VPN (virtual) interface when using it to tunnel all traffic, but is unlikely to be considered the local network by users.
+5 -1
src/index.ts
···
DEFAULT_ASSIGNMENT,
interfaceAssignments,
matchAssignment,
+
isInternal,
} from './network';
import type { GatewayAssignment } from './types';
···
try {
const defaultRoute = await probeDefaultRoute();
// If this route matches a known assignment, return it without a gateway
-
if ((assignment = matchAssignment(assignments, defaultRoute))) {
+
if (
+
(assignment = matchAssignment(assignments, defaultRoute)) &&
+
!isInternal(assignment)
+
) {
return assignment;
}
} catch {
+5 -1
src/network.ts
···
else return 0;
};
+
/** Determines if an assignment is internal (indicated by the flag or by a zeroed mac address) */
+
export const isInternal = (assignment: NetworkAssignment) =>
+
assignment.internal || parseMacStr(assignment.mac).every(x => !x);
+
export const interfaceAssignments = (): NetworkAssignment[] => {
const candidates: NetworkAssignment[] = [];
const interfaces = os.networkInterfaces();
···
// Prioritise external interfaces, then sort by priority,
// when priority is equal, sort by raw IP values
const sortBy =
-
+a.internal - +b.internal ||
+
+isInternal(a) - +isInternal(b) ||
priorityB - priorityA ||
parseIpStr(b.address) - parseIpStr(a.address);
return sortBy;