prebid.js 7.33.0 → 7.35.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/.devcontainer/devcontainer.json +2 -1
- package/.github/workflows/issue_tracker.yml +27 -16
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/admaticBidAdapter.js +1 -1
- package/dist/admixerBidAdapter.js +1 -1
- package/dist/adnuntiusBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.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/arcspanRtdProvider.js +1 -0
- 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/bliinkBidAdapter.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/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consentManagement.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/emx_digitalBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gridNMBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hadronIdSystem.js +1 -1
- package/dist/holidBidAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/inmarBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.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/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/lotamePanoramaIdSystem.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/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/nextMillenniumBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +140 -149
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxBidAdapter.js +1 -1
- package/dist/ortbConverter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/permutiveRtdProvider.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/priceFloors.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pulsepointBidAdapter.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/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rubiconAnalyticsAdapter.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/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smartytechBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnAnalyticsAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.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/vidazooBidAdapter.js +1 -1
- 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/yahoosspBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/dist/zeta_global_sspBidAdapter.js +1 -1
- package/dist/zeusPrimeRtdProvider.js +4 -14
- package/integrationExamples/gpt/hello_world.html +0 -0
- package/libraries/ortbConverter/processors/default.js +19 -1
- package/modules/.submodules.json +1 -0
- package/modules/admaticBidAdapter.js +2 -1
- package/modules/admixerBidAdapter.js +26 -4
- package/modules/adnuntiusBidAdapter.js +36 -38
- package/modules/adyoulikeBidAdapter.js +2 -0
- package/modules/arcspanRtdProvider.js +73 -0
- package/modules/arcspanRtdProvider.md +11 -0
- package/modules/bliinkBidAdapter.js +1 -1
- package/modules/consentManagement.js +33 -5
- package/modules/consumableBidAdapter.js +20 -2
- package/modules/criteoBidAdapter.js +1 -1
- package/modules/cwireBidAdapter.js +169 -242
- package/modules/cwireBidAdapter.md +15 -14
- package/modules/emx_digitalBidAdapter.js +9 -2
- package/modules/hadronIdSystem.js +37 -32
- package/modules/holidBidAdapter.js +9 -4
- package/modules/kargoBidAdapter.js +5 -1
- package/modules/lotamePanoramaIdSystem.js +9 -1
- package/modules/nextMillenniumBidAdapter.js +19 -9
- package/modules/nexx360BidAdapter.js +1 -2
- package/modules/onetagBidAdapter.js +12 -1
- package/modules/openxBidAdapter.js +5 -0
- package/modules/outbrainBidAdapter.js +103 -6
- package/modules/permutiveRtdProvider.js +17 -12
- package/modules/prebidServerBidAdapter/index.js +14 -1
- package/modules/prebidServerBidAdapter/ortbConverter.js +1 -1
- package/modules/priceFloors.js +7 -8
- package/modules/pulsepointBidAdapter.js +2 -0
- package/modules/seedingAllianceBidAdapter.js +129 -116
- package/modules/smartadserverBidAdapter.js +39 -28
- package/modules/smartyadsBidAdapter.md +9 -0
- package/modules/smartytechBidAdapter.js +67 -10
- package/modules/smartytechBidAdapter.md +44 -33
- package/modules/sonobiBidAdapter.js +17 -10
- package/modules/taboolaBidAdapter.js +2 -1
- package/modules/tripleliftBidAdapter.js +4 -0
- package/modules/vidazooBidAdapter.js +56 -22
- package/modules/zeta_global_sspBidAdapter.js +15 -0
- package/modules/zeusPrimeRtdProvider.js +3 -323
- package/modules/zeusPrimeRtdProvider.md +3 -0
- package/package.json +1 -1
- package/src/adloader.js +2 -1
- package/src/auction.js +2 -11
- package/src/prebid.js +8 -0
- package/src/utils/cpm.js +17 -0
- package/test/spec/modules/admixerBidAdapter_spec.js +140 -60
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +120 -120
- package/test/spec/modules/adyoulikeBidAdapter_spec.js +3 -0
- package/test/spec/modules/arcspanRtdProvider_spec.js +187 -0
- package/test/spec/modules/bliinkBidAdapter_spec.js +7 -7
- package/test/spec/modules/consentManagement_spec.js +49 -1
- package/test/spec/modules/consumableBidAdapter_spec.js +46 -0
- package/test/spec/modules/cwireBidAdapter_spec.js +249 -335
- package/test/spec/modules/emx_digitalBidAdapter_spec.js +30 -1
- package/test/spec/modules/hadronIdSystem_spec.js +4 -6
- package/test/spec/modules/holidBidAdapter_spec.js +29 -0
- package/test/spec/modules/kargoBidAdapter_spec.js +32 -0
- package/test/spec/modules/lotamePanoramaIdSystem_spec.js +16 -10
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +14 -2
- package/test/spec/modules/nexx360BidAdapter_spec.js +0 -4
- package/test/spec/modules/onetagBidAdapter_spec.js +43 -0
- package/test/spec/modules/openxBidAdapter_spec.js +41 -0
- package/test/spec/modules/openxOrtbBidAdapter_spec.js +41 -0
- package/test/spec/modules/outbrainBidAdapter_spec.js +182 -18
- package/test/spec/modules/prebidServerBidAdapter_spec.js +138 -0
- package/test/spec/modules/pulsepointBidAdapter_spec.js +11 -1
- package/test/spec/modules/seedingAllianceAdapter_spec.js +66 -23
- package/test/spec/modules/smartadserverBidAdapter_spec.js +116 -5
- package/test/spec/modules/smartytechBidAdapter_spec.js +172 -14
- package/test/spec/modules/sonobiBidAdapter_spec.js +2 -1
- package/test/spec/modules/taboolaBidAdapter_spec.js +12 -3
- package/test/spec/modules/tripleliftBidAdapter_spec.js +13 -0
- package/test/spec/modules/userId_spec.js +19 -14
- package/test/spec/modules/vidazooBidAdapter_spec.js +61 -22
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +8 -0
- package/test/spec/ortbConverter/default_processors_spec.js +23 -0
- package/test/spec/unit/pbjs_api_spec.js +14 -0
- package/test/spec/unit/utils/cpm_spec.js +64 -0
- package/test/spec/modules/zeusPrimeRtdProvider_spec.js +0 -410
|
@@ -295,22 +295,29 @@ function _findBidderRequest(bidderRequests, bidId) {
|
|
|
295
295
|
}
|
|
296
296
|
}
|
|
297
297
|
|
|
298
|
+
// This function takes all the possible sizes.
|
|
299
|
+
// returns string csv.
|
|
298
300
|
function _validateSize(bid) {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
+
let size = [];
|
|
302
|
+
if (deepAccess(bid, 'mediaTypes.video.playerSize')) {
|
|
303
|
+
size.push(deepAccess(bid, 'mediaTypes.video.playerSize'))
|
|
301
304
|
}
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
+
if (deepAccess(bid, 'mediaTypes.video.sizes')) {
|
|
306
|
+
size.push(deepAccess(bid, 'mediaTypes.video.sizes'))
|
|
307
|
+
}
|
|
308
|
+
if (deepAccess(bid, 'params.sizes')) {
|
|
309
|
+
size.push(deepAccess(bid, 'params.sizes'));
|
|
305
310
|
}
|
|
306
311
|
if (deepAccess(bid, 'mediaTypes.banner.sizes')) {
|
|
307
|
-
|
|
312
|
+
size.push(deepAccess(bid, 'mediaTypes.banner.sizes'))
|
|
308
313
|
}
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
if (bid.sizes) {
|
|
312
|
-
return parseSizesInput(bid.sizes).join(',');
|
|
314
|
+
if (deepAccess(bid, 'sizes')) {
|
|
315
|
+
size.push(deepAccess(bid, 'sizes'))
|
|
313
316
|
}
|
|
317
|
+
// Pass the 2d sizes array into parseSizeInput to flatten it into an array of x separated sizes.
|
|
318
|
+
// Then throw it into Set to uniquify it.
|
|
319
|
+
// Then spread it to an array again. Then join it into a csv of sizes.
|
|
320
|
+
return [...new Set(parseSizesInput(...size))].join(',');
|
|
314
321
|
}
|
|
315
322
|
|
|
316
323
|
function _validateSlot(bid) {
|
|
@@ -279,7 +279,7 @@ function getBid(bids, currency, bidResponse) {
|
|
|
279
279
|
return;
|
|
280
280
|
}
|
|
281
281
|
const {
|
|
282
|
-
price: cpm, crid: creativeId, adm: ad, w: width, h: height, exp: ttl, adomain: advertiserDomains, meta = {}
|
|
282
|
+
price: cpm, nurl, crid: creativeId, adm: ad, w: width, h: height, exp: ttl, adomain: advertiserDomains, meta = {}
|
|
283
283
|
} = bidResponse;
|
|
284
284
|
let requestId = bids[bidResponse.impid - 1].bidId;
|
|
285
285
|
if (advertiserDomains && advertiserDomains.length > 0) {
|
|
@@ -297,6 +297,7 @@ function getBid(bids, currency, bidResponse) {
|
|
|
297
297
|
width,
|
|
298
298
|
height,
|
|
299
299
|
meta,
|
|
300
|
+
nurl,
|
|
300
301
|
netRevenue: true
|
|
301
302
|
};
|
|
302
303
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import {_each, deepAccess, parseSizesInput, parseUrl, uniques, isFn} from '../src/utils.js';
|
|
2
|
+
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
3
|
+
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
4
|
+
import {getStorageManager} from '../src/storageManager.js';
|
|
5
|
+
import {bidderSettings} from '../src/bidderSettings.js';
|
|
6
|
+
import { config } from '../src/config.js';
|
|
6
7
|
|
|
7
8
|
const GVLID = 744;
|
|
8
9
|
const DEFAULT_SUB_DOMAIN = 'prebid';
|
|
@@ -26,11 +27,11 @@ export const SUPPORTED_ID_SYSTEMS = {
|
|
|
26
27
|
'tdid': 1,
|
|
27
28
|
'pubProvidedId': 1
|
|
28
29
|
};
|
|
29
|
-
const storage = getStorageManager({
|
|
30
|
+
const storage = getStorageManager({gvlid: GVLID, bidderCode: BIDDER_CODE});
|
|
30
31
|
|
|
31
32
|
function getTopWindowQueryParams() {
|
|
32
33
|
try {
|
|
33
|
-
const parsedUrl = parseUrl(window.top.document.URL, {
|
|
34
|
+
const parsedUrl = parseUrl(window.top.document.URL, {decodeSearchAsString: true});
|
|
34
35
|
return parsedUrl.search;
|
|
35
36
|
} catch (e) {
|
|
36
37
|
return '';
|
|
@@ -58,10 +59,23 @@ function isBidRequestValid(bid) {
|
|
|
58
59
|
return !!(extractCID(params) && extractPID(params));
|
|
59
60
|
}
|
|
60
61
|
|
|
61
|
-
function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
|
|
62
|
-
const {
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
function buildRequest(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
|
|
63
|
+
const {
|
|
64
|
+
params,
|
|
65
|
+
bidId,
|
|
66
|
+
userId,
|
|
67
|
+
adUnitCode,
|
|
68
|
+
schain,
|
|
69
|
+
mediaTypes,
|
|
70
|
+
auctionId,
|
|
71
|
+
transactionId,
|
|
72
|
+
bidderRequestId,
|
|
73
|
+
bidRequestsCount,
|
|
74
|
+
bidderRequestsCount,
|
|
75
|
+
bidderWinsCount
|
|
76
|
+
} = bid;
|
|
77
|
+
const {ext} = params;
|
|
78
|
+
let {bidFloor} = params;
|
|
65
79
|
const hashUrl = hashCode(topWindowUrl);
|
|
66
80
|
const dealId = getNextDealId(hashUrl);
|
|
67
81
|
const uniqueDealId = getUniqueDealId(hashUrl);
|
|
@@ -110,7 +124,14 @@ function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
|
|
|
110
124
|
isStorageAllowed: isStorageAllowed,
|
|
111
125
|
gpid: gpid,
|
|
112
126
|
cat: cat,
|
|
113
|
-
pagecat: pagecat
|
|
127
|
+
pagecat: pagecat,
|
|
128
|
+
auctionId: auctionId,
|
|
129
|
+
transactionId: transactionId,
|
|
130
|
+
bidderRequestId: bidderRequestId,
|
|
131
|
+
bidRequestsCount: bidRequestsCount,
|
|
132
|
+
bidderRequestsCount: bidderRequestsCount,
|
|
133
|
+
bidderWinsCount: bidderWinsCount,
|
|
134
|
+
bidderTimeout: bidderTimeout
|
|
114
135
|
};
|
|
115
136
|
|
|
116
137
|
appendUserIdsToRequestPayload(data, userId);
|
|
@@ -127,6 +148,14 @@ function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
|
|
|
127
148
|
data.usPrivacy = bidderRequest.uspConsent;
|
|
128
149
|
}
|
|
129
150
|
|
|
151
|
+
if (bidderRequest.gppConsent) {
|
|
152
|
+
data.gppString = bidderRequest.gppConsent.gppString;
|
|
153
|
+
data.gppSid = bidderRequest.gppConsent.applicableSections;
|
|
154
|
+
} else if (bidderRequest.ortb2?.regs?.gpp) {
|
|
155
|
+
data.gppString = bidderRequest.ortb2.regs.gpp;
|
|
156
|
+
data.gppSid = bidderRequest.ortb2.regs.gpp_sid;
|
|
157
|
+
}
|
|
158
|
+
|
|
130
159
|
const dto = {
|
|
131
160
|
method: 'POST',
|
|
132
161
|
url: `${createDomain(subDomain)}/prebid/multi/${cId}`,
|
|
@@ -169,10 +198,11 @@ function appendUserIdsToRequestPayload(payloadRef, userIds) {
|
|
|
169
198
|
function buildRequests(validBidRequests, bidderRequest) {
|
|
170
199
|
// TODO: does the fallback make sense here?
|
|
171
200
|
const topWindowUrl = bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation;
|
|
201
|
+
const bidderTimeout = config.getConfig('bidderTimeout');
|
|
172
202
|
const requests = [];
|
|
173
203
|
validBidRequests.forEach(validBidRequest => {
|
|
174
204
|
const sizes = parseSizesInput(validBidRequest.sizes);
|
|
175
|
-
const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest);
|
|
205
|
+
const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout);
|
|
176
206
|
requests.push(request);
|
|
177
207
|
});
|
|
178
208
|
return requests;
|
|
@@ -182,14 +212,14 @@ function interpretResponse(serverResponse, request) {
|
|
|
182
212
|
if (!serverResponse || !serverResponse.body) {
|
|
183
213
|
return [];
|
|
184
214
|
}
|
|
185
|
-
const {
|
|
186
|
-
const {
|
|
215
|
+
const {bidId} = request.data;
|
|
216
|
+
const {results} = serverResponse.body;
|
|
187
217
|
|
|
188
218
|
let output = [];
|
|
189
219
|
|
|
190
220
|
try {
|
|
191
221
|
results.forEach(result => {
|
|
192
|
-
const {
|
|
222
|
+
const {creativeId, ad, price, exp, width, height, currency, advertiserDomains, mediaType = BANNER} = result;
|
|
193
223
|
if (!ad || !price) {
|
|
194
224
|
return;
|
|
195
225
|
}
|
|
@@ -228,8 +258,8 @@ function interpretResponse(serverResponse, request) {
|
|
|
228
258
|
|
|
229
259
|
function getUserSyncs(syncOptions, responses, gdprConsent = {}, uspConsent = '') {
|
|
230
260
|
let syncs = [];
|
|
231
|
-
const {
|
|
232
|
-
const {
|
|
261
|
+
const {iframeEnabled, pixelEnabled} = syncOptions;
|
|
262
|
+
const {gdprApplies, consentString = ''} = gdprConsent;
|
|
233
263
|
|
|
234
264
|
const cidArr = responses.filter(resp => deepAccess(resp, 'body.cid')).map(resp => resp.body.cid).filter(uniques);
|
|
235
265
|
const params = `?cid=${encodeURIComponent(cidArr.join(','))}&gdpr=${gdprApplies ? 1 : 0}&gdpr_consent=${encodeURIComponent(consentString || '')}&us_privacy=${encodeURIComponent(uspConsent || '')}`
|
|
@@ -253,7 +283,9 @@ export function hashCode(s, prefix = '_') {
|
|
|
253
283
|
let h = 0
|
|
254
284
|
let i = 0;
|
|
255
285
|
if (l > 0) {
|
|
256
|
-
while (i < l) {
|
|
286
|
+
while (i < l) {
|
|
287
|
+
h = (h << 5) - h + s.charCodeAt(i++) | 0;
|
|
288
|
+
}
|
|
257
289
|
}
|
|
258
290
|
return prefix + h;
|
|
259
291
|
}
|
|
@@ -310,7 +342,8 @@ export function getCacheOpt() {
|
|
|
310
342
|
export function getStorageItem(key) {
|
|
311
343
|
try {
|
|
312
344
|
return tryParseJSON(storage.getDataFromLocalStorage(key));
|
|
313
|
-
} catch (e) {
|
|
345
|
+
} catch (e) {
|
|
346
|
+
}
|
|
314
347
|
|
|
315
348
|
return null;
|
|
316
349
|
}
|
|
@@ -318,9 +351,10 @@ export function getStorageItem(key) {
|
|
|
318
351
|
export function setStorageItem(key, value, timestamp) {
|
|
319
352
|
try {
|
|
320
353
|
const created = timestamp || Date.now();
|
|
321
|
-
const data = JSON.stringify({
|
|
354
|
+
const data = JSON.stringify({value, created});
|
|
322
355
|
storage.setDataInLocalStorage(key, data);
|
|
323
|
-
} catch (e) {
|
|
356
|
+
} catch (e) {
|
|
357
|
+
}
|
|
324
358
|
}
|
|
325
359
|
|
|
326
360
|
export function tryParseJSON(value) {
|
|
@@ -90,6 +90,21 @@ export const spec = {
|
|
|
90
90
|
if (!impData.banner && !impData.video) {
|
|
91
91
|
impData.banner = buildBanner(request);
|
|
92
92
|
}
|
|
93
|
+
|
|
94
|
+
if (typeof request.getFloor === 'function') {
|
|
95
|
+
const floorInfo = request.getFloor({
|
|
96
|
+
currency: 'USD',
|
|
97
|
+
mediaType: impData.video ? 'video' : 'banner',
|
|
98
|
+
size: [ impData.video ? impData.video.w : impData.banner.w, impData.video ? impData.video.h : impData.banner.h ]
|
|
99
|
+
});
|
|
100
|
+
if (floorInfo && floorInfo.floor) {
|
|
101
|
+
impData.bidfloor = floorInfo.floor;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (!impData.bidfloor && params.bidfloor) {
|
|
105
|
+
impData.bidfloor = params.bidfloor;
|
|
106
|
+
}
|
|
107
|
+
|
|
93
108
|
return impData;
|
|
94
109
|
});
|
|
95
110
|
|
|
@@ -1,328 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
* This module adds Zeus Insights For Publishers (ZIP) provider to the real time data module
|
|
3
|
-
* The {@link module:modules/realTimeData} module is required
|
|
4
|
-
*
|
|
5
|
-
* This module will request the article topics for the current page and add them as page keyvalues
|
|
6
|
-
* for the ad requests.
|
|
7
|
-
*
|
|
8
|
-
* @module modules/zeusInsightsForPublishersRtdProvider
|
|
9
|
-
* @requires module:modules/realTimeData
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { logInfo, logError, logWarn, logMessage } from '../src/utils.js'
|
|
1
|
+
import { logWarn } from '../src/utils.js'
|
|
13
2
|
import { submodule } from '../src/hook.js'
|
|
14
|
-
import { ajaxBuilder } from '../src/ajax.js'
|
|
15
|
-
|
|
16
|
-
class Logger {
|
|
17
|
-
get showDebug() {
|
|
18
|
-
if (this._showDebug === true || this._showDebug === false) {
|
|
19
|
-
return this._showDebug
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
return window.zeusPrime?.debug || false
|
|
23
|
-
}
|
|
24
|
-
set showDebug(shouldShow) {
|
|
25
|
-
this._showDebug = shouldShow
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
get error() {
|
|
29
|
-
return logError.bind(this, 'zeusPrimeRtdProvider: ')
|
|
30
|
-
}
|
|
31
|
-
get warn() {
|
|
32
|
-
return logWarn.bind(this, 'zeusPrimeRtdProvider: ')
|
|
33
|
-
}
|
|
34
|
-
get info() {
|
|
35
|
-
return logInfo.bind(this, 'zeusPrimeRtdProvider: ')
|
|
36
|
-
}
|
|
37
|
-
get debug() {
|
|
38
|
-
if (this.showDebug) {
|
|
39
|
-
return logMessage.bind(this, 'zeusPrimeRtdProvider: ')
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
return () => {}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
var logger = new Logger()
|
|
47
|
-
|
|
48
|
-
function loadCommandQueue() {
|
|
49
|
-
window.zeusPrime = window.zeusPrime || { cmd: [] }
|
|
50
|
-
const queue = [...window.zeusPrime.cmd]
|
|
51
|
-
|
|
52
|
-
window.zeusPrime.cmd = []
|
|
53
|
-
window.zeusPrime.cmd.push = (callback) => {
|
|
54
|
-
callback(window.zeusPrime)
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
queue.forEach((callback) => callback(window.zeusPrime))
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function markStatusComplete(key) {
|
|
61
|
-
const status = window?.zeusPrime?.status
|
|
62
|
-
if (status) {
|
|
63
|
-
status[key] = true
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function createStatus() {
|
|
68
|
-
if (window.zeusPrime && !window.zeusPrime.status) {
|
|
69
|
-
Object.defineProperty(window.zeusPrime, 'status', {
|
|
70
|
-
enumerable: false,
|
|
71
|
-
value: {
|
|
72
|
-
initComplete: false,
|
|
73
|
-
primeKeyValueSet: false,
|
|
74
|
-
insightsReqSent: false,
|
|
75
|
-
insightsReqReceived: false,
|
|
76
|
-
insightsKeyValueSet: false,
|
|
77
|
-
scriptComplete: false,
|
|
78
|
-
},
|
|
79
|
-
})
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function loadPrimeQueryParams() {
|
|
84
|
-
try {
|
|
85
|
-
const params = new URLSearchParams(window.location.search)
|
|
86
|
-
params.forEach((paramValue, paramKey) => {
|
|
87
|
-
if (!paramKey.startsWith('zeus_prime_')) {
|
|
88
|
-
return
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
let key = paramKey.replace('zeus_prime_', '')
|
|
92
|
-
let value = paramValue.toLowerCase()
|
|
93
|
-
|
|
94
|
-
if (value === 'true' || value === '1') {
|
|
95
|
-
value = true
|
|
96
|
-
} else if (value === 'false' || value === '0') {
|
|
97
|
-
value = false
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
window.zeusPrime[key] = value
|
|
101
|
-
})
|
|
102
|
-
} catch (_) {}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const DEFAULT_API = 'https://insights.zeustechnology.com'
|
|
106
|
-
|
|
107
|
-
function init(gamId = null, options = {}) {
|
|
108
|
-
window.zeusPrime = window.zeusPrime || { cmd: [] }
|
|
109
|
-
|
|
110
|
-
window.zeusPrime.gamId = gamId || options.gamId || window.zeusPrime.gamId || undefined
|
|
111
|
-
window.zeusPrime.api = DEFAULT_API
|
|
112
|
-
window.zeusPrime.hostname = options.hostname || window.location?.hostname || ''
|
|
113
|
-
window.zeusPrime.pathname = options.pathname || window.location?.pathname || ''
|
|
114
|
-
window.zeusPrime.pageUrl = `${window.zeusPrime.hostname}${window.zeusPrime.pathname}`
|
|
115
|
-
window.zeusPrime.pageHash = options.pageHash || null
|
|
116
|
-
window.zeusPrime.debug = window.zeusPrime.debug || options.debug === true || false
|
|
117
|
-
window.zeusPrime.disabled = window.zeusPrime.disabled || options.disabled === true || false
|
|
118
|
-
|
|
119
|
-
loadPrimeQueryParams()
|
|
120
|
-
|
|
121
|
-
logger.showDebug = window.zeusPrime.debug
|
|
122
|
-
|
|
123
|
-
createStatus()
|
|
124
|
-
markStatusComplete('initComplete')
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function setTargeting() {
|
|
128
|
-
const { gamId, hostname } = window.zeusPrime
|
|
129
|
-
|
|
130
|
-
if (typeof gamId !== 'string') {
|
|
131
|
-
throw new Error(`window.zeusPrime.gamId must be a string. Received: ${String(gamId)}`)
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
addKeyValueToGoogletag(`zeus_${gamId}`, hostname)
|
|
135
|
-
logger.debug(`Setting zeus_${gamId}=${hostname}`)
|
|
136
|
-
markStatusComplete('primeKeyValueSet')
|
|
137
|
-
}
|
|
138
3
|
|
|
139
|
-
function
|
|
140
|
-
|
|
141
|
-
logger.debug('Disabling prime; Setting key-value zeus_prime to false')
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
function addKeyValueToGoogletag(key, value) {
|
|
145
|
-
window.googletag = window.googletag || { cmd: [] }
|
|
146
|
-
window.googletag.cmd.push(function () {
|
|
147
|
-
window.googletag.pubads().setTargeting(key, value)
|
|
148
|
-
})
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
function isInsightsPage(pathname = '') {
|
|
152
|
-
const NOT_SECTIONS = [
|
|
153
|
-
{
|
|
154
|
-
test: /\/search/,
|
|
155
|
-
type: 'search',
|
|
156
|
-
},
|
|
157
|
-
{
|
|
158
|
-
test: /\/author/,
|
|
159
|
-
type: 'author',
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
test: /\/event/,
|
|
163
|
-
type: 'event',
|
|
164
|
-
},
|
|
165
|
-
{
|
|
166
|
-
test: /\/homepage/,
|
|
167
|
-
type: 'front',
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
test: /^\/?$/,
|
|
171
|
-
type: 'front',
|
|
172
|
-
},
|
|
173
|
-
]
|
|
174
|
-
|
|
175
|
-
const typeObj = NOT_SECTIONS.find((pg) => pathname.match(pg.test))
|
|
176
|
-
return typeObj === undefined
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
async function getUrlHash(canonical) {
|
|
180
|
-
try {
|
|
181
|
-
const buf = await window.crypto.subtle.digest(
|
|
182
|
-
'SHA-1',
|
|
183
|
-
new TextEncoder('utf-8').encode(canonical)
|
|
184
|
-
)
|
|
185
|
-
const hashed = Array.prototype.map
|
|
186
|
-
.call(new Uint8Array(buf), (x) => `00${x.toString(16)}`.slice(-2))
|
|
187
|
-
.join('')
|
|
188
|
-
|
|
189
|
-
return hashed
|
|
190
|
-
} catch (e) {
|
|
191
|
-
logger.error('Failed to load hash', e.message)
|
|
192
|
-
logger.debug('Exception', e)
|
|
193
|
-
return ''
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
async function sendPrebidRequest(url) {
|
|
198
|
-
return new Promise((resolve, reject) => {
|
|
199
|
-
const ajax = ajaxBuilder()
|
|
200
|
-
ajax(url, {
|
|
201
|
-
success: (responseText, response) => {
|
|
202
|
-
resolve({
|
|
203
|
-
...response,
|
|
204
|
-
status: response.status,
|
|
205
|
-
json: () => JSON.parse(responseText),
|
|
206
|
-
})
|
|
207
|
-
},
|
|
208
|
-
|
|
209
|
-
error: (responseText, response) => {
|
|
210
|
-
if (!response.status) {
|
|
211
|
-
reject(response)
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
let json = responseText
|
|
215
|
-
if (responseText) {
|
|
216
|
-
try {
|
|
217
|
-
json = JSON.parse(responseText)
|
|
218
|
-
} catch (_) {
|
|
219
|
-
json = null
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
resolve({
|
|
224
|
-
status: response.status,
|
|
225
|
-
json: () => json || null,
|
|
226
|
-
responseValue: json,
|
|
227
|
-
})
|
|
228
|
-
},
|
|
229
|
-
})
|
|
230
|
-
})
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
async function requestTopics() {
|
|
234
|
-
const { api, hostname, pageUrl } = window.zeusPrime
|
|
235
|
-
|
|
236
|
-
if (!window.zeusPrime.pageHash) {
|
|
237
|
-
window.zeusPrime.pageHash = await getUrlHash(pageUrl)
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
const pageHash = window.zeusPrime.pageHash
|
|
241
|
-
const zeusInsightsUrl = `${api}/${hostname}/${pageHash}?article_location=${pageUrl}`
|
|
242
|
-
|
|
243
|
-
logger.debug('Requesting topics', zeusInsightsUrl)
|
|
244
|
-
try {
|
|
245
|
-
markStatusComplete('insightsReqSent')
|
|
246
|
-
const response = await sendPrebidRequest(zeusInsightsUrl)
|
|
247
|
-
if (response.status === 200) {
|
|
248
|
-
logger.debug('topics found')
|
|
249
|
-
markStatusComplete('insightsReqReceived')
|
|
250
|
-
return await response.json()
|
|
251
|
-
} else if (
|
|
252
|
-
response.status === 204 ||
|
|
253
|
-
response.status < 200 ||
|
|
254
|
-
(response.status >= 300 && response.status <= 399)
|
|
255
|
-
) {
|
|
256
|
-
logger.debug('no topics found')
|
|
257
|
-
markStatusComplete('insightsReqReceived')
|
|
258
|
-
return null
|
|
259
|
-
} else {
|
|
260
|
-
logger.error(`Topics request returned error: ${response.status}`)
|
|
261
|
-
markStatusComplete('insightsReqReceived')
|
|
262
|
-
return null
|
|
263
|
-
}
|
|
264
|
-
} catch (e) {
|
|
265
|
-
logger.error('failed to request topics', e)
|
|
266
|
-
return null
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
function setTopicsTargeting(topics = []) {
|
|
271
|
-
if (topics.length === 0) {
|
|
272
|
-
return
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
window.googletag = window.googletag || { cmd: [] }
|
|
276
|
-
window.googletag.cmd.push(function () {
|
|
277
|
-
window.googletag.pubads().setTargeting('zeus_insights', topics)
|
|
278
|
-
})
|
|
279
|
-
|
|
280
|
-
markStatusComplete('insightsKeyValueSet')
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
async function startTopicsRequest() {
|
|
284
|
-
if (isInsightsPage(window.zeusPrime.pathname)) {
|
|
285
|
-
const response = await requestTopics()
|
|
286
|
-
if (response) {
|
|
287
|
-
setTopicsTargeting(response?.topics)
|
|
288
|
-
}
|
|
289
|
-
} else {
|
|
290
|
-
logger.debug('This page is not eligible for topics, request will be skipped')
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
async function run(gamId, options = {}) {
|
|
295
|
-
logger.showDebug = options.debug || false
|
|
296
|
-
|
|
297
|
-
try {
|
|
298
|
-
init(gamId, options)
|
|
299
|
-
loadCommandQueue()
|
|
300
|
-
|
|
301
|
-
if (window.zeusPrime.disabled) {
|
|
302
|
-
setPrimeAsDisabled()
|
|
303
|
-
} else {
|
|
304
|
-
setTargeting()
|
|
305
|
-
await startTopicsRequest()
|
|
306
|
-
}
|
|
307
|
-
} catch (e) {
|
|
308
|
-
logger.error('Failed to run.', e.message || e)
|
|
309
|
-
} finally {
|
|
310
|
-
markStatusComplete('scriptComplete')
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* @preserve
|
|
316
|
-
* Initializes the ZeusPrime RTD Submodule. The config provides the GamID for this
|
|
317
|
-
* site that is used to configure Prime.
|
|
318
|
-
* @param {object} config The Prebid configuration for this module.
|
|
319
|
-
* @param {object} config.params The parameters for this module.
|
|
320
|
-
* @param {string} config.params.gamId The Gam ID (or Network Code) in GAM for this site.
|
|
321
|
-
*/
|
|
322
|
-
function initModule(config) {
|
|
323
|
-
const { params } = config || {}
|
|
324
|
-
const { gamId, ...rest } = params || {}
|
|
325
|
-
run(gamId, rest)
|
|
4
|
+
function initModule() {
|
|
5
|
+
logWarn('Zeus Prime has been deprecated. This module will be removed in Prebid 8.')
|
|
326
6
|
}
|
|
327
7
|
|
|
328
8
|
/**
|
package/package.json
CHANGED
package/src/adloader.js
CHANGED
package/src/auction.js
CHANGED
|
@@ -93,6 +93,7 @@ import CONSTANTS from './constants.json';
|
|
|
93
93
|
import {GreedyPromise} from './utils/promise.js';
|
|
94
94
|
import {useMetrics} from './utils/perfMetrics.js';
|
|
95
95
|
import {createBid} from './bidfactory.js';
|
|
96
|
+
import {adjustCpm} from './utils/cpm.js';
|
|
96
97
|
|
|
97
98
|
const { syncUsers } = userSync;
|
|
98
99
|
|
|
@@ -971,17 +972,7 @@ function setKeys(keyValues, bidderSettings, custBidObj, bidReq) {
|
|
|
971
972
|
}
|
|
972
973
|
|
|
973
974
|
export function adjustBids(bid) {
|
|
974
|
-
let
|
|
975
|
-
let bidPriceAdjusted = bid.cpm;
|
|
976
|
-
const bidCpmAdjustment = bidderSettings.get(code || null, 'bidCpmAdjustment');
|
|
977
|
-
|
|
978
|
-
if (bidCpmAdjustment && typeof bidCpmAdjustment === 'function') {
|
|
979
|
-
try {
|
|
980
|
-
bidPriceAdjusted = bidCpmAdjustment(bid.cpm, Object.assign({}, bid));
|
|
981
|
-
} catch (e) {
|
|
982
|
-
logError('Error during bid adjustment', 'bidmanager.js', e);
|
|
983
|
-
}
|
|
984
|
-
}
|
|
975
|
+
let bidPriceAdjusted = adjustCpm(bid.cpm, bid);
|
|
985
976
|
|
|
986
977
|
if (bidPriceAdjusted >= 0) {
|
|
987
978
|
bid.cpm = bidPriceAdjusted;
|
package/src/prebid.js
CHANGED
|
@@ -915,6 +915,14 @@ $$PREBID_GLOBAL$$.aliasBidder = function (bidderCode, alias, options) {
|
|
|
915
915
|
}
|
|
916
916
|
};
|
|
917
917
|
|
|
918
|
+
/**
|
|
919
|
+
* @alias module:pbjs.aliasRegistry
|
|
920
|
+
*/
|
|
921
|
+
$$PREBID_GLOBAL$$.aliasRegistry = adapterManager.aliasRegistry;
|
|
922
|
+
config.getConfig('aliasRegistry', config => {
|
|
923
|
+
if (config.aliasRegistry === 'private') delete $$PREBID_GLOBAL$$.aliasRegistry;
|
|
924
|
+
});
|
|
925
|
+
|
|
918
926
|
/**
|
|
919
927
|
* The bid response object returned by an external bidder adapter during the auction.
|
|
920
928
|
* @typedef {Object} AdapterBidResponse
|
package/src/utils/cpm.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {auctionManager} from '../auctionManager.js';
|
|
2
|
+
import {bidderSettings} from '../bidderSettings.js';
|
|
3
|
+
import {logError} from '../utils.js';
|
|
4
|
+
|
|
5
|
+
export function adjustCpm(cpm, bidResponse, bidRequest, {index = auctionManager.index, bs = bidderSettings} = {}) {
|
|
6
|
+
bidRequest = bidRequest || index.getBidRequest(bidResponse);
|
|
7
|
+
const bidCpmAdjustment = bs.get(bidResponse?.bidderCode || bidRequest?.bidder, 'bidCpmAdjustment');
|
|
8
|
+
|
|
9
|
+
if (bidCpmAdjustment && typeof bidCpmAdjustment === 'function') {
|
|
10
|
+
try {
|
|
11
|
+
return bidCpmAdjustment(cpm, Object.assign({}, bidResponse), bidRequest);
|
|
12
|
+
} catch (e) {
|
|
13
|
+
logError('Error during bid adjustment', e);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return cpm;
|
|
17
|
+
}
|