prebid.js 7.44.0 → 7.46.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 (309) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/acuityAdsBidAdapter.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adgenerationBidAdapter.js +1 -1
  7. package/dist/admaticBidAdapter.js +1 -1
  8. package/dist/adnuntiusBidAdapter.js +1 -1
  9. package/dist/adrelevantisBidAdapter.js +1 -1
  10. package/dist/adtrgtmeBidAdapter.js +1 -1
  11. package/dist/adxcgBidAdapter.js +1 -1
  12. package/dist/adyoulikeBidAdapter.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/appushBidAdapter.js +1 -1
  19. package/dist/asoBidAdapter.js +1 -1
  20. package/dist/axonixBidAdapter.js +1 -1
  21. package/dist/beyondmediaBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  24. package/dist/big-richmediaBidAdapter.js +1 -1
  25. package/dist/braveBidAdapter.js +1 -1
  26. package/dist/bridgewellBidAdapter.js +1 -1
  27. package/dist/brightMountainMediaBidAdapter.js +1 -1
  28. package/dist/brightcomBidAdapter.js +1 -1
  29. package/dist/brightcomSSPBidAdapter.js +1 -1
  30. package/dist/carodaBidAdapter.js +1 -1
  31. package/dist/chtnwBidAdapter.js +1 -1
  32. package/dist/coinzillaBidAdapter.js +1 -1
  33. package/dist/compassBidAdapter.js +1 -1
  34. package/dist/concertBidAdapter.js +1 -1
  35. package/dist/connectIdSystem.js +1 -1
  36. package/dist/connectadBidAdapter.js +1 -1
  37. package/dist/consumableBidAdapter.js +1 -1
  38. package/dist/contentexchangeBidAdapter.js +1 -1
  39. package/dist/conversantAnalyticsAdapter.js +1 -1
  40. package/dist/conversantBidAdapter.js +1 -1
  41. package/dist/craftBidAdapter.js +1 -1
  42. package/dist/criteoBidAdapter.js +1 -1
  43. package/dist/cwireBidAdapter.js +1 -1
  44. package/dist/debugging-standalone.js +1 -1
  45. package/dist/dependencies.json +15 -0
  46. package/dist/domainOverrideToRootDomain.js +1 -0
  47. package/dist/dspxBidAdapter.js +1 -1
  48. package/dist/eplanningBidAdapter.js +1 -1
  49. package/dist/eskimiBidAdapter.js +1 -0
  50. package/dist/feedadBidAdapter.js +1 -1
  51. package/dist/finativeBidAdapter.js +1 -1
  52. package/dist/freewheel-sspBidAdapter.js +1 -1
  53. package/dist/glimpseBidAdapter.js +1 -1
  54. package/dist/globalsunBidAdapter.js +1 -1
  55. package/dist/gmosspBidAdapter.js +1 -1
  56. package/dist/goldbachBidAdapter.js +1 -1
  57. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  58. package/dist/gridBidAdapter.js +1 -1
  59. package/dist/growthCodeIdSystem.js +1 -1
  60. package/dist/gumgumBidAdapter.js +1 -1
  61. package/dist/h12mediaBidAdapter.js +1 -1
  62. package/dist/id5IdSystem.js +1 -1
  63. package/dist/improvedigitalBidAdapter.js +1 -1
  64. package/dist/inmarBidAdapter.js +1 -1
  65. package/dist/insticatorBidAdapter.js +1 -1
  66. package/dist/iqzoneBidAdapter.js +1 -1
  67. package/dist/ivsBidAdapter.js +1 -0
  68. package/dist/ixBidAdapter.js +1 -1
  69. package/dist/justpremiumBidAdapter.js +1 -1
  70. package/dist/jwplayerVideoProvider.js +1 -1
  71. package/dist/kargoBidAdapter.js +1 -1
  72. package/dist/koblerBidAdapter.js +1 -1
  73. package/dist/konduitAnalyticsAdapter.js +1 -1
  74. package/dist/kueezBidAdapter.js +1 -1
  75. package/dist/kueezRtbBidAdapter.js +1 -1
  76. package/dist/kulturemediaBidAdapter.js +1 -1
  77. package/dist/lassoBidAdapter.js +1 -1
  78. package/dist/lifestreetBidAdapter.js +1 -1
  79. package/dist/liveIntentIdSystem.js +1 -1
  80. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  81. package/dist/logicadBidAdapter.js +1 -1
  82. package/dist/loglyliftBidAdapter.js +1 -1
  83. package/dist/luponmediaBidAdapter.js +1 -1
  84. package/dist/magniteAnalyticsAdapter.js +1 -1
  85. package/dist/malltvAnalyticsAdapter.js +1 -1
  86. package/dist/marsmediaBidAdapter.js +1 -1
  87. package/dist/mathildeadsBidAdapter.js +1 -1
  88. package/dist/mediafuseBidAdapter.js +1 -1
  89. package/dist/medianetBidAdapter.js +1 -1
  90. package/dist/mediasquareBidAdapter.js +1 -1
  91. package/dist/mgidBidAdapter.js +1 -1
  92. package/dist/minutemediaBidAdapter.js +1 -1
  93. package/dist/minutemediaplusBidAdapter.js +1 -1
  94. package/dist/nativoBidAdapter.js +1 -1
  95. package/dist/neuwoRtdProvider.js +1 -1
  96. package/dist/nexx360BidAdapter.js +1 -1
  97. package/dist/not-for-prod/prebid.js +165 -162
  98. package/dist/oguryBidAdapter.js +1 -1
  99. package/dist/onetagBidAdapter.js +1 -1
  100. package/dist/onomagicBidAdapter.js +1 -1
  101. package/dist/ooloAnalyticsAdapter.js +1 -1
  102. package/dist/openxBidAdapter.js +1 -1
  103. package/dist/openxOrtbBidAdapter.js +1 -1
  104. package/dist/operaadsBidAdapter.js +1 -1
  105. package/dist/optidigitalBidAdapter.js +1 -1
  106. package/dist/ortbConverter.js +1 -1
  107. package/dist/outbrainBidAdapter.js +1 -1
  108. package/dist/pairIdSystem.js +1 -0
  109. package/dist/parrableIdSystem.js +1 -1
  110. package/dist/pixfutureBidAdapter.js +1 -1
  111. package/dist/prebid-core.js +1 -1
  112. package/dist/publinkIdSystem.js +1 -1
  113. package/dist/pubmaticBidAdapter.js +1 -1
  114. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  115. package/dist/pubxBidAdapter.js +1 -1
  116. package/dist/pxyzBidAdapter.js +1 -1
  117. package/dist/quantcastBidAdapter.js +1 -1
  118. package/dist/readpeakBidAdapter.js +1 -1
  119. package/dist/relaidoBidAdapter.js +1 -1
  120. package/dist/rhythmoneBidAdapter.js +1 -1
  121. package/dist/riseBidAdapter.js +1 -1
  122. package/dist/rubiconAnalyticsAdapter.js +1 -1
  123. package/dist/rubiconBidAdapter.js +1 -1
  124. package/dist/seedingAllianceBidAdapter.js +1 -1
  125. package/dist/seedtagBidAdapter.js +1 -1
  126. package/dist/sharedIdSystem.js +1 -1
  127. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  128. package/dist/sharethroughBidAdapter.js +1 -1
  129. package/dist/shinezBidAdapter.js +1 -1
  130. package/dist/smaatoBidAdapter.js +1 -1
  131. package/dist/smartadserverBidAdapter.js +1 -1
  132. package/dist/smarthubBidAdapter.js +1 -1
  133. package/dist/smartxBidAdapter.js +1 -1
  134. package/dist/smilewantedBidAdapter.js +1 -1
  135. package/dist/sonobiBidAdapter.js +1 -1
  136. package/dist/sovrnAnalyticsAdapter.js +1 -1
  137. package/dist/sovrnBidAdapter.js +1 -1
  138. package/dist/sspBCBidAdapter.js +1 -1
  139. package/dist/stvBidAdapter.js +1 -1
  140. package/dist/sublimeBidAdapter.js +1 -1
  141. package/dist/synacormediaBidAdapter.js +1 -1
  142. package/dist/targetVideoBidAdapter.js +1 -1
  143. package/dist/teadsBidAdapter.js +1 -1
  144. package/dist/trionBidAdapter.js +1 -1
  145. package/dist/tripleliftBidAdapter.js +1 -1
  146. package/dist/truereachBidAdapter.js +1 -1
  147. package/dist/ttdBidAdapter.js +1 -1
  148. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  149. package/dist/uid2IdSystem.js +1 -1
  150. package/dist/underdogmediaBidAdapter.js +1 -1
  151. package/dist/undertoneBidAdapter.js +1 -1
  152. package/dist/userId.js +1 -1
  153. package/dist/vidazooBidAdapter.js +1 -1
  154. package/dist/videobyteBidAdapter.js +1 -1
  155. package/dist/videoheroesBidAdapter.js +1 -1
  156. package/dist/vidoomyBidAdapter.js +1 -1
  157. package/dist/visiblemeasuresBidAdapter.js +1 -1
  158. package/dist/visxBidAdapter.js +1 -1
  159. package/dist/vrtcalBidAdapter.js +1 -1
  160. package/dist/vuukleBidAdapter.js +1 -1
  161. package/dist/widespaceBidAdapter.js +1 -1
  162. package/dist/winrBidAdapter.js +1 -1
  163. package/dist/yahoosspBidAdapter.js +1 -1
  164. package/dist/yieldmoBidAdapter.js +1 -1
  165. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  166. package/dist/yieldoneBidAdapter.js +1 -1
  167. package/integrationExamples/gpt/fledge_example.html +103 -0
  168. package/integrationExamples/gpt/prebidServer_fledge_example.html +111 -0
  169. package/libraries/domainOverrideToRootDomain/index.js +39 -0
  170. package/libraries/ortbConverter/processors/video.js +1 -0
  171. package/modules/acuityAdsBidAdapter.js +1 -1
  172. package/modules/admaticBidAdapter.js +7 -2
  173. package/modules/adnuntiusBidAdapter.js +3 -1
  174. package/modules/amxBidAdapter.js +1 -1
  175. package/modules/amxIdSystem.js +23 -20
  176. package/modules/amxIdSystem.md +7 -7
  177. package/modules/appnexusBidAdapter.js +108 -102
  178. package/modules/appushBidAdapter.js +1 -1
  179. package/modules/beyondmediaBidAdapter.js +1 -1
  180. package/modules/bidwatchAnalyticsAdapter.js +2 -0
  181. package/modules/braveBidAdapter.js +1 -1
  182. package/modules/brightcomBidAdapter.js +1 -1
  183. package/modules/brightcomSSPBidAdapter.js +1 -1
  184. package/modules/coinzillaBidAdapter.js +1 -2
  185. package/modules/compassBidAdapter.js +1 -1
  186. package/modules/connectIdSystem.js +96 -21
  187. package/modules/connectIdSystem.md +6 -5
  188. package/modules/contentexchangeBidAdapter.js +1 -1
  189. package/modules/conversantBidAdapter.js +3 -0
  190. package/modules/criteoBidAdapter.js +5 -1
  191. package/modules/eskimiBidAdapter.js +72 -0
  192. package/modules/eskimiBidAdapter.md +34 -0
  193. package/modules/freewheel-sspBidAdapter.js +8 -0
  194. package/modules/glimpseBidAdapter.js +1 -2
  195. package/modules/globalsunBidAdapter.js +1 -1
  196. package/modules/gridBidAdapter.js +43 -20
  197. package/modules/growthCodeIdSystem.js +18 -15
  198. package/modules/gumgumBidAdapter.js +1 -1
  199. package/modules/iqzoneBidAdapter.js +1 -1
  200. package/modules/ivsBidAdapter.js +85 -0
  201. package/modules/ivsBidAdapter.md +34 -0
  202. package/modules/ixBidAdapter.js +72 -105
  203. package/modules/jwplayerVideoProvider.js +25 -32
  204. package/modules/kargoBidAdapter.js +473 -246
  205. package/modules/koblerBidAdapter.js +1 -2
  206. package/modules/kueezBidAdapter.js +1 -1
  207. package/modules/kueezRtbBidAdapter.js +16 -4
  208. package/modules/liveIntentIdSystem.js +8 -0
  209. package/modules/luponmediaBidAdapter.js +1 -1
  210. package/modules/magniteAnalyticsAdapter.js +76 -3
  211. package/modules/mathildeadsBidAdapter.js +1 -1
  212. package/modules/medianetBidAdapter.js +1 -1
  213. package/modules/mediasquareBidAdapter.js +2 -1
  214. package/modules/mgidBidAdapter.js +178 -26
  215. package/modules/minutemediaBidAdapter.js +1 -1
  216. package/modules/minutemediaplusBidAdapter.js +16 -4
  217. package/modules/nativoBidAdapter.js +110 -21
  218. package/modules/neuwoRtdProvider.js +0 -2
  219. package/modules/oguryBidAdapter.js +3 -2
  220. package/modules/onomagicBidAdapter.js +1 -2
  221. package/modules/openxBidAdapter.js +192 -563
  222. package/modules/openxBidAdapter.md +22 -20
  223. package/modules/openxOrtbBidAdapter.js +13 -11
  224. package/modules/openxOrtbBidAdapter.md +5 -3
  225. package/modules/operaadsBidAdapter.js +1 -1
  226. package/modules/pairIdSystem.js +79 -0
  227. package/modules/pubmaticBidAdapter.js +13 -10
  228. package/modules/pubxBidAdapter.js +5 -2
  229. package/modules/riseBidAdapter.js +1 -1
  230. package/modules/sharedIdSystem.js +4 -27
  231. package/modules/sharethroughBidAdapter.js +1 -1
  232. package/modules/shinezBidAdapter.js +1 -1
  233. package/modules/smarthubBidAdapter.js +1 -1
  234. package/modules/synacormediaBidAdapter.js +1 -3
  235. package/modules/truereachBidAdapter.js +1 -2
  236. package/modules/userId/eids.js +24 -0
  237. package/modules/userId/eids.md +16 -0
  238. package/modules/videoheroesBidAdapter.js +1 -1
  239. package/modules/vidoomyBidAdapter.js +33 -4
  240. package/modules/visiblemeasuresBidAdapter.js +1 -1
  241. package/modules/vrtcalBidAdapter.js +1 -1
  242. package/modules/yieldmoBidAdapter.js +15 -5
  243. package/modules/yieldoneBidAdapter.js +1 -1
  244. package/package.json +1 -1
  245. package/src/Renderer.js +2 -1
  246. package/src/config.js +78 -127
  247. package/src/native.js +5 -1
  248. package/test/spec/auctionmanager_spec.js +2 -2
  249. package/test/spec/libraries/domainOverrideToRootDomain/index_spec.js +77 -0
  250. package/test/spec/modules/1plusXRtdProvider_spec.js +8 -7
  251. package/test/spec/modules/acuityAdsBidAdapter_spec.js +2 -1
  252. package/test/spec/modules/adagioBidAdapter_spec.js +0 -25
  253. package/test/spec/modules/admaticBidAdapter_spec.js +1 -1
  254. package/test/spec/modules/adnuntiusBidAdapter_spec.js +2 -1
  255. package/test/spec/modules/amxIdSystem_spec.js +13 -26
  256. package/test/spec/modules/appnexusBidAdapter_spec.js +464 -448
  257. package/test/spec/modules/appushBidAdapter_spec.js +2 -1
  258. package/test/spec/modules/axonixBidAdapter_spec.js +0 -27
  259. package/test/spec/modules/beyondmediaBidAdapter_spec.js +2 -1
  260. package/test/spec/modules/big-richmediaBidAdapter_spec.js +68 -64
  261. package/test/spec/modules/compassBidAdapter_spec.js +2 -1
  262. package/test/spec/modules/connectIdSystem_spec.js +420 -242
  263. package/test/spec/modules/contentexchangeBidAdapter_spec.js +2 -1
  264. package/test/spec/modules/conversantBidAdapter_spec.js +1 -0
  265. package/test/spec/modules/criteoBidAdapter_spec.js +33 -1
  266. package/test/spec/modules/eids_spec.js +30 -0
  267. package/test/spec/modules/eskimiBidAdapter_spec.js +155 -0
  268. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +37 -0
  269. package/test/spec/modules/globalsunBidAdapter_spec.js +2 -1
  270. package/test/spec/modules/gridBidAdapter_spec.js +8 -0
  271. package/test/spec/modules/iqzoneBidAdapter_spec.js +2 -1
  272. package/test/spec/modules/ivsBidAdapter_spec.js +197 -0
  273. package/test/spec/modules/ixBidAdapter_spec.js +141 -71
  274. package/test/spec/modules/kargoBidAdapter_spec.js +297 -140
  275. package/test/spec/modules/koblerBidAdapter_spec.js +0 -20
  276. package/test/spec/modules/kueezRtbBidAdapter_spec.js +22 -2
  277. package/test/spec/modules/liveIntentIdSystem_spec.js +10 -0
  278. package/test/spec/modules/luponmediaBidAdapter_spec.js +1 -1
  279. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +129 -1
  280. package/test/spec/modules/mathildeadsBidAdapter_spec.js +2 -1
  281. package/test/spec/modules/mgidBidAdapter_spec.js +184 -36
  282. package/test/spec/modules/minutemediaplusBidAdapter_spec.js +22 -2
  283. package/test/spec/modules/nativoBidAdapter_spec.js +101 -0
  284. package/test/spec/modules/neuwoRtdProvider_spec.js +0 -1
  285. package/test/spec/modules/oguryBidAdapter_spec.js +19 -4
  286. package/test/spec/modules/ooloAnalyticsAdapter_spec.js +1 -1
  287. package/test/spec/modules/openxBidAdapter_spec.js +1157 -1936
  288. package/test/spec/modules/openxOrtbBidAdapter_spec.js +12 -39
  289. package/test/spec/modules/pairIdSystem_spec.js +68 -0
  290. package/test/spec/modules/pubCommonId_spec.js +0 -17
  291. package/test/spec/modules/pubmaticBidAdapter_spec.js +868 -867
  292. package/test/spec/modules/pubxBidAdapter_spec.js +10 -2
  293. package/test/spec/modules/realvuAnalyticsAdapter_spec.js +0 -5
  294. package/test/spec/modules/sharedIdSystem_spec.js +0 -46
  295. package/test/spec/modules/sharethroughBidAdapter_spec.js +2 -1
  296. package/test/spec/modules/smarthubBidAdapter_spec.js +2 -1
  297. package/test/spec/modules/synacormediaBidAdapter_spec.js +0 -26
  298. package/test/spec/modules/videoModule/submodules/jwplayerVideoProvider_spec.js +17 -4
  299. package/test/spec/modules/vidoomyBidAdapter_spec.js +58 -0
  300. package/test/spec/modules/visiblemeasuresBidAdapter_spec.js +2 -1
  301. package/test/spec/modules/vrtcalBidAdapter_spec.js +3 -2
  302. package/test/spec/modules/yieldmoBidAdapter_spec.js +19 -1
  303. package/test/spec/renderer_spec.js +1 -2
  304. package/test/spec/unit/pbjs_api_spec.js +19 -3
  305. package/test/test_index.js +13 -3
  306. package/dist/gridNMBidAdapter.js +0 -1
  307. package/modules/gridNMBidAdapter.js +0 -422
  308. package/modules/gridNMBidAdapter.md +0 -39
  309. package/test/spec/modules/gridNMBidAdapter_spec.js +0 -636
@@ -10,28 +10,25 @@ import {ajaxBuilder} from '../src/ajax.js';
10
10
  import {submodule} from '../src/hook.js';
11
11
  import {getRefererInfo} from '../src/refererDetection.js';
12
12
  import {deepAccess, logError} from '../src/utils.js';
13
+ import {getStorageManager} from '../src/storageManager.js';
14
+ import {MODULE_TYPE_UID} from '../src/activities/modules.js';
15
+ import {domainOverrideToRootDomain} from '../libraries/domainOverrideToRootDomain/index.js';
13
16
 
14
17
  const NAME = 'amxId';
15
18
  const GVL_ID = 737;
16
19
  const ID_KEY = NAME;
17
- const version = '1.0';
20
+ const version = '2.0';
18
21
  const SYNC_URL = 'https://id.a-mx.com/sync/';
19
22
  const AJAX_TIMEOUT = 300;
23
+ const AJAX_OPTIONS = {method: 'GET', withCredentials: true, contentType: 'text/plain'};
20
24
 
21
- function validateConfig(config) {
22
- if (config == null || config.storage == null) {
23
- logError(`${NAME}: config.storage is required.`);
24
- return false;
25
- }
26
-
27
- if (config.storage.type !== 'html5') {
28
- logError(
29
- `${NAME} only supports storage.type "html5". ${config.storage.type} was provided`
30
- );
31
- return false;
32
- }
25
+ export const storage = getStorageManager({moduleName: NAME, moduleType: MODULE_TYPE_UID});
26
+ const AMUID_KEY = '__amuidpb';
27
+ const getBidAdapterID = () => storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(AMUID_KEY) : null;
33
28
 
29
+ function validateConfig(config) {
34
30
  if (
31
+ config.storage != null &&
35
32
  typeof config.storage.expires === 'number' &&
36
33
  config.storage.expires > 30
37
34
  ) {
@@ -44,7 +41,7 @@ function validateConfig(config) {
44
41
  return true;
45
42
  }
46
43
 
47
- function handleSyncResponse(client, response, callback) {
44
+ function handleSyncResponse(client, response, params, callback) {
48
45
  if (response.id != null && response.id.length > 0) {
49
46
  callback(response.id);
50
47
  return;
@@ -72,7 +69,7 @@ function handleSyncResponse(client, response, callback) {
72
69
  logError(`${NAME} invalid value`, complete);
73
70
  callback(null);
74
71
  },
75
- });
72
+ }, params, AJAX_OPTIONS);
76
73
  }
77
74
 
78
75
  export const amxIdSubmodule = {
@@ -97,6 +94,8 @@ export const amxIdSubmodule = {
97
94
  ? { [ID_KEY]: value }
98
95
  : undefined,
99
96
 
97
+ domainOverride: domainOverrideToRootDomain(storage, NAME),
98
+
100
99
  getId(config, consentData, _extant) {
101
100
  if (!validateConfig(config)) {
102
101
  return undefined;
@@ -109,12 +108,18 @@ export const amxIdSubmodule = {
109
108
 
110
109
  const params = {
111
110
  tagId: deepAccess(config, 'params.tagId', ''),
112
- // TODO: are these referer values correct?
111
+
113
112
  ref: ref.ref,
114
113
  u: ref.location,
114
+ tl: ref.topmostLocation,
115
+ nf: ref.numIframes,
116
+ rt: ref.reachedTop,
117
+
115
118
  v: '$prebid.version$',
119
+ av: version,
116
120
  vg: '$$PREBID_GLOBAL$$',
117
121
  us_privacy: usp,
122
+ am: getBidAdapterID(),
118
123
  gdpr: consent.gdprApplies ? 1 : 0,
119
124
  gdpr_consent: consent.consentString,
120
125
  };
@@ -131,7 +136,7 @@ export const amxIdSubmodule = {
131
136
  if (responseText != null && responseText.length > 0) {
132
137
  try {
133
138
  const parsed = JSON.parse(responseText);
134
- handleSyncResponse(client, parsed, done);
139
+ handleSyncResponse(client, parsed, params, done);
135
140
  return;
136
141
  } catch (e) {
137
142
  logError(`${NAME} invalid response`, responseText);
@@ -142,9 +147,7 @@ export const amxIdSubmodule = {
142
147
  },
143
148
  },
144
149
  params,
145
- {
146
- method: 'GET'
147
- }
150
+ AJAX_OPTIONS
148
151
  );
149
152
 
150
153
  return { callback };
@@ -29,15 +29,15 @@ pbjs.setConfig({
29
29
  | Param under `userSync.userIds[]` | Scope | Type | Description | Example |
30
30
  | -------------------------------- | -------- | ------ | --------------------------- | ----------------------------------------- |
31
31
  | name | Required | string | ID for the amxId module | `"amxId"` |
32
- | storage | Required | Object | Settings for amxId storage | See [storage settings](#storage-settings) |
32
+ | storage | Optional | Object | Settings for amxId storage | See [storage settings](#storage-settings) |
33
33
  | params | Optional | Object | Parameters for amxId module | See [params](#params) |
34
34
 
35
35
  ### Storage Settings
36
36
 
37
- The following settings are available for the `storage` property in the `userSync.userIds[]` object:
37
+ The following settings are suggested for the `storage` property in the `userSync.userIds[]` object:
38
38
 
39
- | Param under `storage` | Scope | Type | Description | Example |
40
- | --------------------- | -------- | ------------ | -------------------------------------------------------------------------------- | --------- |
41
- | name | Required | String | Where the ID will be stored | `"amxId"` |
42
- | type | Required | String | This must be `"html5"` | `"html5"` |
43
- | expires | Required | Number <= 30 | number of days until the stored ID expires. **Must be less than or equal to 30** | `14` |
39
+ | Param under `storage` | Type | Description | Example |
40
+ | --------------------- | ------------ | -------------------------------------------------------------------------------- | --------- |
41
+ | name | String | Where the ID will be stored | `"amxId"` |
42
+ | type | String | For best performance, this should be `"html5"` | `"html5"` |
43
+ | expires | Number <= 30 | number of days until the stored ID expires. **Must be less than or equal to 30** | `14` |
@@ -333,14 +333,16 @@ export const spec = {
333
333
  payload.referrer_detection = refererinfo;
334
334
  }
335
335
 
336
- const hasAdPodBid = find(bidRequests, hasAdPod);
337
- if (hasAdPodBid) {
338
- bidRequests.filter(hasAdPod).forEach(adPodBid => {
339
- const adPodTags = createAdPodRequest(tags, adPodBid);
340
- // don't need the original adpod placement because it's in adPodTags
341
- const nonPodTags = payload.tags.filter(tag => tag.uuid !== adPodBid.bidId);
342
- payload.tags = [...nonPodTags, ...adPodTags];
343
- });
336
+ if (FEATURES.VIDEO) {
337
+ const hasAdPodBid = find(bidRequests, hasAdPod);
338
+ if (hasAdPodBid) {
339
+ bidRequests.filter(hasAdPod).forEach(adPodBid => {
340
+ const adPodTags = createAdPodRequest(tags, adPodBid);
341
+ // don't need the original adpod placement because it's in adPodTags
342
+ const nonPodTags = payload.tags.filter(tag => tag.uuid !== adPodBid.bidId);
343
+ payload.tags = [...nonPodTags, ...adPodTags];
344
+ });
345
+ }
344
346
  }
345
347
 
346
348
  if (bidRequests[0].userId) {
@@ -653,7 +655,7 @@ function newBid(serverBid, rtbBid, bidderRequest) {
653
655
  bid.meta = Object.assign({}, bid.meta, { brandId: rtbBid.brand_id });
654
656
  }
655
657
 
656
- if (rtbBid.rtb.video) {
658
+ if (FEATURES.VIDEO && rtbBid.rtb.video) {
657
659
  // shared video properties used for all 3 contexts
658
660
  Object.assign(bid, {
659
661
  width: rtbBid.rtb.video.player_width,
@@ -865,107 +867,111 @@ function bidToTag(bid) {
865
867
  }
866
868
  }
867
869
 
868
- const videoMediaType = deepAccess(bid, `mediaTypes.${VIDEO}`);
869
- const context = deepAccess(bid, 'mediaTypes.video.context');
870
-
871
- if (videoMediaType && context === 'adpod') {
872
- tag.hb_source = 7;
873
- } else {
874
- tag.hb_source = 1;
875
- }
876
- if (bid.mediaType === VIDEO || videoMediaType) {
877
- tag.ad_types.push(VIDEO);
878
- }
879
-
880
- // instream gets vastUrl, outstream gets vastXml
881
- if (bid.mediaType === VIDEO || (videoMediaType && context !== 'outstream')) {
882
- tag.require_asset_url = true;
883
- }
870
+ if (FEATURES.VIDEO) {
871
+ const videoMediaType = deepAccess(bid, `mediaTypes.${VIDEO}`);
872
+ const context = deepAccess(bid, 'mediaTypes.video.context');
884
873
 
885
- if (bid.params.video) {
886
- tag.video = {};
887
- // place any valid video params on the tag
888
- Object.keys(bid.params.video)
889
- .filter(param => includes(VIDEO_TARGETING, param))
890
- .forEach(param => {
891
- switch (param) {
892
- case 'context':
893
- case 'playback_method':
894
- let type = bid.params.video[param];
895
- type = (isArray(type)) ? type[0] : type;
896
- tag.video[param] = VIDEO_MAPPING[param][type];
897
- break;
898
- // Deprecating tags[].video.frameworks in favor of tags[].video_frameworks
899
- case 'frameworks':
900
- break;
901
- default:
902
- tag.video[param] = bid.params.video[param];
903
- }
904
- });
874
+ if (videoMediaType && context === 'adpod') {
875
+ tag.hb_source = 7;
876
+ } else {
877
+ tag.hb_source = 1;
878
+ }
879
+ if (bid.mediaType === VIDEO || videoMediaType) {
880
+ tag.ad_types.push(VIDEO);
881
+ }
905
882
 
906
- if (bid.params.video.frameworks && isArray(bid.params.video.frameworks)) {
907
- tag['video_frameworks'] = bid.params.video.frameworks;
883
+ // instream gets vastUrl, outstream gets vastXml
884
+ if (bid.mediaType === VIDEO || (videoMediaType && context !== 'outstream')) {
885
+ tag.require_asset_url = true;
908
886
  }
909
- }
910
887
 
911
- // use IAB ORTB values if the corresponding values weren't already set by bid.params.video
912
- if (videoMediaType) {
913
- tag.video = tag.video || {};
914
- Object.keys(videoMediaType)
915
- .filter(param => includes(VIDEO_RTB_TARGETING, param))
916
- .forEach(param => {
917
- switch (param) {
918
- case 'minduration':
919
- case 'maxduration':
920
- if (typeof tag.video[param] !== 'number') tag.video[param] = videoMediaType[param];
921
- break;
922
- case 'skip':
923
- if (typeof tag.video['skippable'] !== 'boolean') tag.video['skippable'] = (videoMediaType[param] === 1);
924
- break;
925
- case 'skipafter':
926
- if (typeof tag.video['skipoffset'] !== 'number') tag.video['skippoffset'] = videoMediaType[param];
927
- break;
928
- case 'playbackmethod':
929
- if (typeof tag.video['playback_method'] !== 'number') {
930
- let type = videoMediaType[param];
888
+ if (bid.params.video) {
889
+ tag.video = {};
890
+ // place any valid video params on the tag
891
+ Object.keys(bid.params.video)
892
+ .filter(param => includes(VIDEO_TARGETING, param))
893
+ .forEach(param => {
894
+ switch (param) {
895
+ case 'context':
896
+ case 'playback_method':
897
+ let type = bid.params.video[param];
931
898
  type = (isArray(type)) ? type[0] : type;
899
+ tag.video[param] = VIDEO_MAPPING[param][type];
900
+ break;
901
+ // Deprecating tags[].video.frameworks in favor of tags[].video_frameworks
902
+ case 'frameworks':
903
+ break;
904
+ default:
905
+ tag.video[param] = bid.params.video[param];
906
+ }
907
+ });
932
908
 
933
- // we only support iab's options 1-4 at this time.
934
- if (type >= 1 && type <= 4) {
935
- tag.video['playback_method'] = type;
936
- }
937
- }
938
- break;
939
- case 'api':
940
- if (!tag['video_frameworks'] && isArray(videoMediaType[param])) {
941
- // need to read thru array; remove 6 (we don't support it), swap 4 <> 5 if found (to match our adserver mapping for these specific values)
942
- let apiTmp = videoMediaType[param].map(val => {
943
- let v = (val === 4) ? 5 : (val === 5) ? 4 : val;
944
-
945
- if (v >= 1 && v <= 5) {
946
- return v;
909
+ if (bid.params.video.frameworks && isArray(bid.params.video.frameworks)) {
910
+ tag['video_frameworks'] = bid.params.video.frameworks;
911
+ }
912
+ }
913
+
914
+ // use IAB ORTB values if the corresponding values weren't already set by bid.params.video
915
+ if (videoMediaType) {
916
+ tag.video = tag.video || {};
917
+ Object.keys(videoMediaType)
918
+ .filter(param => includes(VIDEO_RTB_TARGETING, param))
919
+ .forEach(param => {
920
+ switch (param) {
921
+ case 'minduration':
922
+ case 'maxduration':
923
+ if (typeof tag.video[param] !== 'number') tag.video[param] = videoMediaType[param];
924
+ break;
925
+ case 'skip':
926
+ if (typeof tag.video['skippable'] !== 'boolean') tag.video['skippable'] = (videoMediaType[param] === 1);
927
+ break;
928
+ case 'skipafter':
929
+ if (typeof tag.video['skipoffset'] !== 'number') tag.video['skippoffset'] = videoMediaType[param];
930
+ break;
931
+ case 'playbackmethod':
932
+ if (typeof tag.video['playback_method'] !== 'number') {
933
+ let type = videoMediaType[param];
934
+ type = (isArray(type)) ? type[0] : type;
935
+
936
+ // we only support iab's options 1-4 at this time.
937
+ if (type >= 1 && type <= 4) {
938
+ tag.video['playback_method'] = type;
947
939
  }
948
- }).filter(v => v);
949
- tag['video_frameworks'] = apiTmp;
950
- }
951
- break;
952
-
953
- case 'startdelay':
954
- case 'placement':
955
- const contextKey = 'context';
956
- if (typeof tag.video[contextKey] !== 'number') {
957
- const placement = videoMediaType['placement'];
958
- const startdelay = videoMediaType['startdelay'];
959
- const context = getContextFromPlacement(placement) || getContextFromStartDelay(startdelay);
960
- tag.video[contextKey] = VIDEO_MAPPING[contextKey][context];
961
- }
962
- break;
963
- }
964
- });
965
- }
940
+ }
941
+ break;
942
+ case 'api':
943
+ if (!tag['video_frameworks'] && isArray(videoMediaType[param])) {
944
+ // need to read thru array; remove 6 (we don't support it), swap 4 <> 5 if found (to match our adserver mapping for these specific values)
945
+ let apiTmp = videoMediaType[param].map(val => {
946
+ let v = (val === 4) ? 5 : (val === 5) ? 4 : val;
947
+
948
+ if (v >= 1 && v <= 5) {
949
+ return v;
950
+ }
951
+ }).filter(v => v);
952
+ tag['video_frameworks'] = apiTmp;
953
+ }
954
+ break;
955
+
956
+ case 'startdelay':
957
+ case 'placement':
958
+ const contextKey = 'context';
959
+ if (typeof tag.video[contextKey] !== 'number') {
960
+ const placement = videoMediaType['placement'];
961
+ const startdelay = videoMediaType['startdelay'];
962
+ const context = getContextFromPlacement(placement) || getContextFromStartDelay(startdelay);
963
+ tag.video[contextKey] = VIDEO_MAPPING[contextKey][context];
964
+ }
965
+ break;
966
+ }
967
+ });
968
+ }
966
969
 
967
- if (bid.renderer) {
968
- tag.video = Object.assign({}, tag.video, { custom_renderer_present: true });
970
+ if (bid.renderer) {
971
+ tag.video = Object.assign({}, tag.video, { custom_renderer_present: true });
972
+ }
973
+ } else {
974
+ tag.hb_source = 1;
969
975
  }
970
976
 
971
977
  if (bid.params.frameworks && isArray(bid.params.frameworks)) {
@@ -154,7 +154,7 @@ export const spec = {
154
154
  coppa: config.getConfig('coppa') === true ? 1 : 0,
155
155
  ccpa: bidderRequest.uspConsent || undefined,
156
156
  gdpr: bidderRequest.gdprConsent || undefined,
157
- tmax: config.getConfig('bidderTimeout')
157
+ tmax: bidderRequest.timeout
158
158
  };
159
159
 
160
160
  const len = validBidRequests.length;
@@ -145,7 +145,7 @@ export const spec = {
145
145
  coppa: config.getConfig('coppa') === true ? 1 : 0,
146
146
  ccpa: bidderRequest.uspConsent || undefined,
147
147
  gdpr: bidderRequest.gdprConsent || undefined,
148
- tmax: config.getConfig('bidderTimeout')
148
+ tmax: bidderRequest.timeout
149
149
  };
150
150
 
151
151
  const len = validBidRequests.length;
@@ -2,6 +2,7 @@ import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
2
2
  import adapterManager from '../src/adapterManager.js';
3
3
  import CONSTANTS from '../src/constants.json';
4
4
  import { ajax } from '../src/ajax.js';
5
+ import { getRefererInfo } from '../src/refererDetection.js';
5
6
 
6
7
  const analyticsType = 'endpoint';
7
8
  const url = 'URL_TO_SERVER_ENDPOINT';
@@ -145,6 +146,7 @@ function handleBidWon(args) {
145
146
  });
146
147
  }
147
148
  args['cpmIncrement'] = increment;
149
+ args['referer'] = encodeURIComponent(getRefererInfo().page || getRefererInfo().topmostLocation);
148
150
  if (typeof saveEvents.bidRequested == 'object' && saveEvents.bidRequested.length > 0 && saveEvents.bidRequested[0].gdprConsent) { args.gdpr = saveEvents.bidRequested[0].gdprConsent; }
149
151
  ajax(endpoint + '.bidwatch.io/analytics/bid_won', null, JSON.stringify(args), {method: 'POST', withCredentials: true});
150
152
  }
@@ -83,7 +83,7 @@ export const spec = {
83
83
  domain: parseUrl(page).hostname,
84
84
  page: page,
85
85
  },
86
- tmax: bidderRequest.timeout || config.getConfig('bidderTimeout') || 500,
86
+ tmax: bidderRequest.timeout,
87
87
  imp
88
88
  };
89
89
 
@@ -68,7 +68,7 @@ function buildRequests(bidReqs, bidderRequest) {
68
68
  w: screen.width,
69
69
  h: screen.height
70
70
  },
71
- tmax: config.getConfig('bidderTimeout')
71
+ tmax: bidderRequest?.timeout
72
72
  };
73
73
 
74
74
  if (bidderRequest && bidderRequest.gdprConsent) {
@@ -84,7 +84,7 @@ function buildRequests(bidReqs, bidderRequest) {
84
84
  w: screen.width,
85
85
  h: screen.height
86
86
  },
87
- tmax: config.getConfig('bidderTimeout')
87
+ tmax: bidderRequest?.timeout
88
88
  };
89
89
 
90
90
  if (bidderRequest?.gdprConsent) {
@@ -1,5 +1,4 @@
1
1
  import { parseSizesInput } from '../src/utils.js';
2
- import {config} from '../src/config.js';
3
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
4
3
 
5
4
  const BIDDER_CODE = 'coinzilla';
@@ -78,7 +77,7 @@ export const spec = {
78
77
  dealId: dealId,
79
78
  currency: currency,
80
79
  netRevenue: netRevenue,
81
- ttl: config.getConfig('_bidderTimeout'),
80
+ ttl: bidRequest.timeout,
82
81
  referrer: referrer,
83
82
  ad: response.ad,
84
83
  mediaType: response.mediaType,
@@ -155,7 +155,7 @@ export const spec = {
155
155
  coppa: config.getConfig('coppa') === true ? 1 : 0,
156
156
  ccpa: bidderRequest.uspConsent || undefined,
157
157
  gdpr: bidderRequest.gdprConsent || undefined,
158
- tmax: config.getConfig('bidderTimeout')
158
+ tmax: bidderRequest.timeout
159
159
  };
160
160
 
161
161
  const len = validBidRequests.length;
@@ -8,14 +8,86 @@
8
8
  import {ajax} from '../src/ajax.js';
9
9
  import {submodule} from '../src/hook.js';
10
10
  import {includes} from '../src/polyfill.js';
11
- import {formatQS, logError} from '../src/utils.js';
11
+ import {getRefererInfo} from '../src/refererDetection.js';
12
+ import {getStorageManager} from '../src/storageManager.js';
13
+ import {formatQS, isPlainObject, logError, parseUrl} from '../src/utils.js';
14
+ import {uspDataHandler} from '../src/adapterManager.js';
15
+ import {MODULE_TYPE_UID} from '../src/activities/modules.js';
12
16
 
13
17
  const MODULE_NAME = 'connectId';
18
+ const STORAGE_EXPIRY_DAYS = 14;
14
19
  const VENDOR_ID = 25;
15
20
  const PLACEHOLDER = '__PIXEL_ID__';
16
21
  const UPS_ENDPOINT = `https://ups.analytics.yahoo.com/ups/${PLACEHOLDER}/fed`;
17
22
  const OVERRIDE_OPT_OUT_KEY = 'connectIdOptOut';
18
23
  const INPUT_PARAM_KEYS = ['pixelId', 'he', 'puid'];
24
+ export const storage = getStorageManager({moduleType: MODULE_TYPE_UID, moduleName: MODULE_NAME});
25
+
26
+ /**
27
+ * @function
28
+ * @param {Object} obj
29
+ */
30
+ function storeObject(obj) {
31
+ const expires = Date.now() + (60 * 60 * 24 * 1000 * STORAGE_EXPIRY_DAYS);
32
+ if (storage.cookiesAreEnabled()) {
33
+ setEtldPlusOneCookie(MODULE_NAME, JSON.stringify(obj), new Date(expires), getSiteHostname());
34
+ } else if (storage.localStorageIsEnabled()) {
35
+ obj.__expires = expires;
36
+ storage.setDataInLocalStorage(MODULE_NAME, obj);
37
+ }
38
+ }
39
+
40
+ /**
41
+ * Attempts to store a cookie on eTLD + 1
42
+ *
43
+ * @function
44
+ * @param {String} key
45
+ * @param {String} value
46
+ * @param {Date} expirationDate
47
+ * @param {String} hostname
48
+ */
49
+ function setEtldPlusOneCookie(key, value, expirationDate, hostname) {
50
+ const subDomains = hostname.split('.');
51
+ for (let i = 0; i < subDomains.length; ++i) {
52
+ const domain = subDomains.slice(subDomains.length - i - 1, subDomains.length).join('.');
53
+ try {
54
+ storage.setCookie(key, value, expirationDate.toUTCString(), null, '.' + domain);
55
+ const storedCookie = storage.getCookie(key);
56
+ if (storedCookie && storedCookie === value) {
57
+ break;
58
+ }
59
+ } catch (error) {}
60
+ }
61
+ }
62
+
63
+ function getIdFromCookie() {
64
+ if (storage.cookiesAreEnabled()) {
65
+ try {
66
+ return JSON.parse(storage.getCookie(MODULE_NAME));
67
+ } catch {}
68
+ }
69
+ return null;
70
+ }
71
+
72
+ function getIdFromLocalStorage() {
73
+ if (storage.localStorageIsEnabled()) {
74
+ const storedIdData = storage.getDataFromLocalStorage(MODULE_NAME);
75
+ if (storedIdData) {
76
+ if (isPlainObject(storedIdData) && storedIdData.__expires &&
77
+ storedIdData.__expires <= Date.now()) {
78
+ storage.removeDataFromLocalStorage(MODULE_NAME);
79
+ return null;
80
+ }
81
+ return storedIdData;
82
+ }
83
+ }
84
+ return null;
85
+ }
86
+
87
+ function getSiteHostname() {
88
+ const pageInfo = parseUrl(getRefererInfo().page);
89
+ return pageInfo.hostname;
90
+ }
19
91
 
20
92
  /** @type {Submodule} */
21
93
  export const connectIdSubmodule = {
@@ -37,8 +109,8 @@ export const connectIdSubmodule = {
37
109
  if (connectIdSubmodule.userHasOptedOut()) {
38
110
  return undefined;
39
111
  }
40
- return (typeof value === 'object' && value.connectid)
41
- ? {connectId: value.connectid} : undefined;
112
+ return (isPlainObject(value) && (value.connectId || value.connectid))
113
+ ? {connectId: value.connectId || value.connectid} : undefined;
42
114
  },
43
115
  /**
44
116
  * Gets the Yahoo ConnectID
@@ -54,21 +126,28 @@ export const connectIdSubmodule = {
54
126
  const params = config.params || {};
55
127
  if (!params || (typeof params.he !== 'string' && typeof params.puid !== 'string') ||
56
128
  (typeof params.pixelId === 'undefined' && typeof params.endpoint === 'undefined')) {
57
- logError('The connectId submodule requires the \'pixelId\' and at least one of the \'he\' ' +
58
- 'or \'puid\' parameters to be defined.');
129
+ logError(`${MODULE_NAME} module: configurataion requires the 'pixelId' and at ` +
130
+ `least one of the 'he' or 'puid' parameters to be defined.`);
59
131
  return;
60
132
  }
61
133
 
134
+ const storedId = getIdFromCookie() || getIdFromLocalStorage();
135
+ if (storedId) {
136
+ return {id: storedId};
137
+ }
138
+
139
+ const uspString = uspDataHandler.getConsentData() || '';
62
140
  const data = {
141
+ v: '1',
63
142
  '1p': includes([1, '1', true], params['1p']) ? '1' : '0',
64
143
  gdpr: connectIdSubmodule.isEUConsentRequired(consentData) ? '1' : '0',
65
- gdpr_consent: connectIdSubmodule.isEUConsentRequired(consentData) ? consentData.gdpr.consentString : '',
66
- us_privacy: consentData && consentData.uspConsent ? consentData.uspConsent : ''
144
+ gdpr_consent: connectIdSubmodule.isEUConsentRequired(consentData) ? consentData.consentString : '',
145
+ us_privacy: uspString
67
146
  };
68
147
 
69
- if (connectIdSubmodule.isUnderGPPJurisdiction(consentData)) {
70
- data.gpp = consentData.gppConsent.gppString;
71
- data.gpp_sid = encodeURIComponent(consentData.gppConsent.applicableSections.join(','));
148
+ let topmostLocation = getRefererInfo().topmostLocation;
149
+ if (typeof topmostLocation === 'string') {
150
+ data.url = topmostLocation.split('?')[0];
72
151
  }
73
152
 
74
153
  INPUT_PARAM_KEYS.forEach(key => {
@@ -84,6 +163,11 @@ export const connectIdSubmodule = {
84
163
  if (response) {
85
164
  try {
86
165
  responseObj = JSON.parse(response);
166
+ if (isPlainObject(responseObj) && Object.keys(responseObj).length > 0) {
167
+ storeObject(responseObj);
168
+ } else {
169
+ logError(`${MODULE_NAME} module: UPS response returned an invalid payload ${response}`);
170
+ }
87
171
  } catch (error) {
88
172
  logError(error);
89
173
  }
@@ -91,7 +175,7 @@ export const connectIdSubmodule = {
91
175
  callback(responseObj);
92
176
  },
93
177
  error: error => {
94
- logError(`${MODULE_NAME}: ID fetch encountered an error`, error);
178
+ logError(`${MODULE_NAME} module: ID fetch encountered an error`, error);
95
179
  callback();
96
180
  }
97
181
  };
@@ -108,16 +192,7 @@ export const connectIdSubmodule = {
108
192
  * @returns {Boolean}
109
193
  */
110
194
  isEUConsentRequired(consentData) {
111
- return !!(consentData && consentData.gdpr && consentData.gdpr.gdprApplies);
112
- },
113
-
114
- /**
115
- * Utility function that returns a boolean flag indicating if the opportunity
116
- * is subject to GPP jurisdiction.
117
- * @returns {Boolean}
118
- */
119
- isUnderGPPJurisdiction(consentData) {
120
- return !!(consentData && consentData.gppConsent && consentData.gppConsent.gppString);
195
+ return !!(consentData?.gdprApplies);
121
196
  },
122
197
 
123
198
  /**
@@ -27,8 +27,9 @@ The below parameters apply only to the Yahoo ConnectID user ID Module.
27
27
 
28
28
  | Param under usersync.userIds[] | Scope | Type | Description | Example |
29
29
  | --- | --- | --- | --- | --- |
30
- | name | Required | String | ID value for the Yahoo ConnectID module - `"connectId"` | `"connectId"` |
31
- | params | Required | Object | Data for Yahoo ConnectID initialization. | |
32
- | params.pixelId | Required | Number | The Yahoo supplied publisher specific pixel Id. | `8976` |
33
- | params.he | Optional | String | The SHA-256 hashed user email address. One of either the `he` parameter or the `puid` parameter must be supplied. | `"529cb86de31e9547a712d9f380146e98bbd39beec"` |
34
- | params.puid | Optional | String | The publisher-supplied user identifier. One of either the `he` parameter or the `puid` parameter must be supplied. | `"P-975484817"` |
30
+ | name | Required | String | The name of this module. | `"connectId"` |
31
+ | params | Required | Object | Container of all module params. ||
32
+ | params.pixelId | Required | Number |
33
+ The Yahoo-supplied publisher-specific pixel ID. | `"0000"` |
34
+ | params.he | Optional | String | The SHA-256 hashed user email address which has been lowercased prior to hashing. Pass both `he` and `puid` params if present, otherwise pass either of the two that is available. |`"ed8ddbf5a171981db8ef938596ca297d5e3f84bcc280041c5880dba3baf9c1d4"`|
35
+ | params.puid | Optional | String | The publisher supplied user identifier such as a first-party cookie. Pass both `he` and `puid` params if present, otherwise pass either of the two that is available. | `"ab9iibf5a231ii1db8ef911596ca297d5e3f84biii00041c5880dba3baf9c1da"` |