prebid.js 9.52.0 → 9.53.2

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 (235) hide show
  1. package/.circleci/config.yml +27 -4
  2. package/creative/crossDomain.js +4 -2
  3. package/dist/33acrossAnalyticsAdapter.js +1 -1
  4. package/dist/33acrossBidAdapter.js +1 -1
  5. package/dist/33acrossIdSystem.js +1 -1
  6. package/dist/BTBidAdapter.js +1 -1
  7. package/dist/adagioAnalyticsAdapter.js +1 -1
  8. package/dist/adagioBidAdapter.js +1 -1
  9. package/dist/adagioUtils.js +1 -1
  10. package/dist/addefendBidAdapter.js +1 -1
  11. package/dist/adgenerationBidAdapter.js +1 -1
  12. package/dist/adlooxRtdProvider.js +1 -1
  13. package/dist/adqueryBidAdapter.js +1 -1
  14. package/dist/adrelevantisBidAdapter.js +1 -1
  15. package/dist/adstirBidAdapter.js +1 -1
  16. package/dist/adtrgtmeBidAdapter.js +1 -1
  17. package/dist/adxcgAnalyticsAdapter.js +1 -1
  18. package/dist/adxcgBidAdapter.js +1 -1
  19. package/dist/adyoulikeBidAdapter.js +1 -1
  20. package/dist/agmaAnalyticsAdapter.js +1 -1
  21. package/dist/ajaBidAdapter.js +1 -1
  22. package/dist/amxBidAdapter.js +1 -1
  23. package/dist/amxIdSystem.js +1 -1
  24. package/dist/aniviewBidAdapter.js +1 -1
  25. package/dist/appierAnalyticsAdapter.js +1 -1
  26. package/dist/appnexusBidAdapter.js +1 -1
  27. package/dist/asoBidAdapter.js +1 -1
  28. package/dist/axonixBidAdapter.js +1 -1
  29. package/dist/beopBidAdapter.js +1 -1
  30. package/dist/bidglassBidAdapter.js +1 -1
  31. package/dist/big-richmediaBidAdapter.js +1 -1
  32. package/dist/bitmediaBidAdapter.js +1 -1
  33. package/dist/bridBidAdapter.js +1 -1
  34. package/dist/bridgeuppBidAdapter.js +1 -1
  35. package/dist/bridgewellBidAdapter.js +1 -1
  36. package/dist/brightMountainMediaBidAdapter.js +1 -1
  37. package/dist/carodaBidAdapter.js +1 -1
  38. package/dist/chromeAiRtdProvider.js +1 -0
  39. package/dist/chtnwBidAdapter.js +1 -1
  40. package/dist/chunk-core.js +1 -1
  41. package/dist/concertBidAdapter.js +1 -1
  42. package/dist/connectadBidAdapter.js +1 -1
  43. package/dist/consumableBidAdapter.js +1 -1
  44. package/dist/contxtfulBidAdapter.js +1 -1
  45. package/dist/conversantAnalyticsAdapter.js +1 -1
  46. package/dist/conversantBidAdapter.js +1 -1
  47. package/dist/craftBidAdapter.js +1 -1
  48. package/dist/criteoBidAdapter.js +1 -1
  49. package/dist/cwireBidAdapter.js +1 -1
  50. package/dist/dailymotionBidAdapter.js +1 -1
  51. package/dist/debugging-standalone.js +1 -1
  52. package/dist/dependencies.json +10 -2
  53. package/dist/dspxBidAdapter.js +1 -1
  54. package/dist/dxkultureBidAdapter.js +1 -1
  55. package/dist/eplanningBidAdapter.js +1 -1
  56. package/dist/equativBidAdapter.js +1 -1
  57. package/dist/eskimiBidAdapter.js +1 -1
  58. package/dist/euidIdSystem.js +1 -1
  59. package/dist/exadsBidAdapter.js +1 -1
  60. package/dist/excoBidAdapter.js +1 -1
  61. package/dist/fanAdapter.js +1 -1
  62. package/dist/feedadBidAdapter.js +1 -1
  63. package/dist/finativeBidAdapter.js +1 -1
  64. package/dist/freewheel-sspBidAdapter.js +1 -1
  65. package/dist/gmosspBidAdapter.js +1 -1
  66. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  67. package/dist/greenbidsBidAdapter.js +1 -1
  68. package/dist/greenbidsRtdProvider.js +1 -1
  69. package/dist/gridBidAdapter.js +1 -1
  70. package/dist/gumgumBidAdapter.js +1 -1
  71. package/dist/h12mediaBidAdapter.js +1 -1
  72. package/dist/hypelabBidAdapter.js +1 -1
  73. package/dist/id5AnalyticsAdapter.js +1 -1
  74. package/dist/id5IdSystem.js +1 -1
  75. package/dist/imdsBidAdapter.js +1 -1
  76. package/dist/improvedigitalBidAdapter.js +1 -1
  77. package/dist/inmobiBidAdapter.js +1 -1
  78. package/dist/insticatorBidAdapter.js +1 -1
  79. package/dist/intentIqAnalyticsAdapter.js +1 -1
  80. package/dist/ixBidAdapter.js +1 -1
  81. package/dist/jixieBidAdapter.js +1 -1
  82. package/dist/jixieIdSystem.js +1 -0
  83. package/dist/justpremiumBidAdapter.js +1 -1
  84. package/dist/kargoBidAdapter.js +1 -1
  85. package/dist/kimberliteBidAdapter.js +1 -1
  86. package/dist/konduitAnalyticsAdapter.js +1 -1
  87. package/dist/kueezBidAdapter.js +1 -1
  88. package/dist/lassoBidAdapter.js +1 -1
  89. package/dist/lifestreetBidAdapter.js +1 -1
  90. package/dist/liveIntentId.js +1 -1
  91. package/dist/logicadBidAdapter.js +1 -1
  92. package/dist/loglyliftBidAdapter.js +1 -1
  93. package/dist/luceadBidAdapter.js +1 -1
  94. package/dist/mabidderBidAdapter.js +1 -1
  95. package/dist/madsenseBidAdapter.js +1 -1
  96. package/dist/magniteAnalyticsAdapter.js +1 -1
  97. package/dist/malltvAnalyticsAdapter.js +1 -1
  98. package/dist/marsmediaBidAdapter.js +1 -1
  99. package/dist/mediafuseBidAdapter.js +1 -1
  100. package/dist/medianetBidAdapter.js +1 -1
  101. package/dist/medianetUtils.js +1 -1
  102. package/dist/mediasquareBidAdapter.js +1 -1
  103. package/dist/mgidBidAdapter.js +1 -1
  104. package/dist/missenaBidAdapter.js +1 -1
  105. package/dist/mobilefuseBidAdapter.js +1 -1
  106. package/dist/nextMillenniumBidAdapter.js +1 -1
  107. package/dist/nexx360Utils.js +1 -1
  108. package/dist/nobidAnalyticsAdapter.js +1 -1
  109. package/dist/nobidBidAdapter.js +1 -1
  110. package/dist/nodalsAiRtdProvider.js +1 -1
  111. package/dist/not-for-prod/prebid.js +175 -173
  112. package/dist/oguryBidAdapter.js +1 -1
  113. package/dist/onetagBidAdapter.js +1 -1
  114. package/dist/ooloAnalyticsAdapter.js +1 -1
  115. package/dist/openxBidAdapter.js +1 -1
  116. package/dist/optidigitalBidAdapter.js +1 -1
  117. package/dist/orbidderBidAdapter.js +1 -1
  118. package/dist/ortb2.5Translator.js +1 -1
  119. package/dist/outbrainBidAdapter.js +1 -1
  120. package/dist/ozoneBidAdapter.js +1 -1
  121. package/dist/pixfutureBidAdapter.js +1 -1
  122. package/dist/prebidServerBidAdapter.js +1 -1
  123. package/dist/publinkIdSystem.js +1 -1
  124. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  125. package/dist/pubmaticBidAdapter.js +1 -1
  126. package/dist/pubmaticRtdProvider.js +1 -1
  127. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  128. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  129. package/dist/pxyzBidAdapter.js +1 -1
  130. package/dist/quantcastBidAdapter.js +1 -1
  131. package/dist/readpeakBidAdapter.js +1 -1
  132. package/dist/relaidoBidAdapter.js +1 -1
  133. package/dist/relevatehealthBidAdapter.js +1 -1
  134. package/dist/retailspotBidAdapter.js +1 -1
  135. package/dist/rhythmoneBidAdapter.js +1 -1
  136. package/dist/riseUtils.js +1 -1
  137. package/dist/rubiconBidAdapter.js +1 -1
  138. package/dist/seedingAllianceBidAdapter.js +1 -1
  139. package/dist/seedtagBidAdapter.js +1 -1
  140. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  141. package/dist/sharethroughBidAdapter.js +1 -1
  142. package/dist/showheroes-bsBidAdapter.js +1 -1
  143. package/dist/smaatoBidAdapter.js +1 -1
  144. package/dist/smartadserverBidAdapter.js +1 -1
  145. package/dist/smartxBidAdapter.js +1 -1
  146. package/dist/smilewantedBidAdapter.js +1 -1
  147. package/dist/snigelBidAdapter.js +1 -1
  148. package/dist/sonobiBidAdapter.js +1 -1
  149. package/dist/sovrnBidAdapter.js +1 -1
  150. package/dist/sparteoBidAdapter.js +1 -1
  151. package/dist/sspBCBidAdapter.js +1 -1
  152. package/dist/stvBidAdapter.js +1 -1
  153. package/dist/sublimeBidAdapter.js +1 -1
  154. package/dist/taboolaBidAdapter.js +1 -1
  155. package/dist/tappxBidAdapter.js +1 -1
  156. package/dist/targetVideoBidAdapter.js +1 -1
  157. package/dist/teadsBidAdapter.js +1 -1
  158. package/dist/terceptAnalyticsAdapter.js +1 -1
  159. package/dist/themoneytizerBidAdapter.js +1 -1
  160. package/dist/trionBidAdapter.js +1 -1
  161. package/dist/tripleliftBidAdapter.js +1 -1
  162. package/dist/ttdBidAdapter.js +1 -1
  163. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  164. package/dist/uid2IdSystem.js +1 -1
  165. package/dist/underdogmediaBidAdapter.js +1 -1
  166. package/dist/undertoneBidAdapter.js +1 -1
  167. package/dist/unrulyBidAdapter.js +1 -1
  168. package/dist/userId.js +1 -1
  169. package/dist/vidazooUtils.js +1 -1
  170. package/dist/videobyteBidAdapter.js +1 -1
  171. package/dist/visxBidAdapter.js +1 -1
  172. package/dist/vuukleBidAdapter.js +1 -1
  173. package/dist/widespaceBidAdapter.js +1 -1
  174. package/dist/winrBidAdapter.js +1 -1
  175. package/dist/yahooAdsBidAdapter.js +1 -1
  176. package/dist/yandexBidAdapter.js +1 -1
  177. package/dist/yieldmoBidAdapter.js +1 -1
  178. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  179. package/gulpfile.js +12 -6
  180. package/integrationExamples/chromeai/japanese.html +224 -0
  181. package/integrationExamples/gpt/x-domain/creative.html +1 -1
  182. package/karma.conf.maker.js +7 -7
  183. package/karmaRunner.js +3 -3
  184. package/libraries/liveIntentId/shared.js +16 -0
  185. package/modules/.submodules.json +1 -0
  186. package/modules/aniviewBidAdapter.js +32 -23
  187. package/modules/chromeAiRtdProvider.js +421 -0
  188. package/modules/chromeAiRtdProvider.md +230 -0
  189. package/modules/fanAdapter.js +318 -124
  190. package/modules/ixBidAdapter.js +5 -0
  191. package/modules/jixieIdSystem.js +186 -0
  192. package/modules/ozoneBidAdapter.js +214 -336
  193. package/modules/prebidServerBidAdapter/index.js +59 -35
  194. package/modules/pubmaticRtdProvider.js +418 -4
  195. package/modules/pubmaticRtdProvider.md +12 -2
  196. package/modules/relevatehealthBidAdapter.js +20 -130
  197. package/modules/relevatehealthBidAdapter.md +1 -2
  198. package/modules/sovrnBidAdapter.js +4 -4
  199. package/modules/teadsBidAdapter.js +5 -0
  200. package/modules/ttdBidAdapter.js +5 -4
  201. package/modules/userId/index.js +30 -31
  202. package/package.json +5 -4
  203. package/src/adapterManager.js +3 -0
  204. package/test/spec/libraries/cmUtils_spec.js +17 -12
  205. package/test/spec/modules/aniviewBidAdapter_spec.js +15 -2
  206. package/test/spec/modules/chromeAiRtdProvider_spec.js +393 -0
  207. package/test/spec/modules/dgkeywordRtdProvider_spec.js +5 -2
  208. package/test/spec/modules/euidIdSystem_spec.js +9 -3
  209. package/test/spec/modules/fanAdapter_spec.js +264 -268
  210. package/test/spec/modules/id5IdSystem_spec.js +57 -101
  211. package/test/spec/modules/identityLinkIdSystem_spec.js +1 -0
  212. package/test/spec/modules/idxIdSystem_spec.js +2 -75
  213. package/test/spec/modules/instreamTracking_spec.js +15 -18
  214. package/test/spec/modules/ixBidAdapter_spec.js +26 -0
  215. package/test/spec/modules/jixieIdSystem_spec.js +303 -0
  216. package/test/spec/modules/liveIntentExternalIdSystem_spec.js +5 -0
  217. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +5 -0
  218. package/test/spec/modules/liveIntentIdSystem_spec.js +38 -0
  219. package/test/spec/modules/lmpIdSystem_spec.js +2 -81
  220. package/test/spec/modules/ozoneBidAdapter_spec.js +511 -658
  221. package/test/spec/modules/prebidServerBidAdapter_spec.js +72 -2
  222. package/test/spec/modules/pubmaticBidAdapter_spec.js +411 -126
  223. package/test/spec/modules/pubmaticRtdProvider_spec.js +946 -2
  224. package/test/spec/modules/raynRtdProvider_spec.js +18 -22
  225. package/test/spec/modules/relevatehealthBidAdapter_spec.js +9 -39
  226. package/test/spec/modules/sharedIdSystem_spec.js +3 -3
  227. package/test/spec/modules/sovrnBidAdapter_spec.js +71 -3
  228. package/test/spec/modules/teadsBidAdapter_spec.js +9 -4
  229. package/test/spec/modules/ttdBidAdapter_spec.js +24 -2
  230. package/test/spec/modules/uid2IdSystem_helpers.js +5 -2
  231. package/test/spec/modules/userId_spec.js +142 -387
  232. package/test/spec/modules/yieldoneAnalyticsAdapter_spec.js +13 -12
  233. package/test/spec/modules/zeotapIdPlusIdSystem_spec.js +3 -69
  234. package/wdio.shared.conf.js +2 -2
  235. package/CLAUDE.md +0 -1
@@ -5,7 +5,6 @@ import {
5
5
  logWarn,
6
6
  deepSetValue,
7
7
  isArray,
8
- contains,
9
8
  mergeDeep,
10
9
  parseUrl,
11
10
  generateUUID, isInteger, deepClone, getBidIdParameter
@@ -16,122 +15,57 @@ import {config} from '../src/config.js';
16
15
  import {getPriceBucketString} from '../src/cpmBucketManager.js';
17
16
  import { Renderer } from '../src/Renderer.js';
18
17
  import {getRefererInfo} from '../src/refererDetection.js';
18
+ import {toOrtb25} from '../libraries/ortb2.5Translator/translator.js';
19
19
  const BIDDER_CODE = 'ozone';
20
- const ORIGIN = 'https://elb.the-ozone-project.com'; // applies only to auction & cookie
20
+ const ORIGIN = 'https://elb.the-ozone-project.com';
21
21
  const AUCTIONURI = '/openrtb2/auction';
22
22
  const OZONECOOKIESYNC = '/static/load-cookie.html';
23
23
  const OZONE_RENDERER_URL = 'https://prebid.the-ozone-project.com/ozone-renderer.js';
24
- const ORIGIN_DEV = 'https://test.ozpr.net';
25
- const OZONEVERSION = '3.0.0';
24
+ const KEY_PREFIX = 'oz';
25
+ const OZONEVERSION = '4.0.0';
26
26
  export const spec = {
27
27
  gvlid: 524,
28
28
  version: OZONEVERSION,
29
29
  code: BIDDER_CODE,
30
30
  supportedMediaTypes: [VIDEO, BANNER],
31
- cookieSyncBag: {publisherId: null, siteId: null, userIdObject: {}}, // variables we want to make available to cookie sync
32
- propertyBag: {pageId: null, buildRequestsStart: 0, buildRequestsEnd: 0, endpointOverride: null}, /* allow us to store vars in instance scope - needs to be an object to be mutable */
33
- whitelabel_defaults: {
34
- 'logId': 'OZONE',
35
- 'bidder': 'ozone',
36
- 'keyPrefix': 'oz',
37
- 'auctionUrl': ORIGIN + AUCTIONURI,
38
- 'cookieSyncUrl': ORIGIN + OZONECOOKIESYNC,
39
- 'rendererUrl': OZONE_RENDERER_URL,
40
- 'batchRequests': false /* you can change this to true OR numeric OR override it in the config: config.ozone.batchRequests = true/false/number */
41
- },
42
- loadWhitelabelData(bid) {
43
- if (this.propertyBag.whitelabel) { return; }
44
- this.propertyBag.whitelabel = JSON.parse(JSON.stringify(this.whitelabel_defaults));
45
- let bidder = bid.bidder || 'ozone'; // eg. ozone
46
- this.propertyBag.whitelabel.logId = bidder.toUpperCase();
47
- this.propertyBag.whitelabel.bidder = bidder;
48
- let bidderConfig = config.getConfig(bidder) || {};
49
- logInfo('got bidderConfig: ', deepClone(bidderConfig));
50
- if (bidderConfig.kvpPrefix) {
51
- this.propertyBag.whitelabel.keyPrefix = bidderConfig.kvpPrefix;
52
- }
53
- let arr = this.getGetParametersAsObject();
54
- if (bidderConfig.endpointOverride) {
55
- if (bidderConfig.endpointOverride.origin) {
56
- this.propertyBag.endpointOverride = bidderConfig.endpointOverride.origin;
57
- this.propertyBag.whitelabel.auctionUrl = bidderConfig.endpointOverride.origin + AUCTIONURI;
58
- this.propertyBag.whitelabel.cookieSyncUrl = bidderConfig.endpointOverride.origin + OZONECOOKIESYNC;
59
- }
60
- if (arr.hasOwnProperty('renderer')) {
61
- if (arr.renderer.match('%3A%2F%2F')) {
62
- this.propertyBag.whitelabel.rendererUrl = decodeURIComponent(arr['renderer']);
63
- } else {
64
- this.propertyBag.whitelabel.rendererUrl = arr['renderer'];
65
- }
66
- } else if (bidderConfig.endpointOverride.rendererUrl) {
67
- this.propertyBag.whitelabel.rendererUrl = bidderConfig.endpointOverride.rendererUrl;
68
- }
69
- if (bidderConfig.endpointOverride.cookieSyncUrl) {
70
- this.propertyBag.whitelabel.cookieSyncUrl = bidderConfig.endpointOverride.cookieSyncUrl;
71
- }
72
- if (bidderConfig.endpointOverride.auctionUrl) {
73
- this.propertyBag.endpointOverride = bidderConfig.endpointOverride.auctionUrl;
74
- this.propertyBag.whitelabel.auctionUrl = bidderConfig.endpointOverride.auctionUrl;
75
- }
76
- }
77
- if (bidderConfig.hasOwnProperty('batchRequests')) {
78
- if (this.batchValueIsValid(bidderConfig.batchRequests)) {
79
- this.propertyBag.whitelabel.batchRequests = bidderConfig.batchRequests;
80
- } else {
81
- logError('invalid config: batchRequest');
82
- }
83
- }
84
- if (bidderConfig.hasOwnProperty('videoParams')) {
85
- this.propertyBag.whitelabel.videoParams = bidderConfig.videoParams;
86
- }
87
- if (arr.hasOwnProperty('batchRequests')) {
88
- let getBatch = parseInt(arr.batchRequests);
89
- if (this.batchValueIsValid(getBatch)) {
90
- this.propertyBag.whitelabel.batchRequests = getBatch;
91
- } else {
92
- logError('invalid GET: batchRequests');
93
- }
94
- }
95
- try {
96
- if (arr.hasOwnProperty('auction') && arr.auction === 'dev') {
97
- logInfo('GET: auction=dev');
98
- this.propertyBag.whitelabel.auctionUrl = ORIGIN_DEV + AUCTIONURI;
99
- }
100
- if (arr.hasOwnProperty('cookiesync') && arr.cookiesync === 'dev') {
101
- logInfo('GET: cookiesync=dev');
102
- this.propertyBag.whitelabel.cookieSyncUrl = ORIGIN_DEV + OZONECOOKIESYNC;
103
- }
104
- } catch (e) {}
105
- logInfo('whitelabel: ', this.propertyBag.whitelabel);
106
- },
107
- batchValueIsValid(batch) {
108
- return typeof batch === 'boolean' || (typeof batch === 'number' && batch > 0);
109
- },
31
+ cookieSyncBag: {publisherId: null, siteId: null, userIdObject: {}},
32
+ propertyBag: {pageId: null, buildRequestsStart: 0, buildRequestsEnd: 0},
110
33
  getAuctionUrl() {
111
- return this.propertyBag.whitelabel.auctionUrl;
34
+ const ep = config.getConfig('ozone.endpointOverride') || {};
35
+ if (ep.auctionUrl) return ep.auctionUrl;
36
+ const origin = ep.origin || ORIGIN;
37
+ return origin + AUCTIONURI;
112
38
  },
113
39
  getCookieSyncUrl() {
114
- return this.propertyBag.whitelabel.cookieSyncUrl;
40
+ const ep = config.getConfig('ozone.endpointOverride') || {};
41
+ if (ep.cookieSyncUrl) return ep.cookieSyncUrl;
42
+ const origin = ep.origin || ORIGIN;
43
+ return origin + OZONECOOKIESYNC;
115
44
  },
116
45
  getRendererUrl() {
117
- return this.propertyBag.whitelabel.rendererUrl;
46
+ const ep = config.getConfig('ozone.endpointOverride') || {};
47
+ return ep.rendererUrl || OZONE_RENDERER_URL;
118
48
  },
119
- getVideoPlacementValue: function(context) {
120
- if (['instream', 'outstream'].indexOf(context) < 0) return null; /* do not allow arbitrary strings */
121
- return deepAccess(this.propertyBag, `whitelabel.videoParams.${context}`, null);
49
+ getVideoPlacementValue(context) {
50
+ if (['instream', 'outstream'].indexOf(context) < 0) return null;
51
+ return deepAccess(config.getConfig('ozone.videoParams'), context);
122
52
  },
123
53
  getBatchRequests() {
124
- if (this.propertyBag.whitelabel.batchRequests === true) { return 10; }
125
- if (typeof this.propertyBag.whitelabel.batchRequests === 'number' && this.propertyBag.whitelabel.batchRequests > 0) {
126
- return this.propertyBag.whitelabel.batchRequests;
54
+ const g = this.getGetParametersAsObject();
55
+ if (g['batchRequests'] && g['batchRequests'].toString().match(/^[0-9]+$/)) {
56
+ return parseInt(g['batchRequests']);
57
+ }
58
+ const batch = config.getConfig('ozone.batchRequests');
59
+ if (batch === true) return 10;
60
+ if (typeof batch === 'number' && batch > 0) {
61
+ return batch;
127
62
  }
128
63
  return false;
129
64
  },
130
65
  isBidRequestValid(bid) {
131
66
  let vf = 'VALIDATION FAILED';
132
- this.loadWhitelabelData(bid);
133
67
  logInfo('isBidRequestValid : ', config.getConfig(), bid);
134
- let adUnitCode = bid.adUnitCode; // adunit[n].code
68
+ let adUnitCode = bid.adUnitCode;
135
69
  let err1 = `${vf} : missing {param} : siteId, placementId and publisherId are REQUIRED`;
136
70
  if (!(getBidIdParameter('placementId', bid.params))) {
137
71
  logError(err1.replace('{param}', 'placementId'), adUnitCode);
@@ -195,15 +129,14 @@ export const spec = {
195
129
  return placementId.toString().match(/^[0-9]{10}$/);
196
130
  },
197
131
  buildRequests(validBidRequests, bidderRequest) {
198
- this.loadWhitelabelData(validBidRequests[0]);
199
132
  this.propertyBag.buildRequestsStart = new Date().getTime();
200
- let whitelabelBidder = this.propertyBag.whitelabel.bidder; // by default = ozone
201
- let whitelabelPrefix = this.propertyBag.whitelabel.keyPrefix;
133
+ const bidderKey = BIDDER_CODE;
134
+ const prefix = KEY_PREFIX;
202
135
  logInfo(`buildRequests time: ${this.propertyBag.buildRequestsStart} v ${OZONEVERSION} validBidRequests`, deepClone(validBidRequests), 'bidderRequest', deepClone(bidderRequest));
203
136
  if (this.blockTheRequest()) {
204
137
  return [];
205
138
  }
206
- let fledgeEnabled = !!bidderRequest.fledgeEnabled; // IF true then this is added as each bid[].ext.ae=1
139
+ let fledgeEnabled = !!bidderRequest.fledgeEnabled;
207
140
  let htmlParams = {'publisherId': '', 'siteId': ''};
208
141
  if (validBidRequests.length > 0) {
209
142
  Object.assign(this.cookieSyncBag.userIdObject, this.findAllUserIdsFromEids(validBidRequests[0]));
@@ -212,9 +145,9 @@ export const spec = {
212
145
  htmlParams = validBidRequests[0].params;
213
146
  }
214
147
  logInfo('cookie sync bag', this.cookieSyncBag);
215
- let singleRequest = this.getWhitelabelConfigItem('ozone.singleRequest');
216
- singleRequest = singleRequest !== false; // undefined & true will be true
217
- let ozoneRequest = {}; // we only want to set specific properties on this, not validBidRequests[0].params
148
+ let singleRequest = config.getConfig('ozone.singleRequest');
149
+ singleRequest = singleRequest !== false;
150
+ let ozoneRequest = {};
218
151
  let fpd = deepAccess(bidderRequest, 'ortb2', null);
219
152
  logInfo('got ortb2 fpd: ', fpd);
220
153
  if (fpd && deepAccess(fpd, 'user')) {
@@ -222,10 +155,10 @@ export const spec = {
222
155
  ozoneRequest.user = fpd.user;
223
156
  }
224
157
  const getParams = this.getGetParametersAsObject();
225
- const wlOztestmodeKey = whitelabelPrefix + 'testmode';
226
- const isTestMode = getParams[wlOztestmodeKey] || null; // this can be any string, it's used for testing ads
227
- ozoneRequest.device = bidderRequest?.ortb2?.device || {}; // 20240925 rupesh changed this
228
- let placementIdOverrideFromGetParam = this.getPlacementIdOverrideFromGetParam(); // null or string
158
+ const wlOztestmodeKey = 'oztestmode';
159
+ const isTestMode = getParams[wlOztestmodeKey] || null;
160
+ ozoneRequest.device = bidderRequest?.ortb2?.device || {};
161
+ let placementIdOverrideFromGetParam = this.getPlacementIdOverrideFromGetParam();
229
162
  let schain = null;
230
163
  var auctionId = deepAccess(validBidRequests, '0.ortb2.source.tid');
231
164
  if (auctionId === '0') {
@@ -233,8 +166,8 @@ export const spec = {
233
166
  }
234
167
  let tosendtags = validBidRequests.map(ozoneBidRequest => {
235
168
  var obj = {};
236
- let placementId = placementIdOverrideFromGetParam || this.getPlacementId(ozoneBidRequest); // prefer to use a valid override param, else the bidRequest placement Id
237
- obj.id = ozoneBidRequest.bidId; // this causes an error if we change it to something else, even if you update the bidRequest object: "WARNING: Bidder ozone made bid for unknown request ID: mb7953.859498327448. Ignoring."
169
+ let placementId = placementIdOverrideFromGetParam || this.getPlacementId(ozoneBidRequest);
170
+ obj.id = ozoneBidRequest.bidId;
238
171
  obj.tagid = placementId;
239
172
  obj.secure = parseUrl(getRefererInfo().page).protocol === 'https' ? 1 : 0;
240
173
  let arrBannerSizes = [];
@@ -246,7 +179,7 @@ export const spec = {
246
179
  }
247
180
  } else {
248
181
  if (ozoneBidRequest.mediaTypes.hasOwnProperty(BANNER)) {
249
- arrBannerSizes = ozoneBidRequest.mediaTypes[BANNER].sizes; /* Note - if there is a sizes element in the config root it will be pushed into here */
182
+ arrBannerSizes = ozoneBidRequest.mediaTypes[BANNER].sizes;
250
183
  logInfo('setting banner size from mediaTypes.banner for bidId ' + obj.id + ': ', arrBannerSizes);
251
184
  }
252
185
  if (ozoneBidRequest.mediaTypes.hasOwnProperty(VIDEO)) {
@@ -258,11 +191,12 @@ export const spec = {
258
191
  }
259
192
  let wh = getWidthAndHeightFromVideoObject(obj.video);
260
193
  logInfo(`setting video object ${obj.id} from mediaTypes.video: `, obj.video, 'wh=', wh);
261
- let settingToBe = 'setting obj.video.format to be '; // partial, reusable phrase
194
+ let settingToBe = 'setting obj.video.format to be ';
262
195
  if (wh && typeof wh === 'object') {
263
196
  obj.video.w = wh['w'];
264
197
  obj.video.h = wh['h'];
265
- if (playerSizeIsNestedArray(obj.video)) { // this should never happen; it was in the original spec for this change though.
198
+ const ps = getPlayerSizeFromObject(obj.video);
199
+ if (ps && Array.isArray(ps[0])) {
266
200
  logInfo(`${settingToBe} an array of objects`);
267
201
  obj.video.ext.format = [wh];
268
202
  } else {
@@ -296,37 +230,37 @@ export const spec = {
296
230
  }
297
231
  obj.placementId = placementId;
298
232
  deepSetValue(obj, 'ext.prebid', {'storedrequest': {'id': placementId}});
299
- obj.ext[whitelabelBidder] = {};
300
- obj.ext[whitelabelBidder].adUnitCode = ozoneBidRequest.adUnitCode; // eg. 'mpu'
233
+ obj.ext[bidderKey] = {};
234
+ obj.ext[bidderKey].adUnitCode = ozoneBidRequest.adUnitCode;
301
235
  if (ozoneBidRequest.params.hasOwnProperty('customData')) {
302
- obj.ext[whitelabelBidder].customData = ozoneBidRequest.params.customData;
236
+ obj.ext[bidderKey].customData = ozoneBidRequest.params.customData;
303
237
  }
304
238
  if (ozoneBidRequest.params.hasOwnProperty('ozFloor')) {
305
239
  let ozFloorParsed = parseFloat(ozoneBidRequest.params.ozFloor);
306
240
  if (!isNaN(ozFloorParsed)) {
307
- obj.ext[whitelabelBidder].ozFloor = ozFloorParsed;
241
+ obj.ext[bidderKey].ozFloor = ozFloorParsed;
308
242
  } else {
309
243
  logError(`Ignoring invalid ozFloor value for adunit code: ${ozoneBidRequest.adUnitCode}`);
310
244
  }
311
245
  }
312
- logInfo(`obj.ext.${whitelabelBidder} is `, obj.ext[whitelabelBidder]);
246
+ logInfo(`obj.ext.${bidderKey} is `, obj.ext[bidderKey]);
313
247
  if (isTestMode != null) {
314
248
  logInfo(`setting isTestMode: ${isTestMode}`);
315
- if (obj.ext[whitelabelBidder].hasOwnProperty('customData')) {
316
- for (let i = 0; i < obj.ext[whitelabelBidder].customData.length; i++) {
317
- obj.ext[whitelabelBidder].customData[i]['targeting'][wlOztestmodeKey] = isTestMode;
249
+ if (obj.ext[bidderKey].hasOwnProperty('customData')) {
250
+ for (let i = 0; i < obj.ext[bidderKey].customData.length; i++) {
251
+ obj.ext[bidderKey].customData[i]['targeting'][wlOztestmodeKey] = isTestMode;
318
252
  }
319
253
  } else {
320
- obj.ext[whitelabelBidder].customData = [{'settings': {}, 'targeting': {}}];
321
- obj.ext[whitelabelBidder].customData[0].targeting[wlOztestmodeKey] = isTestMode;
254
+ obj.ext[bidderKey].customData = [{'settings': {}, 'targeting': {}}];
255
+ obj.ext[bidderKey].customData[0].targeting[wlOztestmodeKey] = isTestMode;
322
256
  }
323
257
  }
324
258
  if (fpd && deepAccess(fpd, 'site')) {
325
259
  logInfo('adding fpd.site');
326
- if (deepAccess(obj, `ext.${whitelabelBidder}.customData.0.targeting`, false)) {
327
- Object.assign(obj.ext[whitelabelBidder].customData[0].targeting, fpd.site);
260
+ if (deepAccess(obj, `ext.${bidderKey}.customData.0.targeting`, false)) {
261
+ Object.assign(obj.ext[bidderKey].customData[0].targeting, fpd.site);
328
262
  } else {
329
- deepSetValue(obj, `ext.${whitelabelBidder}.customData.0.targeting`, fpd.site);
263
+ deepSetValue(obj, `ext.${bidderKey}.customData.0.targeting`, fpd.site);
330
264
  }
331
265
  }
332
266
  if (!schain && deepAccess(ozoneBidRequest, 'schain')) {
@@ -338,13 +272,13 @@ export const spec = {
338
272
  }
339
273
  let transactionId = deepAccess(ozoneBidRequest, 'ortb2Imp.ext.tid');
340
274
  if (transactionId) {
341
- obj.ext[whitelabelBidder].transactionId = transactionId; // this is the transactionId PER adUnit, common across bidders for this unit
275
+ obj.ext.tid = transactionId;
342
276
  }
343
277
  if (auctionId) {
344
- obj.ext[whitelabelBidder].auctionId = auctionId; // we were sent a valid auctionId to use - this will also be used as the root id value for the request
278
+ obj.ext.auctionId = auctionId;
345
279
  }
346
- if (fledgeEnabled) { // fledge is enabled at some config level - pbjs.setBidderConfig or pbjs.setConfig
347
- const auctionEnvironment = deepAccess(ozoneBidRequest, 'ortb2Imp.ext.ae'); // this will be set for one of 3 reasons; adunit, setBidderConfig, setConfig
280
+ if (fledgeEnabled) {
281
+ const auctionEnvironment = deepAccess(ozoneBidRequest, 'ortb2Imp.ext.ae');
348
282
  if (isInteger(auctionEnvironment)) {
349
283
  deepSetValue(obj, 'ext.ae', auctionEnvironment);
350
284
  } else {
@@ -354,32 +288,31 @@ export const spec = {
354
288
  return obj;
355
289
  });
356
290
  let extObj = {};
357
- extObj[whitelabelBidder] = {};
358
- extObj[whitelabelBidder][`${whitelabelPrefix}_pb_v`] = OZONEVERSION;
359
- extObj[whitelabelBidder][`${whitelabelPrefix}_rw`] = placementIdOverrideFromGetParam ? 1 : 0;
291
+ extObj[bidderKey] = {};
292
+ extObj[bidderKey][`${prefix}_pb_v`] = OZONEVERSION;
293
+ extObj[bidderKey][`${prefix}_rw`] = placementIdOverrideFromGetParam ? 1 : 0;
360
294
  if (validBidRequests.length > 0) {
361
- let userIds = this.cookieSyncBag.userIdObject; // 2021-01-06 - slight optimisation - we've already found this info
295
+ let userIds = this.cookieSyncBag.userIdObject;
362
296
  if (userIds.hasOwnProperty('pubcid.org')) {
363
- extObj[whitelabelBidder].pubcid = userIds['pubcid.org'];
297
+ extObj[bidderKey].pubcid = userIds['pubcid.org'];
364
298
  }
365
299
  }
366
- extObj[whitelabelBidder].pv = this.getPageId(); // attach the page ID that will be common to all auction calls for this page if refresh() is called
367
- let ozOmpFloorDollars = this.getWhitelabelConfigItem('ozone.oz_omp_floor'); // valid only if a dollar value (typeof == 'number')
368
- logInfo(`${whitelabelPrefix}_omp_floor dollar value = `, ozOmpFloorDollars);
300
+ extObj[bidderKey].pv = this.getPageId();
301
+ let ozOmpFloorDollars = config.getConfig('ozone.oz_omp_floor');
302
+ logInfo(`${prefix}_omp_floor dollar value = `, ozOmpFloorDollars);
369
303
  if (typeof ozOmpFloorDollars === 'number') {
370
- extObj[whitelabelBidder][`${whitelabelPrefix}_omp_floor`] = ozOmpFloorDollars;
304
+ extObj[bidderKey][`${prefix}_omp_floor`] = ozOmpFloorDollars;
371
305
  } else if (typeof ozOmpFloorDollars !== 'undefined') {
372
- logError(`IF set, ${whitelabelPrefix}_omp_floor must be a number eg. 1.55. Found:` + (typeof ozOmpFloorDollars));
306
+ logError(`IF set, ${prefix}_omp_floor must be a number eg. 1.55. Found:` + (typeof ozOmpFloorDollars));
373
307
  }
374
- let ozWhitelistAdserverKeys = this.getWhitelabelConfigItem('ozone.oz_whitelist_adserver_keys');
308
+ let ozWhitelistAdserverKeys = config.getConfig('ozone.oz_whitelist_adserver_keys');
375
309
  let useOzWhitelistAdserverKeys = isArray(ozWhitelistAdserverKeys) && ozWhitelistAdserverKeys.length > 0;
376
- extObj[whitelabelBidder][whitelabelPrefix + '_kvp_rw'] = useOzWhitelistAdserverKeys ? 1 : 0;
377
- if (whitelabelBidder !== 'ozone') {
378
- logInfo('setting aliases object');
379
- extObj.prebid = {aliases: {'ozone': whitelabelBidder}};
310
+ extObj[bidderKey][prefix + '_kvp_rw'] = useOzWhitelistAdserverKeys ? 1 : 0;
311
+ const endpointOverride = config.getConfig('ozone.endpointOverride');
312
+ if (endpointOverride?.origin || endpointOverride?.auctionUrl) {
313
+ extObj[bidderKey].origin = endpointOverride.auctionUrl || endpointOverride.origin;
380
314
  }
381
- if (this.propertyBag.endpointOverride != null) { extObj[whitelabelBidder]['origin'] = this.propertyBag.endpointOverride; }
382
- let userExtEids = deepAccess(validBidRequests, '0.userIdAsEids', []); // generate the UserIDs in the correct format for UserId module
315
+ let userExtEids = deepAccess(validBidRequests, '0.userIdAsEids', []);
383
316
  ozoneRequest.site = {
384
317
  'publisher': {'id': htmlParams.publisherId},
385
318
  'page': getRefererInfo().page,
@@ -408,27 +341,28 @@ export const spec = {
408
341
  deepSetValue(ozoneRequest, 'regs.gpp', bidderRequest.ortb2.regs.gpp);
409
342
  deepSetValue(ozoneRequest, 'regs.gpp_sid', bidderRequest.ortb2.regs.gpp_sid);
410
343
  }
411
- if (schain) { // we set this while iterating over the bids
344
+ if (schain) {
412
345
  logInfo('schain found');
413
346
  deepSetValue(ozoneRequest, 'source.ext.schain', schain);
414
347
  }
415
348
  if (config.getConfig('coppa') === true) {
416
349
  deepSetValue(ozoneRequest, 'regs.coppa', 1);
417
350
  }
418
- extObj[whitelabelBidder].cookieDeprecationLabel = deepAccess(bidderRequest, 'ortb2.device.ext.cdep', 'none');
419
- logInfo(`cookieDeprecationLabel ortb2.device.ext.cdep = ${extObj[whitelabelBidder].cookieDeprecationLabel}`);
420
- let batchRequestsVal = this.getBatchRequests(); // false|numeric
351
+ extObj[bidderKey].cookieDeprecationLabel = deepAccess(bidderRequest, 'ortb2.device.ext.cdep', 'none');
352
+ logInfo(`cookieDeprecationLabel ortb2.device.ext.cdep = ${extObj[bidderKey].cookieDeprecationLabel}`);
353
+ let batchRequestsVal = this.getBatchRequests();
421
354
  if (typeof batchRequestsVal === 'number') {
422
355
  logInfo(`Batching = ${batchRequestsVal}`);
423
- let arrRet = []; // return an array of objects containing data describing max 10 bids
356
+ let arrRet = [];
424
357
  for (let i = 0; i < tosendtags.length; i += batchRequestsVal) {
425
- ozoneRequest.id = generateUUID(); // Unique ID of the bid request, provided by the exchange. (REQUIRED)
358
+ ozoneRequest.id = generateUUID();
426
359
  deepSetValue(ozoneRequest, 'user.ext.eids', userExtEids);
427
360
  if (auctionId) {
428
361
  deepSetValue(ozoneRequest, 'source.tid', auctionId);
429
362
  }
430
363
  ozoneRequest.imp = tosendtags.slice(i, i + batchRequestsVal);
431
364
  ozoneRequest.ext = extObj;
365
+ toOrtb25(ozoneRequest);
432
366
  if (ozoneRequest.imp.length > 0) {
433
367
  arrRet.push({
434
368
  method: 'POST',
@@ -443,9 +377,10 @@ export const spec = {
443
377
  }
444
378
  if (singleRequest) {
445
379
  logInfo('single request starting');
446
- ozoneRequest.id = generateUUID(); // Unique ID of the bid request, provided by the exchange. (REQUIRED)
380
+ ozoneRequest.id = generateUUID();
447
381
  ozoneRequest.imp = tosendtags;
448
382
  ozoneRequest.ext = extObj;
383
+ toOrtb25(ozoneRequest);
449
384
  deepSetValue(ozoneRequest, 'user.ext.eids', userExtEids);
450
385
  if (auctionId) {
451
386
  deepSetValue(ozoneRequest, 'source.tid', auctionId);
@@ -463,13 +398,14 @@ export const spec = {
463
398
  let arrRet = tosendtags.map(imp => {
464
399
  logInfo('non-single response, working on imp : ', imp);
465
400
  let ozoneRequestSingle = Object.assign({}, ozoneRequest);
466
- ozoneRequestSingle.id = generateUUID(); // Unique ID of the bid request, provided by the exchange. (REQUIRED)
401
+ ozoneRequestSingle.id = generateUUID();
467
402
  ozoneRequestSingle.imp = [imp];
468
403
  ozoneRequestSingle.ext = extObj;
469
404
  deepSetValue(ozoneRequestSingle, 'user.ext.eids', userExtEids);
470
405
  if (auctionId) {
471
406
  deepSetValue(ozoneRequestSingle, 'source.tid', auctionId);
472
407
  }
408
+ toOrtb25(ozoneRequestSingle);
473
409
  return {
474
410
  method: 'POST',
475
411
  url: this.getAuctionUrl(),
@@ -502,14 +438,13 @@ export const spec = {
502
438
  return ret;
503
439
  },
504
440
  interpretResponse(serverResponse, request) {
505
- if (request && request.bidderRequest && request.bidderRequest.bids) { this.loadWhitelabelData(request.bidderRequest.bids[0]); }
506
441
  let startTime = new Date().getTime();
507
- let whitelabelBidder = this.propertyBag.whitelabel.bidder; // by default = ozone
508
- let whitelabelPrefix = this.propertyBag.whitelabel.keyPrefix;
442
+ const bidderKey = BIDDER_CODE;
443
+ const prefix = KEY_PREFIX;
509
444
  logInfo(`interpretResponse time: ${startTime} . Time between buildRequests done and interpretResponse start was ${startTime - this.propertyBag.buildRequestsEnd}ms`);
510
445
  logInfo(`serverResponse, request`, deepClone(serverResponse), deepClone(request));
511
446
  serverResponse = serverResponse.body || {};
512
- let aucId = serverResponse.id; // this will be correct for single requests and non-single
447
+ let aucId = serverResponse.id;
513
448
  if (!serverResponse.hasOwnProperty('seatbid')) {
514
449
  return [];
515
450
  }
@@ -518,17 +453,17 @@ export const spec = {
518
453
  }
519
454
  let arrAllBids = [];
520
455
  let labels;
521
- let enhancedAdserverTargeting = this.getWhitelabelConfigItem('ozone.enhancedAdserverTargeting');
456
+ let enhancedAdserverTargeting = config.getConfig('ozone.enhancedAdserverTargeting');
522
457
  logInfo('enhancedAdserverTargeting', enhancedAdserverTargeting);
523
458
  if (typeof enhancedAdserverTargeting == 'undefined') {
524
459
  enhancedAdserverTargeting = true;
525
460
  }
526
461
  logInfo('enhancedAdserverTargeting', enhancedAdserverTargeting);
527
- serverResponse.seatbid = injectAdIdsIntoAllBidResponses(serverResponse.seatbid); // we now make sure that each bid in the bidresponse has a unique (within page) adId attribute.
462
+ serverResponse.seatbid = injectAdIdsIntoAllBidResponses(serverResponse.seatbid);
528
463
  serverResponse.seatbid = this.removeSingleBidderMultipleBids(serverResponse.seatbid);
529
- let ozOmpFloorDollars = this.getWhitelabelConfigItem('ozone.oz_omp_floor'); // valid only if a dollar value (typeof == 'number')
464
+ let ozOmpFloorDollars = config.getConfig('ozone.oz_omp_floor');
530
465
  let addOzOmpFloorDollars = typeof ozOmpFloorDollars === 'number';
531
- let ozWhitelistAdserverKeys = this.getWhitelabelConfigItem('ozone.oz_whitelist_adserver_keys');
466
+ let ozWhitelistAdserverKeys = config.getConfig('ozone.oz_whitelist_adserver_keys');
532
467
  let useOzWhitelistAdserverKeys = isArray(ozWhitelistAdserverKeys) && ozWhitelistAdserverKeys.length > 0;
533
468
  for (let i = 0; i < serverResponse.seatbid.length; i++) {
534
469
  let sb = serverResponse.seatbid[i];
@@ -546,7 +481,7 @@ export const spec = {
546
481
  if (bidType === VIDEO) {
547
482
  isVideo = true;
548
483
  this.setBidMediaTypeIfNotExist(thisBid, VIDEO);
549
- videoContext = this.getVideoContextForBidId(thisBid.bidId, request.bidderRequest.bids); // should be instream or outstream (or null if error)
484
+ videoContext = this.getVideoContextForBidId(thisBid.bidId, request.bidderRequest.bids);
550
485
  if (videoContext === 'outstream') {
551
486
  logInfo('setting thisBid.mediaType = VIDEO & attach a renderer to OUTSTREAM video');
552
487
  thisBid.renderer = newRenderer(thisBid.bidId);
@@ -554,7 +489,7 @@ export const spec = {
554
489
  thisBid.vastXml = thisBid.adm;
555
490
  } else {
556
491
  logInfo('not an outstream video (presumably instream), will set thisBid.mediaType = VIDEO and thisBid.vastUrl and not attach a renderer');
557
- thisBid.vastUrl = `https://${deepAccess(thisBid, 'ext.prebid.targeting.hb_cache_host', 'missing_host')}${deepAccess(thisBid, 'ext.prebid.targeting.hb_cache_path', 'missing_path')}?uuid=${deepAccess(thisBid, 'ext.prebid.targeting.hb_uuid', 'missing_uuid')}`; // need to see if this works ok for ozone
492
+ thisBid.vastUrl = `https://${deepAccess(thisBid, 'ext.prebid.targeting.hb_cache_host', 'missing_host')}${deepAccess(thisBid, 'ext.prebid.targeting.hb_cache_path', 'missing_path')}?uuid=${deepAccess(thisBid, 'ext.prebid.targeting.hb_uuid', 'missing_uuid')}`;
558
493
  if (!thisBid.hasOwnProperty('videoCacheKey')) {
559
494
  let videoCacheUuid = deepAccess(thisBid, 'ext.prebid.targeting.hb_uuid', 'no_hb_uuid');
560
495
  logInfo(`Adding videoCacheKey: ${videoCacheUuid}`);
@@ -570,41 +505,41 @@ export const spec = {
570
505
  if (enhancedAdserverTargeting) {
571
506
  let allBidsForThisBidid = ozoneGetAllBidsForBidId(thisBid.bidId, serverResponse.seatbid, defaultWidth, defaultHeight);
572
507
  logInfo('Going to iterate allBidsForThisBidId', deepClone(allBidsForThisBidid));
573
- Object.keys(allBidsForThisBidid).forEach((bidderName, index, ar2) => {
574
- logInfo(`adding adserverTargeting for ${bidderName} for bidId ${thisBid.bidId}`);
575
- adserverTargeting[whitelabelPrefix + '_' + bidderName] = bidderName;
576
- adserverTargeting[whitelabelPrefix + '_' + bidderName + '_crid'] = String(allBidsForThisBidid[bidderName].crid);
577
- adserverTargeting[whitelabelPrefix + '_' + bidderName + '_adv'] = String(allBidsForThisBidid[bidderName].adomain);
578
- adserverTargeting[whitelabelPrefix + '_' + bidderName + '_adId'] = String(allBidsForThisBidid[bidderName].adId);
579
- adserverTargeting[whitelabelPrefix + '_' + bidderName + '_pb_r'] = getRoundedBid(allBidsForThisBidid[bidderName].price, allBidsForThisBidid[bidderName].ext.prebid.type);
580
- adserverTargeting[whitelabelPrefix + '_' + bidderName + '_size'] = String(allBidsForThisBidid[bidderName].width) + 'x' + String(allBidsForThisBidid[bidderName].height);
581
- if (allBidsForThisBidid[bidderName].hasOwnProperty('dealid')) {
582
- adserverTargeting[whitelabelPrefix + '_' + bidderName + '_dealid'] = String(allBidsForThisBidid[bidderName].dealid);
508
+ Object.keys(allBidsForThisBidid).forEach((seat, index, ar2) => {
509
+ logInfo(`adding adserverTargeting for ${seat} for bidId ${thisBid.bidId}`);
510
+ adserverTargeting[prefix + '_' + seat] = seat;
511
+ adserverTargeting[prefix + '_' + seat + '_crid'] = String(allBidsForThisBidid[seat].crid);
512
+ adserverTargeting[prefix + '_' + seat + '_adv'] = String(allBidsForThisBidid[seat].adomain);
513
+ adserverTargeting[prefix + '_' + seat + '_adId'] = String(allBidsForThisBidid[seat].adId);
514
+ adserverTargeting[prefix + '_' + seat + '_pb_r'] = getRoundedBid(allBidsForThisBidid[seat].price, allBidsForThisBidid[seat].ext.prebid.type);
515
+ adserverTargeting[prefix + '_' + seat + '_size'] = String(allBidsForThisBidid[seat].width) + 'x' + String(allBidsForThisBidid[seat].height);
516
+ if (allBidsForThisBidid[seat].hasOwnProperty('dealid')) {
517
+ adserverTargeting[prefix + '_' + seat + '_dealid'] = String(allBidsForThisBidid[seat].dealid);
583
518
  }
584
519
  if (addOzOmpFloorDollars) {
585
- adserverTargeting[whitelabelPrefix + '_' + bidderName + '_omp'] = allBidsForThisBidid[bidderName].price >= ozOmpFloorDollars ? '1' : '0';
520
+ adserverTargeting[prefix + '_' + seat + '_omp'] = allBidsForThisBidid[seat].price >= ozOmpFloorDollars ? '1' : '0';
586
521
  }
587
522
  if (isVideo) {
588
- adserverTargeting[whitelabelPrefix + '_' + bidderName + '_vid'] = videoContext; // outstream or instream
523
+ adserverTargeting[prefix + '_' + seat + '_vid'] = videoContext;
589
524
  }
590
- let flr = deepAccess(allBidsForThisBidid[bidderName], `ext.bidder.${whitelabelBidder}.floor`, null);
525
+ let flr = deepAccess(allBidsForThisBidid[seat], `ext.bidder.${bidderKey}.floor`, null);
591
526
  if (flr != null) {
592
- adserverTargeting[whitelabelPrefix + '_' + bidderName + '_flr'] = flr;
527
+ adserverTargeting[prefix + '_' + seat + '_flr'] = flr;
593
528
  }
594
- let rid = deepAccess(allBidsForThisBidid[bidderName], `ext.bidder.${whitelabelBidder}.ruleId`, null);
529
+ let rid = deepAccess(allBidsForThisBidid[seat], `ext.bidder.${bidderKey}.ruleId`, null);
595
530
  if (rid != null) {
596
- adserverTargeting[whitelabelPrefix + '_' + bidderName + '_rid'] = rid;
531
+ adserverTargeting[prefix + '_' + seat + '_rid'] = rid;
597
532
  }
598
- if (bidderName.match(/^ozappnexus/)) {
599
- adserverTargeting[whitelabelPrefix + '_' + bidderName + '_sid'] = String(allBidsForThisBidid[bidderName].cid);
533
+ if (seat.match(/^ozappnexus/)) {
534
+ adserverTargeting[prefix + '_' + seat + '_sid'] = String(allBidsForThisBidid[seat].cid);
600
535
  }
601
- labels = deepAccess(allBidsForThisBidid[bidderName], 'ext.prebid.labels', null);
536
+ labels = deepAccess(allBidsForThisBidid[seat], 'ext.prebid.labels', null);
602
537
  if (labels) {
603
- adserverTargeting[whitelabelPrefix + '_' + bidderName + '_labels'] = labels.join(',');
538
+ adserverTargeting[prefix + '_' + seat + '_labels'] = labels.join(',');
604
539
  }
605
540
  });
606
541
  } else {
607
- let perBidInfo = `${whitelabelBidder}.enhancedAdserverTargeting is set to false. No per-bid keys will be sent to adserver.`;
542
+ let perBidInfo = `${bidderKey}.enhancedAdserverTargeting is set to false. No per-bid keys will be sent to adserver.`;
608
543
  if (useOzWhitelistAdserverKeys) {
609
544
  logWarn(`Your adserver keys whitelist will be ignored - ${perBidInfo}`);
610
545
  } else {
@@ -613,24 +548,24 @@ export const spec = {
613
548
  }
614
549
  let {seat: winningSeat, bid: winningBid} = ozoneGetWinnerForRequestBid(thisBid.bidId, serverResponse.seatbid);
615
550
  winningBid = ozoneAddStandardProperties(winningBid, defaultWidth, defaultHeight);
616
- adserverTargeting[whitelabelPrefix + '_auc_id'] = String(aucId); // was request.bidderRequest.auctionId
617
- adserverTargeting[whitelabelPrefix + '_winner'] = String(winningSeat);
618
- adserverTargeting[whitelabelPrefix + '_bid'] = 'true';
619
- adserverTargeting[whitelabelPrefix + '_cache_id'] = deepAccess(thisBid, 'ext.prebid.targeting.hb_cache_id', 'no-id');
620
- adserverTargeting[whitelabelPrefix + '_uuid'] = deepAccess(thisBid, 'ext.prebid.targeting.hb_uuid', 'no-id');
551
+ adserverTargeting[prefix + '_auc_id'] = String(aucId);
552
+ adserverTargeting[prefix + '_winner'] = String(winningSeat);
553
+ adserverTargeting[prefix + '_bid'] = 'true';
554
+ adserverTargeting[prefix + '_cache_id'] = deepAccess(thisBid, 'ext.prebid.targeting.hb_cache_id', 'no-id');
555
+ adserverTargeting[prefix + '_uuid'] = deepAccess(thisBid, 'ext.prebid.targeting.hb_uuid', 'no-id');
621
556
  if (enhancedAdserverTargeting) {
622
557
  labels = deepAccess(winningBid, 'ext.prebid.labels', null);
623
558
  if (labels) {
624
- adserverTargeting[whitelabelPrefix + '_labels'] = labels.join(',');
559
+ adserverTargeting[prefix + '_labels'] = labels.join(',');
625
560
  }
626
- adserverTargeting[whitelabelPrefix + '_imp_id'] = String(winningBid.impid);
627
- adserverTargeting[whitelabelPrefix + '_pb_v'] = OZONEVERSION;
628
- adserverTargeting[whitelabelPrefix + '_pb'] = winningBid.price;
629
- adserverTargeting[whitelabelPrefix + '_pb_r'] = getRoundedBid(winningBid.price, bidType);
630
- adserverTargeting[whitelabelPrefix + '_adId'] = String(winningBid.adId);
631
- adserverTargeting[whitelabelPrefix + '_size'] = `${winningBid.width}x${winningBid.height}`;
561
+ adserverTargeting[prefix + '_imp_id'] = String(winningBid.impid);
562
+ adserverTargeting[prefix + '_pb_v'] = OZONEVERSION;
563
+ adserverTargeting[prefix + '_pb'] = winningBid.price;
564
+ adserverTargeting[prefix + '_pb_r'] = getRoundedBid(winningBid.price, bidType);
565
+ adserverTargeting[prefix + '_adId'] = String(winningBid.adId);
566
+ adserverTargeting[prefix + '_size'] = `${winningBid.width}x${winningBid.height}`;
632
567
  }
633
- if (useOzWhitelistAdserverKeys) { // delete any un-whitelisted keys
568
+ if (useOzWhitelistAdserverKeys) {
634
569
  logInfo('Filtering out adserver targeting keys not in the whitelist: ', ozWhitelistAdserverKeys);
635
570
  Object.keys(adserverTargeting).forEach(function(key) { if (ozWhitelistAdserverKeys.indexOf(key) === -1) { delete adserverTargeting[key]; } });
636
571
  }
@@ -639,11 +574,11 @@ export const spec = {
639
574
  }
640
575
  }
641
576
  let ret = arrAllBids;
642
- let fledgeAuctionConfigs = deepAccess(serverResponse, 'ext.igi') || []; // 20240606 standardising
577
+ let fledgeAuctionConfigs = deepAccess(serverResponse, 'ext.igi') || [];
643
578
  if (isArray(fledgeAuctionConfigs) && fledgeAuctionConfigs.length > 0) {
644
- fledgeAuctionConfigs = fledgeAuctionConfigs.filter(config => {
645
- if (!this.isValidAuctionConfig(config)) {
646
- logWarn('Removing malformed fledge auction config:', config);
579
+ fledgeAuctionConfigs = fledgeAuctionConfigs.filter(cfg => {
580
+ if (typeof cfg !== 'object' || cfg === null) {
581
+ logWarn('Removing malformed fledge auction config:', cfg);
647
582
  return false;
648
583
  }
649
584
  return true;
@@ -655,12 +590,9 @@ export const spec = {
655
590
  }
656
591
  let endTime = new Date().getTime();
657
592
  logInfo(`interpretResponse going to return at time ${endTime} (took ${endTime - startTime}ms) Time from buildRequests Start -> interpretRequests End = ${endTime - this.propertyBag.buildRequestsStart}ms`);
658
- logInfo('will return: ', deepClone(ret)); // this is ok to log because the renderer has not been attached yet
593
+ logInfo('will return: ', deepClone(ret));
659
594
  return ret;
660
595
  },
661
- isValidAuctionConfig(config) {
662
- return typeof config === 'object' && config !== null;
663
- },
664
596
  setBidMediaTypeIfNotExist(thisBid, mediaType) {
665
597
  if (!thisBid.hasOwnProperty('mediaType')) {
666
598
  logInfo(`setting thisBid.mediaType = ${mediaType}`);
@@ -669,12 +601,6 @@ export const spec = {
669
601
  logInfo(`found value for thisBid.mediaType: ${thisBid.mediaType}`);
670
602
  }
671
603
  },
672
- getWhitelabelConfigItem(ozoneVersion) {
673
- if (this.propertyBag.whitelabel.bidder === 'ozone') { return config.getConfig(ozoneVersion); }
674
- let whitelabelledSearch = ozoneVersion.replace('ozone', this.propertyBag.whitelabel.bidder);
675
- whitelabelledSearch = whitelabelledSearch.replace('oz_', this.propertyBag.whitelabel.keyPrefix + '_');
676
- return config.getConfig(whitelabelledSearch);
677
- },
678
604
  removeSingleBidderMultipleBids(seatbid) {
679
605
  var ret = [];
680
606
  for (let i = 0; i < seatbid.length; i++) {
@@ -683,8 +609,8 @@ export const spec = {
683
609
  var bidIds = [];
684
610
  for (let j = 0; j < sb.bid.length; j++) {
685
611
  var candidate = sb.bid[j];
686
- if (contains(bidIds, candidate.impid)) {
687
- continue; // we've already fully assessed this impid, found the highest bid from this seat for it
612
+ if (bidIds.includes(candidate.impid)) {
613
+ continue;
688
614
  }
689
615
  bidIds.push(candidate.impid);
690
616
  for (let k = j + 1; k < sb.bid.length; k++) {
@@ -705,7 +631,7 @@ export const spec = {
705
631
  }
706
632
  let { gppString = '', applicableSections = [] } = gppConsent;
707
633
  if (optionsType.iframeEnabled) {
708
- var arrQueryString = [];
634
+ let arrQueryString = [];
709
635
  if (config.getConfig('debug')) {
710
636
  arrQueryString.push('pbjs_debug=true');
711
637
  }
@@ -713,30 +639,27 @@ export const spec = {
713
639
  arrQueryString.push('gdpr_consent=' + deepAccess(gdprConsent, 'consentString', ''));
714
640
  arrQueryString.push('usp_consent=' + (usPrivacy || ''));
715
641
  arrQueryString.push('gpp=' + gppString);
716
- if (isArray(applicableSections)) {
642
+ if (Array.isArray(applicableSections)) {
717
643
  arrQueryString.push(`gpp_sid=${applicableSections.join()}`);
718
644
  }
719
- for (let keyname in this.cookieSyncBag.userIdObject) {
645
+ for (const keyname in this.cookieSyncBag.userIdObject) {
720
646
  arrQueryString.push(keyname + '=' + this.cookieSyncBag.userIdObject[keyname]);
721
647
  }
722
648
  arrQueryString.push('publisherId=' + this.cookieSyncBag.publisherId);
723
649
  arrQueryString.push('siteId=' + this.cookieSyncBag.siteId);
724
650
  arrQueryString.push('cb=' + Date.now());
725
- arrQueryString.push('bidder=' + this.propertyBag.whitelabel.bidder);
726
- var strQueryString = arrQueryString.join('&');
651
+ arrQueryString.push('bidder=' + BIDDER_CODE);
652
+ let strQueryString = arrQueryString.join('&');
727
653
  if (strQueryString.length > 0) {
728
654
  strQueryString = '?' + strQueryString;
729
655
  }
730
656
  logInfo('getUserSyncs going to return cookie sync url : ' + this.getCookieSyncUrl() + strQueryString);
731
- return [{
732
- type: 'iframe',
733
- url: this.getCookieSyncUrl() + strQueryString
734
- }];
657
+ return [{ type: 'iframe', url: this.getCookieSyncUrl() + strQueryString }];
735
658
  }
736
659
  },
737
660
  getBidRequestForBidId(bidId, arrBids) {
738
661
  for (let i = 0; i < arrBids.length; i++) {
739
- if (arrBids[i].bidId === bidId) { // bidId in the request comes back as impid in the seatbid bids
662
+ if (arrBids[i].bidId === bidId) {
740
663
  return arrBids[i];
741
664
  }
742
665
  }
@@ -753,20 +676,20 @@ export const spec = {
753
676
  let ret = {};
754
677
  if (!bidRequest.hasOwnProperty('userIdAsEids')) {
755
678
  logInfo('findAllUserIdsFromEids - no bidRequest.userIdAsEids object was found on the bid!');
756
- this.tryGetPubCidFromOldLocation(ret, bidRequest); // legacy
679
+ this.tryGetPubCidFromOldLocation(ret, bidRequest);
757
680
  return ret;
758
681
  }
759
682
  for (let obj of bidRequest.userIdAsEids) {
760
683
  ret[obj.source] = deepAccess(obj, 'uids.0.id');
761
684
  }
762
- this.tryGetPubCidFromOldLocation(ret, bidRequest); // legacy
685
+ this.tryGetPubCidFromOldLocation(ret, bidRequest);
763
686
  return ret;
764
687
  },
765
688
  tryGetPubCidFromOldLocation(ret, bidRequest) {
766
689
  if (!ret.hasOwnProperty('pubcid')) {
767
690
  let pubcid = deepAccess(bidRequest, 'crumbs.pubcid');
768
691
  if (pubcid) {
769
- ret['pubcid.org'] = pubcid; // if built with old pubCommonId module (use the new eid key)
692
+ ret['pubcid.org'] = pubcid;
770
693
  }
771
694
  }
772
695
  },
@@ -774,14 +697,13 @@ export const spec = {
774
697
  return (bidRequest.params.placementId).toString();
775
698
  },
776
699
  getPlacementIdOverrideFromGetParam() {
777
- let whitelabelPrefix = this.propertyBag.whitelabel.keyPrefix;
778
700
  let arr = this.getGetParametersAsObject();
779
- if (arr.hasOwnProperty(whitelabelPrefix + 'storedrequest')) {
780
- if (this.isValidPlacementId(arr[whitelabelPrefix + 'storedrequest'])) {
781
- logInfo(`using GET ${whitelabelPrefix}storedrequest=` + arr[whitelabelPrefix + 'storedrequest'] + ' to replace placementId');
782
- return arr[whitelabelPrefix + 'storedrequest'];
701
+ if (arr.hasOwnProperty(KEY_PREFIX + 'storedrequest')) {
702
+ if (this.isValidPlacementId(arr[KEY_PREFIX + 'storedrequest'])) {
703
+ logInfo(`using GET ${KEY_PREFIX}storedrequest=` + arr[KEY_PREFIX + 'storedrequest'] + ' to replace placementId');
704
+ return arr[KEY_PREFIX + 'storedrequest'];
783
705
  } else {
784
- logError(`GET ${whitelabelPrefix}storedrequest FAILED VALIDATION - will not use it`);
706
+ logError(`GET ${KEY_PREFIX}storedrequest FAILED VALIDATION - will not use it`);
785
707
  }
786
708
  }
787
709
  return null;
@@ -792,9 +714,9 @@ export const spec = {
792
714
  return parsed.search;
793
715
  },
794
716
  blockTheRequest() {
795
- let ozRequest = this.getWhitelabelConfigItem('ozone.oz_request');
717
+ const ozRequest = config.getConfig('ozone.oz_request');
796
718
  if (ozRequest === false) {
797
- logWarn(`Will not allow the auction : ${this.propertyBag.whitelabel.keyPrefix}_request is set to false`);
719
+ logWarn('Will not allow the auction : oz_request is set to false');
798
720
  return true;
799
721
  }
800
722
  return false;
@@ -840,23 +762,23 @@ export const spec = {
840
762
  return ret;
841
763
  },
842
764
  addVideoDefaults(objRet, videoConfig, childConfig) {
843
- objRet = this._addVideoDefaults(objRet, videoConfig, false);
844
- objRet = this._addVideoDefaults(objRet, childConfig, true); // child config will override parent config
845
- return objRet;
846
- },
847
- _addVideoDefaults(objRet, objConfig, addIfMissing) {
848
- let placementValue = this.getVideoPlacementValue(deepAccess(objConfig, 'context'));
849
- if (placementValue) {
850
- objRet.placement = placementValue;
851
- }
852
- let skippable = deepAccess(objConfig, 'skippable', null);
853
- if (skippable == null) {
854
- if (addIfMissing && !objRet.hasOwnProperty('skip')) {
855
- objRet.skip = 0;
765
+ const apply = (cfg, addIfMissing) => {
766
+ if (!cfg) return;
767
+ const placement = this.getVideoPlacementValue(deepAccess(cfg, 'context'));
768
+ if (placement) {
769
+ objRet.placement = placement;
770
+ }
771
+ const skippable = deepAccess(cfg, 'skippable', null);
772
+ if (skippable == null) {
773
+ if (addIfMissing && !objRet.hasOwnProperty('skip')) {
774
+ objRet.skip = 0;
775
+ }
776
+ } else {
777
+ objRet.skip = skippable ? 1 : 0;
856
778
  }
857
- } else {
858
- objRet.skip = skippable ? 1 : 0;
859
- }
779
+ };
780
+ apply(videoConfig, false);
781
+ apply(childConfig, true);
860
782
  return objRet;
861
783
  },
862
784
  getLoggableBidObject(bid) {
@@ -897,22 +819,11 @@ export function injectAdIdsIntoAllBidResponses(seatbid) {
897
819
  for (let i = 0; i < seatbid.length; i++) {
898
820
  let sb = seatbid[i];
899
821
  for (let j = 0; j < sb.bid.length; j++) {
900
- sb.bid[j]['adId'] = `${sb.bid[j]['impid']}-${i}-${spec.propertyBag.whitelabel.keyPrefix}-${j}`;
822
+ sb.bid[j]['adId'] = `${sb.bid[j]['impid']}-${i}-${KEY_PREFIX}-${j}`;
901
823
  }
902
824
  }
903
825
  return seatbid;
904
826
  }
905
- export function checkDeepArray(Arr) {
906
- if (isArray(Arr)) {
907
- if (isArray(Arr[0])) {
908
- return Arr[0];
909
- } else {
910
- return Arr;
911
- }
912
- } else {
913
- return Arr;
914
- }
915
- }
916
827
  export function defaultSize(thebidObj) {
917
828
  if (!thebidObj) {
918
829
  logInfo('defaultSize received empty bid obj! going to return fixed default size');
@@ -921,11 +832,12 @@ export function defaultSize(thebidObj) {
921
832
  'defaultWidth': 300
922
833
  };
923
834
  }
924
- const {sizes} = thebidObj;
925
- const returnObject = {};
926
- returnObject.defaultWidth = checkDeepArray(sizes)[0];
927
- returnObject.defaultHeight = checkDeepArray(sizes)[1];
928
- return returnObject;
835
+ const sizes = thebidObj.sizes || [];
836
+ const first = Array.isArray(sizes[0]) ? sizes[0] : sizes;
837
+ return {
838
+ defaultWidth: first[0],
839
+ defaultHeight: first[1]
840
+ };
929
841
  }
930
842
  export function ozoneGetWinnerForRequestBid(requestBidId, serverResponseSeatBid) {
931
843
  let thisBidWinner = null;
@@ -952,7 +864,7 @@ export function ozoneGetAllBidsForBidId(matchBidId, serverResponseSeatBid, defau
952
864
  let thisSeat = serverResponseSeatBid[j].seat;
953
865
  for (let k = 0; k < theseBids.length; k++) {
954
866
  if (theseBids[k].impid === matchBidId) {
955
- if (objBids.hasOwnProperty(thisSeat)) { // > 1 bid for an adunit from a bidder - only use the one with the highest bid
867
+ if (objBids.hasOwnProperty(thisSeat)) {
956
868
  if (objBids[thisSeat]['price'] < theseBids[k].price) {
957
869
  objBids[thisSeat] = ozoneAddStandardProperties(theseBids[k], defaultWidth, defaultHeight);
958
870
  }
@@ -966,52 +878,27 @@ export function ozoneGetAllBidsForBidId(matchBidId, serverResponseSeatBid, defau
966
878
  return objBids;
967
879
  }
968
880
  export function getRoundedBid(price, mediaType) {
969
- const mediaTypeGranularity = config.getConfig(`mediaTypePriceGranularity.${mediaType}`); // might be string or object or nothing; if set then this takes precedence over 'priceGranularity'
970
- let objBuckets = config.getConfig('customPriceBucket'); // this is always an object - {} if strBuckets is not 'custom'
971
- let strBuckets = config.getConfig('priceGranularity'); // priceGranularity value, always a string ** if priceGranularity is set to an object then it's always 'custom' **
972
- let theConfigObject = getGranularityObject(mediaType, mediaTypeGranularity, strBuckets, objBuckets);
973
- let theConfigKey = getGranularityKeyName(mediaType, mediaTypeGranularity, strBuckets);
974
- logInfo('getRoundedBid. price:', price, 'mediaType:', mediaType, 'configkey:', theConfigKey, 'configObject:', theConfigObject, 'mediaTypeGranularity:', mediaTypeGranularity, 'strBuckets:', strBuckets);
975
- let priceStringsObj = getPriceBucketString(
976
- price,
977
- theConfigObject,
978
- config.getConfig('currency.granularityMultiplier')
979
- );
980
- logInfo('priceStringsObj', priceStringsObj);
981
- let granularityNamePriceStringsKeyMapping = {
982
- 'medium': 'med',
983
- 'custom': 'custom',
984
- 'high': 'high',
985
- 'low': 'low',
986
- 'dense': 'dense'
987
- };
988
- if (granularityNamePriceStringsKeyMapping.hasOwnProperty(theConfigKey)) {
989
- let priceStringsKey = granularityNamePriceStringsKeyMapping[theConfigKey];
990
- logInfo('getRoundedBid: looking for priceStringsKey:', priceStringsKey);
991
- return priceStringsObj[priceStringsKey];
992
- }
993
- return priceStringsObj['auto'];
994
- }
995
- export function getGranularityKeyName(mediaType, mediaTypeGranularity, strBuckets) {
881
+ const mediaTypeGranularity = config.getConfig(`mediaTypePriceGranularity.${mediaType}`);
882
+ let key = 'auto';
883
+ let buckets = config.getConfig('customPriceBucket');
996
884
  if (typeof mediaTypeGranularity === 'string') {
997
- return mediaTypeGranularity;
998
- }
999
- if (typeof mediaTypeGranularity === 'object') {
1000
- return 'custom';
1001
- }
1002
- if (typeof strBuckets === 'string') {
1003
- return strBuckets;
1004
- }
1005
- return 'auto'; // fall back to a default key - should literally never be needed.
1006
- }
1007
- export function getGranularityObject(mediaType, mediaTypeGranularity, strBuckets, objBuckets) {
1008
- if (typeof mediaTypeGranularity === 'object') {
1009
- return mediaTypeGranularity;
1010
- }
1011
- if (strBuckets === 'custom') {
1012
- return objBuckets;
885
+ key = mediaTypeGranularity;
886
+ } else if (typeof mediaTypeGranularity === 'object') {
887
+ key = 'custom';
888
+ buckets = mediaTypeGranularity;
889
+ } else {
890
+ const strBuckets = config.getConfig('priceGranularity');
891
+ if (typeof strBuckets === 'string') {
892
+ key = strBuckets;
893
+ }
894
+ if (strBuckets === 'custom') {
895
+ key = 'custom';
896
+ }
1013
897
  }
1014
- return '';
898
+ const mapping = {medium: 'med', custom: 'custom', high: 'high', low: 'low', dense: 'dense'};
899
+ const priceStrings = getPriceBucketString(price, buckets, config.getConfig('currency.granularityMultiplier'));
900
+ logInfo('getRoundedBid price:', price, 'mediaType:', mediaType, 'bucketKey:', key);
901
+ return priceStrings[mapping[key] || 'auto'];
1015
902
  }
1016
903
  export function ozoneAddStandardProperties(seatBid, defaultWidth, defaultHeight) {
1017
904
  seatBid.cpm = seatBid.price;
@@ -1045,16 +932,6 @@ export function getWidthAndHeightFromVideoObject(objVideo) {
1045
932
  }
1046
933
  return ({'w': playerSize[0], 'h': playerSize[1]});
1047
934
  }
1048
- export function playerSizeIsNestedArray(objVideo) {
1049
- let playerSize = getPlayerSizeFromObject(objVideo);
1050
- if (!playerSize) {
1051
- return null;
1052
- }
1053
- if (playerSize.length < 1) {
1054
- return null;
1055
- }
1056
- return (playerSize[0] && typeof playerSize[0] === 'object');
1057
- }
1058
935
  function getPlayerSizeFromObject(objVideo) {
1059
936
  logInfo('getPlayerSizeFromObject received object', objVideo);
1060
937
  let playerSize = deepAccess(objVideo, 'playerSize');
@@ -1071,25 +948,26 @@ function getPlayerSizeFromObject(objVideo) {
1071
948
  }
1072
949
  return playerSize;
1073
950
  }
951
+ let rendererInstance;
1074
952
  function newRenderer(adUnitCode, rendererOptions = {}) {
1075
- let isLoaded = window.ozoneVideo;
1076
- logInfo(`newRenderer will set loaded to ${isLoaded ? 'true' : 'false'}`);
1077
- const renderer = Renderer.install({
1078
- url: spec.getRendererUrl(),
1079
- config: rendererOptions,
1080
- loaded: isLoaded,
1081
- adUnitCode
1082
- });
1083
- try {
1084
- renderer.setRender(outstreamRender);
1085
- } catch (err) {
1086
- logError('Prebid Error calling renderer.setRender', renderer, err);
953
+ if (!rendererInstance) {
954
+ rendererInstance = Renderer.install({
955
+ url: spec.getRendererUrl(),
956
+ config: rendererOptions,
957
+ loaded: false,
958
+ adUnitCode
959
+ });
960
+ try {
961
+ rendererInstance.setRender(outstreamRender);
962
+ } catch (err) {
963
+ logError('Prebid Error calling renderer.setRender', rendererInstance, err);
964
+ }
965
+ logInfo('created renderer object');
1087
966
  }
1088
- logInfo('returning renderer object');
1089
- return renderer;
967
+ return rendererInstance;
1090
968
  }
1091
969
  function outstreamRender(bid) {
1092
- logInfo('outstreamRender got', deepClone(spec.getLoggableBidObject(bid)));
970
+ logInfo('outstreamRender got', deepClone(bid));
1093
971
  bid.renderer.push(() => {
1094
972
  logInfo('outstreamRender: Going to execute window.ozoneVideo.outstreamRender');
1095
973
  window.ozoneVideo.outstreamRender(bid);