Skip to content

Commit b352c7d

Browse files
authored
Pubxai Analytics Adapter: bug fixes and code revamp (#6474)
* Updated PubxAiAnalytics adapter - Bug fixes and Code restructuring * Updated endpoint URLs * Changed array.includes to array.indexOf to fix IE issue * Code cleanup and changes as suggested. * Updated browser testing order and edge browser token
1 parent 71fdd01 commit b352c7d

File tree

2 files changed

+141
-129
lines changed

2 files changed

+141
-129
lines changed

modules/pubxaiAnalyticsAdapter.js

Lines changed: 80 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,19 @@ import * as utils from '../src/utils.js';
66

77
const emptyUrl = '';
88
const analyticsType = 'endpoint';
9-
const pubxaiAnalyticsVersion = 'v1.0.0';
9+
const pubxaiAnalyticsVersion = 'v1.1.0';
1010
const defaultHost = 'api.pbxai.com';
1111
const auctionPath = '/analytics/auction';
1212
const winningBidPath = '/analytics/bidwon';
1313

1414
let initOptions;
1515
let auctionTimestamp;
16+
let auctionCache = [];
1617
let events = {
17-
bids: []
18+
bids: [],
19+
floorDetail: {},
20+
pageDetail: {},
21+
deviceDetail: {}
1822
};
1923

2024
var pubxaiAnalyticsAdapter = Object.assign(adapter(
@@ -27,14 +31,14 @@ var pubxaiAnalyticsAdapter = Object.assign(adapter(
2731
if (eventType === CONSTANTS.EVENTS.BID_TIMEOUT) {
2832
args.forEach(item => { mapBidResponse(item, 'timeout'); });
2933
} else if (eventType === CONSTANTS.EVENTS.AUCTION_INIT) {
34+
events.auctionInit = args;
3035
events.floorDetail = {};
31-
if (typeof args.bidderRequests[0].bids[0] !== 'undefined' && typeof args.bidderRequests[0].bids[0].floorData !== 'undefined') {
32-
Object.assign(events.floorDetail, args.bidderRequests[0].bids[0].floorData);
36+
events.bids = [];
37+
const floorData = utils.deepAccess(args, 'bidderRequests.0.bids.0.floorData');
38+
if (typeof floorData !== 'undefined') {
39+
Object.assign(events.floorDetail, floorData);
3340
}
3441
auctionTimestamp = args.timestamp;
35-
} else if (eventType === CONSTANTS.EVENTS.BID_REQUESTED) {
36-
events.bids = [];
37-
mapBidRequests(args).forEach(item => { events.bids.push(item) });
3842
} else if (eventType === CONSTANTS.EVENTS.BID_RESPONSE) {
3943
mapBidResponse(args, 'response');
4044
} else if (eventType === CONSTANTS.EVENTS.BID_WON) {
@@ -43,81 +47,48 @@ var pubxaiAnalyticsAdapter = Object.assign(adapter(
4347
}, 'bidwon');
4448
}
4549
}
46-
4750
if (eventType === CONSTANTS.EVENTS.AUCTION_END) {
4851
send(events, 'auctionEnd');
4952
}
5053
}
5154
});
5255

53-
function mapBidRequests(params) {
54-
let arr = [];
55-
if (typeof params.bids !== 'undefined' && params.bids.length) {
56-
params.bids.forEach(function (bid) {
57-
arr.push({
58-
bidderCode: bid.bidder,
59-
bidId: bid.bidId,
60-
adUnitCode: bid.adUnitCode,
61-
requestId: bid.bidderRequestId,
62-
auctionId: bid.auctionId,
63-
placementId: bid.params.placementId,
64-
floorData: bid.floorData,
65-
transactionId: bid.transactionId,
66-
sizes: utils.parseSizesInput(bid.mediaTypes.banner.sizes).toString(),
67-
renderStatus: 1,
68-
requestTimestamp: params.auctionStart
69-
});
70-
});
71-
}
72-
return arr;
73-
}
74-
7556
function mapBidResponse(bidResponse, status) {
76-
if (status !== 'bidwon') {
77-
let bid = events.bids.filter(o => o.bidId === bidResponse.bidId || o.bidId === bidResponse.requestId)[0];
78-
Object.assign(bid, {
79-
bidderCode: bidResponse.bidder,
80-
bidId: status === 'timeout' ? bidResponse.bidId : bidResponse.requestId,
57+
if (typeof bidResponse !== 'undefined') {
58+
let bid = {
8159
adUnitCode: bidResponse.adUnitCode,
8260
auctionId: bidResponse.auctionId,
83-
creativeId: bidResponse.creativeId,
84-
transactionId: bidResponse.transactionId,
85-
currency: bidResponse.currency,
86-
cpm: bidResponse.cpm,
87-
netRevenue: bidResponse.netRevenue,
88-
mediaType: bidResponse.mediaType,
89-
statusMessage: bidResponse.statusMessage,
90-
floorData: bidResponse.floorData,
91-
status: bidResponse.status,
92-
renderStatus: status === 'timeout' ? 3 : 2,
93-
timeToRespond: bidResponse.timeToRespond,
94-
requestTimestamp: bidResponse.requestTimestamp,
95-
responseTimestamp: bidResponse.responseTimestamp,
96-
platform: navigator.platform,
97-
deviceType: getDeviceType()
98-
});
99-
} else {
100-
return {
10161
bidderCode: bidResponse.bidder,
102-
bidId: bidResponse.requestId,
103-
adUnitCode: bidResponse.adUnitCode,
104-
auctionId: bidResponse.auctionId,
62+
cpm: bidResponse.cpm,
10563
creativeId: bidResponse.creativeId,
106-
transactionId: bidResponse.transactionId,
10764
currency: bidResponse.currency,
108-
cpm: bidResponse.cpm,
109-
netRevenue: bidResponse.netRevenue,
11065
floorData: bidResponse.floorData,
111-
renderedSize: bidResponse.size,
11266
mediaType: bidResponse.mediaType,
113-
statusMessage: bidResponse.statusMessage,
114-
status: bidResponse.status,
115-
renderStatus: 4,
116-
timeToRespond: bidResponse.timeToRespond,
67+
netRevenue: bidResponse.netRevenue,
11768
requestTimestamp: bidResponse.requestTimestamp,
11869
responseTimestamp: bidResponse.responseTimestamp,
119-
platform: navigator.platform,
120-
deviceType: getDeviceType()
70+
status: bidResponse.status,
71+
statusMessage: bidResponse.statusMessage,
72+
timeToRespond: bidResponse.timeToRespond,
73+
transactionId: bidResponse.transactionId
74+
};
75+
if (status !== 'bidwon') {
76+
Object.assign(bid, {
77+
bidId: status === 'timeout' ? bidResponse.bidId : bidResponse.requestId,
78+
renderStatus: status === 'timeout' ? 3 : 2,
79+
sizes: utils.parseSizesInput(bidResponse.size).toString(),
80+
});
81+
events.bids.push(bid);
82+
} else {
83+
Object.assign(bid, {
84+
bidId: bidResponse.requestId,
85+
floorProvider: events.floorDetail ? events.floorDetail.floorProvider : null,
86+
isWinningBid: true,
87+
placementId: bidResponse.params ? utils.deepAccess(bidResponse, 'params.0.placementId') : null,
88+
renderedSize: bidResponse.size,
89+
renderStatus: 4
90+
});
91+
return bid;
12192
}
12293
}
12394
}
@@ -132,6 +103,26 @@ export function getDeviceType() {
132103
return 'desktop';
133104
}
134105

106+
export function getBrowser() {
107+
if (/Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)) return 'Chrome';
108+
else if (navigator.userAgent.match('CriOS')) return 'Chrome';
109+
else if (/Firefox/.test(navigator.userAgent)) return 'Firefox';
110+
else if (/Edg/.test(navigator.userAgent)) return 'Microsoft Edge';
111+
else if (/Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor)) return 'Safari';
112+
else if (/Trident/.test(navigator.userAgent) || /MSIE/.test(navigator.userAgent)) return 'Internet Explorer';
113+
else return 'Others';
114+
}
115+
116+
export function getOS() {
117+
if (navigator.userAgent.indexOf('Android') != -1) return 'Android';
118+
if (navigator.userAgent.indexOf('like Mac') != -1) return 'iOS';
119+
if (navigator.userAgent.indexOf('Win') != -1) return 'Windows';
120+
if (navigator.userAgent.indexOf('Mac') != -1) return 'Macintosh';
121+
if (navigator.userAgent.indexOf('Linux') != -1) return 'Linux';
122+
if (navigator.appVersion.indexOf('X11') != -1) return 'Unix';
123+
return 'Others';
124+
}
125+
135126
// add sampling rate
136127
pubxaiAnalyticsAdapter.shouldFireEventRequest = function (samplingRate = 1) {
137128
return (Math.floor((Math.random() * samplingRate + 1)) === parseInt(samplingRate));
@@ -140,12 +131,24 @@ pubxaiAnalyticsAdapter.shouldFireEventRequest = function (samplingRate = 1) {
140131
function send(data, status) {
141132
if (pubxaiAnalyticsAdapter.shouldFireEventRequest(initOptions.samplingRate)) {
142133
let location = utils.getWindowLocation();
143-
if (typeof data !== 'undefined') {
144-
data.pageDetail = {};
145-
Object.assign(data.pageDetail, { host: location.host, path: location.pathname, search: location.search });
146-
}
147134
data.initOptions = initOptions;
148-
135+
if (typeof data !== 'undefined' && typeof data.auctionInit !== 'undefined') {
136+
Object.assign(data.pageDetail, {
137+
host: location.host,
138+
path: location.pathname,
139+
search: location.search,
140+
adUnitCount: data.auctionInit.adUnitCodes ? data.auctionInit.adUnitCodes.length : null
141+
});
142+
data.initOptions.auctionId = data.auctionInit.auctionId;
143+
delete data.auctionInit;
144+
}
145+
data.deviceDetail = {};
146+
Object.assign(data.deviceDetail, {
147+
platform: navigator.platform,
148+
deviceType: getDeviceType(),
149+
deviceOS: getOS(),
150+
browser: getBrowser()
151+
});
149152
let pubxaiAnalyticsRequestUrl = utils.buildUrl({
150153
protocol: 'https',
151154
hostname: (initOptions && initOptions.hostName) || defaultHost,
@@ -156,8 +159,12 @@ function send(data, status) {
156159
prebidVersion: $$PREBID_GLOBAL$$.version
157160
}
158161
});
159-
160-
ajax(pubxaiAnalyticsRequestUrl, undefined, JSON.stringify(data), { method: 'POST', contentType: 'text/plain' });
162+
if (status == 'bidwon') {
163+
ajax(pubxaiAnalyticsRequestUrl, undefined, JSON.stringify(data), { method: 'POST', contentType: 'text/json' });
164+
} else if (status == 'auctionEnd' && auctionCache.indexOf(data.initOptions.auctionId) === -1) {
165+
ajax(pubxaiAnalyticsRequestUrl, undefined, JSON.stringify(data), { method: 'POST', contentType: 'text/json' });
166+
auctionCache.push(data.initOptions.auctionId);
167+
}
161168
}
162169
}
163170

0 commit comments

Comments
 (0)