recker 1.0.26 → 1.0.27
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/browser/browser/cache.d.ts +40 -0
- package/dist/browser/browser/cache.js +199 -0
- package/dist/browser/browser/crypto.d.ts +24 -0
- package/dist/browser/browser/crypto.js +80 -0
- package/dist/browser/browser/index.d.ts +31 -0
- package/dist/browser/browser/index.js +31 -0
- package/dist/browser/browser/recker.d.ts +26 -0
- package/dist/browser/browser/recker.js +61 -0
- package/dist/browser/cache/basic-file-storage.d.ts +12 -0
- package/dist/browser/cache/basic-file-storage.js +50 -0
- package/dist/browser/cache/memory-limits.d.ts +20 -0
- package/dist/browser/cache/memory-limits.js +96 -0
- package/dist/browser/cache/memory-storage.d.ts +132 -0
- package/dist/browser/cache/memory-storage.js +454 -0
- package/dist/browser/cache.d.ts +40 -0
- package/dist/browser/cache.js +199 -0
- package/dist/browser/constants/http-status.d.ts +73 -0
- package/dist/browser/constants/http-status.js +156 -0
- package/dist/browser/cookies/memory-cookie-jar.d.ts +30 -0
- package/dist/browser/cookies/memory-cookie-jar.js +210 -0
- package/dist/browser/core/client.d.ts +118 -0
- package/dist/browser/core/client.js +667 -0
- package/dist/browser/core/errors.d.ts +142 -0
- package/dist/browser/core/errors.js +308 -0
- package/dist/browser/core/index.d.ts +5 -0
- package/dist/browser/core/index.js +5 -0
- package/dist/browser/core/request-promise.d.ts +23 -0
- package/dist/browser/core/request-promise.js +82 -0
- package/dist/browser/core/request.d.ts +20 -0
- package/dist/browser/core/request.js +76 -0
- package/dist/browser/core/response.d.ts +34 -0
- package/dist/browser/core/response.js +178 -0
- package/dist/browser/crypto.d.ts +24 -0
- package/dist/browser/crypto.js +80 -0
- package/dist/browser/index.d.ts +31 -0
- package/dist/browser/index.js +31 -0
- package/dist/browser/plugins/auth/api-key.d.ts +8 -0
- package/dist/browser/plugins/auth/api-key.js +27 -0
- package/dist/browser/plugins/auth/auth0.d.ts +33 -0
- package/dist/browser/plugins/auth/auth0.js +94 -0
- package/dist/browser/plugins/auth/aws-sigv4.d.ts +10 -0
- package/dist/browser/plugins/auth/aws-sigv4.js +88 -0
- package/dist/browser/plugins/auth/azure-ad.d.ts +48 -0
- package/dist/browser/plugins/auth/azure-ad.js +152 -0
- package/dist/browser/plugins/auth/basic.d.ts +7 -0
- package/dist/browser/plugins/auth/basic.js +13 -0
- package/dist/browser/plugins/auth/bearer.d.ts +8 -0
- package/dist/browser/plugins/auth/bearer.js +17 -0
- package/dist/browser/plugins/auth/cognito.d.ts +45 -0
- package/dist/browser/plugins/auth/cognito.js +208 -0
- package/dist/browser/plugins/auth/digest.d.ts +8 -0
- package/dist/browser/plugins/auth/digest.js +100 -0
- package/dist/browser/plugins/auth/firebase.d.ts +32 -0
- package/dist/browser/plugins/auth/firebase.js +195 -0
- package/dist/browser/plugins/auth/github-app.d.ts +36 -0
- package/dist/browser/plugins/auth/github-app.js +170 -0
- package/dist/browser/plugins/auth/google-service-account.d.ts +49 -0
- package/dist/browser/plugins/auth/google-service-account.js +172 -0
- package/dist/browser/plugins/auth/index.d.ts +15 -0
- package/dist/browser/plugins/auth/index.js +15 -0
- package/dist/browser/plugins/auth/mtls.d.ts +37 -0
- package/dist/browser/plugins/auth/mtls.js +140 -0
- package/dist/browser/plugins/auth/oauth2.d.ts +8 -0
- package/dist/browser/plugins/auth/oauth2.js +26 -0
- package/dist/browser/plugins/auth/oidc.d.ts +55 -0
- package/dist/browser/plugins/auth/oidc.js +222 -0
- package/dist/browser/plugins/auth/okta.d.ts +47 -0
- package/dist/browser/plugins/auth/okta.js +157 -0
- package/dist/browser/plugins/auth.d.ts +1 -0
- package/dist/browser/plugins/auth.js +1 -0
- package/dist/browser/plugins/cache.d.ts +15 -0
- package/dist/browser/plugins/cache.js +486 -0
- package/dist/browser/plugins/circuit-breaker.d.ts +13 -0
- package/dist/browser/plugins/circuit-breaker.js +100 -0
- package/dist/browser/plugins/compression.d.ts +4 -0
- package/dist/browser/plugins/compression.js +130 -0
- package/dist/browser/plugins/cookie-jar.d.ts +5 -0
- package/dist/browser/plugins/cookie-jar.js +72 -0
- package/dist/browser/plugins/dedup.d.ts +5 -0
- package/dist/browser/plugins/dedup.js +35 -0
- package/dist/browser/plugins/graphql.d.ts +13 -0
- package/dist/browser/plugins/graphql.js +58 -0
- package/dist/browser/plugins/grpc-web.d.ts +79 -0
- package/dist/browser/plugins/grpc-web.js +261 -0
- package/dist/browser/plugins/hls.d.ts +105 -0
- package/dist/browser/plugins/hls.js +395 -0
- package/dist/browser/plugins/jsonrpc.d.ts +75 -0
- package/dist/browser/plugins/jsonrpc.js +143 -0
- package/dist/browser/plugins/logger.d.ts +13 -0
- package/dist/browser/plugins/logger.js +108 -0
- package/dist/browser/plugins/odata.d.ts +181 -0
- package/dist/browser/plugins/odata.js +564 -0
- package/dist/browser/plugins/pagination.d.ts +16 -0
- package/dist/browser/plugins/pagination.js +105 -0
- package/dist/browser/plugins/rate-limit.d.ts +15 -0
- package/dist/browser/plugins/rate-limit.js +162 -0
- package/dist/browser/plugins/retry.d.ts +14 -0
- package/dist/browser/plugins/retry.js +116 -0
- package/dist/browser/plugins/scrape.d.ts +21 -0
- package/dist/browser/plugins/scrape.js +82 -0
- package/dist/browser/plugins/server-timing.d.ts +7 -0
- package/dist/browser/plugins/server-timing.js +24 -0
- package/dist/browser/plugins/soap.d.ts +72 -0
- package/dist/browser/plugins/soap.js +347 -0
- package/dist/browser/plugins/xml.d.ts +9 -0
- package/dist/browser/plugins/xml.js +194 -0
- package/dist/browser/plugins/xsrf.d.ts +9 -0
- package/dist/browser/plugins/xsrf.js +48 -0
- package/dist/browser/recker.d.ts +26 -0
- package/dist/browser/recker.js +61 -0
- package/dist/browser/runner/request-runner.d.ts +46 -0
- package/dist/browser/runner/request-runner.js +89 -0
- package/dist/browser/scrape/document.d.ts +44 -0
- package/dist/browser/scrape/document.js +210 -0
- package/dist/browser/scrape/element.d.ts +49 -0
- package/dist/browser/scrape/element.js +176 -0
- package/dist/browser/scrape/extractors.d.ts +16 -0
- package/dist/browser/scrape/extractors.js +356 -0
- package/dist/browser/scrape/types.d.ts +107 -0
- package/dist/browser/scrape/types.js +1 -0
- package/dist/browser/transport/fetch.d.ts +11 -0
- package/dist/browser/transport/fetch.js +143 -0
- package/dist/browser/transport/undici.d.ts +38 -0
- package/dist/browser/transport/undici.js +897 -0
- package/dist/browser/types/ai.d.ts +267 -0
- package/dist/browser/types/ai.js +1 -0
- package/dist/browser/types/index.d.ts +351 -0
- package/dist/browser/types/index.js +1 -0
- package/dist/browser/types/logger.d.ts +16 -0
- package/dist/browser/types/logger.js +66 -0
- package/dist/browser/types/udp.d.ts +138 -0
- package/dist/browser/types/udp.js +1 -0
- package/dist/browser/utils/agent-manager.d.ts +29 -0
- package/dist/browser/utils/agent-manager.js +160 -0
- package/dist/browser/utils/body.d.ts +10 -0
- package/dist/browser/utils/body.js +148 -0
- package/dist/browser/utils/charset.d.ts +15 -0
- package/dist/browser/utils/charset.js +169 -0
- package/dist/browser/utils/concurrency.d.ts +20 -0
- package/dist/browser/utils/concurrency.js +120 -0
- package/dist/browser/utils/dns.d.ts +6 -0
- package/dist/browser/utils/dns.js +26 -0
- package/dist/browser/utils/header-parser.d.ts +94 -0
- package/dist/browser/utils/header-parser.js +617 -0
- package/dist/browser/utils/html-cleaner.d.ts +1 -0
- package/dist/browser/utils/html-cleaner.js +21 -0
- package/dist/browser/utils/link-header.d.ts +69 -0
- package/dist/browser/utils/link-header.js +190 -0
- package/dist/browser/utils/optional-require.d.ts +19 -0
- package/dist/browser/utils/optional-require.js +105 -0
- package/dist/browser/utils/progress.d.ts +8 -0
- package/dist/browser/utils/progress.js +82 -0
- package/dist/browser/utils/request-pool.d.ts +22 -0
- package/dist/browser/utils/request-pool.js +101 -0
- package/dist/browser/utils/sse.d.ts +7 -0
- package/dist/browser/utils/sse.js +67 -0
- package/dist/browser/utils/streaming.d.ts +17 -0
- package/dist/browser/utils/streaming.js +84 -0
- package/dist/browser/utils/try-fn.d.ts +3 -0
- package/dist/browser/utils/try-fn.js +59 -0
- package/dist/browser/utils/user-agent.d.ts +44 -0
- package/dist/browser/utils/user-agent.js +100 -0
- package/dist/browser/utils/whois.d.ts +32 -0
- package/dist/browser/utils/whois.js +246 -0
- package/dist/browser/websocket/client.d.ts +65 -0
- package/dist/browser/websocket/client.js +313 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +1 -0
- package/dist/transport/fetch.d.ts +7 -1
- package/dist/transport/fetch.js +58 -76
- package/package.json +34 -2
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Readable, PassThrough } from 'node:stream';
|
|
2
|
+
import { pipeline } from 'node:stream/promises';
|
|
3
|
+
export function webToNodeStream(webStream) {
|
|
4
|
+
const reader = webStream.getReader();
|
|
5
|
+
return new Readable({
|
|
6
|
+
async read() {
|
|
7
|
+
try {
|
|
8
|
+
const { done, value } = await reader.read();
|
|
9
|
+
if (done) {
|
|
10
|
+
this.push(null);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
this.push(value);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
this.destroy(error);
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
destroy(error, callback) {
|
|
21
|
+
reader.cancel().finally(() => callback(error));
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export function nodeToWebStream(nodeStream) {
|
|
26
|
+
return new ReadableStream({
|
|
27
|
+
start(controller) {
|
|
28
|
+
nodeStream.on('data', (chunk) => {
|
|
29
|
+
controller.enqueue(new Uint8Array(chunk));
|
|
30
|
+
});
|
|
31
|
+
nodeStream.on('end', () => {
|
|
32
|
+
controller.close();
|
|
33
|
+
});
|
|
34
|
+
nodeStream.on('error', (err) => {
|
|
35
|
+
controller.error(err);
|
|
36
|
+
});
|
|
37
|
+
},
|
|
38
|
+
cancel() {
|
|
39
|
+
nodeStream.destroy();
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
export function trackStreamProgress(stream, options = {}) {
|
|
44
|
+
const { onProgress, total } = options;
|
|
45
|
+
let loaded = 0;
|
|
46
|
+
const startTime = Date.now();
|
|
47
|
+
let lastUpdate = startTime;
|
|
48
|
+
const passThrough = new PassThrough();
|
|
49
|
+
stream.on('data', (chunk) => {
|
|
50
|
+
loaded += chunk.length;
|
|
51
|
+
const now = Date.now();
|
|
52
|
+
if (onProgress && now - lastUpdate > 100) {
|
|
53
|
+
const percent = total ? (loaded / total) * 100 : undefined;
|
|
54
|
+
onProgress({ loaded, total, percent });
|
|
55
|
+
lastUpdate = now;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
stream.on('end', () => {
|
|
59
|
+
if (onProgress) {
|
|
60
|
+
const percent = total ? 100 : undefined;
|
|
61
|
+
onProgress({ loaded, total, percent });
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
stream.pipe(passThrough);
|
|
65
|
+
return passThrough;
|
|
66
|
+
}
|
|
67
|
+
export async function pipeStream(source, destination, options = {}) {
|
|
68
|
+
const tracked = options.onProgress
|
|
69
|
+
? trackStreamProgress(source, options)
|
|
70
|
+
: source;
|
|
71
|
+
await pipeline(tracked, destination);
|
|
72
|
+
}
|
|
73
|
+
export function createUploadStream(source) {
|
|
74
|
+
const passThrough = new PassThrough();
|
|
75
|
+
source.pipe(passThrough);
|
|
76
|
+
source.on('error', (err) => passThrough.destroy(err));
|
|
77
|
+
return {
|
|
78
|
+
stream: nodeToWebStream(passThrough),
|
|
79
|
+
promise: new Promise((resolve, reject) => {
|
|
80
|
+
passThrough.on('finish', resolve);
|
|
81
|
+
passThrough.on('error', reject);
|
|
82
|
+
})
|
|
83
|
+
};
|
|
84
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare function tryFn<T>(fnOrPromise: (() => Promise<T>) | Promise<T> | (() => T) | T): Promise<[boolean, Error | null, T | undefined]> | [boolean, Error | null, T | undefined];
|
|
2
|
+
export declare function tryFnSync<T>(fn: () => T): [boolean, Error | null, T | undefined];
|
|
3
|
+
export default tryFn;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { ReckerError } from '../core/errors.js';
|
|
2
|
+
export function tryFn(fnOrPromise) {
|
|
3
|
+
if (fnOrPromise == null) {
|
|
4
|
+
const err = new ReckerError('fnOrPromise cannot be null or undefined', undefined, undefined, ['Pass a valid function or promise to tryFn.', 'Check the caller to ensure an undefined value is not passed.']);
|
|
5
|
+
err.stack = new Error().stack;
|
|
6
|
+
return [false, err, undefined];
|
|
7
|
+
}
|
|
8
|
+
if (typeof fnOrPromise === 'function') {
|
|
9
|
+
try {
|
|
10
|
+
const result = fnOrPromise();
|
|
11
|
+
if (result == null) {
|
|
12
|
+
return [true, null, result];
|
|
13
|
+
}
|
|
14
|
+
if (typeof result.then === 'function') {
|
|
15
|
+
return result
|
|
16
|
+
.then((data) => [true, null, data])
|
|
17
|
+
.catch((error) => {
|
|
18
|
+
if (error instanceof Error &&
|
|
19
|
+
Object.isExtensible(error)) {
|
|
20
|
+
const desc = Object.getOwnPropertyDescriptor(error, 'stack');
|
|
21
|
+
if (!desc || (desc.writable && desc.configurable)) {
|
|
22
|
+
try {
|
|
23
|
+
}
|
|
24
|
+
catch (_) { }
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return [false, wrapUnknownError(error, 'Function threw an error'), undefined];
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return [true, null, result];
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return [false, wrapUnknownError(error, 'Function threw an error'), undefined];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (typeof fnOrPromise.then === 'function') {
|
|
37
|
+
return Promise.resolve(fnOrPromise)
|
|
38
|
+
.then((data) => [true, null, data])
|
|
39
|
+
.catch((error) => {
|
|
40
|
+
return [false, wrapUnknownError(error, 'Promise rejected'), undefined];
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return [true, null, fnOrPromise];
|
|
44
|
+
}
|
|
45
|
+
export function tryFnSync(fn) {
|
|
46
|
+
try {
|
|
47
|
+
const result = fn();
|
|
48
|
+
return [true, null, result];
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
return [false, wrapUnknownError(err, 'Synchronous function threw an error'), undefined];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export default tryFn;
|
|
55
|
+
function wrapUnknownError(err, context) {
|
|
56
|
+
if (err instanceof Error)
|
|
57
|
+
return err;
|
|
58
|
+
return new ReckerError(`${context}: ${String(err)}`, undefined, undefined, ['Inspect the original value being thrown.', 'Ensure errors are instances of Error or ReckerError.', 'Add contextual information when throwing custom errors.']);
|
|
59
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export declare function getDefaultUserAgent(): string;
|
|
2
|
+
export declare const USER_AGENT_PRESETS: {
|
|
3
|
+
readonly chrome_windows: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
|
|
4
|
+
readonly chrome_mac: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10157) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
|
|
5
|
+
readonly chrome_linux: "Mozilla/5.0 (X11; Linux x8664) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
|
|
6
|
+
readonly firefox_windows: "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0";
|
|
7
|
+
readonly firefox_mac: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0";
|
|
8
|
+
readonly firefox_linux: "Mozilla/5.0 (X11; Linux x8664; rv:121.0) Gecko/20100101 Firefox/121.0";
|
|
9
|
+
readonly safari_mac: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10157) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15";
|
|
10
|
+
readonly edge_windows: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0";
|
|
11
|
+
readonly edge_mac: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10157) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0";
|
|
12
|
+
readonly opera_windows: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 OPR/105.0.0.0";
|
|
13
|
+
readonly opera_mac: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10157) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 OPR/105.0.0.0";
|
|
14
|
+
readonly safari_iphone: "Mozilla/5.0 (iPhone; CPU iPhone OS 170 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
|
|
15
|
+
readonly safari_ipad: "Mozilla/5.0 (iPad; CPU OS 170 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
|
|
16
|
+
readonly chrome_ios: "Mozilla/5.0 (iPhone; CPU iPhone OS 170 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/120.0.6099.119 Mobile/15E148 Safari/604.1";
|
|
17
|
+
readonly chrome_android: "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.144 Mobile Safari/537.36";
|
|
18
|
+
readonly chrome_android_tablet: "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.144 Safari/537.36";
|
|
19
|
+
readonly firefox_android: "Mozilla/5.0 (Android 14; Mobile; rv:121.0) Gecko/121.0 Firefox/121.0";
|
|
20
|
+
readonly samsung_browser: "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/23.0 Chrome/115.0.0.0 Mobile Safari/537.36";
|
|
21
|
+
readonly googlebot: "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
|
|
22
|
+
readonly googlebot_mobile: "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.144 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";
|
|
23
|
+
readonly recker: string;
|
|
24
|
+
};
|
|
25
|
+
export type UserAgentPreset = keyof typeof USER_AGENT_PRESETS;
|
|
26
|
+
export declare function getUserAgent(preset: UserAgentPreset): string;
|
|
27
|
+
export declare const USER_AGENT_CATEGORIES: {
|
|
28
|
+
readonly desktop: {
|
|
29
|
+
readonly chrome: readonly ["chrome_windows", "chrome_mac", "chrome_linux"];
|
|
30
|
+
readonly firefox: readonly ["firefox_windows", "firefox_mac", "firefox_linux"];
|
|
31
|
+
readonly safari: readonly ["safari_mac"];
|
|
32
|
+
readonly edge: readonly ["edge_windows", "edge_mac"];
|
|
33
|
+
readonly opera: readonly ["opera_windows", "opera_mac"];
|
|
34
|
+
};
|
|
35
|
+
readonly mobile: {
|
|
36
|
+
readonly ios: readonly ["safari_iphone", "safari_ipad", "chrome_ios"];
|
|
37
|
+
readonly android: readonly ["chrome_android", "chrome_android_tablet", "firefox_android", "samsung_browser"];
|
|
38
|
+
};
|
|
39
|
+
readonly bot: readonly ["googlebot", "googlebot_mobile"];
|
|
40
|
+
readonly default: readonly ["recker"];
|
|
41
|
+
};
|
|
42
|
+
export declare function getRandomUserAgent(category: string): string;
|
|
43
|
+
export declare function detectDeviceType(userAgent: string): 'desktop' | 'mobile' | 'tablet' | 'bot' | 'unknown';
|
|
44
|
+
export declare function isMobile(userAgent: string): boolean;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
let RECKER_VERSION = '1.0.0';
|
|
4
|
+
try {
|
|
5
|
+
const pkgPath = join(process.cwd(), 'package.json');
|
|
6
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
7
|
+
if (pkg.name === 'recker' && pkg.version) {
|
|
8
|
+
RECKER_VERSION = pkg.version;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
}
|
|
13
|
+
export function getDefaultUserAgent() {
|
|
14
|
+
return `recker/${RECKER_VERSION}`;
|
|
15
|
+
}
|
|
16
|
+
export const USER_AGENT_PRESETS = {
|
|
17
|
+
chrome_windows: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
|
18
|
+
chrome_mac: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10157) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
|
19
|
+
chrome_linux: 'Mozilla/5.0 (X11; Linux x8664) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
|
20
|
+
firefox_windows: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0',
|
|
21
|
+
firefox_mac: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0',
|
|
22
|
+
firefox_linux: 'Mozilla/5.0 (X11; Linux x8664; rv:121.0) Gecko/20100101 Firefox/121.0',
|
|
23
|
+
safari_mac: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10157) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15',
|
|
24
|
+
edge_windows: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
|
|
25
|
+
edge_mac: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10157) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
|
|
26
|
+
opera_windows: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 OPR/105.0.0.0',
|
|
27
|
+
opera_mac: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10157) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 OPR/105.0.0.0',
|
|
28
|
+
safari_iphone: 'Mozilla/5.0 (iPhone; CPU iPhone OS 170 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1',
|
|
29
|
+
safari_ipad: 'Mozilla/5.0 (iPad; CPU OS 170 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1',
|
|
30
|
+
chrome_ios: 'Mozilla/5.0 (iPhone; CPU iPhone OS 170 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/120.0.6099.119 Mobile/15E148 Safari/604.1',
|
|
31
|
+
chrome_android: 'Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.144 Mobile Safari/537.36',
|
|
32
|
+
chrome_android_tablet: 'Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.144 Safari/537.36',
|
|
33
|
+
firefox_android: 'Mozilla/5.0 (Android 14; Mobile; rv:121.0) Gecko/121.0 Firefox/121.0',
|
|
34
|
+
samsung_browser: 'Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/23.0 Chrome/115.0.0.0 Mobile Safari/537.36',
|
|
35
|
+
googlebot: 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
|
|
36
|
+
googlebot_mobile: 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.144 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
|
|
37
|
+
recker: getDefaultUserAgent(),
|
|
38
|
+
};
|
|
39
|
+
export function getUserAgent(preset) {
|
|
40
|
+
return USER_AGENT_PRESETS[preset];
|
|
41
|
+
}
|
|
42
|
+
export const USER_AGENT_CATEGORIES = {
|
|
43
|
+
desktop: {
|
|
44
|
+
chrome: ['chrome_windows', 'chrome_mac', 'chrome_linux'],
|
|
45
|
+
firefox: ['firefox_windows', 'firefox_mac', 'firefox_linux'],
|
|
46
|
+
safari: ['safari_mac'],
|
|
47
|
+
edge: ['edge_windows', 'edge_mac'],
|
|
48
|
+
opera: ['opera_windows', 'opera_mac'],
|
|
49
|
+
},
|
|
50
|
+
mobile: {
|
|
51
|
+
ios: ['safari_iphone', 'safari_ipad', 'chrome_ios'],
|
|
52
|
+
android: ['chrome_android', 'chrome_android_tablet', 'firefox_android', 'samsung_browser'],
|
|
53
|
+
},
|
|
54
|
+
bot: ['googlebot', 'googlebot_mobile'],
|
|
55
|
+
default: ['recker'],
|
|
56
|
+
};
|
|
57
|
+
export function getRandomUserAgent(category) {
|
|
58
|
+
const parts = category.split('.');
|
|
59
|
+
let presets = [];
|
|
60
|
+
if (parts.length === 1) {
|
|
61
|
+
const cat = USER_AGENT_CATEGORIES[parts[0]];
|
|
62
|
+
if (Array.isArray(cat)) {
|
|
63
|
+
presets = cat;
|
|
64
|
+
}
|
|
65
|
+
else if (typeof cat === 'object') {
|
|
66
|
+
presets = Object.values(cat).flat();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else if (parts.length === 2) {
|
|
70
|
+
const cat = USER_AGENT_CATEGORIES[parts[0]];
|
|
71
|
+
if (typeof cat === 'object' && parts[1] in cat) {
|
|
72
|
+
presets = cat[parts[1]];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (presets.length === 0) {
|
|
76
|
+
return getDefaultUserAgent();
|
|
77
|
+
}
|
|
78
|
+
const randomIndex = Math.floor(Math.random() * presets.length);
|
|
79
|
+
return getUserAgent(presets[randomIndex]);
|
|
80
|
+
}
|
|
81
|
+
export function detectDeviceType(userAgent) {
|
|
82
|
+
const ua = userAgent.toLowerCase();
|
|
83
|
+
if (ua.includes('bot') || ua.includes('crawler') || ua.includes('spider')) {
|
|
84
|
+
return 'bot';
|
|
85
|
+
}
|
|
86
|
+
if (ua.includes('ipad') || (ua.includes('tablet')) || (ua.includes('android') && !ua.includes('mobile'))) {
|
|
87
|
+
return 'tablet';
|
|
88
|
+
}
|
|
89
|
+
if (ua.includes('mobile') || ua.includes('iphone')) {
|
|
90
|
+
return 'mobile';
|
|
91
|
+
}
|
|
92
|
+
if (ua.includes('windows') || ua.includes('macintosh') || (ua.includes('linux') && !ua.includes('android'))) {
|
|
93
|
+
return 'desktop';
|
|
94
|
+
}
|
|
95
|
+
return 'unknown';
|
|
96
|
+
}
|
|
97
|
+
export function isMobile(userAgent) {
|
|
98
|
+
const type = detectDeviceType(userAgent);
|
|
99
|
+
return type === 'mobile' || type === 'tablet';
|
|
100
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface WhoisOptions {
|
|
2
|
+
server?: string;
|
|
3
|
+
port?: number;
|
|
4
|
+
timeout?: number;
|
|
5
|
+
follow?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface WhoisResult {
|
|
8
|
+
raw: string;
|
|
9
|
+
query: string;
|
|
10
|
+
server: string;
|
|
11
|
+
data: Record<string, string | string[]>;
|
|
12
|
+
}
|
|
13
|
+
export declare function whois(query: string, options?: WhoisOptions): Promise<WhoisResult>;
|
|
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;
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { createConnection } from 'net';
|
|
2
|
+
import { ReckerError } from '../core/errors.js';
|
|
3
|
+
const DEFAULT_SERVERS = {
|
|
4
|
+
'com': 'whois.verisign-grs.com',
|
|
5
|
+
'net': 'whois.verisign-grs.com',
|
|
6
|
+
'org': 'whois.pir.org',
|
|
7
|
+
'info': 'whois.afilias.net',
|
|
8
|
+
'biz': 'whois.biz',
|
|
9
|
+
'us': 'whois.nic.us',
|
|
10
|
+
'uk': 'whois.nic.uk',
|
|
11
|
+
'ca': 'whois.cira.ca',
|
|
12
|
+
'de': 'whois.denic.de',
|
|
13
|
+
'fr': 'whois.afnic.fr',
|
|
14
|
+
'au': 'whois.aunic.net',
|
|
15
|
+
'jp': 'whois.jprs.jp',
|
|
16
|
+
'cn': 'whois.cnnic.cn',
|
|
17
|
+
'ru': 'whois.tcinet.ru',
|
|
18
|
+
'br': 'whois.registro.br',
|
|
19
|
+
'eu': 'whois.eu',
|
|
20
|
+
'io': 'whois.nic.io',
|
|
21
|
+
'co': 'whois.nic.co',
|
|
22
|
+
'me': 'whois.nic.me',
|
|
23
|
+
'tv': 'whois.nic.tv',
|
|
24
|
+
'cc': 'whois.nic.cc',
|
|
25
|
+
'ws': 'whois.website.ws',
|
|
26
|
+
'mobi': 'whois.dotmobiregistry.net',
|
|
27
|
+
'asia': 'whois.nic.asia',
|
|
28
|
+
'tel': 'whois.nic.tel',
|
|
29
|
+
'pro': 'whois.registrypro.pro',
|
|
30
|
+
'aero': 'whois.aero',
|
|
31
|
+
'cat': 'whois.cat',
|
|
32
|
+
'coop': 'whois.nic.coop',
|
|
33
|
+
'jobs': 'whois.nic.jobs',
|
|
34
|
+
'museum': 'whois.museum',
|
|
35
|
+
'travel': 'whois.nic.travel',
|
|
36
|
+
'xxx': 'whois.nic.xxx',
|
|
37
|
+
'app': 'whois.nic.google',
|
|
38
|
+
'dev': 'whois.nic.google',
|
|
39
|
+
'ai': 'whois.nic.ai',
|
|
40
|
+
};
|
|
41
|
+
function extractTLD(domain) {
|
|
42
|
+
const parts = domain.toLowerCase().split('.');
|
|
43
|
+
return parts[parts.length - 1];
|
|
44
|
+
}
|
|
45
|
+
function getWhoisServer(query, customServer) {
|
|
46
|
+
if (customServer) {
|
|
47
|
+
return customServer;
|
|
48
|
+
}
|
|
49
|
+
const ipv4Pattern = /^(\d{1,3}\.){3}\d{1,3}$/;
|
|
50
|
+
const ipv6Pattern = /^([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}$/;
|
|
51
|
+
if (ipv4Pattern.test(query) || ipv6Pattern.test(query)) {
|
|
52
|
+
return 'whois.arin.net';
|
|
53
|
+
}
|
|
54
|
+
const tld = extractTLD(query);
|
|
55
|
+
return DEFAULT_SERVERS[tld] || 'whois.iana.org';
|
|
56
|
+
}
|
|
57
|
+
function parseWhoisData(raw) {
|
|
58
|
+
const data = {};
|
|
59
|
+
const lines = raw.split('\n');
|
|
60
|
+
for (const line of lines) {
|
|
61
|
+
if (line.startsWith('%') || line.startsWith('#') || !line.trim()) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const colonIndex = line.indexOf(':');
|
|
65
|
+
if (colonIndex === -1) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const key = line.substring(0, colonIndex).trim().toLowerCase();
|
|
69
|
+
const value = line.substring(colonIndex + 1).trim();
|
|
70
|
+
if (!key || !value) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (data[key]) {
|
|
74
|
+
if (Array.isArray(data[key])) {
|
|
75
|
+
data[key].push(value);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
data[key] = [data[key], value];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
data[key] = value;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return data;
|
|
86
|
+
}
|
|
87
|
+
function extractReferralServer(raw) {
|
|
88
|
+
const lines = raw.toLowerCase().split('\n');
|
|
89
|
+
for (const line of lines) {
|
|
90
|
+
if (line.includes('whois server:') || line.includes('referral url:')) {
|
|
91
|
+
const match = line.match(/whois\.[\w.-]+/);
|
|
92
|
+
if (match) {
|
|
93
|
+
return match[0];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
async function queryWhoisServer(server, query, port, timeout) {
|
|
100
|
+
return new Promise((resolve, reject) => {
|
|
101
|
+
let response = '';
|
|
102
|
+
let socket = null;
|
|
103
|
+
const timeoutId = setTimeout(() => {
|
|
104
|
+
socket?.destroy();
|
|
105
|
+
reject(new ReckerError(`WHOIS query timed out after ${timeout}ms`, undefined, undefined, [
|
|
106
|
+
'Increase the WHOIS timeout for slower registries.',
|
|
107
|
+
'Check network connectivity to the WHOIS server.',
|
|
108
|
+
'Retry the query; some registries respond slowly under load.'
|
|
109
|
+
]));
|
|
110
|
+
}, timeout);
|
|
111
|
+
socket = createConnection({ host: server, port }, () => {
|
|
112
|
+
socket.write(query + '\r\n');
|
|
113
|
+
});
|
|
114
|
+
socket.on('data', (chunk) => {
|
|
115
|
+
response += chunk.toString('utf-8');
|
|
116
|
+
});
|
|
117
|
+
socket.on('end', () => {
|
|
118
|
+
clearTimeout(timeoutId);
|
|
119
|
+
resolve(response);
|
|
120
|
+
});
|
|
121
|
+
socket.on('error', (error) => {
|
|
122
|
+
clearTimeout(timeoutId);
|
|
123
|
+
const errorDetail = error.message || error.code || 'Connection failed';
|
|
124
|
+
const err = new ReckerError(`WHOIS query failed: ${errorDetail}`, undefined, undefined, [
|
|
125
|
+
'Verify the WHOIS server is reachable and correct.',
|
|
126
|
+
'Check network/firewall settings blocking WHOIS port 43.',
|
|
127
|
+
'Retry the query; transient network issues can occur.'
|
|
128
|
+
]);
|
|
129
|
+
err.code = error.code;
|
|
130
|
+
reject(err);
|
|
131
|
+
});
|
|
132
|
+
socket.on('close', (hadError) => {
|
|
133
|
+
clearTimeout(timeoutId);
|
|
134
|
+
if (hadError && !response) {
|
|
135
|
+
const err = new ReckerError('WHOIS connection closed unexpectedly', undefined, undefined, [
|
|
136
|
+
'The WHOIS server may be rate limiting requests.',
|
|
137
|
+
'Try again in a few seconds.',
|
|
138
|
+
'Some TLDs have unreliable WHOIS servers.'
|
|
139
|
+
]);
|
|
140
|
+
err.code = 'ECONNRESET';
|
|
141
|
+
reject(err);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
export async function whois(query, options = {}) {
|
|
147
|
+
const { server: customServer, port = 43, timeout = 10000, follow = true, } = options;
|
|
148
|
+
const cleanQuery = query.trim().toLowerCase();
|
|
149
|
+
let server = getWhoisServer(cleanQuery, customServer);
|
|
150
|
+
let raw = await queryWhoisServer(server, cleanQuery, port, timeout);
|
|
151
|
+
if (follow && !customServer) {
|
|
152
|
+
const referralServer = extractReferralServer(raw);
|
|
153
|
+
if (referralServer && referralServer !== server) {
|
|
154
|
+
server = referralServer;
|
|
155
|
+
raw = await queryWhoisServer(server, cleanQuery, port, timeout);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const data = parseWhoisData(raw);
|
|
159
|
+
return {
|
|
160
|
+
raw,
|
|
161
|
+
query: cleanQuery,
|
|
162
|
+
server,
|
|
163
|
+
data,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export async function isDomainAvailable(domain, options) {
|
|
167
|
+
try {
|
|
168
|
+
const result = await whois(domain, options);
|
|
169
|
+
const rawLower = result.raw.toLowerCase();
|
|
170
|
+
const notFoundIndicators = [
|
|
171
|
+
'no match',
|
|
172
|
+
'not found',
|
|
173
|
+
'no entries found',
|
|
174
|
+
'no data found',
|
|
175
|
+
'status: available',
|
|
176
|
+
'status: free',
|
|
177
|
+
];
|
|
178
|
+
return notFoundIndicators.some(indicator => rawLower.includes(indicator));
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
export class WhoisClient {
|
|
185
|
+
options;
|
|
186
|
+
constructor(options = {}) {
|
|
187
|
+
this.options = {
|
|
188
|
+
server: options.server ?? '',
|
|
189
|
+
port: options.port ?? 43,
|
|
190
|
+
timeout: options.timeout ?? 10000,
|
|
191
|
+
follow: options.follow ?? true,
|
|
192
|
+
debug: options.debug ?? false,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
log(message, ...args) {
|
|
196
|
+
if (this.options.debug) {
|
|
197
|
+
console.log(`[WHOIS] ${message}`, ...args);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async lookup(query, options) {
|
|
201
|
+
this.log(`Looking up: ${query}`);
|
|
202
|
+
const start = Date.now();
|
|
203
|
+
const result = await whois(query, {
|
|
204
|
+
server: options?.server ?? (this.options.server || undefined),
|
|
205
|
+
port: options?.port ?? this.options.port,
|
|
206
|
+
timeout: options?.timeout ?? this.options.timeout,
|
|
207
|
+
follow: options?.follow ?? this.options.follow,
|
|
208
|
+
});
|
|
209
|
+
this.log(`Lookup completed in ${Date.now() - start}ms from ${result.server}`);
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
212
|
+
async isAvailable(domain) {
|
|
213
|
+
this.log(`Checking availability: ${domain}`);
|
|
214
|
+
return isDomainAvailable(domain, {
|
|
215
|
+
server: this.options.server || undefined,
|
|
216
|
+
port: this.options.port,
|
|
217
|
+
timeout: this.options.timeout,
|
|
218
|
+
follow: this.options.follow,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
async getRegistrar(domain) {
|
|
222
|
+
const result = await this.lookup(domain);
|
|
223
|
+
return result.data['registrar'] ||
|
|
224
|
+
result.data['sponsoring registrar'] ||
|
|
225
|
+
null;
|
|
226
|
+
}
|
|
227
|
+
async getExpiration(domain) {
|
|
228
|
+
const result = await this.lookup(domain);
|
|
229
|
+
const expiry = result.data['registry expiry date'] ||
|
|
230
|
+
result.data['expiration date'] ||
|
|
231
|
+
result.data['expiry date'];
|
|
232
|
+
if (expiry) {
|
|
233
|
+
const date = new Date(expiry);
|
|
234
|
+
return isNaN(date.getTime()) ? null : date;
|
|
235
|
+
}
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
async getNameServers(domain) {
|
|
239
|
+
const result = await this.lookup(domain);
|
|
240
|
+
const ns = result.data['name server'] || result.data['nserver'] || [];
|
|
241
|
+
return Array.isArray(ns) ? ns : [ns];
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
export function createWhois(options) {
|
|
245
|
+
return new WhoisClient(options);
|
|
246
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import type { TLSOptions, ProxyOptions } from '../types/index.js';
|
|
3
|
+
import type { Dispatcher } from 'undici';
|
|
4
|
+
import { Readable } from 'node:stream';
|
|
5
|
+
export interface WebSocketOptions {
|
|
6
|
+
protocols?: string | string[];
|
|
7
|
+
headers?: Record<string, string>;
|
|
8
|
+
dispatcher?: Dispatcher;
|
|
9
|
+
proxy?: ProxyOptions | string;
|
|
10
|
+
tls?: TLSOptions;
|
|
11
|
+
perMessageDeflate?: boolean;
|
|
12
|
+
reconnect?: boolean;
|
|
13
|
+
reconnectDelay?: number;
|
|
14
|
+
maxReconnectAttempts?: number;
|
|
15
|
+
heartbeatInterval?: number;
|
|
16
|
+
heartbeatTimeout?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface WebSocketMessage {
|
|
19
|
+
data: string | Buffer;
|
|
20
|
+
isBinary: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare class ReckerWebSocket extends EventEmitter {
|
|
23
|
+
private ws;
|
|
24
|
+
private url;
|
|
25
|
+
private options;
|
|
26
|
+
private reconnectAttempts;
|
|
27
|
+
private reconnectTimer?;
|
|
28
|
+
private heartbeatTimer?;
|
|
29
|
+
private isClosed;
|
|
30
|
+
private isReconnecting;
|
|
31
|
+
private pongWatchdog?;
|
|
32
|
+
private backoff;
|
|
33
|
+
private closedByUser;
|
|
34
|
+
constructor(url: string, options?: WebSocketOptions);
|
|
35
|
+
connect(): Promise<void>;
|
|
36
|
+
send(data: string | Buffer | ArrayBuffer | ArrayBufferView, options?: {
|
|
37
|
+
awaitDrain?: boolean;
|
|
38
|
+
highWaterMark?: number;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
sendStream(stream: Readable, options?: {
|
|
41
|
+
awaitDrain?: boolean;
|
|
42
|
+
highWaterMark?: number;
|
|
43
|
+
}): Promise<void>;
|
|
44
|
+
sendJSON(data: any): void;
|
|
45
|
+
close(code?: number, reason?: string): void;
|
|
46
|
+
ping(): void;
|
|
47
|
+
get readyState(): number;
|
|
48
|
+
get isConnected(): boolean;
|
|
49
|
+
toReadable(): Readable | null;
|
|
50
|
+
pipeFrom(source: Readable, options?: {
|
|
51
|
+
awaitDrain?: boolean;
|
|
52
|
+
highWaterMark?: number;
|
|
53
|
+
}): Promise<void>;
|
|
54
|
+
pipeTo(destination: NodeJS.WritableStream): Promise<void>;
|
|
55
|
+
[Symbol.asyncIterator](): AsyncGenerator<WebSocketMessage>;
|
|
56
|
+
private attemptReconnect;
|
|
57
|
+
private clearReconnectTimer;
|
|
58
|
+
private startHeartbeat;
|
|
59
|
+
private stopHeartbeat;
|
|
60
|
+
private startPongWatchdog;
|
|
61
|
+
private stopPongWatchdog;
|
|
62
|
+
private getBufferedAmount;
|
|
63
|
+
private waitForDrain;
|
|
64
|
+
}
|
|
65
|
+
export declare function createWebSocket(url: string, options?: WebSocketOptions): ReckerWebSocket;
|