{"id":20226131,"url":"https://github.com/getdnsapi/getdns-node","last_synced_at":"2025-04-10T17:07:17.690Z","repository":{"id":14670974,"uuid":"17389814","full_name":"getdnsapi/getdns-node","owner":"getdnsapi","description":"Node.js bindings of getdns, a modern asynchronous DNS API.","archived":false,"fork":false,"pushed_at":"2021-06-09T19:59:43.000Z","size":359,"stargazers_count":63,"open_issues_count":14,"forks_count":8,"subscribers_count":15,"default_branch":"develop","last_synced_at":"2024-04-11T21:09:11.467Z","etag":null,"topics":["dns","dns-client","dns-resolver","dnssec","getdns","getdns-node","getdnsapi","javascript","nodejs"],"latest_commit_sha":null,"homepage":"https://getdnsapi.net/","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/getdnsapi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-03-04T04:01:18.000Z","updated_at":"2024-02-23T17:54:36.000Z","dependencies_parsed_at":"2022-08-29T12:30:17.017Z","dependency_job_id":null,"html_url":"https://github.com/getdnsapi/getdns-node","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getdnsapi%2Fgetdns-node","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getdnsapi%2Fgetdns-node/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getdnsapi%2Fgetdns-node/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/getdnsapi%2Fgetdns-node/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/getdnsapi","download_url":"https://codeload.github.com/getdnsapi/getdns-node/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248260730,"owners_count":21074215,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dns","dns-client","dns-resolver","dnssec","getdns","getdns-node","getdnsapi","javascript","nodejs"],"created_at":"2024-11-14T07:16:25.846Z","updated_at":"2025-04-10T17:07:17.672Z","avatar_url":"https://github.com/getdnsapi.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://getdnsapi.net/\"\u003e\u003cimg src=\"resources/logo/getdns-512x.png\" alt=\"getdns logotype\" title=\"getdns\" width=\"512\" height=\"164\" border=\"0\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003ch1 align=\"center\"\u003e\n  \u003ca href=\"https://github.com/getdnsapi/getdns-node\"\u003egetdnsapi/getdns-node\u003c/a\u003e\n\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n  Node.js bindings of \u003ca href=\"https://getdnsapi.net/\"\u003egetdns\u003c/a\u003e, a modern asynchronous DNS API.\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003egetdns-node:\u003c/strong\u003e \u003ca href=\"https://www.npmjs.com/package/getdns\"\u003eNPM\u003c/a\u003e | \u003ca href=\"https://github.com/getdnsapi/getdns-node\"\u003eGithub\u003c/a\u003e | \u003ca href=\"https://github.com/getdnsapi/getdns-node/tree/master/samples\"\u003eExamples\u003c/a\u003e | \u003ca href=\"https://github.com/getdnsapi/getdns-node/issues\"\u003eIssues\u003c/a\u003e | \u003ca href=\"https://travis-ci.org/getdnsapi/getdns-node\"\u003e\u003cimg src=\"https://travis-ci.org/getdnsapi/getdns-node.svg?branch=master\" alt=\"getdns-node build status for the master branch\" title=\"getdns-node build status for the master branch\" border=\"0\" style=\"height: 1em;\" /\u003e\u003c/a\u003e\u003cbr /\u003e\n  \u003cstrong\u003egetdns:\u003c/strong\u003e \u003ca href=\"https://getdnsapi.net/\"\u003eWebsite\u003c/a\u003e | \u003ca href=\"https://github.com/getdnsapi/getdns\"\u003eGithub\u003c/a\u003e | \u003ca href=\"https://getdnsapi.net/documentation/spec/\"\u003eSpecification\u003c/a\u003e | \u003ca href=\"https://getdnsapi.net/presentations/\"\u003ePresentations\u003c/a\u003e | \u003ca href=\"https://getdnsapi.net/releases/\"\u003eReleases\u003c/a\u003e\n\u003c/p\u003e\n\n## Features\n\ngetdns-node has a few advantages over the [default DNS module in Node.js](https://nodejs.org/docs/latest/api/dns.html).\n\n- DNS lookup security with [Domain Name System Security Extensions\n (DNSSEC)](https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions) signature validation.\n- Supports [all DNS record types](https://en.wikipedia.org/wiki/List_of_DNS_record_types) with constants for 80+ (`A`, `AAAA`, `MX`, `TXT`, `SSHFP`, `OPENPGPKEY`, ...).\n- Configure as local recursive DNS server, or stub mode with upstream DNS resolvers.\n- Perform both IPv4 and IPv6 lookups in a single call.\n- Configure to perform lookups over TLS, TCP, or UDP, with fallbacks and long-lived connections.\n- Configure to explicitly follow or explicitly not follow `CNAME` and `DNAME` redirects.\n- Securely verify DNS-based security records such as\n  - [DNS-based Authentication of Named Entities (DANE)](https://en.wikipedia.org/wiki/DNS-based_Authentication_of_Named_Entities)\n    - [TLSA certificate association](https://en.wikipedia.org/wiki/List_of_DNS_record_types#TLSA) for [XMPP](https://tools.ietf.org/html/rfc7712), [SMTP](https://tools.ietf.org/html/rfc7672), [IMAP](https://tools.ietf.org/html/rfc7673#appendix-A.1), POP3, etcetera.\n    - [Public key association/binding for OpenPGP (OPENPGPKEY)](https://tools.ietf.org/html/rfc7929)\n    - [Certificate association/binding for S/MIME](https://tools.ietf.org/html/draft-ietf-dane-smime)\n  - [IPsec Keying Material (IPSECKEY)](https://tools.ietf.org/html/rfc4025)\n  - Email, anti-spoofing and anti-spam\n    - [Domain-based Message Authentication, Reporting and Conformance (DMARC)](https://en.wikipedia.org/wiki/DMARC)\n    - [Sender Policy Framework (SPF)](https://en.wikipedia.org/wiki/Sender_Policy_Framework)\n    - [DomainKeys Identified Mail (DKIM)](https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail)\n  - [SSH Public Key Fingerprint (SSHFP)](https://en.wikipedia.org/wiki/SSHFP_Resource_Record)\n\n\n\n## Installation and Requirements\n\n- [Node.js](https://nodejs.org/) [long-term support (LTS)](https://github.com/nodejs/Release) versions.\n- [Root trust anchor for DNSSEC validation](https://getdnsapi.net/documentation/readme/#dnssec-dependencies)\n- C libraries:\n  - [getdns](https://getdnsapi.net/) DNS API\n  - [Unbound](https://unbound.net/) DNS resolver\n  - [OpenSSL](https://www.openssl.org/) cryptography toolkit\n\n```shell\n# In your project directory.\nnpm install --save getdns\n```\n\n- Older versions/combinations of dependencies *may* be supported in the special `support/` branches. Support branches contain minimal patches to get that particular combination running — quite possibly with a restricted set of features. They are not actively maintained, and may be rebased if required.\n- See [`.travis.yml`](./.travis.yml) for exact [Node.js versions used by Travis](https://docs.travis-ci.com/user/languages/javascript-with-nodejs/#specifying-nodejs-versions) during build tests.\n\n\n## API Examples\n\nSee the [`samples/`](samples/) folder for more.\n\n- [`samples/example-raw.js`](samples/example-raw.js)\n  - `node samples/example-raw.js [hostname] [record type]`\n  - `node samples/example-raw.js wikipedia.org TXT`\n- [samples/getdns-console-pretty/](samples/getdns-console-pretty/)\n- [samples/getdns-resolver-check-tls/](samples/getdns-resolver-check-tls/)\n- [samples/getdns-node-sample-resolver-check-tls/](samples/getdns-node-sample-resolver-check-tls/)\n\n```javascript\nvar getdns = require(\"getdns\");\n\nvar options = {\n    // Option for stub resolver context, deferring lookups to the upstream recursive servers.\n    resolution_type: getdns.RESOLUTION_STUB,\n    // Upstream recursive servers.\n    upstream_recursive_servers: [\n        // Example: Google Public DNS.\n        \"8.8.8.8\",\n        // Example: Your local DNS server.\n        [\"127.0.0.1\", 53],\n    ],\n    // Request timeout time in milliseconds.\n    timeout: 1000,\n    // Always return DNSSEC status.\n    return_dnssec_status: true\n};\n\n// Contexts can be reused for several lookups, but must be explicitly destroyed.\nvar context = getdns.createContext(options);\n\nvar callback = function(err, result) {\n    if (err) {\n        // If not null, err is an object with msg and code.\n        // Code maps to a getdns.CALLBACK_XXXX (CANCEL, TIMEOUT, ERROR).\n        console.error(err);\n    } else {\n        // Result is a response dictionary, see below for the format.\n        // For context.address() simply use result.just_address_answers.\n        // NOTE: optionally check if each reply is secured with DNSSEC.\n        console.log(result.canonical_name, result.just_address_answers);\n    }\n\n    // When done with a context, it must be explicitly destroyed.\n    // Can be done after all lookups/transactions have finished or beforeExit.\n    context.destroy();\n};\n\n// NOTE: the extensions parameter is optional.\nvar extensions = {\n  // NOTE: enforce DNSSEC security validation and return only secure replies.\n  //dnssec_return_only_secure: true,\n};\n\n// Simple domain name-to-ip address lookup.\n// Always returns both IPv4 and IPv6 results, if available.\nvar transactionId = context.address(\"wikipedia.org\", extensions, callback);\n```\n\n\n\n## API usage\n\nMost of the nodejs calls maps to the [getdns API specification](https://getdnsapi.net/documentation/spec/). If there are any differences, or questions about usage, [please open an issue](https://github.com/getdnsapi/getdns-node/issues).\n\n\n### Context Cleanup\n\nWhen a context object is garbage collected, the underlying resources are freed up. However, garbage collection is not guaranteed to trigger. The application will not exit until all contexts are destroyed.\n\n\n### Response format\n\nA response to the callback is the javascript object representation of the `getdns_dict` response dictionary.\n\nAny `bindata` objects are converted into Node.js buffers, or converted to strings when possible:\n\n- Getdns IP address dictionary to IP string.\n- Printable bindata.\n- Wire format dname.\n\nIn the sample below buffers are represented as `\u003cBuffer length nnnn\u003e`. Some lines have been removed; `\u003cRemoved lines nnnn\u003e`. Also see the output of the examples for reference.\n\n\n```javascript\n{\n  \"answer_type\": 800,\n  \"canonical_name\": \"getdnsapi.net.\",\n  \"just_address_answers\": [\n    \"2a04:b900:0:100::37\",\n    \"185.49.141.37\"\n  ],\n  \"replies_full\": [\n    \"\u003cBuffer length 677\u003e\",\n    \"\u003cBuffer length 677\u003e\"\n  ],\n  \"replies_tree\": [\n    {\n      \"additional\": [\n        \"\u003cRemoved lines 39\u003e\"\n      ],\n      \"answer\": [\n        {\n          \"class\": 1,\n          \"name\": \"getdnsapi.net.\",\n          \"rdata\": {\n            \"ipv6_address\": \"2a04:b900:0:100::37\",\n            \"rdata_raw\": \"\u003cBuffer length 16\u003e\"\n          },\n          \"ttl\": 450,\n          \"type\": 28\n        },\n        {\n          \"class\": 1,\n          \"name\": \"getdnsapi.net.\",\n          \"rdata\": {\n            \"algorithm\": 7,\n            \"key_tag\": 32852,\n            \"labels\": 2,\n            \"original_ttl\": 450,\n            \"rdata_raw\": \"\u003cBuffer length 161\u003e\",\n            \"signature\": \"\u003cBuffer length 128\u003e\",\n            \"signature_expiration\": 1491862518,\n            \"signature_inception\": 1490027744,\n            \"signers_name\": \"getdnsapi.net.\",\n            \"type_covered\": 28\n          },\n          \"ttl\": 450,\n          \"type\": 46\n        }\n      ],\n      \"answer_type\": 800,\n      \"authority\": [\n        \"\u003cRemoved lines 48\u003e\"\n      ],\n      \"canonical_name\": \"getdnsapi.net.\",\n      \"dnssec_status\": 400,\n      \"header\": {\n        \"aa\": 0,\n        \"ad\": 1,\n        \"ancount\": 2,\n        \"arcount\": 3,\n        \"cd\": 0,\n        \"id\": 0,\n        \"nscount\": 4,\n        \"opcode\": 0,\n        \"qdcount\": 1,\n        \"qr\": 1,\n        \"ra\": 1,\n        \"rcode\": 0,\n        \"rd\": 1,\n        \"tc\": 0,\n        \"z\": 0\n      },\n      \"question\": {\n        \"qclass\": 1,\n        \"qname\": \"getdnsapi.net.\",\n        \"qtype\": 28\n      }\n    },\n    {\n      \"additional\": [\n        \"\u003cRemoved lines 69\u003e\"\n      ],\n      \"answer_type\": 800,\n      \"authority\": [\n        \"\u003cRemoved lines 48\u003e\"\n      ],\n      \"canonical_name\": \"getdnsapi.net.\",\n      \"dnssec_status\": 400,\n      \"header\": {\n        \"aa\": 0,\n        \"ad\": 1,\n        \"ancount\": 2,\n        \"arcount\": 3,\n        \"cd\": 0,\n        \"id\": 0,\n        \"nscount\": 4,\n        \"opcode\": 0,\n        \"qdcount\": 1,\n        \"qr\": 1,\n        \"ra\": 1,\n        \"rcode\": 0,\n        \"rd\": 1,\n        \"tc\": 0,\n        \"z\": 0\n      },\n      \"question\": {\n        \"qclass\": 1,\n        \"qname\": \"getdnsapi.net.\",\n        \"qtype\": 1\n      }\n    }\n  ],\n  \"status\": 900\n}\n```\n\n\n### Constants\n\nAll constants defined in [`\u003cgetdns/getdns.h\u003e`](https://www.getdnsapi.net/doxygen/1.0.0/getdns_8h.html) and [`\u003cgetdns/getdns_extra.h\u003e`](https://www.getdnsapi.net/doxygen/1.0.0/getdns__extra_8h.html) are exposed in the module. The `GETDNS_` prefix is removed. As an example, to get/filter out only secure replies, one may do something like:\n\n```javascript\nvar dnssecSecureReplies = result.replies_tree.filter(function(reply) {\n    return reply.dnssec_status === getdns.DNSSEC_SECURE;\n});\n```\n\n\n### Context functions\n\nMost work is done in the [async methods](https://getdnsapi.net/documentation/spec/#1-the-getdns-async-functions) of a [DNS context](https://getdnsapi.net/documentation/spec/#16-setting-up-the-dns-context). [Extensions](https://getdnsapi.net/documentation/spec/#3-extensions) are optional in the below method calls.\n\n```javascript\n// See also https://getdnsapi.net/documentation/spec/\n\n// Contexts can be reused for several lookups, but must be explicitly destroyed.\n// See context options below.\nvar context = getdns.createContext(options);\n\n// When done with a context, it must be explicitly destroyed.\n// Can be done after all lookups/transactions have finished or beforeExit.\ncontext.destroy();\n\n// Cancel a request before the callback has been called.\ncontext.cancel(transactionId);\n\n// Method parameter formats.\nvar domainName = \"subdomain.example.org\";\nvar ipAddress = \"111.222.33.44\";\nvar ipAddress = \"2620:0:862:ed1a::1\";\n\n// https://getdnsapi.net/documentation/spec/#3-extensions\n// Extensions are optional in the below method calls.\nvar extensions = {\n  dnssec_return_only_secure: true\n};\n\n// There are 80+ predefined `RRTYPE_XXXX` constants.\n// Examples: A, AAAA, CNAME, MX, TXT, TLSA, SSHFP, OPENPGPKEY, ...\nvar request_type = getdns.RRTYPE_MX;\nvar request_type = getdns.RRTYPE_SSHFP;\n\nfunction callback(err, result, transactionId) {\n  // err is either null (good result) or an object: { msg: \"...\", code: getdns.CALLBACK_XXXX (CANCEL, TIMEOUT, ERROR) }\n  // result is null (bad result) or an object with the response dictionary format shown elsewhere in this documentation.\n  // transactionId matches the one given when the lookup was initialized.\n}\n\n// For looking up any type of DNS record.\nvar transactionId = context.general(domainName, request_type, extensions, callback);\n\n// For doing getaddrinfo()-like address lookups.\n// Always returns both IPv4 and IPv6 results, if available.\nvar transactionId = context.address(domainName, extensions, callback);\n\n// For getting results from SRV lookups.\nvar transactionId = context.service(domainName, extensions, callback);\n\n// For doing getnameinfo()-like name lookups.\nvar transactionId = context.hostname(ipAddress, extensions, callback);\n```\n\n\n### Context options\n\nThe below [DNS context options](https://getdnsapi.net/documentation/spec/#8-dns-contexts) are not complete; not all from the specification are listed, nor are all implemented in getdns-node. If there are any differences, or questions about usage, [please open an issue](https://github.com/getdnsapi/getdns-node/issues).\n\n```javascript\n// Setting context properties.\n// See also https://getdnsapi.net/documentation/spec/\n// The following properties are available to set directly and can also\n// be set in the options object passed to the constructor.\n//\n// Context objects support setting properties via similar to the C API.\n// Example: this C function call would map to that JS context property:\ngetdns_context_set_timeout(context, 1000);\ncontext.timeout = 1000;\n\n// Switch DNS resolution/lookup mode:\n//   - Recursive: all lookups performed locally directly to relevant nameservers.\n//   - Stub: all lookups deferred to upstream resolvers.\n// For backwards compatibility the deprecated context.stub is still supported.\ncontext.resolution_type = getdns.RESOLUTION_RECURSING;\ncontext.resolution_type = getdns.RESOLUTION_STUB;\n\n// If acting as a stub resolver, provide an array of DNS servers:\n//   - IP addresses as strings (assuming DNS port is 53).\n//   - An array with an IP address as a string and a port number as an integer.\n// For backwards compatibility the deprecated context.upstreams is still supported.\ncontext.upstream_recursive_servers = [\n  // Example: Google Public DNS.\n  \"8.8.8.8\",\n  // Example: Your local DNS server.\n  [\"127.0.0.1\", 53],\n];\n\n// If acting as recursive resolver, enable or disable following CNAME/DNAME redirects.\ncontext.follow_redirects = getdns.REDIRECTS_FOLLOW;\ncontext.follow_redirects = getdns.REDIRECTS_DO_NOT_FOLLOW;\n\n// Integer in milliseconds. The default is undefined.\ncontext.timeout = 1000;\n\n// Boolean. Switch between thread or forking mode in the underlying libunbound.\ncontext.use_threads = false;\n\n// Enable looking up DNSSEC status of each response.\n// The status is stored in each result.replies_tree[...].dnssec_status with\n// values from getdns.DNSSEC_XXXX (SECURE, BOGUS, INDETERMINATE, INSECURE, NOT_PERFORMED).\ncontext.return_dnssec_status = true;\n\n// DNS uses UDP by default, but can use TCP or TLS as well.\n// Values from getdns.TRANSPORT_XXXX (UDP_FIRST_AND_FALL_BACK_TO_TCP, UDP_ONLY, TCP_ONLY, TCP_ONLY_KEEP_CONNECTIONS_OPEN, TLS_ONLY_KEEP_CONNECTIONS_OPEN, TLS_FIRST_AND_FALL_BACK_TO_TCP_KEEP_CONNECTIONS_OPEN, UDP, TCP, TLS).\ncontext.dns_transport = getdns.TRANSPORT_TLS_FIRST_AND_FALL_BACK_TO_TCP_KEEP_CONNECTIONS_OPEN;\n\n// The transports array contains an ordered list of transports that will be used for DNS lookups.\n// Values from getdns.TRANSPORT_XXXX (UDP, TCP, TLS)\n// The default is a list containing getdns.TRANSPORT_UDP then getdns.TRANSPORT_TCP.\ncontext.dns_transport_list = [\n  getdns.TRANSPORT_TLS,\n  getdns.TRANSPORT_TCP,\n  getdns.TRANSPORT_UDP\n]\n\n// Specifies number of milliseconds the API will leave an idle TCP or TLS connection open for.\n// Idle means no outstanding responses and no pending queries. The default is 0.\ncontext.idle_timeout = ...;\n\n// Related to  Extension mechanisms for DNS (EDNS).\n// The value is between 0 and 255; the default is 0.\ncontext.edns_extended_rcode = 0;\n\n// The value is between 0 and 255; the default is 0.\ncontext.edns_version = 0;\n\n// The value is between 0 and 1; the default is 0.\ncontext.edns_do_bit = 0;\n\n// The value is between 512 and 65535; when not set, outgoing values will adhere to the suggestions in RFC 6891 and may follow a scheme that uses multiple values to maximize receptivity..\ncontext.edns_maximum_udp_payloadSize = ...;\n\n// Specifies limit the number of outstanding DNS queries.\n// The API will block itself from sending more queries if it is about to exceed this value, and instead keep those queries in an internal queue.\n// The a value of 0 indicates that the number of outstanding DNS queries is unlimited.\ncontext.limit_outstanding_queries = ...;\n\n// The namespaces array contains an ordered list of namespaces that will be queried.\n// Important: this context setting is ignored for the context.general() function; it is used for the other functions.\n// Values from getdns.NAMESPACE_XXXX (DNS, LOCALNAMES, NETBIOS, MDNS, NIS).\n// The default is determined by the OS.\ncontext.namespaces = [\n  getdns.NAMESPACE_XXXX,\n  getdns.NAMESPACE_XXXX\n];\n```\n\n\n\n## Building and testing\n\n- Development follows [git-flow](http://danielkummer.github.io/git-flow-cheatsheet/) using the AVH edition of [`git flow`](https://github.com/petervanderdoes/gitflow-avh).\n- Patches are welcome!\n\n```shell\n# Navigate to your getdns-node source folder.\n\n# Enable git flow in your local clone.\ngit flow init -d\n\n# Install dependencies, dev-dependencies, (re)build the package.\nnpm install\n\n# If editing C++ code (and headers) in src/ either build (or rebuild) the module as necessary.\nnpm run --silent build\n\n# Please add tests for any changes. More and diverse tests are better.\n# See if there is a specific file matching your change, or create a new.\n# NOTE: you can run tests per file.\nnpm run --silent test:run -- test/dnssec.js\n\n# Run all tests against live DNS servers. The build server will also run these.\n# NOTE: some tests may fail intermittently, depending on internet connection and upstream DNS servers. Rerun to verify.\nnpm run --silent test\n\n# Now submit your pull request, and be ready for it to be scrutinized.\n# Don't take comments nor change requests personally.\n# Thank you in advance! =)\n```\n\nNote that the tests require an internet connection, [getdns](https://getdnsapi.net/), and [Unbound with a trust anchor to be installed](https://unbound.net/) to pass. Please consult the getdns documentation on the expected location of the trust anchor. Because of testing over the internet against live DNS servers, some tests may fail intermittently. If so, rerun to verify.\n\n\n\n# Contributors\n\nSee also getdns-node [committers](https://github.com/getdnsapi/getdns-node/graphs/contributors) and getdns [committers](https://github.com/getdnsapi/getdns/graphs/contributors), [contributors](https://github.com/getdnsapi/getdns#contributors), and [acknowledgements](https://github.com/getdnsapi/getdns#acknowledgements).\n\n|   | Contributor |\n| :---: | --- |\n| \u003cimg src=\"https://github.com/saghul.png?size=48\" width=\"48\" /\u003e | Saúl Ibarra Corretgé\u003cbr /\u003e[@saghul](https://github.com/saghul) |\n| \u003cimg src=\"https://github.com/ngoyal.png?size=48\" width=\"48\" /\u003e | Neel Goyal\u003cbr /\u003e[ngoyal](https://github.com/ngoyal) |\n| \u003cimg src=\"https://github.com/anthonykirby.png?size=48\" width=\"48\" /\u003e | Anthony Kirby\u003cbr /\u003e[@anthonykirby](https://github.com/anthonykirby) |\n| \u003cimg src=\"https://github.com/joelpurra.png?size=48\" width=\"48\" /\u003e | Joel Purra\u003cbr /\u003e[@joelpurra](https://github.com/joelpurra) |\n| \u003cimg src=\"https://github.com/wtoorop.png?size=48\" width=\"48\" /\u003e | Willem Toorop\u003cbr /\u003e[@wtoorop](https://github.com/wtoorop) |\n| \u003cimg src=\"https://github.com/gmadkat.png?size=48\" width=\"48\" /\u003e | Gowri Visweswaran\u003cbr /\u003e[@gmadkat](https://github.com/gmadkat) |\n\nWant to be on this list? Fastest way is to fix a spelling mistake 😃\n\n\n\n---\n\n\u003ca href=\"https://getdnsapi.net/\"\u003e\u003cimg src=\"resources/logo/getdns-64x.png\" alt=\"getdns logotype\" title=\"getdns\" width=\"64\" height=\"21\" border=\"0\" /\u003e\u003c/a\u003e [getdnsapi/getdns-node](https://github.com/getdnsapi/getdns-node) Copyright \u0026copy; 2014, 2015, 2016, 2017, 2018, Verisign, Inc. All rights reserved. Released under the [BSD 3-clause License](https://opensource.org/licenses/BSD-3-Clause).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetdnsapi%2Fgetdns-node","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgetdnsapi%2Fgetdns-node","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgetdnsapi%2Fgetdns-node/lists"}