prebid.js 7.50.0 → 7.52.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/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adhashBidAdapter.js +1 -1
- package/dist/adkernelBidAdapter.js +1 -1
- package/dist/admanBidAdapter.js +1 -1
- package/dist/adnuntiusBidAdapter.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adrinoBidAdapter.js +1 -1
- package/dist/adriverIdSystem.js +1 -1
- package/dist/adtelligentBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/allowActivities.js +1 -0
- 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/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/cleanioRtdProvider.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectIdSystem.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/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/dependencies.json +6 -0
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/gdprEnforcement.js +1 -1
- package/dist/glimpseBidAdapter.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/growthCodeRtdProvider.js +1 -0
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/inmarBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/kulturemediaBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.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/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/minutemediaplusBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +144 -140
- package/dist/objectGuard.js +1 -0
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/oxxionAnalyticsAdapter.js +1 -0
- package/dist/pairIdSystem.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/publinkIdSystem.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/rtdModule.js +1 -1
- package/dist/rubiconAnalyticsAdapter.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/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnAnalyticsAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.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/userId.js +1 -1
- package/dist/vidazooBidAdapter.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/yahoosspBidAdapter.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/growthcode.html +20 -9
- package/libraries/objectGuard/objectGuard.js +108 -0
- package/libraries/objectGuard/ortbGuard.js +88 -0
- package/modules/adgenerationBidAdapter.js +14 -5
- package/modules/adhashBidAdapter.js +28 -17
- package/modules/adkernelBidAdapter.js +2 -1
- package/modules/admanBidAdapter.js +30 -22
- package/modules/adnuntiusBidAdapter.js +98 -79
- package/modules/adnuntiusBidAdapter.md +2 -1
- package/modules/adqueryBidAdapter.js +7 -1
- package/modules/adrinoBidAdapter.js +1 -0
- package/modules/adriverIdSystem.js +1 -1
- package/modules/adtelligentBidAdapter.js +4 -2
- package/modules/allowActivities.js +74 -0
- package/modules/appnexusBidAdapter.js +1 -0
- package/modules/cleanioRtdProvider.js +2 -4
- package/modules/connectIdSystem.js +89 -13
- package/modules/connectIdSystem.md +4 -7
- package/modules/criteoBidAdapter.js +50 -3
- package/modules/freewheel-sspBidAdapter.js +10 -2
- package/modules/gdprEnforcement.js +98 -169
- package/modules/growthCodeRtdProvider.js +131 -0
- package/modules/growthCodeRtdProvider.md +55 -0
- package/modules/gumgumBidAdapter.js +5 -0
- package/modules/ixBidAdapter.js +5 -2
- package/modules/minutemediaBidAdapter.js +13 -3
- package/modules/oxxionAnalyticsAdapter.js +212 -0
- package/modules/oxxionAnalyticsAdapter.md +33 -0
- package/modules/pairIdSystem.js +6 -6
- package/modules/prebidServerBidAdapter/index.js +7 -8
- package/modules/pubmaticBidAdapter.js +1 -0
- package/modules/riseBidAdapter.js +13 -3
- package/modules/rtbhouseBidAdapter.md +24 -0
- package/modules/rtdModule/index.js +12 -1
- package/modules/sharethroughBidAdapter.js +2 -2
- package/modules/smartadserverBidAdapter.js +5 -0
- package/modules/stvBidAdapter.js +34 -1
- package/modules/undertoneBidAdapter.js +9 -1
- package/modules/userId/index.js +69 -41
- package/modules/yahoosspBidAdapter.js +45 -3
- package/modules/yahoosspBidAdapter.md +1 -1
- package/modules/zeta_global_sspBidAdapter.js +1 -0
- package/package.json +1 -1
- package/src/activities/activities.js +47 -0
- package/src/activities/activityParams.js +8 -0
- package/src/activities/modules.js +1 -1
- package/src/activities/params.js +59 -0
- package/src/activities/redactor.js +157 -0
- package/src/activities/rules.js +95 -0
- package/src/adapterManager.js +45 -8
- package/src/adloader.js +2 -1
- package/src/fpd/rootDomain.js +1 -1
- package/src/native.js +20 -4
- package/src/prebid.js +1 -1
- package/src/storageManager.js +57 -44
- package/src/userSync.js +35 -18
- package/test/spec/activities/allowActivites_spec.js +138 -0
- package/test/spec/activities/objectGuard_spec.js +144 -0
- package/test/spec/activities/ortbGuard_spec.js +140 -0
- package/test/spec/activities/params_spec.js +25 -0
- package/test/spec/activities/redactor_spec.js +296 -0
- package/test/spec/activities/rules_spec.js +135 -0
- package/test/spec/modules/adgenerationBidAdapter_spec.js +52 -12
- package/test/spec/modules/adhashBidAdapter_spec.js +51 -1
- package/test/spec/modules/admanBidAdapter_spec.js +1 -2
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +535 -264
- package/test/spec/modules/adqueryBidAdapter_spec.js +9 -0
- package/test/spec/modules/adrinoBidAdapter_spec.js +4 -0
- package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
- package/test/spec/modules/cleanioRtdProvider_spec.js +7 -8
- package/test/spec/modules/connectIdSystem_spec.js +291 -23
- package/test/spec/modules/criteoBidAdapter_spec.js +134 -2
- package/test/spec/modules/freewheel-sspBidAdapter_spec.js +5 -2
- package/test/spec/modules/gdprEnforcement_spec.js +127 -414
- package/test/spec/modules/growthCodeRtdProvider_spec.js +127 -0
- package/test/spec/modules/gumgumBidAdapter_spec.js +14 -0
- package/test/spec/modules/ixBidAdapter_spec.js +2 -1
- package/test/spec/modules/minutemediaBidAdapter_spec.js +69 -1
- package/test/spec/modules/oxxionAnalyticsAdapter_spec.js +324 -0
- package/test/spec/modules/pairIdSystem_spec.js +16 -3
- package/test/spec/modules/prebidServerBidAdapter_spec.js +3 -1
- package/test/spec/modules/pubmaticBidAdapter_spec.js +7 -0
- package/test/spec/modules/realTimeDataModule_spec.js +1 -1
- package/test/spec/modules/riseBidAdapter_spec.js +69 -1
- package/test/spec/modules/sharethroughBidAdapter_spec.js +1 -1
- package/test/spec/modules/smartadserverBidAdapter_spec.js +42 -0
- package/test/spec/modules/stvBidAdapter_spec.js +13 -1
- package/test/spec/modules/undertoneBidAdapter_spec.js +57 -1
- package/test/spec/modules/userId_spec.js +80 -21
- package/test/spec/modules/yahoosspBidAdapter_spec.js +103 -51
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +4 -0
- package/test/spec/native_spec.js +12 -12
- package/test/spec/unit/core/adapterManager_spec.js +181 -1
- package/test/spec/unit/core/storageManager_spec.js +76 -68
- package/test/spec/unit/pbjs_api_spec.js +15 -25
- package/test/spec/userSync_spec.js +45 -16
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {tryAppendQueryString, getBidIdParameter, escapeUnsafeChars} from '../src/utils.js';
|
|
1
|
+
import {tryAppendQueryString, getBidIdParameter, escapeUnsafeChars, deepAccess} from '../src/utils.js';
|
|
2
2
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
3
3
|
import {BANNER, NATIVE} from '../src/mediaTypes.js';
|
|
4
4
|
import {config} from '../src/config.js';
|
|
5
|
-
import {
|
|
5
|
+
import {convertOrtbRequestToProprietaryNative} from '../src/native.js';
|
|
6
6
|
|
|
7
7
|
const ADG_BIDDER_CODE = 'adgeneration';
|
|
8
8
|
|
|
@@ -21,14 +21,14 @@ export const spec = {
|
|
|
21
21
|
},
|
|
22
22
|
/**
|
|
23
23
|
* Make a server request from the list of BidRequests.
|
|
24
|
-
*
|
|
25
|
-
* @param
|
|
24
|
+
* @param validBidRequests
|
|
25
|
+
* @param bidderRequest
|
|
26
26
|
* @return ServerRequest Info describing the request to the server.
|
|
27
27
|
*/
|
|
28
28
|
buildRequests: function (validBidRequests, bidderRequest) {
|
|
29
29
|
// convert Native ORTB definition to old-style prebid native definition
|
|
30
30
|
validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
|
|
31
|
-
const ADGENE_PREBID_VERSION = '1.
|
|
31
|
+
const ADGENE_PREBID_VERSION = '1.6.0';
|
|
32
32
|
let serverRequests = [];
|
|
33
33
|
for (let i = 0, len = validBidRequests.length; i < len; i++) {
|
|
34
34
|
const validReq = validBidRequests[i];
|
|
@@ -38,6 +38,9 @@ export const spec = {
|
|
|
38
38
|
const criteoId = getCriteoId(validReq);
|
|
39
39
|
const id5id = getId5Id(validReq);
|
|
40
40
|
const id5LinkType = getId5LinkType(validReq);
|
|
41
|
+
const imuid = deepAccess(validReq, 'userId.imuid');
|
|
42
|
+
const gpid = deepAccess(validReq, 'ortb2Imp.ext.gpid');
|
|
43
|
+
const sua = deepAccess(validReq, 'ortb2.device.sua');
|
|
41
44
|
let data = ``;
|
|
42
45
|
data = tryAppendQueryString(data, 'posall', 'SSPLOC');
|
|
43
46
|
const id = getBidIdParameter('id', validReq.params);
|
|
@@ -54,6 +57,12 @@ export const spec = {
|
|
|
54
57
|
data = tryAppendQueryString(data, 'adgext_criteo_id', criteoId);
|
|
55
58
|
data = tryAppendQueryString(data, 'adgext_id5_id', id5id);
|
|
56
59
|
data = tryAppendQueryString(data, 'adgext_id5_id_link_type', id5LinkType);
|
|
60
|
+
data = tryAppendQueryString(data, 'adgext_imuid', imuid);
|
|
61
|
+
data = tryAppendQueryString(data, 'adgext_uid2', validReq.userId ? validReq.userId.uid2 : null);
|
|
62
|
+
data = tryAppendQueryString(data, 'gpid', gpid ? encodeURIComponent(gpid) : null);
|
|
63
|
+
data = tryAppendQueryString(data, 'uach', sua ? JSON.stringify(sua) : null);
|
|
64
|
+
data = tryAppendQueryString(data, 'schain', validReq.schain ? encodeURIComponent(JSON.stringify(validReq.schain)) : null);
|
|
65
|
+
|
|
57
66
|
// native以外にvideo等の対応が入った場合は要修正
|
|
58
67
|
if (!validReq.mediaTypes || !validReq.mediaTypes.native) {
|
|
59
68
|
data = tryAppendQueryString(data, 'imark', '1');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
2
2
|
import { getStorageManager } from '../src/storageManager.js';
|
|
3
3
|
import { includes } from '../src/polyfill.js';
|
|
4
|
-
import { BANNER } from '../src/mediaTypes.js';
|
|
4
|
+
import { BANNER, VIDEO } from '../src/mediaTypes.js';
|
|
5
5
|
|
|
6
6
|
const VERSION = '3.2';
|
|
7
7
|
const BAD_WORD_STEP = 0.1;
|
|
@@ -130,13 +130,13 @@ function brandSafety(badWords, maxScore) {
|
|
|
130
130
|
|
|
131
131
|
export const spec = {
|
|
132
132
|
code: ADHASH_BIDDER_CODE,
|
|
133
|
-
supportedMediaTypes: [ BANNER ],
|
|
133
|
+
supportedMediaTypes: [ BANNER, VIDEO ],
|
|
134
134
|
|
|
135
135
|
isBidRequestValid: (bid) => {
|
|
136
136
|
try {
|
|
137
137
|
const { publisherId, platformURL, bidderURL } = bid.params;
|
|
138
138
|
return (
|
|
139
|
-
includes(Object.keys(bid.mediaTypes), BANNER) &&
|
|
139
|
+
(includes(Object.keys(bid.mediaTypes), BANNER) || includes(Object.keys(bid.mediaTypes), VIDEO)) &&
|
|
140
140
|
typeof publisherId === 'string' &&
|
|
141
141
|
publisherId.length === 42 &&
|
|
142
142
|
typeof platformURL === 'string' &&
|
|
@@ -168,7 +168,14 @@ export const spec = {
|
|
|
168
168
|
const url = `${bidderURL}/rtb?version=${VERSION}&prebid=true`;
|
|
169
169
|
const index = Math.floor(Math.random() * validBidRequests[i].sizes.length);
|
|
170
170
|
const size = validBidRequests[i].sizes[index].join('x');
|
|
171
|
-
|
|
171
|
+
const creativeData = includes(Object.keys(validBidRequests[i].mediaTypes), VIDEO) ? {
|
|
172
|
+
size: 'preroll',
|
|
173
|
+
position: validBidRequests[i].adUnitCode,
|
|
174
|
+
playerSize: size
|
|
175
|
+
} : {
|
|
176
|
+
size: size,
|
|
177
|
+
position: validBidRequests[i].adUnitCode
|
|
178
|
+
};
|
|
172
179
|
let recentAds = [];
|
|
173
180
|
if (storage.localStorageIsEnabled()) {
|
|
174
181
|
const prefix = validBidRequests[i].params.prefix || 'adHash';
|
|
@@ -204,10 +211,7 @@ export const spec = {
|
|
|
204
211
|
language: window.navigator.language,
|
|
205
212
|
userAgent: window.navigator.userAgent
|
|
206
213
|
},
|
|
207
|
-
creatives: [
|
|
208
|
-
size: size,
|
|
209
|
-
position: validBidRequests[i].adUnitCode
|
|
210
|
-
}],
|
|
214
|
+
creatives: [creativeData],
|
|
211
215
|
blockedCreatives: [],
|
|
212
216
|
currentTimestamp: (new Date().getTime() / 1000) | 0,
|
|
213
217
|
recentAds: recentAds,
|
|
@@ -229,7 +233,6 @@ export const spec = {
|
|
|
229
233
|
|
|
230
234
|
interpretResponse: (serverResponse, request) => {
|
|
231
235
|
const responseBody = serverResponse ? serverResponse.body : {};
|
|
232
|
-
|
|
233
236
|
if (
|
|
234
237
|
!responseBody.creatives ||
|
|
235
238
|
responseBody.creatives.length === 0 ||
|
|
@@ -241,18 +244,12 @@ export const spec = {
|
|
|
241
244
|
const publisherURL = JSON.stringify(request.bidRequest.params.platformURL);
|
|
242
245
|
const bidderURL = request.bidRequest.params.bidderURL || 'https://bidder.adhash.com';
|
|
243
246
|
const oneTimeId = request.bidRequest.adUnitCode + Math.random().toFixed(16).replace('0.', '.');
|
|
244
|
-
const globalScript = !request.bidRequest.params.globalScript
|
|
245
|
-
? `<script src="${bidderURL}/static/scripts/creative.min.js"></script>`
|
|
246
|
-
: '';
|
|
247
247
|
const bidderResponse = JSON.stringify({ responseText: JSON.stringify(responseBody) });
|
|
248
248
|
const requestData = JSON.stringify(request.data);
|
|
249
249
|
|
|
250
|
-
|
|
250
|
+
var response = {
|
|
251
251
|
requestId: request.bidRequest.bidId,
|
|
252
252
|
cpm: responseBody.creatives[0].costEUR,
|
|
253
|
-
ad:
|
|
254
|
-
`<div id="${oneTimeId}"></div>${globalScript}
|
|
255
|
-
<script>callAdvertiser(${bidderResponse},['${oneTimeId}'],${requestData},${publisherURL})</script>`,
|
|
256
253
|
width: request.bidRequest.sizes[0][0],
|
|
257
254
|
height: request.bidRequest.sizes[0][1],
|
|
258
255
|
creativeId: request.bidRequest.adUnitCode,
|
|
@@ -262,7 +259,21 @@ export const spec = {
|
|
|
262
259
|
meta: {
|
|
263
260
|
advertiserDomains: responseBody.advertiserDomains ? [responseBody.advertiserDomains] : []
|
|
264
261
|
}
|
|
265
|
-
}
|
|
262
|
+
};
|
|
263
|
+
if (typeof request == 'object' && typeof request.bidRequest == 'object' && typeof request.bidRequest.mediaTypes == 'object' && includes(Object.keys(request.bidRequest.mediaTypes), BANNER)) {
|
|
264
|
+
response = Object.assign({
|
|
265
|
+
ad:
|
|
266
|
+
`<div id="${oneTimeId}"></div>
|
|
267
|
+
<script src="${bidderURL}/static/scripts/creative.min.js"></script>
|
|
268
|
+
<script>callAdvertiser(${bidderResponse},['${oneTimeId}'],${requestData},${publisherURL})</script>`
|
|
269
|
+
}, response);
|
|
270
|
+
} else if (includes(Object.keys(request.bidRequest.mediaTypes), VIDEO)) {
|
|
271
|
+
response = Object.assign({
|
|
272
|
+
vastUrl: responseBody.creatives[0].vastURL,
|
|
273
|
+
mediaType: VIDEO
|
|
274
|
+
}, response);
|
|
275
|
+
}
|
|
276
|
+
return [response];
|
|
266
277
|
}
|
|
267
278
|
};
|
|
268
279
|
|
|
@@ -99,43 +99,51 @@ export const spec = {
|
|
|
99
99
|
const len = validBidRequests.length;
|
|
100
100
|
|
|
101
101
|
for (let i = 0; i < len; i++) {
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
const bid = validBidRequests[i];
|
|
103
|
+
const { params, bidId, mediaTypes } = bid;
|
|
104
|
+
|
|
104
105
|
const placement = {
|
|
105
|
-
placementId:
|
|
106
|
-
bidId
|
|
107
|
-
sizes: bid.mediaTypes && bid.mediaTypes[traff] && bid.mediaTypes[traff].sizes ? bid.mediaTypes[traff].sizes : [],
|
|
108
|
-
traffic: traff,
|
|
106
|
+
placementId: params.placementId,
|
|
107
|
+
bidId,
|
|
109
108
|
eids: [],
|
|
110
109
|
bidFloor: getBidFloor(bid)
|
|
111
110
|
}
|
|
111
|
+
|
|
112
112
|
if (bid.schain) {
|
|
113
113
|
placement.schain = bid.schain;
|
|
114
114
|
}
|
|
115
|
+
|
|
115
116
|
if (bid.userId) {
|
|
116
117
|
getUserId(placement.eids, bid.userId.uid2 && bid.userId.uid2.id, 'uidapi.com');
|
|
117
118
|
getUserId(placement.eids, bid.userId.lotamePanoramaId, 'lotame.com');
|
|
118
119
|
getUserId(placement.eids, bid.userId.idx, 'idx.lat');
|
|
119
120
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
placement.
|
|
123
|
-
placement.
|
|
124
|
-
|
|
125
|
-
placement.
|
|
126
|
-
placement.
|
|
127
|
-
placement.
|
|
128
|
-
placement.
|
|
129
|
-
placement.
|
|
130
|
-
placement.
|
|
131
|
-
placement.
|
|
132
|
-
placement.
|
|
133
|
-
placement.
|
|
134
|
-
placement.
|
|
135
|
-
placement.
|
|
121
|
+
|
|
122
|
+
if (mediaTypes?.[BANNER]) {
|
|
123
|
+
placement.traffic = BANNER;
|
|
124
|
+
placement.sizes = mediaTypes[BANNER].sizes;
|
|
125
|
+
} else if (mediaTypes?.[VIDEO]) {
|
|
126
|
+
placement.traffic = VIDEO;
|
|
127
|
+
placement.playerSize = mediaTypes[VIDEO].playerSize;
|
|
128
|
+
placement.minduration = mediaTypes[VIDEO].minduration;
|
|
129
|
+
placement.maxduration = mediaTypes[VIDEO].maxduration;
|
|
130
|
+
placement.mimes = mediaTypes[VIDEO].mimes;
|
|
131
|
+
placement.protocols = mediaTypes[VIDEO].protocols;
|
|
132
|
+
placement.startdelay = mediaTypes[VIDEO].startdelay;
|
|
133
|
+
placement.placement = mediaTypes[VIDEO].placement;
|
|
134
|
+
placement.skip = mediaTypes[VIDEO].skip;
|
|
135
|
+
placement.skipafter = mediaTypes[VIDEO].skipafter;
|
|
136
|
+
placement.minbitrate = mediaTypes[VIDEO].minbitrate;
|
|
137
|
+
placement.maxbitrate = mediaTypes[VIDEO].maxbitrate;
|
|
138
|
+
placement.delivery = mediaTypes[VIDEO].delivery;
|
|
139
|
+
placement.playbackmethod = mediaTypes[VIDEO].playbackmethod;
|
|
140
|
+
placement.api = mediaTypes[VIDEO].api;
|
|
141
|
+
placement.linearity = mediaTypes[VIDEO].linearity;
|
|
136
142
|
}
|
|
143
|
+
|
|
137
144
|
placements.push(placement);
|
|
138
145
|
}
|
|
146
|
+
|
|
139
147
|
return {
|
|
140
148
|
method: 'POST',
|
|
141
149
|
url: AD_URL,
|
|
@@ -5,11 +5,17 @@ import { config } from '../src/config.js';
|
|
|
5
5
|
import { getStorageManager } from '../src/storageManager.js';
|
|
6
6
|
|
|
7
7
|
const BIDDER_CODE = 'adnuntius';
|
|
8
|
+
const BIDDER_CODE_DEAL_ALIAS_BASE = 'adndeal';
|
|
9
|
+
const BIDDER_CODE_DEAL_ALIAS_1 = BIDDER_CODE_DEAL_ALIAS_BASE + '1';
|
|
10
|
+
const BIDDER_CODE_DEAL_ALIAS_2 = BIDDER_CODE_DEAL_ALIAS_BASE + '2';
|
|
11
|
+
const BIDDER_CODE_DEAL_ALIAS_3 = BIDDER_CODE_DEAL_ALIAS_BASE + '3';
|
|
12
|
+
const BIDDER_CODE_DEAL_ALIAS_4 = BIDDER_CODE_DEAL_ALIAS_BASE + '4';
|
|
13
|
+
const BIDDER_CODE_DEAL_ALIAS_5 = BIDDER_CODE_DEAL_ALIAS_BASE + '5';
|
|
8
14
|
const ENDPOINT_URL = 'https://ads.adnuntius.delivery/i';
|
|
9
15
|
const ENDPOINT_URL_EUROPE = 'https://europe.delivery.adnuntius.com/i';
|
|
10
16
|
const GVLID = 855;
|
|
11
17
|
const DEFAULT_VAST_VERSION = 'vast4'
|
|
12
|
-
|
|
18
|
+
const MAXIMUM_DEALS_LIMIT = 5;
|
|
13
19
|
|
|
14
20
|
const checkSegment = function (segment) {
|
|
15
21
|
if (isStr(segment)) return segment;
|
|
@@ -29,40 +35,13 @@ const getSegmentsFromOrtb = function (ortb2) {
|
|
|
29
35
|
return segments
|
|
30
36
|
}
|
|
31
37
|
|
|
32
|
-
// function createNative(ad) {
|
|
33
|
-
// const native = {};
|
|
34
|
-
// const assets = ad.assets
|
|
35
|
-
// native.title = ad.text.title.content;
|
|
36
|
-
// native.image = {
|
|
37
|
-
// url: assets.image.cdnId,
|
|
38
|
-
// height: assets.image.height,
|
|
39
|
-
// width: assets.image.width,
|
|
40
|
-
// };
|
|
41
|
-
// if (assets.icon) {
|
|
42
|
-
// native.icon = {
|
|
43
|
-
// url: assets.icon.cdnId,
|
|
44
|
-
// height: assets.icon.height,
|
|
45
|
-
// width: assets.icon.width,
|
|
46
|
-
// };
|
|
47
|
-
// }
|
|
48
|
-
|
|
49
|
-
// native.sponsoredBy = ad.text.sponsoredBy?.content || '';
|
|
50
|
-
// native.body = ad.text.body?.content || '';
|
|
51
|
-
// native.cta = ad.text.cta?.content || '';
|
|
52
|
-
// native.clickUrl = ad.destinationUrls.destination || '';
|
|
53
|
-
// native.impressionTrackers = ad.impressionTrackingUrls || [ad.renderedPixel];
|
|
54
|
-
|
|
55
|
-
// return native;
|
|
56
|
-
// }
|
|
57
|
-
|
|
58
38
|
const handleMeta = function () {
|
|
59
39
|
const storage = getStorageManager({ bidderCode: BIDDER_CODE })
|
|
60
40
|
let adnMeta = null
|
|
61
41
|
if (storage.localStorageIsEnabled()) {
|
|
62
42
|
adnMeta = JSON.parse(storage.getDataFromLocalStorage('adn.metaData'))
|
|
63
43
|
}
|
|
64
|
-
|
|
65
|
-
return meta
|
|
44
|
+
return (adnMeta !== null) ? adnMeta.reduce((acc, cur) => { return { ...acc, [cur.key]: cur.value } }, {}) : {}
|
|
66
45
|
}
|
|
67
46
|
|
|
68
47
|
const getUsi = function (meta, ortb2, bidderRequest) {
|
|
@@ -71,12 +50,23 @@ const getUsi = function (meta, ortb2, bidderRequest) {
|
|
|
71
50
|
return usi
|
|
72
51
|
}
|
|
73
52
|
|
|
53
|
+
const AU_ID_REGEX = new RegExp('^[0-9A-Fa-f]{1,20}$');
|
|
54
|
+
|
|
74
55
|
export const spec = {
|
|
75
56
|
code: BIDDER_CODE,
|
|
57
|
+
aliases: [
|
|
58
|
+
BIDDER_CODE_DEAL_ALIAS_1,
|
|
59
|
+
BIDDER_CODE_DEAL_ALIAS_2,
|
|
60
|
+
BIDDER_CODE_DEAL_ALIAS_3,
|
|
61
|
+
BIDDER_CODE_DEAL_ALIAS_4,
|
|
62
|
+
BIDDER_CODE_DEAL_ALIAS_5
|
|
63
|
+
],
|
|
76
64
|
gvlid: GVLID,
|
|
77
65
|
supportedMediaTypes: [BANNER, VIDEO],
|
|
78
66
|
isBidRequestValid: function (bid) {
|
|
79
|
-
|
|
67
|
+
// The auId MUST be a hexadecimal string
|
|
68
|
+
const validAuId = AU_ID_REGEX.test(bid.params.auId);
|
|
69
|
+
return !!(validAuId && (bid.bidId || (bid.params.member && bid.params.invCode)));
|
|
80
70
|
},
|
|
81
71
|
|
|
82
72
|
buildRequests: function (validBidRequests, bidderRequest) {
|
|
@@ -100,20 +90,18 @@ export const spec = {
|
|
|
100
90
|
if (gdprApplies !== undefined) request.push('consentString=' + consentString);
|
|
101
91
|
if (segments.length > 0) request.push('segments=' + segments.join(','));
|
|
102
92
|
if (usi) request.push('userId=' + usi);
|
|
103
|
-
if (bidderConfig.useCookie === false) request.push('noCookies=true')
|
|
104
|
-
|
|
93
|
+
if (bidderConfig.useCookie === false) request.push('noCookies=true');
|
|
94
|
+
if (bidderConfig.maxDeals > 0) request.push('ds=' + Math.min(bidderConfig.maxDeals, MAXIMUM_DEALS_LIMIT));
|
|
95
|
+
for (let i = 0; i < validBidRequests.length; i++) {
|
|
105
96
|
const bid = validBidRequests[i]
|
|
106
97
|
let network = bid.params.network || 'network';
|
|
98
|
+
const maxDeals = Math.max(0, Math.min(bid.params.maxDeals || 0, MAXIMUM_DEALS_LIMIT));
|
|
107
99
|
const targeting = bid.params.targeting || {};
|
|
108
100
|
|
|
109
101
|
if (bid.mediaTypes && bid.mediaTypes.video && bid.mediaTypes.video.context !== 'outstream') {
|
|
110
102
|
network += '_video'
|
|
111
103
|
}
|
|
112
104
|
|
|
113
|
-
// if (bid.mediaTypes && bid.mediaTypes.native) {
|
|
114
|
-
// network += '_native'
|
|
115
|
-
// }
|
|
116
|
-
|
|
117
105
|
bidRequests[network] = bidRequests[network] || [];
|
|
118
106
|
bidRequests[network].push(bid);
|
|
119
107
|
|
|
@@ -121,18 +109,17 @@ export const spec = {
|
|
|
121
109
|
networks[network].adUnits = networks[network].adUnits || [];
|
|
122
110
|
if (bidderRequest && bidderRequest.refererInfo) networks[network].context = bidderRequest.refererInfo.page;
|
|
123
111
|
if (adnMeta) networks[network].metaData = adnMeta;
|
|
124
|
-
const adUnit = { ...targeting, auId: bid.params.auId, targetId: bid.bidId }
|
|
112
|
+
const adUnit = { ...targeting, auId: bid.params.auId, targetId: bid.bidId, maxDeals: maxDeals }
|
|
125
113
|
if (bid.mediaTypes && bid.mediaTypes.banner && bid.mediaTypes.banner.sizes) adUnit.dimensions = bid.mediaTypes.banner.sizes
|
|
126
114
|
networks[network].adUnits.push(adUnit);
|
|
127
115
|
}
|
|
128
116
|
|
|
129
117
|
const networkKeys = Object.keys(networks)
|
|
130
|
-
for (
|
|
118
|
+
for (let j = 0; j < networkKeys.length; j++) {
|
|
131
119
|
const network = networkKeys[j];
|
|
132
120
|
const networkRequest = [...request]
|
|
133
121
|
if (network.indexOf('_video') > -1) { networkRequest.push('tt=' + DEFAULT_VAST_VERSION) }
|
|
134
122
|
const requestURL = gdprApplies ? ENDPOINT_URL_EUROPE : ENDPOINT_URL
|
|
135
|
-
// if (network.indexOf('_native') > -1) { networkRequest.push('tt=' + DEFAULT_NATIVE) }
|
|
136
123
|
requests.push({
|
|
137
124
|
method: 'POST',
|
|
138
125
|
url: requestURL + '?' + networkRequest.join('&'),
|
|
@@ -146,50 +133,82 @@ export const spec = {
|
|
|
146
133
|
|
|
147
134
|
interpretResponse: function (serverResponse, bidRequest) {
|
|
148
135
|
const adUnits = serverResponse.body.adUnits;
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
136
|
+
|
|
137
|
+
function buildAdResponse(bidderCode, ad, adUnit, dealCount) {
|
|
138
|
+
const destinationUrls = ad.destinationUrls || {};
|
|
139
|
+
const advertiserDomains = [];
|
|
140
|
+
for (const value of Object.values(destinationUrls)) {
|
|
141
|
+
advertiserDomains.push(value.split('/')[2])
|
|
142
|
+
}
|
|
143
|
+
const adResponse = {
|
|
144
|
+
bidderCode: bidderCode,
|
|
145
|
+
requestId: adUnit.targetId,
|
|
146
|
+
cpm: (ad.bid) ? ad.bid.amount * 1000 : 0,
|
|
147
|
+
width: Number(ad.creativeWidth),
|
|
148
|
+
height: Number(ad.creativeHeight),
|
|
149
|
+
creativeId: ad.creativeId,
|
|
150
|
+
currency: (ad.bid) ? ad.bid.currency : 'EUR',
|
|
151
|
+
dealId: ad.dealId || '',
|
|
152
|
+
dealCount: dealCount,
|
|
153
|
+
meta: {
|
|
154
|
+
advertiserDomains: advertiserDomains
|
|
155
|
+
},
|
|
156
|
+
netRevenue: false,
|
|
157
|
+
ttl: 360,
|
|
158
|
+
};
|
|
159
|
+
// Deal bids provide the rendered ad content along with the
|
|
160
|
+
// bid; whereas regular bids have it stored on the ad-unit.
|
|
161
|
+
const isDeal = dealCount > 0;
|
|
162
|
+
const renderSource = isDeal ? ad : adUnit;
|
|
163
|
+
if (renderSource.vastXml) {
|
|
164
|
+
adResponse.vastXml = renderSource.vastXml
|
|
165
|
+
adResponse.mediaType = VIDEO
|
|
166
|
+
} else {
|
|
167
|
+
adResponse.ad = renderSource.html
|
|
168
|
+
}
|
|
169
|
+
return adResponse;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const bidsById = bidRequest.bid.reduce((response, bid) => {
|
|
173
|
+
return {
|
|
174
|
+
...response,
|
|
175
|
+
[bid.bidId]: bid
|
|
176
|
+
};
|
|
184
177
|
}, {});
|
|
185
178
|
|
|
186
|
-
const
|
|
187
|
-
|
|
188
|
-
|
|
179
|
+
const hasBidAdUnits = adUnits.filter((au) => {
|
|
180
|
+
const bid = bidsById[au.targetId];
|
|
181
|
+
if (bid && bid.bidder === BIDDER_CODE) {
|
|
182
|
+
return au.matchedAdCount > 0;
|
|
183
|
+
} else {
|
|
184
|
+
// We do NOT accept bids when using this adaptor via one of the
|
|
185
|
+
// "deals" aliases; those requests are for ONLY getting deals from Adnuntius
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
const hasDealsAdUnits = adUnits.filter((au) => {
|
|
190
|
+
return au.deals && au.deals.length > 0;
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
const dealAdResponses = hasDealsAdUnits.reduce((response, au) => {
|
|
194
|
+
const bid = bidsById[au.targetId];
|
|
195
|
+
if (bid) {
|
|
196
|
+
(au.deals || []).forEach((deal, i) => {
|
|
197
|
+
response.push(buildAdResponse(bid.bidder, deal, au, i + 1));
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
return response;
|
|
189
201
|
}, []);
|
|
190
202
|
|
|
191
|
-
|
|
192
|
-
|
|
203
|
+
const bidAdResponses = hasBidAdUnits.reduce((response, au) => {
|
|
204
|
+
const bid = bidsById[au.targetId];
|
|
205
|
+
if (bid) {
|
|
206
|
+
response.push(buildAdResponse(bid.bidder, au.ads[0], au, 0));
|
|
207
|
+
}
|
|
208
|
+
return response;
|
|
209
|
+
}, []);
|
|
193
210
|
|
|
211
|
+
return [...dealAdResponses, ...bidAdResponses];
|
|
212
|
+
}
|
|
194
213
|
}
|
|
195
214
|
registerBidder(spec);
|
|
@@ -9,7 +9,7 @@ Maintainer: info@adnuntius.com
|
|
|
9
9
|
# Description
|
|
10
10
|
|
|
11
11
|
Adnuntius Bidder Adapter for Prebid.js.
|
|
12
|
-
|
|
12
|
+
Banner and Video formats are supported.
|
|
13
13
|
|
|
14
14
|
# Test Parameters
|
|
15
15
|
```
|
|
@@ -27,6 +27,7 @@ Only Banner format is supported.
|
|
|
27
27
|
params: {
|
|
28
28
|
auId: "8b6bc",
|
|
29
29
|
network: "adnuntius",
|
|
30
|
+
maxDeals: 0
|
|
30
31
|
}
|
|
31
32
|
},
|
|
32
33
|
]
|
|
@@ -191,7 +191,13 @@ export const spec = {
|
|
|
191
191
|
};
|
|
192
192
|
function buildRequest(validBidRequests, bidderRequest) {
|
|
193
193
|
let bid = validBidRequests;
|
|
194
|
+
let pageUrl = '';
|
|
195
|
+
if (bidderRequest && bidderRequest.refererInfo) {
|
|
196
|
+
pageUrl = bidderRequest.refererInfo.page || '';
|
|
197
|
+
}
|
|
198
|
+
|
|
194
199
|
return {
|
|
200
|
+
v: '$prebid.version$',
|
|
195
201
|
placementCode: bid.params.placementId,
|
|
196
202
|
auctionId: bid.auctionId,
|
|
197
203
|
type: bid.params.type,
|
|
@@ -199,11 +205,11 @@ function buildRequest(validBidRequests, bidderRequest) {
|
|
|
199
205
|
bidQid: storage.getDataFromLocalStorage('qid') || null,
|
|
200
206
|
bidId: bid.bidId,
|
|
201
207
|
bidder: bid.bidder,
|
|
208
|
+
bidPageUrl: pageUrl,
|
|
202
209
|
bidderRequestId: bid.bidderRequestId,
|
|
203
210
|
bidRequestsCount: bid.bidRequestsCount,
|
|
204
211
|
bidderRequestsCount: bid.bidderRequestsCount,
|
|
205
212
|
sizes: parseSizesInput(bid.mediaTypes.banner.sizes).toString(),
|
|
206
|
-
|
|
207
213
|
};
|
|
208
214
|
}
|
|
209
215
|
|
|
@@ -35,6 +35,7 @@ export const spec = {
|
|
|
35
35
|
let bids = [];
|
|
36
36
|
for (let i = 0; i < validBidRequests.length; i++) {
|
|
37
37
|
let requestData = {
|
|
38
|
+
adUnitCode: validBidRequests[i].adUnitCode,
|
|
38
39
|
bidId: validBidRequests[i].bidId,
|
|
39
40
|
placementHash: validBidRequests[i].params.hash,
|
|
40
41
|
userId: validBidRequests[i].userId,
|
|
@@ -42,7 +42,7 @@ export const adriverIdSubmodule = {
|
|
|
42
42
|
if (!isPlainObject(config.params)) {
|
|
43
43
|
config.params = {};
|
|
44
44
|
}
|
|
45
|
-
const url = 'https://ad.adriver.ru/cgi-bin/json.cgi?sid=1&ad=719473&bt=55&pid=3198680&bid=7189165&bn=7189165&tuid=1';
|
|
45
|
+
const url = 'https://ad.adriver.ru/cgi-bin/json.cgi?sid=1&ad=719473&bt=55&pid=3198680&bid=7189165&bn=7189165&tuid=1&cfa=1';
|
|
46
46
|
const resp = function (callback) {
|
|
47
47
|
let creationDate = storage.getDataFromLocalStorage('adrcid_cd') || storage.getCookie('adrcid_cd');
|
|
48
48
|
let cookie = storage.getDataFromLocalStorage('adrcid') || storage.getCookie('adrcid');
|
|
@@ -24,7 +24,8 @@ const HOST_GETTERS = {
|
|
|
24
24
|
pgam: () => 'ghb.pgamssp.com',
|
|
25
25
|
ocm: () => 'ghb.cenarius.orangeclickmedia.com',
|
|
26
26
|
vidcrunchllc: () => 'ghb.platform.vidcrunch.com',
|
|
27
|
-
'9dotsmedia': () => 'ghb.platform.audiodots.com'
|
|
27
|
+
'9dotsmedia': () => 'ghb.platform.audiodots.com',
|
|
28
|
+
copper6: () => 'ghb.app.copper6.com'
|
|
28
29
|
}
|
|
29
30
|
const getUri = function (bidderCode) {
|
|
30
31
|
let bidderWithoutSuffix = bidderCode.split('_')[0];
|
|
@@ -51,7 +52,8 @@ export const spec = {
|
|
|
51
52
|
'pgam',
|
|
52
53
|
{ code: 'ocm', gvlid: 1148 },
|
|
53
54
|
{ code: 'vidcrunchllc', gvlid: 1145 },
|
|
54
|
-
'9dotsmedia'
|
|
55
|
+
'9dotsmedia',
|
|
56
|
+
'copper6',
|
|
55
57
|
],
|
|
56
58
|
supportedMediaTypes: [VIDEO, BANNER],
|
|
57
59
|
isBidRequestValid: function (bid) {
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import {config} from '../src/config.js';
|
|
2
|
+
import {registerActivityControl} from '../src/activities/rules.js';
|
|
3
|
+
|
|
4
|
+
const CFG_NAME = 'allowActivities';
|
|
5
|
+
const RULE_NAME = `${CFG_NAME} config`;
|
|
6
|
+
const DEFAULT_PRIORITY = 1;
|
|
7
|
+
|
|
8
|
+
export function updateRulesFromConfig(registerRule) {
|
|
9
|
+
const activeRuleHandles = new Map();
|
|
10
|
+
const defaultRuleHandles = new Map();
|
|
11
|
+
const rulesByActivity = new Map();
|
|
12
|
+
|
|
13
|
+
function clearAllRules() {
|
|
14
|
+
rulesByActivity.clear();
|
|
15
|
+
Array.from(activeRuleHandles.values())
|
|
16
|
+
.flatMap(ruleset => Array.from(ruleset.values()))
|
|
17
|
+
.forEach(fn => fn());
|
|
18
|
+
activeRuleHandles.clear();
|
|
19
|
+
Array.from(defaultRuleHandles.values()).forEach(fn => fn());
|
|
20
|
+
defaultRuleHandles.clear();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function cleanParams(params) {
|
|
24
|
+
// remove private parameters for publisher condition checks
|
|
25
|
+
return Object.fromEntries(Object.entries(params).filter(([k]) => !k.startsWith('_')))
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function setupRule(activity, priority) {
|
|
29
|
+
if (!activeRuleHandles.has(activity)) {
|
|
30
|
+
activeRuleHandles.set(activity, new Map())
|
|
31
|
+
}
|
|
32
|
+
const handles = activeRuleHandles.get(activity);
|
|
33
|
+
if (!handles.has(priority)) {
|
|
34
|
+
handles.set(priority, registerRule(activity, RULE_NAME, function (params) {
|
|
35
|
+
for (const rule of rulesByActivity.get(activity).get(priority)) {
|
|
36
|
+
if (!rule.condition || rule.condition(cleanParams(params))) {
|
|
37
|
+
return {allow: rule.allow, reason: rule}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}, priority));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function setupDefaultRule(activity) {
|
|
45
|
+
if (!defaultRuleHandles.has(activity)) {
|
|
46
|
+
defaultRuleHandles.set(activity, registerRule(activity, RULE_NAME, function () {
|
|
47
|
+
return {allow: false, reason: 'activity denied by default'}
|
|
48
|
+
}, Number.POSITIVE_INFINITY))
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
config.getConfig(CFG_NAME, (cfg) => {
|
|
53
|
+
clearAllRules();
|
|
54
|
+
Object.entries(cfg[CFG_NAME]).forEach(([activity, activityCfg]) => {
|
|
55
|
+
if (activityCfg.default === false) {
|
|
56
|
+
setupDefaultRule(activity);
|
|
57
|
+
}
|
|
58
|
+
const rules = new Map();
|
|
59
|
+
rulesByActivity.set(activity, rules);
|
|
60
|
+
|
|
61
|
+
(activityCfg.rules || []).forEach(rule => {
|
|
62
|
+
const priority = rule.priority == null ? DEFAULT_PRIORITY : rule.priority;
|
|
63
|
+
if (!rules.has(priority)) {
|
|
64
|
+
rules.set(priority, [])
|
|
65
|
+
}
|
|
66
|
+
rules.get(priority).push(rule);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
Array.from(rules.keys()).forEach(priority => setupRule(activity, priority));
|
|
70
|
+
});
|
|
71
|
+
})
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
updateRulesFromConfig(registerActivityControl);
|