prebid.js 6.6.0 → 6.10.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/.eslintrc.js +8 -1
- package/allowedModules.js +4 -7
- package/integrationExamples/gpt/amp/creative.html +11 -33
- package/integrationExamples/gpt/{haloRtdProvider_example.html → hadronRtdProvider_example.html} +9 -9
- package/integrationExamples/gpt/idImportLibrary_example.html +2 -2
- package/integrationExamples/gpt/userId_example.html +2 -2
- package/integrationExamples/gpt/weboramaRtdProvider_example.html +154 -115
- package/integrationExamples/gpt/x-domain/creative.html +63 -29
- package/modules/.submodules.json +3 -0
- package/modules/adagioBidAdapter.js +1 -9
- package/modules/adagioBidAdapter.md +1 -1
- package/modules/adbookpspBidAdapter.js +29 -12
- package/modules/adhashBidAdapter.js +4 -4
- package/modules/adkernelBidAdapter.js +2 -2
- package/modules/adlooxAnalyticsAdapter.js +1 -1
- package/modules/adlooxRtdProvider.js +1 -1
- package/modules/adnowBidAdapter.js +1 -1
- package/modules/adnuntiusRtdProvider.js +96 -0
- package/modules/adnuntiusRtdProvider.md +41 -0
- package/modules/adomikAnalyticsAdapter.js +2 -2
- package/modules/adotBidAdapter.js +1 -1
- package/modules/adpod.js +14 -17
- package/modules/adrelevantisBidAdapter.js +2 -2
- package/modules/adtargetBidAdapter.js +1 -1
- package/modules/adtelligentBidAdapter.js +1 -1
- package/modules/advangelistsBidAdapter.js +2 -2
- package/modules/adxpremiumAnalyticsAdapter.js +1 -1
- package/modules/adyoulikeBidAdapter.js +1 -1
- package/modules/afpBidAdapter.js +1 -1
- package/modules/appnexusBidAdapter.js +16 -4
- package/modules/asealBidAdapter.js +58 -0
- package/modules/asealBidAdapter.md +52 -0
- package/modules/beachfrontBidAdapter.js +2 -2
- package/modules/betweenBidAdapter.js +1 -1
- package/modules/bidViewability.js +1 -1
- package/modules/bluebillywigBidAdapter.js +1 -1
- package/modules/brandmetricsRtdProvider.js +168 -0
- package/modules/brandmetricsRtdProvider.md +40 -0
- package/modules/bridgewellBidAdapter.js +1 -1
- package/modules/browsiRtdProvider.js +2 -2
- package/modules/cleanmedianetBidAdapter.js +1 -1
- package/modules/colossussspBidAdapter.js +12 -8
- package/modules/colossussspBidAdapter.md +15 -1
- package/modules/compassBidAdapter.js +1 -1
- package/modules/connectIdSystem.js +1 -1
- package/modules/consentManagement.js +2 -3
- package/modules/consumableBidAdapter.md +1 -1
- package/modules/conversantBidAdapter.js +7 -0
- package/modules/craftBidAdapter.js +2 -2
- package/modules/criteoBidAdapter.js +10 -1
- package/modules/currency.js +27 -5
- package/modules/cwireBidAdapter.js +1 -1
- package/modules/dailyhuntBidAdapter.js +1 -1
- package/modules/dchain.js +1 -1
- package/modules/displayioBidAdapter.js +157 -0
- package/modules/displayioBidAdapter.md +148 -0
- package/modules/dspxBidAdapter.js +69 -29
- package/modules/dspxBidAdapter.md +2 -1
- package/modules/e_volutionBidAdapter.js +158 -0
- package/modules/emx_digitalBidAdapter.js +2 -2
- package/modules/fluctBidAdapter.js +0 -1
- package/modules/gamoshiBidAdapter.js +1 -1
- package/modules/gdprEnforcement.js +2 -2
- package/modules/glomexBidAdapter.js +1 -1
- package/modules/gnetBidAdapter.js +3 -3
- package/modules/gnetBidAdapter.md +4 -4
- package/modules/goldbachBidAdapter.js +2 -2
- package/modules/gptPreAuction.js +1 -1
- package/modules/gridBidAdapter.js +15 -1
- package/modules/gumgumBidAdapter.js +57 -43
- package/modules/hadronIdSystem.js +96 -0
- package/modules/hadronIdSystem.md +35 -0
- package/modules/hadronRtdProvider.js +254 -0
- package/modules/hadronRtdProvider.md +126 -0
- package/modules/haloIdSystem.md +4 -35
- package/modules/haloRtdProvider.md +3 -126
- package/modules/hybridBidAdapter.js +1 -1
- package/modules/improvedigitalBidAdapter.js +6 -1
- package/modules/insticatorBidAdapter.js +1 -1
- package/modules/interactiveOffersBidAdapter.js +9 -6
- package/modules/intersectionRtdProvider.js +1 -1
- package/modules/ixBidAdapter.js +2 -2
- package/modules/jwplayerRtdProvider.js +72 -7
- package/modules/jwplayerRtdProvider.md +27 -11
- package/modules/kargoBidAdapter.js +2 -2
- package/modules/livewrappedBidAdapter.js +1 -1
- package/modules/lunamediahbBidAdapter.js +32 -4
- package/modules/malltvBidAdapter.js +7 -3
- package/modules/malltvBidAdapter.md +64 -51
- package/modules/mass.js +3 -5
- package/modules/mediakeysBidAdapter.js +2 -2
- package/modules/medianetAnalyticsAdapter.js +2 -2
- package/modules/medianetRtdProvider.js +1 -1
- package/modules/mediasquareBidAdapter.js +1 -0
- package/modules/nextMillenniumBidAdapter.js +1 -0
- package/modules/nextrollBidAdapter.js +1 -1
- package/modules/oguryBidAdapter.js +7 -14
- package/modules/onetagBidAdapter.js +1 -1
- package/modules/openwebBidAdapter.js +1 -1
- package/modules/openxAnalyticsAdapter.js +2 -2
- package/modules/openxBidAdapter.js +1 -1
- package/modules/parrableIdSystem.js +1 -1
- package/modules/permutiveRtdProvider.js +1 -1
- package/modules/pilotxBidAdapter.js +147 -0
- package/modules/pilotxBidAdapter.md +50 -0
- package/modules/pixfutureBidAdapter.js +2 -2
- package/modules/prebidServerBidAdapter/index.js +63 -41
- package/modules/priceFloors.js +15 -14
- package/modules/pubmaticBidAdapter.js +1 -1
- package/modules/quantcastBidAdapter.js +1 -1
- package/modules/reconciliationRtdProvider.js +1 -1
- package/modules/richaudienceBidAdapter.js +7 -2
- package/modules/riseBidAdapter.js +17 -6
- package/modules/roxotAnalyticsAdapter.js +1 -1
- package/modules/rtbhouseBidAdapter.js +1 -1
- package/modules/rtdModule/index.js +9 -11
- package/modules/rubiconAnalyticsAdapter.js +8 -2
- package/modules/rubiconBidAdapter.js +1 -1
- package/modules/saambaaBidAdapter.js +420 -420
- package/modules/seedingAllianceBidAdapter.js +3 -3
- package/modules/sharethroughBidAdapter.js +12 -17
- package/modules/sigmoidAnalyticsAdapter.js +1 -1
- package/modules/sirdataRtdProvider.js +1 -1
- package/modules/sizeMappingV2.js +2 -9
- package/modules/smarticoBidAdapter.js +1 -1
- package/modules/sortableAnalyticsAdapter.js +5 -4
- package/modules/sovrnAnalyticsAdapter.js +2 -2
- package/modules/sovrnBidAdapter.js +93 -18
- package/modules/sovrnBidAdapter.md +80 -2
- package/modules/sspBCBidAdapter.js +54 -21
- package/modules/synacormediaBidAdapter.js +32 -11
- package/modules/targetVideoBidAdapter.js +1 -1
- package/modules/telariaBidAdapter.js +22 -29
- package/modules/trustpidSystem.js +197 -0
- package/modules/trustpidSystem.md +45 -0
- package/modules/undertoneBidAdapter.js +17 -1
- package/modules/userId/eids.js +16 -1
- package/modules/userId/eids.md +10 -2
- package/modules/userId/index.js +2 -2
- package/modules/userId/userId.md +17 -2
- package/modules/ventesBidAdapter.js +1 -1
- package/modules/verizonMediaIdSystem.js +1 -1
- package/modules/vibrantmediaBidAdapter.js +220 -0
- package/modules/vibrantmediaBidAdapter.md +92 -0
- package/modules/viewability.js +177 -0
- package/modules/viewability.md +87 -0
- package/modules/viewdeosDXBidAdapter.js +1 -1
- package/modules/voxBidAdapter.js +1 -1
- package/modules/waardexBidAdapter.js +1 -1
- package/modules/weboramaRtdProvider.js +264 -34
- package/modules/weboramaRtdProvider.md +110 -40
- package/modules/widespaceBidAdapter.js +2 -2
- package/modules/winrBidAdapter.js +7 -7
- package/modules/yahoosspBidAdapter.js +3 -1
- package/modules/yieldlabBidAdapter.js +1 -1
- package/modules/yieldmoBidAdapter.js +2 -2
- package/modules/yieldoneBidAdapter.js +6 -0
- package/modules/yuktamediaAnalyticsAdapter.js +1 -1
- package/package.json +3 -1
- package/plugins/poly/arrayFrom.js +3 -0
- package/plugins/poly/find.js +3 -0
- package/plugins/poly/findIndex.js +3 -0
- package/plugins/poly/includes.js +3 -0
- package/plugins/poly/package.json +8 -0
- package/src/Renderer.js +1 -1
- package/src/adRendering.js +38 -0
- package/src/adapterManager.js +33 -28
- package/src/adapters/bidderFactory.js +13 -11
- package/src/adloader.js +3 -2
- package/src/auction.js +140 -117
- package/src/auctionIndex.js +85 -0
- package/src/auctionManager.js +4 -1
- package/src/bidderSettings.js +69 -0
- package/src/bidfactory.js +18 -6
- package/src/config.js +3 -4
- package/src/cpmBucketManager.js +1 -1
- package/src/native.js +30 -22
- package/src/prebid.js +4 -20
- package/src/secureCreatives.js +133 -49
- package/src/sizeMapping.js +1 -1
- package/src/storageManager.js +1 -1
- package/src/targeting.js +13 -4
- package/src/userSync.js +1 -1
- package/src/utils.js +16 -19
- package/src/video.js +11 -12
- package/src/videoCache.js +10 -9
- package/test/fixtures/fixtures.js +2 -1
- package/test/helpers/indexStub.js +28 -0
- package/test/helpers/syncPromise.js +71 -0
- package/test/spec/auctionmanager_spec.js +269 -90
- package/test/spec/config_spec.js +24 -1
- package/test/spec/e2e/longform/basic_w_bidderSettings.spec.js +1 -1
- package/test/spec/e2e/longform/basic_w_custom_adserver_translation.spec.js +1 -1
- package/test/spec/e2e/longform/basic_w_priceGran.spec.js +1 -1
- package/test/spec/e2e/longform/basic_w_requireExactDuration.spec.js +1 -1
- package/test/spec/e2e/longform/basic_wo_brandCategoryExclusion.spec.js +1 -1
- package/test/spec/e2e/longform/basic_wo_requireExactDuration.spec.js +1 -1
- package/test/spec/modules/adagioBidAdapter_spec.js +0 -10
- package/test/spec/modules/adbookpspBidAdapter_spec.js +17 -3
- package/test/spec/modules/adhashBidAdapter_spec.js +2 -2
- package/test/spec/modules/adnuntiusRtdProvider_spec.js +145 -0
- package/test/spec/modules/adpod_spec.js +91 -156
- package/test/spec/modules/afpBidAdapter_spec.js +1 -1
- package/test/spec/modules/appnexusBidAdapter_spec.js +27 -0
- package/test/spec/modules/asealBidAdapter_spec.js +144 -0
- package/test/spec/modules/brandmetricsRtdProvider_spec.js +191 -0
- package/test/spec/modules/colossussspBidAdapter_spec.js +5 -2
- package/test/spec/modules/conversantBidAdapter_spec.js +54 -2
- package/test/spec/modules/criteoBidAdapter_spec.js +21 -0
- package/test/spec/modules/currency_spec.js +36 -15
- package/test/spec/modules/deepintentDpesIdsystem_spec.js +1 -1
- package/test/spec/modules/displayioBidAdapter_spec.js +239 -0
- package/test/spec/modules/dspxBidAdapter_spec.js +20 -15
- package/test/spec/modules/e_volutionBidAdapter_spec.js +242 -0
- package/test/spec/modules/eids_spec.js +2 -2
- package/test/spec/modules/eplanningAnalyticsAdapter_spec.js +1 -1
- package/test/spec/modules/fintezaAnalyticsAdapter_spec.js +1 -1
- package/test/spec/modules/gnetBidAdapter_spec.js +6 -6
- package/test/spec/modules/gridBidAdapter_spec.js +18 -0
- package/test/spec/modules/gumgumBidAdapter_spec.js +49 -3
- package/test/spec/modules/hadronIdSystem_spec.js +57 -0
- package/test/spec/modules/hadronRtdProvider_spec.js +762 -0
- package/test/spec/modules/idxIdSystem_spec.js +1 -1
- package/test/spec/modules/improvedigitalBidAdapter_spec.js +19 -0
- package/test/spec/modules/jwplayerRtdProvider_spec.js +195 -2
- package/test/spec/modules/kargoBidAdapter_spec.js +1 -1
- package/test/spec/modules/lunamediahbBidAdapter_spec.js +27 -1
- package/test/spec/modules/mass_spec.js +2 -14
- package/test/spec/modules/mediakeysBidAdapter_spec.js +1 -1
- package/test/spec/modules/multibid_spec.js +1 -1
- package/test/spec/modules/oguryBidAdapter_spec.js +63 -5
- package/test/spec/modules/onetagBidAdapter_spec.js +1 -1
- package/test/spec/modules/openxAnalyticsAdapter_spec.js +1 -1
- package/test/spec/modules/parrableIdSystem_spec.js +1 -1
- package/test/spec/modules/pilotxBidAdapter_spec.js +244 -0
- package/test/spec/modules/prebidServerBidAdapter_spec.js +43 -6
- package/test/spec/modules/priceFloors_spec.js +37 -24
- package/test/spec/modules/pubmaticBidAdapter_spec.js +40 -0
- package/test/spec/modules/realTimeDataModule_spec.js +51 -2
- package/test/spec/modules/riseBidAdapter_spec.js +30 -4
- package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +61 -1
- package/test/spec/modules/rubiconBidAdapter_spec.js +1 -1
- package/test/spec/modules/sharethroughBidAdapter_spec.js +91 -6
- package/test/spec/modules/sortableAnalyticsAdapter_spec.js +2 -3
- package/test/spec/modules/sovrnBidAdapter_spec.js +413 -333
- package/test/spec/modules/sspBCBidAdapter_spec.js +7 -7
- package/test/spec/modules/stroeerCoreBidAdapter_spec.js +1 -1
- package/test/spec/modules/synacormediaBidAdapter_spec.js +70 -0
- package/test/spec/modules/telariaBidAdapter_spec.js +1 -3
- package/test/spec/modules/trustpidSystem_spec.js +232 -0
- package/test/spec/modules/undertoneBidAdapter_spec.js +55 -2
- package/test/spec/modules/userId_spec.js +40 -40
- package/test/spec/modules/vibrantmediaBidAdapter_spec.js +1237 -0
- package/test/spec/modules/viewability_spec.js +280 -0
- package/test/spec/modules/weboramaRtdProvider_spec.js +536 -20
- package/test/spec/modules/widespaceBidAdapter_spec.js +1 -1
- package/test/spec/modules/yahoosspBidAdapter_spec.js +10 -0
- package/test/spec/modules/yieldoneBidAdapter_spec.js +33 -0
- package/test/spec/modules/zeotapIdPlusIdSystem_spec.js +1 -1
- package/test/spec/native_spec.js +62 -40
- package/test/spec/sizeMapping_spec.js +1 -1
- package/test/spec/unit/core/adapterManager_spec.js +24 -2
- package/test/spec/unit/core/auctionIndex_spec.js +129 -0
- package/test/spec/unit/core/bidderFactory_spec.js +65 -12
- package/test/spec/unit/core/bidderSettings_spec.js +123 -0
- package/test/spec/unit/core/targeting_spec.js +93 -0
- package/test/spec/unit/pbjs_api_spec.js +81 -43
- package/test/spec/unit/secureCreatives_spec.js +143 -24
- package/test/spec/videoCache_spec.js +18 -19
- package/test/spec/video_spec.js +51 -61
- package/webpack.conf.js +1 -1
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Vibrant Media Ltd.
|
|
3
|
+
*
|
|
4
|
+
* Prebid Adapter for sending bid requests to the prebid server and bid responses back to the client
|
|
5
|
+
*
|
|
6
|
+
* Note: Only BANNER and VIDEO are currently supported by the prebid server.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {logError, logInfo} from '../src/utils.js';
|
|
10
|
+
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
11
|
+
import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js';
|
|
12
|
+
import {OUTSTREAM} from '../src/video.js';
|
|
13
|
+
|
|
14
|
+
const BIDDER_CODE = 'vibrantmedia';
|
|
15
|
+
const VIBRANT_MEDIA_PREBID_URL = 'https://prebid.intellitxt.com/prebid';
|
|
16
|
+
const SUPPORTED_MEDIA_TYPES = [BANNER, NATIVE, VIDEO];
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Returns whether the given bid request contains at least one supported media request, which has valid data. (We can
|
|
20
|
+
* ignore invalid/unsupported ones, as they will be filtered out by the prebid server.)
|
|
21
|
+
*
|
|
22
|
+
* @param {*} bidRequest the bid requests sent by the Prebid API.
|
|
23
|
+
*
|
|
24
|
+
* @return {boolean} true if the given bid request contains at least one supported media request with valid details,
|
|
25
|
+
* otherwise false.
|
|
26
|
+
*/
|
|
27
|
+
const areValidSupportedMediaTypesPresent = function(bidRequest) {
|
|
28
|
+
const mediaTypes = Object.keys(bidRequest.mediaTypes);
|
|
29
|
+
|
|
30
|
+
return mediaTypes.some(function(mediaType) {
|
|
31
|
+
if (mediaType === BANNER) {
|
|
32
|
+
return true;
|
|
33
|
+
} else if (mediaType === VIDEO) {
|
|
34
|
+
return (bidRequest.mediaTypes[VIDEO].context === OUTSTREAM);
|
|
35
|
+
} else if (mediaType === NATIVE) {
|
|
36
|
+
return !!bidRequest.mediaTypes[NATIVE].image;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return false;
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Returns whether the given URL contains just a domain, and not (for example) a subdirectory or query parameters.
|
|
45
|
+
* @param {string} url the URL to check.
|
|
46
|
+
* @returns {boolean} whether the URL contains just a domain.
|
|
47
|
+
*/
|
|
48
|
+
const isBaseUrl = function(url) {
|
|
49
|
+
const urlMinusScheme = url.substring(url.indexOf('://') + 3);
|
|
50
|
+
const endOfDomain = urlMinusScheme.indexOf('/');
|
|
51
|
+
return (endOfDomain === -1) || (endOfDomain === (urlMinusScheme.length - 1));
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Returns transformed bid requests that are in a format native to the prebid server.
|
|
56
|
+
*
|
|
57
|
+
* @param {*[]} bidRequests the bid requests sent by the Prebid API.
|
|
58
|
+
*
|
|
59
|
+
* @returns {*[]} the transformed bid requests.
|
|
60
|
+
*/
|
|
61
|
+
const transformBidRequests = function(bidRequests) {
|
|
62
|
+
const transformedBidRequests = [];
|
|
63
|
+
|
|
64
|
+
bidRequests.forEach(function(bidRequest) {
|
|
65
|
+
const params = bidRequest.params || {};
|
|
66
|
+
const transformedBidRequest = {
|
|
67
|
+
code: bidRequest.adUnitCode || bidRequest.code,
|
|
68
|
+
id: bidRequest.placementId || params.placementId || params.invCode,
|
|
69
|
+
requestId: bidRequest.bidId || bidRequest.transactionId,
|
|
70
|
+
bidder: bidRequest.bidder,
|
|
71
|
+
mediaTypes: bidRequest.mediaTypes,
|
|
72
|
+
bids: bidRequest.bids,
|
|
73
|
+
sizes: bidRequest.sizes
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
transformedBidRequests.push(transformedBidRequest);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
return transformedBidRequests;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/** @type {BidderSpec} */
|
|
83
|
+
export const spec = {
|
|
84
|
+
code: BIDDER_CODE,
|
|
85
|
+
supportedMediaTypes: SUPPORTED_MEDIA_TYPES,
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Transforms the 'raw' bid params into ones that this adapter can use, prior to creating the bid request.
|
|
89
|
+
*
|
|
90
|
+
* @param {object} bidParams the params to transform.
|
|
91
|
+
*
|
|
92
|
+
* @returns {object} the bid params.
|
|
93
|
+
*/
|
|
94
|
+
transformBidParams: function(bidParams) {
|
|
95
|
+
return bidParams;
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Determines whether or not the given bid request is valid. For all bid requests passed to the buildRequests
|
|
100
|
+
* function, each will have been passed to this function and this function will have returned true.
|
|
101
|
+
*
|
|
102
|
+
* @param {object} bid the bid params to validate.
|
|
103
|
+
*
|
|
104
|
+
* @return {boolean} true if this is a valid bid, otherwise false.
|
|
105
|
+
* @see SUPPORTED_MEDIA_TYPES
|
|
106
|
+
*/
|
|
107
|
+
isBidRequestValid: function(bid) {
|
|
108
|
+
const areBidRequestParamsValid = !!(bid.params.placementId || (bid.params.member && bid.params.invCode));
|
|
109
|
+
return areBidRequestParamsValid && areValidSupportedMediaTypesPresent(bid);
|
|
110
|
+
},
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Return a prebid server request from the list of bid requests.
|
|
114
|
+
*
|
|
115
|
+
* @param {BidRequest[]} validBidRequests an array of bids validated via the isBidRequestValid function.
|
|
116
|
+
* @param {BidderRequest} bidderRequest an object with data common to all bid requests.
|
|
117
|
+
*
|
|
118
|
+
* @return ServerRequest Info describing the request to the prebid server.
|
|
119
|
+
*/
|
|
120
|
+
buildRequests: function(validBidRequests, bidderRequest) {
|
|
121
|
+
const transformedBidRequests = transformBidRequests(validBidRequests);
|
|
122
|
+
|
|
123
|
+
var url = window.parent.location.href;
|
|
124
|
+
|
|
125
|
+
if ((window.self === window.top) && (!url || (url.substr(0, 4) !== 'http') || isBaseUrl(url))) {
|
|
126
|
+
url = document.URL;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
url = encodeURIComponent(url);
|
|
130
|
+
|
|
131
|
+
const prebidData = {
|
|
132
|
+
url,
|
|
133
|
+
gdpr: bidderRequest.gdprConsent,
|
|
134
|
+
usp: bidderRequest.uspConsent,
|
|
135
|
+
window: {
|
|
136
|
+
width: window.innerWidth,
|
|
137
|
+
height: window.innerHeight,
|
|
138
|
+
},
|
|
139
|
+
biddata: transformedBidRequests,
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
return {
|
|
143
|
+
method: 'POST',
|
|
144
|
+
url: VIBRANT_MEDIA_PREBID_URL,
|
|
145
|
+
data: JSON.stringify(prebidData)
|
|
146
|
+
};
|
|
147
|
+
},
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Translate the Kormorant prebid server response into a list of bids.
|
|
151
|
+
*
|
|
152
|
+
* @param {ServerResponse} serverResponse a successful response from the prebid server.
|
|
153
|
+
* @param {BidRequest} bidRequest the original bid request associated with this response.
|
|
154
|
+
*
|
|
155
|
+
* @return {Bid[]} an array of bids returned by the prebid server, translated into the expected Prebid.js format.
|
|
156
|
+
*/
|
|
157
|
+
interpretResponse: function(serverResponse, bidRequest) {
|
|
158
|
+
const bids = serverResponse.body;
|
|
159
|
+
|
|
160
|
+
bids.forEach(function(bid) {
|
|
161
|
+
bid.adResponse = serverResponse;
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
return bids;
|
|
165
|
+
},
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Called if the Prebid API gives up waiting for a prebid server response.
|
|
169
|
+
*
|
|
170
|
+
* Example timeout data:
|
|
171
|
+
*
|
|
172
|
+
* [{
|
|
173
|
+
* "bidder": "example",
|
|
174
|
+
* "bidId": "51ef8751f9aead",
|
|
175
|
+
* "params": {
|
|
176
|
+
* ...
|
|
177
|
+
* },
|
|
178
|
+
* "adUnitCode": "div-gpt-ad-1460505748561-0",
|
|
179
|
+
* "timeout": 3000,
|
|
180
|
+
* "auctionId": "18fd8b8b0bd757"
|
|
181
|
+
* }]
|
|
182
|
+
*
|
|
183
|
+
* @param {{}} timeoutData data relating to the timeout.
|
|
184
|
+
*/
|
|
185
|
+
onTimeout: function(timeoutData) {
|
|
186
|
+
logError('Timed out waiting for bids: ' + JSON.stringify(timeoutData));
|
|
187
|
+
},
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Called when a bid returned by the prebid server is successful.
|
|
191
|
+
*
|
|
192
|
+
* Example bid won data:
|
|
193
|
+
*
|
|
194
|
+
* {
|
|
195
|
+
* "bidder": "example",
|
|
196
|
+
* "width": 300,
|
|
197
|
+
* "height": 250,
|
|
198
|
+
* "adId": "330a22bdea4cac",
|
|
199
|
+
* "mediaType": "banner",
|
|
200
|
+
* "cpm": 0.28
|
|
201
|
+
* "ad": "...",
|
|
202
|
+
* "requestId": "418b37f85e772c",
|
|
203
|
+
* "adUnitCode": "div-gpt-ad-1460505748561-0",
|
|
204
|
+
* "size": "350x250",
|
|
205
|
+
* "adserverTargeting": {
|
|
206
|
+
* "hb_bidder": "example",
|
|
207
|
+
* "hb_adid": "330a22bdea4cac",
|
|
208
|
+
* "hb_pb": "0.20",
|
|
209
|
+
* "hb_size": "350x250"
|
|
210
|
+
* }
|
|
211
|
+
* }
|
|
212
|
+
*
|
|
213
|
+
* @param {*} bidData the data associated with the won bid. See example above for data format.
|
|
214
|
+
*/
|
|
215
|
+
onBidWon: function(bidData) {
|
|
216
|
+
logInfo('Bid won: ' + JSON.stringify(bidData));
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
registerBidder(spec);
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
## Overview
|
|
2
|
+
|
|
3
|
+
**Module Name:** Vibrant Media Bidder Adapter
|
|
4
|
+
|
|
5
|
+
**Module Type:** Bidder Adapter
|
|
6
|
+
|
|
7
|
+
**Maintainer:** kormorant@vibrantmedia.com
|
|
8
|
+
|
|
9
|
+
## Description
|
|
10
|
+
|
|
11
|
+
Module that allows Vibrant Media to provide ad bids for banner, native and video (outstream only).
|
|
12
|
+
|
|
13
|
+
## Test Parameters
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
var adUnits = [
|
|
17
|
+
// Banner ad unit
|
|
18
|
+
{
|
|
19
|
+
code: 'test-banner',
|
|
20
|
+
mediaTypes: {
|
|
21
|
+
banner: {
|
|
22
|
+
sizes: [[300, 250], [300, 600]]
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
bids: [{
|
|
26
|
+
bidder: 'vibrantmedia',
|
|
27
|
+
params: {
|
|
28
|
+
placementId: 12345
|
|
29
|
+
}
|
|
30
|
+
}]
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
// Video (outstream) ad unit
|
|
34
|
+
{
|
|
35
|
+
code: 'test-video-outstream',
|
|
36
|
+
sizes: [[300, 250]],
|
|
37
|
+
mediaTypes: {
|
|
38
|
+
video: {
|
|
39
|
+
playerSize: [[300, 250]],
|
|
40
|
+
context: 'outstream',
|
|
41
|
+
minduration: 1, // Minimum ad duration, in seconds
|
|
42
|
+
maxduration: 60, // Maximum ad duration, in seconds
|
|
43
|
+
skip: 0, // 1 - true, 0 - false
|
|
44
|
+
skipafter: 5, // Number of seconds before the video can be skipped
|
|
45
|
+
playbackmethod: [2], // Auto-play without sound
|
|
46
|
+
protocols: [1, 2, 3] // VAST 1.0, 2.0 and 3.0
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
bids: [
|
|
50
|
+
{
|
|
51
|
+
bidder: 'vibrantmedia',
|
|
52
|
+
params: {
|
|
53
|
+
placementId: 67890,
|
|
54
|
+
video: {
|
|
55
|
+
skippable: true,
|
|
56
|
+
playback_method: 'auto_play_sound_off'
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
// Native ad unit
|
|
64
|
+
{
|
|
65
|
+
code: 'test-native',
|
|
66
|
+
mediaTypes: {
|
|
67
|
+
native: {
|
|
68
|
+
image: {
|
|
69
|
+
required: true,
|
|
70
|
+
sizes: [300, 250]
|
|
71
|
+
},
|
|
72
|
+
title: {
|
|
73
|
+
required: true
|
|
74
|
+
},
|
|
75
|
+
sponsoredBy: {
|
|
76
|
+
required: true
|
|
77
|
+
},
|
|
78
|
+
clickUrl: {
|
|
79
|
+
required: true
|
|
80
|
+
},
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
bids: [{
|
|
84
|
+
bidder: 'vibrantmedia',
|
|
85
|
+
params: {
|
|
86
|
+
placementId: 13579,
|
|
87
|
+
allowSmallerSizes: true
|
|
88
|
+
}
|
|
89
|
+
}]
|
|
90
|
+
}
|
|
91
|
+
];
|
|
92
|
+
```
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { logWarn, logInfo, isStr, isFn, triggerPixel, insertHtmlIntoIframe } from '../src/utils.js';
|
|
2
|
+
import { getGlobal } from '../src/prebidGlobal.js';
|
|
3
|
+
import find from 'prebidjs-polyfill/find.js';
|
|
4
|
+
|
|
5
|
+
export const MODULE_NAME = 'viewability';
|
|
6
|
+
|
|
7
|
+
export function init() {
|
|
8
|
+
(getGlobal()).viewability = {
|
|
9
|
+
startMeasurement: startMeasurement,
|
|
10
|
+
stopMeasurement: stopMeasurement,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
listenMessagesFromCreative();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const observers = {};
|
|
17
|
+
|
|
18
|
+
function isValid(vid, element, tracker, criteria) {
|
|
19
|
+
if (!element) {
|
|
20
|
+
logWarn(`${MODULE_NAME}: no html element provided`);
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let validTracker = tracker &&
|
|
25
|
+
((tracker.method === 'img' && isStr(tracker.value)) ||
|
|
26
|
+
(tracker.method === 'js' && isStr(tracker.value)) ||
|
|
27
|
+
(tracker.method === 'callback' && isFn(tracker.value)));
|
|
28
|
+
|
|
29
|
+
if (!validTracker) {
|
|
30
|
+
logWarn(`${MODULE_NAME}: invalid tracker`, tracker);
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (!criteria || !criteria.inViewThreshold || !criteria.timeInView) {
|
|
35
|
+
logWarn(`${MODULE_NAME}: missing criteria`, criteria);
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (!vid || observers[vid]) {
|
|
40
|
+
logWarn(`${MODULE_NAME}: must provide an unregistered vid`, vid);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function stopObserving(observer, vid, element) {
|
|
48
|
+
observer.unobserve(element);
|
|
49
|
+
observers[vid].done = true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function fireViewabilityTracker(element, tracker) {
|
|
53
|
+
switch (tracker.method) {
|
|
54
|
+
case 'img':
|
|
55
|
+
triggerPixel(tracker.value, () => {
|
|
56
|
+
logInfo(`${MODULE_NAME}: viewability pixel fired`, tracker.value);
|
|
57
|
+
});
|
|
58
|
+
break;
|
|
59
|
+
case 'js':
|
|
60
|
+
insertHtmlIntoIframe(`<script src="${tracker.value}"></script>`);
|
|
61
|
+
break;
|
|
62
|
+
case 'callback':
|
|
63
|
+
tracker.value(element);
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function viewabilityCriteriaMet(observer, vid, element, tracker) {
|
|
69
|
+
stopObserving(observer, vid, element);
|
|
70
|
+
fireViewabilityTracker(element, tracker);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Start measuring viewability of an element
|
|
75
|
+
* @typedef {{ method: string='img','js','callback', value: string|function }} ViewabilityTracker { method: 'img', value: 'http://my.tracker/123' }
|
|
76
|
+
* @typedef {{ inViewThreshold: number, timeInView: number }} ViewabilityCriteria { inViewThreshold: 0.5, timeInView: 1000 }
|
|
77
|
+
* @param {string} vid unique viewability identifier
|
|
78
|
+
* @param {HTMLElement} element
|
|
79
|
+
* @param {ViewabilityTracker} tracker
|
|
80
|
+
* @param {ViewabilityCriteria} criteria
|
|
81
|
+
*/
|
|
82
|
+
export function startMeasurement(vid, element, tracker, criteria) {
|
|
83
|
+
if (!isValid(vid, element, tracker, criteria)) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const options = {
|
|
88
|
+
root: null,
|
|
89
|
+
rootMargin: '0px',
|
|
90
|
+
threshold: criteria.inViewThreshold,
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
let observer;
|
|
94
|
+
let viewable = false;
|
|
95
|
+
let stateChange = (entries) => {
|
|
96
|
+
viewable = entries[0].isIntersecting;
|
|
97
|
+
|
|
98
|
+
if (viewable) {
|
|
99
|
+
observers[vid].timeoutId = window.setTimeout(() => {
|
|
100
|
+
viewabilityCriteriaMet(observer, vid, element, tracker);
|
|
101
|
+
}, criteria.timeInView);
|
|
102
|
+
} else if (observers[vid].timeoutId) {
|
|
103
|
+
window.clearTimeout(observers[vid].timeoutId);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
observer = new IntersectionObserver(stateChange, options);
|
|
108
|
+
observers[vid] = {
|
|
109
|
+
observer: observer,
|
|
110
|
+
element: element,
|
|
111
|
+
timeoutId: null,
|
|
112
|
+
done: false,
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
observer.observe(element);
|
|
116
|
+
|
|
117
|
+
logInfo(`${MODULE_NAME}: startMeasurement called with:`, arguments);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Stop measuring viewability of an element
|
|
122
|
+
* @param {string} vid unique viewability identifier
|
|
123
|
+
*/
|
|
124
|
+
export function stopMeasurement(vid) {
|
|
125
|
+
if (!vid || !observers[vid]) {
|
|
126
|
+
logWarn(`${MODULE_NAME}: must provide a registered vid`, vid);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
observers[vid].observer.unobserve(observers[vid].element);
|
|
131
|
+
if (observers[vid].timeoutId) {
|
|
132
|
+
window.clearTimeout(observers[vid].timeoutId);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// allow the observer under this vid to be created again
|
|
136
|
+
if (!observers[vid].done) {
|
|
137
|
+
delete observers[vid];
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function listenMessagesFromCreative() {
|
|
142
|
+
window.addEventListener('message', receiveMessage, false);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Recieve messages from creatives
|
|
147
|
+
* @param {MessageEvent} evt
|
|
148
|
+
*/
|
|
149
|
+
export function receiveMessage(evt) {
|
|
150
|
+
var key = evt.message ? 'message' : 'data';
|
|
151
|
+
var data = {};
|
|
152
|
+
try {
|
|
153
|
+
data = JSON.parse(evt[key]);
|
|
154
|
+
} catch (e) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (!data || data.message !== 'Prebid Viewability') {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
switch (data.action) {
|
|
163
|
+
case 'startMeasurement':
|
|
164
|
+
let element = data.elementId && document.getElementById(data.elementId);
|
|
165
|
+
if (!element) {
|
|
166
|
+
element = find(document.getElementsByTagName('IFRAME'), iframe => (iframe.contentWindow || iframe.contentDocument.defaultView) == evt.source);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
startMeasurement(data.vid, element, data.tracker, data.criteria);
|
|
170
|
+
break;
|
|
171
|
+
case 'stopMeasurement':
|
|
172
|
+
stopMeasurement(data.vid);
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
init();
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
Module Name: Viewability
|
|
4
|
+
|
|
5
|
+
Purpose: Track when a given HTML element becomes viewable
|
|
6
|
+
|
|
7
|
+
Maintainer: atrajkovic@magnite.com
|
|
8
|
+
|
|
9
|
+
# Configuration
|
|
10
|
+
|
|
11
|
+
Module does not need any configuration, as long as you include it in your PBJS bundle.
|
|
12
|
+
Viewability module has only two functions `startMeasurement` and `stopMeasurement` which can be used to enable more complex viewability measurements. Since it allows tracking from within creative (possibly inside a safe frame) this module registers a message listener, for messages with a format that is described bellow.
|
|
13
|
+
|
|
14
|
+
## `startMeasurement`
|
|
15
|
+
|
|
16
|
+
| startMeasurement Arg Object | Scope | Type | Description | Example |
|
|
17
|
+
| --------------------- | -------- | ------------ | -------------------------------------------------------------------------------- | --------- |
|
|
18
|
+
| vid | Required | String | Unique viewability identifier, used to reference particular observer | `"ae0f9"` |
|
|
19
|
+
| element | Required | HTMLElement | Reference to an HTML element that needs to be tracked | `document.getElementById('test_div')` |
|
|
20
|
+
| tracker | Required | ViewabilityTracker | How viewaility event is communicated back to the parties of interest | `{ method: 'img', value: 'http://my.tracker/123' }` |
|
|
21
|
+
| criteria | Required | ViewabilityCriteria| Defines custom viewability criteria using the threshold and duration provided | `{ inViewThreshold: 0.5, timeInView: 1000 }` |
|
|
22
|
+
|
|
23
|
+
| ViewabilityTracker | Scope | Type | Description | Example |
|
|
24
|
+
| --------------------- | -------- | ------------ | -------------------------------------------------------------------------------- | --------- |
|
|
25
|
+
| method | Required | String | Type of method for Tracker | `'img' OR 'js' OR 'callback'` |
|
|
26
|
+
| value | Required | String | URL string for 'img' and 'js' Trackers, or a function for 'callback' Tracker | `'http://my.tracker/123'` |
|
|
27
|
+
|
|
28
|
+
| ViewabilityCriteria | Scope | Type | Description | Example |
|
|
29
|
+
| --------------------- | -------- | ------------ | -------------------------------------------------------------------------------- | --------- |
|
|
30
|
+
| inViewThreshold | Required | Number | Represents a percentage threshold for the Element to be registered as in view | `0.5` |
|
|
31
|
+
| timeInView | Required | Number | Number of milliseconds that a given element needs to be in view continuously, above the threshold | `1000` |
|
|
32
|
+
|
|
33
|
+
## Please Note:
|
|
34
|
+
- `vid` allows for multiple trackers, with different criteria to be registered for a given HTML element, independently. It's not autogenerated by `startMeasurement()`, it needs to be provided by the caller so that it doesn't have to be posted back to the source iframe (in case viewability is started from within the creative).
|
|
35
|
+
- In case of 'callback' method, HTML element is being passed back to the callback function.
|
|
36
|
+
- When a tracker needs to be started, without direct access to pbjs, postMessage mechanism can be used to invoke `startMeasurement`, with a following payload: `vid`, `tracker` and `criteria` as described above, but also with `message: 'Prebid Viewability'` and `action: 'startMeasurement'`. Optionally payload can provide `elementId`, if available at that time (for ad servers where name of the iframe is known, or adservers that render outside an iframe). If `elementId` is not provided, viewability module will try to find the iframe that corresponds to the message source.
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
## `stopMeasurement`
|
|
40
|
+
|
|
41
|
+
| stopMeasurement Arg Object | Scope | Type | Description | Example |
|
|
42
|
+
| --------------------- | -------- | ------------ | -------------------------------------------------------------------------------- | --------- |
|
|
43
|
+
| vid | Required | String | Unique viewability identifier, referencing an already started viewability tracker. | `"ae0f9"` |
|
|
44
|
+
|
|
45
|
+
## Please Note:
|
|
46
|
+
- When a tracker needs to be stopped, without direct access to pbjs, postMessage mechanism can be used here as well. To invoke `stopMeasurement`, you provide the payload with `vid`, `message: 'Prebid Viewability'` and `action: 'stopMeasurement`. Check the example bellow.
|
|
47
|
+
|
|
48
|
+
# Examples
|
|
49
|
+
|
|
50
|
+
## Example of starting a viewability measurement, when you have direct access to pbjs
|
|
51
|
+
```
|
|
52
|
+
pbjs.viewability.startMeasurement(
|
|
53
|
+
'ae0f9',
|
|
54
|
+
document.getElementById('test_div'),
|
|
55
|
+
{ method: 'img', value: 'http://my.tracker/123' },
|
|
56
|
+
{ inViewThreshold: 0.5, timeInView: 1000 }
|
|
57
|
+
);
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Example of starting a viewability measurement from within a rendered creative
|
|
61
|
+
```
|
|
62
|
+
let viewabilityRecord = {
|
|
63
|
+
vid: 'ae0f9',
|
|
64
|
+
tracker: { method: 'img', value: 'http://my.tracker/123'},
|
|
65
|
+
criteria: { inViewThreshold: 0.5, timeInView: 1000 },
|
|
66
|
+
message: 'Prebid Viewability',
|
|
67
|
+
action: 'startMeasurement'
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
window.parent.postMessage(JSON.stringify(viewabilityRecord), '*');
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Example of stopping the viewability measurement, when you have direct access to pbjs
|
|
74
|
+
```
|
|
75
|
+
pbjs.viewability.stopMeasurement('ae0f9');
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Example of stopping the viewability measurement from within a rendered creative
|
|
79
|
+
```
|
|
80
|
+
let viewabilityRecord = {
|
|
81
|
+
vid: 'ae0f9',
|
|
82
|
+
message: 'Prebid Viewability',
|
|
83
|
+
action: 'stopMeasurement'
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
window.parent.postMessage(JSON.stringify(viewabilityRecord), '*');
|
|
87
|
+
```
|
|
@@ -2,7 +2,7 @@ import { deepAccess, isArray, flatten, logError, parseSizesInput } from '../src/
|
|
|
2
2
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
3
3
|
import {VIDEO, BANNER} from '../src/mediaTypes.js';
|
|
4
4
|
import {Renderer} from '../src/Renderer.js';
|
|
5
|
-
import findIndex from '
|
|
5
|
+
import findIndex from 'prebidjs-polyfill/findIndex.js';
|
|
6
6
|
|
|
7
7
|
const URL = 'https://ghb.sync.viewdeos.com/auction/';
|
|
8
8
|
const OUTSTREAM_SRC = 'https://player.sync.viewdeos.com/outstream-unit/2.01/outstream.min.js';
|
package/modules/voxBidAdapter.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { _map, logWarn, deepAccess, isArray } from '../src/utils.js';
|
|
2
2
|
import { registerBidder } from '../src/adapters/bidderFactory.js'
|
|
3
3
|
import {BANNER, VIDEO} from '../src/mediaTypes.js'
|
|
4
|
-
import find from '
|
|
4
|
+
import find from 'prebidjs-polyfill/find.js';
|
|
5
5
|
import {auctionManager} from '../src/auctionManager.js';
|
|
6
6
|
import {Renderer} from '../src/Renderer.js';
|
|
7
7
|
|
|
@@ -2,7 +2,7 @@ import { logError, isArray, deepAccess, getBidIdParameter } from '../src/utils.j
|
|
|
2
2
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
3
3
|
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
4
4
|
import {config} from '../src/config.js';
|
|
5
|
-
import find from '
|
|
5
|
+
import find from 'prebidjs-polyfill/find.js';
|
|
6
6
|
|
|
7
7
|
const ENDPOINT = `https://hb.justbidit.xyz:8843/prebid`;
|
|
8
8
|
const BIDDER_CODE = 'waardex';
|