msal
Version:
Microsoft Authentication Library for js
144 lines • 6.82 kB
JavaScript
"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