prebid.js 9.3.0 → 9.4.1
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/creative/constants.js +2 -1
- package/creative/crossDomain.js +16 -4
- 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/adagioRtdProvider.js +1 -1
- package/dist/adagioUtils.js +1 -1
- package/dist/addefendBidAdapter.js +1 -1
- package/dist/adfBidAdapter.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/codefuelBidAdapter.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/cpmstarBidAdapter.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/deltaprojectsBidAdapter.js +1 -1
- package/dist/dependencies.json +33 -9
- package/dist/dianomiBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/dxkultureBidAdapter.js +1 -1
- 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/illuminBidAdapter.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.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/kueezRtbBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.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/luponmediaBidAdapter.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/medianetAnalyticsAdapter.js +1 -1
- package/dist/medianetBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/missenaBidAdapter.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 +171 -170
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openwebBidAdapter.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/ozoneBidAdapter.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/processResponse.js +1 -0
- package/dist/publinkIdSystem.js +1 -1
- package/dist/publirBidAdapter.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.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/riseBidAdapter.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/shinezBidAdapter.js +1 -1
- package/dist/shinezRtbBidAdapter.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/stnBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/tagorasBidAdapter.js +1 -1
- package/dist/tappxBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.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/twistDigitalBidAdapter.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/viantOrtbBidAdapter.js +1 -1
- package/dist/vidazooBidAdapter.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/dist/zeta_global_sspBidAdapter.js +1 -1
- package/integrationExamples/gpt/x-domain/creative.html +1 -1
- package/libraries/processResponse/index.js +12 -0
- package/libraries/vidazooUtils/bidderUtils.js +9 -10
- package/modules/adagioRtdProvider.js +9 -7
- package/modules/adfBidAdapter.js +1 -10
- package/modules/carodaBidAdapter.js +3 -8
- package/modules/codefuelBidAdapter.js +1 -10
- package/modules/cpmstarBidAdapter.js +52 -36
- package/modules/cpmstarBidAdapter.md +1 -4
- package/modules/dailymotionBidAdapter.js +1 -1
- package/modules/deltaprojectsBidAdapter.js +2 -11
- package/modules/dianomiBidAdapter.js +1 -9
- package/modules/finativeBidAdapter.js +1 -10
- package/modules/gridBidAdapter.js +2 -12
- package/modules/illuminBidAdapter.js +9 -304
- package/modules/kueezRtbBidAdapter.js +17 -312
- package/modules/luponmediaBidAdapter.js +4 -10
- package/modules/mgidBidAdapter.js +1 -10
- package/modules/outbrainBidAdapter.js +8 -43
- package/modules/ozoneBidAdapter.js +9 -7
- package/modules/shinezRtbBidAdapter.js +12 -304
- package/modules/tagorasBidAdapter.js +13 -316
- package/modules/twistDigitalBidAdapter.js +9 -422
- package/modules/viantOrtbBidAdapter.js +20 -0
- package/modules/vidazooBidAdapter.js +3 -3
- package/modules/visxBidAdapter.js +27 -29
- package/modules/zeta_global_sspBidAdapter.js +2 -2
- package/package.json +1 -1
- package/src/adRendering.js +29 -2
- package/src/constants.js +2 -0
- package/src/prebid.js +2 -1
- package/src/utils.js +19 -1
- package/test/pages/banner_sync.html +97 -0
- package/test/spec/creative/crossDomainCreative_spec.js +38 -2
- package/test/spec/e2e/banner/basic_banner_ad.spec.js +20 -14
- package/test/spec/libraries/processResponse_spec.js +60 -0
- package/test/spec/modules/adagioRtdProvider_spec.js +12 -0
- package/test/spec/modules/cpmstarBidAdapter_spec.js +1 -1
- package/test/spec/modules/dailymotionBidAdapter_spec.js +18 -14
- package/test/spec/modules/illuminBidAdapter_spec.js +26 -13
- package/test/spec/modules/kueezRtbBidAdapter_spec.js +26 -15
- package/test/spec/modules/outbrainBidAdapter_spec.js +32 -1
- package/test/spec/modules/shinezRtbBidAdapter_spec.js +26 -14
- package/test/spec/modules/tagorasBidAdapter_spec.js +26 -15
- package/test/spec/modules/twistDigitalBidAdapter_spec.js +15 -20
- package/test/spec/modules/viantOrtbBidAdapter_spec.js +87 -6
- package/test/spec/modules/visxBidAdapter_spec.js +180 -0
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +11 -0
- package/test/spec/unit/pbjs_api_spec.js +6 -1
|
@@ -1,441 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
_each,
|
|
3
|
-
deepAccess,
|
|
4
|
-
isFn,
|
|
5
|
-
parseSizesInput,
|
|
6
|
-
parseUrl,
|
|
7
|
-
uniques,
|
|
8
|
-
isArray,
|
|
9
|
-
formatQS,
|
|
10
|
-
triggerPixel
|
|
11
|
-
} from '../src/utils.js';
|
|
12
1
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
13
2
|
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
14
3
|
import {getStorageManager} from '../src/storageManager.js';
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
import {extractCID, extractPID, extractSubDomain} from '../libraries/vidazooUtils/bidderUtils.js';
|
|
4
|
+
import {
|
|
5
|
+
isBidRequestValid, createInterpretResponseFn, createUserSyncGetter, createBuildRequestsFn, onBidWon
|
|
6
|
+
} from '../libraries/vidazooUtils/bidderUtils.js';
|
|
19
7
|
|
|
20
8
|
const GVLID = 1292;
|
|
21
9
|
const DEFAULT_SUB_DOMAIN = 'exchange';
|
|
22
10
|
const BIDDER_CODE = 'twistdigital';
|
|
23
11
|
const BIDDER_VERSION = '1.0.0';
|
|
24
|
-
const CURRENCY = 'USD';
|
|
25
|
-
const TTL_SECONDS = 60 * 5;
|
|
26
|
-
const UNIQUE_DEAL_ID_EXPIRY = 1000 * 60 * 60;
|
|
27
12
|
|
|
28
|
-
export const
|
|
29
|
-
const storage = getStorageManager({bidderCode: BIDDER_CODE});
|
|
30
|
-
|
|
31
|
-
function getTopWindowQueryParams() {
|
|
32
|
-
try {
|
|
33
|
-
const parsedUrl = parseUrl(window.top.document.URL, {decodeSearchAsString: true});
|
|
34
|
-
return parsedUrl.search;
|
|
35
|
-
} catch (e) {
|
|
36
|
-
return '';
|
|
37
|
-
}
|
|
38
|
-
}
|
|
13
|
+
export const storage = getStorageManager({bidderCode: BIDDER_CODE});
|
|
39
14
|
|
|
40
15
|
export function createDomain(subDomain = DEFAULT_SUB_DOMAIN) {
|
|
41
16
|
return `https://${subDomain}.twist.win`;
|
|
42
17
|
}
|
|
43
18
|
|
|
44
|
-
|
|
45
|
-
const params = bid.params || {};
|
|
46
|
-
return !!(extractCID(params) && extractPID(params));
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
|
|
50
|
-
const {
|
|
51
|
-
params,
|
|
52
|
-
bidId,
|
|
53
|
-
userId,
|
|
54
|
-
adUnitCode,
|
|
55
|
-
schain,
|
|
56
|
-
mediaTypes,
|
|
57
|
-
ortb2Imp,
|
|
58
|
-
bidderRequestId,
|
|
59
|
-
bidRequestsCount,
|
|
60
|
-
bidderRequestsCount,
|
|
61
|
-
bidderWinsCount
|
|
62
|
-
} = bid;
|
|
63
|
-
const {ext} = params;
|
|
64
|
-
let {bidFloor} = params;
|
|
65
|
-
const hashUrl = hashCode(topWindowUrl);
|
|
66
|
-
const uniqueDealId = getUniqueDealId(hashUrl);
|
|
67
|
-
const pId = extractPID(params);
|
|
68
|
-
const isStorageAllowed = bidderSettings.get(BIDDER_CODE, 'storageAllowed');
|
|
69
|
-
|
|
70
|
-
const gpid = deepAccess(bid, 'ortb2Imp.ext.gpid', deepAccess(bid, 'ortb2Imp.ext.data.pbadslot', ''));
|
|
71
|
-
const cat = deepAccess(bidderRequest, 'ortb2.site.cat', []);
|
|
72
|
-
const pagecat = deepAccess(bidderRequest, 'ortb2.site.pagecat', []);
|
|
73
|
-
const contentData = deepAccess(bidderRequest, 'ortb2.site.content.data', []);
|
|
74
|
-
const userData = deepAccess(bidderRequest, 'ortb2.user.data', []);
|
|
75
|
-
|
|
76
|
-
if (isFn(bid.getFloor)) {
|
|
77
|
-
const floorInfo = bid.getFloor({
|
|
78
|
-
currency: 'USD',
|
|
79
|
-
mediaType: '*',
|
|
80
|
-
size: '*'
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
if (floorInfo.currency === 'USD') {
|
|
84
|
-
bidFloor = floorInfo.floor;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
let data = {
|
|
89
|
-
url: encodeURIComponent(topWindowUrl),
|
|
90
|
-
uqs: getTopWindowQueryParams(),
|
|
91
|
-
cb: Date.now(),
|
|
92
|
-
bidFloor: bidFloor,
|
|
93
|
-
bidId: bidId,
|
|
94
|
-
referrer: bidderRequest.refererInfo.ref,
|
|
95
|
-
adUnitCode: adUnitCode,
|
|
96
|
-
publisherId: pId,
|
|
97
|
-
sizes: sizes,
|
|
98
|
-
uniqueDealId: uniqueDealId,
|
|
99
|
-
bidderVersion: BIDDER_VERSION,
|
|
100
|
-
prebidVersion: '$prebid.version$',
|
|
101
|
-
res: `${screen.width}x${screen.height}`,
|
|
102
|
-
schain: schain,
|
|
103
|
-
mediaTypes: mediaTypes,
|
|
104
|
-
isStorageAllowed: isStorageAllowed,
|
|
105
|
-
gpid: gpid,
|
|
106
|
-
cat: cat,
|
|
107
|
-
contentData,
|
|
108
|
-
userData: userData,
|
|
109
|
-
pagecat: pagecat,
|
|
110
|
-
transactionId: ortb2Imp?.ext?.tid,
|
|
111
|
-
bidderRequestId: bidderRequestId,
|
|
112
|
-
bidRequestsCount: bidRequestsCount,
|
|
113
|
-
bidderRequestsCount: bidderRequestsCount,
|
|
114
|
-
bidderWinsCount: bidderWinsCount,
|
|
115
|
-
bidderTimeout: bidderTimeout,
|
|
116
|
-
webSessionId: webSessionId
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
appendUserIdsToRequestPayload(data, userId);
|
|
120
|
-
|
|
121
|
-
const sua = deepAccess(bidderRequest, 'ortb2.device.sua');
|
|
122
|
-
|
|
123
|
-
if (sua) {
|
|
124
|
-
data.sua = sua;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (bidderRequest.gdprConsent) {
|
|
128
|
-
if (bidderRequest.gdprConsent.consentString) {
|
|
129
|
-
data.gdprConsent = bidderRequest.gdprConsent.consentString;
|
|
130
|
-
}
|
|
131
|
-
if (bidderRequest.gdprConsent.gdprApplies !== undefined) {
|
|
132
|
-
data.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
if (bidderRequest.uspConsent) {
|
|
136
|
-
data.usPrivacy = bidderRequest.uspConsent;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (bidderRequest.gppConsent) {
|
|
140
|
-
data.gppString = bidderRequest.gppConsent.gppString;
|
|
141
|
-
data.gppSid = bidderRequest.gppConsent.applicableSections;
|
|
142
|
-
} else if (bidderRequest.ortb2?.regs?.gpp) {
|
|
143
|
-
data.gppString = bidderRequest.ortb2.regs.gpp;
|
|
144
|
-
data.gppSid = bidderRequest.ortb2.regs.gpp_sid;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
if (bidderRequest.paapi?.enabled) {
|
|
148
|
-
const fledge = deepAccess(bidderRequest, 'ortb2Imp.ext.ae');
|
|
149
|
-
if (fledge) {
|
|
150
|
-
data.fledge = fledge;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
19
|
+
const buildRequests = createBuildRequestsFn(createDomain, null, storage, BIDDER_CODE, BIDDER_VERSION, true);
|
|
153
20
|
|
|
154
|
-
|
|
155
|
-
data['ext.' + key] = value;
|
|
156
|
-
});
|
|
21
|
+
const interpretResponse = createInterpretResponseFn(BIDDER_CODE, true);
|
|
157
22
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
function buildRequest(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout) {
|
|
162
|
-
const {params} = bid;
|
|
163
|
-
const cId = extractCID(params);
|
|
164
|
-
const subDomain = extractSubDomain(params);
|
|
165
|
-
const data = buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout);
|
|
166
|
-
const dto = {
|
|
167
|
-
method: 'POST',
|
|
168
|
-
url: `${createDomain(subDomain)}/prebid/multi/${cId}`,
|
|
169
|
-
data: data
|
|
170
|
-
};
|
|
171
|
-
return dto;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
function buildSingleRequest(bidRequests, bidderRequest, topWindowUrl, bidderTimeout) {
|
|
175
|
-
const {params} = bidRequests[0];
|
|
176
|
-
const cId = extractCID(params);
|
|
177
|
-
const subDomain = extractSubDomain(params);
|
|
178
|
-
const data = bidRequests.map(bid => {
|
|
179
|
-
const sizes = parseSizesInput(bid.sizes);
|
|
180
|
-
return buildRequestData(bid, topWindowUrl, sizes, bidderRequest, bidderTimeout)
|
|
181
|
-
});
|
|
182
|
-
const chunkSize = Math.min(20, config.getConfig('twistdigital.chunkSize') || 10);
|
|
183
|
-
|
|
184
|
-
const chunkedData = chunk(data, chunkSize);
|
|
185
|
-
return chunkedData.map(chunk => {
|
|
186
|
-
return {
|
|
187
|
-
method: 'POST',
|
|
188
|
-
url: `${createDomain(subDomain)}/prebid/multi/${cId}`,
|
|
189
|
-
data: {
|
|
190
|
-
bids: chunk
|
|
191
|
-
}
|
|
192
|
-
};
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function appendUserIdsToRequestPayload(payloadRef, userIds) {
|
|
197
|
-
let key;
|
|
198
|
-
_each(userIds, (userId, idSystemProviderName) => {
|
|
199
|
-
key = `uid.${idSystemProviderName}`;
|
|
200
|
-
switch (idSystemProviderName) {
|
|
201
|
-
case 'digitrustid':
|
|
202
|
-
payloadRef[key] = deepAccess(userId, 'data.id');
|
|
203
|
-
break;
|
|
204
|
-
case 'lipb':
|
|
205
|
-
payloadRef[key] = userId.lipbid;
|
|
206
|
-
break;
|
|
207
|
-
case 'parrableId':
|
|
208
|
-
payloadRef[key] = userId.eid;
|
|
209
|
-
break;
|
|
210
|
-
case 'id5id':
|
|
211
|
-
payloadRef[key] = userId.uid;
|
|
212
|
-
break;
|
|
213
|
-
default:
|
|
214
|
-
payloadRef[key] = userId;
|
|
215
|
-
}
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
function buildRequests(validBidRequests, bidderRequest) {
|
|
220
|
-
const topWindowUrl = bidderRequest.refererInfo.page || bidderRequest.refererInfo.topmostLocation;
|
|
221
|
-
const bidderTimeout = config.getConfig('bidderTimeout');
|
|
222
|
-
|
|
223
|
-
const singleRequestMode = config.getConfig('twistdigital.singleRequest');
|
|
224
|
-
|
|
225
|
-
const requests = [];
|
|
226
|
-
|
|
227
|
-
if (singleRequestMode) {
|
|
228
|
-
// banner bids are sent as a single request
|
|
229
|
-
const bannerBidRequests = validBidRequests.filter(bid => isArray(bid.mediaTypes) ? bid.mediaTypes.includes(BANNER) : bid.mediaTypes[BANNER] !== undefined);
|
|
230
|
-
if (bannerBidRequests.length > 0) {
|
|
231
|
-
const singleRequests = buildSingleRequest(bannerBidRequests, bidderRequest, topWindowUrl, bidderTimeout);
|
|
232
|
-
requests.push(...singleRequests);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// video bids are sent as a single request for each bid
|
|
236
|
-
|
|
237
|
-
const videoBidRequests = validBidRequests.filter(bid => bid.mediaTypes[VIDEO] !== undefined);
|
|
238
|
-
videoBidRequests.forEach(validBidRequest => {
|
|
239
|
-
const sizes = parseSizesInput(validBidRequest.sizes);
|
|
240
|
-
const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout);
|
|
241
|
-
requests.push(request);
|
|
242
|
-
});
|
|
243
|
-
} else {
|
|
244
|
-
validBidRequests.forEach(validBidRequest => {
|
|
245
|
-
const sizes = parseSizesInput(validBidRequest.sizes);
|
|
246
|
-
const request = buildRequest(validBidRequest, topWindowUrl, sizes, bidderRequest, bidderTimeout);
|
|
247
|
-
requests.push(request);
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
return requests;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
function interpretResponse(serverResponse, request) {
|
|
254
|
-
if (!serverResponse || !serverResponse.body) {
|
|
255
|
-
return [];
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
const singleRequestMode = config.getConfig('twistdigital.singleRequest');
|
|
259
|
-
const reqBidId = deepAccess(request, 'data.bidId');
|
|
260
|
-
const {results} = serverResponse.body;
|
|
261
|
-
|
|
262
|
-
let output = [];
|
|
263
|
-
|
|
264
|
-
try {
|
|
265
|
-
results.forEach((result, i) => {
|
|
266
|
-
const {
|
|
267
|
-
creativeId,
|
|
268
|
-
ad,
|
|
269
|
-
price,
|
|
270
|
-
exp,
|
|
271
|
-
width,
|
|
272
|
-
height,
|
|
273
|
-
currency,
|
|
274
|
-
bidId,
|
|
275
|
-
nurl,
|
|
276
|
-
advertiserDomains,
|
|
277
|
-
metaData,
|
|
278
|
-
mediaType = BANNER
|
|
279
|
-
} = result;
|
|
280
|
-
if (!ad || !price) {
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
const response = {
|
|
285
|
-
requestId: (singleRequestMode && bidId) ? bidId : reqBidId,
|
|
286
|
-
cpm: price,
|
|
287
|
-
width: width,
|
|
288
|
-
height: height,
|
|
289
|
-
creativeId: creativeId,
|
|
290
|
-
currency: currency || CURRENCY,
|
|
291
|
-
netRevenue: true,
|
|
292
|
-
ttl: exp || TTL_SECONDS,
|
|
293
|
-
};
|
|
294
|
-
|
|
295
|
-
if (nurl) {
|
|
296
|
-
response.nurl = nurl;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
if (metaData) {
|
|
300
|
-
Object.assign(response, {
|
|
301
|
-
meta: metaData
|
|
302
|
-
})
|
|
303
|
-
} else {
|
|
304
|
-
Object.assign(response, {
|
|
305
|
-
meta: {
|
|
306
|
-
advertiserDomains: advertiserDomains || []
|
|
307
|
-
}
|
|
308
|
-
})
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
if (mediaType === BANNER) {
|
|
312
|
-
Object.assign(response, {
|
|
313
|
-
ad: ad,
|
|
314
|
-
});
|
|
315
|
-
} else {
|
|
316
|
-
Object.assign(response, {
|
|
317
|
-
vastXml: ad,
|
|
318
|
-
mediaType: VIDEO
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
output.push(response);
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
return output;
|
|
325
|
-
} catch (e) {
|
|
326
|
-
return [];
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
function getUserSyncs(syncOptions, responses, gdprConsent = {}, uspConsent = '', gppConsent = {}) {
|
|
331
|
-
let syncs = [];
|
|
332
|
-
const {iframeEnabled, pixelEnabled} = syncOptions;
|
|
333
|
-
const {gdprApplies, consentString = ''} = gdprConsent;
|
|
334
|
-
const {gppString, applicableSections} = gppConsent;
|
|
335
|
-
|
|
336
|
-
const cidArr = responses.filter(resp => deepAccess(resp, 'body.cid')).map(resp => resp.body.cid).filter(uniques);
|
|
337
|
-
let params = `?cid=${encodeURIComponent(cidArr.join(','))}&gdpr=${gdprApplies ? 1 : 0}&gdpr_consent=${encodeURIComponent(consentString || '')}&us_privacy=${encodeURIComponent(uspConsent || '')}`;
|
|
338
|
-
|
|
339
|
-
if (gppString && applicableSections?.length) {
|
|
340
|
-
params += '&gpp=' + encodeURIComponent(gppString);
|
|
341
|
-
params += '&gpp_sid=' + encodeURIComponent(applicableSections.join(','));
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
if (iframeEnabled) {
|
|
345
|
-
syncs.push({
|
|
346
|
-
type: 'iframe',
|
|
347
|
-
url: `https://sync.twist.win/api/sync/iframe/${params}`
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
if (pixelEnabled) {
|
|
351
|
-
syncs.push({
|
|
352
|
-
type: 'image',
|
|
353
|
-
url: `https://sync.twist.win/api/sync/image/${params}`
|
|
354
|
-
});
|
|
355
|
-
}
|
|
356
|
-
return syncs;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
/**
|
|
360
|
-
* @param {Bid} bid
|
|
361
|
-
*/
|
|
362
|
-
function onBidWon(bid) {
|
|
363
|
-
if (!bid.nurl) {
|
|
364
|
-
return;
|
|
365
|
-
}
|
|
366
|
-
const wonBid = {
|
|
367
|
-
adId: bid.adId,
|
|
368
|
-
creativeId: bid.creativeId,
|
|
369
|
-
auctionId: bid.auctionId,
|
|
370
|
-
transactionId: bid.transactionId,
|
|
371
|
-
adUnitCode: bid.adUnitCode,
|
|
372
|
-
cpm: bid.cpm,
|
|
373
|
-
currency: bid.currency,
|
|
374
|
-
originalCpm: bid.originalCpm,
|
|
375
|
-
originalCurrency: bid.originalCurrency,
|
|
376
|
-
netRevenue: bid.netRevenue,
|
|
377
|
-
mediaType: bid.mediaType,
|
|
378
|
-
timeToRespond: bid.timeToRespond,
|
|
379
|
-
status: bid.status,
|
|
380
|
-
};
|
|
381
|
-
const qs = formatQS(wonBid);
|
|
382
|
-
const url = bid.nurl + (bid.nurl.indexOf('?') === -1 ? '?' : '&') + qs;
|
|
383
|
-
triggerPixel(url);
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
export function hashCode(s, prefix = '_') {
|
|
387
|
-
const l = s.length;
|
|
388
|
-
let h = 0
|
|
389
|
-
let i = 0;
|
|
390
|
-
if (l > 0) {
|
|
391
|
-
while (i < l) {
|
|
392
|
-
h = (h << 5) - h + s.charCodeAt(i++) | 0;
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
return prefix + h;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
export function getUniqueDealId(key, expiry = UNIQUE_DEAL_ID_EXPIRY) {
|
|
399
|
-
const storageKey = `u_${key}`;
|
|
400
|
-
const now = Date.now();
|
|
401
|
-
const data = getStorageItem(storageKey);
|
|
402
|
-
let uniqueId;
|
|
403
|
-
|
|
404
|
-
if (!data || !data.value || now - data.created > expiry) {
|
|
405
|
-
uniqueId = `${key}_${now.toString()}`;
|
|
406
|
-
setStorageItem(storageKey, uniqueId);
|
|
407
|
-
} else {
|
|
408
|
-
uniqueId = data.value;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
return uniqueId;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
export function getStorageItem(key) {
|
|
415
|
-
try {
|
|
416
|
-
return tryParseJSON(storage.getDataFromLocalStorage(key));
|
|
417
|
-
} catch (e) {
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
return null;
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
export function setStorageItem(key, value, timestamp) {
|
|
424
|
-
try {
|
|
425
|
-
const created = timestamp || Date.now();
|
|
426
|
-
const data = JSON.stringify({value, created});
|
|
427
|
-
storage.setDataInLocalStorage(key, data);
|
|
428
|
-
} catch (e) {
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
export function tryParseJSON(value) {
|
|
433
|
-
try {
|
|
434
|
-
return JSON.parse(value);
|
|
435
|
-
} catch (e) {
|
|
436
|
-
return value;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
23
|
+
const getUserSyncs = createUserSyncGetter({
|
|
24
|
+
iframeSyncUrl: 'https://sync.twist.win/api/sync/iframe', imageSyncUrl: 'https://sync.twist.win/api/sync/image'
|
|
25
|
+
});
|
|
439
26
|
|
|
440
27
|
export const spec = {
|
|
441
28
|
code: BIDDER_CODE,
|
|
@@ -6,6 +6,7 @@ import {deepAccess, getBidIdParameter, logError} from '../src/utils.js';
|
|
|
6
6
|
|
|
7
7
|
const BIDDER_CODE = 'viant';
|
|
8
8
|
const ENDPOINT = 'https://bidders-us-east-1.adelphic.net/d/rtb/v25/prebid/bidder'
|
|
9
|
+
const ADAPTER_VERSION = '2.0.0';
|
|
9
10
|
|
|
10
11
|
const DEFAULT_BID_TTL = 300;
|
|
11
12
|
const DEFAULT_CURRENCY = 'USD';
|
|
@@ -85,6 +86,25 @@ function createRequest(bidRequests, bidderRequest, mediaType) {
|
|
|
85
86
|
if (!data.regs.ext) data.regs.ext = {};
|
|
86
87
|
data.regs.ext.us_privacy = bidderRequest.uspConsent;
|
|
87
88
|
}
|
|
89
|
+
let imp = data.imp || [];
|
|
90
|
+
let dealsMap = new Map();
|
|
91
|
+
if (bidderRequest.bids) {
|
|
92
|
+
bidderRequest.bids.forEach(bid => {
|
|
93
|
+
if (bid.ortb2Imp && bid.ortb2Imp.pmp) {
|
|
94
|
+
dealsMap.set(bid.bidId, bid.ortb2Imp.pmp);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
imp.forEach((element) => {
|
|
99
|
+
let deals = dealsMap.get(element.id);
|
|
100
|
+
if (deals) {
|
|
101
|
+
element.pmp = deals;
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
data.ext = data.ext || {};
|
|
105
|
+
data.ext.viant = {
|
|
106
|
+
adapterVersion: ADAPTER_VERSION
|
|
107
|
+
};
|
|
88
108
|
return {
|
|
89
109
|
method: 'POST',
|
|
90
110
|
url: ENDPOINT,
|
|
@@ -32,12 +32,12 @@ function createUniqueRequestData(hashUrl) {
|
|
|
32
32
|
const vdzhum = getCacheOpt(storage, OPT_TIME_KEY);
|
|
33
33
|
|
|
34
34
|
return {
|
|
35
|
-
dealId: dealId, sessionId: sessionId, ptrace: ptrace, vdzhum: vdzhum
|
|
35
|
+
dealId: dealId, sessionId: sessionId, ptrace: ptrace, vdzhum: vdzhum, webSessionId: webSessionId
|
|
36
36
|
};
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
const buildRequests = createBuildRequestsFn(createDomain, createUniqueRequestData,
|
|
40
|
-
const interpretResponse = createInterpretResponseFn(BIDDER_CODE);
|
|
39
|
+
const buildRequests = createBuildRequestsFn(createDomain, createUniqueRequestData, storage, BIDDER_CODE, BIDDER_VERSION, true);
|
|
40
|
+
const interpretResponse = createInterpretResponseFn(BIDDER_CODE, true);
|
|
41
41
|
const getUserSyncs = createUserSyncGetter({
|
|
42
42
|
iframeSyncUrl: 'https://sync.cootlogix.com/api/sync/iframe', imageSyncUrl: 'https://sync.cootlogix.com/api/sync/image'
|
|
43
43
|
});
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {deepAccess, logError, parseSizesInput, triggerPixel} from '../src/utils.js';
|
|
1
|
+
import {deepAccess, logError, mergeDeep, parseSizesInput, sizeTupleToRtbSize, sizesToSizeTuples, triggerPixel} from '../src/utils.js';
|
|
2
2
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
3
3
|
import {config} from '../src/config.js';
|
|
4
4
|
import {BANNER, VIDEO} from '../src/mediaTypes.js';
|
|
5
5
|
import {INSTREAM as VIDEO_INSTREAM} from '../src/video.js';
|
|
6
6
|
import {getStorageManager} from '../src/storageManager.js';
|
|
7
7
|
import {getGptSlotInfoForAdUnitCode} from '../libraries/gptUtils/gptUtils.js';
|
|
8
|
+
import { getBidFromResponse } from '../libraries/processResponse/index.js';
|
|
8
9
|
|
|
9
10
|
const BIDDER_CODE = 'visx';
|
|
10
11
|
const GVLID = 154;
|
|
@@ -69,6 +70,7 @@ export const spec = {
|
|
|
69
70
|
let payloadSite;
|
|
70
71
|
let payloadRegs;
|
|
71
72
|
let payloadContent;
|
|
73
|
+
let payloadUser;
|
|
72
74
|
|
|
73
75
|
if (currencyWhiteList.indexOf(currency) === -1) {
|
|
74
76
|
logError(LOG_ERROR_MESS.notAllowedCurrency + currency);
|
|
@@ -116,6 +118,24 @@ export const spec = {
|
|
|
116
118
|
|
|
117
119
|
const { ortb2 } = bidderRequest;
|
|
118
120
|
const { device, site, regs, content } = ortb2;
|
|
121
|
+
const userOrtb2 = ortb2.user;
|
|
122
|
+
let user;
|
|
123
|
+
let userReq;
|
|
124
|
+
const vads = _getUserId();
|
|
125
|
+
if (payloadUserEids || payload.gdpr_consent || vads) {
|
|
126
|
+
user = {
|
|
127
|
+
ext: {
|
|
128
|
+
...(payloadUserEids && { eids: payloadUserEids }),
|
|
129
|
+
...(payload.gdpr_consent && { consent: payload.gdpr_consent }),
|
|
130
|
+
...(vads && { vads })
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
if (user) {
|
|
135
|
+
userReq = mergeDeep(user, userOrtb2);
|
|
136
|
+
} else {
|
|
137
|
+
userReq = userOrtb2;
|
|
138
|
+
}
|
|
119
139
|
if (device) {
|
|
120
140
|
payloadDevice = device;
|
|
121
141
|
}
|
|
@@ -128,6 +148,9 @@ export const spec = {
|
|
|
128
148
|
if (content) {
|
|
129
149
|
payloadContent = content;
|
|
130
150
|
}
|
|
151
|
+
if (userReq) {
|
|
152
|
+
payloadUser = userReq;
|
|
153
|
+
}
|
|
131
154
|
}
|
|
132
155
|
|
|
133
156
|
const tmax = timeout;
|
|
@@ -139,14 +162,6 @@ export const spec = {
|
|
|
139
162
|
}
|
|
140
163
|
};
|
|
141
164
|
|
|
142
|
-
const vads = _getUserId();
|
|
143
|
-
const user = {
|
|
144
|
-
ext: {
|
|
145
|
-
...(payloadUserEids && { eids: payloadUserEids }),
|
|
146
|
-
...(payload.gdpr_consent && { consent: payload.gdpr_consent }),
|
|
147
|
-
...(vads && { vads })
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
165
|
if (payloadRegs === undefined) {
|
|
151
166
|
payloadRegs = ('gdpr_applies' in payload) && {
|
|
152
167
|
ext: {
|
|
@@ -161,7 +176,7 @@ export const spec = {
|
|
|
161
176
|
tmax,
|
|
162
177
|
cur: [currency],
|
|
163
178
|
source,
|
|
164
|
-
...(
|
|
179
|
+
...(payloadUser && { user: payloadUser }),
|
|
165
180
|
...(payloadRegs && {regs: payloadRegs}),
|
|
166
181
|
...(payloadDevice && { device: payloadDevice }),
|
|
167
182
|
...(payloadSite && { site: payloadSite }),
|
|
@@ -190,7 +205,7 @@ export const spec = {
|
|
|
190
205
|
|
|
191
206
|
if (!errorMessage && serverResponse.seatbid) {
|
|
192
207
|
serverResponse.seatbid.forEach(respItem => {
|
|
193
|
-
_addBidResponse(
|
|
208
|
+
_addBidResponse(getBidFromResponse(respItem, LOG_ERROR_MESS), bidsMap, currency, bidResponses);
|
|
194
209
|
});
|
|
195
210
|
}
|
|
196
211
|
if (errorMessage) logError(errorMessage);
|
|
@@ -260,13 +275,7 @@ function makeBanner(bannerParams) {
|
|
|
260
275
|
if (bannerSizes) {
|
|
261
276
|
const sizes = parseSizesInput(bannerSizes);
|
|
262
277
|
if (sizes.length) {
|
|
263
|
-
const format =
|
|
264
|
-
const [ width, height ] = size.split('x');
|
|
265
|
-
const w = parseInt(width, 10);
|
|
266
|
-
const h = parseInt(height, 10);
|
|
267
|
-
return { w, h };
|
|
268
|
-
});
|
|
269
|
-
|
|
278
|
+
const format = sizesToSizeTuples(bannerSizes).map(sizeTupleToRtbSize);
|
|
270
279
|
return { format };
|
|
271
280
|
}
|
|
272
281
|
}
|
|
@@ -306,17 +315,6 @@ function buildImpObject(bid) {
|
|
|
306
315
|
}
|
|
307
316
|
}
|
|
308
317
|
|
|
309
|
-
function _getBidFromResponse(respItem) {
|
|
310
|
-
if (!respItem) {
|
|
311
|
-
logError(LOG_ERROR_MESS.emptySeatbid);
|
|
312
|
-
} else if (!respItem.bid) {
|
|
313
|
-
logError(LOG_ERROR_MESS.hasNoArrayOfBids + JSON.stringify(respItem));
|
|
314
|
-
} else if (!respItem.bid[0]) {
|
|
315
|
-
logError(LOG_ERROR_MESS.noBid);
|
|
316
|
-
}
|
|
317
|
-
return respItem && respItem.bid && respItem.bid[0];
|
|
318
|
-
}
|
|
319
|
-
|
|
320
318
|
function _addBidResponse(serverBid, bidsMap, currency, bidResponses) {
|
|
321
319
|
if (!serverBid) return;
|
|
322
320
|
let errorMessage;
|
|
@@ -128,8 +128,8 @@ export const spec = {
|
|
|
128
128
|
id: bidderRequest.bidderRequestId,
|
|
129
129
|
cur: [DEFAULT_CUR],
|
|
130
130
|
imp: imps,
|
|
131
|
-
site:
|
|
132
|
-
device: {...
|
|
131
|
+
site: {...bidderRequest?.ortb2?.site, ...params?.site},
|
|
132
|
+
device: {...bidderRequest?.ortb2?.device, ...params?.device},
|
|
133
133
|
user: params.user ? params.user : {},
|
|
134
134
|
app: params.app ? params.app : {},
|
|
135
135
|
ext: {
|
package/package.json
CHANGED
package/src/adRendering.js
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
createIframe,
|
|
3
|
+
createInvisibleIframe,
|
|
4
|
+
deepAccess,
|
|
5
|
+
inIframe,
|
|
6
|
+
insertElement,
|
|
7
|
+
logError,
|
|
8
|
+
logWarn,
|
|
9
|
+
replaceMacros
|
|
10
|
+
} from './utils.js';
|
|
2
11
|
import * as events from './events.js';
|
|
3
|
-
import {
|
|
12
|
+
import {AD_RENDER_FAILED_REASON, BID_STATUS, EVENTS, MESSAGES, PB_LOCATOR} from './constants.js';
|
|
4
13
|
import {config} from './config.js';
|
|
5
14
|
import {executeRenderer, isRendererRequired} from './Renderer.js';
|
|
6
15
|
import {VIDEO} from './mediaTypes.js';
|
|
@@ -235,3 +244,21 @@ export function renderAdDirect(doc, adId, options) {
|
|
|
235
244
|
fail(EXCEPTION, e.message);
|
|
236
245
|
}
|
|
237
246
|
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Insert an invisible, named iframe that can be used by creatives to locate the window Prebid is running in
|
|
250
|
+
* (by looking for one that has `.frames[PB_LOCATOR]` defined).
|
|
251
|
+
* This is necessary because in some situations creatives may be rendered inside nested iframes - Prebid is not necessarily
|
|
252
|
+
* in the immediate parent window.
|
|
253
|
+
*/
|
|
254
|
+
export function insertLocatorFrame() {
|
|
255
|
+
if (!window.frames[PB_LOCATOR]) {
|
|
256
|
+
if (!document.body) {
|
|
257
|
+
window.requestAnimationFrame(insertLocatorFrame);
|
|
258
|
+
} else {
|
|
259
|
+
const frame = createInvisibleIframe();
|
|
260
|
+
frame.name = PB_LOCATOR;
|
|
261
|
+
document.body.appendChild(frame);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|