prebid.js 5.16.0 → 5.20.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/.devcontainer/Dockerfile +11 -0
- package/.devcontainer/devcontainer.json +27 -0
- package/.devcontainer/postCreate.sh +6 -0
- package/browsers.json +1 -0
- package/integrationExamples/gpt/akamaidap_segments_example.html +132 -0
- package/modules/.submodules.json +1 -0
- package/modules/adfBidAdapter.js +21 -16
- package/modules/adgenerationBidAdapter.js +28 -4
- package/modules/adkernelBidAdapter.js +3 -1
- package/modules/admixerBidAdapter.js +11 -0
- package/modules/adnuntiusBidAdapter.js +1 -0
- package/modules/adtelligentBidAdapter.js +2 -1
- package/modules/airgridRtdProvider.js +1 -1
- package/modules/akamaiDapRtdProvider.js +474 -0
- package/modules/akamaiDapRtdProvider.md +47 -0
- package/modules/aolBidAdapter.js +2 -1
- package/modules/appnexusBidAdapter.js +5 -3
- package/modules/atsAnalyticsAdapter.js +89 -63
- package/modules/atsAnalyticsAdapter.md +1 -0
- package/modules/betweenBidAdapter.js +20 -3
- package/modules/bliinkBidAdapter.js +58 -32
- package/modules/bliinkBidAdapter.md +29 -6
- package/modules/browsiRtdProvider.js +106 -18
- package/modules/cleanioRtdProvider.js +192 -0
- package/modules/cleanioRtdProvider.md +59 -0
- package/modules/codefuelBidAdapter.js +183 -0
- package/modules/codefuelBidAdapter.md +111 -0
- package/modules/connectIdSystem.js +104 -0
- package/modules/connectIdSystem.md +33 -0
- package/modules/cwireBidAdapter.js +272 -0
- package/modules/cwireBidAdapter.md +43 -0
- package/modules/deepintentBidAdapter.js +106 -9
- package/modules/deepintentBidAdapter.md +36 -1
- package/modules/deltaprojectsBidAdapter.js +252 -0
- package/modules/deltaprojectsBidAdapter.md +32 -0
- package/modules/dgkeywordRtdProvider.js +0 -1
- package/modules/engageyaBidAdapter.js +157 -0
- package/modules/glimpseBidAdapter.js +160 -48
- package/modules/glimpseBidAdapter.md +11 -74
- package/modules/gridBidAdapter.js +1 -0
- package/modules/gridNMBidAdapter.js +7 -6
- package/modules/gumgumBidAdapter.js +16 -2
- package/modules/iasRtdProvider.js +83 -67
- package/modules/inskinBidAdapter.js +7 -3
- package/modules/ixBidAdapter.js +8 -1
- package/modules/jixieBidAdapter.js +8 -2
- package/modules/justpremiumBidAdapter.js +6 -1
- package/modules/kargoBidAdapter.js +14 -7
- package/modules/kargoBidAdapter.md +20 -0
- package/modules/limelightDigitalBidAdapter.js +22 -2
- package/modules/livewrappedAnalyticsAdapter.js +53 -3
- package/modules/mediakeysBidAdapter.js +405 -14
- package/modules/mediakeysBidAdapter.md +108 -0
- package/modules/multibid/index.js +3 -3
- package/modules/mytargetBidAdapter.js +112 -0
- package/modules/nativoBidAdapter.js +48 -29
- package/modules/nativoBidAdapter.md +0 -1
- package/modules/nextMillenniumBidAdapter.js +12 -3
- package/modules/nextrollBidAdapter.js +375 -0
- package/modules/nobidBidAdapter.js +2 -1
- package/modules/oguryBidAdapter.js +36 -7
- package/modules/openxBidAdapter.js +34 -22
- package/modules/operaadsBidAdapter.js +21 -1
- package/modules/otmBidAdapter.js +146 -0
- package/modules/otmBidAdapter.md +27 -26
- package/modules/outbrainBidAdapter.js +5 -0
- package/modules/pixfutureBidAdapter.js +24 -4
- package/modules/pixfutureBidAdapter.md +127 -0
- package/modules/playwireBidAdapter.md +61 -0
- package/modules/prebidServerBidAdapter/index.js +1 -1
- package/modules/proxistoreBidAdapter.js +4 -6
- package/modules/publinkIdSystem.js +17 -7
- package/modules/publinkIdSystem.md +7 -2
- package/modules/pubmaticBidAdapter.js +22 -6
- package/modules/pubmaticBidAdapter.md +1 -1
- package/modules/relaidoBidAdapter.js +8 -2
- package/modules/rtdModule/index.js +2 -2
- package/modules/sharethroughBidAdapter.js +12 -19
- package/modules/slimcutBidAdapter.js +121 -0
- package/modules/sonobiBidAdapter.js +7 -0
- package/modules/sortableBidAdapter.js +1 -0
- package/modules/spotxBidAdapter.js +15 -1
- package/modules/sspBCBidAdapter.js +207 -12
- package/modules/sspBCBidAdapter.md +1 -1
- package/modules/talkadsBidAdapter.js +129 -0
- package/modules/talkadsBidAdapter.md +60 -0
- package/modules/tappxBidAdapter.js +6 -5
- package/modules/teadsBidAdapter.js +3 -0
- package/modules/tripleliftBidAdapter.js +22 -5
- package/modules/trustxBidAdapter.js +17 -11
- package/modules/undertoneBidAdapter.js +9 -5
- package/modules/undertoneBidAdapter.md +5 -1
- package/modules/unicornBidAdapter.js +3 -3
- package/modules/userId/eids.js +18 -0
- package/modules/userId/eids.md +7 -0
- package/modules/userId/userId.md +12 -0
- package/modules/ventesBidAdapter.js +370 -0
- package/modules/ventesBidAdapter.md +94 -0
- package/modules/videobyteBidAdapter.js +13 -6
- package/modules/videobyteBidAdapter.md +49 -0
- package/modules/vidoomyBidAdapter.js +20 -12
- package/modules/visxBidAdapter.js +15 -22
- package/modules/yahoosspBidAdapter.js +637 -0
- package/modules/yahoosspBidAdapter.md +795 -0
- package/modules/yieldlabBidAdapter.js +48 -3
- package/modules/yieldlabBidAdapter.md +16 -1
- package/modules/yieldmoBidAdapter.js +20 -6
- package/modules/yieldmoSyntheticInventoryModule.js +46 -0
- package/modules/yieldmoSyntheticInventoryModule.md +68 -0
- package/package.json +1 -1
- package/src/adapterManager.js +5 -0
- package/src/adapters/bidderFactory.js +4 -3
- package/src/auction.js +11 -11
- package/src/constants.json +1 -0
- package/src/secureCreatives.js +6 -7
- package/src/targeting.js +11 -9
- package/test/.eslintrc.js +2 -1
- package/test/spec/modules/adfBidAdapter_spec.js +83 -29
- package/test/spec/modules/adgenerationBidAdapter_spec.js +121 -50
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +68 -0
- package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
- package/test/spec/modules/akamaiDapRtdProvider_spec.js +246 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +2 -1
- package/test/spec/modules/atsAnalyticsAdapter_spec.js +77 -9
- package/test/spec/modules/betweenBidAdapter_spec.js +41 -0
- package/test/spec/modules/bliinkBidAdapter_spec.js +87 -36
- package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
- package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
- package/test/spec/modules/codefuelBidAdapter_spec.js +316 -0
- package/test/spec/modules/connectIdSystem_spec.js +189 -0
- package/test/spec/modules/cwireBidAdapter_spec.js +246 -0
- package/test/spec/modules/deepintentBidAdapter_spec.js +153 -3
- package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
- package/test/spec/modules/engageyaBidAdapter_spec.js +286 -0
- package/test/spec/modules/glimpseBidAdapter_spec.js +302 -204
- package/test/spec/modules/gridNMBidAdapter_spec.js +40 -1
- package/test/spec/modules/gumgumBidAdapter_spec.js +23 -6
- package/test/spec/modules/iasRtdProvider_spec.js +71 -6
- package/test/spec/modules/ixBidAdapter_spec.js +13 -3
- package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
- package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
- package/test/spec/modules/limelightDigitalBidAdapter_spec.js +155 -1
- package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +67 -12
- package/test/spec/modules/mediakeysBidAdapter_spec.js +406 -51
- package/test/spec/modules/multibid_spec.js +31 -31
- package/test/spec/modules/mytargetBidAdapter_spec.js +199 -0
- package/test/spec/modules/nativoBidAdapter_spec.js +50 -3
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +13 -1
- package/test/spec/modules/nextrollBidAdapter_spec.js +290 -0
- package/test/spec/modules/nobidBidAdapter_spec.js +65 -1
- package/test/spec/modules/oguryBidAdapter_spec.js +125 -37
- package/test/spec/modules/openxBidAdapter_spec.js +85 -13
- package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
- package/test/spec/modules/otmBidAdapter_spec.js +67 -0
- package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
- package/test/spec/modules/publinkIdSystem_spec.js +34 -15
- package/test/spec/modules/pubmaticBidAdapter_spec.js +217 -1
- package/test/spec/modules/relaidoBidAdapter_spec.js +21 -20
- package/test/spec/modules/sharethroughBidAdapter_spec.js +156 -136
- package/test/spec/modules/slimcutBidAdapter_spec.js +200 -0
- package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
- package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
- package/test/spec/modules/spotxBidAdapter_spec.js +36 -0
- package/test/spec/modules/sspBCBidAdapter_spec.js +210 -62
- package/test/spec/modules/talkadsBidAdapter_spec.js +231 -0
- package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
- package/test/spec/modules/tripleliftBidAdapter_spec.js +128 -0
- package/test/spec/modules/trustxBidAdapter_spec.js +38 -5
- package/test/spec/modules/undertoneBidAdapter_spec.js +52 -0
- package/test/spec/modules/unicornBidAdapter_spec.js +4 -4
- package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
- package/test/spec/modules/videobyteBidAdapter_spec.js +2 -2
- package/test/spec/modules/visxBidAdapter_spec.js +48 -4
- package/test/spec/modules/yahoosspBidAdapter_spec.js +1332 -0
- package/test/spec/modules/yieldlabBidAdapter_spec.js +65 -1
- package/test/spec/modules/yieldmoBidAdapter_spec.js +30 -9
- package/test/spec/modules/yieldmoSyntheticInventoryModule_spec.js +89 -0
- package/test/spec/unit/core/adapterManager_spec.js +32 -0
- package/test/spec/unit/core/bidderFactory_spec.js +61 -1
- package/test/spec/unit/pbjs_api_spec.js +37 -2
- package/test/spec/unit/secureCreatives_spec.js +54 -25
- package/modules/turktelekomBidAdapter.md +0 -49
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
Module Name: Codefuel Adapter
|
|
5
|
+
Module Type: Bidder Adapter
|
|
6
|
+
Maintainer: hayimm@codefuel.com
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
# Description
|
|
10
|
+
|
|
11
|
+
Module that connects to Codefuel bidder to fetch bids.
|
|
12
|
+
Display format is supported but not native format. Using OpenRTB standard.
|
|
13
|
+
|
|
14
|
+
# Configuration
|
|
15
|
+
|
|
16
|
+
## Bidder and usersync URLs
|
|
17
|
+
|
|
18
|
+
The Codefuel adapter does not work without setting the correct bidder.
|
|
19
|
+
You will receive the URLs when contacting us.
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
pbjs.setConfig({
|
|
23
|
+
codefuel: {
|
|
24
|
+
bidderUrl: 'https://ai-i-codefuel-ds-rtb-us-east-1-k8s-internal.seccint.com/prebid',
|
|
25
|
+
usersyncUrl: 'https://usersync-url.com'
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# Test Native Parameters
|
|
32
|
+
```
|
|
33
|
+
var adUnits = [
|
|
34
|
+
code: '/19968336/prebid_native_example_1',
|
|
35
|
+
mediaTypes: {
|
|
36
|
+
native: {
|
|
37
|
+
image: {
|
|
38
|
+
required: false,
|
|
39
|
+
sizes: [100, 50]
|
|
40
|
+
},
|
|
41
|
+
title: {
|
|
42
|
+
required: false,
|
|
43
|
+
len: 140
|
|
44
|
+
},
|
|
45
|
+
sponsoredBy: {
|
|
46
|
+
required: false
|
|
47
|
+
},
|
|
48
|
+
clickUrl: {
|
|
49
|
+
required: false
|
|
50
|
+
},
|
|
51
|
+
body: {
|
|
52
|
+
required: false
|
|
53
|
+
},
|
|
54
|
+
icon: {
|
|
55
|
+
required: false,
|
|
56
|
+
sizes: [50, 50]
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
bids: [{
|
|
61
|
+
bidder: 'codefuel',
|
|
62
|
+
params: {
|
|
63
|
+
publisher: {
|
|
64
|
+
id: '2706', // required
|
|
65
|
+
name: 'Publishers Name',
|
|
66
|
+
domain: 'publisher.com'
|
|
67
|
+
},
|
|
68
|
+
tagid: 'tag-id',
|
|
69
|
+
bcat: ['IAB1-1'],
|
|
70
|
+
badv: ['example.com']
|
|
71
|
+
}
|
|
72
|
+
}]
|
|
73
|
+
];
|
|
74
|
+
|
|
75
|
+
pbjs.setConfig({
|
|
76
|
+
codefuel: {
|
|
77
|
+
bidderUrl: 'https://prebidtest.zemanta.com/api/bidder/prebidtest/bid/'
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
# Test Display Parameters
|
|
83
|
+
```
|
|
84
|
+
var adUnits = [
|
|
85
|
+
code: '/19968336/prebid_display_example_1',
|
|
86
|
+
mediaTypes: {
|
|
87
|
+
banner: {
|
|
88
|
+
sizes: [[300, 250]]
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
bids: [{
|
|
92
|
+
bidder: 'codefuel',
|
|
93
|
+
params: {
|
|
94
|
+
publisher: {
|
|
95
|
+
id: '2706', // required
|
|
96
|
+
name: 'Publishers Name',
|
|
97
|
+
domain: 'publisher.com'
|
|
98
|
+
},
|
|
99
|
+
tagid: 'tag-id',
|
|
100
|
+
bcat: ['IAB1-1'],
|
|
101
|
+
badv: ['example.com']
|
|
102
|
+
},
|
|
103
|
+
}]
|
|
104
|
+
];
|
|
105
|
+
|
|
106
|
+
pbjs.setConfig({
|
|
107
|
+
codefuel: {
|
|
108
|
+
bidderUrl: 'https://prebidtest.zemanta.com/api/bidder/prebidtest/bid/'
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
```
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This module adds support for Yahoo ConnectID to the user ID module system.
|
|
3
|
+
* The {@link module:modules/userId} module is required
|
|
4
|
+
* @module modules/connectIdSystem
|
|
5
|
+
* @requires module:modules/userId
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {ajax} from '../src/ajax.js';
|
|
9
|
+
import {submodule} from '../src/hook.js';
|
|
10
|
+
import {logError, formatQS} from '../src/utils.js';
|
|
11
|
+
import includes from 'core-js-pure/features/array/includes.js';
|
|
12
|
+
|
|
13
|
+
const MODULE_NAME = 'connectId';
|
|
14
|
+
const VENDOR_ID = 25;
|
|
15
|
+
const PLACEHOLDER = '__PIXEL_ID__';
|
|
16
|
+
const UPS_ENDPOINT = `https://ups.analytics.yahoo.com/ups/${PLACEHOLDER}/fed`;
|
|
17
|
+
|
|
18
|
+
function isEUConsentRequired(consentData) {
|
|
19
|
+
return !!(consentData && consentData.gdpr && consentData.gdpr.gdprApplies);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** @type {Submodule} */
|
|
23
|
+
export const connectIdSubmodule = {
|
|
24
|
+
/**
|
|
25
|
+
* used to link submodule with config
|
|
26
|
+
* @type {string}
|
|
27
|
+
*/
|
|
28
|
+
name: MODULE_NAME,
|
|
29
|
+
/**
|
|
30
|
+
* @type {Number}
|
|
31
|
+
*/
|
|
32
|
+
gvlid: VENDOR_ID,
|
|
33
|
+
/**
|
|
34
|
+
* decode the stored id value for passing to bid requests
|
|
35
|
+
* @function
|
|
36
|
+
* @returns {{connectId: string} | undefined}
|
|
37
|
+
*/
|
|
38
|
+
decode(value) {
|
|
39
|
+
return (typeof value === 'object' && value.connectid)
|
|
40
|
+
? {connectId: value.connectid} : undefined;
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* Gets the Yahoo ConnectID
|
|
44
|
+
* @function
|
|
45
|
+
* @param {SubmoduleConfig} [config]
|
|
46
|
+
* @param {ConsentData} [consentData]
|
|
47
|
+
* @returns {IdResponse|undefined}
|
|
48
|
+
*/
|
|
49
|
+
getId(config, consentData) {
|
|
50
|
+
const params = config.params || {};
|
|
51
|
+
if (!params || typeof params.he !== 'string' ||
|
|
52
|
+
(typeof params.pixelId === 'undefined' && typeof params.endpoint === 'undefined')) {
|
|
53
|
+
logError('The connectId submodule requires the \'he\' and \'pixelId\' parameters to be defined.');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const data = {
|
|
58
|
+
'1p': includes([1, '1', true], params['1p']) ? '1' : '0',
|
|
59
|
+
he: params.he,
|
|
60
|
+
gdpr: isEUConsentRequired(consentData) ? '1' : '0',
|
|
61
|
+
gdpr_consent: isEUConsentRequired(consentData) ? consentData.gdpr.consentString : '',
|
|
62
|
+
us_privacy: consentData && consentData.uspConsent ? consentData.uspConsent : ''
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
if (params.pixelId) {
|
|
66
|
+
data.pixelId = params.pixelId
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const resp = function (callback) {
|
|
70
|
+
const callbacks = {
|
|
71
|
+
success: response => {
|
|
72
|
+
let responseObj;
|
|
73
|
+
if (response) {
|
|
74
|
+
try {
|
|
75
|
+
responseObj = JSON.parse(response);
|
|
76
|
+
} catch (error) {
|
|
77
|
+
logError(error);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
callback(responseObj);
|
|
81
|
+
},
|
|
82
|
+
error: error => {
|
|
83
|
+
logError(`${MODULE_NAME}: ID fetch encountered an error`, error);
|
|
84
|
+
callback();
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const endpoint = UPS_ENDPOINT.replace(PLACEHOLDER, params.pixelId);
|
|
88
|
+
let url = `${params.endpoint || endpoint}?${formatQS(data)}`;
|
|
89
|
+
connectIdSubmodule.getAjaxFn()(url, callbacks, null, {method: 'GET', withCredentials: true});
|
|
90
|
+
};
|
|
91
|
+
return {callback: resp};
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Return the function used to perform XHR calls.
|
|
96
|
+
* Utilised for each of testing.
|
|
97
|
+
* @returns {Function}
|
|
98
|
+
*/
|
|
99
|
+
getAjaxFn() {
|
|
100
|
+
return ajax;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
submodule('userId', connectIdSubmodule);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
## Yahoo ConnectID User ID Submodule
|
|
2
|
+
|
|
3
|
+
Yahoo ConnectID user ID Module.
|
|
4
|
+
|
|
5
|
+
### Prebid Params
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
pbjs.setConfig({
|
|
9
|
+
userSync: {
|
|
10
|
+
userIds: [{
|
|
11
|
+
name: 'connectId',
|
|
12
|
+
storage: {
|
|
13
|
+
name: 'connectId',
|
|
14
|
+
type: 'html5',
|
|
15
|
+
expires: 15
|
|
16
|
+
},
|
|
17
|
+
params: {
|
|
18
|
+
pixelId: 58776,
|
|
19
|
+
he: '0bef996248d63cea1529cb86de31e9547a712d9f380146e98bbd39beec70355a'
|
|
20
|
+
}
|
|
21
|
+
}]
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
```
|
|
25
|
+
## Parameter Descriptions for the `usersync` Configuration Section
|
|
26
|
+
The below parameters apply only to the Yahoo ConnectID user ID Module.
|
|
27
|
+
|
|
28
|
+
| Param under usersync.userIds[] | Scope | Type | Description | Example |
|
|
29
|
+
| --- | --- | --- | --- | --- |
|
|
30
|
+
| name | Required | String | ID value for the Yahoo ConnectID module - `"connectId"` | `"connectId"` |
|
|
31
|
+
| params | Required | Object | Data for Yahoo ConnectID initialization. | |
|
|
32
|
+
| params.pixelId | Required | Number | The Yahoo supplied publisher specific pixel Id | `8976` |
|
|
33
|
+
| params.he | Required | String | The SHA-256 hashed user email address | `"529cb86de31e9547a712d9f380146e98bbd39beec"` |
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
2
|
+
import { getRefererInfo } from '../src/refererDetection.js';
|
|
3
|
+
import { getStorageManager } from '../src/storageManager.js';
|
|
4
|
+
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
5
|
+
import { OUTSTREAM } from '../src/video.js';
|
|
6
|
+
import {
|
|
7
|
+
isArray,
|
|
8
|
+
isNumber,
|
|
9
|
+
generateUUID,
|
|
10
|
+
parseSizesInput,
|
|
11
|
+
deepAccess,
|
|
12
|
+
getParameterByName,
|
|
13
|
+
getValue,
|
|
14
|
+
getBidIdParameter,
|
|
15
|
+
logError,
|
|
16
|
+
logWarn,
|
|
17
|
+
} from '../src/utils.js';
|
|
18
|
+
import { Renderer } from '../src/Renderer.js';
|
|
19
|
+
import find from 'core-js-pure/features/array/find.js';
|
|
20
|
+
|
|
21
|
+
// ------------------------------------
|
|
22
|
+
const BIDDER_CODE = 'cwire';
|
|
23
|
+
export const ENDPOINT_URL = 'https://embed.cwi.re/delivery/prebid';
|
|
24
|
+
export const RENDERER_URL = 'https://cdn.cwi.re/prebid/renderer/LATEST/renderer.min.js';
|
|
25
|
+
// ------------------------------------
|
|
26
|
+
export const CW_PAGE_VIEW_ID = generateUUID();
|
|
27
|
+
const LS_CWID_KEY = 'cw_cwid';
|
|
28
|
+
const CW_GROUPS_QUERY = 'cwgroups';
|
|
29
|
+
|
|
30
|
+
const storage = getStorageManager();
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* ------------------------------------
|
|
34
|
+
* ------------------------------------
|
|
35
|
+
* @param bid
|
|
36
|
+
* @returns {Array<string>}
|
|
37
|
+
*/
|
|
38
|
+
export function getSlotSizes(bid) {
|
|
39
|
+
return parseSizesInput(getAllMediaSizes(bid));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* ------------------------------------
|
|
44
|
+
* ------------------------------------
|
|
45
|
+
* @param bid
|
|
46
|
+
* @returns {*[]}
|
|
47
|
+
*/
|
|
48
|
+
export function getAllMediaSizes(bid) {
|
|
49
|
+
let playerSizes = deepAccess(bid, 'mediaTypes.video.playerSize');
|
|
50
|
+
let videoSizes = deepAccess(bid, 'mediaTypes.video.sizes');
|
|
51
|
+
let bannerSizes = deepAccess(bid, 'mediaTypes.banner.sizes');
|
|
52
|
+
|
|
53
|
+
const sizes = [];
|
|
54
|
+
|
|
55
|
+
if (isArray(playerSizes)) {
|
|
56
|
+
playerSizes.forEach((s) => {
|
|
57
|
+
sizes.push(s);
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (isArray(videoSizes)) {
|
|
62
|
+
videoSizes.forEach((s) => {
|
|
63
|
+
sizes.push(s);
|
|
64
|
+
})
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (isArray(bannerSizes)) {
|
|
68
|
+
bannerSizes.forEach((s) => {
|
|
69
|
+
sizes.push(s);
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
return sizes;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const getQueryVariable = (variable) => {
|
|
76
|
+
let value = getParameterByName(variable);
|
|
77
|
+
if (value === '') {
|
|
78
|
+
value = null;
|
|
79
|
+
}
|
|
80
|
+
return value;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* ------------------------------------
|
|
85
|
+
* ------------------------------------
|
|
86
|
+
* @param validBidRequests
|
|
87
|
+
* @returns {*[]}
|
|
88
|
+
*/
|
|
89
|
+
export const mapSlotsData = function(validBidRequests) {
|
|
90
|
+
const slots = [];
|
|
91
|
+
validBidRequests.forEach(bid => {
|
|
92
|
+
const bidObj = {};
|
|
93
|
+
// get the pacement and page ids
|
|
94
|
+
let placementId = getValue(bid.params, 'placementId');
|
|
95
|
+
let pageId = getValue(bid.params, 'pageId');
|
|
96
|
+
let adUnitElementId = getValue(bid.params, 'adUnitElementId');
|
|
97
|
+
// get the rest of the auction/bid/transaction info
|
|
98
|
+
bidObj.auctionId = getBidIdParameter('auctionId', bid);
|
|
99
|
+
bidObj.adUnitCode = getBidIdParameter('adUnitCode', bid);
|
|
100
|
+
bidObj.adUnitElementId = adUnitElementId;
|
|
101
|
+
bidObj.bidId = getBidIdParameter('bidId', bid);
|
|
102
|
+
bidObj.bidderRequestId = getBidIdParameter('bidderRequestId', bid);
|
|
103
|
+
bidObj.placementId = placementId;
|
|
104
|
+
bidObj.pageId = pageId;
|
|
105
|
+
bidObj.mediaTypes = getBidIdParameter('mediaTypes', bid);
|
|
106
|
+
bidObj.transactionId = getBidIdParameter('transactionId', bid);
|
|
107
|
+
bidObj.sizes = getSlotSizes(bid);
|
|
108
|
+
slots.push(bidObj);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
return slots;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
export const spec = {
|
|
115
|
+
code: BIDDER_CODE,
|
|
116
|
+
supportedMediaTypes: [BANNER, VIDEO],
|
|
117
|
+
/**
|
|
118
|
+
* Determines whether or not the given bid request is valid.
|
|
119
|
+
*
|
|
120
|
+
* @param {BidRequest} bid The bid params to validate.
|
|
121
|
+
* @return boolean True if this is a valid bid, and false otherwise.
|
|
122
|
+
*/
|
|
123
|
+
isBidRequestValid: function(bid) {
|
|
124
|
+
bid.params = bid.params || {};
|
|
125
|
+
|
|
126
|
+
// if ad unit elemt id not provided - use adUnitCode by default
|
|
127
|
+
if (!bid.params.adUnitElementId) {
|
|
128
|
+
bid.params.adUnitElementId = bid.code;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (!bid.params.placementId || !isNumber(bid.params.placementId)) {
|
|
132
|
+
logError('placementId not provided or invalid');
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (!bid.params.pageId || !isNumber(bid.params.pageId)) {
|
|
137
|
+
logError('pageId not provided');
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return true;
|
|
142
|
+
},
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* ------------------------------------
|
|
146
|
+
* Make a server request from the
|
|
147
|
+
* list of BidRequests.
|
|
148
|
+
* ------------------------------------
|
|
149
|
+
* @param {validBidRequests[]} - an array of bids
|
|
150
|
+
* @return ServerRequest Info describing the request to the server.
|
|
151
|
+
*/
|
|
152
|
+
buildRequests: function(validBidRequests, bidderRequest) {
|
|
153
|
+
let slots = [];
|
|
154
|
+
let referer;
|
|
155
|
+
try {
|
|
156
|
+
referer = getRefererInfo().referer;
|
|
157
|
+
slots = mapSlotsData(validBidRequests);
|
|
158
|
+
} catch (e) {
|
|
159
|
+
logWarn(e);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
let refgroups = [];
|
|
163
|
+
|
|
164
|
+
const rgQuery = getQueryVariable(CW_GROUPS_QUERY);
|
|
165
|
+
if (rgQuery !== null) {
|
|
166
|
+
refgroups = rgQuery.split(',');
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const localStorageCWID = storage.localStorageIsEnabled() ? storage.getDataFromLocalStorage(LS_CWID_KEY) : null;
|
|
170
|
+
|
|
171
|
+
const payload = {
|
|
172
|
+
cwid: localStorageCWID,
|
|
173
|
+
refgroups,
|
|
174
|
+
slots: slots,
|
|
175
|
+
httpRef: referer || '',
|
|
176
|
+
pageViewId: CW_PAGE_VIEW_ID,
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
return {
|
|
180
|
+
method: 'POST',
|
|
181
|
+
url: ENDPOINT_URL,
|
|
182
|
+
data: payload
|
|
183
|
+
};
|
|
184
|
+
},
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Unpack the response from the server into a list of bids.
|
|
188
|
+
*
|
|
189
|
+
* @param {ServerResponse} serverResponse A successful response from the server.
|
|
190
|
+
* @return {Bid[]} An array of bids which were nested inside the server.
|
|
191
|
+
*/
|
|
192
|
+
interpretResponse: function(serverResponse, bidRequest) {
|
|
193
|
+
const bidResponses = [];
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
if (typeof bidRequest.data === 'string') {
|
|
197
|
+
bidRequest.data = JSON.parse(bidRequest.data);
|
|
198
|
+
}
|
|
199
|
+
const serverBody = serverResponse.body;
|
|
200
|
+
serverBody.bids.forEach((br) => {
|
|
201
|
+
const bidReq = find(bidRequest.data.slots, bid => bid.bidId === br.requestId);
|
|
202
|
+
|
|
203
|
+
let mediaType = BANNER;
|
|
204
|
+
|
|
205
|
+
const bidResponse = {
|
|
206
|
+
requestId: br.requestId,
|
|
207
|
+
cpm: br.cpm,
|
|
208
|
+
bidderCode: BIDDER_CODE,
|
|
209
|
+
width: br.dimensions[0],
|
|
210
|
+
height: br.dimensions[1],
|
|
211
|
+
creativeId: br.creativeId,
|
|
212
|
+
currency: br.currency,
|
|
213
|
+
netRevenue: br.netRevenue,
|
|
214
|
+
ttl: br.ttl,
|
|
215
|
+
meta: {
|
|
216
|
+
advertiserDomains: br.adomains ? br.advertiserDomains : [],
|
|
217
|
+
},
|
|
218
|
+
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
// ------------------------------------
|
|
222
|
+
// IF BANNER
|
|
223
|
+
// ------------------------------------
|
|
224
|
+
|
|
225
|
+
if (deepAccess(bidReq, 'mediaTypes.banner')) {
|
|
226
|
+
bidResponse.ad = br.html;
|
|
227
|
+
}
|
|
228
|
+
// ------------------------------------
|
|
229
|
+
// IF VIDEO
|
|
230
|
+
// ------------------------------------
|
|
231
|
+
if (deepAccess(bidReq, 'mediaTypes.video')) {
|
|
232
|
+
mediaType = VIDEO;
|
|
233
|
+
bidResponse.vastXml = br.vastXml;
|
|
234
|
+
bidResponse.videoScript = br.html;
|
|
235
|
+
const mediaTypeContext = deepAccess(bidReq, 'mediaTypes.video.context');
|
|
236
|
+
if (mediaTypeContext === OUTSTREAM) {
|
|
237
|
+
const r = Renderer.install({
|
|
238
|
+
id: bidResponse.requestId,
|
|
239
|
+
adUnitCode: bidReq.adUnitCode,
|
|
240
|
+
url: RENDERER_URL,
|
|
241
|
+
loaded: false,
|
|
242
|
+
config: {
|
|
243
|
+
...deepAccess(bidReq, 'mediaTypes.video'),
|
|
244
|
+
...deepAccess(br, 'outstream', {})
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
// set renderer
|
|
249
|
+
try {
|
|
250
|
+
bidResponse.renderer = r;
|
|
251
|
+
bidResponse.renderer.setRender(function(bid) {
|
|
252
|
+
if (window.CWIRE && window.CWIRE.outstream) {
|
|
253
|
+
window.CWIRE.outstream.renderAd(bid);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
} catch (err) {
|
|
257
|
+
logWarn('Prebid Error calling setRender on newRenderer', err);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
bidResponse.mediaType = mediaType;
|
|
263
|
+
bidResponses.push(bidResponse);
|
|
264
|
+
});
|
|
265
|
+
} catch (e) {
|
|
266
|
+
logWarn(e);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return bidResponses;
|
|
270
|
+
},
|
|
271
|
+
}
|
|
272
|
+
registerBidder(spec);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
Module Name: C-WIRE Bid Adapter
|
|
4
|
+
Module Type: Adagio Adapter
|
|
5
|
+
Maintainer: dragan@cwire.ch
|
|
6
|
+
|
|
7
|
+
## Description
|
|
8
|
+
|
|
9
|
+
Connects to C-WIRE demand source to fetch bids.
|
|
10
|
+
|
|
11
|
+
## Configuration
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
Below, the list of C-WIRE params and where they can be set.
|
|
15
|
+
|
|
16
|
+
| Param name | Global config | AdUnit config | Type | Required |
|
|
17
|
+
| ---------- | ------------- | ------------- | ---- | ---------|
|
|
18
|
+
| pageId | | x | number | YES |
|
|
19
|
+
| placementId | | x | number | YES |
|
|
20
|
+
| adUnitElementId | | x | string | NO |
|
|
21
|
+
|
|
22
|
+
### adUnit configuration
|
|
23
|
+
|
|
24
|
+
```javascript
|
|
25
|
+
var adUnits = [
|
|
26
|
+
{
|
|
27
|
+
code: 'target_div_id', // REQUIRED
|
|
28
|
+
bids: [{
|
|
29
|
+
bidder: 'cwire',
|
|
30
|
+
mediaTypes: {
|
|
31
|
+
banner: {
|
|
32
|
+
sizes: [[1, 1]],
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
params: {
|
|
36
|
+
pageId: 1422, // required - number
|
|
37
|
+
placementId: 2211521, // required - number
|
|
38
|
+
adUnitElementId: 'other_div', // optional, div id to write to, if not set it will default to ad unit code
|
|
39
|
+
}
|
|
40
|
+
}]
|
|
41
|
+
}
|
|
42
|
+
];
|
|
43
|
+
```
|