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

prebid / Prebid.js / #290

03 Apr 2025 06:15PM UTC coverage: 90.188% (-0.3%) from 90.449%
#290

push

travis-ci

prebidjs-release
Prebid 9.38.0 release

42568 of 53450 branches covered (79.64%)

63111 of 69977 relevant lines covered (90.19%)

173.89 hits per line

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

56.79
/modules/growthCodeAnalyticsAdapter.js
1
/**
1✔
2
 * growthCodeAnalyticsAdapter.js - GrowthCode Analytics Adapter
3
 */
4
import { ajax } from '../src/ajax.js';
5
import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
6
import adapterManager from '../src/adapterManager.js';
7
import * as utils from '../src/utils.js';
8
import { EVENTS } from '../src/constants.js';
9
import {getStorageManager} from '../src/storageManager.js';
10
import {getRefererInfo} from '../src/refererDetection.js';
11
import {logError, logInfo} from '../src/utils.js';
12
import {MODULE_TYPE_ANALYTICS} from '../src/activities/modules.js';
13

14
const MODULE_NAME = 'growthCodeAnalytics';
1✔
15
const DEFAULT_PID = 'INVALID_PID'
1✔
16
const ENDPOINT_URL = 'https://analytics.gcprivacy.com/v3/pb/analytics'
1✔
17

18
export const storage = getStorageManager({moduleType: MODULE_TYPE_ANALYTICS, moduleName: MODULE_NAME});
1✔
19

20
let sessionId = utils.generateUUID();
1✔
21

22
let trackEvents = [];
1✔
23
let pid = DEFAULT_PID;
1✔
24
let url = ENDPOINT_URL;
1✔
25

26
let eventQueue = [];
1✔
27

28
let startAuction = 0;
1✔
29
let bidRequestTimeout = 0;
1✔
30
let analyticsType = 'endpoint';
1✔
31

32
let growthCodeAnalyticsAdapter = Object.assign(adapter({url: url, analyticsType}), {
1✔
33
  track({eventType, args}) {
34
    let eventData = args ? utils.deepClone(args) : {};
2!
35
    let data = {};
2✔
36
    if (!trackEvents.includes(eventType)) return;
2✔
37
    switch (eventType) {
1!
38
      case EVENTS.AUCTION_INIT: {
39
        data = eventData;
×
40
        startAuction = data.timestamp;
×
41
        bidRequestTimeout = data.timeout;
×
42
        break;
×
43
      }
44

45
      case EVENTS.AUCTION_END: {
46
        data = eventData;
1✔
47
        data.start = startAuction;
1✔
48
        data.end = Date.now();
1✔
49
        break;
1✔
50
      }
51

52
      case EVENTS.BID_ADJUSTMENT: {
53
        data.bidders = eventData;
×
54
        break;
×
55
      }
56

57
      case EVENTS.BID_TIMEOUT: {
58
        data.bidders = eventData;
×
59
        data.duration = bidRequestTimeout;
×
60
        break;
×
61
      }
62

63
      case EVENTS.BID_REQUESTED: {
64
        data = eventData;
×
65
        break;
×
66
      }
67

68
      case EVENTS.BID_RESPONSE: {
69
        data = eventData;
×
70
        delete data.ad;
×
71
        break;
×
72
      }
73

74
      case EVENTS.BID_WON: {
75
        data = eventData;
×
76
        delete data.ad;
×
77
        delete data.adUrl;
×
78
        break;
×
79
      }
80

81
      case EVENTS.BIDDER_DONE: {
82
        data = eventData;
×
83
        break;
×
84
      }
85

86
      case EVENTS.SET_TARGETING: {
87
        data.targetings = eventData;
×
88
        break;
×
89
      }
90

91
      case EVENTS.REQUEST_BIDS: {
92
        data = eventData;
×
93
        break;
×
94
      }
95

96
      case EVENTS.ADD_AD_UNITS: {
97
        data = eventData;
×
98
        break;
×
99
      }
100

101
      case EVENTS.NO_BID: {
102
        data = eventData
×
103
        break;
×
104
      }
105

106
      default:
107
        return;
×
108
    }
109

110
    data.eventType = eventType;
1✔
111
    data.timestamp = data.timestamp || Date.now();
1✔
112

113
    sendEvent(data);
1✔
114
  }
115
});
116

117
growthCodeAnalyticsAdapter.originEnableAnalytics = growthCodeAnalyticsAdapter.enableAnalytics;
1✔
118

119
growthCodeAnalyticsAdapter.enableAnalytics = function(conf = {}) {
1!
120
  if (typeof conf.options === 'object') {
3!
121
    if (conf.options.pid) {
3!
122
      pid = conf.options.pid;
3✔
123
      url = conf.options.url ? conf.options.url : ENDPOINT_URL;
3!
124
    } else {
125
      logError(MODULE_NAME + ' Not a valid PartnerID')
×
126
      return
×
127
    }
128
    if (conf.options.trackEvents) {
3!
129
      trackEvents = conf.options.trackEvents;
3✔
130
    }
131
  } else {
132
    logError(MODULE_NAME + ' Invalid configuration');
×
133
    return;
×
134
  }
135

136
  growthCodeAnalyticsAdapter.originEnableAnalytics(conf);
3✔
137
};
138

139
function logToServer() {
140
  if (pid === DEFAULT_PID) return;
1!
141
  if (eventQueue.length >= 1) {
1!
142
    // Get the correct GCID
143
    let gcid = storage.getDataFromLocalStorage('gcid');
1✔
144

145
    let data = {
1✔
146
      session: sessionId,
147
      pid: pid,
148
      gcid: gcid,
149
      timestamp: Date.now(),
150
      url: getRefererInfo().page,
151
      referer: document.referrer,
152
      events: eventQueue
153
    };
154

155
    ajax(url, {
1✔
156
      success: response => {
157
        logInfo(MODULE_NAME + ' Send Data to Server')
×
158
      },
159
      error: error => {
160
        logInfo(MODULE_NAME + ' Problem Send Data to Server: ' + error)
×
161
      }
162
    }, JSON.stringify(data), {method: 'POST', withCredentials: true})
163

164
    eventQueue = [
1✔
165
    ];
166
  }
167
}
168

169
function sendEvent(event) {
170
  eventQueue.push(event);
1✔
171
  logInfo(MODULE_NAME + 'Analytics Event: ' + event);
1✔
172

173
  if ((event.eventType === EVENTS.AUCTION_END) || (event.eventType === EVENTS.BID_WON)) {
1!
174
    logToServer();
1✔
175
  }
176
}
177

178
adapterManager.registerAnalyticsAdapter({
1✔
179
  adapter: growthCodeAnalyticsAdapter,
180
  code: 'growthCodeAnalytics'
181
});
182

183
growthCodeAnalyticsAdapter.logToServer = logToServer;
1✔
184

185
export default growthCodeAnalyticsAdapter;
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