{"id":23388308,"url":"https://github.com/blackglory/extra-dns","last_synced_at":"2026-02-25T12:42:35.148Z","repository":{"id":268855268,"uuid":"905676030","full_name":"BlackGlory/extra-dns","owner":"BlackGlory","description":"🌲 A maintainable low-level DNS library.","archived":false,"fork":false,"pushed_at":"2024-12-28T12:51:45.000Z","size":143,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-04T05:17:02.387Z","etag":null,"topics":["esm","library","nodejs","npm-package","typescript"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/extra-dns","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BlackGlory.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-12-19T09:57:34.000Z","updated_at":"2024-12-28T12:51:49.000Z","dependencies_parsed_at":"2024-12-19T10:30:34.609Z","dependency_job_id":"28174866-3593-491c-8bb2-978097d8ce1c","html_url":"https://github.com/BlackGlory/extra-dns","commit_stats":null,"previous_names":["blackglory/extra-dns"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlackGlory%2Fextra-dns","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlackGlory%2Fextra-dns/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlackGlory%2Fextra-dns/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlackGlory%2Fextra-dns/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BlackGlory","download_url":"https://codeload.github.com/BlackGlory/extra-dns/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238817813,"owners_count":19535598,"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":["esm","library","nodejs","npm-package","typescript"],"created_at":"2024-12-22T02:18:46.500Z","updated_at":"2025-10-29T12:30:53.880Z","avatar_url":"https://github.com/BlackGlory.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# extra-dns\n## Install\n```sh\nnpm install --save extra-dns\n# or\nyarn add extra-dns\n```\n\n## Usage\n```ts\nimport { DNSServer, DNSClient } from 'extra-dns'\n\nconst stopDNSForwarder = await startDNSForwarder({\n  local: { host: '127.0.0.1', port: 53 }\n, remote: { host: '8.8.8.8', port: 53 }\n})\n\nasync function startDNSForwarder({ local, remote }: {\n  local: { host: string; port: number }\n  remote: { host: string; port: number }\n}): Promise\u003c() =\u003e Promise\u003cvoid\u003e\u003e {\n  const server = new DNSServer(local.host, local.port)\n  const client = new DNSClient(remote.host, remote.port)\n\n  server.on('query', async (query, respond) =\u003e {\n    await respond(await client.resolve(query))\n  })\n\n  return await server.listen()\n}\n```\n\n## API\n```ts\ninterface IPacket {\n  header: IHeader\n  questions: IQuestion[]\n  answers: IResourceRecord[]\n  authorityRecords: IResourceRecord[]\n  additionalRecords: IResourceRecord[]\n}\n\ninterface IHeader {\n  ID: number\n  flags: IFlags\n}\n\ninterface IQuestion {\n  QNAME: string\n  QTYPE: number\n  QCLASS: number\n}\n\ninterface IResourceRecord\u003cType extends TYPE = number\u003e {\n  NAME: string\n  TYPE: number\n  CLASS: number\n  TTL: number\n  RDATA: ArrayBufferLike\n\n  /**\n   * `rdata` has higher priority than `RDATA`\n   */\n  rdata?:\n  | A_RDATA\n  | AAAA_RDATA\n  | CNAME_RDATA\n  | MX_RDATA\n  | NS_RDATA\n  | PTR_RDATA\n  | SOA_RDATA\n  | AFSDB_RDATA\n  | NAPTR_RDATA\n  | SRV_RDATA\n  | null\n}\n\ninterface IFlags {\n  QR: QR\n  OPCODE: number\n  AA: number\n  TC: number\n  RD: number\n  RA: number\n  Z: number\n  RCODE: number\n}\n\nenum QR { /*...*/ }\nenum CLASS { /*...*/ }\nenum TYPE { /*...*/ }\nenum OPCODE { /* ... */ }\nenum RCODE { /* ... */ }\n```\n\n### DNSServer\n```ts\nimport { Emitter } from '@blackglory/structures'\n\nclass DNSServer extends Emitter\u003c{\n  query: [\n    query: IPacket\n  , respond: (response: IPacket) =\u003e Promise\u003cvoid\u003e\n  ]\n}\u003e {\n  constructor(host: string, port: number, socket?: dgram.Socket)\n\n  listen(): Promise\u003c() =\u003e Promise\u003cvoid\u003e\u003e\n}\n```\n\n### DNSClient\n```ts\nclass DNSClient {\n  constructor(host: string, port: number, socket?: dgram.Socket)\n\n  resolve(query: Packet, signal?: AbortSignal): Promise\u003cPacket\u003e\n}\n```\n\n### RDATA\n#### A_RDATA\n```ts\nclass A_RDATA {\n  constructor(\n    public ADDRESS: string\n  )\n\n  static decode(buffer: ArrayBufferLike, byteOffset: number): A_RDATA\n}\n```\n\n#### AAAA_RDATA\n```ts\nclass AAAA_RDATA {\n  constructor(\n    public ADDRESS: string\n  )\n\n  static decode(buffer: ArrayBufferLike, byteOffset: number): AAAA_RDATA\n}\n```\n\n#### CNAME_RDATA\n```ts\nclass CNAME_RDATA {\n  constructor(\n    public CNAME: string\n  )\n\n  static decode(buffer: ArrayBufferLike, byteOffset: number): CNAME_RDATA\n}\n```\n\n#### MX_RDATA\n```ts\nclass MX_RDATA {\n  constructor(\n    public PREFERENCE: number\n  , public EXCHANGE: string\n  )\n\n  static decode(buffer: ArrayBufferLike, byteOffset: number): MX_RDATA\n}\n```\n\n#### NS_RDATA\n```ts\nclass NS_RDATA {\n  constructor(\n    public NSDNAME: string\n  )\n\n  static decode(buffer: ArrayBufferLike, byteOffset: number): NS_RDATA\n}\n```\n\n#### PTR_RDATA\n```ts\nclass PTR_RDATA {\n  constructor(\n    public PTRDNAME: string\n  )\n\n  static decode(buffer: ArrayBufferLike, byteOffset: number): PTR_RDATA\n}\n```\n\n#### SOA_RDATA\n```ts\nclass SOA_RDATA {\n  constructor(\n    public MNAME: string\n  , public RNAME: string\n  , public SERIAL: number\n  , public REFRESH: number\n  , public RETRY: number\n  , public EXPIRE: number\n  , public MINIMUM: number\n  ) {}\n\n  static decode(buffer: ArrayBufferLike, byteOffset: number): SOA_RDATA\n}\n```\n\n#### AFSDB_RDATA\n```ts\nclass AFSDB_RDATA {\n  constructor(\n    public SUBTYPE: number\n  , public HOSTNAME: string\n  )\n\n  static decode(buffer: ArrayBufferLike, byteOffset: number): AFSDB_RDATA\n}\n```\n\n#### NAPTR_RDATA\n```ts\nclass NAPTR_RDATA {\n  constructor(\n    public ORDER: number\n  , public PREFERENCE: number\n  , public FLAGS: string\n  , public SERVICES: string\n  , public REGEXP: string\n  , public REPLACEMENT: string\n  )\n\n  static decode(buffer: ArrayBufferLike, byteOffset: number): NAPTR_RDATA\n}\n```\n\n#### SRV_RDATA\n```ts\nclass SRV_RDATA {\n  constructor(\n    public PRIORITY: number\n  , public WEIGHT: number\n  , public PORT: number\n  , public TARGET: string\n  ) {}\n\n  static decode(buffer: ArrayBufferLike, byteOffset: number): SRV_RDATA\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblackglory%2Fextra-dns","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblackglory%2Fextra-dns","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblackglory%2Fextra-dns/lists"}