prebid.js 7.22.0 → 7.23.1

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 (273) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/aaxBlockmeterRtdProvider.js +1 -0
  3. package/dist/adagioBidAdapter.js +1 -1
  4. package/dist/adbookpspBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/adrelevantisBidAdapter.js +1 -1
  7. package/dist/adtrgtmeBidAdapter.js +1 -1
  8. package/dist/adxcgBidAdapter.js +1 -1
  9. package/dist/ajaBidAdapter.js +1 -1
  10. package/dist/amxBidAdapter.js +1 -1
  11. package/dist/amxIdSystem.js +1 -1
  12. package/dist/analyticsAdapter.js +1 -1
  13. package/dist/appierAnalyticsAdapter.js +1 -1
  14. package/dist/appnexusBidAdapter.js +1 -1
  15. package/dist/asoBidAdapter.js +1 -1
  16. package/dist/axonixBidAdapter.js +1 -1
  17. package/dist/bidViewability.js +1 -1
  18. package/dist/bidViewabilityIO.js +1 -1
  19. package/dist/bidglassBidAdapter.js +1 -1
  20. package/dist/big-richmediaBidAdapter.js +1 -1
  21. package/dist/bridgewellBidAdapter.js +1 -1
  22. package/dist/brightMountainMediaBidAdapter.js +1 -1
  23. package/dist/browsiRtdProvider.js +1 -1
  24. package/dist/carodaBidAdapter.js +1 -1
  25. package/dist/chtnwBidAdapter.js +1 -0
  26. package/dist/cleanioRtdProvider.js +1 -1
  27. package/dist/concertBidAdapter.js +1 -1
  28. package/dist/connectadBidAdapter.js +1 -1
  29. package/dist/consentManagement.js +1 -1
  30. package/dist/consentManagementUsp.js +1 -1
  31. package/dist/consumableBidAdapter.js +1 -1
  32. package/dist/conversantBidAdapter.js +1 -1
  33. package/dist/craftBidAdapter.js +1 -1
  34. package/dist/criteoBidAdapter.js +1 -1
  35. package/dist/currency.js +1 -1
  36. package/dist/dependencies.json +19 -0
  37. package/dist/dfpAdServerVideo.js +1 -1
  38. package/dist/dgkeywordRtdProvider.js +1 -1
  39. package/dist/dspxBidAdapter.js +1 -1
  40. package/dist/eplanningBidAdapter.js +1 -1
  41. package/dist/finativeBidAdapter.js +1 -1
  42. package/dist/gdprEnforcement.js +1 -1
  43. package/dist/glimpseBidAdapter.js +1 -1
  44. package/dist/gmosspBidAdapter.js +1 -1
  45. package/dist/goldbachBidAdapter.js +1 -1
  46. package/dist/googleAnalyticsAdapter.js +1 -1
  47. package/dist/gridBidAdapter.js +1 -1
  48. package/dist/gridNMBidAdapter.js +1 -1
  49. package/dist/gumgumBidAdapter.js +1 -1
  50. package/dist/h12mediaBidAdapter.js +1 -1
  51. package/dist/id5AnalyticsAdapter.js +1 -1
  52. package/dist/id5IdSystem.js +1 -1
  53. package/dist/improvedigitalBidAdapter.js +1 -1
  54. package/dist/inmarBidAdapter.js +1 -1
  55. package/dist/insticatorBidAdapter.js +1 -1
  56. package/dist/instreamTracking.js +1 -1
  57. package/dist/ixBidAdapter.js +1 -1
  58. package/dist/justpremiumBidAdapter.js +1 -1
  59. package/dist/jwplayerVideoProvider.js +1 -0
  60. package/dist/kargoBidAdapter.js +1 -1
  61. package/dist/konduitAnalyticsAdapter.js +1 -1
  62. package/dist/kueezBidAdapter.js +1 -1
  63. package/dist/lassoBidAdapter.js +1 -1
  64. package/dist/lifestreetBidAdapter.js +1 -1
  65. package/dist/liveyieldAnalyticsAdapter.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/mediasquareBidAdapter.js +1 -1
  73. package/dist/mgidBidAdapter.js +1 -1
  74. package/dist/minutemediaBidAdapter.js +1 -1
  75. package/dist/multibid.js +1 -1
  76. package/dist/not-for-prod/prebid.js +141 -132
  77. package/dist/oguryBidAdapter.js +1 -1
  78. package/dist/onetagBidAdapter.js +1 -1
  79. package/dist/ooloAnalyticsAdapter.js +1 -1
  80. package/dist/openxOrtbBidAdapter.js +1 -1
  81. package/dist/ortbConverter.js +1 -0
  82. package/dist/outbrainBidAdapter.js +1 -1
  83. package/dist/oxxionRtdProvider.js +1 -0
  84. package/dist/parrableIdSystem.js +1 -1
  85. package/dist/pbsExtensions.js +1 -0
  86. package/dist/pixfutureBidAdapter.js +1 -1
  87. package/dist/prebid-core.js +1 -1
  88. package/dist/prebidServerBidAdapter.js +1 -1
  89. package/dist/priceFloors.js +1 -1
  90. package/dist/pubCommonId.js +1 -1
  91. package/dist/publinkIdSystem.js +1 -1
  92. package/dist/pubmaticBidAdapter.js +1 -1
  93. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  94. package/dist/pxyzBidAdapter.js +1 -1
  95. package/dist/quantcastBidAdapter.js +1 -1
  96. package/dist/readpeakBidAdapter.js +1 -1
  97. package/dist/relaidoBidAdapter.js +1 -1
  98. package/dist/rhythmoneBidAdapter.js +1 -1
  99. package/dist/riseBidAdapter.js +1 -1
  100. package/dist/rtdModule.js +1 -1
  101. package/dist/rubiconAnalyticsAdapter.js +1 -1
  102. package/dist/rubiconBidAdapter.js +1 -1
  103. package/dist/schain.js +1 -1
  104. package/dist/seedingAllianceBidAdapter.js +1 -1
  105. package/dist/seedtagBidAdapter.js +1 -1
  106. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  107. package/dist/sharethroughBidAdapter.js +1 -1
  108. package/dist/shinezBidAdapter.js +1 -1
  109. package/dist/smaatoBidAdapter.js +1 -1
  110. package/dist/smartadserverBidAdapter.js +1 -1
  111. package/dist/smartxBidAdapter.js +1 -1
  112. package/dist/smilewantedBidAdapter.js +1 -1
  113. package/dist/sonobiBidAdapter.js +1 -1
  114. package/dist/sovrnAnalyticsAdapter.js +1 -1
  115. package/dist/sovrnBidAdapter.js +1 -1
  116. package/dist/spotxBidAdapter.js +1 -1
  117. package/dist/sspBCBidAdapter.js +1 -1
  118. package/dist/sublimeBidAdapter.js +1 -1
  119. package/dist/synacormediaBidAdapter.js +1 -1
  120. package/dist/targetVideoBidAdapter.js +1 -1
  121. package/dist/teadsBidAdapter.js +1 -1
  122. package/dist/teadsIdSystem.js +1 -1
  123. package/dist/trionBidAdapter.js +1 -1
  124. package/dist/tripleliftBidAdapter.js +1 -1
  125. package/dist/ttdBidAdapter.js +1 -1
  126. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  127. package/dist/underdogmediaBidAdapter.js +1 -1
  128. package/dist/undertoneBidAdapter.js +1 -1
  129. package/dist/userId.js +1 -1
  130. package/dist/vidazooBidAdapter.js +1 -1
  131. package/dist/video.js +1 -0
  132. package/dist/videoModule.js +1 -0
  133. package/dist/videobyteBidAdapter.js +1 -1
  134. package/dist/videojsVideoProvider.js +1 -0
  135. package/dist/visxBidAdapter.js +1 -1
  136. package/dist/vuukleBidAdapter.js +1 -1
  137. package/dist/widespaceBidAdapter.js +1 -1
  138. package/dist/winrBidAdapter.js +1 -1
  139. package/dist/yahoosspBidAdapter.js +1 -1
  140. package/dist/yieldmoBidAdapter.js +1 -1
  141. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  142. package/integrationExamples/videoModule/jwplayer/bidMarkedAsUsed.html +98 -0
  143. package/integrationExamples/videoModule/jwplayer/bidRequestScheduling.html +89 -0
  144. package/integrationExamples/videoModule/jwplayer/eventListeners.html +244 -0
  145. package/integrationExamples/videoModule/jwplayer/gamAdServerMediation.html +122 -0
  146. package/integrationExamples/videoModule/jwplayer/mediaMetadata.html +80 -0
  147. package/integrationExamples/videoModule/jwplayer/playlist.html +122 -0
  148. package/integrationExamples/videoModule/videojs/bidMarkedAsUsed.html +126 -0
  149. package/integrationExamples/videoModule/videojs/bidRequestScheduling.html +132 -0
  150. package/integrationExamples/videoModule/videojs/eventListeners.html +238 -0
  151. package/integrationExamples/videoModule/videojs/gamAdServerMediation.html +138 -0
  152. package/integrationExamples/videoModule/videojs/mediaMetadata.html +103 -0
  153. package/integrationExamples/videoModule/videojs/playlist.html +151 -0
  154. package/libraries/ortbConverter/README.md +378 -0
  155. package/libraries/ortbConverter/converter.js +135 -0
  156. package/libraries/ortbConverter/lib/composer.js +43 -0
  157. package/libraries/ortbConverter/lib/mergeProcessors.js +9 -0
  158. package/libraries/ortbConverter/lib/sizes.js +14 -0
  159. package/libraries/ortbConverter/processors/banner.js +40 -0
  160. package/libraries/ortbConverter/processors/default.js +167 -0
  161. package/libraries/ortbConverter/processors/mediaType.js +21 -0
  162. package/libraries/ortbConverter/processors/native.js +37 -0
  163. package/libraries/ortbConverter/processors/video.js +66 -0
  164. package/libraries/pbsExtensions/pbsExtensions.js +12 -0
  165. package/libraries/pbsExtensions/processors/aliases.js +17 -0
  166. package/libraries/pbsExtensions/processors/mediaType.js +23 -0
  167. package/libraries/pbsExtensions/processors/params.js +22 -0
  168. package/libraries/pbsExtensions/processors/pbs.js +99 -0
  169. package/libraries/pbsExtensions/processors/requestExtPrebid.js +30 -0
  170. package/libraries/pbsExtensions/processors/video.js +23 -0
  171. package/libraries/video/constants/enums.js +5 -0
  172. package/libraries/video/constants/events.js +97 -0
  173. package/libraries/video/constants/ortb.js +169 -0
  174. package/libraries/video/constants/vendorCodes.js +6 -0
  175. package/libraries/video/shared/eventHandler.js +18 -0
  176. package/libraries/video/shared/parentModule.js +82 -0
  177. package/libraries/video/shared/state.js +47 -0
  178. package/libraries/video/shared/vastXmlBuilder.js +77 -0
  179. package/libraries/video/shared/vastXmlEditor.js +115 -0
  180. package/modules/.submodules.json +6 -1
  181. package/modules/aaxBlockmeterRtdProvider.js +59 -0
  182. package/modules/aaxBlockmeterRtdProvider.md +48 -0
  183. package/modules/appnexusBidAdapter.js +38 -1
  184. package/modules/chtnwBidAdapter.js +110 -0
  185. package/modules/chtnwBidAdapter.md +31 -0
  186. package/modules/concertBidAdapter.js +44 -2
  187. package/modules/consentManagement.js +22 -1
  188. package/modules/consentManagementUsp.js +29 -7
  189. package/modules/criteoBidAdapter.js +25 -5
  190. package/modules/currency.js +9 -0
  191. package/modules/dgkeywordRtdProvider.js +3 -3
  192. package/modules/gridNMBidAdapter.js +10 -14
  193. package/modules/improvedigitalBidAdapter.js +191 -470
  194. package/modules/ixBidAdapter.js +24 -64
  195. package/modules/jwplayerVideoProvider.js +929 -0
  196. package/modules/jwplayerVideoProvider.md +25 -0
  197. package/modules/kargoBidAdapter.js +1 -1
  198. package/modules/multibid/index.js +12 -0
  199. package/modules/openxOrtbBidAdapter.js +120 -275
  200. package/modules/oxxionRtdProvider.js +119 -0
  201. package/modules/oxxionRtdProvider.md +48 -0
  202. package/modules/prebidServerBidAdapter/index.js +19 -716
  203. package/modules/prebidServerBidAdapter/ortbConverter.js +274 -0
  204. package/modules/priceFloors.js +73 -1
  205. package/modules/rtdModule/index.js +22 -1
  206. package/modules/schain.js +24 -1
  207. package/modules/spotxBidAdapter.js +16 -15
  208. package/modules/synacormediaBidAdapter.js +1 -1
  209. package/modules/teadsIdSystem.js +5 -0
  210. package/modules/userId/index.js +64 -6
  211. package/modules/videoModule/addingSubmodule.md +521 -0
  212. package/modules/videoModule/coreVideo.js +234 -0
  213. package/modules/videoModule/gamAdServerSubmodule.js +27 -0
  214. package/modules/videoModule/index.js +244 -0
  215. package/modules/videoModule/videoImpressionVerifier.js +206 -0
  216. package/modules/videojsVideoProvider.js +854 -0
  217. package/modules/videojsVideoProvider.md +17 -0
  218. package/package.json +5 -1
  219. package/src/adapterManager.js +56 -7
  220. package/src/adloader.js +2 -1
  221. package/src/auction.js +5 -0
  222. package/src/events.js +5 -1
  223. package/src/pbjsORTB.js +35 -0
  224. package/src/prebid.js +137 -112
  225. package/src/targeting.js +10 -2
  226. package/src/utils/currency.js +16 -0
  227. package/src/utils.js +21 -0
  228. package/test/spec/auctionmanager_spec.js +6 -0
  229. package/test/spec/modules/aaxBlockmeter_spec.js +58 -0
  230. package/test/spec/modules/chtnwBidAdapter_spec.js +105 -0
  231. package/test/spec/modules/concertBidAdapter_spec.js +56 -0
  232. package/test/spec/modules/consentManagementUsp_spec.js +64 -18
  233. package/test/spec/modules/criteoBidAdapter_spec.js +28 -0
  234. package/test/spec/modules/dgkeywordRtdProvider_spec.js +3 -3
  235. package/test/spec/modules/improvedigitalBidAdapter_spec.js +231 -211
  236. package/test/spec/modules/ixBidAdapter_spec.js +230 -371
  237. package/test/spec/modules/openxOrtbBidAdapter_spec.js +77 -49
  238. package/test/spec/modules/oxxionRtdProvider_spec.js +142 -0
  239. package/test/spec/modules/prebidServerBidAdapter_spec.js +139 -137
  240. package/test/spec/modules/realTimeDataModule_spec.js +65 -0
  241. package/test/spec/modules/userId_spec.js +67 -1
  242. package/test/spec/modules/videoModule/coreVideo_spec.js +98 -0
  243. package/test/spec/modules/videoModule/pbVideo_spec.js +362 -0
  244. package/test/spec/modules/videoModule/shared/parentModule_spec.js +73 -0
  245. package/test/spec/modules/videoModule/shared/state_spec.js +26 -0
  246. package/test/spec/modules/videoModule/shared/vastXmlBuilder_spec.js +103 -0
  247. package/test/spec/modules/videoModule/shared/vastXmlEditor_spec.js +209 -0
  248. package/test/spec/modules/videoModule/submodules/jwplayerVideoProvider_spec.js +846 -0
  249. package/test/spec/modules/videoModule/submodules/videojsVideoProvider_spec.js +391 -0
  250. package/test/spec/modules/videoModule/videoImpressionVerifier_spec.js +112 -0
  251. package/test/spec/ortbConverter/banner_spec.js +203 -0
  252. package/test/spec/ortbConverter/composer_spec.js +69 -0
  253. package/test/spec/ortbConverter/converter_spec.js +283 -0
  254. package/test/spec/ortbConverter/currency_spec.js +40 -0
  255. package/test/spec/ortbConverter/default_processors_spec.js +61 -0
  256. package/test/spec/ortbConverter/gdpr_spec.js +38 -0
  257. package/test/spec/ortbConverter/mediaTypes_spec.js +67 -0
  258. package/test/spec/ortbConverter/mergeProcessors_spec.js +59 -0
  259. package/test/spec/ortbConverter/multibid_spec.js +35 -0
  260. package/test/spec/ortbConverter/native_spec.js +95 -0
  261. package/test/spec/ortbConverter/pbjsORTB_spec.js +67 -0
  262. package/test/spec/ortbConverter/pbsExtensions/aliases_spec.js +57 -0
  263. package/test/spec/ortbConverter/pbsExtensions/params_spec.js +96 -0
  264. package/test/spec/ortbConverter/pbsExtensions/video_spec.js +52 -0
  265. package/test/spec/ortbConverter/priceFloors_spec.js +143 -0
  266. package/test/spec/ortbConverter/schain_spec.js +33 -0
  267. package/test/spec/ortbConverter/userId_spec.js +21 -0
  268. package/test/spec/ortbConverter/usp_spec.js +15 -0
  269. package/test/spec/ortbConverter/video_spec.js +189 -0
  270. package/test/spec/unit/core/adapterManager_spec.js +102 -0
  271. package/test/spec/unit/core/targeting_spec.js +34 -0
  272. package/test/spec/unit/pbjs_api_spec.js +124 -45
  273. package/test/spec/utils_spec.js +45 -1
@@ -0,0 +1,48 @@
1
+ ## Overview
2
+
3
+ Module Name: AAX Blockmeter Realtime Data Module
4
+ Module Type: Rtd Provider
5
+ Maintainer: product@aax.media
6
+
7
+ ## Description
8
+
9
+ The module enables publishers to measure traffic coming from visitors using adblockers.
10
+
11
+ AAX can also help publishers monetize this traffic by allowing them to serve [acceptable ads](https://acceptableads.com/about/) to these adblock visitors and recover their lost revenue. [Reach out to us](https://www.aax.media/try-blockmeter/) to know more.
12
+
13
+ ## Integration
14
+
15
+ Build the AAX Blockmeter Realtime Data Module into the Prebid.js package with:
16
+
17
+ ```
18
+ gulp build --modules=aaxBlockmeterRtdProvider,rtdModule
19
+ ```
20
+
21
+ ## Configuration
22
+
23
+ This module is configured as part of the `realTimeData.dataProviders` object.
24
+
25
+ | Name | Scope | Description | Example | Type |
26
+ |:----------:|:--------:|:-----------------------------|:---------------:|:------:|
27
+ | `name` | required | Real time data module name | `'aaxBlockmeter'` | `string` |
28
+ | `params` | required | | | `Object` |
29
+ | `params.pub` | required | AAX to share pub ID, [Reach out to us](https://www.aax.media/try-blockmeter/) to know more! | `'AAX00000'` | `string` |
30
+ | `params.url` | optional | AAX Blockmeter Script Url. Defaults to `'c.aaxads.com/aax.js?ver=1.2'` | `'c.aaxads.com/aax.js?ver=1.2'` | `string` |
31
+
32
+ ### Example
33
+
34
+ ```javascript
35
+ pbjs.setConfig({
36
+ "realTimeData": {
37
+ "dataProviders": [
38
+ {
39
+ "name": "aaxBlockmeter",
40
+ "params": {
41
+ "pub": "AAX00000",
42
+ "url": "c.aaxads.com/aax.js?ver=1.2",
43
+ }
44
+ }
45
+ ]
46
+ }
47
+ })
48
+ ```
@@ -43,7 +43,7 @@ const URL = 'https://ib.adnxs.com/ut/v3/prebid';
43
43
  const URL_SIMPLE = 'https://ib.adnxs-simple.com/ut/v3/prebid';
44
44
  const VIDEO_TARGETING = ['id', 'minduration', 'maxduration',
45
45
  'skippable', 'playback_method', 'frameworks', 'context', 'skipoffset'];
46
- const VIDEO_RTB_TARGETING = ['minduration', 'maxduration', 'skip', 'skipafter', 'playbackmethod', 'api'];
46
+ const VIDEO_RTB_TARGETING = ['minduration', 'maxduration', 'skip', 'skipafter', 'playbackmethod', 'api', 'startdelay'];
47
47
  const USER_PARAMS = ['age', 'externalUid', 'segments', 'gender', 'dnt', 'language'];
48
48
  const APP_DEVICE_PARAMS = ['geo', 'device_id']; // appid is collected separately
49
49
  const DEBUG_PARAMS = ['enabled', 'dongle', 'member_id', 'debug_timeout'];
@@ -920,6 +920,17 @@ function bidToTag(bid) {
920
920
  tag['video_frameworks'] = apiTmp;
921
921
  }
922
922
  break;
923
+
924
+ case 'startdelay':
925
+ case 'placement':
926
+ const contextKey = 'context';
927
+ if (typeof tag.video[contextKey] !== 'number') {
928
+ const placement = videoMediaType['placement'];
929
+ const startdelay = videoMediaType['startdelay'];
930
+ const context = getContextFromPlacement(placement) || getContextFromStartDelay(startdelay);
931
+ tag.video[contextKey] = VIDEO_MAPPING[contextKey][context];
932
+ }
933
+ break;
923
934
  }
924
935
  });
925
936
  }
@@ -967,6 +978,32 @@ function transformSizes(requestSizes) {
967
978
  return sizes;
968
979
  }
969
980
 
981
+ function getContextFromPlacement(ortbPlacement) {
982
+ if (!ortbPlacement) {
983
+ return;
984
+ }
985
+
986
+ if (ortbPlacement === 2) {
987
+ return 'in-banner';
988
+ } else if (ortbPlacement > 2) {
989
+ return 'outstream';
990
+ }
991
+ }
992
+
993
+ function getContextFromStartDelay(ortbStartDelay) {
994
+ if (!ortbStartDelay) {
995
+ return;
996
+ }
997
+
998
+ if (ortbStartDelay === 0) {
999
+ return 'pre_roll';
1000
+ } else if (ortbStartDelay === -1) {
1001
+ return 'mid_roll';
1002
+ } else if (ortbStartDelay === -2) {
1003
+ return 'post_roll';
1004
+ }
1005
+ }
1006
+
970
1007
  function hasUserInfo(bid) {
971
1008
  return !!bid.params.user;
972
1009
  }
@@ -0,0 +1,110 @@
1
+ import {
2
+ generateUUID,
3
+ getDNT,
4
+ _each,
5
+ } from '../src/utils.js';
6
+ import { config } from '../src/config.js';
7
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
8
+ import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
9
+ import { getStorageManager } from '../src/storageManager.js';
10
+ import { ajax } from '../src/ajax.js';
11
+ import {BANNER, VIDEO, NATIVE} from '../src/mediaTypes.js';
12
+ const ENDPOINT_URL = 'https://prebid.cht.hinet.net/api/v1';
13
+ const BIDDER_CODE = 'chtnw';
14
+ const COOKIE_NAME = '__htid';
15
+ const storage = getStorageManager({bidderCode: BIDDER_CODE});
16
+
17
+ const { getConfig } = config;
18
+
19
+ function _isMobile() {
20
+ return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent);
21
+ }
22
+
23
+ export const spec = {
24
+ code: BIDDER_CODE,
25
+ supportedMediaTypes: [BANNER, VIDEO, NATIVE],
26
+ isBidRequestValid: function(bid = {}) {
27
+ return !!(bid && bid.params);
28
+ },
29
+ buildRequests: function(validBidRequests = [], bidderRequest = {}) {
30
+ validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
31
+ const chtnwId = (storage.getCookie(COOKIE_NAME) != undefined) ? storage.getCookie(COOKIE_NAME) : generateUUID();
32
+ if (storage.cookiesAreEnabled()) {
33
+ storage.setCookie(COOKIE_NAME, chtnwId);
34
+ }
35
+ const device = getConfig('device') || {};
36
+ device.w = device.w || window.innerWidth;
37
+ device.h = device.h || window.innerHeight;
38
+ device.ua = device.ua || navigator.userAgent;
39
+ device.dnt = getDNT() ? 1 : 0;
40
+ device.language = (navigator && navigator.language) ? navigator.language.split('-')[0] : '';
41
+ const bidParams = [];
42
+ _each(validBidRequests, function(bid) {
43
+ bidParams.push({
44
+ bidId: bid.bidId,
45
+ placement: bid.params.placementId,
46
+ sizes: bid.sizes,
47
+ adSlot: bid.adUnitCode
48
+ });
49
+ });
50
+ return {
51
+ method: 'POST',
52
+ url: ENDPOINT_URL + '/request/prebid.json',
53
+ data: {
54
+ bids: bidParams,
55
+ uuid: chtnwId,
56
+ device: device,
57
+ version: {
58
+ prebid: '$prebid.version$',
59
+ adapter: '1.0.0',
60
+ },
61
+ site: {
62
+ numIframes: bidderRequest.refererInfo?.numIframes || 0,
63
+ isAmp: bidderRequest.refererInfo?.isAmp || false,
64
+ pageUrl: bidderRequest.refererInfo?.page || '',
65
+ ref: bidderRequest.refererInfo?.ref || '',
66
+ },
67
+ },
68
+ bids: validBidRequests
69
+ };
70
+ },
71
+ interpretResponse: function(serverResponse) {
72
+ const bidResponses = []
73
+ _each(serverResponse.body, function(response, i) {
74
+ bidResponses.push({
75
+ ...response
76
+ });
77
+ });
78
+ return bidResponses;
79
+ },
80
+ getUserSyncs: function(syncOptions, serverResponses, gdprConsent, uspConsent) {
81
+ const syncs = [];
82
+ if (syncOptions.pixelEnabled) {
83
+ const chtnwId = generateUUID()
84
+ const uuid = chtnwId
85
+ const type = (_isMobile()) ? 'dot' : 'pixel';
86
+ syncs.push({
87
+ type: 'image',
88
+ url: `https://t.ssp.hinet.net/${type}?bd=${uuid}&t=chtnw`
89
+ })
90
+ }
91
+ return syncs
92
+ },
93
+ onTimeout: function(timeoutData) {
94
+ if (timeoutData === null) {
95
+ return;
96
+ }
97
+ ajax(ENDPOINT_URL + '/trace/timeout/bid', null, JSON.stringify(timeoutData), {
98
+ method: 'POST',
99
+ withCredentials: false
100
+ });
101
+ },
102
+ onBidWon: function(bid) {
103
+ if (bid.nurl) {
104
+ ajax(bid.nurl, null);
105
+ }
106
+ },
107
+ onSetTargeting: function(bid) {
108
+ },
109
+ }
110
+ registerBidder(spec);
@@ -0,0 +1,31 @@
1
+ # Overview
2
+
3
+ ```
4
+ Module Name: CHT Bidder Adapter
5
+ Module Type: Bidder Adapter
6
+ Maintainer: chtdsp@cht.com.tw
7
+ ```
8
+
9
+ # Description
10
+
11
+ Module that connects to CHT's demand sources
12
+
13
+ # Test Parameters
14
+ ```
15
+ var adUnits = [
16
+ {
17
+ code: 'adunit-code',
18
+ mediaTypes: {
19
+ banner: {
20
+ sizes: [[300, 250]]
21
+ }
22
+ },
23
+ bids: [{
24
+ bidder: 'chtnw',
25
+ params: {
26
+ placementId: '38EL412LO82XR9O6'
27
+ }
28
+ }]
29
+ }
30
+ ];
31
+ ```
@@ -34,6 +34,9 @@ export const spec = {
34
34
  buildRequests: function(validBidRequests, bidderRequest) {
35
35
  logMessage(validBidRequests);
36
36
  logMessage(bidderRequest);
37
+
38
+ const eids = [];
39
+
37
40
  let payload = {
38
41
  meta: {
39
42
  prebidVersion: '$prebid.version$',
@@ -49,6 +52,10 @@ export const spec = {
49
52
  };
50
53
 
51
54
  payload.slots = validBidRequests.map(bidRequest => {
55
+ collectEid(eids, bidRequest);
56
+ const adUnitElement = document.getElementById(bidRequest.adUnitCode)
57
+ const coordinates = getOffset(adUnitElement)
58
+
52
59
  let slot = {
53
60
  name: bidRequest.adUnitCode,
54
61
  bidId: bidRequest.bidId,
@@ -59,12 +66,15 @@ export const spec = {
59
66
  adSlot: bidRequest.params.slot || bidRequest.adUnitCode,
60
67
  placementId: bidRequest.params.placementId || '',
61
68
  site: bidRequest.params.site || bidderRequest.refererInfo.page,
62
- ref: bidderRequest.refererInfo.ref
63
- };
69
+ ref: bidderRequest.refererInfo.ref,
70
+ offsetCoordinates: { x: coordinates?.left, y: coordinates?.top }
71
+ }
64
72
 
65
73
  return slot;
66
74
  });
67
75
 
76
+ payload.meta.eids = eids.filter(Boolean);
77
+
68
78
  logMessage(payload);
69
79
 
70
80
  return {
@@ -216,3 +226,35 @@ function consentAllowsPpid(bidderRequest) {
216
226
 
217
227
  return (uspConsent || gdprConsent);
218
228
  }
229
+
230
+ function collectEid(eids, bid) {
231
+ if (bid.userId) {
232
+ const eid = getUserId(bid.userId.uid2 && bid.userId.uid2.id, 'uidapi.com', undefined, 3)
233
+ eids.push(eid)
234
+ }
235
+ }
236
+
237
+ function getUserId(id, source, uidExt, atype) {
238
+ if (id) {
239
+ const uid = { id, atype };
240
+
241
+ if (uidExt) {
242
+ uid.ext = uidExt;
243
+ }
244
+
245
+ return {
246
+ source,
247
+ uids: [ uid ]
248
+ };
249
+ }
250
+ }
251
+
252
+ function getOffset(el) {
253
+ if (el) {
254
+ const rect = el.getBoundingClientRect();
255
+ return {
256
+ left: rect.left + window.scrollX,
257
+ top: rect.top + window.scrollY
258
+ };
259
+ }
260
+ }
@@ -4,11 +4,12 @@
4
4
  * and make it available for any GDPR supported adapters to read/pass this information to
5
5
  * their system.
6
6
  */
7
- import {isNumber, isPlainObject, isStr, logError, logInfo, logWarn} from '../src/utils.js';
7
+ import {deepSetValue, isNumber, isPlainObject, isStr, logError, logInfo, logWarn} from '../src/utils.js';
8
8
  import {config} from '../src/config.js';
9
9
  import {gdprDataHandler} from '../src/adapterManager.js';
10
10
  import {includes} from '../src/polyfill.js';
11
11
  import {timedAuctionHook} from '../src/utils/perfMetrics.js';
12
+ import {registerOrtbProcessor, REQUEST} from '../src/pbjsORTB.js';
12
13
 
13
14
  const DEFAULT_CMP = 'iab';
14
15
  const DEFAULT_CONSENT_TIMEOUT = 10000;
@@ -354,3 +355,23 @@ export function setConsentConfig(config) {
354
355
  loadConsentData(); // immediately look up consent data to make it available without requiring an auction
355
356
  }
356
357
  config.getConfig('consentManagement', config => setConsentConfig(config.consentManagement));
358
+
359
+ export function setOrtbGdpr(ortbRequest, bidderRequest) {
360
+ const consent = bidderRequest.gdprConsent;
361
+ if (consent) {
362
+ if (typeof consent.gdprApplies === 'boolean') {
363
+ deepSetValue(ortbRequest, 'regs.ext.gdpr', consent.gdprApplies ? 1 : 0);
364
+ }
365
+ deepSetValue(ortbRequest, 'user.ext.consent', consent.consentString);
366
+ }
367
+ }
368
+
369
+ export function setOrtbAdditionalConsent(ortbRequest, bidderRequest) {
370
+ const addtl = bidderRequest.gdprConsent?.addtlConsent;
371
+ if (addtl && typeof addtl === 'string') {
372
+ deepSetValue(ortbRequest, 'user.ext.ConsentedProvidersSettings.consented_providers', addtl);
373
+ }
374
+ }
375
+
376
+ registerOrtbProcessor({type: REQUEST, name: 'gdpr', fn: setOrtbGdpr});
377
+ registerOrtbProcessor({type: REQUEST, name: 'gdprAddtlConsent', fn: setOrtbAdditionalConsent})
@@ -4,9 +4,10 @@
4
4
  * information and make it available for any USP (CCPA) supported adapters to
5
5
  * read/pass this information to their system.
6
6
  */
7
- import {isFn, isNumber, isPlainObject, isStr, logError, logInfo, logWarn} from '../src/utils.js';
7
+ import {deepSetValue, isFn, isNumber, isPlainObject, isStr, logError, logInfo, logWarn} from '../src/utils.js';
8
8
  import {config} from '../src/config.js';
9
- import {uspDataHandler} from '../src/adapterManager.js';
9
+ import adapterManager, {uspDataHandler} from '../src/adapterManager.js';
10
+ import {registerOrtbProcessor, REQUEST} from '../src/pbjsORTB.js';
10
11
  import {timedAuctionHook} from '../src/utils/perfMetrics.js';
11
12
  import {getHook} from '../src/hook.js';
12
13
 
@@ -114,6 +115,11 @@ function lookupUspConsent({onSuccess, onError}) {
114
115
  USPAPI_VERSION,
115
116
  callbackHandler.consentDataCallback
116
117
  );
118
+ uspapiFunction(
119
+ 'registerDeletion',
120
+ USPAPI_VERSION,
121
+ adapterManager.callDataDeletionRequest
122
+ )
117
123
  } else {
118
124
  logInfo(
119
125
  'Detected USP CMP is outside the current iframe where Prebid.js is located, calling it now...'
@@ -123,12 +129,17 @@ function lookupUspConsent({onSuccess, onError}) {
123
129
  uspapiFrame,
124
130
  callbackHandler.consentDataCallback
125
131
  );
132
+ callUspApiWhileInIframe(
133
+ 'registerDeletion',
134
+ uspapiFrame,
135
+ adapterManager.callDataDeletionRequest
136
+ );
126
137
  }
127
138
 
139
+ let listening = false;
140
+
128
141
  function callUspApiWhileInIframe(commandName, uspapiFrame, moduleCallback) {
129
- /* Setup up a __uspapi function to do the postMessage and stash the callback.
130
- This function behaves, from the caller's perspective, identicially to the in-frame __uspapi call (although it is not synchronous) */
131
- window.__uspapi = function (cmd, ver, callback) {
142
+ function callUsp(cmd, ver, callback) {
132
143
  let callId = Math.random() + '';
133
144
  let msg = {
134
145
  __uspapiCall: {
@@ -143,10 +154,13 @@ function lookupUspConsent({onSuccess, onError}) {
143
154
  };
144
155
 
145
156
  /** when we get the return message, call the stashed callback */
146
- window.addEventListener('message', readPostMessageResponse, false);
157
+ if (!listening) {
158
+ window.addEventListener('message', readPostMessageResponse, false);
159
+ listening = true;
160
+ }
147
161
 
148
162
  // call uspapi
149
- window.__uspapi(commandName, USPAPI_VERSION, moduleCallback);
163
+ callUsp(commandName, USPAPI_VERSION, moduleCallback);
150
164
 
151
165
  function readPostMessageResponse(event) {
152
166
  const res = event && event.data && event.data.__uspapiReturn;
@@ -308,3 +322,11 @@ function enableConsentManagement(configFromUser = false) {
308
322
  config.getConfig('consentManagement', config => setConsentConfig(config.consentManagement));
309
323
 
310
324
  getHook('requestBids').before(requestBidsHook, 50);
325
+
326
+ export function setOrtbUsp(ortbRequest, bidderRequest) {
327
+ if (bidderRequest.uspConsent) {
328
+ deepSetValue(ortbRequest, 'regs.ext.us_privacy', bidderRequest.uspConsent);
329
+ }
330
+ }
331
+
332
+ registerOrtbProcessor({type: REQUEST, name: 'usp', fn: setOrtbUsp});
@@ -27,7 +27,7 @@ const LOG_PREFIX = 'Criteo: ';
27
27
  Unminified source code can be found in the privately shared repo: https://github.com/Prebid-org/prebid-js-external-js-criteo/blob/master/dist/prod.js
28
28
  */
29
29
  const FAST_BID_VERSION_PLACEHOLDER = '%FAST_BID_VERSION%';
30
- export const FAST_BID_VERSION_CURRENT = 130;
30
+ export const FAST_BID_VERSION_CURRENT = 132;
31
31
  const FAST_BID_VERSION_LATEST = 'latest';
32
32
  const FAST_BID_VERSION_NONE = 'none';
33
33
  const PUBLISHER_TAG_URL_TEMPLATE = 'https://static.criteo.net/js/ld/publishertag.prebid' + FAST_BID_VERSION_PLACEHOLDER + '.js';
@@ -644,26 +644,46 @@ for (var i = 0; i < 10; ++i) {
644
644
  </script>`;
645
645
  }
646
646
 
647
+ function pickAvailableGetFloorFunc(bidRequest) {
648
+ if (bidRequest.getFloor) {
649
+ return bidRequest.getFloor;
650
+ }
651
+ if (bidRequest.params.bidFloor && bidRequest.params.bidFloorCur) {
652
+ try {
653
+ const floor = parseFloat(bidRequest.params.bidFloor);
654
+ return () => {
655
+ return {
656
+ currency: bidRequest.params.bidFloorCur,
657
+ floor: floor
658
+ };
659
+ };
660
+ } catch { }
661
+ }
662
+ return undefined;
663
+ }
664
+
647
665
  function enrichSlotWithFloors(slot, bidRequest) {
648
666
  try {
649
667
  const slotFloors = {};
650
668
 
651
- if (bidRequest.getFloor) {
669
+ const getFloor = pickAvailableGetFloorFunc(bidRequest);
670
+
671
+ if (getFloor) {
652
672
  if (bidRequest.mediaTypes?.banner) {
653
673
  slotFloors.banner = {};
654
674
  const bannerSizes = parseSizes(deepAccess(bidRequest, 'mediaTypes.banner.sizes'))
655
- bannerSizes.forEach(bannerSize => slotFloors.banner[parseSize(bannerSize).toString()] = bidRequest.getFloor({ size: bannerSize, mediaType: BANNER }));
675
+ bannerSizes.forEach(bannerSize => slotFloors.banner[parseSize(bannerSize).toString()] = getFloor({ size: bannerSize, mediaType: BANNER }));
656
676
  }
657
677
 
658
678
  if (bidRequest.mediaTypes?.video) {
659
679
  slotFloors.video = {};
660
680
  const videoSizes = parseSizes(deepAccess(bidRequest, 'mediaTypes.video.playerSize'))
661
- videoSizes.forEach(videoSize => slotFloors.video[parseSize(videoSize).toString()] = bidRequest.getFloor({ size: videoSize, mediaType: VIDEO }));
681
+ videoSizes.forEach(videoSize => slotFloors.video[parseSize(videoSize).toString()] = getFloor({ size: videoSize, mediaType: VIDEO }));
662
682
  }
663
683
 
664
684
  if (bidRequest.mediaTypes?.native) {
665
685
  slotFloors.native = {};
666
- slotFloors.native['*'] = bidRequest.getFloor({ size: '*', mediaType: NATIVE });
686
+ slotFloors.native['*'] = getFloor({ size: '*', mediaType: NATIVE });
667
687
  }
668
688
 
669
689
  if (Object.keys(slotFloors).length > 0) {
@@ -5,6 +5,7 @@ import {ajax} from '../src/ajax.js';
5
5
  import {config} from '../src/config.js';
6
6
  import {getHook} from '../src/hook.js';
7
7
  import {defer} from '../src/utils/promise.js';
8
+ import {registerOrtbProcessor, REQUEST} from '../src/pbjsORTB.js';
8
9
  import {timedBidResponseHook} from '../src/utils/perfMetrics.js';
9
10
 
10
11
  const DEFAULT_CURRENCY_RATE_URL = 'https://cdn.jsdelivr.net/gh/prebid/currency-file@1/latest.json?date=$$TODAY$$';
@@ -314,3 +315,11 @@ function roundFloat(num, dec) {
314
315
  }
315
316
  return Math.round(num * d) / d;
316
317
  }
318
+
319
+ export function setOrtbCurrency(ortbRequest, bidderRequest, context) {
320
+ if (currencySupportEnabled) {
321
+ ortbRequest.cur = ortbRequest.cur || [context.currency || adServerCurrency];
322
+ }
323
+ }
324
+
325
+ registerOrtbProcessor({type: REQUEST, name: 'currency', fn: setOrtbCurrency});
@@ -41,7 +41,7 @@ export function getDgKeywordsAndSet(reqBidsConfigObj, callback, moduleConfig, us
41
41
  } else {
42
42
  logMessage('[dgkeyword sub module] dgkeyword targets:', setKeywordTargetBidders);
43
43
  logMessage('[dgkeyword sub module] get targets from profile api start.');
44
- ajax(getProfileApiUrl(moduleConfig?.params?.url, moduleConfig?.params?.disableReadFpid), {
44
+ ajax(getProfileApiUrl(moduleConfig?.params?.url, moduleConfig?.params?.enableReadFpid), {
45
45
  success: function(response) {
46
46
  const res = JSON.parse(response);
47
47
  if (!isFinish) {
@@ -96,9 +96,9 @@ export function getDgKeywordsAndSet(reqBidsConfigObj, callback, moduleConfig, us
96
96
  }
97
97
  }
98
98
 
99
- export function getProfileApiUrl(customeUrl, disableReadFpid) {
99
+ export function getProfileApiUrl(customeUrl, enableReadFpid) {
100
100
  const URL = 'https://mediaconsortium.profiles.tagger.opecloud.com/api/v1';
101
- const fpid = (disableReadFpid) ? '' : readFpidFromLocalStrage();
101
+ const fpid = (enableReadFpid) ? readFpidFromLocalStrage() : '';
102
102
  let url = customeUrl || URL;
103
103
  url = url + '?url=' + encodeURIComponent(window.location.href) + ((fpid) ? `&fpid=${fpid}` : '');
104
104
  return url;
@@ -34,8 +34,6 @@ const LOG_ERROR_MESS = {
34
34
  hasNoArrayOfBids: 'Seatbid from response has no array of bid objects - '
35
35
  };
36
36
 
37
- const VIDEO_KEYS = ['mimes', 'protocols', 'startdelay', 'placement', 'linearity', 'skip', 'skipmin', 'skipafter', 'sequence', 'battr', 'maxextended', 'minbitrate', 'maxbitrate', 'boxingallowed', 'playbackmethod', 'playbackend', 'delivery', 'pos', 'companionad', 'api', 'companiontype'];
38
-
39
37
  export const spec = {
40
38
  code: BIDDER_CODE,
41
39
  supportedMediaTypes: [ VIDEO ],
@@ -105,7 +103,7 @@ export const spec = {
105
103
  const impObj = {
106
104
  id: bidId.toString(),
107
105
  tagid: secid.toString(),
108
- video: createVideoForImp(video, sizes, mediaTypes && mediaTypes.video),
106
+ video: createVideoForImp(mergeDeep({}, video, mediaTypes && mediaTypes.video), sizes),
109
107
  ext: {
110
108
  divid: adUnitCode.toString()
111
109
  }
@@ -386,13 +384,7 @@ function createRenderer (bid, rendererParams) {
386
384
  return renderer;
387
385
  }
388
386
 
389
- function createVideoForImp({ mind, maxd, size, ...paramsVideo }, bidSizes, bidVideo = {}) {
390
- VIDEO_KEYS.forEach((key) => {
391
- if (!(key in paramsVideo) && key in bidVideo) {
392
- paramsVideo[key] = bidVideo[key];
393
- }
394
- });
395
-
387
+ function createVideoForImp({ mind, maxd, size, ...paramsVideo }, bidSizes) {
396
388
  if (size && isStr(size)) {
397
389
  const sizeArray = size.split('x');
398
390
  if (sizeArray.length === 2 && parseInt(sizeArray[0]) && parseInt(sizeArray[1])) {
@@ -402,7 +394,7 @@ function createVideoForImp({ mind, maxd, size, ...paramsVideo }, bidSizes, bidVi
402
394
  }
403
395
 
404
396
  if (!paramsVideo.w || !paramsVideo.h) {
405
- const playerSizes = bidVideo.playerSize && bidVideo.playerSize.length === 2 ? bidVideo.playerSize : bidSizes;
397
+ const playerSizes = paramsVideo.playerSize && paramsVideo.playerSize.length === 2 ? paramsVideo.playerSize : bidSizes;
406
398
  if (playerSizes) {
407
399
  const playerSize = playerSizes[0];
408
400
  if (playerSize) {
@@ -411,9 +403,13 @@ function createVideoForImp({ mind, maxd, size, ...paramsVideo }, bidSizes, bidVi
411
403
  }
412
404
  }
413
405
 
414
- const durationRangeSec = bidVideo.durationRangeSec || [];
415
- const minDur = mind || durationRangeSec[0] || bidVideo.minduration;
416
- const maxDur = maxd || durationRangeSec[1] || bidVideo.maxduration;
406
+ if (paramsVideo.playerSize) {
407
+ delete paramsVideo.playerSize;
408
+ }
409
+
410
+ const durationRangeSec = paramsVideo.durationRangeSec || [];
411
+ const minDur = mind || durationRangeSec[0] || paramsVideo.minduration;
412
+ const maxDur = maxd || durationRangeSec[1] || paramsVideo.maxduration;
417
413
 
418
414
  if (minDur) {
419
415
  paramsVideo.minduration = minDur;