prebid.js 9.5.0 → 9.7.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/PULL_REQUEST_TEMPLATE.md +1 -1
- package/.github/release-drafter.yml +4 -0
- package/README.md +4 -4
- package/dist/33acrossAnalyticsAdapter.js +1 -1
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/BTBidAdapter.js +1 -1
- package/dist/adagioAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adagioUtils.js +1 -1
- package/dist/addefendBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelBidAdapter.js +1 -1
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adstirBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgAnalyticsAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/agmaAnalyticsAdapter.js +1 -1
- package/dist/aidemBidAdapter.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/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/bridBidAdapter.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/chunk-core.js +1 -1
- package/dist/cleanmedianetBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectIdSystem.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/connectionInfo.js +1 -0
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantAnalyticsAdapter.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/dailymotionBidAdapter.js +1 -1
- package/dist/dependencies.json +31 -2
- package/dist/docereeAdManagerBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/dxkultureBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/exadsBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/gamoshiBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/greenbidsAnalyticsAdapter.js +1 -1
- package/dist/greenbidsRtdProvider.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hypelabBidAdapter.js +1 -1
- package/dist/id5AnalyticsAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/idImportLibrary.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/intentIqAnalyticsAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/jixieBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/kimberliteBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/luceadBidAdapter.js +1 -1
- package/dist/mabidderBidAdapter.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/medianetAnalyticsAdapter.js +1 -1
- package/dist/medianetBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/missenaBidAdapter.js +1 -1
- package/dist/mobianRtdProvider.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/nobidAnalyticsAdapter.js +1 -1
- package/dist/nobidBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +174 -170
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openwebBidAdapter.js +1 -1
- package/dist/openxBidAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/orbidderBidAdapter.js +1 -1
- package/dist/ortbConverter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/ownadxBidAdapter.js +1 -0
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prismaBidAdapter.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/publirBidAdapter.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pubxaiAnalyticsAdapter.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/retailspotBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/riseUtils.js +1 -0
- 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/smarthubBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/snigelBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/stnBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/tappxBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/telariaBidAdapter.js +1 -1
- package/dist/teqblazeUtils.js +1 -1
- package/dist/terceptAnalyticsAdapter.js +1 -1
- package/dist/themoneytizerBidAdapter.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/uid2IdSystem_shared.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/unrulyBidAdapter.js +1 -1
- package/dist/viantOrtbBidAdapter.js +1 -1
- package/dist/vidazooUtils.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/wurflRtdProvider.js +1 -0
- package/dist/yahooAdsBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/integrationExamples/gpt/wurflRtdProvider_example.html +106 -0
- package/libraries/connectionInfo/connectionUtils.js +33 -0
- package/libraries/ortbConverter/processors/video.js +2 -24
- package/libraries/riseUtils/index.js +331 -0
- package/libraries/teqblazeUtils/bidderUtils.js +15 -11
- package/libraries/vidazooUtils/bidderUtils.js +16 -0
- package/modules/.submodules.json +3 -1
- package/modules/51DegreesRtdProvider.md +11 -7
- package/modules/adagioAnalyticsAdapter.js +101 -84
- package/modules/adagioAnalyticsAdapter.md +4 -0
- package/modules/adagioBidAdapter.js +14 -66
- package/modules/adkernelBidAdapter.js +2 -2
- package/modules/aidemBidAdapter.js +2 -0
- package/modules/appnexusBidAdapter.js +1 -1
- package/modules/cleanmedianetBidAdapter.js +1 -1
- package/modules/connectIdSystem.js +5 -3
- package/modules/dailymotionBidAdapter.js +19 -0
- package/modules/docereeAdManagerBidAdapter.js +9 -12
- package/modules/gamoshiBidAdapter.js +1 -1
- package/modules/greenbidsAnalyticsAdapter.js +7 -4
- package/modules/greenbidsRtdProvider.js +15 -5
- package/modules/id5IdSystem.js +14 -93
- package/modules/idImportLibrary.js +14 -6
- package/modules/insticatorBidAdapter.js +35 -31
- package/modules/kargoBidAdapter.js +11 -14
- package/modules/kimberliteBidAdapter.js +24 -7
- package/modules/kimberliteBidAdapter.md +30 -1
- package/modules/minutemediaBidAdapter.js +21 -398
- package/modules/mobianRtdProvider.js +28 -14
- package/modules/nexx360BidAdapter.js +3 -2
- package/modules/openwebBidAdapter.js +18 -396
- package/modules/ownadxBidAdapter.js +99 -0
- package/modules/prismaBidAdapter.js +1 -27
- package/modules/publirBidAdapter.js +20 -273
- package/modules/pubmaticBidAdapter.js +2 -1
- package/modules/resetdigitalBidAdapter.md +54 -45
- package/modules/riseBidAdapter.js +19 -400
- package/modules/sharethroughBidAdapter.js +5 -0
- package/modules/shinezBidAdapter.js +17 -361
- package/modules/smarthubBidAdapter.js +45 -177
- package/modules/stnBidAdapter.js +22 -398
- package/modules/telariaBidAdapter.js +2 -32
- package/modules/ttdBidAdapter.js +14 -32
- package/modules/uid2IdSystem_shared.js +51 -39
- package/modules/viantOrtbBidAdapter.js +1 -1
- package/modules/wurflRtdProvider.js +213 -0
- package/modules/wurflRtdProvider.md +67 -0
- package/package.json +1 -1
- package/src/adloader.js +1 -0
- package/src/prebid.js +6 -1
- package/src/video.js +78 -1
- package/test/spec/modules/adagioAnalyticsAdapter_spec.js +231 -141
- package/test/spec/modules/adagioBidAdapter_spec.js +32 -67
- package/test/spec/modules/appnexusBidAdapter_spec.js +0 -33
- package/test/spec/modules/cleanmedianetBidAdapter_spec.js +1 -1
- package/test/spec/modules/connectIdSystem_spec.js +27 -28
- package/test/spec/modules/dailymotionBidAdapter_spec.js +50 -0
- package/test/spec/modules/docereeAdManagerBidAdapter_spec.js +1 -0
- package/test/spec/modules/gamoshiBidAdapter_spec.js +1 -1
- package/test/spec/modules/id5IdSystem_spec.js +25 -98
- package/test/spec/modules/idImportLibrary_spec.js +14 -0
- package/test/spec/modules/insticatorBidAdapter_spec.js +8 -1
- package/test/spec/modules/kargoBidAdapter_spec.js +7 -8
- package/test/spec/modules/kimberliteBidAdapter_spec.js +137 -65
- package/test/spec/modules/mobianRtdProvider_spec.js +46 -43
- package/test/spec/modules/nexx360BidAdapter_spec.js +1 -1
- package/test/spec/modules/ownadxBidAdapter_spec.js +103 -0
- package/test/spec/modules/pubmaticBidAdapter_spec.js +18 -0
- package/test/spec/modules/sharethroughBidAdapter_spec.js +35 -0
- package/test/spec/modules/smarthubBidAdapter_spec.js +6 -4
- package/test/spec/modules/ttdBidAdapter_spec.js +10 -1
- package/test/spec/modules/viantOrtbBidAdapter_spec.js +1 -1
- package/test/spec/modules/vidazooBidAdapter_spec.js +12 -4
- package/test/spec/modules/wurflRtdProvider_spec.js +324 -0
- package/test/spec/unit/pbjs_api_spec.js +11 -0
- package/test/spec/video_spec.js +103 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
2
2
|
import { VIDEO } from '../src/mediaTypes.js';
|
|
3
3
|
import { deepAccess } from '../src/utils.js';
|
|
4
|
+
import { config } from '../src/config.js';
|
|
5
|
+
import { userSync } from '../src/userSync.js';
|
|
4
6
|
|
|
5
7
|
/**
|
|
6
8
|
* Get video metadata from bid request
|
|
@@ -90,6 +92,22 @@ function getVideoMetadata(bidRequest, bidderRequest) {
|
|
|
90
92
|
return videoMetadata;
|
|
91
93
|
}
|
|
92
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Check if user sync is enabled for Dailymotion
|
|
97
|
+
*
|
|
98
|
+
* @return boolean True if user sync is enabled
|
|
99
|
+
*/
|
|
100
|
+
function isUserSyncEnabled() {
|
|
101
|
+
const syncEnabled = deepAccess(config.getConfig('userSync'), 'syncEnabled');
|
|
102
|
+
|
|
103
|
+
if (!syncEnabled) return false;
|
|
104
|
+
|
|
105
|
+
const canSyncWithIframe = userSync.canBidderRegisterSync('iframe', 'dailymotion');
|
|
106
|
+
const canSyncWithPixel = userSync.canBidderRegisterSync('image', 'dailymotion');
|
|
107
|
+
|
|
108
|
+
return !!(canSyncWithIframe || canSyncWithPixel);
|
|
109
|
+
}
|
|
110
|
+
|
|
93
111
|
export const spec = {
|
|
94
112
|
code: 'dailymotion',
|
|
95
113
|
gvlid: 573,
|
|
@@ -189,6 +207,7 @@ export const spec = {
|
|
|
189
207
|
atts: deepAccess(bidderRequest, 'ortb2.device.ext.atts', 0),
|
|
190
208
|
},
|
|
191
209
|
} : {}),
|
|
210
|
+
userSyncEnabled: isUserSyncEnabled(),
|
|
192
211
|
request: {
|
|
193
212
|
adUnitCode: deepAccess(bid, 'adUnitCode', ''),
|
|
194
213
|
auctionId: deepAccess(bid, 'auctionId', ''),
|
|
@@ -74,16 +74,11 @@ function getPayload(bid, userData) {
|
|
|
74
74
|
if (!userData || !bid) {
|
|
75
75
|
return false;
|
|
76
76
|
}
|
|
77
|
-
|
|
78
77
|
const { bidId, params } = bid;
|
|
79
78
|
const { placementId } = params;
|
|
80
79
|
const {
|
|
81
80
|
userid,
|
|
82
|
-
email,
|
|
83
|
-
firstname,
|
|
84
|
-
lastname,
|
|
85
81
|
specialization,
|
|
86
|
-
hcpid,
|
|
87
82
|
gender,
|
|
88
83
|
city,
|
|
89
84
|
state,
|
|
@@ -94,16 +89,17 @@ function getPayload(bid, userData) {
|
|
|
94
89
|
hashedmobile,
|
|
95
90
|
country,
|
|
96
91
|
organization,
|
|
97
|
-
|
|
92
|
+
platformUid,
|
|
93
|
+
mobile
|
|
98
94
|
} = userData;
|
|
99
95
|
|
|
100
96
|
const data = {
|
|
101
|
-
userid: userid || '',
|
|
102
|
-
email:
|
|
103
|
-
firstname:
|
|
104
|
-
lastname:
|
|
97
|
+
userid: platformUid || userid || '',
|
|
98
|
+
email: '',
|
|
99
|
+
firstname: '',
|
|
100
|
+
lastname: '',
|
|
105
101
|
specialization: specialization || '',
|
|
106
|
-
hcpid:
|
|
102
|
+
hcpid: '',
|
|
107
103
|
gender: gender || '',
|
|
108
104
|
city: city || '',
|
|
109
105
|
state: state || '',
|
|
@@ -117,8 +113,9 @@ function getPayload(bid, userData) {
|
|
|
117
113
|
hashedmobile: hashedmobile || '',
|
|
118
114
|
country: country || '',
|
|
119
115
|
organization: organization || '',
|
|
120
|
-
dob:
|
|
116
|
+
dob: '',
|
|
121
117
|
userconsent: 1,
|
|
118
|
+
mobile: mobile || ''
|
|
122
119
|
};
|
|
123
120
|
return {
|
|
124
121
|
data,
|
|
@@ -157,7 +157,7 @@ export const spec = {
|
|
|
157
157
|
maxduration: bidRequest.mediaTypes.video.maxduration,
|
|
158
158
|
api: bidRequest.mediaTypes.video.api,
|
|
159
159
|
skip: bidRequest.mediaTypes.video.skip || bidRequest.params.video.skip,
|
|
160
|
-
|
|
160
|
+
plcmt: bidRequest.mediaTypes.video.plcmt || bidRequest.params.video.plcmt,
|
|
161
161
|
minduration: bidRequest.mediaTypes.video.minduration || bidRequest.params.video.minduration,
|
|
162
162
|
playbackmethod: bidRequest.mediaTypes.video.playbackmethod || bidRequest.params.video.playbackmethod,
|
|
163
163
|
startdelay: bidRequest.mediaTypes.video.startdelay || bidRequest.params.video.startdelay
|
|
@@ -6,7 +6,7 @@ import {deepClone, generateUUID, logError, logInfo, logWarn, getParameterByName}
|
|
|
6
6
|
|
|
7
7
|
const analyticsType = 'endpoint';
|
|
8
8
|
|
|
9
|
-
export const ANALYTICS_VERSION = '2.3.
|
|
9
|
+
export const ANALYTICS_VERSION = '2.3.1';
|
|
10
10
|
|
|
11
11
|
const ANALYTICS_SERVER = 'https://a.greenbids.ai';
|
|
12
12
|
|
|
@@ -197,9 +197,12 @@ export const greenbidsAnalyticsAdapter = Object.assign(adapter({ANALYTICS_SERVER
|
|
|
197
197
|
},
|
|
198
198
|
handleAuctionEnd(auctionEndArgs) {
|
|
199
199
|
const cachedAuction = this.getCachedAuction(auctionEndArgs.auctionId);
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
200
|
+
const isFilteringForced = getParameterByName('greenbids_force_filtering');
|
|
201
|
+
if (!isFilteringForced) {
|
|
202
|
+
this.sendEventMessage('/',
|
|
203
|
+
this.createBidMessage(auctionEndArgs, cachedAuction)
|
|
204
|
+
)
|
|
205
|
+
};
|
|
203
206
|
},
|
|
204
207
|
handleBidTimeout(timeoutBids) {
|
|
205
208
|
timeoutBids.forEach((bid) => {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { logError, deepClone, generateUUID, deepSetValue, deepAccess } from '../src/utils.js';
|
|
1
|
+
import { logError, logInfo, logWarn, deepClone, generateUUID, deepSetValue, deepAccess, getParameterByName } from '../src/utils.js';
|
|
2
2
|
import { ajax } from '../src/ajax.js';
|
|
3
3
|
import { submodule } from '../src/hook.js';
|
|
4
4
|
import * as events from '../src/events.js';
|
|
5
5
|
import { EVENTS } from '../src/constants.js';
|
|
6
6
|
|
|
7
7
|
const MODULE_NAME = 'greenbidsRtdProvider';
|
|
8
|
-
const MODULE_VERSION = '2.0.
|
|
8
|
+
const MODULE_VERSION = '2.0.1';
|
|
9
9
|
const ENDPOINT = 'https://t.greenbids.ai';
|
|
10
10
|
|
|
11
11
|
const rtdOptions = {};
|
|
@@ -46,6 +46,7 @@ function getBidRequestData(reqBidsConfigObj, callback, config, userConsent) {
|
|
|
46
46
|
function createPromise(reqBidsConfigObj, greenbidsId) {
|
|
47
47
|
return new Promise((resolve) => {
|
|
48
48
|
const timeoutId = setTimeout(() => {
|
|
49
|
+
logWarn('GreenbidsRtdProvider: Greenbids API timeout, skipping shaping');
|
|
49
50
|
resolve(reqBidsConfigObj);
|
|
50
51
|
}, rtdOptions.timeout);
|
|
51
52
|
ajax(
|
|
@@ -57,6 +58,7 @@ function createPromise(reqBidsConfigObj, greenbidsId) {
|
|
|
57
58
|
},
|
|
58
59
|
error: () => {
|
|
59
60
|
clearTimeout(timeoutId);
|
|
61
|
+
logWarn('GreenbidsRtdProvider: Greenbids API response error, skipping shaping');
|
|
60
62
|
resolve(reqBidsConfigObj);
|
|
61
63
|
},
|
|
62
64
|
},
|
|
@@ -73,11 +75,16 @@ function createPromise(reqBidsConfigObj, greenbidsId) {
|
|
|
73
75
|
|
|
74
76
|
function processSuccessResponse(response, timeoutId, reqBidsConfigObj, greenbidsId) {
|
|
75
77
|
clearTimeout(timeoutId);
|
|
76
|
-
|
|
77
|
-
|
|
78
|
+
try {
|
|
79
|
+
const responseAdUnits = JSON.parse(response);
|
|
80
|
+
updateAdUnitsBasedOnResponse(reqBidsConfigObj.adUnits, responseAdUnits, greenbidsId);
|
|
81
|
+
} catch (e) {
|
|
82
|
+
logWarn('GreenbidsRtdProvider: Greenbids API response parsing error, skipping shaping');
|
|
83
|
+
}
|
|
78
84
|
}
|
|
79
85
|
|
|
80
86
|
function updateAdUnitsBasedOnResponse(adUnits, responseAdUnits, greenbidsId) {
|
|
87
|
+
const isFilteringForced = getParameterByName('greenbids_force_filtering');
|
|
81
88
|
adUnits.forEach((adUnit) => {
|
|
82
89
|
const matchingAdUnit = findMatchingAdUnit(responseAdUnits, adUnit.code);
|
|
83
90
|
if (matchingAdUnit) {
|
|
@@ -86,7 +93,10 @@ function updateAdUnitsBasedOnResponse(adUnits, responseAdUnits, greenbidsId) {
|
|
|
86
93
|
keptInAuction: matchingAdUnit.bidders,
|
|
87
94
|
isExploration: matchingAdUnit.isExploration
|
|
88
95
|
});
|
|
89
|
-
if (
|
|
96
|
+
if (isFilteringForced) {
|
|
97
|
+
adUnit.bids = [];
|
|
98
|
+
logInfo('Greenbids Rtd: filtering flag detected, forcing filtering of Rtd module.');
|
|
99
|
+
} else if (!matchingAdUnit.isExploration) {
|
|
90
100
|
removeFalseBidders(adUnit, matchingAdUnit);
|
|
91
101
|
}
|
|
92
102
|
}
|
package/modules/id5IdSystem.js
CHANGED
|
@@ -13,14 +13,13 @@ import {
|
|
|
13
13
|
isPlainObject,
|
|
14
14
|
logError,
|
|
15
15
|
logInfo,
|
|
16
|
-
logWarn
|
|
17
|
-
safeJSONParse
|
|
16
|
+
logWarn
|
|
18
17
|
} from '../src/utils.js';
|
|
19
18
|
import {fetch} from '../src/ajax.js';
|
|
20
19
|
import {submodule} from '../src/hook.js';
|
|
21
20
|
import {getRefererInfo} from '../src/refererDetection.js';
|
|
22
21
|
import {getStorageManager} from '../src/storageManager.js';
|
|
23
|
-
import {
|
|
22
|
+
import {gppDataHandler, uspDataHandler} from '../src/adapterManager.js';
|
|
24
23
|
import {MODULE_TYPE_UID} from '../src/activities/modules.js';
|
|
25
24
|
import {GreedyPromise} from '../src/utils/promise.js';
|
|
26
25
|
import {loadExternalScript} from '../src/adloader.js';
|
|
@@ -34,19 +33,12 @@ import {loadExternalScript} from '../src/adloader.js';
|
|
|
34
33
|
|
|
35
34
|
const MODULE_NAME = 'id5Id';
|
|
36
35
|
const GVLID = 131;
|
|
37
|
-
const NB_EXP_DAYS = 30;
|
|
38
36
|
export const ID5_STORAGE_NAME = 'id5id';
|
|
39
|
-
export const ID5_PRIVACY_STORAGE_NAME = `${ID5_STORAGE_NAME}_privacy`;
|
|
40
|
-
const LOCAL_STORAGE = 'html5';
|
|
41
37
|
const LOG_PREFIX = 'User ID - ID5 submodule: ';
|
|
42
38
|
const ID5_API_CONFIG_URL = 'https://id5-sync.com/api/config/prebid';
|
|
43
39
|
const ID5_DOMAIN = 'id5-sync.com';
|
|
44
40
|
const TRUE_LINK_SOURCE = 'true-link-id5-sync.com';
|
|
45
41
|
|
|
46
|
-
// order the legacy cookie names in reverse priority order so the last
|
|
47
|
-
// cookie in the array is the most preferred to use
|
|
48
|
-
const LEGACY_COOKIE_NAMES = ['pbjs-id5id', 'id5id.1st', 'id5id'];
|
|
49
|
-
|
|
50
42
|
export const storage = getStorageManager({moduleType: MODULE_TYPE_UID, moduleName: MODULE_NAME});
|
|
51
43
|
|
|
52
44
|
/**
|
|
@@ -231,7 +223,7 @@ export const id5IdSubmodule = {
|
|
|
231
223
|
* @param {SubmoduleConfig} config
|
|
232
224
|
* @param {ConsentData|undefined} consentData
|
|
233
225
|
* @param {Object} cacheIdObj - existing id, if any
|
|
234
|
-
* @return {
|
|
226
|
+
* @return {IdResponse} A response object that contains id.
|
|
235
227
|
*/
|
|
236
228
|
extendId(config, consentData, cacheIdObj) {
|
|
237
229
|
if (!hasWriteConsentToLocalStorage(consentData)) {
|
|
@@ -239,10 +231,10 @@ export const id5IdSubmodule = {
|
|
|
239
231
|
return cacheIdObj;
|
|
240
232
|
}
|
|
241
233
|
|
|
242
|
-
const partnerId = validateConfig(config) ? config.params.partner : 0;
|
|
243
|
-
incrementNb(partnerId);
|
|
244
|
-
|
|
245
234
|
logInfo(LOG_PREFIX + 'using cached ID', cacheIdObj);
|
|
235
|
+
if (cacheIdObj) {
|
|
236
|
+
cacheIdObj.nbPage = incrementNb(cacheIdObj)
|
|
237
|
+
}
|
|
246
238
|
return cacheIdObj;
|
|
247
239
|
},
|
|
248
240
|
eids: {
|
|
@@ -401,8 +393,8 @@ export class IdFetchFlow {
|
|
|
401
393
|
const params = this.submoduleConfig.params;
|
|
402
394
|
const hasGdpr = (this.gdprConsentData && typeof this.gdprConsentData.gdprApplies === 'boolean' && this.gdprConsentData.gdprApplies) ? 1 : 0;
|
|
403
395
|
const referer = getRefererInfo();
|
|
404
|
-
const signature =
|
|
405
|
-
const nbPage =
|
|
396
|
+
const signature = this.cacheIdObj ? this.cacheIdObj.signature : undefined;
|
|
397
|
+
const nbPage = incrementNb(this.cacheIdObj);
|
|
406
398
|
const trueLinkInfo = window.id5Bootstrap ? window.id5Bootstrap.getTrueLinkInfo() : {booted: false};
|
|
407
399
|
|
|
408
400
|
const data = {
|
|
@@ -456,7 +448,6 @@ export class IdFetchFlow {
|
|
|
456
448
|
#processFetchCallResponse(fetchCallResponse) {
|
|
457
449
|
try {
|
|
458
450
|
if (fetchCallResponse.privacy) {
|
|
459
|
-
storeInLocalStorage(ID5_PRIVACY_STORAGE_NAME, JSON.stringify(fetchCallResponse.privacy), NB_EXP_DAYS);
|
|
460
451
|
if (window.id5Bootstrap && window.id5Bootstrap.setPrivacy) {
|
|
461
452
|
window.id5Bootstrap.setPrivacy(fetchCallResponse.privacy);
|
|
462
453
|
}
|
|
@@ -507,89 +498,19 @@ function validateConfig(config) {
|
|
|
507
498
|
logError(LOG_PREFIX + 'storage required to be set');
|
|
508
499
|
return false;
|
|
509
500
|
}
|
|
510
|
-
|
|
511
|
-
// in a future release, we may return false if storage type or name are not set as required
|
|
512
|
-
if (config.storage.type !== LOCAL_STORAGE) {
|
|
513
|
-
logWarn(LOG_PREFIX + `storage type recommended to be '${LOCAL_STORAGE}'. In a future release this may become a strict requirement`);
|
|
514
|
-
}
|
|
515
|
-
// in a future release, we may return false if storage type or name are not set as required
|
|
516
501
|
if (config.storage.name !== ID5_STORAGE_NAME) {
|
|
517
|
-
logWarn(LOG_PREFIX + `storage name recommended to be '${ID5_STORAGE_NAME}'
|
|
502
|
+
logWarn(LOG_PREFIX + `storage name recommended to be '${ID5_STORAGE_NAME}'.`);
|
|
518
503
|
}
|
|
519
504
|
|
|
520
505
|
return true;
|
|
521
506
|
}
|
|
522
507
|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
return `${ID5_STORAGE_NAME}_${partnerId}_nb`;
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
export function storeNbInCache(partnerId, nb) {
|
|
532
|
-
storeInLocalStorage(nbCacheName(partnerId), nb, NB_EXP_DAYS);
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
export function getNbFromCache(partnerId) {
|
|
536
|
-
let cacheNb = getFromLocalStorage(nbCacheName(partnerId));
|
|
537
|
-
return (cacheNb) ? parseInt(cacheNb) : 0;
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
function incrementNb(partnerId) {
|
|
541
|
-
const nb = (getNbFromCache(partnerId) + 1);
|
|
542
|
-
storeNbInCache(partnerId, nb);
|
|
543
|
-
return nb;
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
function incrementAndResetNb(partnerId) {
|
|
547
|
-
const result = incrementNb(partnerId);
|
|
548
|
-
storeNbInCache(partnerId, 0);
|
|
549
|
-
return result;
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
function getLegacyCookieSignature() {
|
|
553
|
-
let legacyStoredValue;
|
|
554
|
-
LEGACY_COOKIE_NAMES.forEach(function (cookie) {
|
|
555
|
-
if (storage.getCookie(cookie)) {
|
|
556
|
-
legacyStoredValue = safeJSONParse(storage.getCookie(cookie)) || legacyStoredValue;
|
|
557
|
-
}
|
|
558
|
-
});
|
|
559
|
-
return (legacyStoredValue && legacyStoredValue.signature) || '';
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
/**
|
|
563
|
-
* This will make sure we check for expiration before accessing local storage
|
|
564
|
-
* @param {string} key
|
|
565
|
-
*/
|
|
566
|
-
export function getFromLocalStorage(key) {
|
|
567
|
-
const storedValueExp = storage.getDataFromLocalStorage(`${key}_exp`);
|
|
568
|
-
// empty string means no expiration set
|
|
569
|
-
if (storedValueExp === '') {
|
|
570
|
-
return storage.getDataFromLocalStorage(key);
|
|
571
|
-
} else if (storedValueExp) {
|
|
572
|
-
if ((new Date(storedValueExp)).getTime() - Date.now() > 0) {
|
|
573
|
-
return storage.getDataFromLocalStorage(key);
|
|
574
|
-
}
|
|
508
|
+
function incrementNb(cachedObj) {
|
|
509
|
+
if (cachedObj && cachedObj.nbPage !== undefined) {
|
|
510
|
+
return cachedObj.nbPage + 1;
|
|
511
|
+
} else {
|
|
512
|
+
return 1;
|
|
575
513
|
}
|
|
576
|
-
// if we got here, then we have an expired item or we didn't set an
|
|
577
|
-
// expiration initially somehow, so we need to remove the item from the
|
|
578
|
-
// local storage
|
|
579
|
-
storage.removeDataFromLocalStorage(key);
|
|
580
|
-
return null;
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
/**
|
|
584
|
-
* Ensure that we always set an expiration in local storage since
|
|
585
|
-
* by default it's not required
|
|
586
|
-
* @param {string} key
|
|
587
|
-
* @param {any} value
|
|
588
|
-
* @param {number} expDays
|
|
589
|
-
*/
|
|
590
|
-
export function storeInLocalStorage(key, value, expDays) {
|
|
591
|
-
storage.setDataInLocalStorage(`${key}_exp`, expDaysStr(expDays));
|
|
592
|
-
storage.setDataInLocalStorage(`${key}`, value);
|
|
593
514
|
}
|
|
594
515
|
|
|
595
516
|
/**
|
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
import { logInfo, logError } from '../src/utils.js';
|
|
2
|
-
import {getGlobal} from '../src/prebidGlobal.js';
|
|
3
|
-
import {ajax} from '../src/ajax.js';
|
|
4
|
-
import {config} from '../src/config.js';
|
|
5
1
|
import MD5 from 'crypto-js/md5.js';
|
|
2
|
+
import { ACTIVITY_ENRICH_UFPD } from '../src/activities/activities.js';
|
|
3
|
+
import { activityParams } from '../src/activities/activityParams.js';
|
|
4
|
+
import { MODULE_TYPE_PREBID } from '../src/activities/modules.js';
|
|
5
|
+
import { isActivityAllowed } from '../src/activities/rules.js';
|
|
6
|
+
import { ajax } from '../src/ajax.js';
|
|
7
|
+
import { config } from '../src/config.js';
|
|
8
|
+
import { getGlobal } from '../src/prebidGlobal.js';
|
|
9
|
+
import { logError, logInfo } from '../src/utils.js';
|
|
6
10
|
|
|
7
11
|
let email;
|
|
8
12
|
let conf;
|
|
9
13
|
const LOG_PRE_FIX = 'ID-Library: ';
|
|
10
14
|
const CONF_DEFAULT_OBSERVER_DEBOUNCE_MS = 250;
|
|
11
|
-
const CONF_DEFAULT_FULL_BODY_SCAN = false;
|
|
12
|
-
const CONF_DEFAULT_INPUT_SCAN = false;
|
|
15
|
+
export const CONF_DEFAULT_FULL_BODY_SCAN = false;
|
|
16
|
+
export const CONF_DEFAULT_INPUT_SCAN = false;
|
|
13
17
|
const OBSERVER_CONFIG = {
|
|
14
18
|
subtree: true,
|
|
15
19
|
attributes: true,
|
|
@@ -257,6 +261,10 @@ export function setConfig(config) {
|
|
|
257
261
|
_logError('The required url is not configured');
|
|
258
262
|
return;
|
|
259
263
|
}
|
|
264
|
+
if (!isActivityAllowed(ACTIVITY_ENRICH_UFPD, activityParams(MODULE_TYPE_PREBID, 'idImportLibrary'))) {
|
|
265
|
+
_logError('Permission for id import was denied by CMP');
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
260
268
|
if (typeof config.debounce !== 'number') {
|
|
261
269
|
config.debounce = CONF_DEFAULT_OBSERVER_DEBOUNCE_MS;
|
|
262
270
|
_logInfo('Set default observer debounce to ' + CONF_DEFAULT_OBSERVER_DEBOUNCE_MS);
|
|
@@ -107,19 +107,8 @@ function buildVideo(bidRequest) {
|
|
|
107
107
|
const playerSize = deepAccess(bidRequest, 'mediaTypes.video.playerSize');
|
|
108
108
|
const context = deepAccess(bidRequest, 'mediaTypes.video.context');
|
|
109
109
|
|
|
110
|
-
if (!w && playerSize) {
|
|
111
|
-
|
|
112
|
-
w = parseInt(playerSize[0][0], 10);
|
|
113
|
-
} else if (typeof playerSize[0] === 'number' && !isNaN(playerSize[0])) {
|
|
114
|
-
w = parseInt(playerSize[0], 10);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
if (!h && playerSize) {
|
|
118
|
-
if (Array.isArray(playerSize[0])) {
|
|
119
|
-
h = parseInt(playerSize[0][1], 10);
|
|
120
|
-
} else if (typeof playerSize[1] === 'number' && !isNaN(playerSize[1])) {
|
|
121
|
-
h = parseInt(playerSize[1], 10);
|
|
122
|
-
}
|
|
110
|
+
if (!h && !w && playerSize) {
|
|
111
|
+
({w, h} = parsePlayerSizeToWidthHeight(playerSize, w, h));
|
|
123
112
|
}
|
|
124
113
|
|
|
125
114
|
const bidRequestVideo = deepAccess(bidRequest, 'mediaTypes.video');
|
|
@@ -173,6 +162,14 @@ function buildImpression(bidRequest) {
|
|
|
173
162
|
},
|
|
174
163
|
}
|
|
175
164
|
|
|
165
|
+
if (bidRequest?.params?.adUnitId) {
|
|
166
|
+
deepSetValue(imp, 'ext.prebid.bidder.insticator.adUnitId', bidRequest.params.adUnitId);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (bidRequest?.params?.publisherId) {
|
|
170
|
+
deepSetValue(imp, 'ext.prebid.bidder.insticator.publisherId', bidRequest.params.publisherId);
|
|
171
|
+
}
|
|
172
|
+
|
|
176
173
|
let bidFloor = parseFloat(deepAccess(bidRequest, 'params.floor'));
|
|
177
174
|
|
|
178
175
|
if (!isNaN(bidFloor)) {
|
|
@@ -247,7 +244,7 @@ function buildDevice(bidRequest) {
|
|
|
247
244
|
const device = {
|
|
248
245
|
w: window.innerWidth,
|
|
249
246
|
h: window.innerHeight,
|
|
250
|
-
js:
|
|
247
|
+
js: 1,
|
|
251
248
|
ext: {
|
|
252
249
|
localStorage: storage.localStorageIsEnabled(),
|
|
253
250
|
cookies: storage.cookiesAreEnabled(),
|
|
@@ -569,24 +566,12 @@ function validateVideo(bid) {
|
|
|
569
566
|
let w = deepAccess(bid, 'mediaTypes.video.w');
|
|
570
567
|
let h = deepAccess(bid, 'mediaTypes.video.h');
|
|
571
568
|
const playerSize = deepAccess(bid, 'mediaTypes.video.playerSize');
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
} else if (typeof playerSize[0] === 'number' && !isNaN(playerSize[0])) {
|
|
576
|
-
w = parseInt(playerSize[0], 10);
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
if (!h && playerSize) {
|
|
580
|
-
if (Array.isArray(playerSize[0])) {
|
|
581
|
-
h = parseInt(playerSize[0][1], 10);
|
|
582
|
-
} else if (typeof playerSize[1] === 'number' && !isNaN(playerSize[1])) {
|
|
583
|
-
h = parseInt(playerSize[1], 10);
|
|
584
|
-
}
|
|
569
|
+
|
|
570
|
+
if (!h && !w && playerSize) {
|
|
571
|
+
({w, h} = parsePlayerSizeToWidthHeight(playerSize, w, h));
|
|
585
572
|
}
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
h,
|
|
589
|
-
];
|
|
573
|
+
|
|
574
|
+
const videoSize = [w, h];
|
|
590
575
|
|
|
591
576
|
if (
|
|
592
577
|
!validateSize(videoSize)
|
|
@@ -625,6 +610,25 @@ function validateVideo(bid) {
|
|
|
625
610
|
return true;
|
|
626
611
|
}
|
|
627
612
|
|
|
613
|
+
function parsePlayerSizeToWidthHeight(playerSize, w, h) {
|
|
614
|
+
if (!w && playerSize) {
|
|
615
|
+
if (Array.isArray(playerSize[0])) {
|
|
616
|
+
w = parseInt(playerSize[0][0], 10);
|
|
617
|
+
} else if (typeof playerSize[0] === 'number' && !isNaN(playerSize[0])) {
|
|
618
|
+
w = parseInt(playerSize[0], 10);
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
if (!h && playerSize) {
|
|
622
|
+
if (Array.isArray(playerSize[0])) {
|
|
623
|
+
h = parseInt(playerSize[0][1], 10);
|
|
624
|
+
} else if (typeof playerSize[1] === 'number' && !isNaN(playerSize[1])) {
|
|
625
|
+
h = parseInt(playerSize[1], 10);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
return { w, h };
|
|
630
|
+
}
|
|
631
|
+
|
|
628
632
|
export const spec = {
|
|
629
633
|
code: BIDDER_CODE,
|
|
630
634
|
gvlid: GVLID,
|
|
@@ -48,7 +48,7 @@ const SUA_ATTRIBUTES = [
|
|
|
48
48
|
|
|
49
49
|
const CERBERUS = Object.freeze({
|
|
50
50
|
KEY: 'krg_crb',
|
|
51
|
-
SYNC_URL: 'https://crb.kargo.com/api/v1/initsyncrnd/{UUID}?seed={SEED}&
|
|
51
|
+
SYNC_URL: 'https://crb.kargo.com/api/v1/initsyncrnd/{UUID}?seed={SEED}&gdpr={GDPR}&gdpr_consent={GDPR_CONSENT}&us_privacy={US_PRIVACY}&gpp={GPP_STRING}&gpp_sid={GPP_SID}',
|
|
52
52
|
SYNC_COUNT: 5,
|
|
53
53
|
PAGE_VIEW_ID: 'pageViewId',
|
|
54
54
|
PAGE_VIEW_TIMESTAMP: 'pageViewTimestamp',
|
|
@@ -274,19 +274,16 @@ function getUserSyncs(syncOptions, _, gdprConsent, usPrivacy, gppConsent) {
|
|
|
274
274
|
return syncs;
|
|
275
275
|
}
|
|
276
276
|
if (syncOptions.iframeEnabled && seed && clientId) {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
.replace('{GPP_SID}', gppApplicableSections)
|
|
288
|
-
});
|
|
289
|
-
}
|
|
277
|
+
syncs.push({
|
|
278
|
+
type: 'iframe',
|
|
279
|
+
url: CERBERUS.SYNC_URL.replace('{UUID}', clientId)
|
|
280
|
+
.replace('{SEED}', seed)
|
|
281
|
+
.replace('{GDPR}', gdpr)
|
|
282
|
+
.replace('{GDPR_CONSENT}', gdprConsentString)
|
|
283
|
+
.replace('{US_PRIVACY}', usPrivacy || '')
|
|
284
|
+
.replace('{GPP_STRING}', gppString)
|
|
285
|
+
.replace('{GPP_SID}', gppApplicableSections)
|
|
286
|
+
})
|
|
290
287
|
}
|
|
291
288
|
return syncs;
|
|
292
289
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
2
|
-
import { BANNER } from '../src/mediaTypes.js';
|
|
2
|
+
import { BANNER, VIDEO } from '../src/mediaTypes.js';
|
|
3
3
|
import { ortbConverter } from '../libraries/ortbConverter/converter.js'
|
|
4
4
|
import { deepSetValue } from '../src/utils.js';
|
|
5
|
+
import {ORTB_MTYPES} from '../libraries/ortbConverter/processors/mediaType.js';
|
|
5
6
|
|
|
6
|
-
const VERSION = '1.
|
|
7
|
+
const VERSION = '1.1.0';
|
|
7
8
|
|
|
8
9
|
const BIDDER_CODE = 'kimberlite';
|
|
9
10
|
const METHOD = 'POST';
|
|
10
|
-
const ENDPOINT_URL = 'https://kimberlite.io/rtb/bid/pbjs';
|
|
11
|
+
export const ENDPOINT_URL = 'https://kimberlite.io/rtb/bid/pbjs';
|
|
11
12
|
|
|
12
13
|
const VERSION_INFO = {
|
|
13
14
|
ver: '$prebid.version$',
|
|
@@ -16,7 +17,6 @@ const VERSION_INFO = {
|
|
|
16
17
|
|
|
17
18
|
const converter = ortbConverter({
|
|
18
19
|
context: {
|
|
19
|
-
mediaType: BANNER,
|
|
20
20
|
netRevenue: true,
|
|
21
21
|
ttl: 300
|
|
22
22
|
},
|
|
@@ -35,18 +35,32 @@ const converter = ortbConverter({
|
|
|
35
35
|
const imp = buildImp(bidRequest, context);
|
|
36
36
|
imp.tagid = bidRequest.params.placementId;
|
|
37
37
|
return imp;
|
|
38
|
-
}
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
bidResponse: function (buildBidResponse, bid, context) {
|
|
41
|
+
if (!bid.price) return;
|
|
42
|
+
|
|
43
|
+
const [type] = Object.keys(context.bidRequest.mediaTypes);
|
|
44
|
+
if (Object.values(ORTB_MTYPES).includes(type)) {
|
|
45
|
+
context.mediaType = type;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const bidResponse = buildBidResponse(bid, context);
|
|
49
|
+
return bidResponse;
|
|
50
|
+
},
|
|
39
51
|
});
|
|
40
52
|
|
|
41
53
|
export const spec = {
|
|
42
54
|
code: BIDDER_CODE,
|
|
43
|
-
supportedMediaTypes: [BANNER],
|
|
55
|
+
supportedMediaTypes: [BANNER, VIDEO],
|
|
44
56
|
|
|
45
57
|
isBidRequestValid: (bidRequest = {}) => {
|
|
46
58
|
const { params, mediaTypes } = bidRequest;
|
|
47
59
|
let isValid = Boolean(params && params.placementId);
|
|
48
60
|
if (mediaTypes && mediaTypes[BANNER]) {
|
|
49
61
|
isValid = isValid && Boolean(mediaTypes[BANNER].sizes);
|
|
62
|
+
} else if (mediaTypes && mediaTypes[VIDEO]) {
|
|
63
|
+
isValid = isValid && Boolean(mediaTypes[VIDEO].mimes);
|
|
50
64
|
} else {
|
|
51
65
|
isValid = false;
|
|
52
66
|
}
|
|
@@ -58,7 +72,10 @@ export const spec = {
|
|
|
58
72
|
return {
|
|
59
73
|
method: METHOD,
|
|
60
74
|
url: ENDPOINT_URL,
|
|
61
|
-
data: converter.toORTB({
|
|
75
|
+
data: converter.toORTB({
|
|
76
|
+
bidRequests,
|
|
77
|
+
bidderRequest
|
|
78
|
+
})
|
|
62
79
|
}
|
|
63
80
|
},
|
|
64
81
|
|
|
@@ -20,7 +20,7 @@ var adUnits = [
|
|
|
20
20
|
code: 'test-div',
|
|
21
21
|
mediaTypes: {
|
|
22
22
|
banner: {
|
|
23
|
-
sizes: [[320, 250], [640, 480]],
|
|
23
|
+
sizes: [[320, 250], [640, 480]], // Required.
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
bids: [
|
|
@@ -34,3 +34,32 @@ var adUnits = [
|
|
|
34
34
|
}
|
|
35
35
|
]
|
|
36
36
|
```
|
|
37
|
+
|
|
38
|
+
## Video AdUnit
|
|
39
|
+
|
|
40
|
+
```javascript
|
|
41
|
+
var adUnits = [
|
|
42
|
+
{
|
|
43
|
+
code: 'test-div',
|
|
44
|
+
mediaTypes: {
|
|
45
|
+
video: {
|
|
46
|
+
// ORTB 2.5 options.
|
|
47
|
+
mimes: ['video/mp4'], // Required.
|
|
48
|
+
// Other options are optional.
|
|
49
|
+
placement: 1,
|
|
50
|
+
protocols: [3, 6],
|
|
51
|
+
linearity: 1,
|
|
52
|
+
startdelay: 0
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
bids: [
|
|
56
|
+
{
|
|
57
|
+
bidder: "kimberlite",
|
|
58
|
+
params: {
|
|
59
|
+
placementId: 'testVideo'
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
```
|