UNPKG

mk9-prebid

Version:

Header Bidding Management Library

270 lines (246 loc) 7.41 kB
import * as utils from '../src/utils.js'; import {config} from '../src/config.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; import { getStorageManager } from '../src/storageManager.js'; const BIDDER_CODE = 'kargo'; const HOST = 'https://krk.kargo.com'; const SYNC = 'https://crb.kargo.com/api/v1/initsyncrnd/{UUID}?seed={SEED}&idx={INDEX}&gdpr={GDPR}&gdpr_consent={GDPR_CONSENT}&us_privacy={US_PRIVACY}'; const SYNC_COUNT = 5; const GVLID = 972; const storage = getStorageManager(GVLID, BIDDER_CODE); let sessionId, lastPageUrl, requestCounter; export const spec = { gvlid: GVLID, code: BIDDER_CODE, isBidRequestValid: function(bid) { if (!bid || !bid.params) { return false; } return !!bid.params.placementId; }, buildRequests: function(validBidRequests, bidderRequest) { const currencyObj = config.getConfig('currency'); const currency = (currencyObj && currencyObj.adServerCurrency) || 'USD'; const bidIds = {}; const bidSizes = {}; utils._each(validBidRequests, bid => { bidIds[bid.bidId] = bid.params.placementId; bidSizes[bid.bidId] = bid.sizes; }); let tdid; if (validBidRequests.length > 0 && validBidRequests[0].userId && validBidRequests[0].userId.tdid) { tdid = validBidRequests[0].userId.tdid; } const transformedParams = Object.assign({}, { sessionId: spec._getSessionId(), requestCount: spec._getRequestCount(), timeout: bidderRequest.timeout, currency: currency, cpmGranularity: 1, timestamp: (new Date()).getTime(), cpmRange: { floor: 0, ceil: 20 }, bidIDs: bidIds, bidSizes: bidSizes, prebidRawBidRequests: validBidRequests }, spec._getAllMetadata(tdid, bidderRequest.uspConsent, bidderRequest.gdprConsent)); const encodedParams = encodeURIComponent(JSON.stringify(transformedParams)); return Object.assign({}, bidderRequest, { method: 'GET', url: `${HOST}/api/v2/bid`, data: `json=${encodedParams}`, currency: currency }); }, interpretResponse: function(response, bidRequest) { let bids = response.body; const bidResponses = []; for (let bidId in bids) { let adUnit = bids[bidId]; let meta; if (adUnit.metadata && adUnit.metadata.landingPageDomain) { meta = { clickUrl: adUnit.metadata.landingPageDomain, advertiserDomains: [adUnit.metadata.landingPageDomain] }; } bidResponses.push({ requestId: bidId, cpm: Number(adUnit.cpm), width: adUnit.width, height: adUnit.height, ad: adUnit.adm, ttl: 300, creativeId: adUnit.id, dealId: adUnit.targetingCustom, netRevenue: true, currency: bidRequest.currency, meta: meta }); } return bidResponses; }, getUserSyncs: function(syncOptions, responses, gdprConsent, usPrivacy) { const syncs = []; const seed = spec._generateRandomUuid(); const clientId = spec._getClientId(); var gdpr = (gdprConsent && gdprConsent.gdprApplies) ? 1 : 0; var gdprConsentString = (gdprConsent && gdprConsent.consentString) ? gdprConsent.consentString : ''; // don't sync if opted out via usPrivacy if (typeof usPrivacy == 'string' && usPrivacy.length == 4 && usPrivacy[0] == 1 && usPrivacy[2] == 'Y') { return syncs; } if (syncOptions.iframeEnabled && seed && clientId) { for (let i = 0; i < SYNC_COUNT; i++) { syncs.push({ type: 'iframe', url: SYNC.replace('{UUID}', clientId).replace('{SEED}', seed) .replace('{INDEX}', i) .replace('{GDPR}', gdpr) .replace('{GDPR_CONSENT}', gdprConsentString) .replace('{US_PRIVACY}', usPrivacy || '') }); } } return syncs; }, // PRIVATE _readCookie(name) { if (!storage.cookiesAreEnabled()) { return null; } let nameEquals = `${name}=`; let cookies = document.cookie.split(';'); for (let i = 0; i < cookies.length; i++) { let cookie = cookies[i]; while (cookie.charAt(0) === ' ') { cookie = cookie.substring(1, cookie.length); } if (cookie.indexOf(nameEquals) === 0) { return cookie.substring(nameEquals.length, cookie.length); } } return null; }, _getCrbFromCookie() { try { const crb = JSON.parse(decodeURIComponent(spec._readCookie('krg_crb'))); if (crb && crb.v) { let vParsed = JSON.parse(atob(crb.v)); if (vParsed) { return vParsed; } } return {}; } catch (e) { return {}; } }, _getCrbFromLocalStorage() { try { return JSON.parse(atob(spec._getLocalStorageSafely('krg_crb'))); } catch (e) { return {}; } }, _getCrb() { let localStorageCrb = spec._getCrbFromLocalStorage(); if (Object.keys(localStorageCrb).length) { return localStorageCrb; } return spec._getCrbFromCookie(); }, _getKruxUserId() { return spec._getLocalStorageSafely('kxkar_user'); }, _getKruxSegments() { return spec._getLocalStorageSafely('kxkar_segs'); }, _getKrux() { const segmentsStr = spec._getKruxSegments(); let segments = []; if (segmentsStr) { segments = segmentsStr.split(','); } return { userID: spec._getKruxUserId(), segments: segments }; }, _getLocalStorageSafely(key) { try { return storage.getDataFromLocalStorage(key); } catch (e) { return null; } }, _getUserIds(tdid, usp, gdpr) { const crb = spec._getCrb(); const userIds = { kargoID: crb.userId, clientID: crb.clientId, crbIDs: crb.syncIds || {}, optOut: crb.optOut, usp: usp }; try { if (gdpr) { userIds['gdpr'] = { consent: gdpr.consentString || '', applies: !!gdpr.gdprApplies, } } } catch (e) { } if (tdid) { userIds.tdID = tdid; } return userIds; }, _getClientId() { const crb = spec._getCrb(); return crb.clientId; }, _getAllMetadata(tdid, usp, gdpr) { return { userIDs: spec._getUserIds(tdid, usp, gdpr), krux: spec._getKrux(), pageURL: window.location.href, rawCRB: spec._readCookie('krg_crb'), rawCRBLocalStorage: spec._getLocalStorageSafely('krg_crb') }; }, _getSessionId() { if (!sessionId) { sessionId = spec._generateRandomUuid(); } return sessionId; }, _getRequestCount() { if (lastPageUrl === window.location.pathname) { return ++requestCounter; } lastPageUrl = window.location.pathname; return requestCounter = 0; }, _generateRandomUuid() { try { // crypto.getRandomValues is supported everywhere but Opera Mini for years var buffer = new Uint8Array(16); crypto.getRandomValues(buffer); buffer[6] = (buffer[6] & ~176) | 64; buffer[8] = (buffer[8] & ~64) | 128; var hex = Array.prototype.map.call(new Uint8Array(buffer), function(x) { return ('00' + x.toString(16)).slice(-2); }).join(''); return hex.slice(0, 8) + '-' + hex.slice(8, 12) + '-' + hex.slice(12, 16) + '-' + hex.slice(16, 20) + '-' + hex.slice(20); } catch (e) { return ''; } } }; registerBidder(spec);