@projectlibertylabs/p2p-peer-test
Version:
CLI tool to test libp2p connections and discover peer protocols
75 lines (69 loc) • 2.24 kB
JavaScript
import { multiaddr } from '@multiformats/multiaddr';
import { DEFAULT_CONFIG, ERROR_MESSAGES } from './config.js';
import { safeParseInt, isEmpty } from './utils.js';
/**
* Validates a multiaddr string format
* @param {string} multiaddrStr - The multiaddr string to validate
* @returns {{isValid: boolean, error?: string}} Validation result
*/
export function validateMultiaddr(multiaddrStr) {
if (isEmpty(multiaddrStr)) {
return {
isValid: false,
error: ERROR_MESSAGES.EMPTY_MULTIADDR
};
}
try {
multiaddr(multiaddrStr);
return { isValid: true };
} catch (error) {
return {
isValid: false,
error: error instanceof Error ? error.message : 'Invalid multiaddr format'
};
}
}
/**
* Validates timeout option
* @param {string|number} timeout - Timeout value to validate
* @returns {number} Validated timeout in milliseconds
* @throws {Error} If timeout is invalid
*/
const validateTimeout = (timeout) => {
const parsed = safeParseInt(timeout, DEFAULT_CONFIG.TIMEOUT_MS, (n) => n > 0);
if (parsed === null) {
throw new Error(ERROR_MESSAGES.INVALID_TIMEOUT);
}
return parsed;
};
/**
* Validates retries option
* @param {string|number} retries - Number of retries to validate
* @returns {number} Validated number of retries
* @throws {Error} If retries is invalid
*/
const validateRetries = (retries) => {
const parsed = safeParseInt(retries, DEFAULT_CONFIG.DEFAULT_RETRIES, (n) => n >= 0);
if (parsed === null) {
throw new Error(ERROR_MESSAGES.INVALID_RETRIES);
}
return parsed;
};
/**
* Validates CLI options and normalizes them
* @param {Object} options - Raw CLI options
* @param {string|number} [options.timeout] - Connection timeout
* @param {string|number} [options.retries] - Number of retries
* @param {boolean} [options.json] - JSON output flag
* @param {boolean} [options.verbose] - Verbose output flag
* @returns {{timeout: number, retries: number, json: boolean, verbose: boolean}} Validated options
* @throws {Error} If any option is invalid
*/
export function validateOptions(options) {
return {
timeout: validateTimeout(options.timeout),
retries: validateRetries(options.retries),
json: Boolean(options.json),
verbose: Boolean(options.verbose)
};
}