import { ChoiceRequest, CampaignGroup } from "../../models"; import { getDeviceOS } from "../../utils/RequestUtils"; import { AbstractStep } from "../abstractStep"; import { StepResult } from "../stepResult"; class ProgrammaticIVTStep extends AbstractStep { constructor() { super("programmatic_ivt", ["with_ip", "with_ua"]); this.autoPassCampaignGroup = CampaignGroup.Managed | CampaignGroup.Fallback; } async run(request: ChoiceRequest): Promise { const result = new StepResult(); const isIVT = ProgrammaticIVTStep.isIVT(request, result); if (!isIVT) { result.passCampaigns(...request.campaigns); } return result; } private static isIVT(request: ChoiceRequest, result: StepResult): boolean { let ivt = false; request.device ??= {}; const device = request.device; if ( (!device.ip || device.ip === "0.0.0.0" || device.ip === "255.255.255.255") && (!device.ipv6 || device.ipv6 === "" || device.ipv6 === "::1") ) { result.setMetricLabel("with_ip", false); ivt = true; } else if (!device.ua || device.ua === "") { result.setMetricLabel("with_ip", true); result.setMetricLabel("with_ua", false); if ( getDeviceOS(request.device) === "android" && device.os_version && device.os_version !== "" && device.name && device.name !== "" ) { // fallback device.ua = `Mozilla/5.0 (Linux; Android ${device.os_version}; ${device.name} Build/R16NW; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 Mobile Safari/537.36`; } else { ivt = true; } } else { result.setMetricLabel("with_ip", true); result.setMetricLabel("with_ua", true); } return ivt; } } export default ProgrammaticIVTStep;