# @leichtgewicht/dns-socket

> Make low-level DNS requests with retry and timeout support.

Latest version **5.0.0** (published 2022-05-30) · MIT license · 0 weekly downloads

## Install

```sh
npm install @leichtgewicht/dns-socket
pnpm add @leichtgewicht/dns-socket
yarn add @leichtgewicht/dns-socket
bun add @leichtgewicht/dns-socket
```

## Health

**Score 20/100 (F)** — status: abandoned.

Positive: esm support; no vulnerabilities.

Warnings: low downloads; no types.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 5.0.0 |
| Published | 2022-05-30 |
| First published | 2022-05-16 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | ESM + CommonJS |
| Node | >=6 |
| Dependencies | 1 |
| Unpacked size | 134.5 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 106 |
| Author | Mathias Buus |
| Maintainers | leichtgewicht |
| Keywords | dns, domain, socket, low-level |

## Links

- npm: https://www.npmjs.com/package/@leichtgewicht/dns-socket
- Repository: https://github.com/mafintosh/dns-socket
- Issues: https://github.com/mafintosh/dns-socket/issues
- npm.io page: https://npm.io/package/@leichtgewicht/dns-socket

## Dependencies (1)

- [@leichtgewicht/dns-packet](https://npm.io/package/@leichtgewicht/dns-packet.md) ^6.0.0

## Alternatives

- [@opentelemetry/exporter-zipkin](https://npm.io/package/@opentelemetry/exporter-zipkin.md) — 14.8M weekly downloads
- [pusher-js](https://npm.io/package/pusher-js.md) — 2.0M weekly downloads
- [browserify](https://npm.io/package/browserify.md) — 1.7M weekly downloads
- [sqs-consumer](https://npm.io/package/sqs-consumer.md) — 1.7M weekly downloads
- [@sanity/eventsource](https://npm.io/package/@sanity/eventsource.md) — 930.8K weekly downloads

## Recent versions

- 5.0.0 (latest) — 2022-05-30
- 4.2.3 — 2022-05-27
- 4.2.2 — 2022-05-16

## README

# dns-socket

[![](https://img.shields.io/npm/v/@leichtgewicht/dns-socket.svg?style=flat)](https://www.npmjs.org/package/@leichtgewicht/dns-socket) [![](https://img.shields.io/npm/dm/@leichtgewicht/dns-socket.svg)](https://www.npmjs.org/package/@leichtgewicht/dns-socket) [![Tests](https://github.com/martinheidegger/dns-socket/actions/workflows/test.yml/badge.svg)](https://github.com/martinheidegger/dns-socket/actions/workflows/test.yml)
Make low-level DNS requests with retry and timeout support.

```
npm install @leichtgewicht/dns-socket
```

## Usage

``` js
import { DNSSocket } from '@leichtgewicht/dns-socket'
const socket = new DNSSocket()

socket.query({
  questions: [{
    type: 'A',
    name: 'google.com'
  }]
}, 53, '8.8.8.8', (err, res) => {
  console.log(err, res) // prints the A record for google.com
})
```

## API

#### `var socket = new DNSSocket([options])`

Create a new DNS socket instance. The `options` object includes:

- `retries` *Number*: Number of total query attempts made during `timeout`. Default: 5.
- `socket` *Object*: A custom dgram socket. Default: A `'udp4'` socket.
- `timeout` *Number*: Total timeout in milliseconds after which a `'timeout'` event is emitted. Default: 7500.
- `maxQueries` *Number*: Each request has an id, this is stored as static sized array. maxQueries is the size of this array, limiting the max number of inflight requests. Default: 10000.
- `maxRedirects` *Number*: If you query for a single `A` record and get back `CNAME`, the lib will try to follow the chain and resolve the `CNAME` to A. The maximum number of steps is defined by the `maxRedirects`. Default: 0
- `timeoutChecks` *Number*: Timeouts are checked each `timeoutChecks` ms, for large number of parallel request, you might want to increase this number. Default: `timeout` / 10

#### `socket.on('query', query, port, host)`

Emitted when a dns query is received. The query is a [dns-packet](https://github.com/martinheidegger/dns-packet)

#### `socket.on('response', response, port, host)`

Emitted when a dns response is received. The response is a [dns-packet](https://github.com/martinheidegger/dns-packet)

#### `var id = socket.query(query, port, [host], [callback])`

Send a dns query. If host is omitted it defaults to `127.0.0.1`. When the remote replies the callback is called with `(err, response, query)` and an response is emitted as well. If the query times out the callback is called with an error.
The `host` parameter can be an array, during resolve the lib will randomly select one host.

Returns the query id

#### `socket.response(query, response, port, [host])`

Send a response to a query.

#### `socket.cancel(id)`

Cancel a query

#### `socket.bind([port][, address][, onlistening])`
#### `socket.bind(options, [onlistening])`

Bind the underlying udp socket to a specific port. Takes the same arguments as [socket#bind](https://nodejs.org/docs/latest/api/dgram.html#dgram_socket_bind_port_address_callback).

#### `socket.destroy([onclose])`

Destroy the socket.

#### `socket.inflight`

Number of inflight queries.

## License

MIT

---
_Source: https://npm.io/package/@leichtgewicht/dns-socket · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
