prebid.js 5.17.0 → 6.0.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/.babelrc.js +3 -6
- package/README.md +3 -1
- package/browsers.json +1 -8
- package/integrationExamples/gpt/akamaidap_segments_example.html +132 -0
- package/modules/.submodules.json +1 -0
- package/modules/adfBidAdapter.js +21 -16
- package/modules/adgenerationBidAdapter.js +28 -4
- package/modules/adkernelBidAdapter.js +2 -1
- package/modules/admixerBidAdapter.js +11 -0
- package/modules/adtelligentBidAdapter.js +2 -1
- package/modules/airgridRtdProvider.js +1 -1
- package/modules/akamaiDapRtdProvider.js +474 -0
- package/modules/akamaiDapRtdProvider.md +47 -0
- package/modules/aolBidAdapter.js +2 -1
- package/modules/appnexusBidAdapter.js +5 -3
- package/modules/atsAnalyticsAdapter.js +67 -46
- package/modules/atsAnalyticsAdapter.md +1 -0
- package/modules/betweenBidAdapter.js +20 -3
- package/modules/bliinkBidAdapter.js +58 -32
- package/modules/bliinkBidAdapter.md +29 -6
- package/modules/browsiRtdProvider.js +106 -18
- package/modules/cleanioRtdProvider.js +192 -0
- package/modules/cleanioRtdProvider.md +59 -0
- package/modules/codefuelBidAdapter.js +183 -0
- package/modules/codefuelBidAdapter.md +111 -0
- package/modules/connectIdSystem.js +104 -0
- package/modules/connectIdSystem.md +33 -0
- package/modules/cwireBidAdapter.js +272 -0
- package/modules/cwireBidAdapter.md +43 -0
- package/modules/deepintentBidAdapter.js +106 -9
- package/modules/deepintentBidAdapter.md +36 -1
- package/modules/deltaprojectsBidAdapter.js +252 -0
- package/modules/deltaprojectsBidAdapter.md +32 -0
- package/modules/dgkeywordRtdProvider.js +0 -1
- package/modules/engageyaBidAdapter.js +157 -0
- package/modules/gridBidAdapter.js +1 -0
- package/modules/gumgumBidAdapter.js +8 -0
- package/modules/inskinBidAdapter.js +7 -3
- package/modules/ixBidAdapter.js +8 -1
- package/modules/jixieBidAdapter.js +8 -2
- package/modules/justpremiumBidAdapter.js +6 -1
- package/modules/limelightDigitalBidAdapter.js +22 -2
- package/modules/livewrappedAnalyticsAdapter.js +53 -3
- package/modules/mediakeysBidAdapter.js +2 -1
- package/modules/multibid/index.js +3 -3
- package/modules/nativoBidAdapter.js +6 -2
- package/modules/nextMillenniumBidAdapter.js +12 -3
- package/modules/oguryBidAdapter.js +36 -7
- package/modules/openxBidAdapter.js +34 -22
- package/modules/operaadsBidAdapter.js +21 -1
- package/modules/otmBidAdapter.js +146 -0
- package/modules/otmBidAdapter.md +27 -26
- package/modules/outbrainBidAdapter.js +5 -0
- package/modules/pixfutureBidAdapter.js +24 -4
- package/modules/pixfutureBidAdapter.md +127 -0
- package/modules/playwireBidAdapter.md +61 -0
- package/modules/prebidServerBidAdapter/index.js +1 -1
- package/modules/proxistoreBidAdapter.js +4 -6
- package/modules/publinkIdSystem.js +11 -6
- package/modules/pubmaticBidAdapter.js +9 -0
- package/modules/pubmaticBidAdapter.md +1 -1
- package/modules/rtdModule/index.js +2 -2
- package/modules/sonobiBidAdapter.js +7 -0
- package/modules/sortableBidAdapter.js +1 -0
- package/modules/talkadsBidAdapter.js +129 -0
- package/modules/talkadsBidAdapter.md +60 -0
- package/modules/teadsBidAdapter.js +3 -0
- package/modules/tripleliftBidAdapter.js +22 -5
- package/modules/trustxBidAdapter.js +8 -6
- package/modules/undertoneBidAdapter.js +9 -5
- package/modules/undertoneBidAdapter.md +5 -1
- package/modules/unicornBidAdapter.js +3 -3
- package/modules/userId/eids.js +18 -0
- package/modules/userId/eids.md +7 -0
- package/modules/userId/userId.md +12 -0
- package/modules/ventesBidAdapter.js +370 -0
- package/modules/ventesBidAdapter.md +94 -0
- package/modules/videobyteBidAdapter.js +13 -6
- package/modules/videobyteBidAdapter.md +49 -0
- package/modules/visxBidAdapter.js +15 -22
- package/modules/yahoosspBidAdapter.js +637 -0
- package/modules/yahoosspBidAdapter.md +795 -0
- package/modules/yieldlabBidAdapter.js +48 -3
- package/modules/yieldlabBidAdapter.md +16 -1
- package/modules/yieldmoSyntheticInventoryModule.js +46 -0
- package/modules/yieldmoSyntheticInventoryModule.md +68 -0
- package/package.json +1 -1
- package/src/adapterManager.js +5 -0
- package/src/adapters/bidderFactory.js +4 -3
- package/src/auction.js +11 -11
- package/src/constants.json +1 -0
- package/src/secureCreatives.js +6 -7
- package/src/targeting.js +11 -9
- package/test/spec/modules/adfBidAdapter_spec.js +83 -29
- package/test/spec/modules/adgenerationBidAdapter_spec.js +121 -50
- package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
- package/test/spec/modules/akamaiDapRtdProvider_spec.js +246 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +2 -1
- package/test/spec/modules/atsAnalyticsAdapter_spec.js +42 -9
- package/test/spec/modules/betweenBidAdapter_spec.js +41 -0
- package/test/spec/modules/bliinkBidAdapter_spec.js +87 -36
- package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
- package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
- package/test/spec/modules/codefuelBidAdapter_spec.js +316 -0
- package/test/spec/modules/connectIdSystem_spec.js +189 -0
- package/test/spec/modules/cwireBidAdapter_spec.js +246 -0
- package/test/spec/modules/deepintentBidAdapter_spec.js +153 -3
- package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
- package/test/spec/modules/engageyaBidAdapter_spec.js +286 -0
- package/test/spec/modules/gumgumBidAdapter_spec.js +5 -1
- package/test/spec/modules/ixBidAdapter_spec.js +13 -3
- package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
- package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
- package/test/spec/modules/limelightDigitalBidAdapter_spec.js +155 -1
- package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +67 -12
- package/test/spec/modules/multibid_spec.js +31 -31
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +13 -1
- package/test/spec/modules/oguryBidAdapter_spec.js +125 -37
- package/test/spec/modules/openxBidAdapter_spec.js +85 -13
- package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
- package/test/spec/modules/otmBidAdapter_spec.js +67 -0
- package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
- package/test/spec/modules/publinkIdSystem_spec.js +6 -6
- package/test/spec/modules/pubmaticBidAdapter_spec.js +39 -1
- package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
- package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
- package/test/spec/modules/talkadsBidAdapter_spec.js +231 -0
- package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
- package/test/spec/modules/tripleliftBidAdapter_spec.js +128 -0
- package/test/spec/modules/trustxBidAdapter_spec.js +3 -3
- package/test/spec/modules/undertoneBidAdapter_spec.js +52 -0
- package/test/spec/modules/unicornBidAdapter_spec.js +4 -4
- package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
- package/test/spec/modules/videobyteBidAdapter_spec.js +2 -2
- package/test/spec/modules/visxBidAdapter_spec.js +48 -4
- package/test/spec/modules/yahoosspBidAdapter_spec.js +1332 -0
- package/test/spec/modules/yieldlabBidAdapter_spec.js +65 -1
- package/test/spec/modules/yieldmoSyntheticInventoryModule_spec.js +89 -0
- package/test/spec/unit/core/adapterManager_spec.js +32 -0
- package/test/spec/unit/core/bidderFactory_spec.js +61 -1
- package/test/spec/unit/pbjs_api_spec.js +37 -2
- package/test/spec/unit/secureCreatives_spec.js +54 -25
- package/wdio.conf.js +1 -1
- package/modules/turktelekomBidAdapter.md +0 -49
- package/yarn.lock +0 -13122
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
2
|
+
import { getRefererInfo } from '../src/refererDetection.js';
|
|
3
|
+
import { getStorageManager } from '../src/storageManager.js';
|
|
4
|
+
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
5
|
+
import { OUTSTREAM } from '../src/video.js';
|
|
6
|
+
import {
|
|
7
|
+
isArray,
|
|
8
|
+
isNumber,
|
|
9
|
+
generateUUID,
|
|
10
|
+
parseSizesInput,
|
|
11
|
+
deepAccess,
|
|
12
|
+
getParameterByName,
|
|
13
|
+
getValue,
|
|
14
|
+
getBidIdParameter,
|
|
15
|
+
logError,
|
|
16
|
+
logWarn,
|
|
17
|
+
} from '../src/utils.js';
|
|
18
|
+
import { Renderer } from '../src/Renderer.js';
|
|
19
|
+
import find from 'core-js-pure/features/array/find.js';
|
|
20
|
+
|
|
21
|
+
// ------------------------------------
|
|
22
|
+
const BIDDER_CODE = 'cwire';
|
|
23
|
+
export const ENDPOINT_URL = 'https://embed.cwi.re/delivery/prebid';
|
|
24
|
+
export const RENDERER_URL = 'https://cdn.cwi.re/prebid/renderer/LATEST/renderer.min.js';
|
|
25
|
+
// ------------------------------------
|
|
26
|
+
export const CW_PAGE_VIEW_ID = generateUUID();
|
|
27
|
+
const LS_CWID_KEY = 'cw_cwid';
|
|
28
|
+
const CW_GROUPS_QUERY = 'cwgroups';
|
|
29
|
+
|
|
30
|
+
const storage = getStorageManager();
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* ------------------------------------
|
|
34
|
+
* ------------------------------------
|
|
35
|
+
* @param bid
|
|
36
|
+
* @returns {Array<string>}
|
|
37
|
+
*/
|
|
38
|
+
export function getSlotSizes(bid) {
|
|
39
|
+
return parseSizesInput(getAllMediaSizes(bid));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* ------------------------------------
|
|
44
|
+
* ------------------------------------
|
|
45
|
+
* @param bid
|
|
46
|
+
* @returns {*[]}
|
|
47
|
+
*/
|
|
48
|
+
export function getAllMediaSizes(bid) {
|
|
49
|
+
let playerSizes = deepAccess(bid, 'mediaTypes.video.playerSize');
|
|
50
|
+
let videoSizes = deepAccess(bid, 'mediaTypes.video.sizes');
|
|
51
|
+
let bannerSizes = deepAccess(bid, 'mediaTypes.banner.sizes');
|
|
52
|
+
|
|
53
|
+
const sizes = [];
|
|
54
|
+
|
|
55
|
+
if (isArray(playerSizes)) {
|
|
56
|
+
playerSizes.forEach((s) => {
|
|
57
|
+
sizes.push(s);
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (isArray(videoSizes)) {
|
|
62
|
+
videoSizes.forEach((s) => {
|
|
63
|
+
sizes.push(s);
|
|
64
|
+
})
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (isArray(bannerSizes)) {
|
|
68
|
+
bannerSizes.forEach((s) => {
|
|
69
|
+
sizes.push(s);
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
return sizes;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const getQueryVariable = (variable) => {
|
|
76
|
+
let value = getParameterByName(variable);
|
|
77
|
+
if (value === '') {
|
|
78
|
+
value = null;
|
|
79
|
+
}
|
|
80
|
+
return value;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* ------------------------------------
|
|
85
|
+
* ------------------------------------
|
|
86
|
+
* @param validBidRequests
|
|
87
|
+
* @returns {*[]}
|
|
88
|
+
*/
|
|
89
|
+
export const mapSlotsData = function(validBidRequests) {
|
|
90
|
+
const slots = [];
|
|
91
|
+
validBidRequests.forEach(bid => {
|
|
92
|
+
const bidObj = {};
|
|
93
|
+
// get the pacement and page ids
|
|
94
|
+
let placementId = getValue(bid.params, 'placementId');
|
|
95
|
+
let pageId = getValue(bid.params, 'pageId');
|
|
96
|
+
let adUnitElementId = getValue(bid.params, 'adUnitElementId');
|
|
97
|
+
// get the rest of the auction/bid/transaction info
|
|
98
|
+
bidObj.auctionId = getBidIdParameter('auctionId', bid);
|
|
99
|
+
bidObj.adUnitCode = getBidIdParameter('adUnitCode', bid);
|
|
100
|
+
bidObj.adUnitElementId = adUnitElementId;
|
|
101
|
+
bidObj.bidId = getBidIdParameter('bidId', bid);
|
|
102
|
+
bidObj.bidderRequestId = getBidIdParameter('bidderRequestId', bid);
|
|
103
|
+
bidObj.placementId = placementId;
|
|
104
|
+
bidObj.pageId = pageId;
|
|
105
|
+
bidObj.mediaTypes = getBidIdParameter('mediaTypes', bid);
|
|
106
|
+
bidObj.transactionId = getBidIdParameter('transactionId', bid);
|
|
107
|
+
bidObj.sizes = getSlotSizes(bid);
|
|
108
|
+
slots.push(bidObj);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
return slots;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
export const spec = {
|
|
115
|
+
code: BIDDER_CODE,
|
|
116
|
+
supportedMediaTypes: [BANNER, VIDEO],
|
|
117
|
+
/**
|
|
118
|
+
* Determines whether or not the given bid request is valid.
|
|
119
|
+
*
|
|
120
|
+
* @param {BidRequest} bid The bid params to validate.
|
|
121
|
+
* @return boolean True if this is a valid bid, and false otherwise.
|
|
122
|
+
*/
|
|
123
|
+
isBidRequestValid: function(bid) {
|
|
124
|
+
bid.params = bid.params || {};
|
|
125
|
+
|
|
126
|
+
// if ad unit elemt id not provided - use adUnitCode by default
|
|
127
|
+
if (!bid.params.adUnitElementId) {
|
|
128
|
+
bid.params.adUnitElementId = bid.code;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (!bid.params.placementId || !isNumber(bid.params.placementId)) {
|
|
132
|
+
logError('placementId not provided or invalid');
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (!bid.params.pageId || !isNumber(bid.params.pageId)) {
|
|
137
|
+
logError('pageId not provided');
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return true;
|
|
142
|
+
},
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* ------------------------------------
|
|
146
|
+
* Make a server request from the
|
|
147
|
+
* list of BidRequests.
|
|
148
|
+
* ------------------------------------
|
|
149
|
+
* @param {validBidRequests[]} - an array of bids
|
|
150
|
+
* @return ServerRequest Info describing the request to the server.
|
|
151
|
+
*/
|
|
152
|
+
buildRequests: function(validBidRequests, bidderRequest) {
|
|
153
|
+
let slots = [];
|
|
154
|
+
let referer;
|
|
155
|
+
try {
|
|
156
|
+
referer = getRefererInfo().referer;
|
|
157
|
+
slots = mapSlotsData(validBidRequests);
|
|
158
|
+
} catch (e) {
|
|
159
|
+
logWarn(e);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
let refgroups = [];
|
|
163
|
+
|
|
164
|
+
const rgQuery = getQueryVariable(CW_GROUPS_QUERY);
|
|
165
|
+
if (rgQuery !== null) {
|
|
166
|
+
refgroups = rgQuery.split(',');
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const localStorageCWID = storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(LS_CWID_KEY) : null;
|
|
170
|
+
|
|
171
|
+
const payload = {
|
|
172
|
+
cwid: localStorageCWID,
|
|
173
|
+
refgroups,
|
|
174
|
+
slots: slots,
|
|
175
|
+
httpRef: referer || '',
|
|
176
|
+
pageViewId: CW_PAGE_VIEW_ID,
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
return {
|
|
180
|
+
method: 'POST',
|
|
181
|
+
url: ENDPOINT_URL,
|
|
182
|
+
data: payload
|
|
183
|
+
};
|
|
184
|
+
},
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Unpack the response from the server into a list of bids.
|
|
188
|
+
*
|
|
189
|
+
* @param {ServerResponse} serverResponse A successful response from the server.
|
|
190
|
+
* @return {Bid[]} An array of bids which were nested inside the server.
|
|
191
|
+
*/
|
|
192
|
+
interpretResponse: function(serverResponse, bidRequest) {
|
|
193
|
+
const bidResponses = [];
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
if (typeof bidRequest.data === 'string') {
|
|
197
|
+
bidRequest.data = JSON.parse(bidRequest.data);
|
|
198
|
+
}
|
|
199
|
+
const serverBody = serverResponse.body;
|
|
200
|
+
serverBody.bids.forEach((br) => {
|
|
201
|
+
const bidReq = find(bidRequest.data.slots, bid => bid.bidId === br.requestId);
|
|
202
|
+
|
|
203
|
+
let mediaType = BANNER;
|
|
204
|
+
|
|
205
|
+
const bidResponse = {
|
|
206
|
+
requestId: br.requestId,
|
|
207
|
+
cpm: br.cpm,
|
|
208
|
+
bidderCode: BIDDER_CODE,
|
|
209
|
+
width: br.dimensions[0],
|
|
210
|
+
height: br.dimensions[1],
|
|
211
|
+
creativeId: br.creativeId,
|
|
212
|
+
currency: br.currency,
|
|
213
|
+
netRevenue: br.netRevenue,
|
|
214
|
+
ttl: br.ttl,
|
|
215
|
+
meta: {
|
|
216
|
+
advertiserDomains: br.adomains ? br.advertiserDomains : [],
|
|
217
|
+
},
|
|
218
|
+
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
// ------------------------------------
|
|
222
|
+
// IF BANNER
|
|
223
|
+
// ------------------------------------
|
|
224
|
+
|
|
225
|
+
if (deepAccess(bidReq, 'mediaTypes.banner')) {
|
|
226
|
+
bidResponse.ad = br.html;
|
|
227
|
+
}
|
|
228
|
+
// ------------------------------------
|
|
229
|
+
// IF VIDEO
|
|
230
|
+
// ------------------------------------
|
|
231
|
+
if (deepAccess(bidReq, 'mediaTypes.video')) {
|
|
232
|
+
mediaType = VIDEO;
|
|
233
|
+
bidResponse.vastXml = br.vastXml;
|
|
234
|
+
bidResponse.videoScript = br.html;
|
|
235
|
+
const mediaTypeContext = deepAccess(bidReq, 'mediaTypes.video.context');
|
|
236
|
+
if (mediaTypeContext === OUTSTREAM) {
|
|
237
|
+
const r = Renderer.install({
|
|
238
|
+
id: bidResponse.requestId,
|
|
239
|
+
adUnitCode: bidReq.adUnitCode,
|
|
240
|
+
url: RENDERER_URL,
|
|
241
|
+
loaded: false,
|
|
242
|
+
config: {
|
|
243
|
+
...deepAccess(bidReq, 'mediaTypes.video'),
|
|
244
|
+
...deepAccess(br, 'outstream', {})
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
// set renderer
|
|
249
|
+
try {
|
|
250
|
+
bidResponse.renderer = r;
|
|
251
|
+
bidResponse.renderer.setRender(function(bid) {
|
|
252
|
+
if (window.CWIRE && window.CWIRE.outstream) {
|
|
253
|
+
window.CWIRE.outstream.renderAd(bid);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
} catch (err) {
|
|
257
|
+
logWarn('Prebid Error calling setRender on newRenderer', err);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
bidResponse.mediaType = mediaType;
|
|
263
|
+
bidResponses.push(bidResponse);
|
|
264
|
+
});
|
|
265
|
+
} catch (e) {
|
|
266
|
+
logWarn(e);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return bidResponses;
|
|
270
|
+
},
|
|
271
|
+
}
|
|
272
|
+
registerBidder(spec);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
Module Name: C-WIRE Bid Adapter
|
|
4
|
+
Module Type: Adagio Adapter
|
|
5
|
+
Maintainer: dragan@cwire.ch
|
|
6
|
+
|
|
7
|
+
## Description
|
|
8
|
+
|
|
9
|
+
Connects to C-WIRE demand source to fetch bids.
|
|
10
|
+
|
|
11
|
+
## Configuration
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
Below, the list of C-WIRE params and where they can be set.
|
|
15
|
+
|
|
16
|
+
| Param name | Global config | AdUnit config | Type | Required |
|
|
17
|
+
| ---------- | ------------- | ------------- | ---- | ---------|
|
|
18
|
+
| pageId | | x | number | YES |
|
|
19
|
+
| placementId | | x | number | YES |
|
|
20
|
+
| adUnitElementId | | x | string | NO |
|
|
21
|
+
|
|
22
|
+
### adUnit configuration
|
|
23
|
+
|
|
24
|
+
```javascript
|
|
25
|
+
var adUnits = [
|
|
26
|
+
{
|
|
27
|
+
code: 'target_div_id', // REQUIRED
|
|
28
|
+
bids: [{
|
|
29
|
+
bidder: 'cwire',
|
|
30
|
+
mediaTypes: {
|
|
31
|
+
banner: {
|
|
32
|
+
sizes: [[1, 1]],
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
params: {
|
|
36
|
+
pageId: 1422, // required - number
|
|
37
|
+
placementId: 2211521, // required - number
|
|
38
|
+
adUnitElementId: 'other_div', // optional, div id to write to, if not set it will default to ad unit code
|
|
39
|
+
}
|
|
40
|
+
}]
|
|
41
|
+
}
|
|
42
|
+
];
|
|
43
|
+
```
|
|
@@ -1,13 +1,38 @@
|
|
|
1
|
-
import { generateUUID, deepSetValue, deepAccess, isArray } from '../src/utils.js';
|
|
1
|
+
import { generateUUID, deepSetValue, deepAccess, isArray, isInteger, logError, logWarn } 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
|
const BIDDER_CODE = 'deepintent';
|
|
5
5
|
const BIDDER_ENDPOINT = 'https://prebid.deepintent.com/prebid';
|
|
6
6
|
const USER_SYNC_URL = 'https://cdn.deepintent.com/syncpixel.html';
|
|
7
7
|
const DI_M_V = '1.0.0';
|
|
8
|
+
export const ORTB_VIDEO_PARAMS = {
|
|
9
|
+
'mimes': (value) => Array.isArray(value) && value.length > 0 && value.every(v => typeof v === 'string'),
|
|
10
|
+
'minduration': (value) => isInteger(value),
|
|
11
|
+
'maxduration': (value) => isInteger(value),
|
|
12
|
+
'protocols': (value) => Array.isArray(value) && value.every(v => v >= 1 && v <= 10),
|
|
13
|
+
'w': (value) => isInteger(value),
|
|
14
|
+
'h': (value) => isInteger(value),
|
|
15
|
+
'startdelay': (value) => isInteger(value),
|
|
16
|
+
'placement': (value) => Array.isArray(value) && value.every(v => v >= 1 && v <= 5),
|
|
17
|
+
'linearity': (value) => [1, 2].indexOf(value) !== -1,
|
|
18
|
+
'skip': (value) => [0, 1].indexOf(value) !== -1,
|
|
19
|
+
'skipmin': (value) => isInteger(value),
|
|
20
|
+
'skipafter': (value) => isInteger(value),
|
|
21
|
+
'sequence': (value) => isInteger(value),
|
|
22
|
+
'battr': (value) => Array.isArray(value) && value.every(v => v >= 1 && v <= 17),
|
|
23
|
+
'maxextended': (value) => isInteger(value),
|
|
24
|
+
'minbitrate': (value) => isInteger(value),
|
|
25
|
+
'maxbitrate': (value) => isInteger(value),
|
|
26
|
+
'boxingallowed': (value) => [0, 1].indexOf(value) !== -1,
|
|
27
|
+
'playbackmethod': (value) => Array.isArray(value) && value.every(v => v >= 1 && v <= 6),
|
|
28
|
+
'playbackend': (value) => [1, 2, 3].indexOf(value) !== -1,
|
|
29
|
+
'delivery': (value) => [1, 2, 3].indexOf(value) !== -1,
|
|
30
|
+
'pos': (value) => [0, 1, 2, 3, 4, 5, 6, 7].indexOf(value) !== -1,
|
|
31
|
+
'api': (value) => Array.isArray(value) && value.every(v => v >= 1 && v <= 6)
|
|
32
|
+
};
|
|
8
33
|
export const spec = {
|
|
9
34
|
code: BIDDER_CODE,
|
|
10
|
-
supportedMediaTypes: [BANNER],
|
|
35
|
+
supportedMediaTypes: [BANNER, VIDEO],
|
|
11
36
|
aliases: [],
|
|
12
37
|
|
|
13
38
|
// tagId is mandatory param
|
|
@@ -15,16 +40,38 @@ export const spec = {
|
|
|
15
40
|
let valid = false;
|
|
16
41
|
if (bid && bid.params && bid.params.tagId) {
|
|
17
42
|
if (typeof bid.params.tagId === 'string' || bid.params.tagId instanceof String) {
|
|
18
|
-
|
|
43
|
+
if (bid.hasOwnProperty('mediaTypes') && bid.mediaTypes.hasOwnProperty(VIDEO)) {
|
|
44
|
+
if (bid.mediaTypes[VIDEO].hasOwnProperty('context')) {
|
|
45
|
+
valid = true;
|
|
46
|
+
}
|
|
47
|
+
} else {
|
|
48
|
+
valid = true;
|
|
49
|
+
}
|
|
19
50
|
}
|
|
20
51
|
}
|
|
21
52
|
return valid;
|
|
22
53
|
},
|
|
23
|
-
interpretResponse: function(bidResponse,
|
|
54
|
+
interpretResponse: function(bidResponse, bidRequest) {
|
|
24
55
|
let responses = [];
|
|
25
56
|
if (bidResponse && bidResponse.body) {
|
|
26
|
-
|
|
27
|
-
|
|
57
|
+
try {
|
|
58
|
+
let bids = bidResponse.body.seatbid && bidResponse.body.seatbid[0] ? bidResponse.body.seatbid[0].bid : [];
|
|
59
|
+
if (bids) {
|
|
60
|
+
bids.forEach(bidObj => {
|
|
61
|
+
let newBid = formatResponse(bidObj);
|
|
62
|
+
let mediaType = _checkMediaType(bidObj);
|
|
63
|
+
if (mediaType === BANNER) {
|
|
64
|
+
newBid.mediaType = BANNER;
|
|
65
|
+
} else if (mediaType === VIDEO) {
|
|
66
|
+
newBid.mediaType = VIDEO;
|
|
67
|
+
newBid.vastXml = bidObj.adm;
|
|
68
|
+
}
|
|
69
|
+
responses.push(newBid);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
} catch (err) {
|
|
73
|
+
logError(err);
|
|
74
|
+
}
|
|
28
75
|
}
|
|
29
76
|
return responses;
|
|
30
77
|
},
|
|
@@ -73,6 +120,17 @@ export const spec = {
|
|
|
73
120
|
}
|
|
74
121
|
|
|
75
122
|
};
|
|
123
|
+
function _checkMediaType(bid) {
|
|
124
|
+
let videoRegex = new RegExp(/VAST\s+version/);
|
|
125
|
+
let mediaType;
|
|
126
|
+
if (bid.adm && bid.adm.indexOf('deepintent_wrapper') >= 0) {
|
|
127
|
+
mediaType = BANNER;
|
|
128
|
+
} else if (videoRegex.test(bid.adm)) {
|
|
129
|
+
mediaType = VIDEO;
|
|
130
|
+
}
|
|
131
|
+
return mediaType;
|
|
132
|
+
}
|
|
133
|
+
|
|
76
134
|
function clean(obj) {
|
|
77
135
|
for (let propName in obj) {
|
|
78
136
|
if (obj[propName] === null || obj[propName] === undefined) {
|
|
@@ -100,16 +158,55 @@ function formatResponse(bid) {
|
|
|
100
158
|
}
|
|
101
159
|
|
|
102
160
|
function buildImpression(bid) {
|
|
103
|
-
|
|
161
|
+
let impression = {};
|
|
162
|
+
impression = {
|
|
104
163
|
id: bid.bidId,
|
|
105
164
|
tagid: bid.params.tagId || '',
|
|
106
165
|
secure: window.location.protocol === 'https' ? 1 : 0,
|
|
107
|
-
banner: buildBanner(bid),
|
|
108
166
|
displaymanager: 'di_prebid',
|
|
109
167
|
displaymanagerver: DI_M_V,
|
|
110
168
|
ext: buildCustomParams(bid)
|
|
111
169
|
};
|
|
170
|
+
if (deepAccess(bid, 'mediaTypes.banner')) {
|
|
171
|
+
impression['banner'] = buildBanner(bid);
|
|
172
|
+
}
|
|
173
|
+
if (deepAccess(bid, 'mediaTypes.video')) {
|
|
174
|
+
impression['video'] = _buildVideo(bid);
|
|
175
|
+
}
|
|
176
|
+
return impression;
|
|
112
177
|
}
|
|
178
|
+
|
|
179
|
+
function _buildVideo(bid) {
|
|
180
|
+
const videoObj = {};
|
|
181
|
+
const videoAdUnitParams = deepAccess(bid, 'mediaTypes.video', {});
|
|
182
|
+
const videoBidderParams = deepAccess(bid, 'params.video', {});
|
|
183
|
+
const computedParams = {};
|
|
184
|
+
|
|
185
|
+
if (Array.isArray(videoAdUnitParams.playerSize)) {
|
|
186
|
+
const tempSize = (Array.isArray(videoAdUnitParams.playerSize[0])) ? videoAdUnitParams.playerSize[0] : videoAdUnitParams.playerSize;
|
|
187
|
+
computedParams.w = tempSize[0];
|
|
188
|
+
computedParams.h = tempSize[1];
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const videoParams = {
|
|
192
|
+
...computedParams,
|
|
193
|
+
...videoAdUnitParams,
|
|
194
|
+
...videoBidderParams
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
Object.keys(ORTB_VIDEO_PARAMS).forEach(paramName => {
|
|
198
|
+
if (videoParams.hasOwnProperty(paramName)) {
|
|
199
|
+
if (ORTB_VIDEO_PARAMS[paramName](videoParams[paramName])) {
|
|
200
|
+
videoObj[paramName] = videoParams[paramName];
|
|
201
|
+
} else {
|
|
202
|
+
logWarn(`The OpenRTB video param ${paramName} has been skipped due to misformating. Please refer to OpenRTB 2.5 spec.`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
return videoObj;
|
|
208
|
+
};
|
|
209
|
+
|
|
113
210
|
function buildCustomParams(bid) {
|
|
114
211
|
if (bid.params && bid.params.custom) {
|
|
115
212
|
return {
|
|
@@ -8,7 +8,7 @@ Maintainer: prebid@deepintent.com
|
|
|
8
8
|
|
|
9
9
|
# Description
|
|
10
10
|
|
|
11
|
-
Deepintent currently supports the BANNER type ads through prebid js
|
|
11
|
+
Deepintent currently supports the BANNER and VIDEO type ads through prebid js
|
|
12
12
|
|
|
13
13
|
Module that connects to Deepintent's demand sources.
|
|
14
14
|
|
|
@@ -40,6 +40,41 @@ Module that connects to Deepintent's demand sources.
|
|
|
40
40
|
];
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
+
# Sample Video Ad Unit
|
|
44
|
+
```
|
|
45
|
+
var adVideoAdUnits = [
|
|
46
|
+
{
|
|
47
|
+
code: 'test-div-video',
|
|
48
|
+
mediaTypes: {
|
|
49
|
+
video: {
|
|
50
|
+
playerSize: [640, 480], // required
|
|
51
|
+
context: 'instream' //required
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
bids: [{
|
|
55
|
+
bidder: 'deepintent',
|
|
56
|
+
params: {
|
|
57
|
+
tagId: '1300', // Required parameter // required
|
|
58
|
+
video: {
|
|
59
|
+
mimes: ['video/mp4','video/x-flv'], // required
|
|
60
|
+
skippable: true, // optional
|
|
61
|
+
minduration: 5, // optional
|
|
62
|
+
maxduration: 30, // optional
|
|
63
|
+
startdelay: 5, // optional
|
|
64
|
+
playbackmethod: [1,3], // optional
|
|
65
|
+
api: [ 1, 2 ], // optional
|
|
66
|
+
protocols: [ 2, 3 ], // optional
|
|
67
|
+
battr: [ 13, 14 ], // optional
|
|
68
|
+
linearity: 1, // optional
|
|
69
|
+
placement: 2, // optional
|
|
70
|
+
minbitrate: 10, // optional
|
|
71
|
+
maxbitrate: 10 // optional
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}]
|
|
75
|
+
}]
|
|
76
|
+
```
|
|
77
|
+
|
|
43
78
|
###Recommended User Sync Configuration
|
|
44
79
|
|
|
45
80
|
```javascript
|