prebid.js 7.31.0 → 7.32.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/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/adlooxRtdProvider.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/aidemBidAdapter.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/aolBidAdapter.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/appushBidAdapter.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/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/connectIdSystem.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/dspxBidAdapter.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/holidBidAdapter.js +1 -0
- 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/jwplayerVideoProvider.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/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/medianetRtdProvider.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +126 -123
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/orbitsoftBidAdapter.js +1 -0
- 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/publinkIdSystem.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/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/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/yieldlabBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/integrationExamples/gpt/adloox.html +5 -0
- package/modules/adagioBidAdapter.js +0 -4
- package/modules/adagioBidAdapter.md +4 -22
- package/modules/adlooxAnalyticsAdapter.md +5 -3
- package/modules/adlooxRtdProvider.js +82 -278
- package/modules/adlooxRtdProvider.md +6 -6
- package/modules/aidemBidAdapter.js +4 -0
- package/modules/aidemBidAdapter.md +1 -0
- package/modules/alkimiBidAdapter.js +23 -6
- package/modules/aolBidAdapter.js +12 -0
- package/modules/appnexusBidAdapter.js +2 -2
- package/modules/appushBidAdapter.js +188 -0
- package/modules/appushBidAdapter.md +79 -0
- package/modules/asoBidAdapter.js +8 -5
- package/modules/confiantRtdProvider.js +1 -1
- package/modules/connectIdSystem.js +15 -1
- package/modules/feedadBidAdapter.js +7 -5
- package/modules/holidBidAdapter.js +170 -0
- package/modules/holidBidAdapter.md +36 -0
- package/modules/jwplayerVideoProvider.js +10 -3
- package/modules/kueezRtbBidAdapter.js +21 -8
- package/modules/medianetRtdProvider.js +4 -4
- package/modules/nexx360BidAdapter.js +5 -7
- package/modules/orbitsoftBidAdapter.js +150 -0
- package/modules/permutiveRtdProvider.js +1 -1
- package/modules/riseBidAdapter.js +2 -1
- package/modules/riseBidAdapter.md +2 -0
- package/modules/seedtagBidAdapter.js +12 -0
- package/modules/smartxBidAdapter.js +6 -0
- package/modules/taboolaBidAdapter.js +61 -14
- package/modules/yahoosspBidAdapter.js +5 -0
- package/modules/yieldlabBidAdapter.js +150 -134
- package/modules/yieldmoBidAdapter.js +1 -12
- package/package.json +1 -1
- package/test/spec/modules/adagioBidAdapter_spec.js +1 -28
- package/test/spec/modules/adlooxRtdProvider_spec.js +28 -120
- package/test/spec/modules/aidemBidAdapter_spec.js +10 -2
- package/test/spec/modules/alkimiBidAdapter_spec.js +15 -3
- package/test/spec/modules/aolBidAdapter_spec.js +22 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +7 -3
- package/test/spec/modules/appushBidAdapter_spec.js +372 -0
- package/test/spec/modules/connectIdSystem_spec.js +17 -5
- package/test/spec/modules/feedadBidAdapter_spec.js +23 -1
- package/test/spec/modules/holidBidAdapter_spec.js +165 -0
- package/test/spec/modules/kueezRtbBidAdapter_spec.js +147 -24
- package/test/spec/modules/medianetRtdProvider_spec.js +3 -3
- package/test/spec/modules/orbitsoftBidAdapter_spec.js +255 -0
- package/test/spec/modules/riseBidAdapter_spec.js +7 -0
- package/test/spec/modules/seedtagBidAdapter_spec.js +56 -10
- package/test/spec/modules/smartxBidAdapter_spec.js +10 -0
- package/test/spec/modules/taboolaBidAdapter_spec.js +142 -5
- package/test/spec/modules/videoModule/submodules/jwplayerVideoProvider_spec.js +45 -10
- package/test/spec/modules/yahoosspBidAdapter_spec.js +16 -1
- package/test/spec/modules/yieldlabBidAdapter_spec.js +311 -301
- package/test/spec/modules/yieldmoBidAdapter_spec.js +70 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { isFn, deepAccess, logMessage, logError } from '../src/utils.js';
|
|
2
|
+
import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
|
|
3
|
+
|
|
4
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
5
|
+
import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
|
|
6
|
+
import { config } from '../src/config.js';
|
|
7
|
+
|
|
8
|
+
const BIDDER_CODE = 'appush';
|
|
9
|
+
const AD_URL = 'https://hb.appush.com/pbjs';
|
|
10
|
+
|
|
11
|
+
function isBidResponseValid(bid) {
|
|
12
|
+
if (!bid.requestId || !bid.cpm || !bid.creativeId || !bid.ttl || !bid.currency) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
switch (bid.mediaType) {
|
|
17
|
+
case BANNER:
|
|
18
|
+
return Boolean(bid.width && bid.height && bid.ad);
|
|
19
|
+
case VIDEO:
|
|
20
|
+
return Boolean(bid.vastUrl || bid.vastXml);
|
|
21
|
+
case NATIVE:
|
|
22
|
+
return Boolean(bid.native && bid.native.impressionTrackers && bid.native.impressionTrackers.length);
|
|
23
|
+
default:
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function getPlacementReqData(bid) {
|
|
29
|
+
const { params, bidId, mediaTypes } = bid;
|
|
30
|
+
const schain = bid.schain || {};
|
|
31
|
+
const { placementId, endpointId } = params;
|
|
32
|
+
const bidfloor = getBidFloor(bid);
|
|
33
|
+
|
|
34
|
+
const placement = {
|
|
35
|
+
bidId,
|
|
36
|
+
schain,
|
|
37
|
+
bidfloor
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
if (placementId) {
|
|
41
|
+
placement.placementId = placementId;
|
|
42
|
+
placement.type = 'publisher';
|
|
43
|
+
} else if (endpointId) {
|
|
44
|
+
placement.endpointId = endpointId;
|
|
45
|
+
placement.type = 'network';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (mediaTypes && mediaTypes[BANNER]) {
|
|
49
|
+
placement.adFormat = BANNER;
|
|
50
|
+
placement.sizes = mediaTypes[BANNER].sizes;
|
|
51
|
+
} else if (mediaTypes && mediaTypes[VIDEO]) {
|
|
52
|
+
placement.adFormat = VIDEO;
|
|
53
|
+
placement.playerSize = mediaTypes[VIDEO].playerSize;
|
|
54
|
+
placement.minduration = mediaTypes[VIDEO].minduration;
|
|
55
|
+
placement.maxduration = mediaTypes[VIDEO].maxduration;
|
|
56
|
+
placement.mimes = mediaTypes[VIDEO].mimes;
|
|
57
|
+
placement.protocols = mediaTypes[VIDEO].protocols;
|
|
58
|
+
placement.startdelay = mediaTypes[VIDEO].startdelay;
|
|
59
|
+
placement.placement = mediaTypes[VIDEO].placement;
|
|
60
|
+
placement.skip = mediaTypes[VIDEO].skip;
|
|
61
|
+
placement.skipafter = mediaTypes[VIDEO].skipafter;
|
|
62
|
+
placement.minbitrate = mediaTypes[VIDEO].minbitrate;
|
|
63
|
+
placement.maxbitrate = mediaTypes[VIDEO].maxbitrate;
|
|
64
|
+
placement.delivery = mediaTypes[VIDEO].delivery;
|
|
65
|
+
placement.playbackmethod = mediaTypes[VIDEO].playbackmethod;
|
|
66
|
+
placement.api = mediaTypes[VIDEO].api;
|
|
67
|
+
placement.linearity = mediaTypes[VIDEO].linearity;
|
|
68
|
+
} else if (mediaTypes && mediaTypes[NATIVE]) {
|
|
69
|
+
placement.native = mediaTypes[NATIVE];
|
|
70
|
+
placement.adFormat = NATIVE;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return placement;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function getBidFloor(bid) {
|
|
77
|
+
if (!isFn(bid.getFloor)) {
|
|
78
|
+
return deepAccess(bid, 'params.bidfloor', 0);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
const bidFloor = bid.getFloor({
|
|
83
|
+
currency: 'USD',
|
|
84
|
+
mediaType: '*',
|
|
85
|
+
size: '*',
|
|
86
|
+
});
|
|
87
|
+
return bidFloor.floor;
|
|
88
|
+
} catch (err) {
|
|
89
|
+
logError(err);
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export const spec = {
|
|
95
|
+
code: BIDDER_CODE,
|
|
96
|
+
supportedMediaTypes: [BANNER, VIDEO, NATIVE],
|
|
97
|
+
|
|
98
|
+
isBidRequestValid: (bid = {}) => {
|
|
99
|
+
const { params, bidId, mediaTypes } = bid;
|
|
100
|
+
let valid = Boolean(bidId && params && (params.placementId || params.endpointId));
|
|
101
|
+
|
|
102
|
+
if (mediaTypes && mediaTypes[BANNER]) {
|
|
103
|
+
valid = valid && Boolean(mediaTypes[BANNER] && mediaTypes[BANNER].sizes);
|
|
104
|
+
} else if (mediaTypes && mediaTypes[VIDEO]) {
|
|
105
|
+
valid = valid && Boolean(mediaTypes[VIDEO] && mediaTypes[VIDEO].playerSize);
|
|
106
|
+
} else if (mediaTypes && mediaTypes[NATIVE]) {
|
|
107
|
+
valid = valid && Boolean(mediaTypes[NATIVE]);
|
|
108
|
+
} else {
|
|
109
|
+
valid = false;
|
|
110
|
+
}
|
|
111
|
+
return valid;
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
buildRequests: (validBidRequests = [], bidderRequest = {}) => {
|
|
115
|
+
// convert Native ORTB definition to old-style prebid native definition
|
|
116
|
+
validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
|
|
117
|
+
|
|
118
|
+
let deviceWidth = 0;
|
|
119
|
+
let deviceHeight = 0;
|
|
120
|
+
|
|
121
|
+
let winLocation;
|
|
122
|
+
try {
|
|
123
|
+
const winTop = window.top;
|
|
124
|
+
deviceWidth = winTop.screen.width;
|
|
125
|
+
deviceHeight = winTop.screen.height;
|
|
126
|
+
winLocation = winTop.location;
|
|
127
|
+
} catch (e) {
|
|
128
|
+
logMessage(e);
|
|
129
|
+
winLocation = window.location;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const refferUrl = bidderRequest.refererInfo && bidderRequest.refererInfo.page;
|
|
133
|
+
let refferLocation;
|
|
134
|
+
try {
|
|
135
|
+
refferLocation = refferUrl && new URL(refferUrl);
|
|
136
|
+
} catch (e) {
|
|
137
|
+
logMessage(e);
|
|
138
|
+
}
|
|
139
|
+
// TODO: does the fallback make sense here?
|
|
140
|
+
let location = refferLocation || winLocation;
|
|
141
|
+
const language = (navigator && navigator.language) ? navigator.language.split('-')[0] : '';
|
|
142
|
+
const host = location.host;
|
|
143
|
+
const page = location.pathname;
|
|
144
|
+
const secure = location.protocol === 'https:' ? 1 : 0;
|
|
145
|
+
const placements = [];
|
|
146
|
+
const request = {
|
|
147
|
+
deviceWidth,
|
|
148
|
+
deviceHeight,
|
|
149
|
+
language,
|
|
150
|
+
secure,
|
|
151
|
+
host,
|
|
152
|
+
page,
|
|
153
|
+
placements,
|
|
154
|
+
coppa: config.getConfig('coppa') === true ? 1 : 0,
|
|
155
|
+
ccpa: bidderRequest.uspConsent || undefined,
|
|
156
|
+
gdpr: bidderRequest.gdprConsent || undefined,
|
|
157
|
+
tmax: config.getConfig('bidderTimeout')
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
const len = validBidRequests.length;
|
|
161
|
+
for (let i = 0; i < len; i++) {
|
|
162
|
+
const bid = validBidRequests[i];
|
|
163
|
+
placements.push(getPlacementReqData(bid));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return {
|
|
167
|
+
method: 'POST',
|
|
168
|
+
url: AD_URL,
|
|
169
|
+
data: request
|
|
170
|
+
};
|
|
171
|
+
},
|
|
172
|
+
|
|
173
|
+
interpretResponse: (serverResponse) => {
|
|
174
|
+
let response = [];
|
|
175
|
+
for (let i = 0; i < serverResponse.body.length; i++) {
|
|
176
|
+
let resItem = serverResponse.body[i];
|
|
177
|
+
if (isBidResponseValid(resItem)) {
|
|
178
|
+
const advertiserDomains = resItem.adomain && resItem.adomain.length ? resItem.adomain : [];
|
|
179
|
+
resItem.meta = { ...resItem.meta, advertiserDomains };
|
|
180
|
+
|
|
181
|
+
response.push(resItem);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return response;
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
registerBidder(spec);
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
Module Name: Appush Bidder Adapter
|
|
5
|
+
Module Type: Appush Bidder Adapter
|
|
6
|
+
Maintainer: support@appush.com
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
# Description
|
|
10
|
+
|
|
11
|
+
Connects to Appush exchange for bids.
|
|
12
|
+
Appush bid adapter supports Banner, Video (instream and outstream) and Native.
|
|
13
|
+
|
|
14
|
+
# Test Parameters
|
|
15
|
+
```
|
|
16
|
+
var adUnits = [
|
|
17
|
+
// Will return static test banner
|
|
18
|
+
{
|
|
19
|
+
code: 'adunit1',
|
|
20
|
+
mediaTypes: {
|
|
21
|
+
banner: {
|
|
22
|
+
sizes: [ [300, 250], [320, 50] ],
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
bids: [
|
|
26
|
+
{
|
|
27
|
+
bidder: 'appush',
|
|
28
|
+
params: {
|
|
29
|
+
placementId: 'testBanner',
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
code: 'addunit2',
|
|
36
|
+
mediaTypes: {
|
|
37
|
+
video: {
|
|
38
|
+
playerSize: [ [640, 480] ],
|
|
39
|
+
context: 'instream',
|
|
40
|
+
minduration: 5,
|
|
41
|
+
maxduration: 60,
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
bids: [
|
|
45
|
+
{
|
|
46
|
+
bidder: 'appush',
|
|
47
|
+
params: {
|
|
48
|
+
placementId: 'testVideo',
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
code: 'addunit3',
|
|
55
|
+
mediaTypes: {
|
|
56
|
+
native: {
|
|
57
|
+
title: {
|
|
58
|
+
required: true
|
|
59
|
+
},
|
|
60
|
+
body: {
|
|
61
|
+
required: true
|
|
62
|
+
},
|
|
63
|
+
icon: {
|
|
64
|
+
required: true,
|
|
65
|
+
size: [64, 64]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
bids: [
|
|
70
|
+
{
|
|
71
|
+
bidder: 'appush',
|
|
72
|
+
params: {
|
|
73
|
+
placementId: 'testNative',
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
];
|
|
79
|
+
```
|
package/modules/asoBidAdapter.js
CHANGED
|
@@ -10,11 +10,11 @@ import {
|
|
|
10
10
|
parseSizesInput,
|
|
11
11
|
tryAppendQueryString
|
|
12
12
|
} from '../src/utils.js';
|
|
13
|
-
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
14
|
-
import {config} from '../src/config.js';
|
|
15
|
-
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
16
|
-
import {Renderer} from '../src/Renderer.js';
|
|
17
|
-
import {parseDomain} from '../src/refererDetection.js';
|
|
13
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
14
|
+
import { config } from '../src/config.js';
|
|
15
|
+
import { BANNER, VIDEO } from '../src/mediaTypes.js';
|
|
16
|
+
import { Renderer } from '../src/Renderer.js';
|
|
17
|
+
import { parseDomain } from '../src/refererDetection.js';
|
|
18
18
|
|
|
19
19
|
const BIDDER_CODE = 'aso';
|
|
20
20
|
const DEFAULT_SERVER_URL = 'https://srv.aso1.net';
|
|
@@ -27,6 +27,9 @@ export const spec = {
|
|
|
27
27
|
|
|
28
28
|
code: BIDDER_CODE,
|
|
29
29
|
supportedMediaTypes: [BANNER, VIDEO],
|
|
30
|
+
aliases: [
|
|
31
|
+
{code: 'bcmint'}
|
|
32
|
+
],
|
|
30
33
|
|
|
31
34
|
isBidRequestValid: bid => {
|
|
32
35
|
return !!bid.params && !!bid.params.zone;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* The {@link module:modules/realTimeData} module is required
|
|
6
6
|
* The module will inject a Confiant Inc. script into the page to monitor ad impressions
|
|
7
|
-
* @module modules/
|
|
7
|
+
* @module modules/confiantRtdProvider
|
|
8
8
|
* @requires module:modules/realTimeData
|
|
9
9
|
*/
|
|
10
10
|
|
|
@@ -66,6 +66,11 @@ export const connectIdSubmodule = {
|
|
|
66
66
|
us_privacy: consentData && consentData.uspConsent ? consentData.uspConsent : ''
|
|
67
67
|
};
|
|
68
68
|
|
|
69
|
+
if (connectIdSubmodule.isUnderGPPJurisdiction(consentData)) {
|
|
70
|
+
data.gpp = consentData.gppConsent.gppString;
|
|
71
|
+
data.gpp_sid = encodeURIComponent(consentData.gppConsent.applicableSections.join(','));
|
|
72
|
+
}
|
|
73
|
+
|
|
69
74
|
INPUT_PARAM_KEYS.forEach(key => {
|
|
70
75
|
if (typeof params[key] != 'undefined') {
|
|
71
76
|
data[key] = params[key];
|
|
@@ -98,7 +103,7 @@ export const connectIdSubmodule = {
|
|
|
98
103
|
},
|
|
99
104
|
|
|
100
105
|
/**
|
|
101
|
-
* Utility function that returns a boolean flag indicating if the
|
|
106
|
+
* Utility function that returns a boolean flag indicating if the opportunity
|
|
102
107
|
* is subject to GDPR
|
|
103
108
|
* @returns {Boolean}
|
|
104
109
|
*/
|
|
@@ -106,6 +111,15 @@ export const connectIdSubmodule = {
|
|
|
106
111
|
return !!(consentData && consentData.gdpr && consentData.gdpr.gdprApplies);
|
|
107
112
|
},
|
|
108
113
|
|
|
114
|
+
/**
|
|
115
|
+
* Utility function that returns a boolean flag indicating if the opportunity
|
|
116
|
+
* is subject to GPP jurisdiction.
|
|
117
|
+
* @returns {Boolean}
|
|
118
|
+
*/
|
|
119
|
+
isUnderGPPJurisdiction(consentData) {
|
|
120
|
+
return !!(consentData && consentData.gppConsent && consentData.gppConsent.gppString);
|
|
121
|
+
},
|
|
122
|
+
|
|
109
123
|
/**
|
|
110
124
|
* Utility function that returns a boolean flag indicating if the user
|
|
111
125
|
* has opeted out via the Yahoo easy-opt-out mechanism.
|
|
@@ -7,7 +7,7 @@ import {ajax} from '../src/ajax.js';
|
|
|
7
7
|
* Version of the FeedAd bid adapter
|
|
8
8
|
* @type {string}
|
|
9
9
|
*/
|
|
10
|
-
const VERSION = '1.0.
|
|
10
|
+
const VERSION = '1.0.5';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* @typedef {object} FeedAdApiBidRequest
|
|
@@ -16,7 +16,8 @@ const VERSION = '1.0.4';
|
|
|
16
16
|
* @property {number} ad_type
|
|
17
17
|
* @property {string} client_token
|
|
18
18
|
* @property {string} placement_id
|
|
19
|
-
* @property {string}
|
|
19
|
+
* @property {string} prebid_adapter_version
|
|
20
|
+
* @property {string} prebid_sdk_version
|
|
20
21
|
* @property {boolean} app_hybrid
|
|
21
22
|
*
|
|
22
23
|
* @property {string} [app_bundle_id]
|
|
@@ -181,7 +182,8 @@ function createApiBidRParams(request) {
|
|
|
181
182
|
ad_type: 0,
|
|
182
183
|
client_token: request.params.clientToken,
|
|
183
184
|
placement_id: request.params.placementId,
|
|
184
|
-
|
|
185
|
+
prebid_adapter_version: VERSION,
|
|
186
|
+
prebid_sdk_version: '$prebid.version$',
|
|
185
187
|
app_hybrid: false,
|
|
186
188
|
});
|
|
187
189
|
}
|
|
@@ -207,7 +209,6 @@ function buildRequests(validBidRequests, bidderRequest) {
|
|
|
207
209
|
})
|
|
208
210
|
});
|
|
209
211
|
data.bids.forEach(bid => BID_METADATA[bid.bidId] = {
|
|
210
|
-
// TODO: is 'page' the right value here?
|
|
211
212
|
referer: data.refererInfo.page,
|
|
212
213
|
transactionId: bid.transactionId
|
|
213
214
|
});
|
|
@@ -266,7 +267,8 @@ function createTrackingParams(data, klass) {
|
|
|
266
267
|
prebid_bid_id: bidId,
|
|
267
268
|
prebid_transaction_id: transactionId,
|
|
268
269
|
referer,
|
|
269
|
-
|
|
270
|
+
prebid_adapter_version: VERSION,
|
|
271
|
+
prebid_sdk_version: '$prebid.version$',
|
|
270
272
|
};
|
|
271
273
|
}
|
|
272
274
|
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import {
|
|
2
|
+
deepAccess,
|
|
3
|
+
getBidIdParameter,
|
|
4
|
+
isStr,
|
|
5
|
+
logMessage,
|
|
6
|
+
triggerPixel,
|
|
7
|
+
} from '../src/utils.js'
|
|
8
|
+
import * as events from '../src/events.js'
|
|
9
|
+
import CONSTANTS from '../src/constants.json'
|
|
10
|
+
import { BANNER } from '../src/mediaTypes.js'
|
|
11
|
+
|
|
12
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js'
|
|
13
|
+
|
|
14
|
+
const BIDDER_CODE = 'holid'
|
|
15
|
+
const GVLID = 1177
|
|
16
|
+
const ENDPOINT = 'https://helloworld.holid.io/openrtb2/auction'
|
|
17
|
+
const COOKIE_SYNC_ENDPOINT = 'https://null.holid.io/sync.html'
|
|
18
|
+
const TIME_TO_LIVE = 300
|
|
19
|
+
let wurlMap = {}
|
|
20
|
+
|
|
21
|
+
events.on(CONSTANTS.EVENTS.BID_WON, bidWonHandler)
|
|
22
|
+
|
|
23
|
+
export const spec = {
|
|
24
|
+
code: BIDDER_CODE,
|
|
25
|
+
gvlid: GVLID,
|
|
26
|
+
supportedMediaTypes: [BANNER],
|
|
27
|
+
|
|
28
|
+
isBidRequestValid: function (bid) {
|
|
29
|
+
return !!bid.params.adUnitID
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
buildRequests: function (validBidRequests, _bidderRequest) {
|
|
33
|
+
return validBidRequests.map((bid) => {
|
|
34
|
+
const requestData = {
|
|
35
|
+
...bid.ortb2,
|
|
36
|
+
id: bid.auctionId,
|
|
37
|
+
imp: [getImp(bid)],
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
url: ENDPOINT,
|
|
43
|
+
data: JSON.stringify(requestData),
|
|
44
|
+
bidId: bid.bidId,
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
interpretResponse: function (serverResponse, bidRequest) {
|
|
50
|
+
const bidResponses = []
|
|
51
|
+
|
|
52
|
+
if (!serverResponse.body.seatbid) {
|
|
53
|
+
return []
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
serverResponse.body.seatbid.map((response) => {
|
|
57
|
+
response.bid.map((bid) => {
|
|
58
|
+
const requestId = bidRequest.bidId
|
|
59
|
+
const auctionId = bidRequest.auctionId
|
|
60
|
+
const wurl = deepAccess(bid, 'ext.prebid.events.win')
|
|
61
|
+
const bidResponse = {
|
|
62
|
+
requestId,
|
|
63
|
+
cpm: bid.price,
|
|
64
|
+
width: bid.w,
|
|
65
|
+
height: bid.h,
|
|
66
|
+
ad: bid.adm,
|
|
67
|
+
creativeId: bid.crid,
|
|
68
|
+
currency: serverResponse.body.cur,
|
|
69
|
+
netRevenue: true,
|
|
70
|
+
ttl: TIME_TO_LIVE,
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
addWurl({ auctionId, requestId, wurl })
|
|
74
|
+
|
|
75
|
+
bidResponses.push(bidResponse)
|
|
76
|
+
})
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
return bidResponses
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
getUserSyncs(optionsType, serverResponse, gdprConsent, uspConsent) {
|
|
83
|
+
if (!serverResponse || serverResponse.length === 0) {
|
|
84
|
+
return []
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const syncs = []
|
|
88
|
+
|
|
89
|
+
if (optionsType.iframeEnabled) {
|
|
90
|
+
const queryParams = []
|
|
91
|
+
|
|
92
|
+
queryParams.push('bidders=' + getBidders(serverResponse))
|
|
93
|
+
queryParams.push('gdpr=' + +gdprConsent.gdprApplies)
|
|
94
|
+
queryParams.push('gdpr_consent=' + gdprConsent.consentString)
|
|
95
|
+
queryParams.push('usp_consent=' + (uspConsent || ''))
|
|
96
|
+
|
|
97
|
+
let strQueryParams = queryParams.join('&')
|
|
98
|
+
|
|
99
|
+
if (strQueryParams.length > 0) {
|
|
100
|
+
strQueryParams = '?' + strQueryParams
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
syncs.push({
|
|
104
|
+
type: 'iframe',
|
|
105
|
+
url: COOKIE_SYNC_ENDPOINT + strQueryParams + '&type=iframe',
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
return syncs
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function getImp(bid) {
|
|
114
|
+
const imp = {
|
|
115
|
+
ext: {
|
|
116
|
+
prebid: {
|
|
117
|
+
storedrequest: {
|
|
118
|
+
id: getBidIdParameter('adUnitID', bid.params),
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
}
|
|
123
|
+
const sizes =
|
|
124
|
+
bid.sizes && !Array.isArray(bid.sizes[0]) ? [bid.sizes] : bid.sizes
|
|
125
|
+
|
|
126
|
+
if (deepAccess(bid, 'mediaTypes.banner')) {
|
|
127
|
+
imp.banner = {
|
|
128
|
+
format: sizes.map((size) => {
|
|
129
|
+
return { w: size[0], h: size[1] }
|
|
130
|
+
}),
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return imp
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function getBidders(serverResponse) {
|
|
138
|
+
const bidders = serverResponse
|
|
139
|
+
.map((res) => Object.keys(res.body.ext.responsetimemillis))
|
|
140
|
+
.flat(1)
|
|
141
|
+
|
|
142
|
+
return encodeURIComponent(JSON.stringify([...new Set(bidders)]))
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function addWurl(auctionId, adId, wurl) {
|
|
146
|
+
if ([auctionId, adId].every(isStr)) {
|
|
147
|
+
wurlMap[`${auctionId}${adId}`] = wurl
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function removeWurl(auctionId, adId) {
|
|
152
|
+
delete wurlMap[`${auctionId}${adId}`]
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function getWurl(auctionId, adId) {
|
|
156
|
+
if ([auctionId, adId].every(isStr)) {
|
|
157
|
+
return wurlMap[`${auctionId}${adId}`]
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function bidWonHandler(bid) {
|
|
162
|
+
const wurl = getWurl(bid.auctionId, bid.adId)
|
|
163
|
+
if (wurl) {
|
|
164
|
+
logMessage(`Invoking image pixel for wurl on BID_WIN: "${wurl}"`)
|
|
165
|
+
triggerPixel(wurl)
|
|
166
|
+
removeWurl(bid.auctionId, bid.adId)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
registerBidder(spec)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
Module Name: Holid Bid Adapter
|
|
5
|
+
Module Type: Bidder Adapter
|
|
6
|
+
Maintainer: richard@holid.se
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
# Description
|
|
10
|
+
|
|
11
|
+
Currently module supports only banner mediaType.
|
|
12
|
+
|
|
13
|
+
# Test Parameters
|
|
14
|
+
|
|
15
|
+
## Sample Banner Ad Unit
|
|
16
|
+
|
|
17
|
+
```js
|
|
18
|
+
var adUnits = [
|
|
19
|
+
{
|
|
20
|
+
code: 'bannerAdUnit',
|
|
21
|
+
mediaTypes: {
|
|
22
|
+
banner: {
|
|
23
|
+
sizes: [[300, 250]],
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
bids: [
|
|
27
|
+
{
|
|
28
|
+
bidder: 'holid',
|
|
29
|
+
params: {
|
|
30
|
+
adUnitID: '12345',
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
]
|
|
36
|
+
```
|
|
@@ -47,19 +47,26 @@ export function JWPlayerProvider(config, jwplayer_, adState_, timeState_, callba
|
|
|
47
47
|
|
|
48
48
|
function init() {
|
|
49
49
|
if (!jwplayer) {
|
|
50
|
-
triggerSetupFailure(-1); // TODO: come up with code
|
|
50
|
+
triggerSetupFailure(-1); // TODO: come up with error code schema- player is absent
|
|
51
51
|
return;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
playerVersion = jwplayer.version;
|
|
55
55
|
|
|
56
56
|
if (playerVersion < minimumSupportedPlayerVersion) {
|
|
57
|
-
triggerSetupFailure(-2); // TODO: come up with code
|
|
57
|
+
triggerSetupFailure(-2); // TODO: come up with error code schema - version not supported
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (!document.getElementById(divId)) {
|
|
62
|
+
triggerSetupFailure(-3); // TODO: come up with error code schema - missing div id
|
|
58
63
|
return;
|
|
59
64
|
}
|
|
60
65
|
|
|
61
66
|
player = jwplayer(divId);
|
|
62
|
-
if (player.getState
|
|
67
|
+
if (!player || !player.getState) {
|
|
68
|
+
triggerSetupFailure(-4); // TODO: come up with error code schema - factory function failure
|
|
69
|
+
} else if (player.getState() === undefined) {
|
|
63
70
|
setupPlayer(playerConfig);
|
|
64
71
|
} else {
|
|
65
72
|
const payload = getSetupCompletePayload();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { _each, deepAccess, parseSizesInput, parseUrl, uniques, isFn } from '../src/utils.js';
|
|
2
2
|
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
3
|
-
import { BANNER } from '../src/mediaTypes.js';
|
|
3
|
+
import { BANNER, VIDEO } from '../src/mediaTypes.js';
|
|
4
4
|
import { getStorageManager } from '../src/storageManager.js';
|
|
5
5
|
|
|
6
6
|
const GVLID = 1165;
|
|
@@ -55,7 +55,7 @@ function isBidRequestValid(bid) {
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
|
|
58
|
-
const { params, bidId, userId, adUnitCode, schain } = bid;
|
|
58
|
+
const { params, bidId, userId, adUnitCode, schain, mediaTypes } = bid;
|
|
59
59
|
let { bidFloor, ext } = params;
|
|
60
60
|
const hashUrl = hashCode(topWindowUrl);
|
|
61
61
|
const uniqueDealId = getUniqueDealId(hashUrl);
|
|
@@ -89,7 +89,8 @@ function buildRequest(bid, topWindowUrl, sizes, bidderRequest) {
|
|
|
89
89
|
bidderVersion: BIDDER_VERSION,
|
|
90
90
|
prebidVersion: '$prebid.version$',
|
|
91
91
|
res: `${screen.width}x${screen.height}`,
|
|
92
|
-
schain: schain
|
|
92
|
+
schain: schain,
|
|
93
|
+
mediaTypes: mediaTypes
|
|
93
94
|
};
|
|
94
95
|
|
|
95
96
|
appendUserIdsToRequestPayload(data, userId);
|
|
@@ -167,11 +168,12 @@ function interpretResponse(serverResponse, request) {
|
|
|
167
168
|
|
|
168
169
|
try {
|
|
169
170
|
results.forEach(result => {
|
|
170
|
-
const { creativeId, ad, price, exp, width, height, currency, advertiserDomains } = result;
|
|
171
|
+
const { creativeId, ad, price, exp, width, height, currency, advertiserDomains, mediaType = BANNER } = result;
|
|
171
172
|
if (!ad || !price) {
|
|
172
173
|
return;
|
|
173
174
|
}
|
|
174
|
-
|
|
175
|
+
|
|
176
|
+
const response = {
|
|
175
177
|
requestId: bidId,
|
|
176
178
|
cpm: price,
|
|
177
179
|
width: width,
|
|
@@ -180,11 +182,22 @@ function interpretResponse(serverResponse, request) {
|
|
|
180
182
|
currency: currency || CURRENCY,
|
|
181
183
|
netRevenue: true,
|
|
182
184
|
ttl: exp || TTL_SECONDS,
|
|
183
|
-
ad: ad,
|
|
184
185
|
meta: {
|
|
185
186
|
advertiserDomains: advertiserDomains || []
|
|
186
187
|
}
|
|
187
|
-
}
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
if (mediaType === BANNER) {
|
|
191
|
+
Object.assign(response, {
|
|
192
|
+
ad: ad,
|
|
193
|
+
});
|
|
194
|
+
} else {
|
|
195
|
+
Object.assign(response, {
|
|
196
|
+
vastXml: ad,
|
|
197
|
+
mediaType: VIDEO
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
output.push(response);
|
|
188
201
|
});
|
|
189
202
|
return output;
|
|
190
203
|
} catch (e) {
|
|
@@ -268,7 +281,7 @@ export const spec = {
|
|
|
268
281
|
code: BIDDER_CODE,
|
|
269
282
|
version: BIDDER_VERSION,
|
|
270
283
|
gvlid: GVLID,
|
|
271
|
-
supportedMediaTypes: [BANNER],
|
|
284
|
+
supportedMediaTypes: [BANNER, VIDEO],
|
|
272
285
|
isBidRequestValid,
|
|
273
286
|
buildRequests,
|
|
274
287
|
interpretResponse,
|