import { ChoiceRequest } from "../../models"; import { StepResult } from "../stepResult"; import { CategoryProviderType, CategoryRating, FraudSeverity, } from "../../categories/categoryProvider"; import { CampaignModel } from "../../models/CampaignModel"; import AbstractPrebidStep from "./abstractPrebid.step"; export default class DeviceFraudStep extends AbstractPrebidStep { defaultPublisherFraudThreshold = FraudSeverity.High; constructor(campaignModel: CampaignModel, categoryProviderType: CategoryProviderType) { super("device_fraud", campaignModel, categoryProviderType, true, ["device_fraud"]); } async run(request: ChoiceRequest): Promise { const result: StepResult = new StepResult(); const isWebMobile = request.environment_type === "web"; const fillCache: number = this.featureConfigService.getFloatValue( request, "ms-choices.device-fraud.fill-cache." + this.categoryProviderType, 0 ); const passUnknown: boolean = this.featureConfigService.getBooleanValue( request, "ms-choices.device-fraud.allow-unknown." + this.categoryProviderType, true ); if (this.isBypassed(request, result)) { if (fillCache !== 0 && Math.random() < fillCache) { this.categoryService.getDeviceCategoryValue(request, this.categoryProviderType); // force caching even if no campaign are elligible } return result; } const bsValues = await this.categoryService.getDeviceCategoryValue( request, this.categoryProviderType ); const safe: boolean = bsValues.getDeviceFraud() === CategoryRating.Safe || (bsValues.getDeviceFraud() === CategoryRating.Unknown && passUnknown); this.addMetadataResult(request, bsValues.getDeviceFraud()); this.fillStepResult( request, result, isWebMobile, safe, false, new Map([["device_fraud", bsValues.getDeviceFraud()]]) ); return result; } }