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

prebid / Prebid.js / 21839663904

09 Feb 2026 08:36PM UTC coverage: 96.205% (-0.03%) from 96.232%
21839663904

Pull #14433

github

c2bb76
web-flow
Fix JSON formatting in quantcastBidAdapter.json
Pull Request #14433: Prebid 11.0

53971 of 66273 branches covered (81.44%)

204 of 204 new or added lines in 39 files covered. (100.0%)

4 existing lines in 3 files now uncovered.

207796 of 215993 relevant lines covered (96.2%)

72.95 hits per line

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

92.31
/modules/browsiAnalyticsAdapter.js
1
import { logMessage, isGptPubadsDefined, timestamp } 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
import { getGlobal } from '../src/prebidGlobal.js';
7

8
const analyticsType = 'endpoint';
1✔
9
const PROVIDER_NAME = 'browsi';
1✔
10
const GVLID = 329;
1✔
11
const EVENT_SERVER_URL = `https://events.browsiprod.com/events/v2`;
1✔
12

13
/** @type {null|Object} */
14
let _staticData = null;
1✔
15
/** @type {string} */
16
const VERSION = getGlobal().version;
1✔
17
/** @type {string} */
18
const URL = encodeURIComponent(window.location.href);
1✔
19

20
const { AUCTION_END, BROWSI_INIT, BROWSI_DATA } = EVENTS;
1✔
21

22
export function getStaticData() {
23
  return _staticData;
1✔
24
}
25

26
export function setStaticData(data) {
27
  _staticData = {
3✔
28
    pvid: data.pvid,
29
    device: data.d,
30
    geo: data.g,
31
    aid: data.aid,
32
    es: data.es,
33
    pk: data.pk,
34
    sk: data.sk,
35
    t: data.t,
36
  };
37
}
38

39
function getTimeOffset(ts) {
40
  if (!ts) return undefined;
3!
41
  return timestamp() - ts;
3✔
42
}
43

44
function getAdUnitPathByCode(code) {
45
  const slots = isGptPubadsDefined() && window.googletag.pubads().getSlots();
4✔
46
  if (!slots || !slots.length) return null;
4✔
47
  const match = slots.find(slot => slot.getSlotElementId() === code);
×
48
  return match?.getAdUnitPath();
×
49
}
50

51
function getAdUnitsData(args) {
52
  const shouldSampleRtm = !!_staticData?.es;
2✔
53
  return args.adUnits?.map(adUnit => {
2!
54
    let rtm;
55
    const pbd = adUnit.bids
4✔
56
      .filter(({ ortb2Imp }) => {
12✔
57
        const brwData = ortb2Imp?.ext?.data?.browsi;
12✔
58
        if (brwData && !rtm) rtm = brwData;
12✔
59
        return !!brwData;
12✔
60
      })
61
      .map(bid => bid.bidder);
6✔
62
    return {
4✔
63
      plid: adUnit.code,
64
      au: getAdUnitPathByCode(adUnit.code),
65
      pbd,
66
      dpc: rtm ? Object.keys(rtm).length : 0,
4!
67
      ...(shouldSampleRtm && rtm ? { rtm } : {})
10✔
68
    }
69
  });
70
}
71

72
function handleAuctionEnd(args) {
73
  const event = {
2✔
74
    et: 'auction_data_sent',
75
    to: getTimeOffset(_staticData?.t),
6!
76
    pvid: _staticData?.pvid,
6!
77
    pk: _staticData?.pk,
6!
78
    sk: _staticData?.sk,
6!
79
    geo: _staticData?.geo,
6!
80
    dp: _staticData?.device,
6!
81
    aid: _staticData?.aid,
6!
82
    pbv: VERSION,
83
    url: URL,
84
    aucid: args.auctionId,
85
    ad_units: getAdUnitsData(args)
86
  }
87
  sendEvent(event, 'rtd_demand');
2✔
88
}
89

90
function handleBrowsiData(args) {
91
  if (args.moduleName !== 'browsi') return;
2✔
92
  setStaticData(args);
1✔
93
}
94

95
function handleModuleInit(args) {
96
  if (args.moduleName !== 'browsi') return;
2✔
97
  const event = {
1✔
98
    et: 'rtd_init',
99
    to: getTimeOffset(args.t),
100
    pvid: args.pvid,
101
    pk: args.pk,
102
    sk: args.sk,
103
    pbv: VERSION,
104
    url: URL,
105
    ...(args.rsn ? { rsn: args.rsn } : {}),
1!
106
  }
107
  sendEvent(event, 'rtd_supply');
1✔
108
}
109

110
function sendEvent(event, topic) {
111
  try {
3✔
112
    const pvid = event.pvid || _staticData?.pvid || '';
3!
113
    const body = JSON.stringify([event]);
3✔
114
    ajax(`${EVENT_SERVER_URL}/${topic}?p=${pvid}`, () => { }, body, {
3✔
115
      contentType: 'application/json',
116
      method: 'POST'
117
    });
118
  } catch (err) { logMessage('Browsi Analytics error') }
×
119
}
120

121
const browsiAnalytics = Object.assign(adapter({ url: EVENT_SERVER_URL, analyticsType }), {
1✔
122
  track({ eventType, args }) {
6✔
123
    switch (eventType) {
6!
124
      case BROWSI_INIT:
125
        handleModuleInit(args);
2✔
126
        break;
2✔
127
      case BROWSI_DATA:
128
        handleBrowsiData(args);
2✔
129
        break;
2✔
130
      case AUCTION_END:
131
        handleAuctionEnd(args);
2✔
132
        break;
2✔
133
      default:
UNCOV
134
        break;
×
135
    }
136
  }
137
});
138

139
browsiAnalytics.originEnableAnalytics = browsiAnalytics.enableAnalytics;
1✔
140

141
browsiAnalytics.enableAnalytics = function (config) {
1✔
142
  browsiAnalytics.originEnableAnalytics(config);
6✔
143
};
144

145
adapterManager.registerAnalyticsAdapter({
1✔
146
  adapter: browsiAnalytics,
147
  code: PROVIDER_NAME,
148
  gvlid: GVLID
149
});
150

151
export default browsiAnalytics;
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