prebid.js 7.26.0 → 7.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/adWMGAnalyticsAdapter.js +1 -1
- package/dist/adagioAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
- package/dist/adlooxAdServerVideo.js +1 -1
- package/dist/adlooxAnalyticsAdapter.js +1 -1
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/admaticBidAdapter.js +1 -1
- package/dist/admixerBidAdapter.js +1 -1
- package/dist/adomikAnalyticsAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgAnalyticsAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adxpremiumAnalyticsAdapter.js +1 -1
- package/dist/aidemBidAdapter.js +1 -0
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/analyticsAdapter.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/atsAnalyticsAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/bidViewability.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/bidwatchAnalyticsAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/browsiRtdProvider.js +1 -1
- package/dist/bucksenseBidAdapter.js +1 -1
- package/dist/byDataAnalyticsAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/concertAnalyticsAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consentManagement.js +1 -1
- package/dist/consentManagementUsp.js +1 -1
- 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/datablocksAnalyticsAdapter.js +1 -1
- package/dist/dependencies.json +6 -0
- package/dist/dfpAdServerVideo.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningAnalyticsAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/fintezaAnalyticsAdapter.js +1 -1
- package/dist/fluctBidAdapter.js +1 -1
- package/dist/ftrackIdSystem.js +1 -1
- package/dist/gdprEnforcement.js +1 -1
- package/dist/genericAnalyticsAdapter.js +1 -0
- package/dist/geoedgeRtdProvider.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/glomexBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/googleAnalyticsAdapter.js +1 -1
- package/dist/gravitoIdSystem.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gridNMBidAdapter.js +1 -1
- package/dist/growthCodeAnalyticsAdapter.js +1 -0
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hadronAnalyticsAdapter.js +1 -1
- package/dist/id5AnalyticsAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/impactifyBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/inmarBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/invisiblyAnalyticsAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/jwplayerRtdProvider.js +1 -1
- package/dist/kargoAnalyticsAdapter.js +1 -1
- package/dist/kinessoIdSystem.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/limelightDigitalBidAdapter.js +1 -1
- package/dist/liveIntentAnalyticsAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/livewrappedAnalyticsAdapter.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/lotamePanoramaIdSystem.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/medianetAnalyticsAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +200 -196
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxAnalyticsAdapter.js +1 -1
- package/dist/optimonAnalyticsAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pbsExtensions.js +1 -1
- package/dist/pianoDmpAnalyticsAdapter.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
- package/dist/pubCommonId.js +1 -1
- package/dist/pubProvidedIdSystem.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubperfAnalyticsAdapter.js +1 -1
- package/dist/pubstackAnalyticsAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pubxaiAnalyticsAdapter.js +1 -1
- package/dist/pulsepointAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/quantcastIdSystem.js +1 -1
- package/dist/rasBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/realvuAnalyticsAdapter.js +1 -1
- package/dist/redtramBidAdapter.js +1 -0
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/relevantAnalyticsAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rivrAnalyticsAdapter.js +1 -1
- package/dist/roxotAnalyticsAdapter.js +1 -1
- package/dist/rtbhouseBidAdapter.js +1 -1
- package/dist/rtdModule.js +1 -1
- package/dist/rubiconAnalyticsAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/s2sTesting.js +1 -1
- package/dist/scaleableAnalyticsAdapter.js +1 -1
- package/dist/schain.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharedIdSystem.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/sigmoidAnalyticsAdapter.js +1 -1
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/sonobiAnalyticsAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnAnalyticsAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/staqAnalyticsAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/tapadIdSystem.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/teadsIdSystem.js +1 -1
- package/dist/terceptAnalyticsAdapter.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/userId.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/weboramaRtdProvider.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahoosspBidAdapter.js +1 -1
- package/dist/yandexBidAdapter.js +1 -1
- package/dist/yieldlabBidAdapter.js +1 -1
- package/dist/yieldliftBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/dist/yuktamediaAnalyticsAdapter.js +1 -1
- package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
- package/integrationExamples/gpt/growthcode.html +134 -0
- package/libraries/analyticsAdapter/AnalyticsAdapter.js +95 -102
- package/modules/admaticBidAdapter.js +10 -1
- package/modules/admixerBidAdapter.js +1 -1
- package/modules/aidemBidAdapter.js +492 -0
- package/modules/aidemBidAdapter.md +187 -0
- package/modules/browsiRtdProvider.js +6 -4
- package/modules/bucksenseBidAdapter.js +1 -1
- package/modules/criteoBidAdapter.js +3 -3
- package/modules/eplanningBidAdapter.js +2 -6
- package/modules/fluctBidAdapter.js +5 -0
- package/modules/gdprEnforcement.js +26 -24
- package/modules/genericAnalyticsAdapter.js +157 -0
- package/modules/geoedgeRtdProvider.js +22 -0
- package/modules/glomexBidAdapter.js +2 -0
- package/modules/gravitoIdSystem.js +3 -4
- package/modules/gridBidAdapter.js +1 -1
- package/modules/gridNMBidAdapter.js +1 -1
- package/modules/growthCodeAnalyticsAdapter.js +176 -0
- package/modules/growthCodeAnalyticsAdapter.md +41 -0
- package/modules/impactifyBidAdapter.js +19 -1
- package/modules/jwplayerRtdProvider.js +1 -2
- package/modules/limelightDigitalBidAdapter.js +1 -1
- package/modules/minutemediaBidAdapter.md +3 -3
- package/modules/nexx360BidAdapter.js +264 -138
- package/modules/pubCommonId.js +2 -1
- package/modules/pubProvidedIdSystem.js +2 -0
- package/modules/rasBidAdapter.js +8 -3
- package/modules/rasBidAdapter.md +16 -15
- package/modules/redtramBidAdapter.js +155 -0
- package/modules/redtramBidAdapter.md +33 -0
- package/modules/riseBidAdapter.js +15 -0
- package/modules/riseBidAdapter.md +3 -3
- package/modules/rtbhouseBidAdapter.js +90 -29
- package/modules/rubiconBidAdapter.js +2 -1
- package/modules/seedtagBidAdapter.js +67 -56
- package/modules/seedtagBidAdapter.md +60 -0
- package/modules/sharedIdSystem.js +3 -1
- package/modules/smartxBidAdapter.js +1 -1
- package/modules/smnBidAdapter.md +52 -0
- package/modules/tripleliftBidAdapter.js +1 -1
- package/modules/ttdBidAdapter.js +4 -0
- package/modules/vidazooBidAdapter.js +11 -1
- package/modules/yandexBidAdapter.js +85 -19
- package/modules/yandexBidAdapter.md +7 -7
- package/modules/yieldlabBidAdapter.js +10 -4
- package/modules/yieldliftBidAdapter.js +3 -3
- package/package.json +1 -1
- package/src/auction.js +19 -3
- package/src/consentHandler.js +8 -0
- package/src/events.js +4 -0
- package/src/native.js +31 -20
- package/src/refererDetection.js +6 -1
- package/src/storageManager.js +6 -3
- package/test/helpers/analytics.js +34 -0
- package/test/mocks/analyticsStub.js +3 -1
- package/test/spec/AnalyticsAdapter_spec.js +119 -116
- package/test/spec/auctionmanager_spec.js +86 -0
- package/test/spec/modules/adWMGAnalyticsAdapter_spec.js +10 -8
- package/test/spec/modules/adagioAnalyticsAdapter_spec.js +18 -25
- package/test/spec/modules/aidemBidAdapter_spec.js +664 -0
- package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +0 -2
- package/test/spec/modules/browsiRtdProvider_spec.js +2 -1
- package/test/spec/modules/concertAnalyticsAdapter_spec.js +2 -4
- package/test/spec/modules/enrichmentFpdModule_spec.js +3 -2
- package/test/spec/modules/eplanningAnalyticsAdapter_spec.js +0 -3
- package/test/spec/modules/eplanningBidAdapter_spec.js +4 -4
- package/test/spec/modules/fluctBidAdapter_spec.js +37 -1
- package/test/spec/modules/fpdModule_spec.js +1 -1
- package/test/spec/modules/gdprEnforcement_spec.js +115 -68
- package/test/spec/modules/genericAnalyticsAdapter_spec.js +284 -0
- package/test/spec/modules/geoedgeRtdProvider_spec.js +15 -0
- package/test/spec/modules/glomexBidAdapter_spec.js +4 -0
- package/test/spec/modules/gravitoIdSystem_spec.js +1 -1
- package/test/spec/modules/growthCodeAnalyticsAdapter_spec.js +70 -0
- package/test/spec/modules/impactifyBidAdapter_spec.js +13 -0
- package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +17 -27
- package/test/spec/modules/jwplayerRtdProvider_spec.js +3 -3
- package/test/spec/modules/konduitAnalyticsAdapter_spec.js +0 -2
- package/test/spec/modules/liveIntentAnalyticsAdapter_spec.js +3 -6
- package/test/spec/modules/medianetAnalyticsAdapter_spec.js +7 -1
- package/test/spec/modules/nexx360BidAdapter_spec.js +441 -221
- package/test/spec/modules/optimonAnalyticsAdapter_spec.js +3 -11
- package/test/spec/modules/pianoDmpAnalyticsAdapter_spec.js +4 -11
- package/test/spec/modules/prebidmanagerAnalyticsAdapter_spec.js +3 -12
- package/test/spec/modules/pubperfAnalyticsAdapter_spec.js +6 -19
- package/test/spec/modules/pubstackAnalyticsAdapter_spec.js +3 -17
- package/test/spec/modules/pubwiseAnalyticsAdapter_spec.js +13 -19
- package/test/spec/modules/rasBidAdapter_spec.js +5 -1
- package/test/spec/modules/redtramBidAdapter_spec.js +256 -0
- package/test/spec/modules/riseBidAdapter_spec.js +24 -0
- package/test/spec/modules/rtbhouseBidAdapter_spec.js +79 -0
- package/test/spec/modules/seedtagBidAdapter_spec.js +65 -92
- package/test/spec/modules/sigmoidAnalyticsAdapter_spec.js +4 -8
- package/test/spec/modules/sovrnAnalyticsAdapter_spec.js +6 -18
- package/test/spec/modules/tripleliftBidAdapter_spec.js +3 -10
- package/test/spec/modules/ttdBidAdapter_spec.js +14 -0
- package/test/spec/modules/vidazooBidAdapter_spec.js +39 -24
- package/test/spec/modules/yandexBidAdapter_spec.js +22 -13
- package/test/spec/modules/yieldlabBidAdapter_spec.js +49 -20
- package/test/spec/modules/yieldliftBidAdapter_spec.js +1 -1
- package/test/spec/modules/yieldoneAnalyticsAdapter_spec.js +5 -2
- package/test/spec/native_spec.js +68 -56
- package/test/spec/refererDetection_spec.js +45 -7
- package/test/spec/unit/core/storageManager_spec.js +2 -1
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
import {_each, contains, deepAccess, deepSetValue, getDNT, isBoolean, isStr, logError, logInfo} from '../src/utils.js';
|
|
2
|
+
import {config} from '../src/config.js';
|
|
3
|
+
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
4
|
+
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
5
|
+
import {getRefererInfo} from '../src/refererDetection.js';
|
|
6
|
+
import {ajax} from '../src/ajax.js';
|
|
7
|
+
|
|
8
|
+
const BIDDER_CODE = 'aidem';
|
|
9
|
+
const BASE_URL = 'https://zero.aidemsrv.com';
|
|
10
|
+
const LOCAL_BASE_URL = 'http://127.0.0.1:8787';
|
|
11
|
+
|
|
12
|
+
const AVAILABLE_CURRENCIES = ['USD'];
|
|
13
|
+
const DEFAULT_CURRENCY = ['USD']; // NOTE - USD is the only supported currency right now; Hardcoded for bids
|
|
14
|
+
const SUPPORTED_MEDIA_TYPES = [BANNER, VIDEO];
|
|
15
|
+
const REQUIRED_VIDEO_PARAMS = [ 'mimes', 'protocols', 'context' ];
|
|
16
|
+
|
|
17
|
+
export const ERROR_CODES = {
|
|
18
|
+
BID_SIZE_INVALID_FORMAT: 1,
|
|
19
|
+
BID_SIZE_NOT_INCLUDED: 2,
|
|
20
|
+
PROPERTY_NOT_INCLUDED: 3,
|
|
21
|
+
SITE_ID_INVALID_VALUE: 4,
|
|
22
|
+
MEDIA_TYPE_NOT_SUPPORTED: 5,
|
|
23
|
+
PUBLISHER_ID_INVALID_VALUE: 6,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const endpoints = {
|
|
27
|
+
request: `${BASE_URL}/bid/request`,
|
|
28
|
+
notice: {
|
|
29
|
+
win: `${BASE_URL}/notice/win`,
|
|
30
|
+
timeout: `${BASE_URL}/notice/timeout`,
|
|
31
|
+
error: `${BASE_URL}/notice/error`,
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function setEndPoints(env = null, path = '', mediaType = BANNER) {
|
|
36
|
+
switch (env) {
|
|
37
|
+
case 'local':
|
|
38
|
+
endpoints.request = mediaType === BANNER ? `${LOCAL_BASE_URL}${path}/bid/request` : `${LOCAL_BASE_URL}${path}/bid/videorequest`
|
|
39
|
+
endpoints.notice.win = `${LOCAL_BASE_URL}${path}/notice/win`
|
|
40
|
+
endpoints.notice.error = `${LOCAL_BASE_URL}${path}/notice/error`
|
|
41
|
+
endpoints.notice.timeout = `${LOCAL_BASE_URL}${path}/notice/timeout`
|
|
42
|
+
break;
|
|
43
|
+
case 'main':
|
|
44
|
+
endpoints.request = mediaType === BANNER ? `${BASE_URL}${path}/bid/request` : `${BASE_URL}${path}/bid/videorequest`
|
|
45
|
+
endpoints.notice.win = `${BASE_URL}${path}/notice/win`
|
|
46
|
+
endpoints.notice.error = `${BASE_URL}${path}/notice/error`
|
|
47
|
+
endpoints.notice.timeout = `${BASE_URL}${path}/notice/timeout`
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
return endpoints
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
config.getConfig('aidem', function (config) {
|
|
54
|
+
if (config.aidem.env) { setEndPoints(config.aidem.env, config.aidem.path, config.aidem.mediaType) }
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
// AIDEM Custom FN
|
|
58
|
+
function recur(obj) {
|
|
59
|
+
var result = {}; var _tmp;
|
|
60
|
+
for (var i in obj) {
|
|
61
|
+
// enabledPlugin is too nested, also skip functions
|
|
62
|
+
if (!(i === 'enabledPlugin' || typeof obj[i] === 'function')) {
|
|
63
|
+
if (typeof obj[i] === 'object' && obj[i] !== null) {
|
|
64
|
+
// get props recursively
|
|
65
|
+
_tmp = recur(obj[i]);
|
|
66
|
+
// if object is not {}
|
|
67
|
+
if (Object.keys(_tmp).length) {
|
|
68
|
+
result[i] = _tmp;
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
// string, number or boolean
|
|
72
|
+
result[i] = obj[i];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// =================================================================================
|
|
80
|
+
function getConnectionType() {
|
|
81
|
+
const connection = navigator.connection || navigator.webkitConnection;
|
|
82
|
+
if (!connection) {
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
85
|
+
switch (connection.type) {
|
|
86
|
+
case 'ethernet':
|
|
87
|
+
return 1;
|
|
88
|
+
case 'wifi':
|
|
89
|
+
return 2;
|
|
90
|
+
case 'cellular':
|
|
91
|
+
switch (connection.effectiveType) {
|
|
92
|
+
case 'slow-2g':
|
|
93
|
+
return 4;
|
|
94
|
+
case '2g':
|
|
95
|
+
return 4;
|
|
96
|
+
case '3g':
|
|
97
|
+
return 5;
|
|
98
|
+
case '4g':
|
|
99
|
+
return 6;
|
|
100
|
+
case '5g':
|
|
101
|
+
return 7;
|
|
102
|
+
default:
|
|
103
|
+
return 3;
|
|
104
|
+
}
|
|
105
|
+
default:
|
|
106
|
+
return 0;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function getDevice() {
|
|
111
|
+
const language = navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage;
|
|
112
|
+
return {
|
|
113
|
+
ua: navigator.userAgent,
|
|
114
|
+
dnt: !!getDNT(),
|
|
115
|
+
language: language,
|
|
116
|
+
connectiontype: getConnectionType(),
|
|
117
|
+
screen_width: screen.width,
|
|
118
|
+
screen_height: screen.height
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function getRegs() {
|
|
123
|
+
let regs = {};
|
|
124
|
+
const consentManagement = config.getConfig('consentManagement')
|
|
125
|
+
const coppa = config.getConfig('coppa')
|
|
126
|
+
if (consentManagement && !!(consentManagement.gdpr)) {
|
|
127
|
+
deepSetValue(regs, 'gdpr_applies', !!consentManagement.gdpr);
|
|
128
|
+
} else {
|
|
129
|
+
deepSetValue(regs, 'gdpr_applies', false);
|
|
130
|
+
}
|
|
131
|
+
if (consentManagement && deepAccess(consentManagement, 'usp.cmpApi') === 'static') {
|
|
132
|
+
deepSetValue(regs, 'usp_applies', !!deepAccess(consentManagement, 'usp'));
|
|
133
|
+
deepSetValue(regs, 'us_privacy', deepAccess(consentManagement, 'usp.consentData.getUSPData.uspString'));
|
|
134
|
+
} else {
|
|
135
|
+
deepSetValue(regs, 'usp_applies', false);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (isBoolean(coppa)) {
|
|
139
|
+
deepSetValue(regs, 'coppa_applies', !!coppa);
|
|
140
|
+
} else {
|
|
141
|
+
deepSetValue(regs, 'coppa_applies', false);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return regs;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function getPageUrl(bidderRequest) {
|
|
148
|
+
return bidderRequest?.refererInfo?.page
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function buildWinNotice(bid) {
|
|
152
|
+
return {
|
|
153
|
+
burl: deepAccess(bid, 'meta.burl'),
|
|
154
|
+
cpm: bid.cpm,
|
|
155
|
+
currency: bid.currency,
|
|
156
|
+
impid: deepAccess(bid, 'meta.impid'),
|
|
157
|
+
dsp_id: deepAccess(bid, 'meta.dsp_id'),
|
|
158
|
+
adUnitCode: bid.adUnitCode,
|
|
159
|
+
auctionId: bid.auctionId,
|
|
160
|
+
transactionId: bid.transactionId,
|
|
161
|
+
ttl: bid.ttl,
|
|
162
|
+
requestTimestamp: bid.requestTimestamp,
|
|
163
|
+
responseTimestamp: bid.responseTimestamp,
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function buildErrorNotice(prebidErrorResponse) {
|
|
168
|
+
return {
|
|
169
|
+
message: `Prebid.js: Server call for ${prebidErrorResponse.bidderCode} failed.`,
|
|
170
|
+
url: encodeURIComponent(getPageUrl(prebidErrorResponse)),
|
|
171
|
+
auctionId: prebidErrorResponse.auctionId,
|
|
172
|
+
bidderRequestId: prebidErrorResponse.bidderRequestId,
|
|
173
|
+
metrics: {}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function hasValidFloor(obj) {
|
|
178
|
+
if (!obj) return false
|
|
179
|
+
const hasValue = !isNaN(Number(obj.value))
|
|
180
|
+
const hasCurrency = contains(AVAILABLE_CURRENCIES, obj.currency)
|
|
181
|
+
return hasValue && hasCurrency
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function getMediaType(bidRequest) {
|
|
185
|
+
if ((bidRequest.mediaTypes && bidRequest.mediaTypes.hasOwnProperty('video')) || bidRequest.params.hasOwnProperty('video')) { return VIDEO }
|
|
186
|
+
return BANNER
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function getPrebidRequestFields(bidderRequest, bidRequests) {
|
|
190
|
+
const payload = {}
|
|
191
|
+
// Base Payload Data
|
|
192
|
+
deepSetValue(payload, 'id', bidderRequest.auctionId);
|
|
193
|
+
// Impressions
|
|
194
|
+
setPrebidImpressionObject(bidRequests, payload)
|
|
195
|
+
// Device
|
|
196
|
+
deepSetValue(payload, 'device', getDevice())
|
|
197
|
+
// Timeout
|
|
198
|
+
deepSetValue(payload, 'tmax', bidderRequest.timeout);
|
|
199
|
+
// Currency
|
|
200
|
+
deepSetValue(payload, 'cur', DEFAULT_CURRENCY);
|
|
201
|
+
// Timezone
|
|
202
|
+
deepSetValue(payload, 'tz', new Date().getTimezoneOffset());
|
|
203
|
+
// Privacy Regs
|
|
204
|
+
deepSetValue(payload, 'regs', getRegs());
|
|
205
|
+
// Site
|
|
206
|
+
setPrebidSiteObject(bidderRequest, payload)
|
|
207
|
+
// Environment
|
|
208
|
+
setPrebidRequestEnvironment(payload)
|
|
209
|
+
// AT auction type
|
|
210
|
+
deepSetValue(payload, 'at', 1);
|
|
211
|
+
|
|
212
|
+
return payload
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function setPrebidImpressionObject(bidRequests, payload) {
|
|
216
|
+
payload.imp = [];
|
|
217
|
+
_each(bidRequests, function (bidRequest) {
|
|
218
|
+
const impressionObject = {};
|
|
219
|
+
// Placement or ad tag used to initiate the auction
|
|
220
|
+
deepSetValue(impressionObject, 'id', bidRequest.bidId);
|
|
221
|
+
// Transaction id
|
|
222
|
+
deepSetValue(impressionObject, 'tid', deepAccess(bidRequest, 'transactionId'));
|
|
223
|
+
// Publisher id
|
|
224
|
+
deepSetValue(payload, 'site.publisher.id', deepAccess(bidRequest, 'params.publisherId'));
|
|
225
|
+
// Site id
|
|
226
|
+
deepSetValue(payload, 'site.id', deepAccess(bidRequest, 'params.siteId'));
|
|
227
|
+
const mediaType = getMediaType(bidRequest)
|
|
228
|
+
switch (mediaType) {
|
|
229
|
+
case 'banner':
|
|
230
|
+
setPrebidImpressionObjectBanner(bidRequest, impressionObject)
|
|
231
|
+
break;
|
|
232
|
+
case 'video':
|
|
233
|
+
setPrebidImpressionObjectVideo(bidRequest, impressionObject)
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Floor (optional)
|
|
238
|
+
setPrebidImpressionObjectFloor(bidRequest, impressionObject)
|
|
239
|
+
|
|
240
|
+
impressionObject.imp_ext = {};
|
|
241
|
+
|
|
242
|
+
payload.imp.push(impressionObject);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function setPrebidSiteObject(bidderRequest, payload) {
|
|
247
|
+
deepSetValue(payload, 'site.domain', deepAccess(bidderRequest, 'refererInfo.domain'));
|
|
248
|
+
deepSetValue(payload, 'site.page', deepAccess(bidderRequest, 'refererInfo.page'));
|
|
249
|
+
deepSetValue(payload, 'site.referer', deepAccess(bidderRequest, 'refererInfo.ref'));
|
|
250
|
+
deepSetValue(payload, 'site.cat', deepAccess(bidderRequest, 'ortb2.site.cat'));
|
|
251
|
+
deepSetValue(payload, 'site.sectioncat', deepAccess(bidderRequest, 'ortb2.site.sectioncat'));
|
|
252
|
+
deepSetValue(payload, 'site.keywords', deepAccess(bidderRequest, 'ortb2.site.keywords'));
|
|
253
|
+
deepSetValue(payload, 'site.site_ext', deepAccess(bidderRequest, 'ortb2.site.ext')); // see https://docs.prebid.org/features/firstPartyData.html
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function setPrebidRequestEnvironment(payload) {
|
|
257
|
+
const __navigator = JSON.parse(JSON.stringify(recur(navigator)));
|
|
258
|
+
delete __navigator.plugins;
|
|
259
|
+
deepSetValue(payload, 'environment.ri', getRefererInfo());
|
|
260
|
+
deepSetValue(payload, 'environment.hl', window.history.length);
|
|
261
|
+
deepSetValue(payload, 'environment.nav', __navigator);
|
|
262
|
+
deepSetValue(payload, 'environment.inp.euc', window.encodeURIComponent.name === 'encodeURIComponent' && typeof window.encodeURIComponent.prototype === 'undefined');
|
|
263
|
+
deepSetValue(payload, 'environment.inp.eu', window.encodeURI.name === 'encodeURI' && typeof window.encodeURI.prototype === 'undefined');
|
|
264
|
+
deepSetValue(payload, 'environment.inp.js', window.JSON.stringify.name === 'stringify' && typeof window.JSON.stringify.prototype === 'undefined');
|
|
265
|
+
deepSetValue(payload, 'environment.inp.jp', window.JSON.parse.name === 'parse' && typeof window.JSON.parse.prototype === 'undefined');
|
|
266
|
+
deepSetValue(payload, 'environment.inp.ofe', window.Object.fromEntries.name === 'fromEntries' && typeof window.Object.fromEntries.prototype === 'undefined');
|
|
267
|
+
deepSetValue(payload, 'environment.inp.oa', window.Object.assign.name === 'assign' && typeof window.Object.assign.prototype === 'undefined');
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function setPrebidImpressionObjectFloor(bidRequest, impressionObject) {
|
|
271
|
+
const floor = deepAccess(bidRequest, 'params.floor')
|
|
272
|
+
if (hasValidFloor(floor)) {
|
|
273
|
+
deepSetValue(impressionObject, 'floor.value', floor.value)
|
|
274
|
+
deepSetValue(impressionObject, 'floor.currency', floor.currency)
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function setPrebidImpressionObjectBanner(bidRequest, impressionObject) {
|
|
279
|
+
deepSetValue(impressionObject, 'mediatype', BANNER);
|
|
280
|
+
deepSetValue(impressionObject, 'banner.topframe', 1);
|
|
281
|
+
deepSetValue(impressionObject, 'banner.format', []);
|
|
282
|
+
_each(bidRequest.mediaTypes.banner.sizes, function (bannerFormat) {
|
|
283
|
+
const format = {};
|
|
284
|
+
deepSetValue(format, 'w', bannerFormat[0]);
|
|
285
|
+
deepSetValue(format, 'h', bannerFormat[1]);
|
|
286
|
+
deepSetValue(format, 'format_ext', {});
|
|
287
|
+
impressionObject.banner.format.push(format);
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function setPrebidImpressionObjectVideo(bidRequest, impressionObject) {
|
|
292
|
+
deepSetValue(impressionObject, 'mediatype', VIDEO);
|
|
293
|
+
deepSetValue(impressionObject, 'video.format', []);
|
|
294
|
+
deepSetValue(impressionObject, 'video.mimes', bidRequest.mediaTypes.video.mimes);
|
|
295
|
+
deepSetValue(impressionObject, 'video.minDuration', bidRequest.mediaTypes.video.minduration);
|
|
296
|
+
deepSetValue(impressionObject, 'video.maxDuration', bidRequest.mediaTypes.video.maxduration);
|
|
297
|
+
deepSetValue(impressionObject, 'video.protocols', bidRequest.mediaTypes.video.protocols);
|
|
298
|
+
deepSetValue(impressionObject, 'video.context', bidRequest.mediaTypes.video.context);
|
|
299
|
+
deepSetValue(impressionObject, 'video.playbackmethod', bidRequest.mediaTypes.video.playbackmethod);
|
|
300
|
+
deepSetValue(impressionObject, 'skip', bidRequest.mediaTypes.video.skip);
|
|
301
|
+
deepSetValue(impressionObject, 'skipafter', bidRequest.mediaTypes.video.skipafter);
|
|
302
|
+
deepSetValue(impressionObject, 'video.pos', bidRequest.mediaTypes.video.pos);
|
|
303
|
+
_each(bidRequest.mediaTypes.video.playerSize, function (videoPlayerSize) {
|
|
304
|
+
const format = {};
|
|
305
|
+
deepSetValue(format, 'w', videoPlayerSize[0]);
|
|
306
|
+
deepSetValue(format, 'h', videoPlayerSize[1]);
|
|
307
|
+
deepSetValue(format, 'format_ext', {});
|
|
308
|
+
impressionObject.video.format.push(format);
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
function getPrebidResponseBidObject(openRTBResponseBidObject) {
|
|
313
|
+
const prebidResponseBidObject = {};
|
|
314
|
+
// Common properties
|
|
315
|
+
deepSetValue(prebidResponseBidObject, 'requestId', openRTBResponseBidObject.impid);
|
|
316
|
+
deepSetValue(prebidResponseBidObject, 'cpm', parseFloat(openRTBResponseBidObject.price));
|
|
317
|
+
deepSetValue(prebidResponseBidObject, 'creativeId', openRTBResponseBidObject.crid);
|
|
318
|
+
deepSetValue(prebidResponseBidObject, 'currency', openRTBResponseBidObject.cur ? openRTBResponseBidObject.cur.toUpperCase() : DEFAULT_CURRENCY);
|
|
319
|
+
deepSetValue(prebidResponseBidObject, 'width', openRTBResponseBidObject.w);
|
|
320
|
+
deepSetValue(prebidResponseBidObject, 'height', openRTBResponseBidObject.h);
|
|
321
|
+
deepSetValue(prebidResponseBidObject, 'dealId', openRTBResponseBidObject.dealid)
|
|
322
|
+
deepSetValue(prebidResponseBidObject, 'netRevenue', true);
|
|
323
|
+
deepSetValue(prebidResponseBidObject, 'ttl', 60000);
|
|
324
|
+
|
|
325
|
+
if (openRTBResponseBidObject.mediatype === VIDEO) {
|
|
326
|
+
logInfo('bidObject.mediatype == VIDEO');
|
|
327
|
+
deepSetValue(prebidResponseBidObject, 'mediaType', VIDEO);
|
|
328
|
+
deepSetValue(prebidResponseBidObject, 'vastUrl', openRTBResponseBidObject.adm);
|
|
329
|
+
} else {
|
|
330
|
+
logInfo('bidObject.mediatype == BANNER');
|
|
331
|
+
deepSetValue(prebidResponseBidObject, 'mediaType', BANNER);
|
|
332
|
+
deepSetValue(prebidResponseBidObject, 'ad', openRTBResponseBidObject.adm);
|
|
333
|
+
}
|
|
334
|
+
setPrebidResponseBidObjectMeta(prebidResponseBidObject, openRTBResponseBidObject)
|
|
335
|
+
return prebidResponseBidObject
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
function setPrebidResponseBidObjectMeta(prebidResponseBidObject, openRTBResponseBidObject) {
|
|
339
|
+
logInfo('AIDEM Bid Adapter meta', openRTBResponseBidObject);
|
|
340
|
+
deepSetValue(prebidResponseBidObject, 'meta.advertiserDomains', openRTBResponseBidObject.adomain);
|
|
341
|
+
if (openRTBResponseBidObject.cat && Array.isArray(openRTBResponseBidObject.cat)) {
|
|
342
|
+
const primaryCatId = openRTBResponseBidObject.cat.shift();
|
|
343
|
+
deepSetValue(prebidResponseBidObject, 'meta.primaryCatId', primaryCatId);
|
|
344
|
+
deepSetValue(prebidResponseBidObject, 'meta.secondaryCatIds', openRTBResponseBidObject.cat);
|
|
345
|
+
}
|
|
346
|
+
deepSetValue(prebidResponseBidObject, 'meta.id', openRTBResponseBidObject.id);
|
|
347
|
+
deepSetValue(prebidResponseBidObject, 'meta.dsp_id', openRTBResponseBidObject.dsp_id);
|
|
348
|
+
deepSetValue(prebidResponseBidObject, 'meta.adid', openRTBResponseBidObject.adid);
|
|
349
|
+
deepSetValue(prebidResponseBidObject, 'meta.burl', openRTBResponseBidObject.burl);
|
|
350
|
+
deepSetValue(prebidResponseBidObject, 'meta.impid', openRTBResponseBidObject.impid);
|
|
351
|
+
deepSetValue(prebidResponseBidObject, 'meta.cat', openRTBResponseBidObject.cat);
|
|
352
|
+
deepSetValue(prebidResponseBidObject, 'meta.cid', openRTBResponseBidObject.cid);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function hasValidMediaType(bidRequest) {
|
|
356
|
+
const supported = hasBannerMediaType(bidRequest) || hasVideoMediaType(bidRequest)
|
|
357
|
+
if (!supported) {
|
|
358
|
+
logError('AIDEM Bid Adapter: media type not supported', { bidder: BIDDER_CODE, code: ERROR_CODES.MEDIA_TYPE_NOT_SUPPORTED });
|
|
359
|
+
}
|
|
360
|
+
return supported
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function hasBannerMediaType(bidRequest) {
|
|
364
|
+
return !!deepAccess(bidRequest, 'mediaTypes.banner')
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
function hasVideoMediaType(bidRequest) {
|
|
368
|
+
return !!deepAccess(bidRequest, 'mediaTypes.video')
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
function hasValidBannerMediaType(bidRequest) {
|
|
372
|
+
const sizes = deepAccess(bidRequest, 'mediaTypes.banner.sizes')
|
|
373
|
+
if (!sizes) {
|
|
374
|
+
logError('AIDEM Bid Adapter: media type sizes missing', { bidder: BIDDER_CODE, code: ERROR_CODES.PROPERTY_NOT_INCLUDED });
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
return true
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function hasValidVideoMediaType(bidRequest) {
|
|
381
|
+
const sizes = deepAccess(bidRequest, 'mediaTypes.video.playerSize');
|
|
382
|
+
if (!sizes) {
|
|
383
|
+
logError('AIDEM Bid Adapter: media type playerSize missing', { bidder: BIDDER_CODE, code: ERROR_CODES.PROPERTY_NOT_INCLUDED });
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
return true
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
function hasValidVideoParameters(bidRequest) {
|
|
390
|
+
let valid = true
|
|
391
|
+
const adUnitsParameters = deepAccess(bidRequest, 'mediaTypes.video');
|
|
392
|
+
const bidderParameter = deepAccess(bidRequest, 'params.video');
|
|
393
|
+
for (let property of REQUIRED_VIDEO_PARAMS) {
|
|
394
|
+
const hasAdUnitParameter = adUnitsParameters.hasOwnProperty(property)
|
|
395
|
+
const hasBidderParameter = bidderParameter && bidderParameter.hasOwnProperty(property)
|
|
396
|
+
if (!hasAdUnitParameter && !hasBidderParameter) {
|
|
397
|
+
logError(`AIDEM Bid Adapter: ${property} is not included in either the adunit or params level`, { bidder: BIDDER_CODE, code: ERROR_CODES.PROPERTY_NOT_INCLUDED });
|
|
398
|
+
valid = false
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
return valid
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
function hasValidParameters(bidRequest) {
|
|
406
|
+
// Assigned from AIDEM to a publisher website
|
|
407
|
+
const siteId = deepAccess(bidRequest, 'params.siteId');
|
|
408
|
+
const publisherId = deepAccess(bidRequest, 'params.publisherId');
|
|
409
|
+
|
|
410
|
+
if (!isStr(siteId)) {
|
|
411
|
+
logError('AIDEM Bid Adapter: siteId must valid string', { bidder: BIDDER_CODE, code: ERROR_CODES.SITE_ID_INVALID_VALUE });
|
|
412
|
+
return false;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
if (!isStr(publisherId)) {
|
|
416
|
+
logError('AIDEM Bid Adapter: publisherId must valid string', { bidder: BIDDER_CODE, code: ERROR_CODES.PUBLISHER_ID_INVALID_VALUE });
|
|
417
|
+
return false;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
return true
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
export const spec = {
|
|
424
|
+
code: BIDDER_CODE,
|
|
425
|
+
supportedMediaTypes: SUPPORTED_MEDIA_TYPES,
|
|
426
|
+
isBidRequestValid: function(bidRequest) {
|
|
427
|
+
logInfo('bid: ', bidRequest);
|
|
428
|
+
|
|
429
|
+
// check if request has valid mediaTypes
|
|
430
|
+
if (!hasValidMediaType(bidRequest)) return false
|
|
431
|
+
|
|
432
|
+
// check if request has valid media type parameters at adUnit level
|
|
433
|
+
if (hasBannerMediaType(bidRequest) && !hasValidBannerMediaType(bidRequest)) {
|
|
434
|
+
return false
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
if (hasVideoMediaType(bidRequest) && !hasValidVideoMediaType(bidRequest)) {
|
|
438
|
+
return false
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
if (hasVideoMediaType(bidRequest) && !hasValidVideoParameters(bidRequest)) {
|
|
442
|
+
return false
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
return hasValidParameters(bidRequest)
|
|
446
|
+
},
|
|
447
|
+
|
|
448
|
+
buildRequests: function(validBidRequests, bidderRequest) {
|
|
449
|
+
logInfo('validBidRequests: ', validBidRequests);
|
|
450
|
+
logInfo('bidderRequest: ', bidderRequest);
|
|
451
|
+
const prebidRequest = getPrebidRequestFields(bidderRequest, validBidRequests)
|
|
452
|
+
const payloadString = JSON.stringify(prebidRequest);
|
|
453
|
+
|
|
454
|
+
return {
|
|
455
|
+
method: 'POST',
|
|
456
|
+
url: endpoints.request,
|
|
457
|
+
data: payloadString,
|
|
458
|
+
options: {
|
|
459
|
+
withCredentials: true
|
|
460
|
+
}
|
|
461
|
+
};
|
|
462
|
+
},
|
|
463
|
+
|
|
464
|
+
interpretResponse: function (serverResponse) {
|
|
465
|
+
const bids = [];
|
|
466
|
+
logInfo('serverResponse: ', serverResponse);
|
|
467
|
+
_each(serverResponse.body.bid, function (bidObject) {
|
|
468
|
+
logInfo('bidObject: ', bidObject);
|
|
469
|
+
if (!bidObject.price || !bidObject.adm) {
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
logInfo('CPM OK');
|
|
473
|
+
const bid = getPrebidResponseBidObject(bidObject)
|
|
474
|
+
bids.push(bid);
|
|
475
|
+
});
|
|
476
|
+
return bids;
|
|
477
|
+
},
|
|
478
|
+
|
|
479
|
+
onBidWon: function(bid) {
|
|
480
|
+
// Bidder specific code
|
|
481
|
+
logInfo('onBidWon bid: ', bid);
|
|
482
|
+
const notice = buildWinNotice(bid)
|
|
483
|
+
ajax(endpoints.notice.win, null, JSON.stringify(notice), { method: 'POST', withCredentials: true });
|
|
484
|
+
},
|
|
485
|
+
|
|
486
|
+
onBidderError: function({ bidderRequest }) {
|
|
487
|
+
// Bidder specific code
|
|
488
|
+
const notice = buildErrorNotice(bidderRequest)
|
|
489
|
+
ajax(endpoints.notice.error, null, JSON.stringify(notice), { method: 'POST', withCredentials: true });
|
|
490
|
+
},
|
|
491
|
+
}
|
|
492
|
+
registerBidder(spec);
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
name: AIDEM Adapter
|
|
5
|
+
type: Bidder Adapter
|
|
6
|
+
support: prebid@aidem.com
|
|
7
|
+
biddercode: aidem
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
# Description
|
|
11
|
+
This module connects publishers to AIDEM demand.
|
|
12
|
+
|
|
13
|
+
This module is GDPR and CCPA compliant, and no 3rd party userIds are allowed.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
## Global Bid Params
|
|
17
|
+
| Name | Scope | Description | Example | Type |
|
|
18
|
+
|---------------|----------|---------------------|---------------|----------|
|
|
19
|
+
| `siteId` | required | Unique site ID | `'ABCDEF'` | `String` |
|
|
20
|
+
| `publisherId` | required | Unique publisher ID | `'ABCDEF'` | `String` |
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
### Banner Bid Params
|
|
24
|
+
| Name | Scope | Description | Example | Type |
|
|
25
|
+
|------------|----------|--------------------------|---------------------------|---------|
|
|
26
|
+
| `sizes` | required | List of the sizes wanted | `[[300, 250], [300,600]]` | `Array` |
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### Video Bid Params
|
|
30
|
+
| Name | Scope | Description | Example | Type |
|
|
31
|
+
|---------------|----------|-----------------------------------------|-----------------|-----------|
|
|
32
|
+
| `context` | required | One of instream, outstream, adpod | `'instream'` | `String` |
|
|
33
|
+
| `playerSize` | required | Width and height of the player | `'[640, 480]'` | `Array` |
|
|
34
|
+
| `maxduration` | required | Maximum video ad duration, in seconds | `30` | `Integer` |
|
|
35
|
+
| `minduration` | required | Minimum video ad duration, in seconds | `5` | `Integer` |
|
|
36
|
+
| `mimes` | required | List of the content MIME types supported by the player | `["video/mp4"]` | `Array` |
|
|
37
|
+
| `protocols` | required | An array of supported video protocols. At least one supported protocol must be specified, where: `2` = VAST 2.0 `3` = VAST 3.0 `5` = VAST 2.0 wrapper `6` = VAST 3.0 wrapper | `2` | `Array` |
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
### Additional Config
|
|
41
|
+
| Name | Scope | Description | Example | Type |
|
|
42
|
+
|---------------------|----------|---------------------------------------------------------|---------|-----------|
|
|
43
|
+
| `coppa` | optional | Child Online Privacy Protection Act | `true` | `Boolean` |
|
|
44
|
+
| `consentManagement` | optional | [Consent Management Object](#consent-management-object) | `{}` | `Object` |
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
### Consent Management Object
|
|
48
|
+
| Name | Scope | Description | Example | Type |
|
|
49
|
+
|--------|----------|--------------------------------------------------------------------------------------------------|---------|----------|
|
|
50
|
+
| `gdpr` | optional | GDPR Object see [Prebid.js doc](https://docs.prebid.org/dev-docs/modules/consentManagement.html) | `{}` | `Object` |
|
|
51
|
+
| `usp` | optional | USP Object see [Prebid.js doc](https://docs.prebid.org/dev-docs/modules/consentManagementUsp.html) | `{}` | `Object` |
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
### Example Banner ad unit
|
|
55
|
+
```javascript
|
|
56
|
+
var adUnits = [{
|
|
57
|
+
code: 'banner-prebid-test-site',
|
|
58
|
+
mediaTypes: {
|
|
59
|
+
banner: {
|
|
60
|
+
sizes: [
|
|
61
|
+
[300, 600],
|
|
62
|
+
[300, 250]
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
bids: [{
|
|
67
|
+
bidder: 'aidem',
|
|
68
|
+
params: {
|
|
69
|
+
siteId: 'prebid-test-site',
|
|
70
|
+
},
|
|
71
|
+
}]
|
|
72
|
+
}];
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Example Video ad unit
|
|
76
|
+
```javascript
|
|
77
|
+
var adUnits = [{
|
|
78
|
+
code: 'video-prebid-test-site',
|
|
79
|
+
mediaTypes: {
|
|
80
|
+
video: {
|
|
81
|
+
context: 'instream',
|
|
82
|
+
playerSize: [640, 480],
|
|
83
|
+
maxduration: 30,
|
|
84
|
+
minduration: 5,
|
|
85
|
+
mimes: ["video/mp4"],
|
|
86
|
+
protocols: 2
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
bids: [{
|
|
90
|
+
bidder: 'aidem',
|
|
91
|
+
params: {
|
|
92
|
+
siteId: 'prebid-test-site',
|
|
93
|
+
},
|
|
94
|
+
}]
|
|
95
|
+
}];
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Example GDPR Consent Management
|
|
99
|
+
```javascript
|
|
100
|
+
var pbjs = pbjs || {};
|
|
101
|
+
pbjs.que = pbjs.que || [];
|
|
102
|
+
|
|
103
|
+
pbjs.que.push(function (){
|
|
104
|
+
pbjs.setConfig({
|
|
105
|
+
consentManagement: {
|
|
106
|
+
gdpr:{
|
|
107
|
+
cmpApi: 'iab'
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
})
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
### Example USP Consent Management
|
|
116
|
+
```javascript
|
|
117
|
+
var pbjs = pbjs || {};
|
|
118
|
+
pbjs.que = pbjs.que || [];
|
|
119
|
+
|
|
120
|
+
pbjs.que.push(function (){
|
|
121
|
+
pbjs.setConfig({
|
|
122
|
+
consentManagement: {
|
|
123
|
+
usp:{
|
|
124
|
+
cmpApi: 'static',
|
|
125
|
+
consentData:{
|
|
126
|
+
getUSPData:{
|
|
127
|
+
uspString: '1YYY'
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
})
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
### Setting First Party Data (FPD)
|
|
138
|
+
```javascript
|
|
139
|
+
var pbjs = pbjs || {};
|
|
140
|
+
pbjs.que = pbjs.que || [];
|
|
141
|
+
|
|
142
|
+
pbjs.que.push(function (){
|
|
143
|
+
pbjs.setConfig({
|
|
144
|
+
ortb2: {
|
|
145
|
+
site: {
|
|
146
|
+
cat: ['IAB2'],
|
|
147
|
+
sectioncat: ['IAB2-2'],
|
|
148
|
+
keywords: 'power tools, drills'
|
|
149
|
+
},
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
})
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Supported Media Types
|
|
156
|
+
| Type | Support |
|
|
157
|
+
|--------|--------------------------------------------------------------------|
|
|
158
|
+
| Banner | Support all [AIDEM Sizes](https://kb.aidem.com/ssp/lists/adsizes/) |
|
|
159
|
+
| Video | Support all [AIDEM Sizes](https://kb.aidem.com/ssp/lists/adsizes/) |
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
# Setup / Dev Guide
|
|
163
|
+
```shell
|
|
164
|
+
nvm use
|
|
165
|
+
|
|
166
|
+
npm install
|
|
167
|
+
|
|
168
|
+
gulp build --modules=aidemBidAdapter
|
|
169
|
+
|
|
170
|
+
gulp serve --modules=aidemBidAdapter
|
|
171
|
+
|
|
172
|
+
# Open a chrome browser with no ad blockers enabled, and paste in this URL. The `pbjs_debug=true` is needed if you want to enable `loggerInfo` output on the `console` tab of Chrome Developer Tools.
|
|
173
|
+
http://localhost:9999/integrationExamples/gpt/hello_world.html?pbjs_debug=true
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
If you need to run the tests suite but do *not* want to have to build the full adapter and serve it, simply run:
|
|
177
|
+
```shell
|
|
178
|
+
gulp test --file "test/spec/modules/aidemBidAdapter_spec.js"
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
For video: gulp serve --modules=aidemBidAdapter,dfpAdServerVideo
|
|
183
|
+
|
|
184
|
+
# FAQs
|
|
185
|
+
### How do I view AIDEM bid request?
|
|
186
|
+
Navigate to a page where AIDEM is setup to bid. In the network tab,
|
|
187
|
+
search for requests to `zero.aidemsrv.com/bid/request`.
|
|
@@ -59,10 +59,12 @@ export function addBrowsiTag(data) {
|
|
|
59
59
|
|
|
60
60
|
export function sendPageviewEvent(eventType) {
|
|
61
61
|
if (eventType === 'PAGEVIEW') {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
62
|
+
window.addEventListener('browsi_pageview', () => {
|
|
63
|
+
events.emit(CONSTANTS.EVENTS.BILLABLE_EVENT, {
|
|
64
|
+
vendor: 'browsi',
|
|
65
|
+
type: 'pageview',
|
|
66
|
+
billingId: generateUUID()
|
|
67
|
+
})
|
|
66
68
|
})
|
|
67
69
|
}
|
|
68
70
|
}
|