import { Campaign, ChoiceRequest, CampaignGroup, RequestType } from "../../models"; import { StepResult } from "../stepResult"; import MetricService, { BucketSet } from "../../services/metric.service"; import YieldService from "../../services/yield.service"; import { config } from "../../utils/config"; import logger from "../../utils/logger"; import { AbstractStep } from "../abstractStep"; import { delivery } from "../../protos/protos"; const cache = require("memory-cache"); const MS_YIELD_RESPONSE_METRIC = "ms_yield_response_time"; const YIELD_CACHE_TTL = 180000; const bypassingEnvs = ["staging", "integration_test", "devc", "local"]; class YieldStep extends AbstractStep { private metricService: MetricService; private yieldService: YieldService; constructor(campaignsClient: delivery.Campaigns, yieldService: YieldService) { super("yield", ["from_cache"]); this.metricBucket = BucketSet.zeroTo25ms; this.autoPassCampaignGroup = CampaignGroup.Marketplace | CampaignGroup.Fallback; this.yieldService = yieldService; this.metricService = MetricService.getInstance(); this.metricService.addSection(MS_YIELD_RESPONSE_METRIC); } async run(request: ChoiceRequest): Promise { const result: StepResult = new StepResult(); if (bypassingEnvs.includes(config.OGURY_ENV) || request.type === RequestType.AFTER_AD) { result.passCampaigns(...request.campaigns); return result; } const selected: Campaign[] = []; try { const [msYieldData, fromCache] = await this.yieldService.getMsYieldData(request); result.setMetricLabel("from_cache", fromCache); for (const c of request.campaigns) { const yieldCampaign = msYieldData.campaigns.find((yc) => c.id === yc.id); if (yieldCampaign && yieldCampaign.selected) { c.metadata = Object.assign({}, yieldCampaign.metadata, c.metadata); selected.push(c); } } result.passCampaigns(...selected); request.metadata.difference = msYieldData.difference || 0; request.metadata.bound_lower = msYieldData.bound_lower || 0; request.metadata.bound_upper = msYieldData.bound_upper || 0; request.metadata.app_eecpm = msYieldData.app_eecpm || 0; request.metadata.app_ecpm = msYieldData.app_ecpm || 0; } catch (err: any) { if (!err.code) { logger.error(err); } result.error = { code: "yield_error", message: err.message }; } return result; } } export default YieldStep;