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
|
@@ -2,33 +2,28 @@ import {
|
|
|
2
2
|
logWarn,
|
|
3
3
|
logInfo,
|
|
4
4
|
isArray,
|
|
5
|
-
isFn,
|
|
6
5
|
deepAccess,
|
|
7
|
-
isEmpty,
|
|
8
|
-
contains,
|
|
9
|
-
timestamp,
|
|
10
6
|
triggerPixel,
|
|
11
|
-
isInteger,
|
|
12
|
-
getBidIdParameter
|
|
13
7
|
} from '../src/utils.js';
|
|
14
|
-
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
15
|
-
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
16
|
-
import {
|
|
8
|
+
import { registerBidder } from '../src/adapters/bidderFactory.js';
|
|
9
|
+
import { BANNER, VIDEO } from '../src/mediaTypes.js';
|
|
10
|
+
import {
|
|
11
|
+
getEndpoint,
|
|
12
|
+
generateBidsParams,
|
|
13
|
+
generateGeneralParams,
|
|
14
|
+
buildBidResponse,
|
|
15
|
+
} from '../libraries/riseUtils/index.js';
|
|
17
16
|
|
|
18
17
|
const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
|
|
19
18
|
const BIDDER_CODE = 'minutemedia';
|
|
20
19
|
const ADAPTER_VERSION = '6.0.0';
|
|
21
20
|
const TTL = 360;
|
|
22
21
|
const DEFAULT_CURRENCY = 'USD';
|
|
23
|
-
const
|
|
22
|
+
const BASE_URL = 'https://hb.minutemedia-prebid.com/';
|
|
24
23
|
const MODES = {
|
|
25
24
|
PRODUCTION: 'hb-mm-multi',
|
|
26
25
|
TEST: 'hb-multi-mm-test'
|
|
27
|
-
}
|
|
28
|
-
const SUPPORTED_SYNC_METHODS = {
|
|
29
|
-
IFRAME: 'iframe',
|
|
30
|
-
PIXEL: 'pixel'
|
|
31
|
-
}
|
|
26
|
+
};
|
|
32
27
|
|
|
33
28
|
export const spec = {
|
|
34
29
|
code: BIDDER_CODE,
|
|
@@ -51,50 +46,24 @@ export const spec = {
|
|
|
51
46
|
buildRequests: function (validBidRequests, bidderRequest) {
|
|
52
47
|
const combinedRequestsObject = {};
|
|
53
48
|
|
|
54
|
-
// use data from the first bid, to create the general params for all bids
|
|
55
49
|
const generalObject = validBidRequests[0];
|
|
56
50
|
const testMode = generalObject.params.testMode;
|
|
57
51
|
|
|
58
|
-
combinedRequestsObject.params = generateGeneralParams(generalObject, bidderRequest);
|
|
52
|
+
combinedRequestsObject.params = generateGeneralParams(generalObject, bidderRequest, ADAPTER_VERSION);
|
|
59
53
|
combinedRequestsObject.bids = generateBidsParams(validBidRequests, bidderRequest);
|
|
60
54
|
|
|
61
55
|
return {
|
|
62
56
|
method: 'POST',
|
|
63
|
-
url: getEndpoint(testMode),
|
|
57
|
+
url: getEndpoint(testMode, BASE_URL, MODES),
|
|
64
58
|
data: combinedRequestsObject
|
|
65
|
-
}
|
|
59
|
+
};
|
|
66
60
|
},
|
|
67
|
-
interpretResponse: function ({body}) {
|
|
61
|
+
interpretResponse: function ({ body }) {
|
|
68
62
|
const bidResponses = [];
|
|
69
63
|
|
|
70
64
|
if (body.bids) {
|
|
71
65
|
body.bids.forEach(adUnit => {
|
|
72
|
-
const bidResponse =
|
|
73
|
-
requestId: adUnit.requestId,
|
|
74
|
-
cpm: adUnit.cpm,
|
|
75
|
-
currency: adUnit.currency || DEFAULT_CURRENCY,
|
|
76
|
-
width: adUnit.width,
|
|
77
|
-
height: adUnit.height,
|
|
78
|
-
ttl: adUnit.ttl || TTL,
|
|
79
|
-
creativeId: adUnit.creativeId,
|
|
80
|
-
netRevenue: adUnit.netRevenue || true,
|
|
81
|
-
nurl: adUnit.nurl,
|
|
82
|
-
mediaType: adUnit.mediaType,
|
|
83
|
-
meta: {
|
|
84
|
-
mediaType: adUnit.mediaType
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
if (adUnit.mediaType === VIDEO) {
|
|
89
|
-
bidResponse.vastXml = adUnit.vastXml;
|
|
90
|
-
} else if (adUnit.mediaType === BANNER) {
|
|
91
|
-
bidResponse.ad = adUnit.ad;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if (adUnit.adomain && adUnit.adomain.length) {
|
|
95
|
-
bidResponse.meta.advertiserDomains = adUnit.adomain;
|
|
96
|
-
}
|
|
97
|
-
|
|
66
|
+
const bidResponse = buildBidResponse(adUnit, DEFAULT_CURRENCY, TTL, VIDEO, BANNER);
|
|
98
67
|
bidResponses.push(bidResponse);
|
|
99
68
|
});
|
|
100
69
|
}
|
|
@@ -104,20 +73,20 @@ export const spec = {
|
|
|
104
73
|
getUserSyncs: function (syncOptions, serverResponses) {
|
|
105
74
|
const syncs = [];
|
|
106
75
|
for (const response of serverResponses) {
|
|
107
|
-
if (syncOptions.iframeEnabled && response
|
|
76
|
+
if (syncOptions.iframeEnabled && deepAccess(response, 'body.params.userSyncURL')) {
|
|
108
77
|
syncs.push({
|
|
109
78
|
type: 'iframe',
|
|
110
|
-
url: response
|
|
79
|
+
url: deepAccess(response, 'body.params.userSyncURL')
|
|
111
80
|
});
|
|
112
81
|
}
|
|
113
|
-
if (syncOptions.pixelEnabled && isArray(response
|
|
82
|
+
if (syncOptions.pixelEnabled && isArray(deepAccess(response, 'body.params.userSyncPixels'))) {
|
|
114
83
|
const pixels = response.body.params.userSyncPixels.map(pixel => {
|
|
115
84
|
return {
|
|
116
85
|
type: 'image',
|
|
117
86
|
url: pixel
|
|
118
|
-
}
|
|
119
|
-
})
|
|
120
|
-
syncs.push(...pixels)
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
syncs.push(...pixels);
|
|
121
90
|
}
|
|
122
91
|
}
|
|
123
92
|
return syncs;
|
|
@@ -135,349 +104,3 @@ export const spec = {
|
|
|
135
104
|
};
|
|
136
105
|
|
|
137
106
|
registerBidder(spec);
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Get floor price
|
|
141
|
-
* @param bid {bid}
|
|
142
|
-
* @returns {Number}
|
|
143
|
-
*/
|
|
144
|
-
function getFloor(bid, mediaType) {
|
|
145
|
-
if (!isFn(bid.getFloor)) {
|
|
146
|
-
return 0;
|
|
147
|
-
}
|
|
148
|
-
let floorResult = bid.getFloor({
|
|
149
|
-
currency: DEFAULT_CURRENCY,
|
|
150
|
-
mediaType: mediaType,
|
|
151
|
-
size: '*'
|
|
152
|
-
});
|
|
153
|
-
return floorResult.currency === DEFAULT_CURRENCY && floorResult.floor ? floorResult.floor : 0;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Get the the ad sizes array from the bid
|
|
158
|
-
* @param bid {bid}
|
|
159
|
-
* @returns {Array}
|
|
160
|
-
*/
|
|
161
|
-
function getSizesArray(bid, mediaType) {
|
|
162
|
-
let sizesArray = []
|
|
163
|
-
|
|
164
|
-
if (deepAccess(bid, `mediaTypes.${mediaType}.sizes`)) {
|
|
165
|
-
sizesArray = bid.mediaTypes[mediaType].sizes;
|
|
166
|
-
} else if (Array.isArray(bid.sizes) && bid.sizes.length > 0) {
|
|
167
|
-
sizesArray = bid.sizes;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
return sizesArray;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Get schain string value
|
|
175
|
-
* @param schainObject {Object}
|
|
176
|
-
* @returns {string}
|
|
177
|
-
*/
|
|
178
|
-
function getSupplyChain(schainObject) {
|
|
179
|
-
if (isEmpty(schainObject)) {
|
|
180
|
-
return '';
|
|
181
|
-
}
|
|
182
|
-
let scStr = `${schainObject.ver},${schainObject.complete}`;
|
|
183
|
-
schainObject.nodes.forEach((node) => {
|
|
184
|
-
scStr += '!';
|
|
185
|
-
scStr += `${getEncodedValIfNotEmpty(node.asi)},`;
|
|
186
|
-
scStr += `${getEncodedValIfNotEmpty(node.sid)},`;
|
|
187
|
-
scStr += `${node.hp ? encodeURIComponent(node.hp) : ''},`;
|
|
188
|
-
scStr += `${getEncodedValIfNotEmpty(node.rid)},`;
|
|
189
|
-
scStr += `${getEncodedValIfNotEmpty(node.name)},`;
|
|
190
|
-
scStr += `${getEncodedValIfNotEmpty(node.domain)}`;
|
|
191
|
-
});
|
|
192
|
-
return scStr;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Get encoded node value
|
|
197
|
-
* @param val {string}
|
|
198
|
-
* @returns {string}
|
|
199
|
-
*/
|
|
200
|
-
function getEncodedValIfNotEmpty(val) {
|
|
201
|
-
return !isEmpty(val) ? encodeURIComponent(val) : '';
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Get preferred user-sync method based on publisher configuration
|
|
206
|
-
* @param bidderCode {string}
|
|
207
|
-
* @returns {string}
|
|
208
|
-
*/
|
|
209
|
-
function getAllowedSyncMethod(filterSettings, bidderCode) {
|
|
210
|
-
const iframeConfigsToCheck = ['all', 'iframe'];
|
|
211
|
-
const pixelConfigToCheck = 'image';
|
|
212
|
-
if (filterSettings && iframeConfigsToCheck.some(config => isSyncMethodAllowed(filterSettings[config], bidderCode))) {
|
|
213
|
-
return SUPPORTED_SYNC_METHODS.IFRAME;
|
|
214
|
-
}
|
|
215
|
-
if (!filterSettings || !filterSettings[pixelConfigToCheck] || isSyncMethodAllowed(filterSettings[pixelConfigToCheck], bidderCode)) {
|
|
216
|
-
return SUPPORTED_SYNC_METHODS.PIXEL;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Check if sync rule is supported
|
|
222
|
-
* @param syncRule {Object}
|
|
223
|
-
* @param bidderCode {string}
|
|
224
|
-
* @returns {boolean}
|
|
225
|
-
*/
|
|
226
|
-
function isSyncMethodAllowed(syncRule, bidderCode) {
|
|
227
|
-
if (!syncRule) {
|
|
228
|
-
return false;
|
|
229
|
-
}
|
|
230
|
-
const isInclude = syncRule.filter === 'include';
|
|
231
|
-
const bidders = isArray(syncRule.bidders) ? syncRule.bidders : [bidderCode];
|
|
232
|
-
return isInclude && contains(bidders, bidderCode);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* Get the seller endpoint
|
|
237
|
-
* @param testMode {boolean}
|
|
238
|
-
* @returns {string}
|
|
239
|
-
*/
|
|
240
|
-
function getEndpoint(testMode) {
|
|
241
|
-
return testMode
|
|
242
|
-
? SELLER_ENDPOINT + MODES.TEST
|
|
243
|
-
: SELLER_ENDPOINT + MODES.PRODUCTION;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* get device type
|
|
248
|
-
* @param uad {ua}
|
|
249
|
-
* @returns {string}
|
|
250
|
-
*/
|
|
251
|
-
function getDeviceType(ua) {
|
|
252
|
-
if (/ipad|android 3.0|xoom|sch-i800|playbook|tablet|kindle/i
|
|
253
|
-
.test(ua.toLowerCase())) {
|
|
254
|
-
return '5';
|
|
255
|
-
}
|
|
256
|
-
if (/iphone|ipod|android|blackberry|opera|mini|windows\sce|palm|smartphone|iemobile/i
|
|
257
|
-
.test(ua.toLowerCase())) {
|
|
258
|
-
return '4';
|
|
259
|
-
}
|
|
260
|
-
if (/smart[-_\s]?tv|hbbtv|appletv|googletv|hdmi|netcast|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b/i
|
|
261
|
-
.test(ua.toLowerCase())) {
|
|
262
|
-
return '3';
|
|
263
|
-
}
|
|
264
|
-
return '1';
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
function generateBidsParams(validBidRequests, bidderRequest) {
|
|
268
|
-
const bidsArray = [];
|
|
269
|
-
|
|
270
|
-
if (validBidRequests.length) {
|
|
271
|
-
validBidRequests.forEach(bid => {
|
|
272
|
-
bidsArray.push(generateBidParameters(bid, bidderRequest));
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
return bidsArray;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* Generate bid specific parameters
|
|
281
|
-
* @param {bid} bid
|
|
282
|
-
* @param {bidderRequest} bidderRequest
|
|
283
|
-
* @returns {Object} bid specific params object
|
|
284
|
-
*/
|
|
285
|
-
function generateBidParameters(bid, bidderRequest) {
|
|
286
|
-
const {params} = bid;
|
|
287
|
-
const mediaType = isBanner(bid) ? BANNER : VIDEO;
|
|
288
|
-
const sizesArray = getSizesArray(bid, mediaType);
|
|
289
|
-
|
|
290
|
-
// fix floor price in case of NAN
|
|
291
|
-
if (isNaN(params.floorPrice)) {
|
|
292
|
-
params.floorPrice = 0;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
const bidObject = {
|
|
296
|
-
mediaType,
|
|
297
|
-
adUnitCode: getBidIdParameter('adUnitCode', bid),
|
|
298
|
-
sizes: sizesArray,
|
|
299
|
-
floorPrice: Math.max(getFloor(bid, mediaType), params.floorPrice),
|
|
300
|
-
bidId: getBidIdParameter('bidId', bid),
|
|
301
|
-
loop: getBidIdParameter('bidderRequestsCount', bid),
|
|
302
|
-
bidderRequestId: getBidIdParameter('bidderRequestId', bid),
|
|
303
|
-
transactionId: bid.ortb2Imp?.ext?.tid || '',
|
|
304
|
-
coppa: 0,
|
|
305
|
-
};
|
|
306
|
-
|
|
307
|
-
const pos = deepAccess(bid, `mediaTypes.${mediaType}.pos`);
|
|
308
|
-
if (pos) {
|
|
309
|
-
bidObject.pos = pos;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
const gpid = deepAccess(bid, `ortb2Imp.ext.gpid`);
|
|
313
|
-
if (gpid) {
|
|
314
|
-
bidObject.gpid = gpid;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
const placementId = params.placementId || deepAccess(bid, `mediaTypes.${mediaType}.name`);
|
|
318
|
-
if (placementId) {
|
|
319
|
-
bidObject.placementId = placementId;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
const mimes = deepAccess(bid, `mediaTypes.${mediaType}.mimes`);
|
|
323
|
-
if (mimes) {
|
|
324
|
-
bidObject.mimes = mimes;
|
|
325
|
-
}
|
|
326
|
-
const api = deepAccess(bid, `mediaTypes.${mediaType}.api`);
|
|
327
|
-
if (api) {
|
|
328
|
-
bidObject.api = api;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
const sua = deepAccess(bid, `ortb2.device.sua`);
|
|
332
|
-
if (sua) {
|
|
333
|
-
bidObject.sua = sua;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
const coppa = deepAccess(bid, `ortb2.regs.coppa`)
|
|
337
|
-
if (coppa) {
|
|
338
|
-
bidObject.coppa = 1;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
if (mediaType === VIDEO) {
|
|
342
|
-
const playbackMethod = deepAccess(bid, `mediaTypes.video.playbackmethod`);
|
|
343
|
-
let playbackMethodValue;
|
|
344
|
-
|
|
345
|
-
// verify playbackMethod is of type integer array, or integer only.
|
|
346
|
-
if (Array.isArray(playbackMethod) && isInteger(playbackMethod[0])) {
|
|
347
|
-
// only the first playbackMethod in the array will be used, according to OpenRTB 2.5 recommendation
|
|
348
|
-
playbackMethodValue = playbackMethod[0];
|
|
349
|
-
} else if (isInteger(playbackMethod)) {
|
|
350
|
-
playbackMethodValue = playbackMethod;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
if (playbackMethodValue) {
|
|
354
|
-
bidObject.playbackMethod = playbackMethodValue;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
const placement = deepAccess(bid, `mediaTypes.video.placement`);
|
|
358
|
-
if (placement) {
|
|
359
|
-
bidObject.placement = placement;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
const minDuration = deepAccess(bid, `mediaTypes.video.minduration`);
|
|
363
|
-
if (minDuration) {
|
|
364
|
-
bidObject.minDuration = minDuration;
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
const maxDuration = deepAccess(bid, `mediaTypes.video.maxduration`);
|
|
368
|
-
if (maxDuration) {
|
|
369
|
-
bidObject.maxDuration = maxDuration;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
const skip = deepAccess(bid, `mediaTypes.video.skip`);
|
|
373
|
-
if (skip) {
|
|
374
|
-
bidObject.skip = skip;
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
const linearity = deepAccess(bid, `mediaTypes.video.linearity`);
|
|
378
|
-
if (linearity) {
|
|
379
|
-
bidObject.linearity = linearity;
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
const protocols = deepAccess(bid, `mediaTypes.video.protocols`);
|
|
383
|
-
if (protocols) {
|
|
384
|
-
bidObject.protocols = protocols;
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
const plcmt = deepAccess(bid, `mediaTypes.video.plcmt`);
|
|
388
|
-
if (plcmt) {
|
|
389
|
-
bidObject.plcmt = plcmt;
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
return bidObject;
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
function isBanner(bid) {
|
|
397
|
-
return bid.mediaTypes && bid.mediaTypes.banner;
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
/**
|
|
401
|
-
* Generate params that are common between all bids
|
|
402
|
-
* @param {single bid object} generalObject
|
|
403
|
-
* @param {bidderRequest} bidderRequest
|
|
404
|
-
* @returns {object} the common params object
|
|
405
|
-
*/
|
|
406
|
-
function generateGeneralParams(generalObject, bidderRequest) {
|
|
407
|
-
const domain = window.location.hostname;
|
|
408
|
-
const {syncEnabled, filterSettings} = config.getConfig('userSync') || {};
|
|
409
|
-
const {bidderCode} = bidderRequest;
|
|
410
|
-
const generalBidParams = generalObject.params;
|
|
411
|
-
const timeout = bidderRequest.timeout;
|
|
412
|
-
|
|
413
|
-
// these params are snake_case instead of camelCase to allow backwards compatability on the server.
|
|
414
|
-
// in the future, these will be converted to camelCase to match our convention.
|
|
415
|
-
const generalParams = {
|
|
416
|
-
wrapper_type: 'prebidjs',
|
|
417
|
-
wrapper_vendor: '$$PREBID_GLOBAL$$',
|
|
418
|
-
wrapper_version: '$prebid.version$',
|
|
419
|
-
adapter_version: ADAPTER_VERSION,
|
|
420
|
-
auction_start: timestamp(),
|
|
421
|
-
publisher_id: generalBidParams.org,
|
|
422
|
-
publisher_name: domain,
|
|
423
|
-
site_domain: domain,
|
|
424
|
-
dnt: (navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') ? 1 : 0,
|
|
425
|
-
device_type: getDeviceType(navigator.userAgent),
|
|
426
|
-
ua: navigator.userAgent,
|
|
427
|
-
is_wrapper: !!generalBidParams.isWrapper,
|
|
428
|
-
session_id: generalBidParams.sessionId || getBidIdParameter('bidderRequestId', generalObject),
|
|
429
|
-
tmax: timeout
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
const userIdsParam = getBidIdParameter('userId', generalObject);
|
|
433
|
-
if (userIdsParam) {
|
|
434
|
-
generalParams.userIds = JSON.stringify(userIdsParam);
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
const ortb2Metadata = bidderRequest.ortb2 || {};
|
|
438
|
-
if (ortb2Metadata.site) {
|
|
439
|
-
generalParams.site_metadata = JSON.stringify(ortb2Metadata.site);
|
|
440
|
-
}
|
|
441
|
-
if (ortb2Metadata.user) {
|
|
442
|
-
generalParams.user_metadata = JSON.stringify(ortb2Metadata.user);
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
if (syncEnabled) {
|
|
446
|
-
const allowedSyncMethod = getAllowedSyncMethod(filterSettings, bidderCode);
|
|
447
|
-
if (allowedSyncMethod) {
|
|
448
|
-
generalParams.cs_method = allowedSyncMethod;
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
if (bidderRequest.uspConsent) {
|
|
453
|
-
generalParams.us_privacy = bidderRequest.uspConsent;
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) {
|
|
457
|
-
generalParams.gdpr = bidderRequest.gdprConsent.gdprApplies;
|
|
458
|
-
generalParams.gdpr_consent = bidderRequest.gdprConsent.consentString;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
if (bidderRequest.gppConsent) {
|
|
462
|
-
generalParams.gpp = bidderRequest.gppConsent.gppString;
|
|
463
|
-
generalParams.gpp_sid = bidderRequest.gppConsent.applicableSections;
|
|
464
|
-
} else if (bidderRequest.ortb2?.regs?.gpp) {
|
|
465
|
-
generalParams.gpp = bidderRequest.ortb2.regs.gpp;
|
|
466
|
-
generalParams.gpp_sid = bidderRequest.ortb2.regs.gpp_sid;
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
if (generalBidParams.ifa) {
|
|
470
|
-
generalParams.ifa = generalBidParams.ifa;
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
if (generalObject.schain) {
|
|
474
|
-
generalParams.schain = getSupplyChain(generalObject.schain);
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
if (bidderRequest && bidderRequest.refererInfo) {
|
|
478
|
-
generalParams.referrer = deepAccess(bidderRequest, 'refererInfo.ref');
|
|
479
|
-
generalParams.page_url = deepAccess(bidderRequest, 'refererInfo.page') || deepAccess(window, 'location.href');
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
return generalParams
|
|
483
|
-
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* This module adds the Mobian RTD provider to the real time data module
|
|
3
3
|
* The {@link module:modules/realTimeData} module is required
|
|
4
|
-
* @module modules/anonymisedRtdProvider
|
|
5
|
-
* @requires module:modules/realTimeData
|
|
6
4
|
*/
|
|
7
5
|
import { submodule } from '../src/hook.js';
|
|
8
6
|
import { ajaxBuilder } from '../src/ajax.js';
|
|
9
|
-
import { deepSetValue } from '../src/utils.js';
|
|
7
|
+
import { deepSetValue, safeJSONParse } from '../src/utils.js';
|
|
10
8
|
|
|
11
9
|
/**
|
|
12
10
|
* @typedef {import('../modules/rtdModule/index.js').RtdSubmodule} RtdSubmodule
|
|
@@ -24,6 +22,7 @@ export const mobianBrandSafetySubmodule = {
|
|
|
24
22
|
function init() {
|
|
25
23
|
return true;
|
|
26
24
|
}
|
|
25
|
+
|
|
27
26
|
function getBidRequestData(bidReqConfig, callback, config) {
|
|
28
27
|
const { site: ortb2Site } = bidReqConfig.ortb2Fragments.global;
|
|
29
28
|
const pageUrl = encodeURIComponent(getPageUrl());
|
|
@@ -33,20 +32,35 @@ function getBidRequestData(bidReqConfig, callback, config) {
|
|
|
33
32
|
|
|
34
33
|
return new Promise((resolve) => {
|
|
35
34
|
ajax(requestUrl, {
|
|
36
|
-
success: function(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
if (response[risks[i]]) {
|
|
43
|
-
mobianGarmRisk = riskLevels[i];
|
|
44
|
-
break;
|
|
45
|
-
}
|
|
35
|
+
success: function(responseData) {
|
|
36
|
+
let response = safeJSONParse(responseData);
|
|
37
|
+
if (!response) {
|
|
38
|
+
resolve({});
|
|
39
|
+
callback();
|
|
40
|
+
return;
|
|
46
41
|
}
|
|
42
|
+
|
|
43
|
+
let mobianRisk = response.garm_risk || 'unknown';
|
|
44
|
+
|
|
45
|
+
const categories = Object.keys(response)
|
|
46
|
+
.filter(key => key.startsWith('garm_content_category_') && response[key])
|
|
47
|
+
.map(key => key.replace('garm_content_category_', ''));
|
|
48
|
+
|
|
49
|
+
const sentiment = Object.keys(response)
|
|
50
|
+
.find(key => key.startsWith('sentiment_') && response[key])
|
|
51
|
+
?.replace('sentiment_', '') || 'unknown';
|
|
52
|
+
|
|
53
|
+
const emotions = Object.keys(response)
|
|
54
|
+
.filter(key => key.startsWith('emotion_') && response[key])
|
|
55
|
+
.map(key => key.replace('emotion_', ''));
|
|
56
|
+
|
|
47
57
|
const risk = {
|
|
48
|
-
'
|
|
58
|
+
'risk': mobianRisk,
|
|
59
|
+
'contentCategories': categories,
|
|
60
|
+
'sentiment': sentiment,
|
|
61
|
+
'emotions': emotions
|
|
49
62
|
};
|
|
63
|
+
|
|
50
64
|
resolve(risk);
|
|
51
65
|
deepSetValue(ortb2Site.ext, 'data.mobian', risk);
|
|
52
66
|
callback()
|
|
@@ -22,7 +22,7 @@ const OUTSTREAM_RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstre
|
|
|
22
22
|
const BIDDER_CODE = 'nexx360';
|
|
23
23
|
const REQUEST_URL = 'https://fast.nexx360.io/booster';
|
|
24
24
|
const PAGE_VIEW_ID = generateUUID();
|
|
25
|
-
const BIDDER_VERSION = '4.
|
|
25
|
+
const BIDDER_VERSION = '4.2';
|
|
26
26
|
const GVLID = 965;
|
|
27
27
|
const NEXXID_KEY = 'nexx360_storage';
|
|
28
28
|
|
|
@@ -33,6 +33,7 @@ const ALIASES = [
|
|
|
33
33
|
{ code: 'league-m', gvlid: 965 },
|
|
34
34
|
{ code: 'prjads' },
|
|
35
35
|
{ code: 'pubtech' },
|
|
36
|
+
{ code: '1accord', gvlid: 965 },
|
|
36
37
|
];
|
|
37
38
|
|
|
38
39
|
export const storage = getStorageManager({
|
|
@@ -125,7 +126,7 @@ const converter = ortbConverter({
|
|
|
125
126
|
deepSetValue(request, 'ext.localStorage.nexx360Id', nexx360LocalStorage.nexx360Id);
|
|
126
127
|
}
|
|
127
128
|
const amxId = getAmxId();
|
|
128
|
-
if (amxId) deepSetValue(request, 'ext.localStorage.amxId', amxId
|
|
129
|
+
if (amxId) deepSetValue(request, 'ext.localStorage.amxId', amxId);
|
|
129
130
|
deepSetValue(request, 'ext.version', '$prebid.version$');
|
|
130
131
|
deepSetValue(request, 'ext.source', 'prebid.js');
|
|
131
132
|
deepSetValue(request, 'ext.pageViewId', PAGE_VIEW_ID);
|