-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
vidazooBidAdapter.js
130 lines (113 loc) · 4.48 KB
/
vidazooBidAdapter.js
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
import {parseSizesInput, isArray} from '../src/utils.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
import {BANNER, VIDEO} from '../src/mediaTypes.js';
import {getStorageManager} from '../src/storageManager.js';
import {config} from '../src/config.js';
import {chunk} from '../libraries/chunk/chunk.js';
import {
createSessionId,
extractCID,
extractSubDomain,
isBidRequestValid,
getCacheOpt,
getNextDealId,
onBidWon,
createUserSyncGetter,
getVidazooSessionId,
buildRequestData,
createInterpretResponseFn
} from '../libraries/vidazooUtils/bidderUtils.js';
import {OPT_CACHE_KEY, OPT_TIME_KEY} from '../libraries/vidazooUtils/constants.js';
const GVLID = 744;
const DEFAULT_SUB_DOMAIN = 'prebid';
const BIDDER_CODE = 'vidazoo';
const BIDDER_VERSION = '1.0.0';
export const storage = getStorageManager({bidderCode: BIDDER_CODE});
export const webSessionId = createSessionId();
export function createDomain(subDomain = DEFAULT_SUB_DOMAIN) {
return `https://${subDomain}.cootlogix.com`;
}
function getUniqueRequestData(hashUrl) {
const dealId = getNextDealId(storage, hashUrl);
const sessionId = getVidazooSessionId(storage);
const ptrace = getCacheOpt(storage, OPT_CACHE_KEY);
const vdzhum = getCacheOpt(storage, OPT_TIME_KEY);
return {
dealId: dealId, sessionId: sessionId, ptrace: ptrace, vdzhum: vdzhum
};
}
function buildRequest(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
const {params} = bid;
const cId = extractCID(params);
const subDomain = extractSubDomain(params);
const data = buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout, webSessionId, storage, BIDDER_VERSION, BIDDER_CODE, getUniqueRequestData);
const dto = {
method: 'POST', url: `${createDomain(subDomain)}/prebid/multi/${cId}`, data: data
};
return dto;
}
function buildSingleRequest(bidRequests, bidderRequest, topWindowUrl, bidderTimeout) {
const {params} = bidRequests[0];
const cId = extractCID(params);
const subDomain = extractSubDomain(params);
const data = bidRequests.map(bid => {
const sizes = parseSizesInput(bid.sizes);
return buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout, webSessionId, storage, BIDDER_VERSION, BIDDER_CODE, getUniqueRequestData)
});
const chunkSize = Math.min(20, config.getConfig('vidazoo.chunkSize') || 10);
const chunkedData = chunk(data, chunkSize);
return chunkedData.map(chunk => {
return {
method: 'POST',
url: `${createDomain(subDomain)}/prebid/multi/${cId}`,
data: {
bids: chunk
}
};
});
}
function buildRequests(validBidRequests, bidderRequest) {
// TODO: does the fallback make sense here?
const topWindowUrl = bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation;
const bidderTimeout = config.getConfig('bidderTimeout');
const singleRequestMode = config.getConfig('vidazoo.singleRequest');
const requests = [];
if (singleRequestMode) {
// banner bids are sent as a single request
const bannerBidRequests = validBidRequests.filter(bid => isArray(bid.mediaTypes) ? bid.mediaTypes.includes(BANNER) : bid.mediaTypes[BANNER] !== undefined);
if (bannerBidRequests.length > 0) {
const singleRequests = buildSingleRequest(bannerBidRequests, bidderRequest, topWindowUrl, bidderTimeout);
requests.push(...singleRequests);
}
// video bids are sent as a single request for each bid
const videoBidRequests = validBidRequests.filter(bid => bid.mediaTypes[VIDEO] !== undefined);
videoBidRequests.forEach(validBidRequest => {
const sizes = parseSizesInput(validBidRequest.sizes);
const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout);
requests.push(request);
});
} else {
validBidRequests.forEach(validBidRequest => {
const sizes = parseSizesInput(validBidRequest.sizes);
const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout);
requests.push(request);
});
}
return requests;
}
const interpretResponse = createInterpretResponseFn(BIDDER_CODE);
const getUserSyncs = createUserSyncGetter({
iframeSyncUrl: 'https://sync.cootlogix.com/api/sync/iframe', imageSyncUrl: 'https://sync.cootlogix.com/api/sync/image'
});
export const spec = {
code: BIDDER_CODE,
version: BIDDER_VERSION,
gvlid: GVLID,
supportedMediaTypes: [BANNER, VIDEO],
isBidRequestValid,
buildRequests,
interpretResponse,
getUserSyncs,
onBidWon
};
registerBidder(spec);