From afbbd27d4d022183b424b36b42bed4df4784b683 Mon Sep 17 00:00:00 2001 From: Juan Jose Olivera Date: Mon, 12 Dec 2022 20:19:28 -0600 Subject: [PATCH 01/11] Pull Insticator custom changes --- modules/insticatorBidAdapter.js | 171 ++++--------- modules/insticatorV2AnalyticsAdapter.js | 319 ++++++++++++++++++++++++ package.json | 2 +- 3 files changed, 367 insertions(+), 125 deletions(-) create mode 100644 modules/insticatorV2AnalyticsAdapter.js diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index 150e9d3c5c2..3853414c1a2 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -1,5 +1,5 @@ import {config} from '../src/config.js'; -import {BANNER, VIDEO} from '../src/mediaTypes.js'; +import {BANNER} from '../src/mediaTypes.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; import {deepAccess, generateUUID, logError, isArray} from '../src/utils.js'; import {getStorageManager} from '../src/storageManager.js'; @@ -25,7 +25,7 @@ function getUserId() { let uid; if (storage.localStorageIsEnabled()) { - uid = storage.getDataFromLocalStorage(USER_ID_KEY); + uid = localStorage.getItem(USER_ID_KEY); } else { uid = storage.getCookie(USER_ID_KEY); } @@ -39,7 +39,7 @@ function getUserId() { function setUserId(userId) { if (storage.localStorageIsEnabled()) { - storage.setDataInLocalStorage(USER_ID_KEY, userId); + localStorage.setItem(USER_ID_KEY, userId); } if (storage.cookiesAreEnabled()) { @@ -48,9 +48,14 @@ function setUserId(userId) { } } -function buildBanner(bidRequest) { +function buildImpression(bidRequest) { const format = []; - const pos = deepAccess(bidRequest, 'mediaTypes.banner.pos'); + const ext = { + insticator: { + adUnitId: bidRequest.params.adUnitId, + }, + } + const sizes = deepAccess(bidRequest, 'mediaTypes.banner.sizes') || bidRequest.sizes; @@ -61,49 +66,27 @@ function buildBanner(bidRequest) { }); } - return { - format, - pos, + const gpid = deepAccess(bidRequest, 'ortb2Imp.ext.gpid'); + + if (gpid) { + ext.gpid = gpid; } -} -function buildVideo(bidRequest) { - const w = deepAccess(bidRequest, 'mediaTypes.video.w'); - const h = deepAccess(bidRequest, 'mediaTypes.video.h'); - const mimes = deepAccess(bidRequest, 'mediaTypes.video.mimes'); - const placement = deepAccess(bidRequest, 'mediaTypes.video.placement') || 3; + const instl = deepAccess(bidRequest, 'ortb2Imp.instl') + const secure = location.protocol === 'https:' ? 1 : 0; + const pos = deepAccess(bidRequest, 'mediaTypes.banner.pos'); return { - placement, - mimes, - w, - h, - } -} - -function buildImpression(bidRequest) { - const imp = { id: bidRequest.bidId, tagid: bidRequest.adUnitCode, - instl: deepAccess(bidRequest, 'ortb2Imp.instl'), - secure: location.protocol === 'https:' ? 1 : 0, - ext: { - gpid: deepAccess(bidRequest, 'ortb2Imp.ext.gpid'), - insticator: { - adUnitId: bidRequest.params.adUnitId, - }, + instl, + secure, + banner: { + format, + pos, }, - } - - if (deepAccess(bidRequest, 'mediaTypes.banner')) { - imp.banner = buildBanner(bidRequest); - } - - if (deepAccess(bidRequest, 'mediaTypes.video')) { - imp.video = buildVideo(bidRequest); - } - - return imp; + ext, + }; } function buildDevice() { @@ -179,10 +162,9 @@ function buildRequest(validBidRequests, bidderRequest) { tid: bidderRequest.auctionId, }, site: { - // TODO: are these the right refererInfo values? - domain: bidderRequest.refererInfo.domain, - page: bidderRequest.refererInfo.page, - ref: bidderRequest.refererInfo.ref, + domain: location.hostname, + page: location.href, + ref: bidderRequest.refererInfo.referer, }, device: buildDevice(), regs: buildRegs(bidderRequest), @@ -270,90 +252,31 @@ function validateSizes(sizes) { ); } -function validateAdUnitId(bid) { - if (!bid.params.adUnitId) { - logError('insticator: missing adUnitId bid parameter'); - return false; - } - - return true; -} - -function validateMediaType(bid) { - if (!(BANNER in bid.mediaTypes || VIDEO in bid.mediaTypes)) { - logError('insticator: expected banner or video in mediaTypes'); - return false; - } - - return true; -} - -function validateBanner(bid) { - const banner = deepAccess(bid, 'mediaTypes.banner'); - - if (banner === undefined) { - return true; - } - - if ( - !validateSizes(bid.sizes) && - !validateSizes(bid.mediaTypes.banner.sizes) - ) { - logError('insticator: banner sizes not specified or invalid'); - return false; - } - - return true; -} - -function validateVideo(bid) { - const video = deepAccess(bid, 'mediaTypes.video'); - - if (video === undefined) { - return true; - } - - const videoSize = [ - deepAccess(bid, 'mediaTypes.video.w'), - deepAccess(bid, 'mediaTypes.video.h'), - ]; - - if ( - !validateSize(videoSize) - ) { - logError('insticator: video size not specified or invalid'); - return false; - } - - const mimes = deepAccess(bid, 'mediaTypes.video.mimes'); - - if (!Array.isArray(mimes) || mimes.length === 0) { - logError('insticator: mimes not specified'); - return false; - } - - const placement = deepAccess(bid, 'mediaTypes.video.placement'); - - if (typeof placement !== 'undefined' && typeof placement !== 'number') { - logError('insticator: video placement is not a number'); - return false; - } - - return true; -} - export const spec = { code: BIDDER_CODE, gvlid: GVLID, - supportedMediaTypes: [ BANNER, VIDEO ], + supportedMediaTypes: [BANNER], isBidRequestValid: function (bid) { - return ( - validateAdUnitId(bid) && - validateMediaType(bid) && - validateBanner(bid) && - validateVideo(bid) - ); + if (!bid.params.adUnitId) { + logError('insticator: missing adUnitId bid parameter'); + return false; + } + + if (!(BANNER in bid.mediaTypes)) { + logError('insticator: expected banner in mediaTypes'); + return false; + } + + if ( + !validateSizes(bid.sizes) && + !validateSizes(bid.mediaTypes.banner.sizes) + ) { + logError('insticator: banner sizes not specified or invalid'); + return false; + } + + return true; }, buildRequests: function (validBidRequests, bidderRequest) { diff --git a/modules/insticatorV2AnalyticsAdapter.js b/modules/insticatorV2AnalyticsAdapter.js new file mode 100644 index 00000000000..8b18c1aa19f --- /dev/null +++ b/modules/insticatorV2AnalyticsAdapter.js @@ -0,0 +1,319 @@ +import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js' +import adapterManager from '../src/adapterManager.js' +import CONSTANTS from '../src/constants.json' +import * as utils from '../src/utils.js' +import { ajax } from '../src/ajax.js' + +const baseUrl = 'https://analysis.ingage.tech/' + +const ENDPOINTS = { + AD_RENDER_FAILED: baseUrl + 'com.snowplowanalytics.iglu/v1?schema=iglu%3Acom.insticator%2Frender_failed%2Fjsonschema%2F1-0-0', + AD_RENDER_SUCCEEDED: baseUrl + 'com.snowplowanalytics.iglu/v1?schema=iglu%3Acom.insticator%2Frender_succeeded%2Fjsonschema%2F2-0-0', + BID_WON: baseUrl + 'com.snowplowanalytics.iglu/v1?schema=iglu%3Acom.insticator%2Fbid_won%2Fjsonschema%2F2-0-0', + AUCTION_END: baseUrl + 'com.snowplowanalytics.iglu/v1?schema=iglu%3Acom.insticator%2Fauction_end%2Fjsonschema%2F1-0-0' +} + +const analyticsType = 'endpoint' +const ADAPTER_CODE = 'insticatorV2' + +const { + AUCTION_INIT, + BID_REQUESTED, + BID_RESPONSE, + BID_WON, + AUCTION_END, + AD_RENDER_FAILED, + AD_RENDER_SUCCEEDED +} = CONSTANTS.EVENTS + +const SERVER_EVENTS = { + AD_RENDER_FAILED: 'adRenderFailed', + AD_RENDER_SUCCEEDED: 'adRenderSucceeded', + WON: 'bidWon', + AUCTION_END: 'auctionEnd' +} + +const SERVER_BID_STATUS = { + BID_REQUESTED: 'bidRequested', + BID_RECEIVED: 'bidReceived', + BID_WON: 'bidWon', + AUCTION_END: 'auctionEnd' +} + +let auctions = {} + +const onAuctionInit = (args) => { + const { auctionId, adUnits, timestamp } = args + + let auction = auctions[auctionId] = { + ...args, + adUnits: {}, + auctionStart: timestamp + } + + utils._each(adUnits, adUnit => { + auction.adUnits[adUnit.code] = { + ...adUnit, + auctionId, + adunid: adUnit.code, + bids: {}, + } + }) +} + +const onBidRequested = (args) => { + const { auctionId, bids, start, timeout } = args + const _start = start || Date.now() + const auction = auctions[auctionId] + const auctionAdUnits = auction.adUnits + + bids.forEach(bid => { + const { adUnitCode } = bid + const bidId = parseBidId(bid) + + auctionAdUnits[adUnitCode].bids[bidId] = { + ...bid, + timeout, + start: _start, + rs: _start - auction.auctionStart, + bidStatus: SERVER_BID_STATUS.BID_REQUESTED, + } + }) +} + +const onBidResponse = (args) => { + const { auctionId, adUnitCode } = args + const auction = auctions[auctionId] + const bidId = parseBidId(args) + let bid = auction.adUnits[adUnitCode].bids[bidId] + + Object.assign(bid, args, { + bidStatus: SERVER_BID_STATUS.BID_RECEIVED, + end: args.responseTimestamp, + re: args.responseTimestamp - auction.auctionStart + }) +} + +const onAuctionEnd = (args) => { + const { auctionId, auctionStatus, auctionEnd } = args + let auction = auctions[args.auctionId]; + + for (const key in auction.adUnits) { + auction.adUnits[key].bids = Object.values(auction.adUnits[key].bids).map((bid) => { return mapBid(bid) }); + } + + const payload = { + auctionId, + auctionDuration: auctionEnd - auction.auctionStart, + auctionStatus, + adUnits: Object.values(auction.adUnits) + } + sendEvent(SERVER_EVENTS.AUCTION_END, payload) +} + +const onBidWon = (args) => { + const { auctionId, adUnitCode } = args + const bidId = parseBidId(args) + const bid = auctions[auctionId].adUnits[adUnitCode].bids.find((bid) => { + return bid.bidId == bidId; + }); + + Object.assign(bid, args, { + bidStatus: SERVER_BID_STATUS.BID_WON, + isW: true, + isH: true + }) + + const payload = { + auctionId, + adunid: adUnitCode, + bid: mapBid(bid, BID_WON) + } + sendEvent(SERVER_EVENTS.WON, payload) +} + +const onAdRenderFailed = (args) => { + const { bid } = args + let data = { + timestamp: Date.now() + } + + if (bid) { + data.bid = mapBid(bid, AD_RENDER_FAILED) + } + + sendEvent(SERVER_EVENTS.AD_RENDER_FAILED, data) +} + +const onAdRenderSucceeded = (args) => { + const { bid } = args + let data = { + timestamp: Date.now() + } + + if (bid) { + data.bid = mapBid(bid, AD_RENDER_SUCCEEDED) + } + + sendEvent(SERVER_EVENTS.AD_RENDER_SUCCEEDED, data) +} + +var insticatorAdapter = Object.assign( + adapter({ analyticsType }), { + track({ eventType, args }) { + handleEvent(eventType, args) + } + } +) + +function handleEvent(eventType, args) { + switch (eventType) { + case AUCTION_INIT: + onAuctionInit(args) + break + case BID_REQUESTED: + onBidRequested(args) + break + case BID_RESPONSE: + onBidResponse(args) + break + case BID_WON: + onBidWon(args) + break + case AUCTION_END: + onAuctionEnd(args) + break + case AD_RENDER_FAILED: + onAdRenderFailed(args) + break + case AD_RENDER_SUCCEEDED: + onAdRenderSucceeded(args) + break + } +} + +function sendEvent(eventType, data) { + let payload = { + eventType, + domain: window.location.hostname + } + if (data.bid) { + payload.bid = data.bid + } + if (data.timestamp) { + payload.timestamp = data.timestamp + } + if (data.auctionId) { + payload.auctionId = data.auctionId + } + if (data.adunid) { + payload.adunid = data.adunid + } + if (data.auctionDuration) { + payload.auctionDuration = data.auctionDuration + } + if (data.auctionStatus) { + payload.auctionStatus = data.auctionStatus + } + if (data.adUnits) { + payload.adUnits = data.adUnits + } + let endpoint + if (eventType === SERVER_EVENTS.AD_RENDER_FAILED) { + endpoint = ENDPOINTS.AD_RENDER_FAILED + } else if (eventType === SERVER_EVENTS.WON) { + endpoint = ENDPOINTS.BID_WON + } else if (eventType === SERVER_EVENTS.AD_RENDER_SUCCEEDED) { + endpoint = ENDPOINTS.AD_RENDER_SUCCEEDED + } else if (eventType === SERVER_EVENTS.AUCTION_END) { + endpoint = ENDPOINTS.AUCTION_END + } + if (endpoint) { + ajaxCall(endpoint, () => { }, JSON.stringify(payload), {}) + } +} + +function parseBidId(bid) { + return bid.bidId || bid.requestId +} + +function mapBid({ + bidStatus, + start, + end, + mediaType, + creativeId, + originalCpm, + originalCurrency, + source, + netRevenue, + currency, + width, + height, + timeToRespond, + responseTimestamp, + ...rest +}, eventType) { + const bidObj = { + bst: bidStatus, + s: start, + e: responseTimestamp || end, + mt: mediaType, + crId: creativeId, + oCpm: originalCpm, + oCur: originalCurrency, + src: source, + nrv: netRevenue, + cur: currency, + w: width, + h: height, + ttr: timeToRespond, + ...rest, + } + + delete bidObj['bidRequestsCount'] + delete bidObj['bidderRequestId'] + delete bidObj['bidderRequestsCount'] + delete bidObj['bidderWinsCount'] + delete bidObj['schain'] + delete bidObj['refererInfo'] + delete bidObj['statusMessage'] + delete bidObj['status'] + delete bidObj['adUrl'] + delete bidObj['ad'] + delete bidObj['usesGenericKeys'] + delete bidObj['requestTimestamp'] + delete bidObj['pbAg'] + delete bidObj['pbCg'] + delete bidObj['pbDg'] + delete bidObj['pbLg'] + delete bidObj['pbHg'] + delete bidObj['pbMg'] + delete bidObj['adserverTargeting'] + delete bidObj['ortb2Imp'] + return bidObj +} + +function ajaxCall(endpoint, callback, data, options = {}) { + options.contentType = 'application/json' + + return ajax(endpoint, callback, data, options) +} + +insticatorAdapter.originEnableAnalytics = insticatorAdapter.enableAnalytics +insticatorAdapter.enableAnalytics = function (config) { + insticatorAdapter.originEnableAnalytics(config) +}; + +insticatorAdapter.originDisableAnalytics = insticatorAdapter.disableAnalytics +insticatorAdapter.disableAnalytics = function () { + auctions = {} + insticatorAdapter.originDisableAnalytics() +} + +adapterManager.registerAnalyticsAdapter({ + adapter: insticatorAdapter, + code: ADAPTER_CODE +}) + +export default insticatorAdapter diff --git a/package.json b/package.json index 685e9bd892d..fa464f4e648 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "header bidding", "prebid" ], - "globalVarName": "pbjs", + "globalVarName": "instBid", "author": "the prebid.js contributors", "license": "Apache-2.0", "engines": { From bc6da67f16f8bcef14122ff78ff68caf8d152340 Mon Sep 17 00:00:00 2001 From: Robson Viana <81261035+robson-viana@users.noreply.github.com> Date: Fri, 21 Apr 2023 15:18:30 -0400 Subject: [PATCH 02/11] User sync fixes. (#58) --- modules/insticatorBidAdapter.js | 81 ++++++++++++++----- .../spec/modules/insticatorBidAdapter_spec.js | 2 - 2 files changed, 60 insertions(+), 23 deletions(-) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index 3853414c1a2..c3ed17f8644 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -8,7 +8,7 @@ import {find} from '../src/polyfill.js'; const BIDDER_CODE = 'insticator'; const ENDPOINT = 'https://ex.ingage.tech/v1/openrtb'; // production endpoint const USER_ID_KEY = 'hb_insticator_uid'; -const USER_ID_COOKIE_EXP = 2592000000; // 30 days +const USER_ID_COOKIE_EXP = 7776000000; // 90 days const BID_TTL = 300; // 5 minutes const GVLID = 910; @@ -22,30 +22,74 @@ config.setDefaults({ }); function getUserId() { - let uid; + let uid = storage.getCookie(USER_ID_KEY); + if (uid && isUserIdValid(uid)) { + const expireIn = new Date(Date.now() + USER_ID_COOKIE_EXP).toUTCString(); + storage.setCookie(USER_ID_KEY, uid, expireIn); + return uid; + } + + uid = localStorage.getItem(USER_ID_KEY); + if (uid && isUserIdValid(uid)) { + return uid; + } + + return generateUserId() +} + +function isUserIdValid(uid) { + return uid && uid.length === 36; +} + +function generateUserId() { + const uid = generateUUID(); - if (storage.localStorageIsEnabled()) { - uid = localStorage.getItem(USER_ID_KEY); - } else { - uid = storage.getCookie(USER_ID_KEY); + if (isCookieEnabled()) { + const expireIn = new Date(Date.now() + USER_ID_COOKIE_EXP).toUTCString(); + storage.setCookie(USER_ID_KEY, uid, expireIn); + return uid; } - if (uid && uid.length !== 36) { - uid = undefined; + if (isLocalStoreEnabled()) { + localStorage.setItem(USER_ID_KEY, uid); } return uid; } -function setUserId(userId) { - if (storage.localStorageIsEnabled()) { - localStorage.setItem(USER_ID_KEY, userId); +function isLocalStoreEnabled() { + let enabled = false; + + try { + localStorage.setItem('prebid.localStoreTest', 'true'); + enabled = Boolean(localStorage.getItem('prebid.localStoreTest')); + } catch (err) { + return false + } finally { + if (enabled) { + localStorage.removeItem('insticator.prebid.localStoreTest'); + } } - if (storage.cookiesAreEnabled()) { - const expires = new Date(Date.now() + USER_ID_COOKIE_EXP).toUTCString(); - storage.setCookie(USER_ID_KEY, userId, expires); + return enabled; +} + +function isCookieEnabled() { + let enabled = false; + + try { + const expireIn = new Date(Date.now() + USER_ID_COOKIE_EXP).toUTCString(); + storage.setCookie('insticator.prebid.cookieTest', 'true', expireIn); + enabled = Boolean(storage.getCookie('insticator.prebid.cookieTest')); + } catch (err) { + return false; + } finally { + if (enabled) { + storage.setCookie('insticator.prebid.cookieTest', 'true', new Date(Date.now()).toUTCString()); + } } + + return enabled; } function buildImpression(bidRequest) { @@ -95,10 +139,7 @@ function buildDevice() { w: window.innerWidth, h: window.innerHeight, js: true, - ext: { - localStorage: storage.localStorageIsEnabled(), - cookies: storage.cookiesAreEnabled(), - }, + ext: {}, }; if (typeof deviceConfig === 'object') { @@ -122,12 +163,10 @@ function buildRegs(bidderRequest) { } function buildUser(bid) { - const userId = getUserId() || generateUUID(); + const userId = getUserId(); const yob = deepAccess(bid, 'params.user.yob') const gender = deepAccess(bid, 'params.user.gender') - setUserId(userId); - return { id: userId, yob, diff --git a/test/spec/modules/insticatorBidAdapter_spec.js b/test/spec/modules/insticatorBidAdapter_spec.js index fc7ed1833ac..bebf25dbcd1 100644 --- a/test/spec/modules/insticatorBidAdapter_spec.js +++ b/test/spec/modules/insticatorBidAdapter_spec.js @@ -270,8 +270,6 @@ describe('InsticatorBidAdapter', function () { expect(data.device.h).to.equal(window.innerHeight); expect(data.device.js).to.equal(true); expect(data.device.ext).to.be.an('object'); - expect(data.device.ext.localStorage).to.equal(true); - expect(data.device.ext.cookies).to.equal(false); expect(data.regs).to.be.an('object'); expect(data.regs.ext.gdpr).to.equal(1); expect(data.regs.ext.gdprConsentString).to.equal(bidderRequest.gdprConsent.consentString); From 2ea50ac35e9b0a6600bb9023bc43cf6e879e772e Mon Sep 17 00:00:00 2001 From: Robson Viana <81261035+robson-viana@users.noreply.github.com> Date: Fri, 21 Apr 2023 15:53:23 -0400 Subject: [PATCH 03/11] User sync fixes for 7 25 0 (#59) * User sync fixes. * Update insticatorBidAdapter.js --- modules/insticatorBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index c3ed17f8644..8423c126a02 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -168,7 +168,7 @@ function buildUser(bid) { const gender = deepAccess(bid, 'params.user.gender') return { - id: userId, + buyeruid: userId, yob, gender, }; From 16a297eb7996e3556e25c1c27403293b7c48e8d4 Mon Sep 17 00:00:00 2001 From: Robson Viana <81261035+robson-viana@users.noreply.github.com> Date: Fri, 21 Apr 2023 16:00:53 -0400 Subject: [PATCH 04/11] User sync fixes for 7 25 0 (#60) * User sync fixes. * Update insticatorBidAdapter.js * Update insticatorBidAdapter_spec.js --- test/spec/modules/insticatorBidAdapter_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/spec/modules/insticatorBidAdapter_spec.js b/test/spec/modules/insticatorBidAdapter_spec.js index bebf25dbcd1..09952f833f8 100644 --- a/test/spec/modules/insticatorBidAdapter_spec.js +++ b/test/spec/modules/insticatorBidAdapter_spec.js @@ -335,7 +335,7 @@ describe('InsticatorBidAdapter', function () { const requests = spec.buildRequests([bidRequest], bidderRequest); const data = JSON.parse(requests[0].data); - expect(data.user.id).to.equal(USER_ID_STUBBED); + expect(data.user.buyeruid).to.equal(USER_ID_STUBBED); }); it('should return empty regs object if no gdprConsent is passed', function () { const requests = spec.buildRequests([bidRequest], { ...bidderRequest, ...{ gdprConsent: false } }); From 6136b2c431d6c3be11e38b1cdd9898ea82b2a9fc Mon Sep 17 00:00:00 2001 From: Robson Viana <81261035+robson-viana@users.noreply.github.com> Date: Fri, 21 Apr 2023 16:15:15 -0400 Subject: [PATCH 05/11] User sync fixes for 7 25 0 (#61) * User sync fixes. * Update insticatorBidAdapter.js * Update insticatorBidAdapter_spec.js * Revert "Update insticatorBidAdapter_spec.js" This reverts commit ae1397aa19409889547d2fa778bc62fbe9f75a34. * Revert "User sync fixes for 7 25 0 (#59)" This reverts commit 2ea50ac35e9b0a6600bb9023bc43cf6e879e772e. * Update insticatorBidAdapter_spec.js * Update insticatorBidAdapter_spec.js --- modules/insticatorBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index 8423c126a02..c3ed17f8644 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -168,7 +168,7 @@ function buildUser(bid) { const gender = deepAccess(bid, 'params.user.gender') return { - buyeruid: userId, + id: userId, yob, gender, }; From 6da70c909d098aa471e7b1ba0e23ae902916bd76 Mon Sep 17 00:00:00 2001 From: Robson Viana <81261035+robson-viana@users.noreply.github.com> Date: Mon, 24 Apr 2023 14:33:47 -0400 Subject: [PATCH 06/11] User sync fixes for 7 25 0 (#62) * User sync fixes. * Update insticatorBidAdapter.js * Update insticatorBidAdapter_spec.js * Revert "Update insticatorBidAdapter_spec.js" This reverts commit ae1397aa19409889547d2fa778bc62fbe9f75a34. * Revert "User sync fixes for 7 25 0 (#59)" This reverts commit 2ea50ac35e9b0a6600bb9023bc43cf6e879e772e. * Update insticatorBidAdapter_spec.js * Update insticatorBidAdapter_spec.js * User sync fixes. prioritize local store over cookie to store the user ID, so that the same value can be shared among tabs. * Update insticatorBidAdapter.js --- modules/insticatorBidAdapter.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index c3ed17f8644..8688a85be10 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -22,15 +22,15 @@ config.setDefaults({ }); function getUserId() { - let uid = storage.getCookie(USER_ID_KEY); + let uid = localStorage.getItem(USER_ID_KEY); if (uid && isUserIdValid(uid)) { - const expireIn = new Date(Date.now() + USER_ID_COOKIE_EXP).toUTCString(); - storage.setCookie(USER_ID_KEY, uid, expireIn); return uid; } - uid = localStorage.getItem(USER_ID_KEY); + uid = storage.getCookie(USER_ID_KEY); if (uid && isUserIdValid(uid)) { + const expireIn = new Date(Date.now() + USER_ID_COOKIE_EXP).toUTCString(); + storage.setCookie(USER_ID_KEY, uid, expireIn); return uid; } @@ -44,14 +44,14 @@ function isUserIdValid(uid) { function generateUserId() { const uid = generateUUID(); - if (isCookieEnabled()) { - const expireIn = new Date(Date.now() + USER_ID_COOKIE_EXP).toUTCString(); - storage.setCookie(USER_ID_KEY, uid, expireIn); + if (isLocalStoreEnabled()) { + localStorage.setItem(USER_ID_KEY, uid); return uid; } - if (isLocalStoreEnabled()) { - localStorage.setItem(USER_ID_KEY, uid); + if (isCookieEnabled()) { + const expireIn = new Date(Date.now() + USER_ID_COOKIE_EXP).toUTCString(); + storage.setCookie(USER_ID_KEY, uid, expireIn); } return uid; From 3067c55c66a8a343bded17602dac80764ab62a0e Mon Sep 17 00:00:00 2001 From: Robson Viana <81261035+robson-viana@users.noreply.github.com> Date: Tue, 2 May 2023 14:49:50 -0400 Subject: [PATCH 07/11] User sync fixes for 7 25 0 (#63) * User sync fixes. * Update insticatorBidAdapter.js * Update insticatorBidAdapter_spec.js * Revert "Update insticatorBidAdapter_spec.js" This reverts commit ae1397aa19409889547d2fa778bc62fbe9f75a34. * Revert "User sync fixes for 7 25 0 (#59)" This reverts commit 2ea50ac35e9b0a6600bb9023bc43cf6e879e772e. * Update insticatorBidAdapter_spec.js * Update insticatorBidAdapter_spec.js * User sync fixes. prioritize local store over cookie to store the user ID, so that the same value can be shared among tabs. * Update insticatorBidAdapter.js * Update insticatorBidAdapter.js * Adding domain in the cookie. * Fixing unit test. * Adding logic for localhost. --- modules/insticatorBidAdapter.js | 40 +++++-------------- .../spec/modules/insticatorBidAdapter_spec.js | 2 +- 2 files changed, 10 insertions(+), 32 deletions(-) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index 8688a85be10..f953af7365d 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -7,7 +7,7 @@ import {find} from '../src/polyfill.js'; const BIDDER_CODE = 'insticator'; const ENDPOINT = 'https://ex.ingage.tech/v1/openrtb'; // production endpoint -const USER_ID_KEY = 'hb_insticator_uid'; +const USER_ID_KEY = 'instUid'; const USER_ID_COOKIE_EXP = 7776000000; // 90 days const BID_TTL = 300; // 5 minutes const GVLID = 910; @@ -23,14 +23,10 @@ config.setDefaults({ function getUserId() { let uid = localStorage.getItem(USER_ID_KEY); - if (uid && isUserIdValid(uid)) { - return uid; - } - - uid = storage.getCookie(USER_ID_KEY); if (uid && isUserIdValid(uid)) { const expireIn = new Date(Date.now() + USER_ID_COOKIE_EXP).toUTCString(); - storage.setCookie(USER_ID_KEY, uid, expireIn); + const domain = window.location.hostname.match(/[^.]*\.[^.]{2,3}(?:\.[^.]{2,3})?$/mg); + storage.setCookie(USER_ID_KEY, uid, expireIn, 'none', `.${domain}`); return uid; } @@ -44,36 +40,15 @@ function isUserIdValid(uid) { function generateUserId() { const uid = generateUUID(); - if (isLocalStoreEnabled()) { - localStorage.setItem(USER_ID_KEY, uid); - return uid; - } - if (isCookieEnabled()) { const expireIn = new Date(Date.now() + USER_ID_COOKIE_EXP).toUTCString(); - storage.setCookie(USER_ID_KEY, uid, expireIn); + const domain = window.location.hostname.match(/[^.]*\.[^.]{2,3}(?:\.[^.]{2,3})?$/mg); + storage.setCookie(USER_ID_KEY, uid, expireIn, 'none', `.${domain}`); } return uid; } -function isLocalStoreEnabled() { - let enabled = false; - - try { - localStorage.setItem('prebid.localStoreTest', 'true'); - enabled = Boolean(localStorage.getItem('prebid.localStoreTest')); - } catch (err) { - return false - } finally { - if (enabled) { - localStorage.removeItem('insticator.prebid.localStoreTest'); - } - } - - return enabled; -} - function isCookieEnabled() { let enabled = false; @@ -321,7 +296,10 @@ export const spec = { buildRequests: function (validBidRequests, bidderRequest) { const requests = []; let endpointUrl = config.getConfig('insticator.endpointUrl') || ENDPOINT; - endpointUrl = endpointUrl.replace(/^http:/, 'https:'); + + if (endpointUrl.indexOf('localhost') === -1) { + endpointUrl = endpointUrl.replace(/^http:/, 'https:'); + } if (validBidRequests.length > 0) { requests.push({ diff --git a/test/spec/modules/insticatorBidAdapter_spec.js b/test/spec/modules/insticatorBidAdapter_spec.js index 09952f833f8..bebf25dbcd1 100644 --- a/test/spec/modules/insticatorBidAdapter_spec.js +++ b/test/spec/modules/insticatorBidAdapter_spec.js @@ -335,7 +335,7 @@ describe('InsticatorBidAdapter', function () { const requests = spec.buildRequests([bidRequest], bidderRequest); const data = JSON.parse(requests[0].data); - expect(data.user.buyeruid).to.equal(USER_ID_STUBBED); + expect(data.user.id).to.equal(USER_ID_STUBBED); }); it('should return empty regs object if no gdprConsent is passed', function () { const requests = spec.buildRequests([bidRequest], { ...bidderRequest, ...{ gdprConsent: false } }); From 5b86dbe05a79a5f158a6193e7d71a9b74d37dfab Mon Sep 17 00:00:00 2001 From: Robson Viana <81261035+robson-viana@users.noreply.github.com> Date: Tue, 9 May 2023 12:27:26 -0400 Subject: [PATCH 08/11] Merging changes from master into 7.25.0 (#65) * User sync fixes. * Update insticatorBidAdapter.js * Update insticatorBidAdapter_spec.js * Revert "Update insticatorBidAdapter_spec.js" This reverts commit ae1397aa19409889547d2fa778bc62fbe9f75a34. * Revert "User sync fixes for 7 25 0 (#59)" This reverts commit 2ea50ac35e9b0a6600bb9023bc43cf6e879e772e. * Update insticatorBidAdapter_spec.js * Update insticatorBidAdapter_spec.js * User sync fixes. prioritize local store over cookie to store the user ID, so that the same value can be shared among tabs. * Update insticatorBidAdapter.js * Update insticatorBidAdapter.js * Adding domain in the cookie. * Fixing unit test. * Adding logic for localhost. * Adding new attributes for DealID. --- modules/insticatorBidAdapter.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index f953af7365d..cd5dfee0ea6 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -72,7 +72,9 @@ function buildImpression(bidRequest) { const ext = { insticator: { adUnitId: bidRequest.params.adUnitId, + adUnitName: bidRequest.params.adUnitName }, + impressionType: bidRequest.params.impressionType } const sizes = From ec9d8982d09a4a9d8c4736798bf0771d31bf2f0c Mon Sep 17 00:00:00 2001 From: Bi Yoo Date: Wed, 24 May 2023 13:40:00 -0500 Subject: [PATCH 09/11] put 'it' in the right place --- modules/insticatorBidAdapter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index cd5dfee0ea6..af4b281dd28 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -72,9 +72,9 @@ function buildImpression(bidRequest) { const ext = { insticator: { adUnitId: bidRequest.params.adUnitId, - adUnitName: bidRequest.params.adUnitName + adUnitName: bidRequest.params.adUnitName, + impressionType: bidRequest.params.impressionType }, - impressionType: bidRequest.params.impressionType } const sizes = From 835315b9ef608f83ff823033e8d07f3e9cfabc6b Mon Sep 17 00:00:00 2001 From: Robson Viana <81261035+robson-viana@users.noreply.github.com> Date: Thu, 25 May 2023 11:17:33 -0400 Subject: [PATCH 10/11] User sync fix. (#68) --- modules/insticatorBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index af4b281dd28..8985549256f 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -22,7 +22,7 @@ config.setDefaults({ }); function getUserId() { - let uid = localStorage.getItem(USER_ID_KEY); + let uid = storage.getCookie(USER_ID_KEY); if (uid && isUserIdValid(uid)) { const expireIn = new Date(Date.now() + USER_ID_COOKIE_EXP).toUTCString(); const domain = window.location.hostname.match(/[^.]*\.[^.]{2,3}(?:\.[^.]{2,3})?$/mg); From 73a32545a207d6d936e6e17d36b391615d6f21e0 Mon Sep 17 00:00:00 2001 From: Bi Yoo <95636458+insticator-biY@users.noreply.github.com> Date: Thu, 25 May 2023 12:12:26 -0500 Subject: [PATCH 11/11] set impression type using header bidding wrapper's API (#66) * set impression type using header bidding wrapper's API * linter --- modules/insticatorBidAdapter.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index 8985549256f..1367c4e546c 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -73,10 +73,26 @@ function buildImpression(bidRequest) { insticator: { adUnitId: bidRequest.params.adUnitId, adUnitName: bidRequest.params.adUnitName, - impressionType: bidRequest.params.impressionType }, } + /** + * set impression type using header bidding wrapper's API + * this is Insticator header bidding wrapper specific + */ + // eslint-disable-next-line no-undef + if (bidRequest.adUnitCode && Insticator.getAdUnitStates) { + try { + // eslint-disable-next-line no-undef + const adUnits = Insticator.getAdUnitStates(); + const adUnit = adUnits[bidRequest.adUnitCode] + // eslint-disable-next-line no-undef + if (adUnit) ext.insticator.impressionType = adUnit.timesRefreshed > 0 ? adUnit.refreshType : 'il'; + } catch (e) { + console.warn(e) + } + } + const sizes = deepAccess(bidRequest, 'mediaTypes.banner.sizes') || bidRequest.sizes;