@rafikidota/cuba-ofertas-scraping 0.24.1 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/common/index.d.ts +4 -0
  2. package/dist/common/index.js +4 -0
  3. package/dist/common/index.js.map +1 -1
  4. package/dist/common/logger/constant/network-interceptor.d.ts +1 -0
  5. package/dist/common/logger/constant/network-interceptor.js +5 -0
  6. package/dist/common/logger/constant/network-interceptor.js.map +1 -0
  7. package/dist/common/logger/enum/handler-logger-context.enum.d.ts +8 -0
  8. package/dist/common/logger/enum/handler-logger-context.enum.js +13 -0
  9. package/dist/common/logger/enum/handler-logger-context.enum.js.map +1 -0
  10. package/dist/common/logger/enum/processor-logger-context.enum.d.ts +8 -0
  11. package/dist/common/logger/enum/processor-logger-context.enum.js +13 -0
  12. package/dist/common/logger/enum/processor-logger-context.enum.js.map +1 -0
  13. package/dist/common/logger/enum/router-logger-context.enum.d.ts +8 -0
  14. package/dist/common/logger/enum/router-logger-context.enum.js +13 -0
  15. package/dist/common/logger/enum/router-logger-context.enum.js.map +1 -0
  16. package/dist/modules/cloudflare/cloudflare.module.d.ts +2 -0
  17. package/dist/modules/cloudflare/cloudflare.module.js +33 -0
  18. package/dist/modules/cloudflare/cloudflare.module.js.map +1 -0
  19. package/dist/modules/cloudflare/cloudflare.service.d.ts +26 -0
  20. package/dist/modules/cloudflare/cloudflare.service.js +62 -0
  21. package/dist/modules/cloudflare/cloudflare.service.js.map +1 -0
  22. package/dist/modules/cloudflare/services/cloudflare-repository.service.d.ts +12 -0
  23. package/dist/modules/cloudflare/services/cloudflare-repository.service.js +55 -0
  24. package/dist/modules/cloudflare/services/cloudflare-repository.service.js.map +1 -0
  25. package/dist/modules/cloudflare/types/block-info.d.ts +7 -0
  26. package/dist/modules/cloudflare/types/block-info.js +3 -0
  27. package/dist/modules/cloudflare/types/block-info.js.map +1 -0
  28. package/dist/modules/cloudflare/types/handle-request.types.d.ts +18 -0
  29. package/dist/modules/cloudflare/types/handle-request.types.js +21 -0
  30. package/dist/modules/cloudflare/types/handle-request.types.js.map +1 -0
  31. package/dist/modules/cloudflare/types/normalize-response.types.d.ts +26 -0
  32. package/dist/modules/cloudflare/types/normalize-response.types.js +3 -0
  33. package/dist/modules/cloudflare/types/normalize-response.types.js.map +1 -0
  34. package/dist/modules/cloudflare/use-cases/check-cloudflare-block.use-case.d.ts +11 -0
  35. package/dist/modules/cloudflare/use-cases/check-cloudflare-block.use-case.js +46 -0
  36. package/dist/modules/cloudflare/use-cases/check-cloudflare-block.use-case.js.map +1 -0
  37. package/dist/modules/cloudflare/use-cases/normalize-cloudflare-response.use-case.d.ts +8 -0
  38. package/dist/modules/cloudflare/use-cases/normalize-cloudflare-response.use-case.js +55 -0
  39. package/dist/modules/cloudflare/use-cases/normalize-cloudflare-response.use-case.js.map +1 -0
  40. package/dist/modules/cloudflare/use-cases/report-cloudflare.use-case.d.ts +12 -0
  41. package/dist/modules/cloudflare/use-cases/report-cloudflare.use-case.js +41 -0
  42. package/dist/modules/cloudflare/use-cases/report-cloudflare.use-case.js.map +1 -0
  43. package/dist/modules/delayer/delayer.service.d.ts +1 -3
  44. package/dist/modules/delayer/delayer.service.js +3 -6
  45. package/dist/modules/delayer/delayer.service.js.map +1 -1
  46. package/dist/modules/index.d.ts +2 -0
  47. package/dist/modules/index.js +2 -0
  48. package/dist/modules/index.js.map +1 -1
  49. package/package.json +4 -1
@@ -28,6 +28,10 @@ export * from './interface/provider.interface';
28
28
  export * from './interface/province.interface';
29
29
  export * from './interface/scraping-result.interface';
30
30
  export * from './interface/transport-event.interface';
31
+ export * from './logger/constant/network-interceptor';
32
+ export * from './logger/enum/handler-logger-context.enum';
33
+ export * from './logger/enum/processor-logger-context.enum';
34
+ export * from './logger/enum/router-logger-context.enum';
31
35
  export * from './logger/logger';
32
36
  export * from './types/country';
33
37
  export * from './types/delay-range';
@@ -44,6 +44,10 @@ __exportStar(require("./interface/provider.interface"), exports);
44
44
  __exportStar(require("./interface/province.interface"), exports);
45
45
  __exportStar(require("./interface/scraping-result.interface"), exports);
46
46
  __exportStar(require("./interface/transport-event.interface"), exports);
47
+ __exportStar(require("./logger/constant/network-interceptor"), exports);
48
+ __exportStar(require("./logger/enum/handler-logger-context.enum"), exports);
49
+ __exportStar(require("./logger/enum/processor-logger-context.enum"), exports);
50
+ __exportStar(require("./logger/enum/router-logger-context.enum"), exports);
47
51
  __exportStar(require("./logger/logger"), exports);
48
52
  __exportStar(require("./types/country"), exports);
49
53
  __exportStar(require("./types/delay-range"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,iDAA+B;AAC/B,uDAAqC;AACrC,kDAAgC;AAChC,mDAAiC;AACjC,mDAAiC;AACjC,yDAAuC;AACvC,qEAAmD;AACnD,0DAAwC;AAExC,4DAA0C;AAC1C,oDAAkC;AAClC,sDAAoC;AACpC,qDAAmC;AACnC,kDAAgC;AAEhC,oDAAkC;AAClC,sDAAoC;AACpC,2DAAyC;AACzC,6DAA2C;AAC3C,qEAAmD;AACnD,4DAA0C;AAE1C,2DAAyC;AACzC,+DAA6C;AAE7C,iEAA+C;AAC/C,+DAA6C;AAC7C,qEAAmD;AACnD,gEAA8C;AAC9C,iEAA+C;AAC/C,iEAA+C;AAC/C,wEAAsD;AACtD,wEAAsD;AAEtD,kDAAgC;AAEhC,kDAAgC;AAChC,sDAAoC;AACpC,mDAAiC;AACjC,mDAAiC;AACjC,iDAA+B;AAC/B,2DAAyC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,iDAA+B;AAC/B,uDAAqC;AACrC,kDAAgC;AAChC,mDAAiC;AACjC,mDAAiC;AACjC,yDAAuC;AACvC,qEAAmD;AACnD,0DAAwC;AAExC,4DAA0C;AAC1C,oDAAkC;AAClC,sDAAoC;AACpC,qDAAmC;AACnC,kDAAgC;AAEhC,oDAAkC;AAClC,sDAAoC;AACpC,2DAAyC;AACzC,6DAA2C;AAC3C,qEAAmD;AACnD,4DAA0C;AAE1C,2DAAyC;AACzC,+DAA6C;AAE7C,iEAA+C;AAC/C,+DAA6C;AAC7C,qEAAmD;AACnD,gEAA8C;AAC9C,iEAA+C;AAC/C,iEAA+C;AAC/C,wEAAsD;AACtD,wEAAsD;AAEtD,wEAAsD;AACtD,4EAA0D;AAC1D,8EAA4D;AAC5D,2EAAyD;AACzD,kDAAgC;AAEhC,kDAAgC;AAChC,sDAAoC;AACpC,mDAAiC;AACjC,mDAAiC;AACjC,iDAA+B;AAC/B,2DAAyC"}
@@ -0,0 +1 @@
1
+ export declare const NETWORK_INTERCEPTOR = "NetworkInterceptor";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NETWORK_INTERCEPTOR = void 0;
4
+ exports.NETWORK_INTERCEPTOR = 'NetworkInterceptor';
5
+ //# sourceMappingURL=network-interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-interceptor.js","sourceRoot":"","sources":["../../../../src/common/logger/constant/network-interceptor.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare enum HandlerLoggerContext {
2
+ CATEGORY = "CategoryHandler",
3
+ PAGINATION = "PaginationHandler",
4
+ PRODUCT = "ProductHandler",
5
+ PROVIDER = "ProviderHandler",
6
+ PROVINCE = "ProvinceHandler",
7
+ ERROR = "ErrorHandler"
8
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HandlerLoggerContext = void 0;
4
+ var HandlerLoggerContext;
5
+ (function (HandlerLoggerContext) {
6
+ HandlerLoggerContext["CATEGORY"] = "CategoryHandler";
7
+ HandlerLoggerContext["PAGINATION"] = "PaginationHandler";
8
+ HandlerLoggerContext["PRODUCT"] = "ProductHandler";
9
+ HandlerLoggerContext["PROVIDER"] = "ProviderHandler";
10
+ HandlerLoggerContext["PROVINCE"] = "ProvinceHandler";
11
+ HandlerLoggerContext["ERROR"] = "ErrorHandler";
12
+ })(HandlerLoggerContext || (exports.HandlerLoggerContext = HandlerLoggerContext = {}));
13
+ //# sourceMappingURL=handler-logger-context.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler-logger-context.enum.js","sourceRoot":"","sources":["../../../../src/common/logger/enum/handler-logger-context.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,oBAOX;AAPD,WAAY,oBAAoB;IAC9B,oDAA4B,CAAA;IAC5B,wDAAgC,CAAA;IAChC,kDAA0B,CAAA;IAC1B,oDAA4B,CAAA;IAC5B,oDAA4B,CAAA;IAC5B,8CAAsB,CAAA;AACxB,CAAC,EAPW,oBAAoB,oCAApB,oBAAoB,QAO/B"}
@@ -0,0 +1,8 @@
1
+ export declare enum ProcessorLoggerContext {
2
+ CATEGORY = "CategoryProcessor",
3
+ PAGINATION = "PaginationProcessor",
4
+ PRODUCT = "ProductProcessor",
5
+ PROVIDER = "ProviderProcessor",
6
+ PROVINCE = "ProvinceProcessor",
7
+ ERROR = "ErrorProcessor"
8
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProcessorLoggerContext = void 0;
4
+ var ProcessorLoggerContext;
5
+ (function (ProcessorLoggerContext) {
6
+ ProcessorLoggerContext["CATEGORY"] = "CategoryProcessor";
7
+ ProcessorLoggerContext["PAGINATION"] = "PaginationProcessor";
8
+ ProcessorLoggerContext["PRODUCT"] = "ProductProcessor";
9
+ ProcessorLoggerContext["PROVIDER"] = "ProviderProcessor";
10
+ ProcessorLoggerContext["PROVINCE"] = "ProvinceProcessor";
11
+ ProcessorLoggerContext["ERROR"] = "ErrorProcessor";
12
+ })(ProcessorLoggerContext || (exports.ProcessorLoggerContext = ProcessorLoggerContext = {}));
13
+ //# sourceMappingURL=processor-logger-context.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor-logger-context.enum.js","sourceRoot":"","sources":["../../../../src/common/logger/enum/processor-logger-context.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,sBAOX;AAPD,WAAY,sBAAsB;IAChC,wDAA8B,CAAA;IAC9B,4DAAkC,CAAA;IAClC,sDAA4B,CAAA;IAC5B,wDAA8B,CAAA;IAC9B,wDAA8B,CAAA;IAC9B,kDAAwB,CAAA;AAC1B,CAAC,EAPW,sBAAsB,sCAAtB,sBAAsB,QAOjC"}
@@ -0,0 +1,8 @@
1
+ export declare enum RouterLoggerContext {
2
+ CATEGORY = "CategoryRouter",
3
+ PAGINATION = "PaginationRouter",
4
+ PRODUCT = "ProductRouter",
5
+ PROVIDER = "ProviderRouter",
6
+ PROVINCE = "ProvinceRouter",
7
+ ERROR = "ErrorRouter"
8
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RouterLoggerContext = void 0;
4
+ var RouterLoggerContext;
5
+ (function (RouterLoggerContext) {
6
+ RouterLoggerContext["CATEGORY"] = "CategoryRouter";
7
+ RouterLoggerContext["PAGINATION"] = "PaginationRouter";
8
+ RouterLoggerContext["PRODUCT"] = "ProductRouter";
9
+ RouterLoggerContext["PROVIDER"] = "ProviderRouter";
10
+ RouterLoggerContext["PROVINCE"] = "ProvinceRouter";
11
+ RouterLoggerContext["ERROR"] = "ErrorRouter";
12
+ })(RouterLoggerContext || (exports.RouterLoggerContext = RouterLoggerContext = {}));
13
+ //# sourceMappingURL=router-logger-context.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-logger-context.enum.js","sourceRoot":"","sources":["../../../../src/common/logger/enum/router-logger-context.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,mBAOX;AAPD,WAAY,mBAAmB;IAC7B,kDAA2B,CAAA;IAC3B,sDAA+B,CAAA;IAC/B,gDAAyB,CAAA;IACzB,kDAA2B,CAAA;IAC3B,kDAA2B,CAAA;IAC3B,4CAAqB,CAAA;AACvB,CAAC,EAPW,mBAAmB,mCAAnB,mBAAmB,QAO9B"}
@@ -0,0 +1,2 @@
1
+ export declare class CloudflareModule {
2
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.CloudflareModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const delayer_module_1 = require("../delayer/delayer.module");
12
+ const cloudflare_service_1 = require("./cloudflare.service");
13
+ const check_cloudflare_block_use_case_1 = require("./use-cases/check-cloudflare-block.use-case");
14
+ const normalize_cloudflare_response_use_case_1 = require("./use-cases/normalize-cloudflare-response.use-case");
15
+ const report_cloudflare_use_case_1 = require("./use-cases/report-cloudflare.use-case");
16
+ const cloudflare_repository_service_1 = require("./services/cloudflare-repository.service");
17
+ let CloudflareModule = class CloudflareModule {
18
+ };
19
+ exports.CloudflareModule = CloudflareModule;
20
+ exports.CloudflareModule = CloudflareModule = __decorate([
21
+ (0, common_1.Module)({
22
+ imports: [delayer_module_1.DelayerModule],
23
+ providers: [
24
+ cloudflare_service_1.CloudflareService,
25
+ normalize_cloudflare_response_use_case_1.NormalizeCloudflareResponseUseCase,
26
+ check_cloudflare_block_use_case_1.CheckCloudflareBlockUseCase,
27
+ report_cloudflare_use_case_1.ReportCloudflareUseCase,
28
+ cloudflare_repository_service_1.CloudflareRepositoryService,
29
+ ],
30
+ exports: [cloudflare_service_1.CloudflareService],
31
+ })
32
+ ], CloudflareModule);
33
+ //# sourceMappingURL=cloudflare.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare.module.js","sourceRoot":"","sources":["../../../src/modules/cloudflare/cloudflare.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AAExC,8DAA0D;AAC1D,6DAAyD;AACzD,iGAA0F;AAC1F,+GAAwG;AACxG,uFAAiF;AACjF,4FAAuF;AAahF,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAAG,CAAA;AAAnB,4CAAgB;2BAAhB,gBAAgB;IAX5B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,8BAAa,CAAC;QACxB,SAAS,EAAE;YACT,sCAAiB;YACjB,2EAAkC;YAClC,6DAA2B;YAC3B,oDAAuB;YACvB,2DAA2B;SAC5B;QACD,OAAO,EAAE,CAAC,sCAAiB,CAAC;KAC7B,CAAC;GACW,gBAAgB,CAAG"}
@@ -0,0 +1,26 @@
1
+ import { FinalStatistics } from 'crawlee';
2
+ import { DelayerService } from '../delayer/delayer.service';
3
+ import { CheckCloudflareBlockUseCase } from './use-cases/check-cloudflare-block.use-case';
4
+ import { ReportCloudflareUseCase } from './use-cases/report-cloudflare.use-case';
5
+ import { CloudflareRepositoryService } from './services/cloudflare-repository.service';
6
+ import { NormalizeCloudflareResponseUseCase } from './use-cases/normalize-cloudflare-response.use-case';
7
+ import { CrawleeResponse } from './types/normalize-response.types';
8
+ import { IHandleBlockOption } from './types/handle-request.types';
9
+ export declare class CloudflareService {
10
+ private readonly delayer;
11
+ private readonly checker;
12
+ private readonly reporter;
13
+ private readonly repository;
14
+ private readonly normalizer;
15
+ private logger;
16
+ constructor(delayer: DelayerService, checker: CheckCloudflareBlockUseCase, reporter: ReportCloudflareUseCase, repository: CloudflareRepositoryService, normalizer: NormalizeCloudflareResponseUseCase);
17
+ check(response: CrawleeResponse): boolean;
18
+ get blocks(): import("./types/block-info").BlockInfo[];
19
+ handle(response: CrawleeResponse, blockOptions?: IHandleBlockOption): Promise<void>;
20
+ report(stats: FinalStatistics): {
21
+ blocks: number;
22
+ total: number;
23
+ percent: number;
24
+ };
25
+ reset(): void;
26
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var CloudflareService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.CloudflareService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const delayer_service_1 = require("../delayer/delayer.service");
16
+ const logger_1 = require("../../common/logger/logger");
17
+ const check_cloudflare_block_use_case_1 = require("./use-cases/check-cloudflare-block.use-case");
18
+ const report_cloudflare_use_case_1 = require("./use-cases/report-cloudflare.use-case");
19
+ const cloudflare_repository_service_1 = require("./services/cloudflare-repository.service");
20
+ const normalize_cloudflare_response_use_case_1 = require("./use-cases/normalize-cloudflare-response.use-case");
21
+ const handle_request_types_1 = require("./types/handle-request.types");
22
+ let CloudflareService = CloudflareService_1 = class CloudflareService {
23
+ constructor(delayer, checker, reporter, repository, normalizer) {
24
+ this.delayer = delayer;
25
+ this.checker = checker;
26
+ this.reporter = reporter;
27
+ this.repository = repository;
28
+ this.normalizer = normalizer;
29
+ this.logger = new logger_1.Logger(CloudflareService_1.name);
30
+ }
31
+ check(response) {
32
+ return this.checker.execute(response);
33
+ }
34
+ get blocks() {
35
+ return this.repository.blocks;
36
+ }
37
+ async handle(response, blockOptions) {
38
+ const normalized = this.normalizer.execute(response);
39
+ const { options } = new handle_request_types_1.HandleBlockOption(blockOptions);
40
+ const { statusCode, url } = normalized;
41
+ const { method, body, delay } = options;
42
+ this.repository.add({ url, method, body });
43
+ this.logger.warn(`⚠️ ${statusCode} ${url}`);
44
+ return await this.delayer.wait(url, delay.min, delay.max);
45
+ }
46
+ report(stats) {
47
+ return this.reporter.execute(stats);
48
+ }
49
+ reset() {
50
+ this.delayer.reset();
51
+ }
52
+ };
53
+ exports.CloudflareService = CloudflareService;
54
+ exports.CloudflareService = CloudflareService = CloudflareService_1 = __decorate([
55
+ (0, common_1.Injectable)(),
56
+ __metadata("design:paramtypes", [delayer_service_1.DelayerService,
57
+ check_cloudflare_block_use_case_1.CheckCloudflareBlockUseCase,
58
+ report_cloudflare_use_case_1.ReportCloudflareUseCase,
59
+ cloudflare_repository_service_1.CloudflareRepositoryService,
60
+ normalize_cloudflare_response_use_case_1.NormalizeCloudflareResponseUseCase])
61
+ ], CloudflareService);
62
+ //# sourceMappingURL=cloudflare.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare.service.js","sourceRoot":"","sources":["../../../src/modules/cloudflare/cloudflare.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAA4C;AAG5C,gEAA4D;AAC5D,uDAAoD;AACpD,iGAA0F;AAC1F,uFAAiF;AACjF,4FAAuF;AACvF,+GAAwG;AAKxG,uEAAiE;AAG1D,IAAM,iBAAiB,yBAAvB,MAAM,iBAAiB;IAG5B,YACmB,OAAuB,EACvB,OAAoC,EACpC,QAAiC,EACjC,UAAuC,EACvC,UAA8C;QAJ9C,YAAO,GAAP,OAAO,CAAgB;QACvB,YAAO,GAAP,OAAO,CAA6B;QACpC,aAAQ,GAAR,QAAQ,CAAyB;QACjC,eAAU,GAAV,UAAU,CAA6B;QACvC,eAAU,GAAV,UAAU,CAAoC;QAPzD,WAAM,GAAG,IAAI,eAAM,CAAC,mBAAiB,CAAC,IAAI,CAAC,CAAC;IAQjD,CAAC;IAEJ,KAAK,CAAC,QAAyB;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAyB,EAAE,YAAiC;QACvE,MAAM,UAAU,GAAuB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,wCAAiB,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC;QACvC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC;QAC7C,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,CAAC,KAAsB;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF,CAAA;AApCY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;qCAKiB,gCAAc;QACd,6DAA2B;QAC1B,oDAAuB;QACrB,2DAA2B;QAC3B,2EAAkC;GARtD,iBAAiB,CAoC7B"}
@@ -0,0 +1,12 @@
1
+ import { BlockInfo } from '../types/block-info';
2
+ export declare class CloudflareRepositoryService {
3
+ private map;
4
+ private logger;
5
+ constructor();
6
+ get size(): number;
7
+ get blocks(): BlockInfo[];
8
+ private hash;
9
+ add(block: BlockInfo): void;
10
+ exists(block: BlockInfo): boolean;
11
+ reset(): void;
12
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var CloudflareRepositoryService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.CloudflareRepositoryService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const crypto_1 = require("crypto");
16
+ const logger_1 = require("../../../common/logger/logger");
17
+ let CloudflareRepositoryService = CloudflareRepositoryService_1 = class CloudflareRepositoryService {
18
+ constructor() {
19
+ this.map = new Map();
20
+ this.logger = new logger_1.Logger(CloudflareRepositoryService_1.name);
21
+ }
22
+ get size() {
23
+ return this.map.size;
24
+ }
25
+ get blocks() {
26
+ return Array.from(this.map.values());
27
+ }
28
+ hash(block) {
29
+ const data = JSON.stringify(block);
30
+ return (0, crypto_1.createHash)('sha256').update(data).digest('hex');
31
+ }
32
+ add(block) {
33
+ const key = this.hash(block);
34
+ const mappedBlock = this.map.get(key);
35
+ const previous = mappedBlock?.count ?? 0;
36
+ this.map.set(key, {
37
+ ...block,
38
+ count: previous + 1,
39
+ timestamp: new Date(),
40
+ });
41
+ }
42
+ exists(block) {
43
+ const key = this.hash(block);
44
+ return this.map.has(key);
45
+ }
46
+ reset() {
47
+ this.map.clear();
48
+ }
49
+ };
50
+ exports.CloudflareRepositoryService = CloudflareRepositoryService;
51
+ exports.CloudflareRepositoryService = CloudflareRepositoryService = CloudflareRepositoryService_1 = __decorate([
52
+ (0, common_1.Injectable)(),
53
+ __metadata("design:paramtypes", [])
54
+ ], CloudflareRepositoryService);
55
+ //# sourceMappingURL=cloudflare-repository.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-repository.service.js","sourceRoot":"","sources":["../../../../src/modules/cloudflare/services/cloudflare-repository.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,mCAAoC;AAEpC,0DAAuD;AAIhD,IAAM,2BAA2B,mCAAjC,MAAM,2BAA2B;IAItC;QAHQ,QAAG,GAAG,IAAI,GAAG,EAAqB,CAAC;QACnC,WAAM,GAAG,IAAI,eAAM,CAAC,6BAA2B,CAAC,IAAI,CAAC,CAAC;IAE/C,CAAC;IAEhB,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAEO,IAAI,CAAC,KAAgB;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,GAAG,CAAC,KAAgB;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,WAAW,EAAE,KAAK,IAAI,CAAC,CAAC;QAEzC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE;YAChB,GAAG,KAAK;YACR,KAAK,EAAE,QAAQ,GAAG,CAAC;YACnB,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAgB;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;CACF,CAAA;AAvCY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,mBAAU,GAAE;;GACA,2BAA2B,CAuCvC"}
@@ -0,0 +1,7 @@
1
+ export type BlockInfo = {
2
+ url: string;
3
+ method: string;
4
+ body?: string;
5
+ timestamp?: Date;
6
+ count?: number;
7
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=block-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-info.js","sourceRoot":"","sources":["../../../../src/modules/cloudflare/types/block-info.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { HttpMethod } from '../../../common/enum/request.enum';
2
+ import { DelayRange } from '../../../common/types/delay-range';
3
+ export type IHandleBlockOption = {
4
+ method: HttpMethod;
5
+ body?: any;
6
+ delay?: DelayRange;
7
+ };
8
+ export declare class HandleBlockOption {
9
+ private readonly method;
10
+ private body;
11
+ private delay;
12
+ constructor(options: IHandleBlockOption);
13
+ get options(): {
14
+ method: HttpMethod;
15
+ body: any;
16
+ delay: DelayRange;
17
+ };
18
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HandleBlockOption = void 0;
4
+ const request_enum_1 = require("../../../common/enum/request.enum");
5
+ class HandleBlockOption {
6
+ constructor(options) {
7
+ this.method = request_enum_1.HttpMethod.GET;
8
+ this.method = options.method ?? this.method;
9
+ this.body = options.body ?? this.body;
10
+ this.delay = options.delay ?? this.delay;
11
+ }
12
+ get options() {
13
+ return {
14
+ method: this.method,
15
+ body: this.body,
16
+ delay: this.delay,
17
+ };
18
+ }
19
+ }
20
+ exports.HandleBlockOption = HandleBlockOption;
21
+ //# sourceMappingURL=handle-request.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-request.types.js","sourceRoot":"","sources":["../../../../src/modules/cloudflare/types/handle-request.types.ts"],"names":[],"mappings":";;;AAAA,oEAA+D;AAS/D,MAAa,iBAAiB;IAK5B,YAAY,OAA2B;QAJtB,WAAM,GAAe,yBAAU,CAAC,GAAG,CAAC;QAKnD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;QACtC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO;QACT,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;CACF;AAlBD,8CAkBC"}
@@ -0,0 +1,26 @@
1
+ import { Response as PlaywrightResponse } from 'playwright';
2
+ import { CheerioAPI } from 'cheerio';
3
+ export interface HttpResponse {
4
+ statusCode: number;
5
+ headers: Record<string, string>;
6
+ url: string;
7
+ }
8
+ export interface CheerioResponse extends HttpResponse {
9
+ body: string;
10
+ $: CheerioAPI;
11
+ }
12
+ export interface PuppeteerResponse {
13
+ status: () => number;
14
+ headers: () => Record<string, string>;
15
+ url: () => string;
16
+ }
17
+ export interface JSDOMResponse extends HttpResponse {
18
+ body: string;
19
+ window: any;
20
+ }
21
+ export type CrawleeResponse = HttpResponse | CheerioResponse | PlaywrightResponse | PuppeteerResponse | JSDOMResponse;
22
+ export interface NormalizedResponse {
23
+ statusCode: number;
24
+ headers: Record<string, string>;
25
+ url: string;
26
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=normalize-response.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-response.types.js","sourceRoot":"","sources":["../../../../src/modules/cloudflare/types/normalize-response.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import { CrawleeResponse } from '../types/normalize-response.types';
2
+ import { NormalizeCloudflareResponseUseCase } from './normalize-cloudflare-response.use-case';
3
+ export declare class CheckCloudflareBlockUseCase {
4
+ private readonly normalizer;
5
+ private readonly cloudflare;
6
+ private readonly blockedStatusCodes;
7
+ constructor(normalizer: NormalizeCloudflareResponseUseCase);
8
+ execute(response: CrawleeResponse): boolean;
9
+ private detect;
10
+ private check;
11
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CheckCloudflareBlockUseCase = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const normalize_cloudflare_response_use_case_1 = require("./normalize-cloudflare-response.use-case");
15
+ let CheckCloudflareBlockUseCase = class CheckCloudflareBlockUseCase {
16
+ constructor(normalizer) {
17
+ this.normalizer = normalizer;
18
+ this.cloudflare = 'cloudflare';
19
+ this.blockedStatusCodes = [
20
+ common_1.HttpStatus.FORBIDDEN,
21
+ common_1.HttpStatus.SERVICE_UNAVAILABLE,
22
+ ];
23
+ }
24
+ execute(response) {
25
+ const result = this.normalizer.execute(response);
26
+ const { statusCode, headers = {} } = result;
27
+ return this.detect(headers) && this.check(statusCode);
28
+ }
29
+ detect(headers) {
30
+ const server = headers['server']?.toLowerCase();
31
+ const poweredBy = headers['x-powered-by']?.toLowerCase();
32
+ return (!!headers['cf-ray'] ||
33
+ !!headers['cf-cache-status'] ||
34
+ server.includes(this.cloudflare) ||
35
+ poweredBy.includes(this.cloudflare));
36
+ }
37
+ check(statusCode) {
38
+ return this.blockedStatusCodes.includes(statusCode);
39
+ }
40
+ };
41
+ exports.CheckCloudflareBlockUseCase = CheckCloudflareBlockUseCase;
42
+ exports.CheckCloudflareBlockUseCase = CheckCloudflareBlockUseCase = __decorate([
43
+ (0, common_1.Injectable)(),
44
+ __metadata("design:paramtypes", [normalize_cloudflare_response_use_case_1.NormalizeCloudflareResponseUseCase])
45
+ ], CheckCloudflareBlockUseCase);
46
+ //# sourceMappingURL=check-cloudflare-block.use-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-cloudflare-block.use-case.js","sourceRoot":"","sources":["../../../../src/modules/cloudflare/use-cases/check-cloudflare-block.use-case.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAwD;AAExD,qGAA8F;AAGvF,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAQtC,YACmB,UAA8C;QAA9C,eAAU,GAAV,UAAU,CAAoC;QARhD,eAAU,GAAG,YAAY,CAAC;QAE1B,uBAAkB,GAAG;YACpC,mBAAU,CAAC,SAAS;YACpB,mBAAU,CAAC,mBAAmB;SAC/B,CAAC;IAIC,CAAC;IAEJ,OAAO,CAAC,QAAyB;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAEO,MAAM,CAAC,OAA4B;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,CAAC;QAEzD,OAAO,CACL,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;YACnB,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;YAC5B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;YAChC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CACpC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,UAAkB;QAC9B,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC;CACF,CAAA;AAjCY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,mBAAU,GAAE;qCAUoB,2EAAkC;GATtD,2BAA2B,CAiCvC"}
@@ -0,0 +1,8 @@
1
+ import { CrawleeResponse } from '../types/normalize-response.types';
2
+ import { NormalizedResponse } from '../types/normalize-response.types';
3
+ export declare class NormalizeCloudflareResponseUseCase {
4
+ execute(response: CrawleeResponse): NormalizedResponse;
5
+ private isPlaywrightResponse;
6
+ private isPuppeteerResponse;
7
+ private isHttpLikeResponse;
8
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.NormalizeCloudflareResponseUseCase = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ let NormalizeCloudflareResponseUseCase = class NormalizeCloudflareResponseUseCase {
12
+ execute(response) {
13
+ if (this.isPlaywrightResponse(response)) {
14
+ return {
15
+ statusCode: response.status(),
16
+ headers: response.headers(),
17
+ url: response.url(),
18
+ };
19
+ }
20
+ if (this.isPuppeteerResponse(response)) {
21
+ return {
22
+ statusCode: response.status(),
23
+ headers: response.headers(),
24
+ url: response.url(),
25
+ };
26
+ }
27
+ if (this.isHttpLikeResponse(response)) {
28
+ return {
29
+ statusCode: response.statusCode,
30
+ headers: response.headers,
31
+ url: response.url,
32
+ };
33
+ }
34
+ throw new Error('Unable to normalize response: unknown response type');
35
+ }
36
+ isPlaywrightResponse(response) {
37
+ return response && typeof response.status === 'function';
38
+ }
39
+ isPuppeteerResponse(response) {
40
+ return (response &&
41
+ typeof response.status === 'function' &&
42
+ typeof response.headers === 'function');
43
+ }
44
+ isHttpLikeResponse(response) {
45
+ return (response &&
46
+ typeof response.statusCode === 'number' &&
47
+ typeof response.headers === 'object' &&
48
+ typeof response.url === 'string');
49
+ }
50
+ };
51
+ exports.NormalizeCloudflareResponseUseCase = NormalizeCloudflareResponseUseCase;
52
+ exports.NormalizeCloudflareResponseUseCase = NormalizeCloudflareResponseUseCase = __decorate([
53
+ (0, common_1.Injectable)()
54
+ ], NormalizeCloudflareResponseUseCase);
55
+ //# sourceMappingURL=normalize-cloudflare-response.use-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-cloudflare-response.use-case.js","sourceRoot":"","sources":["../../../../src/modules/cloudflare/use-cases/normalize-cloudflare-response.use-case.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAUrC,IAAM,kCAAkC,GAAxC,MAAM,kCAAkC;IAC7C,OAAO,CAAC,QAAyB;QAC/B,IAAI,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,OAAO;gBACL,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE;gBAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE;gBAC3B,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE;aACpB,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvC,OAAO;gBACL,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE;gBAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE;gBAC3B,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE;aACpB,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,OAAO;gBACL,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,GAAG,EAAE,QAAQ,CAAC,GAAG;aAClB,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAEO,oBAAoB,CAAC,QAAa;QACxC,OAAO,QAAQ,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC;IAC3D,CAAC;IAEO,mBAAmB,CAAC,QAAa;QACvC,OAAO,CACL,QAAQ;YACR,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU;YACrC,OAAO,QAAQ,CAAC,OAAO,KAAK,UAAU,CACvC,CAAC;IACJ,CAAC;IAEO,kBAAkB,CACxB,QAAa;QAEb,OAAO,CACL,QAAQ;YACR,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ;YACvC,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;YACpC,OAAO,QAAQ,CAAC,GAAG,KAAK,QAAQ,CACjC,CAAC;IACJ,CAAC;CACF,CAAA;AAnDY,gFAAkC;6CAAlC,kCAAkC;IAD9C,IAAA,mBAAU,GAAE;GACA,kCAAkC,CAmD9C"}
@@ -0,0 +1,12 @@
1
+ import { FinalStatistics } from 'crawlee';
2
+ export declare class ReportCloudflareUseCase {
3
+ private _blocks;
4
+ private logger;
5
+ constructor();
6
+ execute(stats: FinalStatistics): {
7
+ blocks: number;
8
+ total: number;
9
+ percent: number;
10
+ };
11
+ private reduce;
12
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ReportCloudflareUseCase = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const logger_1 = require("../../../common/logger/logger");
15
+ const cloudflare_service_1 = require("../cloudflare.service");
16
+ let ReportCloudflareUseCase = class ReportCloudflareUseCase {
17
+ constructor() {
18
+ this._blocks = 0;
19
+ this.logger = new logger_1.Logger(cloudflare_service_1.CloudflareService.name);
20
+ }
21
+ execute(stats) {
22
+ const reducer = this.reduce.bind(this);
23
+ const total = stats.retryHistogram.reduce(reducer, 0);
24
+ const percentValue = (this._blocks / total) * 100;
25
+ const percent = Number(percentValue.toFixed(2));
26
+ const { _blocks: blocks } = this;
27
+ const report = { blocks, total, percent };
28
+ const message = `⚠️ ${report.blocks}/${report.total} → ${report.percent}%`;
29
+ this.logger.warn(message);
30
+ return report;
31
+ }
32
+ reduce(total, count, retries) {
33
+ return total + count * (retries + 1);
34
+ }
35
+ };
36
+ exports.ReportCloudflareUseCase = ReportCloudflareUseCase;
37
+ exports.ReportCloudflareUseCase = ReportCloudflareUseCase = __decorate([
38
+ (0, common_1.Injectable)(),
39
+ __metadata("design:paramtypes", [])
40
+ ], ReportCloudflareUseCase);
41
+ //# sourceMappingURL=report-cloudflare.use-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-cloudflare.use-case.js","sourceRoot":"","sources":["../../../../src/modules/cloudflare/use-cases/report-cloudflare.use-case.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAG5C,0DAAuD;AACvD,8DAA0D;AAGnD,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAIlC;QAHQ,YAAO,GAAG,CAAC,CAAC;QACZ,WAAM,GAAG,IAAI,eAAM,CAAC,sCAAiB,CAAC,IAAI,CAAC,CAAC;IAErC,CAAC;IAEhB,OAAO,CAAC,KAAsB;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACjC,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,OAAO,GAAG,CAAC;QAC5E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,MAAM,CAAC,KAAa,EAAE,KAAa,EAAE,OAAe;QAC1D,OAAO,KAAK,GAAG,KAAK,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;CACF,CAAA;AArBY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;;GACA,uBAAuB,CAqBnC"}
@@ -1,12 +1,10 @@
1
1
  import { DelayerSleepService } from './use-cases/delayer-sleeper.service';
2
2
  import { DelayerMapService } from './use-cases/delayer-mapper.service';
3
- import { DelayerConfigService } from './use-cases/delayer-config.service';
4
3
  import { DelayRange } from '../../common/types/delay-range';
5
4
  export declare class DelayerService {
6
5
  private readonly sleeper;
7
6
  private readonly mapper;
8
- private readonly config;
9
- constructor(sleeper: DelayerSleepService, mapper: DelayerMapService, config: DelayerConfigService);
7
+ constructor(sleeper: DelayerSleepService, mapper: DelayerMapService);
10
8
  wait(url?: string, min?: number, max?: number): Promise<void>;
11
9
  update(statusCode: number): number;
12
10
  sleep(min?: number, max?: number): Promise<void>;
@@ -13,14 +13,12 @@ exports.DelayerService = void 0;
13
13
  const common_1 = require("@nestjs/common");
14
14
  const delayer_sleeper_service_1 = require("./use-cases/delayer-sleeper.service");
15
15
  const delayer_mapper_service_1 = require("./use-cases/delayer-mapper.service");
16
- const delayer_config_service_1 = require("./use-cases/delayer-config.service");
17
16
  let DelayerService = class DelayerService {
18
- constructor(sleeper, mapper, config) {
17
+ constructor(sleeper, mapper) {
19
18
  this.sleeper = sleeper;
20
19
  this.mapper = mapper;
21
- this.config = config;
22
20
  }
23
- async wait(url, min = 2000, max = 4000) {
21
+ async wait(url, min, max) {
24
22
  await this.mapper.wait(url, min, max);
25
23
  }
26
24
  update(statusCode) {
@@ -44,7 +42,6 @@ exports.DelayerService = DelayerService;
44
42
  exports.DelayerService = DelayerService = __decorate([
45
43
  (0, common_1.Injectable)(),
46
44
  __metadata("design:paramtypes", [delayer_sleeper_service_1.DelayerSleepService,
47
- delayer_mapper_service_1.DelayerMapService,
48
- delayer_config_service_1.DelayerConfigService])
45
+ delayer_mapper_service_1.DelayerMapService])
49
46
  ], DelayerService);
50
47
  //# sourceMappingURL=delayer.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"delayer.service.js","sourceRoot":"","sources":["../../../src/modules/delayer/delayer.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAE5C,iFAA0E;AAC1E,+EAAuE;AACvE,+EAA0E;AAInE,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YACmB,OAA4B,EAC5B,MAAyB,EACzB,MAA4B;QAF5B,YAAO,GAAP,OAAO,CAAqB;QAC5B,WAAM,GAAN,MAAM,CAAmB;QACzB,WAAM,GAAN,MAAM,CAAsB;IAC5C,CAAC;IAEJ,KAAK,CAAC,IAAI,CAAC,GAAY,EAAE,MAAc,IAAI,EAAE,MAAc,IAAI;QAC7D,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,UAAkB;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAY,EAAE,GAAY;QACpC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;IACjC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF,CAAA;AA/BY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;qCAGiB,6CAAmB;QACpB,0CAAiB;QACjB,6CAAoB;GAJpC,cAAc,CA+B1B"}
1
+ {"version":3,"file":"delayer.service.js","sourceRoot":"","sources":["../../../src/modules/delayer/delayer.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAE5C,iFAA0E;AAC1E,+EAAuE;AAIhE,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YACmB,OAA4B,EAC5B,MAAyB;QADzB,YAAO,GAAP,OAAO,CAAqB;QAC5B,WAAM,GAAN,MAAM,CAAmB;IACzC,CAAC;IAEJ,KAAK,CAAC,IAAI,CAAC,GAAY,EAAE,GAAY,EAAE,GAAY;QACjD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,UAAkB;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAY,EAAE,GAAY;QACpC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;IACjC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF,CAAA;AA9BY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;qCAGiB,6CAAmB;QACpB,0CAAiB;GAHjC,cAAc,CA8B1B"}
@@ -4,6 +4,8 @@ export * from './cleaner/use-cases/cleaner-dataset.service';
4
4
  export * from './cleaner/use-cases/cleaner-key-value-store.service';
5
5
  export * from './cleaner/use-cases/cleaner-request-queue.service';
6
6
  export * from './cleaner/use-cases/cleaner-storage.service';
7
+ export * from './cloudflare/cloudflare.module';
8
+ export * from './cloudflare/cloudflare.service';
7
9
  export * from './delayer/env/delay.env.config';
8
10
  export * from './delayer/env/delay.env.validation';
9
11
  export * from './delayer/delayer.module';
@@ -20,6 +20,8 @@ __exportStar(require("./cleaner/use-cases/cleaner-dataset.service"), exports);
20
20
  __exportStar(require("./cleaner/use-cases/cleaner-key-value-store.service"), exports);
21
21
  __exportStar(require("./cleaner/use-cases/cleaner-request-queue.service"), exports);
22
22
  __exportStar(require("./cleaner/use-cases/cleaner-storage.service"), exports);
23
+ __exportStar(require("./cloudflare/cloudflare.module"), exports);
24
+ __exportStar(require("./cloudflare/cloudflare.service"), exports);
23
25
  __exportStar(require("./delayer/env/delay.env.config"), exports);
24
26
  __exportStar(require("./delayer/env/delay.env.validation"), exports);
25
27
  __exportStar(require("./delayer/delayer.module"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/modules/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,4DAA0C;AAC1C,8EAA4D;AAC5D,sFAAoE;AACpE,oFAAkE;AAClE,8EAA4D;AAE5D,iEAA+C;AAC/C,qEAAmD;AACnD,2DAAyC;AACzC,4DAA0C;AAC1C,6EAA2D;AAC3D,6EAA2D;AAC3D,8EAA4D;AAE5D,uDAAqC;AACrC,wDAAsC;AACtC,+DAA6C;AAC7C,mEAAiD;AAEjD,+DAA6C;AAC7C,gEAA8C;AAE9C,+DAA6C;AAC7C,gEAA8C;AAE9C,qEAAmD;AACnD,yEAAuD;AACvD,6DAA2C;AAC3C,8DAA4C;AAE5C,iEAA+C;AAC/C,kEAAgD;AAEhD,2DAAyC;AACzC,4DAA0C;AAE1C,qEAAmD;AACnD,yEAAuD;AACvD,6DAA2C;AAC3C,8DAA4C;AAE5C,6DAA2C;AAC3C,8DAA4C;AAE5C,uEAAqD;AACrD,2EAAyD;AACzD,+DAA6C;AAC7C,gEAA8C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/modules/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,4DAA0C;AAC1C,8EAA4D;AAC5D,sFAAoE;AACpE,oFAAkE;AAClE,8EAA4D;AAE5D,iEAA+C;AAC/C,kEAAgD;AAEhD,iEAA+C;AAC/C,qEAAmD;AACnD,2DAAyC;AACzC,4DAA0C;AAC1C,6EAA2D;AAC3D,6EAA2D;AAC3D,8EAA4D;AAE5D,uDAAqC;AACrC,wDAAsC;AACtC,+DAA6C;AAC7C,mEAAiD;AAEjD,+DAA6C;AAC7C,gEAA8C;AAE9C,+DAA6C;AAC7C,gEAA8C;AAE9C,qEAAmD;AACnD,yEAAuD;AACvD,6DAA2C;AAC3C,8DAA4C;AAE5C,iEAA+C;AAC/C,kEAAgD;AAEhD,2DAAyC;AACzC,4DAA0C;AAE1C,qEAAmD;AACnD,yEAAuD;AACvD,6DAA2C;AAC3C,8DAA4C;AAE5C,6DAA2C;AAC3C,8DAA4C;AAE5C,uEAAqD;AACrD,2EAAyD;AACzD,+DAA6C;AAC7C,gEAA8C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rafikidota/cuba-ofertas-scraping",
3
- "version": "0.24.1",
3
+ "version": "0.26.0",
4
4
  "description": "Sometimes, the best way to solve your own problems is to help someone else.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -17,6 +17,8 @@
17
17
  "devDependencies": {
18
18
  "@aws-sdk/client-s3": "3.990.0",
19
19
  "@aws-sdk/s3-request-presigner": "3.990.0",
20
+ "@crawlee/cheerio": "3.16.0",
21
+ "@crawlee/playwright": "3.16.0",
20
22
  "@eslint/eslintrc": "3.3.3",
21
23
  "@eslint/js": "9.39.2",
22
24
  "@nestjs/axios": "4.0.1",
@@ -32,6 +34,7 @@
32
34
  "@typescript-eslint/parser": "8.55.0",
33
35
  "archiver": "7.0.1",
34
36
  "axios": "1.13.5",
37
+ "cheerio": "1.2.0",
35
38
  "crawlee": "3.16.0",
36
39
  "dotenv": "17.3.1",
37
40
  "eslint": "9.39.2",