recker 1.0.15-next.0dab95d → 1.0.15-next.0eabd39
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 -1
- package/dist/ai/providers/anthropic.d.ts.map +1 -1
- package/dist/ai/providers/anthropic.js +4 -1
- package/dist/ai/providers/base.d.ts.map +1 -1
- package/dist/ai/providers/base.js +7 -2
- package/dist/ai/rate-limiter.d.ts.map +1 -1
- package/dist/ai/rate-limiter.js +4 -1
- package/dist/bench/generator.d.ts.map +1 -1
- package/dist/bench/generator.js +7 -3
- package/dist/bench/stats.d.ts.map +1 -1
- package/dist/bench/stats.js +43 -10
- package/dist/cache/memory-storage.d.ts.map +1 -1
- package/dist/cache/memory-storage.js +3 -2
- package/dist/cli/handler.js +14 -14
- package/dist/cli/index.js +582 -49
- package/dist/cli/presets.js +5 -5
- package/dist/cli/tui/ai-chat.js +10 -10
- package/dist/cli/tui/load-dashboard.d.ts.map +1 -1
- package/dist/cli/tui/load-dashboard.js +96 -55
- package/dist/cli/tui/scroll-buffer.d.ts +1 -1
- package/dist/cli/tui/scroll-buffer.d.ts.map +1 -1
- package/dist/cli/tui/scroll-buffer.js +2 -2
- package/dist/cli/tui/shell.d.ts +3 -0
- package/dist/cli/tui/shell.d.ts.map +1 -1
- package/dist/cli/tui/shell.js +188 -6
- package/dist/cli/tui/websocket.js +17 -17
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +18 -26
- package/dist/core/errors.d.ts +109 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +214 -1
- package/dist/core/request-promise.d.ts.map +1 -1
- package/dist/core/request-promise.js +5 -6
- package/dist/core/response.d.ts.map +1 -1
- package/dist/core/response.js +5 -6
- package/dist/dns/propagation.d.ts +3 -1
- package/dist/dns/propagation.d.ts.map +1 -1
- package/dist/dns/propagation.js +99 -59
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/mcp/client.js +10 -11
- package/dist/mcp/embeddings-loader.d.ts.map +1 -1
- package/dist/mcp/embeddings-loader.js +12 -2
- package/dist/mcp/geoip-loader.d.ts +11 -0
- package/dist/mcp/geoip-loader.d.ts.map +1 -0
- package/dist/mcp/geoip-loader.js +107 -0
- package/dist/mcp/ip-intel.d.ts +28 -0
- package/dist/mcp/ip-intel.d.ts.map +1 -0
- package/dist/mcp/ip-intel.js +209 -0
- package/dist/mcp/search/hybrid-search.d.ts.map +1 -1
- package/dist/mcp/search/hybrid-search.js +5 -1
- package/dist/mcp/search/math.d.ts.map +1 -1
- package/dist/mcp/search/math.js +5 -1
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +114 -1
- package/dist/plugins/compression.js +4 -2
- package/dist/plugins/har-player.d.ts.map +1 -1
- package/dist/plugins/har-player.js +8 -11
- package/dist/plugins/odata.d.ts.map +1 -1
- package/dist/plugins/odata.js +5 -2
- package/dist/protocols/ftp.d.ts.map +1 -1
- package/dist/protocols/ftp.js +69 -16
- package/dist/protocols/sftp.d.ts.map +1 -1
- package/dist/protocols/sftp.js +13 -3
- package/dist/protocols/telnet.d.ts.map +1 -1
- package/dist/protocols/telnet.js +25 -6
- package/dist/transport/base-udp.d.ts.map +1 -1
- package/dist/transport/base-udp.js +7 -4
- package/dist/transport/udp-response.d.ts.map +1 -1
- package/dist/transport/udp-response.js +10 -3
- package/dist/transport/udp.d.ts.map +1 -1
- package/dist/transport/udp.js +5 -1
- package/dist/transport/undici.d.ts.map +1 -1
- package/dist/transport/undici.js +75 -63
- package/dist/utils/agent-manager.d.ts +1 -0
- package/dist/utils/agent-manager.d.ts.map +1 -1
- package/dist/utils/agent-manager.js +11 -0
- package/dist/utils/client-pool.d.ts.map +1 -1
- package/dist/utils/client-pool.js +4 -1
- package/dist/utils/dns-toolkit.d.ts +88 -1
- package/dist/utils/dns-toolkit.d.ts.map +1 -1
- package/dist/utils/dns-toolkit.js +704 -6
- package/dist/utils/doh.d.ts.map +1 -1
- package/dist/utils/doh.js +13 -16
- package/dist/utils/download.d.ts.map +1 -1
- package/dist/utils/download.js +10 -11
- package/dist/utils/rdap.d.ts +9 -0
- package/dist/utils/rdap.d.ts.map +1 -1
- package/dist/utils/rdap.js +78 -9
- package/dist/utils/security-grader.d.ts +47 -0
- package/dist/utils/security-grader.d.ts.map +1 -0
- package/dist/utils/security-grader.js +637 -0
- package/dist/utils/sparkline.d.ts +18 -0
- package/dist/utils/sparkline.d.ts.map +1 -0
- package/dist/utils/sparkline.js +55 -0
- package/dist/utils/sse.d.ts.map +1 -1
- package/dist/utils/sse.js +5 -6
- package/dist/utils/system-metrics.d.ts +26 -0
- package/dist/utils/system-metrics.d.ts.map +1 -0
- package/dist/utils/system-metrics.js +81 -0
- package/dist/webrtc/index.d.ts.map +1 -1
- package/dist/webrtc/index.js +21 -7
- package/dist/websocket/client.d.ts.map +1 -1
- package/dist/websocket/client.js +13 -16
- package/package.json +3 -2
package/dist/utils/doh.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doh.d.ts","sourceRoot":"","sources":["../../src/utils/doh.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAsBrE,wBAAgB,eAAe,CAAC,QAAQ,GAAE,WAA0B,IAGpD,UAAU,MAAM,EAAE,MAAM,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,
|
|
1
|
+
{"version":3,"file":"doh.d.ts","sourceRoot":"","sources":["../../src/utils/doh.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAsBrE,wBAAgB,eAAe,CAAC,QAAQ,GAAE,WAA0B,IAGpD,UAAU,MAAM,EAAE,MAAM,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,mBA+DlH"}
|
package/dist/utils/doh.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { request } from 'undici';
|
|
2
|
-
import {
|
|
2
|
+
import { ProtocolError, NotFoundError } from '../core/errors.js';
|
|
3
3
|
const PROVIDERS = {
|
|
4
4
|
cloudflare: 'https://1.1.1.1/dns-query',
|
|
5
5
|
google: 'https://8.8.8.8/resolve',
|
|
@@ -17,29 +17,26 @@ export function createDoHLookup(provider = 'cloudflare') {
|
|
|
17
17
|
headers: { 'Accept': 'application/dns-json' }
|
|
18
18
|
});
|
|
19
19
|
if (statusCode !== 200) {
|
|
20
|
-
throw new
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
'
|
|
24
|
-
|
|
20
|
+
throw new ProtocolError(`DoH request failed with status ${statusCode}`, {
|
|
21
|
+
protocol: 'dns',
|
|
22
|
+
code: statusCode,
|
|
23
|
+
phase: 'doh-request',
|
|
24
|
+
retriable: statusCode >= 500 || statusCode === 429,
|
|
25
|
+
});
|
|
25
26
|
}
|
|
26
27
|
const data = await body.json();
|
|
27
28
|
if (data.Status !== 0 || !data.Answer || data.Answer.length === 0) {
|
|
28
|
-
return callback(new
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
'Retry or fall back to system DNS if the provider is down.'
|
|
32
|
-
]), '', 4);
|
|
29
|
+
return callback(new NotFoundError(`DNS lookup failed for ${hostname}`, {
|
|
30
|
+
resource: hostname,
|
|
31
|
+
}), '', 4);
|
|
33
32
|
}
|
|
34
33
|
const record = data.Answer.find(r => r.type === 1);
|
|
35
34
|
if (record) {
|
|
36
35
|
return callback(null, record.data, 4);
|
|
37
36
|
}
|
|
38
|
-
callback(new
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
'Try an alternate resolver to rule out stale caches.'
|
|
42
|
-
]), '', 4);
|
|
37
|
+
callback(new NotFoundError(`No A record found for ${hostname}`, {
|
|
38
|
+
resource: `A:${hostname}`,
|
|
39
|
+
}), '', 4);
|
|
43
40
|
}
|
|
44
41
|
catch (err) {
|
|
45
42
|
callback(err, '', 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/utils/download.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG1E,MAAM,WAAW,qBAAqB;IAKpC,MAAM,CAAC,EAAE,OAAO,CAAC;IAKjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAKhE,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAK9B,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,oBAAoB,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/utils/download.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG1E,MAAM,WAAW,qBAAqB;IAKpC,MAAM,CAAC,EAAE,OAAO,CAAC;IAKjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAKhE,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAK9B,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,oBAAoB,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,cAAc,CAAC,CAuCzB"}
|
package/dist/utils/download.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createWriteStream, existsSync, statSync } from 'node:fs';
|
|
2
2
|
import { pipeline } from 'node:stream/promises';
|
|
3
|
-
import {
|
|
3
|
+
import { DownloadError, StreamError } from '../core/errors.js';
|
|
4
4
|
export async function downloadToFile(client, url, destination, options = {}) {
|
|
5
5
|
const resumeEnabled = options.resume === true;
|
|
6
6
|
const existingSize = resumeEnabled && existsSync(destination) ? statSync(destination).size : 0;
|
|
@@ -15,11 +15,11 @@ export async function downloadToFile(client, url, destination, options = {}) {
|
|
|
15
15
|
});
|
|
16
16
|
const shouldAppend = resumeEnabled && existingSize > 0 && response.status === 206;
|
|
17
17
|
if (resumeEnabled && existingSize > 0 && response.status === 416) {
|
|
18
|
-
throw new
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
throw new DownloadError('Requested range not satisfiable for resume download.', {
|
|
19
|
+
url,
|
|
20
|
+
statusCode: response.status,
|
|
21
|
+
retriable: false,
|
|
22
|
+
});
|
|
23
23
|
}
|
|
24
24
|
const bytesWritten = await streamToFile(response, destination, shouldAppend);
|
|
25
25
|
return {
|
|
@@ -31,11 +31,10 @@ export async function downloadToFile(client, url, destination, options = {}) {
|
|
|
31
31
|
async function streamToFile(response, destination, append) {
|
|
32
32
|
const nodeStream = response.toNodeStream();
|
|
33
33
|
if (!nodeStream) {
|
|
34
|
-
throw new
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
]);
|
|
34
|
+
throw new StreamError('Response has no body to write', {
|
|
35
|
+
streamType: 'download',
|
|
36
|
+
retriable: true,
|
|
37
|
+
});
|
|
39
38
|
}
|
|
40
39
|
const writer = createWriteStream(destination, { flags: append ? 'a' : 'w' });
|
|
41
40
|
await pipeline(nodeStream, writer);
|
package/dist/utils/rdap.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Client } from '../core/client.js';
|
|
2
2
|
export interface RDAPResult {
|
|
3
3
|
handle?: string;
|
|
4
|
+
ldhName?: string;
|
|
4
5
|
status?: string[];
|
|
5
6
|
events?: Array<{
|
|
6
7
|
eventAction: string;
|
|
@@ -11,7 +12,15 @@ export interface RDAPResult {
|
|
|
11
12
|
roles?: string[];
|
|
12
13
|
vcardArray?: any[];
|
|
13
14
|
}>;
|
|
15
|
+
nameservers?: Array<{
|
|
16
|
+
ldhName: string;
|
|
17
|
+
}>;
|
|
18
|
+
secureDNS?: {
|
|
19
|
+
delegationSigned: boolean;
|
|
20
|
+
};
|
|
14
21
|
[key: string]: any;
|
|
15
22
|
}
|
|
16
23
|
export declare function rdap(client: Client, query: string): Promise<RDAPResult>;
|
|
24
|
+
export declare function supportsRDAP(tld: string): boolean;
|
|
25
|
+
export declare function getNoRDAPTLDs(): string[];
|
|
17
26
|
//# sourceMappingURL=rdap.d.ts.map
|
package/dist/utils/rdap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rdap.d.ts","sourceRoot":"","sources":["../../src/utils/rdap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"rdap.d.ts","sourceRoot":"","sources":["../../src/utils/rdap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAqC3C,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC,CAAC;IAC5E,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE;QAAE,gBAAgB,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1C,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AA4ED,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA+C7E;AAKD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGjD;AAKD,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC"}
|
package/dist/utils/rdap.js
CHANGED
|
@@ -1,32 +1,101 @@
|
|
|
1
|
+
import { NotFoundError, UnsupportedError } from '../core/errors.js';
|
|
2
|
+
const IANA_RDAP_BOOTSTRAP = 'https://data.iana.org/rdap/dns.json';
|
|
3
|
+
let ianaBootstrapCache = null;
|
|
4
|
+
let ianaBootstrapLastFetch = 0;
|
|
5
|
+
const IANA_CACHE_TTL = 24 * 60 * 60 * 1000;
|
|
1
6
|
const RDAP_SERVERS = {
|
|
2
7
|
'com': 'https://rdap.verisign.com/com/v1/',
|
|
3
8
|
'net': 'https://rdap.verisign.com/net/v1/',
|
|
4
9
|
'org': 'https://rdap.publicinterestregistry.net/rdap/org/',
|
|
5
|
-
'io': 'https://rdap.nic.io/domain/',
|
|
6
10
|
'br': 'https://rdap.registro.br/',
|
|
7
|
-
'
|
|
11
|
+
'dev': 'https://rdap.nic.google/',
|
|
12
|
+
'app': 'https://rdap.nic.google/',
|
|
13
|
+
'xyz': 'https://rdap.centralnic.com/xyz/',
|
|
14
|
+
'info': 'https://rdap.afilias.net/rdap/info/',
|
|
15
|
+
'me': 'https://rdap.nic.me/',
|
|
16
|
+
'co': 'https://rdap.nic.co/',
|
|
17
|
+
'uk': 'https://rdap.nominet.uk/uk/',
|
|
18
|
+
'de': 'https://rdap.denic.de/',
|
|
19
|
+
'eu': 'https://rdap.eurid.eu/',
|
|
20
|
+
'nl': 'https://rdap.sidn.nl/',
|
|
21
|
+
'au': 'https://rdap.auda.org.au/',
|
|
8
22
|
};
|
|
23
|
+
const NO_RDAP_TLDS = new Set([
|
|
24
|
+
'io', 'ai', 'gg', 'im', 'je', 'sh', 'ac', 'cx', 'gs', 'ms', 'nf', 'pn', 'tc', 'vg',
|
|
25
|
+
]);
|
|
26
|
+
async function getIANABootstrap(client) {
|
|
27
|
+
const now = Date.now();
|
|
28
|
+
if (ianaBootstrapCache && (now - ianaBootstrapLastFetch) < IANA_CACHE_TTL) {
|
|
29
|
+
return ianaBootstrapCache;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const data = await client.get(IANA_RDAP_BOOTSTRAP, { timeout: 5000 }).json();
|
|
33
|
+
const map = new Map();
|
|
34
|
+
for (const [tlds, servers] of data.services) {
|
|
35
|
+
const server = servers[0];
|
|
36
|
+
for (const tld of tlds) {
|
|
37
|
+
map.set(tld.toLowerCase(), server);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
ianaBootstrapCache = map;
|
|
41
|
+
ianaBootstrapLastFetch = now;
|
|
42
|
+
return map;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return new Map();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function getRDAPServer(client, tld) {
|
|
49
|
+
if (NO_RDAP_TLDS.has(tld)) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
if (RDAP_SERVERS[tld]) {
|
|
53
|
+
return RDAP_SERVERS[tld];
|
|
54
|
+
}
|
|
55
|
+
const bootstrap = await getIANABootstrap(client);
|
|
56
|
+
if (bootstrap.has(tld)) {
|
|
57
|
+
return bootstrap.get(tld);
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
9
61
|
export async function rdap(client, query) {
|
|
10
|
-
const isIp = /^\d+\.\d+\.\d+\.\d+$/.test(query);
|
|
62
|
+
const isIp = /^\d+\.\d+\.\d+\.\d+$/.test(query) || query.includes(':');
|
|
11
63
|
let url;
|
|
12
64
|
if (isIp) {
|
|
13
65
|
url = `https://rdap.arin.net/registry/ip/${query}`;
|
|
14
66
|
}
|
|
15
67
|
else {
|
|
16
68
|
const tld = query.split('.').pop()?.toLowerCase() || '';
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
url = `${base}${query}`;
|
|
69
|
+
const server = await getRDAPServer(client, tld);
|
|
70
|
+
if (!server) {
|
|
71
|
+
throw new UnsupportedError(`RDAP is not available for .${tld} domains. Use WHOIS instead: "rek whois ${query}"`, { feature: `rdap-${tld}` });
|
|
21
72
|
}
|
|
73
|
+
const base = server.endsWith('/') ? server : `${server}/`;
|
|
74
|
+
url = `${base}domain/${query}`;
|
|
22
75
|
}
|
|
23
76
|
try {
|
|
24
|
-
|
|
77
|
+
const result = await client.get(url, {
|
|
78
|
+
followRedirects: true,
|
|
79
|
+
timeout: 10000,
|
|
80
|
+
headers: {
|
|
81
|
+
'Accept': 'application/rdap+json, application/json',
|
|
82
|
+
}
|
|
83
|
+
}).json();
|
|
84
|
+
return result;
|
|
25
85
|
}
|
|
26
86
|
catch (error) {
|
|
27
87
|
if (error.status === 404) {
|
|
28
|
-
throw new
|
|
88
|
+
throw new NotFoundError(`RDAP entry not found for ${query}`, {
|
|
89
|
+
resource: query,
|
|
90
|
+
});
|
|
29
91
|
}
|
|
30
92
|
throw error;
|
|
31
93
|
}
|
|
32
94
|
}
|
|
95
|
+
export function supportsRDAP(tld) {
|
|
96
|
+
const normalizedTld = tld.toLowerCase().replace(/^\./, '');
|
|
97
|
+
return !NO_RDAP_TLDS.has(normalizedTld);
|
|
98
|
+
}
|
|
99
|
+
export function getNoRDAPTLDs() {
|
|
100
|
+
return Array.from(NO_RDAP_TLDS);
|
|
101
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface SecurityHeaderResult {
|
|
2
|
+
header: string;
|
|
3
|
+
value?: string;
|
|
4
|
+
status: 'pass' | 'warn' | 'fail';
|
|
5
|
+
score: number;
|
|
6
|
+
message: string;
|
|
7
|
+
recommendation?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface CSPDirective {
|
|
10
|
+
name: string;
|
|
11
|
+
values: string[];
|
|
12
|
+
issues: string[];
|
|
13
|
+
severity: 'safe' | 'warn' | 'dangerous';
|
|
14
|
+
}
|
|
15
|
+
export interface CSPAnalysis {
|
|
16
|
+
raw: string;
|
|
17
|
+
directives: CSPDirective[];
|
|
18
|
+
issues: string[];
|
|
19
|
+
score: number;
|
|
20
|
+
hasUnsafeInline: boolean;
|
|
21
|
+
hasUnsafeEval: boolean;
|
|
22
|
+
hasWildcard: boolean;
|
|
23
|
+
missingDirectives: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface SecurityReport {
|
|
26
|
+
grade: string;
|
|
27
|
+
score: number;
|
|
28
|
+
details: SecurityHeaderResult[];
|
|
29
|
+
csp?: CSPAnalysis;
|
|
30
|
+
summary: {
|
|
31
|
+
passed: number;
|
|
32
|
+
warnings: number;
|
|
33
|
+
failed: number;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export declare function analyzeCSP(cspValue: string): CSPAnalysis;
|
|
37
|
+
export declare function generateRecommendedCSP(options?: {
|
|
38
|
+
strictMode?: boolean;
|
|
39
|
+
allowInlineStyles?: boolean;
|
|
40
|
+
trustedDomains?: string[];
|
|
41
|
+
}): string;
|
|
42
|
+
export declare function analyzeSecurityHeaders(headers: Headers): SecurityReport;
|
|
43
|
+
export declare function quickSecurityCheck(headers: Headers): {
|
|
44
|
+
secure: boolean;
|
|
45
|
+
criticalIssues: string[];
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=security-grader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-grader.d.ts","sourceRoot":"","sources":["../../src/utils/security-grader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;CACzC;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AA2CD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAmHxD;AAKD,wBAAgB,sBAAsB,CAAC,OAAO,GAAE;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,GAAG,MAAM,CAiCd;AAkeD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CA6DvE;AAKD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG;IACpD,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CAgCA"}
|