prebid.js 9.8.0 → 9.9.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/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/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/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/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.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/cwireBidAdapter.js +1 -1
- package/dist/dailymotionBidAdapter.js +1 -1
- package/dist/dependencies.json +10 -4
- package/dist/discoveryBidAdapter.js +1 -1
- package/dist/docereeAdManagerBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/dxkultureBidAdapter.js +1 -1
- package/dist/eclickadsBidAdapter.js +1 -0
- 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/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/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/limelightDigitalBidAdapter.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/mediagoBidAdapter.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/missenaBidAdapter.js +1 -1
- package/dist/mobianRtdProvider.js +1 -1
- package/dist/naveggIdSystem.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 +162 -160
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxBidAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/orbidderBidAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/pstudioBidAdapter.js +1 -1
- package/dist/publinkIdSystem.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/richaudienceBidAdapter.js +1 -1
- package/dist/riseUtils.js +1 -1
- 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/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.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/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/tappxBidAdapter.js +1 -1
- package/dist/targetVideoAdServerVideo.js +1 -0
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.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/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/unrulyBidAdapter.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/yahooAdsBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/libraries/teqblazeUtils/bidderUtils.js +1 -1
- package/modules/appnexusBidAdapter.js +1 -1
- package/modules/discoveryBidAdapter.js +1 -3
- package/modules/docereeAdManagerBidAdapter.js +14 -8
- package/modules/eclickadsBidAdapter.js +80 -0
- package/modules/eclickadsBidAdapter.md +55 -0
- package/modules/gumgumBidAdapter.js +6 -2
- package/modules/limelightDigitalBidAdapter.js +1 -1
- package/modules/mediagoBidAdapter.js +1 -3
- package/modules/mobianRtdProvider.js +12 -8
- package/modules/naveggIdSystem.js +62 -58
- package/modules/naveggIdSystem.md +8 -0
- package/modules/oguryBidAdapter.js +5 -2
- package/modules/openxBidAdapter.js +1 -6
- package/modules/pstudioBidAdapter.js +5 -8
- package/modules/pstudioBidAdapter.md +6 -4
- package/modules/richaudienceBidAdapter.js +8 -1
- package/modules/targetVideoAdServerVideo.js +96 -0
- package/modules/targetVideoAdServerVideo.md +26 -0
- package/package.json +1 -1
- package/src/adRendering.js +3 -0
- package/src/adapterManager.js +4 -0
- package/test/spec/modules/discoveryBidAdapter_spec.js +1 -47
- package/test/spec/modules/docereeAdManagerBidAdapter_spec.js +87 -9
- package/test/spec/modules/eclickadsBidAdapter_spec.js +214 -0
- package/test/spec/modules/mobianRtdProvider_spec.js +32 -15
- package/test/spec/modules/naveggIdSystem_spec.js +141 -31
- package/test/spec/modules/oguryBidAdapter_spec.js +50 -4
- package/test/spec/modules/openxBidAdapter_spec.js +15 -48
- package/test/spec/modules/pstudioBidAdapter_spec.js +5 -5
- package/test/spec/modules/richaudienceBidAdapter_spec.js +62 -0
- package/test/spec/modules/targetVideoAdServerVideo_spec.js +179 -0
- package/test/spec/unit/adRendering_spec.js +27 -1
- package/test/spec/unit/core/adapterManager_spec.js +10 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
Module Name: EClickAds Bid Adapter
|
|
4
|
+
Type: Bidder Adapter
|
|
5
|
+
Maintainer: vietlv14@fpt.com
|
|
6
|
+
|
|
7
|
+
# Description
|
|
8
|
+
|
|
9
|
+
This module connects to EClickAds exchange for bidding NATIVE ADS via prebid.js
|
|
10
|
+
|
|
11
|
+
# Test Parameters
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
var adUnits = [{
|
|
15
|
+
code: 'test-div',
|
|
16
|
+
mediaTypes: {
|
|
17
|
+
native: {
|
|
18
|
+
title: {
|
|
19
|
+
required: true,
|
|
20
|
+
len: 50
|
|
21
|
+
},
|
|
22
|
+
body: {
|
|
23
|
+
required: true,
|
|
24
|
+
len: 350
|
|
25
|
+
},
|
|
26
|
+
url: {
|
|
27
|
+
required: true
|
|
28
|
+
},
|
|
29
|
+
image: {
|
|
30
|
+
required: true,
|
|
31
|
+
sizes : [300, 175]
|
|
32
|
+
},
|
|
33
|
+
sponsoredBy: {
|
|
34
|
+
required: true
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
bids: [{
|
|
39
|
+
bidder: 'eclickads',
|
|
40
|
+
params: {
|
|
41
|
+
zid:"7096"
|
|
42
|
+
}
|
|
43
|
+
}]
|
|
44
|
+
}];
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
# Notes:
|
|
48
|
+
|
|
49
|
+
- EClickAdsBidAdapter need serveral params inside bidder config as following
|
|
50
|
+
- user.myvne_id
|
|
51
|
+
- site.orig_aid
|
|
52
|
+
- site.fosp_aid
|
|
53
|
+
- site.id
|
|
54
|
+
- site.orig_aid
|
|
55
|
+
- EClickAdsBidAdapter will set bid.adserverTargeting.hb_ad_eclickads targeting key while submitting bid to AdServer
|
|
@@ -29,13 +29,14 @@ let invalidRequestIds = {};
|
|
|
29
29
|
let pageViewId = null;
|
|
30
30
|
|
|
31
31
|
// TODO: potential 0 values for browserParams sent to ad server
|
|
32
|
-
function _getBrowserParams(topWindowUrl) {
|
|
32
|
+
function _getBrowserParams(topWindowUrl, mosttopLocation) {
|
|
33
33
|
const paramRegex = paramName => new RegExp(`[?#&](${paramName}=(.*?))($|&)`, 'i');
|
|
34
34
|
|
|
35
35
|
let browserParams = {};
|
|
36
36
|
let topWindow;
|
|
37
37
|
let topScreen;
|
|
38
38
|
let topUrl;
|
|
39
|
+
let mosttopURL
|
|
39
40
|
let ggad;
|
|
40
41
|
let ggdeal;
|
|
41
42
|
let ns;
|
|
@@ -74,6 +75,7 @@ function _getBrowserParams(topWindowUrl) {
|
|
|
74
75
|
topWindow = global.top;
|
|
75
76
|
topScreen = topWindow.screen;
|
|
76
77
|
topUrl = topWindowUrl || '';
|
|
78
|
+
mosttopURL = mosttopLocation || '';
|
|
77
79
|
} catch (error) {
|
|
78
80
|
logError(error);
|
|
79
81
|
return browserParams;
|
|
@@ -85,6 +87,7 @@ function _getBrowserParams(topWindowUrl) {
|
|
|
85
87
|
sw: topScreen.width,
|
|
86
88
|
sh: topScreen.height,
|
|
87
89
|
pu: stripGGParams(topUrl),
|
|
90
|
+
tpl: mosttopURL,
|
|
88
91
|
ce: storage.cookiesAreEnabled(),
|
|
89
92
|
dpr: topWindow.devicePixelRatio || 1,
|
|
90
93
|
jcsi: JSON.stringify(JCSI),
|
|
@@ -304,6 +307,7 @@ function buildRequests(validBidRequests, bidderRequest) {
|
|
|
304
307
|
const timeout = bidderRequest && bidderRequest.timeout
|
|
305
308
|
const coppa = config.getConfig('coppa') === true ? 1 : 0;
|
|
306
309
|
const topWindowUrl = bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.page;
|
|
310
|
+
const mosttopLocation = bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.topmostLocation
|
|
307
311
|
_each(validBidRequests, bidRequest => {
|
|
308
312
|
const {
|
|
309
313
|
bidId,
|
|
@@ -443,7 +447,7 @@ function buildRequests(validBidRequests, bidderRequest) {
|
|
|
443
447
|
sizes,
|
|
444
448
|
url: BID_ENDPOINT,
|
|
445
449
|
method: 'GET',
|
|
446
|
-
data: Object.assign(data, _getBrowserParams(topWindowUrl))
|
|
450
|
+
data: Object.assign(data, _getBrowserParams(topWindowUrl, mosttopLocation))
|
|
447
451
|
});
|
|
448
452
|
});
|
|
449
453
|
return bids;
|
|
@@ -9,7 +9,7 @@ import { getPageTitle, getPageDescription, getPageKeywords, getConnectionDownLin
|
|
|
9
9
|
import { getDevice } from '../libraries/fpdUtils/deviceInfo.js';
|
|
10
10
|
import { getBidFloor } from '../libraries/currencyUtils/floor.js';
|
|
11
11
|
import { transformSizes, normalAdSize } from '../libraries/sizeUtils/tranformSize.js';
|
|
12
|
-
import {
|
|
12
|
+
import { getHLen } from '../libraries/navigatorData/navigatorData.js';
|
|
13
13
|
|
|
14
14
|
// import { config } from '../src/config.js';
|
|
15
15
|
// import { isPubcidEnabled } from './pubCommonId.js';
|
|
@@ -271,8 +271,6 @@ function getParam(validBidRequests, bidderRequest) {
|
|
|
271
271
|
},
|
|
272
272
|
device: {
|
|
273
273
|
nbw: getConnectionDownLink(),
|
|
274
|
-
hc: getHC(),
|
|
275
|
-
dm: getDM()
|
|
276
274
|
}
|
|
277
275
|
},
|
|
278
276
|
user: {
|
|
@@ -42,7 +42,7 @@ function getBidRequestData(bidReqConfig, callback, config) {
|
|
|
42
42
|
|
|
43
43
|
let mobianRisk = response.garm_risk || 'unknown';
|
|
44
44
|
|
|
45
|
-
const
|
|
45
|
+
const contentCategories = Object.keys(response)
|
|
46
46
|
.filter(key => key.startsWith('garm_content_category_') && response[key])
|
|
47
47
|
.map(key => key.replace('garm_content_category_', ''));
|
|
48
48
|
|
|
@@ -55,19 +55,23 @@ function getBidRequestData(bidReqConfig, callback, config) {
|
|
|
55
55
|
.map(key => key.replace('emotion_', ''));
|
|
56
56
|
|
|
57
57
|
const risk = {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
risk: mobianRisk,
|
|
59
|
+
contentCategories: contentCategories,
|
|
60
|
+
sentiment: sentiment,
|
|
61
|
+
emotions: emotions
|
|
62
62
|
};
|
|
63
63
|
|
|
64
|
+
deepSetValue(ortb2Site.ext, 'data.mobianRisk', mobianRisk);
|
|
65
|
+
deepSetValue(ortb2Site.ext, 'data.mobianContentCategories', contentCategories);
|
|
66
|
+
deepSetValue(ortb2Site.ext, 'data.mobianSentiment', sentiment);
|
|
67
|
+
deepSetValue(ortb2Site.ext, 'data.mobianEmotions', emotions);
|
|
68
|
+
|
|
64
69
|
resolve(risk);
|
|
65
|
-
|
|
66
|
-
callback()
|
|
70
|
+
callback();
|
|
67
71
|
},
|
|
68
72
|
error: function () {
|
|
69
73
|
resolve({});
|
|
70
|
-
callback()
|
|
74
|
+
callback();
|
|
71
75
|
}
|
|
72
76
|
});
|
|
73
77
|
});
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { isStr, isPlainObject, logError } from '../src/utils.js';
|
|
8
8
|
import { submodule } from '../src/hook.js';
|
|
9
|
-
import {
|
|
10
|
-
import {getStorageManager} from '../src/storageManager.js';
|
|
11
|
-
import {MODULE_TYPE_UID} from '../src/activities/modules.js';
|
|
9
|
+
import { ajaxBuilder } from '../src/ajax.js';
|
|
10
|
+
import { getStorageManager } from '../src/storageManager.js';
|
|
11
|
+
import { MODULE_TYPE_UID } from '../src/activities/modules.js';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* @typedef {import('../modules/userId/index.js').Submodule} Submodule
|
|
@@ -19,61 +19,72 @@ const MODULE_NAME = 'naveggId';
|
|
|
19
19
|
const OLD_NAVEGG_ID = 'nid';
|
|
20
20
|
const NAVEGG_ID = 'nvggid';
|
|
21
21
|
const BASE_URL = 'https://id.navegg.com/uid/';
|
|
22
|
-
const DEFAULT_EXPIRE = 8 * 24 * 3600 * 1000;
|
|
23
|
-
const INVALID_EXPIRE = 3600 * 1000;
|
|
24
22
|
|
|
25
23
|
export const storage = getStorageManager({moduleType: MODULE_TYPE_UID, moduleName: MODULE_NAME});
|
|
26
24
|
|
|
27
|
-
function
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
25
|
+
function getIdFromAPI() {
|
|
26
|
+
const resp = function (callback) {
|
|
27
|
+
ajaxBuilder()(
|
|
28
|
+
BASE_URL,
|
|
29
|
+
response => {
|
|
30
|
+
if (response) {
|
|
31
|
+
let responseObj;
|
|
32
|
+
try {
|
|
33
|
+
responseObj = JSON.parse(response);
|
|
34
|
+
} catch (error) {
|
|
35
|
+
logError(error);
|
|
36
|
+
const fallbackValue = getNaveggIdFromLocalStorage() || getOldCookie();
|
|
37
|
+
callback(fallbackValue);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (responseObj && responseObj[NAVEGG_ID]) {
|
|
41
|
+
callback(responseObj[NAVEGG_ID]);
|
|
42
|
+
} else {
|
|
43
|
+
const fallbackValue = getNaveggIdFromLocalStorage() || getOldCookie();
|
|
44
|
+
callback(fallbackValue);
|
|
45
|
+
}
|
|
36
46
|
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
47
|
+
},
|
|
48
|
+
error => {
|
|
49
|
+
logError('Navegg ID fetch encountered an error', error);
|
|
50
|
+
const fallbackValue = getNaveggIdFromLocalStorage() || getOldCookie();
|
|
51
|
+
callback(fallbackValue);
|
|
52
|
+
},
|
|
53
|
+
{method: 'GET', withCredentials: false});
|
|
42
54
|
};
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function writeCookie(key, value) {
|
|
47
|
-
try {
|
|
48
|
-
if (storage.cookiesAreEnabled) {
|
|
49
|
-
let expTime = new Date();
|
|
50
|
-
const expires = value ? DEFAULT_EXPIRE : INVALID_EXPIRE;
|
|
51
|
-
expTime.setTime(expTime.getTime() + expires);
|
|
52
|
-
storage.setCookie(key, value, expTime.toUTCString(), 'none');
|
|
53
|
-
}
|
|
54
|
-
} catch (e) {
|
|
55
|
-
logError(e);
|
|
56
|
-
}
|
|
55
|
+
return resp;
|
|
57
56
|
}
|
|
58
57
|
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
/**
|
|
59
|
+
* @returns {string | null}
|
|
60
|
+
*/
|
|
61
|
+
function readNvgIdFromCookie() {
|
|
62
|
+
return storage.cookiesAreEnabled ? (storage.findSimilarCookies('nvg') ? storage.findSimilarCookies('nvg')[0] : null) : null;
|
|
61
63
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
/**
|
|
65
|
+
* @returns {string | null}
|
|
66
|
+
*/
|
|
67
|
+
function readNavIdFromCookie() {
|
|
68
|
+
return storage.cookiesAreEnabled() ? (storage.findSimilarCookies('nav') ? storage.findSimilarCookies('nav')[0] : null) : null;
|
|
65
69
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
70
|
+
/**
|
|
71
|
+
* @returns {string | null}
|
|
72
|
+
*/
|
|
73
|
+
function readOldNaveggIdFromCookie() {
|
|
74
|
+
return storage.cookiesAreEnabled() ? storage.getCookie(OLD_NAVEGG_ID) : null;
|
|
69
75
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
76
|
+
/**
|
|
77
|
+
* @returns {string | null}
|
|
78
|
+
*/
|
|
79
|
+
function getOldCookie() {
|
|
80
|
+
const oldCookie = readOldNaveggIdFromCookie() || readNvgIdFromCookie() || readNavIdFromCookie();
|
|
81
|
+
return oldCookie;
|
|
73
82
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
83
|
+
/**
|
|
84
|
+
* @returns {string | null}
|
|
85
|
+
*/
|
|
86
|
+
function getNaveggIdFromLocalStorage() {
|
|
87
|
+
return storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(NAVEGG_ID) : null;
|
|
77
88
|
}
|
|
78
89
|
|
|
79
90
|
/** @type {Submodule} */
|
|
@@ -95,23 +106,16 @@ export const naveggIdSubmodule = {
|
|
|
95
106
|
'naveggId': naveggIdVal.split('|')[0]
|
|
96
107
|
} : undefined;
|
|
97
108
|
},
|
|
109
|
+
|
|
98
110
|
/**
|
|
99
111
|
* performs action to obtain id and return a value in the callback's response argument
|
|
100
112
|
* @function
|
|
101
113
|
* @param {SubmoduleConfig} config
|
|
102
114
|
* @return {{id: string | undefined } | undefined}
|
|
103
115
|
*/
|
|
104
|
-
getId() {
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
if (typeof naveggIdString == 'string' && naveggIdString) {
|
|
108
|
-
try {
|
|
109
|
-
return { id: naveggIdString };
|
|
110
|
-
} catch (error) {
|
|
111
|
-
logError(error);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return undefined;
|
|
116
|
+
getId(config, consentData) {
|
|
117
|
+
const resp = getIdFromAPI()
|
|
118
|
+
return {callback: resp}
|
|
115
119
|
},
|
|
116
120
|
eids: {
|
|
117
121
|
'naveggId': {
|
|
@@ -10,6 +10,11 @@ pbjs.setConfig({
|
|
|
10
10
|
userSync: {
|
|
11
11
|
userIds: [{
|
|
12
12
|
name: 'naveggId',
|
|
13
|
+
storage: {
|
|
14
|
+
name : 'nvggid',
|
|
15
|
+
type : 'cookie&html5',
|
|
16
|
+
expires: 8
|
|
17
|
+
}
|
|
13
18
|
}]
|
|
14
19
|
}
|
|
15
20
|
});
|
|
@@ -20,3 +25,6 @@ The below parameters apply only to the naveggID integration.
|
|
|
20
25
|
| Param under usersync.userIds[] | Scope | Type | Description | Example |
|
|
21
26
|
| --- | --- | --- | --- | --- |
|
|
22
27
|
| name | Required | String | ID of the module - `"naveggId"` | `"naveggId"` |
|
|
28
|
+
| storage.name | Required | String | The name of the cookie or html5 local storage where the user ID will be stored. | `"nvggid"` |
|
|
29
|
+
| storage.type | Required | String | Must be "`cookie`", "`html5`" or "`cookie&html5`". This is where the results of the user ID will be stored. | `"cookie&html5"` |
|
|
30
|
+
| storage.expires | Required | Integer | How long (in days) the user ID information will be stored. | `8` |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
import {BANNER} from '../src/mediaTypes.js';
|
|
4
|
-
import {getWindowSelf, getWindowTop, isFn, logWarn} from '../src/utils.js';
|
|
4
|
+
import {getWindowSelf, getWindowTop, isFn, logWarn, deepAccess} from '../src/utils.js';
|
|
5
5
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
6
6
|
import {ajax} from '../src/ajax.js';
|
|
7
7
|
import {getAdUnitSizes} from '../libraries/sizeUtils/sizeUtils.js';
|
|
@@ -12,7 +12,7 @@ const DEFAULT_TIMEOUT = 1000;
|
|
|
12
12
|
const BID_HOST = 'https://mweb-hb.presage.io/api/header-bidding-request';
|
|
13
13
|
const TIMEOUT_MONITORING_HOST = 'https://ms-ads-monitoring-events.presage.io';
|
|
14
14
|
const MS_COOKIE_SYNC_DOMAIN = 'https://ms-cookie-sync.presage.io';
|
|
15
|
-
const ADAPTER_VERSION = '1.6.
|
|
15
|
+
const ADAPTER_VERSION = '1.6.1';
|
|
16
16
|
|
|
17
17
|
function getClientWidth() {
|
|
18
18
|
const documentElementClientWidth = window.top.document.documentElement.clientWidth
|
|
@@ -129,6 +129,8 @@ function buildRequests(validBidRequests, bidderRequest) {
|
|
|
129
129
|
openRtbBidRequestBanner.user.ext.eids = bidRequest.userIdAsEids
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
+
const gpid = deepAccess(bidRequest, 'ortb2Imp.ext.gpid');
|
|
133
|
+
|
|
132
134
|
openRtbBidRequestBanner.imp.push({
|
|
133
135
|
id: bidRequest.bidId,
|
|
134
136
|
tagid: bidRequest.params.adUnitId,
|
|
@@ -138,6 +140,7 @@ function buildRequests(validBidRequests, bidderRequest) {
|
|
|
138
140
|
},
|
|
139
141
|
ext: {
|
|
140
142
|
...bidRequest.params,
|
|
143
|
+
...(gpid && {gpid}),
|
|
141
144
|
timeSpentOnPage: document.timeline && document.timeline.currentTime ? document.timeline.currentTime : 0
|
|
142
145
|
}
|
|
143
146
|
});
|
|
@@ -80,11 +80,6 @@ const converter = ortbConverter({
|
|
|
80
80
|
bidResponse.meta.advertiserId = bid.ext.buyer_id;
|
|
81
81
|
bidResponse.meta.brandId = bid.ext.brand_id;
|
|
82
82
|
}
|
|
83
|
-
const {ortbResponse} = context;
|
|
84
|
-
if (ortbResponse.ext && ortbResponse.ext.paf) {
|
|
85
|
-
bidResponse.meta.paf = Object.assign({}, ortbResponse.ext.paf);
|
|
86
|
-
bidResponse.meta.paf.content_id = utils.deepAccess(bid, 'ext.paf.content_id');
|
|
87
|
-
}
|
|
88
83
|
return bidResponse;
|
|
89
84
|
},
|
|
90
85
|
response(buildResponse, bidResponses, ortbResponse, context) {
|
|
@@ -117,7 +112,7 @@ const converter = ortbConverter({
|
|
|
117
112
|
paapi: fledgeAuctionConfigs,
|
|
118
113
|
}
|
|
119
114
|
} else {
|
|
120
|
-
return response
|
|
115
|
+
return response
|
|
121
116
|
}
|
|
122
117
|
},
|
|
123
118
|
overrides: {
|
|
@@ -6,8 +6,6 @@ import {
|
|
|
6
6
|
isNumber,
|
|
7
7
|
generateUUID,
|
|
8
8
|
isEmpty,
|
|
9
|
-
isFn,
|
|
10
|
-
isPlainObject,
|
|
11
9
|
} from '../src/utils.js';
|
|
12
10
|
import { getStorageManager } from '../src/storageManager.js';
|
|
13
11
|
|
|
@@ -59,7 +57,7 @@ export const spec = {
|
|
|
59
57
|
|
|
60
58
|
isBidRequestValid: function (bid) {
|
|
61
59
|
const params = bid.params || {};
|
|
62
|
-
return !!params.pubid && !!params.
|
|
60
|
+
return !!params.pubid && !!params.adtagid && isVideoRequestValid(bid);
|
|
63
61
|
},
|
|
64
62
|
|
|
65
63
|
buildRequests: function (validBidRequests, bidderRequest) {
|
|
@@ -145,7 +143,7 @@ function buildRequestData(bid, bidderRequest) {
|
|
|
145
143
|
|
|
146
144
|
function buildBaseObject(bid, bidderRequest) {
|
|
147
145
|
const firstPartyData = prepareFirstPartyData(bidderRequest.ortb2);
|
|
148
|
-
const { pubid, bcat, badv, bapp } = bid.params;
|
|
146
|
+
const { pubid, adtagid, bcat, badv, bapp } = bid.params;
|
|
149
147
|
const { userId } = bid;
|
|
150
148
|
const uid2Token = userId?.uid2?.id;
|
|
151
149
|
|
|
@@ -168,8 +166,7 @@ function buildBaseObject(bid, bidderRequest) {
|
|
|
168
166
|
return {
|
|
169
167
|
id: bid.bidId,
|
|
170
168
|
pubid,
|
|
171
|
-
|
|
172
|
-
adtagid: bid.adUnitCode,
|
|
169
|
+
adtagid: adtagid,
|
|
173
170
|
...(bcat && { bcat }),
|
|
174
171
|
...(badv && { badv }),
|
|
175
172
|
...(bapp && { bapp }),
|
|
@@ -417,7 +414,7 @@ function validateSizes(sizes) {
|
|
|
417
414
|
);
|
|
418
415
|
}
|
|
419
416
|
|
|
420
|
-
function getBidFloor(bid) {
|
|
417
|
+
/* function getBidFloor(bid) {
|
|
421
418
|
if (!isFn(bid.getFloor)) {
|
|
422
419
|
return bid.params.floorPrice ? bid.params.floorPrice : null;
|
|
423
420
|
}
|
|
@@ -431,6 +428,6 @@ function getBidFloor(bid) {
|
|
|
431
428
|
return floor.floor;
|
|
432
429
|
}
|
|
433
430
|
return null;
|
|
434
|
-
}
|
|
431
|
+
} */
|
|
435
432
|
|
|
436
433
|
registerBidder(spec);
|
|
@@ -31,7 +31,8 @@ var adUnits = [
|
|
|
31
31
|
params: {
|
|
32
32
|
// id of test publisher
|
|
33
33
|
pubid: '22430f9d-9610-432c-aabe-6134256f11af',
|
|
34
|
-
|
|
34
|
+
// id of test adtag id
|
|
35
|
+
adtagid: '6f3173b9-5623-4a4f-8c62-2b1d24ceb4e6',
|
|
35
36
|
},
|
|
36
37
|
},
|
|
37
38
|
],
|
|
@@ -53,7 +54,8 @@ var adUnits = [
|
|
|
53
54
|
params: {
|
|
54
55
|
// id of test publisher
|
|
55
56
|
pubid: '22430f9d-9610-432c-aabe-6134256f11af',
|
|
56
|
-
|
|
57
|
+
// id of test adtag id
|
|
58
|
+
adtagid: '097c601f-ad09-495b-b70b-d9cf6f1edbc1',
|
|
57
59
|
},
|
|
58
60
|
},
|
|
59
61
|
],
|
|
@@ -79,7 +81,7 @@ var adUnits = [
|
|
|
79
81
|
bidder: 'pstudio',
|
|
80
82
|
params: {
|
|
81
83
|
pubid: '22430f9d-9610-432c-aabe-6134256f11af', // required
|
|
82
|
-
|
|
84
|
+
adtagid: 'b9be4c35-3c12-4fa9-96ba-34b90276208c', // required
|
|
83
85
|
bcat: ['IAB1-1', 'IAB1-3'], // optional
|
|
84
86
|
badv: ['nike.com'], // optional
|
|
85
87
|
bapp: ['com.foo.mygame'], // optional
|
|
@@ -121,7 +123,7 @@ var videoAdUnits = [
|
|
|
121
123
|
bidder: 'pstudio',
|
|
122
124
|
params: {
|
|
123
125
|
pubid: '22430f9d-9610-432c-aabe-6134256f11af',
|
|
124
|
-
|
|
126
|
+
adtagid: '46e348cf-b79d-43e5-81bc-5954cdf15d7e',
|
|
125
127
|
badv: ['adidas.com'],
|
|
126
128
|
},
|
|
127
129
|
},
|
|
@@ -55,7 +55,9 @@ export const spec = {
|
|
|
55
55
|
cpuc: (typeof window.navigator != 'undefined' ? window.navigator.hardwareConcurrency : null),
|
|
56
56
|
kws: getAllOrtbKeywords(bidderRequest.ortb2, bid.params.keywords).join(','),
|
|
57
57
|
schain: bid.schain,
|
|
58
|
-
gpid: raiSetPbAdSlot(bid)
|
|
58
|
+
gpid: raiSetPbAdSlot(bid),
|
|
59
|
+
dsa: setDSA(bid),
|
|
60
|
+
userData: deepAccess(bid, 'ortb2.user.data')
|
|
59
61
|
};
|
|
60
62
|
|
|
61
63
|
REFERER = (typeof bidderRequest.refererInfo.page != 'undefined' ? encodeURIComponent(bidderRequest.refererInfo.page) : null)
|
|
@@ -373,3 +375,8 @@ function raiGetTimeoutURL(data) {
|
|
|
373
375
|
}
|
|
374
376
|
return url
|
|
375
377
|
}
|
|
378
|
+
|
|
379
|
+
function setDSA(bid) {
|
|
380
|
+
let dsa = bid?.ortb2?.regs?.ext?.dsa ? bid?.ortb2?.regs?.ext?.dsa : null;
|
|
381
|
+
return dsa;
|
|
382
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { registerVideoSupport } from '../src/adServerManager.js';
|
|
2
|
+
import { targeting } from '../src/targeting.js';
|
|
3
|
+
import { buildUrl, isEmpty, isPlainObject, logError, parseUrl } from '../src/utils.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Merge all the bid data and publisher-supplied options into a single URL, and then return it.
|
|
7
|
+
* @param {Object} options - The options object.
|
|
8
|
+
* @param {Object} options.params - params property.
|
|
9
|
+
* @param {string} options.params.iu - Required iu property.
|
|
10
|
+
* @param {Object} options.adUnit - adUnit property.
|
|
11
|
+
* @param {Object} [options.bid] - Optional bid property.
|
|
12
|
+
* @returns {string|undefined} The generated URL (if neither bid nor adUnit property is provided the generated string is undefined).
|
|
13
|
+
*/
|
|
14
|
+
export function buildVideoUrl(options) {
|
|
15
|
+
if (!options.params || !options.params?.iu) {
|
|
16
|
+
logError('buildVideoUrl: Missing required properties.');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (!isPlainObject(options.adUnit) && !isPlainObject(options.bid)) {
|
|
21
|
+
logError('buildVideoUrl: Requires either \'adUnit\' or \'bid\' options value');
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const isURL = /^(https?:\/\/)/i;
|
|
26
|
+
const defaultParameters = {
|
|
27
|
+
autoplay: '[autoplay]',
|
|
28
|
+
mute: '[vpmute]',
|
|
29
|
+
page_url: '[page_url]',
|
|
30
|
+
cachebuster: '[timestamp]',
|
|
31
|
+
consent: '[consent]',
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const adUnit = options.adUnit;
|
|
35
|
+
const bid = options.bid || targeting.getWinningBids(adUnit.code)[0];
|
|
36
|
+
const allTargetingData = getAllTargetingData(options);
|
|
37
|
+
const custParams = options.params.cust_params;
|
|
38
|
+
let iu = options.params.iu;
|
|
39
|
+
|
|
40
|
+
if (isURL.test(iu)) {
|
|
41
|
+
const urlComponents = parseUrl(iu, {noDecodeWholeURL: true});
|
|
42
|
+
|
|
43
|
+
for (const [key, value] of Object.entries({...allTargetingData, ...bid.adserverTargeting, ...defaultParameters})) {
|
|
44
|
+
if (!urlComponents.search.hasOwnProperty(key)) {
|
|
45
|
+
urlComponents.search[key] = value;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (urlComponents.search.cust_params) {
|
|
50
|
+
for (const [key, value] of Object.entries(custParams)) {
|
|
51
|
+
if (!urlComponents.search.cust_params.includes(key)) {
|
|
52
|
+
urlComponents.search.cust_params += '%26' + key + '%3D' + value;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (!isEmpty(custParams) && !urlComponents.search.cust_params) {
|
|
58
|
+
urlComponents.search.cust_params = Object.entries(custParams).map(([key, value]) => key + '%3D' + value).join('%26');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return buildUrl(urlComponents);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const search = {
|
|
65
|
+
iu,
|
|
66
|
+
...defaultParameters,
|
|
67
|
+
...allTargetingData,
|
|
68
|
+
...bid.adserverTargeting,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
if (!isEmpty(custParams)) {
|
|
72
|
+
search.cust_params = Object.entries(custParams).map(([key, value]) => key + '%3D' + value).join('%26');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return buildUrl({
|
|
76
|
+
protocol: 'https',
|
|
77
|
+
host: 'vid.tvserve.io',
|
|
78
|
+
pathname: '/ads/bid',
|
|
79
|
+
search
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function getAllTargetingData(options) {
|
|
84
|
+
let allTargetingData = {};
|
|
85
|
+
const adUnit = options && options.adUnit;
|
|
86
|
+
if (adUnit) {
|
|
87
|
+
let allTargeting = targeting.getAllTargeting(adUnit.code);
|
|
88
|
+
allTargetingData = allTargeting ? allTargeting[adUnit.code] : {};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return allTargetingData;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
registerVideoSupport('targetVideo', {
|
|
95
|
+
buildVideoUrl,
|
|
96
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
Module Name: Target Video Ad Server Video
|
|
5
|
+
Module Type: Ad Server Video
|
|
6
|
+
Maintainer: danijel.ristic@target-video.com
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
# Description
|
|
10
|
+
|
|
11
|
+
Ad Server Video for target-video.com. Contact danijel.ristic@target-video.com for information.
|
|
12
|
+
|
|
13
|
+
# Integration
|
|
14
|
+
|
|
15
|
+
The helper function takes the form:
|
|
16
|
+
|
|
17
|
+
pbjs.adServers.targetVideo.buildVideoUrl(options)
|
|
18
|
+
|
|
19
|
+
Where:
|
|
20
|
+
|
|
21
|
+
* **`options`:** configuration object:
|
|
22
|
+
* **`params`:**
|
|
23
|
+
* **`iu`:** required property used to construct valid VAST tag URL
|
|
24
|
+
* **`adUnit`:** ad unit that is being filled
|
|
25
|
+
* **`bid` [optional]:** if you override the hardcoded `pbjs.adServers.dfp.buildVideoUrl(...)` logic that picks the first bid you *must* pass in the `bid` object you select
|
|
26
|
+
* **`url`:** VAST tag URL, similar to the value returned by `pbjs.adServers.dfp.buildVideoUrl(...)`
|
package/package.json
CHANGED
package/src/adRendering.js
CHANGED
|
@@ -18,6 +18,7 @@ import {getCreativeRenderer} from './creativeRenderers.js';
|
|
|
18
18
|
import {hook} from './hook.js';
|
|
19
19
|
import {fireNativeTrackers} from './native.js';
|
|
20
20
|
import {GreedyPromise} from './utils/promise.js';
|
|
21
|
+
import adapterManager from './adapterManager.js';
|
|
21
22
|
|
|
22
23
|
const { AD_RENDER_FAILED, AD_RENDER_SUCCEEDED, STALE_RENDER, BID_WON } = EVENTS;
|
|
23
24
|
const { EXCEPTION } = AD_RENDER_FAILED_REASON;
|
|
@@ -68,6 +69,8 @@ export function emitAdRenderSucceeded({ doc, bid, id }) {
|
|
|
68
69
|
if (bid) data.bid = bid;
|
|
69
70
|
if (id) data.adId = id;
|
|
70
71
|
|
|
72
|
+
adapterManager.callAdRenderSucceededBidder(bid.adapterCode || bid.bidder, bid);
|
|
73
|
+
|
|
71
74
|
events.emit(AD_RENDER_SUCCEEDED, data);
|
|
72
75
|
}
|
|
73
76
|
|
package/src/adapterManager.js
CHANGED
|
@@ -688,6 +688,10 @@ adapterManager.callBidderError = function(bidder, error, bidderRequest) {
|
|
|
688
688
|
tryCallBidderMethod(bidder, 'onBidderError', param);
|
|
689
689
|
};
|
|
690
690
|
|
|
691
|
+
adapterManager.callAdRenderSucceededBidder = function (bidder, bid) {
|
|
692
|
+
tryCallBidderMethod(bidder, 'onAdRenderSucceeded', bid);
|
|
693
|
+
}
|
|
694
|
+
|
|
691
695
|
function resolveAlias(alias) {
|
|
692
696
|
const seen = new Set();
|
|
693
697
|
while (_aliasRegistry.hasOwnProperty(alias) && !seen.has(alias)) {
|