Socket
Socket
Sign inDemoInstall

@datadog/browser-core

Package Overview
Dependencies
Maintainers
1
Versions
258
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@datadog/browser-core - npm Package Compare versions

Comparing version 5.23.0 to 5.23.3

2

cjs/boot/init.js

@@ -11,3 +11,3 @@ "use strict";

var publicApi = (0, polyfills_1.assign)({
version: "5.23.0",
version: "5.23.3",
// This API method is intentionally not monitored, since the only thing executed is the

@@ -14,0 +14,0 @@ // user-provided 'callback'. All SDK usages executed in the callback should be monitored, and

@@ -5,3 +5,3 @@ import type { CookieStore, CookieStoreEventMap, VisualViewport, VisualViewportEventMap } from './browser.types';

};
export declare enum DOM_EVENT {
export declare const enum DOM_EVENT {
BEFORE_UNLOAD = "beforeunload",

@@ -8,0 +8,0 @@ CLICK = "click",

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DOM_EVENT = void 0;
exports.addEventListener = addEventListener;

@@ -8,41 +7,2 @@ exports.addEventListeners = addEventListeners;

var getZoneJsOriginalValue_1 = require("../tools/getZoneJsOriginalValue");
// We want to use a real enum (i.e. not a const enum) here, to be able to iterate over it to automatically add _ddIsTrusted in e2e tests
// eslint-disable-next-line no-restricted-syntax
var DOM_EVENT;
(function (DOM_EVENT) {
DOM_EVENT["BEFORE_UNLOAD"] = "beforeunload";
DOM_EVENT["CLICK"] = "click";
DOM_EVENT["DBL_CLICK"] = "dblclick";
DOM_EVENT["KEY_DOWN"] = "keydown";
DOM_EVENT["LOAD"] = "load";
DOM_EVENT["POP_STATE"] = "popstate";
DOM_EVENT["SCROLL"] = "scroll";
DOM_EVENT["TOUCH_START"] = "touchstart";
DOM_EVENT["TOUCH_END"] = "touchend";
DOM_EVENT["TOUCH_MOVE"] = "touchmove";
DOM_EVENT["VISIBILITY_CHANGE"] = "visibilitychange";
DOM_EVENT["PAGE_SHOW"] = "pageshow";
DOM_EVENT["FREEZE"] = "freeze";
DOM_EVENT["RESUME"] = "resume";
DOM_EVENT["DOM_CONTENT_LOADED"] = "DOMContentLoaded";
DOM_EVENT["POINTER_DOWN"] = "pointerdown";
DOM_EVENT["POINTER_UP"] = "pointerup";
DOM_EVENT["POINTER_CANCEL"] = "pointercancel";
DOM_EVENT["HASH_CHANGE"] = "hashchange";
DOM_EVENT["PAGE_HIDE"] = "pagehide";
DOM_EVENT["MOUSE_DOWN"] = "mousedown";
DOM_EVENT["MOUSE_UP"] = "mouseup";
DOM_EVENT["MOUSE_MOVE"] = "mousemove";
DOM_EVENT["FOCUS"] = "focus";
DOM_EVENT["BLUR"] = "blur";
DOM_EVENT["CONTEXT_MENU"] = "contextmenu";
DOM_EVENT["RESIZE"] = "resize";
DOM_EVENT["CHANGE"] = "change";
DOM_EVENT["INPUT"] = "input";
DOM_EVENT["PLAY"] = "play";
DOM_EVENT["PAUSE"] = "pause";
DOM_EVENT["SECURITY_POLICY_VIOLATION"] = "securitypolicyviolation";
DOM_EVENT["SELECTION_CHANGE"] = "selectionchange";
DOM_EVENT["STORAGE"] = "storage";
})(DOM_EVENT || (exports.DOM_EVENT = DOM_EVENT = {}));
/**

@@ -49,0 +9,0 @@ * Add an event listener to an event target object (Window, Element, mock object...). This provides

@@ -8,2 +8,3 @@ "use strict";

var observable_1 = require("../tools/observable");
var polyfills_1 = require("../tools/utils/polyfills");
var timeUtils_1 = require("../tools/utils/timeUtils");

@@ -58,20 +59,24 @@ var urlPolyfill_1 = require("../tools/utils/urlPolyfill");

function afterSend(observable, responsePromise, startContext) {
var reportFetch = function (response) {
var context = startContext;
var context = startContext;
function reportFetch(partialContext) {
context.state = 'resolve';
if ('stack' in response || response instanceof Error) {
context.status = 0;
context.isAborted = response instanceof DOMException && response.code === DOMException.ABORT_ERR;
context.error = response;
}
else if ('status' in response) {
context.response = response;
context.responseType = response.type;
context.status = response.status;
context.isAborted = false;
}
(0, polyfills_1.assign)(context, partialContext);
observable.notify(context);
};
responsePromise.then((0, monitor_1.monitor)(reportFetch), (0, monitor_1.monitor)(reportFetch));
}
responsePromise.then((0, monitor_1.monitor)(function (response) {
reportFetch({
response: response,
responseType: response.type,
status: response.status,
isAborted: false,
});
}), (0, monitor_1.monitor)(function (error) {
var _a, _b;
reportFetch({
status: 0,
isAborted: ((_b = (_a = context.init) === null || _a === void 0 ? void 0 : _a.signal) === null || _b === void 0 ? void 0 : _b.aborted) || (error instanceof DOMException && error.code === DOMException.ABORT_ERR),
error: error,
});
}));
}
//# sourceMappingURL=fetchObservable.js.map

@@ -17,4 +17,4 @@ "use strict";

return new observable_1.Observable(function (observable) {
var stopListeners = (0, addEventListener_1.addEventListeners)(configuration, window, [addEventListener_1.DOM_EVENT.VISIBILITY_CHANGE, addEventListener_1.DOM_EVENT.FREEZE], function (event) {
if (event.type === addEventListener_1.DOM_EVENT.VISIBILITY_CHANGE && document.visibilityState === 'hidden') {
var stopListeners = (0, addEventListener_1.addEventListeners)(configuration, window, ["visibilitychange" /* DOM_EVENT.VISIBILITY_CHANGE */, "freeze" /* DOM_EVENT.FREEZE */], function (event) {
if (event.type === "visibilitychange" /* DOM_EVENT.VISIBILITY_CHANGE */ && document.visibilityState === 'hidden') {
/**

@@ -26,3 +26,3 @@ * Only event that guarantee to fire on mobile devices when the page transitions to background state

}
else if (event.type === addEventListener_1.DOM_EVENT.FREEZE) {
else if (event.type === "freeze" /* DOM_EVENT.FREEZE */) {
/**

@@ -35,3 +35,3 @@ * After transitioning in background a tab can be freezed to preserve resources. (cf: https://developer.chrome.com/blog/page-lifecycle-api)

}, { capture: true }).stop;
var stopBeforeUnloadListener = (0, addEventListener_1.addEventListener)(configuration, window, addEventListener_1.DOM_EVENT.BEFORE_UNLOAD, function () {
var stopBeforeUnloadListener = (0, addEventListener_1.addEventListener)(configuration, window, "beforeunload" /* DOM_EVENT.BEFORE_UNLOAD */, function () {
observable.notify({ reason: exports.PageExitReason.UNLOADING });

@@ -38,0 +38,0 @@ }).stop;

@@ -10,3 +10,3 @@ "use strict";

else {
var eventName = expectedReadyState === 'complete' ? addEventListener_1.DOM_EVENT.LOAD : addEventListener_1.DOM_EVENT.DOM_CONTENT_LOADED;
var eventName = expectedReadyState === 'complete' ? "load" /* DOM_EVENT.LOAD */ : "DOMContentLoaded" /* DOM_EVENT.DOM_CONTENT_LOADED */;
(0, addEventListener_1.addEventListener)(configuration, window, eventName, callback, { once: true });

@@ -13,0 +13,0 @@ }

@@ -162,2 +162,3 @@ import type { Duration } from '../../tools/utils/timeUtils';

}
export declare function isSampleRate(sampleRate: unknown, name: string): boolean;
export declare function validateAndBuildConfiguration(initConfiguration: InitConfiguration): Configuration | undefined;

@@ -164,0 +165,0 @@ export declare function serializeConfiguration(initConfiguration: InitConfiguration): {

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TraceContextInjection = exports.DefaultPrivacyLevel = void 0;
exports.isSampleRate = isSampleRate;
exports.validateAndBuildConfiguration = validateAndBuildConfiguration;

@@ -25,3 +26,3 @@ exports.serializeConfiguration = serializeConfiguration;

};
function checkIfString(tag, tagName) {
function isString(tag, tagName) {
if (tag !== undefined && tag !== null && typeof tag !== 'string') {

@@ -34,4 +35,15 @@ display_1.display.error("".concat(tagName, " must be defined as a string"));

function isDatadogSite(site) {
return /(datadog|ddog|datad0g|dd0g)/.test(site);
if (site && typeof site === 'string' && !/(datadog|ddog|datad0g|dd0g)/.test(site)) {
display_1.display.error("Site should be a valid Datadog site. ".concat(display_1.MORE_DETAILS, " ").concat(display_1.DOCS_ORIGIN, "/getting_started/site/."));
return false;
}
return true;
}
function isSampleRate(sampleRate, name) {
if (sampleRate !== undefined && !(0, numberUtils_1.isPercentage)(sampleRate)) {
display_1.display.error("".concat(name, " Sample Rate should be a number between 0 and 100"));
return false;
}
return true;
}
function validateAndBuildConfiguration(initConfiguration) {

@@ -43,29 +55,12 @@ var _a, _b, _c, _d, _e;

}
if (initConfiguration.sessionSampleRate !== undefined && !(0, numberUtils_1.isPercentage)(initConfiguration.sessionSampleRate)) {
display_1.display.error('Session Sample Rate should be a number between 0 and 100');
if (!isDatadogSite(initConfiguration.site) ||
!isSampleRate(initConfiguration.sessionSampleRate, 'Session') ||
!isSampleRate(initConfiguration.telemetrySampleRate, 'Telemetry') ||
!isSampleRate(initConfiguration.telemetryConfigurationSampleRate, 'Telemetry Configuration') ||
!isSampleRate(initConfiguration.telemetryUsageSampleRate, 'Telemetry Usage') ||
!isString(initConfiguration.version, 'Version') ||
!isString(initConfiguration.env, 'Env') ||
!isString(initConfiguration.service, 'Service')) {
return;
}
if (initConfiguration.telemetrySampleRate !== undefined && !(0, numberUtils_1.isPercentage)(initConfiguration.telemetrySampleRate)) {
display_1.display.error('Telemetry Sample Rate should be a number between 0 and 100');
return;
}
if (initConfiguration.telemetryConfigurationSampleRate !== undefined &&
!(0, numberUtils_1.isPercentage)(initConfiguration.telemetryConfigurationSampleRate)) {
display_1.display.error('Telemetry Configuration Sample Rate should be a number between 0 and 100');
return;
}
if (initConfiguration.telemetryUsageSampleRate !== undefined &&
!(0, numberUtils_1.isPercentage)(initConfiguration.telemetryUsageSampleRate)) {
display_1.display.error('Telemetry Usage Sample Rate should be a number between 0 and 100');
return;
}
if (!checkIfString(initConfiguration.version, 'Version')) {
return;
}
if (!checkIfString(initConfiguration.env, 'Env')) {
return;
}
if (!checkIfString(initConfiguration.service, 'Service')) {
return;
}
if (initConfiguration.trackingConsent !== undefined &&

@@ -76,6 +71,2 @@ !(0, objectUtils_1.objectHasValue)(trackingConsent_1.TrackingConsent, initConfiguration.trackingConsent)) {

}
if (initConfiguration.site && !isDatadogSite(initConfiguration.site)) {
display_1.display.error("Site should be a valid Datadog site. Learn more here: ".concat(display_1.DOCS_ORIGIN, "/getting_started/site/."));
return;
}
return (0, polyfills_1.assign)({

@@ -82,0 +73,0 @@ beforeSend: initConfiguration.beforeSend && (0, catchUserErrors_1.catchUserErrors)(initConfiguration.beforeSend, 'beforeSend threw an error:'),

@@ -59,3 +59,3 @@ "use strict";

var retry = _b.retry, encoding = _b.encoding;
var tags = ["sdk_version:".concat("5.23.0"), "api:".concat(api)].concat(configurationTags);
var tags = ["sdk_version:".concat("5.23.3"), "api:".concat(api)].concat(configurationTags);
if (retry) {

@@ -68,3 +68,3 @@ tags.push("retry_count:".concat(retry.count), "retry_after:".concat(retry.lastFailureStatus));

"dd-api-key=".concat(clientToken),
"dd-evp-origin-version=".concat(encodeURIComponent("5.23.0")),
"dd-evp-origin-version=".concat(encodeURIComponent("5.23.3")),
'dd-evp-origin=browser',

@@ -71,0 +71,0 @@ "dd-request-id=".concat((0, stringUtils_1.generateUUID)()),

@@ -1,4 +0,4 @@

export { Configuration, InitConfiguration, DefaultPrivacyLevel, TraceContextInjection, validateAndBuildConfiguration, serializeConfiguration, } from './configuration';
export { Configuration, InitConfiguration, DefaultPrivacyLevel, TraceContextInjection, isSampleRate, validateAndBuildConfiguration, serializeConfiguration, } from './configuration';
export { createEndpointBuilder, EndpointBuilder, TrackType } from './endpointBuilder';
export * from './intakeSites';
export { computeTransportConfiguration } from './transportConfiguration';

@@ -17,6 +17,7 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.computeTransportConfiguration = exports.createEndpointBuilder = exports.serializeConfiguration = exports.validateAndBuildConfiguration = exports.TraceContextInjection = exports.DefaultPrivacyLevel = void 0;
exports.computeTransportConfiguration = exports.createEndpointBuilder = exports.serializeConfiguration = exports.validateAndBuildConfiguration = exports.isSampleRate = exports.TraceContextInjection = exports.DefaultPrivacyLevel = void 0;
var configuration_1 = require("./configuration");
Object.defineProperty(exports, "DefaultPrivacyLevel", { enumerable: true, get: function () { return configuration_1.DefaultPrivacyLevel; } });
Object.defineProperty(exports, "TraceContextInjection", { enumerable: true, get: function () { return configuration_1.TraceContextInjection; } });
Object.defineProperty(exports, "isSampleRate", { enumerable: true, get: function () { return configuration_1.isSampleRate; } });
Object.defineProperty(exports, "validateAndBuildConfiguration", { enumerable: true, get: function () { return configuration_1.validateAndBuildConfiguration; } });

@@ -23,0 +24,0 @@ Object.defineProperty(exports, "serializeConfiguration", { enumerable: true, get: function () { return configuration_1.serializeConfiguration; } });

@@ -32,3 +32,3 @@ "use strict";

if (rawValue.length > valueSizeLimit || FORBIDDEN_CHARACTERS.test(rawValue)) {
display_1.display.warn("".concat(key, " value doesn't meet tag requirements and will be sanitized. More details: ").concat(display_1.DOCS_ORIGIN, "/getting_started/tagging/#defining-tags"));
display_1.display.warn("".concat(key, " value doesn't meet tag requirements and will be sanitized. ").concat(display_1.MORE_DETAILS, " ").concat(display_1.DOCS_ORIGIN, "/getting_started/tagging/#defining-tags"));
}

@@ -35,0 +35,0 @@ // Let the backend do most of the sanitization, but still make sure multiple tags can't be crafted

@@ -105,4 +105,4 @@ "use strict";

function displayCustomerDataLimitReachedWarning(bytesCountLimit) {
display_1.display.warn("Customer data exceeds the recommended ".concat(bytesCountLimit / byteUtils_1.ONE_KIBI_BYTE, "KiB threshold. More details: ").concat(display_1.DOCS_ORIGIN, "/real_user_monitoring/browser/troubleshooting/#customer-data-exceeds-the-recommended-threshold-warning"));
display_1.display.warn("Customer data exceeds the recommended ".concat(bytesCountLimit / byteUtils_1.ONE_KIBI_BYTE, "KiB threshold. ").concat(display_1.MORE_DETAILS, " ").concat(display_1.DOCS_TROUBLESHOOTING, "/#customer-data-exceeds-the-recommended-threshold-warning"));
}
//# sourceMappingURL=customerDataTracker.js.map

@@ -12,3 +12,3 @@ "use strict";

var storageKey = buildStorageKey(productKey, customerDataType);
storageListeners.push((0, addEventListener_1.addEventListener)(configuration, window, addEventListener_1.DOM_EVENT.STORAGE, function (_a) {
storageListeners.push((0, addEventListener_1.addEventListener)(configuration, window, "storage" /* DOM_EVENT.STORAGE */, function (_a) {
var key = _a.key;

@@ -15,0 +15,0 @@ if (storageKey === key) {

@@ -21,3 +21,3 @@ "use strict";

var causes = isErrorInstance ? flattenErrorCauses(originalError, source) : undefined;
var type = stackTrace === null || stackTrace === void 0 ? void 0 : stackTrace.name;
var type = stackTrace ? stackTrace.name : undefined;
var fingerprint = tryToGetFingerprint(originalError);

@@ -24,0 +24,0 @@ return {

@@ -49,3 +49,3 @@ "use strict";

return new observable_1.Observable(function (observable) {
var stop = (0, addEventListener_1.addEventListener)(configuration, document, addEventListener_1.DOM_EVENT.SECURITY_POLICY_VIOLATION, function (event) {
var stop = (0, addEventListener_1.addEventListener)(configuration, document, "securitypolicyviolation" /* DOM_EVENT.SECURITY_POLICY_VIOLATION */, function (event) {
observable.notify(buildRawReportFromCspViolation(event));

@@ -52,0 +52,0 @@ }).stop;

@@ -22,3 +22,5 @@ "use strict";

stopCallbacks.push(function () { return sessionStore.stop(); });
var sessionContextHistory = new valueHistory_1.ValueHistory(SESSION_CONTEXT_TIMEOUT_DELAY);
var sessionContextHistory = (0, valueHistory_1.createValueHistory)({
expireDelay: SESSION_CONTEXT_TIMEOUT_DELAY,
});
stopCallbacks.push(function () { return sessionContextHistory.stop(); });

@@ -73,3 +75,3 @@ sessionStore.renewObservable.subscribe(function () {

function trackActivity(configuration, expandOrRenewSession) {
var stop = (0, addEventListener_1.addEventListeners)(configuration, window, [addEventListener_1.DOM_EVENT.CLICK, addEventListener_1.DOM_EVENT.TOUCH_START, addEventListener_1.DOM_EVENT.KEY_DOWN, addEventListener_1.DOM_EVENT.SCROLL], expandOrRenewSession, { capture: true, passive: true }).stop;
var stop = (0, addEventListener_1.addEventListeners)(configuration, window, ["click" /* DOM_EVENT.CLICK */, "touchstart" /* DOM_EVENT.TOUCH_START */, "keydown" /* DOM_EVENT.KEY_DOWN */, "scroll" /* DOM_EVENT.SCROLL */], expandOrRenewSession, { capture: true, passive: true }).stop;
stopCallbacks.push(stop);

@@ -83,3 +85,3 @@ }

};
var stop = (0, addEventListener_1.addEventListener)(configuration, document, addEventListener_1.DOM_EVENT.VISIBILITY_CHANGE, expandSessionWhenVisible).stop;
var stop = (0, addEventListener_1.addEventListener)(configuration, document, "visibilitychange" /* DOM_EVENT.VISIBILITY_CHANGE */, expandSessionWhenVisible).stop;
stopCallbacks.push(stop);

@@ -92,5 +94,5 @@ var visibilityCheckInterval = (0, timer_1.setInterval)(expandSessionWhenVisible, exports.VISIBILITY_CHECK_DELAY);

function trackResume(configuration, cb) {
var stop = (0, addEventListener_1.addEventListener)(configuration, window, addEventListener_1.DOM_EVENT.RESUME, cb, { capture: true }).stop;
var stop = (0, addEventListener_1.addEventListener)(configuration, window, "resume" /* DOM_EVENT.RESUME */, cb, { capture: true }).stop;
stopCallbacks.push(stop);
}
//# sourceMappingURL=sessionManager.js.map

@@ -41,3 +41,3 @@ "use strict";

// eslint-disable-next-line local-rules/disallow-side-effects
var preStartTelemetryBuffer = new boundedBuffer_1.BoundedBuffer();
var preStartTelemetryBuffer = (0, boundedBuffer_1.createBoundedBuffer)();
var onRawTelemetryEventCollected = function (event) {

@@ -75,3 +75,3 @@ preStartTelemetryBuffer.add(function () { return onRawTelemetryEventCollected(event); });

service: telemetryService,
version: "5.23.0",
version: "5.23.3",
source: 'browser',

@@ -114,3 +114,3 @@ _dd: {

function resetTelemetry() {
preStartTelemetryBuffer = new boundedBuffer_1.BoundedBuffer();
preStartTelemetryBuffer = (0, boundedBuffer_1.createBoundedBuffer)();
onRawTelemetryEventCollected = function (event) {

@@ -117,0 +117,0 @@ preStartTelemetryBuffer.add(function () { return onRawTelemetryEventCollected(event); });

@@ -1,2 +0,2 @@

export { Configuration, InitConfiguration, validateAndBuildConfiguration, DefaultPrivacyLevel, TraceContextInjection, EndpointBuilder, serializeConfiguration, INTAKE_SITE_STAGING, INTAKE_SITE_US1, INTAKE_SITE_US1_FED, INTAKE_SITE_EU1, } from './domain/configuration';
export { Configuration, InitConfiguration, validateAndBuildConfiguration, DefaultPrivacyLevel, TraceContextInjection, EndpointBuilder, serializeConfiguration, isSampleRate, INTAKE_SITE_STAGING, INTAKE_SITE_US1, INTAKE_SITE_US1_FED, INTAKE_SITE_EU1, } from './domain/configuration';
export { TrackingConsent, TrackingConsentState, createTrackingConsentState } from './domain/trackingConsent';

@@ -40,3 +40,3 @@ export { isExperimentalFeatureEnabled, addExperimentalFeatures, resetExperimentalFeatures, getExperimentalFeatures, initFeatureFlags, ExperimentalFeature, } from './tools/experimentalFeatures';

export { initConsoleObservable, resetConsoleObservable, ConsoleLog } from './domain/console/consoleObservable';
export { BoundedBuffer } from './tools/boundedBuffer';
export { createBoundedBuffer, BoundedBuffer } from './tools/boundedBuffer';
export { catchUserErrors } from './tools/catchUserErrors';

@@ -47,3 +47,3 @@ export { createContextManager, ContextManager } from './domain/context/contextManager';

export { CustomerDataType } from './domain/context/contextConstants';
export { ValueHistory, ValueHistoryEntry, CLEAR_OLD_VALUES_INTERVAL } from './tools/valueHistory';
export { createValueHistory, ValueHistory, ValueHistoryEntry, CLEAR_OLD_VALUES_INTERVAL } from './tools/valueHistory';
export { readBytesFromStream } from './tools/readBytesFromStream';

@@ -50,0 +50,0 @@ export { STORAGE_POLL_DELAY } from './domain/session/sessionStore';

@@ -17,4 +17,4 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.runOnReadyState = exports.sendToExtension = exports.AbstractLifeCycle = exports.createIdentityEncoder = exports.createFlushController = exports.startBatchWithReplica = exports.bridgeSupports = exports.getEventBridge = exports.canUseEventBridge = exports.createHttpRequest = exports.SESSION_TIME_OUT_DELAY = exports.stopSessionManager = exports.startSessionManager = exports.Observable = exports.setDebugMode = exports.callMonitored = exports.monitor = exports.monitored = exports.drainPreStartTelemetry = exports.addTelemetryUsage = exports.addTelemetryConfiguration = exports.isTelemetryReplicationAllowed = exports.resetTelemetry = exports.startFakeTelemetry = exports.addTelemetryError = exports.addTelemetryDebug = exports.startTelemetry = exports.RawReportType = exports.initReportObservable = exports.displayAlreadyInitializedError = exports.makePublicApi = exports.defineGlobal = exports.computeStackTrace = exports.trackRuntimeError = exports.ExperimentalFeature = exports.initFeatureFlags = exports.getExperimentalFeatures = exports.resetExperimentalFeatures = exports.addExperimentalFeatures = exports.isExperimentalFeatureEnabled = exports.createTrackingConsentState = exports.TrackingConsent = exports.INTAKE_SITE_EU1 = exports.INTAKE_SITE_US1_FED = exports.INTAKE_SITE_US1 = exports.INTAKE_SITE_STAGING = exports.serializeConfiguration = exports.TraceContextInjection = exports.DefaultPrivacyLevel = exports.validateAndBuildConfiguration = void 0;
exports.ErrorSource = exports.sanitizeUser = exports.checkUser = exports.getSyntheticsResultId = exports.getSyntheticsTestId = exports.willSyntheticsInjectRum = exports.SESSION_STORE_KEY = exports.STORAGE_POLL_DELAY = exports.readBytesFromStream = exports.CLEAR_OLD_VALUES_INTERVAL = exports.ValueHistory = exports.CUSTOMER_DATA_BYTES_LIMIT = exports.createCustomerDataTracker = exports.createCustomerDataTrackerManager = exports.removeStorageListeners = exports.storeContextManager = exports.createContextManager = exports.catchUserErrors = exports.BoundedBuffer = exports.resetConsoleObservable = exports.initConsoleObservable = exports.isPageExitReason = exports.PageExitReason = exports.createPageExitObservable = exports.resetFetchObservable = exports.initFetchObservable = exports.initXhrObservable = exports.resetInitCookies = exports.deleteCookie = exports.setCookie = exports.getInitCookie = exports.getCookie = exports.areCookiesAuthorized = exports.NO_ERROR_STACK_PRESENT_MESSAGE = exports.getFileFromStackTraceString = exports.computeRawError = exports.instrumentSetter = exports.instrumentMethod = exports.getZoneJsOriginalValue = void 0;
exports.sendToExtension = exports.AbstractLifeCycle = exports.createIdentityEncoder = exports.createFlushController = exports.startBatchWithReplica = exports.bridgeSupports = exports.getEventBridge = exports.canUseEventBridge = exports.createHttpRequest = exports.SESSION_TIME_OUT_DELAY = exports.stopSessionManager = exports.startSessionManager = exports.Observable = exports.setDebugMode = exports.callMonitored = exports.monitor = exports.monitored = exports.drainPreStartTelemetry = exports.addTelemetryUsage = exports.addTelemetryConfiguration = exports.isTelemetryReplicationAllowed = exports.resetTelemetry = exports.startFakeTelemetry = exports.addTelemetryError = exports.addTelemetryDebug = exports.startTelemetry = exports.RawReportType = exports.initReportObservable = exports.displayAlreadyInitializedError = exports.makePublicApi = exports.defineGlobal = exports.computeStackTrace = exports.trackRuntimeError = exports.ExperimentalFeature = exports.initFeatureFlags = exports.getExperimentalFeatures = exports.resetExperimentalFeatures = exports.addExperimentalFeatures = exports.isExperimentalFeatureEnabled = exports.createTrackingConsentState = exports.TrackingConsent = exports.INTAKE_SITE_EU1 = exports.INTAKE_SITE_US1_FED = exports.INTAKE_SITE_US1 = exports.INTAKE_SITE_STAGING = exports.isSampleRate = exports.serializeConfiguration = exports.TraceContextInjection = exports.DefaultPrivacyLevel = exports.validateAndBuildConfiguration = void 0;
exports.ErrorSource = exports.sanitizeUser = exports.checkUser = exports.getSyntheticsResultId = exports.getSyntheticsTestId = exports.willSyntheticsInjectRum = exports.SESSION_STORE_KEY = exports.STORAGE_POLL_DELAY = exports.readBytesFromStream = exports.CLEAR_OLD_VALUES_INTERVAL = exports.createValueHistory = exports.CUSTOMER_DATA_BYTES_LIMIT = exports.createCustomerDataTracker = exports.createCustomerDataTrackerManager = exports.removeStorageListeners = exports.storeContextManager = exports.createContextManager = exports.catchUserErrors = exports.createBoundedBuffer = exports.resetConsoleObservable = exports.initConsoleObservable = exports.isPageExitReason = exports.PageExitReason = exports.createPageExitObservable = exports.resetFetchObservable = exports.initFetchObservable = exports.initXhrObservable = exports.resetInitCookies = exports.deleteCookie = exports.setCookie = exports.getInitCookie = exports.getCookie = exports.areCookiesAuthorized = exports.NO_ERROR_STACK_PRESENT_MESSAGE = exports.getFileFromStackTraceString = exports.computeRawError = exports.instrumentSetter = exports.instrumentMethod = exports.getZoneJsOriginalValue = exports.runOnReadyState = void 0;
var configuration_1 = require("./domain/configuration");

@@ -25,2 +25,3 @@ Object.defineProperty(exports, "validateAndBuildConfiguration", { enumerable: true, get: function () { return configuration_1.validateAndBuildConfiguration; } });

Object.defineProperty(exports, "serializeConfiguration", { enumerable: true, get: function () { return configuration_1.serializeConfiguration; } });
Object.defineProperty(exports, "isSampleRate", { enumerable: true, get: function () { return configuration_1.isSampleRate; } });
Object.defineProperty(exports, "INTAKE_SITE_STAGING", { enumerable: true, get: function () { return configuration_1.INTAKE_SITE_STAGING; } });

@@ -129,3 +130,3 @@ Object.defineProperty(exports, "INTAKE_SITE_US1", { enumerable: true, get: function () { return configuration_1.INTAKE_SITE_US1; } });

var boundedBuffer_1 = require("./tools/boundedBuffer");
Object.defineProperty(exports, "BoundedBuffer", { enumerable: true, get: function () { return boundedBuffer_1.BoundedBuffer; } });
Object.defineProperty(exports, "createBoundedBuffer", { enumerable: true, get: function () { return boundedBuffer_1.createBoundedBuffer; } });
var catchUserErrors_1 = require("./tools/catchUserErrors");

@@ -143,3 +144,3 @@ Object.defineProperty(exports, "catchUserErrors", { enumerable: true, get: function () { return catchUserErrors_1.catchUserErrors; } });

var valueHistory_1 = require("./tools/valueHistory");
Object.defineProperty(exports, "ValueHistory", { enumerable: true, get: function () { return valueHistory_1.ValueHistory; } });
Object.defineProperty(exports, "createValueHistory", { enumerable: true, get: function () { return valueHistory_1.createValueHistory; } });
Object.defineProperty(exports, "CLEAR_OLD_VALUES_INTERVAL", { enumerable: true, get: function () { return valueHistory_1.CLEAR_OLD_VALUES_INTERVAL; } });

@@ -146,0 +147,0 @@ var readBytesFromStream_1 = require("./tools/readBytesFromStream");

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AbstractLifeCycle = void 0;
// eslint-disable-next-line no-restricted-syntax
var AbstractLifeCycle = /** @class */ (function () {

@@ -5,0 +6,0 @@ function AbstractLifeCycle() {

@@ -1,6 +0,6 @@

export declare class BoundedBuffer<T = void> {
private buffer;
add(callback: (arg: T) => void): void;
remove(callback: (arg: T) => void): void;
drain(arg: T): void;
export interface BoundedBuffer<T = void> {
add: (callback: (arg: T) => void) => void;
remove: (callback: (arg: T) => void) => void;
drain: (arg: T) => void;
}
export declare function createBoundedBuffer<T = void>(): BoundedBuffer<T>;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BoundedBuffer = void 0;
exports.createBoundedBuffer = createBoundedBuffer;
var arrayUtils_1 = require("./utils/arrayUtils");
var BUFFER_LIMIT = 500;
var BoundedBuffer = /** @class */ (function () {
function BoundedBuffer() {
this.buffer = [];
}
BoundedBuffer.prototype.add = function (callback) {
var length = this.buffer.push(callback);
function createBoundedBuffer() {
var buffer = [];
var add = function (callback) {
var length = buffer.push(callback);
if (length > BUFFER_LIMIT) {
this.buffer.splice(0, 1);
buffer.splice(0, 1);
}
};
BoundedBuffer.prototype.remove = function (callback) {
(0, arrayUtils_1.removeItem)(this.buffer, callback);
var remove = function (callback) {
(0, arrayUtils_1.removeItem)(buffer, callback);
};
BoundedBuffer.prototype.drain = function (arg) {
this.buffer.forEach(function (callback) { return callback(arg); });
this.buffer.length = 0;
var drain = function (arg) {
buffer.forEach(function (callback) { return callback(arg); });
buffer.length = 0;
};
return BoundedBuffer;
}());
exports.BoundedBuffer = BoundedBuffer;
return {
add: add,
remove: remove,
drain: drain,
};
}
//# sourceMappingURL=boundedBuffer.js.map

@@ -36,2 +36,4 @@ /**

export declare const DOCS_ORIGIN = "https://docs.datadoghq.com";
export declare const DOCS_TROUBLESHOOTING = "https://docs.datadoghq.com/real_user_monitoring/browser/troubleshooting";
export declare const MORE_DETAILS = "More details:";
export {};

@@ -11,3 +11,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.DOCS_ORIGIN = exports.display = exports.originalConsoleMethods = exports.globalConsole = exports.ConsoleApiName = void 0;
exports.MORE_DETAILS = exports.DOCS_TROUBLESHOOTING = exports.DOCS_ORIGIN = exports.display = exports.originalConsoleMethods = exports.globalConsole = exports.ConsoleApiName = void 0;
exports.ConsoleApiName = {

@@ -43,2 +43,4 @@ log: 'log',

exports.DOCS_ORIGIN = 'https://docs.datadoghq.com';
exports.DOCS_TROUBLESHOOTING = "".concat(exports.DOCS_ORIGIN, "/real_user_monitoring/browser/troubleshooting");
exports.MORE_DETAILS = 'More details:';
//# sourceMappingURL=display.js.map

@@ -15,4 +15,3 @@ /**

REMOTE_CONFIGURATION = "remote_configuration",
UPDATE_VIEW_NAME = "update_view_name",
PLUGINS = "plugins"
UPDATE_VIEW_NAME = "update_view_name"
}

@@ -19,0 +18,0 @@ export declare function initFeatureFlags(enableExperimentalFeatures?: string[] | undefined): void;

@@ -29,3 +29,2 @@ "use strict";

ExperimentalFeature["UPDATE_VIEW_NAME"] = "update_view_name";
ExperimentalFeature["PLUGINS"] = "plugins";
})(ExperimentalFeature || (exports.ExperimentalFeature = ExperimentalFeature = {}));

@@ -32,0 +31,0 @@ var enabledExperimentalFeatures = new Set();

@@ -5,2 +5,3 @@ "use strict";

exports.mergeObservables = mergeObservables;
// eslint-disable-next-line no-restricted-syntax
var Observable = /** @class */ (function () {

@@ -7,0 +8,0 @@ function Observable(onFirstSubscribe) {

@@ -16,3 +16,2 @@ "use strict";

function sanitize(source, maxCharacterCount) {
var _a;
if (maxCharacterCount === void 0) { maxCharacterCount = SANITIZE_DEFAULT_MAX_CHARACTER_COUNT; }

@@ -26,3 +25,4 @@ // Unbind any toJSON function we may have on [] or {} prototypes

var sanitizedData = sanitizeProcessor(source, JSON_PATH_ROOT_ELEMENT, undefined, containerQueue, visitedObjectsWithPath);
var accumulatedCharacterCount = ((_a = JSON.stringify(sanitizedData)) === null || _a === void 0 ? void 0 : _a.length) || 0;
var serializedSanitizedData = JSON.stringify(sanitizedData);
var accumulatedCharacterCount = serializedSanitizedData ? serializedSanitizedData.length : 0;
if (accumulatedCharacterCount > maxCharacterCount) {

@@ -29,0 +29,0 @@ warnOverCharacterLimit(maxCharacterCount, 'discarded', source);

@@ -11,45 +11,18 @@ import type { Duration, RelativeTime } from './utils/timeUtils';

/**
* Store and keep track of values spans. This whole class assumes that values are added in
* Store and keep track of values spans. This whole cache assumes that values are added in
* chronological order (i.e. all entries have an increasing start time).
*/
export declare class ValueHistory<Value> {
private expireDelay;
private maxEntries?;
private entries;
private clearOldValuesInterval;
constructor(expireDelay: number, maxEntries?: number | undefined);
/**
* Add a value to the history associated with a start time. Returns a reference to this newly
* added entry that can be removed or closed.
*/
add(value: Value, startTime: RelativeTime): ValueHistoryEntry<Value>;
/**
* Return the latest value that was active during `startTime`, or the currently active value
* if no `startTime` is provided. This method assumes that entries are not overlapping.
*
* If `option.returnInactive` is true, returns the value at `startTime` (active or not).
*/
find(startTime?: RelativeTime, options?: {
export interface ValueHistory<Value> {
add: (value: Value, startTime: RelativeTime) => ValueHistoryEntry<Value>;
find: (startTime?: RelativeTime, options?: {
returnInactive: boolean;
}): Value | undefined;
/**
* Helper function to close the currently active value, if any. This method assumes that entries
* are not overlapping.
*/
closeActive(endTime: RelativeTime): void;
/**
* Return all values with an active period overlapping with the duration,
* or all values that were active during `startTime` if no duration is provided,
* or all currently active values if no `startTime` is provided.
*/
findAll(startTime?: RelativeTime, duration?: Duration): Value[];
/**
* Remove all entries from this collection.
*/
reset(): void;
/**
* Stop internal garbage collection of past entries.
*/
stop(): void;
private clearOldValues;
}) => Value | undefined;
closeActive: (endTime: RelativeTime) => void;
findAll: (startTime?: RelativeTime, duration?: Duration) => Value[];
reset: () => void;
stop: () => void;
}
export declare function createValueHistory<Value>({ expireDelay, maxEntries, }: {
expireDelay: number;
maxEntries?: number;
}): ValueHistory<Value>;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ValueHistory = exports.CLEAR_OLD_VALUES_INTERVAL = void 0;
exports.CLEAR_OLD_VALUES_INTERVAL = void 0;
exports.createValueHistory = createValueHistory;
var timer_1 = require("./timer");

@@ -9,13 +10,11 @@ var arrayUtils_1 = require("./utils/arrayUtils");

exports.CLEAR_OLD_VALUES_INTERVAL = timeUtils_1.ONE_MINUTE;
/**
* Store and keep track of values spans. This whole class assumes that values are added in
* chronological order (i.e. all entries have an increasing start time).
*/
var ValueHistory = /** @class */ (function () {
function ValueHistory(expireDelay, maxEntries) {
var _this = this;
this.expireDelay = expireDelay;
this.maxEntries = maxEntries;
this.entries = [];
this.clearOldValuesInterval = (0, timer_1.setInterval)(function () { return _this.clearOldValues(); }, exports.CLEAR_OLD_VALUES_INTERVAL);
function createValueHistory(_a) {
var expireDelay = _a.expireDelay, maxEntries = _a.maxEntries;
var entries = [];
var clearOldValuesInterval = (0, timer_1.setInterval)(function () { return clearOldValues(); }, exports.CLEAR_OLD_VALUES_INTERVAL);
function clearOldValues() {
var oldTimeThreshold = (0, timeUtils_1.relativeNow)() - expireDelay;
while (entries.length > 0 && entries[entries.length - 1].endTime < oldTimeThreshold) {
entries.pop();
}
}

@@ -26,4 +25,3 @@ /**

*/
ValueHistory.prototype.add = function (value, startTime) {
var _this = this;
function add(value, startTime) {
var entry = {

@@ -34,3 +32,3 @@ value: value,

remove: function () {
(0, arrayUtils_1.removeItem)(_this.entries, entry);
(0, arrayUtils_1.removeItem)(entries, entry);
},

@@ -41,8 +39,8 @@ close: function (endTime) {

};
if (this.maxEntries && this.entries.length >= this.maxEntries) {
this.entries.pop();
if (maxEntries && entries.length >= maxEntries) {
entries.pop();
}
this.entries.unshift(entry);
entries.unshift(entry);
return entry;
};
}
/**

@@ -54,7 +52,7 @@ * Return the latest value that was active during `startTime`, or the currently active value

*/
ValueHistory.prototype.find = function (startTime, options) {
function find(startTime, options) {
if (startTime === void 0) { startTime = END_OF_TIMES; }
if (options === void 0) { options = { returnInactive: false }; }
for (var _i = 0, _a = this.entries; _i < _a.length; _i++) {
var entry = _a[_i];
for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {
var entry = entries_1[_i];
if (entry.startTime <= startTime) {

@@ -67,3 +65,3 @@ if (options.returnInactive || startTime <= entry.endTime) {

}
};
}
/**

@@ -73,8 +71,8 @@ * Helper function to close the currently active value, if any. This method assumes that entries

*/
ValueHistory.prototype.closeActive = function (endTime) {
var latestEntry = this.entries[0];
function closeActive(endTime) {
var latestEntry = entries[0];
if (latestEntry && latestEntry.endTime === END_OF_TIMES) {
latestEntry.close(endTime);
}
};
}
/**

@@ -85,31 +83,24 @@ * Return all values with an active period overlapping with the duration,

*/
ValueHistory.prototype.findAll = function (startTime, duration) {
function findAll(startTime, duration) {
if (startTime === void 0) { startTime = END_OF_TIMES; }
if (duration === void 0) { duration = 0; }
var endTime = (0, timeUtils_1.addDuration)(startTime, duration);
return this.entries
return entries
.filter(function (entry) { return entry.startTime <= endTime && startTime <= entry.endTime; })
.map(function (entry) { return entry.value; });
};
}
/**
* Remove all entries from this collection.
*/
ValueHistory.prototype.reset = function () {
this.entries = [];
};
function reset() {
entries = [];
}
/**
* Stop internal garbage collection of past entries.
*/
ValueHistory.prototype.stop = function () {
(0, timer_1.clearInterval)(this.clearOldValuesInterval);
};
ValueHistory.prototype.clearOldValues = function () {
var oldTimeThreshold = (0, timeUtils_1.relativeNow)() - this.expireDelay;
while (this.entries.length > 0 && this.entries[this.entries.length - 1].endTime < oldTimeThreshold) {
this.entries.pop();
}
};
return ValueHistory;
}());
exports.ValueHistory = ValueHistory;
function stop() {
(0, timer_1.clearInterval)(clearOldValuesInterval);
}
return { add: add, find: find, closeActive: closeActive, findAll: findAll, reset: reset, stop: stop };
}
//# sourceMappingURL=valueHistory.js.map

@@ -5,18 +5,13 @@ import type { Context } from '../tools/serialisation/context';

import type { FlushController } from './flushController';
export declare class Batch {
private encoder;
private request;
export interface Batch {
flushController: FlushController;
private messageBytesLimit;
private upsertBuffer;
private flushSubscription;
constructor(encoder: Encoder, request: HttpRequest, flushController: FlushController, messageBytesLimit: number);
add(message: Context): void;
upsert(message: Context, key: string): void;
stop(): void;
private flush;
private addOrUpdate;
private push;
private remove;
private hasMessageFor;
add: (message: Context) => void;
upsert: (message: Context, key: string) => void;
stop: () => void;
}
export declare function createBatch({ encoder, request, flushController, messageBytesLimit, }: {
encoder: Encoder;
request: HttpRequest;
flushController: FlushController;
messageBytesLimit: number;
}): Batch;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Batch = void 0;
exports.createBatch = createBatch;
var display_1 = require("../tools/display");

@@ -9,26 +9,44 @@ var polyfills_1 = require("../tools/utils/polyfills");

var byteUtils_1 = require("../tools/utils/byteUtils");
var Batch = /** @class */ (function () {
function Batch(encoder, request, flushController, messageBytesLimit) {
var _this = this;
this.encoder = encoder;
this.request = request;
this.flushController = flushController;
this.messageBytesLimit = messageBytesLimit;
this.upsertBuffer = {};
this.flushSubscription = this.flushController.flushObservable.subscribe(function (event) { return _this.flush(event); });
function createBatch(_a) {
var encoder = _a.encoder, request = _a.request, flushController = _a.flushController, messageBytesLimit = _a.messageBytesLimit;
var upsertBuffer = {};
var flushSubscription = flushController.flushObservable.subscribe(function (event) { return flush(event); });
function push(serializedMessage, estimatedMessageBytesCount, key) {
flushController.notifyBeforeAddMessage(estimatedMessageBytesCount);
if (key !== undefined) {
upsertBuffer[key] = serializedMessage;
flushController.notifyAfterAddMessage();
}
else {
encoder.write(encoder.isEmpty ? serializedMessage : "\n".concat(serializedMessage), function (realMessageBytesCount) {
flushController.notifyAfterAddMessage(realMessageBytesCount - estimatedMessageBytesCount);
});
}
}
Batch.prototype.add = function (message) {
this.addOrUpdate(message);
};
Batch.prototype.upsert = function (message, key) {
this.addOrUpdate(message, key);
};
Batch.prototype.stop = function () {
this.flushSubscription.unsubscribe();
};
Batch.prototype.flush = function (event) {
var upsertMessages = (0, polyfills_1.objectValues)(this.upsertBuffer).join('\n');
this.upsertBuffer = {};
function hasMessageFor(key) {
return key !== undefined && upsertBuffer[key] !== undefined;
}
function remove(key) {
var removedMessage = upsertBuffer[key];
delete upsertBuffer[key];
var messageBytesCount = encoder.estimateEncodedBytesCount(removedMessage);
flushController.notifyAfterRemoveMessage(messageBytesCount);
}
function addOrUpdate(message, key) {
var serializedMessage = (0, jsonStringify_1.jsonStringify)(message);
var estimatedMessageBytesCount = encoder.estimateEncodedBytesCount(serializedMessage);
if (estimatedMessageBytesCount >= messageBytesLimit) {
display_1.display.warn("Discarded a message whose size was bigger than the maximum allowed size ".concat(messageBytesLimit, "KB. ").concat(display_1.MORE_DETAILS, " ").concat(display_1.DOCS_TROUBLESHOOTING, "/#technical-limitations"));
return;
}
if (hasMessageFor(key)) {
remove(key);
}
push(serializedMessage, estimatedMessageBytesCount, key);
}
function flush(event) {
var upsertMessages = (0, polyfills_1.objectValues)(upsertBuffer).join('\n');
upsertBuffer = {};
var isPageExit = (0, pageExitObservable_1.isPageExitReason)(event.reason);
var send = isPageExit ? this.request.sendOnExit : this.request.send;
var send = isPageExit ? request.sendOnExit : request.send;
if (isPageExit &&

@@ -39,4 +57,4 @@ // Note: checking that the encoder is async is not strictly needed, but it's an optimization:

// it and always send a single request.
this.encoder.isAsync) {
var encoderResult = this.encoder.finishSync();
encoder.isAsync) {
var encoderResult = encoder.finishSync();
// Send encoded messages

@@ -57,46 +75,16 @@ if (encoderResult.outputBytesCount) {

if (upsertMessages) {
this.encoder.write(this.encoder.isEmpty ? upsertMessages : "\n".concat(upsertMessages));
encoder.write(encoder.isEmpty ? upsertMessages : "\n".concat(upsertMessages));
}
this.encoder.finish(function (encoderResult) {
encoder.finish(function (encoderResult) {
send(formatPayloadFromEncoder(encoderResult));
});
}
}
return {
flushController: flushController,
add: addOrUpdate,
upsert: addOrUpdate,
stop: flushSubscription.unsubscribe,
};
Batch.prototype.addOrUpdate = function (message, key) {
var serializedMessage = (0, jsonStringify_1.jsonStringify)(message);
var estimatedMessageBytesCount = this.encoder.estimateEncodedBytesCount(serializedMessage);
if (estimatedMessageBytesCount >= this.messageBytesLimit) {
display_1.display.warn("Discarded a message whose size was bigger than the maximum allowed size ".concat(this.messageBytesLimit, "KB. More details: ").concat(display_1.DOCS_ORIGIN, "/real_user_monitoring/browser/troubleshooting/#technical-limitations"));
return;
}
if (this.hasMessageFor(key)) {
this.remove(key);
}
this.push(serializedMessage, estimatedMessageBytesCount, key);
};
Batch.prototype.push = function (serializedMessage, estimatedMessageBytesCount, key) {
var _this = this;
this.flushController.notifyBeforeAddMessage(estimatedMessageBytesCount);
if (key !== undefined) {
this.upsertBuffer[key] = serializedMessage;
this.flushController.notifyAfterAddMessage();
}
else {
this.encoder.write(this.encoder.isEmpty ? serializedMessage : "\n".concat(serializedMessage), function (realMessageBytesCount) {
_this.flushController.notifyAfterAddMessage(realMessageBytesCount - estimatedMessageBytesCount);
});
}
};
Batch.prototype.remove = function (key) {
var removedMessage = this.upsertBuffer[key];
delete this.upsertBuffer[key];
var messageBytesCount = this.encoder.estimateEncodedBytesCount(removedMessage);
this.flushController.notifyAfterRemoveMessage(messageBytesCount);
};
Batch.prototype.hasMessageFor = function (key) {
return key !== undefined && this.upsertBuffer[key] !== undefined;
};
return Batch;
}());
exports.Batch = Batch;
}
function formatPayloadFromEncoder(encoderResult) {

@@ -103,0 +91,0 @@ var data;

@@ -7,2 +7,3 @@ import type { Configuration, EndpointBuilder } from '../domain/configuration';

import type { Encoder } from '../tools/encoder';
import { createBatch } from './batch';
export interface BatchConfiguration {

@@ -15,3 +16,3 @@ endpoint: EndpointBuilder;

}
export declare function startBatchWithReplica<T extends Context>(configuration: Configuration, primary: BatchConfiguration, replica: ReplicaBatchConfiguration<T> | undefined, reportError: (error: RawError) => void, pageExitObservable: Observable<PageExitEvent>, sessionExpireObservable: Observable<void>): {
export declare function startBatchWithReplica<T extends Context>(configuration: Configuration, primary: BatchConfiguration, replica: ReplicaBatchConfiguration<T> | undefined, reportError: (error: RawError) => void, pageExitObservable: Observable<PageExitEvent>, sessionExpireObservable: Observable<void>, batchFactoryImp?: typeof createBatch): {
flushObservable: Observable<import("./flushController").FlushEvent>;

@@ -18,0 +19,0 @@ add(message: T, replicated?: boolean): void;

@@ -7,14 +7,20 @@ "use strict";

var flushController_1 = require("./flushController");
function startBatchWithReplica(configuration, primary, replica, reportError, pageExitObservable, sessionExpireObservable) {
var primaryBatch = createBatch(configuration, primary);
var replicaBatch = replica && createBatch(configuration, replica);
function createBatch(configuration, _a) {
function startBatchWithReplica(configuration, primary, replica, reportError, pageExitObservable, sessionExpireObservable, batchFactoryImp) {
if (batchFactoryImp === void 0) { batchFactoryImp = batch_1.createBatch; }
var primaryBatch = createBatchFromConfig(configuration, primary);
var replicaBatch = replica && createBatchFromConfig(configuration, replica);
function createBatchFromConfig(configuration, _a) {
var endpoint = _a.endpoint, encoder = _a.encoder;
return new batch_1.Batch(encoder, (0, httpRequest_1.createHttpRequest)(configuration, endpoint, configuration.batchBytesLimit, reportError), (0, flushController_1.createFlushController)({
messagesLimit: configuration.batchMessagesLimit,
bytesLimit: configuration.batchBytesLimit,
durationLimit: configuration.flushTimeout,
pageExitObservable: pageExitObservable,
sessionExpireObservable: sessionExpireObservable,
}), configuration.messageBytesLimit);
return batchFactoryImp({
encoder: encoder,
request: (0, httpRequest_1.createHttpRequest)(configuration, endpoint, configuration.batchBytesLimit, reportError),
flushController: (0, flushController_1.createFlushController)({
messagesLimit: configuration.batchMessagesLimit,
bytesLimit: configuration.batchBytesLimit,
durationLimit: configuration.flushTimeout,
pageExitObservable: pageExitObservable,
sessionExpireObservable: sessionExpireObservable,
}),
messageBytesLimit: configuration.messageBytesLimit,
});
}

@@ -38,3 +44,5 @@ return {

primaryBatch.stop();
replicaBatch === null || replicaBatch === void 0 ? void 0 : replicaBatch.stop();
if (replicaBatch) {
replicaBatch.stop();
}
},

@@ -41,0 +49,0 @@ };

@@ -7,3 +7,3 @@ import { catchUserErrors } from '../tools/catchUserErrors';

var publicApi = assign({
version: "5.23.0",
version: "5.23.3",
// This API method is intentionally not monitored, since the only thing executed is the

@@ -10,0 +10,0 @@ // user-provided 'callback'. All SDK usages executed in the callback should be monitored, and

@@ -5,3 +5,3 @@ import type { CookieStore, CookieStoreEventMap, VisualViewport, VisualViewportEventMap } from './browser.types';

};
export declare enum DOM_EVENT {
export declare const enum DOM_EVENT {
BEFORE_UNLOAD = "beforeunload",

@@ -8,0 +8,0 @@ CLICK = "click",

import { monitor } from '../tools/monitor';
import { getZoneJsOriginalValue } from '../tools/getZoneJsOriginalValue';
// We want to use a real enum (i.e. not a const enum) here, to be able to iterate over it to automatically add _ddIsTrusted in e2e tests
// eslint-disable-next-line no-restricted-syntax
export var DOM_EVENT;
(function (DOM_EVENT) {
DOM_EVENT["BEFORE_UNLOAD"] = "beforeunload";
DOM_EVENT["CLICK"] = "click";
DOM_EVENT["DBL_CLICK"] = "dblclick";
DOM_EVENT["KEY_DOWN"] = "keydown";
DOM_EVENT["LOAD"] = "load";
DOM_EVENT["POP_STATE"] = "popstate";
DOM_EVENT["SCROLL"] = "scroll";
DOM_EVENT["TOUCH_START"] = "touchstart";
DOM_EVENT["TOUCH_END"] = "touchend";
DOM_EVENT["TOUCH_MOVE"] = "touchmove";
DOM_EVENT["VISIBILITY_CHANGE"] = "visibilitychange";
DOM_EVENT["PAGE_SHOW"] = "pageshow";
DOM_EVENT["FREEZE"] = "freeze";
DOM_EVENT["RESUME"] = "resume";
DOM_EVENT["DOM_CONTENT_LOADED"] = "DOMContentLoaded";
DOM_EVENT["POINTER_DOWN"] = "pointerdown";
DOM_EVENT["POINTER_UP"] = "pointerup";
DOM_EVENT["POINTER_CANCEL"] = "pointercancel";
DOM_EVENT["HASH_CHANGE"] = "hashchange";
DOM_EVENT["PAGE_HIDE"] = "pagehide";
DOM_EVENT["MOUSE_DOWN"] = "mousedown";
DOM_EVENT["MOUSE_UP"] = "mouseup";
DOM_EVENT["MOUSE_MOVE"] = "mousemove";
DOM_EVENT["FOCUS"] = "focus";
DOM_EVENT["BLUR"] = "blur";
DOM_EVENT["CONTEXT_MENU"] = "contextmenu";
DOM_EVENT["RESIZE"] = "resize";
DOM_EVENT["CHANGE"] = "change";
DOM_EVENT["INPUT"] = "input";
DOM_EVENT["PLAY"] = "play";
DOM_EVENT["PAUSE"] = "pause";
DOM_EVENT["SECURITY_POLICY_VIOLATION"] = "securitypolicyviolation";
DOM_EVENT["SELECTION_CHANGE"] = "selectionchange";
DOM_EVENT["STORAGE"] = "storage";
})(DOM_EVENT || (DOM_EVENT = {}));
/**

@@ -43,0 +4,0 @@ * Add an event listener to an event target object (Window, Element, mock object...). This provides

import { instrumentMethod } from '../tools/instrumentMethod';
import { monitor } from '../tools/monitor';
import { Observable } from '../tools/observable';
import { assign } from '../tools/utils/polyfills';
import { clocksNow } from '../tools/utils/timeUtils';

@@ -53,20 +54,24 @@ import { normalizeUrl } from '../tools/utils/urlPolyfill';

function afterSend(observable, responsePromise, startContext) {
var reportFetch = function (response) {
var context = startContext;
var context = startContext;
function reportFetch(partialContext) {
context.state = 'resolve';
if ('stack' in response || response instanceof Error) {
context.status = 0;
context.isAborted = response instanceof DOMException && response.code === DOMException.ABORT_ERR;
context.error = response;
}
else if ('status' in response) {
context.response = response;
context.responseType = response.type;
context.status = response.status;
context.isAborted = false;
}
assign(context, partialContext);
observable.notify(context);
};
responsePromise.then(monitor(reportFetch), monitor(reportFetch));
}
responsePromise.then(monitor(function (response) {
reportFetch({
response: response,
responseType: response.type,
status: response.status,
isAborted: false,
});
}), monitor(function (error) {
var _a, _b;
reportFetch({
status: 0,
isAborted: ((_b = (_a = context.init) === null || _a === void 0 ? void 0 : _a.signal) === null || _b === void 0 ? void 0 : _b.aborted) || (error instanceof DOMException && error.code === DOMException.ABORT_ERR),
error: error,
});
}));
}
//# sourceMappingURL=fetchObservable.js.map
import { Observable } from '../tools/observable';
import { objectValues, includes } from '../tools/utils/polyfills';
import { addEventListeners, addEventListener, DOM_EVENT } from './addEventListener';
import { addEventListeners, addEventListener } from './addEventListener';
export var PageExitReason = {

@@ -12,4 +12,4 @@ HIDDEN: 'visibility_hidden',

return new Observable(function (observable) {
var stopListeners = addEventListeners(configuration, window, [DOM_EVENT.VISIBILITY_CHANGE, DOM_EVENT.FREEZE], function (event) {
if (event.type === DOM_EVENT.VISIBILITY_CHANGE && document.visibilityState === 'hidden') {
var stopListeners = addEventListeners(configuration, window, ["visibilitychange" /* DOM_EVENT.VISIBILITY_CHANGE */, "freeze" /* DOM_EVENT.FREEZE */], function (event) {
if (event.type === "visibilitychange" /* DOM_EVENT.VISIBILITY_CHANGE */ && document.visibilityState === 'hidden') {
/**

@@ -21,3 +21,3 @@ * Only event that guarantee to fire on mobile devices when the page transitions to background state

}
else if (event.type === DOM_EVENT.FREEZE) {
else if (event.type === "freeze" /* DOM_EVENT.FREEZE */) {
/**

@@ -30,3 +30,3 @@ * After transitioning in background a tab can be freezed to preserve resources. (cf: https://developer.chrome.com/blog/page-lifecycle-api)

}, { capture: true }).stop;
var stopBeforeUnloadListener = addEventListener(configuration, window, DOM_EVENT.BEFORE_UNLOAD, function () {
var stopBeforeUnloadListener = addEventListener(configuration, window, "beforeunload" /* DOM_EVENT.BEFORE_UNLOAD */, function () {
observable.notify({ reason: PageExitReason.UNLOADING });

@@ -33,0 +33,0 @@ }).stop;

@@ -1,2 +0,2 @@

import { DOM_EVENT, addEventListener } from './addEventListener';
import { addEventListener } from './addEventListener';
export function runOnReadyState(configuration, expectedReadyState, callback) {

@@ -7,3 +7,3 @@ if (document.readyState === expectedReadyState || document.readyState === 'complete') {

else {
var eventName = expectedReadyState === 'complete' ? DOM_EVENT.LOAD : DOM_EVENT.DOM_CONTENT_LOADED;
var eventName = expectedReadyState === 'complete' ? "load" /* DOM_EVENT.LOAD */ : "DOMContentLoaded" /* DOM_EVENT.DOM_CONTENT_LOADED */;
addEventListener(configuration, window, eventName, callback, { once: true });

@@ -10,0 +10,0 @@ }

@@ -162,2 +162,3 @@ import type { Duration } from '../../tools/utils/timeUtils';

}
export declare function isSampleRate(sampleRate: unknown, name: string): boolean;
export declare function validateAndBuildConfiguration(initConfiguration: InitConfiguration): Configuration | undefined;

@@ -164,0 +165,0 @@ export declare function serializeConfiguration(initConfiguration: InitConfiguration): {

import { catchUserErrors } from '../../tools/catchUserErrors';
import { DOCS_ORIGIN, display } from '../../tools/display';
import { DOCS_ORIGIN, MORE_DETAILS, display } from '../../tools/display';
import { ONE_SECOND } from '../../tools/utils/timeUtils';

@@ -20,3 +20,3 @@ import { isPercentage } from '../../tools/utils/numberUtils';

};
function checkIfString(tag, tagName) {
function isString(tag, tagName) {
if (tag !== undefined && tag !== null && typeof tag !== 'string') {

@@ -29,4 +29,15 @@ display.error("".concat(tagName, " must be defined as a string"));

function isDatadogSite(site) {
return /(datadog|ddog|datad0g|dd0g)/.test(site);
if (site && typeof site === 'string' && !/(datadog|ddog|datad0g|dd0g)/.test(site)) {
display.error("Site should be a valid Datadog site. ".concat(MORE_DETAILS, " ").concat(DOCS_ORIGIN, "/getting_started/site/."));
return false;
}
return true;
}
export function isSampleRate(sampleRate, name) {
if (sampleRate !== undefined && !isPercentage(sampleRate)) {
display.error("".concat(name, " Sample Rate should be a number between 0 and 100"));
return false;
}
return true;
}
export function validateAndBuildConfiguration(initConfiguration) {

@@ -38,29 +49,12 @@ var _a, _b, _c, _d, _e;

}
if (initConfiguration.sessionSampleRate !== undefined && !isPercentage(initConfiguration.sessionSampleRate)) {
display.error('Session Sample Rate should be a number between 0 and 100');
if (!isDatadogSite(initConfiguration.site) ||
!isSampleRate(initConfiguration.sessionSampleRate, 'Session') ||
!isSampleRate(initConfiguration.telemetrySampleRate, 'Telemetry') ||
!isSampleRate(initConfiguration.telemetryConfigurationSampleRate, 'Telemetry Configuration') ||
!isSampleRate(initConfiguration.telemetryUsageSampleRate, 'Telemetry Usage') ||
!isString(initConfiguration.version, 'Version') ||
!isString(initConfiguration.env, 'Env') ||
!isString(initConfiguration.service, 'Service')) {
return;
}
if (initConfiguration.telemetrySampleRate !== undefined && !isPercentage(initConfiguration.telemetrySampleRate)) {
display.error('Telemetry Sample Rate should be a number between 0 and 100');
return;
}
if (initConfiguration.telemetryConfigurationSampleRate !== undefined &&
!isPercentage(initConfiguration.telemetryConfigurationSampleRate)) {
display.error('Telemetry Configuration Sample Rate should be a number between 0 and 100');
return;
}
if (initConfiguration.telemetryUsageSampleRate !== undefined &&
!isPercentage(initConfiguration.telemetryUsageSampleRate)) {
display.error('Telemetry Usage Sample Rate should be a number between 0 and 100');
return;
}
if (!checkIfString(initConfiguration.version, 'Version')) {
return;
}
if (!checkIfString(initConfiguration.env, 'Env')) {
return;
}
if (!checkIfString(initConfiguration.service, 'Service')) {
return;
}
if (initConfiguration.trackingConsent !== undefined &&

@@ -71,6 +65,2 @@ !objectHasValue(TrackingConsent, initConfiguration.trackingConsent)) {

}
if (initConfiguration.site && !isDatadogSite(initConfiguration.site)) {
display.error("Site should be a valid Datadog site. Learn more here: ".concat(DOCS_ORIGIN, "/getting_started/site/."));
return;
}
return assign({

@@ -77,0 +67,0 @@ beforeSend: initConfiguration.beforeSend && catchUserErrors(initConfiguration.beforeSend, 'beforeSend threw an error:'),

@@ -56,3 +56,3 @@ import { timeStampNow } from '../../tools/utils/timeUtils';

var retry = _b.retry, encoding = _b.encoding;
var tags = ["sdk_version:".concat("5.23.0"), "api:".concat(api)].concat(configurationTags);
var tags = ["sdk_version:".concat("5.23.3"), "api:".concat(api)].concat(configurationTags);
if (retry) {

@@ -65,3 +65,3 @@ tags.push("retry_count:".concat(retry.count), "retry_after:".concat(retry.lastFailureStatus));

"dd-api-key=".concat(clientToken),
"dd-evp-origin-version=".concat(encodeURIComponent("5.23.0")),
"dd-evp-origin-version=".concat(encodeURIComponent("5.23.3")),
'dd-evp-origin=browser',

@@ -68,0 +68,0 @@ "dd-request-id=".concat(generateUUID()),

@@ -1,4 +0,4 @@

export { Configuration, InitConfiguration, DefaultPrivacyLevel, TraceContextInjection, validateAndBuildConfiguration, serializeConfiguration, } from './configuration';
export { Configuration, InitConfiguration, DefaultPrivacyLevel, TraceContextInjection, isSampleRate, validateAndBuildConfiguration, serializeConfiguration, } from './configuration';
export { createEndpointBuilder, EndpointBuilder, TrackType } from './endpointBuilder';
export * from './intakeSites';
export { computeTransportConfiguration } from './transportConfiguration';

@@ -1,2 +0,2 @@

export { DefaultPrivacyLevel, TraceContextInjection, validateAndBuildConfiguration, serializeConfiguration, } from './configuration';
export { DefaultPrivacyLevel, TraceContextInjection, isSampleRate, validateAndBuildConfiguration, serializeConfiguration, } from './configuration';
export { createEndpointBuilder } from './endpointBuilder';

@@ -3,0 +3,0 @@ export * from './intakeSites';

@@ -1,2 +0,2 @@

import { DOCS_ORIGIN, display } from '../../tools/display';
import { DOCS_ORIGIN, MORE_DETAILS, display } from '../../tools/display';
export var TAG_SIZE_LIMIT = 200;

@@ -27,3 +27,3 @@ export function buildTags(configuration) {

if (rawValue.length > valueSizeLimit || FORBIDDEN_CHARACTERS.test(rawValue)) {
display.warn("".concat(key, " value doesn't meet tag requirements and will be sanitized. More details: ").concat(DOCS_ORIGIN, "/getting_started/tagging/#defining-tags"));
display.warn("".concat(key, " value doesn't meet tag requirements and will be sanitized. ").concat(MORE_DETAILS, " ").concat(DOCS_ORIGIN, "/getting_started/tagging/#defining-tags"));
}

@@ -30,0 +30,0 @@ // Let the backend do most of the sanitization, but still make sure multiple tags can't be crafted

import { ONE_KIBI_BYTE, computeBytesCount } from '../../tools/utils/byteUtils';
import { throttle } from '../../tools/utils/functionUtils';
import { jsonStringify } from '../../tools/serialisation/jsonStringify';
import { DOCS_ORIGIN, display } from '../../tools/display';
import { DOCS_TROUBLESHOOTING, MORE_DETAILS, display } from '../../tools/display';
import { isEmptyObject } from '../../tools/utils/objectUtils';

@@ -100,4 +100,4 @@ // RUM and logs batch bytes limit is 16KB

function displayCustomerDataLimitReachedWarning(bytesCountLimit) {
display.warn("Customer data exceeds the recommended ".concat(bytesCountLimit / ONE_KIBI_BYTE, "KiB threshold. More details: ").concat(DOCS_ORIGIN, "/real_user_monitoring/browser/troubleshooting/#customer-data-exceeds-the-recommended-threshold-warning"));
display.warn("Customer data exceeds the recommended ".concat(bytesCountLimit / ONE_KIBI_BYTE, "KiB threshold. ").concat(MORE_DETAILS, " ").concat(DOCS_TROUBLESHOOTING, "/#customer-data-exceeds-the-recommended-threshold-warning"));
}
//# sourceMappingURL=customerDataTracker.js.map

@@ -1,2 +0,2 @@

import { addEventListener, DOM_EVENT } from '../../browser/addEventListener';
import { addEventListener } from '../../browser/addEventListener';
import { combine } from '../../tools/mergeInto';

@@ -7,3 +7,3 @@ var CONTEXT_STORE_KEY_PREFIX = '_dd_c';

var storageKey = buildStorageKey(productKey, customerDataType);
storageListeners.push(addEventListener(configuration, window, DOM_EVENT.STORAGE, function (_a) {
storageListeners.push(addEventListener(configuration, window, "storage" /* DOM_EVENT.STORAGE */, function (_a) {
var key = _a.key;

@@ -10,0 +10,0 @@ if (storageKey === key) {

@@ -14,3 +14,3 @@ import { sanitize } from '../../tools/serialisation/sanitize';

var causes = isErrorInstance ? flattenErrorCauses(originalError, source) : undefined;
var type = stackTrace === null || stackTrace === void 0 ? void 0 : stackTrace.name;
var type = stackTrace ? stackTrace.name : undefined;
var fingerprint = tryToGetFingerprint(originalError);

@@ -17,0 +17,0 @@ return {

import { toStackTraceString } from '../../tools/stackTrace/handlingStack';
import { monitor } from '../../tools/monitor';
import { mergeObservables, Observable } from '../../tools/observable';
import { addEventListener, DOM_EVENT } from '../../browser/addEventListener';
import { addEventListener } from '../../browser/addEventListener';
import { includes } from '../../tools/utils/polyfills';

@@ -45,3 +45,3 @@ import { safeTruncate } from '../../tools/utils/stringUtils';

return new Observable(function (observable) {
var stop = addEventListener(configuration, document, DOM_EVENT.SECURITY_POLICY_VIOLATION, function (event) {
var stop = addEventListener(configuration, document, "securitypolicyviolation" /* DOM_EVENT.SECURITY_POLICY_VIOLATION */, function (event) {
observable.notify(buildRawReportFromCspViolation(event));

@@ -48,0 +48,0 @@ }).stop;

import { Observable } from '../../tools/observable';
import { ValueHistory } from '../../tools/valueHistory';
import { createValueHistory } from '../../tools/valueHistory';
import { relativeNow, clocksOrigin, ONE_MINUTE } from '../../tools/utils/timeUtils';
import { DOM_EVENT, addEventListener, addEventListeners } from '../../browser/addEventListener';
import { addEventListener, addEventListeners } from '../../browser/addEventListener';
import { clearInterval, setInterval } from '../../tools/timer';

@@ -17,3 +17,5 @@ import { SESSION_TIME_OUT_DELAY } from './sessionConstants';

stopCallbacks.push(function () { return sessionStore.stop(); });
var sessionContextHistory = new ValueHistory(SESSION_CONTEXT_TIMEOUT_DELAY);
var sessionContextHistory = createValueHistory({
expireDelay: SESSION_CONTEXT_TIMEOUT_DELAY,
});
stopCallbacks.push(function () { return sessionContextHistory.stop(); });

@@ -68,3 +70,3 @@ sessionStore.renewObservable.subscribe(function () {

function trackActivity(configuration, expandOrRenewSession) {
var stop = addEventListeners(configuration, window, [DOM_EVENT.CLICK, DOM_EVENT.TOUCH_START, DOM_EVENT.KEY_DOWN, DOM_EVENT.SCROLL], expandOrRenewSession, { capture: true, passive: true }).stop;
var stop = addEventListeners(configuration, window, ["click" /* DOM_EVENT.CLICK */, "touchstart" /* DOM_EVENT.TOUCH_START */, "keydown" /* DOM_EVENT.KEY_DOWN */, "scroll" /* DOM_EVENT.SCROLL */], expandOrRenewSession, { capture: true, passive: true }).stop;
stopCallbacks.push(stop);

@@ -78,3 +80,3 @@ }

};
var stop = addEventListener(configuration, document, DOM_EVENT.VISIBILITY_CHANGE, expandSessionWhenVisible).stop;
var stop = addEventListener(configuration, document, "visibilitychange" /* DOM_EVENT.VISIBILITY_CHANGE */, expandSessionWhenVisible).stop;
stopCallbacks.push(stop);

@@ -87,5 +89,5 @@ var visibilityCheckInterval = setInterval(expandSessionWhenVisible, VISIBILITY_CHECK_DELAY);

function trackResume(configuration, cb) {
var stop = addEventListener(configuration, window, DOM_EVENT.RESUME, cb, { capture: true }).stop;
var stop = addEventListener(configuration, window, "resume" /* DOM_EVENT.RESUME */, cb, { capture: true }).stop;
stopCallbacks.push(stop);
}
//# sourceMappingURL=sessionManager.js.map

@@ -16,3 +16,3 @@ import { ConsoleApiName } from '../../tools/display';

import { getConnectivity } from '../connectivity';
import { BoundedBuffer } from '../../tools/boundedBuffer';
import { createBoundedBuffer } from '../../tools/boundedBuffer';
import { TelemetryType } from './rawTelemetryEvent.types';

@@ -29,3 +29,3 @@ var ALLOWED_FRAME_URLS = [

// eslint-disable-next-line local-rules/disallow-side-effects
var preStartTelemetryBuffer = new BoundedBuffer();
var preStartTelemetryBuffer = createBoundedBuffer();
var onRawTelemetryEventCollected = function (event) {

@@ -63,3 +63,3 @@ preStartTelemetryBuffer.add(function () { return onRawTelemetryEventCollected(event); });

service: telemetryService,
version: "5.23.0",
version: "5.23.3",
source: 'browser',

@@ -102,3 +102,3 @@ _dd: {

export function resetTelemetry() {
preStartTelemetryBuffer = new BoundedBuffer();
preStartTelemetryBuffer = createBoundedBuffer();
onRawTelemetryEventCollected = function (event) {

@@ -105,0 +105,0 @@ preStartTelemetryBuffer.add(function () { return onRawTelemetryEventCollected(event); });

@@ -1,2 +0,2 @@

export { Configuration, InitConfiguration, validateAndBuildConfiguration, DefaultPrivacyLevel, TraceContextInjection, EndpointBuilder, serializeConfiguration, INTAKE_SITE_STAGING, INTAKE_SITE_US1, INTAKE_SITE_US1_FED, INTAKE_SITE_EU1, } from './domain/configuration';
export { Configuration, InitConfiguration, validateAndBuildConfiguration, DefaultPrivacyLevel, TraceContextInjection, EndpointBuilder, serializeConfiguration, isSampleRate, INTAKE_SITE_STAGING, INTAKE_SITE_US1, INTAKE_SITE_US1_FED, INTAKE_SITE_EU1, } from './domain/configuration';
export { TrackingConsent, TrackingConsentState, createTrackingConsentState } from './domain/trackingConsent';

@@ -40,3 +40,3 @@ export { isExperimentalFeatureEnabled, addExperimentalFeatures, resetExperimentalFeatures, getExperimentalFeatures, initFeatureFlags, ExperimentalFeature, } from './tools/experimentalFeatures';

export { initConsoleObservable, resetConsoleObservable, ConsoleLog } from './domain/console/consoleObservable';
export { BoundedBuffer } from './tools/boundedBuffer';
export { createBoundedBuffer, BoundedBuffer } from './tools/boundedBuffer';
export { catchUserErrors } from './tools/catchUserErrors';

@@ -47,3 +47,3 @@ export { createContextManager, ContextManager } from './domain/context/contextManager';

export { CustomerDataType } from './domain/context/contextConstants';
export { ValueHistory, ValueHistoryEntry, CLEAR_OLD_VALUES_INTERVAL } from './tools/valueHistory';
export { createValueHistory, ValueHistory, ValueHistoryEntry, CLEAR_OLD_VALUES_INTERVAL } from './tools/valueHistory';
export { readBytesFromStream } from './tools/readBytesFromStream';

@@ -50,0 +50,0 @@ export { STORAGE_POLL_DELAY } from './domain/session/sessionStore';

@@ -1,2 +0,2 @@

export { validateAndBuildConfiguration, DefaultPrivacyLevel, TraceContextInjection, serializeConfiguration, INTAKE_SITE_STAGING, INTAKE_SITE_US1, INTAKE_SITE_US1_FED, INTAKE_SITE_EU1, } from './domain/configuration';
export { validateAndBuildConfiguration, DefaultPrivacyLevel, TraceContextInjection, serializeConfiguration, isSampleRate, INTAKE_SITE_STAGING, INTAKE_SITE_US1, INTAKE_SITE_US1_FED, INTAKE_SITE_EU1, } from './domain/configuration';
export { TrackingConsent, createTrackingConsentState } from './domain/trackingConsent';

@@ -40,3 +40,3 @@ export { isExperimentalFeatureEnabled, addExperimentalFeatures, resetExperimentalFeatures, getExperimentalFeatures, initFeatureFlags, ExperimentalFeature, } from './tools/experimentalFeatures';

export { initConsoleObservable, resetConsoleObservable } from './domain/console/consoleObservable';
export { BoundedBuffer } from './tools/boundedBuffer';
export { createBoundedBuffer } from './tools/boundedBuffer';
export { catchUserErrors } from './tools/catchUserErrors';

@@ -46,3 +46,3 @@ export { createContextManager } from './domain/context/contextManager';

export { createCustomerDataTrackerManager, createCustomerDataTracker, CUSTOMER_DATA_BYTES_LIMIT, } from './domain/context/customerDataTracker';
export { ValueHistory, CLEAR_OLD_VALUES_INTERVAL } from './tools/valueHistory';
export { createValueHistory, CLEAR_OLD_VALUES_INTERVAL } from './tools/valueHistory';
export { readBytesFromStream } from './tools/readBytesFromStream';

@@ -49,0 +49,0 @@ export { STORAGE_POLL_DELAY } from './domain/session/sessionStore';

@@ -0,1 +1,2 @@

// eslint-disable-next-line no-restricted-syntax
var AbstractLifeCycle = /** @class */ (function () {

@@ -2,0 +3,0 @@ function AbstractLifeCycle() {

@@ -1,6 +0,6 @@

export declare class BoundedBuffer<T = void> {
private buffer;
add(callback: (arg: T) => void): void;
remove(callback: (arg: T) => void): void;
drain(arg: T): void;
export interface BoundedBuffer<T = void> {
add: (callback: (arg: T) => void) => void;
remove: (callback: (arg: T) => void) => void;
drain: (arg: T) => void;
}
export declare function createBoundedBuffer<T = void>(): BoundedBuffer<T>;
import { removeItem } from './utils/arrayUtils';
var BUFFER_LIMIT = 500;
var BoundedBuffer = /** @class */ (function () {
function BoundedBuffer() {
this.buffer = [];
}
BoundedBuffer.prototype.add = function (callback) {
var length = this.buffer.push(callback);
export function createBoundedBuffer() {
var buffer = [];
var add = function (callback) {
var length = buffer.push(callback);
if (length > BUFFER_LIMIT) {
this.buffer.splice(0, 1);
buffer.splice(0, 1);
}
};
BoundedBuffer.prototype.remove = function (callback) {
removeItem(this.buffer, callback);
var remove = function (callback) {
removeItem(buffer, callback);
};
BoundedBuffer.prototype.drain = function (arg) {
this.buffer.forEach(function (callback) { return callback(arg); });
this.buffer.length = 0;
var drain = function (arg) {
buffer.forEach(function (callback) { return callback(arg); });
buffer.length = 0;
};
return BoundedBuffer;
}());
export { BoundedBuffer };
return {
add: add,
remove: remove,
drain: drain,
};
}
//# sourceMappingURL=boundedBuffer.js.map

@@ -36,2 +36,4 @@ /**

export declare const DOCS_ORIGIN = "https://docs.datadoghq.com";
export declare const DOCS_TROUBLESHOOTING = "https://docs.datadoghq.com/real_user_monitoring/browser/troubleshooting";
export declare const MORE_DETAILS = "More details:";
export {};

@@ -39,2 +39,4 @@ /* eslint-disable local-rules/disallow-side-effects */

export var DOCS_ORIGIN = 'https://docs.datadoghq.com';
export var DOCS_TROUBLESHOOTING = "".concat(DOCS_ORIGIN, "/real_user_monitoring/browser/troubleshooting");
export var MORE_DETAILS = 'More details:';
//# sourceMappingURL=display.js.map

@@ -15,4 +15,3 @@ /**

REMOTE_CONFIGURATION = "remote_configuration",
UPDATE_VIEW_NAME = "update_view_name",
PLUGINS = "plugins"
UPDATE_VIEW_NAME = "update_view_name"
}

@@ -19,0 +18,0 @@ export declare function initFeatureFlags(enableExperimentalFeatures?: string[] | undefined): void;

@@ -21,3 +21,2 @@ /**

ExperimentalFeature["UPDATE_VIEW_NAME"] = "update_view_name";
ExperimentalFeature["PLUGINS"] = "plugins";
})(ExperimentalFeature || (ExperimentalFeature = {}));

@@ -24,0 +23,0 @@ var enabledExperimentalFeatures = new Set();

@@ -0,1 +1,2 @@

// eslint-disable-next-line no-restricted-syntax
var Observable = /** @class */ (function () {

@@ -2,0 +3,0 @@ function Observable(onFirstSubscribe) {

@@ -13,3 +13,2 @@ import { display } from '../display';

export function sanitize(source, maxCharacterCount) {
var _a;
if (maxCharacterCount === void 0) { maxCharacterCount = SANITIZE_DEFAULT_MAX_CHARACTER_COUNT; }

@@ -23,3 +22,4 @@ // Unbind any toJSON function we may have on [] or {} prototypes

var sanitizedData = sanitizeProcessor(source, JSON_PATH_ROOT_ELEMENT, undefined, containerQueue, visitedObjectsWithPath);
var accumulatedCharacterCount = ((_a = JSON.stringify(sanitizedData)) === null || _a === void 0 ? void 0 : _a.length) || 0;
var serializedSanitizedData = JSON.stringify(sanitizedData);
var accumulatedCharacterCount = serializedSanitizedData ? serializedSanitizedData.length : 0;
if (accumulatedCharacterCount > maxCharacterCount) {

@@ -26,0 +26,0 @@ warnOverCharacterLimit(maxCharacterCount, 'discarded', source);

@@ -11,45 +11,18 @@ import type { Duration, RelativeTime } from './utils/timeUtils';

/**
* Store and keep track of values spans. This whole class assumes that values are added in
* Store and keep track of values spans. This whole cache assumes that values are added in
* chronological order (i.e. all entries have an increasing start time).
*/
export declare class ValueHistory<Value> {
private expireDelay;
private maxEntries?;
private entries;
private clearOldValuesInterval;
constructor(expireDelay: number, maxEntries?: number | undefined);
/**
* Add a value to the history associated with a start time. Returns a reference to this newly
* added entry that can be removed or closed.
*/
add(value: Value, startTime: RelativeTime): ValueHistoryEntry<Value>;
/**
* Return the latest value that was active during `startTime`, or the currently active value
* if no `startTime` is provided. This method assumes that entries are not overlapping.
*
* If `option.returnInactive` is true, returns the value at `startTime` (active or not).
*/
find(startTime?: RelativeTime, options?: {
export interface ValueHistory<Value> {
add: (value: Value, startTime: RelativeTime) => ValueHistoryEntry<Value>;
find: (startTime?: RelativeTime, options?: {
returnInactive: boolean;
}): Value | undefined;
/**
* Helper function to close the currently active value, if any. This method assumes that entries
* are not overlapping.
*/
closeActive(endTime: RelativeTime): void;
/**
* Return all values with an active period overlapping with the duration,
* or all values that were active during `startTime` if no duration is provided,
* or all currently active values if no `startTime` is provided.
*/
findAll(startTime?: RelativeTime, duration?: Duration): Value[];
/**
* Remove all entries from this collection.
*/
reset(): void;
/**
* Stop internal garbage collection of past entries.
*/
stop(): void;
private clearOldValues;
}) => Value | undefined;
closeActive: (endTime: RelativeTime) => void;
findAll: (startTime?: RelativeTime, duration?: Duration) => Value[];
reset: () => void;
stop: () => void;
}
export declare function createValueHistory<Value>({ expireDelay, maxEntries, }: {
expireDelay: number;
maxEntries?: number;
}): ValueHistory<Value>;

@@ -6,13 +6,11 @@ import { setInterval, clearInterval } from './timer';

export var CLEAR_OLD_VALUES_INTERVAL = ONE_MINUTE;
/**
* Store and keep track of values spans. This whole class assumes that values are added in
* chronological order (i.e. all entries have an increasing start time).
*/
var ValueHistory = /** @class */ (function () {
function ValueHistory(expireDelay, maxEntries) {
var _this = this;
this.expireDelay = expireDelay;
this.maxEntries = maxEntries;
this.entries = [];
this.clearOldValuesInterval = setInterval(function () { return _this.clearOldValues(); }, CLEAR_OLD_VALUES_INTERVAL);
export function createValueHistory(_a) {
var expireDelay = _a.expireDelay, maxEntries = _a.maxEntries;
var entries = [];
var clearOldValuesInterval = setInterval(function () { return clearOldValues(); }, CLEAR_OLD_VALUES_INTERVAL);
function clearOldValues() {
var oldTimeThreshold = relativeNow() - expireDelay;
while (entries.length > 0 && entries[entries.length - 1].endTime < oldTimeThreshold) {
entries.pop();
}
}

@@ -23,4 +21,3 @@ /**

*/
ValueHistory.prototype.add = function (value, startTime) {
var _this = this;
function add(value, startTime) {
var entry = {

@@ -31,3 +28,3 @@ value: value,

remove: function () {
removeItem(_this.entries, entry);
removeItem(entries, entry);
},

@@ -38,8 +35,8 @@ close: function (endTime) {

};
if (this.maxEntries && this.entries.length >= this.maxEntries) {
this.entries.pop();
if (maxEntries && entries.length >= maxEntries) {
entries.pop();
}
this.entries.unshift(entry);
entries.unshift(entry);
return entry;
};
}
/**

@@ -51,7 +48,7 @@ * Return the latest value that was active during `startTime`, or the currently active value

*/
ValueHistory.prototype.find = function (startTime, options) {
function find(startTime, options) {
if (startTime === void 0) { startTime = END_OF_TIMES; }
if (options === void 0) { options = { returnInactive: false }; }
for (var _i = 0, _a = this.entries; _i < _a.length; _i++) {
var entry = _a[_i];
for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {
var entry = entries_1[_i];
if (entry.startTime <= startTime) {

@@ -64,3 +61,3 @@ if (options.returnInactive || startTime <= entry.endTime) {

}
};
}
/**

@@ -70,8 +67,8 @@ * Helper function to close the currently active value, if any. This method assumes that entries

*/
ValueHistory.prototype.closeActive = function (endTime) {
var latestEntry = this.entries[0];
function closeActive(endTime) {
var latestEntry = entries[0];
if (latestEntry && latestEntry.endTime === END_OF_TIMES) {
latestEntry.close(endTime);
}
};
}
/**

@@ -82,31 +79,24 @@ * Return all values with an active period overlapping with the duration,

*/
ValueHistory.prototype.findAll = function (startTime, duration) {
function findAll(startTime, duration) {
if (startTime === void 0) { startTime = END_OF_TIMES; }
if (duration === void 0) { duration = 0; }
var endTime = addDuration(startTime, duration);
return this.entries
return entries
.filter(function (entry) { return entry.startTime <= endTime && startTime <= entry.endTime; })
.map(function (entry) { return entry.value; });
};
}
/**
* Remove all entries from this collection.
*/
ValueHistory.prototype.reset = function () {
this.entries = [];
};
function reset() {
entries = [];
}
/**
* Stop internal garbage collection of past entries.
*/
ValueHistory.prototype.stop = function () {
clearInterval(this.clearOldValuesInterval);
};
ValueHistory.prototype.clearOldValues = function () {
var oldTimeThreshold = relativeNow() - this.expireDelay;
while (this.entries.length > 0 && this.entries[this.entries.length - 1].endTime < oldTimeThreshold) {
this.entries.pop();
}
};
return ValueHistory;
}());
export { ValueHistory };
function stop() {
clearInterval(clearOldValuesInterval);
}
return { add: add, find: find, closeActive: closeActive, findAll: findAll, reset: reset, stop: stop };
}
//# sourceMappingURL=valueHistory.js.map

@@ -5,18 +5,13 @@ import type { Context } from '../tools/serialisation/context';

import type { FlushController } from './flushController';
export declare class Batch {
private encoder;
private request;
export interface Batch {
flushController: FlushController;
private messageBytesLimit;
private upsertBuffer;
private flushSubscription;
constructor(encoder: Encoder, request: HttpRequest, flushController: FlushController, messageBytesLimit: number);
add(message: Context): void;
upsert(message: Context, key: string): void;
stop(): void;
private flush;
private addOrUpdate;
private push;
private remove;
private hasMessageFor;
add: (message: Context) => void;
upsert: (message: Context, key: string) => void;
stop: () => void;
}
export declare function createBatch({ encoder, request, flushController, messageBytesLimit, }: {
encoder: Encoder;
request: HttpRequest;
flushController: FlushController;
messageBytesLimit: number;
}): Batch;

@@ -1,2 +0,2 @@

import { DOCS_ORIGIN, display } from '../tools/display';
import { DOCS_TROUBLESHOOTING, MORE_DETAILS, display } from '../tools/display';
import { objectValues } from '../tools/utils/polyfills';

@@ -6,26 +6,44 @@ import { isPageExitReason } from '../browser/pageExitObservable';

import { computeBytesCount } from '../tools/utils/byteUtils';
var Batch = /** @class */ (function () {
function Batch(encoder, request, flushController, messageBytesLimit) {
var _this = this;
this.encoder = encoder;
this.request = request;
this.flushController = flushController;
this.messageBytesLimit = messageBytesLimit;
this.upsertBuffer = {};
this.flushSubscription = this.flushController.flushObservable.subscribe(function (event) { return _this.flush(event); });
export function createBatch(_a) {
var encoder = _a.encoder, request = _a.request, flushController = _a.flushController, messageBytesLimit = _a.messageBytesLimit;
var upsertBuffer = {};
var flushSubscription = flushController.flushObservable.subscribe(function (event) { return flush(event); });
function push(serializedMessage, estimatedMessageBytesCount, key) {
flushController.notifyBeforeAddMessage(estimatedMessageBytesCount);
if (key !== undefined) {
upsertBuffer[key] = serializedMessage;
flushController.notifyAfterAddMessage();
}
else {
encoder.write(encoder.isEmpty ? serializedMessage : "\n".concat(serializedMessage), function (realMessageBytesCount) {
flushController.notifyAfterAddMessage(realMessageBytesCount - estimatedMessageBytesCount);
});
}
}
Batch.prototype.add = function (message) {
this.addOrUpdate(message);
};
Batch.prototype.upsert = function (message, key) {
this.addOrUpdate(message, key);
};
Batch.prototype.stop = function () {
this.flushSubscription.unsubscribe();
};
Batch.prototype.flush = function (event) {
var upsertMessages = objectValues(this.upsertBuffer).join('\n');
this.upsertBuffer = {};
function hasMessageFor(key) {
return key !== undefined && upsertBuffer[key] !== undefined;
}
function remove(key) {
var removedMessage = upsertBuffer[key];
delete upsertBuffer[key];
var messageBytesCount = encoder.estimateEncodedBytesCount(removedMessage);
flushController.notifyAfterRemoveMessage(messageBytesCount);
}
function addOrUpdate(message, key) {
var serializedMessage = jsonStringify(message);
var estimatedMessageBytesCount = encoder.estimateEncodedBytesCount(serializedMessage);
if (estimatedMessageBytesCount >= messageBytesLimit) {
display.warn("Discarded a message whose size was bigger than the maximum allowed size ".concat(messageBytesLimit, "KB. ").concat(MORE_DETAILS, " ").concat(DOCS_TROUBLESHOOTING, "/#technical-limitations"));
return;
}
if (hasMessageFor(key)) {
remove(key);
}
push(serializedMessage, estimatedMessageBytesCount, key);
}
function flush(event) {
var upsertMessages = objectValues(upsertBuffer).join('\n');
upsertBuffer = {};
var isPageExit = isPageExitReason(event.reason);
var send = isPageExit ? this.request.sendOnExit : this.request.send;
var send = isPageExit ? request.sendOnExit : request.send;
if (isPageExit &&

@@ -36,4 +54,4 @@ // Note: checking that the encoder is async is not strictly needed, but it's an optimization:

// it and always send a single request.
this.encoder.isAsync) {
var encoderResult = this.encoder.finishSync();
encoder.isAsync) {
var encoderResult = encoder.finishSync();
// Send encoded messages

@@ -54,46 +72,16 @@ if (encoderResult.outputBytesCount) {

if (upsertMessages) {
this.encoder.write(this.encoder.isEmpty ? upsertMessages : "\n".concat(upsertMessages));
encoder.write(encoder.isEmpty ? upsertMessages : "\n".concat(upsertMessages));
}
this.encoder.finish(function (encoderResult) {
encoder.finish(function (encoderResult) {
send(formatPayloadFromEncoder(encoderResult));
});
}
}
return {
flushController: flushController,
add: addOrUpdate,
upsert: addOrUpdate,
stop: flushSubscription.unsubscribe,
};
Batch.prototype.addOrUpdate = function (message, key) {
var serializedMessage = jsonStringify(message);
var estimatedMessageBytesCount = this.encoder.estimateEncodedBytesCount(serializedMessage);
if (estimatedMessageBytesCount >= this.messageBytesLimit) {
display.warn("Discarded a message whose size was bigger than the maximum allowed size ".concat(this.messageBytesLimit, "KB. More details: ").concat(DOCS_ORIGIN, "/real_user_monitoring/browser/troubleshooting/#technical-limitations"));
return;
}
if (this.hasMessageFor(key)) {
this.remove(key);
}
this.push(serializedMessage, estimatedMessageBytesCount, key);
};
Batch.prototype.push = function (serializedMessage, estimatedMessageBytesCount, key) {
var _this = this;
this.flushController.notifyBeforeAddMessage(estimatedMessageBytesCount);
if (key !== undefined) {
this.upsertBuffer[key] = serializedMessage;
this.flushController.notifyAfterAddMessage();
}
else {
this.encoder.write(this.encoder.isEmpty ? serializedMessage : "\n".concat(serializedMessage), function (realMessageBytesCount) {
_this.flushController.notifyAfterAddMessage(realMessageBytesCount - estimatedMessageBytesCount);
});
}
};
Batch.prototype.remove = function (key) {
var removedMessage = this.upsertBuffer[key];
delete this.upsertBuffer[key];
var messageBytesCount = this.encoder.estimateEncodedBytesCount(removedMessage);
this.flushController.notifyAfterRemoveMessage(messageBytesCount);
};
Batch.prototype.hasMessageFor = function (key) {
return key !== undefined && this.upsertBuffer[key] !== undefined;
};
return Batch;
}());
export { Batch };
}
function formatPayloadFromEncoder(encoderResult) {

@@ -100,0 +88,0 @@ var data;

@@ -7,2 +7,3 @@ import type { Configuration, EndpointBuilder } from '../domain/configuration';

import type { Encoder } from '../tools/encoder';
import { createBatch } from './batch';
export interface BatchConfiguration {

@@ -15,3 +16,3 @@ endpoint: EndpointBuilder;

}
export declare function startBatchWithReplica<T extends Context>(configuration: Configuration, primary: BatchConfiguration, replica: ReplicaBatchConfiguration<T> | undefined, reportError: (error: RawError) => void, pageExitObservable: Observable<PageExitEvent>, sessionExpireObservable: Observable<void>): {
export declare function startBatchWithReplica<T extends Context>(configuration: Configuration, primary: BatchConfiguration, replica: ReplicaBatchConfiguration<T> | undefined, reportError: (error: RawError) => void, pageExitObservable: Observable<PageExitEvent>, sessionExpireObservable: Observable<void>, batchFactoryImp?: typeof createBatch): {
flushObservable: Observable<import("./flushController").FlushEvent>;

@@ -18,0 +19,0 @@ add(message: T, replicated?: boolean): void;

@@ -1,16 +0,22 @@

import { Batch } from './batch';
import { createBatch } from './batch';
import { createHttpRequest } from './httpRequest';
import { createFlushController } from './flushController';
export function startBatchWithReplica(configuration, primary, replica, reportError, pageExitObservable, sessionExpireObservable) {
var primaryBatch = createBatch(configuration, primary);
var replicaBatch = replica && createBatch(configuration, replica);
function createBatch(configuration, _a) {
export function startBatchWithReplica(configuration, primary, replica, reportError, pageExitObservable, sessionExpireObservable, batchFactoryImp) {
if (batchFactoryImp === void 0) { batchFactoryImp = createBatch; }
var primaryBatch = createBatchFromConfig(configuration, primary);
var replicaBatch = replica && createBatchFromConfig(configuration, replica);
function createBatchFromConfig(configuration, _a) {
var endpoint = _a.endpoint, encoder = _a.encoder;
return new Batch(encoder, createHttpRequest(configuration, endpoint, configuration.batchBytesLimit, reportError), createFlushController({
messagesLimit: configuration.batchMessagesLimit,
bytesLimit: configuration.batchBytesLimit,
durationLimit: configuration.flushTimeout,
pageExitObservable: pageExitObservable,
sessionExpireObservable: sessionExpireObservable,
}), configuration.messageBytesLimit);
return batchFactoryImp({
encoder: encoder,
request: createHttpRequest(configuration, endpoint, configuration.batchBytesLimit, reportError),
flushController: createFlushController({
messagesLimit: configuration.batchMessagesLimit,
bytesLimit: configuration.batchBytesLimit,
durationLimit: configuration.flushTimeout,
pageExitObservable: pageExitObservable,
sessionExpireObservable: sessionExpireObservable,
}),
messageBytesLimit: configuration.messageBytesLimit,
});
}

@@ -34,3 +40,5 @@ return {

primaryBatch.stop();
replicaBatch === null || replicaBatch === void 0 ? void 0 : replicaBatch.stop();
if (replicaBatch) {
replicaBatch.stop();
}
},

@@ -37,0 +45,0 @@ };

{
"name": "@datadog/browser-core",
"version": "5.23.0",
"version": "5.23.3",
"license": "Apache-2.0",

@@ -26,3 +26,3 @@ "main": "cjs/index.js",

},
"gitHead": "11c8da555ab131e2b0c1b53e9908fbde64c388c8"
"gitHead": "276d1141c77dfaafcd5fc16a8cb7baf6221cfff4"
}

@@ -7,5 +7,3 @@ import { monitor } from '../tools/monitor'

// We want to use a real enum (i.e. not a const enum) here, to be able to iterate over it to automatically add _ddIsTrusted in e2e tests
// eslint-disable-next-line no-restricted-syntax
export enum DOM_EVENT {
export const enum DOM_EVENT {
BEFORE_UNLOAD = 'beforeunload',

@@ -12,0 +10,0 @@ CLICK = 'click',

@@ -5,2 +5,3 @@ import type { InstrumentedMethodCall } from '../tools/instrumentMethod'

import { Observable } from '../tools/observable'
import { assign } from '../tools/utils/polyfills'
import type { ClocksState } from '../tools/utils/timeUtils'

@@ -100,19 +101,28 @@ import { clocksNow } from '../tools/utils/timeUtils'

) {
const reportFetch = (response: Response | Error) => {
const context = startContext as unknown as FetchResolveContext
const context = startContext as unknown as FetchResolveContext
function reportFetch(partialContext: Partial<FetchResolveContext>) {
context.state = 'resolve'
if ('stack' in response || response instanceof Error) {
context.status = 0
context.isAborted = response instanceof DOMException && response.code === DOMException.ABORT_ERR
context.error = response
} else if ('status' in response) {
context.response = response
context.responseType = response.type
context.status = response.status
context.isAborted = false
}
assign(context, partialContext)
observable.notify(context)
}
responsePromise.then(monitor(reportFetch), monitor(reportFetch))
responsePromise.then(
monitor((response) => {
reportFetch({
response,
responseType: response.type,
status: response.status,
isAborted: false,
})
}),
monitor((error: Error) => {
reportFetch({
status: 0,
isAborted:
context.init?.signal?.aborted || (error instanceof DOMException && error.code === DOMException.ABORT_ERR),
error,
})
})
)
}
import { catchUserErrors } from '../../tools/catchUserErrors'
import { DOCS_ORIGIN, display } from '../../tools/display'
import { DOCS_ORIGIN, MORE_DETAILS, display } from '../../tools/display'
import type { RawTelemetryConfiguration } from '../telemetry'

@@ -194,3 +194,3 @@ import type { Duration } from '../../tools/utils/timeUtils'

function checkIfString(tag: unknown, tagName: string): tag is string | undefined | null {
function isString(tag: unknown, tagName: string): tag is string | undefined | null {
if (tag !== undefined && tag !== null && typeof tag !== 'string') {

@@ -203,6 +203,18 @@ display.error(`${tagName} must be defined as a string`)

function isDatadogSite(site: string) {
return /(datadog|ddog|datad0g|dd0g)/.test(site)
function isDatadogSite(site: unknown) {
if (site && typeof site === 'string' && !/(datadog|ddog|datad0g|dd0g)/.test(site)) {
display.error(`Site should be a valid Datadog site. ${MORE_DETAILS} ${DOCS_ORIGIN}/getting_started/site/.`)
return false
}
return true
}
export function isSampleRate(sampleRate: unknown, name: string) {
if (sampleRate !== undefined && !isPercentage(sampleRate)) {
display.error(`${name} Sample Rate should be a number between 0 and 100`)
return false
}
return true
}
export function validateAndBuildConfiguration(initConfiguration: InitConfiguration): Configuration | undefined {

@@ -214,17 +226,12 @@ if (!initConfiguration || !initConfiguration.clientToken) {

if (initConfiguration.sessionSampleRate !== undefined && !isPercentage(initConfiguration.sessionSampleRate)) {
display.error('Session Sample Rate should be a number between 0 and 100')
return
}
if (initConfiguration.telemetrySampleRate !== undefined && !isPercentage(initConfiguration.telemetrySampleRate)) {
display.error('Telemetry Sample Rate should be a number between 0 and 100')
return
}
if (
initConfiguration.telemetryConfigurationSampleRate !== undefined &&
!isPercentage(initConfiguration.telemetryConfigurationSampleRate)
!isDatadogSite(initConfiguration.site) ||
!isSampleRate(initConfiguration.sessionSampleRate, 'Session') ||
!isSampleRate(initConfiguration.telemetrySampleRate, 'Telemetry') ||
!isSampleRate(initConfiguration.telemetryConfigurationSampleRate, 'Telemetry Configuration') ||
!isSampleRate(initConfiguration.telemetryUsageSampleRate, 'Telemetry Usage') ||
!isString(initConfiguration.version, 'Version') ||
!isString(initConfiguration.env, 'Env') ||
!isString(initConfiguration.service, 'Service')
) {
display.error('Telemetry Configuration Sample Rate should be a number between 0 and 100')
return

@@ -234,22 +241,2 @@ }

if (
initConfiguration.telemetryUsageSampleRate !== undefined &&
!isPercentage(initConfiguration.telemetryUsageSampleRate)
) {
display.error('Telemetry Usage Sample Rate should be a number between 0 and 100')
return
}
if (!checkIfString(initConfiguration.version, 'Version')) {
return
}
if (!checkIfString(initConfiguration.env, 'Env')) {
return
}
if (!checkIfString(initConfiguration.service, 'Service')) {
return
}
if (
initConfiguration.trackingConsent !== undefined &&

@@ -262,7 +249,2 @@ !objectHasValue(TrackingConsent, initConfiguration.trackingConsent)

if (initConfiguration.site && !isDatadogSite(initConfiguration.site)) {
display.error(`Site should be a valid Datadog site. Learn more here: ${DOCS_ORIGIN}/getting_started/site/.`)
return
}
return assign(

@@ -269,0 +251,0 @@ {

@@ -6,2 +6,3 @@ export {

TraceContextInjection,
isSampleRate,
validateAndBuildConfiguration,

@@ -8,0 +9,0 @@ serializeConfiguration,

@@ -1,2 +0,2 @@

import { DOCS_ORIGIN, display } from '../../tools/display'
import { DOCS_ORIGIN, MORE_DETAILS, display } from '../../tools/display'
import type { InitConfiguration } from './configuration'

@@ -36,3 +36,3 @@

display.warn(
`${key} value doesn't meet tag requirements and will be sanitized. More details: ${DOCS_ORIGIN}/getting_started/tagging/#defining-tags`
`${key} value doesn't meet tag requirements and will be sanitized. ${MORE_DETAILS} ${DOCS_ORIGIN}/getting_started/tagging/#defining-tags`
)

@@ -39,0 +39,0 @@ }

@@ -5,3 +5,3 @@ import { ONE_KIBI_BYTE, computeBytesCount } from '../../tools/utils/byteUtils'

import { jsonStringify } from '../../tools/serialisation/jsonStringify'
import { DOCS_ORIGIN, display } from '../../tools/display'
import { DOCS_TROUBLESHOOTING, MORE_DETAILS, display } from '../../tools/display'
import { isEmptyObject } from '../../tools/utils/objectUtils'

@@ -133,4 +133,4 @@ import type { CustomerDataType } from './contextConstants'

bytesCountLimit / ONE_KIBI_BYTE
}KiB threshold. More details: ${DOCS_ORIGIN}/real_user_monitoring/browser/troubleshooting/#customer-data-exceeds-the-recommended-threshold-warning`
}KiB threshold. ${MORE_DETAILS} ${DOCS_TROUBLESHOOTING}/#customer-data-exceeds-the-recommended-threshold-warning`
)
}

@@ -38,3 +38,3 @@ import { sanitize } from '../../tools/serialisation/sanitize'

const causes = isErrorInstance ? flattenErrorCauses(originalError as ErrorWithCause, source) : undefined
const type = stackTrace?.name
const type = stackTrace ? stackTrace.name : undefined
const fingerprint = tryToGetFingerprint(originalError)

@@ -41,0 +41,0 @@

import { Observable } from '../../tools/observable'
import type { Context } from '../../tools/serialisation/context'
import { ValueHistory } from '../../tools/valueHistory'
import { createValueHistory } from '../../tools/valueHistory'
import type { RelativeTime } from '../../tools/utils/timeUtils'

@@ -49,3 +49,5 @@ import { relativeNow, clocksOrigin, ONE_MINUTE } from '../../tools/utils/timeUtils'

const sessionContextHistory = new ValueHistory<SessionContext<TrackingType>>(SESSION_CONTEXT_TIMEOUT_DELAY)
const sessionContextHistory = createValueHistory<SessionContext<TrackingType>>({
expireDelay: SESSION_CONTEXT_TIMEOUT_DELAY,
})
stopCallbacks.push(() => sessionContextHistory.stop())

@@ -52,0 +54,0 @@

@@ -20,3 +20,3 @@ import type { Context } from '../../tools/serialisation/context'

import { getConnectivity } from '../connectivity'
import { BoundedBuffer } from '../../tools/boundedBuffer'
import { createBoundedBuffer } from '../../tools/boundedBuffer'
import type { TelemetryEvent } from './telemetryEvent.types'

@@ -57,3 +57,3 @@ import type {

// eslint-disable-next-line local-rules/disallow-side-effects
let preStartTelemetryBuffer = new BoundedBuffer()
let preStartTelemetryBuffer = createBoundedBuffer()
let onRawTelemetryEventCollected = (event: RawTelemetryEvent) => {

@@ -149,3 +149,3 @@ preStartTelemetryBuffer.add(() => onRawTelemetryEventCollected(event))

export function resetTelemetry() {
preStartTelemetryBuffer = new BoundedBuffer()
preStartTelemetryBuffer = createBoundedBuffer()
onRawTelemetryEventCollected = (event: RawTelemetryEvent) => {

@@ -152,0 +152,0 @@ preStartTelemetryBuffer.add(() => onRawTelemetryEventCollected(event))

@@ -9,2 +9,3 @@ export {

serializeConfiguration,
isSampleRate,
INTAKE_SITE_STAGING,

@@ -110,3 +111,3 @@ INTAKE_SITE_US1,

export { initConsoleObservable, resetConsoleObservable, ConsoleLog } from './domain/console/consoleObservable'
export { BoundedBuffer } from './tools/boundedBuffer'
export { createBoundedBuffer, BoundedBuffer } from './tools/boundedBuffer'
export { catchUserErrors } from './tools/catchUserErrors'

@@ -124,3 +125,3 @@ export { createContextManager, ContextManager } from './domain/context/contextManager'

export { CustomerDataType } from './domain/context/contextConstants'
export { ValueHistory, ValueHistoryEntry, CLEAR_OLD_VALUES_INTERVAL } from './tools/valueHistory'
export { createValueHistory, ValueHistory, ValueHistoryEntry, CLEAR_OLD_VALUES_INTERVAL } from './tools/valueHistory'
export { readBytesFromStream } from './tools/readBytesFromStream'

@@ -127,0 +128,0 @@ export { STORAGE_POLL_DELAY } from './domain/session/sessionStore'

@@ -19,2 +19,3 @@ import type { Subscription } from './observable'

// eslint-disable-next-line no-restricted-syntax
export class AbstractLifeCycle<EventMap> {

@@ -21,0 +22,0 @@ private callbacks: { [key in keyof EventMap]?: Array<(data: any) => void> } = {}

@@ -5,20 +5,32 @@ import { removeItem } from './utils/arrayUtils'

export class BoundedBuffer<T = void> {
private buffer: Array<(arg: T) => void> = []
export interface BoundedBuffer<T = void> {
add: (callback: (arg: T) => void) => void
remove: (callback: (arg: T) => void) => void
drain: (arg: T) => void
}
add(callback: (arg: T) => void) {
const length = this.buffer.push(callback)
export function createBoundedBuffer<T = void>(): BoundedBuffer<T> {
const buffer: Array<(arg: T) => void> = []
const add: BoundedBuffer<T>['add'] = (callback: (arg: T) => void) => {
const length = buffer.push(callback)
if (length > BUFFER_LIMIT) {
this.buffer.splice(0, 1)
buffer.splice(0, 1)
}
}
remove(callback: (arg: T) => void) {
removeItem(this.buffer, callback)
const remove: BoundedBuffer<T>['remove'] = (callback: (arg: T) => void) => {
removeItem(buffer, callback)
}
drain(arg: T) {
this.buffer.forEach((callback) => callback(arg))
this.buffer.length = 0
const drain = (arg: T) => {
buffer.forEach((callback) => callback(arg))
buffer.length = 0
}
return {
add,
remove,
drain,
}
}

@@ -55,1 +55,3 @@ /* eslint-disable local-rules/disallow-side-effects */

export const DOCS_ORIGIN = 'https://docs.datadoghq.com'
export const DOCS_TROUBLESHOOTING = `${DOCS_ORIGIN}/real_user_monitoring/browser/troubleshooting`
export const MORE_DETAILS = 'More details:'

@@ -22,3 +22,2 @@ /**

UPDATE_VIEW_NAME = 'update_view_name',
PLUGINS = 'plugins',
}

@@ -25,0 +24,0 @@

@@ -5,2 +5,3 @@ export interface Subscription {

// eslint-disable-next-line no-restricted-syntax
export class Observable<T> {

@@ -7,0 +8,0 @@ private observers: Array<(data: T) => void> = []

@@ -62,3 +62,5 @@ import { display } from '../display'

)
let accumulatedCharacterCount = JSON.stringify(sanitizedData)?.length || 0
const serializedSanitizedData = JSON.stringify(sanitizedData)
let accumulatedCharacterCount = serializedSanitizedData ? serializedSanitizedData.length : 0
if (accumulatedCharacterCount > maxCharacterCount) {

@@ -65,0 +67,0 @@ warnOverCharacterLimit(maxCharacterCount, 'discarded', source)

@@ -20,14 +20,30 @@ import { setInterval, clearInterval } from './timer'

/**
* Store and keep track of values spans. This whole class assumes that values are added in
* Store and keep track of values spans. This whole cache assumes that values are added in
* chronological order (i.e. all entries have an increasing start time).
*/
export class ValueHistory<Value> {
private entries: Array<ValueHistoryEntry<Value>> = []
private clearOldValuesInterval: TimeoutId
export interface ValueHistory<Value> {
add: (value: Value, startTime: RelativeTime) => ValueHistoryEntry<Value>
find: (startTime?: RelativeTime, options?: { returnInactive: boolean }) => Value | undefined
constructor(
private expireDelay: number,
private maxEntries?: number
) {
this.clearOldValuesInterval = setInterval(() => this.clearOldValues(), CLEAR_OLD_VALUES_INTERVAL)
closeActive: (endTime: RelativeTime) => void
findAll: (startTime?: RelativeTime, duration?: Duration) => Value[]
reset: () => void
stop: () => void
}
export function createValueHistory<Value>({
expireDelay,
maxEntries,
}: {
expireDelay: number
maxEntries?: number
}): ValueHistory<Value> {
let entries: Array<ValueHistoryEntry<Value>> = []
const clearOldValuesInterval: TimeoutId = setInterval(() => clearOldValues(), CLEAR_OLD_VALUES_INTERVAL)
function clearOldValues() {
const oldTimeThreshold = relativeNow() - expireDelay
while (entries.length > 0 && entries[entries.length - 1].endTime < oldTimeThreshold) {
entries.pop()
}
}

@@ -39,3 +55,3 @@

*/
add(value: Value, startTime: RelativeTime): ValueHistoryEntry<Value> {
function add(value: Value, startTime: RelativeTime): ValueHistoryEntry<Value> {
const entry: ValueHistoryEntry<Value> = {

@@ -46,3 +62,3 @@ value,

remove: () => {
removeItem(this.entries, entry)
removeItem(entries, entry)
},

@@ -54,7 +70,7 @@ close: (endTime: RelativeTime) => {

if (this.maxEntries && this.entries.length >= this.maxEntries) {
this.entries.pop()
if (maxEntries && entries.length >= maxEntries) {
entries.pop()
}
this.entries.unshift(entry)
entries.unshift(entry)

@@ -70,7 +86,7 @@ return entry

*/
find(
function find(
startTime: RelativeTime = END_OF_TIMES,
options: { returnInactive: boolean } = { returnInactive: false }
): Value | undefined {
for (const entry of this.entries) {
for (const entry of entries) {
if (entry.startTime <= startTime) {

@@ -89,4 +105,4 @@ if (options.returnInactive || startTime <= entry.endTime) {

*/
closeActive(endTime: RelativeTime) {
const latestEntry = this.entries[0]
function closeActive(endTime: RelativeTime) {
const latestEntry = entries[0]
if (latestEntry && latestEntry.endTime === END_OF_TIMES) {

@@ -102,5 +118,5 @@ latestEntry.close(endTime)

*/
findAll(startTime: RelativeTime = END_OF_TIMES, duration = 0 as Duration): Value[] {
function findAll(startTime: RelativeTime = END_OF_TIMES, duration = 0 as Duration): Value[] {
const endTime = addDuration(startTime, duration)
return this.entries
return entries
.filter((entry) => entry.startTime <= endTime && startTime <= entry.endTime)

@@ -113,4 +129,4 @@ .map((entry) => entry.value)

*/
reset() {
this.entries = []
function reset() {
entries = []
}

@@ -121,12 +137,7 @@

*/
stop() {
clearInterval(this.clearOldValuesInterval)
function stop() {
clearInterval(clearOldValuesInterval)
}
private clearOldValues() {
const oldTimeThreshold = relativeNow() - this.expireDelay
while (this.entries.length > 0 && this.entries[this.entries.length - 1].endTime < oldTimeThreshold) {
this.entries.pop()
}
}
return { add, find, closeActive, findAll, reset, stop }
}

@@ -1,2 +0,2 @@

import { DOCS_ORIGIN, display } from '../tools/display'
import { DOCS_TROUBLESHOOTING, MORE_DETAILS, display } from '../tools/display'
import type { Context } from '../tools/serialisation/context'

@@ -6,3 +6,2 @@ import { objectValues } from '../tools/utils/polyfills'

import { jsonStringify } from '../tools/serialisation/jsonStringify'
import type { Subscription } from '../tools/observable'
import type { Encoder, EncoderResult } from '../tools/encoder'

@@ -13,33 +12,72 @@ import { computeBytesCount } from '../tools/utils/byteUtils'

export class Batch {
private upsertBuffer: { [key: string]: string } = {}
private flushSubscription: Subscription
export interface Batch {
flushController: FlushController
add: (message: Context) => void
upsert: (message: Context, key: string) => void
stop: () => void
}
constructor(
private encoder: Encoder,
private request: HttpRequest,
public flushController: FlushController,
private messageBytesLimit: number
) {
this.flushSubscription = this.flushController.flushObservable.subscribe((event) => this.flush(event))
export function createBatch({
encoder,
request,
flushController,
messageBytesLimit,
}: {
encoder: Encoder
request: HttpRequest
flushController: FlushController
messageBytesLimit: number
}): Batch {
let upsertBuffer: { [key: string]: string } = {}
const flushSubscription = flushController.flushObservable.subscribe((event) => flush(event))
function push(serializedMessage: string, estimatedMessageBytesCount: number, key?: string) {
flushController.notifyBeforeAddMessage(estimatedMessageBytesCount)
if (key !== undefined) {
upsertBuffer[key] = serializedMessage
flushController.notifyAfterAddMessage()
} else {
encoder.write(encoder.isEmpty ? serializedMessage : `\n${serializedMessage}`, (realMessageBytesCount) => {
flushController.notifyAfterAddMessage(realMessageBytesCount - estimatedMessageBytesCount)
})
}
}
add(message: Context) {
this.addOrUpdate(message)
function hasMessageFor(key?: string): key is string {
return key !== undefined && upsertBuffer[key] !== undefined
}
upsert(message: Context, key: string) {
this.addOrUpdate(message, key)
function remove(key: string) {
const removedMessage = upsertBuffer[key]
delete upsertBuffer[key]
const messageBytesCount = encoder.estimateEncodedBytesCount(removedMessage)
flushController.notifyAfterRemoveMessage(messageBytesCount)
}
stop() {
this.flushSubscription.unsubscribe()
function addOrUpdate(message: Context, key?: string) {
const serializedMessage = jsonStringify(message)!
const estimatedMessageBytesCount = encoder.estimateEncodedBytesCount(serializedMessage)
if (estimatedMessageBytesCount >= messageBytesLimit) {
display.warn(
`Discarded a message whose size was bigger than the maximum allowed size ${messageBytesLimit}KB. ${MORE_DETAILS} ${DOCS_TROUBLESHOOTING}/#technical-limitations`
)
return
}
if (hasMessageFor(key)) {
remove(key)
}
push(serializedMessage, estimatedMessageBytesCount, key)
}
private flush(event: FlushEvent) {
const upsertMessages = objectValues(this.upsertBuffer).join('\n')
this.upsertBuffer = {}
function flush(event: FlushEvent) {
const upsertMessages = objectValues(upsertBuffer).join('\n')
upsertBuffer = {}
const isPageExit = isPageExitReason(event.reason)
const send = isPageExit ? this.request.sendOnExit : this.request.send
const send = isPageExit ? request.sendOnExit : request.send

@@ -52,5 +90,5 @@ if (

// it and always send a single request.
this.encoder.isAsync
encoder.isAsync
) {
const encoderResult = this.encoder.finishSync()
const encoderResult = encoder.finishSync()

@@ -72,5 +110,5 @@ // Send encoded messages

if (upsertMessages) {
this.encoder.write(this.encoder.isEmpty ? upsertMessages : `\n${upsertMessages}`)
encoder.write(encoder.isEmpty ? upsertMessages : `\n${upsertMessages}`)
}
this.encoder.finish((encoderResult) => {
encoder.finish((encoderResult) => {
send(formatPayloadFromEncoder(encoderResult))

@@ -81,47 +119,8 @@ })

private addOrUpdate(message: Context, key?: string) {
const serializedMessage = jsonStringify(message)!
const estimatedMessageBytesCount = this.encoder.estimateEncodedBytesCount(serializedMessage)
if (estimatedMessageBytesCount >= this.messageBytesLimit) {
display.warn(
`Discarded a message whose size was bigger than the maximum allowed size ${this.messageBytesLimit}KB. More details: ${DOCS_ORIGIN}/real_user_monitoring/browser/troubleshooting/#technical-limitations`
)
return
}
if (this.hasMessageFor(key)) {
this.remove(key)
}
this.push(serializedMessage, estimatedMessageBytesCount, key)
return {
flushController,
add: addOrUpdate,
upsert: addOrUpdate,
stop: flushSubscription.unsubscribe,
}
private push(serializedMessage: string, estimatedMessageBytesCount: number, key?: string) {
this.flushController.notifyBeforeAddMessage(estimatedMessageBytesCount)
if (key !== undefined) {
this.upsertBuffer[key] = serializedMessage
this.flushController.notifyAfterAddMessage()
} else {
this.encoder.write(
this.encoder.isEmpty ? serializedMessage : `\n${serializedMessage}`,
(realMessageBytesCount) => {
this.flushController.notifyAfterAddMessage(realMessageBytesCount - estimatedMessageBytesCount)
}
)
}
}
private remove(key: string) {
const removedMessage = this.upsertBuffer[key]
delete this.upsertBuffer[key]
const messageBytesCount = this.encoder.estimateEncodedBytesCount(removedMessage)
this.flushController.notifyAfterRemoveMessage(messageBytesCount)
}
private hasMessageFor(key?: string): key is string {
return key !== undefined && this.upsertBuffer[key] !== undefined
}
}

@@ -128,0 +127,0 @@

@@ -7,3 +7,3 @@ import type { Configuration, EndpointBuilder } from '../domain/configuration'

import type { Encoder } from '../tools/encoder'
import { Batch } from './batch'
import { createBatch } from './batch'
import { createHttpRequest } from './httpRequest'

@@ -27,12 +27,13 @@ import { createFlushController } from './flushController'

pageExitObservable: Observable<PageExitEvent>,
sessionExpireObservable: Observable<void>
sessionExpireObservable: Observable<void>,
batchFactoryImp = createBatch
) {
const primaryBatch = createBatch(configuration, primary)
const replicaBatch = replica && createBatch(configuration, replica)
const primaryBatch = createBatchFromConfig(configuration, primary)
const replicaBatch = replica && createBatchFromConfig(configuration, replica)
function createBatch(configuration: Configuration, { endpoint, encoder }: BatchConfiguration) {
return new Batch(
function createBatchFromConfig(configuration: Configuration, { endpoint, encoder }: BatchConfiguration) {
return batchFactoryImp({
encoder,
createHttpRequest(configuration, endpoint, configuration.batchBytesLimit, reportError),
createFlushController({
request: createHttpRequest(configuration, endpoint, configuration.batchBytesLimit, reportError),
flushController: createFlushController({
messagesLimit: configuration.batchMessagesLimit,

@@ -44,4 +45,4 @@ bytesLimit: configuration.batchBytesLimit,

}),
configuration.messageBytesLimit
)
messageBytesLimit: configuration.messageBytesLimit,
})
}

@@ -68,5 +69,7 @@

primaryBatch.stop()
replicaBatch?.stop()
if (replicaBatch) {
replicaBatch.stop()
}
},
}
}

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc