diff --git a/README.md b/README.md index 6452d97..c63274f 100644 --- a/README.md +++ b/README.md @@ -1,70 +1,63 @@ -# luminati-tunnel +# proxies-pool -![Last version](https://img.shields.io/github/tag/Kikobeats/luminati-tunnel.svg?style=flat-square) -[![Build Status](https://img.shields.io/travis/Kikobeats/luminati-tunnel/master.svg?style=flat-square)](https://travis-ci.org/Kikobeats/luminati-tunnel) -[![Coverage Status](https://img.shields.io/coveralls/Kikobeats/luminati-tunnel.svg?style=flat-square)](https://coveralls.io/github/Kikobeats/luminati-tunnel) -[![Dependency status](https://img.shields.io/david/Kikobeats/luminati-tunnel.svg?style=flat-square)](https://david-dm.org/Kikobeats/luminati-tunnel) -[![Dev Dependencies Status](https://img.shields.io/david/dev/Kikobeats/luminati-tunnel.svg?style=flat-square)](https://david-dm.org/Kikobeats/luminati-tunnel#info=devDependencies) -[![NPM Status](https://img.shields.io/npm/dm/luminati-tunnel.svg?style=flat-square)](https://www.npmjs.org/package/luminati-tunnel) +![Last version](https://img.shields.io/github/tag/Kikobeats/proxies-pool.svg?style=flat-square) +[![Build Status](https://img.shields.io/travis/Kikobeats/proxies-pool/master.svg?style=flat-square)](https://travis-ci.org/Kikobeats/proxies-pool) +[![Coverage Status](https://img.shields.io/coveralls/Kikobeats/proxies-pool.svg?style=flat-square)](https://coveralls.io/github/Kikobeats/proxies-pool) +[![Dependency status](https://img.shields.io/david/Kikobeats/proxies-pool.svg?style=flat-square)](https://david-dm.org/Kikobeats/proxies-pool) +[![Dev Dependencies Status](https://img.shields.io/david/dev/Kikobeats/proxies-pool.svg?style=flat-square)](https://david-dm.org/Kikobeats/proxies-pool#info=devDependencies) +[![NPM Status](https://img.shields.io/npm/dm/proxies-pool.svg?style=flat-square)](https://www.npmjs.org/package/proxies-pool) -> HTTP/HTTPS tunnel proxy for luminati.io using round robin strategy. +> Simple way to handle a pool of proxies using round robin strategy. ## Install ```bash -$ npm install luminati-tunnel --save +$ npm install proxies-pool --save ``` ## Usage -The instance is a function that returns a different proxy tunnel every time you call it, using [round robin](https://en.wikipedia.org/wiki/Round-robin_DNS) algorithm. +The instance is a function that returns a different proxy every time you call it, using [round robin](https://en.wikipedia.org/wiki/Round-robin_DNS) algorithm. ```js -const luminatiTunnel = require('luminati-tunnel') - -const proxies = [ 'proxy1', 'proxy2', 'proxy3' ] -const tunnel = createTunnel(proxies) +const proxiesPool = require('proxies-pool') +const proxies = ['proxy1', 'proxy2', 'proxy3'] +const proxyPool = proxiesPool(proxies) const url = 'http://lumtest.com/echo.json' +const createAgent = proxy => ({ + agent: { + http: tunnel.httpOverHttp({ proxy }) + } +}) + ;(async () => { // => it uses 'proxy1' - await got(url, { - agent: tunnel(), - json: true - }) + await got(url, { agent: createAgent(proxyPool()) }) // => it uses 'proxy2' - await got(url, { - agent: tunnel(), - json: true - }) + await got(url, { agent: createAgent(proxyPool()) }) // => it uses 'proxy3' - await got(url, { - agent: tunnel(), - json: true - }) + await got(url, { agent: createAgent(proxyPool()) }) // => it uses 'proxy1' - await got(url, { - agent: tunnel(), - json: true - }) + await got(url, { agent: createAgent(proxyPool()) }) })() ``` ## API -### `tunnel = luminatiTunnel(proxies, [fromIndex])` +### `proxyPool = proxiesPool(proxies, [fromIndex])` #### proxies *Required*
Type: `array` -A collection of the proxy IPs to use. +A collection of proxies to use. -You can get it from your [luminati.io](https://luminati.io/) control panel. +You can get it from your [luminati.io](https://luminati.io) control panel or any compatible provider. ![](https://luminati-holanetworksltd.netdna-ssl.com/www/lum/pub/img/ip_list.png?md5=22129-f8b3b8e5) @@ -77,9 +70,9 @@ Default: `0` It specifies the position of the `proxies` collection to start. -### `tunnel` +### `proxyPool` -The instance is a function that returns a different proxy tunnel every time you call it, using [round robin](https://en.wikipedia.org/wiki/Round-robin_DNS) algorithm. +The instance is a function that returns a different proxy every time you call it, using [round robin](https://en.wikipedia.org/wiki/Round-robin_DNS) algorithm. #### .current() @@ -103,7 +96,7 @@ Returns the number of proxies in the pool. ## License -**luminati-tunnel** © [Kiko Beats](https://kikobeats.com), released under the [MIT](https://github.com/Kikobeats/luminati-tunnel/blob/master/LICENSE.md) License.
-Authored and maintained by Kiko Beats with help from [contributors](https://github.com/Kikobeats/luminati-tunnel/contributors). +**proxies-pool** © [Kiko Beats](https://kikobeats.com), released under the [MIT](https://github.com/Kikobeats/proxies-pool/blob/master/LICENSE.md) License.
+Authored and maintained by Kiko Beats with help from [contributors](https://github.com/Kikobeats/proxies-pool/contributors). > [kikobeats.com](https://kikobeats.com) · GitHub [Kiko Beats](https://github.com/Kikobeats) · Twitter [@Kikobeats](https://twitter.com/Kikobeats) diff --git a/index.js b/index.js index 33641d7..e392509 100644 --- a/index.js +++ b/index.js @@ -1,15 +1,14 @@ 'use strict' -const createTunnel = require('tunnel') const Cycled = require('cycled') -const roundRobin = (items, steps) => { +const roundRobin = (items, fromIndex) => { const list = new Cycled(items) - if (steps) list.step(steps) + if (fromIndex) list.step(fromIndex) return list } -const parseUri = str => { +const parse = str => { const [host, port, user, password] = str.split(':') return { host, @@ -18,28 +17,23 @@ const parseUri = str => { } } -module.exports = (proxies = [], fromIndex = 0) => { - if (!proxies.length) { - throw TypeError('You need to provide a collection of proxies.') - } - - const getProxy = roundRobin(proxies.map(parseUri), fromIndex) +module.exports = (items = [], fromIndex = 0, fn) => { + const getProxy = roundRobin(items.map(parse), fromIndex) - const luminatiTunnel = opts => { + const proxyPool = () => { const proxy = getProxy.current() - const tunnel = createTunnel.httpsOverHttp({ proxy, ...opts }) getProxy.next() - return tunnel + return proxy } - luminatiTunnel.current = getProxy.current.bind(getProxy) - luminatiTunnel.index = () => getProxy.index - luminatiTunnel.next = getProxy.next.bind(getProxy) - luminatiTunnel.previous = getProxy.previous.bind(getProxy) - luminatiTunnel.size = () => proxies.length + proxyPool.current = getProxy.current.bind(getProxy) + proxyPool.index = () => getProxy.index + proxyPool.next = getProxy.next.bind(getProxy) + proxyPool.previous = getProxy.previous.bind(getProxy) + proxyPool.size = () => items.length - return luminatiTunnel + return proxyPool } module.exports.roundRobin = roundRobin -module.exports.parseUri = parseUri +module.exports.parse = parse diff --git a/package.json b/package.json index ffe4a9f..c796a71 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,20 @@ { - "name": "luminati-tunnel", + "name": "proxies-pool", "description": "HTTP/HTTPS tunnel proxy for luminati.io using round robin strategy.", - "homepage": "https://nicedoc.io/Kikobeats/luminati-tunnel", + "homepage": "https://nicedoc.io/Kikobeats/proxies-pool", "version": "1.3.2", "main": "index.js", "author": { - "name": "Kiko Beats", "email": "josefrancisco.verdu@gmail.com", + "name": "Kiko Beats", "url": "https://kikobeats.com" }, "repository": { "type": "git", - "url": "git+https://github.com/Kikobeats/luminati-tunnel.git" + "url": "git+https://github.com/Kikobeats/proxies-pool.git" }, "bugs": { - "url": "https://github.com/Kikobeats/luminati-tunnel/issues" + "url": "https://github.com/Kikobeats/proxies-pool/issues" }, "keywords": [ "agent", @@ -25,13 +25,13 @@ "tunnel" ], "dependencies": { - "cycled": "~1.1.0", - "tunnel": "0.0.6" + "cycled": "~1.1.0" }, "devDependencies": { "@commitlint/cli": "latest", "@commitlint/config-conventional": "latest", "ava": "latest", + "ci-publish": "latest", "conventional-github-releaser": "latest", "coveralls": "latest", "finepack": "latest", @@ -46,11 +46,14 @@ "standard": "latest", "standard-markdown": "latest", "standard-version": "latest", - "ci-publish": "latest" + "tunnel": "latest" }, "engines": { "node": ">= 8" }, + "files": [ + "index.js" + ], "scripts": { "clean": "rm -rf node_modules", "coverage": "nyc report --reporter=text-lcov | coveralls", @@ -80,19 +83,17 @@ } }, "lint-staged": { - "linters": { - "package.json": [ - "finepack", - "git add" - ], - "*.js": [ - "prettier-standard", - "git add" - ], - "*.md": [ - "standard-markdown", - "git add" - ] - } + "package.json": [ + "finepack", + "git add" + ], + "*.js": [ + "prettier-standard", + "git add" + ], + "*.md": [ + "standard-markdown", + "git add" + ] } } diff --git a/test/index.js b/test/index.js index d26acf7..ddfb899 100644 --- a/test/index.js +++ b/test/index.js @@ -1,24 +1,27 @@ 'use strict' +const tunnel = require('tunnel') const test = require('ava') const got = require('got') -const createTunnel = require('..') +const proxiesPool = require('..') const proxies = [process.env.PROXY_ONE, process.env.PROXY_TWO] -const { parseUri } = createTunnel - test('do a request', async t => { - const tunnel = createTunnel(proxies) - t.is(tunnel.index(), 0) - t.deepEqual(tunnel.current(), parseUri(proxies[0])) - const { statusCode } = await got('http://lumtest.com/echo.json', { - agent: tunnel(), - json: true + const proxyPool = proxiesPool(proxies, 0, tunnel.httpOverHttp) + t.is(proxyPool.index(), 0) + t.deepEqual(proxyPool.current(), proxiesPool.parse(proxies[0])) + + const { statusCode } = await got('https://lumtest.com/echo.json', { + agent: { + http: tunnel.httpOverHttp({ + proxy: proxyPool() + }) + } }) t.is(statusCode, 200) - t.is(tunnel.index(), 1) - t.deepEqual(tunnel.current(), parseUri(proxies[1])) + t.is(proxyPool.index(), 1) + t.deepEqual(proxyPool.current(), proxiesPool.parse(proxies[1])) }) diff --git a/test/parse-uri.js b/test/parse.js similarity index 86% rename from test/parse-uri.js rename to test/parse.js index eabe193..e6682d5 100644 --- a/test/parse-uri.js +++ b/test/parse.js @@ -1,10 +1,10 @@ const test = require('ava') -const { parseUri } = require('..') +const { parse } = require('..') test('parse proxy url into an objet', t => { t.deepEqual( - parseUri( + parse( 'zproxy.lum-superproxy.io:22225:lum-customer-foo-zone-zone1-ip-0.0.0.0:bar' ), {