UNPKG

advanced-js-kit

Version:

Modern TypeScript utility library with tree-shaking support - Array, String, Number, Network, Sleep, and JWT utilities for JavaScript and TypeScript projects

1 lines 16.3 kB
{"version":3,"sources":["../../../src/universal/utils/index.ts","../../../src/node/network/index.ts"],"names":["isPortReachable"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Environment detection utilities\r\n */\r\n\r\n/**\r\n * Determines if the current environment is Node.js\r\n * @returns true if running in Node.js, false otherwise\r\n */\r\nexport function isNodeEnvironment(): boolean {\r\n return typeof process !== 'undefined' && \r\n process.versions != null && \r\n process.versions.node != null;\r\n}\r\n\r\n/**\r\n * Determines if the current environment is a browser\r\n * @returns true if running in a browser, false otherwise\r\n */\r\nexport function isBrowserEnvironment(): boolean {\r\n return typeof window !== 'undefined' && \r\n typeof document !== 'undefined';\r\n}\r\n\r\n/**\r\n * Determines if the current environment is a web worker\r\n * @returns true if running in a web worker, false otherwise\r\n */\r\nexport function isWebWorkerEnvironment(): boolean {\r\n return typeof (globalThis as any).importScripts === 'function' && \r\n typeof window === 'undefined';\r\n}\r\n\r\n/**\r\n * Gets the current runtime environment\r\n * @returns 'node' | 'browser' | 'webworker' | 'unknown'\r\n */\r\nexport function getEnvironment(): 'node' | 'browser' | 'webworker' | 'unknown' {\r\n if (isNodeEnvironment()) return 'node';\r\n if (isBrowserEnvironment()) return 'browser';\r\n if (isWebWorkerEnvironment()) return 'webworker';\r\n return 'unknown';\r\n}\r\n\r\n/**\r\n * Error thrown when functionality is not supported in the current environment\r\n */\r\nexport class EnvironmentError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly requiredEnvironment: string,\r\n public readonly currentEnvironment: string\r\n ) {\r\n super(message);\r\n this.name = 'EnvironmentError';\r\n }\r\n}\r\n\r\n/**\r\n * Asserts that the current environment is Node.js\r\n * @throws {EnvironmentError} if not running in Node.js\r\n */\r\nexport function assertNodeEnvironment(): void {\r\n if (!isNodeEnvironment()) {\r\n throw new EnvironmentError(\r\n 'This functionality requires Node.js environment',\r\n 'node',\r\n getEnvironment()\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Asserts that the current environment is a browser\r\n * @throws {EnvironmentError} if not running in a browser\r\n */\r\nexport function assertBrowserEnvironment(): void {\r\n if (!isBrowserEnvironment()) {\r\n throw new EnvironmentError(\r\n 'This functionality requires browser environment',\r\n 'browser',\r\n getEnvironment()\r\n );\r\n }\r\n}\r\n","import isPortReachable from \"is-port-reachable\";\r\nimport { assertNodeEnvironment, EnvironmentError } from \"../../universal/utils\";\r\n\r\n/**\r\n * Options for port checking operations\r\n */\r\nexport interface PortCheckOptions {\r\n /** The host to check (default: 'localhost') */\r\n host?: string;\r\n /** Timeout in milliseconds (default: 5000) */\r\n timeout?: number;\r\n}\r\n\r\n/**\r\n * Options for finding an available port\r\n */\r\nexport interface FindPortOptions extends PortCheckOptions {\r\n /** The starting port number to search from */\r\n startPort?: number;\r\n /** The ending port number to search until */\r\n endPort?: number;\r\n /** Maximum number of ports to try (default: 100) */\r\n maxTries?: number;\r\n}\r\n\r\n/**\r\n * Custom error class for port-related operations\r\n */\r\nexport class PortError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly port?: number,\r\n public readonly host?: string\r\n ) {\r\n super(message);\r\n this.name = 'PortError';\r\n }\r\n}\r\n\r\n/**\r\n * Validates if a port number is within the valid range\r\n * @param port - The port number to validate\r\n * @throws {PortError} When port is not within valid range (1-65535)\r\n */\r\nconst validatePort = (port: number): void => {\r\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\r\n throw new PortError(`Invalid port number: ${port}. Must be an integer between 1 and 65535.`, port);\r\n }\r\n};\r\n\r\n/**\r\n * Checks if a specific port is currently in use\r\n * \r\n * @param port - The port number to check (1-65535)\r\n * @param options - Configuration options for the port check\r\n * @returns Promise that resolves to true if the port is in use, false otherwise\r\n * \r\n * @throws {PortError} When port number is invalid or check fails\r\n * \r\n * @example\r\n * ```typescript\r\n * // Check if port 3000 is in use on localhost\r\n * const inUse = await isPortInUse(3000);\r\n * console.log(`Port 3000 is ${inUse ? 'in use' : 'available'}`);\r\n * \r\n * // Check a port on a different host with custom timeout\r\n * const inUse = await isPortInUse(8080, { host: '192.168.1.100', timeout: 3000 });\r\n * ```\r\n */\r\nexport const isPortInUse = async (\r\n port: number,\r\n options: PortCheckOptions = {}\r\n): Promise<boolean> => {\r\n // Check if running in Node.js environment\r\n assertNodeEnvironment();\r\n \r\n validatePort(port);\r\n \r\n const { host = 'localhost', timeout = 5000 } = options;\r\n \r\n try {\r\n return await isPortReachable(port, { host, timeout });\r\n } catch (error) {\r\n throw new PortError(\r\n `Failed to check port ${port} on ${host}: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n port,\r\n host\r\n );\r\n }\r\n};\r\n\r\n/**\r\n * Checks if a specific port is available (not in use)\r\n * \r\n * @param port - The port number to check (1-65535)\r\n * @param options - Configuration options for the port check\r\n * @returns Promise that resolves to true if the port is available, false otherwise\r\n * \r\n * @throws {PortError} When port number is invalid or check fails\r\n * \r\n * @example\r\n * ```typescript\r\n * // Check if port 3000 is available\r\n * const available = await isPortAvailable(3000);\r\n * if (available) {\r\n * console.log('Port 3000 is ready to use!');\r\n * }\r\n * ```\r\n */\r\nexport const isPortAvailable = async (\r\n port: number,\r\n options: PortCheckOptions = {}\r\n): Promise<boolean> => {\r\n return !(await isPortInUse(port, options));\r\n};\r\n\r\n/**\r\n * Finds the next available port starting from a given port number\r\n * \r\n * @param options - Configuration options for finding an available port\r\n * @returns Promise that resolves to an available port number\r\n * \r\n * @throws {PortError} When no available port is found within the specified range\r\n * \r\n * @example\r\n * ```typescript\r\n * // Find any available port starting from 3000\r\n * const port = await findAvailablePort({ startPort: 3000 });\r\n * console.log(`Found available port: ${port}`);\r\n * \r\n * // Find port within a specific range\r\n * const port = await findAvailablePort({ \r\n * startPort: 8000, \r\n * endPort: 8100,\r\n * host: '0.0.0.0'\r\n * });\r\n * ```\r\n */\r\nexport const findAvailablePort = async (\r\n options: FindPortOptions = {}\r\n): Promise<number> => {\r\n const {\r\n startPort = 3000,\r\n endPort = 65535,\r\n maxTries = 100,\r\n host = 'localhost',\r\n timeout = 5000\r\n } = options;\r\n \r\n validatePort(startPort);\r\n validatePort(endPort);\r\n \r\n if (startPort > endPort) {\r\n throw new PortError(`Start port (${startPort}) cannot be greater than end port (${endPort})`);\r\n }\r\n \r\n let currentPort = startPort;\r\n let attempts = 0;\r\n \r\n while (currentPort <= endPort && attempts < maxTries) {\r\n try {\r\n const available = await isPortAvailable(currentPort, { host, timeout });\r\n if (available) {\r\n return currentPort;\r\n }\r\n } catch (error) {\r\n // Continue to next port if there's an error checking this one\r\n console.warn(`Error checking port ${currentPort}: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n \r\n currentPort++;\r\n attempts++;\r\n }\r\n \r\n throw new PortError(\r\n `No available port found in range ${startPort}-${endPort} after ${attempts} attempts`,\r\n undefined,\r\n host\r\n );\r\n};\r\n\r\n/**\r\n * Checks multiple ports and returns their availability status\r\n * \r\n * @param ports - Array of port numbers to check\r\n * @param options - Configuration options for the port checks\r\n * @returns Promise that resolves to a Map with port numbers as keys and availability status as values\r\n * \r\n * @example\r\n * ```typescript\r\n * // Check multiple ports at once\r\n * const results = await checkMultiplePorts([3000, 3001, 3002, 8080]);\r\n * results.forEach((available, port) => {\r\n * console.log(`Port ${port}: ${available ? 'available' : 'in use'}`);\r\n * });\r\n * ```\r\n */\r\nexport const checkMultiplePorts = async (\r\n ports: readonly number[],\r\n options: PortCheckOptions = {}\r\n): Promise<Map<number, boolean>> => {\r\n const results = new Map<number, boolean>();\r\n \r\n // Validate all ports first\r\n ports.forEach(validatePort);\r\n \r\n // Check all ports in parallel\r\n const checks = ports.map(async (port) => {\r\n try {\r\n const available = await isPortAvailable(port, options);\r\n return { port, available };\r\n } catch (error) {\r\n console.warn(`Error checking port ${port}: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n return { port, available: false };\r\n }\r\n });\r\n \r\n const checkResults = await Promise.all(checks);\r\n \r\n checkResults.forEach(({ port, available }) => {\r\n results.set(port, available);\r\n });\r\n \r\n return results;\r\n};\r\n\r\n/**\r\n * Waits for a port to become available or in use\r\n * \r\n * @param port - The port number to monitor\r\n * @param targetState - Whether to wait for 'available' or 'in-use' state\r\n * @param options - Configuration options including polling interval and timeout\r\n * @returns Promise that resolves when the port reaches the target state\r\n * \r\n * @throws {PortError} When timeout is reached or port validation fails\r\n * \r\n * @example\r\n * ```typescript\r\n * // Wait for a service to start on port 3000\r\n * await waitForPort(3000, 'in-use', { timeout: 30000 });\r\n * console.log('Service is now running on port 3000');\r\n * \r\n * // Wait for a port to be freed up\r\n * await waitForPort(3000, 'available');\r\n * console.log('Port 3000 is now available');\r\n * ```\r\n */\r\nexport const waitForPort = async (\r\n port: number,\r\n targetState: 'available' | 'in-use',\r\n options: PortCheckOptions & { \r\n /** Polling interval in milliseconds (default: 1000) */\r\n pollInterval?: number;\r\n /** Overall timeout in milliseconds (default: 30000) */\r\n overallTimeout?: number;\r\n } = {}\r\n): Promise<void> => {\r\n validatePort(port);\r\n \r\n const {\r\n host = 'localhost',\r\n timeout = 5000,\r\n pollInterval = 1000,\r\n overallTimeout = 30000\r\n } = options;\r\n \r\n const startTime = Date.now();\r\n \r\n while (Date.now() - startTime < overallTimeout) {\r\n try {\r\n const inUse = await isPortInUse(port, { host, timeout });\r\n const currentState = inUse ? 'in-use' : 'available';\r\n \r\n if (currentState === targetState) {\r\n return;\r\n }\r\n } catch (error) {\r\n // Continue polling on errors\r\n console.warn(`Error checking port ${port}: ${error instanceof Error ? error.message : 'Unknown error'}`);\r\n }\r\n \r\n await new Promise(resolve => setTimeout(resolve, pollInterval));\r\n }\r\n \r\n throw new PortError(\r\n `Timeout waiting for port ${port} to become ${targetState} after ${overallTimeout}ms`,\r\n port,\r\n host\r\n );\r\n};"]}