recker 1.0.14 → 1.0.15-next.dac946a
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 +78 -100
- package/dist/ai/client.d.ts +2 -3
- package/dist/ai/client.d.ts.map +1 -1
- package/dist/ai/client.js +5 -6
- package/dist/ai/index.d.ts +1 -1
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +1 -1
- package/dist/cli/tui/ai-chat.js +2 -2
- package/dist/dns/index.d.ts +35 -0
- package/dist/dns/index.d.ts.map +1 -0
- package/dist/dns/index.js +124 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/mcp/embeddings-loader.d.ts +18 -0
- package/dist/mcp/embeddings-loader.d.ts.map +1 -0
- package/dist/mcp/embeddings-loader.js +152 -0
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -0
- package/dist/mcp/search/hybrid-search.d.ts.map +1 -1
- package/dist/mcp/search/hybrid-search.js +7 -21
- package/dist/recker.d.ts +47 -0
- package/dist/recker.d.ts.map +1 -0
- package/dist/recker.js +99 -0
- package/dist/transport/base-udp.d.ts.map +1 -1
- package/dist/transport/base-udp.js +1 -0
- package/dist/transport/udp-response.d.ts +2 -2
- package/dist/transport/udp-response.d.ts.map +1 -1
- package/dist/transport/udp-response.js +2 -2
- package/dist/transport/udp.d.ts +4 -3
- package/dist/transport/udp.d.ts.map +1 -1
- package/dist/transport/udp.js +16 -7
- package/dist/types/udp.d.ts +1 -0
- package/dist/types/udp.d.ts.map +1 -1
- package/dist/udp/index.d.ts +2 -2
- package/dist/udp/index.d.ts.map +1 -1
- package/dist/udp/index.js +2 -2
- package/dist/utils/whois.d.ts +18 -0
- package/dist/utils/whois.d.ts.map +1 -1
- package/dist/utils/whois.js +63 -0
- package/dist/webrtc/index.d.ts +80 -0
- package/dist/webrtc/index.d.ts.map +1 -0
- package/dist/webrtc/index.js +311 -0
- package/dist/websocket/client.d.ts +1 -1
- package/dist/websocket/client.d.ts.map +1 -1
- package/dist/websocket/client.js +1 -1
- package/package.json +2 -2
- package/dist/mcp/data/embeddings.json +0 -1
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
function getPackageVersionFromPkg() {
|
|
5
|
+
try {
|
|
6
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const paths = [
|
|
8
|
+
join(__dirname, '..', '..', 'package.json'),
|
|
9
|
+
join(__dirname, '..', '..', '..', 'package.json'),
|
|
10
|
+
join(process.cwd(), 'package.json'),
|
|
11
|
+
];
|
|
12
|
+
for (const pkgPath of paths) {
|
|
13
|
+
if (existsSync(pkgPath)) {
|
|
14
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
15
|
+
if (pkg.name === 'recker') {
|
|
16
|
+
return pkg.version;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
}
|
|
23
|
+
return '1.0.15';
|
|
24
|
+
}
|
|
25
|
+
let _packageVersion = null;
|
|
26
|
+
function getPackageVersion() {
|
|
27
|
+
if (!_packageVersion) {
|
|
28
|
+
_packageVersion = getPackageVersionFromPkg();
|
|
29
|
+
}
|
|
30
|
+
return _packageVersion;
|
|
31
|
+
}
|
|
32
|
+
const GITHUB_RELEASE_URL = 'https://github.com/forattini-dev/recker/releases/download';
|
|
33
|
+
function getCacheDir() {
|
|
34
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '';
|
|
35
|
+
if (homeDir) {
|
|
36
|
+
return join(homeDir, '.cache', 'recker');
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
40
|
+
return join(__dirname, '..', '..', 'node_modules', '.cache', 'recker');
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return join(process.cwd(), 'node_modules', '.cache', 'recker');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function getEmbeddingsCachePath(version) {
|
|
47
|
+
const cacheDir = getCacheDir();
|
|
48
|
+
const ver = version || getPackageVersion();
|
|
49
|
+
return join(cacheDir, `embeddings-${ver}.json`);
|
|
50
|
+
}
|
|
51
|
+
export function hasLocalEmbeddings(version) {
|
|
52
|
+
return existsSync(getEmbeddingsCachePath(version));
|
|
53
|
+
}
|
|
54
|
+
export function loadLocalEmbeddings(version) {
|
|
55
|
+
const cachePath = getEmbeddingsCachePath(version);
|
|
56
|
+
if (!existsSync(cachePath)) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const data = readFileSync(cachePath, 'utf-8');
|
|
61
|
+
return JSON.parse(data);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export function saveLocalEmbeddings(data, version) {
|
|
68
|
+
const cachePath = getEmbeddingsCachePath(version);
|
|
69
|
+
const cacheDir = dirname(cachePath);
|
|
70
|
+
if (!existsSync(cacheDir)) {
|
|
71
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
72
|
+
}
|
|
73
|
+
writeFileSync(cachePath, JSON.stringify(data));
|
|
74
|
+
}
|
|
75
|
+
export async function downloadEmbeddings(version) {
|
|
76
|
+
const ver = version || getPackageVersion();
|
|
77
|
+
const url = `${GITHUB_RELEASE_URL}/v${ver}/embeddings.json`;
|
|
78
|
+
try {
|
|
79
|
+
const response = await fetch(url);
|
|
80
|
+
if (!response.ok) {
|
|
81
|
+
throw new Error(`Failed to download embeddings: ${response.status} ${response.statusText}`);
|
|
82
|
+
}
|
|
83
|
+
const data = await response.json();
|
|
84
|
+
saveLocalEmbeddings(data, ver);
|
|
85
|
+
return data;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
throw new Error(`Failed to download embeddings from ${url}: ${error}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export async function loadBundledEmbeddings() {
|
|
92
|
+
try {
|
|
93
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
94
|
+
const bundledPath = join(__dirname, 'data', 'embeddings.json');
|
|
95
|
+
if (existsSync(bundledPath)) {
|
|
96
|
+
const data = readFileSync(bundledPath, 'utf-8');
|
|
97
|
+
return JSON.parse(data);
|
|
98
|
+
}
|
|
99
|
+
const srcPath = join(__dirname, '..', 'mcp', 'data', 'embeddings.json');
|
|
100
|
+
if (existsSync(srcPath)) {
|
|
101
|
+
const data = readFileSync(srcPath, 'utf-8');
|
|
102
|
+
return JSON.parse(data);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
export async function loadEmbeddings(options = {}) {
|
|
110
|
+
const { forceDownload = false, version, offline = false, debug = false } = options;
|
|
111
|
+
const log = (msg) => {
|
|
112
|
+
if (debug)
|
|
113
|
+
console.log(`[embeddings-loader] ${msg}`);
|
|
114
|
+
};
|
|
115
|
+
if (!forceDownload) {
|
|
116
|
+
const cached = loadLocalEmbeddings(version);
|
|
117
|
+
if (cached) {
|
|
118
|
+
log(`Loaded from cache: ${getEmbeddingsCachePath(version)}`);
|
|
119
|
+
return cached;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const bundled = await loadBundledEmbeddings();
|
|
123
|
+
if (bundled) {
|
|
124
|
+
log('Loaded bundled embeddings');
|
|
125
|
+
return bundled;
|
|
126
|
+
}
|
|
127
|
+
if (!offline) {
|
|
128
|
+
try {
|
|
129
|
+
log(`Downloading embeddings v${version || getPackageVersion()}...`);
|
|
130
|
+
const downloaded = await downloadEmbeddings(version);
|
|
131
|
+
log(`Downloaded and cached: ${downloaded.documents?.length || 0} documents`);
|
|
132
|
+
return downloaded;
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
log(`Download failed: ${error}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
log('No embeddings available');
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
export function clearEmbeddingsCache(version) {
|
|
142
|
+
const cachePath = getEmbeddingsCachePath(version);
|
|
143
|
+
try {
|
|
144
|
+
const fs = require('fs');
|
|
145
|
+
if (fs.existsSync(cachePath)) {
|
|
146
|
+
fs.unlinkSync(cachePath);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
export { getPackageVersion };
|
package/dist/mcp/index.d.ts
CHANGED
package/dist/mcp/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAKA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAKA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC"}
|
package/dist/mcp/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid-search.d.ts","sourceRoot":"","sources":["../../../src/mcp/search/hybrid-search.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hybrid-search.d.ts","sourceRoot":"","sources":["../../../src/mcp/search/hybrid-search.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,aAAa,EACb,kBAAkB,EAGnB,MAAM,YAAY,CAAC;AAkBpB,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAiC;IAC7C,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAA+B;gBAEjC,MAAM,GAAE,kBAAuB;IAYrC,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAmCrC,yBAAyB;IAoCjC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAmDjF,OAAO,CAAC,WAAW;IAiCnB,OAAO,CAAC,cAAc;IA8GtB,OAAO,CAAC,cAAc;IAoDtB,OAAO,CAAC,MAAM,CAAC,UAAU,CAoCtB;IAKH,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,cAAc;IAmBtB,aAAa,IAAI,OAAO;IAOxB,QAAQ,IAAI;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;IAYD,OAAO,CAAC,GAAG;CAKZ;AAKD,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAE5E"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Fuse from 'fuse.js';
|
|
2
2
|
import { cosineSimilarity, combineScores, levenshtein } from './math.js';
|
|
3
|
+
import { loadEmbeddings } from '../embeddings-loader.js';
|
|
3
4
|
let cachedEmbeddings = null;
|
|
4
5
|
export class HybridSearch {
|
|
5
6
|
fuse = null;
|
|
@@ -43,27 +44,12 @@ export class HybridSearch {
|
|
|
43
44
|
this.embeddingsData = cachedEmbeddings;
|
|
44
45
|
}
|
|
45
46
|
else {
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
try {
|
|
56
|
-
const fs = await import('fs');
|
|
57
|
-
const path = await import('path');
|
|
58
|
-
const embeddingsFile = path.join(path.dirname(new URL(import.meta.url).pathname), '../data/embeddings.json');
|
|
59
|
-
if (fs.existsSync(embeddingsFile)) {
|
|
60
|
-
const data = fs.readFileSync(embeddingsFile, 'utf-8');
|
|
61
|
-
this.embeddingsData = JSON.parse(data);
|
|
62
|
-
cachedEmbeddings = this.embeddingsData;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
}
|
|
47
|
+
const data = await loadEmbeddings({
|
|
48
|
+
debug: this.config.debug,
|
|
49
|
+
});
|
|
50
|
+
if (data) {
|
|
51
|
+
this.embeddingsData = data;
|
|
52
|
+
cachedEmbeddings = data;
|
|
67
53
|
}
|
|
68
54
|
}
|
|
69
55
|
if (this.embeddingsData) {
|
package/dist/recker.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Client, type ExtendedClientOptions } from './core/client.js';
|
|
2
|
+
import { type RequestPromise } from './core/request-promise.js';
|
|
3
|
+
import type { RequestOptions } from './types/index.js';
|
|
4
|
+
import { type WebSocketOptions, type ReckerWebSocket } from './websocket/client.js';
|
|
5
|
+
import { createWhois, type WhoisResult, type WhoisOptions } from './utils/whois.js';
|
|
6
|
+
import { type DNSClientOptions, type DNSClient } from './dns/index.js';
|
|
7
|
+
import type { AIClientConfig } from './types/ai.js';
|
|
8
|
+
export declare function get(url: string, options?: RequestOptions): RequestPromise;
|
|
9
|
+
export declare function post(url: string, options?: RequestOptions): RequestPromise;
|
|
10
|
+
export declare function put(url: string, options?: RequestOptions): RequestPromise;
|
|
11
|
+
export declare function patch(url: string, options?: RequestOptions): RequestPromise;
|
|
12
|
+
export declare function del(url: string, options?: RequestOptions): RequestPromise;
|
|
13
|
+
export declare function head(url: string, options?: RequestOptions): RequestPromise;
|
|
14
|
+
export declare function options(url: string, options?: RequestOptions): RequestPromise;
|
|
15
|
+
export declare function whois(query: string, options?: WhoisOptions): Promise<WhoisResult>;
|
|
16
|
+
export declare function whoisAvailable(domain: string): Promise<boolean>;
|
|
17
|
+
export declare function dns(hostname: string, type?: 'A' | 'AAAA' | 'MX' | 'TXT' | 'NS' | 'CNAME'): Promise<string[]>;
|
|
18
|
+
export declare function dnsSecurity(domain: string): Promise<import("./utils/dns-toolkit.js").DnsSecurityRecords>;
|
|
19
|
+
export declare function ws(url: string, options?: WebSocketOptions): ReckerWebSocket;
|
|
20
|
+
export declare const recker: {
|
|
21
|
+
get: typeof get;
|
|
22
|
+
post: typeof post;
|
|
23
|
+
put: typeof put;
|
|
24
|
+
patch: typeof patch;
|
|
25
|
+
delete: typeof del;
|
|
26
|
+
head: typeof head;
|
|
27
|
+
options: typeof options;
|
|
28
|
+
whois: typeof whois;
|
|
29
|
+
whoisAvailable: typeof whoisAvailable;
|
|
30
|
+
dns: typeof dns;
|
|
31
|
+
dnsSecurity: typeof dnsSecurity;
|
|
32
|
+
ws: typeof ws;
|
|
33
|
+
ai: {
|
|
34
|
+
chat: (optionsOrPrompt: string | import("./types/ai.js").ChatOptions) => Promise<import("./types/ai.js").AIResponse<string>>;
|
|
35
|
+
stream: (options: import("./types/ai.js").ChatOptions) => Promise<import("./types/ai.js").AIStream>;
|
|
36
|
+
embed: (options: import("./types/ai.js").EmbedOptions) => Promise<import("./types/ai.js").EmbedResponse>;
|
|
37
|
+
extend: (defaults: Partial<import("./types/ai.js").ChatOptions>) => import("./types/ai.js").AIClient;
|
|
38
|
+
readonly metrics: import("./types/ai.js").AIMetrics;
|
|
39
|
+
};
|
|
40
|
+
client: (options?: ExtendedClientOptions) => Client;
|
|
41
|
+
dnsClient: (options?: DNSClientOptions) => DNSClient;
|
|
42
|
+
whoisClient: typeof createWhois;
|
|
43
|
+
aiClient: (options?: AIClientConfig) => import("./types/ai.js").AIClient;
|
|
44
|
+
reset: () => void;
|
|
45
|
+
};
|
|
46
|
+
export default recker;
|
|
47
|
+
//# sourceMappingURL=recker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recker.d.ts","sourceRoot":"","sources":["../src/recker.ts"],"names":[],"mappings":"AAwCA,OAAO,EAAE,MAAM,EAAgB,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAmB,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAA2C,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7H,OAAO,EAAa,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAElF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AA0CpD,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc,CAEzE;AAMD,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc,CAE1E;AAKD,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc,CAEzE;AAKD,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc,CAE3E;AAKD,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc,CAEzE;AAKD,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc,CAE1E;AAKD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,cAAc,CAE7E;AAUD,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAEvF;AAMD,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAErE;AAMD,wBAAsB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,GAAG,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,OAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEvH;AAMD,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,gEAE/C;AAMD,wBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,eAAe,CAE3E;AA8DD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;uBAgDE,qBAAqB;0BAKlB,gBAAgB;;yBAUjB,cAAc;;CAUpC,CAAC;AAGF,eAAe,MAAM,CAAC"}
|
package/dist/recker.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { createClient } from './core/client.js';
|
|
2
|
+
import { FetchTransport } from './transport/fetch.js';
|
|
3
|
+
import { createWebSocket } from './websocket/client.js';
|
|
4
|
+
import { whois as whoisLookup, isDomainAvailable, createWhois } from './utils/whois.js';
|
|
5
|
+
import { createDNS } from './dns/index.js';
|
|
6
|
+
import { createAI } from './ai/index.js';
|
|
7
|
+
let _defaultClient = null;
|
|
8
|
+
let _defaultDns = null;
|
|
9
|
+
let _defaultAi = null;
|
|
10
|
+
function getDefaultClient() {
|
|
11
|
+
if (!_defaultClient) {
|
|
12
|
+
_defaultClient = createClient({
|
|
13
|
+
transport: new FetchTransport(),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return _defaultClient;
|
|
17
|
+
}
|
|
18
|
+
function getDefaultDns() {
|
|
19
|
+
if (!_defaultDns) {
|
|
20
|
+
_defaultDns = createDNS();
|
|
21
|
+
}
|
|
22
|
+
return _defaultDns;
|
|
23
|
+
}
|
|
24
|
+
function getDefaultAi() {
|
|
25
|
+
if (!_defaultAi) {
|
|
26
|
+
_defaultAi = createAI();
|
|
27
|
+
}
|
|
28
|
+
return _defaultAi;
|
|
29
|
+
}
|
|
30
|
+
export function get(url, options) {
|
|
31
|
+
return getDefaultClient().get(url, options);
|
|
32
|
+
}
|
|
33
|
+
export function post(url, options) {
|
|
34
|
+
return getDefaultClient().post(url, options);
|
|
35
|
+
}
|
|
36
|
+
export function put(url, options) {
|
|
37
|
+
return getDefaultClient().put(url, options);
|
|
38
|
+
}
|
|
39
|
+
export function patch(url, options) {
|
|
40
|
+
return getDefaultClient().patch(url, options);
|
|
41
|
+
}
|
|
42
|
+
export function del(url, options) {
|
|
43
|
+
return getDefaultClient().delete(url, options);
|
|
44
|
+
}
|
|
45
|
+
export function head(url, options) {
|
|
46
|
+
return getDefaultClient().head(url, options);
|
|
47
|
+
}
|
|
48
|
+
export function options(url, options) {
|
|
49
|
+
return getDefaultClient().options(url, options);
|
|
50
|
+
}
|
|
51
|
+
export async function whois(query, options) {
|
|
52
|
+
return whoisLookup(query, options);
|
|
53
|
+
}
|
|
54
|
+
export async function whoisAvailable(domain) {
|
|
55
|
+
return isDomainAvailable(domain);
|
|
56
|
+
}
|
|
57
|
+
export async function dns(hostname, type = 'A') {
|
|
58
|
+
return getDefaultDns().resolve(hostname, type);
|
|
59
|
+
}
|
|
60
|
+
export async function dnsSecurity(domain) {
|
|
61
|
+
return getDefaultDns().getSecurityRecords(domain);
|
|
62
|
+
}
|
|
63
|
+
export function ws(url, options) {
|
|
64
|
+
return createWebSocket(url, options);
|
|
65
|
+
}
|
|
66
|
+
const aiNamespace = {
|
|
67
|
+
chat: (...args) => getDefaultAi().chat(...args),
|
|
68
|
+
stream: (...args) => getDefaultAi().stream(...args),
|
|
69
|
+
embed: (...args) => getDefaultAi().embed(...args),
|
|
70
|
+
extend: (...args) => getDefaultAi().extend(...args),
|
|
71
|
+
get metrics() {
|
|
72
|
+
return getDefaultAi().metrics;
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
export const recker = {
|
|
76
|
+
get,
|
|
77
|
+
post,
|
|
78
|
+
put,
|
|
79
|
+
patch,
|
|
80
|
+
delete: del,
|
|
81
|
+
head,
|
|
82
|
+
options,
|
|
83
|
+
whois,
|
|
84
|
+
whoisAvailable,
|
|
85
|
+
dns,
|
|
86
|
+
dnsSecurity,
|
|
87
|
+
ws,
|
|
88
|
+
ai: aiNamespace,
|
|
89
|
+
client: (options) => createClient(options),
|
|
90
|
+
dnsClient: (options) => createDNS(options),
|
|
91
|
+
whoisClient: createWhois,
|
|
92
|
+
aiClient: (options) => createAI(options),
|
|
93
|
+
reset: () => {
|
|
94
|
+
_defaultClient = null;
|
|
95
|
+
_defaultDns = null;
|
|
96
|
+
_defaultAi = null;
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
export default recker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-udp.d.ts","sourceRoot":"","sources":["../../src/transport/base-udp.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,UAAU,EACV,aAAa,EACd,MAAM,iBAAiB,CAAC;AAMzB,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,eAAO,MAAM,iBAAiB,sCAA6C,CAAC;AAK5E,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,uBAAuB,
|
|
1
|
+
{"version":3,"file":"base-udp.d.ts","sourceRoot":"","sources":["../../src/transport/base-udp.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,uBAAuB,EACvB,UAAU,EACV,aAAa,EACd,MAAM,iBAAiB,CAAC;AAMzB,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,eAAO,MAAM,iBAAiB,sCAA6C,CAAC;AAK5E,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,uBAAuB,CAQjE,CAAC;AAKF,8BAAsB,gBAAgB;IACpC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC;gBAEzC,OAAO,GAAE,uBAA4B;IAUjD,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAK9D,SAAS,CAAC,YAAY,CAAC,IAAI,GAAE,MAAM,GAAG,MAAe,GAAG,KAAK,CAAC,MAAM;cAiBpD,aAAa,CAC3B,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC;IAsClB,SAAS,CAAC,QAAQ,CAChB,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC;IAmFlB,SAAS,CAAC,cAAc,IAAI,UAAU;IAwCtC,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,aAAa;IAgBhE,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAqB7E,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWhD,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
@@ -5,7 +5,7 @@ export interface UDPResponseOptions {
|
|
|
5
5
|
connection?: UDPConnection;
|
|
6
6
|
url?: string;
|
|
7
7
|
}
|
|
8
|
-
export declare class
|
|
8
|
+
export declare class UDPResponseWrapper implements UDPResponse {
|
|
9
9
|
private _buffer;
|
|
10
10
|
private _timings;
|
|
11
11
|
private _connection;
|
|
@@ -26,7 +26,7 @@ export declare class UDPResponseImpl implements UDPResponse {
|
|
|
26
26
|
cleanText(): Promise<string>;
|
|
27
27
|
blob(): Promise<Blob>;
|
|
28
28
|
read(): ReadableStream<Uint8Array> | null;
|
|
29
|
-
clone():
|
|
29
|
+
clone(): UDPResponseWrapper;
|
|
30
30
|
sse(): AsyncGenerator<SSEEvent>;
|
|
31
31
|
download(): AsyncGenerator<ProgressEvent>;
|
|
32
32
|
packets(): AsyncGenerator<Buffer>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"udp-response.d.ts","sourceRoot":"","sources":["../../src/transport/udp-response.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAkB,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAK9E,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAKD,qBAAa,
|
|
1
|
+
{"version":3,"file":"udp-response.d.ts","sourceRoot":"","sources":["../../src/transport/udp-response.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export class
|
|
1
|
+
export class UDPResponseWrapper {
|
|
2
2
|
_buffer;
|
|
3
3
|
_timings;
|
|
4
4
|
_connection;
|
|
@@ -85,7 +85,7 @@ export class UDPResponseImpl {
|
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
87
|
clone() {
|
|
88
|
-
return new
|
|
88
|
+
return new UDPResponseWrapper(Buffer.from(this._buffer), {
|
|
89
89
|
timings: { ...this._timings },
|
|
90
90
|
connection: { ...this._connection },
|
|
91
91
|
url: this._url,
|
package/dist/transport/udp.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import type { ReckerRequest, ReckerResponse } from '../types/index.js';
|
|
2
2
|
import type { UDPTransportOptions, SimpleUDPAPI } from '../types/udp.js';
|
|
3
3
|
import { BaseUDPTransport } from './base-udp.js';
|
|
4
|
-
export declare class
|
|
4
|
+
export declare class UDPClient extends BaseUDPTransport {
|
|
5
5
|
private socket;
|
|
6
6
|
private baseUrl;
|
|
7
7
|
private udpOptions;
|
|
8
8
|
private multicastGroups;
|
|
9
9
|
constructor(baseUrl?: string, options?: UDPTransportOptions);
|
|
10
|
+
private log;
|
|
10
11
|
private getSocket;
|
|
11
12
|
private _socketBound;
|
|
12
13
|
dispatch(req: ReckerRequest): Promise<ReckerResponse>;
|
|
@@ -16,7 +17,7 @@ export declare class UDPTransportImpl extends BaseUDPTransport {
|
|
|
16
17
|
leaveMulticast(group: string): void;
|
|
17
18
|
close(): Promise<void>;
|
|
18
19
|
}
|
|
19
|
-
export declare function
|
|
20
|
+
export declare function createUDP(options?: UDPTransportOptions): UDPClient;
|
|
20
21
|
export declare const udp: SimpleUDPAPI;
|
|
21
|
-
export {
|
|
22
|
+
export { UDPClient as UDPTransport };
|
|
22
23
|
//# sourceMappingURL=udp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"udp.d.ts","sourceRoot":"","sources":["../../src/transport/udp.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,mBAAmB,EAInB,YAAY,EACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAwC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"udp.d.ts","sourceRoot":"","sources":["../../src/transport/udp.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,mBAAmB,EAInB,YAAY,EACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAwC,MAAM,eAAe,CAAC;AA2CvF,qBAAa,SAAU,SAAQ,gBAAgB;IAC7C,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,eAAe,CAA0B;gBAErC,OAAO,GAAE,MAAW,EAAE,OAAO,GAAE,mBAAwB;IAuBnE,OAAO,CAAC,GAAG;IASX,OAAO,CAAC,SAAS;IA0CjB,OAAO,CAAC,YAAY,CAAkB;IAKhC,QAAQ,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAwFrD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB7D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB1D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAWlC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAW7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAqB7B;AAsBD,wBAAgB,SAAS,CAAC,OAAO,GAAE,mBAAwB,GAAG,SAAS,CAEtE;AAKD,eAAO,MAAM,GAAG,EAAE,YAuGjB,CAAC;AAGF,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,CAAC"}
|
package/dist/transport/udp.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import dgram from 'node:dgram';
|
|
2
2
|
import { BaseUDPTransport, udpRequestStorage } from './base-udp.js';
|
|
3
|
-
import {
|
|
3
|
+
import { UDPResponseWrapper } from './udp-response.js';
|
|
4
4
|
const DEFAULT_OPTIONS = {
|
|
5
5
|
timeout: 5000,
|
|
6
6
|
retransmissions: 3,
|
|
7
7
|
maxPacketSize: 65507,
|
|
8
8
|
observability: true,
|
|
9
|
+
debug: false,
|
|
9
10
|
broadcast: false,
|
|
10
11
|
multicastTTL: 1,
|
|
11
12
|
multicastLoopback: true,
|
|
12
13
|
type: 'udp4',
|
|
13
14
|
};
|
|
14
|
-
export class
|
|
15
|
+
export class UDPClient extends BaseUDPTransport {
|
|
15
16
|
socket = null;
|
|
16
17
|
baseUrl;
|
|
17
18
|
udpOptions;
|
|
@@ -26,6 +27,7 @@ export class UDPTransportImpl extends BaseUDPTransport {
|
|
|
26
27
|
retransmissions: options.retransmissions ?? DEFAULT_OPTIONS.retransmissions,
|
|
27
28
|
maxPacketSize: options.maxPacketSize ?? DEFAULT_OPTIONS.maxPacketSize,
|
|
28
29
|
observability: options.observability ?? DEFAULT_OPTIONS.observability,
|
|
30
|
+
debug: options.debug ?? DEFAULT_OPTIONS.debug,
|
|
29
31
|
localAddress: options.localAddress ?? '',
|
|
30
32
|
localPort: options.localPort ?? 0,
|
|
31
33
|
broadcast: options.broadcast ?? DEFAULT_OPTIONS.broadcast,
|
|
@@ -37,6 +39,11 @@ export class UDPTransportImpl extends BaseUDPTransport {
|
|
|
37
39
|
sendBufferSize: options.sendBufferSize,
|
|
38
40
|
};
|
|
39
41
|
}
|
|
42
|
+
log(message, ...args) {
|
|
43
|
+
if (this.udpOptions.debug) {
|
|
44
|
+
console.log(`[UDP] ${message}`, ...args);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
40
47
|
getSocket() {
|
|
41
48
|
if (!this.socket) {
|
|
42
49
|
this.socket = this.createSocket(this.udpOptions.type);
|
|
@@ -75,6 +82,7 @@ export class UDPTransportImpl extends BaseUDPTransport {
|
|
|
75
82
|
return udpRequestStorage.run(context, async () => {
|
|
76
83
|
const fullUrl = this.baseUrl ? `${this.baseUrl}${req.url}` : req.url;
|
|
77
84
|
const { host, port, path } = this.parseUrl(fullUrl);
|
|
85
|
+
this.log(`Dispatch to ${fullUrl}`);
|
|
78
86
|
if (!host || !port) {
|
|
79
87
|
throw new Error(`Invalid UDP URL: ${fullUrl}. Expected format: udp://host:port/path`);
|
|
80
88
|
}
|
|
@@ -114,7 +122,8 @@ export class UDPTransportImpl extends BaseUDPTransport {
|
|
|
114
122
|
const responseBuffer = await this.sendWithRetry(socket, body, targetPort, targetAddress, req.signal);
|
|
115
123
|
const timings = this.collectTimings();
|
|
116
124
|
const connection = this.collectConnection(socket);
|
|
117
|
-
|
|
125
|
+
this.log(`Response received in ${timings.total.toFixed(0)}ms (${responseBuffer.length} bytes)`);
|
|
126
|
+
return new UDPResponseWrapper(responseBuffer, {
|
|
118
127
|
timings,
|
|
119
128
|
connection,
|
|
120
129
|
url: fullUrl,
|
|
@@ -183,12 +192,12 @@ export class UDPTransportImpl extends BaseUDPTransport {
|
|
|
183
192
|
}
|
|
184
193
|
}
|
|
185
194
|
}
|
|
186
|
-
export function
|
|
187
|
-
return new
|
|
195
|
+
export function createUDP(options = {}) {
|
|
196
|
+
return new UDPClient('', options);
|
|
188
197
|
}
|
|
189
198
|
export const udp = {
|
|
190
199
|
async send(address, data, options = {}) {
|
|
191
|
-
const transport = new
|
|
200
|
+
const transport = new UDPClient('', options);
|
|
192
201
|
try {
|
|
193
202
|
const response = await transport.dispatch({
|
|
194
203
|
url: address.startsWith('udp://') ? address : `udp://${address}`,
|
|
@@ -257,4 +266,4 @@ export const udp = {
|
|
|
257
266
|
});
|
|
258
267
|
},
|
|
259
268
|
};
|
|
260
|
-
export {
|
|
269
|
+
export { UDPClient as UDPTransport };
|
package/dist/types/udp.d.ts
CHANGED
package/dist/types/udp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"udp.d.ts","sourceRoot":"","sources":["../../src/types/udp.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAS3E,MAAM,WAAW,UAAU;IAEzB,MAAM,EAAE,MAAM,CAAC;IAEf,IAAI,EAAE,MAAM,CAAC;IAEb,OAAO,EAAE,MAAM,CAAC;IAEhB,eAAe,EAAE,MAAM,CAAC;IAExB,KAAK,EAAE,MAAM,CAAC;CACf;AAKD,MAAM,WAAW,WAAY,SAAQ,UAAU;IAE7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD,MAAM,WAAW,WAAY,SAAQ,UAAU;IAE7C,aAAa,EAAE,MAAM,CAAC;IAEtB,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,EAAE,OAAO,CAAC;CAClB;AASD,MAAM,WAAW,aAAa;IAE5B,QAAQ,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAElC,YAAY,EAAE,MAAM,CAAC;IAErB,SAAS,EAAE,MAAM,CAAC;IAElB,aAAa,EAAE,MAAM,CAAC;IAEtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAKD,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,QAAQ,EAAE,MAAM,CAAC;IAEjB,MAAM,EAAE,MAAM,CAAC;IAEf,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,QAAQ,EAAE,MAAM,CAAC;IAEjB,IAAI,EAAE,MAAM,CAAC;IAEb,UAAU,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;IAErC,WAAW,EAAE,MAAM,CAAC;IAEpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AASD,MAAM,WAAW,uBAAuB;IAKtC,OAAO,CAAC,EAAE,MAAM,CAAC;IAMjB,eAAe,CAAC,EAAE,MAAM,CAAC;IAMzB,aAAa,CAAC,EAAE,MAAM,CAAC;IAMvB,aAAa,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"udp.d.ts","sourceRoot":"","sources":["../../src/types/udp.ts"],"names":[],"mappings":"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"}
|
package/dist/udp/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
1
|
+
export { UDPClient, UDPTransport, createUDP, udp } from '../transport/udp.js';
|
|
2
|
+
export { UDPResponseWrapper, StreamingUDPResponse } from '../transport/udp-response.js';
|
|
3
3
|
export { BaseUDPTransport, udpRequestStorage } from '../transport/base-udp.js';
|
|
4
4
|
export type { UDPRequestContext } from '../transport/base-udp.js';
|
|
5
5
|
export type { UDPTimings, DTLSTimings, QUICTimings, UDPConnection, DTLSConnection, QUICConnection, BaseUDPTransportOptions, UDPTransportOptions, DTLSTransportOptions, QUICTransportOptions, UDPRequestOptions, UDPRequest, UDPResponse, UDPTransport as UDPTransportInterface, DTLSTransportInterface, QUICTransportInterface, UDPBatchResult, UDPDiscoveryResult, SimpleUDPAPI, } from '../types/udp.js';
|
package/dist/udp/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/udp/index.ts"],"names":[],"mappings":"AAmCA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/udp/index.ts"],"names":[],"mappings":"AAmCA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAG9E,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGxF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC/E,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,YAAY,EAEV,UAAU,EACV,WAAW,EACX,WAAW,EAEX,aAAa,EACb,cAAc,EACd,cAAc,EAEd,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EAEpB,iBAAiB,EACjB,UAAU,EACV,WAAW,EAEX,YAAY,IAAI,qBAAqB,EACrC,sBAAsB,EACtB,sBAAsB,EAEtB,cAAc,EACd,kBAAkB,EAClB,YAAY,GACb,MAAM,iBAAiB,CAAC"}
|
package/dist/udp/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
1
|
+
export { UDPClient, UDPTransport, createUDP, udp } from '../transport/udp.js';
|
|
2
|
+
export { UDPResponseWrapper, StreamingUDPResponse } from '../transport/udp-response.js';
|
|
3
3
|
export { BaseUDPTransport, udpRequestStorage } from '../transport/base-udp.js';
|
package/dist/utils/whois.d.ts
CHANGED
|
@@ -12,4 +12,22 @@ export interface WhoisResult {
|
|
|
12
12
|
}
|
|
13
13
|
export declare function whois(query: string, options?: WhoisOptions): Promise<WhoisResult>;
|
|
14
14
|
export declare function isDomainAvailable(domain: string, options?: WhoisOptions): Promise<boolean>;
|
|
15
|
+
export interface WhoisClientOptions {
|
|
16
|
+
server?: string;
|
|
17
|
+
port?: number;
|
|
18
|
+
timeout?: number;
|
|
19
|
+
follow?: boolean;
|
|
20
|
+
debug?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare class WhoisClient {
|
|
23
|
+
private options;
|
|
24
|
+
constructor(options?: WhoisClientOptions);
|
|
25
|
+
private log;
|
|
26
|
+
lookup(query: string, options?: WhoisOptions): Promise<WhoisResult>;
|
|
27
|
+
isAvailable(domain: string): Promise<boolean>;
|
|
28
|
+
getRegistrar(domain: string): Promise<string | null>;
|
|
29
|
+
getExpiration(domain: string): Promise<Date | null>;
|
|
30
|
+
getNameServers(domain: string): Promise<string[]>;
|
|
31
|
+
}
|
|
32
|
+
export declare function createWhois(options?: WhoisClientOptions): WhoisClient;
|
|
15
33
|
//# sourceMappingURL=whois.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whois.d.ts","sourceRoot":"","sources":["../../src/utils/whois.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAK3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAKhB,IAAI,CAAC,EAAE,MAAM,CAAC;IAMd,OAAO,CAAC,EAAE,MAAM,CAAC;IAMjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAI1B,GAAG,EAAE,MAAM,CAAC;IAKZ,KAAK,EAAE,MAAM,CAAC;IAKd,MAAM,EAAE,MAAM,CAAC;IAKf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CACzC;AAmND,wBAAsB,KAAK,CACzB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAmCtB;AAMD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,OAAO,CAAC,CAoBlB"}
|
|
1
|
+
{"version":3,"file":"whois.d.ts","sourceRoot":"","sources":["../../src/utils/whois.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAK3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAKhB,IAAI,CAAC,EAAE,MAAM,CAAC;IAMd,OAAO,CAAC,EAAE,MAAM,CAAC;IAMjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAI1B,GAAG,EAAE,MAAM,CAAC;IAKZ,KAAK,EAAE,MAAM,CAAC;IAKd,MAAM,EAAE,MAAM,CAAC;IAKf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CACzC;AAmND,wBAAsB,KAAK,CACzB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAmCtB;AAMD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,OAAO,CAAC,CAoBlB;AASD,MAAM,WAAW,kBAAkB;IAIjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAMhB,IAAI,CAAC,EAAE,MAAM,CAAC;IAMd,OAAO,CAAC,EAAE,MAAM,CAAC;IAMjB,MAAM,CAAC,EAAE,OAAO,CAAC;IAMjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAsBD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA+B;gBAElC,OAAO,GAAE,kBAAuB;IAU5C,OAAO,CAAC,GAAG;IASL,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAkBnE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa7C,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUpD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAgBnD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAKxD;AAoBD,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,WAAW,CAErE"}
|