This commit is contained in:
Raven Scott 2024-10-28 16:03:58 -04:00
parent 74dc173319
commit ea04275a43
5 changed files with 770 additions and 174 deletions

View File

@ -4,22 +4,14 @@ This project implements a firewall-resistant, peer-to-peer (P2P) DNS system that
```bash ```bash
[DEBUG 2024-10-14T21:04:20.875Z] Public DNS returned records for www.google.com [DEBUG 2024-10-14T21:04:20.875Z] Public DNS returned records for www.google.com
[DEBUG 2024-10-14T21:04:20.881Z] Public DNS returned records for www.google.com
[DEBUG 2024-10-14T21:04:28.465Z] DNS query received: Domain = example.tld, Type = A [DEBUG 2024-10-14T21:04:28.465Z] DNS query received: Domain = example.tld, Type = A
[DEBUG 2024-10-14T21:04:28.466Z] DNS query received: Domain = example.tld, Type = UNKNOWN_65
Virtual interface dummy2 created with CIDR 192.168.100.2. Virtual interface dummy2 created with CIDR 192.168.100.2.
[DEBUG 2024-10-14T21:04:28.527Z] Assigned virtual interface IP: 192.168.100.2 for domain: example.tld [DEBUG 2024-10-14T21:04:28.527Z] Assigned virtual interface IP: 192.168.100.2 for domain: example.tld
[DEBUG 2024-10-14T21:04:28.528Z] Starting Holesail client for domain: example.tld, hash: 8a5b90945f8fbd5d1b620be3c888a47aaae20706a7f140be4bfa0df9e0dbcf38, IP: 192.168.100.2, Port: 80 [DEBUG 2024-10-14T21:04:28.528Z] Starting Holesail client for domain: example.tld, hash: 8a5b90945f8fbd5d1b620be3c888a47aaae20706a7f140be4bfa0df9e0dbcf38, IP: 192.168.100.2, Port: 80
[DEBUG 2024-10-14T21:04:28.528Z] Using 64-byte connector: 8a5b90945f8fbd5d1b620be3c888a47aaae20706a7f140be4bfa0df9e0dbcf38
[DEBUG 2024-10-14T21:04:28.528Z] Holesail client for example.tld connected on 192.168.100.2:80
Virtual interface dummy2 created with CIDR 192.168.100.2.
[DEBUG 2024-10-14T21:04:28.528Z] Assigned virtual interface IP: 192.168.100.2 for domain: example.tld
``` ```
[![screenshot](https://git.ssh.surf/snxraven/p2ns/raw/branch/main/images/sc.webp)](https://git.ssh.surf/snxraven/p2ns/raw/branch/main/images/sc.webp) [![screenshot](https://git.ssh.surf/snxraven/p2ns/raw/branch/main/images/sc.webp)](https://git.ssh.surf/snxraven/p2ns/raw/branch/main/images/sc.webp)
## Features ## Features
- **Global Decentralized DNS**: Independent of traditional DNS infrastructure; no reliance on central DNS servers. - **Global Decentralized DNS**: Independent of traditional DNS infrastructure; no reliance on central DNS servers.
@ -28,14 +20,15 @@ Virtual interface dummy2 created with CIDR 192.168.100.2.
- **Hybrid DNS Mode**: Resolves both P2P and public DNS records seamlessly. - **Hybrid DNS Mode**: Resolves both P2P and public DNS records seamlessly.
- **Integrated HTTP Proxy**: Proxies HTTP traffic directly to P2P tunnels, eliminating the need for third-party proxy servers. - **Integrated HTTP Proxy**: Proxies HTTP traffic directly to P2P tunnels, eliminating the need for third-party proxy servers.
- **Domain-Driven Hash Proxying**: Routes connections via domain-based unique hashes, no need for traditional IP address exposure. - **Domain-Driven Hash Proxying**: Routes connections via domain-based unique hashes, no need for traditional IP address exposure.
- **Customizable P2P Network**: Initialize with a custom master key to create a private, isolated DNS network. - **Customizable P2P Network**: Initialize with a custom discovery key to create a private, isolated DNS network.
## Getting Started ## Getting Started
### Prerequisites ### Prerequisites
- **Node.js**: Version 18+ recommended - **Node.js**: Version 18+ recommended
- **Holesail**: For tunneling and establishing P2P connections ([Holesail CLI setup](https://holesail.io/)) - **Holesail**: For tunneling and establishing P2P connections ([Holesail CLI setup](https://holesail.io))
- **Environment Variables**: Use `.env` to store your custom keys securely.
### Installation ### Installation
@ -52,7 +45,17 @@ Virtual interface dummy2 created with CIDR 192.168.100.2.
npm install npm install
``` ```
3. **Start the DNS Server** 3. **Set Up Environment Variables**
Create a `.env` file in the root directory to set a custom discovery key, `masterNetworkDiscoveryKey`, for your private network.
```plaintext
masterNetworkDiscoveryKey=<your_custom_hex_key>
```
Replace `<your_custom_hex_key>` with a unique hexadecimal string. This key allows you to create a private, isolated P2P DNS network, so only peers with the same `masterNetworkDiscoveryKey` can discover each other.
4. **Start the DNS Server**
Run the DNS server with elevated permissions (required for binding to port 53). Run the DNS server with elevated permissions (required for binding to port 53).
@ -60,7 +63,7 @@ Virtual interface dummy2 created with CIDR 192.168.100.2.
sudo node index.js sudo node index.js
``` ```
4. **Start the HTTP Server** 5. **Start the HTTP Server**
```bash ```bash
node index.js node index.js
@ -94,14 +97,26 @@ addDomain('example.tld', '8a5b90945f8fbd5d1b620be3c888a47aaae20706a7f140be4bfa0d
This command assigns a virtual IP and establishes a tunnel for `example.tld`. This command assigns a virtual IP and establishes a tunnel for `example.tld`.
### Using a Custom `masterNetworkDiscoveryKey` for a Private Network
To create an isolated, private P2P DNS network, you can configure the system with a custom `masterNetworkDiscoveryKey`. This key acts as a unique identifier for your private DNS network, so only peers using the same `masterNetworkDiscoveryKey` will be able to discover and connect to each other.
#### Setting `masterNetworkDiscoveryKey`
The `masterNetworkDiscoveryKey` should be set in the `.env` file:
```plaintext
masterNetworkDiscoveryKey=<your_custom_hex_key>
```
When defined, the code will use `masterNetworkDiscoveryKey` as the main discovery key, enabling only clients with this key to participate in the network. If `masterNetworkDiscoveryKey` is not set, the system defaults to using `dnsCore.discoveryKey`.
This configuration ensures that only authorized clients with matching keys can join your network, providing a private, secure DNS namespace.
### Starting Holesail Clients for Each Domain ### Starting Holesail Clients for Each Domain
The system will automatically start or reuse a Holesail client for each domain as requests come in, ensuring the connection stays alive and accessible over P2P. The system will automatically start or reuse a Holesail client for each domain as requests come in, ensuring the connection stays alive and accessible over P2P.
### Optional: Running on a Private Network
To create a private DNS network, initialize the Holesail server and clients with a custom master key. Change the key in `holesail-client` to partition your DNS namespace from the public P2P DNS network.
## Usage ## Usage
The P2P DNS server listens on port 53 for DNS requests and automatically proxies HTTP requests on port 80. This means you can access domains in your network without needing direct IPs or proxy servers. The P2P DNS server listens on port 53 for DNS requests and automatically proxies HTTP requests on port 80. This means you can access domains in your network without needing direct IPs or proxy servers.
@ -117,8 +132,22 @@ The system will route the request through the P2P network to the correct local I
## Troubleshooting ## Troubleshooting
- **Binding Issues on Port 53**: Run the DNS server with elevated permissions (`sudo`). - **Binding Issues on Port 53**: Run the DNS server with elevated permissions (`sudo`).
- **Custom `masterNetworkDiscoveryKey` Issues**: Ensure your `.env` file is correctly loaded, and `masterNetworkDiscoveryKey` is set as expected.
- **DNS Lookup Errors**: Check that the domain and hash are correctly added to the DNS core. - **DNS Lookup Errors**: Check that the domain and hash are correctly added to the DNS core.
- **Firewall or NAT Issues**: Ensure that Holesail is set to `--public` for external access. - **Firewall or NAT Issues**: Ensure that Holesail is set to `--public` for external access.
- **Connection Timeout**: Verify that the DNS core topic is correctly set and that the Holesail client can connect.
## Configuration Options
- **masterNetworkDiscoveryKey**: Used to create private, isolated DNS networks. Set this value in your `.env` file.
- **Port Configurations**: Adjust the DNS and HTTP server ports in `index.js` if needed.
- **Logging**: Add custom logs to track DNS queries and Holesail connections more granularly.
## Security Considerations
- **Environment Variables**: Keep `masterNetworkDiscoveryKey` and other sensitive configuration values in the `.env` file, which should be excluded from version control.
- **Firewall**: Restrict external access to the DNS server to maintain control over the network.
- **Key Rotation**: Periodically update `masterNetworkDiscoveryKey` to maintain network security.
## Future Enhancements ## Future Enhancements

1
default.env Normal file
View File

@ -0,0 +1 @@
masterNetworkDiscoveryKey="55f79ff1b69c1526dfa31145ce2cf02f1dd7fb93d92e55b9ac511669151c0e27"

161
p2ns.js
View File

@ -1,3 +1,4 @@
require('dotenv').config(); // Load environment variables
const { exec } = require('child_process'); const { exec } = require('child_process');
const dgram = require('dgram'); const dgram = require('dgram');
const dnsPacket = require('dns-packet'); const dnsPacket = require('dns-packet');
@ -12,6 +13,12 @@ const net = require('net');
// Corestore and Hyperswarm setup for P2P sync // Corestore and Hyperswarm setup for P2P sync
const store = new Corestore('./my-storage'); const store = new Corestore('./my-storage');
const swarm = new Hyperswarm(); const swarm = new Hyperswarm();
// Option for setting a customizable masterNetwork_discoveryKey for TLD syncing
const masterNetworkDiscoveryKey = process.env.masterNetworkDiscoveryKey
? Buffer.from(process.env.masterNetworkDiscoveryKey, 'hex')
: null;
const dnsCore = store.get({ name: 'dns-core' }); const dnsCore = store.get({ name: 'dns-core' });
let holesailClient = null; let holesailClient = null;
@ -19,6 +26,8 @@ const dnsServer = dgram.createSocket('udp4');
const domainToIPMap = {}; const domainToIPMap = {};
let currentIP = 2; // Start assigning IP addresses from 192.168.100.2 let currentIP = 2; // Start assigning IP addresses from 192.168.100.2
console.log(`Loaded masterNetworkDiscoveryKey: ${masterNetworkDiscoveryKey ? masterNetworkDiscoveryKey.toString('hex') : 'None'}`);
// Helper function to remove existing virtual interface if it already exists (for macOS) // Helper function to remove existing virtual interface if it already exists (for macOS)
function removeExistingInterface(subnetName) { function removeExistingInterface(subnetName) {
return new Promise((resolve) => { return new Promise((resolve) => {
@ -101,7 +110,7 @@ function checkPublicDNS(domain) {
questions: [{ type: 'A', name: domain }] questions: [{ type: 'A', name: domain }]
}); });
resolver.send(query, 53, '192.168.0.16', (err) => { resolver.send(query, 53, '1.1.1.1', (err) => {
if (err) { if (err) {
logDebug(`Error forwarding DNS query to 1.1.1.1: ${err}`); logDebug(`Error forwarding DNS query to 1.1.1.1: ${err}`);
return resolve(null); return resolve(null);
@ -154,31 +163,12 @@ function startHolesailClient(domain, hash, ip, port) {
return holesailClient; return holesailClient;
} }
// Function to restart Holesail client if the port is unresponsive
async function restartHolesailClient(domain, hash, ip, port) {
const isResponsive = await checkPortResponsive(ip, port);
if (!isResponsive) {
logDebug(`Port ${port} on ${ip} is unresponsive, destroying and recreating the Holesail client`);
// Destroy the existing client if available and remove it from activeConnections
if (activeConnections[domain]) {
activeConnections[domain].destroy();
delete activeConnections[domain];
}
// Create a new connection and add it to activeConnections
await createInterfaceForDomain(domain);
startHolesailClient(domain, hash, ip, port);
} else {
logDebug(`Port ${port} on ${ip} is responsive, using the existing connection.`);
}
}
// Ensure the DNS Core is ready before joining the swarm // Ensure the DNS Core is ready before joining the swarm
(async () => { (async () => {
await dnsCore.ready(); await dnsCore.ready();
const topic = dnsCore.discoveryKey;
// Use masterNetworkDiscoveryKey if provided; otherwise, use dnsCore.discoveryKey
const topic = masterNetworkDiscoveryKey || dnsCore.discoveryKey;
logDebug(`DNS Core ready, joining Hyperswarm with topic: ${topic.toString('hex')}`); logDebug(`DNS Core ready, joining Hyperswarm with topic: ${topic.toString('hex')}`);
@ -200,130 +190,5 @@ async function addDomain(domain, hash) {
logDebug(`Domain ${domain} added to DNS core`); logDebug(`Domain ${domain} added to DNS core`);
} }
// Function to handle long connectors (128-byte) or standard connectors (64-byte)
function setupConnector(keyInput) {
if (keyInput.length === 64) {
logDebug(`Using 64-byte connector: ${keyInput}`);
return keyInput;
} else {
logDebug(`Hashing 128-byte connector: ${keyInput}`);
const connector = createHash('sha256').update(keyInput.toString()).digest('hex');
const seed = Buffer.from(connector, 'hex');
return b4a.toString(seed, 'hex');
}
}
// DNS Server Setup for listening on port 53
dnsServer.on('message', async (msg, rinfo) => {
const query = dnsPacket.decode(msg);
const domain = query.questions[0].name;
const type = query.questions[0].type;
logDebug(`DNS query received: Domain = ${domain}, Type = ${type}`);
await dnsCore.ready();
let p2pRecord = null;
for await (const data of dnsCore.createReadStream()) {
const record = JSON.parse(data.toString());
if (record.domain === domain) {
p2pRecord = record;
break;
}
}
const publicDNSRecords = await checkPublicDNS(domain);
if (p2pRecord) {
const localIP = domainToIPMap[domain] || await createInterfaceForDomain(domain);
startHolesailClient(domain, p2pRecord.hash, localIP, 80);
const response = dnsPacket.encode({
type: 'response',
id: query.id,
questions: query.questions,
answers: [{
type: 'A',
name: domain,
ttl: 300,
data: localIP
}]
});
dnsServer.send(response, rinfo.port, rinfo.address);
} else if (publicDNSRecords) {
const response = dnsPacket.encode({
type: 'response',
id: query.id,
questions: query.questions,
answers: publicDNSRecords
});
dnsServer.send(response, rinfo.port, rinfo.address);
} else {
logDebug(`No P2P or public DNS records found for ${domain}`);
const response = dnsPacket.encode({
type: 'response',
id: query.id,
questions: query.questions,
answers: []
});
dnsServer.send(response, rinfo.port, rinfo.address);
}
});
// Ensure DNS server binds to port 53 with elevated permissions (may require sudo)
dnsServer.bind(53, '0.0.0.0', (err) => {
if (err) {
console.error(`Failed to bind DNS server to port 53: ${err.message}`);
process.exit(1);
} else {
logDebug('DNS Server running on port 53, bound to 0.0.0.0');
}
});
// HTTP Server with DNS query before proxying
http.createServer(async (req, res) => {
const domain = req.url.replace("/", "");
logDebug(`HTTP request for domain: ${domain}`);
try {
const localIP = domainToIPMap[domain] || await createInterfaceForDomain(domain);
if (!localIP) {
logDebug(`No DNS records for ${domain}`);
res.writeHead(404);
return res.end('Domain not found');
}
await restartHolesailClient(domain, '07b8b52fbbad7a89ce26ad2d8375e6a82b2e3c02f18596bddff18e9c31164b04', localIP, 80);
const options = {
hostname: localIP,
port: 80,
path: req.url,
method: req.method,
headers: req.headers,
};
const proxyRequest = http.request(options, (proxyRes) => {
res.writeHead(proxyRes.statusCode, proxyRes.headers);
proxyRes.pipe(res, { end: true });
});
proxyRequest.on('error', (err) => {
logDebug(`Error proxying request for ${domain}: ${err.message}`);
res.writeHead(500);
res.end('Internal Server Error');
});
req.pipe(proxyRequest, { end: true });
} catch (err) {
logDebug(`Failed to handle request for ${domain}: ${err.message}`);
res.writeHead(500);
res.end('Internal Server Error');
}
}).listen(80, '127.0.0.1', () => {
logDebug('HTTP server running on port 80');
});
// Example: Add a domain to the P2P DNS system // Example: Add a domain to the P2P DNS system
addDomain('hello.geek', '07b8b52fbbad7a89ce26ad2d8375e6a82b2e3c02f18596bddff18e9c31164b04'); addDomain('hello.geek', '07b8b52fbbad7a89ce26ad2d8375e6a82b2e3c02f18596bddff18e9c31164b04');

700
package-lock.json generated Normal file
View File

@ -0,0 +1,700 @@
{
"name": "p2ns",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "p2ns",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"b4a": "^1.6.7",
"corestore": "^6.18.4",
"dns-packet": "^5.6.1",
"dotenv": "^16.4.5",
"holesail-client": "^1.1.4",
"hyperswarm": "^4.8.4"
}
},
"node_modules/@holesail/hyper-cmd-lib-net": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@holesail/hyper-cmd-lib-net/-/hyper-cmd-lib-net-0.1.1.tgz",
"integrity": "sha512-GGgjB9QmKu8CinYFkgq+T9nzibNLArsx84mI31cA4SYYFmDzcfwa+zQO+mYFp4mcQUfM8/5x2hpxsB7XVknqxw=="
},
"node_modules/@hyperswarm/secret-stream": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@hyperswarm/secret-stream/-/secret-stream-6.7.0.tgz",
"integrity": "sha512-4N0x/G0VAmZaDvUAZRWEpPyAs0PnHfY+lOgNV4KLFhKNfw+GkVVXMlwpSXTDcqRSlDvla8iRg3OICZRu7RTOJQ==",
"dependencies": {
"b4a": "^1.1.0",
"hypercore-crypto": "^3.3.1",
"noise-curve-ed": "^2.0.1",
"noise-handshake": "^3.0.2",
"sodium-secretstream": "^1.1.0",
"sodium-universal": "^4.0.0",
"streamx": "^2.14.0",
"timeout-refresh": "^2.0.0",
"unslab": "^1.3.0"
}
},
"node_modules/@leichtgewicht/ip-codec": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
"integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw=="
},
"node_modules/b4a": {
"version": "1.6.7",
"resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
"integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="
},
"node_modules/bare-dns": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/bare-dns/-/bare-dns-1.0.5.tgz",
"integrity": "sha512-Hqb9dpUe4M7y9N6oRV0XhHzUkUliyUE7qw/q3cmn0PF06fdBXooy45fvKGeYUUv6OCvXyLKfi7b7QyZS7r/YoQ=="
},
"node_modules/bare-events": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz",
"integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A=="
},
"node_modules/bare-fs": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-3.1.1.tgz",
"integrity": "sha512-AhJ8tNQxhYGfpYERMKshGXG5CJF7S2JpxYAGTa1+Bd78m4TKeMqj9UqmW8Z2ooAYeP0idv0fi/AYVomS9NqKRQ==",
"optional": true,
"dependencies": {
"bare-events": "^2.0.0",
"bare-path": "^3.0.0",
"bare-stream": "^2.0.0"
}
},
"node_modules/bare-net": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/bare-net/-/bare-net-1.0.1.tgz",
"integrity": "sha512-eTMpS2fxXiuz5eMvMGEkJBsgIfanPFoniiepCmgbCRQVdAIjg1wutaRzHTqRJpuG4yCzrcar581AIPf1XzyH8g==",
"dependencies": {
"bare-events": "^2.2.2",
"bare-pipe": "^3.2.0",
"bare-stream": "^2.0.0",
"bare-tcp": "^1.4.0"
}
},
"node_modules/bare-os": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.2.1.tgz",
"integrity": "sha512-2DK/A2wc9+9RySMGv0s4rX9cYlnyuu8nYXL1/XxObnlaQhIAABJXQi5PX5ChMep1xCVXF9TDVhgdq/Y+Qb5meg==",
"optional": true,
"engines": {
"bare": ">=1.6.0"
}
},
"node_modules/bare-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
"integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
"optional": true,
"dependencies": {
"bare-os": "^3.0.1"
}
},
"node_modules/bare-pipe": {
"version": "3.3.8",
"resolved": "https://registry.npmjs.org/bare-pipe/-/bare-pipe-3.3.8.tgz",
"integrity": "sha512-X8Ulz/os6LR/cF5HBljq/tJ0NP7eNGjiripZF53EMtgkhJ9FVl1/WLZxwvUvcqbR82Ywaq6KYM+A6zS7DGPPUw==",
"dependencies": {
"bare-events": "^2.0.0",
"bare-stream": "^2.0.0"
}
},
"node_modules/bare-stream": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.2.tgz",
"integrity": "sha512-EFZHSIBkDgSHIwj2l2QZfP4U5OcD4xFAOwhSb/vlr9PIqyGJGvB/nfClJbcnh3EY4jtPE4zsb5ztae96bVF79A==",
"dependencies": {
"streamx": "^2.20.0"
}
},
"node_modules/bare-tcp": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/bare-tcp/-/bare-tcp-1.9.1.tgz",
"integrity": "sha512-eaiKHR0ECRrIrsVNVIjoJxA6J08YqR/kSQ5Ikd0nRmgp5qtKxt49PS0z+USfcN5ZsfDcVFpUFo108EAeXtCshA==",
"dependencies": {
"bare-dns": "^1.0.0",
"bare-events": "^2.2.2",
"bare-stream": "^2.0.0"
}
},
"node_modules/big-sparse-array": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/big-sparse-array/-/big-sparse-array-1.0.3.tgz",
"integrity": "sha512-6RjV/3mSZORlMdpUaQ6rUSpG637cZm0//E54YYGtQg1c1O+AbZP8UTdJ/TchsDZcTVLmyWZcseBfp2HBeXUXOQ=="
},
"node_modules/bits-to-bytes": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/bits-to-bytes/-/bits-to-bytes-1.3.0.tgz",
"integrity": "sha512-OJoHTpFXS9bXHBCekGTByf3MqM8CGblBDIduKQeeVVeiU9dDWywSSirXIBYGgg3d1zbVuvnMa1vD4r6PA0kOKg==",
"dependencies": {
"b4a": "^1.5.0"
}
},
"node_modules/blind-relay": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/blind-relay/-/blind-relay-1.3.3.tgz",
"integrity": "sha512-J49HZaRLA+jgmIA+J01x0NzDtNMQVzuFfz7CnLLijIUMJkxTbaexIGI/tfk6LONcr/+INmgbS8gMLeuaRvfreA==",
"dependencies": {
"b4a": "^1.6.4",
"bare-events": "^2.2.0",
"bits-to-bytes": "^1.3.0",
"compact-encoding": "^2.12.0",
"compact-encoding-bitfield": "^1.0.0",
"hypertrace": "^1.4.1",
"protomux": "^3.5.1",
"sodium-universal": "^4.0.0",
"streamx": "^2.15.1"
}
},
"node_modules/bogon": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/bogon/-/bogon-1.1.0.tgz",
"integrity": "sha512-a6SnToksXHuUlgeMvI/txWmTcKz7c7iBa8f0HbXL4toN1Uza/CTQ4F7n9jSDX49TCpxv3KUP100q4sZfwLyLiw==",
"dependencies": {
"compact-encoding": "^2.11.0",
"compact-encoding-net": "^1.2.0"
}
},
"node_modules/compact-encoding": {
"version": "2.15.0",
"resolved": "https://registry.npmjs.org/compact-encoding/-/compact-encoding-2.15.0.tgz",
"integrity": "sha512-af/NomxL9Mo0lqCk++rxLLDZI+lJqeBrPt4dK6FbjxTCEhfC9yQAIoO6yq9ixyCirce0luQwErkwJrhem6clxA==",
"dependencies": {
"b4a": "^1.3.0"
}
},
"node_modules/compact-encoding-bitfield": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/compact-encoding-bitfield/-/compact-encoding-bitfield-1.0.0.tgz",
"integrity": "sha512-3nMVKUg+PF72UHfainmCL8uKvyWfxsjqOtUY+HiMPGLPCTjnwzoKfFAMo1Ad7nwTPdjBqtGK5b3BOFTFW4EBTg==",
"dependencies": {
"compact-encoding": "^2.4.1"
}
},
"node_modules/compact-encoding-net": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/compact-encoding-net/-/compact-encoding-net-1.2.0.tgz",
"integrity": "sha512-LVXpNpF7PGQeHRVVLGgYWzuVoYAaDZvKUsUxRioGfkotzvOh4AzoQF1HBH3zMNaSnx7gJXuUr3hkjnijaH/Eng==",
"dependencies": {
"compact-encoding": "^2.4.1"
}
},
"node_modules/corestore": {
"version": "6.18.4",
"resolved": "https://registry.npmjs.org/corestore/-/corestore-6.18.4.tgz",
"integrity": "sha512-KL1cOUyj3DFRNzeVRekGPRiGN4sIfGo7BsncSJQQBT3Rh2y1nQ32MOR9X5DlOMlWIT4txwqBzhzam6+JXtwFVw==",
"dependencies": {
"b4a": "^1.6.4",
"hypercore": "^10.37.10",
"hypercore-crypto": "^3.4.0",
"hypercore-id-encoding": "^1.2.0",
"read-write-mutexify": "^2.1.0",
"ready-resource": "^1.0.0",
"safety-catch": "^1.0.1",
"sodium-universal": "^4.0.0",
"xache": "^1.1.0"
}
},
"node_modules/crc-native": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/crc-native/-/crc-native-1.1.4.tgz",
"integrity": "sha512-ZKKd/VY7jSchZ87agNxG/yTc02+W/JDCvOFDVieGU/wwcLNzt95Q4KQLjmmL9dmPsmbBZhjOnsPNZBQ15Df5IA==",
"optional": true,
"dependencies": {
"node-gyp-build": "^4.8.2"
}
},
"node_modules/crc-universal": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/crc-universal/-/crc-universal-1.0.4.tgz",
"integrity": "sha512-CE9xWEI6Gd5V0Bdmj5NoWH3d7+EIe4zUpy1sv6uvKYznzsDP1vhiWsTBmL6q9IrH2P6RRshp+8AkhR4CMtY5Hg==",
"optionalDependencies": {
"crc-native": "^1.0.3"
}
},
"node_modules/dht-rpc": {
"version": "6.15.1",
"resolved": "https://registry.npmjs.org/dht-rpc/-/dht-rpc-6.15.1.tgz",
"integrity": "sha512-nX5HQdkuh3wzz8QnZJJs5tKF2u0ckOxwnq8ddkMYyiwDIjlILVOdcUX0i+dwyMSsynR6I+43g9jYwZwRcFG2ww==",
"dependencies": {
"b4a": "^1.6.1",
"bare-events": "^2.2.0",
"compact-encoding": "^2.11.0",
"compact-encoding-net": "^1.2.0",
"fast-fifo": "^1.1.0",
"kademlia-routing-table": "^1.0.1",
"nat-sampler": "^1.0.1",
"sodium-universal": "^4.0.0",
"streamx": "^2.13.2",
"time-ordered-set": "^2.0.0",
"udx-native": "^1.5.3"
}
},
"node_modules/dns-packet": {
"version": "5.6.1",
"resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
"integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
"dependencies": {
"@leichtgewicht/ip-codec": "^2.0.1"
},
"engines": {
"node": ">=6"
}
},
"node_modules/dotenv": {
"version": "16.4.5",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
"integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://dotenvx.com"
}
},
"node_modules/fast-fifo": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
"integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="
},
"node_modules/flat-tree": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/flat-tree/-/flat-tree-1.12.0.tgz",
"integrity": "sha512-hcDXNuIIugsOYPYogrDAvTwrvXw8q1AybTGyPNy+QdA8JWdgcnVceLfWpJIkAmH1itJiDeqjpjvLmnTFF6fi4Q=="
},
"node_modules/fs-native-extensions": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/fs-native-extensions/-/fs-native-extensions-1.3.2.tgz",
"integrity": "sha512-fQaLJt4uY96iiMdy+rV561TaXefkfTq4dmSXcN2D1z8SBtFTsmcO3GaJexPKTxltqdh826JQBK1CySo3EpzgQQ==",
"optional": true,
"dependencies": {
"node-gyp-build": "^4.8.2",
"which-runtime": "^1.2.0"
}
},
"node_modules/holesail-client": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/holesail-client/-/holesail-client-1.1.4.tgz",
"integrity": "sha512-5PSXPTqP3l5eAOAXnxwOHHKFRSt71gh0RJLGIqGpguOwBAKBW9sfSwIif0KFb6Z6X9bJ2X8KWaWUFTzElx419A==",
"dependencies": {
"@holesail/hyper-cmd-lib-net": "^0.1.0",
"b4a": "^1.6.6",
"bare-net": "^1.0.1",
"hyper-cmd-lib-keys": "^0.0.2",
"hyperdht": "^6.16.2",
"net": "npm:bare-net"
}
},
"node_modules/hyper-cmd-lib-keys": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/hyper-cmd-lib-keys/-/hyper-cmd-lib-keys-0.0.2.tgz",
"integrity": "sha512-/KUs6yDoBzYFSlx2PnFoCDZaiNwMqc+iDsMqaXM0Wd+Ntu2nkxJxFSlxKCZUThHOmjJF3DH1SPD/5kgENpbwug=="
},
"node_modules/hypercore": {
"version": "10.37.25",
"resolved": "https://registry.npmjs.org/hypercore/-/hypercore-10.37.25.tgz",
"integrity": "sha512-47kDQWiRSOTbpps+lAKrKYo+6at7pmTN1lvlmUhNPDDOz8GjEnUhH36iiUzk90tF12Y9/GEaL09TP3yljIRswA==",
"dependencies": {
"@hyperswarm/secret-stream": "^6.0.0",
"b4a": "^1.1.0",
"bare-events": "^2.2.0",
"big-sparse-array": "^1.0.3",
"compact-encoding": "^2.11.0",
"crc-universal": "^1.0.2",
"fast-fifo": "^1.3.0",
"flat-tree": "^1.9.0",
"hypercore-crypto": "^3.2.1",
"hypercore-errors": "^1.2.0",
"hypercore-id-encoding": "^1.2.0",
"is-options": "^1.0.1",
"protomux": "^3.5.0",
"quickbit-universal": "^2.2.0",
"random-access-file": "^4.0.0",
"random-array-iterator": "^1.0.0",
"safety-catch": "^1.0.1",
"sodium-universal": "^4.0.0",
"streamx": "^2.12.4",
"unslab": "^1.3.0",
"xache": "^1.1.0",
"z32": "^1.0.0"
}
},
"node_modules/hypercore-crypto": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/hypercore-crypto/-/hypercore-crypto-3.4.2.tgz",
"integrity": "sha512-16ii4M6T1dFfRa41Szv3IR0wXfImJMYJ8ysZEGwHEDH7sMeWVEBck6tg1GCNutYl39E+H7wMY2p3ndCRfj+XdQ==",
"dependencies": {
"b4a": "^1.6.6",
"compact-encoding": "^2.15.0",
"sodium-universal": "^4.0.1"
}
},
"node_modules/hypercore-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/hypercore-errors/-/hypercore-errors-1.3.0.tgz",
"integrity": "sha512-WsmSu05Ve1hXaT/2Etwz7mgZ1sAXe8EaveahUfaeECllxvYNaP5EbAPw5YaA4OqR3d217litGt4qKch9TBnavA=="
},
"node_modules/hypercore-id-encoding": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/hypercore-id-encoding/-/hypercore-id-encoding-1.3.0.tgz",
"integrity": "sha512-W6sHdGo5h7LXEsoWfKf/KfuROZmZRQDlGqJF2EPHW+noCK66Vvr0+zE6cL0vqQi18s0kQPeN7Sq3QyR0Ytc2VQ==",
"dependencies": {
"b4a": "^1.5.3",
"z32": "^1.0.0"
}
},
"node_modules/hyperdht": {
"version": "6.19.0",
"resolved": "https://registry.npmjs.org/hyperdht/-/hyperdht-6.19.0.tgz",
"integrity": "sha512-SS/wehfPPiN1o+e2h+NAiGS9Wk3xePRZ3qrIR9NUzyjRyEnFl5S2QnaqWLxepIY8Ba0GsPSfXXCsMCPiCBn4mA==",
"dependencies": {
"@hyperswarm/secret-stream": "^6.6.2",
"b4a": "^1.3.1",
"bare-events": "^2.2.0",
"blind-relay": "^1.3.0",
"bogon": "^1.0.0",
"compact-encoding": "^2.4.1",
"compact-encoding-net": "^1.0.1",
"dht-rpc": "^6.15.1",
"hypercore-crypto": "^3.3.0",
"hypercore-id-encoding": "^1.2.0",
"noise-curve-ed": "^2.0.0",
"noise-handshake": "^3.0.0",
"record-cache": "^1.1.1",
"safety-catch": "^1.0.1",
"signal-promise": "^1.0.3",
"sodium-universal": "^4.0.0",
"streamx": "^2.16.1",
"unslab": "^1.3.0",
"xache": "^1.1.0"
},
"bin": {
"hyperdht": "bin.js"
}
},
"node_modules/hyperswarm": {
"version": "4.8.4",
"resolved": "https://registry.npmjs.org/hyperswarm/-/hyperswarm-4.8.4.tgz",
"integrity": "sha512-+ysGkogdCK3LqF9kpJ5yCp38EkJq0Gr9z0iXLAbFWzKhZfyDMy6YzqIOn1uFDwpNvlHK3tMaSeiBsWkUdT4jHQ==",
"dependencies": {
"b4a": "^1.3.1",
"bare-events": "^2.2.0",
"hyperdht": "^6.11.0",
"safety-catch": "^1.0.2",
"shuffled-priority-queue": "^2.1.0",
"unslab": "^1.3.0"
}
},
"node_modules/hypertrace": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/hypertrace/-/hypertrace-1.4.2.tgz",
"integrity": "sha512-sa6iq1FaJ03Db3eUl5ZodyOL3fheyrum9xzeHasXOQ/AprTT6vS1WjpbXfYkHhmzVmyn0jBW/VsCb1QaBkGyow=="
},
"node_modules/is-options": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-options/-/is-options-1.0.2.tgz",
"integrity": "sha512-u+Ai74c8Q74aS8BuHwPdI1jptGOT1FQXgCq8/zv0xRuE+wRgSMEJLj8lVO8Zp9BeGb29BXY6AsNPinfqjkr7Fg==",
"dependencies": {
"b4a": "^1.1.1"
}
},
"node_modules/kademlia-routing-table": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/kademlia-routing-table/-/kademlia-routing-table-1.0.3.tgz",
"integrity": "sha512-ag1nLPaCSxbLnG6zeTBoGkdm+JSUi2JHMiNynHBoRG8se2w9yfyzepF3oX1B52HOEldtbuxTde5NxbNUtnwGqA==",
"dependencies": {
"bare-events": "^2.2.0"
}
},
"node_modules/nanoassert": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz",
"integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA=="
},
"node_modules/nat-sampler": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/nat-sampler/-/nat-sampler-1.0.1.tgz",
"integrity": "sha512-yQvyNN7xbqR8crTKk3U8gRgpcV1Az+vfCEijiHu9oHHsnIl8n3x+yXNHl42M6L3czGynAVoOT9TqBfS87gDdcw=="
},
"node_modules/net": {
"name": "bare-net",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/bare-net/-/bare-net-1.0.1.tgz",
"integrity": "sha512-eTMpS2fxXiuz5eMvMGEkJBsgIfanPFoniiepCmgbCRQVdAIjg1wutaRzHTqRJpuG4yCzrcar581AIPf1XzyH8g==",
"dependencies": {
"bare-events": "^2.2.2",
"bare-pipe": "^3.2.0",
"bare-stream": "^2.0.0",
"bare-tcp": "^1.4.0"
}
},
"node_modules/node-gyp-build": {
"version": "4.8.2",
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz",
"integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==",
"bin": {
"node-gyp-build": "bin.js",
"node-gyp-build-optional": "optional.js",
"node-gyp-build-test": "build-test.js"
}
},
"node_modules/noise-curve-ed": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/noise-curve-ed/-/noise-curve-ed-2.0.1.tgz",
"integrity": "sha512-8HMZ40Wmarg8RQjVemLrjB49JSL6eGeOD+tlzaQW5/p+hNPfHFEMC3UZZ57zUqUprMuz6GN+gsPExpz2DWL+iA==",
"dependencies": {
"b4a": "^1.1.0",
"nanoassert": "^2.0.0",
"sodium-universal": "^4.0.0"
}
},
"node_modules/noise-handshake": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/noise-handshake/-/noise-handshake-3.1.0.tgz",
"integrity": "sha512-0S1qkUvMbTvZCfgr/vSkVT84YyvI4Q0OLwSc5BFxVmjaePrxAwVeXeJDY3A7N/7+qj95gZ15LaNoP9ZnBXH5Lw==",
"dependencies": {
"b4a": "^1.1.0",
"nanoassert": "^2.0.0",
"sodium-universal": "^4.0.0"
}
},
"node_modules/protomux": {
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/protomux/-/protomux-3.10.0.tgz",
"integrity": "sha512-YjNhvdYWI5HGbbUUKRR8DT3mg+RaZQT6V5T83ktd4veAdHg0CLvevcs33wo8rjdEwCnRaSNXkzlw48tbSaPVag==",
"dependencies": {
"b4a": "^1.3.1",
"compact-encoding": "^2.5.1",
"queue-tick": "^1.0.0",
"safety-catch": "^1.0.1",
"unslab": "^1.3.0"
}
},
"node_modules/queue-tick": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
"integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag=="
},
"node_modules/quickbit-native": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/quickbit-native/-/quickbit-native-2.3.3.tgz",
"integrity": "sha512-naZ1U2qe883tKZCmIlfvgJXouQW1Av1lQGjhVGZEapxKKqbwbgMMkajHoHABLPF0mUml4ArmkVEGXw8RVJUhDg==",
"optional": true,
"dependencies": {
"b4a": "^1.6.0",
"node-gyp-build": "^4.8.2"
}
},
"node_modules/quickbit-universal": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/quickbit-universal/-/quickbit-universal-2.2.0.tgz",
"integrity": "sha512-w02i1R8n7+6pEKTud8DfF8zbFY9o7RtPlUc3jWbtCkDKvhbx/AvV7oNnz4/TcmsPGpSJS+fq5Ud6RH6+YPvSGg==",
"dependencies": {
"b4a": "^1.6.0",
"simdle-universal": "^1.1.0"
},
"optionalDependencies": {
"quickbit-native": "^2.2.0"
}
},
"node_modules/random-access-file": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/random-access-file/-/random-access-file-4.1.0.tgz",
"integrity": "sha512-n8uYXv1QXBLIekN6g8ycBqT/3aS955ku/8lTMcqn78EaVLegz/QTsVZoojArijhyZjLyYVHQ4Hu/BKj9G7v4eg==",
"dependencies": {
"random-access-storage": "^3.0.0"
},
"optionalDependencies": {
"bare-fs": "^3.0.2",
"bare-path": "^3.0.0",
"fs-native-extensions": "^1.3.1"
}
},
"node_modules/random-access-storage": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/random-access-storage/-/random-access-storage-3.0.2.tgz",
"integrity": "sha512-Es9maUyWdJXWKckKy9s1+vT+DEgAt+PBb9lxPaake/0EDUsHehloKGv9v1zimS2V3gpFAcQXubvc1Rgci2sDPQ==",
"dependencies": {
"bare-events": "^2.2.0",
"queue-tick": "^1.0.0"
}
},
"node_modules/random-array-iterator": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/random-array-iterator/-/random-array-iterator-1.0.0.tgz",
"integrity": "sha512-u7xCM93XqKEvPTP6xZp2ehttcAemKnh73oKNf1FvzuVCfpt6dILDt1Kxl1LeBjm2iNIeR49VGFhy4Iz3yOun+Q=="
},
"node_modules/read-write-mutexify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/read-write-mutexify/-/read-write-mutexify-2.1.0.tgz",
"integrity": "sha512-fDw/p5/acI1ytVY1UbxEDma/ej1yJH/n9NcjS9YNzcE6sPBPWdlru3ydRa/UBowUg4zqOvNMD5SOGYJrlQ6MzQ=="
},
"node_modules/ready-resource": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ready-resource/-/ready-resource-1.1.1.tgz",
"integrity": "sha512-EQbJs+wXphM1opGCpYSp3toAID8okqGDLmhjGLCiptMfMHGcTxdP3lsmSsYwU+lbrUXrbuhhgcDPge656X48VQ==",
"dependencies": {
"bare-events": "^2.2.0"
}
},
"node_modules/record-cache": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/record-cache/-/record-cache-1.2.0.tgz",
"integrity": "sha512-kyy3HWCez2WrotaL3O4fTn0rsIdfRKOdQQcEJ9KpvmKmbffKVvwsloX063EgRUlpJIXHiDQFhJcTbZequ2uTZw==",
"dependencies": {
"b4a": "^1.3.1"
}
},
"node_modules/safety-catch": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/safety-catch/-/safety-catch-1.0.2.tgz",
"integrity": "sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA=="
},
"node_modules/shuffled-priority-queue": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/shuffled-priority-queue/-/shuffled-priority-queue-2.1.0.tgz",
"integrity": "sha512-xhdh7fHyMsr0m/w2kDfRJuBFRS96b9l8ZPNWGaQ+PMvnUnZ/Eh+gJJ9NsHBd7P9k0399WYlCLzsy18EaMfyadA==",
"dependencies": {
"unordered-set": "^2.0.1"
}
},
"node_modules/signal-promise": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/signal-promise/-/signal-promise-1.0.3.tgz",
"integrity": "sha512-WBgv0UnIq2C+Aeh0/n+IRpP6967eIx9WpynTUoiW3isPpfe1zu2LJzyfXdo9Tgef8yR/sGjcMvoUXD7EYdiz+g=="
},
"node_modules/simdle-native": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/simdle-native/-/simdle-native-1.3.3.tgz",
"integrity": "sha512-ZuZ4T71SmunYAZQ3/hg7dy8yUrzjR2VPc50zSKX34JS9RD41QL1wTniJdjp7pq77iNDbekSOCgyYEteDjdyBGw==",
"optional": true,
"dependencies": {
"b4a": "^1.6.0",
"node-gyp-build": "^4.8.2"
}
},
"node_modules/simdle-universal": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/simdle-universal/-/simdle-universal-1.1.2.tgz",
"integrity": "sha512-3n3w1bs+uwgHKQjt6arez83EywNlhZzYvNOhvAASTl/8KqNIcqr6aHyGt3JRlfuUC7iB0tomJRPlJ2cRGIpBzA==",
"dependencies": {
"b4a": "^1.6.0"
},
"optionalDependencies": {
"simdle-native": "^1.1.1"
}
},
"node_modules/sodium-native": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.2.1.tgz",
"integrity": "sha512-48X3PfRLW+f0fgb3J7f7mkZ9eBKcGR/bD5mdXXLAx4RWwKUe3095yPQgiUUQTfh8Q29JzwhSQATitQDBIozN/w==",
"dependencies": {
"node-gyp-build": "^4.8.0"
}
},
"node_modules/sodium-secretstream": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/sodium-secretstream/-/sodium-secretstream-1.1.1.tgz",
"integrity": "sha512-9lRQtNdQYmANo+sgNjEQafKrd/N4ojqv17E8wOzx3yOCaOJ5Gb4MuXoYq2Nv4Xo9Kt2fOROYcmV24bamu86c8A==",
"dependencies": {
"b4a": "^1.1.1",
"sodium-universal": "^4.0.0"
}
},
"node_modules/sodium-universal": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/sodium-universal/-/sodium-universal-4.0.1.tgz",
"integrity": "sha512-sNp13PrxYLaUFHTGoDKkSDFvoEu51bfzE12RwGlqU1fcrkpAOK0NvizaJzOWV0Omtk9me2+Pnbjcf/l0efxuGQ==",
"dependencies": {
"sodium-native": "^4.0.0"
},
"peerDependencies": {
"sodium-javascript": "~0.8.0"
},
"peerDependenciesMeta": {
"sodium-javascript": {
"optional": true
}
}
},
"node_modules/streamx": {
"version": "2.20.1",
"resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz",
"integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==",
"dependencies": {
"fast-fifo": "^1.3.2",
"queue-tick": "^1.0.1",
"text-decoder": "^1.1.0"
},
"optionalDependencies": {
"bare-events": "^2.2.0"
}
},
"node_modules/text-decoder": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz",
"integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ=="
},
"node_modules/time-ordered-set": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/time-ordered-set/-/time-ordered-set-2.0.1.tgz",
"integrity": "sha512-VJEKmgSN2UiOLB8BpN8Sh2b9LGMHTP5OPrQRpnKjvOheOyzk0mufbjzjKTIG2gO4A+Y+vDJ+0TcLbpUmMLsg8A=="
},
"node_modules/timeout-refresh": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/timeout-refresh/-/timeout-refresh-2.0.1.tgz",
"integrity": "sha512-SVqEcMZBsZF9mA78rjzCrYrUs37LMJk3ShZ851ygZYW1cMeIjs9mL57KO6Iv5mmjSQnOe/29/VAfGXo+oRCiVw=="
},
"node_modules/udx-native": {
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/udx-native/-/udx-native-1.14.0.tgz",
"integrity": "sha512-w4/bZsvzg5lZwBPRx56mGsQMD1HtnL81s5ig96xzX6GPGMCdOMfxa4ktAM2qh7vOj1nu6kL2FjKBO+Fe7lUBrw==",
"dependencies": {
"b4a": "^1.5.0",
"bare-events": "^2.2.0",
"node-gyp-build": "^4.4.0",
"streamx": "^2.14.0"
}
},
"node_modules/unordered-set": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/unordered-set/-/unordered-set-2.0.1.tgz",
"integrity": "sha512-eUmNTPzdx+q/WvOHW0bgGYLWvWHNT3PTKEQLg0MAQhc0AHASHVHoP/9YytYd4RBVariqno/mEUhVZN98CmD7bg=="
},
"node_modules/unslab": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/unslab/-/unslab-1.3.0.tgz",
"integrity": "sha512-YATkfKAFj47kTzmiQrWXMyRvaVrHsW6MEALa4bm+FhiA2YG4oira+Z3DXN6LrYOYn2Y8eO94Lwl9DOHjs1FpoQ==",
"dependencies": {
"b4a": "^1.6.6"
}
},
"node_modules/which-runtime": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/which-runtime/-/which-runtime-1.2.1.tgz",
"integrity": "sha512-8feIHccQFH/whiA1fD1b4c5+Q7T4ry1g1oHYc2mHnFh81tTQFsCvy3zhS2geUapkFAVBddUT/AM1a3rbqJweFg==",
"optional": true
},
"node_modules/xache": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/xache/-/xache-1.2.1.tgz",
"integrity": "sha512-igRS6jPreJ54ABdzhh4mCDXcz+XMaWO2q1ABRV2yWYuk29jlp8VT7UBdCqNkX7rpYBbXsebVVKkwIuYZjyZNqA=="
},
"node_modules/z32": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/z32/-/z32-1.1.0.tgz",
"integrity": "sha512-1WUHy+VS6d0HPNspDxvLssBbeQjXMjSnpv0vH82vRAUfg847NmX3OXozp/hRP5jPhxBbrVzrgvAt+UsGNzRFQQ==",
"dependencies": {
"b4a": "^1.5.3"
}
}
}
}

View File

@ -4,19 +4,20 @@
"description": "This project implements a firewall-resistant, peer-to-peer (P2P) DNS system that leverages UDP hole-punching to bypass common network restrictions, including firewalls, NAT, and CGNAT. Built in Node.js, it integrates with Holesail for tunneling, provides seamless DNS and HTTP proxying, and supports both public and private P2P networks.", "description": "This project implements a firewall-resistant, peer-to-peer (P2P) DNS system that leverages UDP hole-punching to bypass common network restrictions, including firewalls, NAT, and CGNAT. Built in Node.js, it integrates with Holesail for tunneling, provides seamless DNS and HTTP proxying, and supports both public and private P2P networks.",
"main": "p2ns.js", "main": "p2ns.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://git.ssh.surf/snxraven/p2ns.git" "url": "https://git.ssh.surf/snxraven/p2ns.git"
}, },
"author": "Raven Scott", "author": "Raven Scott",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"b4a": "^1.6.7", "b4a": "^1.6.7",
"corestore": "^6.18.4", "corestore": "^6.18.4",
"dns-packet": "^5.6.1", "dns-packet": "^5.6.1",
"holesail-client": "^1.1.4", "dotenv": "^16.4.5",
"hyperswarm": "^4.8.4" "holesail-client": "^1.1.4",
"hyperswarm": "^4.8.4"
} }
} }