rezo 1.0.130 → 1.0.132

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.
Files changed (67) hide show
  1. package/dist/adapters/entries/curl.d.ts +1 -1
  2. package/dist/adapters/entries/fetch.d.ts +1 -1
  3. package/dist/adapters/entries/http.d.ts +1 -1
  4. package/dist/adapters/entries/http2.d.ts +1 -1
  5. package/dist/adapters/entries/react-native.cjs +6 -6
  6. package/dist/adapters/entries/react-native.d.ts +1 -1
  7. package/dist/adapters/entries/xhr.d.ts +1 -1
  8. package/dist/adapters/index.cjs +6 -6
  9. package/dist/cache/dns-cache.cjs +11 -1
  10. package/dist/cache/dns-cache.js +11 -1
  11. package/dist/cache/index.cjs +9 -9
  12. package/dist/cache/response-cache.cjs +40 -14
  13. package/dist/cache/response-cache.js +40 -14
  14. package/dist/cookies/cookie-jar.cjs +9 -12
  15. package/dist/cookies/cookie-jar.js +5 -8
  16. package/dist/cookies/index.cjs +10 -10
  17. package/dist/crawler/addon/oxylabs/index.cjs +1 -1
  18. package/dist/crawler/crawler-options.cjs +1 -1
  19. package/dist/crawler/crawler-options.js +1 -1
  20. package/dist/crawler/crawler.cjs +24 -4
  21. package/dist/crawler/crawler.js +24 -4
  22. package/dist/crawler/index.cjs +42 -42
  23. package/dist/crawler/plugin/index.cjs +1 -1
  24. package/dist/crawler/plugin/sqlite-utils.cjs +1 -1
  25. package/dist/crawler/plugin/sqlite-utils.js +1 -1
  26. package/dist/crawler.d.ts +7 -0
  27. package/dist/dom/index.cjs +1 -23
  28. package/dist/dom/index.d.ts +3 -0
  29. package/dist/dom/index.js +1 -20
  30. package/dist/entries/crawler.cjs +6 -6
  31. package/dist/index.cjs +48 -48
  32. package/dist/index.d.ts +1 -1
  33. package/dist/internal/agents/index.cjs +14 -14
  34. package/dist/platform/browser.d.ts +1 -1
  35. package/dist/platform/bun.d.ts +1 -1
  36. package/dist/platform/deno.d.ts +1 -1
  37. package/dist/platform/node.d.ts +1 -1
  38. package/dist/platform/react-native.cjs +6 -6
  39. package/dist/platform/react-native.d.ts +1 -1
  40. package/dist/platform/worker.d.ts +1 -1
  41. package/dist/proxy/index.cjs +4 -4
  42. package/dist/queue/index.cjs +8 -8
  43. package/dist/responses/universal/index.cjs +11 -11
  44. package/dist/responses/universal/stream.cjs +11 -9
  45. package/dist/responses/universal/stream.js +11 -9
  46. package/dist/stealth/index.cjs +17 -17
  47. package/dist/stealth/profiles/index.cjs +10 -10
  48. package/dist/utils/http-config.cjs +21 -13
  49. package/dist/utils/http-config.js +21 -13
  50. package/dist/utils/node-runtime.cjs +29 -0
  51. package/dist/utils/node-runtime.js +26 -0
  52. package/dist/version.cjs +1 -1
  53. package/dist/version.js +1 -1
  54. package/dist/wget/asset-extractor.cjs +187 -19
  55. package/dist/wget/asset-extractor.js +184 -19
  56. package/dist/wget/downloader.cjs +269 -12
  57. package/dist/wget/downloader.js +269 -12
  58. package/dist/wget/index.cjs +221 -52
  59. package/dist/wget/index.d.ts +212 -8
  60. package/dist/wget/index.js +170 -1
  61. package/dist/wget/progress.cjs +90 -7
  62. package/dist/wget/progress.js +90 -7
  63. package/dist/wget/session.cjs +122 -0
  64. package/dist/wget/session.js +119 -0
  65. package/dist/wget/types.cjs +6 -0
  66. package/dist/wget/types.js +6 -0
  67. package/package.json +23 -22
@@ -6027,7 +6027,7 @@ export interface RezoInstance extends Rezo, RezoCallable {
6027
6027
  *
6028
6028
  * IMPORTANT: Update these values when bumping package version.
6029
6029
  */
6030
- export declare const VERSION = "1.0.130";
6030
+ export declare const VERSION = "1.0.132";
6031
6031
  /**
6032
6032
  * cURL Options Configuration
6033
6033
  *
@@ -6027,7 +6027,7 @@ export interface RezoInstance extends Rezo, RezoCallable {
6027
6027
  *
6028
6028
  * IMPORTANT: Update these values when bumping package version.
6029
6029
  */
6030
- export declare const VERSION = "1.0.130";
6030
+ export declare const VERSION = "1.0.132";
6031
6031
  export declare const isRezoError: typeof RezoError.isRezoError;
6032
6032
  export declare const Cancel: typeof RezoError;
6033
6033
  export declare const CancelToken: {
@@ -6027,7 +6027,7 @@ export interface RezoInstance extends Rezo, RezoCallable {
6027
6027
  *
6028
6028
  * IMPORTANT: Update these values when bumping package version.
6029
6029
  */
6030
- export declare const VERSION = "1.0.130";
6030
+ export declare const VERSION = "1.0.132";
6031
6031
  /**
6032
6032
  * Type guard to check if an error is a RezoError instance.
6033
6033
  */
@@ -6027,7 +6027,7 @@ export interface RezoInstance extends Rezo, RezoCallable {
6027
6027
  *
6028
6028
  * IMPORTANT: Update these values when bumping package version.
6029
6029
  */
6030
- export declare const VERSION = "1.0.130";
6030
+ export declare const VERSION = "1.0.132";
6031
6031
  export declare const isRezoError: typeof RezoError.isRezoError;
6032
6032
  export declare const Cancel: typeof RezoError;
6033
6033
  export declare const CancelToken: {
@@ -6,12 +6,12 @@ const { RezoFormData } = require('../../utils/form-data.cjs');
6
6
  const { RezoCookieJar, Cookie } = require('../../cookies/cookie-jar.cjs');
7
7
  const { createDefaultHooks, mergeHooks } = require('../../core/hooks.cjs');
8
8
  const { VERSION } = require('../../version.cjs');
9
- const _mod_fft01t = require('../../platform/react-native-providers.cjs');
10
- exports.createFetchStreamTransport = _mod_fft01t.createFetchStreamTransport;
11
- exports.createExpoFileSystemAdapter = _mod_fft01t.createExpoFileSystemAdapter;
12
- exports.createReactNativeFsAdapter = _mod_fft01t.createReactNativeFsAdapter;
13
- exports.createNetInfoProvider = _mod_fft01t.createNetInfoProvider;
14
- exports.createExpoBackgroundTaskProvider = _mod_fft01t.createExpoBackgroundTaskProvider;;
9
+ const _mod_jspfje = require('../../platform/react-native-providers.cjs');
10
+ exports.createFetchStreamTransport = _mod_jspfje.createFetchStreamTransport;
11
+ exports.createExpoFileSystemAdapter = _mod_jspfje.createExpoFileSystemAdapter;
12
+ exports.createReactNativeFsAdapter = _mod_jspfje.createReactNativeFsAdapter;
13
+ exports.createNetInfoProvider = _mod_jspfje.createNetInfoProvider;
14
+ exports.createExpoBackgroundTaskProvider = _mod_jspfje.createExpoBackgroundTaskProvider;;
15
15
  exports.Rezo = Rezo;
16
16
  exports.RezoError = RezoError;
17
17
  exports.RezoErrorCode = RezoErrorCode;
@@ -6027,7 +6027,7 @@ export interface RezoInstance extends Rezo, RezoCallable {
6027
6027
  *
6028
6028
  * IMPORTANT: Update these values when bumping package version.
6029
6029
  */
6030
- export declare const VERSION = "1.0.130";
6030
+ export declare const VERSION = "1.0.132";
6031
6031
  export interface ExpoFileSystemFileLike {
6032
6032
  uri?: string;
6033
6033
  size?: number;
@@ -6027,7 +6027,7 @@ export interface RezoInstance extends Rezo, RezoCallable {
6027
6027
  *
6028
6028
  * IMPORTANT: Update these values when bumping package version.
6029
6029
  */
6030
- export declare const VERSION = "1.0.130";
6030
+ export declare const VERSION = "1.0.132";
6031
6031
  export declare const isRezoError: typeof RezoError.isRezoError;
6032
6032
  export declare const Cancel: typeof RezoError;
6033
6033
  export declare const CancelToken: {
@@ -1,6 +1,6 @@
1
- const _mod_qhux44 = require('./picker.cjs');
2
- exports.detectRuntime = _mod_qhux44.detectRuntime;
3
- exports.getAdapterCapabilities = _mod_qhux44.getAdapterCapabilities;
4
- exports.buildAdapterContext = _mod_qhux44.buildAdapterContext;
5
- exports.getAvailableAdapters = _mod_qhux44.getAvailableAdapters;
6
- exports.selectAdapter = _mod_qhux44.selectAdapter;;
1
+ const _mod_pq418y = require('./picker.cjs');
2
+ exports.detectRuntime = _mod_pq418y.detectRuntime;
3
+ exports.getAdapterCapabilities = _mod_pq418y.getAdapterCapabilities;
4
+ exports.buildAdapterContext = _mod_pq418y.buildAdapterContext;
5
+ exports.getAvailableAdapters = _mod_pq418y.getAvailableAdapters;
6
+ exports.selectAdapter = _mod_pq418y.selectAdapter;;
@@ -1,5 +1,5 @@
1
1
  const { LRUCache } = require('./lru-cache.cjs');
2
- const dns = require("node:dns");
2
+ const { requireNodeModule } = require('../utils/node-runtime.cjs');
3
3
  const DEFAULT_DNS_TTL = 60000;
4
4
  const DEFAULT_DNS_MAX_ENTRIES = 1000;
5
5
 
@@ -59,6 +59,11 @@ class DNSCache {
59
59
  }
60
60
  resolveDNS(hostname, family) {
61
61
  return new Promise((resolve) => {
62
+ const dns = requireNodeModule("node:dns");
63
+ if (!dns?.lookup) {
64
+ resolve(undefined);
65
+ return;
66
+ }
62
67
  const options = { family: family ?? 0 };
63
68
  dns.lookup(hostname, options, (err, address, resultFamily) => {
64
69
  if (err || !address || typeof address !== "string") {
@@ -71,6 +76,11 @@ class DNSCache {
71
76
  }
72
77
  resolveAllDNS(hostname, family) {
73
78
  return new Promise((resolve) => {
79
+ const dns = requireNodeModule("node:dns");
80
+ if (!dns?.lookup) {
81
+ resolve([]);
82
+ return;
83
+ }
74
84
  const options = { family: family ?? 0, all: true };
75
85
  dns.lookup(hostname, options, (err, addresses) => {
76
86
  if (err || !addresses || !Array.isArray(addresses)) {
@@ -1,5 +1,5 @@
1
1
  import { LRUCache } from './lru-cache.js';
2
- import dns from "node:dns";
2
+ import { requireNodeModule } from '../utils/node-runtime.js';
3
3
  const DEFAULT_DNS_TTL = 60000;
4
4
  const DEFAULT_DNS_MAX_ENTRIES = 1000;
5
5
 
@@ -59,6 +59,11 @@ export class DNSCache {
59
59
  }
60
60
  resolveDNS(hostname, family) {
61
61
  return new Promise((resolve) => {
62
+ const dns = requireNodeModule("node:dns");
63
+ if (!dns?.lookup) {
64
+ resolve(undefined);
65
+ return;
66
+ }
62
67
  const options = { family: family ?? 0 };
63
68
  dns.lookup(hostname, options, (err, address, resultFamily) => {
64
69
  if (err || !address || typeof address !== "string") {
@@ -71,6 +76,11 @@ export class DNSCache {
71
76
  }
72
77
  resolveAllDNS(hostname, family) {
73
78
  return new Promise((resolve) => {
79
+ const dns = requireNodeModule("node:dns");
80
+ if (!dns?.lookup) {
81
+ resolve([]);
82
+ return;
83
+ }
74
84
  const options = { family: family ?? 0, all: true };
75
85
  dns.lookup(hostname, options, (err, addresses) => {
76
86
  if (err || !addresses || !Array.isArray(addresses)) {
@@ -1,9 +1,9 @@
1
- const _mod_66d5y0 = require('./lru-cache.cjs');
2
- exports.LRUCache = _mod_66d5y0.LRUCache;;
3
- const _mod_fiylx5 = require('./dns-cache.cjs');
4
- exports.DNSCache = _mod_fiylx5.DNSCache;
5
- exports.getGlobalDNSCache = _mod_fiylx5.getGlobalDNSCache;
6
- exports.resetGlobalDNSCache = _mod_fiylx5.resetGlobalDNSCache;;
7
- const _mod_t0ymbs = require('./response-cache.cjs');
8
- exports.ResponseCache = _mod_t0ymbs.ResponseCache;
9
- exports.normalizeResponseCacheConfig = _mod_t0ymbs.normalizeResponseCacheConfig;;
1
+ const _mod_cryjmu = require('./lru-cache.cjs');
2
+ exports.LRUCache = _mod_cryjmu.LRUCache;;
3
+ const _mod_g9gezo = require('./dns-cache.cjs');
4
+ exports.DNSCache = _mod_g9gezo.DNSCache;
5
+ exports.getGlobalDNSCache = _mod_g9gezo.getGlobalDNSCache;
6
+ exports.resetGlobalDNSCache = _mod_g9gezo.resetGlobalDNSCache;;
7
+ const _mod_lqa0tk = require('./response-cache.cjs');
8
+ exports.ResponseCache = _mod_lqa0tk.ResponseCache;
9
+ exports.normalizeResponseCacheConfig = _mod_lqa0tk.normalizeResponseCacheConfig;;
@@ -1,7 +1,11 @@
1
1
  const { LRUCache } = require('./lru-cache.cjs');
2
- const fs = require("node:fs");
3
- const path = require("node:path");
4
- const fsPromises = fs.promises;
2
+ const { requireNodeModule } = require('../utils/node-runtime.cjs');
3
+ function getFsModule() {
4
+ return requireNodeModule("node:fs");
5
+ }
6
+ function getPathModule() {
7
+ return requireNodeModule("node:path");
8
+ }
5
9
  const DEFAULT_TTL = 3000000;
6
10
  const DEFAULT_MAX_ENTRIES = 500;
7
11
  const DEFAULT_METHODS = ["GET", "HEAD"];
@@ -22,7 +26,7 @@ class ResponseCache {
22
26
  methods: config.methods ?? DEFAULT_METHODS,
23
27
  respectHeaders: config.respectHeaders ?? true
24
28
  };
25
- this.persistenceEnabled = !!this.config.cacheDir;
29
+ this.persistenceEnabled = !!this.config.cacheDir && !!getFsModule() && !!getPathModule();
26
30
  this.memoryCache = new LRUCache({
27
31
  maxEntries: this.config.maxEntries,
28
32
  ttl: this.config.ttl,
@@ -42,8 +46,13 @@ class ResponseCache {
42
46
  async initializePersistenceAsync() {
43
47
  if (!this.config.cacheDir)
44
48
  return;
49
+ const fs = getFsModule();
50
+ if (!fs?.promises) {
51
+ this.persistenceEnabled = false;
52
+ return;
53
+ }
45
54
  try {
46
- await fsPromises.mkdir(this.config.cacheDir, { recursive: true });
55
+ await fs.promises.mkdir(this.config.cacheDir, { recursive: true });
47
56
  await this.loadFromDiskAsync();
48
57
  this.initialized = true;
49
58
  } catch {
@@ -51,34 +60,42 @@ class ResponseCache {
51
60
  }
52
61
  }
53
62
  getCacheFilePath(key) {
63
+ const path = getPathModule();
54
64
  const safeKey = Buffer.from(key).toString("base64url");
55
- return path.join(this.config.cacheDir, `${safeKey}.json`);
65
+ return path && this.config.cacheDir ? path.join(this.config.cacheDir, `${safeKey}.json`) : `${this.config.cacheDir || ""}/${safeKey}.json`;
56
66
  }
57
67
  persistToDisk(key, entry) {
58
68
  if (!this.persistenceEnabled || !this.config.cacheDir)
59
69
  return;
70
+ const fs = getFsModule();
71
+ if (!fs?.promises)
72
+ return;
60
73
  const filePath = this.getCacheFilePath(key);
61
- fsPromises.writeFile(filePath, JSON.stringify(entry), "utf-8").catch(() => {});
74
+ fs.promises.writeFile(filePath, JSON.stringify(entry), "utf-8").catch(() => {});
62
75
  }
63
76
  async loadFromDiskAsync() {
64
77
  if (!this.persistenceEnabled || !this.config.cacheDir)
65
78
  return;
79
+ const fs = getFsModule();
80
+ const path = getPathModule();
81
+ if (!fs?.promises || !path)
82
+ return;
66
83
  try {
67
- const files = await fsPromises.readdir(this.config.cacheDir);
84
+ const files = await fs.promises.readdir(this.config.cacheDir);
68
85
  const now = Date.now();
69
86
  for (const file of files) {
70
87
  if (!file.endsWith(".json"))
71
88
  continue;
72
89
  try {
73
90
  const filePath = path.join(this.config.cacheDir, file);
74
- const content = await fsPromises.readFile(filePath, "utf-8");
91
+ const content = await fs.promises.readFile(filePath, "utf-8");
75
92
  const entry = JSON.parse(content);
76
93
  if (entry.timestamp + entry.ttl > now) {
77
94
  const key = Buffer.from(file.replace(".json", ""), "base64url").toString("utf-8");
78
95
  const remainingTTL = entry.timestamp + entry.ttl - now;
79
96
  this.memoryCache.set(key, entry, remainingTTL);
80
97
  } else {
81
- fsPromises.unlink(filePath).catch(() => {});
98
+ fs.promises.unlink(filePath).catch(() => {});
82
99
  }
83
100
  } catch {}
84
101
  }
@@ -145,6 +162,9 @@ class ResponseCache {
145
162
  loadSingleFromDisk(key) {
146
163
  if (!this.persistenceEnabled || !this.config.cacheDir)
147
164
  return;
165
+ const fs = getFsModule();
166
+ if (!fs)
167
+ return;
148
168
  try {
149
169
  const filePath = this.getCacheFilePath(key);
150
170
  if (!fs.existsSync(filePath))
@@ -241,7 +261,8 @@ class ResponseCache {
241
261
  this.memoryCache.delete(key);
242
262
  if (this.persistenceEnabled) {
243
263
  const filePath = this.getCacheFilePath(key);
244
- fsPromises.unlink(filePath).catch(() => {});
264
+ const fs = getFsModule();
265
+ fs?.promises?.unlink(filePath).catch(() => {});
245
266
  }
246
267
  return;
247
268
  }
@@ -270,18 +291,23 @@ class ResponseCache {
270
291
  this.memoryCache.delete(key);
271
292
  if (this.persistenceEnabled) {
272
293
  const filePath = this.getCacheFilePath(key);
273
- fsPromises.unlink(filePath).catch(() => {});
294
+ const fs = getFsModule();
295
+ fs?.promises?.unlink(filePath).catch(() => {});
274
296
  }
275
297
  }
276
298
  }
277
299
  clear() {
278
300
  this.memoryCache.clear();
279
301
  if (this.persistenceEnabled && this.config.cacheDir) {
302
+ const fs = getFsModule();
303
+ const path = getPathModule();
304
+ if (!fs?.promises || !path)
305
+ return;
280
306
  const cacheDir = this.config.cacheDir;
281
- fsPromises.readdir(cacheDir).then((files) => {
307
+ fs.promises.readdir(cacheDir).then((files) => {
282
308
  for (const file of files) {
283
309
  if (file.endsWith(".json")) {
284
- fsPromises.unlink(path.join(cacheDir, file)).catch(() => {});
310
+ fs.promises.unlink(path.join(cacheDir, file)).catch(() => {});
285
311
  }
286
312
  }
287
313
  }).catch(() => {});
@@ -1,7 +1,11 @@
1
1
  import { LRUCache } from './lru-cache.js';
2
- import fs from "node:fs";
3
- import path from "node:path";
4
- const fsPromises = fs.promises;
2
+ import { requireNodeModule } from '../utils/node-runtime.js';
3
+ function getFsModule() {
4
+ return requireNodeModule("node:fs");
5
+ }
6
+ function getPathModule() {
7
+ return requireNodeModule("node:path");
8
+ }
5
9
  const DEFAULT_TTL = 3000000;
6
10
  const DEFAULT_MAX_ENTRIES = 500;
7
11
  const DEFAULT_METHODS = ["GET", "HEAD"];
@@ -22,7 +26,7 @@ export class ResponseCache {
22
26
  methods: config.methods ?? DEFAULT_METHODS,
23
27
  respectHeaders: config.respectHeaders ?? true
24
28
  };
25
- this.persistenceEnabled = !!this.config.cacheDir;
29
+ this.persistenceEnabled = !!this.config.cacheDir && !!getFsModule() && !!getPathModule();
26
30
  this.memoryCache = new LRUCache({
27
31
  maxEntries: this.config.maxEntries,
28
32
  ttl: this.config.ttl,
@@ -42,8 +46,13 @@ export class ResponseCache {
42
46
  async initializePersistenceAsync() {
43
47
  if (!this.config.cacheDir)
44
48
  return;
49
+ const fs = getFsModule();
50
+ if (!fs?.promises) {
51
+ this.persistenceEnabled = false;
52
+ return;
53
+ }
45
54
  try {
46
- await fsPromises.mkdir(this.config.cacheDir, { recursive: true });
55
+ await fs.promises.mkdir(this.config.cacheDir, { recursive: true });
47
56
  await this.loadFromDiskAsync();
48
57
  this.initialized = true;
49
58
  } catch {
@@ -51,34 +60,42 @@ export class ResponseCache {
51
60
  }
52
61
  }
53
62
  getCacheFilePath(key) {
63
+ const path = getPathModule();
54
64
  const safeKey = Buffer.from(key).toString("base64url");
55
- return path.join(this.config.cacheDir, `${safeKey}.json`);
65
+ return path && this.config.cacheDir ? path.join(this.config.cacheDir, `${safeKey}.json`) : `${this.config.cacheDir || ""}/${safeKey}.json`;
56
66
  }
57
67
  persistToDisk(key, entry) {
58
68
  if (!this.persistenceEnabled || !this.config.cacheDir)
59
69
  return;
70
+ const fs = getFsModule();
71
+ if (!fs?.promises)
72
+ return;
60
73
  const filePath = this.getCacheFilePath(key);
61
- fsPromises.writeFile(filePath, JSON.stringify(entry), "utf-8").catch(() => {});
74
+ fs.promises.writeFile(filePath, JSON.stringify(entry), "utf-8").catch(() => {});
62
75
  }
63
76
  async loadFromDiskAsync() {
64
77
  if (!this.persistenceEnabled || !this.config.cacheDir)
65
78
  return;
79
+ const fs = getFsModule();
80
+ const path = getPathModule();
81
+ if (!fs?.promises || !path)
82
+ return;
66
83
  try {
67
- const files = await fsPromises.readdir(this.config.cacheDir);
84
+ const files = await fs.promises.readdir(this.config.cacheDir);
68
85
  const now = Date.now();
69
86
  for (const file of files) {
70
87
  if (!file.endsWith(".json"))
71
88
  continue;
72
89
  try {
73
90
  const filePath = path.join(this.config.cacheDir, file);
74
- const content = await fsPromises.readFile(filePath, "utf-8");
91
+ const content = await fs.promises.readFile(filePath, "utf-8");
75
92
  const entry = JSON.parse(content);
76
93
  if (entry.timestamp + entry.ttl > now) {
77
94
  const key = Buffer.from(file.replace(".json", ""), "base64url").toString("utf-8");
78
95
  const remainingTTL = entry.timestamp + entry.ttl - now;
79
96
  this.memoryCache.set(key, entry, remainingTTL);
80
97
  } else {
81
- fsPromises.unlink(filePath).catch(() => {});
98
+ fs.promises.unlink(filePath).catch(() => {});
82
99
  }
83
100
  } catch {}
84
101
  }
@@ -145,6 +162,9 @@ export class ResponseCache {
145
162
  loadSingleFromDisk(key) {
146
163
  if (!this.persistenceEnabled || !this.config.cacheDir)
147
164
  return;
165
+ const fs = getFsModule();
166
+ if (!fs)
167
+ return;
148
168
  try {
149
169
  const filePath = this.getCacheFilePath(key);
150
170
  if (!fs.existsSync(filePath))
@@ -241,7 +261,8 @@ export class ResponseCache {
241
261
  this.memoryCache.delete(key);
242
262
  if (this.persistenceEnabled) {
243
263
  const filePath = this.getCacheFilePath(key);
244
- fsPromises.unlink(filePath).catch(() => {});
264
+ const fs = getFsModule();
265
+ fs?.promises?.unlink(filePath).catch(() => {});
245
266
  }
246
267
  return;
247
268
  }
@@ -270,18 +291,23 @@ export class ResponseCache {
270
291
  this.memoryCache.delete(key);
271
292
  if (this.persistenceEnabled) {
272
293
  const filePath = this.getCacheFilePath(key);
273
- fsPromises.unlink(filePath).catch(() => {});
294
+ const fs = getFsModule();
295
+ fs?.promises?.unlink(filePath).catch(() => {});
274
296
  }
275
297
  }
276
298
  }
277
299
  clear() {
278
300
  this.memoryCache.clear();
279
301
  if (this.persistenceEnabled && this.config.cacheDir) {
302
+ const fs = getFsModule();
303
+ const path = getPathModule();
304
+ if (!fs?.promises || !path)
305
+ return;
280
306
  const cacheDir = this.config.cacheDir;
281
- fsPromises.readdir(cacheDir).then((files) => {
307
+ fs.promises.readdir(cacheDir).then((files) => {
282
308
  for (const file of files) {
283
309
  if (file.endsWith(".json")) {
284
- fsPromises.unlink(path.join(cacheDir, file)).catch(() => {});
310
+ fs.promises.unlink(path.join(cacheDir, file)).catch(() => {});
285
311
  }
286
312
  }
287
313
  }).catch(() => {});
@@ -1,7 +1,8 @@
1
1
  const { CookieJar: TouchCookieJar } = require("tough-cookie");
2
2
  const { Cookie } = require('./cookie.cjs');
3
- const _mod_y8mmg9 = require('./cookie.cjs');
4
- exports.Cookie = _mod_y8mmg9.Cookie;;
3
+ const { requireNodeModule } = require('../utils/node-runtime.cjs');
4
+ const _mod_ojn3wu = require('./cookie.cjs');
5
+ exports.Cookie = _mod_ojn3wu.Cookie;;
5
6
 
6
7
  class RezoCookieJar extends TouchCookieJar {
7
8
  constructor(store, options) {
@@ -402,10 +403,8 @@ class RezoCookieJar extends TouchCookieJar {
402
403
  return this._cookieFile;
403
404
  }
404
405
  loadFromFile(filePath, _defaultUrl) {
405
- let fs;
406
- try {
407
- fs = require("node:fs");
408
- } catch {
406
+ const fs = requireNodeModule("node:fs");
407
+ if (!fs) {
409
408
  throw new Error("loadFromFile() requires Node.js, Bun, or Deno. Not available in browsers or React Native.");
410
409
  }
411
410
  if (!fs.existsSync(filePath)) {
@@ -456,10 +455,8 @@ class RezoCookieJar extends TouchCookieJar {
456
455
  if (!targetPath) {
457
456
  throw new Error("No cookie file path specified. Provide a path or load from a file first.");
458
457
  }
459
- let fs;
460
- try {
461
- fs = require("node:fs");
462
- } catch {
458
+ const fs = requireNodeModule("node:fs");
459
+ if (!fs) {
463
460
  throw new Error("saveToFile() requires Node.js, Bun, or Deno. Not available in browsers or React Native.");
464
461
  }
465
462
  const isJson = targetPath.toLowerCase().endsWith(".json");
@@ -484,7 +481,7 @@ class RezoCookieJar extends TouchCookieJar {
484
481
  }
485
482
  }
486
483
  const CookieJar = exports.CookieJar = RezoCookieJar;
487
- const _mod_2m96de = require("tough-cookie");
488
- exports.Store = _mod_2m96de.Store;;
484
+ const _mod_3lg6nf = require("tough-cookie");
485
+ exports.Store = _mod_3lg6nf.Store;;
489
486
 
490
487
  exports.RezoCookieJar = RezoCookieJar;
@@ -1,5 +1,6 @@
1
1
  import { CookieJar as TouchCookieJar } from "tough-cookie";
2
2
  import { Cookie } from './cookie.js';
3
+ import { requireNodeModule } from '../utils/node-runtime.js';
3
4
  export { Cookie } from './cookie.js';
4
5
 
5
6
  export class RezoCookieJar extends TouchCookieJar {
@@ -401,10 +402,8 @@ export class RezoCookieJar extends TouchCookieJar {
401
402
  return this._cookieFile;
402
403
  }
403
404
  loadFromFile(filePath, _defaultUrl) {
404
- let fs;
405
- try {
406
- fs = require("node:fs");
407
- } catch {
405
+ const fs = requireNodeModule("node:fs");
406
+ if (!fs) {
408
407
  throw new Error("loadFromFile() requires Node.js, Bun, or Deno. Not available in browsers or React Native.");
409
408
  }
410
409
  if (!fs.existsSync(filePath)) {
@@ -455,10 +454,8 @@ export class RezoCookieJar extends TouchCookieJar {
455
454
  if (!targetPath) {
456
455
  throw new Error("No cookie file path specified. Provide a path or load from a file first.");
457
456
  }
458
- let fs;
459
- try {
460
- fs = require("node:fs");
461
- } catch {
457
+ const fs = requireNodeModule("node:fs");
458
+ if (!fs) {
462
459
  throw new Error("saveToFile() requires Node.js, Bun, or Deno. Not available in browsers or React Native.");
463
460
  }
464
461
  const isJson = targetPath.toLowerCase().endsWith(".json");
@@ -1,10 +1,10 @@
1
- const _mod_pjz10g = require('./cookie.cjs');
2
- exports.Cookie = _mod_pjz10g.Cookie;
3
- exports.RezoCookie = _mod_pjz10g.RezoCookie;;
4
- const _mod_r06e2k = require('./cookie-store.cjs');
5
- exports.RezoCookieStore = _mod_r06e2k.RezoCookieStore;;
6
- const _mod_8gcdod = require('./cookie-jar.cjs');
7
- exports.RezoCookieJar = _mod_8gcdod.RezoCookieJar;
8
- exports.CookieJar = _mod_8gcdod.CookieJar;;
9
- const _mod_jxvzsj = require("tough-cookie");
10
- exports.Store = _mod_jxvzsj.Store;;
1
+ const _mod_meju1m = require('./cookie.cjs');
2
+ exports.Cookie = _mod_meju1m.Cookie;
3
+ exports.RezoCookie = _mod_meju1m.RezoCookie;;
4
+ const _mod_mh08zd = require('./cookie-store.cjs');
5
+ exports.RezoCookieStore = _mod_mh08zd.RezoCookieStore;;
6
+ const _mod_kqcrba = require('./cookie-jar.cjs');
7
+ exports.RezoCookieJar = _mod_kqcrba.RezoCookieJar;
8
+ exports.CookieJar = _mod_kqcrba.CookieJar;;
9
+ const _mod_mg6dea = require("tough-cookie");
10
+ exports.Store = _mod_mg6dea.Store;;
@@ -1 +1 @@
1
- var{Rezo:h}=require("../../../core/rezo.cjs"),a=require("./options.cjs");exports.OXYLABS_BROWSER_TYPES=a.OXYLABS_BROWSER_TYPES;exports.OXYLABS_COMMON_LOCALES=a.OXYLABS_COMMON_LOCALES;exports.OXYLABS_COMMON_GEO_LOCATIONS=a.OXYLABS_COMMON_GEO_LOCATIONS;exports.OXYLABS_US_STATES=a.OXYLABS_US_STATES;exports.OXYLABS_EUROPEAN_COUNTRIES=a.OXYLABS_EUROPEAN_COUNTRIES;exports.OXYLABS_ASIAN_COUNTRIES=a.OXYLABS_ASIAN_COUNTRIES;exports.getRandomBrowserType=a.getRandomBrowserType;exports.getRandomLocale=a.getRandomLocale;exports.getRandomGeoLocation=a.getRandomGeoLocation;var i="https://realtime.oxylabs.io/v1/queries";class d{config;http;authHeader;constructor(s){if(!s.username||!s.password)throw Error("Oxylabs username and password are required");this.config={username:s.username,password:s.password,browserType:s.browserType??"desktop",locale:s.locale??"en-US",geoLocation:s.geoLocation??"",render:s.render??!1,context:s.context??{},timeout:s.timeout??120000},this.http=new h({baseURL:i,timeout:this.config.timeout}),this.authHeader=`Basic ${Buffer.from(`${s.username}:${s.password}`).toString("base64")}`}async scrape(s,e){let t={...this.config,...e},r=this.buildRequestBody(s,t),o=(await this.http.postJson(i,r,{headers:{Authorization:this.authHeader,"Content-Type":"application/json"}})).data;if(o.error)throw Error(`Oxylabs API error: ${o.error}`);if(!o.results||o.results.length===0)throw Error("Oxylabs API returned no results");let n=o.results[0],l=n._response?.cookies||[],_=n._response?.headers||{};return{statusCode:n.status_code,url:n.url,content:n.content,cookies:l,headers:_,jobId:o.job_id||n.job_id,rendered:t.render,geoLocation:t.geoLocation||void 0,locale:t.locale,browserType:t.browserType,raw:o}}async scrapeMany(s,e,t=1000){let r=[];for(let u=0;u<s.length;u++){let o=await this.scrape(s[u],e);if(r.push(o),u<s.length-1&&t>0)await new Promise((n)=>setTimeout(n,t))}return r}buildRequestBody(s,e){let t=[];if(t.push({key:"return_page_cookies",value:!0}),t.push({key:"return_page_headers",value:!0}),e.context)for(let[u,o]of Object.entries(e.context))t.push({key:u,value:o});if(e.headers&&Object.keys(e.headers).length>0)t.push({key:"headers",value:e.headers});if(e.cookies&&e.cookies.length>0)t.push({key:"cookies",value:e.cookies});if(e.session_id)t.push({key:"session_id",value:e.session_id});if(e.http_method)t.push({key:"http_method",value:e.http_method});if(e.base64Body)t.push({key:"content",value:e.base64Body});if(typeof e.follow_redirects==="boolean")t.push({key:"follow_redirects",value:e.follow_redirects});if(e.successful_status_codes&&e.successful_status_codes.length>0)t.push({key:"successful_status_codes",value:e.successful_status_codes});let r={source:"universal",url:s,context:t};if(e.render||e.javascript_rendering)r.render="html";if(e.browserType)r.user_agent_type=e.browserType;if(e.locale)r.locale=e.locale;if(e.geoLocation)r.geo_location=e.geoLocation;if(e.returnAsBase64)r.content_encoding="base64";return r}getConfig(){return{...this.config,password:"***"}}withConfig(s){return new d({...this.config,...s})}async testConnection(){try{return await this.scrape("https://httpbin.org/ip"),!0}catch(s){throw Error(`Oxylabs connection test failed: ${s.message}`)}}}exports.Oxylabs=d;exports.default=d;module.exports=Object.assign(d,exports);
1
+ var{Rezo:c}=require("../../../core/rezo.cjs"),a=require("./options.cjs");exports.OXYLABS_BROWSER_TYPES=a.OXYLABS_BROWSER_TYPES;exports.OXYLABS_COMMON_LOCALES=a.OXYLABS_COMMON_LOCALES;exports.OXYLABS_COMMON_GEO_LOCATIONS=a.OXYLABS_COMMON_GEO_LOCATIONS;exports.OXYLABS_US_STATES=a.OXYLABS_US_STATES;exports.OXYLABS_EUROPEAN_COUNTRIES=a.OXYLABS_EUROPEAN_COUNTRIES;exports.OXYLABS_ASIAN_COUNTRIES=a.OXYLABS_ASIAN_COUNTRIES;exports.getRandomBrowserType=a.getRandomBrowserType;exports.getRandomLocale=a.getRandomLocale;exports.getRandomGeoLocation=a.getRandomGeoLocation;var i="https://realtime.oxylabs.io/v1/queries";class d{config;http;authHeader;constructor(s){if(!s.username||!s.password)throw Error("Oxylabs username and password are required");this.config={username:s.username,password:s.password,browserType:s.browserType??"desktop",locale:s.locale??"en-US",geoLocation:s.geoLocation??"",render:s.render??!1,context:s.context??{},timeout:s.timeout??120000},this.http=new c({baseURL:i,timeout:this.config.timeout}),this.authHeader=`Basic ${Buffer.from(`${s.username}:${s.password}`).toString("base64")}`}async scrape(s,e){let t={...this.config,...e},r=this.buildRequestBody(s,t),o=(await this.http.postJson(i,r,{headers:{Authorization:this.authHeader,"Content-Type":"application/json"}})).data;if(o.error)throw Error(`Oxylabs API error: ${o.error}`);if(!o.results||o.results.length===0)throw Error("Oxylabs API returned no results");let n=o.results[0],l=n._response?.cookies||[],h=n._response?.headers||{};return{statusCode:n.status_code,url:n.url,content:n.content,cookies:l,headers:h,jobId:o.job_id||n.job_id,rendered:t.render,geoLocation:t.geoLocation||void 0,locale:t.locale,browserType:t.browserType,raw:o}}async scrapeMany(s,e,t=1000){let r=[];for(let u=0;u<s.length;u++){let o=await this.scrape(s[u],e);if(r.push(o),u<s.length-1&&t>0)await new Promise((n)=>setTimeout(n,t))}return r}buildRequestBody(s,e){let t=[];if(t.push({key:"return_page_cookies",value:!0}),t.push({key:"return_page_headers",value:!0}),e.context)for(let[u,o]of Object.entries(e.context))t.push({key:u,value:o});if(e.headers&&Object.keys(e.headers).length>0)t.push({key:"headers",value:e.headers});if(e.cookies&&e.cookies.length>0)t.push({key:"cookies",value:e.cookies});if(e.session_id)t.push({key:"session_id",value:e.session_id});if(e.http_method)t.push({key:"http_method",value:e.http_method});if(e.base64Body)t.push({key:"content",value:e.base64Body});if(typeof e.follow_redirects==="boolean")t.push({key:"follow_redirects",value:e.follow_redirects});if(e.successful_status_codes&&e.successful_status_codes.length>0)t.push({key:"successful_status_codes",value:e.successful_status_codes});let r={source:"universal",url:s,context:t};if(e.render||e.javascript_rendering)r.render="html";if(e.browserType)r.user_agent_type=e.browserType;if(e.locale)r.locale=e.locale;if(e.geoLocation)r.geo_location=e.geoLocation;if(e.returnAsBase64)r.content_encoding="base64";return r}getConfig(){return{...this.config,password:"***"}}withConfig(s){return new d({...this.config,...s})}async testConnection(){try{return await this.scrape("https://httpbin.org/ip"),!0}catch(s){throw Error(`Oxylabs connection test failed: ${s.message}`)}}}exports.Oxylabs=d;exports.default=d;module.exports=Object.assign(d,exports);
@@ -1 +1 @@
1
- var{RezoQueue:y}=require("../queue/queue.cjs"),{Oxylabs:x}=require("./addon/oxylabs/index.cjs"),v=require("node:path"),A=require("node:os"),{Decodo:p}=require("./addon/decodo/index.cjs"),{Rezo:D}=require("../core/rezo.cjs");class l{static destroyQueue(e){if(e&&typeof e.destroy==="function")e.destroy()}static destroyConfigQueues(e){for(let r of e)l.destroyQueue(r.pqueue)}static splitConfigs(e,r){let s=[],a=[];for(let t of e)if(r(t))a.push(t);else s.push(t);return{kept:s,removed:a}}static getHostname(e){try{return new URL(e).hostname||void 0}catch{return}}static createStableThroughputOptions(e){let{baseUrl:r,concurrency:s=40,scraperConcurrency:a=10,retryDelay:t=1000,maxRetryAttempts:i=2,retryOnStatusCode:o=[408,500,502,503,504],maxWaitOn429:d=15000,alwaysWaitOn429:n=!1,globalLimiter:h={concurrency:8},domain:u=l.getHostname(r),domainLimiter:c={concurrency:2,interval:1000,intervalCap:2,randomDelay:150},domainRetry:m={enable:!0,max429Retries:2,retryDelay:1000,maxRetryAttempts:2,backoff:!0},extraLimiters:g=[],overrides:b={}}=e,f=[];if(h)f.push({isGlobal:!0,options:h});if(u&&c)f.push({domain:u,options:c,retry:m||void 0});return f.push(...g),{...{baseUrl:r,autoThrottle:!1,concurrency:s,scraperConcurrency:a,retryDelay:t,maxRetryAttempts:i,retryOnStatusCode:o,maxWaitOn429:d,alwaysWaitOn429:n,limiter:f.length>0?{enable:!0,limiters:f}:!1},...b,baseUrl:r}}baseUrl;adapter;enableNavigationHistory;sessionId;rejectUnauthorized;userAgent;useRndUserAgent;timeout;maxRedirects;maxRetryAttempts;retryDelay;retryOnStatusCode;forceRevisit;retryWithoutProxyOnStatusCode;retryOnProxyError;maxRetryOnProxyError;allowRevisiting;enableCache;cacheTTL;cacheDir;throwFatalError;debug;enableSignalHandlers;concurrency;scraperConcurrency;maxDepth;maxUrls;maxResponseSize;respectRobotsTxt;followNofollow;autoThrottle;autoThrottleTargetDelay;autoThrottleMinDelay;autoThrottleMaxDelay;maxWaitOn429;alwaysWaitOn429;stealth;oxylabs=[];decodo=[];stealthProfiles=[];proxies=[];limiters=[];onLimiterAdded;onProviderAdded;requestHeaders=[];userAgents=$();constructor(e={}){this.baseUrl=e.baseUrl||"",this.adapter=e.adapter??"http",this.enableNavigationHistory=e.enableNavigationHistory??!1,this.sessionId=e.sessionId??`session_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,this.rejectUnauthorized=e.rejectUnauthorized??!0,this.userAgent=e.userAgent,this.useRndUserAgent=e.useRndUserAgent??!1,this.timeout=e.timeout??30000,this.maxRedirects=e.maxRedirects??10,this.maxRetryAttempts=e.maxRetryAttempts??3,this.retryDelay=e.retryDelay??0,this.retryOnStatusCode=e.retryOnStatusCode??[408,429,500,502,503,504],this.forceRevisit=e.forceRevisit??!1,this.retryWithoutProxyOnStatusCode=e.retryWithoutProxyOnStatusCode??[407,403],this.retryOnProxyError=e.retryOnProxyError??!0,this.maxRetryOnProxyError=e.maxRetryOnProxyError??3,this.allowRevisiting=e.allowRevisiting??!1,this.enableCache=e.enableCache??!0,this.cacheTTL=e.cacheTTL??604800000,this.cacheDir=e.cacheDir??v.join(A.tmpdir(),"rezo_cache"),this.throwFatalError=e.throwFatalError??!1,this.debug=e.debug??!1,this.enableSignalHandlers=e.enableSignalHandlers??!1,this.concurrency=e.concurrency??100,this.scraperConcurrency=e.scraperConcurrency??this.concurrency,this.maxDepth=e.maxDepth??0,this.maxUrls=e.maxUrls??0,this.maxResponseSize=e.maxResponseSize??0,this.respectRobotsTxt=e.respectRobotsTxt??!1,this.followNofollow=e.followNofollow??!1,this.autoThrottle=e.autoThrottle??!0,this.autoThrottleTargetDelay=e.autoThrottleTargetDelay??1000,this.autoThrottleMinDelay=e.autoThrottleMinDelay??100,this.autoThrottleMaxDelay=e.autoThrottleMaxDelay??60000,this.maxWaitOn429=e.maxWaitOn429??1800000,this.alwaysWaitOn429=e.alwaysWaitOn429??!1,this._addHeaders(e.headers),this._addOxylabs(e.oxylabs),this._addDecodo(e.decodo),this._addProxies(e.proxy),this._addLimiters(e.limiter),this._addStealths(e.stealths),this.stealth=e.stealth}getConfiguredDomains(e){return(e==="headers"?this.requestHeaders:e==="limiters"?this.limiters:e==="oxylabs"?this.oxylabs:e==="decodo"?this.decodo:e==="stealth"?this.stealthProfiles:this.proxies).filter((s)=>s.domain).map((s)=>s.domain).filter((s,a,t)=>t.indexOf(s)===a)}removeDomain(e){this.requestHeaders=this.requestHeaders.filter((t)=>!t.domain||!this._domainsEqual(t.domain,e)),this.proxies=this.proxies.filter((t)=>!t.domain||!this._domainsEqual(t.domain,e));let r=l.splitConfigs(this.limiters,(t)=>!!t.domain&&this._domainsEqual(t.domain,e));l.destroyConfigQueues(r.removed),this.limiters=r.kept;let s=l.splitConfigs(this.oxylabs,(t)=>!!t.domain&&this._domainsEqual(t.domain,e));l.destroyConfigQueues(s.removed),this.oxylabs=s.kept;let a=l.splitConfigs(this.decodo,(t)=>!!t.domain&&this._domainsEqual(t.domain,e));return l.destroyConfigQueues(a.removed),this.decodo=a.kept,this.stealthProfiles=this.stealthProfiles.filter((t)=>!t.domain||!this._domainsEqual(t.domain,e)),this}_domainsEqual(e,r){if(Array.isArray(e)&&Array.isArray(r))return e.length===r.length&&e.every((s,a)=>s===r[a]);return e===r}getConfigurationSummary(){let e=(r)=>({total:r.length,global:r.filter((s)=>s.isGlobal).length,domainSpecific:r.filter((s)=>!s.isGlobal&&s.domain).length});return{headers:e(this.requestHeaders),proxies:e(this.proxies),limiters:e(this.limiters),oxylabs:e(this.oxylabs),decodo:e(this.decodo)}}_addHeaders(e){if(!e||!e.enable)return;for(let r of e.httpHeaders){let{domain:s,isGlobal:a,headers:t}=r;if(!s&&!a)continue;if(t instanceof Headers){let i=Object.fromEntries(t.entries());if(Object.keys(i).length<1)continue;t=i}else if(!t||Object.keys(t).length<1)continue;this.requestHeaders.push({domain:s,isGlobal:a,headers:t})}}_addProxies(e){if(!e||!e.enable)return;for(let r of e.proxies){let{domain:s,isGlobal:a,proxy:t,rotating:i}=r;if(!s&&!a)continue;if(!t||Object.keys(t).length<1)continue;this.proxies.push({domain:s,isGlobal:a,proxy:t,rotating:!!i})}}_addLimiters(e){if(!e||!e.enable)return;for(let r of e.limiters){let{domain:s,isGlobal:a,options:t,retry:i}=r;if(!s&&!a)continue;if(!t&&!i)continue;let o=t?new y(t):new y({name:"limiter"});if(this.limiters.push({domain:s,isGlobal:a,pqueue:o,randomDelay:t?.randomDelay,retry:i}),this.onLimiterAdded)this.onLimiterAdded(o)}}_addOxylabs(e){if(!e||!e.enable)return;for(let r of e.labs){let{domain:s,isGlobal:a,options:t,queueOptions:i}=r;if(!s&&!a)continue;if(!t||Object.keys(t).length<1)continue;let o=i?new y(i):void 0;if(this.oxylabs.push({domain:s,isGlobal:a,adaptar:new x(t),pqueue:o}),o&&this.onProviderAdded)this.onProviderAdded(o)}}_addDecodo(e){if(!e||!e.enable)return;for(let r of e.labs){let{domain:s,isGlobal:a,options:t,queueOptions:i}=r;if(!s&&!a)continue;if(!t||Object.keys(t).length<1)continue;let o=i?new y(i):void 0;if(this.decodo.push({domain:s,isGlobal:a,adaptar:new p(t),pqueue:o}),o&&this.onProviderAdded)this.onProviderAdded(o)}}_addStealths(e){if(!e||!e.enable)return;for(let r of e.profiles){let{domain:s,isGlobal:a,stealth:t}=r;if(!s&&!a)continue;if(!t)continue;this.stealthProfiles.push({domain:s,isGlobal:a,adaptar:new D({stealth:t})})}}addHeaders(e){return this._addHeaders({enable:!0,httpHeaders:[e]}),this}addProxy(e){return this._addProxies({enable:!0,proxies:[e]}),this}addProxies(e){return this._addProxies({enable:!0,proxies:e}),this}getProxyConfig(e,r,s){let a=this.selectConfigEntry(e,this.proxies,r,s);if(!a)return null;return{proxy:a.proxy,rotating:!!a.rotating}}addLimiter(e){return this._addLimiters({enable:!0,limiters:[e]}),this}addOxylabs(e){return this._addOxylabs({enable:!0,labs:[e]}),this}addDecodo(e){return this._addDecodo({enable:!0,labs:[e]}),this}addStealth(e){return this._addStealths({enable:!0,profiles:[e]}),this}destroyLimiters(){for(let e of this.limiters)l.destroyQueue(e.pqueue);this.limiters=[]}destroyProviderQueues(){for(let e of this.oxylabs)l.destroyQueue(e.pqueue),delete e.pqueue;for(let e of this.decodo)l.destroyQueue(e.pqueue),delete e.pqueue}getLimiters(){return this.limiters}getRandomDelay(e,r){if(!this.getDomainName(e))return;for(let a of this.limiters)if(this._hasDomain(e,a.domain)&&a.randomDelay!==void 0)return a.randomDelay;if(r){for(let a of this.limiters)if(a.isGlobal&&a.randomDelay!==void 0)return a.randomDelay}return}clearGlobalConfigs(){if(Array.isArray(this.requestHeaders))this.requestHeaders=this.requestHeaders.filter((e)=>!e.isGlobal);if(Array.isArray(this.oxylabs)){let e=l.splitConfigs(this.oxylabs,(r)=>!!r.isGlobal);l.destroyConfigQueues(e.removed),this.oxylabs=e.kept}if(Array.isArray(this.decodo)){let e=l.splitConfigs(this.decodo,(r)=>!!r.isGlobal);l.destroyConfigQueues(e.removed),this.decodo=e.kept}if(Array.isArray(this.limiters)){let e=l.splitConfigs(this.limiters,(r)=>!!r.isGlobal);l.destroyConfigQueues(e.removed),this.limiters=e.kept}if(Array.isArray(this.proxies))this.proxies=this.proxies.filter((e)=>!e.isGlobal);if(Array.isArray(this.stealthProfiles))this.stealthProfiles=this.stealthProfiles.filter((e)=>!e.isGlobal);return this}getAdapter(e,r,s,a){if(!this.getDomainName(e))return null;let i=r==="headers"?this.requestHeaders:r==="limiters"?this.limiters:r==="oxylabs"?this.oxylabs:r==="decodo"?this.decodo:r==="stealth"?this.stealthProfiles:this.proxies,o=this.selectConfigEntry(e,i,s,a);if(!o)return null;return r==="headers"?o.headers:r==="limiters"?o.pqueue:r==="oxylabs"?o.adaptar:r==="decodo"?o.adaptar:r==="stealth"?o.adaptar:o.proxy}getRetryOptions(e){if(!this.getDomainName(e))return null;for(let s=0;s<this.limiters.length;s++)if(this._hasDomain(e,this.limiters[s].domain))return this.limiters[s].retry||null;for(let s=0;s<this.limiters.length;s++)if(this.limiters[s].isGlobal&&this.limiters[s].retry)return this.limiters[s].retry;return null}rnd(e=0,r=Number.MAX_VALUE){return Math.floor(Math.random()*(r-e+1))+e}hasDomain(e,r,s){if(!this.getDomainName(e))return!1;let t=r==="headers"?this.requestHeaders:r==="limiters"?this.limiters:r==="oxylabs"?this.oxylabs:r==="decodo"?this.decodo:r==="stealth"?this.stealthProfiles:this.proxies;for(let i=0;i<t.length;i++)if(this._hasDomain(e,t[i].domain))return!0;if(s){for(let i=0;i<t.length;i++)if(t[i].isGlobal)return!0}return!1}pickHeaders(e,r,s,a){let t=this.getAdapter(e,"headers",r),i=new Headers(t??{}),o=i.count;if(s&&s instanceof Headers)for(let[d,n]of Object.entries(s.entries()))i.set(d,n);else if(s&&typeof s==="object"){for(let[d,n]of Object.entries(s))if(typeof n==="string")i.set(d,n)}if(a&&o===0&&!this.stealth)i.set("user-agent",this.getRandomUserAgent());return Object.fromEntries(i.entries())}_hasDomain(e,r){if(!r)return!1;let s=this.getDomainName(e);if(!s)return!1;let a=(i)=>{return/[\^\$\*\+\?\{\}\[\]\(\)\|\\]/.test(i)||i.startsWith("/")||i.includes(".*")||i.includes(".+")},t=(i)=>{if(i instanceof RegExp)return i.test(s)||i.test(e);let o=i.toString().trim();if(s.toLowerCase()===o.toLowerCase())return!0;if(o.includes("*")){let h=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/\\\*/g,".*"),u=new RegExp(`^${h}$`,"i");return u.test(s)||u.test(e)}if(a(o))try{let h=o,u="i",c=o.match(/^\/(.*)\/(\w*)$/);if(c)h=c[1],u=c[2]||"i";let m=new RegExp(h,u);return m.test(s)||m.test(e)}catch(h){return s.toLowerCase().includes(o.toLowerCase())}let d=s.toLowerCase(),n=o.toLowerCase();return d===n||d.endsWith("."+n)||n.endsWith("."+d)};if(Array.isArray(r)){for(let i of r)if(t(i))return!0;return!1}return t(r)}selectConfigEntry(e,r,s,a){if(!this.getDomainName(e))return null;let i=(n)=>{if(!n.length)return null;let h=a?this.rnd(0,n.length-1):0;return n[h]},o=[];for(let n of r)if(this._hasDomain(e,n.domain))o.push(n);let d=i(o);if(d)return d;if(s){let n=[];for(let h of r)if(h.isGlobal)n.push(h);return i(n)}return null}getDomainName(e){if(this.isValidUrl(e))return new URL(e).hostname;else if(this.isHostName(e))return e;return null}isHostName(e){if(!e)return!1;if(e.length>255)return!1;let r=/^(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+ [a-zA-Z]{2,})$/;return e=e.trim().toLowerCase(),r.test(e)&&!e.startsWith("-")&&!e.endsWith("-")}isValidUrl(e){if(!e)return!1;e=e.trim();try{let r=new URL(e);if(!r.protocol||!["http:","https:"].includes(r.protocol.toLowerCase()))return!1;if(!r.hostname)return!1;if(!/^(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,})$/.test(r.hostname))return!1;return!0}catch{return!1}}getRandomUserAgent(){return this.userAgents[Math.floor(Math.random()*this.userAgents.length)]}}function $(){let e=[{name:"Chrome",version:"91.0.4472.124",engine:"AppleWebKit/537.36"},{name:"Firefox",version:"89.0",engine:"Gecko/20100101"},{name:"Safari",version:"14.1.1",engine:"AppleWebKit/605.1.15"},{name:"Edge",version:"91.0.864.59",engine:"AppleWebKit/537.36"},{name:"Opera",version:"77.0.4054.277",engine:"AppleWebKit/537.36"},{name:"Vivaldi",version:"3.8.2259.42",engine:"AppleWebKit/537.36"},{name:"Brave",version:"1.26.74",engine:"AppleWebKit/537.36"},{name:"Chromium",version:"91.0.4472.101",engine:"AppleWebKit/537.36"},{name:"Yandex",version:"21.5.3.742",engine:"AppleWebKit/537.36"},{name:"Maxthon",version:"5.3.8.2000",engine:"AppleWebKit/537.36"}],r=["Windows NT 10.0","Windows NT 6.1","Macintosh; Intel Mac OS X 10_15_7","Macintosh; Intel Mac OS X 11_4_0","X11; Linux x86_64","X11; Ubuntu; Linux x86_64"],s=[];for(let a=0;a<200;a++){let t=e[Math.floor(Math.random()*e.length)],i=r[Math.floor(Math.random()*r.length)],o="";switch(t.name){case"Chrome":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chrome/${t.version} Safari/537.36`;break;case"Firefox":o=`Mozilla/5.0 (${i}; rv:${t.version}) ${t.engine} Firefox/${t.version}`;break;case"Safari":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Version/${t.version} Safari/605.1.15`;break;case"Edge":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chrome/${t.version} Safari/537.36 Edg/${t.version}`;break;case"Opera":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chrome/${t.version} Safari/537.36 OPR/${t.version}`;break;case"Vivaldi":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chrome/${t.version} Safari/537.36 Vivaldi/${t.version}`;break;case"Brave":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chrome/${t.version} Safari/537.36 Brave/${t.version}`;break;case"Chromium":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chromium/${t.version} Chrome/${t.version} Safari/537.36`;break;case"Yandex":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chrome/${t.version} YaBrowser/${t.version} Safari/537.36`;break;case"Maxthon":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chrome/${t.version} Safari/537.36 Maxthon/${t.version}`;break}s.push(o)}return s}exports.CrawlerOptions=l;
1
+ var{RezoQueue:y}=require("../queue/queue.cjs"),{Oxylabs:x}=require("./addon/oxylabs/index.cjs"),v=require("node:path"),A=require("node:os"),{Decodo:p}=require("./addon/decodo/index.cjs"),{Rezo:D}=require("../core/rezo.cjs");class l{static destroyQueue(e){if(e&&typeof e.destroy==="function")e.destroy()}static destroyConfigQueues(e){for(let r of e)l.destroyQueue(r.pqueue)}static splitConfigs(e,r){let s=[],a=[];for(let t of e)if(r(t))a.push(t);else s.push(t);return{kept:s,removed:a}}static getHostname(e){try{return new URL(e).hostname||void 0}catch{return}}static createStableThroughputOptions(e){let{baseUrl:r,concurrency:s=40,scraperConcurrency:a=10,retryDelay:t=1000,maxRetryAttempts:i=2,retryOnStatusCode:o=[408,500,502,503,504],maxWaitOn429:d=15000,alwaysWaitOn429:n=!1,globalLimiter:h={concurrency:8},domain:u=l.getHostname(r),domainLimiter:c={concurrency:2,interval:1000,intervalCap:2,randomDelay:150},domainRetry:m={enable:!0,max429Retries:2,retryDelay:1000,maxRetryAttempts:2,backoff:!0},extraLimiters:g=[],overrides:b={}}=e,f=[];if(h)f.push({isGlobal:!0,options:h});if(u&&c)f.push({domain:u,options:c,retry:m||void 0});return f.push(...g),{...{baseUrl:r,autoThrottle:!1,concurrency:s,scraperConcurrency:a,retryDelay:t,maxRetryAttempts:i,retryOnStatusCode:o,maxWaitOn429:d,alwaysWaitOn429:n,limiter:f.length>0?{enable:!0,limiters:f}:!1},...b,baseUrl:r}}baseUrl;adapter;enableNavigationHistory;sessionId;rejectUnauthorized;userAgent;useRndUserAgent;timeout;maxRedirects;maxRetryAttempts;retryDelay;retryOnStatusCode;forceRevisit;retryWithoutProxyOnStatusCode;retryOnProxyError;maxRetryOnProxyError;allowRevisiting;enableCache;cacheTTL;cacheDir;throwFatalError;debug;enableSignalHandlers;concurrency;scraperConcurrency;maxDepth;maxUrls;maxResponseSize;respectRobotsTxt;followNofollow;autoThrottle;autoThrottleTargetDelay;autoThrottleMinDelay;autoThrottleMaxDelay;maxWaitOn429;alwaysWaitOn429;stealth;oxylabs=[];decodo=[];stealthProfiles=[];proxies=[];limiters=[];onLimiterAdded;onProviderAdded;requestHeaders=[];userAgents=$();constructor(e={}){this.baseUrl=e.baseUrl||"",this.adapter=e.adapter??"http",this.enableNavigationHistory=e.enableNavigationHistory??!1,this.sessionId=e.sessionId??`session_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,this.rejectUnauthorized=e.rejectUnauthorized??!0,this.userAgent=e.userAgent,this.useRndUserAgent=e.useRndUserAgent??!1,this.timeout=e.timeout??30000,this.maxRedirects=e.maxRedirects??10,this.maxRetryAttempts=e.maxRetryAttempts??3,this.retryDelay=e.retryDelay??0,this.retryOnStatusCode=e.retryOnStatusCode??[408,429,500,502,503,504],this.forceRevisit=e.forceRevisit??!1,this.retryWithoutProxyOnStatusCode=e.retryWithoutProxyOnStatusCode??[407,403],this.retryOnProxyError=e.retryOnProxyError??!0,this.maxRetryOnProxyError=e.maxRetryOnProxyError??3,this.allowRevisiting=e.allowRevisiting??!1,this.enableCache=e.enableCache??!0,this.cacheTTL=e.cacheTTL??604800000,this.cacheDir=e.cacheDir??v.join(A.tmpdir(),"rezo_cache"),this.throwFatalError=e.throwFatalError??!1,this.debug=e.debug??!1,this.enableSignalHandlers=e.enableSignalHandlers??!1,this.concurrency=e.concurrency??100,this.scraperConcurrency=e.scraperConcurrency??this.concurrency,this.maxDepth=e.maxDepth??0,this.maxUrls=e.maxUrls??0,this.maxResponseSize=e.maxResponseSize??0,this.respectRobotsTxt=e.respectRobotsTxt??!1,this.followNofollow=e.followNofollow??!1,this.autoThrottle=e.autoThrottle??!0,this.autoThrottleTargetDelay=e.autoThrottleTargetDelay??1000,this.autoThrottleMinDelay=e.autoThrottleMinDelay??100,this.autoThrottleMaxDelay=e.autoThrottleMaxDelay??60000,this.maxWaitOn429=e.maxWaitOn429??1800000,this.alwaysWaitOn429=e.alwaysWaitOn429??!1,this._addHeaders(e.headers),this._addOxylabs(e.oxylabs),this._addDecodo(e.decodo),this._addProxies(e.proxy),this._addLimiters(e.limiter),this._addStealths(e.stealths),this.stealth=e.stealth}getConfiguredDomains(e){return(e==="headers"?this.requestHeaders:e==="limiters"?this.limiters:e==="oxylabs"?this.oxylabs:e==="decodo"?this.decodo:e==="stealth"?this.stealthProfiles:this.proxies).filter((s)=>s.domain).map((s)=>s.domain).filter((s,a,t)=>t.indexOf(s)===a)}removeDomain(e){this.requestHeaders=this.requestHeaders.filter((t)=>!t.domain||!this._domainsEqual(t.domain,e)),this.proxies=this.proxies.filter((t)=>!t.domain||!this._domainsEqual(t.domain,e));let r=l.splitConfigs(this.limiters,(t)=>!!t.domain&&this._domainsEqual(t.domain,e));l.destroyConfigQueues(r.removed),this.limiters=r.kept;let s=l.splitConfigs(this.oxylabs,(t)=>!!t.domain&&this._domainsEqual(t.domain,e));l.destroyConfigQueues(s.removed),this.oxylabs=s.kept;let a=l.splitConfigs(this.decodo,(t)=>!!t.domain&&this._domainsEqual(t.domain,e));return l.destroyConfigQueues(a.removed),this.decodo=a.kept,this.stealthProfiles=this.stealthProfiles.filter((t)=>!t.domain||!this._domainsEqual(t.domain,e)),this}_domainsEqual(e,r){if(Array.isArray(e)&&Array.isArray(r))return e.length===r.length&&e.every((s,a)=>s===r[a]);return e===r}getConfigurationSummary(){let e=(r)=>({total:r.length,global:r.filter((s)=>s.isGlobal).length,domainSpecific:r.filter((s)=>!s.isGlobal&&s.domain).length});return{headers:e(this.requestHeaders),proxies:e(this.proxies),limiters:e(this.limiters),oxylabs:e(this.oxylabs),decodo:e(this.decodo)}}_addHeaders(e){if(!e||!e.enable)return;for(let r of e.httpHeaders){let{domain:s,isGlobal:a,headers:t}=r;if(!s&&!a)continue;if(t instanceof Headers){let i=Object.fromEntries(t.entries());if(Object.keys(i).length<1)continue;t=i}else if(!t||Object.keys(t).length<1)continue;this.requestHeaders.push({domain:s,isGlobal:a,headers:t})}}_addProxies(e){if(!e||!e.enable)return;for(let r of e.proxies){let{domain:s,isGlobal:a,proxy:t,rotating:i}=r;if(!s&&!a)continue;if(!t||Object.keys(t).length<1)continue;this.proxies.push({domain:s,isGlobal:a,proxy:t,rotating:!!i})}}_addLimiters(e){if(!e||!e.enable)return;for(let r of e.limiters){let{domain:s,isGlobal:a,options:t,retry:i}=r;if(!s&&!a)continue;if(!t&&!i)continue;let o=t?new y(t):new y({name:"limiter"});if(this.limiters.push({domain:s,isGlobal:a,pqueue:o,randomDelay:t?.randomDelay,retry:i}),this.onLimiterAdded)this.onLimiterAdded(o)}}_addOxylabs(e){if(!e||!e.enable)return;for(let r of e.labs){let{domain:s,isGlobal:a,options:t,queueOptions:i}=r;if(!s&&!a)continue;if(!t||Object.keys(t).length<1)continue;let o=i?new y(i):void 0;if(this.oxylabs.push({domain:s,isGlobal:a,adaptar:new x(t),pqueue:o}),o&&this.onProviderAdded)this.onProviderAdded(o)}}_addDecodo(e){if(!e||!e.enable)return;for(let r of e.labs){let{domain:s,isGlobal:a,options:t,queueOptions:i}=r;if(!s&&!a)continue;if(!t||Object.keys(t).length<1)continue;let o=i?new y(i):void 0;if(this.decodo.push({domain:s,isGlobal:a,adaptar:new p(t),pqueue:o}),o&&this.onProviderAdded)this.onProviderAdded(o)}}_addStealths(e){if(!e||!e.enable)return;for(let r of e.profiles){let{domain:s,isGlobal:a,stealth:t}=r;if(!s&&!a)continue;if(!t)continue;this.stealthProfiles.push({domain:s,isGlobal:a,adaptar:new D({stealth:t})})}}addHeaders(e){return this._addHeaders({enable:!0,httpHeaders:[e]}),this}addProxy(e){return this._addProxies({enable:!0,proxies:[e]}),this}addProxies(e){return this._addProxies({enable:!0,proxies:e}),this}getProxyConfig(e,r,s){let a=this.selectConfigEntry(e,this.proxies,r,s);if(!a)return null;return{proxy:a.proxy,rotating:!!a.rotating}}addLimiter(e){return this._addLimiters({enable:!0,limiters:[e]}),this}addOxylabs(e){return this._addOxylabs({enable:!0,labs:[e]}),this}addDecodo(e){return this._addDecodo({enable:!0,labs:[e]}),this}addStealth(e){return this._addStealths({enable:!0,profiles:[e]}),this}destroyLimiters(){for(let e of this.limiters)l.destroyQueue(e.pqueue);this.limiters=[]}destroyProviderQueues(){for(let e of this.oxylabs)l.destroyQueue(e.pqueue),delete e.pqueue;for(let e of this.decodo)l.destroyQueue(e.pqueue),delete e.pqueue}getLimiters(){return this.limiters}getRandomDelay(e,r){if(!this.getDomainName(e))return;for(let a of this.limiters)if(this._hasDomain(e,a.domain)&&a.randomDelay!==void 0)return a.randomDelay;if(r){for(let a of this.limiters)if(a.isGlobal&&a.randomDelay!==void 0)return a.randomDelay}return}clearGlobalConfigs(){if(Array.isArray(this.requestHeaders))this.requestHeaders=this.requestHeaders.filter((e)=>!e.isGlobal);if(Array.isArray(this.oxylabs)){let e=l.splitConfigs(this.oxylabs,(r)=>!!r.isGlobal);l.destroyConfigQueues(e.removed),this.oxylabs=e.kept}if(Array.isArray(this.decodo)){let e=l.splitConfigs(this.decodo,(r)=>!!r.isGlobal);l.destroyConfigQueues(e.removed),this.decodo=e.kept}if(Array.isArray(this.limiters)){let e=l.splitConfigs(this.limiters,(r)=>!!r.isGlobal);l.destroyConfigQueues(e.removed),this.limiters=e.kept}if(Array.isArray(this.proxies))this.proxies=this.proxies.filter((e)=>!e.isGlobal);if(Array.isArray(this.stealthProfiles))this.stealthProfiles=this.stealthProfiles.filter((e)=>!e.isGlobal);return this}getAdapter(e,r,s,a){if(!this.getDomainName(e))return null;let i=r==="headers"?this.requestHeaders:r==="limiters"?this.limiters:r==="oxylabs"?this.oxylabs:r==="decodo"?this.decodo:r==="stealth"?this.stealthProfiles:this.proxies,o=this.selectConfigEntry(e,i,s,a);if(!o)return null;return r==="headers"?o.headers:r==="limiters"?o.pqueue:r==="oxylabs"?o.adaptar:r==="decodo"?o.adaptar:r==="stealth"?o.adaptar:o.proxy}getRetryOptions(e){if(!this.getDomainName(e))return null;for(let s=0;s<this.limiters.length;s++)if(this._hasDomain(e,this.limiters[s].domain))return this.limiters[s].retry||null;for(let s=0;s<this.limiters.length;s++)if(this.limiters[s].isGlobal&&this.limiters[s].retry)return this.limiters[s].retry;return null}rnd(e=0,r=Number.MAX_VALUE){return Math.floor(Math.random()*(r-e+1))+e}hasDomain(e,r,s){if(!this.getDomainName(e))return!1;let t=r==="headers"?this.requestHeaders:r==="limiters"?this.limiters:r==="oxylabs"?this.oxylabs:r==="decodo"?this.decodo:r==="stealth"?this.stealthProfiles:this.proxies;for(let i=0;i<t.length;i++)if(this._hasDomain(e,t[i].domain))return!0;if(s){for(let i=0;i<t.length;i++)if(t[i].isGlobal)return!0}return!1}pickHeaders(e,r,s,a){let t=this.getAdapter(e,"headers",r),i=new Headers(t??{}),o=[...i.keys()].length;if(s&&s instanceof Headers)for(let[d,n]of Object.entries(s.entries()))i.set(d,n);else if(s&&typeof s==="object"){for(let[d,n]of Object.entries(s))if(typeof n==="string")i.set(d,n)}if(a&&o===0&&!this.stealth)i.set("user-agent",this.getRandomUserAgent());return Object.fromEntries(i.entries())}_hasDomain(e,r){if(!r)return!1;let s=this.getDomainName(e);if(!s)return!1;let a=(i)=>{return/[\^\$\*\+\?\{\}\[\]\(\)\|\\]/.test(i)||i.startsWith("/")||i.includes(".*")||i.includes(".+")},t=(i)=>{if(i instanceof RegExp)return i.test(s)||i.test(e);let o=i.toString().trim();if(s.toLowerCase()===o.toLowerCase())return!0;if(o.includes("*")){let h=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/\\\*/g,".*"),u=new RegExp(`^${h}$`,"i");return u.test(s)||u.test(e)}if(a(o))try{let h=o,u="i",c=o.match(/^\/(.*)\/(\w*)$/);if(c)h=c[1],u=c[2]||"i";let m=new RegExp(h,u);return m.test(s)||m.test(e)}catch(h){return s.toLowerCase().includes(o.toLowerCase())}let d=s.toLowerCase(),n=o.toLowerCase();return d===n||d.endsWith("."+n)||n.endsWith("."+d)};if(Array.isArray(r)){for(let i of r)if(t(i))return!0;return!1}return t(r)}selectConfigEntry(e,r,s,a){if(!this.getDomainName(e))return null;let i=(n)=>{if(!n.length)return null;let h=a?this.rnd(0,n.length-1):0;return n[h]},o=[];for(let n of r)if(this._hasDomain(e,n.domain))o.push(n);let d=i(o);if(d)return d;if(s){let n=[];for(let h of r)if(h.isGlobal)n.push(h);return i(n)}return null}getDomainName(e){if(this.isValidUrl(e))return new URL(e).hostname;else if(this.isHostName(e))return e;return null}isHostName(e){if(!e)return!1;if(e.length>255)return!1;let r=/^(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+ [a-zA-Z]{2,})$/;return e=e.trim().toLowerCase(),r.test(e)&&!e.startsWith("-")&&!e.endsWith("-")}isValidUrl(e){if(!e)return!1;e=e.trim();try{let r=new URL(e);if(!r.protocol||!["http:","https:"].includes(r.protocol.toLowerCase()))return!1;if(!r.hostname)return!1;if(!/^(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,})$/.test(r.hostname))return!1;return!0}catch{return!1}}getRandomUserAgent(){return this.userAgents[Math.floor(Math.random()*this.userAgents.length)]}}function $(){let e=[{name:"Chrome",version:"91.0.4472.124",engine:"AppleWebKit/537.36"},{name:"Firefox",version:"89.0",engine:"Gecko/20100101"},{name:"Safari",version:"14.1.1",engine:"AppleWebKit/605.1.15"},{name:"Edge",version:"91.0.864.59",engine:"AppleWebKit/537.36"},{name:"Opera",version:"77.0.4054.277",engine:"AppleWebKit/537.36"},{name:"Vivaldi",version:"3.8.2259.42",engine:"AppleWebKit/537.36"},{name:"Brave",version:"1.26.74",engine:"AppleWebKit/537.36"},{name:"Chromium",version:"91.0.4472.101",engine:"AppleWebKit/537.36"},{name:"Yandex",version:"21.5.3.742",engine:"AppleWebKit/537.36"},{name:"Maxthon",version:"5.3.8.2000",engine:"AppleWebKit/537.36"}],r=["Windows NT 10.0","Windows NT 6.1","Macintosh; Intel Mac OS X 10_15_7","Macintosh; Intel Mac OS X 11_4_0","X11; Linux x86_64","X11; Ubuntu; Linux x86_64"],s=[];for(let a=0;a<200;a++){let t=e[Math.floor(Math.random()*e.length)],i=r[Math.floor(Math.random()*r.length)],o="";switch(t.name){case"Chrome":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chrome/${t.version} Safari/537.36`;break;case"Firefox":o=`Mozilla/5.0 (${i}; rv:${t.version}) ${t.engine} Firefox/${t.version}`;break;case"Safari":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Version/${t.version} Safari/605.1.15`;break;case"Edge":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chrome/${t.version} Safari/537.36 Edg/${t.version}`;break;case"Opera":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chrome/${t.version} Safari/537.36 OPR/${t.version}`;break;case"Vivaldi":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chrome/${t.version} Safari/537.36 Vivaldi/${t.version}`;break;case"Brave":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chrome/${t.version} Safari/537.36 Brave/${t.version}`;break;case"Chromium":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chromium/${t.version} Chrome/${t.version} Safari/537.36`;break;case"Yandex":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chrome/${t.version} YaBrowser/${t.version} Safari/537.36`;break;case"Maxthon":o=`Mozilla/5.0 (${i}) ${t.engine} (KHTML, like Gecko) Chrome/${t.version} Safari/537.36 Maxthon/${t.version}`;break}s.push(o)}return s}exports.CrawlerOptions=l;