Socket
Socket
Sign inDemoInstall

@datadog/browser-core

Package Overview
Dependencies
0
Maintainers
1
Versions
248
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 4.38.0 to 4.39.0

cjs/browser/types.d.ts

6

cjs/boot/init.js

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

var monitor_1 = require("../tools/monitor");
var utils_1 = require("../tools/utils");
var polyfills_1 = require("../tools/utils/polyfills");
function makePublicApi(stub) {
var publicApi = (0, utils_1.assign)({
version: "4.38.0",
var publicApi = (0, polyfills_1.assign)({
version: "4.39.0",
// This API method is intentionally not monitored, since the only thing executed is the

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

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

import type { VisualViewport, VisualViewportEventMap } from './types';
export declare const enum DOM_EVENT {

@@ -41,2 +42,7 @@ BEFORE_UNLOAD = "beforeunload",

}
type EventMapFor<T> = T extends Window ? WindowEventMap & {
freeze: Event;
resume: Event;
visibilitychange: Event;
} : T extends Document ? DocumentEventMap : T extends HTMLElement ? HTMLElementEventMap : T extends VisualViewport ? VisualViewportEventMap : T extends ShadowRoot ? GlobalEventHandlersEventMap : T extends XMLHttpRequest ? XMLHttpRequestEventMap : T extends Performance ? PerformanceEventMap : T extends Worker ? WorkerEventMap : Record<never, never>;
/**

@@ -52,3 +58,3 @@ * Add an event listener to an event target object (Window, Element, mock object...). This provides

*/
export declare function addEventListener<E extends Event>(eventTarget: EventTarget, event: DOM_EVENT, listener: (event: E) => void, options?: AddEventListenerOptions): {
export declare function addEventListener<Target extends EventTarget, EventName extends keyof EventMapFor<Target> & string>(eventTarget: Target, eventName: EventName, listener: (event: EventMapFor<Target>[EventName]) => void, options?: AddEventListenerOptions): {
stop: () => void;

@@ -68,5 +74,5 @@ };

*/
export declare function addEventListeners<E extends Event>(eventTarget: EventTarget, events: DOM_EVENT[], listener: (event: E) => void, { once, capture, passive }?: AddEventListenerOptions): {
export declare function addEventListeners<Target extends EventTarget, EventName extends keyof EventMapFor<Target> & string>(eventTarget: Target, eventNames: EventName[], listener: (event: EventMapFor<Target>[EventName]) => void, { once, capture, passive }?: AddEventListenerOptions): {
stop: () => void;
};
export {};

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

*/
function addEventListener(eventTarget, event, listener, options) {
return addEventListeners(eventTarget, [event], listener, options);
function addEventListener(eventTarget, eventName, listener, options) {
return addEventListeners(eventTarget, [eventName], listener, options);
}

@@ -33,3 +33,3 @@ exports.addEventListener = addEventListener;

*/
function addEventListeners(eventTarget, events, listener, _a) {
function addEventListeners(eventTarget, eventNames, listener, _a) {
var _b = _a === void 0 ? {} : _a, once = _b.once, capture = _b.capture, passive = _b.passive;

@@ -44,6 +44,6 @@ var wrappedListener = (0, monitor_1.monitor)(once

var add = (0, getZoneJsOriginalValue_1.getZoneJsOriginalValue)(eventTarget, 'addEventListener');
events.forEach(function (event) { return add.call(eventTarget, event, wrappedListener, options); });
eventNames.forEach(function (eventName) { return add.call(eventTarget, eventName, wrappedListener, options); });
function stop() {
var remove = (0, getZoneJsOriginalValue_1.getZoneJsOriginalValue)(eventTarget, 'removeEventListener');
events.forEach(function (event) { return remove.call(eventTarget, event, wrappedListener, options); });
eventNames.forEach(function (eventName) { return remove.call(eventTarget, eventName, wrappedListener, options); });
}

@@ -50,0 +50,0 @@ return {

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

var display_1 = require("../tools/display");
var utils_1 = require("../tools/utils");
exports.COOKIE_ACCESS_DELAY = utils_1.ONE_SECOND;
var timeUtils_1 = require("../tools/utils/timeUtils");
var stringUtils_1 = require("../tools/utils/stringUtils");
exports.COOKIE_ACCESS_DELAY = timeUtils_1.ONE_SECOND;
function setCookie(name, value, expireDelay, options) {

@@ -19,3 +20,3 @@ var date = new Date();

function getCookie(name) {
return (0, utils_1.findCommaSeparatedValue)(document.cookie, name);
return (0, stringUtils_1.findCommaSeparatedValue)(document.cookie, name);
}

@@ -34,5 +35,5 @@ exports.getCookie = getCookie;

// the test cookie lifetime
var testCookieName = "dd_cookie_test_".concat((0, utils_1.generateUUID)());
var testCookieName = "dd_cookie_test_".concat((0, stringUtils_1.generateUUID)());
var testCookieValue = 'test';
setCookie(testCookieName, testCookieValue, utils_1.ONE_MINUTE, options);
setCookie(testCookieName, testCookieValue, timeUtils_1.ONE_MINUTE, options);
var isCookieCorrectlySet = getCookie(testCookieName) === testCookieValue;

@@ -58,3 +59,3 @@ deleteCookie(testCookieName, options);

// the test cookie lifetime
var testCookieName = "dd_site_test_".concat((0, utils_1.generateUUID)());
var testCookieName = "dd_site_test_".concat((0, stringUtils_1.generateUUID)());
var testCookieValue = 'test';

@@ -65,3 +66,3 @@ var domainLevels = window.location.hostname.split('.');

candidateDomain = "".concat(domainLevels.pop(), ".").concat(candidateDomain);
setCookie(testCookieName, testCookieValue, utils_1.ONE_SECOND, { domain: candidateDomain });
setCookie(testCookieName, testCookieValue, timeUtils_1.ONE_SECOND, { domain: candidateDomain });
}

@@ -68,0 +69,0 @@ deleteCookie(testCookieName, { domain: candidateDomain });

import { Observable } from '../tools/observable';
import type { ClocksState } from '../tools/timeUtils';
import type { ClocksState } from '../tools/utils/timeUtils';
interface FetchContextBase {

@@ -4,0 +4,0 @@ method: string;

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

var observable_1 = require("../tools/observable");
var timeUtils_1 = require("../tools/timeUtils");
var urlPolyfill_1 = require("../tools/urlPolyfill");
var timeUtils_1 = require("../tools/utils/timeUtils");
var urlPolyfill_1 = require("../tools/utils/urlPolyfill");
var fetchObservable;

@@ -11,0 +11,0 @@ function initFetchObservable() {

@@ -8,3 +8,3 @@ import { Observable } from '../tools/observable';

};
type PageExitReason = (typeof PageExitReason)[keyof typeof PageExitReason];
export type PageExitReason = (typeof PageExitReason)[keyof typeof PageExitReason];
export interface PageExitEvent {

@@ -15,2 +15,1 @@ reason: PageExitReason;

export declare function isPageExitReason(reason: string | undefined): reason is PageExitReason;
export {};

@@ -6,3 +6,4 @@ "use strict";

var observable_1 = require("../tools/observable");
var utils_1 = require("../tools/utils");
var polyfills_1 = require("../tools/utils/polyfills");
var functionUtils_1 = require("../tools/utils/functionUtils");
var addEventListener_1 = require("./addEventListener");

@@ -40,3 +41,3 @@ exports.PageExitReason = {

}, { capture: true }).stop;
var stopBeforeUnloadListener = utils_1.noop;
var stopBeforeUnloadListener = functionUtils_1.noop;
if (!pagehideEnabled) {

@@ -56,5 +57,5 @@ stopBeforeUnloadListener = (0, addEventListener_1.addEventListener)(window, "beforeunload" /* DOM_EVENT.BEFORE_UNLOAD */, function () {

function isPageExitReason(reason) {
return (0, utils_1.includes)((0, utils_1.objectValues)(exports.PageExitReason), reason);
return (0, polyfills_1.includes)((0, polyfills_1.objectValues)(exports.PageExitReason), reason);
}
exports.isPageExitReason = isPageExitReason;
//# sourceMappingURL=pageExitObservable.js.map
import { Observable } from '../tools/observable';
import type { Duration, RelativeTime, ClocksState } from '../tools/timeUtils';
import type { Duration, RelativeTime, ClocksState } from '../tools/utils/timeUtils';
export interface XhrOpenContext {

@@ -4,0 +4,0 @@ state: 'open';

@@ -5,7 +5,7 @@ "use strict";

var instrumentMethod_1 = require("../tools/instrumentMethod");
var monitor_1 = require("../tools/monitor");
var observable_1 = require("../tools/observable");
var timeUtils_1 = require("../tools/timeUtils");
var urlPolyfill_1 = require("../tools/urlPolyfill");
var utils_1 = require("../tools/utils");
var timeUtils_1 = require("../tools/utils/timeUtils");
var urlPolyfill_1 = require("../tools/utils/urlPolyfill");
var objectUtils_1 = require("../tools/utils/objectUtils");
var addEventListener_1 = require("./addEventListener");
var xhrObservable;

@@ -72,4 +72,4 @@ var xhrContexts = new WeakMap();

}).stop;
var onEnd = (0, monitor_1.monitor)(function () {
_this.removeEventListener('loadend', onEnd);
var onEnd = function () {
unsubscribeLoadEndListener();
stopInstrumentingOnReadyStateChange();

@@ -84,5 +84,5 @@ if (hasBeenReported) {

completeContext.status = _this.status;
observable.notify((0, utils_1.shallowClone)(completeContext));
});
this.addEventListener('loadend', onEnd);
observable.notify((0, objectUtils_1.shallowClone)(completeContext));
};
var unsubscribeLoadEndListener = (0, addEventListener_1.addEventListener)(this, 'loadend', onEnd).stop;
observable.notify(startContext);

@@ -89,0 +89,0 @@ }

import type { CookieOptions } from '../../browser/cookie';
import type { RawTelemetryConfiguration } from '../telemetry';
import type { Duration } from '../../tools/utils/timeUtils';
import type { TransportConfiguration } from './transportConfiguration';

@@ -56,3 +57,3 @@ export declare const DefaultPrivacyLevel: {

batchBytesLimit: number;
flushTimeout: number;
flushTimeout: Duration;
batchMessagesLimit: number;

@@ -59,0 +60,0 @@ messageBytesLimit: number;

@@ -7,4 +7,8 @@ "use strict";

var display_1 = require("../../tools/display");
var utils_1 = require("../../tools/utils");
var experimentalFeatures_1 = require("../../tools/experimentalFeatures");
var timeUtils_1 = require("../../tools/utils/timeUtils");
var numberUtils_1 = require("../../tools/utils/numberUtils");
var byteUtils_1 = require("../../tools/utils/byteUtils");
var objectUtils_1 = require("../../tools/utils/objectUtils");
var polyfills_1 = require("../../tools/utils/polyfills");
var transportConfiguration_1 = require("./transportConfiguration");

@@ -23,7 +27,7 @@ exports.DefaultPrivacyLevel = {

var sessionSampleRate = (_a = initConfiguration.sessionSampleRate) !== null && _a !== void 0 ? _a : initConfiguration.sampleRate;
if (sessionSampleRate !== undefined && !(0, utils_1.isPercentage)(sessionSampleRate)) {
if (sessionSampleRate !== undefined && !(0, numberUtils_1.isPercentage)(sessionSampleRate)) {
display_1.display.error('Session Sample Rate should be a number between 0 and 100');
return;
}
if (initConfiguration.telemetrySampleRate !== undefined && !(0, utils_1.isPercentage)(initConfiguration.telemetrySampleRate)) {
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');

@@ -33,3 +37,3 @@ return;

if (initConfiguration.telemetryConfigurationSampleRate !== undefined &&
!(0, utils_1.isPercentage)(initConfiguration.telemetryConfigurationSampleRate)) {
!(0, numberUtils_1.isPercentage)(initConfiguration.telemetryConfigurationSampleRate)) {
display_1.display.error('Telemetry Configuration Sample Rate should be a number between 0 and 100');

@@ -41,6 +45,6 @@ return;

(0, experimentalFeatures_1.addExperimentalFeatures)(initConfiguration.enableExperimentalFeatures.filter(function (flag) {
return (0, utils_1.objectHasValue)(experimentalFeatures_1.ExperimentalFeature, flag);
return (0, objectUtils_1.objectHasValue)(experimentalFeatures_1.ExperimentalFeature, flag);
}));
}
return (0, utils_1.assign)({
return (0, polyfills_1.assign)({
beforeSend: initConfiguration.beforeSend && (0, catchUserErrors_1.catchUserErrors)(initConfiguration.beforeSend, 'beforeSend threw an error:'),

@@ -57,3 +61,3 @@ cookieOptions: buildCookieOptions(initConfiguration),

*/
batchBytesLimit: 16 * utils_1.ONE_KIBI_BYTE,
batchBytesLimit: 16 * byteUtils_1.ONE_KIBI_BYTE,
eventRateLimiterThreshold: 3000,

@@ -65,3 +69,3 @@ maxTelemetryEventsPerPage: 15,

*/
flushTimeout: 30 * utils_1.ONE_SECOND,
flushTimeout: (30 * timeUtils_1.ONE_SECOND),
/**

@@ -71,3 +75,3 @@ * Logs intake limit

batchMessagesLimit: 50,
messageBytesLimit: 256 * utils_1.ONE_KIBI_BYTE,
messageBytesLimit: 256 * byteUtils_1.ONE_KIBI_BYTE,
}, (0, transportConfiguration_1.computeTransportConfiguration)(initConfiguration));

@@ -74,0 +78,0 @@ }

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createEndpointBuilder = exports.ENDPOINTS = void 0;
var timeUtils_1 = require("../../tools/timeUtils");
var urlPolyfill_1 = require("../../tools/urlPolyfill");
var utils_1 = require("../../tools/utils");
var timeUtils_1 = require("../../tools/utils/timeUtils");
var urlPolyfill_1 = require("../../tools/utils/urlPolyfill");
var experimentalFeatures_1 = require("../../tools/experimentalFeatures");
var stringUtils_1 = require("../../tools/utils/stringUtils");
var intakeSites_1 = require("./intakeSites");

@@ -69,3 +69,3 @@ exports.ENDPOINTS = {

var clientToken = _a.clientToken, internalAnalyticsSubdomain = _a.internalAnalyticsSubdomain;
var tags = ["sdk_version:".concat("4.38.0"), "api:".concat(api)].concat(configurationTags);
var tags = ["sdk_version:".concat("4.39.0"), "api:".concat(api)].concat(configurationTags);
if (flushReason && (0, experimentalFeatures_1.isExperimentalFeatureEnabled)(experimentalFeatures_1.ExperimentalFeature.COLLECT_FLUSH_REASON)) {

@@ -81,5 +81,5 @@ tags.push("flush_reason:".concat(flushReason));

"dd-api-key=".concat(clientToken),
"dd-evp-origin-version=".concat(encodeURIComponent("4.38.0")),
"dd-evp-origin-version=".concat(encodeURIComponent("4.39.0")),
'dd-evp-origin=browser',
"dd-request-id=".concat((0, utils_1.generateUUID)()),
"dd-request-id=".concat((0, stringUtils_1.generateUUID)()),
];

@@ -86,0 +86,0 @@ if (endpointType === 'rum') {

export declare const INTAKE_SITE_STAGING = "datad0g.com";
export declare const INTAKE_SITE_US1 = "datadoghq.com";
export declare const INTAKE_SITE_EU1 = "datadoghq.eu";
export declare const INTAKE_SITE_AP1 = "ap1.datadoghq.com";
export declare const INTAKE_SITE_US1_FED = "ddog-gov.com";
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.INTAKE_SITE_US1_FED = exports.INTAKE_SITE_AP1 = exports.INTAKE_SITE_US1 = exports.INTAKE_SITE_STAGING = void 0;
exports.INTAKE_SITE_US1_FED = exports.INTAKE_SITE_AP1 = exports.INTAKE_SITE_EU1 = exports.INTAKE_SITE_US1 = exports.INTAKE_SITE_STAGING = void 0;
exports.INTAKE_SITE_STAGING = 'datad0g.com';
exports.INTAKE_SITE_US1 = 'datadoghq.com';
exports.INTAKE_SITE_EU1 = 'datadoghq.eu';
exports.INTAKE_SITE_AP1 = 'ap1.datadoghq.com';
exports.INTAKE_SITE_US1_FED = 'ddog-gov.com';
//# sourceMappingURL=intakeSites.js.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.computeTransportConfiguration = void 0;
var utils_1 = require("../../tools/utils");
var polyfills_1 = require("../../tools/utils/polyfills");
var endpointBuilder_1 = require("./endpointBuilder");

@@ -11,5 +11,5 @@ var tags_1 = require("./tags");

var endpointBuilders = computeEndpointBuilders(initConfiguration, tags);
var intakeUrlPrefixes = (0, utils_1.objectValues)(endpointBuilders).map(function (builder) { return builder.urlPrefix; });
var intakeUrlPrefixes = (0, polyfills_1.objectValues)(endpointBuilders).map(function (builder) { return builder.urlPrefix; });
var replicaConfiguration = computeReplicaConfiguration(initConfiguration, intakeUrlPrefixes, tags);
return (0, utils_1.assign)({
return (0, polyfills_1.assign)({
isIntakeUrl: function (url) { return intakeUrlPrefixes.some(function (intakeEndpoint) { return url.indexOf(intakeEndpoint) === 0; }); },

@@ -32,3 +32,3 @@ replica: replicaConfiguration,

}
var replicaConfiguration = (0, utils_1.assign)({}, initConfiguration, {
var replicaConfiguration = (0, polyfills_1.assign)({}, initConfiguration, {
site: intakeSites_1.INTAKE_SITE_US1,

@@ -41,5 +41,5 @@ clientToken: initConfiguration.replica.clientToken,

};
intakeUrlPrefixes.push.apply(intakeUrlPrefixes, (0, utils_1.objectValues)(replicaEndpointBuilders).map(function (builder) { return builder.urlPrefix; }));
return (0, utils_1.assign)({ applicationId: initConfiguration.replica.applicationId }, replicaEndpointBuilders);
intakeUrlPrefixes.push.apply(intakeUrlPrefixes, (0, polyfills_1.objectValues)(replicaEndpointBuilders).map(function (builder) { return builder.urlPrefix; }));
return (0, polyfills_1.assign)({ applicationId: initConfiguration.replica.applicationId }, replicaEndpointBuilders);
}
//# sourceMappingURL=transportConfiguration.js.map

@@ -7,7 +7,8 @@ "use strict";

var observable_1 = require("../../tools/observable");
var utils_1 = require("../../tools/utils");
var display_1 = require("../../tools/display");
var monitor_1 = require("../../tools/monitor");
var sanitize_1 = require("../../tools/sanitize");
var sanitize_1 = require("../../tools/serialisation/sanitize");
var experimentalFeatures_1 = require("../../tools/experimentalFeatures");
var polyfills_1 = require("../../tools/utils/polyfills");
var jsonStringify_1 = require("../../tools/serialisation/jsonStringify");
var consoleObservablesByApi = {};

@@ -50,3 +51,3 @@ function initConsoleObservable(apis) {

if (api === display_1.ConsoleApiName.error) {
var firstErrorParam = (0, utils_1.find)(params, function (param) { return param instanceof Error; });
var firstErrorParam = (0, polyfills_1.find)(params, function (param) { return param instanceof Error; });
stack = firstErrorParam ? (0, error_1.toStackTraceString)((0, tracekit_1.computeStackTrace)(firstErrorParam)) : undefined;

@@ -69,4 +70,4 @@ message = "console error: ".concat(message);

}
return (0, utils_1.jsonStringify)((0, experimentalFeatures_1.isExperimentalFeatureEnabled)(experimentalFeatures_1.ExperimentalFeature.SANITIZE_INPUTS) ? (0, sanitize_1.sanitize)(param) : param, undefined, 2);
return (0, jsonStringify_1.jsonStringify)((0, experimentalFeatures_1.isExperimentalFeatureEnabled)(experimentalFeatures_1.ExperimentalFeature.SANITIZE_INPUTS) ? (0, sanitize_1.sanitize)(param) : param, undefined, 2);
}
//# sourceMappingURL=consoleObservable.js.map
import type { StackTrace } from '../tracekit';
import type { ClocksState } from '../../tools/timeUtils';
import type { ClocksState } from '../../tools/utils/timeUtils';
export declare const NO_ERROR_STACK_PRESENT_MESSAGE = "No stack, consider using an instance of Error";

@@ -4,0 +4,0 @@ export declare const PROVIDED_ERROR_MESSAGE_PREFIX = "Provided";

@@ -7,4 +7,5 @@ "use strict";

var monitor_1 = require("../../tools/monitor");
var sanitize_1 = require("../../tools/sanitize");
var utils_1 = require("../../tools/utils");
var sanitize_1 = require("../../tools/serialisation/sanitize");
var functionUtils_1 = require("../../tools/utils/functionUtils");
var jsonStringify_1 = require("../../tools/serialisation/jsonStringify");
exports.NO_ERROR_STACK_PRESENT_MESSAGE = 'No stack, consider using an instance of Error';

@@ -32,3 +33,3 @@ exports.PROVIDED_ERROR_MESSAGE_PREFIX = 'Provided';

originalError: sanitizedError,
message: "".concat(nonErrorPrefix, " ").concat((0, utils_1.jsonStringify)(sanitizedError)),
message: "".concat(nonErrorPrefix, " ").concat((0, jsonStringify_1.jsonStringify)(sanitizedError)),
stack: 'No stack, consider using an instance of Error',

@@ -96,3 +97,3 @@ handlingStack: handlingStack,

catch (e) {
(0, utils_1.noop)();
(0, functionUtils_1.noop)();
}

@@ -99,0 +100,0 @@ }

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.trackRuntimeError = void 0;
var timeUtils_1 = require("../../tools/timeUtils");
var timeUtils_1 = require("../../tools/utils/timeUtils");
var tracekit_1 = require("../tracekit");

@@ -6,0 +6,0 @@ var error_1 = require("./error");

@@ -6,4 +6,3 @@ "use strict";

var error_1 = require("../error/error");
var timeUtils_1 = require("../../tools/timeUtils");
var utils_1 = require("../../tools/utils");
var timeUtils_1 = require("../../tools/utils/timeUtils");
function createEventRateLimiter(eventType, limit, onLimitReached) {

@@ -17,3 +16,3 @@ var eventCount = 0;

eventCount = 0;
}, utils_1.ONE_MINUTE);
}, timeUtils_1.ONE_MINUTE);
}

@@ -20,0 +19,0 @@ eventCount += 1;

@@ -7,4 +7,5 @@ "use strict";

var observable_1 = require("../../tools/observable");
var utils_1 = require("../../tools/utils");
var addEventListener_1 = require("../../browser/addEventListener");
var polyfills_1 = require("../../tools/utils/polyfills");
var stringUtils_1 = require("../../tools/utils/stringUtils");
exports.RawReportType = {

@@ -17,3 +18,3 @@ intervention: 'intervention',

var observables = [];
if ((0, utils_1.includes)(apis, exports.RawReportType.cspViolation)) {
if ((0, polyfills_1.includes)(apis, exports.RawReportType.cspViolation)) {
observables.push(createCspViolationReportObservable());

@@ -51,6 +52,5 @@ }

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

@@ -77,3 +77,3 @@ });

stack: buildStack(event.effectiveDirective, event.originalPolicy
? "".concat(message, " of the policy \"").concat((0, utils_1.safeTruncate)(event.originalPolicy, 100, '...'), "\"")
? "".concat(message, " of the policy \"").concat((0, stringUtils_1.safeTruncate)(event.originalPolicy, 100, '...'), "\"")
: 'no policy', event.sourceFile, event.lineNumber, event.columnNumber),

@@ -80,0 +80,0 @@ };

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SESSION_EXPIRATION_DELAY = exports.SESSION_TIME_OUT_DELAY = void 0;
var utils_1 = require("../../tools/utils");
exports.SESSION_TIME_OUT_DELAY = 4 * utils_1.ONE_HOUR;
exports.SESSION_EXPIRATION_DELAY = 15 * utils_1.ONE_MINUTE;
var timeUtils_1 = require("../../tools/utils/timeUtils");
exports.SESSION_TIME_OUT_DELAY = 4 * timeUtils_1.ONE_HOUR;
exports.SESSION_EXPIRATION_DELAY = 15 * timeUtils_1.ONE_MINUTE;
//# sourceMappingURL=sessionConstants.js.map
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });

@@ -29,5 +6,7 @@ exports.deleteSessionCookie = exports.retrieveSessionCookie = exports.toSessionString = exports.persistSessionCookie = exports.withCookieLockAccess = exports.MAX_NUMBER_OF_LOCK_RETRIES = exports.LOCK_RETRY_DELAY = exports.SESSION_COOKIE_NAME = void 0;

var timer_1 = require("../../tools/timer");
var browserDetection_1 = require("../../tools/browserDetection");
var timeUtils_1 = require("../../tools/timeUtils");
var utils = __importStar(require("../../tools/utils"));
var browserDetection_1 = require("../../tools/utils/browserDetection");
var timeUtils_1 = require("../../tools/utils/timeUtils");
var polyfills_1 = require("../../tools/utils/polyfills");
var objectUtils_1 = require("../../tools/utils/objectUtils");
var stringUtils_1 = require("../../tools/utils/stringUtils");
var sessionConstants_1 = require("./sessionConstants");

@@ -65,3 +44,3 @@ var SESSION_ENTRY_REGEXP = /^([a-z]+)=([a-z0-9-]+)$/;

// acquire lock
currentLock = utils.generateUUID();
currentLock = (0, stringUtils_1.generateUUID)();
currentSession.lock = currentLock;

@@ -141,4 +120,3 @@ setSessionCookie(currentSession, operations.options);

function toSessionString(session) {
return utils
.objectEntries(session)
return (0, polyfills_1.objectEntries)(session)
.map(function (_a) {

@@ -175,4 +153,4 @@ var key = _a[0], value = _a[1];

function isExpiredState(session) {
return utils.isEmptyObject(session);
return (0, objectUtils_1.isEmptyObject)(session);
}
//# sourceMappingURL=sessionCookieStore.js.map
import type { CookieOptions } from '../../browser/cookie';
import type { Observable } from '../../tools/observable';
import type { Context } from '../../tools/context';
import type { RelativeTime } from '../../tools/timeUtils';
import type { Context } from '../../tools/serialisation/context';
import type { RelativeTime } from '../../tools/utils/timeUtils';
export interface SessionManager<TrackingType extends string> {

@@ -6,0 +6,0 @@ findActiveSession: (startTime?: RelativeTime) => SessionContext<TrackingType> | undefined;

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.stopSessionManager = exports.startSessionManager = exports.VISIBILITY_CHECK_DELAY = void 0;
var utils = __importStar(require("../../tools/utils"));
var contextHistory_1 = require("../../tools/contextHistory");
var timeUtils_1 = require("../../tools/timeUtils");
var valueHistory_1 = require("../../tools/valueHistory");
var timeUtils_1 = require("../../tools/utils/timeUtils");
var addEventListener_1 = require("../../browser/addEventListener");

@@ -35,3 +11,3 @@ var timer_1 = require("../../tools/timer");

var sessionConstants_1 = require("./sessionConstants");
exports.VISIBILITY_CHECK_DELAY = utils.ONE_MINUTE;
exports.VISIBILITY_CHECK_DELAY = timeUtils_1.ONE_MINUTE;
var SESSION_CONTEXT_TIMEOUT_DELAY = sessionConstants_1.SESSION_TIME_OUT_DELAY;

@@ -43,3 +19,3 @@ var stopCallbacks = [];

stopCallbacks.push(function () { return sessionStore.stop(); });
var sessionContextHistory = new contextHistory_1.ContextHistory(SESSION_CONTEXT_TIMEOUT_DELAY);
var sessionContextHistory = new valueHistory_1.ValueHistory(SESSION_CONTEXT_TIMEOUT_DELAY);
stopCallbacks.push(function () { return sessionContextHistory.stop(); });

@@ -46,0 +22,0 @@ sessionStore.renewObservable.subscribe(function () {

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });

@@ -30,4 +7,5 @@ exports.startSessionStore = void 0;

var observable_1 = require("../../tools/observable");
var timeUtils_1 = require("../../tools/timeUtils");
var utils = __importStar(require("../../tools/utils"));
var timeUtils_1 = require("../../tools/utils/timeUtils");
var functionUtils_1 = require("../../tools/utils/functionUtils");
var stringUtils_1 = require("../../tools/utils/stringUtils");
var sessionConstants_1 = require("./sessionConstants");

@@ -99,3 +77,3 @@ var sessionCookieStore_1 = require("./sessionCookieStore");

if (isTracked && !cookieSession.id) {
cookieSession.id = utils.generateUUID();
cookieSession.id = (0, stringUtils_1.generateUUID)();
cookieSession.created = String((0, timeUtils_1.dateNow)());

@@ -133,3 +111,3 @@ }

return {
expandOrRenewSession: utils.throttle(expandOrRenewSession, cookie_1.COOKIE_ACCESS_DELAY).throttled,
expandOrRenewSession: (0, functionUtils_1.throttle)(expandOrRenewSession, cookie_1.COOKIE_ACCESS_DELAY).throttled,
expandSession: expandSession,

@@ -136,0 +114,0 @@ getSession: function () { return sessionCache; },

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

import type { Context } from '../../tools/context';
import type { Context } from '../../tools/serialisation/context';
import type { Configuration } from '../configuration';

@@ -3,0 +3,0 @@ import type { StackTrace } from '../tracekit';

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

var error_1 = require("../error/error");
var utils_1 = require("../../tools/utils");
var experimentalFeatures_1 = require("../../tools/experimentalFeatures");

@@ -12,5 +11,9 @@ var configuration_1 = require("../configuration");

var observable_1 = require("../../tools/observable");
var timeUtils_1 = require("../../tools/timeUtils");
var timeUtils_1 = require("../../tools/utils/timeUtils");
var monitor_1 = require("../../tools/monitor");
var sendToExtension_1 = require("../../tools/sendToExtension");
var polyfills_1 = require("../../tools/utils/polyfills");
var numberUtils_1 = require("../../tools/utils/numberUtils");
var jsonStringify_1 = require("../../tools/serialisation/jsonStringify");
var mergeInto_1 = require("../../tools/mergeInto");
var rawTelemetryEvent_types_1 = require("./rawTelemetryEvent.types");

@@ -30,5 +33,5 @@ var ALLOWED_FRAME_URLS = [

telemetryConfiguration.telemetryEnabled =
!(0, utils_1.includes)(TELEMETRY_EXCLUDED_SITES, configuration.site) && (0, utils_1.performDraw)(configuration.telemetrySampleRate);
!(0, polyfills_1.includes)(TELEMETRY_EXCLUDED_SITES, configuration.site) && (0, numberUtils_1.performDraw)(configuration.telemetrySampleRate);
telemetryConfiguration.telemetryConfigurationEnabled =
telemetryConfiguration.telemetryEnabled && (0, utils_1.performDraw)(configuration.telemetryConfigurationSampleRate);
telemetryConfiguration.telemetryEnabled && (0, numberUtils_1.performDraw)(configuration.telemetryConfigurationSampleRate);
onRawTelemetryEventCollected = function (rawEvent) {

@@ -42,3 +45,3 @@ if (telemetryConfiguration.telemetryEnabled) {

(0, monitor_1.startMonitorErrorCollection)(addTelemetryError);
(0, utils_1.assign)(telemetryConfiguration, {
(0, polyfills_1.assign)(telemetryConfiguration, {
maxEventsPerPage: configuration.maxTelemetryEventsPerPage,

@@ -48,7 +51,7 @@ sentEventCount: 0,

function toTelemetryEvent(telemetryService, event) {
return (0, utils_1.combine)({
return (0, mergeInto_1.combine)({
type: 'telemetry',
date: (0, timeUtils_1.timeStampNow)(),
service: telemetryService,
version: "4.38.0",
version: "4.39.0",
source: 'browser',

@@ -59,3 +62,3 @@ _dd: {

telemetry: event,
experimental_features: (0, utils_1.arrayFrom)((0, experimentalFeatures_1.getExperimentalFeatures)()),
experimental_features: (0, polyfills_1.arrayFrom)((0, experimentalFeatures_1.getExperimentalFeatures)()),
}, contextProvider !== undefined ? contextProvider() : {});

@@ -74,3 +77,3 @@ }

var events = [];
(0, utils_1.assign)(telemetryConfiguration, {
(0, polyfills_1.assign)(telemetryConfiguration, {
maxEventsPerPage: Infinity,

@@ -99,3 +102,3 @@ sentEventCount: 0,

(0, monitor_1.displayIfDebugEnabled)(display_1.ConsoleApiName.debug, message, context);
addTelemetry((0, utils_1.assign)({
addTelemetry((0, polyfills_1.assign)({
type: rawTelemetryEvent_types_1.TelemetryType.log,

@@ -108,3 +111,3 @@ message: message,

function addTelemetryError(e) {
addTelemetry((0, utils_1.assign)({
addTelemetry((0, polyfills_1.assign)({
type: rawTelemetryEvent_types_1.TelemetryType.log,

@@ -145,3 +148,3 @@ status: "error" /* StatusType.error */,

},
message: "Uncaught ".concat((0, utils_1.jsonStringify)(e)),
message: "Uncaught ".concat((0, jsonStringify_1.jsonStringify)(e)),
};

@@ -151,3 +154,3 @@ }

function scrubCustomerFrames(stackTrace) {
stackTrace.stack = stackTrace.stack.filter(function (frame) { return !frame.url || ALLOWED_FRAME_URLS.some(function (allowedFrameUrl) { return (0, utils_1.startsWith)(frame.url, allowedFrameUrl); }); });
stackTrace.stack = stackTrace.stack.filter(function (frame) { return !frame.url || ALLOWED_FRAME_URLS.some(function (allowedFrameUrl) { return (0, polyfills_1.startsWith)(frame.url, allowedFrameUrl); }); });
return stackTrace;

@@ -154,0 +157,0 @@ }

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.computeStackTrace = void 0;
var utils_1 = require("../../tools/utils");
var polyfills_1 = require("../../tools/utils/polyfills");
var UNKNOWN_FUNCTION = '?';

@@ -13,3 +13,3 @@ /**

var exString = String(ex);
if (stackProperty && (0, utils_1.startsWith)(stackProperty, exString)) {
if (stackProperty && (0, polyfills_1.startsWith)(stackProperty, exString)) {
stackProperty = stackProperty.slice(exString.length);

@@ -35,3 +35,3 @@ }

exports.computeStackTrace = computeStackTrace;
var fileUrl = '((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\\w+\\.|\\/).*?)';
var fileUrl = '((?:file|https?|blob|chrome-extension|native|eval|webpack|snippet|<anonymous>|\\w+\\.|\\/).*?)';
var filePosition = '(?::(\\d+))';

@@ -38,0 +38,0 @@ var CHROME_LINE_RE = new RegExp("^\\s*at (.*?) ?\\(".concat(fileUrl).concat(filePosition, "?").concat(filePosition, "?\\)?\\s*$"), 'i');

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

import type { Context } from '../../tools/context';
import type { Context } from '../../tools/serialisation/context';
import type { User } from './user.types';

@@ -3,0 +3,0 @@ /**

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

var display_1 = require("../../tools/display");
var utils_1 = require("../../tools/utils");
var typeUtils_1 = require("../../tools/utils/typeUtils");
var polyfills_1 = require("../../tools/utils/polyfills");
/**

@@ -14,3 +15,3 @@ * Clone input data and ensure known user properties (id, name, email)

// We shallow clone only to prevent mutation of user data.
var user = (0, utils_1.assign)({}, newUser);
var user = (0, polyfills_1.assign)({}, newUser);
var keys = ['id', 'name', 'email'];

@@ -29,3 +30,3 @@ keys.forEach(function (key) {

function checkUser(newUser) {
var isValid = (0, utils_1.getType)(newUser) === 'object';
var isValid = (0, typeUtils_1.getType)(newUser) === 'object';
if (!isValid) {

@@ -32,0 +33,0 @@ display_1.display.error('Unsupported user:', newUser);

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

export { Configuration, InitConfiguration, buildCookieOptions, validateAndBuildConfiguration, DefaultPrivacyLevel, EndpointBuilder, serializeConfiguration, } from './domain/configuration';
export { Configuration, InitConfiguration, buildCookieOptions, validateAndBuildConfiguration, DefaultPrivacyLevel, EndpointBuilder, serializeConfiguration, INTAKE_SITE_AP1, INTAKE_SITE_STAGING, INTAKE_SITE_US1, INTAKE_SITE_US1_FED, INTAKE_SITE_EU1, } from './domain/configuration';
export { isExperimentalFeatureEnabled, addExperimentalFeatures, resetExperimentalFeatures, getExperimentalFeatures, ExperimentalFeature, } from './tools/experimentalFeatures';

@@ -12,11 +12,11 @@ export { trackRuntimeError } from './domain/error/trackRuntimeError';

export { SESSION_TIME_OUT_DELAY, } from './domain/session/sessionConstants';
export { HttpRequest, Payload, createHttpRequest, Batch, BatchFlushEvent, canUseEventBridge, getEventBridge, startBatchWithReplica, } from './transport';
export { HttpRequest, Payload, createHttpRequest, Batch, canUseEventBridge, getEventBridge, startBatchWithReplica, createFlushController, FlushEvent, FlushReason, } from './transport';
export * from './tools/display';
export * from './tools/urlPolyfill';
export * from './tools/timeUtils';
export * from './tools/utils';
export * from './tools/sanitize';
export * from './tools/utils/urlPolyfill';
export * from './tools/utils/timeUtils';
export * from './tools/utils/arrayUtils';
export * from './tools/serialisation/sanitize';
export * from './tools/getGlobalObject';
export * from './domain/eventRateLimiter/createEventRateLimiter';
export * from './tools/browserDetection';
export * from './tools/utils/browserDetection';
export { sendToExtension } from './tools/sendToExtension';

@@ -27,3 +27,3 @@ export { runOnReadyState } from './browser/runOnReadyState';

export { ErrorSource, ErrorHandling, computeRawError, createHandlingStack, RawError, RawErrorCause, ErrorWithCause, toStackTraceString, getFileFromStackTraceString, NO_ERROR_STACK_PRESENT_MESSAGE, PROVIDED_ERROR_MESSAGE_PREFIX, } from './domain/error/error';
export { Context, ContextArray, ContextValue } from './tools/context';
export { Context, ContextArray, ContextValue } from './tools/serialisation/context';
export { areCookiesAuthorized, getCookie, setCookie, deleteCookie, COOKIE_ACCESS_DELAY } from './browser/cookie';

@@ -38,6 +38,5 @@ export { initXhrObservable, XhrCompleteContext, XhrStartContext } from './browser/xhrObservable';

export { catchUserErrors } from './tools/catchUserErrors';
export { createContextManager, ContextManager } from './tools/contextManager';
export { warnIfCustomerDataLimitReached, CustomerDataType } from './tools/heavyCustomerDataWarning';
export { limitModification } from './tools/limitModification';
export { ContextHistory, ContextHistoryEntry, CLEAR_OLD_CONTEXTS_INTERVAL } from './tools/contextHistory';
export { createContextManager, ContextManager } from './tools/serialisation/contextManager';
export { warnIfCustomerDataLimitReached, CustomerDataType, CUSTOMER_DATA_BYTES_LIMIT, } from './tools/serialisation/heavyCustomerDataWarning';
export { ValueHistory, ValueHistoryEntry, CLEAR_OLD_VALUES_INTERVAL } from './tools/valueHistory';
export { readBytesFromStream } from './tools/readBytesFromStream';

@@ -47,1 +46,13 @@ export { SESSION_COOKIE_NAME } from './domain/session/sessionCookieStore';

export { User, checkUser, sanitizeUser } from './domain/user';
export * from './domain/resourceUtils';
export * from './tools/utils/polyfills';
export * from './tools/utils/numberUtils';
export * from './tools/utils/byteUtils';
export * from './tools/utils/objectUtils';
export * from './tools/utils/functionUtils';
export * from './tools/serialisation/jsonStringify';
export * from './tools/mergeInto';
export * from './tools/utils/stringUtils';
export * from './tools/matchOption';
export * from './tools/utils/responseUtils';
export * from './tools/utils/typeUtils';

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

Object.defineProperty(exports, "__esModule", { value: true });
exports.getCookie = exports.areCookiesAuthorized = exports.PROVIDED_ERROR_MESSAGE_PREFIX = exports.NO_ERROR_STACK_PRESENT_MESSAGE = exports.getFileFromStackTraceString = exports.toStackTraceString = exports.createHandlingStack = exports.computeRawError = exports.ErrorSource = exports.instrumentSetter = exports.instrumentMethodAndCallOriginal = exports.instrumentMethod = exports.getZoneJsOriginalValue = exports.runOnReadyState = exports.sendToExtension = exports.startBatchWithReplica = exports.getEventBridge = exports.canUseEventBridge = exports.Batch = exports.createHttpRequest = exports.SESSION_TIME_OUT_DELAY = exports.stopSessionManager = exports.startSessionManager = exports.Observable = exports.setDebugMode = exports.callMonitored = exports.monitor = exports.monitored = exports.addTelemetryConfiguration = exports.isTelemetryReplicationAllowed = exports.resetTelemetry = exports.startFakeTelemetry = exports.addTelemetryError = exports.addTelemetryDebug = exports.startTelemetry = exports.RawReportType = exports.initReportObservable = exports.makePublicApi = exports.defineGlobal = exports.computeStackTrace = exports.trackRuntimeError = exports.ExperimentalFeature = exports.getExperimentalFeatures = exports.resetExperimentalFeatures = exports.addExperimentalFeatures = exports.isExperimentalFeatureEnabled = exports.serializeConfiguration = exports.DefaultPrivacyLevel = exports.validateAndBuildConfiguration = exports.buildCookieOptions = void 0;
exports.sanitizeUser = exports.checkUser = exports.getSyntheticsResultId = exports.getSyntheticsTestId = exports.willSyntheticsInjectRum = exports.SESSION_COOKIE_NAME = exports.readBytesFromStream = exports.CLEAR_OLD_CONTEXTS_INTERVAL = exports.ContextHistory = exports.limitModification = exports.warnIfCustomerDataLimitReached = exports.createContextManager = exports.catchUserErrors = exports.BoundedBuffer = exports.initConsoleObservable = exports.isPageExitReason = exports.PageExitReason = exports.createPageExitObservable = exports.initFetchObservable = exports.initXhrObservable = exports.COOKIE_ACCESS_DELAY = exports.deleteCookie = exports.setCookie = void 0;
exports.createHandlingStack = exports.computeRawError = exports.ErrorSource = exports.instrumentSetter = exports.instrumentMethodAndCallOriginal = exports.instrumentMethod = exports.getZoneJsOriginalValue = exports.runOnReadyState = exports.sendToExtension = exports.createFlushController = exports.startBatchWithReplica = exports.getEventBridge = exports.canUseEventBridge = exports.Batch = exports.createHttpRequest = exports.SESSION_TIME_OUT_DELAY = exports.stopSessionManager = exports.startSessionManager = exports.Observable = exports.setDebugMode = exports.callMonitored = exports.monitor = exports.monitored = exports.addTelemetryConfiguration = exports.isTelemetryReplicationAllowed = exports.resetTelemetry = exports.startFakeTelemetry = exports.addTelemetryError = exports.addTelemetryDebug = exports.startTelemetry = exports.RawReportType = exports.initReportObservable = exports.makePublicApi = exports.defineGlobal = exports.computeStackTrace = exports.trackRuntimeError = exports.ExperimentalFeature = exports.getExperimentalFeatures = exports.resetExperimentalFeatures = exports.addExperimentalFeatures = exports.isExperimentalFeatureEnabled = exports.INTAKE_SITE_EU1 = exports.INTAKE_SITE_US1_FED = exports.INTAKE_SITE_US1 = exports.INTAKE_SITE_STAGING = exports.INTAKE_SITE_AP1 = exports.serializeConfiguration = exports.DefaultPrivacyLevel = exports.validateAndBuildConfiguration = exports.buildCookieOptions = void 0;
exports.sanitizeUser = exports.checkUser = exports.getSyntheticsResultId = exports.getSyntheticsTestId = exports.willSyntheticsInjectRum = exports.SESSION_COOKIE_NAME = exports.readBytesFromStream = exports.CLEAR_OLD_VALUES_INTERVAL = exports.ValueHistory = exports.CUSTOMER_DATA_BYTES_LIMIT = exports.warnIfCustomerDataLimitReached = exports.createContextManager = exports.catchUserErrors = exports.BoundedBuffer = exports.initConsoleObservable = exports.isPageExitReason = exports.PageExitReason = exports.createPageExitObservable = exports.initFetchObservable = exports.initXhrObservable = exports.COOKIE_ACCESS_DELAY = exports.deleteCookie = exports.setCookie = exports.getCookie = exports.areCookiesAuthorized = exports.PROVIDED_ERROR_MESSAGE_PREFIX = exports.NO_ERROR_STACK_PRESENT_MESSAGE = exports.getFileFromStackTraceString = exports.toStackTraceString = void 0;
var configuration_1 = require("./domain/configuration");

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

Object.defineProperty(exports, "serializeConfiguration", { enumerable: true, get: function () { return configuration_1.serializeConfiguration; } });
Object.defineProperty(exports, "INTAKE_SITE_AP1", { enumerable: true, get: function () { return configuration_1.INTAKE_SITE_AP1; } });
Object.defineProperty(exports, "INTAKE_SITE_STAGING", { enumerable: true, get: function () { return configuration_1.INTAKE_SITE_STAGING; } });
Object.defineProperty(exports, "INTAKE_SITE_US1", { enumerable: true, get: function () { return configuration_1.INTAKE_SITE_US1; } });
Object.defineProperty(exports, "INTAKE_SITE_US1_FED", { enumerable: true, get: function () { return configuration_1.INTAKE_SITE_US1_FED; } });
Object.defineProperty(exports, "INTAKE_SITE_EU1", { enumerable: true, get: function () { return configuration_1.INTAKE_SITE_EU1; } });
var experimentalFeatures_1 = require("./tools/experimentalFeatures");

@@ -69,10 +74,11 @@ Object.defineProperty(exports, "isExperimentalFeatureEnabled", { enumerable: true, get: function () { return experimentalFeatures_1.isExperimentalFeatureEnabled; } });

Object.defineProperty(exports, "startBatchWithReplica", { enumerable: true, get: function () { return transport_1.startBatchWithReplica; } });
Object.defineProperty(exports, "createFlushController", { enumerable: true, get: function () { return transport_1.createFlushController; } });
__exportStar(require("./tools/display"), exports);
__exportStar(require("./tools/urlPolyfill"), exports);
__exportStar(require("./tools/timeUtils"), exports);
__exportStar(require("./tools/utils"), exports);
__exportStar(require("./tools/sanitize"), exports);
__exportStar(require("./tools/utils/urlPolyfill"), exports);
__exportStar(require("./tools/utils/timeUtils"), exports);
__exportStar(require("./tools/utils/arrayUtils"), exports);
__exportStar(require("./tools/serialisation/sanitize"), exports);
__exportStar(require("./tools/getGlobalObject"), exports);
__exportStar(require("./domain/eventRateLimiter/createEventRateLimiter"), exports);
__exportStar(require("./tools/browserDetection"), exports);
__exportStar(require("./tools/utils/browserDetection"), exports);
var sendToExtension_1 = require("./tools/sendToExtension");

@@ -118,11 +124,10 @@ Object.defineProperty(exports, "sendToExtension", { enumerable: true, get: function () { return sendToExtension_1.sendToExtension; } });

Object.defineProperty(exports, "catchUserErrors", { enumerable: true, get: function () { return catchUserErrors_1.catchUserErrors; } });
var contextManager_1 = require("./tools/contextManager");
var contextManager_1 = require("./tools/serialisation/contextManager");
Object.defineProperty(exports, "createContextManager", { enumerable: true, get: function () { return contextManager_1.createContextManager; } });
var heavyCustomerDataWarning_1 = require("./tools/heavyCustomerDataWarning");
var heavyCustomerDataWarning_1 = require("./tools/serialisation/heavyCustomerDataWarning");
Object.defineProperty(exports, "warnIfCustomerDataLimitReached", { enumerable: true, get: function () { return heavyCustomerDataWarning_1.warnIfCustomerDataLimitReached; } });
var limitModification_1 = require("./tools/limitModification");
Object.defineProperty(exports, "limitModification", { enumerable: true, get: function () { return limitModification_1.limitModification; } });
var contextHistory_1 = require("./tools/contextHistory");
Object.defineProperty(exports, "ContextHistory", { enumerable: true, get: function () { return contextHistory_1.ContextHistory; } });
Object.defineProperty(exports, "CLEAR_OLD_CONTEXTS_INTERVAL", { enumerable: true, get: function () { return contextHistory_1.CLEAR_OLD_CONTEXTS_INTERVAL; } });
Object.defineProperty(exports, "CUSTOMER_DATA_BYTES_LIMIT", { enumerable: true, get: function () { return heavyCustomerDataWarning_1.CUSTOMER_DATA_BYTES_LIMIT; } });
var valueHistory_1 = require("./tools/valueHistory");
Object.defineProperty(exports, "ValueHistory", { enumerable: true, get: function () { return valueHistory_1.ValueHistory; } });
Object.defineProperty(exports, "CLEAR_OLD_VALUES_INTERVAL", { enumerable: true, get: function () { return valueHistory_1.CLEAR_OLD_VALUES_INTERVAL; } });
var readBytesFromStream_1 = require("./tools/readBytesFromStream");

@@ -139,2 +144,14 @@ Object.defineProperty(exports, "readBytesFromStream", { enumerable: true, get: function () { return readBytesFromStream_1.readBytesFromStream; } });

Object.defineProperty(exports, "sanitizeUser", { enumerable: true, get: function () { return user_1.sanitizeUser; } });
__exportStar(require("./domain/resourceUtils"), exports);
__exportStar(require("./tools/utils/polyfills"), exports);
__exportStar(require("./tools/utils/numberUtils"), exports);
__exportStar(require("./tools/utils/byteUtils"), exports);
__exportStar(require("./tools/utils/objectUtils"), exports);
__exportStar(require("./tools/utils/functionUtils"), exports);
__exportStar(require("./tools/serialisation/jsonStringify"), exports);
__exportStar(require("./tools/mergeInto"), exports);
__exportStar(require("./tools/utils/stringUtils"), exports);
__exportStar(require("./tools/matchOption"), exports);
__exportStar(require("./tools/utils/responseUtils"), exports);
__exportStar(require("./tools/utils/typeUtils"), exports);
//# sourceMappingURL=index.js.map

@@ -12,5 +12,3 @@ /**

PAGEHIDE = "pagehide",
SHADOW_DOM_DEBUG = "shadow_dom_debug",
FEATURE_FLAGS = "feature_flags",
RESOURCE_DURATIONS = "resource_durations",
RESOURCE_PAGE_STATES = "resource_page_states",

@@ -17,0 +15,0 @@ CLICKMAP = "clickmap",

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

ExperimentalFeature["PAGEHIDE"] = "pagehide";
ExperimentalFeature["SHADOW_DOM_DEBUG"] = "shadow_dom_debug";
ExperimentalFeature["FEATURE_FLAGS"] = "feature_flags";
ExperimentalFeature["RESOURCE_DURATIONS"] = "resource_durations";
ExperimentalFeature["RESOURCE_PAGE_STATES"] = "resource_page_states";

@@ -24,0 +22,0 @@ ExperimentalFeature["CLICKMAP"] = "clickmap";

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

import { noop } from './utils';
import { noop } from './utils/functionUtils';
export declare function instrumentMethod<OBJECT extends {

@@ -3,0 +3,0 @@ [key: string]: any;

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

var monitor_1 = require("./monitor");
var utils_1 = require("./utils");
var functionUtils_1 = require("./utils/functionUtils");
function instrumentMethod(object, method, instrumentationFactory) {

@@ -56,3 +56,3 @@ var original = object[method];

if (!originalDescriptor || !originalDescriptor.set || !originalDescriptor.configurable) {
return { stop: utils_1.noop };
return { stop: functionUtils_1.noop };
}

@@ -79,3 +79,3 @@ var instrumentation = function (thisObject, value) {

else {
instrumentation = utils_1.noop;
instrumentation = functionUtils_1.noop;
}

@@ -82,0 +82,0 @@ },

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

var monitor_1 = require("./monitor");
var utils_1 = require("./utils");
var functionUtils_1 = require("./utils/functionUtils");
/**

@@ -39,3 +39,3 @@ * Read bytes from a ReadableStream until at least `limit` bytes have been read (or until the end of

// as an unhandled rejection
utils_1.noop);
functionUtils_1.noop);
var bytes;

@@ -42,0 +42,0 @@ var limitExceeded;

@@ -1,26 +0,14 @@

import type { Context } from '../tools/context';
import { Observable } from '../tools/observable';
import type { PageExitEvent } from '../browser/pageExitObservable';
import type { Context } from '../tools/serialisation/context';
import type { HttpRequest } from './httpRequest';
export interface BatchFlushEvent {
bufferBytesCount: number;
bufferMessagesCount: number;
}
export type FlushReason = 'batch_duration_limit' | 'batch_bytes_limit' | 'before_unload' | 'page_hide' | 'visibility_hidden' | 'page_frozen';
import type { FlushController } from './flushController';
export declare class Batch {
private request;
private batchMessagesLimit;
private batchBytesLimit;
private flushController;
private messageBytesLimit;
private flushTimeout;
private pageExitObservable;
flushObservable: Observable<BatchFlushEvent>;
private pushOnlyBuffer;
private upsertBuffer;
private bufferBytesCount;
private bufferMessagesCount;
constructor(request: HttpRequest, batchMessagesLimit: number, batchBytesLimit: number, messageBytesLimit: number, flushTimeout: number, pageExitObservable: Observable<PageExitEvent>);
constructor(request: HttpRequest, flushController: FlushController, messageBytesLimit: number);
add(message: Context): void;
upsert(message: Context, key: string): void;
flush(flushReason: FlushReason, sendFn?: (payload: import("./httpRequest").Payload) => void): void;
private flush;
private addOrUpdate;

@@ -31,5 +19,2 @@ private process;

private hasMessageFor;
private willReachedBytesLimitWith;
private isFull;
private flushPeriodically;
}

@@ -5,21 +5,15 @@ "use strict";

var display_1 = require("../tools/display");
var utils_1 = require("../tools/utils");
var observable_1 = require("../tools/observable");
var timer_1 = require("../tools/timer");
var polyfills_1 = require("../tools/utils/polyfills");
var pageExitObservable_1 = require("../browser/pageExitObservable");
var byteUtils_1 = require("../tools/utils/byteUtils");
var jsonStringify_1 = require("../tools/serialisation/jsonStringify");
var Batch = /** @class */ (function () {
function Batch(request, batchMessagesLimit, batchBytesLimit, messageBytesLimit, flushTimeout, pageExitObservable) {
function Batch(request, flushController, messageBytesLimit) {
var _this = this;
this.request = request;
this.batchMessagesLimit = batchMessagesLimit;
this.batchBytesLimit = batchBytesLimit;
this.flushController = flushController;
this.messageBytesLimit = messageBytesLimit;
this.flushTimeout = flushTimeout;
this.pageExitObservable = pageExitObservable;
this.flushObservable = new observable_1.Observable();
this.pushOnlyBuffer = [];
this.upsertBuffer = {};
this.bufferBytesCount = 0;
this.bufferMessagesCount = 0;
pageExitObservable.subscribe(function (event) { return _this.flush(event.reason, _this.request.sendOnExit); });
this.flushPeriodically();
this.flushController.flushObservable.subscribe(function (event) { return _this.flush(event); });
}

@@ -32,17 +26,13 @@ Batch.prototype.add = function (message) {

};
Batch.prototype.flush = function (flushReason, sendFn) {
if (sendFn === void 0) { sendFn = this.request.send; }
if (this.bufferMessagesCount !== 0) {
var messages = this.pushOnlyBuffer.concat((0, utils_1.objectValues)(this.upsertBuffer));
var bytesCount = this.bufferBytesCount;
this.flushObservable.notify({
bufferBytesCount: this.bufferBytesCount,
bufferMessagesCount: this.bufferMessagesCount,
});
this.pushOnlyBuffer = [];
this.upsertBuffer = {};
this.bufferBytesCount = 0;
this.bufferMessagesCount = 0;
sendFn({ data: messages.join('\n'), bytesCount: bytesCount, flushReason: flushReason });
Batch.prototype.flush = function (event) {
var messages = this.pushOnlyBuffer.concat((0, polyfills_1.objectValues)(this.upsertBuffer));
this.pushOnlyBuffer = [];
this.upsertBuffer = {};
var payload = { data: messages.join('\n'), bytesCount: event.bytesCount, flushReason: event.reason };
if ((0, pageExitObservable_1.isPageExitReason)(event.reason)) {
this.request.sendOnExit(payload);
}
else {
this.request.send(payload);
}
};

@@ -58,20 +48,13 @@ Batch.prototype.addOrUpdate = function (message, key) {

}
if (this.willReachedBytesLimitWith(messageBytesCount)) {
this.flush('batch_bytes_limit');
}
this.push(processedMessage, messageBytesCount, key);
if (this.isFull()) {
this.flush('batch_bytes_limit');
}
};
Batch.prototype.process = function (message) {
var processedMessage = (0, utils_1.jsonStringify)(message);
var messageBytesCount = (0, utils_1.computeBytesCount)(processedMessage);
var processedMessage = (0, jsonStringify_1.jsonStringify)(message);
var messageBytesCount = (0, byteUtils_1.computeBytesCount)(processedMessage);
return { processedMessage: processedMessage, messageBytesCount: messageBytesCount };
};
Batch.prototype.push = function (processedMessage, messageBytesCount, key) {
if (this.bufferMessagesCount > 0) {
// \n separator at serialization
this.bufferBytesCount += 1;
}
// If there are other messages, a '\n' will be added at serialization
var separatorBytesCount = this.flushController.messagesCount > 0 ? 1 : 0;
this.flushController.notifyBeforeAddMessage(messageBytesCount + separatorBytesCount);
if (key !== undefined) {

@@ -83,4 +66,3 @@ this.upsertBuffer[key] = processedMessage;

}
this.bufferBytesCount += messageBytesCount;
this.bufferMessagesCount += 1;
this.flushController.notifyAfterAddMessage();
};

@@ -90,8 +72,6 @@ Batch.prototype.remove = function (key) {

delete this.upsertBuffer[key];
var messageBytesCount = (0, utils_1.computeBytesCount)(removedMessage);
this.bufferBytesCount -= messageBytesCount;
this.bufferMessagesCount -= 1;
if (this.bufferMessagesCount > 0) {
this.bufferBytesCount -= 1;
}
var messageBytesCount = (0, byteUtils_1.computeBytesCount)(removedMessage);
// If there are other messages, a '\n' will be added at serialization
var separatorBytesCount = this.flushController.messagesCount > 1 ? 1 : 0;
this.flushController.notifyAfterRemoveMessage(messageBytesCount + separatorBytesCount);
};

@@ -101,16 +81,2 @@ Batch.prototype.hasMessageFor = function (key) {

};
Batch.prototype.willReachedBytesLimitWith = function (messageBytesCount) {
// byte of the separator at the end of the message
return this.bufferBytesCount + messageBytesCount + 1 >= this.batchBytesLimit;
};
Batch.prototype.isFull = function () {
return this.bufferMessagesCount === this.batchMessagesLimit || this.bufferBytesCount >= this.batchBytesLimit;
};
Batch.prototype.flushPeriodically = function () {
var _this = this;
(0, timer_1.setTimeout)(function () {
_this.flush('batch_duration_limit');
_this.flushPeriodically();
}, this.flushTimeout);
};
return Batch;

@@ -117,0 +83,0 @@ }());

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.canUseEventBridge = exports.getEventBridge = void 0;
var utils_1 = require("../tools/utils");
var polyfills_1 = require("../tools/utils/polyfills");
var getGlobalObject_1 = require("../tools/getGlobalObject");

@@ -28,3 +28,3 @@ function getEventBridge() {

.getAllowedWebViewHosts()
.some(function (allowedHost) { return currentHost === allowedHost || (0, utils_1.endsWith)(currentHost, ".".concat(allowedHost)); }));
.some(function (allowedHost) { return currentHost === allowedHost || (0, polyfills_1.endsWith)(currentHost, ".".concat(allowedHost)); }));
}

@@ -31,0 +31,0 @@ exports.canUseEventBridge = canUseEventBridge;

import type { EndpointBuilder } from '../domain/configuration';
import type { Context } from '../tools/context';
import type { Context } from '../tools/serialisation/context';
import type { RawError } from '../domain/error/error';
import type { FlushReason } from './batch';
import type { FlushReason } from './flushController';
/**

@@ -6,0 +6,0 @@ * Use POST request without content type to:

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

var monitor_1 = require("../tools/monitor");
var addEventListener_1 = require("../browser/addEventListener");
var sendWithRetryStrategy_1 = require("./sendWithRetryStrategy");

@@ -80,10 +81,10 @@ function createHttpRequest(endpointBuilder, bytesLimit, reportError) {

var request = new XMLHttpRequest();
var onLoadEnd = (0, monitor_1.monitor)(function () {
request.open('POST', url, true);
(0, addEventListener_1.addEventListener)(request, 'loadend', function () {
onResponse === null || onResponse === void 0 ? void 0 : onResponse({ status: request.status });
}, {
// prevent multiple onResponse callbacks
// if the xhr instance is reused by a third party
request.removeEventListener('loadend', onLoadEnd);
onResponse === null || onResponse === void 0 ? void 0 : onResponse({ status: request.status });
once: true,
});
request.open('POST', url, true);
request.addEventListener('loadend', onLoadEnd);
request.send(data);

@@ -90,0 +91,0 @@ }

export { HttpRequest, createHttpRequest, Payload, RetryInfo } from './httpRequest';
export { Batch, BatchFlushEvent, FlushReason } from './batch';
export { Batch } from './batch';
export { canUseEventBridge, getEventBridge, BrowserWindowWithEventBridge } from './eventBridge';
export { startBatchWithReplica } from './startBatchWithReplica';
export { createFlushController, FlushController, FlushEvent, FlushReason } from './flushController';
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.startBatchWithReplica = exports.getEventBridge = exports.canUseEventBridge = exports.Batch = exports.createHttpRequest = void 0;
exports.createFlushController = exports.startBatchWithReplica = exports.getEventBridge = exports.canUseEventBridge = exports.Batch = exports.createHttpRequest = void 0;
var httpRequest_1 = require("./httpRequest");

@@ -13,2 +13,4 @@ Object.defineProperty(exports, "createHttpRequest", { enumerable: true, get: function () { return httpRequest_1.createHttpRequest; } });

Object.defineProperty(exports, "startBatchWithReplica", { enumerable: true, get: function () { return startBatchWithReplica_1.startBatchWithReplica; } });
var flushController_1 = require("./flushController");
Object.defineProperty(exports, "createFlushController", { enumerable: true, get: function () { return flushController_1.createFlushController; } });
//# sourceMappingURL=index.js.map

@@ -5,10 +5,11 @@ "use strict";

var timer_1 = require("../tools/timer");
var timeUtils_1 = require("../tools/timeUtils");
var utils_1 = require("../tools/utils");
var timeUtils_1 = require("../tools/utils/timeUtils");
var error_1 = require("../domain/error/error");
exports.MAX_ONGOING_BYTES_COUNT = 80 * utils_1.ONE_KIBI_BYTE;
var byteUtils_1 = require("../tools/utils/byteUtils");
var responseUtils_1 = require("../tools/utils/responseUtils");
exports.MAX_ONGOING_BYTES_COUNT = 80 * byteUtils_1.ONE_KIBI_BYTE;
exports.MAX_ONGOING_REQUESTS = 32;
exports.MAX_QUEUE_BYTES_COUNT = 3 * utils_1.ONE_MEBI_BYTE;
exports.MAX_BACKOFF_TIME = utils_1.ONE_MINUTE;
exports.INITIAL_BACKOFF_TIME = utils_1.ONE_SECOND;
exports.MAX_QUEUE_BYTES_COUNT = 3 * byteUtils_1.ONE_MEBI_BYTE;
exports.MAX_BACKOFF_TIME = timeUtils_1.ONE_MINUTE;
exports.INITIAL_BACKOFF_TIME = timeUtils_1.ONE_SECOND;
function sendWithRetryStrategy(payload, state, sendStrategy, endpointType, reportError) {

@@ -74,3 +75,3 @@ if (state.transportStatus === 0 /* TransportStatus.UP */ &&

reportError({
message: "Reached max ".concat(endpointType, " events size queued for upload: ").concat(exports.MAX_QUEUE_BYTES_COUNT / utils_1.ONE_MEBI_BYTE, "MiB"),
message: "Reached max ".concat(endpointType, " events size queued for upload: ").concat(exports.MAX_QUEUE_BYTES_COUNT / byteUtils_1.ONE_MEBI_BYTE, "MiB"),
source: error_1.ErrorSource.AGENT,

@@ -92,3 +93,3 @@ startClocks: (0, timeUtils_1.clocksNow)(),

response.status === 429 ||
response.status >= 500));
(0, responseUtils_1.isServerError)(response.status)));
}

@@ -95,0 +96,0 @@ function newRetryState() {

import type { Configuration, EndpointBuilder } from '../domain/configuration';
import type { RawError } from '../domain/error/error';
import type { Context } from '../tools/context';
import type { Context } from '../tools/serialisation/context';
import type { Observable } from '../tools/observable';

@@ -5,0 +5,0 @@ import type { PageExitEvent } from '../browser/pageExitObservable';

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

var httpRequest_1 = require("./httpRequest");
var flushController_1 = require("./flushController");
function startBatchWithReplica(configuration, endpoint, reportError, pageExitObservable, replicaEndpoint) {

@@ -14,3 +15,8 @@ var primaryBatch = createBatch(endpoint);

function createBatch(endpointBuilder) {
return new batch_1.Batch((0, httpRequest_1.createHttpRequest)(endpointBuilder, configuration.batchBytesLimit, reportError), configuration.batchMessagesLimit, configuration.batchBytesLimit, configuration.messageBytesLimit, configuration.flushTimeout, pageExitObservable);
return new batch_1.Batch((0, httpRequest_1.createHttpRequest)(endpointBuilder, configuration.batchBytesLimit, reportError), (0, flushController_1.createFlushController)({
messagesLimit: configuration.batchMessagesLimit,
bytesLimit: configuration.batchBytesLimit,
durationLimit: configuration.flushTimeout,
pageExitObservable: pageExitObservable,
}), configuration.messageBytesLimit);
}

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

import { catchUserErrors } from '../tools/catchUserErrors';
import { setDebugMode } from '../tools/monitor';
import { assign } from '../tools/utils';
import { assign } from '../tools/utils/polyfills';
export function makePublicApi(stub) {
var publicApi = assign({
version: "4.38.0",
version: "4.39.0",
// This API method is intentionally not monitored, since the only thing executed is the

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

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

import type { VisualViewport, VisualViewportEventMap } from './types';
export declare const enum DOM_EVENT {

@@ -41,2 +42,7 @@ BEFORE_UNLOAD = "beforeunload",

}
type EventMapFor<T> = T extends Window ? WindowEventMap & {
freeze: Event;
resume: Event;
visibilitychange: Event;
} : T extends Document ? DocumentEventMap : T extends HTMLElement ? HTMLElementEventMap : T extends VisualViewport ? VisualViewportEventMap : T extends ShadowRoot ? GlobalEventHandlersEventMap : T extends XMLHttpRequest ? XMLHttpRequestEventMap : T extends Performance ? PerformanceEventMap : T extends Worker ? WorkerEventMap : Record<never, never>;
/**

@@ -52,3 +58,3 @@ * Add an event listener to an event target object (Window, Element, mock object...). This provides

*/
export declare function addEventListener<E extends Event>(eventTarget: EventTarget, event: DOM_EVENT, listener: (event: E) => void, options?: AddEventListenerOptions): {
export declare function addEventListener<Target extends EventTarget, EventName extends keyof EventMapFor<Target> & string>(eventTarget: Target, eventName: EventName, listener: (event: EventMapFor<Target>[EventName]) => void, options?: AddEventListenerOptions): {
stop: () => void;

@@ -68,5 +74,5 @@ };

*/
export declare function addEventListeners<E extends Event>(eventTarget: EventTarget, events: DOM_EVENT[], listener: (event: E) => void, { once, capture, passive }?: AddEventListenerOptions): {
export declare function addEventListeners<Target extends EventTarget, EventName extends keyof EventMapFor<Target> & string>(eventTarget: Target, eventNames: EventName[], listener: (event: EventMapFor<Target>[EventName]) => void, { once, capture, passive }?: AddEventListenerOptions): {
stop: () => void;
};
export {};

@@ -13,4 +13,4 @@ import { monitor } from '../tools/monitor';

*/
export function addEventListener(eventTarget, event, listener, options) {
return addEventListeners(eventTarget, [event], listener, options);
export function addEventListener(eventTarget, eventName, listener, options) {
return addEventListeners(eventTarget, [eventName], listener, options);
}

@@ -29,3 +29,3 @@ /**

*/
export function addEventListeners(eventTarget, events, listener, _a) {
export function addEventListeners(eventTarget, eventNames, listener, _a) {
var _b = _a === void 0 ? {} : _a, once = _b.once, capture = _b.capture, passive = _b.passive;

@@ -40,6 +40,6 @@ var wrappedListener = monitor(once

var add = getZoneJsOriginalValue(eventTarget, 'addEventListener');
events.forEach(function (event) { return add.call(eventTarget, event, wrappedListener, options); });
eventNames.forEach(function (eventName) { return add.call(eventTarget, eventName, wrappedListener, options); });
function stop() {
var remove = getZoneJsOriginalValue(eventTarget, 'removeEventListener');
events.forEach(function (event) { return remove.call(eventTarget, event, wrappedListener, options); });
eventNames.forEach(function (eventName) { return remove.call(eventTarget, eventName, wrappedListener, options); });
}

@@ -46,0 +46,0 @@ return {

import { display } from '../tools/display';
import { findCommaSeparatedValue, generateUUID, ONE_MINUTE, ONE_SECOND } from '../tools/utils';
import { ONE_MINUTE, ONE_SECOND } from '../tools/utils/timeUtils';
import { findCommaSeparatedValue, generateUUID } from '../tools/utils/stringUtils';
export var COOKIE_ACCESS_DELAY = ONE_SECOND;

@@ -4,0 +5,0 @@ export function setCookie(name, value, expireDelay, options) {

import { Observable } from '../tools/observable';
import type { ClocksState } from '../tools/timeUtils';
import type { ClocksState } from '../tools/utils/timeUtils';
interface FetchContextBase {

@@ -4,0 +4,0 @@ method: string;

import { instrumentMethod } from '../tools/instrumentMethod';
import { callMonitored, monitor } from '../tools/monitor';
import { Observable } from '../tools/observable';
import { clocksNow } from '../tools/timeUtils';
import { normalizeUrl } from '../tools/urlPolyfill';
import { clocksNow } from '../tools/utils/timeUtils';
import { normalizeUrl } from '../tools/utils/urlPolyfill';
var fetchObservable;

@@ -7,0 +7,0 @@ export function initFetchObservable() {

@@ -8,3 +8,3 @@ import { Observable } from '../tools/observable';

};
type PageExitReason = (typeof PageExitReason)[keyof typeof PageExitReason];
export type PageExitReason = (typeof PageExitReason)[keyof typeof PageExitReason];
export interface PageExitEvent {

@@ -15,2 +15,1 @@ reason: PageExitReason;

export declare function isPageExitReason(reason: string | undefined): reason is PageExitReason;
export {};
import { isExperimentalFeatureEnabled, ExperimentalFeature } from '../tools/experimentalFeatures';
import { Observable } from '../tools/observable';
import { includes, noop, objectValues } from '../tools/utils';
import { objectValues, includes } from '../tools/utils/polyfills';
import { noop } from '../tools/utils/functionUtils';
import { addEventListeners, addEventListener } from './addEventListener';

@@ -5,0 +6,0 @@ export var PageExitReason = {

import { Observable } from '../tools/observable';
import type { Duration, RelativeTime, ClocksState } from '../tools/timeUtils';
import type { Duration, RelativeTime, ClocksState } from '../tools/utils/timeUtils';
export interface XhrOpenContext {

@@ -4,0 +4,0 @@ state: 'open';

import { instrumentMethodAndCallOriginal } from '../tools/instrumentMethod';
import { monitor } from '../tools/monitor';
import { Observable } from '../tools/observable';
import { elapsed, relativeNow, clocksNow, timeStampNow } from '../tools/timeUtils';
import { normalizeUrl } from '../tools/urlPolyfill';
import { shallowClone } from '../tools/utils';
import { elapsed, relativeNow, clocksNow, timeStampNow } from '../tools/utils/timeUtils';
import { normalizeUrl } from '../tools/utils/urlPolyfill';
import { shallowClone } from '../tools/utils/objectUtils';
import { addEventListener } from './addEventListener';
var xhrObservable;

@@ -67,4 +67,4 @@ var xhrContexts = new WeakMap();

}).stop;
var onEnd = monitor(function () {
_this.removeEventListener('loadend', onEnd);
var onEnd = function () {
unsubscribeLoadEndListener();
stopInstrumentingOnReadyStateChange();

@@ -80,4 +80,4 @@ if (hasBeenReported) {

observable.notify(shallowClone(completeContext));
});
this.addEventListener('loadend', onEnd);
};
var unsubscribeLoadEndListener = addEventListener(this, 'loadend', onEnd).stop;
observable.notify(startContext);

@@ -84,0 +84,0 @@ }

import type { CookieOptions } from '../../browser/cookie';
import type { RawTelemetryConfiguration } from '../telemetry';
import type { Duration } from '../../tools/utils/timeUtils';
import type { TransportConfiguration } from './transportConfiguration';

@@ -56,3 +57,3 @@ export declare const DefaultPrivacyLevel: {

batchBytesLimit: number;
flushTimeout: number;
flushTimeout: Duration;
batchMessagesLimit: number;

@@ -59,0 +60,0 @@ messageBytesLimit: number;

import { getCurrentSite } from '../../browser/cookie';
import { catchUserErrors } from '../../tools/catchUserErrors';
import { display } from '../../tools/display';
import { assign, isPercentage, objectHasValue, ONE_KIBI_BYTE, ONE_SECOND } from '../../tools/utils';
import { ExperimentalFeature, addExperimentalFeatures } from '../../tools/experimentalFeatures';
import { ONE_SECOND } from '../../tools/utils/timeUtils';
import { isPercentage } from '../../tools/utils/numberUtils';
import { ONE_KIBI_BYTE } from '../../tools/utils/byteUtils';
import { objectHasValue } from '../../tools/utils/objectUtils';
import { assign } from '../../tools/utils/polyfills';
import { computeTransportConfiguration } from './transportConfiguration';

@@ -57,3 +61,3 @@ export var DefaultPrivacyLevel = {

*/
flushTimeout: 30 * ONE_SECOND,
flushTimeout: (30 * ONE_SECOND),
/**

@@ -60,0 +64,0 @@ * Logs intake limit

@@ -1,5 +0,5 @@

import { timeStampNow } from '../../tools/timeUtils';
import { normalizeUrl } from '../../tools/urlPolyfill';
import { generateUUID } from '../../tools/utils';
import { timeStampNow } from '../../tools/utils/timeUtils';
import { normalizeUrl } from '../../tools/utils/urlPolyfill';
import { ExperimentalFeature, isExperimentalFeatureEnabled } from '../../tools/experimentalFeatures';
import { generateUUID } from '../../tools/utils/stringUtils';
import { INTAKE_SITE_AP1, INTAKE_SITE_US1 } from './intakeSites';

@@ -65,3 +65,3 @@ export var ENDPOINTS = {

var clientToken = _a.clientToken, internalAnalyticsSubdomain = _a.internalAnalyticsSubdomain;
var tags = ["sdk_version:".concat("4.38.0"), "api:".concat(api)].concat(configurationTags);
var tags = ["sdk_version:".concat("4.39.0"), "api:".concat(api)].concat(configurationTags);
if (flushReason && isExperimentalFeatureEnabled(ExperimentalFeature.COLLECT_FLUSH_REASON)) {

@@ -77,3 +77,3 @@ tags.push("flush_reason:".concat(flushReason));

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

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

export declare const INTAKE_SITE_STAGING = "datad0g.com";
export declare const INTAKE_SITE_US1 = "datadoghq.com";
export declare const INTAKE_SITE_EU1 = "datadoghq.eu";
export declare const INTAKE_SITE_AP1 = "ap1.datadoghq.com";
export declare const INTAKE_SITE_US1_FED = "ddog-gov.com";
export var INTAKE_SITE_STAGING = 'datad0g.com';
export var INTAKE_SITE_US1 = 'datadoghq.com';
export var INTAKE_SITE_EU1 = 'datadoghq.eu';
export var INTAKE_SITE_AP1 = 'ap1.datadoghq.com';
export var INTAKE_SITE_US1_FED = 'ddog-gov.com';
//# sourceMappingURL=intakeSites.js.map

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

import { assign, objectValues } from '../../tools/utils';
import { objectValues, assign } from '../../tools/utils/polyfills';
import { createEndpointBuilder } from './endpointBuilder';

@@ -3,0 +3,0 @@ import { buildTags } from './tags';

import { computeStackTrace } from '../tracekit';
import { createHandlingStack, formatErrorMessage, toStackTraceString } from '../error/error';
import { mergeObservables, Observable } from '../../tools/observable';
import { find, jsonStringify } from '../../tools/utils';
import { ConsoleApiName } from '../../tools/display';
import { callMonitored } from '../../tools/monitor';
import { sanitize } from '../../tools/sanitize';
import { sanitize } from '../../tools/serialisation/sanitize';
import { ExperimentalFeature, isExperimentalFeatureEnabled } from '../../tools/experimentalFeatures';
import { find } from '../../tools/utils/polyfills';
import { jsonStringify } from '../../tools/serialisation/jsonStringify';
var consoleObservablesByApi = {};

@@ -10,0 +11,0 @@ export function initConsoleObservable(apis) {

import type { StackTrace } from '../tracekit';
import type { ClocksState } from '../../tools/timeUtils';
import type { ClocksState } from '../../tools/utils/timeUtils';
export declare const NO_ERROR_STACK_PRESENT_MESSAGE = "No stack, consider using an instance of Error";

@@ -4,0 +4,0 @@ export declare const PROVIDED_ERROR_MESSAGE_PREFIX = "Provided";

import { computeStackTrace } from '../tracekit';
import { ExperimentalFeature, isExperimentalFeatureEnabled } from '../../tools/experimentalFeatures';
import { callMonitored } from '../../tools/monitor';
import { sanitize } from '../../tools/sanitize';
import { jsonStringify, noop } from '../../tools/utils';
import { sanitize } from '../../tools/serialisation/sanitize';
import { noop } from '../../tools/utils/functionUtils';
import { jsonStringify } from '../../tools/serialisation/jsonStringify';
export var NO_ERROR_STACK_PRESENT_MESSAGE = 'No stack, consider using an instance of Error';

@@ -7,0 +8,0 @@ export var PROVIDED_ERROR_MESSAGE_PREFIX = 'Provided';

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

import { clocksNow } from '../../tools/timeUtils';
import { clocksNow } from '../../tools/utils/timeUtils';
import { startUnhandledErrorCollection } from '../tracekit';

@@ -3,0 +3,0 @@ import { ErrorSource, computeRawError } from './error';

import { setTimeout } from '../../tools/timer';
import { ErrorSource } from '../error/error';
import { clocksNow } from '../../tools/timeUtils';
import { ONE_MINUTE } from '../../tools/utils';
import { clocksNow, ONE_MINUTE } from '../../tools/utils/timeUtils';
export function createEventRateLimiter(eventType, limit, onLimitReached) {

@@ -6,0 +5,0 @@ var eventCount = 0;

import { toStackTraceString } from '../error/error';
import { monitor } from '../../tools/monitor';
import { mergeObservables, Observable } from '../../tools/observable';
import { includes, safeTruncate } from '../../tools/utils';
import { addEventListener } from '../../browser/addEventListener';
import { includes } from '../../tools/utils/polyfills';
import { safeTruncate } from '../../tools/utils/stringUtils';
export var RawReportType = {

@@ -45,6 +46,5 @@ intervention: 'intervention',

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

@@ -51,0 +51,0 @@ });

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

import { ONE_HOUR, ONE_MINUTE } from '../../tools/utils';
import { ONE_HOUR, ONE_MINUTE } from '../../tools/utils/timeUtils';
export var SESSION_TIME_OUT_DELAY = 4 * ONE_HOUR;
export var SESSION_EXPIRATION_DELAY = 15 * ONE_MINUTE;
//# sourceMappingURL=sessionConstants.js.map
import { deleteCookie, getCookie, setCookie } from '../../browser/cookie';
import { setTimeout } from '../../tools/timer';
import { isChromium } from '../../tools/browserDetection';
import { dateNow } from '../../tools/timeUtils';
import * as utils from '../../tools/utils';
import { isChromium } from '../../tools/utils/browserDetection';
import { dateNow } from '../../tools/utils/timeUtils';
import { objectEntries } from '../../tools/utils/polyfills';
import { isEmptyObject } from '../../tools/utils/objectUtils';
import { generateUUID } from '../../tools/utils/stringUtils';
import { SESSION_EXPIRATION_DELAY } from './sessionConstants';

@@ -38,3 +40,3 @@ var SESSION_ENTRY_REGEXP = /^([a-z]+)=([a-z0-9-]+)$/;

// acquire lock
currentLock = utils.generateUUID();
currentLock = generateUUID();
currentSession.lock = currentLock;

@@ -112,4 +114,3 @@ setSessionCookie(currentSession, operations.options);

export function toSessionString(session) {
return utils
.objectEntries(session)
return objectEntries(session)
.map(function (_a) {

@@ -143,4 +144,4 @@ var key = _a[0], value = _a[1];

function isExpiredState(session) {
return utils.isEmptyObject(session);
return isEmptyObject(session);
}
//# sourceMappingURL=sessionCookieStore.js.map
import type { CookieOptions } from '../../browser/cookie';
import type { Observable } from '../../tools/observable';
import type { Context } from '../../tools/context';
import type { RelativeTime } from '../../tools/timeUtils';
import type { Context } from '../../tools/serialisation/context';
import type { RelativeTime } from '../../tools/utils/timeUtils';
export interface SessionManager<TrackingType extends string> {

@@ -6,0 +6,0 @@ findActiveSession: (startTime?: RelativeTime) => SessionContext<TrackingType> | undefined;

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

import * as utils from '../../tools/utils';
import { ContextHistory } from '../../tools/contextHistory';
import { relativeNow, clocksOrigin } from '../../tools/timeUtils';
import { ValueHistory } from '../../tools/valueHistory';
import { relativeNow, clocksOrigin, ONE_MINUTE } from '../../tools/utils/timeUtils';
import { addEventListener, addEventListeners } from '../../browser/addEventListener';

@@ -9,3 +8,3 @@ import { clearInterval, setInterval } from '../../tools/timer';

import { SESSION_TIME_OUT_DELAY } from './sessionConstants';
export var VISIBILITY_CHECK_DELAY = utils.ONE_MINUTE;
export var VISIBILITY_CHECK_DELAY = ONE_MINUTE;
var SESSION_CONTEXT_TIMEOUT_DELAY = SESSION_TIME_OUT_DELAY;

@@ -17,3 +16,3 @@ var stopCallbacks = [];

stopCallbacks.push(function () { return sessionStore.stop(); });
var sessionContextHistory = new ContextHistory(SESSION_CONTEXT_TIMEOUT_DELAY);
var sessionContextHistory = new ValueHistory(SESSION_CONTEXT_TIMEOUT_DELAY);
stopCallbacks.push(function () { return sessionContextHistory.stop(); });

@@ -20,0 +19,0 @@ sessionStore.renewObservable.subscribe(function () {

import { COOKIE_ACCESS_DELAY } from '../../browser/cookie';
import { clearInterval, setInterval } from '../../tools/timer';
import { Observable } from '../../tools/observable';
import { dateNow } from '../../tools/timeUtils';
import * as utils from '../../tools/utils';
import { dateNow } from '../../tools/utils/timeUtils';
import { throttle } from '../../tools/utils/functionUtils';
import { generateUUID } from '../../tools/utils/stringUtils';
import { SESSION_TIME_OUT_DELAY } from './sessionConstants';

@@ -72,3 +73,3 @@ import { deleteSessionCookie, retrieveSessionCookie, withCookieLockAccess } from './sessionCookieStore';

if (isTracked && !cookieSession.id) {
cookieSession.id = utils.generateUUID();
cookieSession.id = generateUUID();
cookieSession.created = String(dateNow());

@@ -106,3 +107,3 @@ }

return {
expandOrRenewSession: utils.throttle(expandOrRenewSession, COOKIE_ACCESS_DELAY).throttled,
expandOrRenewSession: throttle(expandOrRenewSession, COOKIE_ACCESS_DELAY).throttled,
expandSession: expandSession,

@@ -109,0 +110,0 @@ getSession: function () { return sessionCache; },

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

import type { Context } from '../../tools/context';
import type { Context } from '../../tools/serialisation/context';
import type { Configuration } from '../configuration';

@@ -3,0 +3,0 @@ import type { StackTrace } from '../tracekit';

import { ConsoleApiName } from '../../tools/display';
import { toStackTraceString } from '../error/error';
import { assign, combine, jsonStringify, performDraw, includes, startsWith, arrayFrom } from '../../tools/utils';
import { getExperimentalFeatures } from '../../tools/experimentalFeatures';

@@ -8,5 +7,9 @@ import { INTAKE_SITE_STAGING, INTAKE_SITE_US1_FED } from '../configuration';

import { Observable } from '../../tools/observable';
import { timeStampNow } from '../../tools/timeUtils';
import { timeStampNow } from '../../tools/utils/timeUtils';
import { displayIfDebugEnabled, startMonitorErrorCollection } from '../../tools/monitor';
import { sendToExtension } from '../../tools/sendToExtension';
import { startsWith, arrayFrom, includes, assign } from '../../tools/utils/polyfills';
import { performDraw } from '../../tools/utils/numberUtils';
import { jsonStringify } from '../../tools/serialisation/jsonStringify';
import { combine } from '../../tools/mergeInto';
import { TelemetryType } from './rawTelemetryEvent.types';

@@ -46,3 +49,3 @@ var ALLOWED_FRAME_URLS = [

service: telemetryService,
version: "4.38.0",
version: "4.39.0",
source: 'browser',

@@ -49,0 +52,0 @@ _dd: {

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

import { startsWith } from '../../tools/utils';
import { startsWith } from '../../tools/utils/polyfills';
var UNKNOWN_FUNCTION = '?';

@@ -30,3 +30,3 @@ /**

}
var fileUrl = '((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\\w+\\.|\\/).*?)';
var fileUrl = '((?:file|https?|blob|chrome-extension|native|eval|webpack|snippet|<anonymous>|\\w+\\.|\\/).*?)';
var filePosition = '(?::(\\d+))';

@@ -33,0 +33,0 @@ var CHROME_LINE_RE = new RegExp("^\\s*at (.*?) ?\\(".concat(fileUrl).concat(filePosition, "?").concat(filePosition, "?\\)?\\s*$"), 'i');

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

import type { Context } from '../../tools/context';
import type { Context } from '../../tools/serialisation/context';
import type { User } from './user.types';

@@ -3,0 +3,0 @@ /**

import { display } from '../../tools/display';
import { assign, getType } from '../../tools/utils';
import { getType } from '../../tools/utils/typeUtils';
import { assign } from '../../tools/utils/polyfills';
/**

@@ -4,0 +5,0 @@ * Clone input data and ensure known user properties (id, name, email)

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

export { Configuration, InitConfiguration, buildCookieOptions, validateAndBuildConfiguration, DefaultPrivacyLevel, EndpointBuilder, serializeConfiguration, } from './domain/configuration';
export { Configuration, InitConfiguration, buildCookieOptions, validateAndBuildConfiguration, DefaultPrivacyLevel, EndpointBuilder, serializeConfiguration, INTAKE_SITE_AP1, INTAKE_SITE_STAGING, INTAKE_SITE_US1, INTAKE_SITE_US1_FED, INTAKE_SITE_EU1, } from './domain/configuration';
export { isExperimentalFeatureEnabled, addExperimentalFeatures, resetExperimentalFeatures, getExperimentalFeatures, ExperimentalFeature, } from './tools/experimentalFeatures';

@@ -12,11 +12,11 @@ export { trackRuntimeError } from './domain/error/trackRuntimeError';

export { SESSION_TIME_OUT_DELAY, } from './domain/session/sessionConstants';
export { HttpRequest, Payload, createHttpRequest, Batch, BatchFlushEvent, canUseEventBridge, getEventBridge, startBatchWithReplica, } from './transport';
export { HttpRequest, Payload, createHttpRequest, Batch, canUseEventBridge, getEventBridge, startBatchWithReplica, createFlushController, FlushEvent, FlushReason, } from './transport';
export * from './tools/display';
export * from './tools/urlPolyfill';
export * from './tools/timeUtils';
export * from './tools/utils';
export * from './tools/sanitize';
export * from './tools/utils/urlPolyfill';
export * from './tools/utils/timeUtils';
export * from './tools/utils/arrayUtils';
export * from './tools/serialisation/sanitize';
export * from './tools/getGlobalObject';
export * from './domain/eventRateLimiter/createEventRateLimiter';
export * from './tools/browserDetection';
export * from './tools/utils/browserDetection';
export { sendToExtension } from './tools/sendToExtension';

@@ -27,3 +27,3 @@ export { runOnReadyState } from './browser/runOnReadyState';

export { ErrorSource, ErrorHandling, computeRawError, createHandlingStack, RawError, RawErrorCause, ErrorWithCause, toStackTraceString, getFileFromStackTraceString, NO_ERROR_STACK_PRESENT_MESSAGE, PROVIDED_ERROR_MESSAGE_PREFIX, } from './domain/error/error';
export { Context, ContextArray, ContextValue } from './tools/context';
export { Context, ContextArray, ContextValue } from './tools/serialisation/context';
export { areCookiesAuthorized, getCookie, setCookie, deleteCookie, COOKIE_ACCESS_DELAY } from './browser/cookie';

@@ -38,6 +38,5 @@ export { initXhrObservable, XhrCompleteContext, XhrStartContext } from './browser/xhrObservable';

export { catchUserErrors } from './tools/catchUserErrors';
export { createContextManager, ContextManager } from './tools/contextManager';
export { warnIfCustomerDataLimitReached, CustomerDataType } from './tools/heavyCustomerDataWarning';
export { limitModification } from './tools/limitModification';
export { ContextHistory, ContextHistoryEntry, CLEAR_OLD_CONTEXTS_INTERVAL } from './tools/contextHistory';
export { createContextManager, ContextManager } from './tools/serialisation/contextManager';
export { warnIfCustomerDataLimitReached, CustomerDataType, CUSTOMER_DATA_BYTES_LIMIT, } from './tools/serialisation/heavyCustomerDataWarning';
export { ValueHistory, ValueHistoryEntry, CLEAR_OLD_VALUES_INTERVAL } from './tools/valueHistory';
export { readBytesFromStream } from './tools/readBytesFromStream';

@@ -47,1 +46,13 @@ export { SESSION_COOKIE_NAME } from './domain/session/sessionCookieStore';

export { User, checkUser, sanitizeUser } from './domain/user';
export * from './domain/resourceUtils';
export * from './tools/utils/polyfills';
export * from './tools/utils/numberUtils';
export * from './tools/utils/byteUtils';
export * from './tools/utils/objectUtils';
export * from './tools/utils/functionUtils';
export * from './tools/serialisation/jsonStringify';
export * from './tools/mergeInto';
export * from './tools/utils/stringUtils';
export * from './tools/matchOption';
export * from './tools/utils/responseUtils';
export * from './tools/utils/typeUtils';

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

export { buildCookieOptions, validateAndBuildConfiguration, DefaultPrivacyLevel, serializeConfiguration, } from './domain/configuration';
export { buildCookieOptions, validateAndBuildConfiguration, DefaultPrivacyLevel, serializeConfiguration, INTAKE_SITE_AP1, INTAKE_SITE_STAGING, INTAKE_SITE_US1, INTAKE_SITE_US1_FED, INTAKE_SITE_EU1, } from './domain/configuration';
export { isExperimentalFeatureEnabled, addExperimentalFeatures, resetExperimentalFeatures, getExperimentalFeatures, ExperimentalFeature, } from './tools/experimentalFeatures';

@@ -15,11 +15,11 @@ export { trackRuntimeError } from './domain/error/trackRuntimeError';

} from './domain/session/sessionConstants';
export { createHttpRequest, Batch, canUseEventBridge, getEventBridge, startBatchWithReplica, } from './transport';
export { createHttpRequest, Batch, canUseEventBridge, getEventBridge, startBatchWithReplica, createFlushController, } from './transport';
export * from './tools/display';
export * from './tools/urlPolyfill';
export * from './tools/timeUtils';
export * from './tools/utils';
export * from './tools/sanitize';
export * from './tools/utils/urlPolyfill';
export * from './tools/utils/timeUtils';
export * from './tools/utils/arrayUtils';
export * from './tools/serialisation/sanitize';
export * from './tools/getGlobalObject';
export * from './domain/eventRateLimiter/createEventRateLimiter';
export * from './tools/browserDetection';
export * from './tools/utils/browserDetection';
export { sendToExtension } from './tools/sendToExtension';

@@ -39,6 +39,5 @@ export { runOnReadyState } from './browser/runOnReadyState';

export { catchUserErrors } from './tools/catchUserErrors';
export { createContextManager } from './tools/contextManager';
export { warnIfCustomerDataLimitReached } from './tools/heavyCustomerDataWarning';
export { limitModification } from './tools/limitModification';
export { ContextHistory, CLEAR_OLD_CONTEXTS_INTERVAL } from './tools/contextHistory';
export { createContextManager } from './tools/serialisation/contextManager';
export { warnIfCustomerDataLimitReached, CUSTOMER_DATA_BYTES_LIMIT, } from './tools/serialisation/heavyCustomerDataWarning';
export { ValueHistory, CLEAR_OLD_VALUES_INTERVAL } from './tools/valueHistory';
export { readBytesFromStream } from './tools/readBytesFromStream';

@@ -48,2 +47,14 @@ export { SESSION_COOKIE_NAME } from './domain/session/sessionCookieStore';

export { checkUser, sanitizeUser } from './domain/user';
export * from './domain/resourceUtils';
export * from './tools/utils/polyfills';
export * from './tools/utils/numberUtils';
export * from './tools/utils/byteUtils';
export * from './tools/utils/objectUtils';
export * from './tools/utils/functionUtils';
export * from './tools/serialisation/jsonStringify';
export * from './tools/mergeInto';
export * from './tools/utils/stringUtils';
export * from './tools/matchOption';
export * from './tools/utils/responseUtils';
export * from './tools/utils/typeUtils';
//# sourceMappingURL=index.js.map

@@ -12,5 +12,3 @@ /**

PAGEHIDE = "pagehide",
SHADOW_DOM_DEBUG = "shadow_dom_debug",
FEATURE_FLAGS = "feature_flags",
RESOURCE_DURATIONS = "resource_durations",
RESOURCE_PAGE_STATES = "resource_page_states",

@@ -17,0 +15,0 @@ CLICKMAP = "clickmap",

@@ -16,5 +16,3 @@ /**

ExperimentalFeature["PAGEHIDE"] = "pagehide";
ExperimentalFeature["SHADOW_DOM_DEBUG"] = "shadow_dom_debug";
ExperimentalFeature["FEATURE_FLAGS"] = "feature_flags";
ExperimentalFeature["RESOURCE_DURATIONS"] = "resource_durations";
ExperimentalFeature["RESOURCE_PAGE_STATES"] = "resource_page_states";

@@ -21,0 +19,0 @@ ExperimentalFeature["CLICKMAP"] = "clickmap";

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

import { noop } from './utils';
import { noop } from './utils/functionUtils';
export declare function instrumentMethod<OBJECT extends {

@@ -3,0 +3,0 @@ [key: string]: any;

import { setTimeout } from './timer';
import { callMonitored } from './monitor';
import { noop } from './utils';
import { noop } from './utils/functionUtils';
export function instrumentMethod(object, method, instrumentationFactory) {

@@ -5,0 +5,0 @@ var original = object[method];

import { monitor } from './monitor';
import { noop } from './utils';
import { noop } from './utils/functionUtils';
/**

@@ -4,0 +4,0 @@ * Read bytes from a ReadableStream until at least `limit` bytes have been read (or until the end of

@@ -1,26 +0,14 @@

import type { Context } from '../tools/context';
import { Observable } from '../tools/observable';
import type { PageExitEvent } from '../browser/pageExitObservable';
import type { Context } from '../tools/serialisation/context';
import type { HttpRequest } from './httpRequest';
export interface BatchFlushEvent {
bufferBytesCount: number;
bufferMessagesCount: number;
}
export type FlushReason = 'batch_duration_limit' | 'batch_bytes_limit' | 'before_unload' | 'page_hide' | 'visibility_hidden' | 'page_frozen';
import type { FlushController } from './flushController';
export declare class Batch {
private request;
private batchMessagesLimit;
private batchBytesLimit;
private flushController;
private messageBytesLimit;
private flushTimeout;
private pageExitObservable;
flushObservable: Observable<BatchFlushEvent>;
private pushOnlyBuffer;
private upsertBuffer;
private bufferBytesCount;
private bufferMessagesCount;
constructor(request: HttpRequest, batchMessagesLimit: number, batchBytesLimit: number, messageBytesLimit: number, flushTimeout: number, pageExitObservable: Observable<PageExitEvent>);
constructor(request: HttpRequest, flushController: FlushController, messageBytesLimit: number);
add(message: Context): void;
upsert(message: Context, key: string): void;
flush(flushReason: FlushReason, sendFn?: (payload: import("./httpRequest").Payload) => void): void;
private flush;
private addOrUpdate;

@@ -31,5 +19,2 @@ private process;

private hasMessageFor;
private willReachedBytesLimitWith;
private isFull;
private flushPeriodically;
}
import { display } from '../tools/display';
import { computeBytesCount, jsonStringify, objectValues } from '../tools/utils';
import { Observable } from '../tools/observable';
import { setTimeout } from '../tools/timer';
import { objectValues } from '../tools/utils/polyfills';
import { isPageExitReason } from '../browser/pageExitObservable';
import { computeBytesCount } from '../tools/utils/byteUtils';
import { jsonStringify } from '../tools/serialisation/jsonStringify';
var Batch = /** @class */ (function () {
function Batch(request, batchMessagesLimit, batchBytesLimit, messageBytesLimit, flushTimeout, pageExitObservable) {
function Batch(request, flushController, messageBytesLimit) {
var _this = this;
this.request = request;
this.batchMessagesLimit = batchMessagesLimit;
this.batchBytesLimit = batchBytesLimit;
this.flushController = flushController;
this.messageBytesLimit = messageBytesLimit;
this.flushTimeout = flushTimeout;
this.pageExitObservable = pageExitObservable;
this.flushObservable = new Observable();
this.pushOnlyBuffer = [];
this.upsertBuffer = {};
this.bufferBytesCount = 0;
this.bufferMessagesCount = 0;
pageExitObservable.subscribe(function (event) { return _this.flush(event.reason, _this.request.sendOnExit); });
this.flushPeriodically();
this.flushController.flushObservable.subscribe(function (event) { return _this.flush(event); });
}

@@ -28,17 +22,13 @@ Batch.prototype.add = function (message) {

};
Batch.prototype.flush = function (flushReason, sendFn) {
if (sendFn === void 0) { sendFn = this.request.send; }
if (this.bufferMessagesCount !== 0) {
var messages = this.pushOnlyBuffer.concat(objectValues(this.upsertBuffer));
var bytesCount = this.bufferBytesCount;
this.flushObservable.notify({
bufferBytesCount: this.bufferBytesCount,
bufferMessagesCount: this.bufferMessagesCount,
});
this.pushOnlyBuffer = [];
this.upsertBuffer = {};
this.bufferBytesCount = 0;
this.bufferMessagesCount = 0;
sendFn({ data: messages.join('\n'), bytesCount: bytesCount, flushReason: flushReason });
Batch.prototype.flush = function (event) {
var messages = this.pushOnlyBuffer.concat(objectValues(this.upsertBuffer));
this.pushOnlyBuffer = [];
this.upsertBuffer = {};
var payload = { data: messages.join('\n'), bytesCount: event.bytesCount, flushReason: event.reason };
if (isPageExitReason(event.reason)) {
this.request.sendOnExit(payload);
}
else {
this.request.send(payload);
}
};

@@ -54,9 +44,3 @@ Batch.prototype.addOrUpdate = function (message, key) {

}
if (this.willReachedBytesLimitWith(messageBytesCount)) {
this.flush('batch_bytes_limit');
}
this.push(processedMessage, messageBytesCount, key);
if (this.isFull()) {
this.flush('batch_bytes_limit');
}
};

@@ -69,6 +53,5 @@ Batch.prototype.process = function (message) {

Batch.prototype.push = function (processedMessage, messageBytesCount, key) {
if (this.bufferMessagesCount > 0) {
// \n separator at serialization
this.bufferBytesCount += 1;
}
// If there are other messages, a '\n' will be added at serialization
var separatorBytesCount = this.flushController.messagesCount > 0 ? 1 : 0;
this.flushController.notifyBeforeAddMessage(messageBytesCount + separatorBytesCount);
if (key !== undefined) {

@@ -80,4 +63,3 @@ this.upsertBuffer[key] = processedMessage;

}
this.bufferBytesCount += messageBytesCount;
this.bufferMessagesCount += 1;
this.flushController.notifyAfterAddMessage();
};

@@ -88,7 +70,5 @@ Batch.prototype.remove = function (key) {

var messageBytesCount = computeBytesCount(removedMessage);
this.bufferBytesCount -= messageBytesCount;
this.bufferMessagesCount -= 1;
if (this.bufferMessagesCount > 0) {
this.bufferBytesCount -= 1;
}
// If there are other messages, a '\n' will be added at serialization
var separatorBytesCount = this.flushController.messagesCount > 1 ? 1 : 0;
this.flushController.notifyAfterRemoveMessage(messageBytesCount + separatorBytesCount);
};

@@ -98,16 +78,2 @@ Batch.prototype.hasMessageFor = function (key) {

};
Batch.prototype.willReachedBytesLimitWith = function (messageBytesCount) {
// byte of the separator at the end of the message
return this.bufferBytesCount + messageBytesCount + 1 >= this.batchBytesLimit;
};
Batch.prototype.isFull = function () {
return this.bufferMessagesCount === this.batchMessagesLimit || this.bufferBytesCount >= this.batchBytesLimit;
};
Batch.prototype.flushPeriodically = function () {
var _this = this;
setTimeout(function () {
_this.flush('batch_duration_limit');
_this.flushPeriodically();
}, this.flushTimeout);
};
return Batch;

@@ -114,0 +80,0 @@ }());

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

import { endsWith } from '../tools/utils';
import { endsWith } from '../tools/utils/polyfills';
import { getGlobalObject } from '../tools/getGlobalObject';

@@ -3,0 +3,0 @@ export function getEventBridge() {

import type { EndpointBuilder } from '../domain/configuration';
import type { Context } from '../tools/context';
import type { Context } from '../tools/serialisation/context';
import type { RawError } from '../domain/error/error';
import type { FlushReason } from './batch';
import type { FlushReason } from './flushController';
/**

@@ -6,0 +6,0 @@ * Use POST request without content type to:

import { addTelemetryError } from '../domain/telemetry';
import { monitor } from '../tools/monitor';
import { addEventListener } from '../browser/addEventListener';
import { newRetryState, sendWithRetryStrategy } from './sendWithRetryStrategy';

@@ -74,12 +75,12 @@ export function createHttpRequest(endpointBuilder, bytesLimit, reportError) {

var request = new XMLHttpRequest();
var onLoadEnd = monitor(function () {
request.open('POST', url, true);
addEventListener(request, 'loadend', function () {
onResponse === null || onResponse === void 0 ? void 0 : onResponse({ status: request.status });
}, {
// prevent multiple onResponse callbacks
// if the xhr instance is reused by a third party
request.removeEventListener('loadend', onLoadEnd);
onResponse === null || onResponse === void 0 ? void 0 : onResponse({ status: request.status });
once: true,
});
request.open('POST', url, true);
request.addEventListener('loadend', onLoadEnd);
request.send(data);
}
//# sourceMappingURL=httpRequest.js.map
export { HttpRequest, createHttpRequest, Payload, RetryInfo } from './httpRequest';
export { Batch, BatchFlushEvent, FlushReason } from './batch';
export { Batch } from './batch';
export { canUseEventBridge, getEventBridge, BrowserWindowWithEventBridge } from './eventBridge';
export { startBatchWithReplica } from './startBatchWithReplica';
export { createFlushController, FlushController, FlushEvent, FlushReason } from './flushController';

@@ -5,2 +5,3 @@ export { createHttpRequest } from './httpRequest';

export { startBatchWithReplica } from './startBatchWithReplica';
export { createFlushController } from './flushController';
//# sourceMappingURL=index.js.map
import { setTimeout } from '../tools/timer';
import { clocksNow } from '../tools/timeUtils';
import { ONE_KIBI_BYTE, ONE_MEBI_BYTE, ONE_SECOND, ONE_MINUTE } from '../tools/utils';
import { clocksNow, ONE_MINUTE, ONE_SECOND } from '../tools/utils/timeUtils';
import { ErrorSource } from '../domain/error/error';
import { ONE_MEBI_BYTE, ONE_KIBI_BYTE } from '../tools/utils/byteUtils';
import { isServerError } from '../tools/utils/responseUtils';
export var MAX_ONGOING_BYTES_COUNT = 80 * ONE_KIBI_BYTE;

@@ -86,3 +87,3 @@ export var MAX_ONGOING_REQUESTS = 32;

response.status === 429 ||
response.status >= 500));
isServerError(response.status)));
}

@@ -89,0 +90,0 @@ export function newRetryState() {

import type { Configuration, EndpointBuilder } from '../domain/configuration';
import type { RawError } from '../domain/error/error';
import type { Context } from '../tools/context';
import type { Context } from '../tools/serialisation/context';
import type { Observable } from '../tools/observable';

@@ -5,0 +5,0 @@ import type { PageExitEvent } from '../browser/pageExitObservable';

import { Batch } from './batch';
import { createHttpRequest } from './httpRequest';
import { createFlushController } from './flushController';
export function startBatchWithReplica(configuration, endpoint, reportError, pageExitObservable, replicaEndpoint) {

@@ -10,3 +11,8 @@ var primaryBatch = createBatch(endpoint);

function createBatch(endpointBuilder) {
return new Batch(createHttpRequest(endpointBuilder, configuration.batchBytesLimit, reportError), configuration.batchMessagesLimit, configuration.batchBytesLimit, configuration.messageBytesLimit, configuration.flushTimeout, pageExitObservable);
return new Batch(createHttpRequest(endpointBuilder, configuration.batchBytesLimit, reportError), createFlushController({
messagesLimit: configuration.batchMessagesLimit,
bytesLimit: configuration.batchBytesLimit,
durationLimit: configuration.flushTimeout,
pageExitObservable: pageExitObservable,
}), configuration.messageBytesLimit);
}

@@ -13,0 +19,0 @@ return {

{
"name": "@datadog/browser-core",
"version": "4.38.0",
"version": "4.39.0",
"license": "Apache-2.0",

@@ -15,6 +15,2 @@ "main": "cjs/index.js",

},
"devDependencies": {
"@types/sinon": "9.0.10",
"sinon": "9.2.4"
},
"repository": {

@@ -28,3 +24,3 @@ "type": "git",

},
"gitHead": "61ff7fdf8c51ea1bb789cb3d865ad094bfcdcf71"
"gitHead": "128da89b469c77d6cfdabca15eb3d7ac09c3d5ae"
}
import { catchUserErrors } from '../tools/catchUserErrors'
import { setDebugMode } from '../tools/monitor'
import { assign } from '../tools/utils'
import { assign } from '../tools/utils/polyfills'

@@ -5,0 +5,0 @@ // replaced at build time

import { stubZoneJs } from '../../test'
import { noop } from '../tools/utils'
import { noop } from '../tools/utils/functionUtils'
import { addEventListener, DOM_EVENT } from './addEventListener'

@@ -5,0 +4,0 @@

import { monitor } from '../tools/monitor'
import { getZoneJsOriginalValue } from '../tools/getZoneJsOriginalValue'
import type { VisualViewport, VisualViewportEventMap } from './types'

@@ -46,2 +47,29 @@ export const enum DOM_EVENT {

type EventMapFor<T> = T extends Window
? WindowEventMap & {
// TS 4.9.5 does not support `freeze` and `resume` events yet
freeze: Event
resume: Event
// TS 4.9.5 does not define `visibilitychange` on Window (only Document)
visibilitychange: Event
}
: T extends Document
? DocumentEventMap
: T extends HTMLElement
? HTMLElementEventMap
: T extends VisualViewport
? VisualViewportEventMap
: T extends ShadowRoot
? // ShadowRootEventMap is not yet defined in our supported TS version. Instead, use
// GlobalEventHandlersEventMap which is more than enough as we only need to listen for events bubbling
// through the ShadowRoot like "change" or "input"
GlobalEventHandlersEventMap
: T extends XMLHttpRequest
? XMLHttpRequestEventMap
: T extends Performance
? PerformanceEventMap
: T extends Worker
? WorkerEventMap
: Record<never, never>
/**

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

*/
export function addEventListener<E extends Event>(
eventTarget: EventTarget,
event: DOM_EVENT,
listener: (event: E) => void,
export function addEventListener<Target extends EventTarget, EventName extends keyof EventMapFor<Target> & string>(
eventTarget: Target,
eventName: EventName,
listener: (event: EventMapFor<Target>[EventName]) => void,
options?: AddEventListenerOptions
) {
return addEventListeners(eventTarget, [event], listener, options)
return addEventListeners(eventTarget, [eventName], listener, options)
}

@@ -79,6 +107,6 @@

*/
export function addEventListeners<E extends Event>(
eventTarget: EventTarget,
events: DOM_EVENT[],
listener: (event: E) => void,
export function addEventListeners<Target extends EventTarget, EventName extends keyof EventMapFor<Target> & string>(
eventTarget: Target,
eventNames: EventName[],
listener: (event: EventMapFor<Target>[EventName]) => void,
{ once, capture, passive }: AddEventListenerOptions = {}

@@ -90,3 +118,3 @@ ) {

stop()
listener(event as E)
listener(event as EventMapFor<Target>[EventName])
}

@@ -99,7 +127,7 @@ : (listener as (event: Event) => void)

const add = getZoneJsOriginalValue(eventTarget, 'addEventListener')
events.forEach((event) => add.call(eventTarget, event, wrappedListener, options))
eventNames.forEach((eventName) => add.call(eventTarget, eventName, wrappedListener, options))
function stop() {
const remove = getZoneJsOriginalValue(eventTarget, 'removeEventListener')
events.forEach((event) => remove.call(eventTarget, event, wrappedListener, options))
eventNames.forEach((eventName) => remove.call(eventTarget, eventName, wrappedListener, options))
}

@@ -106,0 +134,0 @@

import { display } from '../tools/display'
import { findCommaSeparatedValue, generateUUID, ONE_MINUTE, ONE_SECOND } from '../tools/utils'
import { ONE_MINUTE, ONE_SECOND } from '../tools/utils/timeUtils'
import { findCommaSeparatedValue, generateUUID } from '../tools/utils/stringUtils'

@@ -4,0 +5,0 @@ export const COOKIE_ACCESS_DELAY = ONE_SECOND

import type { FetchStub, FetchStubManager, FetchStubPromise } from '../../test'
import { stubFetch } from '../../test'
import { isIE } from '../tools/browserDetection'
import { isIE } from '../tools/utils/browserDetection'
import type { Subscription } from '../tools/observable'

@@ -5,0 +5,0 @@ import type { FetchResolveContext, FetchContext } from './fetchObservable'

import { instrumentMethod } from '../tools/instrumentMethod'
import { callMonitored, monitor } from '../tools/monitor'
import { Observable } from '../tools/observable'
import type { ClocksState } from '../tools/timeUtils'
import { clocksNow } from '../tools/timeUtils'
import { normalizeUrl } from '../tools/urlPolyfill'
import type { ClocksState } from '../tools/utils/timeUtils'
import { clocksNow } from '../tools/utils/timeUtils'
import { normalizeUrl } from '../tools/utils/urlPolyfill'

@@ -8,0 +8,0 @@ interface FetchContextBase {

import { isExperimentalFeatureEnabled, ExperimentalFeature } from '../tools/experimentalFeatures'
import { Observable } from '../tools/observable'
import { includes, noop, objectValues } from '../tools/utils'
import { objectValues, includes } from '../tools/utils/polyfills'
import { noop } from '../tools/utils/functionUtils'
import { addEventListeners, addEventListener, DOM_EVENT } from './addEventListener'

@@ -13,3 +14,3 @@

type PageExitReason = (typeof PageExitReason)[keyof typeof PageExitReason]
export type PageExitReason = (typeof PageExitReason)[keyof typeof PageExitReason]

@@ -16,0 +17,0 @@ export interface PageExitEvent {

import { withXhr, stubXhr } from '../../test'
import { isIE } from '../tools/browserDetection'
import { isIE } from '../tools/utils/browserDetection'
import type { Subscription } from '../tools/observable'

@@ -4,0 +4,0 @@ import type { XhrCompleteContext, XhrContext } from './xhrObservable'

import { instrumentMethodAndCallOriginal } from '../tools/instrumentMethod'
import { monitor } from '../tools/monitor'
import { Observable } from '../tools/observable'
import type { Duration, RelativeTime, ClocksState } from '../tools/timeUtils'
import { elapsed, relativeNow, clocksNow, timeStampNow } from '../tools/timeUtils'
import { normalizeUrl } from '../tools/urlPolyfill'
import { shallowClone } from '../tools/utils'
import type { Duration, RelativeTime, ClocksState } from '../tools/utils/timeUtils'
import { elapsed, relativeNow, clocksNow, timeStampNow } from '../tools/utils/timeUtils'
import { normalizeUrl } from '../tools/utils/urlPolyfill'
import { shallowClone } from '../tools/utils/objectUtils'
import { addEventListener } from './addEventListener'

@@ -101,4 +101,4 @@ export interface XhrOpenContext {

const onEnd = monitor(() => {
this.removeEventListener('loadend', onEnd)
const onEnd = () => {
unsubscribeLoadEndListener()
stopInstrumentingOnReadyStateChange()

@@ -115,4 +115,6 @@ if (hasBeenReported) {

observable.notify(shallowClone(completeContext))
})
this.addEventListener('loadend', onEnd)
}
const { stop: unsubscribeLoadEndListener } = addEventListener(this, 'loadend', onEnd)
observable.notify(startContext)

@@ -119,0 +121,0 @@ }

@@ -5,5 +5,10 @@ import type { CookieOptions } from '../../browser/cookie'

import { display } from '../../tools/display'
import { assign, isPercentage, objectHasValue, ONE_KIBI_BYTE, ONE_SECOND } from '../../tools/utils'
import type { RawTelemetryConfiguration } from '../telemetry'
import { ExperimentalFeature, addExperimentalFeatures } from '../../tools/experimentalFeatures'
import type { Duration } from '../../tools/utils/timeUtils'
import { ONE_SECOND } from '../../tools/utils/timeUtils'
import { isPercentage } from '../../tools/utils/numberUtils'
import { ONE_KIBI_BYTE } from '../../tools/utils/byteUtils'
import { objectHasValue } from '../../tools/utils/objectUtils'
import { assign } from '../../tools/utils/polyfills'
import type { TransportConfiguration } from './transportConfiguration'

@@ -85,3 +90,3 @@ import { computeTransportConfiguration } from './transportConfiguration'

batchBytesLimit: number
flushTimeout: number
flushTimeout: Duration
batchMessagesLimit: number

@@ -149,3 +154,3 @@ messageBytesLimit: number

*/
flushTimeout: 30 * ONE_SECOND,
flushTimeout: (30 * ONE_SECOND) as Duration,

@@ -152,0 +157,0 @@ /**

import type { BuildEnvWindow } from '../../../test'
import { startsWith } from '../../tools/utils'
import {

@@ -8,2 +7,3 @@ ExperimentalFeature,

} from '../../tools/experimentalFeatures'
import { startsWith } from '../../tools/utils/polyfills'
import type { InitConfiguration } from './configuration'

@@ -126,3 +126,3 @@ import { createEndpointBuilder } from './endpointBuilder'

expect(
createEndpointBuilder(initConfiguration, 'rum', []).build('xhr', 'batch_bytes_limit', {
createEndpointBuilder(initConfiguration, 'rum', []).build('xhr', 'bytes_limit', {
count: 5,

@@ -136,4 +136,4 @@ lastFailureStatus: 408,

addExperimentalFeatures([ExperimentalFeature.COLLECT_FLUSH_REASON])
expect(createEndpointBuilder(initConfiguration, 'rum', []).build('xhr', 'batch_bytes_limit')).toContain(
'flush_reason%3Abatch_bytes_limit'
expect(createEndpointBuilder(initConfiguration, 'rum', []).build('xhr', 'bytes_limit')).toContain(
'flush_reason%3Abytes_limit'
)

@@ -143,3 +143,3 @@ })

it('should not contain flush reason when ff collect_flush_reason is disnabled', () => {
expect(createEndpointBuilder(initConfiguration, 'rum', []).build('xhr', 'batch_bytes_limit')).not.toContain(
expect(createEndpointBuilder(initConfiguration, 'rum', []).build('xhr', 'bytes_limit')).not.toContain(
'flush_reason'

@@ -146,0 +146,0 @@ )

import type { RetryInfo, FlushReason } from '../../transport'
import { timeStampNow } from '../../tools/timeUtils'
import { normalizeUrl } from '../../tools/urlPolyfill'
import { generateUUID } from '../../tools/utils'
import { timeStampNow } from '../../tools/utils/timeUtils'
import { normalizeUrl } from '../../tools/utils/urlPolyfill'
import { ExperimentalFeature, isExperimentalFeatureEnabled } from '../../tools/experimentalFeatures'
import { generateUUID } from '../../tools/utils/stringUtils'
import type { InitConfiguration } from './configuration'

@@ -7,0 +7,0 @@ import { INTAKE_SITE_AP1, INTAKE_SITE_US1 } from './intakeSites'

export const INTAKE_SITE_STAGING = 'datad0g.com'
export const INTAKE_SITE_US1 = 'datadoghq.com'
export const INTAKE_SITE_EU1 = 'datadoghq.eu'
export const INTAKE_SITE_AP1 = 'ap1.datadoghq.com'
export const INTAKE_SITE_US1_FED = 'ddog-gov.com'

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

import { assign, objectValues } from '../../tools/utils'
import { objectValues, assign } from '../../tools/utils/polyfills'
import type { InitConfiguration } from './configuration'

@@ -3,0 +3,0 @@ import type { EndpointBuilder } from './endpointBuilder'

/* eslint-disable no-console */
import { isIE } from '../../tools/browserDetection'
import { isIE } from '../../tools/utils/browserDetection'
import { ConsoleApiName } from '../../tools/display'

@@ -4,0 +4,0 @@ import type { Subscription } from '../../tools/observable'

import { computeStackTrace } from '../tracekit'
import { createHandlingStack, formatErrorMessage, toStackTraceString } from '../error/error'
import { mergeObservables, Observable } from '../../tools/observable'
import { find, jsonStringify } from '../../tools/utils'
import { ConsoleApiName } from '../../tools/display'
import { callMonitored } from '../../tools/monitor'
import { sanitize } from '../../tools/sanitize'
import { sanitize } from '../../tools/serialisation/sanitize'
import { ExperimentalFeature, isExperimentalFeatureEnabled } from '../../tools/experimentalFeatures'
import { find } from '../../tools/utils/polyfills'
import { jsonStringify } from '../../tools/serialisation/jsonStringify'

@@ -10,0 +11,0 @@ export interface ConsoleLog {

import type { StackTrace } from '../tracekit'
import { clocksNow } from '../../tools/timeUtils'
import { clocksNow } from '../../tools/utils/timeUtils'
import type { RawErrorCause, ErrorWithCause } from './error'

@@ -4,0 +4,0 @@ import {

@@ -5,5 +5,6 @@ import type { StackTrace } from '../tracekit'

import { callMonitored } from '../../tools/monitor'
import { sanitize } from '../../tools/sanitize'
import type { ClocksState } from '../../tools/timeUtils'
import { jsonStringify, noop } from '../../tools/utils'
import { sanitize } from '../../tools/serialisation/sanitize'
import type { ClocksState } from '../../tools/utils/timeUtils'
import { noop } from '../../tools/utils/functionUtils'
import { jsonStringify } from '../../tools/serialisation/jsonStringify'

@@ -10,0 +11,0 @@ export const NO_ERROR_STACK_PRESENT_MESSAGE = 'No stack, consider using an instance of Error'

import type { Observable } from '../../tools/observable'
import { clocksNow } from '../../tools/timeUtils'
import { clocksNow } from '../../tools/utils/timeUtils'
import { startUnhandledErrorCollection } from '../tracekit'

@@ -4,0 +4,0 @@ import { ErrorSource, computeRawError, ErrorHandling } from './error'

import type { Clock } from '../../../test'
import { mockClock } from '../../../test'
import type { RawError } from '../error/error'
import type { RelativeTime } from '../../tools/timeUtils'
import { relativeToClocks, resetNavigationStart } from '../../tools/timeUtils'
import { noop, ONE_MINUTE } from '../../tools/utils'
import type { RelativeTime } from '../../tools/utils/timeUtils'
import { relativeToClocks, resetNavigationStart, ONE_MINUTE } from '../../tools/utils/timeUtils'
import { noop } from '../../tools/utils/functionUtils'
import { createEventRateLimiter } from './createEventRateLimiter'

@@ -8,0 +8,0 @@ import type { EventRateLimiter } from './createEventRateLimiter'

import { setTimeout } from '../../tools/timer'
import type { RawError } from '../error/error'
import { ErrorSource } from '../error/error'
import { clocksNow } from '../../tools/timeUtils'
import { ONE_MINUTE } from '../../tools/utils'
import { clocksNow, ONE_MINUTE } from '../../tools/utils/timeUtils'

@@ -7,0 +6,0 @@ export type EventRateLimiter = ReturnType<typeof createEventRateLimiter>

import { toStackTraceString } from '../error/error'
import { monitor } from '../../tools/monitor'
import { mergeObservables, Observable } from '../../tools/observable'
import { includes, safeTruncate } from '../../tools/utils'
import { addEventListener, DOM_EVENT } from '../../browser/addEventListener'
import { includes } from '../../tools/utils/polyfills'
import { safeTruncate } from '../../tools/utils/stringUtils'
import type { Report, BrowserWindow, ReportType } from './browser.types'

@@ -66,8 +67,6 @@

const observable = new Observable<RawReport>(() => {
const handleCspViolation = monitor((event: SecurityPolicyViolationEvent) => {
const { stop } = addEventListener(document, DOM_EVENT.SECURITY_POLICY_VIOLATION, (event) => {
observable.notify(buildRawReportFromCspViolation(event))
})
const { stop } = addEventListener(document, DOM_EVENT.SECURITY_POLICY_VIOLATION, handleCspViolation)
return stop

@@ -74,0 +73,0 @@ })

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

import { ONE_HOUR, ONE_MINUTE } from '../../tools/utils'
import { ONE_HOUR, ONE_MINUTE } from '../../tools/utils/timeUtils'
export const SESSION_TIME_OUT_DELAY = 4 * ONE_HOUR
export const SESSION_EXPIRATION_DELAY = 15 * ONE_MINUTE
import { mockClock, stubCookie } from '../../../test'
import { isChromium } from '../../tools/browserDetection'
import { isChromium } from '../../tools/utils/browserDetection'
import {

@@ -4,0 +4,0 @@ SESSION_COOKIE_NAME,

import type { CookieOptions } from '../../browser/cookie'
import { deleteCookie, getCookie, setCookie } from '../../browser/cookie'
import { setTimeout } from '../../tools/timer'
import { isChromium } from '../../tools/browserDetection'
import { dateNow } from '../../tools/timeUtils'
import * as utils from '../../tools/utils'
import { isChromium } from '../../tools/utils/browserDetection'
import { dateNow } from '../../tools/utils/timeUtils'
import { objectEntries } from '../../tools/utils/polyfills'
import { isEmptyObject } from '../../tools/utils/objectUtils'
import { generateUUID } from '../../tools/utils/stringUtils'
import { SESSION_EXPIRATION_DELAY } from './sessionConstants'

@@ -49,3 +51,3 @@ import type { SessionState } from './sessionStore'

// acquire lock
currentLock = utils.generateUUID()
currentLock = generateUUID()
currentSession.lock = currentLock

@@ -129,4 +131,3 @@ setSessionCookie(currentSession, operations.options)

export function toSessionString(session: SessionState) {
return utils
.objectEntries(session)
return objectEntries(session)
.map(([key, value]) => `${key}=${value as string}`)

@@ -163,3 +164,3 @@ .join(SESSION_ENTRY_SEPARATOR)

function isExpiredState(session: SessionState) {
return utils.isEmptyObject(session)
return isEmptyObject(session)
}

@@ -5,6 +5,6 @@ import { createNewEvent, mockClock, restorePageVisibility, setPageVisibility } from '../../../test'

import { COOKIE_ACCESS_DELAY, getCookie, setCookie } from '../../browser/cookie'
import { ONE_HOUR, ONE_SECOND } from '../../tools/utils'
import type { RelativeTime } from '../../tools/timeUtils'
import { isIE } from '../../tools/browserDetection'
import type { RelativeTime } from '../../tools/utils/timeUtils'
import { isIE } from '../../tools/utils/browserDetection'
import { DOM_EVENT } from '../../browser/addEventListener'
import { ONE_HOUR, ONE_SECOND } from '../../tools/utils/timeUtils'
import type { SessionManager } from './sessionManager'

@@ -11,0 +11,0 @@ import { startSessionManager, stopSessionManager, VISIBILITY_CHECK_DELAY } from './sessionManager'

import type { CookieOptions } from '../../browser/cookie'
import type { Observable } from '../../tools/observable'
import * as utils from '../../tools/utils'
import type { Context } from '../../tools/context'
import { ContextHistory } from '../../tools/contextHistory'
import type { RelativeTime } from '../../tools/timeUtils'
import { relativeNow, clocksOrigin } from '../../tools/timeUtils'
import type { Context } from '../../tools/serialisation/context'
import { ValueHistory } from '../../tools/valueHistory'
import type { RelativeTime } from '../../tools/utils/timeUtils'
import { relativeNow, clocksOrigin, ONE_MINUTE } from '../../tools/utils/timeUtils'
import { DOM_EVENT, addEventListener, addEventListeners } from '../../browser/addEventListener'

@@ -26,3 +25,3 @@ import { clearInterval, setInterval } from '../../tools/timer'

export const VISIBILITY_CHECK_DELAY = utils.ONE_MINUTE
export const VISIBILITY_CHECK_DELAY = ONE_MINUTE
const SESSION_CONTEXT_TIMEOUT_DELAY = SESSION_TIME_OUT_DELAY

@@ -40,3 +39,3 @@ let stopCallbacks: Array<() => void> = []

const sessionContextHistory = new ContextHistory<SessionContext<TrackingType>>(SESSION_CONTEXT_TIMEOUT_DELAY)
const sessionContextHistory = new ValueHistory<SessionContext<TrackingType>>(SESSION_CONTEXT_TIMEOUT_DELAY)
stopCallbacks.push(() => sessionContextHistory.stop())

@@ -43,0 +42,0 @@

@@ -5,4 +5,5 @@ import type { CookieOptions } from '../../browser/cookie'

import { Observable } from '../../tools/observable'
import { dateNow } from '../../tools/timeUtils'
import * as utils from '../../tools/utils'
import { dateNow } from '../../tools/utils/timeUtils'
import { throttle } from '../../tools/utils/functionUtils'
import { generateUUID } from '../../tools/utils/stringUtils'
import { SESSION_TIME_OUT_DELAY } from './sessionConstants'

@@ -103,3 +104,3 @@ import { deleteSessionCookie, retrieveSessionCookie, withCookieLockAccess } from './sessionCookieStore'

if (isTracked && !cookieSession.id) {
cookieSession.id = utils.generateUUID()
cookieSession.id = generateUUID()
cookieSession.created = String(dateNow())

@@ -146,3 +147,3 @@ }

return {
expandOrRenewSession: utils.throttle(expandOrRenewSession, COOKIE_ACCESS_DELAY).throttled,
expandOrRenewSession: throttle(expandOrRenewSession, COOKIE_ACCESS_DELAY).throttled,
expandSession,

@@ -149,0 +150,0 @@ getSession: () => sessionCache,

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

import type { Context } from '../../tools/context'
import type { Context } from '../../tools/serialisation/context'
import { ConsoleApiName } from '../../tools/display'
import { toStackTraceString } from '../error/error'
import { assign, combine, jsonStringify, performDraw, includes, startsWith, arrayFrom } from '../../tools/utils'
import { getExperimentalFeatures } from '../../tools/experimentalFeatures'

@@ -11,5 +10,9 @@ import type { Configuration } from '../configuration'

import { Observable } from '../../tools/observable'
import { timeStampNow } from '../../tools/timeUtils'
import { timeStampNow } from '../../tools/utils/timeUtils'
import { displayIfDebugEnabled, startMonitorErrorCollection } from '../../tools/monitor'
import { sendToExtension } from '../../tools/sendToExtension'
import { startsWith, arrayFrom, includes, assign } from '../../tools/utils/polyfills'
import { performDraw } from '../../tools/utils/numberUtils'
import { jsonStringify } from '../../tools/serialisation/jsonStringify'
import { combine } from '../../tools/mergeInto'
import type { TelemetryEvent } from './telemetryEvent.types'

@@ -16,0 +19,0 @@ import type { RawTelemetryConfiguration, RawTelemetryEvent } from './rawTelemetryEvent.types'

@@ -234,2 +234,9 @@ export const OPERA_25 = {

export const CHROME_111_SNIPPET = {
message: 'message string',
name: 'Error',
stack: `Error: message string
at snippet:///snippet_file:1:13`,
}
export const PHANTOMJS_1_19 = {

@@ -236,0 +243,0 @@ stack: `Error: foo

@@ -715,2 +715,15 @@ import { isSafari } from '../../../test'

it('should parse errors from Chrome Snippets', () => {
const stackFrames = computeStackTrace(CapturedExceptions.CHROME_111_SNIPPET)
expect(stackFrames.stack.length).toEqual(1)
expect(stackFrames.stack[0]).toEqual({
args: [],
column: 13,
func: '?',
line: 1,
url: 'snippet:///snippet_file',
})
})
it('should parse empty IE 9 error', () => {

@@ -717,0 +730,0 @@ const stackFrames = computeStackTrace(CapturedExceptions.IE_9)

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

import { startsWith } from '../../tools/utils'
import { startsWith } from '../../tools/utils/polyfills'
import type { StackTrace, StackFrame } from './types'

@@ -37,3 +37,3 @@

}
const fileUrl = '((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\\w+\\.|\\/).*?)'
const fileUrl = '((?:file|https?|blob|chrome-extension|native|eval|webpack|snippet|<anonymous>|\\w+\\.|\\/).*?)'
const filePosition = '(?::(\\d+))'

@@ -40,0 +40,0 @@ const CHROME_LINE_RE = new RegExp(`^\\s*at (.*?) ?\\(${fileUrl}${filePosition}?${filePosition}?\\)?\\s*$`, 'i')

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

import type { Context } from '../../tools/context'
import type { Context } from '../../tools/serialisation/context'
import { display } from '../../tools/display'
import { assign, getType } from '../../tools/utils'
import { getType } from '../../tools/utils/typeUtils'
import { assign } from '../../tools/utils/polyfills'
import type { User } from './user.types'

@@ -5,0 +6,0 @@

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

serializeConfiguration,
INTAKE_SITE_AP1,
INTAKE_SITE_STAGING,
INTAKE_SITE_US1,
INTAKE_SITE_US1_FED,
INTAKE_SITE_EU1,
} from './domain/configuration'

@@ -55,15 +60,17 @@ export {

Batch,
BatchFlushEvent,
canUseEventBridge,
getEventBridge,
startBatchWithReplica,
createFlushController,
FlushEvent,
FlushReason,
} from './transport'
export * from './tools/display'
export * from './tools/urlPolyfill'
export * from './tools/timeUtils'
export * from './tools/utils'
export * from './tools/sanitize'
export * from './tools/utils/urlPolyfill'
export * from './tools/utils/timeUtils'
export * from './tools/utils/arrayUtils'
export * from './tools/serialisation/sanitize'
export * from './tools/getGlobalObject'
export * from './domain/eventRateLimiter/createEventRateLimiter'
export * from './tools/browserDetection'
export * from './tools/utils/browserDetection'
export { sendToExtension } from './tools/sendToExtension'

@@ -86,3 +93,3 @@ export { runOnReadyState } from './browser/runOnReadyState'

} from './domain/error/error'
export { Context, ContextArray, ContextValue } from './tools/context'
export { Context, ContextArray, ContextValue } from './tools/serialisation/context'
export { areCookiesAuthorized, getCookie, setCookie, deleteCookie, COOKIE_ACCESS_DELAY } from './browser/cookie'

@@ -97,6 +104,9 @@ export { initXhrObservable, XhrCompleteContext, XhrStartContext } from './browser/xhrObservable'

export { catchUserErrors } from './tools/catchUserErrors'
export { createContextManager, ContextManager } from './tools/contextManager'
export { warnIfCustomerDataLimitReached, CustomerDataType } from './tools/heavyCustomerDataWarning'
export { limitModification } from './tools/limitModification'
export { ContextHistory, ContextHistoryEntry, CLEAR_OLD_CONTEXTS_INTERVAL } from './tools/contextHistory'
export { createContextManager, ContextManager } from './tools/serialisation/contextManager'
export {
warnIfCustomerDataLimitReached,
CustomerDataType,
CUSTOMER_DATA_BYTES_LIMIT,
} from './tools/serialisation/heavyCustomerDataWarning'
export { ValueHistory, ValueHistoryEntry, CLEAR_OLD_VALUES_INTERVAL } from './tools/valueHistory'
export { readBytesFromStream } from './tools/readBytesFromStream'

@@ -110,1 +120,13 @@ export { SESSION_COOKIE_NAME } from './domain/session/sessionCookieStore'

export { User, checkUser, sanitizeUser } from './domain/user'
export * from './domain/resourceUtils'
export * from './tools/utils/polyfills'
export * from './tools/utils/numberUtils'
export * from './tools/utils/byteUtils'
export * from './tools/utils/objectUtils'
export * from './tools/utils/functionUtils'
export * from './tools/serialisation/jsonStringify'
export * from './tools/mergeInto'
export * from './tools/utils/stringUtils'
export * from './tools/matchOption'
export * from './tools/utils/responseUtils'
export * from './tools/utils/typeUtils'

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

PAGEHIDE = 'pagehide',
SHADOW_DOM_DEBUG = 'shadow_dom_debug',
FEATURE_FLAGS = 'feature_flags',
RESOURCE_DURATIONS = 'resource_durations',
RESOURCE_PAGE_STATES = 'resource_page_states',

@@ -20,0 +18,0 @@ CLICKMAP = 'clickmap',

@@ -5,3 +5,3 @@ import { stubZoneJs } from '../../test'

import { getZoneJsOriginalValue } from './getZoneJsOriginalValue'
import { noop } from './utils'
import { noop } from './utils/functionUtils'

@@ -8,0 +8,0 @@ describe('getZoneJsOriginalValue', () => {

import { mockClock, stubZoneJs } from '../../test'
import type { Clock } from '../../test'
import { instrumentMethod, instrumentSetter } from './instrumentMethod'
import { noop } from './utils'
import { noop } from './utils/functionUtils'

@@ -6,0 +6,0 @@ describe('instrumentMethod', () => {

import { setTimeout } from './timer'
import { callMonitored } from './monitor'
import { noop } from './utils'
import { noop } from './utils/functionUtils'

@@ -5,0 +5,0 @@ export function instrumentMethod<OBJECT extends { [key: string]: any }, METHOD extends keyof OBJECT>(

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

import { isIE } from './browserDetection'
import { isIE } from './utils/browserDetection'
import { readBytesFromStream } from './readBytesFromStream'

@@ -3,0 +3,0 @@

import { monitor } from './monitor'
import { noop } from './utils'
import { noop } from './utils/functionUtils'

@@ -4,0 +4,0 @@ type Options = {

import { mockClock, stubZoneJs } from '../../test'
import type { Clock } from '../../test'
import { noop } from './utils'
import { resetMonitor, startMonitorErrorCollection } from './monitor'
import { setTimeout, clearTimeout, setInterval, clearInterval } from './timer'
import { noop } from './utils/functionUtils'
;[

@@ -7,0 +7,0 @@ {

@@ -1,45 +0,42 @@

import sinon from 'sinon'
import type { PageExitEvent } from '../browser/pageExitObservable'
import { PageExitReason } from '../browser/pageExitObservable'
import { Observable } from '../tools/observable'
import { noop } from '../tools/utils'
import type { FlushReason } from './batch'
import type { MockFlushController } from '../../test'
import { createMockFlushController } from '../../test'
import { display } from '../tools/display'
import { Batch } from './batch'
import type { FlushReason } from './flushController'
import type { HttpRequest } from './httpRequest'
describe('batch', () => {
const BATCH_MESSAGES_LIMIT = 3
const BATCH_BYTES_LIMIT = 100
const MESSAGE_BYTES_LIMIT = 50 * 1024
const FLUSH_TIMEOUT = 60 * 1000
const MESSAGE_BYTES_LIMIT = 50
const BIG_MESSAGE_OVER_BYTES_LIMIT = { message: 'hello xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' }
const SMALL_MESSAGE = { message: 'hello' }
const SMALL_MESSAGE_BYTES_COUNT = 19
const SEPARATOR_BYTES_COUNT = 1
let batch: Batch
let transport: HttpRequest
let sendSpy: jasmine.Spy<HttpRequest['send']>
let pageExitObservable: Observable<PageExitEvent>
let flushNotifySpy: jasmine.Spy
const flushReason: FlushReason = 'batch_bytes_limit'
let transport: {
send: jasmine.Spy<HttpRequest['send']>
sendOnExit: jasmine.Spy<HttpRequest['sendOnExit']>
}
const flushReason: FlushReason = 'bytes_limit'
let flushController: MockFlushController
beforeEach(() => {
transport = { send: noop } as unknown as HttpRequest
sendSpy = spyOn(transport, 'send')
pageExitObservable = new Observable()
batch = new Batch(
transport,
BATCH_MESSAGES_LIMIT,
BATCH_BYTES_LIMIT,
MESSAGE_BYTES_LIMIT,
FLUSH_TIMEOUT,
pageExitObservable
)
flushNotifySpy = spyOn(batch.flushObservable, 'notify')
transport = {
send: jasmine.createSpy(),
sendOnExit: jasmine.createSpy(),
} satisfies HttpRequest
flushController = createMockFlushController()
batch = new Batch(transport, flushController, MESSAGE_BYTES_LIMIT)
})
it('should add context to message', () => {
batch.add({ message: 'hello' })
it('should send a message', () => {
batch.add(SMALL_MESSAGE)
batch.flush(flushReason)
flushController.notifyFlush()
expect(sendSpy.calls.mostRecent().args[0]).toEqual({
expect(transport.send.calls.mostRecent().args[0]).toEqual({
data: '{"message":"hello"}',
bytesCount: jasmine.any(Number),
bytesCount: SMALL_MESSAGE_BYTES_COUNT,
flushReason,

@@ -49,92 +46,43 @@ })

it('should empty the batch after a flush', () => {
batch.add({ message: 'hello' })
it('should add message to the flush controller', () => {
batch.add(SMALL_MESSAGE)
batch.flush(flushReason)
sendSpy.calls.reset()
batch.flush(flushReason)
expect(transport.send).not.toHaveBeenCalled()
expect(flushController.notifyBeforeAddMessage).toHaveBeenCalledOnceWith(SMALL_MESSAGE_BYTES_COUNT)
expect(flushController.notifyAfterAddMessage).toHaveBeenCalledOnceWith()
})
it('should flush when the message count limit is reached', () => {
batch.add({ message: '1' })
batch.add({ message: '2' })
batch.add({ message: '3' })
expect(sendSpy.calls.mostRecent().args[0]).toEqual({
data: '{"message":"1"}\n{"message":"2"}\n{"message":"3"}',
bytesCount: jasmine.any(Number),
flushReason,
})
})
it('should consider separators when adding message', () => {
batch.add(SMALL_MESSAGE)
batch.add(SMALL_MESSAGE)
batch.add(SMALL_MESSAGE)
it('should flush when a new message will overflow the bytes limit', () => {
batch.add({ message: '50 bytes - xxxxxxxxxxxxxxxxxxxxxxxxx' })
expect(sendSpy).not.toHaveBeenCalled()
batch.add({ message: '60 bytes - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' })
expect(sendSpy).toHaveBeenCalledWith({
data: '{"message":"50 bytes - xxxxxxxxxxxxxxxxxxxxxxxxx"}',
bytesCount: 50,
flushReason,
})
batch.flush(flushReason)
expect(sendSpy).toHaveBeenCalledWith({
data: '{"message":"60 bytes - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}',
bytesCount: 60,
flushReason,
})
expect(flushController.notifyBeforeAddMessage.calls.allArgs()).toEqual([
[SMALL_MESSAGE_BYTES_COUNT],
[SMALL_MESSAGE_BYTES_COUNT + SEPARATOR_BYTES_COUNT],
[SMALL_MESSAGE_BYTES_COUNT + SEPARATOR_BYTES_COUNT],
])
})
it('should consider separators when computing the byte count', () => {
batch.add({ message: '30 bytes - xxxxx' }) // batch: 30 sep: 0
batch.add({ message: '30 bytes - xxxxx' }) // batch: 60 sep: 1
batch.add({ message: '39 bytes - xxxxxxxxxxxxxx' }) // batch: 99 sep: 2
it('should consider separators when replacing messages', () => {
batch.add(SMALL_MESSAGE)
batch.upsert(SMALL_MESSAGE, 'a')
expect(sendSpy).toHaveBeenCalledWith({
data: '{"message":"30 bytes - xxxxx"}\n{"message":"30 bytes - xxxxx"}',
bytesCount: 61,
flushReason,
})
})
flushController.notifyBeforeAddMessage.calls.reset()
it('should call send one time when the byte count is too high and the batch is empty', () => {
const message = '101 bytes - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
batch.add({ message })
expect(sendSpy).toHaveBeenCalledWith({ data: `{"message":"${message}"}`, bytesCount: 101, flushReason })
})
batch.upsert(SMALL_MESSAGE, 'a')
it('should flush the batch and send the message when the message is too heavy', () => {
const message = '101 bytes - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
batch.add({ message: '50 bytes - xxxxxxxxxxxxxxxxxxxxxxxxx' })
batch.add({ message })
expect(sendSpy).toHaveBeenCalledTimes(2)
expect(flushController.notifyAfterRemoveMessage).toHaveBeenCalledOnceWith(
SMALL_MESSAGE_BYTES_COUNT + SEPARATOR_BYTES_COUNT
)
expect(flushController.notifyBeforeAddMessage).toHaveBeenCalledOnceWith(
SMALL_MESSAGE_BYTES_COUNT + SEPARATOR_BYTES_COUNT
)
})
it('should flush after timeout', () => {
const clock = sinon.useFakeTimers()
batch = new Batch(transport, BATCH_MESSAGES_LIMIT, BATCH_BYTES_LIMIT, MESSAGE_BYTES_LIMIT, 10, pageExitObservable)
batch.add({ message: '50 bytes - xxxxxxxxxxxxxxxxxxxxxxxxx' })
clock.tick(100)
expect(sendSpy).toHaveBeenCalled()
clock.restore()
})
it('should flush on page exit', () => {
batch.add({ message: '1' })
pageExitObservable.notify({ reason: PageExitReason.UNLOADING })
expect(sendSpy).toHaveBeenCalledTimes(1)
})
it('should not send a message with a bytes size above the limit', () => {
const warnStub = sinon.stub(console, 'warn')
batch = new Batch(transport, BATCH_MESSAGES_LIMIT, BATCH_BYTES_LIMIT, 50, FLUSH_TIMEOUT, pageExitObservable)
batch.add({ message: '50 bytes - xxxxxxxxxxxxx' })
const warnSpy = spyOn(display, 'warn')
batch.add(BIG_MESSAGE_OVER_BYTES_LIMIT)
expect(sendSpy).not.toHaveBeenCalled()
warnStub.restore()
expect(warnSpy).toHaveBeenCalled()
expect(flushController.notifyBeforeAddMessage).not.toHaveBeenCalled()
})

@@ -147,4 +95,5 @@

batch.upsert({ message: '4' }, 'c')
flushController.notifyFlush()
expect(sendSpy.calls.mostRecent().args[0]).toEqual({
expect(transport.send.calls.mostRecent().args[0]).toEqual({
data: '{"message":"2"}\n{"message":"3"}\n{"message":"4"}',

@@ -158,4 +107,5 @@ bytesCount: jasmine.any(Number),

batch.upsert({ message: '7' }, 'a')
flushController.notifyFlush()
expect(sendSpy.calls.mostRecent().args[0]).toEqual({
expect(transport.send.calls.mostRecent().args[0]).toEqual({
data: '{"message":"5"}\n{"message":"6"}\n{"message":"7"}',

@@ -170,5 +120,5 @@ bytesCount: jasmine.any(Number),

batch.upsert({ message: '11' }, 'b')
batch.flush(flushReason)
flushController.notifyFlush()
expect(sendSpy.calls.mostRecent().args[0]).toEqual({
expect(transport.send.calls.mostRecent().args[0]).toEqual({
data: '{"message":"10"}\n{"message":"11"}',

@@ -181,30 +131,17 @@ bytesCount: jasmine.any(Number),

it('should be able to use telemetry in the httpRequest.send', () => {
const fakeRequest = {
send(data: string) {
addTelemetryDebugFake()
transport.send({ data, bytesCount: BATCH_BYTES_LIMIT, flushReason })
},
} as unknown as HttpRequest
const batch = new Batch(
fakeRequest,
BATCH_MESSAGES_LIMIT,
BATCH_BYTES_LIMIT,
MESSAGE_BYTES_LIMIT,
FLUSH_TIMEOUT,
pageExitObservable
)
transport.send.and.callFake(() => {
addTelemetryDebugFake()
})
const addTelemetryDebugFake = () => batch.add({ message: 'telemetry message' })
batch.add({ message: 'normal message' })
batch.flush(flushReason)
expect(sendSpy).toHaveBeenCalledTimes(1)
batch.flush(flushReason)
expect(sendSpy).toHaveBeenCalledTimes(2)
})
expect(flushController.notifyBeforeAddMessage).toHaveBeenCalledTimes(1)
it('should notify when the batch is flushed', () => {
batch.add({})
batch.flush(flushReason)
expect(flushNotifySpy).toHaveBeenCalledOnceWith({ bufferBytesCount: 2, bufferMessagesCount: 1 })
flushController.notifyFlush()
expect(transport.send).toHaveBeenCalledTimes(1)
expect(flushController.notifyBeforeAddMessage).toHaveBeenCalledTimes(2)
flushController.notifyFlush()
expect(transport.send).toHaveBeenCalledTimes(2)
})
})
import { display } from '../tools/display'
import type { Context } from '../tools/context'
import { computeBytesCount, jsonStringify, objectValues } from '../tools/utils'
import { Observable } from '../tools/observable'
import { setTimeout } from '../tools/timer'
import type { PageExitEvent } from '../browser/pageExitObservable'
import type { Context } from '../tools/serialisation/context'
import { objectValues } from '../tools/utils/polyfills'
import { isPageExitReason } from '../browser/pageExitObservable'
import { computeBytesCount } from '../tools/utils/byteUtils'
import { jsonStringify } from '../tools/serialisation/jsonStringify'
import type { HttpRequest } from './httpRequest'
import type { FlushController, FlushEvent } from './flushController'
export interface BatchFlushEvent {
bufferBytesCount: number
bufferMessagesCount: number
}
export type FlushReason =
| 'batch_duration_limit'
| 'batch_bytes_limit'
| 'before_unload'
| 'page_hide'
| 'visibility_hidden'
| 'page_frozen'
export class Batch {
flushObservable = new Observable<BatchFlushEvent>()
private pushOnlyBuffer: string[] = []
private upsertBuffer: { [key: string]: string } = {}
private bufferBytesCount = 0
private bufferMessagesCount = 0
constructor(
private request: HttpRequest,
private batchMessagesLimit: number,
private batchBytesLimit: number,
private messageBytesLimit: number,
private flushTimeout: number,
private pageExitObservable: Observable<PageExitEvent>
private flushController: FlushController,
private messageBytesLimit: number
) {
pageExitObservable.subscribe((event) => this.flush(event.reason, this.request.sendOnExit))
this.flushPeriodically()
this.flushController.flushObservable.subscribe((event) => this.flush(event))
}

@@ -50,18 +30,13 @@

flush(flushReason: FlushReason, sendFn = this.request.send) {
if (this.bufferMessagesCount !== 0) {
const messages = this.pushOnlyBuffer.concat(objectValues(this.upsertBuffer))
const bytesCount = this.bufferBytesCount
private flush(event: FlushEvent) {
const messages = this.pushOnlyBuffer.concat(objectValues(this.upsertBuffer))
this.flushObservable.notify({
bufferBytesCount: this.bufferBytesCount,
bufferMessagesCount: this.bufferMessagesCount,
})
this.pushOnlyBuffer = []
this.upsertBuffer = {}
this.pushOnlyBuffer = []
this.upsertBuffer = {}
this.bufferBytesCount = 0
this.bufferMessagesCount = 0
sendFn({ data: messages.join('\n'), bytesCount, flushReason })
const payload = { data: messages.join('\n'), bytesCount: event.bytesCount, flushReason: event.reason }
if (isPageExitReason(event.reason)) {
this.request.sendOnExit(payload)
} else {
this.request.send(payload)
}

@@ -72,2 +47,3 @@ }

const { processedMessage, messageBytesCount } = this.process(message)
if (messageBytesCount >= this.messageBytesLimit) {

@@ -79,13 +55,8 @@ display.warn(

}
if (this.hasMessageFor(key)) {
this.remove(key)
}
if (this.willReachedBytesLimitWith(messageBytesCount)) {
this.flush('batch_bytes_limit')
}
this.push(processedMessage, messageBytesCount, key)
if (this.isFull()) {
this.flush('batch_bytes_limit')
}
}

@@ -100,6 +71,6 @@

private push(processedMessage: string, messageBytesCount: number, key?: string) {
if (this.bufferMessagesCount > 0) {
// \n separator at serialization
this.bufferBytesCount += 1
}
// If there are other messages, a '\n' will be added at serialization
const separatorBytesCount = this.flushController.messagesCount > 0 ? 1 : 0
this.flushController.notifyBeforeAddMessage(messageBytesCount + separatorBytesCount)
if (key !== undefined) {

@@ -110,4 +81,3 @@ this.upsertBuffer[key] = processedMessage

}
this.bufferBytesCount += messageBytesCount
this.bufferMessagesCount += 1
this.flushController.notifyAfterAddMessage()
}

@@ -119,7 +89,5 @@

const messageBytesCount = computeBytesCount(removedMessage)
this.bufferBytesCount -= messageBytesCount
this.bufferMessagesCount -= 1
if (this.bufferMessagesCount > 0) {
this.bufferBytesCount -= 1
}
// If there are other messages, a '\n' will be added at serialization
const separatorBytesCount = this.flushController.messagesCount > 1 ? 1 : 0
this.flushController.notifyAfterRemoveMessage(messageBytesCount + separatorBytesCount)
}

@@ -130,18 +98,2 @@

}
private willReachedBytesLimitWith(messageBytesCount: number) {
// byte of the separator at the end of the message
return this.bufferBytesCount + messageBytesCount + 1 >= this.batchBytesLimit
}
private isFull() {
return this.bufferMessagesCount === this.batchMessagesLimit || this.bufferBytesCount >= this.batchBytesLimit
}
private flushPeriodically() {
setTimeout(() => {
this.flush('batch_duration_limit')
this.flushPeriodically()
}, this.flushTimeout)
}
}

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

import { endsWith } from '../tools/utils'
import { endsWith } from '../tools/utils/polyfills'
import { getGlobalObject } from '../tools/getGlobalObject'

@@ -3,0 +3,0 @@

@@ -5,3 +5,3 @@ import { collectAsyncCalls, stubEndpointBuilder, interceptRequests } from '../../test'

import { createEndpointBuilder } from '../domain/configuration'
import { noop } from '../tools/utils'
import { noop } from '../tools/utils/functionUtils'
import { createHttpRequest, fetchKeepAliveStrategy, sendXHR } from './httpRequest'

@@ -8,0 +8,0 @@ import type { HttpRequest } from './httpRequest'

import type { EndpointBuilder } from '../domain/configuration'
import { addTelemetryError } from '../domain/telemetry'
import type { Context } from '../tools/context'
import type { Context } from '../tools/serialisation/context'
import { monitor } from '../tools/monitor'
import type { RawError } from '../domain/error/error'
import { addEventListener } from '../browser/addEventListener'
import { newRetryState, sendWithRetryStrategy } from './sendWithRetryStrategy'
import type { FlushReason } from './batch'
import type { FlushReason } from './flushController'

@@ -126,11 +127,16 @@ /**

const request = new XMLHttpRequest()
const onLoadEnd = monitor(() => {
// prevent multiple onResponse callbacks
// if the xhr instance is reused by a third party
request.removeEventListener('loadend', onLoadEnd)
onResponse?.({ status: request.status })
})
request.open('POST', url, true)
request.addEventListener('loadend', onLoadEnd)
addEventListener(
request,
'loadend',
() => {
onResponse?.({ status: request.status })
},
{
// prevent multiple onResponse callbacks
// if the xhr instance is reused by a third party
once: true,
}
)
request.send(data)
}
export { HttpRequest, createHttpRequest, Payload, RetryInfo } from './httpRequest'
export { Batch, BatchFlushEvent, FlushReason } from './batch'
export { Batch } from './batch'
export { canUseEventBridge, getEventBridge, BrowserWindowWithEventBridge } from './eventBridge'
export { startBatchWithReplica } from './startBatchWithReplica'
export { createFlushController, FlushController, FlushEvent, FlushReason } from './flushController'
import type { EndpointType } from '../domain/configuration'
import { setTimeout } from '../tools/timer'
import type { RawError } from '../domain/error/error'
import { clocksNow } from '../tools/timeUtils'
import { ONE_KIBI_BYTE, ONE_MEBI_BYTE, ONE_SECOND, ONE_MINUTE } from '../tools/utils'
import { clocksNow, ONE_MINUTE, ONE_SECOND } from '../tools/utils/timeUtils'
import { ErrorSource } from '../domain/error/error'
import { ONE_MEBI_BYTE, ONE_KIBI_BYTE } from '../tools/utils/byteUtils'
import { isServerError } from '../tools/utils/responseUtils'
import type { Payload, HttpResponse } from './httpRequest'

@@ -138,3 +139,3 @@

response.status === 429 ||
response.status >= 500)
isServerError(response.status))
)

@@ -141,0 +142,0 @@ }

import type { Configuration, EndpointBuilder } from '../domain/configuration'
import type { RawError } from '../domain/error/error'
import type { Context } from '../tools/context'
import type { Context } from '../tools/serialisation/context'
import type { Observable } from '../tools/observable'

@@ -8,2 +8,3 @@ import type { PageExitEvent } from '../browser/pageExitObservable'

import { createHttpRequest } from './httpRequest'
import { createFlushController } from './flushController'

@@ -26,7 +27,9 @@ export function startBatchWithReplica<T extends Context>(

createHttpRequest(endpointBuilder, configuration.batchBytesLimit, reportError),
configuration.batchMessagesLimit,
configuration.batchBytesLimit,
configuration.messageBytesLimit,
configuration.flushTimeout,
pageExitObservable
createFlushController({
messagesLimit: configuration.batchMessagesLimit,
bytesLimit: configuration.batchBytesLimit,
durationLimit: configuration.flushTimeout,
pageExitObservable,
}),
configuration.messageBytesLimit
)

@@ -33,0 +36,0 @@ }

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

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

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc