• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

prebid / Prebid.js / 16277709744

14 Jul 2025 08:57PM UTC coverage: 96.202% (-0.002%) from 96.204%
16277709744

push

github

web-flow
Linting: add stylistc indentation rule (#13585)

* bump coveralls

* eslint fix

* restore

* Update package-lock.json

39192 of 48203 branches covered (81.31%)

1411 of 1477 new or added lines in 73 files covered. (95.53%)

32 existing lines in 12 files now uncovered.

192751 of 200361 relevant lines covered (96.2%)

88.13 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.34
/modules/intentIqAnalyticsAdapter.js
1
import {logError, logInfo} from '../src/utils.js';
1✔
2
import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
3
import adapterManager from '../src/adapterManager.js';
4
import {ajax} from '../src/ajax.js';
5
import {getStorageManager} from '../src/storageManager.js';
6
import {config} from '../src/config.js';
7
import {EVENTS} from '../src/constants.js';
8
import {MODULE_TYPE_ANALYTICS} from '../src/activities/modules.js';
9
import {detectBrowser} from '../libraries/intentIqUtils/detectBrowserUtils.js';
10
import {appendSPData} from '../libraries/intentIqUtils/urlUtils.js';
11
import {appendVrrefAndFui, getReferrer} from '../libraries/intentIqUtils/getRefferer.js';
12
import {getCmpData} from '../libraries/intentIqUtils/getCmpData.js'
13
import {CLIENT_HINTS_KEY, FIRST_PARTY_KEY, VERSION, PREBID} from '../libraries/intentIqConstants/intentIqConstants.js';
14
import {readData, defineStorageType} from '../libraries/intentIqUtils/storageUtils.js';
15
import {reportingServerAddress} from '../libraries/intentIqUtils/intentIqConfig.js';
16
import { handleAdditionalParams } from '../libraries/intentIqUtils/handleAdditionalParams.js';
17

18
const MODULE_NAME = 'iiqAnalytics'
1✔
19
const analyticsType = 'endpoint';
1✔
20
const storage = getStorageManager({moduleType: MODULE_TYPE_ANALYTICS, moduleName: MODULE_NAME});
1✔
21
const prebidVersion = '$prebid.version$';
1✔
22
export const REPORTER_ID = Date.now() + '_' + getRandom(0, 1000);
1✔
23
const allowedStorage = defineStorageType(config.enabledStorageTypes);
1✔
24

25
const PARAMS_NAMES = {
1✔
26
  abTestGroup: 'abGroup',
27
  pbPauseUntil: 'pbPauseUntil',
28
  pbMonitoringEnabled: 'pbMonitoringEnabled',
29
  isInTestGroup: 'isInTestGroup',
30
  enhanceRequests: 'enhanceRequests',
31
  wasSubscribedForPrebid: 'wasSubscribedForPrebid',
32
  hadEids: 'hadEids',
33
  ABTestingConfigurationSource: 'ABTestingConfigurationSource',
34
  lateConfiguration: 'lateConfiguration',
35
  jsversion: 'jsversion',
36
  eidsNames: 'eidsNames',
37
  requestRtt: 'rtt',
38
  clientType: 'clientType',
39
  adserverDeviceType: 'AdserverDeviceType',
40
  terminationCause: 'terminationCause',
41
  callCount: 'callCount',
42
  manualCallCount: 'mcc',
43
  pubprovidedidsFailedToregister: 'ppcc',
44
  noDataCount: 'noDataCount',
45
  profile: 'profile',
46
  isProfileDeterministic: 'pidDeterministic',
47
  siteId: 'sid',
48
  hadEidsInLocalStorage: 'idls',
49
  auctionStartTime: 'ast',
50
  eidsReadTime: 'eidt',
51
  agentId: 'aid',
52
  auctionEidsLength: 'aeidln',
53
  wasServerCalled: 'wsrvcll',
54
  referrer: 'vrref',
55
  isInBrowserBlacklist: 'inbbl',
56
  prebidVersion: 'pbjsver',
57
  partnerId: 'partnerId',
58
  firstPartyId: 'pcid',
59
  placementId: 'placementId',
60
  adType: 'adType'
61
};
62

63
function getIntentIqConfig() {
64
  return config.getConfig('userSync.userIds')?.find(m => m.name === 'intentIqId');
91✔
65
}
66

67
const DEFAULT_URL = 'https://reports.intentiq.com/report'
1✔
68

69
const getDataForDefineURL = () => {
1✔
70
  const iiqConfig = getIntentIqConfig()
28✔
71
  const cmpData = getCmpData();
28✔
72
  const gdprDetected = cmpData.gdprString;
28✔
73

74
  return [iiqConfig, gdprDetected]
28✔
75
}
76

77
const iiqAnalyticsAnalyticsAdapter = Object.assign(adapter({url: DEFAULT_URL, analyticsType}), {
1✔
78
  initOptions: {
79
    lsValueInitialized: false,
80
    partner: null,
81
    fpid: null,
82
    currentGroup: null,
83
    dataInLs: null,
84
    eidl: null,
85
    lsIdsInitialized: false,
86
    manualWinReportEnabled: false,
87
    domainName: null,
88
    siloEnabled: false,
89
    reportMethod: null,
90
    additionalParams: null
91
  },
92
  track({eventType, args}) {
86✔
93
    switch (eventType) {
86✔
94
      case BID_WON:
95
        bidWon(args);
28✔
96
        break;
28✔
97
      case BID_REQUESTED:
98
        defineGlobalVariableName();
2✔
99
        break;
2✔
100
      default:
101
        break;
56✔
102
    }
103
  }
104
});
105

106
// Events needed
107
const {
108
  BID_WON,
109
  BID_REQUESTED
110
} = EVENTS;
1✔
111

112
function initAdapterConfig() {
113
  if (iiqAnalyticsAnalyticsAdapter.initOptions.lsValueInitialized) return;
30!
114
  const iiqConfig = getIntentIqConfig()
30✔
115

116
  if (iiqConfig) {
30!
117
    iiqAnalyticsAnalyticsAdapter.initOptions.lsValueInitialized = true;
30✔
118
    iiqAnalyticsAnalyticsAdapter.initOptions.partner =
30✔
119
      iiqConfig.params?.partner && !isNaN(iiqConfig.params.partner) ? iiqConfig.params.partner : -1;
90!
120

121
    iiqAnalyticsAnalyticsAdapter.initOptions.browserBlackList =
30✔
122
      typeof iiqConfig.params?.browserBlackList === 'string' ? iiqConfig.params.browserBlackList.toLowerCase() : '';
30✔
123
    iiqAnalyticsAnalyticsAdapter.initOptions.manualWinReportEnabled = iiqConfig.params?.manualWinReportEnabled || false;
30✔
124
    iiqAnalyticsAnalyticsAdapter.initOptions.domainName = iiqConfig.params?.domainName || '';
30✔
125
    iiqAnalyticsAnalyticsAdapter.initOptions.siloEnabled =
30✔
126
      typeof iiqConfig.params?.siloEnabled === 'boolean' ? iiqConfig.params.siloEnabled : false;
30✔
127
    iiqAnalyticsAnalyticsAdapter.initOptions.reportMethod = parseReportingMethod(iiqConfig.params?.reportMethod);
30✔
128
    iiqAnalyticsAnalyticsAdapter.initOptions.additionalParams = iiqConfig.params?.additionalParams || null;
30✔
129
  } else {
130
    iiqAnalyticsAnalyticsAdapter.initOptions.lsValueInitialized = false;
×
131
    iiqAnalyticsAnalyticsAdapter.initOptions.partner = -1;
×
132
    iiqAnalyticsAnalyticsAdapter.initOptions.reportMethod = 'GET';
×
133
  }
134
}
135

136
function initReadLsIds() {
137
  try {
29✔
138
    iiqAnalyticsAnalyticsAdapter.initOptions.dataInLs = null;
29✔
139
    iiqAnalyticsAnalyticsAdapter.initOptions.fpid = JSON.parse(readData(
29✔
140
      `${FIRST_PARTY_KEY}${iiqAnalyticsAnalyticsAdapter.initOptions.siloEnabled ? '_p_' + iiqAnalyticsAnalyticsAdapter.initOptions.partner : ''}`,
29✔
141
      allowedStorage, storage
142
    ));
143
    if (iiqAnalyticsAnalyticsAdapter.initOptions.fpid) {
29✔
144
      iiqAnalyticsAnalyticsAdapter.initOptions.currentGroup = iiqAnalyticsAnalyticsAdapter.initOptions.fpid.group;
16✔
145
    }
146
    const partnerData = readData(FIRST_PARTY_KEY + '_' + iiqAnalyticsAnalyticsAdapter.initOptions.partner, allowedStorage, storage);
29✔
147
    const clientsHints = readData(CLIENT_HINTS_KEY, allowedStorage, storage) || '';
29✔
148

149
    if (partnerData) {
29✔
150
      iiqAnalyticsAnalyticsAdapter.initOptions.lsIdsInitialized = true;
3✔
151
      const pData = JSON.parse(partnerData);
3✔
152
      iiqAnalyticsAnalyticsAdapter.initOptions.terminationCause = pData.terminationCause
3✔
153
      iiqAnalyticsAnalyticsAdapter.initOptions.dataInLs = pData.data;
3✔
154
      iiqAnalyticsAnalyticsAdapter.initOptions.eidl = pData.eidl || -1;
3✔
155
      iiqAnalyticsAnalyticsAdapter.initOptions.clientType = pData.clientType || null;
3✔
156
      iiqAnalyticsAnalyticsAdapter.initOptions.siteId = pData.siteId || null;
3✔
157
      iiqAnalyticsAnalyticsAdapter.initOptions.wsrvcll = pData.wsrvcll || false;
3✔
158
      iiqAnalyticsAnalyticsAdapter.initOptions.rrtt = pData.rrtt || null;
3✔
159
    }
160

161
    iiqAnalyticsAnalyticsAdapter.initOptions.clientsHints = clientsHints
29✔
162
  } catch (e) {
163
    logError(e)
×
164
  }
165
}
166

167
function bidWon(args, isReportExternal) {
168
  if (!iiqAnalyticsAnalyticsAdapter.initOptions.lsValueInitialized) {
30✔
169
    initAdapterConfig();
30✔
170
  }
171

172
  if (isNaN(iiqAnalyticsAnalyticsAdapter.initOptions.partner) || iiqAnalyticsAnalyticsAdapter.initOptions.partner == -1) return;
30!
173

174
  const currentBrowserLowerCase = detectBrowser();
30✔
175
  if (iiqAnalyticsAnalyticsAdapter.initOptions.browserBlackList?.includes(currentBrowserLowerCase)) {
30✔
176
    logError('IIQ ANALYTICS -> Browser is in blacklist!');
1✔
177
    return;
1✔
178
  }
179

180
  if (iiqAnalyticsAnalyticsAdapter.initOptions.lsValueInitialized && !iiqAnalyticsAnalyticsAdapter.initOptions.lsIdsInitialized) {
29✔
181
    initReadLsIds();
29✔
182
  }
183
  if ((isReportExternal && iiqAnalyticsAnalyticsAdapter.initOptions.manualWinReportEnabled) || (!isReportExternal && !iiqAnalyticsAnalyticsAdapter.initOptions.manualWinReportEnabled)) {
29✔
184
    const { url, method, payload } = constructFullUrl(preparePayload(args, true));
28✔
185
    if (method === 'POST') {
28✔
186
      ajax(url, undefined, payload, {method, contentType: 'application/x-www-form-urlencoded'});
1✔
187
    } else {
188
      ajax(url, undefined, null, {method});
27✔
189
    }
190
    logInfo('IIQ ANALYTICS -> BID WON');
28✔
191
    return true;
28✔
192
  }
193
  return false;
1✔
194
}
195

196
function parseReportingMethod(reportMethod) {
197
  if (typeof reportMethod === 'string') {
30✔
198
    switch (reportMethod.toUpperCase()) {
1!
199
      case 'GET':
NEW
200
        return 'GET';
×
201
      case 'POST':
202
        return 'POST';
1✔
203
      default:
NEW
204
        return 'GET';
×
205
    }
206
  }
207
  return 'GET';
29✔
208
}
209

210
function defineGlobalVariableName() {
211
  function reportExternalWin(args) {
212
    return bidWon(args, true);
2✔
213
  }
214

215
  const iiqConfig = getIntentIqConfig();
2✔
216
  const partnerId = iiqConfig?.params?.partner || 0;
2!
217

218
  window[`intentIqAnalyticsAdapter_${partnerId}`] = { reportExternalWin };
2✔
219
}
220

221
function getRandom(start, end) {
222
  return Math.floor((Math.random() * (end - start + 1)) + start);
1✔
223
}
224

225
export function preparePayload(data) {
226
  const result = getDefaultDataObject();
31✔
227
  readData(FIRST_PARTY_KEY + '_' + iiqAnalyticsAnalyticsAdapter.initOptions.partner, allowedStorage, storage);
31✔
228
  result[PARAMS_NAMES.partnerId] = iiqAnalyticsAnalyticsAdapter.initOptions.partner;
31✔
229
  result[PARAMS_NAMES.prebidVersion] = prebidVersion;
31✔
230
  result[PARAMS_NAMES.referrer] = getReferrer();
31✔
231
  result[PARAMS_NAMES.terminationCause] = iiqAnalyticsAnalyticsAdapter.initOptions.terminationCause;
31✔
232
  result[PARAMS_NAMES.abTestGroup] = iiqAnalyticsAnalyticsAdapter.initOptions.currentGroup;
31✔
233
  result[PARAMS_NAMES.clientType] = iiqAnalyticsAnalyticsAdapter.initOptions.clientType;
31✔
234
  result[PARAMS_NAMES.siteId] = iiqAnalyticsAnalyticsAdapter.initOptions.siteId;
31✔
235
  result[PARAMS_NAMES.wasServerCalled] = iiqAnalyticsAnalyticsAdapter.initOptions.wsrvcll;
31✔
236
  result[PARAMS_NAMES.requestRtt] = iiqAnalyticsAnalyticsAdapter.initOptions.rrtt;
31✔
237

238
  result[PARAMS_NAMES.isInTestGroup] = iiqAnalyticsAnalyticsAdapter.initOptions.currentGroup == 'A';
31✔
239

240
  result[PARAMS_NAMES.agentId] = REPORTER_ID;
31✔
241
  if (iiqAnalyticsAnalyticsAdapter.initOptions.fpid?.pcid) result[PARAMS_NAMES.firstPartyId] = encodeURIComponent(iiqAnalyticsAnalyticsAdapter.initOptions.fpid.pcid);
31✔
242
  if (iiqAnalyticsAnalyticsAdapter.initOptions.fpid?.pid) result[PARAMS_NAMES.profile] = encodeURIComponent(iiqAnalyticsAnalyticsAdapter.initOptions.fpid.pid)
31!
243

244
  prepareData(data, result);
31✔
245

246
  fillEidsData(result);
31✔
247

248
  return result;
31✔
249
}
250

251
function fillEidsData(result) {
252
  if (iiqAnalyticsAnalyticsAdapter.initOptions.lsIdsInitialized) {
31✔
253
    result[PARAMS_NAMES.hadEidsInLocalStorage] = iiqAnalyticsAnalyticsAdapter.initOptions.eidl && iiqAnalyticsAnalyticsAdapter.initOptions.eidl > 0;
2✔
254
    result[PARAMS_NAMES.auctionEidsLength] = iiqAnalyticsAnalyticsAdapter.initOptions.eidl || -1;
2!
255
  }
256
}
257

258
function prepareData (data, result) {
259
  const adTypeValue = data.adType || data.mediaType;
31✔
260

261
  if (data.bidderCode) {
31✔
262
    result.bidderCode = data.bidderCode;
30✔
263
  }
264
  if (data.cpm) {
31✔
265
    result.cpm = data.cpm;
31✔
266
  }
267
  if (data.currency) {
31✔
268
    result.currency = data.currency;
31✔
269
  }
270
  if (data.originalCpm) {
31✔
271
    result.originalCpm = data.originalCpm;
30✔
272
  }
273
  if (data.originalCurrency) {
31✔
274
    result.originalCurrency = data.originalCurrency;
30✔
275
  }
276
  if (data.status) {
31✔
277
    result.status = data.status;
30✔
278
  }
279
  if (data.auctionId) {
31✔
280
    result.prebidAuctionId = data.auctionId;
30✔
281
  }
282
  if (adTypeValue) {
31✔
283
    result[PARAMS_NAMES.adType] = adTypeValue;
31✔
284
  }
285
  const iiqConfig = getIntentIqConfig();
31✔
286
  const adUnitConfig = iiqConfig.params?.adUnitConfig;
31✔
287

288
  switch (adUnitConfig) {
31✔
289
    case 1:
290
      // adUnitCode or placementId
291
      result.placementId = data.adUnitCode || extractPlacementId(data) || '';
4✔
292
      break;
4✔
293
    case 2:
294
      // placementId or adUnitCode
295
      result.placementId = extractPlacementId(data) || data.adUnitCode || '';
2!
296
      break;
2✔
297
    case 3:
298
      // Only adUnitCode
299
      result.placementId = data.adUnitCode || '';
1!
300
      break;
1✔
301
    case 4:
302
      // Only placementId
303
      result.placementId = extractPlacementId(data) || '';
1!
304
      break;
1✔
305
    default:
306
      // Default (like in case #1)
307
      result.placementId = data.adUnitCode || extractPlacementId(data) || '';
23✔
308
  }
309

310
  result.biddingPlatformId = 1;
31✔
311
  result.partnerAuctionId = 'BW';
31✔
312
}
313

314
function extractPlacementId(data) {
315
  if (data.placementId) {
29✔
316
    return data.placementId;
3✔
317
  }
318
  if (data.params && Array.isArray(data.params)) {
26✔
319
    for (let i = 0; i < data.params.length; i++) {
1✔
320
      if (data.params[i].placementId) {
2✔
321
        return data.params[i].placementId;
1✔
322
      }
323
    }
324
  }
325
  return null;
25✔
326
}
327

328
function getDefaultDataObject() {
329
  return {
31✔
330
    'inbbl': false,
331
    'pbjsver': prebidVersion,
332
    'partnerAuctionId': 'BW',
333
    'reportSource': 'pbjs',
334
    'abGroup': 'U',
335
    'jsversion': VERSION,
336
    'partnerId': -1,
337
    'biddingPlatformId': 1,
338
    'idls': false,
339
    'ast': -1,
340
    'aeidln': -1
341
  }
342
}
343

344
function constructFullUrl(data) {
345
  const report = [];
28✔
346
  const reportMethod = iiqAnalyticsAnalyticsAdapter.initOptions.reportMethod;
28✔
347
  const currentBrowserLowerCase = detectBrowser();
28✔
348
  data = btoa(JSON.stringify(data));
28✔
349
  report.push(data);
28✔
350

351
  const cmpData = getCmpData();
28✔
352
  const baseUrl = reportingServerAddress(...getDataForDefineURL());
28✔
353

354
  let url = baseUrl + '?pid=' + iiqAnalyticsAnalyticsAdapter.initOptions.partner +
28✔
355
    '&mct=1' +
356
    ((iiqAnalyticsAnalyticsAdapter.initOptions?.fpid)
28✔
357
      ? '&iiqid=' + encodeURIComponent(iiqAnalyticsAnalyticsAdapter.initOptions.fpid.pcid) : '') +
358
    '&agid=' + REPORTER_ID +
359
    '&jsver=' + VERSION +
360
    '&source=' + PREBID +
361
    '&uh=' + encodeURIComponent(iiqAnalyticsAnalyticsAdapter.initOptions.clientsHints) +
362
    (cmpData.uspString ? '&us_privacy=' + encodeURIComponent(cmpData.uspString) : '') +
28✔
363
    (cmpData.gppString ? '&gpp=' + encodeURIComponent(cmpData.gppString) : '') +
28✔
364
    (cmpData.gdprString
28✔
365
      ? '&gdpr_consent=' + encodeURIComponent(cmpData.gdprString) + '&gdpr=1'
366
      : '&gdpr=0');
367
  url = appendSPData(url, iiqAnalyticsAnalyticsAdapter.initOptions.fpid)
28✔
368
  url = appendVrrefAndFui(url, iiqAnalyticsAnalyticsAdapter.initOptions.domainName);
28✔
369

370
  if (reportMethod === 'POST') {
28✔
371
    return { url, method: 'POST', payload: JSON.stringify(report) };
1✔
372
  }
373
  url += '&payload=' + encodeURIComponent(JSON.stringify(report));
27✔
374
  url = handleAdditionalParams(currentBrowserLowerCase, url, 2, iiqAnalyticsAnalyticsAdapter.initOptions.additionalParams);
27✔
375
  return { url, method: 'GET' };
27✔
376
}
377

378
iiqAnalyticsAnalyticsAdapter.originEnableAnalytics = iiqAnalyticsAnalyticsAdapter.enableAnalytics;
1✔
379

380
iiqAnalyticsAnalyticsAdapter.enableAnalytics = function (myConfig) {
1✔
381
  iiqAnalyticsAnalyticsAdapter.originEnableAnalytics(myConfig); // call the base class function
38✔
382
};
383
adapterManager.registerAnalyticsAdapter({
1✔
384
  adapter: iiqAnalyticsAnalyticsAdapter,
385
  code: MODULE_NAME
386
});
387

388
export default iiqAnalyticsAnalyticsAdapter;
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc