prebid.js 7.11.0 → 7.12.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/.github/workflows/issue_tracker.yml +1 -1
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adriverBidAdapter.js +1 -1
- package/dist/adriverIdSystem.js +1 -1
- package/dist/adtelligentBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/alkimiBidAdapter.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/asoBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/betweenBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/bidwatchAnalyticsAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.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/dfpAdServerVideo.js +1 -1
- package/dist/dgkeywordRtdProvider.js +1 -1
- package/dist/displayioBidAdapter.js +1 -3
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.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/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/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediagoBidAdapter.js +1 -0
- 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/not-for-prod/prebid.js +120 -121
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/rasBidAdapter.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/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/tappxBidAdapter.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/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/userId.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/modules/adkernelBidAdapter.js +28 -12
- package/modules/adriverBidAdapter.js +5 -12
- package/modules/adriverIdSystem.js +2 -1
- package/modules/adtelligentBidAdapter.js +2 -0
- package/modules/alkimiBidAdapter.js +2 -1
- package/modules/betweenBidAdapter.js +3 -3
- package/modules/bidwatchAnalyticsAdapter.js +112 -59
- package/modules/consumableBidAdapter.js +2 -2
- package/modules/criteoBidAdapter.js +19 -13
- package/modules/dgkeywordRtdProvider.js +9 -0
- package/modules/displayioBidAdapter.js +92 -97
- package/modules/id5IdSystem.js +160 -111
- package/modules/id5IdSystem.md +16 -14
- package/modules/improvedigitalBidAdapter.js +50 -28
- package/modules/ixBidAdapter.js +13 -306
- package/modules/mediagoBidAdapter.js +462 -0
- package/modules/mediagoBidAdapter.md +34 -0
- package/modules/nextMillenniumBidAdapter.js +25 -6
- package/modules/pubmaticAnalyticsAdapter.js +1 -1
- package/modules/rasBidAdapter.js +8 -0
- package/modules/rasBidAdapter.md +14 -13
- package/modules/sonobiBidAdapter.js +1 -0
- package/modules/tappxBidAdapter.js +9 -0
- package/package.json +1 -1
- package/src/adloader.js +2 -1
- package/src/adserver.js +0 -56
- package/src/auction.js +58 -15
- package/src/native.js +1 -0
- package/src/refererDetection.js +12 -1
- package/src/videoCache.js +8 -2
- package/test/spec/modules/adkernelBidAdapter_spec.js +11 -2
- package/test/spec/modules/adriverBidAdapter_spec.js +6 -13
- package/test/spec/modules/adriverIdSystem_spec.js +3 -8
- package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
- package/test/spec/modules/alkimiBidAdapter_spec.js +2 -1
- package/test/spec/modules/betweenBidAdapter_spec.js +17 -0
- package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +28 -12
- package/test/spec/modules/criteoBidAdapter_spec.js +35 -26
- package/test/spec/modules/dgkeywordRtdProvider_spec.js +1 -1
- package/test/spec/modules/displayioBidAdapter_spec.js +16 -52
- package/test/spec/modules/enrichmentFpdModule_spec.js +2 -1
- package/test/spec/modules/fpdModule_spec.js +2 -1
- package/test/spec/modules/id5IdSystem_spec.js +529 -172
- package/test/spec/modules/improvedigitalBidAdapter_spec.js +9 -13
- package/test/spec/modules/ixBidAdapter_spec.js +210 -104
- package/test/spec/modules/mediagoBidAdapter_spec.js +97 -0
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +2 -7
- package/test/spec/modules/rasBidAdapter_spec.js +2 -0
- package/test/spec/native_spec.js +144 -0
- package/test/spec/videoCache_spec.js +37 -7
|
@@ -12,6 +12,7 @@ const {
|
|
|
12
12
|
BID_WON,
|
|
13
13
|
BID_RESPONSE,
|
|
14
14
|
BID_REQUESTED,
|
|
15
|
+
BID_TIMEOUT,
|
|
15
16
|
}
|
|
16
17
|
} = CONSTANTS;
|
|
17
18
|
|
|
@@ -20,80 +21,125 @@ let allEvents = {}
|
|
|
20
21
|
let auctionEnd = {}
|
|
21
22
|
let initOptions = {}
|
|
22
23
|
let endpoint = 'https://default'
|
|
23
|
-
let
|
|
24
|
+
let requestsAttributes = ['adUnitCode', 'auctionId', 'bidder', 'bidderCode', 'bidId', 'cpm', 'creativeId', 'currency', 'width', 'height', 'mediaType', 'netRevenue', 'originalCpm', 'originalCurrency', 'requestId', 'size', 'source', 'status', 'timeToRespond', 'transactionId', 'ttl', 'sizes', 'mediaTypes', 'src', 'params', 'userId', 'labelAny', 'bids'];
|
|
24
25
|
|
|
25
26
|
function getAdapterNameForAlias(aliasName) {
|
|
26
27
|
return adapterManager.aliasRegistry[aliasName] || aliasName;
|
|
27
28
|
}
|
|
28
29
|
|
|
29
|
-
function
|
|
30
|
-
|
|
31
|
-
if (typeof arg
|
|
32
|
-
arg['
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
30
|
+
function filterAttributes(arg, removead) {
|
|
31
|
+
let response = {};
|
|
32
|
+
if (typeof arg == 'object') {
|
|
33
|
+
if (typeof arg['bidderCode'] == 'string') {
|
|
34
|
+
response['originalBidder'] = getAdapterNameForAlias(arg['bidderCode']);
|
|
35
|
+
} else if (typeof arg['bidder'] == 'string') {
|
|
36
|
+
response['originalBidder'] = getAdapterNameForAlias(arg['bidder']);
|
|
37
|
+
}
|
|
38
|
+
if (!removead && typeof arg['ad'] != 'undefined') {
|
|
39
|
+
response['ad'] = arg['ad'];
|
|
40
|
+
}
|
|
41
|
+
if (typeof arg['gdprConsent'] != 'undefined') {
|
|
42
|
+
response['gdprConsent'] = {};
|
|
43
|
+
if (typeof arg['gdprConsent']['consentString'] != 'undefined') { response['gdprConsent']['consentString'] = arg['gdprConsent']['consentString']; }
|
|
44
|
+
}
|
|
45
|
+
requestsAttributes.forEach((attr) => {
|
|
46
|
+
if (typeof arg[attr] != 'undefined') { response[attr] = arg[attr]; }
|
|
47
|
+
});
|
|
48
|
+
if (typeof response['creativeId'] == 'number') { response['creativeId'] = response['creativeId'].toString(); }
|
|
39
49
|
}
|
|
40
|
-
return
|
|
50
|
+
return response;
|
|
41
51
|
}
|
|
42
52
|
|
|
43
|
-
function
|
|
44
|
-
|
|
45
|
-
|
|
53
|
+
function cleanAuctionEnd(args) {
|
|
54
|
+
let response = {};
|
|
55
|
+
let filteredObj;
|
|
56
|
+
let objects = ['bidderRequests', 'bidsReceived', 'noBids'];
|
|
57
|
+
objects.forEach((attr) => {
|
|
58
|
+
if (Array.isArray(args[attr])) {
|
|
59
|
+
response[attr] = [];
|
|
60
|
+
args[attr].forEach((obj) => {
|
|
61
|
+
filteredObj = filterAttributes(obj, true);
|
|
62
|
+
if (typeof obj['bids'] == 'object') {
|
|
63
|
+
filteredObj['bids'] = [];
|
|
64
|
+
obj['bids'].forEach((bid) => {
|
|
65
|
+
filteredObj['bids'].push(filterAttributes(bid, true));
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
response[attr].push(filteredObj);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
46
71
|
});
|
|
47
|
-
return
|
|
72
|
+
return response;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function cleanCreatives(args) {
|
|
76
|
+
return filterAttributes(args, false);
|
|
48
77
|
}
|
|
49
78
|
|
|
50
|
-
function
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
79
|
+
function enhanceMediaType(arg) {
|
|
80
|
+
saveEvents['bidRequested'].forEach((bidRequested) => {
|
|
81
|
+
if (bidRequested['auctionId'] == arg['auctionId'] && Array.isArray(bidRequested['bids'])) {
|
|
82
|
+
bidRequested['bids'].forEach((bid) => {
|
|
83
|
+
if (bid['transactionId'] == arg['transactionId'] && bid['bidId'] == arg['requestId']) { arg['mediaTypes'] = bid['mediaTypes']; }
|
|
84
|
+
});
|
|
54
85
|
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
86
|
+
});
|
|
87
|
+
return arg;
|
|
88
|
+
}
|
|
58
89
|
|
|
59
|
-
|
|
90
|
+
function addBidResponse(args) {
|
|
91
|
+
let eventType = BID_RESPONSE;
|
|
92
|
+
let argsCleaned = cleanCreatives(JSON.parse(JSON.stringify(args))); ;
|
|
93
|
+
if (allEvents[eventType] == undefined) { allEvents[eventType] = [] }
|
|
94
|
+
allEvents[eventType].push(argsCleaned);
|
|
60
95
|
}
|
|
61
96
|
|
|
62
|
-
function
|
|
63
|
-
let
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
97
|
+
function addBidRequested(args) {
|
|
98
|
+
let eventType = BID_REQUESTED;
|
|
99
|
+
let argsCleaned = filterAttributes(args, true);
|
|
100
|
+
if (saveEvents[eventType] == undefined) { saveEvents[eventType] = [] }
|
|
101
|
+
saveEvents[eventType].push(argsCleaned);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function addTimeout(args) {
|
|
105
|
+
let eventType = BID_TIMEOUT;
|
|
106
|
+
if (saveEvents[eventType] == undefined) { saveEvents[eventType] = [] }
|
|
107
|
+
saveEvents[eventType].push(args);
|
|
108
|
+
let argsCleaned = [];
|
|
109
|
+
let argsDereferenced = JSON.parse(JSON.stringify(args));
|
|
110
|
+
argsDereferenced.forEach((attr) => {
|
|
111
|
+
argsCleaned.push(filterAttributes(JSON.parse(JSON.stringify(attr)), false));
|
|
112
|
+
});
|
|
113
|
+
if (auctionEnd[eventType] == undefined) { auctionEnd[eventType] = [] }
|
|
114
|
+
auctionEnd[eventType].push(argsCleaned);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function addAuctionEnd(args) {
|
|
118
|
+
let eventType = AUCTION_END;
|
|
119
|
+
if (saveEvents[eventType] == undefined) { saveEvents[eventType] = [] }
|
|
120
|
+
saveEvents[eventType].push(args);
|
|
121
|
+
let argsCleaned = cleanAuctionEnd(JSON.parse(JSON.stringify(args)));
|
|
122
|
+
if (auctionEnd[eventType] == undefined) { auctionEnd[eventType] = [] }
|
|
123
|
+
auctionEnd[eventType].push(argsCleaned);
|
|
76
124
|
}
|
|
77
125
|
|
|
78
126
|
function handleBidWon(args) {
|
|
79
|
-
args =
|
|
127
|
+
args = enhanceMediaType(filterAttributes(JSON.parse(JSON.stringify(args)), true));
|
|
80
128
|
let increment = args['cpm'];
|
|
81
129
|
if (typeof saveEvents['auctionEnd'] == 'object') {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (tmpBid['transactionId'] == args['transactionId'] && tmpBid['adId'] != args['adId']) {
|
|
88
|
-
if (args['cpm'] < tmpBid['cpm']) {
|
|
130
|
+
saveEvents['auctionEnd'].forEach((auction) => {
|
|
131
|
+
if (auction['auctionId'] == args['auctionId'] && typeof auction['bidsReceived'] == 'object') {
|
|
132
|
+
auction['bidsReceived'].forEach((bid) => {
|
|
133
|
+
if (bid['transactionId'] == args['transactionId'] && bid['adId'] != args['adId']) {
|
|
134
|
+
if (args['cpm'] < bid['cpm']) {
|
|
89
135
|
increment = 0;
|
|
90
|
-
} else if (increment > args['cpm'] -
|
|
91
|
-
increment = args['cpm'] -
|
|
136
|
+
} else if (increment > args['cpm'] - bid['cpm']) {
|
|
137
|
+
increment = args['cpm'] - bid['cpm'];
|
|
92
138
|
}
|
|
93
139
|
}
|
|
94
|
-
}
|
|
140
|
+
});
|
|
95
141
|
}
|
|
96
|
-
}
|
|
142
|
+
});
|
|
97
143
|
}
|
|
98
144
|
args['cpmIncrement'] = increment;
|
|
99
145
|
if (typeof saveEvents.bidRequested == 'object' && saveEvents.bidRequested.length > 0 && saveEvents.bidRequested[0].gdprConsent) { args.gdpr = saveEvents.bidRequested[0].gdprConsent; }
|
|
@@ -101,12 +147,16 @@ function handleBidWon(args) {
|
|
|
101
147
|
}
|
|
102
148
|
|
|
103
149
|
function handleAuctionEnd() {
|
|
104
|
-
ajax(endpoint + '.bidwatch.io/analytics/auctions',
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
150
|
+
ajax(endpoint + '.bidwatch.io/analytics/auctions', function (data) {
|
|
151
|
+
let list = JSON.parse(data);
|
|
152
|
+
if (Array.isArray(list) && typeof allEvents['bidResponse'] != 'undefined') {
|
|
153
|
+
allEvents['bidResponse'].forEach((bidResponse) => {
|
|
154
|
+
if (list.includes(bidResponse['originalBidder'] + '_' + bidResponse['creativeId'])) { ajax(endpoint + '.bidwatch.io/analytics/creatives', null, JSON.stringify(bidResponse), {method: 'POST', withCredentials: true}); }
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
allEvents = {};
|
|
158
|
+
}, JSON.stringify(auctionEnd), {method: 'POST', withCredentials: true});
|
|
159
|
+
auctionEnd = {};
|
|
110
160
|
}
|
|
111
161
|
|
|
112
162
|
let bidwatchAnalytics = Object.assign(adapter({url, analyticsType}), {
|
|
@@ -116,17 +166,20 @@ let bidwatchAnalytics = Object.assign(adapter({url, analyticsType}), {
|
|
|
116
166
|
}) {
|
|
117
167
|
switch (eventType) {
|
|
118
168
|
case AUCTION_END:
|
|
119
|
-
|
|
169
|
+
addAuctionEnd(args);
|
|
120
170
|
handleAuctionEnd();
|
|
121
171
|
break;
|
|
122
172
|
case BID_WON:
|
|
123
173
|
handleBidWon(args);
|
|
124
174
|
break;
|
|
125
175
|
case BID_RESPONSE:
|
|
126
|
-
|
|
176
|
+
addBidResponse(args);
|
|
127
177
|
break;
|
|
128
178
|
case BID_REQUESTED:
|
|
129
|
-
|
|
179
|
+
addBidRequested(args);
|
|
180
|
+
break;
|
|
181
|
+
case BID_TIMEOUT:
|
|
182
|
+
addTimeout(args);
|
|
130
183
|
break;
|
|
131
184
|
}
|
|
132
185
|
}});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { logWarn,
|
|
1
|
+
import { logWarn, deepAccess, isArray, deepSetValue } from '../src/utils.js';
|
|
2
2
|
import {config} from '../src/config.js';
|
|
3
3
|
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
4
4
|
import { BANNER, VIDEO } from '../src/mediaTypes.js';
|
|
@@ -255,7 +255,7 @@ function getSize(sizes) {
|
|
|
255
255
|
function retrieveAd(decision, unitId, unitName) {
|
|
256
256
|
let ad;
|
|
257
257
|
if (decision.contents && decision.contents[0]) {
|
|
258
|
-
ad = decision.contents[0].body
|
|
258
|
+
ad = decision.contents[0].body;
|
|
259
259
|
}
|
|
260
260
|
if (decision.vastXml) {
|
|
261
261
|
ad = decision.vastXml;
|
|
@@ -469,15 +469,20 @@ function buildCdbRequest(context, bidRequests, bidderRequest) {
|
|
|
469
469
|
if (bidRequest.params.publisherSubId) {
|
|
470
470
|
slot.publishersubid = bidRequest.params.publisherSubId;
|
|
471
471
|
}
|
|
472
|
-
|
|
472
|
+
|
|
473
|
+
if (bidRequest.params.nativeCallback || hasNativeMediaType(bidRequest)) {
|
|
473
474
|
slot.native = true;
|
|
474
475
|
if (!checkNativeSendId(bidRequest)) {
|
|
475
476
|
logWarn(LOG_PREFIX + 'all native assets containing URL should be sent as placeholders with sendId(icon, image, clickUrl, displayUrl, privacyLink, privacyIcon)');
|
|
476
477
|
}
|
|
477
|
-
|
|
478
|
-
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
if (hasBannerMediaType(bidRequest)) {
|
|
479
481
|
slot.sizes = parseSizes(deepAccess(bidRequest, 'mediaTypes.banner.sizes'), parseSize);
|
|
482
|
+
} else {
|
|
483
|
+
slot.sizes = [];
|
|
480
484
|
}
|
|
485
|
+
|
|
481
486
|
if (hasVideoMediaType(bidRequest)) {
|
|
482
487
|
const video = {
|
|
483
488
|
playersizes: parseSizes(deepAccess(bidRequest, 'mediaTypes.video.playerSize'), parseSize),
|
|
@@ -554,17 +559,18 @@ function parseSize(size) {
|
|
|
554
559
|
return size[0] + 'x' + size[1];
|
|
555
560
|
}
|
|
556
561
|
|
|
557
|
-
function parseNativeSize(size) {
|
|
558
|
-
if (size[0] === undefined && size[1] === undefined) {
|
|
559
|
-
return '2x2';
|
|
560
|
-
}
|
|
561
|
-
return size[0] + 'x' + size[1];
|
|
562
|
-
}
|
|
563
|
-
|
|
564
562
|
function hasVideoMediaType(bidRequest) {
|
|
565
563
|
return deepAccess(bidRequest, 'mediaTypes.video') !== undefined;
|
|
566
564
|
}
|
|
567
565
|
|
|
566
|
+
function hasBannerMediaType(bidRequest) {
|
|
567
|
+
return deepAccess(bidRequest, 'mediaTypes.banner') !== undefined;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
function hasNativeMediaType(bidRequest) {
|
|
571
|
+
return deepAccess(bidRequest, 'mediaTypes.native') !== undefined;
|
|
572
|
+
}
|
|
573
|
+
|
|
568
574
|
function hasValidVideoMediaType(bidRequest) {
|
|
569
575
|
let isValid = true;
|
|
570
576
|
|
|
@@ -646,18 +652,18 @@ function enrichSlotWithFloors(slot, bidRequest) {
|
|
|
646
652
|
if (bidRequest.mediaTypes?.banner) {
|
|
647
653
|
slotFloors.banner = {};
|
|
648
654
|
const bannerSizes = parseSizes(deepAccess(bidRequest, 'mediaTypes.banner.sizes'))
|
|
649
|
-
bannerSizes.forEach(bannerSize => slotFloors.banner[parseSize(bannerSize).toString()] = bidRequest.getFloor({size: bannerSize, mediaType: BANNER}));
|
|
655
|
+
bannerSizes.forEach(bannerSize => slotFloors.banner[parseSize(bannerSize).toString()] = bidRequest.getFloor({ size: bannerSize, mediaType: BANNER }));
|
|
650
656
|
}
|
|
651
657
|
|
|
652
658
|
if (bidRequest.mediaTypes?.video) {
|
|
653
659
|
slotFloors.video = {};
|
|
654
660
|
const videoSizes = parseSizes(deepAccess(bidRequest, 'mediaTypes.video.playerSize'))
|
|
655
|
-
videoSizes.forEach(videoSize => slotFloors.video[parseSize(videoSize).toString()] = bidRequest.getFloor({size: videoSize, mediaType: VIDEO}));
|
|
661
|
+
videoSizes.forEach(videoSize => slotFloors.video[parseSize(videoSize).toString()] = bidRequest.getFloor({ size: videoSize, mediaType: VIDEO }));
|
|
656
662
|
}
|
|
657
663
|
|
|
658
664
|
if (bidRequest.mediaTypes?.native) {
|
|
659
665
|
slotFloors.native = {};
|
|
660
|
-
slotFloors.native['*'] = bidRequest.getFloor({size: '*', mediaType: NATIVE});
|
|
666
|
+
slotFloors.native['*'] = bidRequest.getFloor({ size: '*', mediaType: NATIVE });
|
|
661
667
|
}
|
|
662
668
|
|
|
663
669
|
if (Object.keys(slotFloors).length > 0) {
|
|
@@ -25,6 +25,15 @@ export function getDgKeywordsAndSet(reqBidsConfigObj, callback, moduleConfig, us
|
|
|
25
25
|
const timeout = (moduleConfig && moduleConfig.params && moduleConfig.params.timeout && Number(moduleConfig.params.timeout) > 0) ? Number(moduleConfig.params.timeout) : PROFILE_TIMEOUT_MS;
|
|
26
26
|
const url = (moduleConfig && moduleConfig.params && moduleConfig.params.url) ? moduleConfig.params.url : URL + encodeURIComponent(window.location.href);
|
|
27
27
|
const adUnits = reqBidsConfigObj.adUnits || getGlobal().adUnits;
|
|
28
|
+
callback = (function(cb) {
|
|
29
|
+
let done = false;
|
|
30
|
+
return function () {
|
|
31
|
+
if (!done) {
|
|
32
|
+
done = true;
|
|
33
|
+
return cb.apply(this, arguments);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
})(callback);
|
|
28
37
|
let isFinish = false;
|
|
29
38
|
logMessage('[dgkeyword sub module]', adUnits, timeout);
|
|
30
39
|
let setKeywordTargetBidders = getTargetBidderOfDgKeywords(adUnits);
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
2
2
|
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
3
|
+
import {Renderer} from '../src/Renderer.js';
|
|
4
|
+
import {getWindowFromDocument, logWarn} from '../src/utils.js';
|
|
3
5
|
|
|
4
|
-
const
|
|
6
|
+
const ADAPTER_VERSION = '1.1.0';
|
|
5
7
|
const BIDDER_CODE = 'displayio';
|
|
6
|
-
const GVLID = 999;
|
|
7
8
|
const BID_TTL = 300;
|
|
8
9
|
const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
|
|
9
10
|
const DEFAULT_CURRENCY = 'USD';
|
|
10
11
|
|
|
11
12
|
export const spec = {
|
|
12
13
|
code: BIDDER_CODE,
|
|
13
|
-
gvlid: GVLID,
|
|
14
14
|
supportedMediaTypes: SUPPORTED_AD_TYPES,
|
|
15
15
|
isBidRequestValid: function(bid) {
|
|
16
16
|
return !!(bid.params && bid.params.placementId && bid.params.siteId &&
|
|
@@ -20,7 +20,7 @@ export const spec = {
|
|
|
20
20
|
return bidRequests.map(bid => {
|
|
21
21
|
let url = '//' + bid.params.adsSrvDomain + '/srv?method=getPlacement&app=' +
|
|
22
22
|
bid.params.siteId + '&placement=' + bid.params.placementId;
|
|
23
|
-
const data =
|
|
23
|
+
const data = getPayload(bid, bidderRequest);
|
|
24
24
|
return {
|
|
25
25
|
method: 'POST',
|
|
26
26
|
headers: {'Content-Type': 'application/json;charset=utf-8'},
|
|
@@ -42,117 +42,112 @@ export const spec = {
|
|
|
42
42
|
height: adData.h,
|
|
43
43
|
netRevenue: true,
|
|
44
44
|
ttl: BID_TTL,
|
|
45
|
-
creativeId: adData.adId ||
|
|
46
|
-
currency: DEFAULT_CURRENCY,
|
|
45
|
+
creativeId: adData.adId || 1,
|
|
46
|
+
currency: adData.cur || DEFAULT_CURRENCY,
|
|
47
47
|
referrer: data.data.ref,
|
|
48
|
-
mediaType: ads[0].ad.subtype,
|
|
48
|
+
mediaType: ads[0].ad.subtype === 'videoVast' ? VIDEO : BANNER,
|
|
49
49
|
ad: adData.markup,
|
|
50
|
-
|
|
50
|
+
adUnitCode: data.adUnitCode,
|
|
51
|
+
renderURL: data.renderURL,
|
|
51
52
|
adData: adData
|
|
52
53
|
};
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
|
|
55
|
+
if (bidResponse.mediaType === VIDEO) {
|
|
56
|
+
bidResponse.vastUrl = adData.videos[0] && adData.videos[0].url
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (bidResponse.renderURL) {
|
|
60
|
+
bidResponse.renderer = newRenderer(bidResponse);
|
|
55
61
|
}
|
|
56
62
|
bidResponses.push(bidResponse);
|
|
57
63
|
}
|
|
58
64
|
return bidResponses;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
mediation.gdpr = gdprConsent.gdprApplies ? '1' : '0';
|
|
77
|
-
}
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
function getPayload (bid, bidderRequest) {
|
|
69
|
+
const connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
|
|
70
|
+
const userSession = 'us_web_xxxxxxxxxxxx'.replace(/[x]/g, c => {
|
|
71
|
+
let r = Math.random() * 16 | 0;
|
|
72
|
+
let v = c === 'x' ? r : (r & 0x3 | 0x8);
|
|
73
|
+
return v.toString(16);
|
|
74
|
+
});
|
|
75
|
+
const { params, adUnitCode, bidId } = bid;
|
|
76
|
+
const { siteId, placementId, renderURL, pageCategory, keywords } = params;
|
|
77
|
+
const { refererInfo, uspConsent, gdprConsent } = bidderRequest;
|
|
78
|
+
const mediation = {consent: '-1', gdpr: '-1'};
|
|
79
|
+
if (gdprConsent && 'gdprApplies' in gdprConsent) {
|
|
80
|
+
if (gdprConsent.consentString !== undefined) {
|
|
81
|
+
mediation.consent = gdprConsent.consentString;
|
|
78
82
|
}
|
|
79
|
-
|
|
80
|
-
|
|
83
|
+
if (gdprConsent.gdprApplies !== undefined) {
|
|
84
|
+
mediation.gdpr = gdprConsent.gdprApplies ? '1' : '0';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
userSession,
|
|
89
|
+
data: {
|
|
90
|
+
id: bidId,
|
|
91
|
+
action: 'getPlacement',
|
|
92
|
+
app: siteId,
|
|
93
|
+
placement: placementId,
|
|
94
|
+
adUnitCode,
|
|
95
|
+
renderURL,
|
|
81
96
|
data: {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
us_privacy: uspConsent,
|
|
101
|
-
dnt: window.navigator.doNotTrack,
|
|
102
|
-
iabConsent: {},
|
|
103
|
-
mediation: {
|
|
104
|
-
consent: mediation.consent,
|
|
105
|
-
gdpr: mediation.gdpr,
|
|
106
|
-
}
|
|
107
|
-
},
|
|
108
|
-
integration: 'JS',
|
|
109
|
-
omidpn: 'Displayio',
|
|
110
|
-
mediationPlatform: 0,
|
|
111
|
-
prebidVersion: BIDDER_VERSION,
|
|
112
|
-
device: {
|
|
113
|
-
w: window.screen.width,
|
|
114
|
-
h: window.screen.height,
|
|
115
|
-
connection_type: connection ? connection.effectiveType : '',
|
|
97
|
+
pagecat: pageCategory ? pageCategory.split(',').map(k => k.trim()) : [],
|
|
98
|
+
keywords: keywords ? keywords.split(',').map(k => k.trim()) : [],
|
|
99
|
+
lang_content: document.documentElement.lang,
|
|
100
|
+
lang: window.navigator.language,
|
|
101
|
+
domain: refererInfo.domain,
|
|
102
|
+
page: refererInfo.page,
|
|
103
|
+
ref: refererInfo.referer,
|
|
104
|
+
userids: bid.userIdAsEids || {},
|
|
105
|
+
geo: '',
|
|
106
|
+
},
|
|
107
|
+
complianceData: {
|
|
108
|
+
child: '-1',
|
|
109
|
+
us_privacy: uspConsent,
|
|
110
|
+
dnt: window.doNotTrack === '1' || window.navigator.doNotTrack === '1' || false,
|
|
111
|
+
iabConsent: {},
|
|
112
|
+
mediation: {
|
|
113
|
+
consent: mediation.consent,
|
|
114
|
+
gdpr: mediation.gdpr,
|
|
116
115
|
}
|
|
116
|
+
},
|
|
117
|
+
integration: 'JS',
|
|
118
|
+
omidpn: 'Displayio',
|
|
119
|
+
mediationPlatform: 0,
|
|
120
|
+
prebidVersion: ADAPTER_VERSION,
|
|
121
|
+
device: {
|
|
122
|
+
w: window.screen.width,
|
|
123
|
+
h: window.screen.height,
|
|
124
|
+
connection_type: connection ? connection.effectiveType : '',
|
|
117
125
|
}
|
|
118
126
|
}
|
|
119
|
-
if (navigator.permissions) {
|
|
120
|
-
navigator.permissions.query({ name: 'geolocation' })
|
|
121
|
-
.then((result) => {
|
|
122
|
-
if (result.state === 'granted') {
|
|
123
|
-
payload.data.data.geo = _getGeoData();
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
return payload
|
|
128
127
|
}
|
|
129
|
-
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function newRenderer(bid) {
|
|
131
|
+
const renderer = Renderer.install({
|
|
132
|
+
id: bid.requestId,
|
|
133
|
+
url: bid.renderURL,
|
|
134
|
+
adUnitCode: bid.adUnitCode
|
|
135
|
+
});
|
|
130
136
|
|
|
131
|
-
function _getUserIDs () {
|
|
132
|
-
let ids = {};
|
|
133
137
|
try {
|
|
134
|
-
|
|
135
|
-
} catch (
|
|
136
|
-
|
|
138
|
+
renderer.setRender(webisRender);
|
|
139
|
+
} catch (err) {
|
|
140
|
+
logWarn('Prebid Error calling setRender on renderer', err);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return renderer;
|
|
137
144
|
}
|
|
138
145
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
try {
|
|
147
|
-
const position = await getCurrentPosition();
|
|
148
|
-
let {latitude, longitude, accuracy} = position.coords;
|
|
149
|
-
geoData = {
|
|
150
|
-
'lat': latitude,
|
|
151
|
-
'lng': longitude,
|
|
152
|
-
'precision': accuracy
|
|
153
|
-
};
|
|
154
|
-
} catch (e) {}
|
|
155
|
-
return geoData
|
|
146
|
+
function webisRender(bid, doc) {
|
|
147
|
+
bid.renderer.push(() => {
|
|
148
|
+
const win = getWindowFromDocument(doc) || window;
|
|
149
|
+
win.webis.init(bid.adData, bid.adUnitCode, bid.params);
|
|
150
|
+
})
|
|
156
151
|
}
|
|
157
152
|
|
|
158
153
|
registerBidder(spec);
|