@dynatrace/react-native-plugin
Version:
This plugin gives you the ability to use the Dynatrace Mobile agent in your react native application.
87 lines (86 loc) • 3.92 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 EventLimitation_1 = require("./EventLimitation");
class SendEventValidationImpl {
constructor(timestampProvider, namespaceWhitelist, fieldWhitelist, loggerName) {
this.logger = new ConsoleLogger_1.ConsoleLogger(loggerName);
this.timestampProvider = timestampProvider;
this.fieldWhitelist = fieldWhitelist;
this.namespaceWhitelist = namespaceWhitelist;
}
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 eventCopy = Object.entries(event).slice();
const filteredEvent = eventCopy
.filter(this.isKeyNameAllowed, this)
.filter(this.isFieldTypeAllowed, this);
const limitedEntries = new EventLimitation_1.EventLimitation().limitEventEntries(filteredEvent);
const sizedEntries = new EventLimitation_1.EventLimitation().limitEventProperties(limitedEntries);
this.applyOverriddenKeys(sizedEntries);
if (sizedEntries.length < eventCopy.length) {
sizedEntries.push([
"dt.internal.api.has_dropped_custom_properties",
true,
]);
}
const jsonObject = Object.fromEntries(sizedEntries);
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, value] of eventEntries) {
if (this.fieldWhitelist.includes(key)) {
overriddenKeys.push(key);
}
}
if (overriddenKeys.length > 0) {
eventEntries.push([
"dt.internal.api.overridden_keys",
overriddenKeys,
]);
}
}
isFieldTypeAllowed(entry) {
const [key, value] = entry;
if (key === "duration" ||
key === "start_time") {
return typeof value === 'number' && isFinite(value) && value >= 0;
}
return true;
}
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');