msal
Version:
Microsoft Authentication Library for js
93 lines • 4.44 kB
JavaScript
import DefaultEvent from "./DefaultEvent";
// for use in cache events
var MSAL_CACHE_EVENT_VALUE_PREFIX = "msal.token";
var MSAL_CACHE_EVENT_NAME = "msal.cache_event";
var createEventKey = function (event) { return (event.telemetryCorrelationId + "-" + event.eventId + "-" + event.eventName); };
var TelemetryManager = /** @class */ (function () {
function TelemetryManager(config, telemetryEmitter) {
// 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 = 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;
}
TelemetryManager.prototype.startEvent = function (event) {
if (!this.telemetryEmitter) {
return;
}
var eventKey = createEventKey(event);
this.inProgressEvents[eventKey] = event;
};
TelemetryManager.prototype.stopEvent = function (event) {
var eventKey = createEventKey(event);
if (!this.telemetryEmitter || !this.inProgressEvents[eventKey]) {
return;
}
event.stop();
this.incrementEventCount(event);
var completedEvents = this.completedEvents[event.telemetryCorrelationId];
this.completedEvents[event.telemetryCorrelationId] = (completedEvents || []).concat([event]);
delete this.inProgressEvents[eventKey];
};
TelemetryManager.prototype.flush = function (correlationId) {
var _this = this;
// 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 = this.completedEvents[correlationId].concat(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(this.telemetryPlatform, correlationId, this.clientId, eventCountsToFlush);
var eventsWithDefaultEvent = eventsToFlush.concat([defaultEvent]);
this.telemetryEmitter(eventsWithDefaultEvent.map(function (e) { return e.get(); }));
};
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 memo.concat([event_1]);
}
return memo;
}, []);
};
return TelemetryManager;
}());
export default TelemetryManager;
//# sourceMappingURL=TelemetryManager.js.map