UNPKG

msal

Version:
144 lines 6.82 kB
"use strict"; /* * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. */ Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var DefaultEvent_1 = tslib_1.__importDefault(require("./DefaultEvent")); var Constants_1 = require("../utils/Constants"); var ApiEvent_1 = tslib_1.__importDefault(require("./ApiEvent")); var HttpEvent_1 = tslib_1.__importDefault(require("./HttpEvent")); var packageMetadata_1 = require("../packageMetadata"); var TelemetryManager = /** @class */ (function () { function TelemetryManager(config, telemetryEmitter, logger) { // correlation Id to list of events this.completedEvents = {}; // event key to event this.inProgressEvents = {}; // correlation id to map of eventname to count this.eventCountByCorrelationId = {}; // Implement after API EVENT this.onlySendFailureTelemetry = false; // TODO THROW if bad options this.telemetryPlatform = tslib_1.__assign({ sdk: Constants_1.Constants.libraryName, sdkVersion: packageMetadata_1.version, networkInformation: { // @ts-ignore connectionSpeed: typeof navigator !== "undefined" && navigator.connection && navigator.connection.effectiveType } }, config.platform); this.clientId = config.clientId; this.onlySendFailureTelemetry = config.onlySendFailureTelemetry; /* * TODO, when i get to wiring this through, think about what it means if * a developer does not implement telem at all, we still instrument, but telemetryEmitter can be * optional? */ this.telemetryEmitter = telemetryEmitter; this.logger = logger; } TelemetryManager.getTelemetrymanagerStub = function (clientId, logger) { var applicationName = "UnSetStub"; var applicationVersion = "0.0"; var telemetryEmitter = function () { }; var telemetryPlatform = { applicationName: applicationName, applicationVersion: applicationVersion }; var telemetryManagerConfig = { platform: telemetryPlatform, clientId: clientId }; return new this(telemetryManagerConfig, telemetryEmitter, logger); }; TelemetryManager.prototype.startEvent = function (event) { this.logger.verbose("Telemetry Event started: " + event.key); if (!this.telemetryEmitter) { return; } event.start(); this.inProgressEvents[event.key] = event; }; TelemetryManager.prototype.stopEvent = function (event) { this.logger.verbose("Telemetry Event stopped: " + event.key); if (!this.telemetryEmitter || !this.inProgressEvents[event.key]) { return; } event.stop(); this.incrementEventCount(event); var completedEvents = this.completedEvents[event.telemetryCorrelationId]; this.completedEvents[event.telemetryCorrelationId] = tslib_1.__spreadArrays((completedEvents || []), [event]); delete this.inProgressEvents[event.key]; }; TelemetryManager.prototype.flush = function (correlationId) { var _this = this; this.logger.verbose("Flushing telemetry events: " + correlationId); // If there is only unfinished events should this still return them? if (!this.telemetryEmitter || !this.completedEvents[correlationId]) { return; } var orphanedEvents = this.getOrphanedEvents(correlationId); orphanedEvents.forEach(function (event) { return _this.incrementEventCount(event); }); var eventsToFlush = tslib_1.__spreadArrays(this.completedEvents[correlationId], orphanedEvents); delete this.completedEvents[correlationId]; var eventCountsToFlush = this.eventCountByCorrelationId[correlationId]; delete this.eventCountByCorrelationId[correlationId]; // TODO add funcitonality for onlyFlushFailures after implementing api event? ?? if (!eventsToFlush || !eventsToFlush.length) { return; } var defaultEvent = new DefaultEvent_1.default(this.telemetryPlatform, correlationId, this.clientId, eventCountsToFlush); var eventsWithDefaultEvent = tslib_1.__spreadArrays(eventsToFlush, [defaultEvent]); this.telemetryEmitter(eventsWithDefaultEvent.map(function (e) { return e.get(); })); }; TelemetryManager.prototype.createAndStartApiEvent = function (correlationId, apiEventIdentifier) { var apiEvent = new ApiEvent_1.default(correlationId, this.logger.isPiiLoggingEnabled(), apiEventIdentifier); this.startEvent(apiEvent); return apiEvent; }; TelemetryManager.prototype.stopAndFlushApiEvent = function (correlationId, apiEvent, wasSuccessful, errorCode) { apiEvent.wasSuccessful = wasSuccessful; if (errorCode) { apiEvent.apiErrorCode = errorCode; } this.stopEvent(apiEvent); this.flush(correlationId); }; TelemetryManager.prototype.createAndStartHttpEvent = function (correlation, httpMethod, url, eventLabel) { var httpEvent = new HttpEvent_1.default(correlation, eventLabel); httpEvent.url = url; httpEvent.httpMethod = httpMethod; this.startEvent(httpEvent); return httpEvent; }; TelemetryManager.prototype.incrementEventCount = function (event) { var _a; /* * TODO, name cache event different? * if type is cache event, change name */ var eventName = event.eventName; var eventCount = this.eventCountByCorrelationId[event.telemetryCorrelationId]; if (!eventCount) { this.eventCountByCorrelationId[event.telemetryCorrelationId] = (_a = {}, _a[eventName] = 1, _a); } else { eventCount[eventName] = eventCount[eventName] ? eventCount[eventName] + 1 : 1; } }; TelemetryManager.prototype.getOrphanedEvents = function (correlationId) { var _this = this; return Object.keys(this.inProgressEvents) .reduce(function (memo, eventKey) { if (eventKey.indexOf(correlationId) !== -1) { var event_1 = _this.inProgressEvents[eventKey]; delete _this.inProgressEvents[eventKey]; return tslib_1.__spreadArrays(memo, [event_1]); } return memo; }, []); }; return TelemetryManager; }()); exports.default = TelemetryManager; //# sourceMappingURL=TelemetryManager.js.map