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.
Files changed (196) hide show
  1. package/dist/33acrossAnalyticsAdapter.js +1 -1
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/BTBidAdapter.js +1 -1
  5. package/dist/adagioAnalyticsAdapter.js +1 -1
  6. package/dist/adagioBidAdapter.js +1 -1
  7. package/dist/adagioRtdProvider.js +1 -1
  8. package/dist/adagioUtils.js +1 -1
  9. package/dist/addefendBidAdapter.js +1 -1
  10. package/dist/adgenerationBidAdapter.js +1 -1
  11. package/dist/adlooxRtdProvider.js +1 -1
  12. package/dist/adqueryBidAdapter.js +1 -1
  13. package/dist/adrelevantisBidAdapter.js +1 -1
  14. package/dist/adstirBidAdapter.js +1 -1
  15. package/dist/adtrgtmeBidAdapter.js +1 -1
  16. package/dist/adxcgAnalyticsAdapter.js +1 -1
  17. package/dist/adxcgBidAdapter.js +1 -1
  18. package/dist/adyoulikeBidAdapter.js +1 -1
  19. package/dist/agmaAnalyticsAdapter.js +1 -1
  20. package/dist/ajaBidAdapter.js +1 -1
  21. package/dist/amxBidAdapter.js +1 -1
  22. package/dist/amxIdSystem.js +1 -1
  23. package/dist/aniviewBidAdapter.js +1 -1
  24. package/dist/appierAnalyticsAdapter.js +1 -1
  25. package/dist/appnexusBidAdapter.js +1 -1
  26. package/dist/asoBidAdapter.js +1 -1
  27. package/dist/axonixBidAdapter.js +1 -1
  28. package/dist/beopBidAdapter.js +1 -1
  29. package/dist/bidglassBidAdapter.js +1 -1
  30. package/dist/big-richmediaBidAdapter.js +1 -1
  31. package/dist/bitmediaBidAdapter.js +1 -1
  32. package/dist/bridBidAdapter.js +1 -1
  33. package/dist/bridgeuppBidAdapter.js +1 -1
  34. package/dist/bridgewellBidAdapter.js +1 -1
  35. package/dist/brightMountainMediaBidAdapter.js +1 -1
  36. package/dist/carodaBidAdapter.js +1 -1
  37. package/dist/chtnwBidAdapter.js +1 -1
  38. package/dist/chunk-core.js +1 -1
  39. package/dist/concertBidAdapter.js +1 -1
  40. package/dist/connectadBidAdapter.js +1 -1
  41. package/dist/consumableBidAdapter.js +1 -1
  42. package/dist/contxtfulBidAdapter.js +1 -1
  43. package/dist/conversantAnalyticsAdapter.js +1 -1
  44. package/dist/conversantBidAdapter.js +1 -1
  45. package/dist/craftBidAdapter.js +1 -1
  46. package/dist/criteoBidAdapter.js +1 -1
  47. package/dist/cwireBidAdapter.js +1 -1
  48. package/dist/dailymotionBidAdapter.js +1 -1
  49. package/dist/debugging-standalone.js +1 -1
  50. package/dist/dspxBidAdapter.js +1 -1
  51. package/dist/dxkultureBidAdapter.js +1 -1
  52. package/dist/eplanningBidAdapter.js +1 -1
  53. package/dist/equativBidAdapter.js +1 -1
  54. package/dist/eskimiBidAdapter.js +1 -1
  55. package/dist/euidIdSystem.js +1 -1
  56. package/dist/exadsBidAdapter.js +1 -1
  57. package/dist/excoBidAdapter.js +1 -1
  58. package/dist/feedadBidAdapter.js +1 -1
  59. package/dist/finativeBidAdapter.js +1 -1
  60. package/dist/freewheel-sspBidAdapter.js +1 -1
  61. package/dist/gmosspBidAdapter.js +1 -1
  62. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  63. package/dist/greenbidsBidAdapter.js +1 -1
  64. package/dist/greenbidsRtdProvider.js +1 -1
  65. package/dist/gridBidAdapter.js +1 -1
  66. package/dist/gumgumBidAdapter.js +1 -1
  67. package/dist/h12mediaBidAdapter.js +1 -1
  68. package/dist/hypelabBidAdapter.js +1 -1
  69. package/dist/id5AnalyticsAdapter.js +1 -1
  70. package/dist/id5IdSystem.js +1 -1
  71. package/dist/imdsBidAdapter.js +1 -1
  72. package/dist/improvedigitalBidAdapter.js +1 -1
  73. package/dist/inmobiBidAdapter.js +1 -1
  74. package/dist/insticatorBidAdapter.js +1 -1
  75. package/dist/intentIqAnalyticsAdapter.js +1 -1
  76. package/dist/ixBidAdapter.js +1 -1
  77. package/dist/jixieBidAdapter.js +1 -1
  78. package/dist/justpremiumBidAdapter.js +1 -1
  79. package/dist/kargoBidAdapter.js +1 -1
  80. package/dist/kimberliteBidAdapter.js +1 -1
  81. package/dist/konduitAnalyticsAdapter.js +1 -1
  82. package/dist/kueezBidAdapter.js +1 -1
  83. package/dist/lassoBidAdapter.js +1 -1
  84. package/dist/lifestreetBidAdapter.js +1 -1
  85. package/dist/liveIntentId.js +1 -1
  86. package/dist/logicadBidAdapter.js +1 -1
  87. package/dist/loglyliftBidAdapter.js +1 -1
  88. package/dist/luceadBidAdapter.js +1 -1
  89. package/dist/mabidderBidAdapter.js +1 -1
  90. package/dist/madsenseBidAdapter.js +1 -1
  91. package/dist/magniteAnalyticsAdapter.js +1 -1
  92. package/dist/malltvAnalyticsAdapter.js +1 -1
  93. package/dist/marsmediaBidAdapter.js +1 -1
  94. package/dist/mediafuseBidAdapter.js +1 -1
  95. package/dist/medianetBidAdapter.js +1 -1
  96. package/dist/medianetUtils.js +1 -1
  97. package/dist/mediasquareBidAdapter.js +1 -1
  98. package/dist/mgidBidAdapter.js +1 -1
  99. package/dist/missenaBidAdapter.js +1 -1
  100. package/dist/mobilefuseBidAdapter.js +1 -1
  101. package/dist/nextMillenniumBidAdapter.js +1 -1
  102. package/dist/nexx360Utils.js +1 -1
  103. package/dist/nobidAnalyticsAdapter.js +1 -1
  104. package/dist/nobidBidAdapter.js +1 -1
  105. package/dist/nodalsAiRtdProvider.js +1 -1
  106. package/dist/not-for-prod/prebid.js +172 -172
  107. package/dist/objectGuard.js +1 -1
  108. package/dist/oguryBidAdapter.js +1 -1
  109. package/dist/onetagBidAdapter.js +1 -1
  110. package/dist/ooloAnalyticsAdapter.js +1 -1
  111. package/dist/openxBidAdapter.js +1 -1
  112. package/dist/optidigitalBidAdapter.js +1 -1
  113. package/dist/orbidderBidAdapter.js +1 -1
  114. package/dist/outbrainBidAdapter.js +1 -1
  115. package/dist/pixfutureBidAdapter.js +1 -1
  116. package/dist/publinkIdSystem.js +1 -1
  117. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  118. package/dist/pubmaticBidAdapter.js +1 -1
  119. package/dist/pubmaticIdSystem.js +1 -1
  120. package/dist/pubmaticRtdProvider.js +1 -1
  121. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  122. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  123. package/dist/pxyzBidAdapter.js +1 -1
  124. package/dist/quantcastBidAdapter.js +1 -1
  125. package/dist/readpeakBidAdapter.js +1 -1
  126. package/dist/relaidoBidAdapter.js +1 -1
  127. package/dist/retailspotBidAdapter.js +1 -1
  128. package/dist/rhythmoneBidAdapter.js +1 -1
  129. package/dist/riseUtils.js +1 -1
  130. package/dist/rtdModule.js +1 -1
  131. package/dist/rubiconBidAdapter.js +1 -1
  132. package/dist/seedingAllianceBidAdapter.js +1 -1
  133. package/dist/seedtagBidAdapter.js +1 -1
  134. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  135. package/dist/sharethroughBidAdapter.js +1 -1
  136. package/dist/showheroes-bsBidAdapter.js +1 -1
  137. package/dist/smaatoBidAdapter.js +1 -1
  138. package/dist/smartadserverBidAdapter.js +1 -1
  139. package/dist/smartxBidAdapter.js +1 -1
  140. package/dist/smilewantedBidAdapter.js +1 -1
  141. package/dist/snigelBidAdapter.js +1 -1
  142. package/dist/sonobiBidAdapter.js +1 -1
  143. package/dist/sovrnBidAdapter.js +1 -1
  144. package/dist/sparteoBidAdapter.js +1 -1
  145. package/dist/sspBCBidAdapter.js +1 -1
  146. package/dist/stvBidAdapter.js +1 -1
  147. package/dist/sublimeBidAdapter.js +1 -1
  148. package/dist/taboolaBidAdapter.js +1 -1
  149. package/dist/tappxBidAdapter.js +1 -1
  150. package/dist/targetVideoBidAdapter.js +1 -1
  151. package/dist/teadsBidAdapter.js +1 -1
  152. package/dist/terceptAnalyticsAdapter.js +1 -1
  153. package/dist/themoneytizerBidAdapter.js +1 -1
  154. package/dist/trionBidAdapter.js +1 -1
  155. package/dist/tripleliftBidAdapter.js +1 -1
  156. package/dist/ttdBidAdapter.js +1 -1
  157. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  158. package/dist/uid2IdSystem.js +1 -1
  159. package/dist/underdogmediaBidAdapter.js +1 -1
  160. package/dist/undertoneBidAdapter.js +1 -1
  161. package/dist/unrulyBidAdapter.js +1 -1
  162. package/dist/userId.js +1 -1
  163. package/dist/vidazooUtils.js +1 -1
  164. package/dist/videobyteBidAdapter.js +1 -1
  165. package/dist/visxBidAdapter.js +1 -1
  166. package/dist/vuukleBidAdapter.js +1 -1
  167. package/dist/widespaceBidAdapter.js +1 -1
  168. package/dist/winrBidAdapter.js +1 -1
  169. package/dist/yahooAdsBidAdapter.js +1 -1
  170. package/dist/yandexBidAdapter.js +1 -1
  171. package/dist/yieldmoBidAdapter.js +1 -1
  172. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  173. package/libraries/objectGuard/objectGuard.js +149 -48
  174. package/libraries/objectGuard/ortbGuard.js +33 -43
  175. package/modules/adagioAnalyticsAdapter.js +6 -1
  176. package/modules/adagioBidAdapter.js +12 -5
  177. package/modules/adagioRtdProvider.js +41 -35
  178. package/modules/pubmaticAnalyticsAdapter.js +311 -587
  179. package/modules/pubmaticBidAdapter.js +71 -8
  180. package/modules/pubmaticIdSystem.js +4 -4
  181. package/modules/pubmaticRtdProvider.js +12 -60
  182. package/modules/rtdModule/index.js +1 -5
  183. package/modules/ttdBidAdapter.js +0 -5
  184. package/modules/userId/eids.js +1 -1
  185. package/modules/userId/index.js +32 -1
  186. package/package.json +1 -1
  187. package/src/auction.js +3 -0
  188. package/test/spec/activities/objectGuard_spec.js +156 -32
  189. package/test/spec/activities/ortbGuard_spec.js +10 -15
  190. package/test/spec/modules/adagioAnalyticsAdapter_spec.js +94 -24
  191. package/test/spec/modules/adagioRtdProvider_spec.js +17 -17
  192. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +634 -916
  193. package/test/spec/modules/pubmaticBidAdapter_spec.js +260 -1
  194. package/test/spec/modules/pubmaticRtdProvider_spec.js +78 -400
  195. package/test/spec/modules/ttdBidAdapter_spec.js +0 -33
  196. package/test/spec/modules/userId_spec.js +115 -1
@@ -1,28 +1,21 @@
1
- import {_each, isArray, isStr, logError, logWarn, pick, generateUUID} from '../src/utils.js';
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, EVENTS, 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';
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
- const VENDOR_OPENWRAP = 'openwrap';
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 = 0;
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; // int: mandatory
71
- let profileId = DEFAULT_PROFILE_ID; // int: optional
72
- let profileVersionId = DEFAULT_PROFILE_VERSION_ID; // int: optional
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 sizeToDimensions(size) {
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
- function validMediaType(type) {
85
- return ({'banner': 1, 'native': 1, 'video': 1}).hasOwnProperty(type);
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
- function formatSource(src) {
89
- if (typeof src === 'undefined') {
90
- src = 'client';
91
- } else if (src === 's2s') {
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
- function setMediaTypes(types, bid) {
98
- if (bid.mediaType && validMediaType(bid.mediaType)) {
99
- return [bid.mediaType];
100
- }
101
- if (Array.isArray(types)) {
102
- return types.filter(validMediaType);
103
- }
104
- if (typeof types === 'object') {
105
- if (!bid.sizes) {
106
- bid.dimensions = [];
107
- _each(types, (type) =>
108
- bid.dimensions = bid.dimensions.concat(
109
- type.sizes.map(sizeToDimensions)
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', sizes => sizes && sizes.map(sizeToDimensions),
132
- 'mediaTypes', (types) => setMediaTypes(types, bid)
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 getFloorFetchStatus(floorData) {
419
- if (!floorData?.floorRequestData) {
420
- return false;
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
- const { location, fetchStatus } = floorData?.floorRequestData;
423
- const isDataValid = location !== FLOOR_VALUES.NO_DATA;
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 executeBidsLoggerCall(e, highestCpmBids) {
454
- let auctionId = e.auctionId;
455
- let referrer = config.getConfig('pageUrl') || cache.auctions[auctionId]?.referer || '';
456
- let auctionCache = cache.auctions[auctionId];
457
- let wiid = auctionCache?.wiid || auctionId;
458
- let floorData = auctionCache?.floorData;
459
- let floorFetchStatus = getFloorFetchStatus(floorData);
460
- let outputObj = { s: [] };
461
- let pixelURL = END_POINT_BID_LOGGER;
462
-
463
- const country = e.bidderRequests?.length > 0
464
- ? e.bidderRequests.find(bidder => bidder?.bidderCode === ADAPTER_CODE)?.ortb2?.user?.ext?.ctr || ''
465
- : '';
466
-
467
- if (!auctionCache || auctionCache.sent) {
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
- pixelURL += 'pubid=' + publisherId;
472
- outputObj['pubid'] = '' + publisherId;
473
- outputObj['iid'] = '' + wiid;
474
- outputObj['to'] = '' + auctionCache.timeout;
475
- outputObj['purl'] = referrer;
476
- outputObj['orig'] = getDomainFromUrl(referrer);
477
- outputObj['tst'] = Math.round((new window.Date()).getTime() / 1000);
478
- outputObj['pid'] = '' + profileId;
479
- outputObj['pdvid'] = '' + profileVersionId;
480
- outputObj['dvc'] = {'plt': getDevicePlatform()};
481
- outputObj['tgid'] = getTgId();
482
- outputObj['dm'] = DISPLAY_MANAGER;
483
- outputObj['dmv'] = '$prebid.version$' || '-1';
484
- outputObj['bm'] = getBrowserType();
485
- outputObj['ctr'] = country || '';
486
- outputObj['lip'] = getListOfIdentityPartners();
487
-
488
- if (floorData) {
489
- const floorRootValues = getFloorsCommonField(floorData?.floorRequestData);
490
- if (floorRootValues) {
491
- const { ffs, fsrc, fp, mv } = floorRootValues;
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
- if (floorFetchStatus) {
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
- ajax(
526
- pixelURL,
527
- null,
528
- 'json=' + enc(JSON.stringify(outputObj)),
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]?.bidWon;
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.filter(bid => bid.adId === cache.auctions[auctionId]?.adUnitCodes[adUnitId]?.bidWonAdId)[0];
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
- let floorData = auctionCache?.floorData;
558
- let wiid = cache.auctions[auctionId]?.wiid || auctionId;
559
- let referrer = config.getConfig('pageUrl') || cache.auctions[auctionId]?.referer || '';
560
- let adv = winningBid.bidResponse ? getAdDomain(winningBid.bidResponse) || undefined : undefined;
561
- let fskp = floorData ? (floorData.floorRequestData ? (floorData.floorRequestData.skipped == false ? 0 : 1) : undefined) : undefined;
562
- let pg = window.parseFloat(Number(winningBid?.bidResponse?.adserverTargeting?.hb_pb || winningBid?.bidResponse?.adserverTargeting?.pwtpb)) || undefined;
563
- let pixelURL = END_POINT_WIN_BID_LOGGER;
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
- const floorRuleValue = winningBid?.bidResponse?.floorData?.floorRuleValue;
613
- (floorRuleValue !== undefined) && (pixelURL += '&frv=' + enc(floorRuleValue));
342
+ };
614
343
 
615
- const floorValue = winningBid?.bidResponse?.floorData?.floorValue;
616
- (floorValue !== undefined) && (pixelURL += '&fv=' + enc(floorValue));
617
- }
618
- pixelURL += '&af=' + enc(winningBid.bidResponse ? (winningBid.bidResponse.mediaType || undefined) : undefined);
619
-
620
- ajax(
621
- pixelURL,
622
- null,
623
- null,
624
- {
625
- contentType: 'application/x-www-form-urlencoded',
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
- function auctionInitHandler(args) {
635
- s2sBidders = (function () {
636
- let s2sBidders = [];
637
- try {
638
- let s2sConf = config.getConfig('s2sConfig');
639
- if (isArray(s2sConf)) {
640
- s2sConf.forEach(conf => {
641
- if (conf?.bidders) {
642
- s2sBidders.push(...conf.bidders);
643
- }
644
- });
645
- } else if (s2sConf?.bidders) {
646
- s2sBidders.push(...s2sConf.bidders);
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
- } catch (e) {
649
- logError('Error processing s2s bidders:', e);
650
- }
651
- return s2sBidders || [];
652
- }());
653
- let cacheEntry = pick(args, [
654
- 'timestamp',
655
- 'timeout',
656
- 'bidderDonePendingCount', () => args.bidderRequests.length,
657
- ]);
658
- cacheEntry.adUnitCodes = {};
659
- cacheEntry.floorData = {};
660
- cacheEntry.origAdUnits = args.adUnits;
661
- cacheEntry.referer = args.bidderRequests[0].refererInfo.topmostLocation;
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
- function bidRequestedHandler(args) {
666
- args.bids.forEach(function(bid) {
667
- if (!cache.auctions[args.auctionId].adUnitCodes.hasOwnProperty(bid.adUnitCode)) {
668
- cache.auctions[args.auctionId].adUnitCodes[bid.adUnitCode] = {
669
- bids: {},
670
- bidWon: false,
671
- dimensions: bid.sizes
672
- };
673
- }
674
- if (bid.bidder === 'pubmatic' && !!bid?.params?.wiid) {
675
- cache.auctions[args.auctionId].wiid = bid.params.wiid;
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
- cache.auctions[args.auctionId].adUnitCodes[bid.adUnitCode].bids[bid.bidId] = [copyRequiredBidDetails(bid)];
678
- if (bid.floorData) {
679
- cache.auctions[args.auctionId].floorData['floorRequestData'] = bid.floorData;
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
- function bidResponseHandler(args) {
685
- if (!args.requestId) {
686
- logWarn(LOG_PRE_FIX + 'Got null requestId in bidResponseHandler');
687
- return;
688
- }
689
- let requestId = args.originalRequestId || args.requestId;
690
- let bid = cache.auctions[args.auctionId].adUnitCodes[args.adUnitCode].bids[requestId][0];
691
- if (!bid) {
692
- logError(LOG_PRE_FIX + 'Could not find associated bid request for bid response with requestId: ', args.requestId);
693
- return;
694
- }
695
-
696
- if ((bid.bidder && args.bidderCode && bid.bidder !== args.bidderCode) || (bid.bidder === args.bidderCode && bid.status === SUCCESS)) {
697
- bid = copyRequiredBidDetails(args);
698
- cache.auctions[args.auctionId].adUnitCodes[args.adUnitCode].bids[requestId].push(bid);
699
- } else if (args.originalRequestId) {
700
- bid.bidId = args.requestId;
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
- bid.adId = args.adId;
708
- bid.source = formatSource(bid.source || args.source);
709
- setBidStatus(bid, args);
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
- function bidRejectedHandler(args) {
719
- // If bid is rejected due to floors value did not met
720
- // make cpm as 0, status as bidRejected and forward the bid for logging
721
- if (args.rejectionReason === REJECTION_REASON.FLOOR_NOT_MET) {
722
- args.cpm = 0;
723
- args.status = BID_STATUS.BID_REJECTED;
724
- bidResponseHandler(args);
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
- function bidderDoneHandler(args) {
729
- cache.auctions[args.auctionId].bidderDonePendingCount--;
730
- args.bids.forEach(bid => {
731
- let cachedBid = cache.auctions[bid.auctionId].adUnitCodes[bid.adUnitCode].bids[bid.bidId || bid.originalRequestId || bid.requestId];
732
- if (typeof bid.serverResponseTimeMs !== 'undefined') {
733
- cachedBid.serverLatencyTimeMs = bid.serverResponseTimeMs;
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
- if (!cachedBid.clientLatencyTimeMs) {
739
- cachedBid.clientLatencyTimeMs = Date.now() - cache.auctions[bid.auctionId].timestamp;
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
- function bidWonHandler(args) {
745
- let auctionCache = cache.auctions[args.auctionId];
746
- auctionCache.adUnitCodes[args.adUnitCode].bidWon = args.originalRequestId || args.requestId;
747
- auctionCache.adUnitCodes[args.adUnitCode].bidWonAdId = args.adId;
748
- executeBidWonLoggerCall(args.auctionId, args.adUnitCode);
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
- function auctionEndHandler(args) {
752
- // if for the given auction bidderDonePendingCount == 0 then execute logger call sooners
753
- let highestCpmBids = getGlobal().getHighestCpmBids() || [];
754
- setTimeout(() => {
755
- executeBidsLoggerCall.call(this, args, highestCpmBids);
756
- }, (cache.auctions[args.auctionId]?.bidderDonePendingCount === 0 ? 500 : SEND_TIMEOUT));
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
- function bidTimeoutHandler(args) {
760
- // db = 1 and t = 1 means bidder did NOT respond with a bid but we got a timeout notification
761
- // db = 0 and t = 1 means bidder did respond with a bid but post timeout
762
- args.forEach(badBid => {
763
- let auctionCache = cache.auctions[badBid.auctionId];
764
- let bid = auctionCache.adUnitCodes[badBid.adUnitCode].bids[ badBid.bidId || badBid.originalRequestId || badBid.requestId ][0];
765
- if (bid) {
766
- bid.status = ERROR;
767
- bid.error = {
768
- code: TIMEOUT_ERROR
769
- };
770
- } else {
771
- logWarn(LOG_PRE_FIX + 'bid not found');
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 = Number(conf.options.publisherId);
532
+ publisherId = String(conf.options.publisherId).trim();
787
533
  }
788
- profileId = Number(conf.options.profileId) || DEFAULT_PROFILE_ID;
789
- profileVersionId = Number(conf.options.profileVersionId) || DEFAULT_PROFILE_VERSION_ID;
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(Number).');
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
- switch (eventType) {
817
- case EVENTS.AUCTION_INIT:
818
- auctionInitHandler(args);
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
  });