На данный момент я нашел только один способ ее решить. Я написал вспомогательный класс, который применяет monkey patch, чтобы предотвратить отправку вызова об использовании и отслеживание ошибок, пока это не разрешеноПатч Monkey обычно используется, когда вам нужно заблокировать загрузку внешних скриптов, например, iubenda, который мы уже используем.
Класс помощника:
class TrackJSUtil {
static URL_PATTERN = /usage\.trackjs\.com/;
/**
* Keep usage url
*
* @private
* @type {null|string}
*/
usageUrl = null;
/**
* Is requests allowed
*
* @private
* @type {boolean}
*/
isRequestsAllowed = false;
/**
* Apply monkey patch
*/
install() {
if (this.isRequestsAllowed) {
return;
}
const setUsageUrl = (value) => {
this.usageUrl = value;
};
const ignore = () => this.isRequestsAllowed || this.usageUrl != null;
const createElementOriginal = document.createElement.bind(document);
document.createElement = function createElementForTrackJS(...args) {
const element = createElementOriginal(...args);
if (ignore() || element.tagName.toUpperCase() !== 'IMG') {
return element;
}
Object.defineProperty(element, 'src', {
get() {
return this.getAttribute('src');
},
set(value) {
if (TrackJSUtil.URL_PATTERN.test(value)) {
setUsageUrl(value);
} else {
this.setAttribute('src', value);
}
},
});
return element;
};
}
/**
* Callback for onError in TrackJS
* @return {boolean}
*/
onTrackJSError() {
return this.isRequestsAllowed;
}
/**
* Call it when requests are allowed
*/
allow() {
if (this.isRequestsAllowed) {
return;
}
this.isRequestsAllowed = true;
if (this.usageUrl == null) {
return;
}
document.createElement('img').src = this.usageUrl;
}
}
Использование:
import { TrackJS } from 'trackjs';
const util = new TrackJSUtil();
if (IS_CONSENT_GIVEN) {
util.allow()
} else {
callItWhenConsentGiven(() => {
util.allow();
});
}
util.install();
TrackJS.install({
onError: () => util.onTrackJSError(),
});