-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Expand file tree
/
Copy pathyieldbot.js
More file actions
146 lines (119 loc) · 4.13 KB
/
yieldbot.js
File metadata and controls
146 lines (119 loc) · 4.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/**
* @overview Yieldbot sponsored Prebid.js adapter.
* @author elljoh
*/
var adloader = require('../adloader');
var bidfactory = require('../bidfactory');
var bidmanager = require('../bidmanager');
var utils = require('../utils');
/**
* Adapter for requesting bids from Yieldbot.
*
* @returns {Object} Object containing implementation for invocation in {@link module:adaptermanger.callBids}
* @class
*/
var YieldbotAdapter = function YieldbotAdapter() {
window.ybotq = window.ybotq || [];
var ybotlib = {
BID_STATUS: {
PENDING: 0,
AVAILABLE: 1,
EMPTY: 2
},
definedSlots: [],
pageLevelOption: false,
/**
* Builds the Yieldbot creative tag.
*
* @param {String} slot - The slot name to bid for
* @param {String} size - The dimenstions of the slot
* @private
*/
buildCreative: function (slot, size) {
return '<script type="text/javascript" src="//cdn.yldbt.com/js/yieldbot.intent.js"></script>' +
'<script type="text/javascript">var ybotq = ybotq || [];' +
'ybotq.push(function () {yieldbot.renderAd(\'' + slot + ':' + size + '\');});</script>';
},
/**
* Bid response builder.
*
* @param {Object} slotCriteria - Yieldbot bid criteria
* @private
*/
buildBid: function (slotCriteria) {
var bid = {};
if (slotCriteria && slotCriteria.ybot_ad && slotCriteria.ybot_ad !== 'n') {
bid = bidfactory.createBid(ybotlib.BID_STATUS.AVAILABLE);
bid.cpm = parseInt(slotCriteria.ybot_cpm) / 100.0 || 0; // Yieldbot CPM bids are in cents
var szArr = slotCriteria.ybot_size ? slotCriteria.ybot_size.split('x') : [0, 0];
var slot = slotCriteria.ybot_slot || '';
var sizeStr = slotCriteria.ybot_size || ''; // Creative template needs the dimensions string
bid.width = szArr[0] || 0;
bid.height = szArr[1] || 0;
bid.ad = ybotlib.buildCreative(slot, sizeStr);
// Add Yieldbot parameters to allow publisher bidderSettings.yieldbot specific targeting
for (var k in slotCriteria) {
bid[k] = slotCriteria[k];
}
} else {
bid = bidfactory.createBid(ybotlib.BID_STATUS.EMPTY);
}
bid.bidderCode = 'yieldbot';
return bid;
},
/**
* Yieldbot implementation of {@link module:adaptermanger.callBids}
* @param {Object} params - Adapter bid configuration object
* @private
*/
callBids: function (params) {
var bids = params.bids || [];
var ybotq = window.ybotq || [];
ybotlib.pageLevelOption = false;
ybotq.push(function () {
var yieldbot = window.yieldbot;
utils._each(bids, function (v) {
var bid = v;
var psn = bid.params && bid.params.psn || 'ERROR_DEFINE_YB_PSN';
var slot = bid.params && bid.params.slot || 'ERROR_DEFINE_YB_SLOT';
yieldbot.pub(psn);
yieldbot.defineSlot(slot, { sizes: bid.sizes || [] });
ybotlib.definedSlots.push(bid.bidId);
});
yieldbot.enableAsync();
yieldbot.go();
});
ybotq.push(function () {
ybotlib.handleUpdateState();
});
adloader.loadScript('//cdn.yldbt.com/js/yieldbot.intent.js', null, true);
},
/**
* Yieldbot bid request callback handler.
*
* @see {@link YieldbotAdapter~_callBids}
* @private
*/
handleUpdateState: function () {
var yieldbot = window.yieldbot;
utils._each(ybotlib.definedSlots, function (v) {
var slot;
var criteria;
var placementCode;
var adapterConfig;
adapterConfig = $$PREBID_GLOBAL$$._bidsRequested
.find(bidderRequest => bidderRequest.bidderCode === 'yieldbot').bids
.find(bid => bid.bidId === v) || {};
slot = adapterConfig.params.slot || '';
criteria = yieldbot.getSlotCriteria(slot);
placementCode = adapterConfig.placementCode || 'ERROR_YB_NO_PLACEMENT';
var bid = ybotlib.buildBid(criteria);
bidmanager.addBidResponse(placementCode, bid);
});
}
};
return {
callBids: ybotlib.callBids
};
};
module.exports = YieldbotAdapter;