feat(smartnetwork): Add exclude option to findFreePort and skip excluded ports during search
This commit is contained in:
@@ -1,5 +1,12 @@
|
||||
# Changelog
|
||||
|
||||
## 2025-09-12 - 4.4.0 - feat(smartnetwork)
|
||||
Add exclude option to findFreePort and skip excluded ports during search
|
||||
|
||||
- Add an 'exclude' array to IFindFreePortOptions so callers can specify ports to ignore when searching for a free port.
|
||||
- Respect excluded ports in findFreePort for both random (randomize=true) and sequential searches so excluded ports are never returned.
|
||||
- Add .claude/settings.local.json to include local permissions used for development/CI helpers.
|
||||
|
||||
## 2025-09-12 - 4.3.0 - feat(smartnetwork)
|
||||
Add randomizable port search and switch DNS resolution to @push.rocks/smartdns; export smartdns and update docs
|
||||
|
||||
|
14
readme.md
14
readme.md
@@ -99,6 +99,19 @@ const findFreePort = async () => {
|
||||
// Find a random free port in range (useful to avoid port conflicts)
|
||||
const randomPort = await network.findFreePort(3000, 3100, { randomize: true });
|
||||
console.log(`🎲 Random free port: ${randomPort}`);
|
||||
|
||||
// Exclude specific ports from the search
|
||||
const portWithExclusions = await network.findFreePort(3000, 3100, {
|
||||
exclude: [3000, 3001, 3005] // Skip these ports even if they're free
|
||||
});
|
||||
console.log(`🚫 Free port (excluding specific ports): ${portWithExclusions}`);
|
||||
|
||||
// Combine randomize with exclude options
|
||||
const randomWithExclusions = await network.findFreePort(3000, 3100, {
|
||||
randomize: true,
|
||||
exclude: [3000, 3001, 3005]
|
||||
});
|
||||
console.log(`🎲🚫 Random free port (with exclusions): ${randomWithExclusions}`);
|
||||
};
|
||||
```
|
||||
|
||||
@@ -333,6 +346,7 @@ interface SmartNetworkOptions {
|
||||
|
||||
interface IFindFreePortOptions {
|
||||
randomize?: boolean; // If true, returns a random free port instead of the first one
|
||||
exclude?: number[]; // Array of port numbers to exclude from the search
|
||||
}
|
||||
|
||||
interface Hop {
|
||||
|
@@ -3,6 +3,6 @@
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@push.rocks/smartnetwork',
|
||||
version: '4.3.0',
|
||||
version: '4.4.0',
|
||||
description: 'A toolkit for network diagnostics including speed tests, port availability checks, and more.'
|
||||
}
|
||||
|
@@ -31,6 +31,8 @@ export interface Hop {
|
||||
export interface IFindFreePortOptions {
|
||||
/** If true, selects a random available port within the range instead of the first one */
|
||||
randomize?: boolean;
|
||||
/** Array of port numbers to exclude from the search */
|
||||
exclude?: number[];
|
||||
}
|
||||
|
||||
export class SmartNetwork {
|
||||
@@ -169,12 +171,20 @@ export class SmartNetwork {
|
||||
throw new NetworkError('Start port must be less than or equal to end port', 'EINVAL');
|
||||
}
|
||||
|
||||
// Create a set of excluded ports for efficient lookup
|
||||
const excludedPorts = new Set(options?.exclude || []);
|
||||
|
||||
// If randomize option is true, collect all available ports and select randomly
|
||||
if (options?.randomize) {
|
||||
const availablePorts: number[] = [];
|
||||
|
||||
// Scan the range to find all available ports
|
||||
for (let port = startPort; port <= endPort; port++) {
|
||||
// Skip excluded ports
|
||||
if (excludedPorts.has(port)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const isUnused = await this.isLocalPortUnused(port);
|
||||
if (isUnused) {
|
||||
availablePorts.push(port);
|
||||
@@ -192,6 +202,11 @@ export class SmartNetwork {
|
||||
} else {
|
||||
// Default behavior: return the first available port (sequential search)
|
||||
for (let port = startPort; port <= endPort; port++) {
|
||||
// Skip excluded ports
|
||||
if (excludedPorts.has(port)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const isUnused = await this.isLocalPortUnused(port);
|
||||
if (isUnused) {
|
||||
return port;
|
||||
|
Reference in New Issue
Block a user