bypass-vpn 1.0.1 → 1.1.0

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/resolver.js +27 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bypass-vpn",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "Route AI service traffic (Claude, ChatGPT, Firebase) through Wi-Fi gateway to bypass VPN",
5
5
  "bin": {
6
6
  "bypass-vpn": "bin/bypass-vpn.js"
package/src/resolver.js CHANGED
@@ -1,12 +1,39 @@
1
+ const { execSync } = require('child_process');
1
2
  const dns = require('dns');
2
3
  const dnsPromises = dns.promises;
3
4
 
5
+ /**
6
+ * Resolve a domain using `dig` — works outside VPN tunnel.
7
+ * Falls back to Node.js DNS if `dig` is unavailable.
8
+ */
9
+ function resolveDomain(domain) {
10
+ try {
11
+ const output = execSync(`dig +short +time=3 "${domain}"`, {
12
+ timeout: 5000,
13
+ encoding: 'utf8',
14
+ });
15
+ const ips = output
16
+ .split('\n')
17
+ .map((line) => line.trim())
18
+ .filter((line) => /^\d+\.\d+\.\d+\.\d+$/.test(line));
19
+ if (ips.length > 0) return ips;
20
+ } catch {
21
+ // dig not available or failed — fall through to Node DNS
22
+ }
23
+ return null;
24
+ }
25
+
4
26
  async function resolveAll(domains) {
5
27
  const resolved = new Map();
6
28
  const failed = [];
7
29
 
8
30
  const results = await Promise.allSettled(
9
31
  domains.map(async (domain) => {
32
+ // Try dig first (bypasses VPN DNS interception)
33
+ const digIps = resolveDomain(domain);
34
+ if (digIps) return { domain, ips: digIps };
35
+
36
+ // Fallback to Node.js built-in DNS
10
37
  const ips = await withTimeout(dnsPromises.resolve4(domain), 5000);
11
38
  return { domain, ips };
12
39
  })
@@ -21,7 +48,6 @@ async function resolveAll(domains) {
21
48
  failed.push(domain);
22
49
  }
23
50
  } else {
24
- // Extract domain from the original array by index
25
51
  const idx = results.indexOf(result);
26
52
  failed.push(domains[idx]);
27
53
  }