From 3d6a94d0c3c04a92a5dd26e08ddef6325f82d582 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 15 Jul 2024 11:27:41 +0000 Subject: [PATCH 01/23] eids support videoHeroesAdapter --- modules/videoheroesBidAdapter.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index ee2c2deef8b..d2d6833f3a7 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -95,9 +95,14 @@ export const spec = { data.site.ref = bidderRequest.refererInfo.ref; } + if(bidderRequest.userIdAsEids){ + data['user'] = {'ext': {'eids': bidderRequest.userIdAsEids }}; + } + if (bidderRequest.gdprConsent) { data['regs'] = {'ext': {'gdpr': bidderRequest.gdprConsent.gdprApplies ? 1 : 0}}; - data['user'] = {'ext': {'consent': bidderRequest.gdprConsent.consentString ? bidderRequest.gdprConsent.consentString : ''}}; + if(!data['user'] || !data['user']['ext'])data['user'] = {'ext':{}}; + data['user']['ext']['consent'] = bidderRequest.gdprConsent.consentString ? bidderRequest.gdprConsent.consentString : ''}}; } if (bidderRequest.uspConsent !== undefined) { From 02e0943c5dd952dc7e4c502b0f2f12c8883cefe1 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 28 Jul 2024 19:40:42 +0000 Subject: [PATCH 02/23] videoHeroesAdapter: support eids and update adapter --- modules/videoheroesBidAdapter.js | 440 ++++++++++-------- .../modules/videoheroesBidAdapter_spec.js | 27 +- 2 files changed, 253 insertions(+), 214 deletions(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index d2d6833f3a7..1b075bde3bf 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -1,266 +1,296 @@ -import { isEmpty, parseUrl, isStr, triggerPixel } from '../src/utils.js'; -import { registerBidder } from '../src/adapters/bidderFactory.js'; +import { isEmpty, parseUrl, isPlainObject, isArray, isArrayOfNums, isFn, isStr, triggerPixel } from '../src/utils.js'; import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js'; +import { registerBidder } from '../src/adapters/bidderFactory.js'; import { config } from '../src/config.js'; import { convertOrtbRequestToProprietaryNative } from '../src/native.js'; -/** - * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest - * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid - */ - const BIDDER_CODE = 'videoheroes'; -const DEFAULT_CUR = 'USD'; -const ENDPOINT_URL = `https://point.contextualadv.com/?t=2&partner=hash`; - -const NATIVE_ASSETS_IDS = { 1: 'title', 2: 'icon', 3: 'image', 4: 'body', 5: 'sponsoredBy', 6: 'cta' }; -const NATIVE_ASSETS = { - title: { id: 1, name: 'title' }, - icon: { id: 2, type: 1, name: 'img' }, - image: { id: 3, type: 3, name: 'img' }, - body: { id: 4, type: 2, name: 'data' }, - sponsoredBy: { id: 5, type: 1, name: 'data' }, - cta: { id: 6, type: 12, name: 'data' } +const MEDIA_TYPES = [BANNER, VIDEO, NATIVE]; +const DEF_FLOOR = 0.05; +const CUR = 'USD'; +const TTL = 1200; +const ENDPOINT_URL = `https://point.contextualadv.com/?t=2&partner=`; + +const NATIVE_ASSETS_IDS = { 1: 'title', 2: 'icon', 3: 'image', 4: 'sponsoredBy', 5: 'body', 6: 'rating', 7: 'downloads' , 8: 'cta' }; + +const NATIVE_ASSETS_TYPES = { + title: {id: 1, title: {len: 25}}, + icon: {id: 2, img: {type: 1}}, + image: {id: 3, img: {type: 3}}, + sponsoredBy: {id: 4, data: {type: 1, len: 30}}, + body: {id: 5, data: {type: 2, len: 100}}, + rating: {id: 6, data: {type: 3, len: 25}}, + downloads: {id: 7, data: {type: 5, len: 25}}, + cta: {id: 8, data: {type: 12, len: 25}}, }; export const spec = { code: BIDDER_CODE, - supportedMediaTypes: [BANNER, VIDEO, NATIVE], - - /** - * Determines whether or not the given bid request is valid. - * - * @param {object} bid The bid to validate. - * @return boolean True if this is a valid bid, and false otherwise. - */ + supportedMediaTypes: MEDIA_TYPES, + isBidRequestValid: (bid) => { - return !!(bid.params.placementId && bid.params.placementId.toString().length === 32); + const { params, mediaTypes } = bid; + + if(isStr(params.placementId) && params.placementId.length === 32 && mediaTypes){ + if( + (mediaTypes[BANNER] && mediaTypes[BANNER].sizes) || + (mediaTypes[VIDEO] && mediaTypes[VIDEO].playerSize) || + (mediaTypes[NATIVE]) + ) + return true; + } + + return false; + }, - /** - * Make a server request from the list of BidRequests. - * - * @param {BidRequest[]} validBidRequests A non-empty list of valid bid requests that should be sent to the Server. - * @return ServerRequest Info describing the request to the server. - */ buildRequests: (validBidRequests, bidderRequest) => { - // convert Native ORTB definition to old-style prebid native definition - validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests); - if (validBidRequests.length === 0 || !bidderRequest) return []; - - const endpointURL = ENDPOINT_URL.replace('hash', validBidRequests[0].params.placementId); - - let imp = validBidRequests.map(br => { - let impObject = { - id: br.bidId, - secure: 1 - }; - - if (br.mediaTypes.banner) { - impObject.banner = createBannerRequest(br); - } else if (br.mediaTypes.video) { - impObject.video = createVideoRequest(br); - } else if (br.mediaTypes.native) { - impObject.native = { - // TODO: fix transactionId leak: https://github.com/prebid/Prebid.js/issues/9781 - // Also, `id` is not in the ORTB native spec - id: br.transactionId, - ver: '1.2', - request: createNativeRequest(br) - }; - } - return impObject; - }); + if(bidderRequest == undefined || validBidRequests[0] == undefined)return []; - let page = bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation; + validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests); let data = { id: bidderRequest.bidderRequestId, - cur: [ DEFAULT_CUR ], - device: { - w: screen.width, - h: screen.height, - language: (navigator && navigator.language) ? navigator.language.indexOf('-') != -1 ? navigator.language.split('-')[0] : navigator.language : '', - ua: navigator.userAgent, - }, - site: { - domain: parseUrl(page).hostname, - page: page, - }, + imp: validBidRequests.map(adUnit => prepareImpression(adUnit)), + site: prepareSite(validBidRequests[0], bidderRequest), + device: prepareDevice(), tmax: bidderRequest.timeout, - imp + cur: [ CUR ], + user: { ext: {} }, + regs: { ext: {}, coppa: config.getConfig('coppa') == true ? 1 : 0 }, + source: { ext: { schain: validBidRequests[0].schain } } }; - if (bidderRequest.refererInfo.ref) { - data.site.ref = bidderRequest.refererInfo.ref; - } - - if(bidderRequest.userIdAsEids){ - data['user'] = {'ext': {'eids': bidderRequest.userIdAsEids }}; - } - - if (bidderRequest.gdprConsent) { - data['regs'] = {'ext': {'gdpr': bidderRequest.gdprConsent.gdprApplies ? 1 : 0}}; - if(!data['user'] || !data['user']['ext'])data['user'] = {'ext':{}}; - data['user']['ext']['consent'] = bidderRequest.gdprConsent.consentString ? bidderRequest.gdprConsent.consentString : ''}}; - } - - if (bidderRequest.uspConsent !== undefined) { - if (!data['regs'])data['regs'] = {'ext': {}}; - data['regs']['ext']['us_privacy'] = bidderRequest.uspConsent; - } - - if (config.getConfig('coppa') === true) { - if (!data['regs'])data['regs'] = {'coppa': 1}; - else data['regs']['coppa'] = 1; - } - - if (validBidRequests[0].schain) { - data['source'] = {'ext': {'schain': validBidRequests[0].schain}}; - } + prepareConsents(data, bidderRequest); + prepareEids(data, validBidRequests[0]); return { method: 'POST', - url: endpointURL, + url: ENDPOINT_URL + validBidRequests[0].params.placementId, data: data }; }, - /** - * Unpack the response from the server into a list of bids. - * - * @param {*} serverResponse A successful response from the server. - * @return {Bid[]} An array of bids which were nested inside the server. - */ interpretResponse: (serverResponse) => { - if (!serverResponse || isEmpty(serverResponse.body)) return []; - - let bids = []; - serverResponse.body.seatbid.forEach(response => { - response.bid.forEach(bid => { - let mediaType = bid.ext && bid.ext.mediaType ? bid.ext.mediaType : 'banner'; - - let bidObj = { - requestId: bid.impid, - cpm: bid.price, - width: bid.w, - height: bid.h, - ttl: 1200, - currency: DEFAULT_CUR, - netRevenue: true, - creativeId: bid.crid, - dealId: bid.dealid || null, - mediaType: mediaType - }; - - switch (mediaType) { - case 'video': - bidObj.vastUrl = bid.adm; - break; - case 'native': - bidObj.native = parseNative(bid.adm); - break; - default: - bidObj.ad = bid.adm; - } + if (!serverResponse || isEmpty(serverResponse.body)) { + return []; + } + + const bidsArray = serverResponse.body.seatbid[0].bid.map((bidItem) => { + + let bidObject = { + requestId: bidItem.impid, + cpm: bidItem.price, + width: bidItem.w, + height: bidItem.h, + ttl: TTL, + currency: CUR, + mediaType: bidItem?.ext?.mediaType ? bidItem.ext.mediaType : BANNER, + nurl: bidItem.nurl, + dealId: bidItem.dealid || null, + creativeId: bidItem.crid, + netRevenue: true + } + + if(bidObject.mediaType === VIDEO){ + bidObject.vastXml = bidItem.adm; + } + else if(bidObject.mediaType === NATIVE){ + bidObject.native = prepareNativeAd(bidItem.adm); + } + else{ + bidObject.ad = bidItem.adm; + } + + return bidObject; - bids.push(bidObj); - }); }); - return bids; + return bidsArray; + }, onBidWon: (bid) => { - if (isStr(bid.nurl) && bid.nurl !== '') { + if (isStr(bid.nurl)) { triggerPixel(bid.nurl); } } }; -const parseNative = adm => { - let bid = { - clickUrl: adm.native.link && adm.native.link.url, - impressionTrackers: adm.native.imptrackers || [], - clickTrackers: (adm.native.link && adm.native.link.clicktrackers) || [], - jstracker: adm.native.jstracker || [] - }; - adm.native.assets.forEach(asset => { - let kind = NATIVE_ASSETS_IDS[asset.id]; - let content = kind && asset[NATIVE_ASSETS[kind].name]; - if (content) { - bid[kind] = content.text || content.value || { url: content.url, width: content.w, height: content.h }; +registerBidder(spec); + +const getMediaTypeValues = { + [BANNER]: (adUnit) => { + let [w, h] = [300, 250]; + let format = []; + + if(isArrayOfNums(adUnit.mediaTypes.banner.sizes)){ + [w, h] = adUnit.mediaTypes.banner.sizes; + } + else if(isArray(adUnit.mediaTypes.banner.sizes)){ + [w, h] = adUnit.mediaTypes.banner.sizes[0]; + if(adUnit.mediaTypes.banner.sizes.length > 1)format = adUnit.mediaTypes.banner.sizes.map((size) => ({ w: size[0], h: size[1] })) } + + return { + w, + h, + format + } + }, + [NATIVE]: (adUnit) => { + let req = { + assets: [] + }; + + let assets = Object.keys(adUnit.mediaTypes.native); + + for (let asset of assets) { + if(NATIVE_ASSETS_TYPES[asset]){ + + const assetItem = {...NATIVE_ASSETS_TYPES[asset]}; + let assetName = NATIVE_ASSETS_IDS[assetItem.id]; + assetItem[assetName] = {...NATIVE_ASSETS_TYPES[asset][assetName]}; + + assetItem[assetName].required = adUnit.mediaTypes.native[asset].required ? 1 : 0; + if(adUnit.mediaTypes.native[asset].len)assetItem[assetName].len = adUnit.mediaTypes.native[asset].len; + if(adUnit.mediaTypes.native[asset].sizes) { + const size = Array.isArray(adUnit.mediaTypes.native[asset].sizes[0]) ? adUnit.mediaTypes.native[asset].sizes[0] : adUnit.mediaTypes.native[asset].sizes; + assetItem[assetName].w = size[0]; + assetItem[assetName].h = size[1]; + } + + req.assets.push(assetItem); + + } + } + + return { + ver: '1.2', + request: req + } + }, + [VIDEO]: (adUnit) => { + let videoObj = {...adUnit.mediaTypes.video}; + + if (videoObj.playerSize) { + const size = Array.isArray(videoObj.playerSize[0]) ? videoObj.playerSize[0] : videoObj.playerSize; + videoObj.w = size[0]; + videoObj.h = size[1]; + } else { + videoObj.w = 640; + videoObj.h = 480; + } + + return videoObj; + } +} + +function getFloor(adUnit, mediaType){ + let floor = DEF_FLOOR; + + if (!isFn(adUnit.getFloor)) { + return floor; + } + + let floorObj = adUnit.getFloor({ + currency: DEF_FLOOR, + mediaType, + size: '*' }); - return bid; + if(isPlainObject(floorObj) && !isNaN(parseFloat(floorObj.floor))){ + floor = parseFloat(floorObj.floor) || floor; + } + + return floor; + } -const createNativeRequest = br => { - let impObject = { - ver: '1.2', - assets: [] +function prepareImpression(adUnit){ + let mediaType = Object.keys(adUnit.mediaTypes)[0]; + + const impObj = { + id: adUnit.bidId, + secure: window.location.protocol.indexOf("https") !== -1 ? 1 : 0, + bidfloor: getFloor(adUnit, mediaType) }; - let keys = Object.keys(br.mediaTypes.native); - - for (let key of keys) { - const props = NATIVE_ASSETS[key]; - if (props) { - const asset = { - required: br.mediaTypes.native[key].required ? 1 : 0, - id: props.id, - [props.name]: {} - }; - - if (props.type) asset[props.name]['type'] = props.type; - if (br.mediaTypes.native[key].len) asset[props.name]['len'] = br.mediaTypes.native[key].len; - if (br.mediaTypes.native[key].sizes && br.mediaTypes.native[key].sizes[0]) { - asset[props.name]['w'] = br.mediaTypes.native[key].sizes[0]; - asset[props.name]['h'] = br.mediaTypes.native[key].sizes[1]; - } + impObj[mediaType] = getMediaTypeValues[mediaType](adUnit); - impObject.assets.push(asset); - } +} + +function prepareSite(adUnit, request){ + + let siteObj = {}; + + siteObj.publisher = { + id: adUnit.params.placementId.toString() + }; + + siteObj.domain = parseUrl(request.refererInfo.page || request.refererInfo.topmostLocation).hostname; + siteObj.page = request.refererInfo.page || request.refererInfo.topmostLocation; + + if (request.refererInfo.ref) { + siteObj.site.ref = request.refererInfo.ref; } - return impObject; + return siteObj; } -const createBannerRequest = br => { - let size = []; +function prepareDevice(){ - if (br.mediaTypes.banner.sizes && Array.isArray(br.mediaTypes.banner.sizes)) { - if (Array.isArray(br.mediaTypes.banner.sizes[0])) { size = br.mediaTypes.banner.sizes[0]; } else { size = br.mediaTypes.banner.sizes; } - } else size = [300, 250]; + let deviceObj = {}; - return { id: br.transactionId, w: size[0], h: size[1] }; -}; + [deviceObj.w, deviceObj.h] = [screen.width, screen.height]; + deviceObj.language = navigator.language; + deviceObj.dnt = navigator.doNotTrack === '1' ? 1 : 0 + deviceObj.ua = navigator.userAgent; -const createVideoRequest = br => { - let videoObj = {id: br.transactionId}; - let supportParamsList = ['mimes', 'minduration', 'maxduration', 'protocols', 'startdelay', 'skip', 'minbitrate', 'maxbitrate', 'api', 'linearity']; + return deviceObj; +} - for (let param of supportParamsList) { - if (br.mediaTypes.video[param] !== undefined) { - videoObj[param] = br.mediaTypes.video[param]; - } +function prepareConsents(data, request){ + if (request.gdprConsent !== undefined) { + data.regs.ext.gdpr = request.gdprConsent.gdprApplies ? 1 : 0; + data.user.ext.consent = request.gdprConsent.consentString ? request.gdprConsent.consentString : ''; } - if (br.mediaTypes.video.playerSize && Array.isArray(br.mediaTypes.video.playerSize)) { - if (Array.isArray(br.mediaTypes.video.playerSize[0])) { - videoObj.w = br.mediaTypes.video.playerSize[0][0]; - videoObj.h = br.mediaTypes.video.playerSize[0][1]; - } else { - videoObj.w = br.mediaTypes.video.playerSize[0]; - videoObj.h = br.mediaTypes.video.playerSize[1]; - } - } else { - videoObj.w = 640; - videoObj.h = 480; + if (request.uspConsent !== undefined) { + data.regs.ext.us_privacy = request.uspConsent; } - return videoObj; + return true; } -registerBidder(spec); +function prepareEids(data, adUnit){ + if(adUnit.userIdAsEids !== undefined){ + data.user.ext.eids = adUnit.userIdAsEids; + } + + return true; +} + +function prepareNativeAd(adm){ + const nativeObj = JSON.parse(adm).native; + + let native = { + impressionTrackers: nativeObj.imptrackers || [], + jstracker: nativeObj.jstracker || [] + }; + + if(nativeObj.link){ + native.clickUrl = nativeObj.link.url || ""; + native.clickTrackers = nativeObj.link.clicktrackers || []; + } + + nativeObj.assets.forEach(asset => { + let kind = NATIVE_ASSETS_IDS[asset.id]; + + if(asset.title != undefined)native[kind] = asset.title.text; + else if(asset.img != undefined)native[kind] = {url: asset.img.url, width: asset.img.w, height: asset.img.h}; + else if(asset.data != undefined)native[kind] = asset.data.value; + }); + + return native; +} diff --git a/test/spec/modules/videoheroesBidAdapter_spec.js b/test/spec/modules/videoheroesBidAdapter_spec.js index 8f99ca4d17d..5405a37b898 100644 --- a/test/spec/modules/videoheroesBidAdapter_spec.js +++ b/test/spec/modules/videoheroesBidAdapter_spec.js @@ -103,6 +103,7 @@ const response_banner = { price: 5, adomain: ['example.com'], adm: 'admcode', + nurl: 'https://trc.contextualadv.com/nurl/81d39516c777565f_2/0.1', crid: 'crid', ext: { mediaType: 'banner' @@ -121,6 +122,7 @@ const response_video = { price: 5, adomain: ['example.com'], adm: 'admcode', + nurl: 'https://trc.contextualadv.com/nurl/81d39516c777565f_2/0.1', crid: 'crid', ext: { mediaType: 'video' @@ -144,7 +146,7 @@ const response_native = { impid: 'request_imp_id', price: 5, adomain: ['example.com'], - adm: { native: + adm: JSON.stringify({ native: { assets: [ {id: 1, title: 'dummyText'}, @@ -158,7 +160,8 @@ const response_native = { imptrackers: ['tracker1.com', 'tracker2.com', 'tracker3.com'], jstracker: 'tracker1.com' } - }, + }), + nurl: 'https://trc.contextualadv.com/nurl/81d39516c777565f_2/0.1', crid: 'crid', ext: { mediaType: 'native' @@ -267,6 +270,7 @@ describe('VideoheroesBidAdapter', function() { netRevenue: true, creativeId: response_banner.seatbid[0].bid[0].crid, dealId: response_banner.seatbid[0].bid[0].dealid, + nurl: response_banner.seatbid[0].bid[0].nurl, mediaType: 'banner', ad: response_banner.seatbid[0].bid[0].adm } @@ -276,7 +280,7 @@ describe('VideoheroesBidAdapter', function() { expect(bannerResponses).to.be.an('array').that.is.not.empty; let dataItem = bannerResponses[0]; expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId', - 'netRevenue', 'currency', 'dealId', 'mediaType'); + 'netRevenue', 'currency', 'dealId', 'nurl', 'mediaType'); expect(dataItem.requestId).to.equal(expectedBidResponse.requestId); expect(dataItem.cpm).to.equal(expectedBidResponse.cpm); expect(dataItem.ad).to.equal(expectedBidResponse.ad); @@ -284,6 +288,7 @@ describe('VideoheroesBidAdapter', function() { expect(dataItem.creativeId).to.equal(expectedBidResponse.creativeId); expect(dataItem.netRevenue).to.be.true; expect(dataItem.currency).to.equal(expectedBidResponse.currency); + expect(dataItem.nurl).to.equal(expectedBidResponse.nurl); expect(dataItem.width).to.equal(expectedBidResponse.width); expect(dataItem.height).to.equal(expectedBidResponse.height); }); @@ -303,23 +308,25 @@ describe('VideoheroesBidAdapter', function() { netRevenue: true, creativeId: response_video.seatbid[0].bid[0].crid, dealId: response_video.seatbid[0].bid[0].dealid, + nurl: response_banner.seatbid[0].bid[0].nurl, mediaType: 'video', - vastUrl: response_video.seatbid[0].bid[0].adm + vastXml: response_video.seatbid[0].bid[0].adm } let videoResponses = spec.interpretResponse(videoResponse); expect(videoResponses).to.be.an('array').that.is.not.empty; let dataItem = videoResponses[0]; - expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'vastUrl', 'ttl', 'creativeId', - 'netRevenue', 'currency', 'dealId', 'mediaType'); + expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'vastXml', 'ttl', 'creativeId', + 'netRevenue', 'currency', 'dealId', 'nurl', 'mediaType'); expect(dataItem.requestId).to.equal(expectedBidResponse.requestId); expect(dataItem.cpm).to.equal(expectedBidResponse.cpm); - expect(dataItem.vastUrl).to.equal(expectedBidResponse.vastUrl) + expect(dataItem.vastXml).to.equal(expectedBidResponse.vastXml) expect(dataItem.ttl).to.equal(expectedBidResponse.ttl); expect(dataItem.creativeId).to.equal(expectedBidResponse.creativeId); expect(dataItem.netRevenue).to.be.true; expect(dataItem.currency).to.equal(expectedBidResponse.currency); + expect(dataItem.nurl).to.equal(expectedBidResponse.nurl); expect(dataItem.width).to.equal(expectedBidResponse.width); expect(dataItem.height).to.equal(expectedBidResponse.height); }); @@ -339,8 +346,9 @@ describe('VideoheroesBidAdapter', function() { netRevenue: true, creativeId: response_native.seatbid[0].bid[0].crid, dealId: response_native.seatbid[0].bid[0].dealid, + nurl: response_banner.seatbid[0].bid[0].nurl, mediaType: 'native', - native: {clickUrl: response_native.seatbid[0].bid[0].adm.native.link.url} + native: {clickUrl: 'example.com'} } let nativeResponses = spec.interpretResponse(nativeResponse); @@ -348,7 +356,7 @@ describe('VideoheroesBidAdapter', function() { expect(nativeResponses).to.be.an('array').that.is.not.empty; let dataItem = nativeResponses[0]; expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'native', 'ttl', 'creativeId', - 'netRevenue', 'currency', 'dealId', 'mediaType'); + 'netRevenue', 'currency', 'dealId', 'nurl', 'mediaType'); expect(dataItem.requestId).to.equal(expectedBidResponse.requestId); expect(dataItem.cpm).to.equal(expectedBidResponse.cpm); expect(dataItem.native.clickUrl).to.equal(expectedBidResponse.native.clickUrl) @@ -356,6 +364,7 @@ describe('VideoheroesBidAdapter', function() { expect(dataItem.creativeId).to.equal(expectedBidResponse.creativeId); expect(dataItem.netRevenue).to.be.true; expect(dataItem.currency).to.equal(expectedBidResponse.currency); + expect(dataItem.nurl).to.equal(expectedBidResponse.nurl); expect(dataItem.width).to.equal(expectedBidResponse.width); expect(dataItem.height).to.equal(expectedBidResponse.height); }); From a44002b116e22e34f9dc01711f956214abbbbb35 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 28 Jul 2024 19:58:02 +0000 Subject: [PATCH 03/23] videoHeroesAdapter: esLint fixes --- modules/videoheroesBidAdapter.js | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index 1b075bde3bf..d4f3634c4a5 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -31,13 +31,12 @@ export const spec = { isBidRequestValid: (bid) => { const { params, mediaTypes } = bid; - if(isStr(params.placementId) && params.placementId.length === 32 && mediaTypes){ - if( + if (isStr(params.placementId) && params.placementId.length === 32 && mediaTypes){ + if ( (mediaTypes[BANNER] && mediaTypes[BANNER].sizes) || (mediaTypes[VIDEO] && mediaTypes[VIDEO].playerSize) || (mediaTypes[NATIVE]) - ) - return true; + ){ return true; } } return false; @@ -92,13 +91,13 @@ export const spec = { netRevenue: true } - if(bidObject.mediaType === VIDEO){ + if (bidObject.mediaType === VIDEO){ bidObject.vastXml = bidItem.adm; } - else if(bidObject.mediaType === NATIVE){ + else if (bidObject.mediaType === NATIVE){ bidObject.native = prepareNativeAd(bidItem.adm); } - else{ + else { bidObject.ad = bidItem.adm; } @@ -124,12 +123,12 @@ const getMediaTypeValues = { let [w, h] = [300, 250]; let format = []; - if(isArrayOfNums(adUnit.mediaTypes.banner.sizes)){ + if (isArrayOfNums(adUnit.mediaTypes.banner.sizes)){ [w, h] = adUnit.mediaTypes.banner.sizes; } - else if(isArray(adUnit.mediaTypes.banner.sizes)){ + else if (isArray(adUnit.mediaTypes.banner.sizes)){ [w, h] = adUnit.mediaTypes.banner.sizes[0]; - if(adUnit.mediaTypes.banner.sizes.length > 1)format = adUnit.mediaTypes.banner.sizes.map((size) => ({ w: size[0], h: size[1] })) + if (adUnit.mediaTypes.banner.sizes.length > 1){ format = adUnit.mediaTypes.banner.sizes.map((size) => ({ w: size[0], h: size[1] })); } } return { @@ -264,7 +263,7 @@ function prepareConsents(data, request){ } function prepareEids(data, adUnit){ - if(adUnit.userIdAsEids !== undefined){ + if (adUnit.userIdAsEids !== undefined){ data.user.ext.eids = adUnit.userIdAsEids; } From 5f72a6bb2103ac818cabcc3d3ed3bddd8720efe5 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 28 Jul 2024 20:13:35 +0000 Subject: [PATCH 04/23] videoHeroesAdapter: esLint fixes --- modules/videoheroesBidAdapter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index d4f3634c4a5..caaf743ef2e 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -11,7 +11,7 @@ const CUR = 'USD'; const TTL = 1200; const ENDPOINT_URL = `https://point.contextualadv.com/?t=2&partner=`; -const NATIVE_ASSETS_IDS = { 1: 'title', 2: 'icon', 3: 'image', 4: 'sponsoredBy', 5: 'body', 6: 'rating', 7: 'downloads' , 8: 'cta' }; +const NATIVE_ASSETS_IDS = { 1: 'title', 2: 'icon', 3: 'image', 4: 'sponsoredBy', 5: 'body', 6: 'rating', 7: 'downloads', 8: 'cta' }; const NATIVE_ASSETS_TYPES = { title: {id: 1, title: {len: 25}}, @@ -21,7 +21,7 @@ const NATIVE_ASSETS_TYPES = { body: {id: 5, data: {type: 2, len: 100}}, rating: {id: 6, data: {type: 3, len: 25}}, downloads: {id: 7, data: {type: 5, len: 25}}, - cta: {id: 8, data: {type: 12, len: 25}}, + cta: {id: 8, data: {type: 12, len: 25}} }; export const spec = { From adc49296de397a9cf1c22fd59bd3306c458aed63 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 28 Jul 2024 20:17:15 +0000 Subject: [PATCH 05/23] videoHeroesAdapter: esLint fixes 2 --- modules/videoheroesBidAdapter.js | 55 +++++++++++++++----------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index caaf743ef2e..a84cc238afd 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -31,20 +31,19 @@ export const spec = { isBidRequestValid: (bid) => { const { params, mediaTypes } = bid; - if (isStr(params.placementId) && params.placementId.length === 32 && mediaTypes){ + if (isStr(params.placementId) && params.placementId.length === 32 && mediaTypes) { if ( (mediaTypes[BANNER] && mediaTypes[BANNER].sizes) || (mediaTypes[VIDEO] && mediaTypes[VIDEO].playerSize) || (mediaTypes[NATIVE]) - ){ return true; } + ) { return true; } } return false; - }, buildRequests: (validBidRequests, bidderRequest) => { - if(bidderRequest == undefined || validBidRequests[0] == undefined)return []; + if (bidderRequest == undefined || validBidRequests[0] == undefined) { return []; } validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests); @@ -76,7 +75,6 @@ export const spec = { } const bidsArray = serverResponse.body.seatbid[0].bid.map((bidItem) => { - let bidObject = { requestId: bidItem.impid, cpm: bidItem.price, @@ -91,22 +89,18 @@ export const spec = { netRevenue: true } - if (bidObject.mediaType === VIDEO){ + if (bidObject.mediaType === VIDEO) { bidObject.vastXml = bidItem.adm; - } - else if (bidObject.mediaType === NATIVE){ + } else if (bidObject.mediaType === NATIVE) { bidObject.native = prepareNativeAd(bidItem.adm); - } - else { + } else { bidObject.ad = bidItem.adm; } return bidObject; - }); return bidsArray; - }, onBidWon: (bid) => { @@ -123,10 +117,9 @@ const getMediaTypeValues = { let [w, h] = [300, 250]; let format = []; - if (isArrayOfNums(adUnit.mediaTypes.banner.sizes)){ + if (isArrayOfNums(adUnit.mediaTypes.banner.sizes)) { [w, h] = adUnit.mediaTypes.banner.sizes; - } - else if (isArray(adUnit.mediaTypes.banner.sizes)){ + } else if (isArray(adUnit.mediaTypes.banner.sizes)) { [w, h] = adUnit.mediaTypes.banner.sizes[0]; if (adUnit.mediaTypes.banner.sizes.length > 1){ format = adUnit.mediaTypes.banner.sizes.map((size) => ({ w: size[0], h: size[1] })); } } @@ -152,8 +145,8 @@ const getMediaTypeValues = { assetItem[assetName] = {...NATIVE_ASSETS_TYPES[asset][assetName]}; assetItem[assetName].required = adUnit.mediaTypes.native[asset].required ? 1 : 0; - if(adUnit.mediaTypes.native[asset].len)assetItem[assetName].len = adUnit.mediaTypes.native[asset].len; - if(adUnit.mediaTypes.native[asset].sizes) { + if (adUnit.mediaTypes.native[asset].len) { assetItem[assetName].len = adUnit.mediaTypes.native[asset].len; } + if (adUnit.mediaTypes.native[asset].sizes) { const size = Array.isArray(adUnit.mediaTypes.native[asset].sizes[0]) ? adUnit.mediaTypes.native[asset].sizes[0] : adUnit.mediaTypes.native[asset].sizes; assetItem[assetName].w = size[0]; assetItem[assetName].h = size[1]; @@ -185,7 +178,7 @@ const getMediaTypeValues = { } } -function getFloor(adUnit, mediaType){ +function getFloor(adUnit, mediaType) { let floor = DEF_FLOOR; if (!isFn(adUnit.getFloor)) { @@ -198,15 +191,14 @@ function getFloor(adUnit, mediaType){ size: '*' }); - if(isPlainObject(floorObj) && !isNaN(parseFloat(floorObj.floor))){ + if (isPlainObject(floorObj) && !isNaN(parseFloat(floorObj.floor))) { floor = parseFloat(floorObj.floor) || floor; } return floor; - } -function prepareImpression(adUnit){ +function prepareImpression(adUnit) { let mediaType = Object.keys(adUnit.mediaTypes)[0]; const impObj = { @@ -216,10 +208,9 @@ function prepareImpression(adUnit){ }; impObj[mediaType] = getMediaTypeValues[mediaType](adUnit); - } -function prepareSite(adUnit, request){ +function prepareSite(adUnit, request) { let siteObj = {}; @@ -237,7 +228,7 @@ function prepareSite(adUnit, request){ return siteObj; } -function prepareDevice(){ +function prepareDevice() { let deviceObj = {}; @@ -249,7 +240,7 @@ function prepareDevice(){ return deviceObj; } -function prepareConsents(data, request){ +function prepareConsents(data, request) { if (request.gdprConsent !== undefined) { data.regs.ext.gdpr = request.gdprConsent.gdprApplies ? 1 : 0; data.user.ext.consent = request.gdprConsent.consentString ? request.gdprConsent.consentString : ''; @@ -262,7 +253,7 @@ function prepareConsents(data, request){ return true; } -function prepareEids(data, adUnit){ +function prepareEids(data, adUnit) { if (adUnit.userIdAsEids !== undefined){ data.user.ext.eids = adUnit.userIdAsEids; } @@ -270,7 +261,7 @@ function prepareEids(data, adUnit){ return true; } -function prepareNativeAd(adm){ +function prepareNativeAd(adm) { const nativeObj = JSON.parse(adm).native; let native = { @@ -286,9 +277,13 @@ function prepareNativeAd(adm){ nativeObj.assets.forEach(asset => { let kind = NATIVE_ASSETS_IDS[asset.id]; - if(asset.title != undefined)native[kind] = asset.title.text; - else if(asset.img != undefined)native[kind] = {url: asset.img.url, width: asset.img.w, height: asset.img.h}; - else if(asset.data != undefined)native[kind] = asset.data.value; + if (asset.title != undefined) { + native[kind] = asset.title.text; + } else if (asset.img != undefined) { + native[kind] = {url: asset.img.url, width: asset.img.w, height: asset.img.h}; + } else if (asset.data != undefined) { + native[kind] = asset.data.value; + } }); return native; From 1f500a8ecdc133b56cfbb05592b773a5fe081f5d Mon Sep 17 00:00:00 2001 From: root Date: Sun, 28 Jul 2024 20:27:48 +0000 Subject: [PATCH 06/23] videoHeroesAdapter: esLint fixes final --- modules/videoheroesBidAdapter.js | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index a84cc238afd..34a480459c5 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -121,7 +121,7 @@ const getMediaTypeValues = { [w, h] = adUnit.mediaTypes.banner.sizes; } else if (isArray(adUnit.mediaTypes.banner.sizes)) { [w, h] = adUnit.mediaTypes.banner.sizes[0]; - if (adUnit.mediaTypes.banner.sizes.length > 1){ format = adUnit.mediaTypes.banner.sizes.map((size) => ({ w: size[0], h: size[1] })); } + if (adUnit.mediaTypes.banner.sizes.length > 1) { format = adUnit.mediaTypes.banner.sizes.map((size) => ({ w: size[0], h: size[1] })); } } return { @@ -138,9 +138,8 @@ const getMediaTypeValues = { let assets = Object.keys(adUnit.mediaTypes.native); for (let asset of assets) { - if(NATIVE_ASSETS_TYPES[asset]){ - - const assetItem = {...NATIVE_ASSETS_TYPES[asset]}; + if(NATIVE_ASSETS_TYPES[asset]) { + const assetItem = { ...NATIVE_ASSETS_TYPES[asset] }; let assetName = NATIVE_ASSETS_IDS[assetItem.id]; assetItem[assetName] = {...NATIVE_ASSETS_TYPES[asset][assetName]}; @@ -153,7 +152,6 @@ const getMediaTypeValues = { } req.assets.push(assetItem); - } } @@ -203,7 +201,7 @@ function prepareImpression(adUnit) { const impObj = { id: adUnit.bidId, - secure: window.location.protocol.indexOf("https") !== -1 ? 1 : 0, + secure: window.location.protocol.indexOf('https') !== -1 ? 1 : 0, bidfloor: getFloor(adUnit, mediaType) }; @@ -211,7 +209,6 @@ function prepareImpression(adUnit) { } function prepareSite(adUnit, request) { - let siteObj = {}; siteObj.publisher = { @@ -229,7 +226,6 @@ function prepareSite(adUnit, request) { } function prepareDevice() { - let deviceObj = {}; [deviceObj.w, deviceObj.h] = [screen.width, screen.height]; @@ -254,7 +250,7 @@ function prepareConsents(data, request) { } function prepareEids(data, adUnit) { - if (adUnit.userIdAsEids !== undefined){ + if (adUnit.userIdAsEids !== undefined) { data.user.ext.eids = adUnit.userIdAsEids; } @@ -269,8 +265,8 @@ function prepareNativeAd(adm) { jstracker: nativeObj.jstracker || [] }; - if(nativeObj.link){ - native.clickUrl = nativeObj.link.url || ""; + if (nativeObj.link) { + native.clickUrl = nativeObj.link.url || ''; native.clickTrackers = nativeObj.link.clicktrackers || []; } From 37ea61699077ddcaa90f3389e80fe780eb6d432b Mon Sep 17 00:00:00 2001 From: root Date: Sun, 28 Jul 2024 20:30:35 +0000 Subject: [PATCH 07/23] videoHeroesAdapter: esLint fixes final last ) --- modules/videoheroesBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index 34a480459c5..c3259bf4417 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -138,7 +138,7 @@ const getMediaTypeValues = { let assets = Object.keys(adUnit.mediaTypes.native); for (let asset of assets) { - if(NATIVE_ASSETS_TYPES[asset]) { + if (NATIVE_ASSETS_TYPES[asset]) { const assetItem = { ...NATIVE_ASSETS_TYPES[asset] }; let assetName = NATIVE_ASSETS_IDS[assetItem.id]; assetItem[assetName] = {...NATIVE_ASSETS_TYPES[asset][assetName]}; From 8f05c28d3b07f7bcf32ec8f7054f9206abd09d92 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 31 Jul 2024 15:36:18 +0000 Subject: [PATCH 08/23] videoHeroesAdapter: update device object to using ortb2.device --- modules/videoheroesBidAdapter.js | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index c3259bf4417..135560da77e 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -51,7 +51,7 @@ export const spec = { id: bidderRequest.bidderRequestId, imp: validBidRequests.map(adUnit => prepareImpression(adUnit)), site: prepareSite(validBidRequests[0], bidderRequest), - device: prepareDevice(), + device: bidderRequest.ortb2.device || {}; tmax: bidderRequest.timeout, cur: [ CUR ], user: { ext: {} }, @@ -225,17 +225,6 @@ function prepareSite(adUnit, request) { return siteObj; } -function prepareDevice() { - let deviceObj = {}; - - [deviceObj.w, deviceObj.h] = [screen.width, screen.height]; - deviceObj.language = navigator.language; - deviceObj.dnt = navigator.doNotTrack === '1' ? 1 : 0 - deviceObj.ua = navigator.userAgent; - - return deviceObj; -} - function prepareConsents(data, request) { if (request.gdprConsent !== undefined) { data.regs.ext.gdpr = request.gdprConsent.gdprApplies ? 1 : 0; From 9c953f288b5cf81a274ad7d6a27c653ca6b17e54 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 31 Jul 2024 15:40:17 +0000 Subject: [PATCH 09/23] videoHeroesAdapter: update device object to using ortb2.device (not saved comma) --- modules/videoheroesBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index 135560da77e..c868f8fe94f 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -51,7 +51,7 @@ export const spec = { id: bidderRequest.bidderRequestId, imp: validBidRequests.map(adUnit => prepareImpression(adUnit)), site: prepareSite(validBidRequests[0], bidderRequest), - device: bidderRequest.ortb2.device || {}; + device: bidderRequest.ortb2.device || {}, tmax: bidderRequest.timeout, cur: [ CUR ], user: { ext: {} }, From 25e07d86083ac6b1ccc0b77099d39bda854564f3 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 31 Jul 2024 15:54:10 +0000 Subject: [PATCH 10/23] videoHeroesAdapter: update device object to using ortb2.device, check for available --- modules/videoheroesBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index c868f8fe94f..d14ff9d2d90 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -51,7 +51,7 @@ export const spec = { id: bidderRequest.bidderRequestId, imp: validBidRequests.map(adUnit => prepareImpression(adUnit)), site: prepareSite(validBidRequests[0], bidderRequest), - device: bidderRequest.ortb2.device || {}, + device: bidderRequest.ortb2?.device || {}, tmax: bidderRequest.timeout, cur: [ CUR ], user: { ext: {} }, From 4229be6fcce926d8a050c68c2bff0968f486e716 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 31 Jul 2024 16:23:19 +0000 Subject: [PATCH 11/23] videoHeroesAdapter: update device object to using ortb2.device, check for available --- modules/videoheroesBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index d14ff9d2d90..8618c38f644 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -54,8 +54,8 @@ export const spec = { device: bidderRequest.ortb2?.device || {}, tmax: bidderRequest.timeout, cur: [ CUR ], - user: { ext: {} }, regs: { ext: {}, coppa: config.getConfig('coppa') == true ? 1 : 0 }, + user: { ext: {} }, source: { ext: { schain: validBidRequests[0].schain } } }; From bb31e0f4bfe17a78c6ba6f35d44f3db348b6aa7f Mon Sep 17 00:00:00 2001 From: root Date: Thu, 1 Aug 2024 10:25:20 +0000 Subject: [PATCH 12/23] rebuild as there no reasons to fail --- modules/videoheroesBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index 8618c38f644..d14ff9d2d90 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -54,8 +54,8 @@ export const spec = { device: bidderRequest.ortb2?.device || {}, tmax: bidderRequest.timeout, cur: [ CUR ], - regs: { ext: {}, coppa: config.getConfig('coppa') == true ? 1 : 0 }, user: { ext: {} }, + regs: { ext: {}, coppa: config.getConfig('coppa') == true ? 1 : 0 }, source: { ext: { schain: validBidRequests[0].schain } } }; From d39fd67429924f2af6bfde2187ab608f56366aac Mon Sep 17 00:00:00 2001 From: root Date: Thu, 1 Aug 2024 10:39:55 +0000 Subject: [PATCH 13/23] rebuild as there no reasons to fail --- modules/videoheroesBidAdapter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index d14ff9d2d90..95f9cb5cc69 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -47,11 +47,11 @@ export const spec = { validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests); - let data = { + let data = {̉̉ id: bidderRequest.bidderRequestId, imp: validBidRequests.map(adUnit => prepareImpression(adUnit)), site: prepareSite(validBidRequests[0], bidderRequest), - device: bidderRequest.ortb2?.device || {}, + device: bidderRequest.ortb2?.device || prepareDevice(), tmax: bidderRequest.timeout, cur: [ CUR ], user: { ext: {} }, From 9c2dfd6eca14e54573bc274c58cedd0dc78c6aa7 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 1 Aug 2024 10:46:02 +0000 Subject: [PATCH 14/23] rebuild as there no reasons to fail --- modules/videoheroesBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index 95f9cb5cc69..7a818bbf40a 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -47,7 +47,7 @@ export const spec = { validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests); - let data = {̉̉ + let data = { id: bidderRequest.bidderRequestId, imp: validBidRequests.map(adUnit => prepareImpression(adUnit)), site: prepareSite(validBidRequests[0], bidderRequest), From 86f7bf3321fc780df521e44f8ecd29046abdcf63 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 1 Aug 2024 10:56:15 +0000 Subject: [PATCH 15/23] rebuild as there no reasons to fail --- modules/videoheroesBidAdapter.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index 7a818bbf40a..b126f616afa 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -246,6 +246,17 @@ function prepareEids(data, adUnit) { return true; } +function prepareDevice() { + let deviceObj = {}; + + [deviceObj.w, deviceObj.h] = [screen.width, screen.height]; + deviceObj.language = navigator.language; + deviceObj.dnt = navigator.doNotTrack === '1' ? 1 : 0 + deviceObj.ua = navigator.userAgent; + + return deviceObj; +} + function prepareNativeAd(adm) { const nativeObj = JSON.parse(adm).native; From f025701de754f4b6cc24af716b9302b5337eca04 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 1 Aug 2024 11:20:12 +0000 Subject: [PATCH 16/23] rebuild as there no reasons to fail --- modules/videoheroesBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index b126f616afa..fcbd8fd277e 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -54,8 +54,8 @@ export const spec = { device: bidderRequest.ortb2?.device || prepareDevice(), tmax: bidderRequest.timeout, cur: [ CUR ], - user: { ext: {} }, regs: { ext: {}, coppa: config.getConfig('coppa') == true ? 1 : 0 }, + user: { ext: {} }, source: { ext: { schain: validBidRequests[0].schain } } }; From b818471f37737ca3b0990c526d05a94190435eb6 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 1 Aug 2024 11:47:16 +0000 Subject: [PATCH 17/23] rebuild as there no reasons to fail --- modules/videoheroesBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index fcbd8fd277e..b126f616afa 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -54,8 +54,8 @@ export const spec = { device: bidderRequest.ortb2?.device || prepareDevice(), tmax: bidderRequest.timeout, cur: [ CUR ], - regs: { ext: {}, coppa: config.getConfig('coppa') == true ? 1 : 0 }, user: { ext: {} }, + regs: { ext: {}, coppa: config.getConfig('coppa') == true ? 1 : 0 }, source: { ext: { schain: validBidRequests[0].schain } } }; From 0d678d0e671c3db999e12de9cb8dc4f9ba81d196 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 1 Aug 2024 16:25:05 +0000 Subject: [PATCH 18/23] rebuild as there no reasons to fail --- modules/videoheroesBidAdapter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index b126f616afa..4388fabf4e1 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -54,9 +54,9 @@ export const spec = { device: bidderRequest.ortb2?.device || prepareDevice(), tmax: bidderRequest.timeout, cur: [ CUR ], - user: { ext: {} }, regs: { ext: {}, coppa: config.getConfig('coppa') == true ? 1 : 0 }, - source: { ext: { schain: validBidRequests[0].schain } } + source: { ext: { schain: validBidRequests[0].schain } }, + user: { ext: {} } }; prepareConsents(data, bidderRequest); From a522592d3267e0ae843bbb3830ea997699ce0470 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 5 Aug 2024 16:01:42 +0000 Subject: [PATCH 19/23] changed native code logic form object style to switch --- modules/videoheroesBidAdapter.js | 142 +++++++++++++++++++++++-------- 1 file changed, 107 insertions(+), 35 deletions(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index 4388fabf4e1..fa81adf68bd 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -11,19 +11,6 @@ const CUR = 'USD'; const TTL = 1200; const ENDPOINT_URL = `https://point.contextualadv.com/?t=2&partner=`; -const NATIVE_ASSETS_IDS = { 1: 'title', 2: 'icon', 3: 'image', 4: 'sponsoredBy', 5: 'body', 6: 'rating', 7: 'downloads', 8: 'cta' }; - -const NATIVE_ASSETS_TYPES = { - title: {id: 1, title: {len: 25}}, - icon: {id: 2, img: {type: 1}}, - image: {id: 3, img: {type: 3}}, - sponsoredBy: {id: 4, data: {type: 1, len: 30}}, - body: {id: 5, data: {type: 2, len: 100}}, - rating: {id: 6, data: {type: 3, len: 25}}, - downloads: {id: 7, data: {type: 5, len: 25}}, - cta: {id: 8, data: {type: 12, len: 25}} -}; - export const spec = { code: BIDDER_CODE, supportedMediaTypes: MEDIA_TYPES, @@ -138,20 +125,10 @@ const getMediaTypeValues = { let assets = Object.keys(adUnit.mediaTypes.native); for (let asset of assets) { - if (NATIVE_ASSETS_TYPES[asset]) { - const assetItem = { ...NATIVE_ASSETS_TYPES[asset] }; - let assetName = NATIVE_ASSETS_IDS[assetItem.id]; - assetItem[assetName] = {...NATIVE_ASSETS_TYPES[asset][assetName]}; - - assetItem[assetName].required = adUnit.mediaTypes.native[asset].required ? 1 : 0; - if (adUnit.mediaTypes.native[asset].len) { assetItem[assetName].len = adUnit.mediaTypes.native[asset].len; } - if (adUnit.mediaTypes.native[asset].sizes) { - const size = Array.isArray(adUnit.mediaTypes.native[asset].sizes[0]) ? adUnit.mediaTypes.native[asset].sizes[0] : adUnit.mediaTypes.native[asset].sizes; - assetItem[assetName].w = size[0]; - assetItem[assetName].h = size[1]; - } - - req.assets.push(assetItem); + let item = prepareAsset(asset, adUnit.mediaTypes.native[asset]); + if (item) { + item.required = adUnit.mediaTypes.native[asset].required ? 1 : 0; + req.assets.push(item); } } @@ -176,6 +153,77 @@ const getMediaTypeValues = { } } +function prepareAsset(assetKey, asset) { + let item = false; + + let sizeTmp = false; + if (asset.sizes) { sizeTmp = Array.isArray(asset.sizes[0]) ? asset.sizes[0] : asset.sizes; } + + switch (assetKey) { + case 'title': + item = { + id: 1, + title: { len: asset.len || 25 } + }; + break; + + case 'icon': + item = { + id: 2, + img: { type: 1 }, + w: sizeTmp[0] || 50, + h: sizeTmp[1] || 50 + }; + break; + + case 'image': + item = { + id: 3, + img: { type: 3 }, + w: sizeTmp[0] || 300, + h: sizeTmp[1] || 250 + }; + break; + + case 'sponsoredBy': + item = { + id: 4, + data: { type: 1, length: asset.len || 30 } + }; + break; + + case 'body': + item = { + id: 5, + data: { type: 2, length: asset.len || 100 } + }; + break; + + case 'rating': + item = { + id: 6, + data: { type: 3, length: asset.len || 25 } + }; + break; + + case 'downloads': + item = { + id: 7, + data: { type: 5, length: asset.len || 25 } + }; + break; + + case 'cta': + item = { + id: 8, + data: { type: 12, length: asset.len || 25 } + }; + break; + } + + return item; +} + function getFloor(adUnit, mediaType) { let floor = DEF_FLOOR; @@ -271,14 +319,38 @@ function prepareNativeAd(adm) { } nativeObj.assets.forEach(asset => { - let kind = NATIVE_ASSETS_IDS[asset.id]; - - if (asset.title != undefined) { - native[kind] = asset.title.text; - } else if (asset.img != undefined) { - native[kind] = {url: asset.img.url, width: asset.img.w, height: asset.img.h}; - } else if (asset.data != undefined) { - native[kind] = asset.data.value; + switch (asset.id) { + case 1: + native.title = asset.title ? asset.title.text : ''; + break; + + case 2: + native.icon = asset.img ? {url: asset.img.url, width: asset.img.w, height: asset.img.h} : {}; + break; + + case 3: + native.image = asset.img ? {url: asset.img.url, width: asset.img.w, height: asset.img.h} : {}; + break; + + case 4: + native.sponsoredBy = asset.data ? asset.data.value : ''; + break; + + case 5: + native.body = asset.data ? asset.data.value : ''; + break; + + case 6: + native.rating = asset.data ? asset.data.value : ''; + break; + + case 7: + native.downloads = asset.data ? asset.data.value : ''; + break; + + case 8: + native.cta = asset.data ? asset.data.value : ''; + break; } }); From d9638c5456a12e2ef84fba66b35d094f404ec818 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 5 Aug 2024 16:46:17 +0000 Subject: [PATCH 20/23] changed native code logic form object style to switch (re-commit for rebuild as it tests errors not depend on code) --- modules/videoheroesBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index fa81adf68bd..a0a51bb40b6 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -41,8 +41,8 @@ export const spec = { device: bidderRequest.ortb2?.device || prepareDevice(), tmax: bidderRequest.timeout, cur: [ CUR ], - regs: { ext: {}, coppa: config.getConfig('coppa') == true ? 1 : 0 }, source: { ext: { schain: validBidRequests[0].schain } }, + regs: { ext: {}, coppa: config.getConfig('coppa') == true ? 1 : 0 }, user: { ext: {} } }; From 787dbcf70eaff3797679895df3e466b1db7096f8 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 5 Aug 2024 17:08:24 +0000 Subject: [PATCH 21/23] changed native code logic form object style to switch (re-commit for rebuild as trere test errors not depend on code) --- modules/videoheroesBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index a0a51bb40b6..fa81adf68bd 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -41,8 +41,8 @@ export const spec = { device: bidderRequest.ortb2?.device || prepareDevice(), tmax: bidderRequest.timeout, cur: [ CUR ], - source: { ext: { schain: validBidRequests[0].schain } }, regs: { ext: {}, coppa: config.getConfig('coppa') == true ? 1 : 0 }, + source: { ext: { schain: validBidRequests[0].schain } }, user: { ext: {} } }; From 12bf748508404cfa31486262a0813299a3f8c519 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 5 Aug 2024 17:24:14 +0000 Subject: [PATCH 22/23] changed native code logic form object style to switch (re-commit for rebuild as trere test errors not depend on code) --- modules/videoheroesBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index fa81adf68bd..a0a51bb40b6 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -41,8 +41,8 @@ export const spec = { device: bidderRequest.ortb2?.device || prepareDevice(), tmax: bidderRequest.timeout, cur: [ CUR ], - regs: { ext: {}, coppa: config.getConfig('coppa') == true ? 1 : 0 }, source: { ext: { schain: validBidRequests[0].schain } }, + regs: { ext: {}, coppa: config.getConfig('coppa') == true ? 1 : 0 }, user: { ext: {} } }; From ae3684a126059cbe9dbebde51f2363f1bfcb1e09 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 5 Aug 2024 17:52:02 +0000 Subject: [PATCH 23/23] changed native code logic form object style to switch --- modules/videoheroesBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/videoheroesBidAdapter.js b/modules/videoheroesBidAdapter.js index a0a51bb40b6..fa81adf68bd 100644 --- a/modules/videoheroesBidAdapter.js +++ b/modules/videoheroesBidAdapter.js @@ -41,8 +41,8 @@ export const spec = { device: bidderRequest.ortb2?.device || prepareDevice(), tmax: bidderRequest.timeout, cur: [ CUR ], - source: { ext: { schain: validBidRequests[0].schain } }, regs: { ext: {}, coppa: config.getConfig('coppa') == true ? 1 : 0 }, + source: { ext: { schain: validBidRequests[0].schain } }, user: { ext: {} } };