UNPKG

@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
"use strict"; 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');