@dynatrace/react-native-plugin
Version:
This plugin gives you the ability to use the Dynatrace Mobile agent in your react native application.
131 lines (130 loc) • 5.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SendSessionPropertyEventValidation = exports.SendEventValidation = void 0;
const ConsoleLogger_1 = require("../../../core/logging/ConsoleLogger");
const TimestampProvider_1 = require("../../provider/TimestampProvider");
const EventTimestamp_1 = require("../EventTimestamp");
const EventSpecContstants_1 = require("../spec/EventSpecContstants");
const EventModifierUtil_1 = require("./EventModifierUtil");
class SendEventValidationImpl {
constructor(timestampProvider, namespaceWhitelist, fieldWhitelist, loggerName) {
this.logger = new ConsoleLogger_1.ConsoleLogger(loggerName);
this.timestampProvider = timestampProvider;
this.namespaceWhitelist = namespaceWhitelist;
this.fieldWhitelist = fieldWhitelist;
}
modifyEvent(event) {
this.logger.debug(`modifyEvent(${JSON.stringify(event)})`);
if (event == null) {
return null;
}
else if (Object.keys(event).length === 0) {
return Object.assign({}, new EventTimestamp_1.EventTimestamp(this.timestampProvider).getEventTimeInfo());
}
const timeNow = this.timestampProvider.getCurrentTimestamp();
const filteredEvent = this.checkEventEntries(Object.entries(event).slice());
this.sanitizeDuration(filteredEvent);
this.applyOverriddenKeys(filteredEvent);
const jsonObject = Object.fromEntries(filteredEvent);
if (jsonObject["duration"] !== undefined) {
jsonObject["start_time"] =
timeNow - jsonObject["duration"];
}
else {
jsonObject["start_time"] = timeNow;
jsonObject["duration"] = 0;
}
return jsonObject;
}
applyOverriddenKeys(eventEntries) {
const overriddenKeys = [];
for (const [key] of eventEntries) {
if (this.fieldWhitelist.includes(key)) {
overriddenKeys.push(key);
}
}
if (overriddenKeys.length > 0) {
eventEntries.push([
"dt.support.api.overridden_fields",
overriddenKeys,
]);
}
}
sanitizeDuration(event) {
for (const entry of event) {
const [key, value] = entry;
if (key === "duration") {
if (typeof value !== 'number' ||
!isFinite(value) ||
value < 0) {
entry[1] = 0;
event.push([
"dt.support.api.has_dropped_properties",
true,
]);
break;
}
}
}
}
checkEventEntries(allEntries) {
const fieldEntries = allEntries.slice();
fieldEntries.sort((a, b) => a[0].localeCompare(b[0]));
const validEntries = [];
let droppedProperties = false;
let droppedCustomProperties = false;
let amountOfCustomProperties = 0;
fieldEntries.forEach((entry) => {
if (!this.isKeyNameAllowed(entry) ||
!(0, EventModifierUtil_1.isNotObject)(entry) ||
!(0, EventModifierUtil_1.doesNotExceedKeySize)(entry) ||
!(0, EventModifierUtil_1.isKeySyntaxAllowed)(entry)) {
if ((0, EventModifierUtil_1.isKeyCustomProperty)(entry[0])) {
droppedCustomProperties = true;
}
else {
droppedProperties = true;
}
return;
}
if ((0, EventModifierUtil_1.isKeyCustomProperty)(entry[0])) {
amountOfCustomProperties++;
if (amountOfCustomProperties > EventSpecContstants_1.MAX_CUSTOM_EVENT_FIELDS) {
this.logger.debug(`limitEventProperties(): Dropped ${entry[0]} because overall property limit is reached!`);
droppedCustomProperties = true;
return;
}
}
(0, EventModifierUtil_1.restrictingValueSize)(entry);
validEntries.push(entry);
});
if (droppedCustomProperties) {
validEntries.push([
"dt.support.api.has_dropped_custom_properties",
true,
]);
}
if (droppedProperties) {
validEntries.push([
"dt.support.api.has_dropped_properties",
true,
]);
}
return validEntries;
}
isKeyNameAllowed(entry) {
const [key] = entry;
for (const namespace of this.namespaceWhitelist) {
if (key.startsWith(`${namespace}.`)) {
return true;
}
}
if (this.fieldWhitelist.includes(key)) {
return true;
}
this.logger.debug(`isKeyNameAllowed(): Filtering key ${key} as this field or namespace is reserved!`);
return false;
}
}
exports.SendEventValidation = new SendEventValidationImpl(TimestampProvider_1.defaultTimestampProvider, EventSpecContstants_1.SEND_EVENT_WHITELIST_NAMESPACES, EventSpecContstants_1.SEND_EVENT_WHITELIST_FIELDS, 'SendEventValidation');
exports.SendSessionPropertyEventValidation = new SendEventValidationImpl(TimestampProvider_1.defaultTimestampProvider, EventSpecContstants_1.SEND_SESSION_PROPERTY_EVENT_WHITELIST_NAMESPACES, EventSpecContstants_1.SEND_SESSION_PROPERTY_EVENT_WHITELIST_FIELDS, 'SendSessionPropertyEventValidation');