@chez14/rdap-sdk 0.1.1-8 → 0.1.1-9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -78,14 +78,22 @@ var RdapClient = class {
78
78
  async domain(domain) {
79
79
  const punyDomain = this.prepareDomain(domain);
80
80
  const url = `https://${this.baseDomain}/domain/${encodeURIComponent(punyDomain)}`;
81
- const response = await this.fetcher.fetch({
82
- method: "GET",
83
- url
84
- });
85
- if (response.status === 404 && response.url === url) {
86
- throw new RdapNotFoundError(`Domain ${domain} has no RDAP server for its TLD`);
81
+ try {
82
+ const response = await this.fetcher.fetch({
83
+ method: "GET",
84
+ url
85
+ });
86
+ if (response.status === 404 && response.url === url) {
87
+ throw new RdapNotFoundError(`Domain ${domain} has no RDAP server for its TLD`);
88
+ }
89
+ return response.data;
90
+ } catch (error) {
91
+ if (error instanceof SyntaxError) {
92
+ throw new RdapNotFoundError(`Domain ${domain} has no RDAP server for its TLD`);
93
+ } else {
94
+ throw error;
95
+ }
87
96
  }
88
- return response.data;
89
97
  }
90
98
  /**
91
99
  * Query IP address or network information
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/fetcher.ts","../src/utils/throwables.ts","../src/client.ts"],"sourcesContent":["/**\n * HTTP methods supported by the fetcher\n */\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\n/**\n * Options for the fetch request\n */\nexport interface FetchOptions<T = unknown> {\n method: HttpMethod;\n url: string;\n body?: T;\n headers?: Record<string, string>;\n}\n\n/**\n * Response from the fetch request\n */\nexport interface FetchResponse<T = unknown> {\n status: number;\n data: T;\n headers: Headers;\n url: string;\n}\n\n/**\n * Interface for the fetcher implementation\n */\nexport interface Fetcher {\n fetch<TBody = unknown, TResponse = unknown>(\n options: FetchOptions<TBody>,\n ): Promise<FetchResponse<TResponse>>;\n}\n\n/**\n * Default fetcher implementation using node-fetch\n */\nexport class DefaultFetcher implements Fetcher {\n async fetch<TBody = unknown, TResponse = unknown>({\n method,\n url,\n body,\n headers = {},\n }: FetchOptions<TBody>): Promise<FetchResponse<TResponse>> {\n const requestUrl = new URL(url);\n\n // For GET requests, convert body to query parameters\n if (method === 'GET' && body) {\n Object.entries(body as Record<string, string>).forEach(([key, value]) => {\n requestUrl.searchParams.append(key, value);\n });\n }\n\n const requestInit: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n };\n\n // Add body for non-GET requests\n if (method !== 'GET' && body) {\n requestInit.body = JSON.stringify(body);\n }\n\n const response = await fetch(requestUrl, requestInit);\n const data = (await response.json()) as TResponse;\n\n return {\n status: response.status,\n data,\n headers: response.headers,\n url: response.url,\n };\n }\n}\n","export class RdapNotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'RdapNotFoundError';\n }\n}\n","import { RdapAutnumResponse, RdapDomainResponse, RdapIpResponse } from './types';\nimport { DefaultFetcher, Fetcher } from './utils/fetcher';\nimport { RdapNotFoundError } from './utils/throwables';\n\nexport interface RdapClientOptions {\n fetcher?: Fetcher;\n baseDomain?: string;\n}\n\nexport class RdapClient {\n private readonly fetcher: Fetcher;\n private readonly baseDomain: string;\n\n constructor(options: RdapClientOptions = {}) {\n this.fetcher = options.fetcher ?? new DefaultFetcher();\n this.baseDomain = options.baseDomain ?? 'www.rdap.net';\n }\n\n /**\n * Convert domain to punycode if needed\n */\n private prepareDomain(domain: string): string {\n return domain\n .toLowerCase()\n .split('.')\n .map((part) => {\n try {\n if (part.includes('xn--')) {\n return part;\n }\n // Use URL API to handle IDN conversion\n const url = new URL(`https://${part}`);\n return url.hostname.startsWith('xn--') ? url.hostname : part;\n } catch {\n return part;\n }\n })\n .join('.');\n }\n\n /**\n * Query domain information\n * @param domain Domain name to query (supports IDN/punycode)\n * @returns Domain information\n * @example\n * ```typescript\n * const client = new RdapClient();\n * const domain = await client.domain('example.com');\n * // IDN support\n * const idn = await client.domain('münchen.de');\n * ```\n */\n async domain(domain: string): Promise<RdapDomainResponse> {\n const punyDomain = this.prepareDomain(domain);\n const url = `https://${this.baseDomain}/domain/${encodeURIComponent(punyDomain)}`;\n const response = await this.fetcher.fetch<never, RdapDomainResponse>({\n method: 'GET',\n url,\n });\n\n if (response.status === 404 && response.url === url) {\n throw new RdapNotFoundError(`Domain ${domain} has no RDAP server for its TLD`);\n }\n\n return response.data;\n }\n\n /**\n * Query IP address or network information\n * @param ip IP address or CIDR notation\n * @returns IP network information\n * @example\n * ```typescript\n * const client = new RdapClient();\n * const ip = await client.ip('8.8.8.8');\n * // or with CIDR notation\n * const network = await client.ip('2001:db8::1/128');\n * ```\n */\n async ip(ip: string): Promise<RdapIpResponse> {\n const response = await this.fetcher.fetch<never, RdapIpResponse>({\n method: 'GET',\n url: `https://${this.baseDomain}/ip/${encodeURIComponent(ip)}`,\n });\n\n return response.data;\n }\n\n /**\n * Query Autonomous System Number information\n * @param asn Autonomous System Number\n * @returns ASN information\n * @example\n * ```typescript\n * const client = new RdapClient();\n * const asn = await client.autnum(174);\n * ```\n */\n async autnum(asn: number): Promise<RdapAutnumResponse> {\n const response = await this.fetcher.fetch<never, RdapAutnumResponse>({\n method: 'GET',\n url: `https://${this.baseDomain}/autnum/${asn}`,\n });\n\n return response.data;\n }\n}\n"],"mappings":";AAqCO,IAAM,iBAAN,MAAwC;AAAA,EAC7C,MAAM,MAA4C;AAAA,IAChD;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,CAAC;AAAA,EACb,GAA2D;AACzD,UAAM,aAAa,IAAI,IAAI,GAAG;AAG9B,QAAI,WAAW,SAAS,MAAM;AAC5B,aAAO,QAAQ,IAA8B,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACvE,mBAAW,aAAa,OAAO,KAAK,KAAK;AAAA,MAC3C,CAAC;AAAA,IACH;AAEA,UAAM,cAA2B;AAAA,MAC/B;AAAA,MACA,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG;AAAA,MACL;AAAA,IACF;AAGA,QAAI,WAAW,SAAS,MAAM;AAC5B,kBAAY,OAAO,KAAK,UAAU,IAAI;AAAA,IACxC;AAEA,UAAM,WAAW,MAAM,MAAM,YAAY,WAAW;AACpD,UAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,WAAO;AAAA,MACL,QAAQ,SAAS;AAAA,MACjB;AAAA,MACA,SAAS,SAAS;AAAA,MAClB,KAAK,SAAS;AAAA,IAChB;AAAA,EACF;AACF;;;AC5EO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;ACIO,IAAM,aAAN,MAAiB;AAAA,EAItB,YAAY,UAA6B,CAAC,GAAG;AAC3C,SAAK,UAAU,QAAQ,WAAW,IAAI,eAAe;AACrD,SAAK,aAAa,QAAQ,cAAc;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,QAAwB;AAC5C,WAAO,OACJ,YAAY,EACZ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS;AACb,UAAI;AACF,YAAI,KAAK,SAAS,MAAM,GAAG;AACzB,iBAAO;AAAA,QACT;AAEA,cAAM,MAAM,IAAI,IAAI,WAAW,IAAI,EAAE;AACrC,eAAO,IAAI,SAAS,WAAW,MAAM,IAAI,IAAI,WAAW;AAAA,MAC1D,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC,EACA,KAAK,GAAG;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,OAAO,QAA6C;AACxD,UAAM,aAAa,KAAK,cAAc,MAAM;AAC5C,UAAM,MAAM,WAAW,KAAK,UAAU,WAAW,mBAAmB,UAAU,CAAC;AAC/E,UAAM,WAAW,MAAM,KAAK,QAAQ,MAAiC;AAAA,MACnE,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAED,QAAI,SAAS,WAAW,OAAO,SAAS,QAAQ,KAAK;AACnD,YAAM,IAAI,kBAAkB,UAAU,MAAM,iCAAiC;AAAA,IAC/E;AAEA,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,GAAG,IAAqC;AAC5C,UAAM,WAAW,MAAM,KAAK,QAAQ,MAA6B;AAAA,MAC/D,QAAQ;AAAA,MACR,KAAK,WAAW,KAAK,UAAU,OAAO,mBAAmB,EAAE,CAAC;AAAA,IAC9D,CAAC;AAED,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,OAAO,KAA0C;AACrD,UAAM,WAAW,MAAM,KAAK,QAAQ,MAAiC;AAAA,MACnE,QAAQ;AAAA,MACR,KAAK,WAAW,KAAK,UAAU,WAAW,GAAG;AAAA,IAC/C,CAAC;AAED,WAAO,SAAS;AAAA,EAClB;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/utils/fetcher.ts","../src/utils/throwables.ts","../src/client.ts"],"sourcesContent":["/**\n * HTTP methods supported by the fetcher\n */\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\n/**\n * Options for the fetch request\n */\nexport interface FetchOptions<T = unknown> {\n method: HttpMethod;\n url: string;\n body?: T;\n headers?: Record<string, string>;\n}\n\n/**\n * Response from the fetch request\n */\nexport interface FetchResponse<T = unknown> {\n status: number;\n data: T;\n headers: Headers;\n url: string;\n}\n\n/**\n * Interface for the fetcher implementation\n */\nexport interface Fetcher {\n fetch<TBody = unknown, TResponse = unknown>(\n options: FetchOptions<TBody>,\n ): Promise<FetchResponse<TResponse>>;\n}\n\n/**\n * Default fetcher implementation using node-fetch\n */\nexport class DefaultFetcher implements Fetcher {\n async fetch<TBody = unknown, TResponse = unknown>({\n method,\n url,\n body,\n headers = {},\n }: FetchOptions<TBody>): Promise<FetchResponse<TResponse>> {\n const requestUrl = new URL(url);\n\n // For GET requests, convert body to query parameters\n if (method === 'GET' && body) {\n Object.entries(body as Record<string, string>).forEach(([key, value]) => {\n requestUrl.searchParams.append(key, value);\n });\n }\n\n const requestInit: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n };\n\n // Add body for non-GET requests\n if (method !== 'GET' && body) {\n requestInit.body = JSON.stringify(body);\n }\n\n const response = await fetch(requestUrl, requestInit);\n const data = (await response.json()) as TResponse;\n\n return {\n status: response.status,\n data,\n headers: response.headers,\n url: response.url,\n };\n }\n}\n","export class RdapNotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'RdapNotFoundError';\n }\n}\n","import { RdapAutnumResponse, RdapDomainResponse, RdapIpResponse } from './types';\nimport { DefaultFetcher, Fetcher } from './utils/fetcher';\nimport { RdapNotFoundError } from './utils/throwables';\n\nexport interface RdapClientOptions {\n fetcher?: Fetcher;\n baseDomain?: string;\n}\n\nexport class RdapClient {\n private readonly fetcher: Fetcher;\n private readonly baseDomain: string;\n\n constructor(options: RdapClientOptions = {}) {\n this.fetcher = options.fetcher ?? new DefaultFetcher();\n this.baseDomain = options.baseDomain ?? 'www.rdap.net';\n }\n\n /**\n * Convert domain to punycode if needed\n */\n private prepareDomain(domain: string): string {\n return domain\n .toLowerCase()\n .split('.')\n .map((part) => {\n try {\n if (part.includes('xn--')) {\n return part;\n }\n // Use URL API to handle IDN conversion\n const url = new URL(`https://${part}`);\n return url.hostname.startsWith('xn--') ? url.hostname : part;\n } catch {\n return part;\n }\n })\n .join('.');\n }\n\n /**\n * Query domain information\n * @param domain Domain name to query (supports IDN/punycode)\n * @returns Domain information\n * @example\n * ```typescript\n * const client = new RdapClient();\n * const domain = await client.domain('example.com');\n * // IDN support\n * const idn = await client.domain('münchen.de');\n * ```\n */\n async domain(domain: string): Promise<RdapDomainResponse> {\n const punyDomain = this.prepareDomain(domain);\n const url = `https://${this.baseDomain}/domain/${encodeURIComponent(punyDomain)}`;\n try {\n const response = await this.fetcher.fetch<never, RdapDomainResponse>({\n method: 'GET',\n url,\n });\n\n if (response.status === 404 && response.url === url) {\n throw new RdapNotFoundError(`Domain ${domain} has no RDAP server for its TLD`);\n }\n\n return response.data;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new RdapNotFoundError(`Domain ${domain} has no RDAP server for its TLD`);\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Query IP address or network information\n * @param ip IP address or CIDR notation\n * @returns IP network information\n * @example\n * ```typescript\n * const client = new RdapClient();\n * const ip = await client.ip('8.8.8.8');\n * // or with CIDR notation\n * const network = await client.ip('2001:db8::1/128');\n * ```\n */\n async ip(ip: string): Promise<RdapIpResponse> {\n const response = await this.fetcher.fetch<never, RdapIpResponse>({\n method: 'GET',\n url: `https://${this.baseDomain}/ip/${encodeURIComponent(ip)}`,\n });\n\n return response.data;\n }\n\n /**\n * Query Autonomous System Number information\n * @param asn Autonomous System Number\n * @returns ASN information\n * @example\n * ```typescript\n * const client = new RdapClient();\n * const asn = await client.autnum(174);\n * ```\n */\n async autnum(asn: number): Promise<RdapAutnumResponse> {\n const response = await this.fetcher.fetch<never, RdapAutnumResponse>({\n method: 'GET',\n url: `https://${this.baseDomain}/autnum/${asn}`,\n });\n\n return response.data;\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chez14/rdap-sdk",
3
- "version": "0.1.1-8",
3
+ "version": "0.1.1-9",
4
4
  "description": "A TypeScript SDK for RDAP.net. Directly calls RDAP APIs from RDAP.net as the main RDAP Server Database.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -8,14 +8,14 @@
8
8
  },
9
9
  "type": "module",
10
10
  "main": "dist/index.js",
11
- "module": "dist/index.mjs",
11
+ "module": "dist/index.js",
12
12
  "types": "dist/index.d.ts",
13
13
  "exports": {
14
14
  ".": {
15
- "require": "./dist/index.js",
16
- "import": "./dist/index.mjs",
17
- "types": "./dist/index.d.ts"
18
- }
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.js"
17
+ },
18
+ "./ts/*": "./src/*"
19
19
  },
20
20
  "scripts": {
21
21
  "build": "tsup",
package/src/client.ts CHANGED
@@ -53,16 +53,24 @@ export class RdapClient {
53
53
  async domain(domain: string): Promise<RdapDomainResponse> {
54
54
  const punyDomain = this.prepareDomain(domain);
55
55
  const url = `https://${this.baseDomain}/domain/${encodeURIComponent(punyDomain)}`;
56
- const response = await this.fetcher.fetch<never, RdapDomainResponse>({
57
- method: 'GET',
58
- url,
59
- });
56
+ try {
57
+ const response = await this.fetcher.fetch<never, RdapDomainResponse>({
58
+ method: 'GET',
59
+ url,
60
+ });
60
61
 
61
- if (response.status === 404 && response.url === url) {
62
- throw new RdapNotFoundError(`Domain ${domain} has no RDAP server for its TLD`);
63
- }
62
+ if (response.status === 404 && response.url === url) {
63
+ throw new RdapNotFoundError(`Domain ${domain} has no RDAP server for its TLD`);
64
+ }
64
65
 
65
- return response.data;
66
+ return response.data;
67
+ } catch (error) {
68
+ if (error instanceof SyntaxError) {
69
+ throw new RdapNotFoundError(`Domain ${domain} has no RDAP server for its TLD`);
70
+ } else {
71
+ throw error;
72
+ }
73
+ }
66
74
  }
67
75
 
68
76
  /**