Improve documentation for advanced DNS features and update usage examples for both DNS client and server.
- Revamped readme.hints with expanded architecture overview and detailed explanations of DNSSEC, Let's Encrypt integration, and advanced handler patterns.
- Updated readme.md with clearer instructions and code examples for A, AAAA, TXT, MX record queries, DNS propagation checks, and usage of UDP and DNS-over-HTTPS.
- Enhanced TAP tests documentation demonstrating both client and server flows.
- Bumped version from 7.0.2 to 7.1.0 in preparation for the next release.
## 2025-05-27 - 7.1.0 - feat(docs)
Improve documentation for advanced DNS features by updating usage examples for DNS client and server, and enhancing instructions for DNSSEC and Let's Encrypt integration.
- Revamped readme.hints with an expanded architecture overview and detailed client/server feature explanations.
- Updated readme.md to include clearer instructions and code examples for A, AAAA, TXT, MX record queries and DNS propagation checks.
- Enhanced examples for using DNSSEC, including detailed examples for DNSKEY, DS, and RRSIG records.
- Added new instructions for setting up DNS-over-HTTPS (DoH), UDP-based resolution, and pattern-based routing for handlers.
- Improved testing documentation with updated TAP tests demonstrating both DNS client and server flows.
## 2025-05-27 - 7.0.2 - fix(dns-client)
Improve test assertions for DNS record queries and correct counter increment logic in DNS client
"description":"A robust TypeScript library providing advanced DNS management and resolution capabilities including support for DNSSEC, custom DNS servers, and integration with various DNS providers.",
A TypeScript library for smart DNS methods, supporting various DNS records and providers.
A robust TypeScript library providing advanced DNS management and resolution capabilities including support for DNSSEC, custom DNS servers, and integration with various DNS providers.
## Install
To install `@push.rocks/smartdns`, use the following command with npm:
To install `@push.rocks/smartdns`, use the following command with pnpm:
```bash
pnpm install @push.rocks/smartdns --save
```
Or with npm:
```bash
npm install @push.rocks/smartdns --save
```
Or with `yarn`:
```bash
yarn add @push.rocks/smartdns
```
Make sure you have a TypeScript environment set up to utilize the library effectively.
## Usage
`@push.rocks/smartdns` is a comprehensive library aimed at facilitating smart DNS operations, leveraging TypeScript for enhanced development experience. This section aims to cover several real-world scenarios demonstrating the library's capabilities, from basic DNS lookups to more advanced DNS management tasks.
`@push.rocks/smartdns` is a comprehensive library that provides both DNS client and server capabilities, leveraging TypeScript for enhanced development experience. The library is organized into three modules:
- **Client Module** (`@push.rocks/smartdns/client`): DNS resolution and record queries
- **Server Module** (`@push.rocks/smartdns/server`): Full DNS server implementation with DNSSEC
- **Main Module** (`@push.rocks/smartdns`): Convenience exports for both client and server
### Getting Started
First, ensure you import the module into your TypeScript project:
Often, the need arises to fetch various DNS records for a domain. `@push.rocks/smartdns` simplifies this by providing intuitive methods. A DNS record is essentially a map from a domain name to information about that domain, such as its IP address, mail exchange server, etc.
The DNS client (`Smartdns` class) provides methods to query various DNS record types using DNS-over-HTTPS (DoH) with Cloudflare as the primary provider, with fallback to Node.js DNS resolver.
#### Fetching A Records
To fetch an "A" record for a domain, which resolves the domain to an IPv4 address, use the following approach:
To fetch "A" records (IPv4 addresses) for a domain:
These queries are quite common where IPv6 addresses have been prevalent due to the scarcity of IPv4 addresses.
#### Fetching TXT Records
TXT records store arbitrary text data associated with a domain. They are often used to hold information such as SPF records for email validation or Google site verification token.
TXT records store text data, commonly used for domain verification, SPF records, and other metadata:
TXT records have increasingly become significant with the growth of security features and integrations that require domain verification.
#### Other Record Types
### Advanced DNS Management
The client supports various other DNS record types:
The `@push.rocks/smartdns` doesn't just stop at querying— it offers more advanced DNS management utilities, which are crucial for real-world applications involving DNS operations.
When changing DNS records, ensuring that the new records have propagated fully is crucial. `@push.rocks/smartdns` facilitates this with a method to check if a DNS record is available globally. This can be critical for ensuring that users worldwide are able to access your updated records in a consistent manner.
The client provides a powerful method to verify DNS propagation globally, essential when making DNS changes:
```typescript
constrecordType='TXT';// Record type: A, AAAA, CNAME, TXT etc.
500// Interval between checks in ms (default: 500)
);
if(isAvailable){
console.log('Record propagated successfully.');
console.log('DNS record has propagated successfully!');
}else{
console.log('Record propagation failed or timed out.');
console.log('DNS propagation timeout - record not found.');
}
```
This method repeatedly queries DNS servers until the expected DNS record appears, making sure that the changes made are visible globally.
#### Configuring System DNS Provider
### Leveraging DNS for Application Logic
DNS records can function beyond their typical usage of domain-to-IP resolution. They can be extremely useful in application logic such as feature flagging or environment-specific configurations.
#### Example: Feature Flagging via TXT Records
One such advanced use case is using TXT records for enabling or disabling features dynamically without needing to redeploy or change the actual application code:
You can configure Node.js to use a specific DNS provider for all DNS queries:
`@push.rocks/smartdns` includes powerful features that allow you to implement your very own DNS server, complete with UDP and HTTPS protocols support and DNSSEC compliance.
The `DnsServer` class provides a full-featured DNS server with support for UDP, DNS-over-HTTPS (DoH), DNSSEC, and automatic SSL certificate management via Let's Encrypt.
#### Basic DNS Server Example
#### Basic DNS Server Setup
Implementing a DNS server involves setting it up to respond to various DNS queries. Here's how you can set up a basic DNS server using UDP and HTTPS protocols:
Create a simple DNS server that responds to queries:
This sets up a basic DNS server responding to A records for the domain `example.com` and mirrors the common structure used in production applications.
// Start the server
awaitdnsServer.start();
console.log('DNS Server started!');
```
### DNSSEC Support
DNS Security Extensions (DNSSEC) adds an additional layer of security to DNS, protecting against various types of attacks. With `@push.rocks/smartdns`, setting up a DNS server with DNSSEC is straightforward.
#### DNSSEC Configuration
To configure DNSSEC for your DNS server, you’ll need to establish DNSSEC parameters including zone signatures and enabling key management. This setup ensures that DNS records are signed and can be verified for authenticity.
The DNS server includes comprehensive DNSSEC support with automatic key generation and record signing:
The library supports handling DNS queries over UDP and HTTPS. This functionality allows for the flexible use and management of DNS inquiries and resolves, accommodating various protocol needs.
The server supports multiple DNSSEC algorithms:
- **ECDSAP256SHA256** (Algorithm 13) - Default, using P-256 curve
- **ED25519** (Algorithm 15) - Modern elliptic curve algorithm
console.log('UDP DNS Server started on port',dnsServer.getOptions().udpPort);
});
constclient=dgram.createSocket('udp4');
client.on('message',(msg,rinfo)=>{
console.log(`Received ${msg} from ${rinfo.address}:${rinfo.port}`);
});
client.send(Buffer.from('example DNS query'),dnsServer.getOptions().udpPort,'localhost');
```
This segment of code creates a UDP server that listens for incoming DNS requests and responds accordingly.
#### Handling HTTPS Queries
DNS over HTTPS (DoH) offers a heightened level of privacy and security, where DNS queries are transmitted over HTTPS to prevent eavesdropping and man-in-the-middle attacks.
Like any crucial application component, DNS servers require thorough testing to ensure reliability and correctness in different scenarios. Here we use TAP (Test Anything Protocol) to test various functionalities.
#### DNS Server Tests
`@push.rocks/smartdns` integrates seamlessly with TAP, allowing for comprehensive testing of server functionalities.
Here's an example of how you might set up tests for your DNS server:
The library uses `@git.zone/tstest` for testing. Here's an example of comprehensive tests:
client.send(query,5353,'localhost');// Use the port specified during server creation
awaitdone.promise;
});
tap.test('should stop the server',async()=>{
tap.test('DNS Server - Cleanup',async()=>{
awaitdnsServer.stop();
expect(dnsServer.isRunning()).toBeFalse();
});
// Run tests
awaittap.start();
```
The above tests ensure that the DNS server setup, query handling, and proper stopping of the server are all functioning as intended.
### Best Practices
In a realistic production environment, additional tests would include edge cases such as malformed requests, large queries, concurrent access handling, and integration tests with various DNS resolvers. These tests ensure robustness and reliability of DNS services provided by the server.
1.**Port Selection**: Use non-privileged ports (>1024) during development
2.**Handler Organization**: Group related handlers together
3.**Error Handling**: Always handle DNS query errors gracefully
4.**DNSSEC**: Enable DNSSEC for production deployments
5.**Monitoring**: Log DNS queries for debugging and analytics
6.**Rate Limiting**: Implement rate limiting for public DNS servers
7.**Caching**: Respect TTL values and implement proper caching
This comprehensive guide demonstrates how to implement, manage, and test a DNS server using `@push.rocks/smartdns`, making it an ideal tool for developers tasked with handling DNS management and setup in TypeScript projects. The library supports the full scope of DNS operations needed for modern applications, from basic record query to full-scale DNS server operations with advanced security extensions.
### Performance Considerations
- The DNS client uses HTTP keep-alive for connection reuse
- The DNS server handles concurrent UDP and HTTPS requests efficiently
- DNSSEC signatures are generated on-demand to reduce memory usage
- Pattern matching uses caching for improved performance
### Security Considerations
- Always use DNSSEC for authenticated responses
- Enable DoH for encrypted DNS queries
- Validate and sanitize all DNS inputs
- Implement access controls for DNS server handlers
- Use Let's Encrypt for automatic SSL certificate management
- Never expose internal network information through DNS
This comprehensive library provides everything needed for both DNS client operations and running production-grade DNS servers with modern security features in TypeScript.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license.md) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
description:'A robust TypeScript library providing advanced DNS management and resolution capabilities including support for DNSSEC, custom DNS servers, and integration with various DNS providers.'
}
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.