prebid.js 9.53.2 → 9.53.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/33acrossAnalyticsAdapter.js +1 -1
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/BTBidAdapter.js +1 -1
- package/dist/adagioAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adagioRtdProvider.js +1 -1
- package/dist/adagioUtils.js +1 -1
- package/dist/addefendBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adstirBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgAnalyticsAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/agmaAnalyticsAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/aniviewBidAdapter.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/beopBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bitmediaBidAdapter.js +1 -1
- package/dist/bridBidAdapter.js +1 -1
- package/dist/bridgeuppBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/chunk-core.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/contxtfulBidAdapter.js +1 -1
- package/dist/conversantAnalyticsAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/dailymotionBidAdapter.js +1 -1
- package/dist/debugging-standalone.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/dxkultureBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/equativBidAdapter.js +1 -1
- package/dist/eskimiBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/exadsBidAdapter.js +1 -1
- package/dist/excoBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/greenbidsAnalyticsAdapter.js +1 -1
- package/dist/greenbidsBidAdapter.js +1 -1
- package/dist/greenbidsRtdProvider.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hypelabBidAdapter.js +1 -1
- package/dist/id5AnalyticsAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/inmobiBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/intentIqAnalyticsAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/jixieBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/kimberliteBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/liveIntentId.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/luceadBidAdapter.js +1 -1
- package/dist/mabidderBidAdapter.js +1 -1
- package/dist/madsenseBidAdapter.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/medianetBidAdapter.js +1 -1
- package/dist/medianetUtils.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/missenaBidAdapter.js +1 -1
- package/dist/mobilefuseBidAdapter.js +1 -1
- package/dist/nextMillenniumBidAdapter.js +1 -1
- package/dist/nexx360Utils.js +1 -1
- package/dist/nobidAnalyticsAdapter.js +1 -1
- package/dist/nobidBidAdapter.js +1 -1
- package/dist/nodalsAiRtdProvider.js +1 -1
- package/dist/not-for-prod/prebid.js +172 -172
- package/dist/objectGuard.js +1 -1
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxBidAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/orbidderBidAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubmaticIdSystem.js +1 -1
- package/dist/pubmaticRtdProvider.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pubxaiAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/retailspotBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseUtils.js +1 -1
- package/dist/rtdModule.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/showheroes-bsBidAdapter.js +1 -1
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/snigelBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sparteoBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/tappxBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/terceptAnalyticsAdapter.js +1 -1
- package/dist/themoneytizerBidAdapter.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/uid2IdSystem.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/unrulyBidAdapter.js +1 -1
- package/dist/userId.js +1 -1
- package/dist/vidazooUtils.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahooAdsBidAdapter.js +1 -1
- package/dist/yandexBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/libraries/objectGuard/objectGuard.js +149 -48
- package/libraries/objectGuard/ortbGuard.js +33 -43
- package/modules/adagioAnalyticsAdapter.js +6 -1
- package/modules/adagioBidAdapter.js +12 -5
- package/modules/adagioRtdProvider.js +41 -35
- package/modules/pubmaticAnalyticsAdapter.js +311 -587
- package/modules/pubmaticBidAdapter.js +71 -8
- package/modules/pubmaticIdSystem.js +4 -4
- package/modules/pubmaticRtdProvider.js +12 -60
- package/modules/rtdModule/index.js +1 -5
- package/modules/ttdBidAdapter.js +0 -5
- package/modules/userId/eids.js +1 -1
- package/modules/userId/index.js +32 -1
- package/package.json +1 -1
- package/src/auction.js +3 -0
- package/test/spec/activities/objectGuard_spec.js +156 -32
- package/test/spec/activities/ortbGuard_spec.js +10 -15
- package/test/spec/modules/adagioAnalyticsAdapter_spec.js +94 -24
- package/test/spec/modules/adagioRtdProvider_spec.js +17 -17
- package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +634 -916
- package/test/spec/modules/pubmaticBidAdapter_spec.js +260 -1
- package/test/spec/modules/pubmaticRtdProvider_spec.js +78 -400
- package/test/spec/modules/ttdBidAdapter_spec.js +0 -33
- package/test/spec/modules/userId_spec.js +115 -1
|
@@ -1,28 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isArray, logError, logWarn, pick } from '../src/utils.js';
|
|
2
2
|
import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
|
|
3
3
|
import adapterManager from '../src/adapterManager.js';
|
|
4
|
-
import { BID_STATUS,
|
|
5
|
-
import {ajax} from '../src/ajax.js';
|
|
6
|
-
import {config} from '../src/config.js';
|
|
7
|
-
import {getGlobal} from '../src/prebidGlobal.js';
|
|
8
|
-
import {getGptSlotInfoForAdUnitCode} from '../libraries/gptUtils/gptUtils.js';
|
|
9
|
-
|
|
10
|
-
const FLOOR_VALUES = {
|
|
11
|
-
NO_DATA: 'noData',
|
|
12
|
-
AD_UNIT: 'adUnit',
|
|
13
|
-
SET_CONFIG: 'setConfig',
|
|
14
|
-
FETCH: 'fetch',
|
|
15
|
-
SUCCESS: 'success',
|
|
16
|
-
ERROR: 'error',
|
|
17
|
-
TIMEOUT: 'timeout'
|
|
18
|
-
};
|
|
4
|
+
import { BID_STATUS, STATUS, REJECTION_REASON } from '../src/constants.js';
|
|
5
|
+
import { ajax } from '../src/ajax.js';
|
|
6
|
+
import { config } from '../src/config.js';
|
|
7
|
+
import { getGlobal } from '../src/prebidGlobal.js';
|
|
8
|
+
import { getGptSlotInfoForAdUnitCode } from '../libraries/gptUtils/gptUtils.js';
|
|
19
9
|
|
|
20
10
|
/// /////////// CONSTANTS ///////////////
|
|
21
11
|
const ADAPTER_CODE = 'pubmatic';
|
|
22
|
-
|
|
12
|
+
|
|
23
13
|
const DISPLAY_MANAGER = 'Prebid.js';
|
|
14
|
+
const VENDOR_OPENWRAP = 'openwrap';
|
|
24
15
|
const SEND_TIMEOUT = 2000;
|
|
25
16
|
const END_POINT_HOST = 'https://t.pubmatic.com/';
|
|
17
|
+
const END_POINT_VERSION = 1;
|
|
18
|
+
const PAGE_SOURCE = 'web';
|
|
26
19
|
const END_POINT_BID_LOGGER = END_POINT_HOST + 'wl?';
|
|
27
20
|
const END_POINT_WIN_BID_LOGGER = END_POINT_HOST + 'wt?';
|
|
28
21
|
const LOG_PRE_FIX = 'PubMatic-Analytics: ';
|
|
@@ -34,102 +27,87 @@ const NO_BID = 'no-bid';
|
|
|
34
27
|
const ERROR = 'error';
|
|
35
28
|
const REQUEST_ERROR = 'request-error';
|
|
36
29
|
const TIMEOUT_ERROR = 'timeout-error';
|
|
37
|
-
const EMPTY_STRING = '';
|
|
38
|
-
const OPEN_AUCTION_DEAL_ID = '-1';
|
|
39
|
-
const MEDIA_TYPE_BANNER = 'banner';
|
|
40
30
|
const CURRENCY_USD = 'USD';
|
|
41
31
|
const BID_PRECISION = 2;
|
|
32
|
+
const EMPTY_STRING = '';
|
|
42
33
|
// todo: input profileId and profileVersionId ; defaults to zero or one
|
|
43
|
-
const DEFAULT_PUBLISHER_ID =
|
|
44
|
-
const DEFAULT_PROFILE_ID = 0;
|
|
45
|
-
const DEFAULT_PROFILE_VERSION_ID = 0;
|
|
46
|
-
const enc = window.encodeURIComponent;
|
|
47
|
-
const MEDIATYPE = {
|
|
48
|
-
BANNER: 0,
|
|
49
|
-
VIDEO: 1,
|
|
50
|
-
NATIVE: 2
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// TODO : Remove - Once BM calculation moves to Server Side
|
|
54
|
-
const BROWSER_MAP = [
|
|
55
|
-
{ value: /(firefox)\/([\w\.]+)/i, key: 12 }, // Firefox
|
|
56
|
-
{ value: /\b(?:crios)\/([\w\.]+)/i, key: 1 }, // Chrome for iOS
|
|
57
|
-
{ value: /edg(?:e|ios|a)?\/([\w\.]+)/i, key: 2 }, // Edge
|
|
58
|
-
{ value: /(opera|opr)(?:.+version\/|[\/ ]+)([\w\.]+)/i, key: 3 }, // Opera
|
|
59
|
-
{ value: /(?:ms|\()(ie) ([\w\.]+)|(?:trident\/[\w\.]+)/i, key: 4 }, // Internet Explorer
|
|
60
|
-
{ value: /fxios\/([-\w\.]+)/i, key: 5 }, // Firefox for iOS
|
|
61
|
-
{ value: /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i, key: 6 }, // Facebook In-App Browser
|
|
62
|
-
{ value: / wv\).+(chrome)\/([\w\.]+)/i, key: 7 }, // Chrome WebView
|
|
63
|
-
{ value: /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i, key: 8 }, // Android Browser
|
|
64
|
-
{ value: /(chrome|chromium|crios)\/v?([\w\.]+)/i, key: 9 }, // Chrome
|
|
65
|
-
{ value: /version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i, key: 10 }, // Safari Mobile
|
|
66
|
-
{ value: /version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i, key: 11 }, // Safari
|
|
67
|
-
];
|
|
34
|
+
const DEFAULT_PUBLISHER_ID = null;
|
|
35
|
+
const DEFAULT_PROFILE_ID = '0';
|
|
36
|
+
const DEFAULT_PROFILE_VERSION_ID = '0';
|
|
68
37
|
|
|
69
38
|
/// /////////// VARIABLES //////////////
|
|
70
|
-
let publisherId = DEFAULT_PUBLISHER_ID; //
|
|
71
|
-
let profileId = DEFAULT_PROFILE_ID; //
|
|
72
|
-
let profileVersionId = DEFAULT_PROFILE_VERSION_ID; //
|
|
39
|
+
let publisherId = DEFAULT_PUBLISHER_ID; // string: mandatory
|
|
40
|
+
let profileId = DEFAULT_PROFILE_ID; // string: optional
|
|
41
|
+
let profileVersionId = DEFAULT_PROFILE_VERSION_ID; // string: optional
|
|
73
42
|
let s2sBidders = [];
|
|
43
|
+
let _country = '';
|
|
74
44
|
|
|
75
45
|
/// /////////// HELPER FUNCTIONS //////////////
|
|
76
46
|
|
|
77
|
-
function
|
|
78
|
-
return
|
|
79
|
-
width: size.w || size[0],
|
|
80
|
-
height: size.h || size[1]
|
|
81
|
-
};
|
|
47
|
+
function formatSource(src = 'client') {
|
|
48
|
+
return (src === 's2s' ? 'server' : src).toLowerCase();
|
|
82
49
|
}
|
|
83
50
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
51
|
+
/**
|
|
52
|
+
* Validates payload and sends API request with proper error handling
|
|
53
|
+
* @param {Object} options - Configuration options
|
|
54
|
+
* @param {Object} options.payload - The payload to send
|
|
55
|
+
* @param {string} options.endpoint - API endpoint to use
|
|
56
|
+
* @param {string} options.loggerType - Type of logger for error messages
|
|
57
|
+
* @returns {boolean} - True if request was sent, false if validation failed
|
|
58
|
+
*/
|
|
59
|
+
function validateAndSendRequest(options) {
|
|
60
|
+
const { payload, endpoint, loggerType } = options;
|
|
87
61
|
|
|
88
|
-
|
|
89
|
-
if (
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
src = 'server';
|
|
62
|
+
// Check for critical payload data
|
|
63
|
+
if (!Object.keys(payload?.rd || {}).length || !Object.keys(payload?.sd || {}).length) {
|
|
64
|
+
logWarn(LOG_PRE_FIX + `Empty or invalid payload for ${loggerType}, suppressing API call`);
|
|
65
|
+
return false;
|
|
93
66
|
}
|
|
94
|
-
return src.toLowerCase();
|
|
95
|
-
}
|
|
96
67
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
|
-
return Object.keys(types).filter(validMediaType);
|
|
68
|
+
const urlParams = new URLSearchParams(new URL(payload.rd.purl).search);
|
|
69
|
+
const queryParams = `v=${END_POINT_VERSION}&psrc=${PAGE_SOURCE}${urlParams.get('pmad') === '1' ? '&debug=1' : ''}`;
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
sendAjaxRequest({
|
|
73
|
+
endpoint,
|
|
74
|
+
method: 'POST',
|
|
75
|
+
queryParams,
|
|
76
|
+
body: JSON.stringify(payload)
|
|
77
|
+
});
|
|
78
|
+
return true;
|
|
79
|
+
} catch (e) {
|
|
80
|
+
logError(LOG_PRE_FIX + `Error stringifying payload for ${loggerType}:`, e);
|
|
81
|
+
return false;
|
|
114
82
|
}
|
|
115
|
-
return [MEDIA_TYPE_BANNER];
|
|
116
83
|
}
|
|
117
84
|
|
|
85
|
+
function sendAjaxRequest({ endpoint, method, queryParams = '', body = null }) {
|
|
86
|
+
// Return early if body is null or undefined
|
|
87
|
+
if (body === null || body === undefined) {
|
|
88
|
+
logWarn(LOG_PRE_FIX + 'Empty body in sendAjaxRequest, suppressing API call');
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const url = queryParams ? `${endpoint}${queryParams}` : endpoint;
|
|
93
|
+
return ajax(url, null, body, { method });
|
|
94
|
+
};
|
|
95
|
+
|
|
118
96
|
function copyRequiredBidDetails(bid) {
|
|
119
97
|
return pick(bid, [
|
|
120
98
|
'bidder',
|
|
121
99
|
'bidderCode',
|
|
122
100
|
'adapterCode',
|
|
123
101
|
'bidId',
|
|
102
|
+
'adUnitId', () => bid.adUnitCode,
|
|
124
103
|
'status', () => NO_BID, // default a bid to NO_BID until response is received or bid is timed out
|
|
125
104
|
'finalSource as source',
|
|
126
105
|
'params',
|
|
127
|
-
'floorData',
|
|
128
106
|
'adUnit', () => pick(bid, [
|
|
129
107
|
'adUnitCode',
|
|
130
108
|
'transactionId',
|
|
131
|
-
'sizes as dimensions',
|
|
132
|
-
'mediaTypes'
|
|
109
|
+
'sizes as dimensions',
|
|
110
|
+
'mediaTypes'
|
|
133
111
|
])
|
|
134
112
|
]);
|
|
135
113
|
}
|
|
@@ -180,7 +158,7 @@ function parseBidResponse(bid) {
|
|
|
180
158
|
'originalCurrency',
|
|
181
159
|
'adserverTargeting',
|
|
182
160
|
'dealChannel',
|
|
183
|
-
'meta',
|
|
161
|
+
'meta', () => (bid.meta && Object.keys(bid.meta).length > 0 ? bid.meta : undefined),
|
|
184
162
|
'status',
|
|
185
163
|
'error',
|
|
186
164
|
'bidId',
|
|
@@ -197,103 +175,10 @@ function parseBidResponse(bid) {
|
|
|
197
175
|
]);
|
|
198
176
|
}
|
|
199
177
|
|
|
200
|
-
function getDomainFromUrl(url) {
|
|
201
|
-
let a = window.document.createElement('a');
|
|
202
|
-
a.href = url;
|
|
203
|
-
return a.hostname;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
function getDevicePlatform() {
|
|
207
|
-
var deviceType = 3;
|
|
208
|
-
try {
|
|
209
|
-
var ua = navigator.userAgent;
|
|
210
|
-
if (ua && isStr(ua) && ua.trim() != '') {
|
|
211
|
-
ua = ua.toLowerCase().trim();
|
|
212
|
-
var isMobileRegExp = new RegExp('(mobi|tablet|ios).*');
|
|
213
|
-
if (ua.match(isMobileRegExp)) {
|
|
214
|
-
deviceType = 2;
|
|
215
|
-
} else {
|
|
216
|
-
deviceType = 1;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
} catch (ex) {}
|
|
220
|
-
return deviceType;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// TODO : Remove - Once BM calculation moves to Server Side
|
|
224
|
-
function getBrowserType() {
|
|
225
|
-
const userAgent = navigator?.userAgent;
|
|
226
|
-
let browserIndex = userAgent == null ? -1 : 0;
|
|
227
|
-
|
|
228
|
-
if (userAgent) {
|
|
229
|
-
browserIndex = BROWSER_MAP.find(({ value }) => value.test(userAgent))?.key || 0;
|
|
230
|
-
}
|
|
231
|
-
return browserIndex;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
function getValueForKgpv(bid, adUnitId) {
|
|
235
|
-
if (bid.params && bid.params.regexPattern) {
|
|
236
|
-
return bid.params.regexPattern;
|
|
237
|
-
} else if (bid.bidResponse && bid.bidResponse.regexPattern) {
|
|
238
|
-
return bid.bidResponse.regexPattern;
|
|
239
|
-
} else if (bid.params && bid.params.kgpv) {
|
|
240
|
-
return bid.params.kgpv;
|
|
241
|
-
} else {
|
|
242
|
-
return adUnitId;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
178
|
function getAdapterNameForAlias(aliasName) {
|
|
247
179
|
return adapterManager.aliasRegistry[aliasName] || aliasName;
|
|
248
180
|
}
|
|
249
181
|
|
|
250
|
-
function getAdDomain(bidResponse) {
|
|
251
|
-
if (bidResponse.meta && bidResponse.meta.advertiserDomains) {
|
|
252
|
-
let adomain = bidResponse.meta.advertiserDomains[0]
|
|
253
|
-
if (adomain) {
|
|
254
|
-
try {
|
|
255
|
-
let hostname = (new URL(adomain));
|
|
256
|
-
return hostname.hostname.replace('www.', '');
|
|
257
|
-
} catch (e) {
|
|
258
|
-
logWarn(LOG_PRE_FIX + 'Adomain URL (Not a proper URL):', adomain);
|
|
259
|
-
return adomain.replace('www.', '');
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
function isObject(object) {
|
|
266
|
-
return typeof object === 'object' && object !== null;
|
|
267
|
-
};
|
|
268
|
-
|
|
269
|
-
function isEmptyObject(object) {
|
|
270
|
-
return isObject(object) && Object.keys(object).length === 0;
|
|
271
|
-
};
|
|
272
|
-
|
|
273
|
-
/**
|
|
274
|
-
* Prepare meta object to pass in logger call
|
|
275
|
-
* @param {*} meta
|
|
276
|
-
*/
|
|
277
|
-
export function getMetadata(meta) {
|
|
278
|
-
if (!meta || isEmptyObject(meta)) return;
|
|
279
|
-
const metaObj = {};
|
|
280
|
-
if (meta.networkId) metaObj.nwid = meta.networkId;
|
|
281
|
-
if (meta.advertiserId) metaObj.adid = meta.advertiserId;
|
|
282
|
-
if (meta.networkName) metaObj.nwnm = meta.networkName;
|
|
283
|
-
if (meta.primaryCatId) metaObj.pcid = meta.primaryCatId;
|
|
284
|
-
if (meta.advertiserName) metaObj.adnm = meta.advertiserName;
|
|
285
|
-
if (meta.agencyId) metaObj.agid = meta.agencyId;
|
|
286
|
-
if (meta.agencyName) metaObj.agnm = meta.agencyName;
|
|
287
|
-
if (meta.brandId) metaObj.brid = meta.brandId;
|
|
288
|
-
if (meta.brandName) metaObj.brnm = meta.brandName;
|
|
289
|
-
if (meta.dchain) metaObj.dc = meta.dchain;
|
|
290
|
-
if (meta.demandSource) metaObj.ds = meta.demandSource;
|
|
291
|
-
if (meta.secondaryCatIds) metaObj.scids = meta.secondaryCatIds;
|
|
292
|
-
|
|
293
|
-
if (isEmptyObject(metaObj)) return;
|
|
294
|
-
return metaObj;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
182
|
function isS2SBidder(bidder) {
|
|
298
183
|
return (s2sBidders.indexOf(bidder) > -1) ? 1 : 0
|
|
299
184
|
}
|
|
@@ -309,100 +194,6 @@ function isOWPubmaticBid(adapterName) {
|
|
|
309
194
|
})
|
|
310
195
|
}
|
|
311
196
|
|
|
312
|
-
function getFloorsCommonField (floorData) {
|
|
313
|
-
if (!floorData) return;
|
|
314
|
-
const { location, fetchStatus, floorProvider, modelVersion } = floorData;
|
|
315
|
-
return {
|
|
316
|
-
ffs: {
|
|
317
|
-
[FLOOR_VALUES.SUCCESS]: 1,
|
|
318
|
-
[FLOOR_VALUES.ERROR]: 2,
|
|
319
|
-
[FLOOR_VALUES.TIMEOUT]: 4,
|
|
320
|
-
undefined: 0
|
|
321
|
-
}[fetchStatus],
|
|
322
|
-
fsrc: {
|
|
323
|
-
[FLOOR_VALUES.FETCH]: 2,
|
|
324
|
-
[FLOOR_VALUES.NO_DATA]: 0,
|
|
325
|
-
[FLOOR_VALUES.AD_UNIT]: 1,
|
|
326
|
-
[FLOOR_VALUES.SET_CONFIG]: 1
|
|
327
|
-
}[location],
|
|
328
|
-
fp: floorProvider,
|
|
329
|
-
mv: modelVersion
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
function getFloorType(floorResponseData) {
|
|
334
|
-
return floorResponseData ? (floorResponseData.enforcements.enforceJS == false ? 0 : 1) : undefined;
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
function gatherPartnerBidsForAdUnitForLogger(adUnit, adUnitId, highestBid, e) {
|
|
338
|
-
highestBid = (highestBid && highestBid.length > 0) ? highestBid[0] : null;
|
|
339
|
-
return Object.keys(adUnit.bids).reduce(function(partnerBids, bidId) {
|
|
340
|
-
adUnit.bids[bidId].forEach(function(bid) {
|
|
341
|
-
let adapterName = getAdapterNameForAlias(bid.adapterCode || bid.bidder);
|
|
342
|
-
if (isOWPubmaticBid(adapterName) && isS2SBidder(bid.bidder)) {
|
|
343
|
-
return;
|
|
344
|
-
}
|
|
345
|
-
const pg = window.parseFloat(Number(bid.bidResponse?.adserverTargeting?.hb_pb || bid.bidResponse?.adserverTargeting?.pwtpb).toFixed(BID_PRECISION));
|
|
346
|
-
|
|
347
|
-
const prebidBidsReceived = e?.bidsReceived;
|
|
348
|
-
if (isArray(prebidBidsReceived) && prebidBidsReceived.length > 0) {
|
|
349
|
-
prebidBidsReceived.forEach(function(iBid) {
|
|
350
|
-
if (iBid.adId === bid.adId) {
|
|
351
|
-
bid.bidderCode = iBid.bidderCode;
|
|
352
|
-
}
|
|
353
|
-
});
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
partnerBids.push({
|
|
357
|
-
'pn': adapterName,
|
|
358
|
-
'bc': bid.bidderCode || bid.bidder,
|
|
359
|
-
'bidid': bid.bidId || bidId,
|
|
360
|
-
'origbidid': bid?.bidResponse?.partnerImpId || bid?.bidResponse?.prebidBidId || bid.bidId || bidId,
|
|
361
|
-
'db': bid.bidResponse ? 0 : 1,
|
|
362
|
-
'kgpv': getValueForKgpv(bid, adUnitId),
|
|
363
|
-
'kgpsv': bid.params && bid.params.kgpv ? bid.params.kgpv : adUnitId,
|
|
364
|
-
'psz': bid.bidResponse ? (bid.bidResponse.dimensions.width + 'x' + bid.bidResponse.dimensions.height) : '0x0',
|
|
365
|
-
'eg': bid.bidResponse ? bid.bidResponse.bidGrossCpmUSD : 0,
|
|
366
|
-
'en': bid.bidResponse ? bid.bidResponse.bidPriceUSD : 0,
|
|
367
|
-
'di': bid.bidResponse ? (bid.bidResponse.dealId || OPEN_AUCTION_DEAL_ID) : OPEN_AUCTION_DEAL_ID,
|
|
368
|
-
'dc': bid.bidResponse ? (bid.bidResponse.dealChannel || EMPTY_STRING) : EMPTY_STRING,
|
|
369
|
-
'l1': bid.bidResponse ? bid.partnerTimeToRespond : 0,
|
|
370
|
-
'ol1': bid.bidResponse ? bid.clientLatencyTimeMs : 0,
|
|
371
|
-
'l2': 0,
|
|
372
|
-
'adv': bid.bidResponse ? getAdDomain(bid.bidResponse) || undefined : undefined,
|
|
373
|
-
'ss': isS2SBidder(bid.bidder),
|
|
374
|
-
't': (bid.status == ERROR && bid.error.code == TIMEOUT_ERROR) ? 1 : 0,
|
|
375
|
-
'wb': (highestBid && highestBid.adId === bid.adId ? 1 : 0),
|
|
376
|
-
'mi': bid.bidResponse ? (bid.bidResponse.mi || undefined) : undefined,
|
|
377
|
-
'af': bid.bidResponse ? (bid.bidResponse.mediaType || undefined) : undefined,
|
|
378
|
-
'ocpm': bid.bidResponse ? (bid.bidResponse.originalCpm || 0) : 0,
|
|
379
|
-
'ocry': bid.bidResponse ? (bid.bidResponse.originalCurrency || CURRENCY_USD) : CURRENCY_USD,
|
|
380
|
-
'frv': bid.bidResponse ? bid.bidResponse.floorData?.floorRuleValue : undefined,
|
|
381
|
-
'fv': bid.bidResponse ? bid.bidResponse.floorData?.floorValue : undefined,
|
|
382
|
-
'md': bid.bidResponse ? getMetadata(bid.bidResponse.meta) : undefined,
|
|
383
|
-
'pb': pg || undefined
|
|
384
|
-
});
|
|
385
|
-
});
|
|
386
|
-
return partnerBids;
|
|
387
|
-
}, [])
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
function getSizesForAdUnit(adUnit) {
|
|
391
|
-
var bid = Object.values(adUnit.bids).filter((bid) => !!bid.bidResponse && bid.bidResponse.mediaType === 'native')[0];
|
|
392
|
-
if (!!bid || (bid === undefined && adUnit.dimensions.length === 0)) {
|
|
393
|
-
return ['1x1'];
|
|
394
|
-
} else {
|
|
395
|
-
return adUnit.dimensions.map(function (e) {
|
|
396
|
-
return e[0] + 'x' + e[1];
|
|
397
|
-
})
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
function getAdUnitAdFormats(adUnit) {
|
|
402
|
-
var af = adUnit ? Object.keys(adUnit.mediaTypes || {}).map(format => MEDIATYPE[format.toUpperCase()]) : [];
|
|
403
|
-
return af;
|
|
404
|
-
}
|
|
405
|
-
|
|
406
197
|
function getAdUnit(adUnits, adUnitId) {
|
|
407
198
|
return adUnits.filter(adUnit => (adUnit.divID && adUnit.divID == adUnitId) || (adUnit.code == adUnitId))[0];
|
|
408
199
|
}
|
|
@@ -415,15 +206,27 @@ function getTgId() {
|
|
|
415
206
|
return 0;
|
|
416
207
|
}
|
|
417
208
|
|
|
418
|
-
function
|
|
419
|
-
|
|
420
|
-
|
|
209
|
+
function getFeatureLevelDetails(auctionCache) {
|
|
210
|
+
const result = {};
|
|
211
|
+
|
|
212
|
+
// Add floor data if available
|
|
213
|
+
if (auctionCache?.floorData?.floorRequestData) {
|
|
214
|
+
const flrData = {
|
|
215
|
+
...auctionCache.floorData.floorRequestData,
|
|
216
|
+
...(auctionCache.floorData.floorResponseData?.enforcements && { enforcements: auctionCache.floorData.floorResponseData.enforcements })
|
|
217
|
+
};
|
|
218
|
+
result.flr = flrData;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Add bdv object with list of identity partners
|
|
222
|
+
const identityPartners = getListOfIdentityPartners();
|
|
223
|
+
if (identityPartners) {
|
|
224
|
+
result.bdv = {
|
|
225
|
+
lip: identityPartners
|
|
226
|
+
};
|
|
421
227
|
}
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
const isFetchSuccessful = location === FLOOR_VALUES.FETCH && fetchStatus === FLOOR_VALUES.SUCCESS;
|
|
425
|
-
const isAdUnitOrSetConfig = location === FLOOR_VALUES.AD_UNIT || location === FLOOR_VALUES.SET_CONFIG;
|
|
426
|
-
return isDataValid && (isAdUnitOrSetConfig || isFetchSuccessful);
|
|
228
|
+
|
|
229
|
+
return result;
|
|
427
230
|
}
|
|
428
231
|
|
|
429
232
|
function getListOfIdentityPartners() {
|
|
@@ -450,92 +253,64 @@ function getListOfIdentityPartners() {
|
|
|
450
253
|
return identityPartners.length > 0 ? identityPartners : undefined;
|
|
451
254
|
}
|
|
452
255
|
|
|
453
|
-
function
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
:
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
return;
|
|
256
|
+
function getRootLevelDetails(auctionCache, auctionId) {
|
|
257
|
+
const referrer = config.getConfig('pageUrl') || auctionCache.referer || '';
|
|
258
|
+
return {
|
|
259
|
+
pubid: `${publisherId}`,
|
|
260
|
+
iid: `${auctionCache?.wiid || auctionId}`,
|
|
261
|
+
to: parseInt(`${auctionCache.timeout}`),
|
|
262
|
+
purl: referrer,
|
|
263
|
+
tst: Math.round(Date.now() / 1000),
|
|
264
|
+
pid: `${profileId}`,
|
|
265
|
+
pdvid: `${profileVersionId}`,
|
|
266
|
+
ortb2: auctionCache.ortb2,
|
|
267
|
+
tgid: getTgId(),
|
|
268
|
+
s2sls: s2sBidders,
|
|
269
|
+
dm: DISPLAY_MANAGER,
|
|
270
|
+
dmv: '$prebid.version$' || '-1'
|
|
469
271
|
}
|
|
272
|
+
}
|
|
470
273
|
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
if (floorData?.floorRequestData) {
|
|
493
|
-
outputObj['ffs'] = ffs;
|
|
494
|
-
outputObj['fsrc'] = fsrc;
|
|
495
|
-
outputObj['fp'] = fp;
|
|
496
|
-
}
|
|
497
|
-
if (floorFetchStatus) {
|
|
498
|
-
outputObj['fmv'] = mv || undefined;
|
|
499
|
-
}
|
|
274
|
+
function executeBidsLoggerCall(event, highestCpmBids) {
|
|
275
|
+
const { auctionId } = event;
|
|
276
|
+
const auctionCache = cache.auctions[auctionId];
|
|
277
|
+
if (!auctionCache || auctionCache.sent) return;
|
|
278
|
+
// Fetching slotinfo at event level results to undefined so Running loop over the codes to get the GPT slot name.
|
|
279
|
+
Object.entries(auctionCache?.adUnitCodes || {}).forEach(([adUnitCode, adUnit]) => {
|
|
280
|
+
let origAdUnit = getAdUnit(cache.auctions[auctionId]?.origAdUnits, adUnitCode) || {};
|
|
281
|
+
auctionCache.adUnitCodes[adUnitCode].adUnitId = origAdUnit.owAdUnitId || getGptSlotInfoForAdUnitCode(adUnitCode)?.gptSlot || adUnitCode;
|
|
282
|
+
|
|
283
|
+
for (let bidId in adUnit?.bids) {
|
|
284
|
+
adUnit?.bids[bidId].forEach(bid => {
|
|
285
|
+
bid['owAdUnitId'] = getGptSlotInfoForAdUnitCode(bid?.adUnit?.adUnitCode)?.gptSlot || bid.adUnit?.adUnitCode;
|
|
286
|
+
const winBid = highestCpmBids.filter(cpmbid => cpmbid.adId === bid?.adId)[0]?.adId;
|
|
287
|
+
auctionCache.adUnitCodes[bid?.adUnitId].bidWonAdId = auctionCache.adUnitCodes[bid?.adUnitId].bidWonAdId ? auctionCache.adUnitCodes[bid?.adUnitId].bidWonAdId : winBid;
|
|
288
|
+
const prebidBidId = bid.bidResponse && bid.bidResponse.prebidBidId;
|
|
289
|
+
bid.bidId = prebidBidId || bid.bidId || bidId;
|
|
290
|
+
bid.bidderCode = bid.bidderCode || bid.bidder;
|
|
291
|
+
let adapterName = getAdapterNameForAlias(bid.adapterCode || bid.bidder);
|
|
292
|
+
bid.adapterName = adapterName;
|
|
293
|
+
bid.bidder = adapterName;
|
|
294
|
+
})
|
|
500
295
|
}
|
|
501
|
-
|
|
502
|
-
outputObj['ft'] = getFloorType(floorData?.floorResponseData);
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
outputObj.s = Object.keys(auctionCache.adUnitCodes).reduce(function(slotsArray, adUnitId) {
|
|
507
|
-
let adUnit = auctionCache.adUnitCodes[adUnitId];
|
|
508
|
-
let origAdUnit = getAdUnit(auctionCache.origAdUnits, adUnitId) || {};
|
|
509
|
-
// getGptSlotInfoForAdUnitCode returns gptslot corresponding to adunit provided as input.
|
|
510
|
-
let slotObject = {
|
|
511
|
-
'sn': adUnitId,
|
|
512
|
-
'au': origAdUnit.owAdUnitId || getGptSlotInfoForAdUnitCode(adUnitId)?.gptSlot || adUnitId,
|
|
513
|
-
'mt': getAdUnitAdFormats(origAdUnit),
|
|
514
|
-
'sz': getSizesForAdUnit(adUnit, adUnitId),
|
|
515
|
-
'ps': gatherPartnerBidsForAdUnitForLogger(adUnit, adUnitId, highestCpmBids.filter(bid => bid.adUnitCode === adUnitId), e),
|
|
516
|
-
'fskp': floorData && floorFetchStatus ? (floorData.floorRequestData ? (floorData.floorRequestData.skipped == false ? 0 : 1) : undefined) : undefined,
|
|
517
|
-
'sid': generateUUID()
|
|
518
|
-
};
|
|
519
|
-
slotsArray.push(slotObject);
|
|
520
|
-
return slotsArray;
|
|
521
|
-
}, []);
|
|
296
|
+
});
|
|
522
297
|
|
|
298
|
+
const payload = {
|
|
299
|
+
sd: auctionCache.adUnitCodes,
|
|
300
|
+
fd: getFeatureLevelDetails(auctionCache),
|
|
301
|
+
rd: { ctr: _country || '', ...getRootLevelDetails(auctionCache, auctionId) }
|
|
302
|
+
};
|
|
523
303
|
auctionCache.sent = true;
|
|
524
304
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
'
|
|
529
|
-
|
|
530
|
-
contentType: 'application/x-www-form-urlencoded',
|
|
531
|
-
withCredentials: true,
|
|
532
|
-
method: 'POST'
|
|
533
|
-
}
|
|
534
|
-
);
|
|
305
|
+
validateAndSendRequest({
|
|
306
|
+
payload,
|
|
307
|
+
endpoint: END_POINT_BID_LOGGER,
|
|
308
|
+
loggerType: 'bid logger'
|
|
309
|
+
});
|
|
535
310
|
}
|
|
536
311
|
|
|
537
312
|
function executeBidWonLoggerCall(auctionId, adUnitId) {
|
|
538
|
-
const winningBidId = cache.auctions[auctionId]?.adUnitCodes[adUnitId]?.
|
|
313
|
+
const winningBidId = cache.auctions[auctionId]?.adUnitCodes[adUnitId]?.wonBidId;
|
|
539
314
|
const winningBids = cache.auctions[auctionId]?.adUnitCodes[adUnitId]?.bids[winningBidId];
|
|
540
315
|
if (!winningBids) {
|
|
541
316
|
logWarn(LOG_PRE_FIX + 'Could not find winningBids for : ', auctionId);
|
|
@@ -544,238 +319,209 @@ function executeBidWonLoggerCall(auctionId, adUnitId) {
|
|
|
544
319
|
|
|
545
320
|
let winningBid = winningBids[0];
|
|
546
321
|
if (winningBids.length > 1) {
|
|
547
|
-
winningBid = winningBids.
|
|
322
|
+
winningBid = winningBids.find(bid => bid.adId === cache.auctions[auctionId]?.adUnitCodes[adUnitId]?.bidWonAdId) || winningBid;
|
|
548
323
|
}
|
|
549
324
|
|
|
550
325
|
const adapterName = getAdapterNameForAlias(winningBid.adapterCode || winningBid.bidder);
|
|
326
|
+
winningBid.bidId = winningBidId;
|
|
551
327
|
if (isOWPubmaticBid(adapterName) && isS2SBidder(winningBid.bidder)) {
|
|
552
328
|
return;
|
|
553
329
|
}
|
|
554
330
|
let origAdUnit = getAdUnit(cache.auctions[auctionId]?.origAdUnits, adUnitId) || {};
|
|
555
331
|
let owAdUnitId = origAdUnit.owAdUnitId || getGptSlotInfoForAdUnitCode(adUnitId)?.gptSlot || adUnitId;
|
|
556
332
|
let auctionCache = cache.auctions[auctionId];
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
pixelURL += 'pubid=' + publisherId;
|
|
566
|
-
pixelURL += '&purl=' + enc(config.getConfig('pageUrl') || cache.auctions[auctionId]?.referer || '');
|
|
567
|
-
pixelURL += '&tst=' + Math.round((new window.Date()).getTime() / 1000);
|
|
568
|
-
pixelURL += '&iid=' + enc(wiid);
|
|
569
|
-
pixelURL += '&bidid=' + enc(winningBidId);
|
|
570
|
-
pixelURL += '&pid=' + enc(profileId);
|
|
571
|
-
pixelURL += '&pdvid=' + enc(profileVersionId);
|
|
572
|
-
pixelURL += '&slot=' + enc(adUnitId);
|
|
573
|
-
pixelURL += '&au=' + enc(owAdUnitId);
|
|
574
|
-
pixelURL += '&pn=' + enc(adapterName);
|
|
575
|
-
pixelURL += '&bc=' + enc(winningBid.bidderCode || winningBid.bidder);
|
|
576
|
-
pixelURL += '&en=' + enc(winningBid.bidResponse?.bidPriceUSD);
|
|
577
|
-
pixelURL += '&eg=' + enc(winningBid.bidResponse?.bidGrossCpmUSD);
|
|
578
|
-
pixelURL += '&kgpv=' + enc(getValueForKgpv(winningBid, adUnitId));
|
|
579
|
-
pixelURL += '&dm=' + enc(DISPLAY_MANAGER);
|
|
580
|
-
pixelURL += '&dmv=' + enc('$prebid.version$' || '-1');
|
|
581
|
-
pixelURL += '&origbidid=' + enc(winningBid?.bidResponse?.partnerImpId || winningBid?.bidResponse?.prebidBidId || winningBid.bidId);
|
|
582
|
-
pixelURL += '&di=' + enc(winningBid?.bidResponse?.dealId || OPEN_AUCTION_DEAL_ID);
|
|
583
|
-
const ds = winningBid.bidResponse?.meta ? getMetadata(winningBid.bidResponse.meta)?.ds : undefined;
|
|
584
|
-
if (ds) {
|
|
585
|
-
pixelURL += '&ds=' + enc(ds);
|
|
586
|
-
}
|
|
587
|
-
pg && (pixelURL += '&pb=' + enc(pg));
|
|
588
|
-
|
|
589
|
-
pixelURL += '&plt=' + enc(getDevicePlatform());
|
|
590
|
-
pixelURL += '&psz=' + enc((winningBid?.bidResponse?.dimensions?.width || '0') + 'x' +
|
|
591
|
-
(winningBid?.bidResponse?.dimensions?.height || '0'));
|
|
592
|
-
pixelURL += '&tgid=' + enc(getTgId());
|
|
593
|
-
adv && (pixelURL += '&adv=' + enc(adv));
|
|
594
|
-
pixelURL += '&orig=' + enc(getDomainFromUrl(referrer));
|
|
595
|
-
pixelURL += '&ss=' + enc(isS2SBidder(winningBid.bidder));
|
|
596
|
-
(fskp != undefined) && (pixelURL += '&fskp=' + enc(fskp));
|
|
597
|
-
if (floorData) {
|
|
598
|
-
const floorRootValues = getFloorsCommonField(floorData.floorRequestData);
|
|
599
|
-
if (floorRootValues) {
|
|
600
|
-
const { ffs, fsrc, fp, mv } = floorRootValues || {};
|
|
601
|
-
const params = { ffs, fsrc, fp, fmv: mv };
|
|
602
|
-
Object.entries(params).forEach(([key, value]) => {
|
|
603
|
-
if (value !== undefined) {
|
|
604
|
-
pixelURL += `&${key}=${enc(value)}`;
|
|
605
|
-
}
|
|
606
|
-
});
|
|
607
|
-
}
|
|
608
|
-
const floorType = getFloorType(floorData.floorResponseData);
|
|
609
|
-
if (floorType !== undefined) {
|
|
610
|
-
pixelURL += '&ft=' + enc(floorType);
|
|
333
|
+
const payload = {
|
|
334
|
+
fd: getFeatureLevelDetails(auctionCache),
|
|
335
|
+
rd: { ctr: _country || '', ...getRootLevelDetails(auctionCache, auctionId) },
|
|
336
|
+
sd: {
|
|
337
|
+
adapterName,
|
|
338
|
+
adUnitId,
|
|
339
|
+
...winningBid,
|
|
340
|
+
owAdUnitId,
|
|
611
341
|
}
|
|
612
|
-
|
|
613
|
-
(floorRuleValue !== undefined) && (pixelURL += '&frv=' + enc(floorRuleValue));
|
|
342
|
+
};
|
|
614
343
|
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
withCredentials: true,
|
|
627
|
-
method: 'GET'
|
|
628
|
-
}
|
|
629
|
-
);
|
|
344
|
+
validateAndSendRequest({
|
|
345
|
+
payload,
|
|
346
|
+
endpoint: END_POINT_WIN_BID_LOGGER,
|
|
347
|
+
loggerType: 'bid won logger'
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function readSaveCountry(e) {
|
|
352
|
+
_country = e.bidderRequests?.length > 0
|
|
353
|
+
? e.bidderRequests.find(bidder => bidder?.bidderCode === ADAPTER_CODE)?.ortb2?.user?.ext?.ctr || EMPTY_STRING
|
|
354
|
+
: EMPTY_STRING;
|
|
630
355
|
}
|
|
631
356
|
|
|
632
357
|
/// /////////// ADAPTER EVENT HANDLER FUNCTIONS //////////////
|
|
633
358
|
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
s2sConf
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
359
|
+
const eventHandlers = {
|
|
360
|
+
auctionInit: (args) => {
|
|
361
|
+
s2sBidders = (function () {
|
|
362
|
+
let result = [];
|
|
363
|
+
try {
|
|
364
|
+
let s2sConf = config.getConfig('s2sConfig');
|
|
365
|
+
if (isArray(s2sConf)) {
|
|
366
|
+
s2sConf.forEach(conf => {
|
|
367
|
+
if (conf?.bidders) {
|
|
368
|
+
result.push(...conf.bidders);
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
} else if (s2sConf?.bidders) {
|
|
372
|
+
result.push(...s2sConf.bidders);
|
|
373
|
+
}
|
|
374
|
+
} catch (e) {
|
|
375
|
+
logError('Error processing s2s bidders:', e);
|
|
647
376
|
}
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
cache.auctions[args.auctionId] = cacheEntry;
|
|
663
|
-
}
|
|
377
|
+
return result;
|
|
378
|
+
}());
|
|
379
|
+
let cacheEntry = pick(args, [
|
|
380
|
+
'timestamp',
|
|
381
|
+
'timeout',
|
|
382
|
+
'bidderDonePendingCount', () => args.bidderRequests.length,
|
|
383
|
+
]);
|
|
384
|
+
cacheEntry.adUnitCodes = {};
|
|
385
|
+
cacheEntry.floorData = {};
|
|
386
|
+
cacheEntry.origAdUnits = args.adUnits;
|
|
387
|
+
cacheEntry.referer = args.bidderRequests[0].refererInfo.topmostLocation;
|
|
388
|
+
cacheEntry.ortb2 = args.bidderRequests[0].ortb2
|
|
389
|
+
cache.auctions[args.auctionId] = cacheEntry;
|
|
390
|
+
},
|
|
664
391
|
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
392
|
+
bidRequested: (args) => {
|
|
393
|
+
args.bids.forEach(function (bid) {
|
|
394
|
+
if (!cache.auctions[args.auctionId].adUnitCodes.hasOwnProperty(bid.adUnitCode)) {
|
|
395
|
+
cache.auctions[args.auctionId].adUnitCodes[bid.adUnitCode] = {
|
|
396
|
+
bids: {},
|
|
397
|
+
wonBidId: "",
|
|
398
|
+
dimensions: bid.sizes
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
if (bid.bidder === 'pubmatic' && !!bid?.params?.wiid) {
|
|
402
|
+
cache.auctions[args.auctionId].wiid = bid.params.wiid;
|
|
403
|
+
}
|
|
404
|
+
cache.auctions[args.auctionId].adUnitCodes[bid.adUnitCode].bids[bid.bidId] = [copyRequiredBidDetails(bid)];
|
|
405
|
+
if (bid.floorData) {
|
|
406
|
+
cache.auctions[args.auctionId].floorData['floorRequestData'] = bid.floorData;
|
|
407
|
+
}
|
|
408
|
+
})
|
|
409
|
+
},
|
|
410
|
+
|
|
411
|
+
bidResponse: (args) => {
|
|
412
|
+
if (!args.requestId) {
|
|
413
|
+
logWarn(LOG_PRE_FIX + 'Got null requestId in bidResponseHandler');
|
|
414
|
+
return;
|
|
676
415
|
}
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
416
|
+
let requestId = args.originalRequestId || args.requestId;
|
|
417
|
+
let bid = cache.auctions[args.auctionId].adUnitCodes[args.adUnitCode].bids[requestId][0];
|
|
418
|
+
if (!bid) {
|
|
419
|
+
logError(LOG_PRE_FIX + 'Could not find associated bid request for bid response with requestId: ', args.requestId);
|
|
420
|
+
return;
|
|
680
421
|
}
|
|
681
|
-
})
|
|
682
|
-
}
|
|
683
422
|
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
if (args.floorData) {
|
|
704
|
-
cache.auctions[args.auctionId].floorData['floorResponseData'] = args.floorData;
|
|
705
|
-
}
|
|
423
|
+
if ((bid.bidder && args.bidderCode && bid.bidder !== args.bidderCode) || (bid.bidder === args.bidderCode && bid.status === SUCCESS)) {
|
|
424
|
+
if (bid.params) {
|
|
425
|
+
args.params = bid.params;
|
|
426
|
+
}
|
|
427
|
+
if (bid.adUnit) {
|
|
428
|
+
// Specifically check for mediaTypes and dimensions
|
|
429
|
+
if (!args.mediaTypes && bid.adUnit.mediaTypes) {
|
|
430
|
+
args.mediaTypes = bid.adUnit.mediaTypes;
|
|
431
|
+
}
|
|
432
|
+
if (!args.sizes && bid.adUnit.dimensions) {
|
|
433
|
+
args.sizes = bid.adUnit.dimensions;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
bid = copyRequiredBidDetails(args);
|
|
437
|
+
cache.auctions[args.auctionId].adUnitCodes[args.adUnitCode].bids[requestId].push(bid);
|
|
438
|
+
} else if (args.originalRequestId) {
|
|
439
|
+
bid.bidId = args.requestId;
|
|
440
|
+
}
|
|
706
441
|
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
const latency = args?.timeToRespond || Date.now() - cache.auctions[args.auctionId].timestamp;
|
|
711
|
-
const auctionTime = cache.auctions[args.auctionId].timeout;
|
|
712
|
-
// Check if latency is greater than auctiontime+150, then log auctiontime+150 to avoid large numbers
|
|
713
|
-
bid.partnerTimeToRespond = latency > (auctionTime + 150) ? (auctionTime + 150) : latency;
|
|
714
|
-
bid.clientLatencyTimeMs = Date.now() - cache.auctions[args.auctionId].timestamp;
|
|
715
|
-
bid.bidResponse = parseBidResponse(args);
|
|
716
|
-
}
|
|
442
|
+
if (args.floorData) {
|
|
443
|
+
cache.auctions[args.auctionId].floorData['floorResponseData'] = args.floorData;
|
|
444
|
+
}
|
|
717
445
|
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
446
|
+
bid.adId = args.adId;
|
|
447
|
+
bid.source = formatSource(bid.source || args.source);
|
|
448
|
+
setBidStatus(bid, args);
|
|
449
|
+
const latency = args?.timeToRespond || Date.now() - cache.auctions[args.auctionId].timestamp;
|
|
450
|
+
const auctionTime = cache.auctions[args.auctionId].timeout;
|
|
451
|
+
// Check if latency is greater than auctiontime+150, then log auctiontime+150 to avoid large numbers
|
|
452
|
+
bid.partnerTimeToRespond = latency > (auctionTime + 150) ? (auctionTime + 150) : latency;
|
|
453
|
+
bid.clientLatencyTimeMs = Date.now() - cache.auctions[args.auctionId].timestamp;
|
|
454
|
+
bid.bidResponse = parseBidResponse(args);
|
|
455
|
+
bid.bidderCode = args.bidderCode || bid.bidderCode;
|
|
456
|
+
bid.bidder = getAdapterNameForAlias(args.adapterCode || bid.bidderCode);
|
|
457
|
+
bid.adapterName = getAdapterNameForAlias(args.adapterCode || bid.bidderCode);
|
|
458
|
+
},
|
|
727
459
|
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
if (!cachedBid.status) {
|
|
736
|
-
cachedBid.status = NO_BID;
|
|
460
|
+
bidRejected: (args) => {
|
|
461
|
+
// If bid is rejected due to floors value did not met
|
|
462
|
+
// make cpm as 0, status as bidRejected and forward the bid for logging
|
|
463
|
+
if (args.rejectionReason === REJECTION_REASON.FLOOR_NOT_MET) {
|
|
464
|
+
args.cpm = 0;
|
|
465
|
+
args.status = BID_STATUS.BID_REJECTED;
|
|
466
|
+
eventHandlers['bidResponse'](args);
|
|
737
467
|
}
|
|
738
|
-
|
|
739
|
-
|
|
468
|
+
},
|
|
469
|
+
|
|
470
|
+
bidderDone: (args) => {
|
|
471
|
+
if (cache.auctions[args.auctionId]?.bidderDonePendingCount) {
|
|
472
|
+
cache.auctions[args.auctionId].bidderDonePendingCount--;
|
|
740
473
|
}
|
|
741
|
-
|
|
742
|
-
|
|
474
|
+
args.bids.forEach(bid => {
|
|
475
|
+
let cachedBid = cache.auctions[bid.auctionId].adUnitCodes[bid.adUnitCode].bids[bid.bidId || bid.originalRequestId || bid.requestId];
|
|
476
|
+
if (typeof bid.serverResponseTimeMs !== 'undefined') {
|
|
477
|
+
cachedBid.serverLatencyTimeMs = bid.serverResponseTimeMs;
|
|
478
|
+
}
|
|
479
|
+
if (!cachedBid.status) {
|
|
480
|
+
cachedBid.status = NO_BID;
|
|
481
|
+
}
|
|
482
|
+
if (!cachedBid.clientLatencyTimeMs) {
|
|
483
|
+
cachedBid.clientLatencyTimeMs = Date.now() - cache.auctions[bid.auctionId].timestamp;
|
|
484
|
+
}
|
|
485
|
+
});
|
|
486
|
+
},
|
|
743
487
|
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
}
|
|
488
|
+
bidWon: (args) => {
|
|
489
|
+
let auctionCache = cache.auctions[args.auctionId];
|
|
490
|
+
auctionCache.adUnitCodes[args.adUnitCode].wonBidId = args.originalRequestId || args.requestId;
|
|
491
|
+
auctionCache.adUnitCodes[args.adUnitCode].bidWonAdId = args.adId;
|
|
492
|
+
executeBidWonLoggerCall(args.auctionId, args.adUnitCode);
|
|
493
|
+
},
|
|
750
494
|
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
}
|
|
495
|
+
auctionEnd: (args) => {
|
|
496
|
+
// if for the given auction bidderDonePendingCount == 0 then execute logger call sooners
|
|
497
|
+
let highestCpmBids = getGlobal().getHighestCpmBids() || [];
|
|
498
|
+
readSaveCountry(args);
|
|
499
|
+
setTimeout(() => {
|
|
500
|
+
executeBidsLoggerCall.call(this, args, highestCpmBids);
|
|
501
|
+
}, (cache.auctions[args.auctionId]?.bidderDonePendingCount === 0 ? 500 : SEND_TIMEOUT));
|
|
502
|
+
},
|
|
758
503
|
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
504
|
+
bidTimeout: (args) => {
|
|
505
|
+
// db = 1 and t = 1 means bidder did NOT respond with a bid but we got a timeout notification
|
|
506
|
+
// db = 0 and t = 1 means bidder did respond with a bid but post timeout
|
|
507
|
+
args.forEach(badBid => {
|
|
508
|
+
let auctionCache = cache.auctions[badBid.auctionId];
|
|
509
|
+
let bid = auctionCache.adUnitCodes[badBid.adUnitCode].bids[badBid.bidId || badBid.originalRequestId || badBid.requestId][0];
|
|
510
|
+
if (bid) {
|
|
511
|
+
bid.status = ERROR;
|
|
512
|
+
bid.error = {
|
|
513
|
+
code: TIMEOUT_ERROR
|
|
514
|
+
};
|
|
515
|
+
} else {
|
|
516
|
+
logWarn(LOG_PRE_FIX + 'bid not found');
|
|
517
|
+
}
|
|
518
|
+
});
|
|
519
|
+
}
|
|
774
520
|
}
|
|
775
521
|
|
|
776
522
|
/// /////////// ADAPTER DEFINITION //////////////
|
|
777
523
|
|
|
778
|
-
let baseAdapter = adapter({analyticsType: 'endpoint'});
|
|
524
|
+
let baseAdapter = adapter({ analyticsType: 'endpoint' });
|
|
779
525
|
let pubmaticAdapter = Object.assign({}, baseAdapter, {
|
|
780
526
|
|
|
781
527
|
enableAnalytics(conf = {}) {
|
|
@@ -783,17 +529,17 @@ let pubmaticAdapter = Object.assign({}, baseAdapter, {
|
|
|
783
529
|
|
|
784
530
|
if (typeof conf.options === 'object') {
|
|
785
531
|
if (conf.options.publisherId) {
|
|
786
|
-
publisherId =
|
|
532
|
+
publisherId = String(conf.options.publisherId).trim();
|
|
787
533
|
}
|
|
788
|
-
profileId =
|
|
789
|
-
profileVersionId =
|
|
534
|
+
profileId = String(conf.options?.profileId || '').trim() || DEFAULT_PROFILE_ID;
|
|
535
|
+
profileVersionId = String(conf.options?.profileVersionId || '').trim() || DEFAULT_PROFILE_VERSION_ID;
|
|
790
536
|
} else {
|
|
791
537
|
logError(LOG_PRE_FIX + 'Config not found.');
|
|
792
538
|
error = true;
|
|
793
539
|
}
|
|
794
540
|
|
|
795
541
|
if (!publisherId) {
|
|
796
|
-
logError(LOG_PRE_FIX + 'Missing publisherId(
|
|
542
|
+
logError(LOG_PRE_FIX + 'Missing publisherId(String).');
|
|
797
543
|
error = true;
|
|
798
544
|
}
|
|
799
545
|
|
|
@@ -812,32 +558,10 @@ let pubmaticAdapter = Object.assign({}, baseAdapter, {
|
|
|
812
558
|
baseAdapter.disableAnalytics.apply(this, arguments);
|
|
813
559
|
},
|
|
814
560
|
|
|
815
|
-
track({eventType, args}) {
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
break;
|
|
820
|
-
case EVENTS.BID_REQUESTED:
|
|
821
|
-
bidRequestedHandler(args);
|
|
822
|
-
break;
|
|
823
|
-
case EVENTS.BID_RESPONSE:
|
|
824
|
-
bidResponseHandler(args);
|
|
825
|
-
break;
|
|
826
|
-
case EVENTS.BID_REJECTED:
|
|
827
|
-
bidRejectedHandler(args)
|
|
828
|
-
break;
|
|
829
|
-
case EVENTS.BIDDER_DONE:
|
|
830
|
-
bidderDoneHandler(args);
|
|
831
|
-
break;
|
|
832
|
-
case EVENTS.BID_WON:
|
|
833
|
-
bidWonHandler(args);
|
|
834
|
-
break;
|
|
835
|
-
case EVENTS.AUCTION_END:
|
|
836
|
-
auctionEndHandler(args);
|
|
837
|
-
break;
|
|
838
|
-
case EVENTS.BID_TIMEOUT:
|
|
839
|
-
bidTimeoutHandler(args);
|
|
840
|
-
break;
|
|
561
|
+
track({ eventType, args }) {
|
|
562
|
+
const handler = eventHandlers[eventType];
|
|
563
|
+
if (handler) {
|
|
564
|
+
handler(args);
|
|
841
565
|
}
|
|
842
566
|
}
|
|
843
567
|
});
|