prebid.js 7.3.0 → 7.6.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 (225) hide show
  1. package/.circleci/config.yml +11 -6
  2. package/dist/33acrossBidAdapter.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/adnuntiusBidAdapter.js +1 -1
  7. package/dist/adotBidAdapter.js +1 -1
  8. package/dist/adpod.js +1 -1
  9. package/dist/adrelevantisBidAdapter.js +1 -1
  10. package/dist/adrinoBidAdapter.js +1 -1
  11. package/dist/adtelligentBidAdapter.js +1 -1
  12. package/dist/adxcgBidAdapter.js +1 -1
  13. package/dist/ajaBidAdapter.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/atsAnalyticsAdapter.js +1 -1
  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/bridgewellBidAdapter.js +1 -1
  24. package/dist/brightMountainMediaBidAdapter.js +1 -1
  25. package/dist/byDataAnalyticsAdapter.js +1 -1
  26. package/dist/concertBidAdapter.js +1 -1
  27. package/dist/connectadBidAdapter.js +1 -1
  28. package/dist/consumableBidAdapter.js +1 -1
  29. package/dist/conversantBidAdapter.js +1 -1
  30. package/dist/craftBidAdapter.js +1 -1
  31. package/dist/criteoBidAdapter.js +1 -1
  32. package/dist/debugging-standalone.js +1 -1
  33. package/dist/debugging.js +1 -1
  34. package/dist/dspxBidAdapter.js +1 -1
  35. package/dist/eplanningBidAdapter.js +1 -1
  36. package/dist/finativeBidAdapter.js +1 -1
  37. package/dist/gdprEnforcement.js +1 -1
  38. package/dist/glimpseBidAdapter.js +1 -1
  39. package/dist/gmosspBidAdapter.js +1 -1
  40. package/dist/goldbachBidAdapter.js +1 -1
  41. package/dist/gridBidAdapter.js +1 -1
  42. package/dist/gridNMBidAdapter.js +1 -1
  43. package/dist/gumgumBidAdapter.js +1 -1
  44. package/dist/h12mediaBidAdapter.js +1 -1
  45. package/dist/hadronIdSystem.js +1 -1
  46. package/dist/hadronRtdProvider.js +1 -1
  47. package/dist/id5IdSystem.js +1 -1
  48. package/dist/imRtdProvider.js +1 -1
  49. package/dist/improvedigitalBidAdapter.js +1 -1
  50. package/dist/inmarBidAdapter.js +1 -1
  51. package/dist/insticatorBidAdapter.js +1 -1
  52. package/dist/ixBidAdapter.js +1 -1
  53. package/dist/justpremiumBidAdapter.js +1 -1
  54. package/dist/kargoAnalyticsAdapter.js +1 -1
  55. package/dist/kargoBidAdapter.js +1 -1
  56. package/dist/konduitAnalyticsAdapter.js +1 -1
  57. package/dist/kueezBidAdapter.js +1 -1
  58. package/dist/lassoBidAdapter.js +1 -1
  59. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  60. package/dist/logicadBidAdapter.js +1 -1
  61. package/dist/loglyliftBidAdapter.js +1 -1
  62. package/dist/malltvAnalyticsAdapter.js +1 -1
  63. package/dist/marsmediaBidAdapter.js +1 -1
  64. package/dist/mediafuseBidAdapter.js +1 -1
  65. package/dist/mediasquareBidAdapter.js +1 -1
  66. package/dist/mgidBidAdapter.js +1 -1
  67. package/dist/minutemediaBidAdapter.js +1 -1
  68. package/dist/missenaBidAdapter.js +1 -1
  69. package/dist/newspassidBidAdapter.js +1 -0
  70. package/dist/nextMillenniumBidAdapter.js +1 -1
  71. package/dist/not-for-prod/prebid.js +131 -127
  72. package/dist/oguryBidAdapter.js +1 -1
  73. package/dist/onetagBidAdapter.js +1 -1
  74. package/dist/ooloAnalyticsAdapter.js +1 -1
  75. package/dist/openxOrtbBidAdapter.js +1 -0
  76. package/dist/outbrainBidAdapter.js +1 -1
  77. package/dist/parrableIdSystem.js +1 -1
  78. package/dist/pixfutureBidAdapter.js +1 -1
  79. package/dist/prebid-core.js +2 -2
  80. package/dist/priceFloors.js +1 -1
  81. package/dist/pubCommonId.js +1 -1
  82. package/dist/publinkIdSystem.js +1 -1
  83. package/dist/pubmaticBidAdapter.js +1 -1
  84. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  85. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  86. package/dist/pxyzBidAdapter.js +1 -1
  87. package/dist/quantcastBidAdapter.js +1 -1
  88. package/dist/rasBidAdapter.js +1 -0
  89. package/dist/readpeakBidAdapter.js +1 -1
  90. package/dist/relaidoBidAdapter.js +1 -1
  91. package/dist/rhythmoneBidAdapter.js +1 -1
  92. package/dist/riseBidAdapter.js +1 -1
  93. package/dist/rubiconAnalyticsAdapter.js +1 -1
  94. package/dist/rubiconBidAdapter.js +1 -1
  95. package/dist/seedingAllianceBidAdapter.js +1 -1
  96. package/dist/seedtagBidAdapter.js +1 -1
  97. package/dist/sharedIdSystem.js +1 -1
  98. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  99. package/dist/sharethroughBidAdapter.js +1 -1
  100. package/dist/shinezBidAdapter.js +1 -0
  101. package/dist/sizeMappingV2.js +1 -1
  102. package/dist/smaatoBidAdapter.js +1 -1
  103. package/dist/smartadserverBidAdapter.js +1 -1
  104. package/dist/smartxBidAdapter.js +1 -1
  105. package/dist/smilewantedBidAdapter.js +1 -1
  106. package/dist/sonobiBidAdapter.js +1 -1
  107. package/dist/sovrnAnalyticsAdapter.js +1 -1
  108. package/dist/sovrnBidAdapter.js +1 -1
  109. package/dist/sspBCBidAdapter.js +1 -1
  110. package/dist/sublimeBidAdapter.js +1 -1
  111. package/dist/synacormediaBidAdapter.js +1 -1
  112. package/dist/taboolaBidAdapter.js +1 -1
  113. package/dist/targetVideoBidAdapter.js +1 -1
  114. package/dist/teadsBidAdapter.js +1 -1
  115. package/dist/trionBidAdapter.js +1 -1
  116. package/dist/tripleliftBidAdapter.js +1 -1
  117. package/dist/ttdBidAdapter.js +1 -1
  118. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  119. package/dist/underdogmediaBidAdapter.js +1 -1
  120. package/dist/undertoneBidAdapter.js +1 -1
  121. package/dist/ventesBidAdapter.js +1 -1
  122. package/dist/vidazooBidAdapter.js +1 -1
  123. package/dist/videobyteBidAdapter.js +1 -1
  124. package/dist/visxBidAdapter.js +1 -1
  125. package/dist/vrtcalBidAdapter.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/gulpfile.js +1 -1
  133. package/karma.conf.maker.js +3 -1
  134. package/modules/adgenerationBidAdapter.js +24 -1
  135. package/modules/adnuntiusBidAdapter.js +26 -8
  136. package/modules/adotBidAdapter.js +13 -4
  137. package/modules/adrinoBidAdapter.js +10 -2
  138. package/modules/adrinoBidAdapter.md +6 -0
  139. package/modules/adtelligentBidAdapter.js +2 -1
  140. package/modules/appnexusBidAdapter.js +3 -3
  141. package/modules/atsAnalyticsAdapter.js +4 -5
  142. package/modules/byDataAnalyticsAdapter.js +172 -74
  143. package/modules/byDataAnalyticsAdapter.md +5 -6
  144. package/modules/consumableBidAdapter.js +12 -1
  145. package/modules/criteoBidAdapter.js +7 -1
  146. package/modules/cwireBidAdapter.md +1 -1
  147. package/modules/debugging/bidInterceptor.js +1 -1
  148. package/modules/debugging/index.js +2 -1
  149. package/modules/eplanningBidAdapter.js +82 -97
  150. package/modules/gdprEnforcement.js +8 -14
  151. package/modules/gridNMBidAdapter.js +45 -4
  152. package/modules/hadronAnalyticsAdapter.md +5 -5
  153. package/modules/hadronIdSystem.js +18 -5
  154. package/modules/hadronIdSystem.md +15 -11
  155. package/modules/hadronRtdProvider.js +14 -1
  156. package/modules/hadronRtdProvider.md +17 -13
  157. package/modules/imRtdProvider.js +0 -8
  158. package/modules/insticatorBidAdapter.js +9 -0
  159. package/modules/ixBidAdapter.js +462 -58
  160. package/modules/ixBidAdapter.md +95 -5
  161. package/modules/kargoAnalyticsAdapter.js +88 -6
  162. package/modules/kargoAnalyticsAdapter.md +33 -0
  163. package/modules/kargoBidAdapter.js +1 -2
  164. package/modules/minutemediaBidAdapter.js +1 -0
  165. package/modules/missenaBidAdapter.js +20 -2
  166. package/modules/newspassidBidAdapter.js +649 -0
  167. package/modules/nextMillenniumBidAdapter.js +17 -1
  168. package/modules/oguryBidAdapter.js +2 -0
  169. package/modules/openxBidAdapter.md +3 -1
  170. package/modules/openxOrtbBidAdapter.js +349 -0
  171. package/modules/openxOrtbBidAdapter.md +105 -0
  172. package/modules/priceFloors.js +1 -1
  173. package/modules/pubCommonId.js +1 -2
  174. package/modules/pubxaiAnalyticsAdapter.js +6 -1
  175. package/modules/rasBidAdapter.js +149 -0
  176. package/modules/rasBidAdapter.md +50 -0
  177. package/modules/readpeakBidAdapter.js +15 -6
  178. package/modules/relaidoBidAdapter.js +19 -4
  179. package/modules/seedtagBidAdapter.js +37 -1
  180. package/modules/sharedIdSystem.js +11 -5
  181. package/modules/sharethroughBidAdapter.js +9 -24
  182. package/modules/shinezBidAdapter.js +435 -0
  183. package/modules/shinezBidAdapter.md +76 -0
  184. package/modules/taboolaBidAdapter.js +1 -1
  185. package/modules/taboolaBidAdapter.md +3 -3
  186. package/modules/ventesBidAdapter.js +1 -1
  187. package/modules/ventesBidAdapter.md +1 -1
  188. package/modules/vrtcalBidAdapter.js +35 -0
  189. package/package.json +1 -1
  190. package/plugins/pbjsGlobals.js +2 -1
  191. package/src/storageManager.js +4 -5
  192. package/test/spec/modules/adgenerationBidAdapter_spec.js +52 -4
  193. package/test/spec/modules/adnuntiusBidAdapter_spec.js +126 -14
  194. package/test/spec/modules/adotBidAdapter_spec.js +12 -9
  195. package/test/spec/modules/adrinoBidAdapter_spec.js +22 -0
  196. package/test/spec/modules/appnexusBidAdapter_spec.js +165 -156
  197. package/test/spec/modules/byDataAnalyticsAdapter_spec.js +74 -24
  198. package/test/spec/modules/consumableBidAdapter_spec.js +75 -0
  199. package/test/spec/modules/criteoBidAdapter_spec.js +15 -5
  200. package/test/spec/modules/debugging_mod_spec.js +7 -0
  201. package/test/spec/modules/eplanningBidAdapter_spec.js +58 -18
  202. package/test/spec/modules/gdprEnforcement_spec.js +53 -100
  203. package/test/spec/modules/gridNMBidAdapter_spec.js +32 -0
  204. package/test/spec/modules/hadronIdSystem_spec.js +2 -2
  205. package/test/spec/modules/imRtdProvider_spec.js +0 -1
  206. package/test/spec/modules/insticatorBidAdapter_spec.js +22 -1
  207. package/test/spec/modules/ixBidAdapter_spec.js +470 -10
  208. package/test/spec/modules/kargoAnalyticsAdapter_spec.js +42 -0
  209. package/test/spec/modules/kargoBidAdapter_spec.js +1 -0
  210. package/test/spec/modules/minutemediaBidAdapter_spec.js +3 -0
  211. package/test/spec/modules/missenaBidAdapter_spec.js +36 -14
  212. package/test/spec/modules/newspassidBidAdapter_spec.js +1793 -0
  213. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +20 -0
  214. package/test/spec/modules/openxOrtbBidAdapter_spec.js +1303 -0
  215. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +5 -0
  216. package/test/spec/modules/rasBidAdapter_spec.js +190 -0
  217. package/test/spec/modules/readpeakBidAdapter_spec.js +1 -0
  218. package/test/spec/modules/relaidoBidAdapter_spec.js +29 -2
  219. package/test/spec/modules/seedtagBidAdapter_spec.js +29 -0
  220. package/test/spec/modules/sharethroughBidAdapter_spec.js +4 -4
  221. package/test/spec/modules/shinezBidAdapter_spec.js +479 -0
  222. package/test/spec/modules/taboolaBidAdapter_spec.js +1 -1
  223. package/test/spec/modules/ventesBidAdapter_spec.js +2 -2
  224. package/test/spec/modules/vrtcalBidAdapter_spec.js +17 -0
  225. package/webpack.conf.js +1 -1
@@ -1,12 +1,13 @@
1
1
  import { registerBidder } from '../src/adapters/bidderFactory.js';
2
- import { BANNER } from '../src/mediaTypes.js';
3
- import { isStr, deepAccess } from '../src/utils.js';
2
+ import { BANNER, VIDEO } from '../src/mediaTypes.js';
3
+ import { isStr, deepAccess, logInfo } from '../src/utils.js';
4
4
  import { config } from '../src/config.js';
5
5
  import { getStorageManager } from '../src/storageManager.js';
6
6
 
7
7
  const BIDDER_CODE = 'adnuntius';
8
8
  const ENDPOINT_URL = 'https://ads.adnuntius.delivery/i';
9
9
  const GVLID = 855;
10
+ const DEFAULT_VAST_VERSION = 'vast4'
10
11
 
11
12
  const checkSegment = function (segment) {
12
13
  if (isStr(segment)) return segment;
@@ -27,7 +28,7 @@ const getSegmentsFromOrtb = function (ortb2) {
27
28
  }
28
29
 
29
30
  const handleMeta = function () {
30
- const storage = getStorageManager({gvlid: GVLID, bidderCode: BIDDER_CODE})
31
+ const storage = getStorageManager({ gvlid: GVLID, bidderCode: BIDDER_CODE })
31
32
  let adnMeta = null
32
33
  if (storage.localStorageIsEnabled()) {
33
34
  adnMeta = JSON.parse(storage.getDataFromLocalStorage('adn.metaData'))
@@ -45,7 +46,7 @@ const getUsi = function (meta, ortb2, bidderRequest) {
45
46
  export const spec = {
46
47
  code: BIDDER_CODE,
47
48
  gvlid: GVLID,
48
- supportedMediaTypes: [BANNER],
49
+ supportedMediaTypes: [BANNER, VIDEO],
49
50
  isBidRequestValid: function (bid) {
50
51
  return !!(bid.bidId || (bid.params.member && bid.params.invCode));
51
52
  },
@@ -67,15 +68,20 @@ export const spec = {
67
68
 
68
69
  request.push('tzo=' + tzo)
69
70
  request.push('format=json')
71
+
70
72
  if (gdprApplies !== undefined) request.push('consentString=' + consentString);
71
73
  if (segments.length > 0) request.push('segments=' + segments.join(','));
72
74
  if (usi) request.push('userId=' + usi);
73
75
  if (bidderConfig.useCookie === false) request.push('noCookies=true')
74
76
  for (var i = 0; i < validBidRequests.length; i++) {
75
77
  const bid = validBidRequests[i]
76
- const network = bid.params.network || 'network';
78
+ let network = bid.params.network || 'network';
77
79
  const targeting = bid.params.targeting || {};
78
80
 
81
+ if (bid.mediaTypes && bid.mediaTypes.video && bid.mediaTypes.video.context !== 'outstream') {
82
+ network += '_video'
83
+ }
84
+
79
85
  bidRequests[network] = bidRequests[network] || [];
80
86
  bidRequests[network].push(bid);
81
87
 
@@ -89,9 +95,11 @@ export const spec = {
89
95
  const networkKeys = Object.keys(networks)
90
96
  for (var j = 0; j < networkKeys.length; j++) {
91
97
  const network = networkKeys[j];
98
+ const networkRequest = [...request]
99
+ if (network.indexOf('_video') > -1) { networkRequest.push('tt=' + DEFAULT_VAST_VERSION) }
92
100
  requests.push({
93
101
  method: 'POST',
94
- url: ENDPOINT_URL + '?' + request.join('&'),
102
+ url: ENDPOINT_URL + '?' + networkRequest.join('&'),
95
103
  data: JSON.stringify(networks[network]),
96
104
  bid: bidRequests[network]
97
105
  });
@@ -106,7 +114,7 @@ export const spec = {
106
114
  if (adUnit.matchedAdCount >= 1) {
107
115
  const ad = adUnit.ads[0];
108
116
  const effectiveCpm = (ad.bid) ? ad.bid.amount * 1000 : 0;
109
- return {
117
+ const adResponse = {
110
118
  ...response,
111
119
  [adUnit.targetId]: {
112
120
  requestId: adUnit.targetId,
@@ -122,9 +130,19 @@ export const spec = {
122
130
  },
123
131
  netRevenue: false,
124
132
  ttl: 360,
125
- ad: adUnit.html
126
133
  }
127
134
  }
135
+
136
+ if (adUnit.vastXml) {
137
+ adResponse[adUnit.targetId].vastXml = adUnit.vastXml
138
+ adResponse[adUnit.targetId].mediaType = 'video'
139
+ } else {
140
+ adResponse[adUnit.targetId].ad = adUnit.html
141
+ }
142
+
143
+ logInfo('BID', adResponse)
144
+
145
+ return adResponse
128
146
  } else return response
129
147
  }, {});
130
148
 
@@ -49,19 +49,22 @@ function tryParse(data) {
49
49
  * @returns {Site|null} Formatted Site OpenRtb object or null
50
50
  */
51
51
  function getOpenRTBSiteObject(bidderRequest) {
52
- if (!bidderRequest || !bidderRequest.refererInfo) return null;
52
+ const refererInfo = (bidderRequest && bidderRequest.refererInfo) || null;
53
53
 
54
- const domain = bidderRequest.refererInfo.domain;
54
+ const domain = refererInfo ? refererInfo.domain : window.location.hostname;
55
55
  const publisherId = config.getConfig('adot.publisherId');
56
56
 
57
57
  if (!domain) return null;
58
58
 
59
59
  return {
60
- page: bidderRequest.refererInfo.page,
60
+ page: refererInfo ? refererInfo.page : window.location.href,
61
61
  domain: domain,
62
62
  name: domain,
63
63
  publisher: {
64
64
  id: publisherId
65
+ },
66
+ ext: {
67
+ schain: bidderRequest.schain
65
68
  }
66
69
  };
67
70
  }
@@ -83,7 +86,13 @@ function getOpenRTBDeviceObject() {
83
86
  */
84
87
  function getOpenRTBUserObject(bidderRequest) {
85
88
  if (!bidderRequest || !bidderRequest.gdprConsent || !isStr(bidderRequest.gdprConsent.consentString)) return null;
86
- return { ext: { consent: bidderRequest.gdprConsent.consentString } };
89
+
90
+ return {
91
+ ext: {
92
+ consent: bidderRequest.gdprConsent.consentString,
93
+ pubProvidedId: bidderRequest.userId && bidderRequest.userId.pubProvidedId,
94
+ },
95
+ };
87
96
  }
88
97
 
89
98
  /**
@@ -1,6 +1,7 @@
1
1
  import {registerBidder} from '../src/adapters/bidderFactory.js';
2
2
  import {triggerPixel} from '../src/utils.js';
3
3
  import {NATIVE} from '../src/mediaTypes.js';
4
+ import {config} from '../src/config.js';
4
5
 
5
6
  const BIDDER_CODE = 'adrino';
6
7
  const REQUEST_METHOD = 'POST';
@@ -12,6 +13,10 @@ export const spec = {
12
13
  gvlid: GVLID,
13
14
  supportedMediaTypes: [NATIVE],
14
15
 
16
+ getBidderConfig: function (property) {
17
+ return config.getConfig(`${BIDDER_CODE}.${property}`);
18
+ },
19
+
15
20
  isBidRequestValid: function (bid) {
16
21
  return !!(bid.bidId) &&
17
22
  !!(bid.params) &&
@@ -26,6 +31,8 @@ export const spec = {
26
31
  const bidRequests = [];
27
32
 
28
33
  for (let i = 0; i < validBidRequests.length; i++) {
34
+ let host = this.getBidderConfig('host') || BIDDER_HOST;
35
+
29
36
  let requestData = {
30
37
  bidId: validBidRequests[i].bidId,
31
38
  nativeParams: validBidRequests[i].nativeParams,
@@ -44,7 +51,7 @@ export const spec = {
44
51
 
45
52
  bidRequests.push({
46
53
  method: REQUEST_METHOD,
47
- url: BIDDER_HOST + '/bidder/bid/',
54
+ url: host + '/bidder/bid/',
48
55
  data: requestData,
49
56
  options: {
50
57
  contentType: 'application/json',
@@ -67,7 +74,8 @@ export const spec = {
67
74
 
68
75
  onBidWon: function (bid) {
69
76
  if (bid['requestId']) {
70
- triggerPixel(BIDDER_HOST + '/bidder/won/' + bid['requestId']);
77
+ let host = this.getBidderConfig('host') || BIDDER_HOST;
78
+ triggerPixel(host + '/bidder/won/' + bid['requestId']);
71
79
  }
72
80
  }
73
81
  };
@@ -13,6 +13,12 @@ Module connects to Adrino bidder to fetch bids. Only native format is supported.
13
13
  # Test Parameters
14
14
 
15
15
  ```
16
+ pbjs.setConfig({
17
+ adrino: {
18
+ host: 'https://custom-domain.adrino.io'
19
+ }
20
+ });
21
+
16
22
  var adUnits = [
17
23
  code: '/12345678/prebid_native_example_1',
18
24
  mediaTypes: {
@@ -37,7 +37,8 @@ const syncsCache = {};
37
37
  export const spec = {
38
38
  code: BIDDER_CODE,
39
39
  gvlid: 410,
40
- aliases: ['onefiftytwomedia', 'selectmedia', 'appaloosa', 'bidsxchange', 'streamkey', 'janet',
40
+ aliases: ['onefiftytwomedia', 'appaloosa', 'bidsxchange', 'streamkey', 'janet',
41
+ { code: 'selectmedia', gvlid: 775 },
41
42
  { code: 'navelix', gvlid: 380 },
42
43
  'pgam'
43
44
  ],
@@ -447,7 +447,7 @@ export const spec = {
447
447
  * @param {Bid} bid
448
448
  */
449
449
  onBidWon: function (bid) {
450
- if (bid.native) {
450
+ if (FEATURES.NATIVE && bid.native) {
451
451
  reloadViewabilityScriptWithCorrectParameters(bid);
452
452
  }
453
453
  }
@@ -715,7 +715,7 @@ function newBid(serverBid, rtbBid, bidderRequest) {
715
715
  bid.vastUrl = rtbBid.notify_url + '&redir=' + encodeURIComponent(rtbBid.rtb.video.asset_url);
716
716
  break;
717
717
  }
718
- } else if (rtbBid.rtb[NATIVE]) {
718
+ } else if (FEATURES.NATIVE && rtbBid.rtb[NATIVE]) {
719
719
  const nativeAd = rtbBid.rtb[NATIVE];
720
720
 
721
721
  // setting up the jsTracker:
@@ -853,7 +853,7 @@ function bidToTag(bid) {
853
853
  tag.gpid = gpid;
854
854
  }
855
855
 
856
- if (bid.mediaType === NATIVE || deepAccess(bid, `mediaTypes.${NATIVE}`)) {
856
+ if (FEATURES.NATIVE && (bid.mediaType === NATIVE || deepAccess(bid, `mediaTypes.${NATIVE}`))) {
857
857
  tag.ad_types.push(NATIVE);
858
858
  if (tag.sizes.length === 0) {
859
859
  tag.sizes = transformSizes([1, 1]);
@@ -267,7 +267,7 @@ function sendDataToAnalytic (events) {
267
267
  }
268
268
 
269
269
  // preflight request, to check did publisher have permission to send data to analytics endpoint
270
- function preflightRequest (envelopeSourceCookieValue, events) {
270
+ function preflightRequest (events) {
271
271
  logInfo('ATS Analytics - preflight request!');
272
272
  ajax(preflightUrl + atsAnalyticsAdapter.context.pid,
273
273
  {
@@ -277,7 +277,7 @@ function preflightRequest (envelopeSourceCookieValue, events) {
277
277
  let samplingRate = samplingRateObject.samplingRate;
278
278
  atsAnalyticsAdapter.setSamplingCookie(samplingRate);
279
279
  let samplingRateNumber = Number(samplingRate);
280
- if (data && samplingRate && atsAnalyticsAdapter.shouldFireRequest(samplingRateNumber) && envelopeSourceCookieValue != null) {
280
+ if (data && samplingRate && atsAnalyticsAdapter.shouldFireRequest(samplingRateNumber)) {
281
281
  logInfo('ATS Analytics - events to send: ', events);
282
282
  sendDataToAnalytic(events);
283
283
  }
@@ -377,12 +377,11 @@ atsAnalyticsAdapter.callHandler = function (evtype, args) {
377
377
  }
378
378
  // check should we send data to analytics or not, check first cookie value _lr_sampling_rate
379
379
  try {
380
- let envelopeSourceCookieValue = storage.getCookie('_lr_env_src_ats');
381
380
  let samplingRateCookie = storage.getCookie('_lr_sampling_rate');
382
381
  if (!samplingRateCookie) {
383
- preflightRequest(envelopeSourceCookieValue, events);
382
+ preflightRequest(events);
384
383
  } else {
385
- if (atsAnalyticsAdapter.shouldFireRequest(parseInt(samplingRateCookie)) && envelopeSourceCookieValue != null) {
384
+ if (atsAnalyticsAdapter.shouldFireRequest(parseInt(samplingRateCookie))) {
386
385
  logInfo('ATS Analytics - events to send: ', events);
387
386
  sendDataToAnalytic(events);
388
387
  }
@@ -5,38 +5,80 @@ import enc from 'crypto-js/enc-utf8';
5
5
  import adapter from '../src/AnalyticsAdapter.js';
6
6
  import CONSTANTS from '../src/constants.json';
7
7
  import adapterManager from '../src/adapterManager.js';
8
+ import { getStorageManager } from '../src/storageManager.js';
9
+ import { auctionManager } from '../src/auctionManager.js';
8
10
  import { ajax } from '../src/ajax.js';
9
11
 
10
- const secretKey = 'bydata@123456';
11
- const { EVENTS: { NO_BID, BID_TIMEOUT, AUCTION_END } } = CONSTANTS;
12
- const DEFAULT_EVENT_URL = 'https://pbjs-stream.bydata.com/topics/prebid';
13
- const analyticsType = 'endpoint';
14
- var payload = {};
15
- var bdNbTo = { 'to': [], 'nb': [] };
16
- let initOptions = {};
12
+ const versionCode = '4.4.1'
13
+ const secretKey = 'bydata@123456'
14
+ const { EVENTS: { NO_BID, BID_TIMEOUT, AUCTION_END, AUCTION_INIT, BID_WON } } = CONSTANTS
15
+ const DEFAULT_EVENT_URL = 'https://pbjs-stream.bydata.com/topics/prebid'
16
+ const analyticsType = 'endpoint'
17
+ const isBydata = isKeyInUrl('bydata_debug')
18
+ const adunitsMap = {}
19
+ const storage = getStorageManager();
20
+ let initOptions = {}
21
+ var payload = {}
22
+ var winPayload = {}
23
+ var isDataSend = window.asc_data || false
24
+ var bdNbTo = { 'to': [], 'nb': [] }
17
25
 
26
+ /* method used for testing parameters */
27
+ function isKeyInUrl(name) {
28
+ const queryString = window.location.search;
29
+ const urlParams = new URLSearchParams(queryString);
30
+ const param = urlParams.get(name)
31
+ return param
32
+ }
33
+
34
+ /* return ad unit full path wrt custom ad unit code */
35
+ function getAdunitName(code) {
36
+ var name = code;
37
+ for (const [key, value] of Object.entries(adunitsMap)) {
38
+ if (key === code) { name = value; }
39
+ }
40
+ return name;
41
+ }
42
+
43
+ /* EVENT: auction init */
44
+ function onAuctionStart(t) {
45
+ /* map of ad unit code - ad unit full path */
46
+ t.adUnits && t.adUnits.length && t.adUnits.forEach((adu) => {
47
+ const { code, adunit } = adu
48
+ adunitsMap[code] = adunit
49
+ });
50
+ }
51
+
52
+ /* EVENT: bid timeout */
18
53
  function onBidTimeout(t) {
19
54
  if (payload['visitor_data'] && t && t.length > 0) {
20
- bdNbTo['to'] = t;
55
+ bdNbTo['to'] = t
21
56
  }
22
57
  }
23
58
 
59
+ /* EVENT: no bid */
24
60
  function onNoBidData(t) {
25
61
  if (payload['visitor_data'] && t) {
26
- bdNbTo['nb'].push(t);
62
+ bdNbTo['nb'].push(t)
63
+ }
64
+ }
65
+
66
+ /* EVENT: bid won */
67
+ function onBidWon(t) {
68
+ const { isCorrectOption } = initOptions
69
+ if (isCorrectOption && (isDataSend || isBydata)) {
70
+ ascAdapter.getBidWonData(t)
71
+ ascAdapter.sendPayload(winPayload)
27
72
  }
28
73
  }
29
74
 
75
+ /* EVENT: auction end */
30
76
  function onAuctionEnd(t) {
31
- _logInfo('onAuctionEnd', t);
32
- const {isCorrectOption, logFrequency} = initOptions;
33
- var value = Math.floor(Math.random() * 10000 + 1);
34
- _logInfo(' value - frequency ', (value + '-' + logFrequency));
77
+ const { isCorrectOption } = initOptions;
35
78
  setTimeout(() => {
36
- if (isCorrectOption && value < logFrequency) {
79
+ if (isCorrectOption && (isDataSend || isBydata)) {
37
80
  ascAdapter.dataProcess(t);
38
- addKeyForPrebidWinningAndWinningsBids();
39
- ascAdapter.sendPayload();
81
+ ascAdapter.sendPayload(payload);
40
82
  }
41
83
  }, 500);
42
84
  }
@@ -44,6 +86,9 @@ function onAuctionEnd(t) {
44
86
  const ascAdapter = Object.assign(adapter({ url: DEFAULT_EVENT_URL, analyticsType: analyticsType }), {
45
87
  track({ eventType, args }) {
46
88
  switch (eventType) {
89
+ case AUCTION_INIT:
90
+ onAuctionStart(args);
91
+ break;
47
92
  case NO_BID:
48
93
  onNoBidData(args);
49
94
  break;
@@ -53,6 +98,9 @@ const ascAdapter = Object.assign(adapter({ url: DEFAULT_EVENT_URL, analyticsType
53
98
  case AUCTION_END:
54
99
  onAuctionEnd(args);
55
100
  break;
101
+ case BID_WON:
102
+ onBidWon(args);
103
+ break;
56
104
  default:
57
105
  break;
58
106
  }
@@ -62,9 +110,8 @@ const ascAdapter = Object.assign(adapter({ url: DEFAULT_EVENT_URL, analyticsType
62
110
  // save the base class function
63
111
  ascAdapter.originEnableAnalytics = ascAdapter.enableAnalytics;
64
112
  // override enableAnalytics so we can get access to the config passed in from the page
65
- ascAdapter.enableAnalytics = function(config) {
113
+ ascAdapter.enableAnalytics = function (config) {
66
114
  if (this.initConfig(config)) {
67
- _logInfo('initiated:', initOptions);
68
115
  initOptions.isCorrectOption && ascAdapter.getVisitorData();
69
116
  ascAdapter.originEnableAnalytics(config);
70
117
  }
@@ -73,7 +120,7 @@ ascAdapter.enableAnalytics = function(config) {
73
120
  ascAdapter.initConfig = function (config) {
74
121
  let isCorrectOption = true;
75
122
  initOptions = {};
76
- _logInfo('initConfig', config);
123
+ var rndNum = Math.floor(Math.random() * 10000 + 1);
77
124
  initOptions.options = deepClone(config.options);
78
125
  initOptions.clientId = initOptions.options.clientId || null;
79
126
  initOptions.logFrequency = initOptions.options.logFrequency;
@@ -81,13 +128,41 @@ ascAdapter.initConfig = function (config) {
81
128
  _logError('"options.clientId" should not empty!!');
82
129
  isCorrectOption = false;
83
130
  }
131
+ if (rndNum <= initOptions.logFrequency) { window.asc_data = isDataSend = true; }
84
132
  initOptions.isCorrectOption = isCorrectOption;
85
133
  this.initOptions = initOptions;
86
134
  return isCorrectOption;
87
135
  };
88
136
 
89
- ascAdapter.getVisitorData = function(data = {}) {
90
- var ua = data.userId ? data : {};
137
+ ascAdapter.getBidWonData = function(t) {
138
+ const { auctionId, adUnitCode, size, requestId, bidder, timeToRespond, currency, mediaType, cpm } = t
139
+ const aun = getAdunitName(adUnitCode)
140
+ winPayload['aid'] = auctionId
141
+ winPayload['as'] = '';
142
+ winPayload['auctionData'] = [];
143
+ var data = {}
144
+ data['au'] = aun
145
+ data['auc'] = adUnitCode
146
+ data['aus'] = size
147
+ data['bid'] = requestId
148
+ data['bidadv'] = bidder
149
+ data['br_pb_mg'] = cpm
150
+ data['br_tr'] = timeToRespond
151
+ data['bradv'] = bidder
152
+ data['brid'] = requestId
153
+ data['brs'] = size
154
+ data['cur'] = currency
155
+ data['inb'] = 0
156
+ data['ito'] = 0
157
+ data['ipwb'] = 1
158
+ data['iwb'] = 1
159
+ data['mt'] = mediaType
160
+ winPayload['auctionData'].push(data)
161
+ return winPayload
162
+ }
163
+
164
+ ascAdapter.getVisitorData = function (data = {}) {
165
+ var ua = data.uid ? data : {};
91
166
  var module = {
92
167
  options: [],
93
168
  header: [window.navigator.platform, window.navigator.userAgent, window.navigator.appVersion, window.navigator.vendor, window.opera],
@@ -152,7 +227,7 @@ ascAdapter.getVisitorData = function(data = {}) {
152
227
  crypto.getRandomValues(buffer);
153
228
  buffer[6] = (buffer[6] & ~176) | 64;
154
229
  buffer[8] = (buffer[8] & ~64) | 128;
155
- var hex = Array.prototype.map.call(new Uint8Array(buffer), function(x) {
230
+ var hex = Array.prototype.map.call(new Uint8Array(buffer), function (x) {
156
231
  return ('00' + x.toString(16)).slice(-2);
157
232
  }).join('');
158
233
  return hex.slice(0, 5) + '-' + hex.slice(5, 9) + '-' + hex.slice(9, 13) + '-' + hex.slice(13, 18);
@@ -182,34 +257,46 @@ ascAdapter.getVisitorData = function(data = {}) {
182
257
  var signedToken = token + '.' + signature;
183
258
  return signedToken;
184
259
  }
185
- const {clientId} = initOptions;
186
- var userId = window.localStorage.getItem('userId');
260
+ function detectWidth() {
261
+ return window.screen.width || (window.innerWidth && document.documentElement.clientWidth) ? Math.min(window.innerWidth, document.documentElement.clientWidth) : window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth;
262
+ }
263
+ function giveDeviceTypeOnScreenSize() {
264
+ var _dWidth = detectWidth();
265
+ return _dWidth > 1024 ? 'Desktop' : (_dWidth <= 1024 && _dWidth >= 768) ? 'Tablet' : 'Mobile';
266
+ }
267
+
268
+ const { clientId } = initOptions;
269
+ var userId = storage.getDataFromLocalStorage('userId')
187
270
  if (!userId) {
188
271
  userId = generateUid();
189
- window.localStorage.setItem('userId', userId);
272
+ storage.setDataInLocalStorage('userId', userId);
190
273
  }
191
- var screenSize = {width: window.screen.width, height: window.screen.height};
192
- var deviceType = window.navigator.userAgent.match(/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile/i) ? 'Mobile' : 'Desktop';
274
+ var screenSize = { width: window.screen.width, height: window.screen.height };
275
+ var deviceType = giveDeviceTypeOnScreenSize();
193
276
  var e = module.init();
194
- if (!ua['userId']) {
195
- ua['userId'] = userId;
196
- ua['client_id'] = clientId;
197
- ua['plateform_name'] = e.os.name;
198
- ua['os_version'] = e.os.version;
199
- ua['browser_name'] = e.browser.name;
200
- ua['browser_version'] = e.browser.version;
201
- ua['screen_size'] = screenSize;
202
- ua['device_type'] = deviceType;
203
- ua['time_zone'] = window.Intl.DateTimeFormat().resolvedOptions().timeZone;
277
+ if (!ua['uid']) {
278
+ ua['uid'] = userId;
279
+ ua['cid'] = clientId;
280
+ ua['pid'] = window.location.hostname;
281
+ ua['os'] = e.os.name;
282
+ ua['osv'] = e.os.version;
283
+ ua['br'] = e.browser.name;
284
+ ua['brv'] = e.browser.version;
285
+ ua['ss'] = screenSize;
286
+ ua['de'] = deviceType;
287
+ ua['tz'] = window.Intl.DateTimeFormat().resolvedOptions().timeZone;
204
288
  }
205
289
  var signedToken = getJWToken(ua);
206
290
  payload['visitor_data'] = signedToken;
291
+ winPayload['visitor_data'] = signedToken;
207
292
  return signedToken;
208
293
  }
209
294
 
210
- ascAdapter.dataProcess = function(t) {
211
- payload['auction_id'] = t.auctionId;
212
- payload['auction_start'] = t.timestamp;
295
+ ascAdapter.dataProcess = function (t) {
296
+ if (isBydata) { payload['bydata_debug'] = 'true'; }
297
+ _logInfo('fulldata - ', t);
298
+ payload['aid'] = t.auctionId;
299
+ payload['as'] = t.timestamp;
213
300
  payload['auctionData'] = [];
214
301
  var bidderRequestsData = []; var bidsReceivedData = [];
215
302
  t.bidderRequests && t.bidderRequests.forEach(bidReq => {
@@ -228,69 +315,80 @@ ascAdapter.dataProcess = function(t) {
228
315
  bidderRequestsData.push(pObj);
229
316
  });
230
317
  t.bidsReceived && t.bidsReceived.forEach(bid => {
231
- const {requestId, bidder, width, height, cpm, currency, timeToRespond, adUnitCode} = bid;
232
- bidsReceivedData.push({requestId, bidder, width, height, cpm, currency, timeToRespond, adUnitCode});
318
+ const { requestId, bidder, width, height, cpm, currency, timeToRespond, adUnitCode } = bid;
319
+ bidsReceivedData.push({ requestId, bidder, width, height, cpm, currency, timeToRespond, adUnitCode });
233
320
  });
234
321
  bidderRequestsData.length > 0 && bidderRequestsData.forEach(bdObj => {
235
322
  var bdsArray = bdObj['bids'];
236
323
  bdsArray.forEach(bid => {
237
- const {adUnitCode, sizes, bidder, bidId, mediaTypes} = bid;
324
+ const { adUnitCode, sizes, bidder, bidId, mediaTypes } = bid;
238
325
  sizes.forEach(size => {
239
326
  var sstr = size[0] + 'x' + size[1]
240
- payload['auctionData'].push({adUnit: adUnitCode, size: sstr, media_type: mediaTypes[0], bids_bidder: bidder, bids_bid_id: bidId});
327
+ payload['auctionData'].push({ au: getAdunitName(adUnitCode), auc: adUnitCode, aus: sstr, mt: mediaTypes[0], bidadv: bidder, bid: bidId, inb: 0, ito: 0, ipwb: 0, iwb: 0 });
241
328
  });
242
329
  });
243
330
  });
331
+
244
332
  bidsReceivedData.length > 0 && bidsReceivedData.forEach(bdRecived => {
245
- const {requestId, bidder, width, height, cpm, currency, timeToRespond} = bdRecived;
333
+ const { requestId, bidder, width, height, cpm, currency, timeToRespond } = bdRecived;
246
334
  payload['auctionData'].forEach(rwData => {
247
- if (rwData['bids_bid_id'] === requestId && rwData['size'] === width + 'x' + height) {
248
- rwData['br_request_id'] = requestId; rwData['br_bidder'] = bidder; rwData['br_pb_mg'] = cpm;
249
- rwData['br_currency'] = currency; rwData['br_time_to_respond'] = timeToRespond; rwData['br_size'] = width + 'x' + height;
335
+ if (rwData['bid'] === requestId && rwData['aus'] === width + 'x' + height) {
336
+ rwData['brid'] = requestId; rwData['bradv'] = bidder; rwData['br_pb_mg'] = cpm;
337
+ rwData['cur'] = currency; rwData['br_tr'] = timeToRespond; rwData['brs'] = width + 'x' + height;
250
338
  }
251
339
  })
252
340
  });
341
+
342
+ var prebidWinningBids = auctionManager.getBidsReceived().filter(bid => bid.status === CONSTANTS.BID_STATUS.BID_TARGETING_SET);
343
+ prebidWinningBids && prebidWinningBids.length > 0 && prebidWinningBids.forEach(pbbid => {
344
+ payload['auctionData'] && payload['auctionData'].forEach(rwData => {
345
+ if (rwData['bid'] === pbbid.requestId && rwData['brs'] === pbbid.size) {
346
+ rwData['ipwb'] = 1;
347
+ }
348
+ });
349
+ })
350
+
351
+ var winningBids = auctionManager.getAllWinningBids();
352
+ winningBids && winningBids.length > 0 && winningBids.forEach(wBid => {
353
+ payload['auctionData'] && payload['auctionData'].forEach(rwData => {
354
+ if (rwData['bid'] === wBid.requestId && rwData['brs'] === wBid.size) {
355
+ rwData['iwb'] = 1;
356
+ }
357
+ });
358
+ })
359
+
253
360
  payload['auctionData'] && payload['auctionData'].length > 0 && payload['auctionData'].forEach(u => {
254
361
  bdNbTo['to'].forEach(i => {
255
- if (u.bids_bid_id === i.bidId) u.is_timeout = 1;
362
+ if (u.bid === i.bidId) u.ito = 1;
256
363
  });
257
364
  bdNbTo['nb'].forEach(i => {
258
- if (u.adUnit === i.adUnitCode && u.bids_bidder === i.bidder && u.bids_bid_id === i.bidId) { u.is_nobid = 1; }
365
+ if (u.bidadv === i.bidder && u.bid === i.bidId) { u.inb = 1; }
259
366
  })
260
367
  });
261
368
  return payload;
262
369
  }
263
370
 
264
- ascAdapter.sendPayload = function () {
265
- var obj = { 'records': [ { 'value': payload } ] };
371
+ ascAdapter.sendPayload = function (data) {
372
+ var obj = { 'records': [{ 'value': data }] };
266
373
  let strJSON = JSON.stringify(obj);
267
- _logInfo(' sendPayload ', JSON.stringify(obj));
268
- ajax(DEFAULT_EVENT_URL, undefined, strJSON, {
374
+ sendDataOnKf(strJSON);
375
+ }
376
+
377
+ function sendDataOnKf(dataObj) {
378
+ ajax(DEFAULT_EVENT_URL, {
379
+ success: function () {
380
+ _logInfo('send data success');
381
+ },
382
+ error: function (e) {
383
+ _logInfo('send data error', e);
384
+ }
385
+ }, dataObj, {
269
386
  contentType: 'application/vnd.kafka.json.v2+json',
270
387
  method: 'POST',
271
388
  withCredentials: true
272
389
  });
273
390
  }
274
391
 
275
- function addKeyForPrebidWinningAndWinningsBids() {
276
- var prebidWinningBids = $$PREBID_GLOBAL$$.getAllPrebidWinningBids();
277
- var winningBids = $$PREBID_GLOBAL$$.getAllWinningBids();
278
- prebidWinningBids && prebidWinningBids.length > 0 && prebidWinningBids.forEach(pbbid => {
279
- payload['auctionData'] && payload['auctionData'].forEach(rwData => {
280
- if (rwData['bids_bid_id'] === pbbid.requestId && rwData['br_size'] === pbbid.size) {
281
- rwData['is_prebid_winning_bid'] = 1;
282
- }
283
- });
284
- })
285
- winningBids && winningBids.length > 0 && winningBids.forEach(wBid => {
286
- payload['auctionData'] && payload['auctionData'].forEach(rwData => {
287
- if (rwData['bids_bid_id'] === wBid.requestId && rwData['br_size'] === wBid.size) {
288
- rwData['is_winning_bid'] = 1;
289
- }
290
- });
291
- })
292
- }
293
-
294
392
  adapterManager.registerAnalyticsAdapter({
295
393
  adapter: ascAdapter,
296
394
  code: 'bydata'
@@ -305,7 +403,7 @@ function _logError(message) {
305
403
  }
306
404
 
307
405
  function buildLogMessage(message) {
308
- return 'Bydata Prebid Analytics: ' + message;
406
+ return 'Bydata Prebid Analytics ' + versionCode + ':' + message;
309
407
  }
310
408
 
311
409
  export default ascAdapter;