UNPKG

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