Skip to content

Commit

Permalink
.
Browse files Browse the repository at this point in the history
  • Loading branch information
TooTallNate committed Mar 30, 2024
1 parent 41f8525 commit 8e2e876
Showing 1 changed file with 53 additions and 42 deletions.
95 changes: 53 additions & 42 deletions packages/socks-proxy-agent/test/e2e.test.ts
Expand Up @@ -4,50 +4,67 @@ import { SocksProxyAgent } from '../src';

interface NordVPNServer {
name: string;
domain: string;
flag: string;
features: { [key: string]: boolean };
hostname: string;
status: string;
locations: {
country: {
code: string;
};
}[];
technologies: {
identifier: string;
}[];
}

jest.setTimeout(30000);

const findNordVpnServer = () =>
retry(
async (): Promise<NordVPNServer> => {
const res = await req('https://nordvpn.com/api/server');
if (res.statusCode !== 200) {
res.socket.destroy();
throw new Error(`Status code: ${res.statusCode}`);
}
const body = await json(res);
const servers = (body as NordVPNServer[]).filter(
(s) => s.features.socks
);
if (servers.length === 0) {
throw new Error(
'Could not find `socks` proxy server from NordVPN'
);
}
const server = servers[Math.floor(Math.random() * servers.length)];
return server;
},
{
retries: 5,
onRetry(err, attempt) {
console.log(
`Failed to get NordVPN servers. Retrying… (attempt #${attempt}, ${err.message})`
);
},
}
);

async function getRealIP(): Promise<string> {
const res = await req('https://dump.n8.io');
const body = await json(res);
return body.request.headers['x-real-ip'];
}

describe('SocksProxyAgent', () => {
let server: NordVPNServer;

it('should find NordVPN "socks" server', async () => {
server = await retry(
async (): Promise<NordVPNServer> => {
const res = await req(
'https://api.nordvpn.com/v1/servers?limit=0'
);
if (res.statusCode !== 200) {
res.socket.destroy();
throw new Error(`Status code: ${res.statusCode}`);
}
const body = await json(res);
const servers = (body as NordVPNServer[]).filter(
(s) =>
s.status === 'online' &&
s.technologies.find((t) => t.identifier === 'socks')
);
console.log(servers.length);
if (servers.length === 0) {
throw new Error(
'Could not find `https` proxy server from NordVPN'
);
}
return servers[Math.floor(Math.random() * servers.length)];
},
{
retries: 5,
onRetry(err, attempt) {
console.log(
`Failed to get NordVPN servers. Retrying… (attempt #${attempt}, ${err.message})`
);
},
}
);
console.log(
`Using NordVPN HTTPS proxy server: ${server.name} (${server.hostname})`
);
});

it('should work over NordVPN proxy', async () => {
const { NORDVPN_USERNAME, NORDVPN_PASSWORD } = process.env;
if (!NORDVPN_USERNAME) {
Expand All @@ -57,26 +74,20 @@ describe('SocksProxyAgent', () => {
throw new Error('`NORDVPN_PASSWORD` env var is not defined');
}

const [realIp, server] = await Promise.all([
getRealIP(),
findNordVpnServer(),
]);
console.log(
`Using NordVPN SOCKS proxy server: ${server.name} (${server.domain})`
);
const realIp = await getRealIP();

const username = encodeURIComponent(NORDVPN_USERNAME);
const password = encodeURIComponent(NORDVPN_PASSWORD);

const agent = new SocksProxyAgent(
`socks://${username}:${password}@${server.domain}`
`socks://${username}:${password}@${server.hostname}`
);

const res = await req('https://dump.n8.io', { agent });
const body = await json(res);
expect(body.request.headers['x-real-ip']).not.toEqual(realIp);
expect(body.request.headers['x-vercel-ip-country']).toEqual(
server.flag
server.locations[0].country.code
);
});
});

0 comments on commit 8e2e876

Please sign in to comment.