-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
Copy pathdebugging.js
128 lines (118 loc) · 4.18 KB
/
debugging.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
import {deepClone, delayExecution} from '../../src/utils.js';
import {BidInterceptor} from './bidInterceptor.js';
import {makePbsInterceptor} from './pbsInterceptor.js';
import {addHooks, removeHooks} from './legacy.js';
const interceptorHooks = [];
let bidInterceptor;
let enabled = false;
function enableDebugging(debugConfig, {fromSession = false, config, hook, logger}) {
config.setConfig({debug: true});
bidInterceptor.updateConfig(debugConfig);
resetHooks(true);
// also enable "legacy" overrides
removeHooks({hook});
addHooks(debugConfig, {hook, logger});
if (!enabled) {
enabled = true;
logger.logMessage(`Debug overrides enabled${fromSession ? ' from session' : ''}`);
}
}
export function disableDebugging({hook, logger}) {
bidInterceptor.updateConfig(({}));
resetHooks(false);
// also disable "legacy" overrides
removeHooks({hook});
if (enabled) {
enabled = false;
logger.logMessage('Debug overrides disabled');
}
}
// eslint-disable-next-line prebid/no-global
function saveDebuggingConfig(debugConfig, {sessionStorage = window.sessionStorage, DEBUG_KEY} = {}) {
if (!debugConfig.enabled) {
try {
sessionStorage.removeItem(DEBUG_KEY);
} catch (e) {
}
} else {
if (debugConfig.intercept) {
debugConfig = deepClone(debugConfig);
debugConfig.intercept = bidInterceptor.serializeConfig(debugConfig.intercept);
}
try {
sessionStorage.setItem(DEBUG_KEY, JSON.stringify(debugConfig));
} catch (e) {
}
}
}
// eslint-disable-next-line prebid/no-global
export function getConfig(debugging, {getStorage = () => window.sessionStorage, DEBUG_KEY, config, hook, logger} = {}) {
if (debugging == null) return;
let sessionStorage;
try {
sessionStorage = getStorage();
} catch (e) {
logger.logError(`sessionStorage is not available: debugging configuration will not persist on page reload`, e);
}
if (sessionStorage != null) {
saveDebuggingConfig(debugging, {sessionStorage, DEBUG_KEY});
}
if (!debugging.enabled) {
disableDebugging({hook, logger});
} else {
enableDebugging(debugging, {config, hook, logger});
}
}
export function sessionLoader({DEBUG_KEY, storage, config, hook, logger}) {
let overrides;
try {
// eslint-disable-next-line prebid/no-global
storage = storage || window.sessionStorage;
overrides = JSON.parse(storage.getItem(DEBUG_KEY));
} catch (e) {
}
if (overrides) {
enableDebugging(overrides, {fromSession: true, config, hook, logger});
}
}
function resetHooks(enable) {
interceptorHooks.forEach(([getHookFn, interceptor]) => {
getHookFn().getHooks({hook: interceptor}).remove();
});
if (enable) {
interceptorHooks.forEach(([getHookFn, interceptor]) => {
getHookFn().before(interceptor);
});
}
}
function registerBidInterceptor(getHookFn, interceptor) {
const interceptBids = (...args) => bidInterceptor.intercept(...args);
interceptorHooks.push([getHookFn, function (next, ...args) {
interceptor(next, interceptBids, ...args);
}]);
}
export function bidderBidInterceptor(next, interceptBids, spec, bids, bidRequest, ajax, wrapCallback, cbs) {
const done = delayExecution(cbs.onCompletion, 2);
({bids, bidRequest} = interceptBids({
bids,
bidRequest,
addBid: wrapCallback(cbs.onBid),
addPaapiConfig: wrapCallback((config, bidRequest) => cbs.onPaapi({bidId: bidRequest.bidId, ...config})),
done
}));
if (bids.length === 0) {
// eslint-disable-next-line no-unused-expressions
cbs.onResponse?.({}); // trigger onResponse so that the bidder may be marked as "timely" if necessary
done();
} else {
next(spec, bids, bidRequest, ajax, wrapCallback, {...cbs, onCompletion: done});
}
}
export function install({DEBUG_KEY, config, hook, createBid, logger}) {
bidInterceptor = new BidInterceptor({logger});
const pbsBidInterceptor = makePbsInterceptor({createBid});
registerBidInterceptor(() => hook.get('processBidderRequests'), bidderBidInterceptor);
registerBidInterceptor(() => hook.get('processPBSRequest'), pbsBidInterceptor);
sessionLoader({DEBUG_KEY, config, hook, logger});
config.getConfig('debugging', ({debugging}) => getConfig(debugging, {DEBUG_KEY, config, hook, logger}), {init: true});
}