Skip to content

Commit

Permalink
feat: move tunnel dependency out of the library
Browse files Browse the repository at this point in the history
BREAKING CHANGE: rename into proxies-pool
  • Loading branch information
Kikobeats committed May 30, 2020
1 parent 1073f79 commit 2464a91
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 92 deletions.
67 changes: 30 additions & 37 deletions 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*<br>
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)

Expand All @@ -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()

Expand All @@ -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.<br>
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.<br>
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)
34 changes: 14 additions & 20 deletions 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,
Expand All @@ -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
45 changes: 23 additions & 22 deletions 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",
Expand All @@ -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",
Expand All @@ -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",
Expand Down Expand Up @@ -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"
]
}
}
25 changes: 14 additions & 11 deletions 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]))
})
4 changes: 2 additions & 2 deletions test/parse-uri.js → 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'
),
{
Expand Down

0 comments on commit 2464a91

Please sign in to comment.