proxy-rotator-js 1.1.1 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -23
- package/assets/GeoLite2-Country.mmdb +0 -0
- package/dist/cjs/index.cjs +12 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/{src/Proxy.js → dist/cjs/src/Proxy.cjs} +28 -32
- package/dist/cjs/src/Proxy.cjs.map +1 -0
- package/dist/cjs/src/ProxyRotator.cjs +323 -0
- package/dist/cjs/src/ProxyRotator.cjs.map +1 -0
- package/dist/cjs/src/Queue.cjs +64 -0
- package/dist/cjs/src/Queue.cjs.map +1 -0
- package/dist/cjs/src/utils/geo.cjs +31 -0
- package/dist/cjs/src/utils/geo.cjs.map +1 -0
- package/dist/cjs/src/utils/makeRequestWithProxy.cjs +26 -0
- package/dist/cjs/src/utils/makeRequestWithProxy.cjs.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/src/Proxy.d.ts +44 -0
- package/dist/src/Proxy.d.ts.map +1 -0
- package/dist/src/Proxy.js +100 -0
- package/dist/src/Proxy.js.map +1 -0
- package/dist/src/ProxyRotator.d.ts +104 -0
- package/dist/src/ProxyRotator.d.ts.map +1 -0
- package/dist/src/ProxyRotator.js +317 -0
- package/dist/src/ProxyRotator.js.map +1 -0
- package/dist/src/Queue.d.ts +16 -0
- package/dist/src/Queue.d.ts.map +1 -0
- package/dist/src/Queue.js +61 -0
- package/dist/src/Queue.js.map +1 -0
- package/dist/src/utils/geo.d.ts +7 -0
- package/dist/src/utils/geo.d.ts.map +1 -0
- package/dist/src/utils/geo.js +25 -0
- package/dist/src/utils/geo.js.map +1 -0
- package/dist/src/utils/makeRequestWithProxy.d.ts +13 -0
- package/dist/src/utils/makeRequestWithProxy.d.ts.map +1 -0
- package/dist/src/utils/makeRequestWithProxy.js +20 -0
- package/dist/src/utils/makeRequestWithProxy.js.map +1 -0
- package/dist/test/status.d.ts +2 -0
- package/dist/test/status.d.ts.map +1 -0
- package/dist/test/status.js +103 -0
- package/dist/test/status.js.map +1 -0
- package/dist/test/status_and_test_output.d.ts +2 -0
- package/dist/test/status_and_test_output.d.ts.map +1 -0
- package/dist/test/status_and_test_output.js +110 -0
- package/dist/test/status_and_test_output.js.map +1 -0
- package/dist/test/test.d.ts +2 -0
- package/dist/test/test.d.ts.map +1 -0
- package/dist/test/test.js +122 -0
- package/dist/test/test.js.map +1 -0
- package/dist/test/test_proxies.d.ts +2 -0
- package/dist/test/test_proxies.d.ts.map +1 -0
- package/dist/test/test_proxies.js +20 -0
- package/dist/test/test_proxies.js.map +1 -0
- package/dist/test/test_proxies_output.d.ts +2 -0
- package/dist/test/test_proxies_output.d.ts.map +1 -0
- package/dist/test/test_proxies_output.js +62 -0
- package/dist/test/test_proxies_output.js.map +1 -0
- package/package.json +29 -4
- package/index.js +0 -2
- package/src/ProxyRotator.js +0 -239
- package/src/Queue.js +0 -61
- package/src/utils/makeRequestWithProxy.js +0 -21
- package/test/options.js +0 -32
- package/test/test.js +0 -204
- package/test/test_proxies.js +0 -22
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class Queue {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.items = {};
|
|
6
|
+
this.frontIndex = 0;
|
|
7
|
+
this.backIndex = 0;
|
|
8
|
+
}
|
|
9
|
+
enqueue(item) {
|
|
10
|
+
this.items[this.backIndex] = item;
|
|
11
|
+
this.backIndex++;
|
|
12
|
+
return item;
|
|
13
|
+
}
|
|
14
|
+
dequeue() {
|
|
15
|
+
const item = this.items[this.frontIndex];
|
|
16
|
+
delete this.items[this.frontIndex];
|
|
17
|
+
this.frontIndex++;
|
|
18
|
+
return item;
|
|
19
|
+
}
|
|
20
|
+
remove(index) {
|
|
21
|
+
if (index < this.frontIndex || index >= this.backIndex) {
|
|
22
|
+
return 'Invalid index';
|
|
23
|
+
}
|
|
24
|
+
const item = this.items[index];
|
|
25
|
+
for (let i = index; i < this.backIndex; i++) {
|
|
26
|
+
this.items[i] = this.items[i + 1];
|
|
27
|
+
}
|
|
28
|
+
delete this.items[this.backIndex - 1];
|
|
29
|
+
this.backIndex--;
|
|
30
|
+
return item;
|
|
31
|
+
}
|
|
32
|
+
/** Remove item at position (0 = first in queue). */
|
|
33
|
+
removeAt(position) {
|
|
34
|
+
if (position < 0 || position >= this.size) {
|
|
35
|
+
return 'Invalid index';
|
|
36
|
+
}
|
|
37
|
+
return this.remove(this.frontIndex + position);
|
|
38
|
+
}
|
|
39
|
+
peek() {
|
|
40
|
+
return this.items[this.frontIndex];
|
|
41
|
+
}
|
|
42
|
+
printQueue() {
|
|
43
|
+
return this.items;
|
|
44
|
+
}
|
|
45
|
+
toArray() {
|
|
46
|
+
const arr = [];
|
|
47
|
+
for (let i = this.frontIndex; i < this.backIndex; i++) {
|
|
48
|
+
arr.push(this.items[i]);
|
|
49
|
+
}
|
|
50
|
+
return arr;
|
|
51
|
+
}
|
|
52
|
+
toObject() {
|
|
53
|
+
const obj = {};
|
|
54
|
+
for (let i = this.frontIndex; i < this.backIndex; i++) {
|
|
55
|
+
obj[i] = this.items[i];
|
|
56
|
+
}
|
|
57
|
+
return obj;
|
|
58
|
+
}
|
|
59
|
+
get size() {
|
|
60
|
+
return this.backIndex - this.frontIndex;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.default = Queue;
|
|
64
|
+
//# sourceMappingURL=Queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Queue.js","sourceRoot":"","sources":["../../../src/Queue.ts"],"names":[],"mappings":";;AAAA,MAAqB,KAAK;IAA1B;QACU,UAAK,GAAsB,EAAE,CAAC;QAC9B,eAAU,GAAG,CAAC,CAAC;QACf,cAAS,GAAG,CAAC,CAAC;IA+DxB,CAAC;IA7DC,OAAO,CAAC,IAAO;QACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACvD,OAAO,eAAe,CAAC;QACzB,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oDAAoD;IACpD,QAAQ,CAAC,QAAgB;QACvB,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1C,OAAO,eAAe,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,OAAO;QACL,MAAM,GAAG,GAAQ,EAAE,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,QAAQ;QACN,MAAM,GAAG,GAAsB,EAAE,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;IAC1C,CAAC;CACF;AAlED,wBAkEC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getCountryFromIp = getCountryFromIp;
|
|
7
|
+
const maxmind_1 = __importDefault(require("maxmind"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
function getDbPath() {
|
|
10
|
+
return (process.env.GEO_DB_PATH ||
|
|
11
|
+
path_1.default.join(process.cwd(), 'assets', 'GeoLite2-Country.mmdb'));
|
|
12
|
+
}
|
|
13
|
+
let _reader = null;
|
|
14
|
+
async function getReader() {
|
|
15
|
+
if (!_reader) {
|
|
16
|
+
_reader = await maxmind_1.default.open(getDbPath());
|
|
17
|
+
}
|
|
18
|
+
return _reader;
|
|
19
|
+
}
|
|
20
|
+
async function getCountryFromIp(ip) {
|
|
21
|
+
const reader = await getReader();
|
|
22
|
+
const result = reader.get(ip);
|
|
23
|
+
if (!result?.country)
|
|
24
|
+
return null;
|
|
25
|
+
return {
|
|
26
|
+
iso: result.country.iso_code ?? 'Unknown',
|
|
27
|
+
name: result.country.names?.en ?? 'Unknown',
|
|
28
|
+
continent: result.continent?.code ?? 'Unknown',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=geo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geo.js","sourceRoot":"","sources":["../../../../src/utils/geo.ts"],"names":[],"mappings":";;;;;AAyBA,4CAWC;AApCD,sDAAqE;AACrE,gDAAwB;AAExB,SAAS,SAAS;IAChB,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,WAAW;QACvB,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,uBAAuB,CAAC,CAC5D,CAAC;AACJ,CAAC;AAED,IAAI,OAAO,GAAmC,IAAI,CAAC;AAEnD,KAAK,UAAU,SAAS;IACtB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,MAAM,iBAAO,CAAC,IAAI,CAAkB,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAQM,KAAK,UAAU,gBAAgB,CAAC,EAAU;IAC/C,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAE9B,IAAI,CAAC,MAAM,EAAE,OAAO;QAAE,OAAO,IAAI,CAAC;IAElC,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,SAAS;QACzC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,SAAS;QAC3C,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,SAAS;KAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.default = makeRequestWithProxy;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
async function makeRequestWithProxy(proxy, options = {}) {
|
|
9
|
+
try {
|
|
10
|
+
const response = await axios_1.default.get('https://api.ipify.org?format=json', {
|
|
11
|
+
proxy: {
|
|
12
|
+
host: proxy.host,
|
|
13
|
+
port: Number(proxy.port),
|
|
14
|
+
protocol: 'http',
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
if (!options.quiet) {
|
|
18
|
+
console.log(response.data);
|
|
19
|
+
}
|
|
20
|
+
return response.data;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=makeRequestWithProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"makeRequestWithProxy.js","sourceRoot":"","sources":["../../../../src/utils/makeRequestWithProxy.ts"],"names":[],"mappings":";;;;;AAaA,uCAmBC;AAhCD,kDAA0B;AAaX,KAAK,UAAU,oBAAoB,CAChD,KAAkB,EAClB,UAAuC,EAAE;IAEzC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,mCAAmC,EAAE;YACpE,KAAK,EAAE;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;gBACxB,QAAQ,EAAE,MAAM;aACjB;SACF,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,QAAQ,CAAC,IAAsB,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import ProxyRotator from './src/ProxyRotator.js';
|
|
2
|
+
import Proxy from './src/Proxy.js';
|
|
3
|
+
export default ProxyRotator;
|
|
4
|
+
export { ProxyRotator, Proxy };
|
|
5
|
+
export type { ProxyRotatorOptions, ReturnAs, PoolStatus, ProxyTestResult, ProxyTestResults, } from './src/ProxyRotator.js';
|
|
6
|
+
export type { ProxyStatus, ProxyInfo, ProxyObj } from './src/Proxy.js';
|
|
7
|
+
export type { GeoCountry } from './src/utils/geo.js';
|
|
8
|
+
export type { ProxyConfig } from './src/utils/makeRequestWithProxy.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,MAAM,gBAAgB,CAAC;AAEnC,eAAe,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AAE/B,YAAY,EACV,mBAAmB,EACnB,QAAQ,EACR,UAAU,EACV,eAAe,EACf,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,MAAM,gBAAgB,CAAC;AAEnC,eAAe,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { GeoCountry } from './utils/geo.js';
|
|
2
|
+
export type ProxyStatus = 'new' | 'alive' | 'dead';
|
|
3
|
+
export interface ProxyInfo {
|
|
4
|
+
protocol: string | null;
|
|
5
|
+
ip: string;
|
|
6
|
+
host: string;
|
|
7
|
+
port: string;
|
|
8
|
+
country?: GeoCountry | null;
|
|
9
|
+
}
|
|
10
|
+
export interface ProxyObj extends ProxyInfo {
|
|
11
|
+
status: ProxyStatus;
|
|
12
|
+
changeTimeStamp: number;
|
|
13
|
+
}
|
|
14
|
+
export default class Proxy {
|
|
15
|
+
readonly protocol: string | null;
|
|
16
|
+
readonly ip: string;
|
|
17
|
+
readonly host: string;
|
|
18
|
+
readonly port: string;
|
|
19
|
+
readonly proxy: string;
|
|
20
|
+
status: ProxyStatus;
|
|
21
|
+
changeTimeStamp: number;
|
|
22
|
+
country: GeoCountry | null;
|
|
23
|
+
constructor(proxy: string, protocol?: string | null, assumeAlive?: boolean, country?: GeoCountry | null);
|
|
24
|
+
toString(): string;
|
|
25
|
+
get(): ProxyInfo;
|
|
26
|
+
obj(): ProxyObj;
|
|
27
|
+
setCountry(country: GeoCountry | null): void;
|
|
28
|
+
kill(): void;
|
|
29
|
+
setDead(): void;
|
|
30
|
+
setAlive(): void;
|
|
31
|
+
setNew(): void;
|
|
32
|
+
isDead(): boolean;
|
|
33
|
+
isAlive(): boolean;
|
|
34
|
+
isNew(): boolean;
|
|
35
|
+
revive(): void;
|
|
36
|
+
reset(): void;
|
|
37
|
+
equals(proxy: string | Proxy): boolean;
|
|
38
|
+
timeSinceStatusChange(): number;
|
|
39
|
+
print(): void;
|
|
40
|
+
getIp(): string;
|
|
41
|
+
getPort(): string;
|
|
42
|
+
getProtocol(): string | null;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=Proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Proxy.d.ts","sourceRoot":"","sources":["../../src/Proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,QAAS,SAAQ,SAAS;IACzC,MAAM,EAAE,WAAW,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,CAAC,OAAO,OAAO,KAAK;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,UAAU,GAAG,IAAI,CAAQ;gBAGhC,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,MAAM,GAAG,IAAW,EAC9B,WAAW,GAAE,OAAe,EAC5B,OAAO,GAAE,UAAU,GAAG,IAAW;IAmBnC,QAAQ,IAAI,MAAM;IAIlB,GAAG,IAAI,SAAS;IAUhB,GAAG,IAAI,QAAQ;IAYf,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI;IAI5C,IAAI,IAAI,IAAI;IAKZ,OAAO,IAAI,IAAI;IAKf,QAAQ,IAAI,IAAI;IAKhB,MAAM,IAAI,IAAI;IAKd,MAAM,IAAI,OAAO;IAIjB,OAAO,IAAI,OAAO;IAIlB,KAAK,IAAI,OAAO;IAIhB,MAAM,IAAI,IAAI;IAKd,KAAK,IAAI,IAAI;IAKb,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO;IAKtC,qBAAqB,IAAI,MAAM;IAI/B,KAAK,IAAI,IAAI;IAIb,KAAK,IAAI,MAAM;IAIf,OAAO,IAAI,MAAM;IAIjB,WAAW,IAAI,MAAM,GAAG,IAAI;CAG7B"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export default class Proxy {
|
|
2
|
+
constructor(proxy, protocol = null, assumeAlive = false, country = null) {
|
|
3
|
+
this.country = null;
|
|
4
|
+
if (proxy.includes('://')) {
|
|
5
|
+
this.protocol = proxy.split('://')[0];
|
|
6
|
+
this.ip = proxy.split('://')[1].split(':')[0];
|
|
7
|
+
this.host = this.ip;
|
|
8
|
+
this.port = proxy.split('://')[1].split(':')[1];
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
this.protocol = protocol;
|
|
12
|
+
this.ip = proxy.split(':')[0];
|
|
13
|
+
this.host = this.ip;
|
|
14
|
+
this.port = proxy.split(':')[1];
|
|
15
|
+
}
|
|
16
|
+
this.proxy = `${this.protocol ? this.protocol + '://' : ''}${this.ip}:${this.port}`;
|
|
17
|
+
this.status = assumeAlive ? 'alive' : 'new';
|
|
18
|
+
this.changeTimeStamp = Date.now();
|
|
19
|
+
this.country = country ?? null;
|
|
20
|
+
}
|
|
21
|
+
toString() {
|
|
22
|
+
return `${this.protocol ? this.protocol + '://' : ''}${this.ip}:${this.port}`;
|
|
23
|
+
}
|
|
24
|
+
get() {
|
|
25
|
+
return {
|
|
26
|
+
protocol: this.protocol,
|
|
27
|
+
ip: this.ip,
|
|
28
|
+
host: this.host,
|
|
29
|
+
port: this.port,
|
|
30
|
+
country: this.country ?? undefined,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
obj() {
|
|
34
|
+
return {
|
|
35
|
+
protocol: this.protocol,
|
|
36
|
+
ip: this.ip,
|
|
37
|
+
host: this.host,
|
|
38
|
+
port: this.port,
|
|
39
|
+
status: this.status,
|
|
40
|
+
changeTimeStamp: this.changeTimeStamp,
|
|
41
|
+
country: this.country ?? undefined,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
setCountry(country) {
|
|
45
|
+
this.country = country;
|
|
46
|
+
}
|
|
47
|
+
kill() {
|
|
48
|
+
this.status = 'dead';
|
|
49
|
+
this.changeTimeStamp = Date.now();
|
|
50
|
+
}
|
|
51
|
+
setDead() {
|
|
52
|
+
this.status = 'dead';
|
|
53
|
+
this.changeTimeStamp = Date.now();
|
|
54
|
+
}
|
|
55
|
+
setAlive() {
|
|
56
|
+
this.status = 'alive';
|
|
57
|
+
this.changeTimeStamp = Date.now();
|
|
58
|
+
}
|
|
59
|
+
setNew() {
|
|
60
|
+
this.status = 'new';
|
|
61
|
+
this.changeTimeStamp = Date.now();
|
|
62
|
+
}
|
|
63
|
+
isDead() {
|
|
64
|
+
return this.status === 'dead';
|
|
65
|
+
}
|
|
66
|
+
isAlive() {
|
|
67
|
+
return this.status === 'alive';
|
|
68
|
+
}
|
|
69
|
+
isNew() {
|
|
70
|
+
return this.status === 'new';
|
|
71
|
+
}
|
|
72
|
+
revive() {
|
|
73
|
+
this.status = 'alive';
|
|
74
|
+
this.changeTimeStamp = Date.now();
|
|
75
|
+
}
|
|
76
|
+
reset() {
|
|
77
|
+
this.status = 'new';
|
|
78
|
+
this.changeTimeStamp = Date.now();
|
|
79
|
+
}
|
|
80
|
+
equals(proxy) {
|
|
81
|
+
const other = typeof proxy === 'string' ? new Proxy(proxy) : proxy;
|
|
82
|
+
return this.ip === other.ip && this.port === other.port;
|
|
83
|
+
}
|
|
84
|
+
timeSinceStatusChange() {
|
|
85
|
+
return Date.now() - this.changeTimeStamp;
|
|
86
|
+
}
|
|
87
|
+
print() {
|
|
88
|
+
console.log(this.get());
|
|
89
|
+
}
|
|
90
|
+
getIp() {
|
|
91
|
+
return this.ip;
|
|
92
|
+
}
|
|
93
|
+
getPort() {
|
|
94
|
+
return this.port;
|
|
95
|
+
}
|
|
96
|
+
getProtocol() {
|
|
97
|
+
return this.protocol;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=Proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Proxy.js","sourceRoot":"","sources":["../../src/Proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import Proxy from './Proxy.js';
|
|
2
|
+
import type { ProxyObj } from './Proxy.js';
|
|
3
|
+
export type ReturnAs = 'string' | 'object';
|
|
4
|
+
/** Result from a single proxy test. */
|
|
5
|
+
export interface ProxyTestResult {
|
|
6
|
+
proxy: string;
|
|
7
|
+
working: boolean;
|
|
8
|
+
expectedIp: string;
|
|
9
|
+
actualIp: string | null;
|
|
10
|
+
error?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Result from test_proxies(). */
|
|
13
|
+
export interface ProxyTestResults {
|
|
14
|
+
results: ProxyTestResult[];
|
|
15
|
+
summary: {
|
|
16
|
+
total: number;
|
|
17
|
+
working: number;
|
|
18
|
+
notWorking: number;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** Status of the pool returned by status(). */
|
|
22
|
+
export interface PoolStatus {
|
|
23
|
+
pool: {
|
|
24
|
+
size: number;
|
|
25
|
+
proxies: string[];
|
|
26
|
+
};
|
|
27
|
+
graveyard: {
|
|
28
|
+
size: number;
|
|
29
|
+
proxies: string[];
|
|
30
|
+
};
|
|
31
|
+
config: {
|
|
32
|
+
revive_timer: number;
|
|
33
|
+
returnAs: ReturnAs;
|
|
34
|
+
protocol: string | null;
|
|
35
|
+
shuffle: boolean;
|
|
36
|
+
assume_aliveness: boolean;
|
|
37
|
+
check_on_next: boolean;
|
|
38
|
+
fetchGeo: boolean;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export interface ProxyRotatorOptions {
|
|
42
|
+
returnAs?: ReturnAs | 'str' | 'obj';
|
|
43
|
+
revive_timer?: number;
|
|
44
|
+
shuffle?: boolean;
|
|
45
|
+
protocol?: string | null;
|
|
46
|
+
assume_aliveness?: boolean;
|
|
47
|
+
check_on_next?: boolean;
|
|
48
|
+
/** If true, fetches country geolocation when adding proxies. Default true. */
|
|
49
|
+
fetchGeo?: boolean;
|
|
50
|
+
}
|
|
51
|
+
export default class ProxyRotator {
|
|
52
|
+
private pool;
|
|
53
|
+
private graveyard;
|
|
54
|
+
revive_timer: number;
|
|
55
|
+
returnAs: ReturnAs;
|
|
56
|
+
protocol: string | null;
|
|
57
|
+
shuffle: boolean;
|
|
58
|
+
assume_aliveness: boolean;
|
|
59
|
+
check_on_next: boolean;
|
|
60
|
+
fetchGeo: boolean;
|
|
61
|
+
constructor(proxies?: null | string | string[], options?: ProxyRotatorOptions);
|
|
62
|
+
getGraveyard(): string[];
|
|
63
|
+
getGraveyardSize(): number;
|
|
64
|
+
getPool(): string[];
|
|
65
|
+
getPoolSize(): number;
|
|
66
|
+
/** Returns the status of the pool as a JSON-serializable object. */
|
|
67
|
+
status(): PoolStatus;
|
|
68
|
+
add(proxies: string | string[]): Promise<void>;
|
|
69
|
+
/** Parse a file of proxies (newline-, space-, or comma-separated) and add each to the pool. */
|
|
70
|
+
add_file(filename: string): Promise<void>;
|
|
71
|
+
/** Fetch country geolocation for all proxies in pool and graveyard. */
|
|
72
|
+
refreshGeo(): Promise<void>;
|
|
73
|
+
private _add;
|
|
74
|
+
/** Treat a string as either a file path (add all proxies from file) or a single proxy "ip:port" / "protocol://ip:port". */
|
|
75
|
+
private _processOne;
|
|
76
|
+
/** Sync add used by constructor (no geo). Use add() for geo lookup. */
|
|
77
|
+
private _addSync;
|
|
78
|
+
/** True if the string is an existing file path. */
|
|
79
|
+
private _isFilePath;
|
|
80
|
+
remove(proxy: string | string[]): void;
|
|
81
|
+
private _remove;
|
|
82
|
+
getAlive(): string | undefined;
|
|
83
|
+
setAlive(proxy: string | Proxy): void;
|
|
84
|
+
resurect(proxy: string | Proxy): void;
|
|
85
|
+
setDead(proxy: string | Proxy): void;
|
|
86
|
+
kill(proxy: string | Proxy): void;
|
|
87
|
+
next(options?: {
|
|
88
|
+
returnAs?: ReturnAs | 'str' | 'obj';
|
|
89
|
+
}): string | ProxyObj | null;
|
|
90
|
+
private _shuffleArray;
|
|
91
|
+
private _handleReturnAsInput;
|
|
92
|
+
private _parseFile;
|
|
93
|
+
private _isArray;
|
|
94
|
+
private _resurection;
|
|
95
|
+
test_proxies(options?: {
|
|
96
|
+
/** "console" prints to stdout; "json" returns results. Default "console". */
|
|
97
|
+
output?: 'console' | 'json';
|
|
98
|
+
}): Promise<void | ProxyTestResults>;
|
|
99
|
+
test: (options?: {
|
|
100
|
+
/** "console" prints to stdout; "json" returns results. Default "console". */
|
|
101
|
+
output?: "console" | "json";
|
|
102
|
+
}) => Promise<void | ProxyTestResults>;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=ProxyRotator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProxyRotator.d.ts","sourceRoot":"","sources":["../../src/ProxyRotator.ts"],"names":[],"mappings":"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"}
|