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.
Files changed (182) hide show
  1. package/.devcontainer/Dockerfile +11 -0
  2. package/.devcontainer/devcontainer.json +27 -0
  3. package/.devcontainer/postCreate.sh +6 -0
  4. package/browsers.json +1 -0
  5. package/integrationExamples/gpt/akamaidap_segments_example.html +132 -0
  6. package/modules/.submodules.json +1 -0
  7. package/modules/adfBidAdapter.js +21 -16
  8. package/modules/adgenerationBidAdapter.js +28 -4
  9. package/modules/adkernelBidAdapter.js +3 -1
  10. package/modules/admixerBidAdapter.js +11 -0
  11. package/modules/adnuntiusBidAdapter.js +1 -0
  12. package/modules/adtelligentBidAdapter.js +2 -1
  13. package/modules/airgridRtdProvider.js +1 -1
  14. package/modules/akamaiDapRtdProvider.js +474 -0
  15. package/modules/akamaiDapRtdProvider.md +47 -0
  16. package/modules/aolBidAdapter.js +2 -1
  17. package/modules/appnexusBidAdapter.js +5 -3
  18. package/modules/atsAnalyticsAdapter.js +89 -63
  19. package/modules/atsAnalyticsAdapter.md +1 -0
  20. package/modules/betweenBidAdapter.js +20 -3
  21. package/modules/bliinkBidAdapter.js +58 -32
  22. package/modules/bliinkBidAdapter.md +29 -6
  23. package/modules/browsiRtdProvider.js +106 -18
  24. package/modules/cleanioRtdProvider.js +192 -0
  25. package/modules/cleanioRtdProvider.md +59 -0
  26. package/modules/codefuelBidAdapter.js +183 -0
  27. package/modules/codefuelBidAdapter.md +111 -0
  28. package/modules/connectIdSystem.js +104 -0
  29. package/modules/connectIdSystem.md +33 -0
  30. package/modules/cwireBidAdapter.js +272 -0
  31. package/modules/cwireBidAdapter.md +43 -0
  32. package/modules/deepintentBidAdapter.js +106 -9
  33. package/modules/deepintentBidAdapter.md +36 -1
  34. package/modules/deltaprojectsBidAdapter.js +252 -0
  35. package/modules/deltaprojectsBidAdapter.md +32 -0
  36. package/modules/dgkeywordRtdProvider.js +0 -1
  37. package/modules/engageyaBidAdapter.js +157 -0
  38. package/modules/glimpseBidAdapter.js +160 -48
  39. package/modules/glimpseBidAdapter.md +11 -74
  40. package/modules/gridBidAdapter.js +1 -0
  41. package/modules/gridNMBidAdapter.js +7 -6
  42. package/modules/gumgumBidAdapter.js +16 -2
  43. package/modules/iasRtdProvider.js +83 -67
  44. package/modules/inskinBidAdapter.js +7 -3
  45. package/modules/ixBidAdapter.js +8 -1
  46. package/modules/jixieBidAdapter.js +8 -2
  47. package/modules/justpremiumBidAdapter.js +6 -1
  48. package/modules/kargoBidAdapter.js +14 -7
  49. package/modules/kargoBidAdapter.md +20 -0
  50. package/modules/limelightDigitalBidAdapter.js +22 -2
  51. package/modules/livewrappedAnalyticsAdapter.js +53 -3
  52. package/modules/mediakeysBidAdapter.js +405 -14
  53. package/modules/mediakeysBidAdapter.md +108 -0
  54. package/modules/multibid/index.js +3 -3
  55. package/modules/mytargetBidAdapter.js +112 -0
  56. package/modules/nativoBidAdapter.js +48 -29
  57. package/modules/nativoBidAdapter.md +0 -1
  58. package/modules/nextMillenniumBidAdapter.js +12 -3
  59. package/modules/nextrollBidAdapter.js +375 -0
  60. package/modules/nobidBidAdapter.js +2 -1
  61. package/modules/oguryBidAdapter.js +36 -7
  62. package/modules/openxBidAdapter.js +34 -22
  63. package/modules/operaadsBidAdapter.js +21 -1
  64. package/modules/otmBidAdapter.js +146 -0
  65. package/modules/otmBidAdapter.md +27 -26
  66. package/modules/outbrainBidAdapter.js +5 -0
  67. package/modules/pixfutureBidAdapter.js +24 -4
  68. package/modules/pixfutureBidAdapter.md +127 -0
  69. package/modules/playwireBidAdapter.md +61 -0
  70. package/modules/prebidServerBidAdapter/index.js +1 -1
  71. package/modules/proxistoreBidAdapter.js +4 -6
  72. package/modules/publinkIdSystem.js +17 -7
  73. package/modules/publinkIdSystem.md +7 -2
  74. package/modules/pubmaticBidAdapter.js +22 -6
  75. package/modules/pubmaticBidAdapter.md +1 -1
  76. package/modules/relaidoBidAdapter.js +8 -2
  77. package/modules/rtdModule/index.js +2 -2
  78. package/modules/sharethroughBidAdapter.js +12 -19
  79. package/modules/slimcutBidAdapter.js +121 -0
  80. package/modules/sonobiBidAdapter.js +7 -0
  81. package/modules/sortableBidAdapter.js +1 -0
  82. package/modules/spotxBidAdapter.js +15 -1
  83. package/modules/sspBCBidAdapter.js +207 -12
  84. package/modules/sspBCBidAdapter.md +1 -1
  85. package/modules/talkadsBidAdapter.js +129 -0
  86. package/modules/talkadsBidAdapter.md +60 -0
  87. package/modules/tappxBidAdapter.js +6 -5
  88. package/modules/teadsBidAdapter.js +3 -0
  89. package/modules/tripleliftBidAdapter.js +22 -5
  90. package/modules/trustxBidAdapter.js +17 -11
  91. package/modules/undertoneBidAdapter.js +9 -5
  92. package/modules/undertoneBidAdapter.md +5 -1
  93. package/modules/unicornBidAdapter.js +3 -3
  94. package/modules/userId/eids.js +18 -0
  95. package/modules/userId/eids.md +7 -0
  96. package/modules/userId/userId.md +12 -0
  97. package/modules/ventesBidAdapter.js +370 -0
  98. package/modules/ventesBidAdapter.md +94 -0
  99. package/modules/videobyteBidAdapter.js +13 -6
  100. package/modules/videobyteBidAdapter.md +49 -0
  101. package/modules/vidoomyBidAdapter.js +20 -12
  102. package/modules/visxBidAdapter.js +15 -22
  103. package/modules/yahoosspBidAdapter.js +637 -0
  104. package/modules/yahoosspBidAdapter.md +795 -0
  105. package/modules/yieldlabBidAdapter.js +48 -3
  106. package/modules/yieldlabBidAdapter.md +16 -1
  107. package/modules/yieldmoBidAdapter.js +20 -6
  108. package/modules/yieldmoSyntheticInventoryModule.js +46 -0
  109. package/modules/yieldmoSyntheticInventoryModule.md +68 -0
  110. package/package.json +1 -1
  111. package/src/adapterManager.js +5 -0
  112. package/src/adapters/bidderFactory.js +4 -3
  113. package/src/auction.js +11 -11
  114. package/src/constants.json +1 -0
  115. package/src/secureCreatives.js +6 -7
  116. package/src/targeting.js +11 -9
  117. package/test/.eslintrc.js +2 -1
  118. package/test/spec/modules/adfBidAdapter_spec.js +83 -29
  119. package/test/spec/modules/adgenerationBidAdapter_spec.js +121 -50
  120. package/test/spec/modules/adnuntiusBidAdapter_spec.js +68 -0
  121. package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
  122. package/test/spec/modules/akamaiDapRtdProvider_spec.js +246 -0
  123. package/test/spec/modules/appnexusBidAdapter_spec.js +2 -1
  124. package/test/spec/modules/atsAnalyticsAdapter_spec.js +77 -9
  125. package/test/spec/modules/betweenBidAdapter_spec.js +41 -0
  126. package/test/spec/modules/bliinkBidAdapter_spec.js +87 -36
  127. package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
  128. package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
  129. package/test/spec/modules/codefuelBidAdapter_spec.js +316 -0
  130. package/test/spec/modules/connectIdSystem_spec.js +189 -0
  131. package/test/spec/modules/cwireBidAdapter_spec.js +246 -0
  132. package/test/spec/modules/deepintentBidAdapter_spec.js +153 -3
  133. package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
  134. package/test/spec/modules/engageyaBidAdapter_spec.js +286 -0
  135. package/test/spec/modules/glimpseBidAdapter_spec.js +302 -204
  136. package/test/spec/modules/gridNMBidAdapter_spec.js +40 -1
  137. package/test/spec/modules/gumgumBidAdapter_spec.js +23 -6
  138. package/test/spec/modules/iasRtdProvider_spec.js +71 -6
  139. package/test/spec/modules/ixBidAdapter_spec.js +13 -3
  140. package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
  141. package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
  142. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +155 -1
  143. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +67 -12
  144. package/test/spec/modules/mediakeysBidAdapter_spec.js +406 -51
  145. package/test/spec/modules/multibid_spec.js +31 -31
  146. package/test/spec/modules/mytargetBidAdapter_spec.js +199 -0
  147. package/test/spec/modules/nativoBidAdapter_spec.js +50 -3
  148. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +13 -1
  149. package/test/spec/modules/nextrollBidAdapter_spec.js +290 -0
  150. package/test/spec/modules/nobidBidAdapter_spec.js +65 -1
  151. package/test/spec/modules/oguryBidAdapter_spec.js +125 -37
  152. package/test/spec/modules/openxBidAdapter_spec.js +85 -13
  153. package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
  154. package/test/spec/modules/otmBidAdapter_spec.js +67 -0
  155. package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
  156. package/test/spec/modules/publinkIdSystem_spec.js +34 -15
  157. package/test/spec/modules/pubmaticBidAdapter_spec.js +217 -1
  158. package/test/spec/modules/relaidoBidAdapter_spec.js +21 -20
  159. package/test/spec/modules/sharethroughBidAdapter_spec.js +156 -136
  160. package/test/spec/modules/slimcutBidAdapter_spec.js +200 -0
  161. package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
  162. package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
  163. package/test/spec/modules/spotxBidAdapter_spec.js +36 -0
  164. package/test/spec/modules/sspBCBidAdapter_spec.js +210 -62
  165. package/test/spec/modules/talkadsBidAdapter_spec.js +231 -0
  166. package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
  167. package/test/spec/modules/tripleliftBidAdapter_spec.js +128 -0
  168. package/test/spec/modules/trustxBidAdapter_spec.js +38 -5
  169. package/test/spec/modules/undertoneBidAdapter_spec.js +52 -0
  170. package/test/spec/modules/unicornBidAdapter_spec.js +4 -4
  171. package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
  172. package/test/spec/modules/videobyteBidAdapter_spec.js +2 -2
  173. package/test/spec/modules/visxBidAdapter_spec.js +48 -4
  174. package/test/spec/modules/yahoosspBidAdapter_spec.js +1332 -0
  175. package/test/spec/modules/yieldlabBidAdapter_spec.js +65 -1
  176. package/test/spec/modules/yieldmoBidAdapter_spec.js +30 -9
  177. package/test/spec/modules/yieldmoSyntheticInventoryModule_spec.js +89 -0
  178. package/test/spec/unit/core/adapterManager_spec.js +32 -0
  179. package/test/spec/unit/core/bidderFactory_spec.js +61 -1
  180. package/test/spec/unit/pbjs_api_spec.js +37 -2
  181. package/test/spec/unit/secureCreatives_spec.js +54 -25
  182. 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
+ ```