prebid.js 9.2.0 → 9.4.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.
- package/creative/constants.js +2 -1
- package/creative/crossDomain.js +16 -4
- package/dist/33acrossAnalyticsAdapter.js +1 -1
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/BTBidAdapter.js +1 -1
- package/dist/adagioAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adagioRtdProvider.js +1 -1
- package/dist/adagioUtils.js +1 -1
- package/dist/addefendBidAdapter.js +1 -1
- package/dist/adfBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/adnuntiusBidAdapter.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adstirBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgAnalyticsAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/agmaAnalyticsAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/chunk-core.js +1 -1
- package/dist/codefuelBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consentManagement.js +1 -0
- package/dist/consentManagementGpp.js +1 -1
- package/dist/consentManagementTcf.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantAnalyticsAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/copper6sspBidAdapter.js +1 -0
- package/dist/cpmstarBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/dailymotionBidAdapter.js +1 -1
- package/dist/deltaprojectsBidAdapter.js +1 -1
- package/dist/dependencies.json +51 -13
- package/dist/dianomiBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/dxkultureBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/exadsBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/greenbidsAnalyticsAdapter.js +1 -1
- package/dist/greenbidsRtdProvider.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hypelabBidAdapter.js +1 -1
- package/dist/id5AnalyticsAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/illuminBidAdapter.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/intentIqIdSystem.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/jixieBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/kimberliteBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/luceadBidAdapter.js +1 -1
- package/dist/luponmediaBidAdapter.js +1 -1
- package/dist/mabidderBidAdapter.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/medianetAnalyticsAdapter.js +1 -1
- package/dist/medianetBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/missenaBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/nobidAnalyticsAdapter.js +1 -1
- package/dist/nobidBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +184 -178
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openwebBidAdapter.js +1 -1
- package/dist/openxBidAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/orakiBidAdapter.js +1 -0
- package/dist/orbidderBidAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/ozoneBidAdapter.js +1 -1
- package/dist/pairIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/processResponse.js +1 -0
- package/dist/publinkIdSystem.js +1 -1
- package/dist/publirBidAdapter.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/retailspotBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/shinezRtbBidAdapter.js +1 -1
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smartyadsBidAdapter.js +1 -1
- package/dist/smartyadsUtils.js +1 -0
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/snigelBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/stnBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/tagorasBidAdapter.js +1 -1
- package/dist/tappxBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/terceptAnalyticsAdapter.js +1 -1
- package/dist/themoneytizerBidAdapter.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/twistDigitalBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/uid2IdSystem.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/unrulyBidAdapter.js +1 -1
- package/dist/userId.js +1 -1
- package/dist/viantOrtbBidAdapter.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/vidazooUtils.js +1 -0
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahooAdsBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/dist/yuktamediaAnalyticsAdapter.js +1 -1
- package/dist/zeta_global_sspBidAdapter.js +1 -1
- package/integrationExamples/gpt/x-domain/creative.html +1 -1
- package/libraries/consentManagement/cmUtils.js +38 -0
- package/libraries/processResponse/index.js +12 -0
- package/libraries/smartyadsUtils/getAdUrlByRegion.js +32 -0
- package/libraries/vidazooUtils/bidderUtils.js +480 -0
- package/libraries/vidazooUtils/constants.js +7 -0
- package/modules/adagioRtdProvider.js +9 -7
- package/modules/addefendBidAdapter.js +1 -2
- package/modules/adfBidAdapter.js +1 -10
- package/modules/adlooxRtdProvider.js +1 -1
- package/modules/adnuntiusBidAdapter.js +1 -0
- package/modules/adxcgAnalyticsAdapter.js +1 -2
- package/modules/carodaBidAdapter.js +3 -8
- package/modules/codefuelBidAdapter.js +1 -10
- package/modules/consentManagementGpp.js +2 -38
- package/modules/consentManagementTcf.js +7 -38
- package/modules/conversantAnalyticsAdapter.js +1 -2
- package/modules/copper6sspBidAdapter.js +19 -0
- package/modules/copper6sspBidAdapter.md +79 -0
- package/modules/cpmstarBidAdapter.js +52 -36
- package/modules/cpmstarBidAdapter.md +1 -4
- package/modules/criteoBidAdapter.js +10 -3
- package/modules/dailymotionBidAdapter.js +1 -1
- package/modules/deltaprojectsBidAdapter.js +2 -11
- package/modules/dianomiBidAdapter.js +1 -9
- package/modules/finativeBidAdapter.js +1 -10
- package/modules/gridBidAdapter.js +2 -12
- package/modules/id5AnalyticsAdapter.js +1 -2
- package/modules/illuminBidAdapter.js +9 -304
- package/modules/intentIqIdSystem.js +408 -50
- package/modules/intentIqIdSystem.md +92 -0
- package/modules/kueezRtbBidAdapter.js +17 -312
- package/modules/liveIntentIdSystem.js +2 -2
- package/modules/luponmediaBidAdapter.js +4 -10
- package/modules/mabidderBidAdapter.js +1 -2
- package/modules/medianetAnalyticsAdapter.js +1 -2
- package/modules/medianetBidAdapter.js +1 -1
- package/modules/mgidBidAdapter.js +1 -10
- package/modules/orakiBidAdapter.js +19 -0
- package/modules/orakiBidAdapter.md +79 -0
- package/modules/orbidderBidAdapter.js +4 -2
- package/modules/outbrainBidAdapter.js +8 -43
- package/modules/ozoneBidAdapter.js +9 -7
- package/modules/pairIdSystem.js +27 -10
- package/modules/pixfutureBidAdapter.js +1 -2
- package/modules/prebidServerBidAdapter/index.js +1 -1
- package/modules/seedtagBidAdapter.js +4 -0
- package/modules/shinezRtbBidAdapter.js +12 -304
- package/modules/smartadserverBidAdapter.js +3 -0
- package/modules/smartyadsBidAdapter.js +6 -110
- package/modules/snigelBidAdapter.js +1 -2
- package/modules/tagorasBidAdapter.js +13 -316
- package/modules/tappxBidAdapter.js +1 -2
- package/modules/terceptAnalyticsAdapter.js +1 -2
- package/modules/twistDigitalBidAdapter.js +9 -433
- package/modules/userId/index.js +31 -21
- package/modules/viantOrtbBidAdapter.js +20 -0
- package/modules/vidazooBidAdapter.js +26 -468
- package/modules/visxBidAdapter.js +27 -29
- package/modules/yahooAdsBidAdapter.js +4 -1
- package/modules/yuktamediaAnalyticsAdapter.js +1 -2
- package/modules/zeta_global_sspBidAdapter.js +2 -2
- package/package.json +1 -1
- package/src/adRendering.js +25 -2
- package/src/constants.js +2 -0
- package/src/prebid.js +2 -1
- package/src/utils.js +19 -1
- package/test/spec/creative/crossDomainCreative_spec.js +38 -2
- package/test/spec/fpd/gdpr_spec.js +24 -2
- package/test/spec/libraries/processResponse_spec.js +60 -0
- package/test/spec/modules/adagioRtdProvider_spec.js +12 -0
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +6 -3
- package/test/spec/modules/conversantAnalyticsAdapter_spec.js +1 -1
- package/test/spec/modules/copper6sspBidAdapter_spec.js +514 -0
- package/test/spec/modules/cpmstarBidAdapter_spec.js +1 -1
- package/test/spec/modules/dailymotionBidAdapter_spec.js +18 -14
- package/test/spec/modules/illuminBidAdapter_spec.js +26 -13
- package/test/spec/modules/intentIqIdSystem_spec.js +264 -36
- package/test/spec/modules/kueezRtbBidAdapter_spec.js +26 -15
- package/test/spec/modules/orakiBidAdapter_spec.js +510 -0
- package/test/spec/modules/outbrainBidAdapter_spec.js +32 -1
- package/test/spec/modules/seedtagBidAdapter_spec.js +27 -0
- package/test/spec/modules/shinezRtbBidAdapter_spec.js +26 -14
- package/test/spec/modules/smartadserverBidAdapter_spec.js +7 -0
- package/test/spec/modules/smartyadsBidAdapter_spec.js +6 -83
- package/test/spec/modules/tagorasBidAdapter_spec.js +26 -15
- package/test/spec/modules/twistDigitalBidAdapter_spec.js +19 -22
- package/test/spec/modules/userId_spec.js +86 -47
- package/test/spec/modules/viantOrtbBidAdapter_spec.js +87 -6
- package/test/spec/modules/vidazooBidAdapter_spec.js +21 -23
- package/test/spec/modules/visxBidAdapter_spec.js +180 -0
- package/test/spec/modules/yahooAdsBidAdapter_spec.js +1 -1
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +11 -0
- package/test/spec/unit/pbjs_api_spec.js +6 -1
|
@@ -10,6 +10,9 @@ import { ajax } from '../src/ajax.js';
|
|
|
10
10
|
import { submodule } from '../src/hook.js'
|
|
11
11
|
import { getStorageManager } from '../src/storageManager.js';
|
|
12
12
|
import { MODULE_TYPE_UID } from '../src/activities/modules.js';
|
|
13
|
+
import { gppDataHandler, uspDataHandler } from '../src/consentHandler.js';
|
|
14
|
+
import AES from 'crypto-js/aes.js';
|
|
15
|
+
import Utf8 from 'crypto-js/enc-utf8.js';
|
|
13
16
|
|
|
14
17
|
/**
|
|
15
18
|
* @typedef {import('../modules/userId/index.js').Submodule} Submodule
|
|
@@ -21,11 +24,31 @@ const PCID_EXPIRY = 365;
|
|
|
21
24
|
|
|
22
25
|
const MODULE_NAME = 'intentIqId';
|
|
23
26
|
export const FIRST_PARTY_KEY = '_iiq_fdata';
|
|
24
|
-
export
|
|
25
|
-
|
|
26
|
-
export const
|
|
27
|
+
export let FIRST_PARTY_DATA_KEY = '_iiq_fdata';
|
|
28
|
+
export const WITH_IIQ = 'A';
|
|
29
|
+
export const WITHOUT_IIQ = 'B';
|
|
30
|
+
export const NOT_YET_DEFINED = 'U';
|
|
31
|
+
export const OPT_OUT = 'O';
|
|
32
|
+
export const BLACK_LIST = 'L';
|
|
33
|
+
export const CLIENT_HINTS_KEY = '_iiq_ch';
|
|
34
|
+
export const EMPTY = 'EMPTY'
|
|
35
|
+
export const VERSION = 0.1
|
|
27
36
|
|
|
37
|
+
const encoderCH = {
|
|
38
|
+
brands: 0,
|
|
39
|
+
mobile: 1,
|
|
40
|
+
platform: 2,
|
|
41
|
+
architecture: 3,
|
|
42
|
+
bitness: 4,
|
|
43
|
+
model: 5,
|
|
44
|
+
platformVersion: 6,
|
|
45
|
+
wow64: 7,
|
|
46
|
+
fullVersionList: 8
|
|
47
|
+
};
|
|
28
48
|
const INVALID_ID = 'INVALID_ID';
|
|
49
|
+
const SUPPORTED_TYPES = ['html5', 'cookie']
|
|
50
|
+
|
|
51
|
+
export const storage = getStorageManager({ moduleType: MODULE_TYPE_UID, moduleName: MODULE_NAME });
|
|
29
52
|
|
|
30
53
|
/**
|
|
31
54
|
* Generate standard UUID string
|
|
@@ -42,16 +65,35 @@ function generateGUID() {
|
|
|
42
65
|
}
|
|
43
66
|
|
|
44
67
|
/**
|
|
45
|
-
*
|
|
68
|
+
* Encrypts plaintext.
|
|
69
|
+
* @param {string} plainText The plaintext to encrypt.
|
|
70
|
+
* @returns {string} The encrypted text as a base64 string.
|
|
71
|
+
*/
|
|
72
|
+
export function encryptData(plainText) {
|
|
73
|
+
return AES.encrypt(plainText, MODULE_NAME).toString();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Decrypts ciphertext.
|
|
78
|
+
* @param {string} encryptedText The encrypted text as a base64 string.
|
|
79
|
+
* @returns {string} The decrypted plaintext.
|
|
80
|
+
*/
|
|
81
|
+
export function decryptData(encryptedText) {
|
|
82
|
+
const bytes = AES.decrypt(encryptedText, MODULE_NAME);
|
|
83
|
+
return bytes.toString(Utf8);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Read Intent IQ data from local storage or cookie
|
|
46
88
|
* @param key
|
|
47
89
|
* @return {string}
|
|
48
90
|
*/
|
|
49
|
-
export function readData(key) {
|
|
91
|
+
export function readData(key, allowedStorage) {
|
|
50
92
|
try {
|
|
51
|
-
if (storage.hasLocalStorage()) {
|
|
93
|
+
if (storage.hasLocalStorage() && allowedStorage.includes('html5')) {
|
|
52
94
|
return storage.getDataFromLocalStorage(key);
|
|
53
95
|
}
|
|
54
|
-
if (storage.cookiesAreEnabled()) {
|
|
96
|
+
if (storage.cookiesAreEnabled() && allowedStorage.includes('cookie')) {
|
|
55
97
|
return storage.getCookie(key);
|
|
56
98
|
}
|
|
57
99
|
} catch (error) {
|
|
@@ -60,21 +102,20 @@ export function readData(key) {
|
|
|
60
102
|
}
|
|
61
103
|
|
|
62
104
|
/**
|
|
63
|
-
* Store Intent IQ data in
|
|
105
|
+
* Store Intent IQ data in cookie, local storage or both of them
|
|
64
106
|
* expiration date: 365 days
|
|
65
107
|
* @param key
|
|
66
108
|
* @param {string} value IntentIQ ID value to sintentIqIdSystem_spec.jstore
|
|
67
109
|
*/
|
|
68
|
-
function storeData(key, value,
|
|
110
|
+
export function storeData(key, value, allowedStorage) {
|
|
69
111
|
try {
|
|
70
112
|
logInfo(MODULE_NAME + ': storing data: key=' + key + ' value=' + value);
|
|
71
|
-
|
|
72
113
|
if (value) {
|
|
73
|
-
if (storage.hasLocalStorage()) {
|
|
114
|
+
if (storage.hasLocalStorage() && allowedStorage.includes('html5')) {
|
|
74
115
|
storage.setDataInLocalStorage(key, value);
|
|
75
116
|
}
|
|
76
|
-
|
|
77
|
-
|
|
117
|
+
if (storage.cookiesAreEnabled() && allowedStorage.includes('cookie')) {
|
|
118
|
+
const expiresStr = (new Date(Date.now() + (PCID_EXPIRY * (60 * 60 * 24 * 1000)))).toUTCString();
|
|
78
119
|
storage.setCookie(key, value, expiresStr, 'LAX');
|
|
79
120
|
}
|
|
80
121
|
}
|
|
@@ -83,10 +124,28 @@ function storeData(key, value, cookieStorageEnabled = false) {
|
|
|
83
124
|
}
|
|
84
125
|
}
|
|
85
126
|
|
|
127
|
+
/**
|
|
128
|
+
* Remove Intent IQ data from cookie or local storage
|
|
129
|
+
* @param key
|
|
130
|
+
*/
|
|
131
|
+
|
|
132
|
+
export function removeDataByKey(key, allowedStorage) {
|
|
133
|
+
try {
|
|
134
|
+
if (storage.hasLocalStorage() && allowedStorage.includes('html5')) {
|
|
135
|
+
storage.removeDataFromLocalStorage(key);
|
|
136
|
+
}
|
|
137
|
+
if (storage.cookiesAreEnabled() && allowedStorage.includes('cookie')) {
|
|
138
|
+
const expiredDate = new Date(0).toUTCString();
|
|
139
|
+
storage.setCookie(key, '', expiredDate, 'LAX');
|
|
140
|
+
}
|
|
141
|
+
} catch (error) {
|
|
142
|
+
logError(error);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
86
146
|
/**
|
|
87
147
|
* Parse json if possible, else return null
|
|
88
148
|
* @param data
|
|
89
|
-
* @param {object|null}
|
|
90
149
|
*/
|
|
91
150
|
function tryParse(data) {
|
|
92
151
|
try {
|
|
@@ -97,6 +156,125 @@ function tryParse(data) {
|
|
|
97
156
|
}
|
|
98
157
|
}
|
|
99
158
|
|
|
159
|
+
/**
|
|
160
|
+
* Convert GPP data to an object
|
|
161
|
+
* @param {Object} data
|
|
162
|
+
* @return {string} The JSON string representation of the input data.
|
|
163
|
+
*/
|
|
164
|
+
export function handleGPPData(data = {}) {
|
|
165
|
+
if (Array.isArray(data)) {
|
|
166
|
+
let obj = {};
|
|
167
|
+
for (const element of data) {
|
|
168
|
+
obj = Object.assign(obj, element);
|
|
169
|
+
}
|
|
170
|
+
return JSON.stringify(obj);
|
|
171
|
+
}
|
|
172
|
+
return JSON.stringify(data);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Detects the browser using either userAgent or userAgentData
|
|
177
|
+
* @return {string} The name of the detected browser or 'unknown' if unable to detect
|
|
178
|
+
*/
|
|
179
|
+
function detectBrowser() {
|
|
180
|
+
try {
|
|
181
|
+
if (navigator.userAgent) {
|
|
182
|
+
return detectBrowserFromUserAgent(navigator.userAgent);
|
|
183
|
+
} else if (navigator.userAgentData) {
|
|
184
|
+
return detectBrowserFromUserAgentData(navigator.userAgentData);
|
|
185
|
+
}
|
|
186
|
+
} catch (error) {
|
|
187
|
+
logError('Error detecting browser:', error);
|
|
188
|
+
}
|
|
189
|
+
return 'unknown';
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Detects the browser from the user agent string
|
|
194
|
+
* @param {string} userAgent - The user agent string from the browser
|
|
195
|
+
* @return {string} The name of the detected browser or 'unknown' if unable to detect
|
|
196
|
+
*/
|
|
197
|
+
export function detectBrowserFromUserAgent(userAgent) {
|
|
198
|
+
const browserRegexPatterns = {
|
|
199
|
+
opera: /Opera|OPR/,
|
|
200
|
+
edge: /Edg/,
|
|
201
|
+
chrome: /Chrome|CriOS/,
|
|
202
|
+
safari: /Safari/,
|
|
203
|
+
firefox: /Firefox/,
|
|
204
|
+
ie: /MSIE|Trident/,
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
// Check for Chrome first to avoid confusion with Safari
|
|
208
|
+
if (browserRegexPatterns.chrome.test(userAgent)) {
|
|
209
|
+
return 'chrome';
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Now we can safely check for Safari
|
|
213
|
+
if (browserRegexPatterns.safari.test(userAgent) && !browserRegexPatterns.chrome.test(userAgent)) {
|
|
214
|
+
return 'safari';
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Check other browsers
|
|
218
|
+
for (const browser in browserRegexPatterns) {
|
|
219
|
+
if (browserRegexPatterns[browser].test(userAgent)) {
|
|
220
|
+
return browser;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return 'unknown';
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Detects the browser from the NavigatorUAData object
|
|
229
|
+
* @param {NavigatorUAData} userAgentData - The user agent data object from the browser
|
|
230
|
+
* @return {string} The name of the detected browser or 'unknown' if unable to detect
|
|
231
|
+
*/
|
|
232
|
+
export function detectBrowserFromUserAgentData(userAgentData) {
|
|
233
|
+
const brandNames = userAgentData.brands.map(brand => brand.brand);
|
|
234
|
+
|
|
235
|
+
if (brandNames.includes('Microsoft Edge')) {
|
|
236
|
+
return 'edge';
|
|
237
|
+
} else if (brandNames.includes('Opera')) {
|
|
238
|
+
return 'opera';
|
|
239
|
+
} else if (brandNames.some(brand => brand === 'Chromium' || brand === 'Google Chrome')) {
|
|
240
|
+
return 'chrome';
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return 'unknown';
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Processes raw client hints data into a structured format.
|
|
248
|
+
* @param {object} clientHints - Raw client hints data
|
|
249
|
+
* @return {string} A JSON string of processed client hints or an empty string if no hints
|
|
250
|
+
*/
|
|
251
|
+
export function handleClientHints(clientHints) {
|
|
252
|
+
const chParams = {};
|
|
253
|
+
for (const key in clientHints) {
|
|
254
|
+
if (clientHints.hasOwnProperty(key) && clientHints[key] !== '') {
|
|
255
|
+
if (['brands', 'fullVersionList'].includes(key)) {
|
|
256
|
+
let handledParam = '';
|
|
257
|
+
clientHints[key].forEach((element, index) => {
|
|
258
|
+
const isNotLast = index < clientHints[key].length - 1;
|
|
259
|
+
handledParam += `"${element.brand}";v="${element.version}"${isNotLast ? ', ' : ''}`;
|
|
260
|
+
});
|
|
261
|
+
chParams[encoderCH[key]] = handledParam;
|
|
262
|
+
} else if (typeof clientHints[key] === 'boolean') {
|
|
263
|
+
chParams[encoderCH[key]] = `?${clientHints[key] ? 1 : 0}`;
|
|
264
|
+
} else {
|
|
265
|
+
chParams[encoderCH[key]] = `"${clientHints[key]}"`;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return Object.keys(chParams).length ? JSON.stringify(chParams) : '';
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function defineStorageType(params) {
|
|
273
|
+
if (!params || !Array.isArray(params)) return ['html5']; // use locale storage be default
|
|
274
|
+
const filteredArr = params.filter(item => SUPPORTED_TYPES.includes(item));
|
|
275
|
+
return filteredArr.length ? filteredArr : ['html5'];
|
|
276
|
+
}
|
|
277
|
+
|
|
100
278
|
/** @type {Submodule} */
|
|
101
279
|
export const intentIqIdSubmodule = {
|
|
102
280
|
/**
|
|
@@ -120,25 +298,136 @@ export const intentIqIdSubmodule = {
|
|
|
120
298
|
* @returns {IdResponse|undefined}
|
|
121
299
|
*/
|
|
122
300
|
getId(config) {
|
|
123
|
-
const configParams = (config
|
|
124
|
-
|
|
301
|
+
const configParams = (config?.params) || {};
|
|
302
|
+
let decryptedData, callbackTimeoutID;
|
|
303
|
+
let callbackFired = false
|
|
304
|
+
let runtimeEids = {}
|
|
305
|
+
|
|
306
|
+
const firePartnerCallback = () => {
|
|
307
|
+
if (configParams.callback && !callbackFired) {
|
|
308
|
+
callbackFired = true;
|
|
309
|
+
if (callbackTimeoutID) clearTimeout(callbackTimeoutID);
|
|
310
|
+
configParams.callback(runtimeEids, firstPartyData?.group || NOT_YET_DEFINED);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
callbackTimeoutID = setTimeout(() => {
|
|
315
|
+
firePartnerCallback();
|
|
316
|
+
}, configParams.timeoutInMillis || 500
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
if (typeof configParams.partner !== 'number') {
|
|
125
320
|
logError('User ID - intentIqId submodule requires a valid partner to be defined');
|
|
321
|
+
firePartnerCallback()
|
|
126
322
|
return;
|
|
127
323
|
}
|
|
128
|
-
const cookieStorageEnabled = typeof configParams.enableCookieStorage === 'boolean' ? configParams.enableCookieStorage : false
|
|
129
|
-
if (!FIRST_PARTY_DATA_KEY.includes(configParams.partner)) { FIRST_PARTY_DATA_KEY += '_' + configParams.partner; }
|
|
130
324
|
let rrttStrtTime = 0;
|
|
325
|
+
let partnerData = {};
|
|
326
|
+
let shouldCallServer = false
|
|
327
|
+
|
|
328
|
+
const currentBrowserLowerCase = detectBrowser();
|
|
329
|
+
const browserBlackList = typeof configParams.browserBlackList === 'string' ? configParams.browserBlackList.toLowerCase() : '';
|
|
330
|
+
const allowedStorage = defineStorageType(config.enabledStorageTypes);
|
|
331
|
+
|
|
332
|
+
// Check if current browser is in blacklist
|
|
333
|
+
if (browserBlackList?.includes(currentBrowserLowerCase)) {
|
|
334
|
+
logError('User ID - intentIqId submodule: browser is in blacklist!');
|
|
335
|
+
if (configParams.callback) configParams.callback('', BLACK_LIST);
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// Get consent information
|
|
340
|
+
const cmpData = {};
|
|
341
|
+
const uspData = uspDataHandler.getConsentData();
|
|
342
|
+
const gppData = gppDataHandler.getConsentData();
|
|
343
|
+
|
|
344
|
+
if (uspData) {
|
|
345
|
+
cmpData.us_privacy = uspData;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
if (gppData) {
|
|
349
|
+
cmpData.gpp = '';
|
|
350
|
+
cmpData.gpi = 1;
|
|
351
|
+
|
|
352
|
+
if (gppData.parsedSections && 'usnat' in gppData.parsedSections) {
|
|
353
|
+
cmpData.gpp = handleGPPData(gppData.parsedSections['usnat']);
|
|
354
|
+
cmpData.gpi = 0
|
|
355
|
+
}
|
|
356
|
+
cmpData.gpp_sid = gppData.applicableSections;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Read client hints from storage
|
|
360
|
+
let clientHints = readData(CLIENT_HINTS_KEY, allowedStorage);
|
|
361
|
+
|
|
362
|
+
// Get client hints and save to storage
|
|
363
|
+
if (navigator.userAgentData) {
|
|
364
|
+
navigator.userAgentData
|
|
365
|
+
.getHighEntropyValues([
|
|
366
|
+
'brands',
|
|
367
|
+
'mobile',
|
|
368
|
+
'bitness',
|
|
369
|
+
'wow64',
|
|
370
|
+
'architecture',
|
|
371
|
+
'model',
|
|
372
|
+
'platform',
|
|
373
|
+
'platformVersion',
|
|
374
|
+
'fullVersionList'
|
|
375
|
+
])
|
|
376
|
+
.then(ch => {
|
|
377
|
+
clientHints = handleClientHints(ch);
|
|
378
|
+
storeData(CLIENT_HINTS_KEY, clientHints, allowedStorage)
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
if (!FIRST_PARTY_DATA_KEY.includes(configParams.partner)) {
|
|
383
|
+
FIRST_PARTY_DATA_KEY += '_' + configParams.partner;
|
|
384
|
+
}
|
|
131
385
|
|
|
132
386
|
// Read Intent IQ 1st party id or generate it if none exists
|
|
133
|
-
let firstPartyData = tryParse(readData(FIRST_PARTY_KEY));
|
|
134
|
-
|
|
387
|
+
let firstPartyData = tryParse(readData(FIRST_PARTY_KEY, allowedStorage));
|
|
388
|
+
|
|
389
|
+
if (!firstPartyData?.pcid) {
|
|
135
390
|
const firstPartyId = generateGUID();
|
|
136
|
-
firstPartyData = {
|
|
137
|
-
storeData(FIRST_PARTY_KEY, JSON.stringify(firstPartyData),
|
|
391
|
+
firstPartyData = { pcid: firstPartyId, pcidDate: Date.now(), group: NOT_YET_DEFINED, cttl: 0, uspapi_value: EMPTY, gpp_value: EMPTY, date: Date.now() };
|
|
392
|
+
storeData(FIRST_PARTY_KEY, JSON.stringify(firstPartyData), allowedStorage);
|
|
393
|
+
} else if (!firstPartyData.pcidDate) {
|
|
394
|
+
firstPartyData.pcidDate = Date.now();
|
|
395
|
+
storeData(FIRST_PARTY_KEY, JSON.stringify(firstPartyData), allowedStorage);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
const savedData = tryParse(readData(FIRST_PARTY_DATA_KEY, allowedStorage))
|
|
399
|
+
if (savedData) {
|
|
400
|
+
partnerData = savedData;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
if (partnerData.data) {
|
|
404
|
+
if (partnerData.data.length) { // encrypted data
|
|
405
|
+
decryptedData = tryParse(decryptData(partnerData.data));
|
|
406
|
+
runtimeEids = decryptedData;
|
|
407
|
+
}
|
|
138
408
|
}
|
|
139
409
|
|
|
140
|
-
|
|
141
|
-
|
|
410
|
+
if (!firstPartyData.cttl || Date.now() - firstPartyData.date > firstPartyData.cttl || firstPartyData.uspapi_value !== cmpData.us_privacy || firstPartyData.gpp_value !== cmpData.gpp) {
|
|
411
|
+
firstPartyData.uspapi_value = cmpData.us_privacy;
|
|
412
|
+
firstPartyData.gpp_value = cmpData.gpp;
|
|
413
|
+
firstPartyData.isOptedOut = false
|
|
414
|
+
firstPartyData.cttl = 0
|
|
415
|
+
shouldCallServer = true;
|
|
416
|
+
partnerData.data = {}
|
|
417
|
+
storeData(FIRST_PARTY_KEY, JSON.stringify(firstPartyData), allowedStorage);
|
|
418
|
+
storeData(FIRST_PARTY_DATA_KEY, JSON.stringify(partnerData), allowedStorage);
|
|
419
|
+
} else if (firstPartyData.isOptedOut) {
|
|
420
|
+
firePartnerCallback()
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (firstPartyData.group === WITHOUT_IIQ || (firstPartyData.group !== WITHOUT_IIQ && runtimeEids && Object.keys(runtimeEids).length)) {
|
|
424
|
+
firePartnerCallback()
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
if (!shouldCallServer) {
|
|
428
|
+
firePartnerCallback();
|
|
429
|
+
return { id: runtimeEids };
|
|
430
|
+
}
|
|
142
431
|
|
|
143
432
|
// use protocol relative urls for http or https
|
|
144
433
|
let url = `https://api.intentiq.com/profiles_engine/ProfilesEngineServlet?at=39&mi=10&dpi=${configParams.partner}&pt=17&dpn=1`;
|
|
@@ -149,42 +438,97 @@ export const intentIqIdSubmodule = {
|
|
|
149
438
|
url += (partnerData.cttl) ? '&cttl=' + encodeURIComponent(partnerData.cttl) : '';
|
|
150
439
|
url += (partnerData.rrtt) ? '&rrtt=' + encodeURIComponent(partnerData.rrtt) : '';
|
|
151
440
|
url += firstPartyData.pcidDate ? '&iiqpciddate=' + encodeURIComponent(firstPartyData.pcidDate) : '';
|
|
441
|
+
url += cmpData.us_privacy ? '&pa=' + encodeURIComponent(cmpData.us_privacy) : '';
|
|
442
|
+
url += cmpData.gpp ? '&gpv=' + encodeURIComponent(cmpData.gpp) : '';
|
|
443
|
+
url += cmpData.gpi ? '&gpi=' + cmpData.gpi : '';
|
|
444
|
+
url += clientHints ? '&uh=' + encodeURIComponent(clientHints) : '';
|
|
445
|
+
url += VERSION ? '&jsver=' + VERSION : '';
|
|
446
|
+
url += firstPartyData?.group ? '&testGroup=' + encodeURIComponent(firstPartyData.group) : '';
|
|
447
|
+
|
|
448
|
+
const storeFirstPartyData = () => {
|
|
449
|
+
storeData(FIRST_PARTY_KEY, JSON.stringify(firstPartyData), allowedStorage);
|
|
450
|
+
storeData(FIRST_PARTY_DATA_KEY, JSON.stringify(partnerData), allowedStorage);
|
|
451
|
+
}
|
|
152
452
|
|
|
153
453
|
const resp = function (callback) {
|
|
154
454
|
const callbacks = {
|
|
155
455
|
success: response => {
|
|
156
456
|
let respJson = tryParse(response);
|
|
157
457
|
// If response is a valid json and should save is true
|
|
158
|
-
if (respJson
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
458
|
+
if (respJson) {
|
|
459
|
+
partnerData.date = Date.now();
|
|
460
|
+
firstPartyData.date = Date.now();
|
|
461
|
+
const defineEmptyDataAndFireCallback = () => {
|
|
462
|
+
respJson.data = partnerData.data = runtimeEids = {};
|
|
463
|
+
removeDataByKey(FIRST_PARTY_DATA_KEY, allowedStorage)
|
|
464
|
+
firePartnerCallback()
|
|
465
|
+
callback()
|
|
164
466
|
}
|
|
467
|
+
if (callbackTimeoutID) clearTimeout(callbackTimeoutID)
|
|
165
468
|
if ('cttl' in respJson) {
|
|
166
|
-
|
|
167
|
-
|
|
469
|
+
firstPartyData.cttl = respJson.cttl;
|
|
470
|
+
} else firstPartyData.cttl = 86400000;
|
|
471
|
+
|
|
472
|
+
if ('tc' in respJson) {
|
|
473
|
+
partnerData.terminationCause = respJson.tc;
|
|
474
|
+
if (respJson.tc == 41) {
|
|
475
|
+
firstPartyData.group = WITHOUT_IIQ;
|
|
476
|
+
storeData(FIRST_PARTY_KEY, JSON.stringify(firstPartyData), allowedStorage);
|
|
477
|
+
defineEmptyDataAndFireCallback();
|
|
478
|
+
return;
|
|
479
|
+
} else {
|
|
480
|
+
firstPartyData.group = WITH_IIQ;
|
|
481
|
+
}
|
|
168
482
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
483
|
+
if ('isOptedOut' in respJson) {
|
|
484
|
+
if (respJson.isOptedOut !== firstPartyData.isOptedOut) {
|
|
485
|
+
firstPartyData.isOptedOut = respJson.isOptedOut;
|
|
486
|
+
}
|
|
487
|
+
if (respJson.isOptedOut === true) {
|
|
488
|
+
firstPartyData.group = OPT_OUT;
|
|
489
|
+
storeData(FIRST_PARTY_KEY, JSON.stringify(firstPartyData), allowedStorage);
|
|
490
|
+
defineEmptyDataAndFireCallback()
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
if ('pid' in respJson) {
|
|
495
|
+
firstPartyData.pid = respJson.pid;
|
|
496
|
+
}
|
|
497
|
+
if ('ls' in respJson) {
|
|
498
|
+
if (respJson.ls === false) {
|
|
499
|
+
defineEmptyDataAndFireCallback();
|
|
500
|
+
return
|
|
501
|
+
}
|
|
502
|
+
// If data is empty, means we should save as INVALID_ID
|
|
503
|
+
if (respJson.data == '') {
|
|
504
|
+
respJson.data = INVALID_ID;
|
|
505
|
+
} else {
|
|
506
|
+
// If data is a single string, assume it is an id with source intentiq.com
|
|
507
|
+
if (respJson.data && typeof respJson.data === 'string') {
|
|
508
|
+
respJson.data = { eids: [respJson.data] }
|
|
509
|
+
}
|
|
510
|
+
}
|
|
173
511
|
partnerData.data = respJson.data;
|
|
174
|
-
shouldUpdateLs = true;
|
|
175
512
|
}
|
|
513
|
+
|
|
176
514
|
if (rrttStrtTime && rrttStrtTime > 0) {
|
|
177
515
|
partnerData.rrtt = Date.now() - rrttStrtTime;
|
|
178
|
-
shouldUpdateLs = true;
|
|
179
516
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
517
|
+
|
|
518
|
+
if (respJson.data?.eids) {
|
|
519
|
+
runtimeEids = respJson.data.eids
|
|
520
|
+
callback(respJson.data.eids);
|
|
521
|
+
firePartnerCallback()
|
|
522
|
+
const encryptedData = encryptData(JSON.stringify(respJson.data.eids))
|
|
523
|
+
partnerData.data = encryptedData;
|
|
524
|
+
} else {
|
|
525
|
+
callback();
|
|
526
|
+
firePartnerCallback()
|
|
184
527
|
}
|
|
185
|
-
|
|
528
|
+
storeFirstPartyData();
|
|
186
529
|
} else {
|
|
187
530
|
callback();
|
|
531
|
+
firePartnerCallback()
|
|
188
532
|
}
|
|
189
533
|
},
|
|
190
534
|
error: error => {
|
|
@@ -192,18 +536,32 @@ export const intentIqIdSubmodule = {
|
|
|
192
536
|
callback();
|
|
193
537
|
}
|
|
194
538
|
};
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
rrttStrtTime = Date.now();
|
|
198
|
-
ajax(url, callbacks, undefined, { method: 'GET', withCredentials: true });
|
|
199
|
-
}
|
|
539
|
+
|
|
540
|
+
ajax(url, callbacks, undefined, { method: 'GET', withCredentials: true });
|
|
200
541
|
};
|
|
201
|
-
|
|
542
|
+
const respObj = { callback: resp };
|
|
543
|
+
if (runtimeEids?.length) respObj.id = runtimeEids;
|
|
544
|
+
return respObj
|
|
202
545
|
},
|
|
203
546
|
eids: {
|
|
204
547
|
'intentIqId': {
|
|
205
548
|
source: 'intentiq.com',
|
|
206
|
-
atype: 1
|
|
549
|
+
atype: 1,
|
|
550
|
+
getSource: function (data) {
|
|
551
|
+
return data.source;
|
|
552
|
+
},
|
|
553
|
+
getValue: function (data) {
|
|
554
|
+
if (data?.uids?.length) {
|
|
555
|
+
return data.uids[0].id
|
|
556
|
+
}
|
|
557
|
+
return null
|
|
558
|
+
},
|
|
559
|
+
getUidExt: function (data) {
|
|
560
|
+
if (data?.uids?.length) {
|
|
561
|
+
return data.uids[0].ext;
|
|
562
|
+
}
|
|
563
|
+
return null
|
|
564
|
+
}
|
|
207
565
|
},
|
|
208
566
|
}
|
|
209
567
|
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
```
|
|
2
|
+
Module Name: IntentIQ Id System
|
|
3
|
+
Module Type: Id System
|
|
4
|
+
Maintainer: julian@intentiq.com, dmytro.piskun@intentiq.com
|
|
5
|
+
usp_supported: true
|
|
6
|
+
gpp_sids: usnat
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
# Intent IQ Universal ID module
|
|
10
|
+
|
|
11
|
+
By leveraging the Intent IQ identity graph, our module helps publishers, SSPs, and DSPs overcome the challenges of monetizing cookie-less inventory and preparing for a future without 3rd-party cookies. Our solution implements 1st-party data clustering and provides Intent IQ person IDs with over 90% coverage and unmatched accuracy in supported countries while remaining privacy-friendly and CCPA compliant. This results in increased CPMs, higher fill rates, and, ultimately, lifting overall revenue
|
|
12
|
+
|
|
13
|
+
# All you need is a few basic steps to start using our solution.
|
|
14
|
+
|
|
15
|
+
## Registration
|
|
16
|
+
|
|
17
|
+
Navigate to [our portal ](https://www.intentiq.com/) and contact our team for partner ID.
|
|
18
|
+
check our [documentation](https://pbmodule.documents.intentiq.com/) to get more information about our solution and how utilze it's full potential
|
|
19
|
+
|
|
20
|
+
## Integration
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
gulp build –modules=intentIqIdSystem
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
We recommend including the Intent IQ Analytics adapter module for improved visibility
|
|
27
|
+
|
|
28
|
+
## Configuration
|
|
29
|
+
|
|
30
|
+
### Parameters
|
|
31
|
+
|
|
32
|
+
Please find below list of paramters that could be used in configuring Intent IQ Universal ID module
|
|
33
|
+
|
|
34
|
+
| Param under userSync.userIds[] | Scope | Type | Description | Example |
|
|
35
|
+
| ------------------------------ | -------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- |
|
|
36
|
+
| name | Required | String | The name of this module: "intentIqId" | `"intentIqId"` |
|
|
37
|
+
| params | Required | Object | Details for IntentIqId initialization. | |
|
|
38
|
+
| params.partner | Required | Number | This is the partner ID value obtained from registering with IntentIQ. | `1177538` |
|
|
39
|
+
| params.pcid | Optional | String | This is the partner cookie ID, it is a dynamic value attached to the request. | `"g3hC52b"` |
|
|
40
|
+
| params.pai | Optional | String | This is the partner customer ID / advertiser ID, it is a dynamic value attached to the request. | `"advertiser1"` |
|
|
41
|
+
| params.callback | Required | Function | This is a callback which is trigered with data and AB group | `(data, group) => console.log({ data, group })` |
|
|
42
|
+
| params.timeoutInMillis | Optional | Number | This is the timeout in milliseconds, which defines the maximum duration before the callback is triggered. The default value is 500. | `450` |
|
|
43
|
+
| params.browserBlackList | Optional | String | This is the name of a browser that can be added to a blacklist. | `"chrome"` |
|
|
44
|
+
|
|
45
|
+
### Configuration example
|
|
46
|
+
|
|
47
|
+
```javascript
|
|
48
|
+
pbjs.setConfig({
|
|
49
|
+
userSync: {
|
|
50
|
+
userIds: [
|
|
51
|
+
{
|
|
52
|
+
name: "intentIqId",
|
|
53
|
+
params: {
|
|
54
|
+
partner: 123456, // valid partner id
|
|
55
|
+
callback: (data, group) => window.pbjs.requestBids(),
|
|
56
|
+
},
|
|
57
|
+
storage: {
|
|
58
|
+
type: "html5",
|
|
59
|
+
name: "intentIqId", // set localstorage with this name
|
|
60
|
+
expires: 60,
|
|
61
|
+
refreshInSeconds: 4 * 3600, // refresh ID every 4 hours to ensure it's fresh
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
syncDelay: 3000,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
pbjs.setConfig({
|
|
72
|
+
userSync: {
|
|
73
|
+
userIds: [{
|
|
74
|
+
name: "intentIqId",
|
|
75
|
+
params: {
|
|
76
|
+
partner: 123456 // valid partner id
|
|
77
|
+
pcid: PCID_VARIABLE, // string value, dynamically loaded into a variable before setting the configuration
|
|
78
|
+
pai: PAI_VARIABLE , // string value, dynamically loaded into a variable before setting the configuration
|
|
79
|
+
timeoutInMillis: 500,
|
|
80
|
+
browserBlackList: "chrome",
|
|
81
|
+
callback: (data, group) => window.pbjs.requestBids()
|
|
82
|
+
},
|
|
83
|
+
storage: {
|
|
84
|
+
type: "html5",
|
|
85
|
+
name: "intentIqId", // set localstorage with this name
|
|
86
|
+
expires: 60
|
|
87
|
+
}
|
|
88
|
+
}],
|
|
89
|
+
syncDelay: 3000
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
```
|