UNPKG

1.4 kBJavaScriptView Raw
1const Packet = require('../packet');
2
3const defaultGet = url => new Promise((resolve, reject) => {
4 const headers = {
5 accept: 'application/dns-message',
6 };
7 const base = url.startsWith('https') ? require('https') : require('http');
8 const req = base.get(url, { headers }, resolve);
9 req.on('error', reject);
10});
11
12const readStream = stream => {
13 const buffer = [];
14 return new Promise((resolve, reject) => {
15 stream
16 .on('error', reject)
17 .on('data', chunk => buffer.push(chunk))
18 .on('end', () => resolve(Buffer.concat(buffer)));
19 });
20};
21
22/**
23 * @docs https://tools.ietf.org/html/rfc8484
24 * @param {*} param0
25 */
26const DOHClient = ({ dns, http, get = defaultGet } = {}) => {
27 return (name, type = 'A', cls = Packet.CLASS.IN, { clientIp, recursive = true } = {}) => {
28 const packet = new Packet();
29 // see https://github.com/song940/node-dns/issues/29
30 if (recursive) {
31 packet.header.rd = 1;
32 }
33 if (clientIp) {
34 packet.additionals.push(Packet.Resource.EDNS([
35 Packet.Resource.EDNS.ECS(clientIp),
36 ]));
37 }
38 packet.questions.push({
39 name,
40 class : cls,
41 type : Packet.TYPE[type],
42 });
43 const query = packet.toBase64URL();
44 return Promise.resolve(get(`http${http ? '' : 's'}://${dns}/dns-query?dns=${query}`))
45 .then(readStream)
46 .then(Packet.parse);
47 };
48};
49
50module.exports = DOHClient;