| "use strict"; | 
| Object.defineProperty(exports, "__esModule", { value: true }); | 
| const util_1 = require("./util"); | 
| const constants_1 = require("./constants"); | 
| const stream = require("stream"); | 
| /** | 
|  * Validates the provided SocksClientOptions | 
|  * @param options { SocksClientOptions } | 
|  * @param acceptedCommands { string[] } A list of accepted SocksProxy commands. | 
|  */ | 
| function validateSocksClientOptions(options, acceptedCommands = ['connect', 'bind', 'associate']) { | 
|     // Check SOCKs command option. | 
|     if (!constants_1.SocksCommand[options.command]) { | 
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksCommand, options); | 
|     } | 
|     // Check SocksCommand for acceptable command. | 
|     if (acceptedCommands.indexOf(options.command) === -1) { | 
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksCommandForOperation, options); | 
|     } | 
|     // Check destination | 
|     if (!isValidSocksRemoteHost(options.destination)) { | 
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsDestination, options); | 
|     } | 
|     // Check SOCKS proxy to use | 
|     if (!isValidSocksProxy(options.proxy)) { | 
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsProxy, options); | 
|     } | 
|     // Check timeout | 
|     if (options.timeout && !isValidTimeoutValue(options.timeout)) { | 
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsTimeout, options); | 
|     } | 
|     // Check existing_socket (if provided) | 
|     if (options.existing_socket && | 
|         !(options.existing_socket instanceof stream.Duplex)) { | 
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsExistingSocket, options); | 
|     } | 
| } | 
| exports.validateSocksClientOptions = validateSocksClientOptions; | 
| /** | 
|  * Validates the SocksClientChainOptions | 
|  * @param options { SocksClientChainOptions } | 
|  */ | 
| function validateSocksClientChainOptions(options) { | 
|     // Only connect is supported when chaining. | 
|     if (options.command !== 'connect') { | 
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksCommandChain, options); | 
|     } | 
|     // Check destination | 
|     if (!isValidSocksRemoteHost(options.destination)) { | 
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsDestination, options); | 
|     } | 
|     // Validate proxies (length) | 
|     if (!(options.proxies && | 
|         Array.isArray(options.proxies) && | 
|         options.proxies.length >= 2)) { | 
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsProxiesLength, options); | 
|     } | 
|     // Validate proxies | 
|     options.proxies.forEach((proxy) => { | 
|         if (!isValidSocksProxy(proxy)) { | 
|             throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsProxy, options); | 
|         } | 
|     }); | 
|     // Check timeout | 
|     if (options.timeout && !isValidTimeoutValue(options.timeout)) { | 
|         throw new util_1.SocksClientError(constants_1.ERRORS.InvalidSocksClientOptionsTimeout, options); | 
|     } | 
| } | 
| exports.validateSocksClientChainOptions = validateSocksClientChainOptions; | 
| /** | 
|  * Validates a SocksRemoteHost | 
|  * @param remoteHost { SocksRemoteHost } | 
|  */ | 
| function isValidSocksRemoteHost(remoteHost) { | 
|     return (remoteHost && | 
|         typeof remoteHost.host === 'string' && | 
|         typeof remoteHost.port === 'number' && | 
|         remoteHost.port >= 0 && | 
|         remoteHost.port <= 65535); | 
| } | 
| /** | 
|  * Validates a SocksProxy | 
|  * @param proxy { SocksProxy } | 
|  */ | 
| function isValidSocksProxy(proxy) { | 
|     return (proxy && | 
|         (typeof proxy.host === 'string' || typeof proxy.ipaddress === 'string') && | 
|         typeof proxy.port === 'number' && | 
|         proxy.port >= 0 && | 
|         proxy.port <= 65535 && | 
|         (proxy.type === 4 || proxy.type === 5)); | 
| } | 
| /** | 
|  * Validates a timeout value. | 
|  * @param value { Number } | 
|  */ | 
| function isValidTimeoutValue(value) { | 
|     return typeof value === 'number' && value > 0; | 
| } | 
| //# sourceMappingURL=helpers.js.map |