prebid.js 8.6.0 → 8.7.0

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 (162) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adagioBidAdapter.js +1 -1
  4. package/dist/adbookpspBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/adqueryBidAdapter.js +1 -1
  7. package/dist/adrelevantisBidAdapter.js +1 -1
  8. package/dist/adsinteractiveBidAdapter.js +1 -1
  9. package/dist/adtrgtmeBidAdapter.js +1 -1
  10. package/dist/adxcgBidAdapter.js +1 -1
  11. package/dist/adyoulikeBidAdapter.js +1 -1
  12. package/dist/ajaBidAdapter.js +1 -1
  13. package/dist/alkimiBidAdapter.js +1 -1
  14. package/dist/amxBidAdapter.js +1 -1
  15. package/dist/amxIdSystem.js +1 -1
  16. package/dist/appierAnalyticsAdapter.js +1 -1
  17. package/dist/appnexusBidAdapter.js +1 -1
  18. package/dist/asoBidAdapter.js +1 -1
  19. package/dist/automatadAnalyticsAdapter.js +1 -0
  20. package/dist/axonixBidAdapter.js +1 -1
  21. package/dist/bidglassBidAdapter.js +1 -1
  22. package/dist/big-richmediaBidAdapter.js +1 -1
  23. package/dist/bridBidAdapter.js +1 -1
  24. package/dist/bridgewellBidAdapter.js +1 -1
  25. package/dist/brightMountainMediaBidAdapter.js +1 -1
  26. package/dist/carodaBidAdapter.js +1 -1
  27. package/dist/chtnwBidAdapter.js +1 -1
  28. package/dist/concertBidAdapter.js +1 -1
  29. package/dist/connatixBidAdapter.js +1 -0
  30. package/dist/connectadBidAdapter.js +1 -1
  31. package/dist/consumableBidAdapter.js +1 -1
  32. package/dist/conversantAnalyticsAdapter.js +1 -1
  33. package/dist/conversantBidAdapter.js +1 -1
  34. package/dist/craftBidAdapter.js +1 -1
  35. package/dist/criteoBidAdapter.js +1 -1
  36. package/dist/cwireBidAdapter.js +1 -1
  37. package/dist/dependencies.json +3 -0
  38. package/dist/dspxBidAdapter.js +1 -1
  39. package/dist/eplanningBidAdapter.js +1 -1
  40. package/dist/euidIdSystem.js +1 -1
  41. package/dist/feedadBidAdapter.js +1 -1
  42. package/dist/finativeBidAdapter.js +1 -1
  43. package/dist/freepassBidAdapter.js +1 -1
  44. package/dist/freewheel-sspBidAdapter.js +1 -1
  45. package/dist/gmosspBidAdapter.js +1 -1
  46. package/dist/goldbachBidAdapter.js +1 -1
  47. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  48. package/dist/greenbidsRtdProvider.js +1 -1
  49. package/dist/gridBidAdapter.js +1 -1
  50. package/dist/gumgumBidAdapter.js +1 -1
  51. package/dist/h12mediaBidAdapter.js +1 -1
  52. package/dist/hypelabBidAdapter.js +1 -1
  53. package/dist/id5IdSystem.js +1 -1
  54. package/dist/imdsBidAdapter.js +1 -1
  55. package/dist/improvedigitalBidAdapter.js +1 -1
  56. package/dist/insticatorBidAdapter.js +1 -1
  57. package/dist/ixBidAdapter.js +1 -1
  58. package/dist/justpremiumBidAdapter.js +1 -1
  59. package/dist/kargoBidAdapter.js +1 -1
  60. package/dist/konduitAnalyticsAdapter.js +1 -1
  61. package/dist/kueezBidAdapter.js +1 -1
  62. package/dist/kueezRtbBidAdapter.js +1 -1
  63. package/dist/kulturemediaBidAdapter.js +1 -1
  64. package/dist/lassoBidAdapter.js +1 -1
  65. package/dist/lifestreetBidAdapter.js +1 -1
  66. package/dist/logicadBidAdapter.js +1 -1
  67. package/dist/loglyliftBidAdapter.js +1 -1
  68. package/dist/magniteAnalyticsAdapter.js +1 -1
  69. package/dist/malltvAnalyticsAdapter.js +1 -1
  70. package/dist/marsmediaBidAdapter.js +1 -1
  71. package/dist/mediafuseBidAdapter.js +1 -1
  72. package/dist/medianetBidAdapter.js +1 -1
  73. package/dist/mediasquareBidAdapter.js +1 -1
  74. package/dist/mgidBidAdapter.js +1 -1
  75. package/dist/minutemediaBidAdapter.js +1 -1
  76. package/dist/minutemediaplusBidAdapter.js +1 -1
  77. package/dist/nexx360BidAdapter.js +1 -1
  78. package/dist/not-for-prod/prebid.js +131 -129
  79. package/dist/oguryBidAdapter.js +1 -1
  80. package/dist/onetagBidAdapter.js +1 -1
  81. package/dist/ooloAnalyticsAdapter.js +1 -1
  82. package/dist/optidigitalBidAdapter.js +1 -1
  83. package/dist/outbrainBidAdapter.js +1 -1
  84. package/dist/parrableIdSystem.js +1 -1
  85. package/dist/pixfutureBidAdapter.js +1 -1
  86. package/dist/prebid-core.js +1 -1
  87. package/dist/publinkIdSystem.js +1 -1
  88. package/dist/pubmaticBidAdapter.js +1 -1
  89. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  90. package/dist/pxyzBidAdapter.js +1 -1
  91. package/dist/quantcastBidAdapter.js +1 -1
  92. package/dist/readpeakBidAdapter.js +1 -1
  93. package/dist/relaidoBidAdapter.js +1 -1
  94. package/dist/retailspotBidAdapter.js +1 -1
  95. package/dist/rhythmoneBidAdapter.js +1 -1
  96. package/dist/riseBidAdapter.js +1 -1
  97. package/dist/rubiconBidAdapter.js +1 -1
  98. package/dist/seedingAllianceBidAdapter.js +1 -1
  99. package/dist/seedtagBidAdapter.js +1 -1
  100. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  101. package/dist/sharethroughBidAdapter.js +1 -1
  102. package/dist/shinezBidAdapter.js +1 -1
  103. package/dist/smaatoBidAdapter.js +1 -1
  104. package/dist/smartadserverBidAdapter.js +1 -1
  105. package/dist/smartxBidAdapter.js +1 -1
  106. package/dist/smilewantedBidAdapter.js +1 -1
  107. package/dist/sonobiBidAdapter.js +1 -1
  108. package/dist/sovrnAnalyticsAdapter.js +1 -1
  109. package/dist/sovrnBidAdapter.js +1 -1
  110. package/dist/sspBCBidAdapter.js +1 -1
  111. package/dist/stvBidAdapter.js +1 -1
  112. package/dist/sublimeBidAdapter.js +1 -1
  113. package/dist/tappxBidAdapter.js +1 -1
  114. package/dist/targetVideoBidAdapter.js +1 -1
  115. package/dist/teadsBidAdapter.js +1 -1
  116. package/dist/trionBidAdapter.js +1 -1
  117. package/dist/tripleliftBidAdapter.js +1 -1
  118. package/dist/ttdBidAdapter.js +1 -1
  119. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  120. package/dist/uid2IdSystem.js +1 -1
  121. package/dist/underdogmediaBidAdapter.js +1 -1
  122. package/dist/undertoneBidAdapter.js +1 -1
  123. package/dist/vidazooBidAdapter.js +1 -1
  124. package/dist/videobyteBidAdapter.js +1 -1
  125. package/dist/visxBidAdapter.js +1 -1
  126. package/dist/vuukleBidAdapter.js +1 -1
  127. package/dist/widespaceBidAdapter.js +1 -1
  128. package/dist/winrBidAdapter.js +1 -1
  129. package/dist/yahoosspBidAdapter.js +1 -1
  130. package/dist/yieldmoBidAdapter.js +1 -1
  131. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  132. package/modules/adagioBidAdapter.js +15 -1
  133. package/modules/adgenerationBidAdapter.js +4 -3
  134. package/modules/adsinteractiveBidAdapter.js +2 -0
  135. package/modules/alkimiBidAdapter.js +19 -7
  136. package/modules/automatadAnalyticsAdapter.js +325 -0
  137. package/modules/automatadAnalyticsAdapter.md +23 -0
  138. package/modules/connatixBidAdapter.js +185 -0
  139. package/modules/connatixBidAdapter.md +37 -0
  140. package/modules/criteoBidAdapter.js +7 -7
  141. package/modules/freepassBidAdapter.js +20 -1
  142. package/modules/freepassBidAdapter.md +4 -1
  143. package/modules/gridBidAdapter.js +1 -8
  144. package/modules/medianetBidAdapter.js +7 -4
  145. package/modules/mediasquareBidAdapter.js +3 -0
  146. package/modules/optidigitalBidAdapter.js +25 -16
  147. package/modules/tappxBidAdapter.js +17 -14
  148. package/modules/undertoneBidAdapter.md +1 -1
  149. package/modules/userId/eids.md +7 -0
  150. package/package.json +1 -1
  151. package/test/spec/modules/adagioBidAdapter_spec.js +89 -0
  152. package/test/spec/modules/adgenerationBidAdapter_spec.js +6 -6
  153. package/test/spec/modules/alkimiBidAdapter_spec.js +3 -9
  154. package/test/spec/modules/automatadAnalyticsAdapter_spec.js +533 -0
  155. package/test/spec/modules/connatixBidAdapter_spec.js +366 -0
  156. package/test/spec/modules/criteoBidAdapter_spec.js +21 -0
  157. package/test/spec/modules/freepassBidAdapter_spec.js +44 -0
  158. package/test/spec/modules/gridBidAdapter_spec.js +68 -0
  159. package/test/spec/modules/medianetBidAdapter_spec.js +18 -18
  160. package/test/spec/modules/mediasquareBidAdapter_spec.js +5 -0
  161. package/test/spec/modules/optidigitalBidAdapter_spec.js +9 -2
  162. package/test/spec/modules/tappxBidAdapter_spec.js +19 -0
@@ -28,7 +28,7 @@ export const spec = {
28
28
  buildRequests: function (validBidRequests, bidderRequest) {
29
29
  // convert Native ORTB definition to old-style prebid native definition
30
30
  validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
31
- const ADGENE_PREBID_VERSION = '1.6.1';
31
+ const ADGENE_PREBID_VERSION = '1.6.2';
32
32
  let serverRequests = [];
33
33
  for (let i = 0, len = validBidRequests.length; i < len; i++) {
34
34
  const validReq = validBidRequests[i];
@@ -41,6 +41,7 @@ export const spec = {
41
41
  const imuid = deepAccess(validReq, 'userId.imuid');
42
42
  const gpid = deepAccess(validReq, 'ortb2Imp.ext.gpid');
43
43
  const sua = deepAccess(validReq, 'ortb2.device.sua');
44
+ const uid2 = deepAccess(validReq, 'userId.uid2.id');
44
45
  let data = ``;
45
46
  data = tryAppendQueryString(data, 'posall', 'SSPLOC');
46
47
  const id = getBidIdParameter('id', validReq.params);
@@ -58,8 +59,8 @@ export const spec = {
58
59
  data = tryAppendQueryString(data, 'adgext_id5_id', id5id);
59
60
  data = tryAppendQueryString(data, 'adgext_id5_id_link_type', id5LinkType);
60
61
  data = tryAppendQueryString(data, 'adgext_imuid', imuid);
61
- data = tryAppendQueryString(data, 'adgext_uid2', validReq.userId ? validReq.userId.uid2 : null);
62
- data = tryAppendQueryString(data, 'gpid', gpid || null);
62
+ data = tryAppendQueryString(data, 'adgext_uid2', uid2);
63
+ data = tryAppendQueryString(data, 'gpid', gpid);
63
64
  data = tryAppendQueryString(data, 'uach', sua ? JSON.stringify(sua) : null);
64
65
  data = tryAppendQueryString(data, 'schain', validReq.schain ? JSON.stringify(validReq.schain) : null);
65
66
 
@@ -8,10 +8,12 @@ import { BANNER } from '../src/mediaTypes.js';
8
8
  const ADSINTERACTIVE_CODE = 'adsinteractive';
9
9
  const USER_SYNC_URL_IMAGE = 'https://sync.adsinteractive.com/img';
10
10
  const USER_SYNC_URL_IFRAME = 'https://sync.adsinteractive.com/sync';
11
+ const GVLID = 1212;
11
12
 
12
13
  export const spec = {
13
14
  code: ADSINTERACTIVE_CODE,
14
15
  supportedMediaTypes: [BANNER],
16
+ gvlid: GVLID,
15
17
 
16
18
  isBidRequestValid: (bid) => {
17
19
  return (
@@ -1,5 +1,5 @@
1
1
  import {registerBidder} from '../src/adapters/bidderFactory.js';
2
- import {deepAccess, deepClone} from '../src/utils.js';
2
+ import {deepAccess, deepClone, getDNT, generateUUID} from '../src/utils.js';
3
3
  import {ajax} from '../src/ajax.js';
4
4
  import {VIDEO} from '../src/mediaTypes.js';
5
5
  import {config} from '../src/config.js';
@@ -12,7 +12,7 @@ export const spec = {
12
12
  supportedMediaTypes: ['banner', 'video'],
13
13
 
14
14
  isBidRequestValid: function (bid) {
15
- return !!(bid.params && bid.params.bidFloor && bid.params.token);
15
+ return !!(bid.params && bid.params.token);
16
16
  },
17
17
 
18
18
  buildRequests: function (validBidRequests, bidderRequest) {
@@ -28,12 +28,15 @@ export const spec = {
28
28
 
29
29
  bids.push({
30
30
  token: bidRequest.params.token,
31
- pos: bidRequest.params.pos,
31
+ instl: bidRequest.params.instl,
32
+ exp: bidRequest.params.exp,
32
33
  bidFloor: getBidFloor(bidRequest, formatTypes),
33
34
  sizes: prepareSizes(deepAccess(bidRequest, 'mediaTypes.banner.sizes')),
34
35
  playerSizes: prepareSizes(deepAccess(bidRequest, 'mediaTypes.video.playerSize')),
35
36
  impMediaTypes: formatTypes,
36
- adUnitCode: bidRequest.adUnitCode
37
+ adUnitCode: bidRequest.adUnitCode,
38
+ video: deepAccess(bidRequest, 'mediaTypes.video'),
39
+ banner: deepAccess(bidRequest, 'mediaTypes.banner')
37
40
  })
38
41
  bidIds.push(bidRequest.bidId)
39
42
  })
@@ -41,14 +44,23 @@ export const spec = {
41
44
  const alkimiConfig = config.getConfig('alkimi');
42
45
 
43
46
  let payload = {
44
- // TODO: fix auctionId leak: https://github.com/prebid/Prebid.js/issues/9781
45
- requestId: bidderRequest.auctionId,
47
+ requestId: generateUUID(),
46
48
  signRequest: {bids, randomUUID: alkimiConfig && alkimiConfig.randomUUID},
47
49
  bidIds,
48
50
  referer: bidderRequest.refererInfo.page,
49
51
  signature: alkimiConfig && alkimiConfig.signature,
50
52
  schain: validBidRequests[0].schain,
51
- cpp: config.getConfig('coppa') ? 1 : 0
53
+ cpp: config.getConfig('coppa') ? 1 : 0,
54
+ device: {
55
+ dnt: getDNT() ? 1 : 0,
56
+ w: screen.width,
57
+ h: screen.height
58
+ },
59
+ ortb2: {
60
+ at: bidderRequest.ortb2?.at,
61
+ bcat: bidderRequest.ortb2?.bcat,
62
+ wseat: bidderRequest.ortb2?.wseat
63
+ }
52
64
  }
53
65
 
54
66
  if (bidderRequest && bidderRequest.gdprConsent) {
@@ -0,0 +1,325 @@
1
+ import {
2
+ logError,
3
+ logInfo,
4
+ logMessage
5
+ } from '../src/utils.js';
6
+
7
+ import CONSTANTS from '../src/constants.json';
8
+ import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
9
+ import adapterManager from '../src/adapterManager.js';
10
+ import { config } from '../src/config.js'
11
+
12
+ /** Prebid Event Handlers */
13
+
14
+ const ADAPTER_CODE = 'automatadAnalytics'
15
+ const trialCountMilsMapping = [1500, 3000, 5000, 10000];
16
+
17
+ var isLoggingEnabled; var queuePointer = 0; var retryCount = 0; var timer = null; var __atmtdAnalyticsQueue = [];
18
+
19
+ const prettyLog = (level, text, isGroup = false, cb = () => {}) => {
20
+ if (self.isLoggingEnabled === undefined) {
21
+ if (window.localStorage.getItem('__aggLoggingEnabled')) {
22
+ self.isLoggingEnabled = true
23
+ } else {
24
+ const queryParams = new URLSearchParams(new URL(window.location.href).search)
25
+ self.isLoggingEnabled = queryParams.has('aggLoggingEnabled')
26
+ }
27
+ }
28
+
29
+ if (self.isLoggingEnabled) {
30
+ if (isGroup) {
31
+ logInfo(`ATD Analytics Adapter: ${level.toUpperCase()}: ${text} --- Group Start ---`)
32
+ try {
33
+ cb();
34
+ } catch (error) {
35
+ logError(`ATD Analytics Adapter: ERROR: ${'Error during cb function in prettyLog'}`)
36
+ }
37
+ logInfo(`ATD Analytics Adapter: ${level.toUpperCase()}: ${text} --- Group End ---`)
38
+ } else {
39
+ logInfo(`ATD Analytics Adapter: ${level.toUpperCase()}: ${text}`)
40
+ }
41
+ }
42
+ }
43
+
44
+ const processEvents = () => {
45
+ if (self.retryCount === trialCountMilsMapping.length) {
46
+ self.prettyLog('error', `Aggregator still hasn't loaded. Processing que stopped`, trialCountMilsMapping, self.retryCount)
47
+ return;
48
+ }
49
+
50
+ self.prettyLog('status', `Que has been inactive for a while. Adapter starting to process que now... Trial Count = ${self.retryCount + 1}`)
51
+
52
+ let shouldTryAgain = false
53
+
54
+ while (self.queuePointer < self.__atmtdAnalyticsQueue.length) {
55
+ const eventType = self.__atmtdAnalyticsQueue[self.queuePointer][0]
56
+ const args = self.__atmtdAnalyticsQueue[self.queuePointer][1]
57
+
58
+ try {
59
+ switch (eventType) {
60
+ case CONSTANTS.EVENTS.AUCTION_INIT:
61
+ if (window.atmtdAnalytics && window.atmtdAnalytics.auctionInitHandler) {
62
+ window.atmtdAnalytics.auctionInitHandler(args);
63
+ } else {
64
+ shouldTryAgain = true
65
+ }
66
+ break;
67
+ case CONSTANTS.EVENTS.BID_REQUESTED:
68
+ if (window.atmtdAnalytics && window.atmtdAnalytics.bidRequestedHandler) {
69
+ window.atmtdAnalytics.bidRequestedHandler(args);
70
+ }
71
+ break;
72
+ case CONSTANTS.EVENTS.BID_RESPONSE:
73
+ if (window.atmtdAnalytics && window.atmtdAnalytics.bidResponseHandler) {
74
+ window.atmtdAnalytics.bidResponseHandler(args);
75
+ }
76
+ break;
77
+ case CONSTANTS.EVENTS.BID_REJECTED:
78
+ if (window.atmtdAnalytics && window.atmtdAnalytics.bidRejectedHandler) {
79
+ window.atmtdAnalytics.bidRejectedHandler(args);
80
+ }
81
+ break;
82
+ case CONSTANTS.EVENTS.BIDDER_DONE:
83
+ if (window.atmtdAnalytics && window.atmtdAnalytics.bidderDoneHandler) {
84
+ window.atmtdAnalytics.bidderDoneHandler(args);
85
+ }
86
+ break;
87
+ case CONSTANTS.EVENTS.BID_WON:
88
+ if (window.atmtdAnalytics && window.atmtdAnalytics.bidWonHandler) {
89
+ window.atmtdAnalytics.bidWonHandler(args);
90
+ }
91
+ break;
92
+ case CONSTANTS.EVENTS.NO_BID:
93
+ if (window.atmtdAnalytics && window.atmtdAnalytics.noBidHandler) {
94
+ window.atmtdAnalytics.noBidHandler(args);
95
+ }
96
+ break;
97
+ case CONSTANTS.EVENTS.BID_TIMEOUT:
98
+ if (window.atmtdAnalytics && window.atmtdAnalytics.bidderTimeoutHandler) {
99
+ window.atmtdAnalytics.bidderTimeoutHandler(args);
100
+ }
101
+ break;
102
+ case CONSTANTS.EVENTS.AUCTION_DEBUG:
103
+ if (window.atmtdAnalytics && window.atmtdAnalytics.auctionDebugHandler) {
104
+ window.atmtdAnalytics.auctionDebugHandler(args);
105
+ }
106
+ break;
107
+ case 'slotRenderEnded':
108
+ if (window.atmtdAnalytics && window.atmtdAnalytics.slotRenderEndedGPTHandler) {
109
+ window.atmtdAnalytics.slotRenderEndedGPTHandler(args);
110
+ } else {
111
+ shouldTryAgain = true
112
+ }
113
+ break;
114
+ case 'impressionViewable':
115
+ if (window.atmtdAnalytics && window.atmtdAnalytics.impressionViewableHandler) {
116
+ window.atmtdAnalytics.impressionViewableHandler(args);
117
+ } else {
118
+ shouldTryAgain = true
119
+ }
120
+ break;
121
+ }
122
+
123
+ if (shouldTryAgain) break;
124
+ } catch (error) {
125
+ self.prettyLog('error', `Unhandled Error while processing ${eventType} of ${self.queuePointer}th index in the que. Will not be retrying this raw event ...`, true, () => {
126
+ logError(`The error is `, error)
127
+ })
128
+ }
129
+
130
+ self.queuePointer = self.queuePointer + 1
131
+ }
132
+
133
+ if (shouldTryAgain) {
134
+ if (trialCountMilsMapping[self.retryCount]) self.prettyLog('warn', `Adapter failed to process event as aggregator has not loaded. Retrying in ${trialCountMilsMapping[self.retryCount]}ms ...`);
135
+ setTimeout(self.processEvents, trialCountMilsMapping[self.retryCount])
136
+ self.retryCount = self.retryCount + 1
137
+ }
138
+ }
139
+
140
+ const addGPTHandlers = () => {
141
+ const googletag = window.googletag || {}
142
+ googletag.cmd = googletag.cmd || []
143
+ googletag.cmd.push(() => {
144
+ googletag.pubads().addEventListener('slotRenderEnded', (event) => {
145
+ if (window.atmtdAnalytics && window.atmtdAnalytics.slotRenderEndedGPTHandler) {
146
+ if (window.__atmtdAggregatorFirstAuctionInitialized === true) {
147
+ window.atmtdAnalytics.slotRenderEndedGPTHandler(event)
148
+ return;
149
+ }
150
+ }
151
+ self.__atmtdAnalyticsQueue.push(['slotRenderEnded', event])
152
+ self.prettyLog(`warn`, `Aggregator not initialised at auctionInit, exiting slotRenderEnded handler and pushing to que instead`)
153
+ })
154
+
155
+ googletag.pubads().addEventListener('impressionViewable', (event) => {
156
+ if (window.atmtdAnalytics && window.atmtdAnalytics.impressionViewableHandler) {
157
+ if (window.__atmtdAggregatorFirstAuctionInitialized === true) {
158
+ window.atmtdAnalytics.impressionViewableHandler(event)
159
+ return;
160
+ }
161
+ }
162
+ self.__atmtdAnalyticsQueue.push(['impressionViewable', event])
163
+ self.prettyLog(`warn`, `Aggregator not initialised at auctionInit, exiting impressionViewable handler and pushing to que instead`)
164
+ })
165
+ })
166
+ }
167
+
168
+ const initializeQueue = () => {
169
+ self.__atmtdAnalyticsQueue.push = (args) => {
170
+ Array.prototype.push.apply(self.__atmtdAnalyticsQueue, [args]);
171
+ if (timer) {
172
+ clearTimeout(timer);
173
+ timer = null;
174
+ }
175
+
176
+ if (args[0] === CONSTANTS.EVENTS.AUCTION_INIT) {
177
+ const timeout = parseInt(config.getConfig('bidderTimeout')) + 1500
178
+ timer = setTimeout(() => {
179
+ self.processEvents()
180
+ }, timeout);
181
+ } else {
182
+ timer = setTimeout(() => {
183
+ self.processEvents()
184
+ }, 1500);
185
+ }
186
+ };
187
+ }
188
+
189
+ // ANALYTICS ADAPTER
190
+
191
+ let baseAdapter = adapter({analyticsType: 'bundle'});
192
+ let atmtdAdapter = Object.assign({}, baseAdapter, {
193
+
194
+ disableAnalytics() {
195
+ baseAdapter.disableAnalytics.apply(this, arguments);
196
+ },
197
+
198
+ track({eventType, args}) {
199
+ switch (eventType) {
200
+ case CONSTANTS.EVENTS.AUCTION_INIT:
201
+ if (window.atmtdAnalytics && window.atmtdAnalytics.auctionInitHandler) {
202
+ self.prettyLog('status', 'Aggregator loaded, initialising auction through handlers');
203
+ window.atmtdAnalytics.auctionInitHandler(args);
204
+ } else {
205
+ self.prettyLog('warn', 'Aggregator not loaded, initialising auction through que ...');
206
+ self.__atmtdAnalyticsQueue.push([eventType, args])
207
+ }
208
+ break;
209
+ case CONSTANTS.EVENTS.BID_REQUESTED:
210
+ if (window.atmtdAnalytics && window.atmtdAnalytics.bidRequestedHandler) {
211
+ window.atmtdAnalytics.bidRequestedHandler(args);
212
+ } else {
213
+ self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`);
214
+ self.__atmtdAnalyticsQueue.push([eventType, args])
215
+ }
216
+ break;
217
+ case CONSTANTS.EVENTS.BID_REJECTED:
218
+ if (window.atmtdAnalytics && window.atmtdAnalytics.bidRejectedHandler) {
219
+ window.atmtdAnalytics.bidRejectedHandler(args);
220
+ } else {
221
+ self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`);
222
+ self.__atmtdAnalyticsQueue.push([eventType, args])
223
+ }
224
+ break;
225
+ case CONSTANTS.EVENTS.BID_RESPONSE:
226
+ if (window.atmtdAnalytics && window.atmtdAnalytics.bidResponseHandler) {
227
+ window.atmtdAnalytics.bidResponseHandler(args);
228
+ } else {
229
+ self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`);
230
+ self.__atmtdAnalyticsQueue.push([eventType, args])
231
+ }
232
+ break;
233
+ case CONSTANTS.EVENTS.BIDDER_DONE:
234
+ if (window.atmtdAnalytics && window.atmtdAnalytics.bidderDoneHandler) {
235
+ window.atmtdAnalytics.bidderDoneHandler(args);
236
+ } else {
237
+ self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`);
238
+ self.__atmtdAnalyticsQueue.push([eventType, args])
239
+ }
240
+ break;
241
+ case CONSTANTS.EVENTS.BID_WON:
242
+ if (window.atmtdAnalytics && window.atmtdAnalytics.bidWonHandler) {
243
+ window.atmtdAnalytics.bidWonHandler(args);
244
+ } else {
245
+ self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`);
246
+ self.__atmtdAnalyticsQueue.push([eventType, args])
247
+ }
248
+ break;
249
+ case CONSTANTS.EVENTS.NO_BID:
250
+ if (window.atmtdAnalytics && window.atmtdAnalytics.noBidHandler) {
251
+ window.atmtdAnalytics.noBidHandler(args);
252
+ } else {
253
+ self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`);
254
+ self.__atmtdAnalyticsQueue.push([eventType, args])
255
+ }
256
+ break;
257
+ case CONSTANTS.EVENTS.AUCTION_DEBUG:
258
+ if (window.atmtdAnalytics && window.atmtdAnalytics.auctionDebugHandler) {
259
+ window.atmtdAnalytics.auctionDebugHandler(args);
260
+ } else {
261
+ self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`);
262
+ self.__atmtdAnalyticsQueue.push([eventType, args])
263
+ }
264
+ break;
265
+ case CONSTANTS.EVENTS.BID_TIMEOUT:
266
+ if (window.atmtdAnalytics && window.atmtdAnalytics.bidderTimeoutHandler) {
267
+ window.atmtdAnalytics.bidderTimeoutHandler(args);
268
+ } else {
269
+ self.prettyLog('warn', `Aggregator not loaded, pushing ${eventType} to que instead ...`);
270
+ self.__atmtdAnalyticsQueue.push([eventType, args])
271
+ }
272
+ break;
273
+ }
274
+ }
275
+ });
276
+
277
+ atmtdAdapter.originEnableAnalytics = atmtdAdapter.enableAnalytics
278
+
279
+ atmtdAdapter.enableAnalytics = function (configuration) {
280
+ if ((configuration === undefined && typeof configuration !== 'object') || configuration.options === undefined) {
281
+ logError('A valid configuration must be passed to the Atmtd Analytics Adapter.');
282
+ return;
283
+ }
284
+
285
+ const conf = configuration.options
286
+
287
+ if (conf === undefined || typeof conf !== 'object' || conf.siteID === undefined || conf.publisherID === undefined) {
288
+ logError('A valid publisher ID and siteID must be passed to the Atmtd Analytics Adapter.');
289
+ return;
290
+ }
291
+
292
+ self.initializeQueue()
293
+ self.addGPTHandlers()
294
+
295
+ window.__atmtdSDKConfig = {
296
+ publisherID: conf.publisherID,
297
+ siteID: conf.siteID,
298
+ collectDebugMessages: conf.logDebug ? conf.logDebug : false
299
+ }
300
+
301
+ logMessage(`Automatad Analytics Adapter enabled with sdk config`, window.__atmtdSDKConfig)
302
+
303
+ // eslint-disable-next-line
304
+ atmtdAdapter.originEnableAnalytics(configuration)
305
+ };
306
+
307
+ /// /////////// ADAPTER REGISTRATION //////////////
308
+
309
+ adapterManager.registerAnalyticsAdapter({
310
+ adapter: atmtdAdapter,
311
+ code: ADAPTER_CODE
312
+ });
313
+
314
+ export var self = {
315
+ __atmtdAnalyticsQueue,
316
+ processEvents,
317
+ initializeQueue,
318
+ addGPTHandlers,
319
+ prettyLog,
320
+ queuePointer,
321
+ retryCount,
322
+ isLoggingEnabled
323
+ }
324
+
325
+ export default atmtdAdapter;
@@ -0,0 +1,23 @@
1
+
2
+ # Overview
3
+
4
+ Module Name: Automatad Analytics Adapter
5
+ Module Type: Analytics Adapter
6
+ Maintainer: tech@automatad.com
7
+
8
+ # Description
9
+
10
+ Analytics adapter for automatad.com. Contact tech@automatad.com for information.
11
+
12
+ # Test Parameters
13
+
14
+ ```
15
+ {
16
+ provider: 'automatadAnalytics',
17
+ options: {
18
+ publisherID: 'N8vZLx',
19
+ siteID: 'PXfvBq'
20
+ }
21
+ }
22
+
23
+ ```
@@ -0,0 +1,185 @@
1
+ import {
2
+ registerBidder
3
+ } from '../src/adapters/bidderFactory.js';
4
+
5
+ import {
6
+ deepAccess,
7
+ isFn,
8
+ logError,
9
+ isArray,
10
+ formatQS
11
+ } from '../src/utils.js';
12
+
13
+ import {
14
+ BANNER,
15
+ } from '../src/mediaTypes.js';
16
+
17
+ const BIDDER_CODE = 'connatix';
18
+ const AD_URL = 'https://capi.connatix.com/rtb/hba';
19
+ const DEFAULT_MAX_TTL = '3600';
20
+ const DEFAULT_CURRENCY = 'USD';
21
+
22
+ /*
23
+ * Get the bid floor value from the bid object, either using the getFloor function or by accessing the 'params.bidfloor' property.
24
+ * If the bid floor cannot be determined, return 0 as a fallback value.
25
+ */
26
+ export function getBidFloor(bid) {
27
+ if (!isFn(bid.getFloor)) {
28
+ return deepAccess(bid, 'params.bidfloor', 0);
29
+ }
30
+
31
+ try {
32
+ const bidFloor = bid.getFloor({
33
+ currency: DEFAULT_CURRENCY,
34
+ mediaType: '*',
35
+ size: '*',
36
+ });
37
+ return bidFloor.floor;
38
+ } catch (err) {
39
+ logError(err);
40
+ return 0;
41
+ }
42
+ }
43
+
44
+ export const spec = {
45
+ code: BIDDER_CODE,
46
+ gvlid: 143,
47
+ supportedMediaTypes: [BANNER],
48
+
49
+ /*
50
+ * Validate the bid request.
51
+ * If the request is valid, Connatix is trying to obtain at least one bid.
52
+ * Otherwise, the request to the Connatix server is not made
53
+ */
54
+ isBidRequestValid: (bid = {}) => {
55
+ const bidId = deepAccess(bid, 'bidId');
56
+ const mediaTypes = deepAccess(bid, 'mediaTypes', {});
57
+ const params = deepAccess(bid, 'params', {});
58
+ const bidder = deepAccess(bid, 'bidder');
59
+
60
+ const banner = deepAccess(mediaTypes, BANNER, {});
61
+
62
+ const hasBidId = Boolean(bidId);
63
+ const isValidBidder = (bidder === BIDDER_CODE);
64
+ const isValidSize = (Boolean(banner.sizes) && isArray(mediaTypes[BANNER].sizes) && mediaTypes[BANNER].sizes.length > 0);
65
+ const hasSizes = mediaTypes[BANNER] ? isValidSize : false;
66
+ const hasRequiredBidParams = Boolean(params.placementId);
67
+
68
+ const isValid = isValidBidder && hasBidId && hasSizes && hasRequiredBidParams;
69
+ if (!isValid) {
70
+ logError(`Invalid bid request: isValidBidder: ${isValidBidder} hasBidId: ${hasBidId}, hasSizes: ${hasSizes}, hasRequiredBidParams: ${hasRequiredBidParams}`);
71
+ }
72
+ return isValid;
73
+ },
74
+
75
+ /*
76
+ * Build the request payload by processing valid bid requests and extracting the necessary information.
77
+ * Determine the host and page from the bidderRequest's refferUrl, and include ccpa and gdpr consents.
78
+ * Return an object containing the request method, url, and the constructed payload.
79
+ */
80
+ buildRequests: (validBidRequests = [], bidderRequest = {}) => {
81
+ const bidRequests = validBidRequests.map(bid => {
82
+ const {
83
+ bidId,
84
+ mediaTypes,
85
+ params,
86
+ sizes,
87
+ } = bid;
88
+ return {
89
+ bidId,
90
+ mediaTypes,
91
+ sizes,
92
+ placementId: params.placementId,
93
+ floor: getBidFloor(bid),
94
+ };
95
+ });
96
+
97
+ const requestPayload = {
98
+ ortb2: bidderRequest.ortb2,
99
+ gdprConsent: bidderRequest.gdprConsent,
100
+ uspConsent: bidderRequest.uspConsent,
101
+ refererInfo: bidderRequest.refererInfo,
102
+ bidRequests,
103
+ };
104
+
105
+ return {
106
+ method: 'POST',
107
+ url: AD_URL,
108
+ data: requestPayload
109
+ };
110
+ },
111
+
112
+ /*
113
+ * Interpret the server response and create an array of bid responses by extracting and formatting
114
+ * relevant information such as requestId, cpm, ttl, width, height, creativeId, referrer and ad
115
+ * Returns an array of bid responses by extracting and formatting the server response
116
+ */
117
+ interpretResponse: (serverResponse) => {
118
+ const responseBody = serverResponse.body;
119
+ const bids = responseBody.Bids;
120
+ const playerId = responseBody.PlayerId;
121
+ const customerId = responseBody.CustomerId;
122
+
123
+ if (!isArray(bids) || !playerId || !customerId) {
124
+ return [];
125
+ }
126
+
127
+ return bids.map(bidResponse => ({
128
+ requestId: bidResponse.RequestId,
129
+ cpm: bidResponse.Cpm,
130
+ ttl: bidResponse.Ttl || DEFAULT_MAX_TTL,
131
+ currency: 'USD',
132
+ mediaType: BANNER,
133
+ netRevenue: true,
134
+ width: bidResponse.Width,
135
+ height: bidResponse.Height,
136
+ creativeId: bidResponse.CreativeId,
137
+ referrer: bidResponse.Referrer,
138
+ ad: bidResponse.Ad,
139
+ }));
140
+ },
141
+
142
+ /*
143
+ * Determine the user sync type (either 'iframe' or 'image') based on syncOptions.
144
+ * Construct the sync URL by appending required query parameters such as gdpr, ccpa, and coppa consents.
145
+ * Return an array containing an object with the sync type and the constructed URL.
146
+ */
147
+ getUserSyncs: (syncOptions, serverResponses, gdprConsent, uspConsent, gppConsent) => {
148
+ if (!syncOptions.iframeEnabled) {
149
+ return [];
150
+ }
151
+
152
+ if (!serverResponses || !serverResponses.length) {
153
+ return [];
154
+ }
155
+
156
+ const params = {};
157
+
158
+ if (gdprConsent) {
159
+ if (typeof gdprConsent.gdprApplies === 'boolean') {
160
+ params['gdpr'] = Number(gdprConsent.gdprApplies);
161
+ } else {
162
+ params['gdpr'] = 0;
163
+ }
164
+
165
+ if (typeof gdprConsent.consentString === 'string') {
166
+ params['gdpr_consent'] = encodeURIComponent(gdprConsent.consentString);
167
+ }
168
+ }
169
+
170
+ if (typeof uspConsent === 'string') {
171
+ params['us_privacy'] = encodeURIComponent(uspConsent);
172
+ }
173
+
174
+ const syncUrl = serverResponses[0].body.UserSyncEndpoint;
175
+ const queryParams = Object.keys(params).length > 0 ? formatQS(params) : '';
176
+
177
+ const url = queryParams ? `${syncUrl}?${queryParams}` : syncUrl;
178
+ return [{
179
+ type: 'iframe',
180
+ url
181
+ }];
182
+ }
183
+ };
184
+
185
+ registerBidder(spec);
@@ -0,0 +1,37 @@
1
+
2
+ # Overview
3
+
4
+ ```
5
+ Module Name: Connatix Bidder Adapter
6
+ Module Type: Bidder Adapter
7
+ Maintainer: prebid_integration@connatix.com
8
+ ```
9
+
10
+ # Description
11
+ Connects to Connatix demand source to fetch bids.
12
+ Please use ```connatix``` as the bidder code.
13
+
14
+ # Test Parameters
15
+ ```
16
+ var adUnits = [
17
+ {
18
+ code: '1',
19
+ mediaTypes: {
20
+ banner: {
21
+ sizes: [[640, 480], [320, 180]],
22
+ },
23
+ },
24
+ bids: [
25
+ {
26
+ bidder: 'connatix',
27
+ params: {
28
+ placementId: 'e4984e88-9ff4-45a3-8b9d-33aabcad634e', // required
29
+ bidfloor: 2.5, // optional
30
+ },
31
+ },
32
+ // Add more bidders and their parameters as needed
33
+ ],
34
+ },
35
+ // Define more ad units here if necessary
36
+ ];
37
+ ```
@@ -315,14 +315,14 @@ export const spec = {
315
315
  const id = readFromAllStorages(BUNDLE_COOKIE_NAME);
316
316
  if (id) {
317
317
  deleteFromAllStorages(BUNDLE_COOKIE_NAME);
318
+ ajax('https://privacy.criteo.com/api/privacy/datadeletionrequest',
319
+ null,
320
+ JSON.stringify({ publisherUserId: id }),
321
+ {
322
+ contentType: 'application/json',
323
+ method: 'POST'
324
+ });
318
325
  }
319
- ajax('https://privacy.criteo.com/api/privacy/datadeletionrequest',
320
- null,
321
- JSON.stringify({ publisherUserId: id }),
322
- {
323
- contentType: 'application/json',
324
- method: 'POST'
325
- });
326
326
  }
327
327
  };
328
328