rezo 1.0.76 → 1.0.78

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.
@@ -4582,7 +4582,7 @@ export interface RezoInstance extends Rezo {
4582
4582
  *
4583
4583
  * IMPORTANT: Update these values when bumping package version.
4584
4584
  */
4585
- export declare const VERSION = "1.0.76";
4585
+ export declare const VERSION = "1.0.78";
4586
4586
  /**
4587
4587
  * cURL Options Configuration
4588
4588
  *
@@ -4582,7 +4582,7 @@ export interface RezoInstance extends Rezo {
4582
4582
  *
4583
4583
  * IMPORTANT: Update these values when bumping package version.
4584
4584
  */
4585
- export declare const VERSION = "1.0.76";
4585
+ export declare const VERSION = "1.0.78";
4586
4586
  export declare const isRezoError: typeof RezoError.isRezoError;
4587
4587
  export declare const Cancel: typeof RezoError;
4588
4588
  export declare const CancelToken: {
@@ -4582,7 +4582,7 @@ export interface RezoInstance extends Rezo {
4582
4582
  *
4583
4583
  * IMPORTANT: Update these values when bumping package version.
4584
4584
  */
4585
- export declare const VERSION = "1.0.76";
4585
+ export declare const VERSION = "1.0.78";
4586
4586
  /**
4587
4587
  * Type guard to check if an error is a RezoError instance.
4588
4588
  */
@@ -4582,7 +4582,7 @@ export interface RezoInstance extends Rezo {
4582
4582
  *
4583
4583
  * IMPORTANT: Update these values when bumping package version.
4584
4584
  */
4585
- export declare const VERSION = "1.0.76";
4585
+ export declare const VERSION = "1.0.78";
4586
4586
  export declare const isRezoError: typeof RezoError.isRezoError;
4587
4587
  export declare const Cancel: typeof RezoError;
4588
4588
  export declare const CancelToken: {
@@ -4582,7 +4582,7 @@ export interface RezoInstance extends Rezo {
4582
4582
  *
4583
4583
  * IMPORTANT: Update these values when bumping package version.
4584
4584
  */
4585
- export declare const VERSION = "1.0.76";
4585
+ export declare const VERSION = "1.0.78";
4586
4586
  export declare const isRezoError: typeof RezoError.isRezoError;
4587
4587
  export declare const Cancel: typeof RezoError;
4588
4588
  export declare const CancelToken: {
@@ -4582,7 +4582,7 @@ export interface RezoInstance extends Rezo {
4582
4582
  *
4583
4583
  * IMPORTANT: Update these values when bumping package version.
4584
4584
  */
4585
- export declare const VERSION = "1.0.76";
4585
+ export declare const VERSION = "1.0.78";
4586
4586
  export declare const isRezoError: typeof RezoError.isRezoError;
4587
4587
  export declare const Cancel: typeof RezoError;
4588
4588
  export declare const CancelToken: {
@@ -1,6 +1,6 @@
1
- const _mod_p2iotn = require('./picker.cjs');
2
- exports.detectRuntime = _mod_p2iotn.detectRuntime;
3
- exports.getAdapterCapabilities = _mod_p2iotn.getAdapterCapabilities;
4
- exports.buildAdapterContext = _mod_p2iotn.buildAdapterContext;
5
- exports.getAvailableAdapters = _mod_p2iotn.getAvailableAdapters;
6
- exports.selectAdapter = _mod_p2iotn.selectAdapter;;
1
+ const _mod_qvllzl = require('./picker.cjs');
2
+ exports.detectRuntime = _mod_qvllzl.detectRuntime;
3
+ exports.getAdapterCapabilities = _mod_qvllzl.getAdapterCapabilities;
4
+ exports.buildAdapterContext = _mod_qvllzl.buildAdapterContext;
5
+ exports.getAvailableAdapters = _mod_qvllzl.getAvailableAdapters;
6
+ exports.selectAdapter = _mod_qvllzl.selectAdapter;;
@@ -1,9 +1,9 @@
1
- const _mod_zvxqrg = require('./lru-cache.cjs');
2
- exports.LRUCache = _mod_zvxqrg.LRUCache;;
3
- const _mod_u7bdfq = require('./dns-cache.cjs');
4
- exports.DNSCache = _mod_u7bdfq.DNSCache;
5
- exports.getGlobalDNSCache = _mod_u7bdfq.getGlobalDNSCache;
6
- exports.resetGlobalDNSCache = _mod_u7bdfq.resetGlobalDNSCache;;
7
- const _mod_cjcq8q = require('./response-cache.cjs');
8
- exports.ResponseCache = _mod_cjcq8q.ResponseCache;
9
- exports.normalizeResponseCacheConfig = _mod_cjcq8q.normalizeResponseCacheConfig;;
1
+ const _mod_g8wjr4 = require('./lru-cache.cjs');
2
+ exports.LRUCache = _mod_g8wjr4.LRUCache;;
3
+ const _mod_m9iqi3 = require('./dns-cache.cjs');
4
+ exports.DNSCache = _mod_m9iqi3.DNSCache;
5
+ exports.getGlobalDNSCache = _mod_m9iqi3.getGlobalDNSCache;
6
+ exports.resetGlobalDNSCache = _mod_m9iqi3.resetGlobalDNSCache;;
7
+ const _mod_2mwone = require('./response-cache.cjs');
8
+ exports.ResponseCache = _mod_2mwone.ResponseCache;
9
+ exports.normalizeResponseCacheConfig = _mod_2mwone.normalizeResponseCacheConfig;;
@@ -45,6 +45,7 @@ class Crawler {
45
45
  rawResponseEvents = [];
46
46
  emailDiscoveredEvents = [];
47
47
  emailLeadsEvents = [];
48
+ eventCount = 0;
48
49
  cacher = null;
49
50
  queue;
50
51
  scraperQueue;
@@ -728,8 +729,35 @@ class Crawler {
728
729
  }
729
730
  }
730
731
  }
732
+ _runHandler(handler, arg) {
733
+ this.eventCount++;
734
+ new Promise(async (resolve) => {
735
+ try {
736
+ await handler(arg);
737
+ } catch (err) {
738
+ if (this.config.debug)
739
+ console.error("[Crawler] Handler error:", err);
740
+ }
741
+ resolve();
742
+ }).finally(() => {
743
+ this.eventCount--;
744
+ });
745
+ }
746
+ _runBoundHandler(fn) {
747
+ this.eventCount++;
748
+ Promise.resolve().then(async () => {
749
+ try {
750
+ await fn();
751
+ } catch (err) {
752
+ if (this.config.debug)
753
+ console.error("[Crawler] Handler error:", err);
754
+ }
755
+ }).finally(() => {
756
+ this.eventCount--;
757
+ });
758
+ }
731
759
  _onBody(handler, document) {
732
- this.queue.add(() => handler(document.body));
760
+ this._runHandler(handler, document.body);
733
761
  }
734
762
  _onAttribute(selection, attribute, handler, document) {
735
763
  const isSimpleForm = typeof attribute === "function";
@@ -741,7 +769,7 @@ class Crawler {
741
769
  const el = elements[i];
742
770
  if (el.hasAttribute(actualAttribute)) {
743
771
  const value = el.getAttribute(actualAttribute);
744
- this.queue.add(() => actualHandler.call(el, value, actualAttribute));
772
+ this._runBoundHandler(() => actualHandler.call(el, value, actualAttribute));
745
773
  }
746
774
  }
747
775
  }
@@ -750,19 +778,19 @@ class Crawler {
750
778
  for (let i = 0;i < elements.length; i++) {
751
779
  const el = elements[i];
752
780
  const text = el.textContent;
753
- this.queue.add(() => handler.call(el, text));
781
+ this._runBoundHandler(() => handler.call(el, text));
754
782
  }
755
783
  }
756
784
  _onSelection(selection, handler, document) {
757
785
  const elements = document.querySelectorAll(selection);
758
786
  for (let i = 0;i < elements.length; i++) {
759
- this.queue.add(() => handler(elements[i]));
787
+ this._runHandler(handler, elements[i]);
760
788
  }
761
789
  }
762
790
  _onElement(handler, document) {
763
791
  const elements = document.querySelectorAll("*");
764
792
  for (let i = 0;i < elements.length; i++) {
765
- this.queue.add(() => handler(elements[i]));
793
+ this._runHandler(handler, elements[i]);
766
794
  }
767
795
  }
768
796
  _onHref(handler, document) {
@@ -771,7 +799,7 @@ class Crawler {
771
799
  const el = elements[i];
772
800
  if (el.hasAttribute("href")) {
773
801
  const href = new URL(el.getAttribute("href"), document.URL).href;
774
- this.queue.add(() => handler.call(el, href));
802
+ this._runBoundHandler(() => handler.call(el, href));
775
803
  }
776
804
  }
777
805
  }
@@ -782,29 +810,29 @@ class Crawler {
782
810
  for (let i = 0;i < elements.length; i++) {
783
811
  if (elements[i]?.href && document.baseURI)
784
812
  elements[i].href = new URL(elements[i].getAttribute("href"), document.baseURI).href;
785
- this.queue.add(() => handler(elements[i]));
813
+ this._runHandler(handler, elements[i]);
786
814
  }
787
815
  }
788
816
  _onDocument(handler, document) {
789
- this.queue.add(() => handler(document));
817
+ this._runHandler(handler, document);
790
818
  }
791
819
  _onJson(handler, json) {
792
- this.queue.add(() => handler(json));
820
+ this._runHandler(handler, json);
793
821
  }
794
822
  _onError(handler, error) {
795
- this.queue.add(() => handler(error));
823
+ this._runHandler(handler, error);
796
824
  }
797
825
  async _onEmailDiscovered(handler, email) {
798
- this.queue.add(() => handler(email));
826
+ this._runHandler(handler, email);
799
827
  }
800
828
  async _onEmailLeads(handler, emails) {
801
- this.queue.add(() => handler(emails));
829
+ this._runHandler(handler, emails);
802
830
  }
803
831
  _onRawResponse(handler, rawResponse) {
804
- this.queue.add(() => handler(rawResponse));
832
+ this._runHandler(handler, rawResponse);
805
833
  }
806
834
  _onResponse(handler, response) {
807
- this.queue.add(() => handler(response));
835
+ this._runHandler(handler, response);
808
836
  }
809
837
  calculateAutoThrottleDelay(domain, responseTime) {
810
838
  if (!this.config.autoThrottle)
@@ -1015,13 +1043,7 @@ class Crawler {
1015
1043
  this.crawlStats.startTime = Date.now();
1016
1044
  this.startPeriodicCleanup();
1017
1045
  for (const handler of this.startHandlers) {
1018
- try {
1019
- this.queue.add(() => handler());
1020
- } catch (error) {
1021
- if (this.config.debug) {
1022
- console.error("[Crawler] onStart handler error:", error);
1023
- }
1024
- }
1046
+ this._runBoundHandler(() => handler());
1025
1047
  }
1026
1048
  })();
1027
1049
  return this.startHandlersPromise;
@@ -1029,24 +1051,12 @@ class Crawler {
1029
1051
  async triggerFinishHandlers() {
1030
1052
  this.crawlStats.endTime = Date.now();
1031
1053
  for (const handler of this.finishHandlers) {
1032
- try {
1033
- this.queue.add(() => handler(this.crawlStats));
1034
- } catch (error) {
1035
- if (this.config.debug) {
1036
- console.error("[Crawler] onFinish handler error:", error);
1037
- }
1038
- }
1054
+ this._runHandler(handler, this.crawlStats);
1039
1055
  }
1040
1056
  }
1041
1057
  async triggerRedirectHandlers(event) {
1042
1058
  for (const handler of this.redirectHandlers) {
1043
- try {
1044
- this.queue.add(() => handler(event));
1045
- } catch (error) {
1046
- if (this.config.debug) {
1047
- console.error("[Crawler] onRedirect handler error:", error);
1048
- }
1049
- }
1059
+ this._runHandler(handler, event);
1050
1060
  }
1051
1061
  }
1052
1062
  buildUrl(url, params) {
@@ -1362,7 +1372,7 @@ class Crawler {
1362
1372
  if (scraperSize === 0 && scraperPending === 0) {
1363
1373
  const queueSize = this.queue.size;
1364
1374
  const queuePending = this.queue.pending;
1365
- if (queueSize === 0 && queuePending === 0) {
1375
+ if (queueSize === 0 && queuePending === 0 && this.eventCount === 0) {
1366
1376
  consecutiveIdleChecks++;
1367
1377
  if (consecutiveIdleChecks >= REQUIRED_IDLE_CHECKS) {
1368
1378
  break;
@@ -45,6 +45,7 @@ export class Crawler {
45
45
  rawResponseEvents = [];
46
46
  emailDiscoveredEvents = [];
47
47
  emailLeadsEvents = [];
48
+ eventCount = 0;
48
49
  cacher = null;
49
50
  queue;
50
51
  scraperQueue;
@@ -728,8 +729,35 @@ export class Crawler {
728
729
  }
729
730
  }
730
731
  }
732
+ _runHandler(handler, arg) {
733
+ this.eventCount++;
734
+ new Promise(async (resolve) => {
735
+ try {
736
+ await handler(arg);
737
+ } catch (err) {
738
+ if (this.config.debug)
739
+ console.error("[Crawler] Handler error:", err);
740
+ }
741
+ resolve();
742
+ }).finally(() => {
743
+ this.eventCount--;
744
+ });
745
+ }
746
+ _runBoundHandler(fn) {
747
+ this.eventCount++;
748
+ Promise.resolve().then(async () => {
749
+ try {
750
+ await fn();
751
+ } catch (err) {
752
+ if (this.config.debug)
753
+ console.error("[Crawler] Handler error:", err);
754
+ }
755
+ }).finally(() => {
756
+ this.eventCount--;
757
+ });
758
+ }
731
759
  _onBody(handler, document) {
732
- this.queue.add(() => handler(document.body));
760
+ this._runHandler(handler, document.body);
733
761
  }
734
762
  _onAttribute(selection, attribute, handler, document) {
735
763
  const isSimpleForm = typeof attribute === "function";
@@ -741,7 +769,7 @@ export class Crawler {
741
769
  const el = elements[i];
742
770
  if (el.hasAttribute(actualAttribute)) {
743
771
  const value = el.getAttribute(actualAttribute);
744
- this.queue.add(() => actualHandler.call(el, value, actualAttribute));
772
+ this._runBoundHandler(() => actualHandler.call(el, value, actualAttribute));
745
773
  }
746
774
  }
747
775
  }
@@ -750,19 +778,19 @@ export class Crawler {
750
778
  for (let i = 0;i < elements.length; i++) {
751
779
  const el = elements[i];
752
780
  const text = el.textContent;
753
- this.queue.add(() => handler.call(el, text));
781
+ this._runBoundHandler(() => handler.call(el, text));
754
782
  }
755
783
  }
756
784
  _onSelection(selection, handler, document) {
757
785
  const elements = document.querySelectorAll(selection);
758
786
  for (let i = 0;i < elements.length; i++) {
759
- this.queue.add(() => handler(elements[i]));
787
+ this._runHandler(handler, elements[i]);
760
788
  }
761
789
  }
762
790
  _onElement(handler, document) {
763
791
  const elements = document.querySelectorAll("*");
764
792
  for (let i = 0;i < elements.length; i++) {
765
- this.queue.add(() => handler(elements[i]));
793
+ this._runHandler(handler, elements[i]);
766
794
  }
767
795
  }
768
796
  _onHref(handler, document) {
@@ -771,7 +799,7 @@ export class Crawler {
771
799
  const el = elements[i];
772
800
  if (el.hasAttribute("href")) {
773
801
  const href = new URL(el.getAttribute("href"), document.URL).href;
774
- this.queue.add(() => handler.call(el, href));
802
+ this._runBoundHandler(() => handler.call(el, href));
775
803
  }
776
804
  }
777
805
  }
@@ -782,29 +810,29 @@ export class Crawler {
782
810
  for (let i = 0;i < elements.length; i++) {
783
811
  if (elements[i]?.href && document.baseURI)
784
812
  elements[i].href = new URL(elements[i].getAttribute("href"), document.baseURI).href;
785
- this.queue.add(() => handler(elements[i]));
813
+ this._runHandler(handler, elements[i]);
786
814
  }
787
815
  }
788
816
  _onDocument(handler, document) {
789
- this.queue.add(() => handler(document));
817
+ this._runHandler(handler, document);
790
818
  }
791
819
  _onJson(handler, json) {
792
- this.queue.add(() => handler(json));
820
+ this._runHandler(handler, json);
793
821
  }
794
822
  _onError(handler, error) {
795
- this.queue.add(() => handler(error));
823
+ this._runHandler(handler, error);
796
824
  }
797
825
  async _onEmailDiscovered(handler, email) {
798
- this.queue.add(() => handler(email));
826
+ this._runHandler(handler, email);
799
827
  }
800
828
  async _onEmailLeads(handler, emails) {
801
- this.queue.add(() => handler(emails));
829
+ this._runHandler(handler, emails);
802
830
  }
803
831
  _onRawResponse(handler, rawResponse) {
804
- this.queue.add(() => handler(rawResponse));
832
+ this._runHandler(handler, rawResponse);
805
833
  }
806
834
  _onResponse(handler, response) {
807
- this.queue.add(() => handler(response));
835
+ this._runHandler(handler, response);
808
836
  }
809
837
  calculateAutoThrottleDelay(domain, responseTime) {
810
838
  if (!this.config.autoThrottle)
@@ -1015,13 +1043,7 @@ export class Crawler {
1015
1043
  this.crawlStats.startTime = Date.now();
1016
1044
  this.startPeriodicCleanup();
1017
1045
  for (const handler of this.startHandlers) {
1018
- try {
1019
- this.queue.add(() => handler());
1020
- } catch (error) {
1021
- if (this.config.debug) {
1022
- console.error("[Crawler] onStart handler error:", error);
1023
- }
1024
- }
1046
+ this._runBoundHandler(() => handler());
1025
1047
  }
1026
1048
  })();
1027
1049
  return this.startHandlersPromise;
@@ -1029,24 +1051,12 @@ export class Crawler {
1029
1051
  async triggerFinishHandlers() {
1030
1052
  this.crawlStats.endTime = Date.now();
1031
1053
  for (const handler of this.finishHandlers) {
1032
- try {
1033
- this.queue.add(() => handler(this.crawlStats));
1034
- } catch (error) {
1035
- if (this.config.debug) {
1036
- console.error("[Crawler] onFinish handler error:", error);
1037
- }
1038
- }
1054
+ this._runHandler(handler, this.crawlStats);
1039
1055
  }
1040
1056
  }
1041
1057
  async triggerRedirectHandlers(event) {
1042
1058
  for (const handler of this.redirectHandlers) {
1043
- try {
1044
- this.queue.add(() => handler(event));
1045
- } catch (error) {
1046
- if (this.config.debug) {
1047
- console.error("[Crawler] onRedirect handler error:", error);
1048
- }
1049
- }
1059
+ this._runHandler(handler, event);
1050
1060
  }
1051
1061
  }
1052
1062
  buildUrl(url, params) {
@@ -1362,7 +1372,7 @@ export class Crawler {
1362
1372
  if (scraperSize === 0 && scraperPending === 0) {
1363
1373
  const queueSize = this.queue.size;
1364
1374
  const queuePending = this.queue.pending;
1365
- if (queueSize === 0 && queuePending === 0) {
1375
+ if (queueSize === 0 && queuePending === 0 && this.eventCount === 0) {
1366
1376
  consecutiveIdleChecks++;
1367
1377
  if (consecutiveIdleChecks >= REQUIRED_IDLE_CHECKS) {
1368
1378
  break;
@@ -1,40 +1,42 @@
1
- const _mod_lzbr9j = require('./crawler.cjs');
2
- exports.Crawler = _mod_lzbr9j.Crawler;;
3
- const _mod_u60zhc = require('./crawler-options.cjs');
4
- exports.CrawlerOptions = _mod_u60zhc.CrawlerOptions;;
5
- const _mod_1vebd3 = require('./plugin/robots-txt.cjs');
6
- exports.RobotsTxt = _mod_1vebd3.RobotsTxt;;
7
- const _mod_bhjqtv = require('./plugin/file-cacher.cjs');
8
- exports.FileCacher = _mod_bhjqtv.FileCacher;;
9
- const _mod_04rd64 = require('./plugin/url-store.cjs');
10
- exports.UrlStore = _mod_04rd64.UrlStore;;
11
- const _mod_0e89e3 = require('./plugin/navigation-history.cjs');
12
- exports.NavigationHistory = _mod_0e89e3.NavigationHistory;;
13
- const _mod_y6ssi0 = require('./addon/oxylabs/index.cjs');
14
- exports.Oxylabs = _mod_y6ssi0.Oxylabs;;
15
- const _mod_3tpb6j = require('./addon/oxylabs/options.cjs');
16
- exports.OXYLABS_BROWSER_TYPES = _mod_3tpb6j.OXYLABS_BROWSER_TYPES;
17
- exports.OXYLABS_COMMON_LOCALES = _mod_3tpb6j.OXYLABS_COMMON_LOCALES;
18
- exports.OXYLABS_COMMON_GEO_LOCATIONS = _mod_3tpb6j.OXYLABS_COMMON_GEO_LOCATIONS;
19
- exports.OXYLABS_US_STATES = _mod_3tpb6j.OXYLABS_US_STATES;
20
- exports.OXYLABS_EUROPEAN_COUNTRIES = _mod_3tpb6j.OXYLABS_EUROPEAN_COUNTRIES;
21
- exports.OXYLABS_ASIAN_COUNTRIES = _mod_3tpb6j.OXYLABS_ASIAN_COUNTRIES;
22
- exports.getRandomOxylabsBrowserType = _mod_3tpb6j.getRandomBrowserType;
23
- exports.getRandomOxylabsLocale = _mod_3tpb6j.getRandomLocale;
24
- exports.getRandomOxylabsGeoLocation = _mod_3tpb6j.getRandomGeoLocation;;
25
- const _mod_74k0au = require('./addon/decodo/index.cjs');
26
- exports.Decodo = _mod_74k0au.Decodo;;
27
- const _mod_hibwsw = require('./addon/decodo/options.cjs');
28
- exports.DECODO_DEVICE_TYPES = _mod_hibwsw.DECODO_DEVICE_TYPES;
29
- exports.DECODO_HEADLESS_MODES = _mod_hibwsw.DECODO_HEADLESS_MODES;
30
- exports.DECODO_COMMON_LOCALES = _mod_hibwsw.DECODO_COMMON_LOCALES;
31
- exports.DECODO_COMMON_COUNTRIES = _mod_hibwsw.DECODO_COMMON_COUNTRIES;
32
- exports.DECODO_EUROPEAN_COUNTRIES = _mod_hibwsw.DECODO_EUROPEAN_COUNTRIES;
33
- exports.DECODO_ASIAN_COUNTRIES = _mod_hibwsw.DECODO_ASIAN_COUNTRIES;
34
- exports.DECODO_US_STATES = _mod_hibwsw.DECODO_US_STATES;
35
- exports.DECODO_COMMON_CITIES = _mod_hibwsw.DECODO_COMMON_CITIES;
36
- exports.getRandomDecodoDeviceType = _mod_hibwsw.getRandomDeviceType;
37
- exports.getRandomDecodoLocale = _mod_hibwsw.getRandomLocale;
38
- exports.getRandomDecodoCountry = _mod_hibwsw.getRandomCountry;
39
- exports.getRandomDecodoCity = _mod_hibwsw.getRandomCity;
40
- exports.generateDecodoSessionId = _mod_hibwsw.generateSessionId;;
1
+ const _mod_yqtvmc = require('./crawler.cjs');
2
+ exports.Crawler = _mod_yqtvmc.Crawler;;
3
+ const _mod_iokp0e = require('./crawler-options.cjs');
4
+ exports.CrawlerOptions = _mod_iokp0e.CrawlerOptions;;
5
+ const _mod_eu2nlx = require('./plugin/robots-txt.cjs');
6
+ exports.RobotsTxt = _mod_eu2nlx.RobotsTxt;;
7
+ const _mod_pdez3o = require('./plugin/file-cacher.cjs');
8
+ exports.FileCacher = _mod_pdez3o.FileCacher;;
9
+ const _mod_q7ukwr = require('./plugin/url-store.cjs');
10
+ exports.UrlStore = _mod_q7ukwr.UrlStore;;
11
+ const _mod_bzuoem = require('./plugin/navigation-history.cjs');
12
+ exports.NavigationHistory = _mod_bzuoem.NavigationHistory;;
13
+ const _mod_ayoad0 = require('./addon/oxylabs/index.cjs');
14
+ exports.Oxylabs = _mod_ayoad0.Oxylabs;;
15
+ const _mod_6bfl5x = require('./addon/oxylabs/options.cjs');
16
+ exports.OXYLABS_BROWSER_TYPES = _mod_6bfl5x.OXYLABS_BROWSER_TYPES;
17
+ exports.OXYLABS_COMMON_LOCALES = _mod_6bfl5x.OXYLABS_COMMON_LOCALES;
18
+ exports.OXYLABS_COMMON_GEO_LOCATIONS = _mod_6bfl5x.OXYLABS_COMMON_GEO_LOCATIONS;
19
+ exports.OXYLABS_US_STATES = _mod_6bfl5x.OXYLABS_US_STATES;
20
+ exports.OXYLABS_EUROPEAN_COUNTRIES = _mod_6bfl5x.OXYLABS_EUROPEAN_COUNTRIES;
21
+ exports.OXYLABS_ASIAN_COUNTRIES = _mod_6bfl5x.OXYLABS_ASIAN_COUNTRIES;
22
+ exports.getRandomOxylabsBrowserType = _mod_6bfl5x.getRandomBrowserType;
23
+ exports.getRandomOxylabsLocale = _mod_6bfl5x.getRandomLocale;
24
+ exports.getRandomOxylabsGeoLocation = _mod_6bfl5x.getRandomGeoLocation;;
25
+ const _mod_2z2x6m = require('./scraper.cjs');
26
+ exports.isRestrictedDomain = _mod_2z2x6m.isRestrictedDomain;;
27
+ const _mod_1mya5t = require('./addon/decodo/index.cjs');
28
+ exports.Decodo = _mod_1mya5t.Decodo;;
29
+ const _mod_ila1ru = require('./addon/decodo/options.cjs');
30
+ exports.DECODO_DEVICE_TYPES = _mod_ila1ru.DECODO_DEVICE_TYPES;
31
+ exports.DECODO_HEADLESS_MODES = _mod_ila1ru.DECODO_HEADLESS_MODES;
32
+ exports.DECODO_COMMON_LOCALES = _mod_ila1ru.DECODO_COMMON_LOCALES;
33
+ exports.DECODO_COMMON_COUNTRIES = _mod_ila1ru.DECODO_COMMON_COUNTRIES;
34
+ exports.DECODO_EUROPEAN_COUNTRIES = _mod_ila1ru.DECODO_EUROPEAN_COUNTRIES;
35
+ exports.DECODO_ASIAN_COUNTRIES = _mod_ila1ru.DECODO_ASIAN_COUNTRIES;
36
+ exports.DECODO_US_STATES = _mod_ila1ru.DECODO_US_STATES;
37
+ exports.DECODO_COMMON_CITIES = _mod_ila1ru.DECODO_COMMON_CITIES;
38
+ exports.getRandomDecodoDeviceType = _mod_ila1ru.getRandomDeviceType;
39
+ exports.getRandomDecodoLocale = _mod_ila1ru.getRandomLocale;
40
+ exports.getRandomDecodoCountry = _mod_ila1ru.getRandomCountry;
41
+ exports.getRandomDecodoCity = _mod_ila1ru.getRandomCity;
42
+ exports.generateDecodoSessionId = _mod_ila1ru.generateSessionId;;
@@ -16,6 +16,7 @@ export {
16
16
  getRandomLocale as getRandomOxylabsLocale,
17
17
  getRandomGeoLocation as getRandomOxylabsGeoLocation
18
18
  } from './addon/oxylabs/options.js';
19
+ export { isRestrictedDomain } from './scraper.js';
19
20
  export { Decodo } from './addon/decodo/index.js';
20
21
  export {
21
22
  DECODO_DEVICE_TYPES,
@@ -1 +1 @@
1
- var e=require("./file-cacher.cjs");exports.FileCacher=e.FileCacher;var r=require("./url-store.cjs");exports.UrlStore=r.UrlStore;var o=require("./result-stream.cjs");exports.ResultStream=o.ResultStream;var t=require("./memory-monitor.cjs");exports.MemoryMonitor=t.MemoryMonitor;var a=require("./health-metrics.cjs");exports.HealthMetrics=a.HealthMetrics;var i=require("./capped-map.cjs");exports.CappedMap=i.CappedMap;var s=require("./capped-array.cjs");exports.CappedArray=s.CappedArray;
1
+ var e=require("./file-cacher.cjs");exports.FileCacher=e.FileCacher;var r=require("./url-store.cjs");exports.UrlStore=r.UrlStore;var o=require("./result-stream.cjs");exports.ResultStream=o.ResultStream;var t=require("./memory-monitor.cjs");exports.MemoryMonitor=t.MemoryMonitor;var a=require("./health-metrics.cjs");exports.HealthMetrics=a.HealthMetrics;var d=require("./capped-map.cjs");exports.CappedMap=d.CappedMap;var i=require("./capped-array.cjs");exports.CappedArray=i.CappedArray;
@@ -1 +1 @@
1
- var{parseHTML:k}=require("linkedom");class w extends Set{maxSize;evictionCount;constructor(e,a=0.1){super();this.maxSize=e,this.evictionCount=Math.max(1,Math.ceil(e*a))}add(e){if(this.has(e))return this;if(this.size>=this.maxSize){let a=this.values();for(let n=0;n<this.evictionCount;n++){let t=a.next();if(t.done)break;this.delete(t.value)}}return super.add(e)}}class b{http;httpOptions;onEmailLeads;onEmailDiscovered;debug;static CLEAN_CONTENT_REGEX=/[^\w@.-\s]/g;static EMAIL_REGEX=/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g;static EMAIL_VALIDATION_REGEX=/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;discoveredEmails=new w(1e4);userAgents=[];fileExtensions=[];restrictedDomains=C();forbiddenProtocols=["mailto:","tel:","javascript:","data:","sms:","ftp:","file:","irc:","blob:","chrome:","about:","intent:"];constructor(e,a,n,t,o=!1){this.http=e,this.httpOptions=a,this.onEmailLeads=n,this.onEmailDiscovered=t,this.debug=o,this.userAgents=$()}sleep(e){return new Promise((a)=>setTimeout(a,e))}async executeHttp(e,a,n,t,o,i=0){let{getCache:s,saveCache:r,hasUrlInCache:m,saveUrl:u,httpConfig:l={}}=t;if(!e||e.length<3||this.forbiddenProtocols.some((f)=>e.startsWith(f)))return;try{let f=o?!1:await m(e),h=await s(e);if(f&&!h)return!1;if(f&&a!=="GET")return!1;let c=h&&a==="GET"?h:await(a==="GET"?this.http.get(e,l):a==="PATCH"?this.http.patch(e,n,l):a==="POST"?this.http.post(e,n,l):this.http.put(e,n,l));if(!h)await r(e,{data:c.data,contentType:c.contentType,finalUrl:c.finalUrl});if(!f)await u(e);if(!c.contentType||!c.contentType.includes("/html")||!c.contentType.includes("text/")||typeof c.data!=="string")return null;return{data:c.data,contentType:c.contentType,finalUrl:c.finalUrl}}catch(f){let h=f,c=this.httpOptions;if(h&&h.response){let g=h.response.status,p=c.retryDelay||100,x=c.maxRetryAttempts||3,d=c.retryWithoutProxyOnStatusCode||void 0,v=c.maxRetryOnProxyError||3;if(d&&l.proxy&&d.includes(g)&&i<x)return await this.sleep(p),delete l.proxy,await this.executeHttp(e,a,n,t,o,i+1);else if(c.retryOnStatusCode&&l.proxy&&c.retryOnStatusCode.includes(g)&&i<x)return await this.sleep(p),await this.executeHttp(e,a,n,t,o,i+1);else if(c.retryOnProxyError&&l.proxy&&i<v)return await this.sleep(p),await this.executeHttp(e,a,n,t,o,i+1)}if(this.debug){if(this.debug)console.log(`Error: unable to ${a} ${e}: ${f.message}`)}return null}}extractEmails(e,a,n,t,o,i){let s=this.extractEmailsFromContent(e?.replaceAll("mailto:"," ")),r=[];for(let m of s)if(this.handleEmailDiscovery(m,a,n,o,i))r.push(m);if(t&&t.length>0&&r.length>0)o.add(async()=>Promise.all(t.map((m)=>m(r))));s.length=0,r.length=0}async parseExternalWebsite(e,a,n,t,o,i=!0,s,r){let m=t.httpConfig?.headers?t.httpConfig.headers instanceof Headers?Object.fromEntries(t.httpConfig.headers.entries()):t.httpConfig.headers:{};t.httpConfig=t.httpConfig||{},t.httpConfig.headers={"user-agent":this.getRandomUserAgent(),accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","accept-language":"en-US,en;q=0.9","cache-control":"no-cache",pragma:"no-cache",...m},t.httpConfig.timeout=t.httpConfig.timeout||15000,t.depth=t.depth||0,t.allowCrossDomainTravel=t.allowCrossDomainTravel||!1,o=o&&i;let u=[];try{let l=new URL(e),f=this.extractRootDomain(e);if(this.isLinktreeUrl(e))return await this.parseLinktreeProfile(e,t,o);if(this.isRestrictedDomain(e)){if(this.debug)console.warn(`⚠️ Skipped URL (restricted url): ${e}`);return u}let h=await this.executeHttp(e,a,n,t,o);if(!h){if(this.debug&&h===null)console.warn(`⚠️ Failed to fetch page content: ${e}`);if(this.debug&&h===!1)console.warn(`⚠️ Skipped URL (already visited): ${e}`);return u}let c=this.extractEmailsFromContent(h.data?.replaceAll("mailto:"," "));for(let g of c)if(this.handleEmailDiscovery(g,e,t.onEmailDiscovered,t.queue,t.emailMetadata))u.push(g);if(t.depth>0||!s){let g;{let{document:d}=k(h.data);g=this.extractRelevantLinks(d,l,f,t.depth,t.allowCrossDomainTravel)}t.depth--;let p=10,x=[];for(let d=0;d<g.length;d+=p){let v=g.slice(d,d+p),y=await Promise.allSettled(v.map((E)=>this.parseExternalWebsite(E,"GET",null,{...t,depth:t.depth},o,!1,!0)));x.push(...y)}for(let d of x)if(d.status==="fulfilled")u.push(...d.value);else if(this.debug)console.warn("⚠️ Failed to parse child URL:",d.reason?.message)}}catch(l){if(this.debug)console.error(`❌ Error parsing external website: ${e}`,l?.message)}if(i){if(t.onEmails&&t.onEmails.length>0)t.queue.add(async()=>Promise.all(t.onEmails.map((l)=>l(u))))}return u}async parseLinktreeProfile(e,a,n){let t=[];try{let o=await this.executeHttp(e,"GET",null,a,n);if(!o){if(this.debug)console.warn(`⚠️ Failed to fetch Linktree profile: ${e}`);return t}let i;{let{document:r}=k(o),m=r.getElementById("links-container");if(!m){if(this.debug)console.warn(`\uD83D\uDD0D No links container found in Linktree profile: ${e}`);return t}i=this.extractLinktreeExternalUrls(m,e)}if(i.length===0){if(this.debug)console.info("\uD83D\uDCED No valid external links found in Linktree profile");return t}if(this.debug)console.info(`\uD83C\uDFAF Found ${i.length} external links in Linktree profile`);let s=await Promise.allSettled(i.map((r)=>this.parseExternalWebsite(r,"GET",null,a,n,!1)));for(let r of s)if(r.status==="fulfilled")t.push(...r.value);else if(this.debug)console.warn("⚠️ Failed to parse Linktree external URL:",r.reason?.message)}catch(o){if(this.debug)console.error(`❌ Error parsing Linktree profile: ${e}`,o?.message)}return t}extractLinktreeExternalUrls(e,a){let n=new Set,t=e.querySelectorAll("a[href][target='_blank']");for(let o of t){let i=o.getAttribute("href");if(!i||i.length<3||this.forbiddenProtocols.some((s)=>i.startsWith(s)))continue;try{let s=new URL(i,a).href,r=this.extractRootDomain(s);if(r!=="linktr.ee"&&!this.isRestrictedDomain(s)&&r.length>3)n.add(s)}catch(s){if(this.debug)console.warn(`\uD83D\uDD17 Invalid URL in Linktree: ${i}`)}}return Array.from(n)}handleEmailDiscovery(e,a,n,t,o){if(!this.discoveredEmails.has(e)){this.discoveredEmails.add(e);let i={email:e,discoveredAt:a,timestamp:new Date,metadata:o||{}};if(n&&n.length>0)t.add(async()=>Promise.all(n.map((s)=>s(i))));if(this.debug)console.info(`\uD83D\uDCE7 New email discovered: ${e} at ${a}`);return!0}return!1}isDomainAccessAllowed(e,a,n,t){if(t)return!0;if(n===0)return e===a;return e===a||e.endsWith(`.${a}`)||a.endsWith(`.${e}`)}extractRelevantLinks(e,a,n,t,o){let i=[],s=["about","contact","help","support","reach","email","mail","message","company","team","staff","info","inquiry","feedback","service","assistance","connect","touch"],r=e.querySelectorAll("a[href]");for(let m of r){let u=m.getAttribute("href");if(!u||u.length<2)continue;try{let l=this.normalizeUrl(u,a),f=this.extractRootDomain(l);if(!this.isDomainAccessAllowed(f,n,t,o))continue;if(s.some((c)=>l.toLowerCase().includes(c))||this.isLinktreeUrl(l))i.push(l)}catch(l){if(this.debug)console.warn(`\uD83D\uDD17 Invalid link found: ${u}`,l?.message)}}return i}extractEmailsFromContent(e){let a=e.replace(b.CLEAN_CONTENT_REGEX," "),n=(s)=>{let r=s.split("@")[1]?.toLowerCase(),m=s.split(".").pop()?.toLowerCase();return b.EMAIL_VALIDATION_REGEX.test(s)&&r!==void 0&&m!==void 0&&!this.fileExtensions.includes(`.${m}`)&&!this.isRestrictedDomain(`https://${r}`)},t=(s)=>{return b.EMAIL_REGEX.lastIndex=0,(s.match(b.EMAIL_REGEX)||[]).filter(n)},o=e.replace(/<[^>]*>/g," "),i=[...t(o),...t(a)];return[...new Set(i)]}isRestrictedDomain(e){try{let a=new URL(e).host.toLowerCase();return this.restrictedDomains.some((n)=>a===n.toLowerCase()||a.endsWith(`.${n.toLowerCase()}`))}catch{return!0}}isLinktreeUrl(e){try{return this.extractRootDomain(e)==="linktr.ee"}catch{return!1}}extractRootDomain(e){try{let n=new URL(e).hostname.toLowerCase();return n.startsWith("www.")?n.slice(4):n}catch{return""}}normalizeUrl(e,a){if(e.startsWith("http://")||e.startsWith("https://"))return e;if(e.startsWith("//"))return`${a.protocol}${e}`;return new URL(e,a.href).href}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"}],a=["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"],n=[];for(let t=0;t<200;t++){let o=e[Math.floor(Math.random()*e.length)],i=a[Math.floor(Math.random()*a.length)],s="";switch(o.name){case"Chrome":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36`;break;case"Firefox":s=`Mozilla/5.0 (${i}; rv:${o.version}) ${o.engine} Firefox/${o.version}`;break;case"Safari":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Version/${o.version} Safari/605.1.15`;break;case"Edge":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Edg/${o.version}`;break;case"Opera":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 OPR/${o.version}`;break;case"Vivaldi":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Vivaldi/${o.version}`;break;case"Brave":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Brave/${o.version}`;break;case"Chromium":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chromium/${o.version} Chrome/${o.version} Safari/537.36`;break;case"Yandex":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} YaBrowser/${o.version} Safari/537.36`;break;case"Maxthon":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Maxthon/${o.version}`;break}n.push(s)}return n}function C(){return["facebook.com","fb.com","messenger.com","instagram.com","threads.net","twitter.com","x.com","linkedin.com","pinterest.com","pin.it","reddit.com","tumblr.com","snapchat.com","tiktok.com","douyin.com","youtube.com","youtu.be","whatsapp.com","telegram.org","t.me","medium.com","quora.com","flickr.com","vimeo.com","vk.com","weibo.com","sina.com.cn","line.me","discord.com","discordapp.com","twitch.tv","meetup.com","nextdoor.com","xing.com","yelp.com","zalo.me","mastodon.social","clubhouse.com","patreon.com","onlyfans.com","douban.com","goodreads.com","soundcloud.com","spotify.com","last.fm","behance.net","dribbble.com","deviantart.com","pixiv.net","slideshare.net","tinder.com","bumble.com","etsy.com","indeed.com","glassdoor.com","monster.com","careerbuilder.com","dice.com","ziprecruiter.com","simplyhired.com","upwork.com","freelancer.com","fiverr.com","stackoverflow.com","stackoverflow.co","angel.co","wellfound.com","quora.com","stackexchange.com","yahoo.com","answers.microsoft.com","askubuntu.com","superuser.com","serverfault.com","mathoverflow.net","xda-developers.com","gamespot.com","ign.com","4chan.org","9gag.com","gizmodo.com","slashdot.org","hacker-news.news","ycombinator.com","producthunt.com","discourse.org","google.com","google.co.uk","google.de","google.fr","google.co.jp","bing.com","yahoo.com","search.yahoo.com","duckduckgo.com","baidu.com","yandex.com","yandex.ru","ask.com","wolframalpha.com","ecosia.org","startpage.com","qwant.com","searx.me","gibiru.com","swisscows.com","gmail.com","googlemail.com","outlook.com","hotmail.com","live.com","msn.com","yahoo.com","ymail.com","aol.com","icloud.com","me.com","mac.com","protonmail.com","pm.me","zoho.com","mail.com","gmx.com","gmx.net","yandex.com","yandex.ru","tutanota.com","tutanota.de","fastmail.com","hushmail.com","mailbox.org","posteo.de","runbox.com","disroot.org","163.com","qq.com","rambler.ru","mail.ru","yelp.com","yelp.ca","yelp.co.uk","yelp.com.au","yellowpages.com","yellowpages.ca","yell.com","tripadvisor.com","tripadvisor.co.uk","tripadvisor.ca","foursquare.com","angieslist.com","bbb.org","manta.com","thumbtack.com","homeadvisor.com","superpages.com","whitepages.com","local.com","citysearch.com","merchantcircle.com","insiderpages.com","kudzu.com","hotfrog.com","buildzoom.com","houzz.com","porch.com","mapquest.com","zagat.com","zomato.com","opentable.com","viator.com","expedia.com","booking.com","airbnb.com","vrbo.com","homeaway.com","craigslist.org","nextdoor.com","patch.com","meetup.com","eventbrite.com","groupon.com","livingsocial.com","gumtree.com","gumtree.com.au","kijiji.ca","leboncoin.fr","finn.no","blocket.se","58.com","dianping.com","tabelog.com","ypcdn.com"]}exports.Scraper=b;exports.CappedSet=w;
1
+ var{parseHTML:k}=require("linkedom");class v extends Set{maxSize;evictionCount;constructor(e,n=0.1){super();this.maxSize=e,this.evictionCount=Math.max(1,Math.ceil(e*n))}add(e){if(this.has(e))return this;if(this.size>=this.maxSize){let n=this.values();for(let a=0;a<this.evictionCount;a++){let t=n.next();if(t.done)break;this.delete(t.value)}}return super.add(e)}}class b{http;httpOptions;onEmailLeads;onEmailDiscovered;debug;static CLEAN_CONTENT_REGEX=/[^\w@.-\s]/g;static EMAIL_REGEX=/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g;static EMAIL_VALIDATION_REGEX=/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;discoveredEmails=new v(1e4);userAgents=[];fileExtensions=[];restrictedDomains=y();forbiddenProtocols=["mailto:","tel:","javascript:","data:","sms:","ftp:","file:","irc:","blob:","chrome:","about:","intent:"];constructor(e,n,a,t,o=!1){this.http=e,this.httpOptions=n,this.onEmailLeads=a,this.onEmailDiscovered=t,this.debug=o,this.userAgents=C()}sleep(e){return new Promise((n)=>setTimeout(n,e))}async executeHttp(e,n,a,t,o,i=0){let{getCache:s,saveCache:r,hasUrlInCache:m,saveUrl:u,httpConfig:l={}}=t;if(!e||e.length<3||this.forbiddenProtocols.some((f)=>e.startsWith(f)))return;try{let f=o?!1:await m(e),h=await s(e);if(f&&!h)return!1;if(f&&n!=="GET")return!1;let c=h&&n==="GET"?h:await(n==="GET"?this.http.get(e,l):n==="PATCH"?this.http.patch(e,a,l):n==="POST"?this.http.post(e,a,l):this.http.put(e,a,l));if(!h)await r(e,{data:c.data,contentType:c.contentType,finalUrl:c.finalUrl});if(!f)await u(e);if(!c.contentType||!c.contentType.includes("/html")||!c.contentType.includes("text/")||typeof c.data!=="string")return null;return{data:c.data,contentType:c.contentType,finalUrl:c.finalUrl}}catch(f){let h=f,c=this.httpOptions;if(h&&h.response){let g=h.response.status,p=c.retryDelay||100,x=c.maxRetryAttempts||3,d=c.retryWithoutProxyOnStatusCode||void 0,w=c.maxRetryOnProxyError||3;if(d&&l.proxy&&d.includes(g)&&i<x)return await this.sleep(p),delete l.proxy,await this.executeHttp(e,n,a,t,o,i+1);else if(c.retryOnStatusCode&&l.proxy&&c.retryOnStatusCode.includes(g)&&i<x)return await this.sleep(p),await this.executeHttp(e,n,a,t,o,i+1);else if(c.retryOnProxyError&&l.proxy&&i<w)return await this.sleep(p),await this.executeHttp(e,n,a,t,o,i+1)}if(this.debug){if(this.debug)console.log(`Error: unable to ${n} ${e}: ${f.message}`)}return null}}extractEmails(e,n,a,t,o,i){let s=this.extractEmailsFromContent(e?.replaceAll("mailto:"," ")),r=[];for(let m of s)if(this.handleEmailDiscovery(m,n,a,o,i))r.push(m);if(t&&t.length>0&&r.length>0)o.add(async()=>Promise.all(t.map((m)=>m(r))));s.length=0,r.length=0}async parseExternalWebsite(e,n,a,t,o,i=!0,s,r){let m=t.httpConfig?.headers?t.httpConfig.headers instanceof Headers?Object.fromEntries(t.httpConfig.headers.entries()):t.httpConfig.headers:{};t.httpConfig=t.httpConfig||{},t.httpConfig.headers={"user-agent":this.getRandomUserAgent(),accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","accept-language":"en-US,en;q=0.9","cache-control":"no-cache",pragma:"no-cache",...m},t.httpConfig.timeout=t.httpConfig.timeout||15000,t.depth=t.depth||0,t.allowCrossDomainTravel=t.allowCrossDomainTravel||!1,o=o&&i;let u=[];try{let l=new URL(e),f=this.extractRootDomain(e);if(this.isLinktreeUrl(e))return await this.parseLinktreeProfile(e,t,o);if(this.isRestrictedDomain(e)){if(this.debug)console.warn(`⚠️ Skipped URL (restricted url): ${e}`);return u}let h=await this.executeHttp(e,n,a,t,o);if(!h){if(this.debug&&h===null)console.warn(`⚠️ Failed to fetch page content: ${e}`);if(this.debug&&h===!1)console.warn(`⚠️ Skipped URL (already visited): ${e}`);return u}let c=this.extractEmailsFromContent(h.data?.replaceAll("mailto:"," "));for(let g of c)if(this.handleEmailDiscovery(g,e,t.onEmailDiscovered,t.queue,t.emailMetadata))u.push(g);if(t.depth>0||!s){let g;{let{document:d}=k(h.data);g=this.extractRelevantLinks(d,l,f,t.depth,t.allowCrossDomainTravel)}t.depth--;let p=10,x=[];for(let d=0;d<g.length;d+=p){let w=g.slice(d,d+p),E=await Promise.allSettled(w.map((L)=>this.parseExternalWebsite(L,"GET",null,{...t,depth:t.depth},o,!1,!0)));x.push(...E)}for(let d of x)if(d.status==="fulfilled")u.push(...d.value);else if(this.debug)console.warn("⚠️ Failed to parse child URL:",d.reason?.message)}}catch(l){if(this.debug)console.error(`❌ Error parsing external website: ${e}`,l?.message)}if(i){if(t.onEmails&&t.onEmails.length>0)t.queue.add(async()=>Promise.all(t.onEmails.map((l)=>l(u))))}return u}async parseLinktreeProfile(e,n,a){let t=[];try{let o=await this.executeHttp(e,"GET",null,n,a);if(!o){if(this.debug)console.warn(`⚠️ Failed to fetch Linktree profile: ${e}`);return t}let i;{let{document:r}=k(o),m=r.getElementById("links-container");if(!m){if(this.debug)console.warn(`\uD83D\uDD0D No links container found in Linktree profile: ${e}`);return t}i=this.extractLinktreeExternalUrls(m,e)}if(i.length===0){if(this.debug)console.info("\uD83D\uDCED No valid external links found in Linktree profile");return t}if(this.debug)console.info(`\uD83C\uDFAF Found ${i.length} external links in Linktree profile`);let s=await Promise.allSettled(i.map((r)=>this.parseExternalWebsite(r,"GET",null,n,a,!1)));for(let r of s)if(r.status==="fulfilled")t.push(...r.value);else if(this.debug)console.warn("⚠️ Failed to parse Linktree external URL:",r.reason?.message)}catch(o){if(this.debug)console.error(`❌ Error parsing Linktree profile: ${e}`,o?.message)}return t}extractLinktreeExternalUrls(e,n){let a=new Set,t=e.querySelectorAll("a[href][target='_blank']");for(let o of t){let i=o.getAttribute("href");if(!i||i.length<3||this.forbiddenProtocols.some((s)=>i.startsWith(s)))continue;try{let s=new URL(i,n).href,r=this.extractRootDomain(s);if(r!=="linktr.ee"&&!this.isRestrictedDomain(s)&&r.length>3)a.add(s)}catch(s){if(this.debug)console.warn(`\uD83D\uDD17 Invalid URL in Linktree: ${i}`)}}return Array.from(a)}handleEmailDiscovery(e,n,a,t,o){if(!this.discoveredEmails.has(e)){this.discoveredEmails.add(e);let i={email:e,discoveredAt:n,timestamp:new Date,metadata:o||{}};if(a&&a.length>0)t.add(async()=>Promise.all(a.map((s)=>s(i))));if(this.debug)console.info(`\uD83D\uDCE7 New email discovered: ${e} at ${n}`);return!0}return!1}isDomainAccessAllowed(e,n,a,t){if(t)return!0;if(a===0)return e===n;return e===n||e.endsWith(`.${n}`)||n.endsWith(`.${e}`)}extractRelevantLinks(e,n,a,t,o){let i=[],s=["about","contact","help","support","reach","email","mail","message","company","team","staff","info","inquiry","feedback","service","assistance","connect","touch"],r=e.querySelectorAll("a[href]");for(let m of r){let u=m.getAttribute("href");if(!u||u.length<2)continue;try{let l=this.normalizeUrl(u,n),f=this.extractRootDomain(l);if(!this.isDomainAccessAllowed(f,a,t,o))continue;if(s.some((c)=>l.toLowerCase().includes(c))||this.isLinktreeUrl(l))i.push(l)}catch(l){if(this.debug)console.warn(`\uD83D\uDD17 Invalid link found: ${u}`,l?.message)}}return i}extractEmailsFromContent(e){let n=e.replace(b.CLEAN_CONTENT_REGEX," "),a=(s)=>{let r=s.split("@")[1]?.toLowerCase(),m=s.split(".").pop()?.toLowerCase();return b.EMAIL_VALIDATION_REGEX.test(s)&&r!==void 0&&m!==void 0&&!this.fileExtensions.includes(`.${m}`)&&!this.isRestrictedDomain(`https://${r}`)},t=(s)=>{return b.EMAIL_REGEX.lastIndex=0,(s.match(b.EMAIL_REGEX)||[]).filter(a)},o=e.replace(/<[^>]*>/g," "),i=[...t(o),...t(n)];return[...new Set(i)]}isRestrictedDomain(e){try{let n=new URL(e).host.toLowerCase();return this.restrictedDomains.some((a)=>n===a.toLowerCase()||n.endsWith(`.${a.toLowerCase()}`))}catch{return!0}}isLinktreeUrl(e){try{return this.extractRootDomain(e)==="linktr.ee"}catch{return!1}}extractRootDomain(e){try{let a=new URL(e).hostname.toLowerCase();return a.startsWith("www.")?a.slice(4):a}catch{return""}}normalizeUrl(e,n){if(e.startsWith("http://")||e.startsWith("https://"))return e;if(e.startsWith("//"))return`${n.protocol}${e}`;return new URL(e,n.href).href}getRandomUserAgent(){return this.userAgents[Math.floor(Math.random()*this.userAgents.length)]}}function C(){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"}],n=["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"],a=[];for(let t=0;t<200;t++){let o=e[Math.floor(Math.random()*e.length)],i=n[Math.floor(Math.random()*n.length)],s="";switch(o.name){case"Chrome":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36`;break;case"Firefox":s=`Mozilla/5.0 (${i}; rv:${o.version}) ${o.engine} Firefox/${o.version}`;break;case"Safari":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Version/${o.version} Safari/605.1.15`;break;case"Edge":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Edg/${o.version}`;break;case"Opera":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 OPR/${o.version}`;break;case"Vivaldi":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Vivaldi/${o.version}`;break;case"Brave":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Brave/${o.version}`;break;case"Chromium":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chromium/${o.version} Chrome/${o.version} Safari/537.36`;break;case"Yandex":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} YaBrowser/${o.version} Safari/537.36`;break;case"Maxthon":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Maxthon/${o.version}`;break}a.push(s)}return a}function y(){return["facebook.com","fb.com","messenger.com","instagram.com","threads.net","twitter.com","x.com","linkedin.com","pinterest.com","pin.it","reddit.com","tumblr.com","snapchat.com","tiktok.com","douyin.com","youtube.com","youtu.be","whatsapp.com","telegram.org","t.me","medium.com","quora.com","flickr.com","vimeo.com","vk.com","weibo.com","sina.com.cn","line.me","discord.com","discordapp.com","twitch.tv","meetup.com","nextdoor.com","xing.com","yelp.com","zalo.me","mastodon.social","clubhouse.com","patreon.com","onlyfans.com","douban.com","goodreads.com","soundcloud.com","spotify.com","last.fm","behance.net","dribbble.com","deviantart.com","pixiv.net","slideshare.net","tinder.com","bumble.com","etsy.com","indeed.com","glassdoor.com","monster.com","careerbuilder.com","dice.com","ziprecruiter.com","simplyhired.com","upwork.com","freelancer.com","fiverr.com","stackoverflow.com","stackoverflow.co","angel.co","wellfound.com","quora.com","stackexchange.com","yahoo.com","answers.microsoft.com","askubuntu.com","superuser.com","serverfault.com","mathoverflow.net","xda-developers.com","gamespot.com","ign.com","4chan.org","9gag.com","gizmodo.com","slashdot.org","hacker-news.news","ycombinator.com","producthunt.com","discourse.org","google.com","google.co.uk","google.de","google.fr","google.co.jp","bing.com","yahoo.com","search.yahoo.com","duckduckgo.com","baidu.com","yandex.com","yandex.ru","ask.com","wolframalpha.com","ecosia.org","startpage.com","qwant.com","searx.me","gibiru.com","swisscows.com","gmail.com","googlemail.com","outlook.com","hotmail.com","live.com","msn.com","yahoo.com","ymail.com","aol.com","icloud.com","me.com","mac.com","protonmail.com","pm.me","zoho.com","mail.com","gmx.com","gmx.net","yandex.com","yandex.ru","tutanota.com","tutanota.de","fastmail.com","hushmail.com","mailbox.org","posteo.de","runbox.com","disroot.org","163.com","qq.com","rambler.ru","mail.ru","yelp.com","yelp.ca","yelp.co.uk","yelp.com.au","yellowpages.com","yellowpages.ca","yell.com","tripadvisor.com","tripadvisor.co.uk","tripadvisor.ca","foursquare.com","angieslist.com","bbb.org","manta.com","thumbtack.com","homeadvisor.com","superpages.com","whitepages.com","local.com","citysearch.com","merchantcircle.com","insiderpages.com","kudzu.com","hotfrog.com","buildzoom.com","houzz.com","porch.com","mapquest.com","zagat.com","zomato.com","opentable.com","viator.com","expedia.com","booking.com","airbnb.com","vrbo.com","homeaway.com","craigslist.org","nextdoor.com","patch.com","meetup.com","eventbrite.com","groupon.com","livingsocial.com","gumtree.com","gumtree.com.au","kijiji.ca","leboncoin.fr","finn.no","blocket.se","58.com","dianping.com","tabelog.com","ypcdn.com"]}function $(e){try{let n=new URL(e).host.toLowerCase();return y().some((a)=>n===a.toLowerCase()||n.endsWith(`.${a.toLowerCase()}`))}catch{return!0}}exports.Scraper=b;exports.CappedSet=v;exports.isRestrictedDomain=$;
@@ -1 +1 @@
1
- import{parseHTML as w}from"linkedom";class k extends Set{maxSize;evictionCount;constructor(e,a=0.1){super();this.maxSize=e,this.evictionCount=Math.max(1,Math.ceil(e*a))}add(e){if(this.has(e))return this;if(this.size>=this.maxSize){let a=this.values();for(let n=0;n<this.evictionCount;n++){let t=a.next();if(t.done)break;this.delete(t.value)}}return super.add(e)}}class x{http;httpOptions;onEmailLeads;onEmailDiscovered;debug;static CLEAN_CONTENT_REGEX=/[^\w@.-\s]/g;static EMAIL_REGEX=/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g;static EMAIL_VALIDATION_REGEX=/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;discoveredEmails=new k(1e4);userAgents=[];fileExtensions=[];restrictedDomains=L();forbiddenProtocols=["mailto:","tel:","javascript:","data:","sms:","ftp:","file:","irc:","blob:","chrome:","about:","intent:"];constructor(e,a,n,t,o=!1){this.http=e,this.httpOptions=a,this.onEmailLeads=n,this.onEmailDiscovered=t,this.debug=o,this.userAgents=$()}sleep(e){return new Promise((a)=>setTimeout(a,e))}async executeHttp(e,a,n,t,o,i=0){let{getCache:s,saveCache:r,hasUrlInCache:m,saveUrl:u,httpConfig:l={}}=t;if(!e||e.length<3||this.forbiddenProtocols.some((f)=>e.startsWith(f)))return;try{let f=o?!1:await m(e),h=await s(e);if(f&&!h)return!1;if(f&&a!=="GET")return!1;let c=h&&a==="GET"?h:await(a==="GET"?this.http.get(e,l):a==="PATCH"?this.http.patch(e,n,l):a==="POST"?this.http.post(e,n,l):this.http.put(e,n,l));if(!h)await r(e,{data:c.data,contentType:c.contentType,finalUrl:c.finalUrl});if(!f)await u(e);if(!c.contentType||!c.contentType.includes("/html")||!c.contentType.includes("text/")||typeof c.data!=="string")return null;return{data:c.data,contentType:c.contentType,finalUrl:c.finalUrl}}catch(f){let h=f,c=this.httpOptions;if(h&&h.response){let g=h.response.status,p=c.retryDelay||100,b=c.maxRetryAttempts||3,d=c.retryWithoutProxyOnStatusCode||void 0,v=c.maxRetryOnProxyError||3;if(d&&l.proxy&&d.includes(g)&&i<b)return await this.sleep(p),delete l.proxy,await this.executeHttp(e,a,n,t,o,i+1);else if(c.retryOnStatusCode&&l.proxy&&c.retryOnStatusCode.includes(g)&&i<b)return await this.sleep(p),await this.executeHttp(e,a,n,t,o,i+1);else if(c.retryOnProxyError&&l.proxy&&i<v)return await this.sleep(p),await this.executeHttp(e,a,n,t,o,i+1)}if(this.debug){if(this.debug)console.log(`Error: unable to ${a} ${e}: ${f.message}`)}return null}}extractEmails(e,a,n,t,o,i){let s=this.extractEmailsFromContent(e?.replaceAll("mailto:"," ")),r=[];for(let m of s)if(this.handleEmailDiscovery(m,a,n,o,i))r.push(m);if(t&&t.length>0&&r.length>0)o.add(async()=>Promise.all(t.map((m)=>m(r))));s.length=0,r.length=0}async parseExternalWebsite(e,a,n,t,o,i=!0,s,r){let m=t.httpConfig?.headers?t.httpConfig.headers instanceof Headers?Object.fromEntries(t.httpConfig.headers.entries()):t.httpConfig.headers:{};t.httpConfig=t.httpConfig||{},t.httpConfig.headers={"user-agent":this.getRandomUserAgent(),accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","accept-language":"en-US,en;q=0.9","cache-control":"no-cache",pragma:"no-cache",...m},t.httpConfig.timeout=t.httpConfig.timeout||15000,t.depth=t.depth||0,t.allowCrossDomainTravel=t.allowCrossDomainTravel||!1,o=o&&i;let u=[];try{let l=new URL(e),f=this.extractRootDomain(e);if(this.isLinktreeUrl(e))return await this.parseLinktreeProfile(e,t,o);if(this.isRestrictedDomain(e)){if(this.debug)console.warn(`⚠️ Skipped URL (restricted url): ${e}`);return u}let h=await this.executeHttp(e,a,n,t,o);if(!h){if(this.debug&&h===null)console.warn(`⚠️ Failed to fetch page content: ${e}`);if(this.debug&&h===!1)console.warn(`⚠️ Skipped URL (already visited): ${e}`);return u}let c=this.extractEmailsFromContent(h.data?.replaceAll("mailto:"," "));for(let g of c)if(this.handleEmailDiscovery(g,e,t.onEmailDiscovered,t.queue,t.emailMetadata))u.push(g);if(t.depth>0||!s){let g;{let{document:d}=w(h.data);g=this.extractRelevantLinks(d,l,f,t.depth,t.allowCrossDomainTravel)}t.depth--;let p=10,b=[];for(let d=0;d<g.length;d+=p){let v=g.slice(d,d+p),y=await Promise.allSettled(v.map((E)=>this.parseExternalWebsite(E,"GET",null,{...t,depth:t.depth},o,!1,!0)));b.push(...y)}for(let d of b)if(d.status==="fulfilled")u.push(...d.value);else if(this.debug)console.warn("⚠️ Failed to parse child URL:",d.reason?.message)}}catch(l){if(this.debug)console.error(`❌ Error parsing external website: ${e}`,l?.message)}if(i){if(t.onEmails&&t.onEmails.length>0)t.queue.add(async()=>Promise.all(t.onEmails.map((l)=>l(u))))}return u}async parseLinktreeProfile(e,a,n){let t=[];try{let o=await this.executeHttp(e,"GET",null,a,n);if(!o){if(this.debug)console.warn(`⚠️ Failed to fetch Linktree profile: ${e}`);return t}let i;{let{document:r}=w(o),m=r.getElementById("links-container");if(!m){if(this.debug)console.warn(`\uD83D\uDD0D No links container found in Linktree profile: ${e}`);return t}i=this.extractLinktreeExternalUrls(m,e)}if(i.length===0){if(this.debug)console.info("\uD83D\uDCED No valid external links found in Linktree profile");return t}if(this.debug)console.info(`\uD83C\uDFAF Found ${i.length} external links in Linktree profile`);let s=await Promise.allSettled(i.map((r)=>this.parseExternalWebsite(r,"GET",null,a,n,!1)));for(let r of s)if(r.status==="fulfilled")t.push(...r.value);else if(this.debug)console.warn("⚠️ Failed to parse Linktree external URL:",r.reason?.message)}catch(o){if(this.debug)console.error(`❌ Error parsing Linktree profile: ${e}`,o?.message)}return t}extractLinktreeExternalUrls(e,a){let n=new Set,t=e.querySelectorAll("a[href][target='_blank']");for(let o of t){let i=o.getAttribute("href");if(!i||i.length<3||this.forbiddenProtocols.some((s)=>i.startsWith(s)))continue;try{let s=new URL(i,a).href,r=this.extractRootDomain(s);if(r!=="linktr.ee"&&!this.isRestrictedDomain(s)&&r.length>3)n.add(s)}catch(s){if(this.debug)console.warn(`\uD83D\uDD17 Invalid URL in Linktree: ${i}`)}}return Array.from(n)}handleEmailDiscovery(e,a,n,t,o){if(!this.discoveredEmails.has(e)){this.discoveredEmails.add(e);let i={email:e,discoveredAt:a,timestamp:new Date,metadata:o||{}};if(n&&n.length>0)t.add(async()=>Promise.all(n.map((s)=>s(i))));if(this.debug)console.info(`\uD83D\uDCE7 New email discovered: ${e} at ${a}`);return!0}return!1}isDomainAccessAllowed(e,a,n,t){if(t)return!0;if(n===0)return e===a;return e===a||e.endsWith(`.${a}`)||a.endsWith(`.${e}`)}extractRelevantLinks(e,a,n,t,o){let i=[],s=["about","contact","help","support","reach","email","mail","message","company","team","staff","info","inquiry","feedback","service","assistance","connect","touch"],r=e.querySelectorAll("a[href]");for(let m of r){let u=m.getAttribute("href");if(!u||u.length<2)continue;try{let l=this.normalizeUrl(u,a),f=this.extractRootDomain(l);if(!this.isDomainAccessAllowed(f,n,t,o))continue;if(s.some((c)=>l.toLowerCase().includes(c))||this.isLinktreeUrl(l))i.push(l)}catch(l){if(this.debug)console.warn(`\uD83D\uDD17 Invalid link found: ${u}`,l?.message)}}return i}extractEmailsFromContent(e){let a=e.replace(x.CLEAN_CONTENT_REGEX," "),n=(s)=>{let r=s.split("@")[1]?.toLowerCase(),m=s.split(".").pop()?.toLowerCase();return x.EMAIL_VALIDATION_REGEX.test(s)&&r!==void 0&&m!==void 0&&!this.fileExtensions.includes(`.${m}`)&&!this.isRestrictedDomain(`https://${r}`)},t=(s)=>{return x.EMAIL_REGEX.lastIndex=0,(s.match(x.EMAIL_REGEX)||[]).filter(n)},o=e.replace(/<[^>]*>/g," "),i=[...t(o),...t(a)];return[...new Set(i)]}isRestrictedDomain(e){try{let a=new URL(e).host.toLowerCase();return this.restrictedDomains.some((n)=>a===n.toLowerCase()||a.endsWith(`.${n.toLowerCase()}`))}catch{return!0}}isLinktreeUrl(e){try{return this.extractRootDomain(e)==="linktr.ee"}catch{return!1}}extractRootDomain(e){try{let n=new URL(e).hostname.toLowerCase();return n.startsWith("www.")?n.slice(4):n}catch{return""}}normalizeUrl(e,a){if(e.startsWith("http://")||e.startsWith("https://"))return e;if(e.startsWith("//"))return`${a.protocol}${e}`;return new URL(e,a.href).href}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"}],a=["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"],n=[];for(let t=0;t<200;t++){let o=e[Math.floor(Math.random()*e.length)],i=a[Math.floor(Math.random()*a.length)],s="";switch(o.name){case"Chrome":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36`;break;case"Firefox":s=`Mozilla/5.0 (${i}; rv:${o.version}) ${o.engine} Firefox/${o.version}`;break;case"Safari":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Version/${o.version} Safari/605.1.15`;break;case"Edge":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Edg/${o.version}`;break;case"Opera":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 OPR/${o.version}`;break;case"Vivaldi":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Vivaldi/${o.version}`;break;case"Brave":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Brave/${o.version}`;break;case"Chromium":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chromium/${o.version} Chrome/${o.version} Safari/537.36`;break;case"Yandex":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} YaBrowser/${o.version} Safari/537.36`;break;case"Maxthon":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Maxthon/${o.version}`;break}n.push(s)}return n}function L(){return["facebook.com","fb.com","messenger.com","instagram.com","threads.net","twitter.com","x.com","linkedin.com","pinterest.com","pin.it","reddit.com","tumblr.com","snapchat.com","tiktok.com","douyin.com","youtube.com","youtu.be","whatsapp.com","telegram.org","t.me","medium.com","quora.com","flickr.com","vimeo.com","vk.com","weibo.com","sina.com.cn","line.me","discord.com","discordapp.com","twitch.tv","meetup.com","nextdoor.com","xing.com","yelp.com","zalo.me","mastodon.social","clubhouse.com","patreon.com","onlyfans.com","douban.com","goodreads.com","soundcloud.com","spotify.com","last.fm","behance.net","dribbble.com","deviantart.com","pixiv.net","slideshare.net","tinder.com","bumble.com","etsy.com","indeed.com","glassdoor.com","monster.com","careerbuilder.com","dice.com","ziprecruiter.com","simplyhired.com","upwork.com","freelancer.com","fiverr.com","stackoverflow.com","stackoverflow.co","angel.co","wellfound.com","quora.com","stackexchange.com","yahoo.com","answers.microsoft.com","askubuntu.com","superuser.com","serverfault.com","mathoverflow.net","xda-developers.com","gamespot.com","ign.com","4chan.org","9gag.com","gizmodo.com","slashdot.org","hacker-news.news","ycombinator.com","producthunt.com","discourse.org","google.com","google.co.uk","google.de","google.fr","google.co.jp","bing.com","yahoo.com","search.yahoo.com","duckduckgo.com","baidu.com","yandex.com","yandex.ru","ask.com","wolframalpha.com","ecosia.org","startpage.com","qwant.com","searx.me","gibiru.com","swisscows.com","gmail.com","googlemail.com","outlook.com","hotmail.com","live.com","msn.com","yahoo.com","ymail.com","aol.com","icloud.com","me.com","mac.com","protonmail.com","pm.me","zoho.com","mail.com","gmx.com","gmx.net","yandex.com","yandex.ru","tutanota.com","tutanota.de","fastmail.com","hushmail.com","mailbox.org","posteo.de","runbox.com","disroot.org","163.com","qq.com","rambler.ru","mail.ru","yelp.com","yelp.ca","yelp.co.uk","yelp.com.au","yellowpages.com","yellowpages.ca","yell.com","tripadvisor.com","tripadvisor.co.uk","tripadvisor.ca","foursquare.com","angieslist.com","bbb.org","manta.com","thumbtack.com","homeadvisor.com","superpages.com","whitepages.com","local.com","citysearch.com","merchantcircle.com","insiderpages.com","kudzu.com","hotfrog.com","buildzoom.com","houzz.com","porch.com","mapquest.com","zagat.com","zomato.com","opentable.com","viator.com","expedia.com","booking.com","airbnb.com","vrbo.com","homeaway.com","craigslist.org","nextdoor.com","patch.com","meetup.com","eventbrite.com","groupon.com","livingsocial.com","gumtree.com","gumtree.com.au","kijiji.ca","leboncoin.fr","finn.no","blocket.se","58.com","dianping.com","tabelog.com","ypcdn.com"]}export{x as Scraper,k as CappedSet};
1
+ import{parseHTML as v}from"linkedom";class k extends Set{maxSize;evictionCount;constructor(e,n=0.1){super();this.maxSize=e,this.evictionCount=Math.max(1,Math.ceil(e*n))}add(e){if(this.has(e))return this;if(this.size>=this.maxSize){let n=this.values();for(let a=0;a<this.evictionCount;a++){let t=n.next();if(t.done)break;this.delete(t.value)}}return super.add(e)}}class x{http;httpOptions;onEmailLeads;onEmailDiscovered;debug;static CLEAN_CONTENT_REGEX=/[^\w@.-\s]/g;static EMAIL_REGEX=/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g;static EMAIL_VALIDATION_REGEX=/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;discoveredEmails=new k(1e4);userAgents=[];fileExtensions=[];restrictedDomains=y();forbiddenProtocols=["mailto:","tel:","javascript:","data:","sms:","ftp:","file:","irc:","blob:","chrome:","about:","intent:"];constructor(e,n,a,t,o=!1){this.http=e,this.httpOptions=n,this.onEmailLeads=a,this.onEmailDiscovered=t,this.debug=o,this.userAgents=C()}sleep(e){return new Promise((n)=>setTimeout(n,e))}async executeHttp(e,n,a,t,o,i=0){let{getCache:s,saveCache:r,hasUrlInCache:m,saveUrl:u,httpConfig:l={}}=t;if(!e||e.length<3||this.forbiddenProtocols.some((f)=>e.startsWith(f)))return;try{let f=o?!1:await m(e),h=await s(e);if(f&&!h)return!1;if(f&&n!=="GET")return!1;let c=h&&n==="GET"?h:await(n==="GET"?this.http.get(e,l):n==="PATCH"?this.http.patch(e,a,l):n==="POST"?this.http.post(e,a,l):this.http.put(e,a,l));if(!h)await r(e,{data:c.data,contentType:c.contentType,finalUrl:c.finalUrl});if(!f)await u(e);if(!c.contentType||!c.contentType.includes("/html")||!c.contentType.includes("text/")||typeof c.data!=="string")return null;return{data:c.data,contentType:c.contentType,finalUrl:c.finalUrl}}catch(f){let h=f,c=this.httpOptions;if(h&&h.response){let g=h.response.status,p=c.retryDelay||100,b=c.maxRetryAttempts||3,d=c.retryWithoutProxyOnStatusCode||void 0,w=c.maxRetryOnProxyError||3;if(d&&l.proxy&&d.includes(g)&&i<b)return await this.sleep(p),delete l.proxy,await this.executeHttp(e,n,a,t,o,i+1);else if(c.retryOnStatusCode&&l.proxy&&c.retryOnStatusCode.includes(g)&&i<b)return await this.sleep(p),await this.executeHttp(e,n,a,t,o,i+1);else if(c.retryOnProxyError&&l.proxy&&i<w)return await this.sleep(p),await this.executeHttp(e,n,a,t,o,i+1)}if(this.debug){if(this.debug)console.log(`Error: unable to ${n} ${e}: ${f.message}`)}return null}}extractEmails(e,n,a,t,o,i){let s=this.extractEmailsFromContent(e?.replaceAll("mailto:"," ")),r=[];for(let m of s)if(this.handleEmailDiscovery(m,n,a,o,i))r.push(m);if(t&&t.length>0&&r.length>0)o.add(async()=>Promise.all(t.map((m)=>m(r))));s.length=0,r.length=0}async parseExternalWebsite(e,n,a,t,o,i=!0,s,r){let m=t.httpConfig?.headers?t.httpConfig.headers instanceof Headers?Object.fromEntries(t.httpConfig.headers.entries()):t.httpConfig.headers:{};t.httpConfig=t.httpConfig||{},t.httpConfig.headers={"user-agent":this.getRandomUserAgent(),accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","accept-language":"en-US,en;q=0.9","cache-control":"no-cache",pragma:"no-cache",...m},t.httpConfig.timeout=t.httpConfig.timeout||15000,t.depth=t.depth||0,t.allowCrossDomainTravel=t.allowCrossDomainTravel||!1,o=o&&i;let u=[];try{let l=new URL(e),f=this.extractRootDomain(e);if(this.isLinktreeUrl(e))return await this.parseLinktreeProfile(e,t,o);if(this.isRestrictedDomain(e)){if(this.debug)console.warn(`⚠️ Skipped URL (restricted url): ${e}`);return u}let h=await this.executeHttp(e,n,a,t,o);if(!h){if(this.debug&&h===null)console.warn(`⚠️ Failed to fetch page content: ${e}`);if(this.debug&&h===!1)console.warn(`⚠️ Skipped URL (already visited): ${e}`);return u}let c=this.extractEmailsFromContent(h.data?.replaceAll("mailto:"," "));for(let g of c)if(this.handleEmailDiscovery(g,e,t.onEmailDiscovered,t.queue,t.emailMetadata))u.push(g);if(t.depth>0||!s){let g;{let{document:d}=v(h.data);g=this.extractRelevantLinks(d,l,f,t.depth,t.allowCrossDomainTravel)}t.depth--;let p=10,b=[];for(let d=0;d<g.length;d+=p){let w=g.slice(d,d+p),E=await Promise.allSettled(w.map((L)=>this.parseExternalWebsite(L,"GET",null,{...t,depth:t.depth},o,!1,!0)));b.push(...E)}for(let d of b)if(d.status==="fulfilled")u.push(...d.value);else if(this.debug)console.warn("⚠️ Failed to parse child URL:",d.reason?.message)}}catch(l){if(this.debug)console.error(`❌ Error parsing external website: ${e}`,l?.message)}if(i){if(t.onEmails&&t.onEmails.length>0)t.queue.add(async()=>Promise.all(t.onEmails.map((l)=>l(u))))}return u}async parseLinktreeProfile(e,n,a){let t=[];try{let o=await this.executeHttp(e,"GET",null,n,a);if(!o){if(this.debug)console.warn(`⚠️ Failed to fetch Linktree profile: ${e}`);return t}let i;{let{document:r}=v(o),m=r.getElementById("links-container");if(!m){if(this.debug)console.warn(`\uD83D\uDD0D No links container found in Linktree profile: ${e}`);return t}i=this.extractLinktreeExternalUrls(m,e)}if(i.length===0){if(this.debug)console.info("\uD83D\uDCED No valid external links found in Linktree profile");return t}if(this.debug)console.info(`\uD83C\uDFAF Found ${i.length} external links in Linktree profile`);let s=await Promise.allSettled(i.map((r)=>this.parseExternalWebsite(r,"GET",null,n,a,!1)));for(let r of s)if(r.status==="fulfilled")t.push(...r.value);else if(this.debug)console.warn("⚠️ Failed to parse Linktree external URL:",r.reason?.message)}catch(o){if(this.debug)console.error(`❌ Error parsing Linktree profile: ${e}`,o?.message)}return t}extractLinktreeExternalUrls(e,n){let a=new Set,t=e.querySelectorAll("a[href][target='_blank']");for(let o of t){let i=o.getAttribute("href");if(!i||i.length<3||this.forbiddenProtocols.some((s)=>i.startsWith(s)))continue;try{let s=new URL(i,n).href,r=this.extractRootDomain(s);if(r!=="linktr.ee"&&!this.isRestrictedDomain(s)&&r.length>3)a.add(s)}catch(s){if(this.debug)console.warn(`\uD83D\uDD17 Invalid URL in Linktree: ${i}`)}}return Array.from(a)}handleEmailDiscovery(e,n,a,t,o){if(!this.discoveredEmails.has(e)){this.discoveredEmails.add(e);let i={email:e,discoveredAt:n,timestamp:new Date,metadata:o||{}};if(a&&a.length>0)t.add(async()=>Promise.all(a.map((s)=>s(i))));if(this.debug)console.info(`\uD83D\uDCE7 New email discovered: ${e} at ${n}`);return!0}return!1}isDomainAccessAllowed(e,n,a,t){if(t)return!0;if(a===0)return e===n;return e===n||e.endsWith(`.${n}`)||n.endsWith(`.${e}`)}extractRelevantLinks(e,n,a,t,o){let i=[],s=["about","contact","help","support","reach","email","mail","message","company","team","staff","info","inquiry","feedback","service","assistance","connect","touch"],r=e.querySelectorAll("a[href]");for(let m of r){let u=m.getAttribute("href");if(!u||u.length<2)continue;try{let l=this.normalizeUrl(u,n),f=this.extractRootDomain(l);if(!this.isDomainAccessAllowed(f,a,t,o))continue;if(s.some((c)=>l.toLowerCase().includes(c))||this.isLinktreeUrl(l))i.push(l)}catch(l){if(this.debug)console.warn(`\uD83D\uDD17 Invalid link found: ${u}`,l?.message)}}return i}extractEmailsFromContent(e){let n=e.replace(x.CLEAN_CONTENT_REGEX," "),a=(s)=>{let r=s.split("@")[1]?.toLowerCase(),m=s.split(".").pop()?.toLowerCase();return x.EMAIL_VALIDATION_REGEX.test(s)&&r!==void 0&&m!==void 0&&!this.fileExtensions.includes(`.${m}`)&&!this.isRestrictedDomain(`https://${r}`)},t=(s)=>{return x.EMAIL_REGEX.lastIndex=0,(s.match(x.EMAIL_REGEX)||[]).filter(a)},o=e.replace(/<[^>]*>/g," "),i=[...t(o),...t(n)];return[...new Set(i)]}isRestrictedDomain(e){try{let n=new URL(e).host.toLowerCase();return this.restrictedDomains.some((a)=>n===a.toLowerCase()||n.endsWith(`.${a.toLowerCase()}`))}catch{return!0}}isLinktreeUrl(e){try{return this.extractRootDomain(e)==="linktr.ee"}catch{return!1}}extractRootDomain(e){try{let a=new URL(e).hostname.toLowerCase();return a.startsWith("www.")?a.slice(4):a}catch{return""}}normalizeUrl(e,n){if(e.startsWith("http://")||e.startsWith("https://"))return e;if(e.startsWith("//"))return`${n.protocol}${e}`;return new URL(e,n.href).href}getRandomUserAgent(){return this.userAgents[Math.floor(Math.random()*this.userAgents.length)]}}function C(){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"}],n=["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"],a=[];for(let t=0;t<200;t++){let o=e[Math.floor(Math.random()*e.length)],i=n[Math.floor(Math.random()*n.length)],s="";switch(o.name){case"Chrome":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36`;break;case"Firefox":s=`Mozilla/5.0 (${i}; rv:${o.version}) ${o.engine} Firefox/${o.version}`;break;case"Safari":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Version/${o.version} Safari/605.1.15`;break;case"Edge":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Edg/${o.version}`;break;case"Opera":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 OPR/${o.version}`;break;case"Vivaldi":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Vivaldi/${o.version}`;break;case"Brave":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Brave/${o.version}`;break;case"Chromium":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chromium/${o.version} Chrome/${o.version} Safari/537.36`;break;case"Yandex":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} YaBrowser/${o.version} Safari/537.36`;break;case"Maxthon":s=`Mozilla/5.0 (${i}) ${o.engine} (KHTML, like Gecko) Chrome/${o.version} Safari/537.36 Maxthon/${o.version}`;break}a.push(s)}return a}function y(){return["facebook.com","fb.com","messenger.com","instagram.com","threads.net","twitter.com","x.com","linkedin.com","pinterest.com","pin.it","reddit.com","tumblr.com","snapchat.com","tiktok.com","douyin.com","youtube.com","youtu.be","whatsapp.com","telegram.org","t.me","medium.com","quora.com","flickr.com","vimeo.com","vk.com","weibo.com","sina.com.cn","line.me","discord.com","discordapp.com","twitch.tv","meetup.com","nextdoor.com","xing.com","yelp.com","zalo.me","mastodon.social","clubhouse.com","patreon.com","onlyfans.com","douban.com","goodreads.com","soundcloud.com","spotify.com","last.fm","behance.net","dribbble.com","deviantart.com","pixiv.net","slideshare.net","tinder.com","bumble.com","etsy.com","indeed.com","glassdoor.com","monster.com","careerbuilder.com","dice.com","ziprecruiter.com","simplyhired.com","upwork.com","freelancer.com","fiverr.com","stackoverflow.com","stackoverflow.co","angel.co","wellfound.com","quora.com","stackexchange.com","yahoo.com","answers.microsoft.com","askubuntu.com","superuser.com","serverfault.com","mathoverflow.net","xda-developers.com","gamespot.com","ign.com","4chan.org","9gag.com","gizmodo.com","slashdot.org","hacker-news.news","ycombinator.com","producthunt.com","discourse.org","google.com","google.co.uk","google.de","google.fr","google.co.jp","bing.com","yahoo.com","search.yahoo.com","duckduckgo.com","baidu.com","yandex.com","yandex.ru","ask.com","wolframalpha.com","ecosia.org","startpage.com","qwant.com","searx.me","gibiru.com","swisscows.com","gmail.com","googlemail.com","outlook.com","hotmail.com","live.com","msn.com","yahoo.com","ymail.com","aol.com","icloud.com","me.com","mac.com","protonmail.com","pm.me","zoho.com","mail.com","gmx.com","gmx.net","yandex.com","yandex.ru","tutanota.com","tutanota.de","fastmail.com","hushmail.com","mailbox.org","posteo.de","runbox.com","disroot.org","163.com","qq.com","rambler.ru","mail.ru","yelp.com","yelp.ca","yelp.co.uk","yelp.com.au","yellowpages.com","yellowpages.ca","yell.com","tripadvisor.com","tripadvisor.co.uk","tripadvisor.ca","foursquare.com","angieslist.com","bbb.org","manta.com","thumbtack.com","homeadvisor.com","superpages.com","whitepages.com","local.com","citysearch.com","merchantcircle.com","insiderpages.com","kudzu.com","hotfrog.com","buildzoom.com","houzz.com","porch.com","mapquest.com","zagat.com","zomato.com","opentable.com","viator.com","expedia.com","booking.com","airbnb.com","vrbo.com","homeaway.com","craigslist.org","nextdoor.com","patch.com","meetup.com","eventbrite.com","groupon.com","livingsocial.com","gumtree.com","gumtree.com.au","kijiji.ca","leboncoin.fr","finn.no","blocket.se","58.com","dianping.com","tabelog.com","ypcdn.com"]}function A(e){try{let n=new URL(e).host.toLowerCase();return y().some((a)=>n===a.toLowerCase()||n.endsWith(`.${a.toLowerCase()}`))}catch{return!0}}export{A as isRestrictedDomain,x as Scraper,k as CappedSet};
package/dist/crawler.d.ts CHANGED
@@ -7200,6 +7200,8 @@ export declare class Crawler {
7200
7200
  private readonly rawResponseEvents;
7201
7201
  private emailDiscoveredEvents;
7202
7202
  private emailLeadsEvents;
7203
+ /** Counter for active event handlers (not queued, runs directly) */
7204
+ private eventCount;
7203
7205
  /**
7204
7206
  * Key-value cache instance for storing HTTP responses.
7205
7207
  * Uses SQLite as the underlying storage mechanism.
@@ -7751,6 +7753,16 @@ export declare class Crawler {
7751
7753
  * Called when onQueueChange handlers are registered to ensure limiter events are captured.
7752
7754
  */
7753
7755
  private _subscribeToLimiterQueues;
7756
+ /**
7757
+ * Run a handler with event tracking (not through queue).
7758
+ * Increments eventCount before running, decrements after completion.
7759
+ * This allows waitForAll() to wait for handlers without queue bloat.
7760
+ */
7761
+ private _runHandler;
7762
+ /**
7763
+ * Run a bound handler (using .call()) with event tracking.
7764
+ */
7765
+ private _runBoundHandler;
7754
7766
  private _onBody;
7755
7767
  private _onAttribute;
7756
7768
  private _onText;
@@ -1,4 +1,4 @@
1
- const _mod_6bmlfo = require('../crawler/crawler.cjs');
2
- exports.Crawler = _mod_6bmlfo.Crawler;;
3
- const _mod_4nabp1 = require('../crawler/crawler-options.cjs');
4
- exports.CrawlerOptions = _mod_4nabp1.CrawlerOptions;;
1
+ const _mod_qcl1xk = require('../crawler/crawler.cjs');
2
+ exports.Crawler = _mod_qcl1xk.Crawler;;
3
+ const _mod_m4i5gz = require('../crawler/crawler-options.cjs');
4
+ exports.CrawlerOptions = _mod_m4i5gz.CrawlerOptions;;
package/dist/index.cjs CHANGED
@@ -1,30 +1,30 @@
1
- const _mod_uyga9f = require('./core/rezo.cjs');
2
- exports.Rezo = _mod_uyga9f.Rezo;
3
- exports.createRezoInstance = _mod_uyga9f.createRezoInstance;
4
- exports.createDefaultInstance = _mod_uyga9f.createDefaultInstance;;
5
- const _mod_w3fnjx = require('./errors/rezo-error.cjs');
6
- exports.RezoError = _mod_w3fnjx.RezoError;
7
- exports.RezoErrorCode = _mod_w3fnjx.RezoErrorCode;;
8
- const _mod_cfn1g3 = require('./utils/headers.cjs');
9
- exports.RezoHeaders = _mod_cfn1g3.RezoHeaders;;
10
- const _mod_ld3867 = require('./utils/form-data.cjs');
11
- exports.RezoFormData = _mod_ld3867.RezoFormData;;
12
- const _mod_um6gnq = require('./utils/cookies.cjs');
13
- exports.RezoCookieJar = _mod_um6gnq.RezoCookieJar;
14
- exports.Cookie = _mod_um6gnq.Cookie;;
15
- const _mod_2u2x4t = require('./utils/curl.cjs');
16
- exports.toCurl = _mod_2u2x4t.toCurl;
17
- exports.fromCurl = _mod_2u2x4t.fromCurl;;
18
- const _mod_l9fvot = require('./core/hooks.cjs');
19
- exports.createDefaultHooks = _mod_l9fvot.createDefaultHooks;
20
- exports.mergeHooks = _mod_l9fvot.mergeHooks;;
21
- const _mod_3we0pp = require('./proxy/manager.cjs');
22
- exports.ProxyManager = _mod_3we0pp.ProxyManager;;
23
- const _mod_m23nko = require('./queue/index.cjs');
24
- exports.RezoQueue = _mod_m23nko.RezoQueue;
25
- exports.HttpQueue = _mod_m23nko.HttpQueue;
26
- exports.Priority = _mod_m23nko.Priority;
27
- exports.HttpMethodPriority = _mod_m23nko.HttpMethodPriority;;
1
+ const _mod_vfaphs = require('./core/rezo.cjs');
2
+ exports.Rezo = _mod_vfaphs.Rezo;
3
+ exports.createRezoInstance = _mod_vfaphs.createRezoInstance;
4
+ exports.createDefaultInstance = _mod_vfaphs.createDefaultInstance;;
5
+ const _mod_of2frn = require('./errors/rezo-error.cjs');
6
+ exports.RezoError = _mod_of2frn.RezoError;
7
+ exports.RezoErrorCode = _mod_of2frn.RezoErrorCode;;
8
+ const _mod_340nsi = require('./utils/headers.cjs');
9
+ exports.RezoHeaders = _mod_340nsi.RezoHeaders;;
10
+ const _mod_h8tc2h = require('./utils/form-data.cjs');
11
+ exports.RezoFormData = _mod_h8tc2h.RezoFormData;;
12
+ const _mod_nogecb = require('./utils/cookies.cjs');
13
+ exports.RezoCookieJar = _mod_nogecb.RezoCookieJar;
14
+ exports.Cookie = _mod_nogecb.Cookie;;
15
+ const _mod_dem7ed = require('./utils/curl.cjs');
16
+ exports.toCurl = _mod_dem7ed.toCurl;
17
+ exports.fromCurl = _mod_dem7ed.fromCurl;;
18
+ const _mod_ajli2g = require('./core/hooks.cjs');
19
+ exports.createDefaultHooks = _mod_ajli2g.createDefaultHooks;
20
+ exports.mergeHooks = _mod_ajli2g.mergeHooks;;
21
+ const _mod_n46ifj = require('./proxy/manager.cjs');
22
+ exports.ProxyManager = _mod_n46ifj.ProxyManager;;
23
+ const _mod_c88szv = require('./queue/index.cjs');
24
+ exports.RezoQueue = _mod_c88szv.RezoQueue;
25
+ exports.HttpQueue = _mod_c88szv.HttpQueue;
26
+ exports.Priority = _mod_c88szv.Priority;
27
+ exports.HttpMethodPriority = _mod_c88szv.HttpMethodPriority;;
28
28
  const { RezoError } = require('./errors/rezo-error.cjs');
29
29
  const isRezoError = exports.isRezoError = RezoError.isRezoError;
30
30
  const Cancel = exports.Cancel = RezoError;
@@ -34,9 +34,9 @@ const isCancel = exports.isCancel = (error) => {
34
34
  };
35
35
  const all = exports.all = Promise.all.bind(Promise);
36
36
  const spread = exports.spread = (callback) => (array) => callback(...array);
37
- const _mod_zq73m7 = require('./version.cjs');
38
- exports.VERSION = _mod_zq73m7.VERSION;
39
- exports.PACKAGE_NAME = _mod_zq73m7.PACKAGE_NAME;;
37
+ const _mod_rw2too = require('./version.cjs');
38
+ exports.VERSION = _mod_rw2too.VERSION;
39
+ exports.PACKAGE_NAME = _mod_rw2too.PACKAGE_NAME;;
40
40
  const { executeRequest } = require('./adapters/http.cjs');
41
41
  const { setGlobalAdapter, createRezoInstance } = require('./core/rezo.cjs');
42
42
  setGlobalAdapter(executeRequest);
package/dist/index.d.ts CHANGED
@@ -4886,7 +4886,7 @@ export declare class HttpQueue extends RezoQueue<any> {
4886
4886
  *
4887
4887
  * IMPORTANT: Update these values when bumping package version.
4888
4888
  */
4889
- export declare const VERSION = "1.0.76";
4889
+ export declare const VERSION = "1.0.78";
4890
4890
  export declare const PACKAGE_NAME = "rezo";
4891
4891
  export declare const isRezoError: typeof RezoError.isRezoError;
4892
4892
  export declare const Cancel: typeof RezoError;
@@ -1,14 +1,14 @@
1
- const _mod_gg6p0c = require('./base.cjs');
2
- exports.Agent = _mod_gg6p0c.Agent;;
3
- const _mod_yk29a5 = require('./http-proxy.cjs');
4
- exports.HttpProxyAgent = _mod_yk29a5.HttpProxyAgent;;
5
- const _mod_gwxwmp = require('./https-proxy.cjs');
6
- exports.HttpsProxyAgent = _mod_gwxwmp.HttpsProxyAgent;;
7
- const _mod_hyjr95 = require('./socks-proxy.cjs');
8
- exports.SocksProxyAgent = _mod_hyjr95.SocksProxyAgent;;
9
- const _mod_f1pn5c = require('./socks-client.cjs');
10
- exports.SocksClient = _mod_f1pn5c.SocksClient;;
11
- const _mod_1yajei = require('./bun-socks-http.cjs');
12
- exports.bunHttp = _mod_1yajei.bunHttp;
13
- exports.isBunRuntime = _mod_1yajei.isBunRuntime;
14
- exports.isBunSocksRequest = _mod_1yajei.isBunSocksRequest;;
1
+ const _mod_w3wpi5 = require('./base.cjs');
2
+ exports.Agent = _mod_w3wpi5.Agent;;
3
+ const _mod_tkhiqu = require('./http-proxy.cjs');
4
+ exports.HttpProxyAgent = _mod_tkhiqu.HttpProxyAgent;;
5
+ const _mod_9x6z7a = require('./https-proxy.cjs');
6
+ exports.HttpsProxyAgent = _mod_9x6z7a.HttpsProxyAgent;;
7
+ const _mod_qt4do7 = require('./socks-proxy.cjs');
8
+ exports.SocksProxyAgent = _mod_qt4do7.SocksProxyAgent;;
9
+ const _mod_k5s6py = require('./socks-client.cjs');
10
+ exports.SocksClient = _mod_k5s6py.SocksClient;;
11
+ const _mod_6uihcw = require('./bun-socks-http.cjs');
12
+ exports.bunHttp = _mod_6uihcw.bunHttp;
13
+ exports.isBunRuntime = _mod_6uihcw.isBunRuntime;
14
+ exports.isBunSocksRequest = _mod_6uihcw.isBunSocksRequest;;
@@ -4582,7 +4582,7 @@ export interface RezoInstance extends Rezo {
4582
4582
  *
4583
4583
  * IMPORTANT: Update these values when bumping package version.
4584
4584
  */
4585
- export declare const VERSION = "1.0.76";
4585
+ export declare const VERSION = "1.0.78";
4586
4586
  export declare const isRezoError: typeof RezoError.isRezoError;
4587
4587
  export declare const Cancel: typeof RezoError;
4588
4588
  export declare const CancelToken: {
@@ -4582,7 +4582,7 @@ export interface RezoInstance extends Rezo {
4582
4582
  *
4583
4583
  * IMPORTANT: Update these values when bumping package version.
4584
4584
  */
4585
- export declare const VERSION = "1.0.76";
4585
+ export declare const VERSION = "1.0.78";
4586
4586
  export declare const isRezoError: typeof RezoError.isRezoError;
4587
4587
  export declare const Cancel: typeof RezoError;
4588
4588
  export declare const CancelToken: {
@@ -4582,7 +4582,7 @@ export interface RezoInstance extends Rezo {
4582
4582
  *
4583
4583
  * IMPORTANT: Update these values when bumping package version.
4584
4584
  */
4585
- export declare const VERSION = "1.0.76";
4585
+ export declare const VERSION = "1.0.78";
4586
4586
  export declare const isRezoError: typeof RezoError.isRezoError;
4587
4587
  export declare const Cancel: typeof RezoError;
4588
4588
  export declare const CancelToken: {
@@ -4582,7 +4582,7 @@ export interface RezoInstance extends Rezo {
4582
4582
  *
4583
4583
  * IMPORTANT: Update these values when bumping package version.
4584
4584
  */
4585
- export declare const VERSION = "1.0.76";
4585
+ export declare const VERSION = "1.0.78";
4586
4586
  export declare const isRezoError: typeof RezoError.isRezoError;
4587
4587
  export declare const Cancel: typeof RezoError;
4588
4588
  export declare const CancelToken: {
@@ -4582,7 +4582,7 @@ export interface RezoInstance extends Rezo {
4582
4582
  *
4583
4583
  * IMPORTANT: Update these values when bumping package version.
4584
4584
  */
4585
- export declare const VERSION = "1.0.76";
4585
+ export declare const VERSION = "1.0.78";
4586
4586
  export declare const isRezoError: typeof RezoError.isRezoError;
4587
4587
  export declare const Cancel: typeof RezoError;
4588
4588
  export declare const CancelToken: {
@@ -4582,7 +4582,7 @@ export interface RezoInstance extends Rezo {
4582
4582
  *
4583
4583
  * IMPORTANT: Update these values when bumping package version.
4584
4584
  */
4585
- export declare const VERSION = "1.0.76";
4585
+ export declare const VERSION = "1.0.78";
4586
4586
  export declare const isRezoError: typeof RezoError.isRezoError;
4587
4587
  export declare const Cancel: typeof RezoError;
4588
4588
  export declare const CancelToken: {
@@ -1,9 +1,9 @@
1
1
  const { Agent, HttpProxyAgent, HttpsProxyAgent, SocksProxyAgent } = require('../internal/agents/index.cjs');
2
2
  const { parseProxyString } = require('./parse.cjs');
3
- const _mod_g5wdrq = require('./manager.cjs');
4
- exports.ProxyManager = _mod_g5wdrq.ProxyManager;;
5
- const _mod_mcuozi = require('./parse.cjs');
6
- exports.parseProxyString = _mod_mcuozi.parseProxyString;;
3
+ const _mod_vkqfol = require('./manager.cjs');
4
+ exports.ProxyManager = _mod_vkqfol.ProxyManager;;
5
+ const _mod_9fbcpj = require('./parse.cjs');
6
+ exports.parseProxyString = _mod_9fbcpj.parseProxyString;;
7
7
  function createOptions(uri, opts) {
8
8
  if (uri instanceof URL || typeof uri === "string") {
9
9
  return {
@@ -1,8 +1,8 @@
1
- const _mod_vg5z50 = require('./queue.cjs');
2
- exports.RezoQueue = _mod_vg5z50.RezoQueue;;
3
- const _mod_ibwlue = require('./http-queue.cjs');
4
- exports.HttpQueue = _mod_ibwlue.HttpQueue;
5
- exports.extractDomain = _mod_ibwlue.extractDomain;;
6
- const _mod_jnmptv = require('./types.cjs');
7
- exports.Priority = _mod_jnmptv.Priority;
8
- exports.HttpMethodPriority = _mod_jnmptv.HttpMethodPriority;;
1
+ const _mod_fq49yc = require('./queue.cjs');
2
+ exports.RezoQueue = _mod_fq49yc.RezoQueue;;
3
+ const _mod_l43il2 = require('./http-queue.cjs');
4
+ exports.HttpQueue = _mod_l43il2.HttpQueue;
5
+ exports.extractDomain = _mod_l43il2.extractDomain;;
6
+ const _mod_brf3na = require('./types.cjs');
7
+ exports.Priority = _mod_brf3na.Priority;
8
+ exports.HttpMethodPriority = _mod_brf3na.HttpMethodPriority;;
@@ -1,11 +1,11 @@
1
- const _mod_wl7wnx = require('./event-emitter.cjs');
2
- exports.UniversalEventEmitter = _mod_wl7wnx.UniversalEventEmitter;;
3
- const _mod_a6km22 = require('./stream.cjs');
4
- exports.UniversalStreamResponse = _mod_a6km22.UniversalStreamResponse;
5
- exports.StreamResponse = _mod_a6km22.StreamResponse;;
6
- const _mod_0dk9cp = require('./download.cjs');
7
- exports.UniversalDownloadResponse = _mod_0dk9cp.UniversalDownloadResponse;
8
- exports.DownloadResponse = _mod_0dk9cp.DownloadResponse;;
9
- const _mod_v3kk6n = require('./upload.cjs');
10
- exports.UniversalUploadResponse = _mod_v3kk6n.UniversalUploadResponse;
11
- exports.UploadResponse = _mod_v3kk6n.UploadResponse;;
1
+ const _mod_jimq7c = require('./event-emitter.cjs');
2
+ exports.UniversalEventEmitter = _mod_jimq7c.UniversalEventEmitter;;
3
+ const _mod_m88wcs = require('./stream.cjs');
4
+ exports.UniversalStreamResponse = _mod_m88wcs.UniversalStreamResponse;
5
+ exports.StreamResponse = _mod_m88wcs.StreamResponse;;
6
+ const _mod_u873ev = require('./download.cjs');
7
+ exports.UniversalDownloadResponse = _mod_u873ev.UniversalDownloadResponse;
8
+ exports.DownloadResponse = _mod_u873ev.DownloadResponse;;
9
+ const _mod_x1pelx = require('./upload.cjs');
10
+ exports.UniversalUploadResponse = _mod_x1pelx.UniversalUploadResponse;
11
+ exports.UploadResponse = _mod_x1pelx.UploadResponse;;
package/dist/version.cjs CHANGED
@@ -1,2 +1,2 @@
1
- const VERSION = exports.VERSION = "1.0.76";
1
+ const VERSION = exports.VERSION = "1.0.78";
2
2
  const PACKAGE_NAME = exports.PACKAGE_NAME = "rezo";
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = "1.0.76";
1
+ export const VERSION = "1.0.78";
2
2
  export const PACKAGE_NAME = "rezo";
@@ -1,52 +1,52 @@
1
- const _mod_bwlia3 = require('./types.cjs');
2
- exports.WgetError = _mod_bwlia3.WgetError;;
3
- const _mod_ior70c = require('./asset-extractor.cjs');
4
- exports.AssetExtractor = _mod_ior70c.AssetExtractor;;
5
- const _mod_4gs7wl = require('./url-filter.cjs');
6
- exports.UrlFilter = _mod_4gs7wl.UrlFilter;;
7
- const _mod_pqaqrk = require('./file-writer.cjs');
8
- exports.FileWriter = _mod_pqaqrk.FileWriter;;
9
- const _mod_1gmuq7 = require('./robots.cjs');
10
- exports.RobotsHandler = _mod_1gmuq7.RobotsHandler;;
11
- const _mod_jtwega = require('./resume.cjs');
12
- exports.ResumeHandler = _mod_jtwega.ResumeHandler;;
13
- const _mod_kxdayw = require('./progress.cjs');
14
- exports.ProgressReporter = _mod_kxdayw.ProgressReporter;
15
- exports.ProgressTracker = _mod_kxdayw.ProgressTracker;
16
- exports.parseSize = _mod_kxdayw.parseSize;;
17
- const _mod_eetcw2 = require('./link-converter.cjs');
18
- exports.LinkConverter = _mod_eetcw2.LinkConverter;;
19
- const _mod_kvfx8b = require('./downloader.cjs');
20
- exports.Downloader = _mod_kvfx8b.Downloader;;
21
- const _mod_tl3x2q = require('./asset-organizer.cjs');
22
- exports.AssetOrganizer = _mod_tl3x2q.AssetOrganizer;
23
- exports.DEFAULT_ASSET_FOLDERS = _mod_tl3x2q.DEFAULT_ASSET_FOLDERS;;
24
- const _mod_d60ii8 = require('./download-cache.cjs');
25
- exports.DownloadCache = _mod_d60ii8.DownloadCache;;
26
- const _mod_exqqlg = require('./filter-lists.cjs');
27
- exports.EXECUTABLE_EXTENSIONS = _mod_exqqlg.EXECUTABLE_EXTENSIONS;
28
- exports.ARCHIVE_EXTENSIONS = _mod_exqqlg.ARCHIVE_EXTENSIONS;
29
- exports.DOCUMENT_EXTENSIONS = _mod_exqqlg.DOCUMENT_EXTENSIONS;
30
- exports.IMAGE_EXTENSIONS = _mod_exqqlg.IMAGE_EXTENSIONS;
31
- exports.VIDEO_EXTENSIONS = _mod_exqqlg.VIDEO_EXTENSIONS;
32
- exports.AUDIO_EXTENSIONS = _mod_exqqlg.AUDIO_EXTENSIONS;
33
- exports.FONT_EXTENSIONS = _mod_exqqlg.FONT_EXTENSIONS;
34
- exports.WEB_ASSET_EXTENSIONS = _mod_exqqlg.WEB_ASSET_EXTENSIONS;
35
- exports.DATA_EXTENSIONS = _mod_exqqlg.DATA_EXTENSIONS;
36
- exports.EXECUTABLE_MIME_TYPES = _mod_exqqlg.EXECUTABLE_MIME_TYPES;
37
- exports.ARCHIVE_MIME_TYPES = _mod_exqqlg.ARCHIVE_MIME_TYPES;
38
- exports.DOCUMENT_MIME_TYPES = _mod_exqqlg.DOCUMENT_MIME_TYPES;
39
- exports.IMAGE_MIME_TYPES = _mod_exqqlg.IMAGE_MIME_TYPES;
40
- exports.VIDEO_MIME_TYPES = _mod_exqqlg.VIDEO_MIME_TYPES;
41
- exports.AUDIO_MIME_TYPES = _mod_exqqlg.AUDIO_MIME_TYPES;
42
- exports.FONT_MIME_TYPES = _mod_exqqlg.FONT_MIME_TYPES;
43
- exports.WEB_ASSET_MIME_TYPES = _mod_exqqlg.WEB_ASSET_MIME_TYPES;
44
- exports.DATA_MIME_TYPES = _mod_exqqlg.DATA_MIME_TYPES;
45
- exports.SAFE_WEB_PRESET = _mod_exqqlg.SAFE_WEB_PRESET;
46
- exports.DOCUMENTS_ONLY_PRESET = _mod_exqqlg.DOCUMENTS_ONLY_PRESET;
47
- exports.NO_MEDIA_PRESET = _mod_exqqlg.NO_MEDIA_PRESET;
48
- exports.MINIMAL_MIRROR_PRESET = _mod_exqqlg.MINIMAL_MIRROR_PRESET;
49
- exports.TEXT_ONLY_PRESET = _mod_exqqlg.TEXT_ONLY_PRESET;;
1
+ const _mod_zyus1m = require('./types.cjs');
2
+ exports.WgetError = _mod_zyus1m.WgetError;;
3
+ const _mod_wv8msk = require('./asset-extractor.cjs');
4
+ exports.AssetExtractor = _mod_wv8msk.AssetExtractor;;
5
+ const _mod_bphj0k = require('./url-filter.cjs');
6
+ exports.UrlFilter = _mod_bphj0k.UrlFilter;;
7
+ const _mod_ht925z = require('./file-writer.cjs');
8
+ exports.FileWriter = _mod_ht925z.FileWriter;;
9
+ const _mod_ldwidd = require('./robots.cjs');
10
+ exports.RobotsHandler = _mod_ldwidd.RobotsHandler;;
11
+ const _mod_8v1w99 = require('./resume.cjs');
12
+ exports.ResumeHandler = _mod_8v1w99.ResumeHandler;;
13
+ const _mod_pzzxi6 = require('./progress.cjs');
14
+ exports.ProgressReporter = _mod_pzzxi6.ProgressReporter;
15
+ exports.ProgressTracker = _mod_pzzxi6.ProgressTracker;
16
+ exports.parseSize = _mod_pzzxi6.parseSize;;
17
+ const _mod_xb50un = require('./link-converter.cjs');
18
+ exports.LinkConverter = _mod_xb50un.LinkConverter;;
19
+ const _mod_wqutce = require('./downloader.cjs');
20
+ exports.Downloader = _mod_wqutce.Downloader;;
21
+ const _mod_7xd59t = require('./asset-organizer.cjs');
22
+ exports.AssetOrganizer = _mod_7xd59t.AssetOrganizer;
23
+ exports.DEFAULT_ASSET_FOLDERS = _mod_7xd59t.DEFAULT_ASSET_FOLDERS;;
24
+ const _mod_obq3yt = require('./download-cache.cjs');
25
+ exports.DownloadCache = _mod_obq3yt.DownloadCache;;
26
+ const _mod_svuqx6 = require('./filter-lists.cjs');
27
+ exports.EXECUTABLE_EXTENSIONS = _mod_svuqx6.EXECUTABLE_EXTENSIONS;
28
+ exports.ARCHIVE_EXTENSIONS = _mod_svuqx6.ARCHIVE_EXTENSIONS;
29
+ exports.DOCUMENT_EXTENSIONS = _mod_svuqx6.DOCUMENT_EXTENSIONS;
30
+ exports.IMAGE_EXTENSIONS = _mod_svuqx6.IMAGE_EXTENSIONS;
31
+ exports.VIDEO_EXTENSIONS = _mod_svuqx6.VIDEO_EXTENSIONS;
32
+ exports.AUDIO_EXTENSIONS = _mod_svuqx6.AUDIO_EXTENSIONS;
33
+ exports.FONT_EXTENSIONS = _mod_svuqx6.FONT_EXTENSIONS;
34
+ exports.WEB_ASSET_EXTENSIONS = _mod_svuqx6.WEB_ASSET_EXTENSIONS;
35
+ exports.DATA_EXTENSIONS = _mod_svuqx6.DATA_EXTENSIONS;
36
+ exports.EXECUTABLE_MIME_TYPES = _mod_svuqx6.EXECUTABLE_MIME_TYPES;
37
+ exports.ARCHIVE_MIME_TYPES = _mod_svuqx6.ARCHIVE_MIME_TYPES;
38
+ exports.DOCUMENT_MIME_TYPES = _mod_svuqx6.DOCUMENT_MIME_TYPES;
39
+ exports.IMAGE_MIME_TYPES = _mod_svuqx6.IMAGE_MIME_TYPES;
40
+ exports.VIDEO_MIME_TYPES = _mod_svuqx6.VIDEO_MIME_TYPES;
41
+ exports.AUDIO_MIME_TYPES = _mod_svuqx6.AUDIO_MIME_TYPES;
42
+ exports.FONT_MIME_TYPES = _mod_svuqx6.FONT_MIME_TYPES;
43
+ exports.WEB_ASSET_MIME_TYPES = _mod_svuqx6.WEB_ASSET_MIME_TYPES;
44
+ exports.DATA_MIME_TYPES = _mod_svuqx6.DATA_MIME_TYPES;
45
+ exports.SAFE_WEB_PRESET = _mod_svuqx6.SAFE_WEB_PRESET;
46
+ exports.DOCUMENTS_ONLY_PRESET = _mod_svuqx6.DOCUMENTS_ONLY_PRESET;
47
+ exports.NO_MEDIA_PRESET = _mod_svuqx6.NO_MEDIA_PRESET;
48
+ exports.MINIMAL_MIRROR_PRESET = _mod_svuqx6.MINIMAL_MIRROR_PRESET;
49
+ exports.TEXT_ONLY_PRESET = _mod_svuqx6.TEXT_ONLY_PRESET;;
50
50
  const { Downloader } = require('./downloader.cjs');
51
51
  const rezo = require('../index.cjs');
52
52
  const { promises: fs } = require("node:fs");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rezo",
3
- "version": "1.0.76",
3
+ "version": "1.0.78",
4
4
  "description": "Lightning-fast, enterprise-grade HTTP client for modern JavaScript. Full HTTP/2 support, intelligent cookie management, multiple adapters (HTTP, Fetch, cURL, XHR), streaming, proxy support (HTTP/HTTPS/SOCKS), and cross-environment compatibility.",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",