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

prebid / Prebid.js / 16279920599

14 Jul 2025 11:12PM UTC coverage: 96.2% (-0.002%) from 96.202%
16279920599

push

github

412021
web-flow
maintenance: enforce no-global-assign in tests (#13575)

39190 of 48203 branches covered (81.3%)

12 of 12 new or added lines in 1 file covered. (100.0%)

27 existing lines in 19 files now uncovered.

192751 of 200364 relevant lines covered (96.2%)

87.93 hits per line

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

83.19
/modules/adxpremiumAnalyticsAdapter.js
1
import {deepClone, logError, logInfo} from '../src/utils.js';
1✔
2
import {ajax} from '../src/ajax.js';
3
import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
4
import adapterManager from '../src/adapterManager.js';
5
import { EVENTS } from '../src/constants.js';
6

7
const analyticsType = 'endpoint';
1✔
8
const defaultUrl = 'https://adxpremium.services/graphql';
1✔
9

10
const reqCountry = window.reqCountry || null;
1✔
11

12
// Events needed
13
const {
14
  AUCTION_INIT,
15
  BID_REQUESTED,
16
  BID_TIMEOUT,
17
  BID_RESPONSE,
18
  BID_WON,
19
  AUCTION_END
20
} = EVENTS;
1✔
21

22
const timeoutBased = false;
1✔
23
let requestSent = false;
1✔
24
let requestDelivered = false;
1✔
25
let elementIds = [];
1✔
26

27
// Memory objects
28
const completeObject = {
1✔
29
  publisher_id: null,
30
  auction_id: null,
31
  referer: null,
32
  screen_resolution: window.screen.width + 'x' + window.screen.height,
33
  device_type: null,
34
  geo: reqCountry,
35
  events: []
36
};
37

38
// Upgraded object
39
let upgradedObject = null;
1✔
40

41
const adxpremiumAnalyticsAdapter = Object.assign(adapter({ defaultUrl, analyticsType }), {
1✔
42
  track({ eventType, args }) {
7✔
43
    switch (eventType) {
7✔
44
      case AUCTION_INIT:
45
        auctionInit(args);
1✔
46
        break;
1✔
47
      case BID_REQUESTED:
48
        bidRequested(args);
1✔
49
        break;
1✔
50
      case BID_RESPONSE:
51
        bidResponse(args);
1✔
52
        break;
1✔
53
      case BID_WON:
54
        bidWon(args);
1✔
55
        break;
1✔
56
      case BID_TIMEOUT:
57
        bidTimeout(args);
1✔
58
        break;
1✔
59
      case AUCTION_END:
60
        auctionEnd(args);
1✔
61
        break;
1✔
62
      default:
63
        break;
1✔
64
    }
65
  }
66
});
67

68
// DFP support
69
const googletag = window.googletag || {};
1!
70
googletag.cmd = googletag.cmd || [];
1!
71
googletag.cmd.push(function() {
1✔
72
  googletag.pubads().addEventListener('slotRenderEnded', args => {
×
73
    clearSlot(args.slot.getSlotElementId());
×
74
  });
75
});
76

77
// Event handlers
78
let bidResponsesMapper = {};
1✔
79
let bidRequestsMapper = {};
1✔
80
let bidMapper = {};
1✔
81

82
function auctionInit(args) {
83
  // Clear events
84
  completeObject.events = [];
1✔
85
  // Allow new requests
86
  requestSent = false;
1✔
87
  requestDelivered = false;
1✔
88
  // Reset mappers
89
  bidResponsesMapper = {};
1✔
90
  bidRequestsMapper = {};
1✔
91
  bidMapper = {};
1✔
92

93
  completeObject.auction_id = args.auctionId;
1✔
94
  completeObject.publisher_id = adxpremiumAnalyticsAdapter.initOptions.pubId;
1✔
95
  // TODO: is 'page' the right value here?
96
  try { completeObject.referer = encodeURI(args.bidderRequests[0].refererInfo.page.split('?')[0]); } catch (e) { logError('AdxPremium Analytics - ' + e.message); }
1✔
97
  if (args.adUnitCodes && args.adUnitCodes.length > 0) {
1✔
98
    elementIds = args.adUnitCodes;
1✔
99
  }
100
  completeObject.device_type = deviceType();
1✔
101
}
102
function bidRequested(args) {
103
  const tmpObject = {
1✔
104
    type: 'REQUEST',
105
    bidder_code: args.bidderCode,
106
    event_timestamp: args.start,
107
    bid_gpt_codes: {}
108
  };
109

110
  args.bids.forEach(bid => {
1✔
111
    tmpObject.bid_gpt_codes[bid.adUnitCode] = bid.sizes;
2✔
112
    bidMapper[bid.bidId] = bid.bidderRequestId;
2✔
113
  });
114

115
  bidRequestsMapper[args.bidderRequestId] = completeObject.events.push(tmpObject) - 1;
1✔
116
}
117

118
function bidResponse(args) {
119
  const tmpObject = {
1✔
120
    type: 'RESPONSE',
121
    bidder_code: args.bidderCode,
122
    event_timestamp: args.responseTimestamp,
123
    size: args.size,
124
    gpt_code: args.adUnitCode,
125
    currency: args.currency,
126
    creative_id: args.creativeId,
127
    time_to_respond: args.timeToRespond,
128
    cpm: args.cpm,
129
    is_winning: false
130
  };
131

132
  bidResponsesMapper[args.requestId] = completeObject.events.push(tmpObject) - 1;
1✔
133
}
134

135
function bidWon(args) {
136
  const eventIndex = bidResponsesMapper[args.requestId];
1✔
137
  if (eventIndex !== undefined) {
1!
138
    if (requestDelivered) {
1!
139
      if (completeObject.events[eventIndex]) {
1!
140
        // do the upgrade
141
        logInfo('AdxPremium Analytics - Upgrading request');
1✔
142
        completeObject.events[eventIndex].is_winning = true;
1✔
143
        completeObject.events[eventIndex].is_upgrade = true;
1✔
144
        upgradedObject = deepClone(completeObject);
1✔
145
        upgradedObject.events = [completeObject.events[eventIndex]];
1✔
146
        sendEvent(upgradedObject); // send upgrade
1✔
147
      } else {
148
        logInfo('AdxPremium Analytics - CANNOT FIND INDEX FOR REQUEST ' + args.requestId);
×
149
      }
150
    } else {
151
      completeObject.events[eventIndex].is_winning = true;
×
152
    }
153
  } else {
154
    logInfo('AdxPremium Analytics - Response not found, creating new one.');
×
155
    const tmpObject = {
×
156
      type: 'RESPONSE',
157
      bidder_code: args.bidderCode,
158
      event_timestamp: args.responseTimestamp,
159
      size: args.size,
160
      gpt_code: args.adUnitCode,
161
      currency: args.currency,
162
      creative_id: args.creativeId,
163
      time_to_respond: args.timeToRespond,
164
      cpm: args.cpm,
165
      is_winning: true,
166
      is_lost: true
167
    };
168
    const lostObject = deepClone(completeObject);
×
169
    lostObject.events = [tmpObject];
×
170
    sendEvent(lostObject); // send lost object
×
171
  }
172
}
173

174
function bidTimeout(args) {
175
  const timeoutObject = deepClone(completeObject);
1✔
176
  timeoutObject.events = [];
1✔
177
  const usedRequestIds = [];
1✔
178

179
  args.forEach(bid => {
1✔
180
    const pulledRequestId = bidMapper[bid.bidId];
1✔
181
    const eventIndex = bidRequestsMapper[pulledRequestId];
1✔
182
    if (eventIndex !== undefined && completeObject.events[eventIndex] && usedRequestIds.indexOf(pulledRequestId) == -1) {
1✔
183
      // mark as timeouted
184
      const tempEventIndex = timeoutObject.events.push(completeObject.events[eventIndex]) - 1;
1✔
185
      timeoutObject.events[tempEventIndex]['type'] = 'TIMEOUT';
1✔
186
      usedRequestIds.push(pulledRequestId); // mark as used
1✔
187
    }
188
  });
189

190
  if (timeoutObject.events.length > 0) {
1✔
191
    sendEvent(timeoutObject); // send timeouted
1✔
192
    logInfo('AdxPremium Analytics - Sending timeouted requests');
1✔
193
  }
194
}
195

196
function auctionEnd(args) {
197
  logInfo('AdxPremium Analytics - Auction Ended at ' + Date.now());
1✔
198
  if (timeoutBased) { setTimeout(function () { requestSent = true; sendEvent(completeObject); }, 3500); } else { sendEventFallback(); }
1!
199
}
200

201
// Methods
202
function deviceType() {
203
  if ((/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i.test(navigator.userAgent.toLowerCase()))) {
1!
204
    return 'tablet';
×
205
  }
206
  if ((/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i.test(navigator.userAgent.toLowerCase()))) {
1!
207
    return 'mobile';
×
208
  }
209
  return 'desktop';
1✔
210
}
211

212
function clearSlot(elementId) {
213
  if (elementIds.includes(elementId)) { elementIds.splice(elementIds.indexOf(elementId), 1); logInfo('AdxPremium Analytics - Done with: ' + elementId); }
×
214
  if (elementIds.length == 0 && !requestSent && !timeoutBased) {
×
215
    requestSent = true;
×
216
    sendEvent(completeObject);
×
217
    logInfo('AdxPremium Analytics - Everything ready');
×
218
  }
219
}
220

221
export function testSend() {
222
  sendEvent(completeObject);
1✔
223
  logInfo('AdxPremium Analytics - Sending without any conditions, used for testing');
1✔
224
}
225

226
function sendEventFallback() {
227
  setTimeout(function () {
1✔
UNCOV
228
    if (!requestSent) { requestSent = true; sendEvent(completeObject); logInfo('AdxPremium Analytics - Sending event using fallback method.'); }
×
229
  }, 2000);
230
}
231

232
function sendEvent(completeObject) {
233
  if (!adxpremiumAnalyticsAdapter.enabled) return;
3!
234
  requestDelivered = true;
3✔
235
  try {
3✔
236
    const responseEvents = btoa(JSON.stringify(completeObject));
3✔
237
    const mutation = `mutation {createEvent(input: {event: {eventData: "${responseEvents}"}}) {event {createTime } } }`;
3✔
238
    const dataToSend = JSON.stringify({ query: mutation });
3✔
239
    let ajaxEndpoint = defaultUrl;
3✔
240
    if (adxpremiumAnalyticsAdapter.initOptions.sid) {
3✔
241
      ajaxEndpoint = 'https://' + adxpremiumAnalyticsAdapter.initOptions.sid + '.adxpremium.services/graphql'
3✔
242
    }
243
    ajax(ajaxEndpoint, function () { logInfo('AdxPremium Analytics - Sending complete events at ' + Date.now()) }, dataToSend, {
3✔
244
      contentType: 'application/json',
245
      method: 'POST'
246
    });
247
  } catch (err) { logError('AdxPremium Analytics - Sending event error: ' + err); }
×
248
}
249

250
// save the base class function
251
adxpremiumAnalyticsAdapter.originEnableAnalytics = adxpremiumAnalyticsAdapter.enableAnalytics;
1✔
252

253
// override enableAnalytics so we can get access to the config passed in from the page
254
adxpremiumAnalyticsAdapter.enableAnalytics = function (config) {
1✔
255
  adxpremiumAnalyticsAdapter.initOptions = config.options;
1✔
256

257
  if (!config.options.pubId) {
1!
258
    logError('AdxPremium Analytics - Publisher ID (pubId) option is not defined. Analytics won\'t work');
×
259
    return;
×
260
  }
261

262
  adxpremiumAnalyticsAdapter.originEnableAnalytics(config); // call the base class function
1✔
263
};
264

265
adapterManager.registerAnalyticsAdapter({
1✔
266
  adapter: adxpremiumAnalyticsAdapter,
267
  code: 'adxpremium'
268
});
269

270
export default adxpremiumAnalyticsAdapter;
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