@x12i/api-hub-rdap 0.0.0-stage → 0.1.0
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/README.md +10 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/rdap.d.ts +57 -0
- package/dist/rdap.js +75 -0
- package/dist/rdap.js.map +1 -0
- package/package.json +34 -4
package/README.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @x12i/api-hub-rdap
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
RDAP domain lookup client for the x12i API hub
|
|
4
|
+
|
|
5
|
+
ESM package for Node.js 24 or newer. Import the public name:
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
import * as rdap from '@x12i/api-hub-rdap';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
The whole set is also available from [`@x12i/api-hub`](https://www.npmjs.com/package/@x12i/api-hub).
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { BOOTSTRAP_URL, eventDate, fetchRdap, loadServers, parseBootstrap, serverFor, vcard, vcardText, withRole, type RdapDomain, type RdapEntity, type RdapLink, type RdapServers, } from './rdap.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/rdap/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,SAAS,EACT,SAAS,EACT,WAAW,EACX,cAAc,EACd,SAAS,EACT,KAAK,EACL,SAAS,EACT,QAAQ,GAKT,MAAM,WAAW,CAAC","sourcesContent":["export {\n BOOTSTRAP_URL,\n eventDate,\n fetchRdap,\n loadServers,\n parseBootstrap,\n serverFor,\n vcard,\n vcardText,\n withRole,\n type RdapDomain,\n type RdapEntity,\n type RdapLink,\n type RdapServers,\n} from './rdap.ts';\n"]}
|
package/dist/rdap.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type Ctx } from '@x12i/api-hub-core';
|
|
2
|
+
export declare const BOOTSTRAP_URL = "https://data.iana.org/rdap/dns.json";
|
|
3
|
+
interface Bootstrap {
|
|
4
|
+
services: [string[], string[]][];
|
|
5
|
+
}
|
|
6
|
+
/** TLD to RDAP base URL (https preferred, trailing slash). */
|
|
7
|
+
export type RdapServers = Record<string, string>;
|
|
8
|
+
export declare function parseBootstrap(doc: Bootstrap): RdapServers;
|
|
9
|
+
/** RDAP base for the longest matching suffix of the domain, or undefined when the TLD has no RDAP service. */
|
|
10
|
+
export declare function serverFor(servers: RdapServers, domain: string): string | undefined;
|
|
11
|
+
/** The IANA bootstrap for domain names, cached for 24 hours and shared by every capability that uses RDAP. */
|
|
12
|
+
export declare function loadServers(ctx: Ctx): Promise<RdapServers>;
|
|
13
|
+
/** Fetches one RDAP object; null when the server says it does not exist. */
|
|
14
|
+
export declare function fetchRdap(url: string, ctx: Ctx): Promise<RdapDomain | null>;
|
|
15
|
+
type VcardProp = [string, Record<string, unknown>, string, unknown];
|
|
16
|
+
export interface RdapEntity {
|
|
17
|
+
roles?: string[];
|
|
18
|
+
handle?: string;
|
|
19
|
+
publicIds?: {
|
|
20
|
+
type: string;
|
|
21
|
+
identifier: string;
|
|
22
|
+
}[];
|
|
23
|
+
vcardArray?: ['vcard', VcardProp[]];
|
|
24
|
+
entities?: RdapEntity[];
|
|
25
|
+
links?: RdapLink[];
|
|
26
|
+
remarks?: {
|
|
27
|
+
title?: string;
|
|
28
|
+
}[];
|
|
29
|
+
}
|
|
30
|
+
export interface RdapLink {
|
|
31
|
+
rel?: string;
|
|
32
|
+
href?: string;
|
|
33
|
+
type?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface RdapDomain {
|
|
36
|
+
objectClassName: string;
|
|
37
|
+
handle?: string;
|
|
38
|
+
ldhName?: string;
|
|
39
|
+
status?: string[];
|
|
40
|
+
events?: {
|
|
41
|
+
eventAction: string;
|
|
42
|
+
eventDate: string;
|
|
43
|
+
}[];
|
|
44
|
+
entities?: RdapEntity[];
|
|
45
|
+
nameservers?: {
|
|
46
|
+
ldhName?: string;
|
|
47
|
+
}[];
|
|
48
|
+
secureDNS?: {
|
|
49
|
+
delegationSigned?: boolean;
|
|
50
|
+
};
|
|
51
|
+
links?: RdapLink[];
|
|
52
|
+
}
|
|
53
|
+
export declare function vcard(entity: RdapEntity | undefined, prop: string): VcardProp | undefined;
|
|
54
|
+
export declare function vcardText(entity: RdapEntity | undefined, prop: string): string | null;
|
|
55
|
+
export declare function withRole(entities: RdapEntity[] | undefined, role: string): RdapEntity | undefined;
|
|
56
|
+
export declare function eventDate(doc: RdapDomain | null, ...actions: string[]): string | null;
|
|
57
|
+
export {};
|
package/dist/rdap.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { HubError } from '@x12i/api-hub-core';
|
|
2
|
+
export const BOOTSTRAP_URL = 'https://data.iana.org/rdap/dns.json';
|
|
3
|
+
const RDAP_ACCEPT = 'application/rdap+json, application/json;q=0.8';
|
|
4
|
+
export function parseBootstrap(doc) {
|
|
5
|
+
if (!Array.isArray(doc?.services))
|
|
6
|
+
throw new HubError('upstream_unavailable', 'The IANA RDAP bootstrap could not be parsed');
|
|
7
|
+
const servers = {};
|
|
8
|
+
for (const [tlds, urls] of doc.services) {
|
|
9
|
+
const url = urls.find((u) => u.startsWith('https://')) ?? urls[0];
|
|
10
|
+
if (!url)
|
|
11
|
+
continue;
|
|
12
|
+
for (const tld of tlds)
|
|
13
|
+
servers[tld.toLowerCase()] = url.endsWith('/') ? url : `${url}/`;
|
|
14
|
+
}
|
|
15
|
+
return servers;
|
|
16
|
+
}
|
|
17
|
+
/** RDAP base for the longest matching suffix of the domain, or undefined when the TLD has no RDAP service. */
|
|
18
|
+
export function serverFor(servers, domain) {
|
|
19
|
+
const labels = domain.split('.');
|
|
20
|
+
for (let i = 1; i < labels.length; i++) {
|
|
21
|
+
const hit = servers[labels.slice(i).join('.')];
|
|
22
|
+
if (hit)
|
|
23
|
+
return hit;
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
/** The IANA bootstrap for domain names, cached for 24 hours and shared by every capability that uses RDAP. */
|
|
28
|
+
export async function loadServers(ctx) {
|
|
29
|
+
return ctx.cache.wrap('rdap:iana-bootstrap', '24h', async () => {
|
|
30
|
+
const res = await ctx.fetch(BOOTSTRAP_URL, { maxBytes: 1024 * 1024, timeoutMs: 10_000, signal: ctx.signal });
|
|
31
|
+
if (res.status !== 200)
|
|
32
|
+
throw new HubError('upstream_unavailable', 'The IANA RDAP bootstrap is unavailable', { status: res.status });
|
|
33
|
+
return parseBootstrap(res.json());
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/** Fetches one RDAP object; null when the server says it does not exist. */
|
|
37
|
+
export async function fetchRdap(url, ctx) {
|
|
38
|
+
const res = await ctx.fetch(url, { headers: { accept: RDAP_ACCEPT }, maxBytes: 512 * 1024, timeoutMs: 10_000, signal: ctx.signal });
|
|
39
|
+
if (res.status === 404)
|
|
40
|
+
return null;
|
|
41
|
+
if (res.status === 429)
|
|
42
|
+
throw new HubError('upstream_unavailable', 'The RDAP server is rate limiting requests; try again later', { status: 429 });
|
|
43
|
+
if (res.status !== 200)
|
|
44
|
+
throw new HubError('upstream_unavailable', 'The RDAP server returned an error', { status: res.status });
|
|
45
|
+
let doc;
|
|
46
|
+
try {
|
|
47
|
+
doc = res.json();
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
throw new HubError('upstream_unavailable', 'The RDAP server returned a malformed response');
|
|
51
|
+
}
|
|
52
|
+
if (doc?.objectClassName !== 'domain')
|
|
53
|
+
throw new HubError('upstream_unavailable', 'The RDAP server returned an unexpected object');
|
|
54
|
+
return doc;
|
|
55
|
+
}
|
|
56
|
+
export function vcard(entity, prop) {
|
|
57
|
+
return entity?.vcardArray?.[1]?.find((p) => p[0] === prop);
|
|
58
|
+
}
|
|
59
|
+
export function vcardText(entity, prop) {
|
|
60
|
+
const value = vcard(entity, prop)?.[3];
|
|
61
|
+
const text = Array.isArray(value) ? value.filter(Boolean).join(' ') : typeof value === 'string' ? value : '';
|
|
62
|
+
return text.trim() || null;
|
|
63
|
+
}
|
|
64
|
+
export function withRole(entities, role) {
|
|
65
|
+
return entities?.find((e) => e.roles?.includes(role));
|
|
66
|
+
}
|
|
67
|
+
export function eventDate(doc, ...actions) {
|
|
68
|
+
for (const action of actions) {
|
|
69
|
+
const date = doc?.events?.find((e) => e.eventAction === action)?.eventDate;
|
|
70
|
+
if (date && !Number.isNaN(Date.parse(date)))
|
|
71
|
+
return new Date(date).toISOString();
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=rdap.js.map
|
package/dist/rdap.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rdap.js","sourceRoot":"","sources":["../../../../../packages/rdap/src/rdap.ts"],"names":[],"mappings":"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","sourcesContent":["import { HubError, type Ctx } from '@x12i/api-hub-core';\n\nexport const BOOTSTRAP_URL = 'https://data.iana.org/rdap/dns.json';\nconst RDAP_ACCEPT = 'application/rdap+json, application/json;q=0.8';\n\ninterface Bootstrap {\n services: [string[], string[]][];\n}\n\n/** TLD to RDAP base URL (https preferred, trailing slash). */\nexport type RdapServers = Record<string, string>;\n\nexport function parseBootstrap(doc: Bootstrap): RdapServers {\n if (!Array.isArray(doc?.services)) throw new HubError('upstream_unavailable', 'The IANA RDAP bootstrap could not be parsed');\n const servers: RdapServers = {};\n for (const [tlds, urls] of doc.services) {\n const url = urls.find((u) => u.startsWith('https://')) ?? urls[0];\n if (!url) continue;\n for (const tld of tlds) servers[tld.toLowerCase()] = url.endsWith('/') ? url : `${url}/`;\n }\n return servers;\n}\n\n/** RDAP base for the longest matching suffix of the domain, or undefined when the TLD has no RDAP service. */\nexport function serverFor(servers: RdapServers, domain: string): string | undefined {\n const labels = domain.split('.');\n for (let i = 1; i < labels.length; i++) {\n const hit = servers[labels.slice(i).join('.')];\n if (hit) return hit;\n }\n return undefined;\n}\n\n/** The IANA bootstrap for domain names, cached for 24 hours and shared by every capability that uses RDAP. */\nexport async function loadServers(ctx: Ctx): Promise<RdapServers> {\n return ctx.cache.wrap('rdap:iana-bootstrap', '24h', async () => {\n const res = await ctx.fetch(BOOTSTRAP_URL, { maxBytes: 1024 * 1024, timeoutMs: 10_000, signal: ctx.signal });\n if (res.status !== 200) throw new HubError('upstream_unavailable', 'The IANA RDAP bootstrap is unavailable', { status: res.status });\n return parseBootstrap(res.json<Bootstrap>());\n });\n}\n\n/** Fetches one RDAP object; null when the server says it does not exist. */\nexport async function fetchRdap(url: string, ctx: Ctx): Promise<RdapDomain | null> {\n const res = await ctx.fetch(url, { headers: { accept: RDAP_ACCEPT }, maxBytes: 512 * 1024, timeoutMs: 10_000, signal: ctx.signal });\n if (res.status === 404) return null;\n if (res.status === 429) throw new HubError('upstream_unavailable', 'The RDAP server is rate limiting requests; try again later', { status: 429 });\n if (res.status !== 200) throw new HubError('upstream_unavailable', 'The RDAP server returned an error', { status: res.status });\n let doc: RdapDomain;\n try {\n doc = res.json<RdapDomain>();\n } catch {\n throw new HubError('upstream_unavailable', 'The RDAP server returned a malformed response');\n }\n if (doc?.objectClassName !== 'domain') throw new HubError('upstream_unavailable', 'The RDAP server returned an unexpected object');\n return doc;\n}\n\n// Subset of RFC 9083 that the lookup reads.\ntype VcardProp = [string, Record<string, unknown>, string, unknown];\nexport interface RdapEntity {\n roles?: string[];\n handle?: string;\n publicIds?: { type: string; identifier: string }[];\n vcardArray?: ['vcard', VcardProp[]];\n entities?: RdapEntity[];\n links?: RdapLink[];\n remarks?: { title?: string }[];\n}\nexport interface RdapLink {\n rel?: string;\n href?: string;\n type?: string;\n}\nexport interface RdapDomain {\n objectClassName: string;\n handle?: string;\n ldhName?: string;\n status?: string[];\n events?: { eventAction: string; eventDate: string }[];\n entities?: RdapEntity[];\n nameservers?: { ldhName?: string }[];\n secureDNS?: { delegationSigned?: boolean };\n links?: RdapLink[];\n}\n\nexport function vcard(entity: RdapEntity | undefined, prop: string): VcardProp | undefined {\n return entity?.vcardArray?.[1]?.find((p) => p[0] === prop);\n}\n\nexport function vcardText(entity: RdapEntity | undefined, prop: string): string | null {\n const value = vcard(entity, prop)?.[3];\n const text = Array.isArray(value) ? value.filter(Boolean).join(' ') : typeof value === 'string' ? value : '';\n return text.trim() || null;\n}\n\nexport function withRole(entities: RdapEntity[] | undefined, role: string): RdapEntity | undefined {\n return entities?.find((e) => e.roles?.includes(role));\n}\n\nexport function eventDate(doc: RdapDomain | null, ...actions: string[]): string | null {\n for (const action of actions) {\n const date = doc?.events?.find((e) => e.eventAction === action)?.eventDate;\n if (date && !Number.isNaN(Date.parse(date))) return new Date(date).toISOString();\n }\n return null;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,36 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@x12i/api-hub-rdap",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "RDAP domain lookup client for the x12i API hub",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=24"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/x12i/apis-hub.git",
|
|
24
|
+
"directory": "packages/rdap"
|
|
25
|
+
},
|
|
26
|
+
"bugs": {
|
|
27
|
+
"url": "https://github.com/x12i/apis-hub/issues"
|
|
28
|
+
},
|
|
29
|
+
"homepage": "https://github.com/x12i/apis-hub",
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@x12i/api-hub-core": "0.1.0"
|
|
35
|
+
}
|
|
36
|
+
}
|