UNPKG

6.82 kBJavaScriptView Raw
1"use strict";
2/*
3 * Copyright (c) Microsoft Corporation. All rights reserved.
4 * Licensed under the MIT License.
5 */
6Object.defineProperty(exports, "__esModule", { value: true });
7var tslib_1 = require("tslib");
8var DefaultEvent_1 = tslib_1.__importDefault(require("./DefaultEvent"));
9var Constants_1 = require("../utils/Constants");
10var ApiEvent_1 = tslib_1.__importDefault(require("./ApiEvent"));
11var HttpEvent_1 = tslib_1.__importDefault(require("./HttpEvent"));
12var packageMetadata_1 = require("../packageMetadata");
13var TelemetryManager = /** @class */ (function () {
14 function TelemetryManager(config, telemetryEmitter, logger) {
15 // correlation Id to list of events
16 this.completedEvents = {};
17 // event key to event
18 this.inProgressEvents = {};
19 // correlation id to map of eventname to count
20 this.eventCountByCorrelationId = {};
21 // Implement after API EVENT
22 this.onlySendFailureTelemetry = false;
23 // TODO THROW if bad options
24 this.telemetryPlatform = tslib_1.__assign({ sdk: Constants_1.Constants.libraryName, sdkVersion: packageMetadata_1.version, networkInformation: {
25 // @ts-ignore
26 connectionSpeed: typeof navigator !== "undefined" && navigator.connection && navigator.connection.effectiveType
27 } }, config.platform);
28 this.clientId = config.clientId;
29 this.onlySendFailureTelemetry = config.onlySendFailureTelemetry;
30 /*
31 * TODO, when i get to wiring this through, think about what it means if
32 * a developer does not implement telem at all, we still instrument, but telemetryEmitter can be
33 * optional?
34 */
35 this.telemetryEmitter = telemetryEmitter;
36 this.logger = logger;
37 }
38 TelemetryManager.getTelemetrymanagerStub = function (clientId, logger) {
39 var applicationName = "UnSetStub";
40 var applicationVersion = "0.0";
41 var telemetryEmitter = function () { };
42 var telemetryPlatform = {
43 applicationName: applicationName,
44 applicationVersion: applicationVersion
45 };
46 var telemetryManagerConfig = {
47 platform: telemetryPlatform,
48 clientId: clientId
49 };
50 return new this(telemetryManagerConfig, telemetryEmitter, logger);
51 };
52 TelemetryManager.prototype.startEvent = function (event) {
53 this.logger.verbose("Telemetry Event started: " + event.key);
54 if (!this.telemetryEmitter) {
55 return;
56 }
57 event.start();
58 this.inProgressEvents[event.key] = event;
59 };
60 TelemetryManager.prototype.stopEvent = function (event) {
61 this.logger.verbose("Telemetry Event stopped: " + event.key);
62 if (!this.telemetryEmitter || !this.inProgressEvents[event.key]) {
63 return;
64 }
65 event.stop();
66 this.incrementEventCount(event);
67 var completedEvents = this.completedEvents[event.telemetryCorrelationId];
68 this.completedEvents[event.telemetryCorrelationId] = tslib_1.__spreadArrays((completedEvents || []), [event]);
69 delete this.inProgressEvents[event.key];
70 };
71 TelemetryManager.prototype.flush = function (correlationId) {
72 var _this = this;
73 this.logger.verbose("Flushing telemetry events: " + correlationId);
74 // If there is only unfinished events should this still return them?
75 if (!this.telemetryEmitter || !this.completedEvents[correlationId]) {
76 return;
77 }
78 var orphanedEvents = this.getOrphanedEvents(correlationId);
79 orphanedEvents.forEach(function (event) { return _this.incrementEventCount(event); });
80 var eventsToFlush = tslib_1.__spreadArrays(this.completedEvents[correlationId], orphanedEvents);
81 delete this.completedEvents[correlationId];
82 var eventCountsToFlush = this.eventCountByCorrelationId[correlationId];
83 delete this.eventCountByCorrelationId[correlationId];
84 // TODO add funcitonality for onlyFlushFailures after implementing api event? ??
85 if (!eventsToFlush || !eventsToFlush.length) {
86 return;
87 }
88 var defaultEvent = new DefaultEvent_1.default(this.telemetryPlatform, correlationId, this.clientId, eventCountsToFlush);
89 var eventsWithDefaultEvent = tslib_1.__spreadArrays(eventsToFlush, [defaultEvent]);
90 this.telemetryEmitter(eventsWithDefaultEvent.map(function (e) { return e.get(); }));
91 };
92 TelemetryManager.prototype.createAndStartApiEvent = function (correlationId, apiEventIdentifier) {
93 var apiEvent = new ApiEvent_1.default(correlationId, this.logger.isPiiLoggingEnabled(), apiEventIdentifier);
94 this.startEvent(apiEvent);
95 return apiEvent;
96 };
97 TelemetryManager.prototype.stopAndFlushApiEvent = function (correlationId, apiEvent, wasSuccessful, errorCode) {
98 apiEvent.wasSuccessful = wasSuccessful;
99 if (errorCode) {
100 apiEvent.apiErrorCode = errorCode;
101 }
102 this.stopEvent(apiEvent);
103 this.flush(correlationId);
104 };
105 TelemetryManager.prototype.createAndStartHttpEvent = function (correlation, httpMethod, url, eventLabel) {
106 var httpEvent = new HttpEvent_1.default(correlation, eventLabel);
107 httpEvent.url = url;
108 httpEvent.httpMethod = httpMethod;
109 this.startEvent(httpEvent);
110 return httpEvent;
111 };
112 TelemetryManager.prototype.incrementEventCount = function (event) {
113 var _a;
114 /*
115 * TODO, name cache event different?
116 * if type is cache event, change name
117 */
118 var eventName = event.eventName;
119 var eventCount = this.eventCountByCorrelationId[event.telemetryCorrelationId];
120 if (!eventCount) {
121 this.eventCountByCorrelationId[event.telemetryCorrelationId] = (_a = {},
122 _a[eventName] = 1,
123 _a);
124 }
125 else {
126 eventCount[eventName] = eventCount[eventName] ? eventCount[eventName] + 1 : 1;
127 }
128 };
129 TelemetryManager.prototype.getOrphanedEvents = function (correlationId) {
130 var _this = this;
131 return Object.keys(this.inProgressEvents)
132 .reduce(function (memo, eventKey) {
133 if (eventKey.indexOf(correlationId) !== -1) {
134 var event_1 = _this.inProgressEvents[eventKey];
135 delete _this.inProgressEvents[eventKey];
136 return tslib_1.__spreadArrays(memo, [event_1]);
137 }
138 return memo;
139 }, []);
140 };
141 return TelemetryManager;
142}());
143exports.default = TelemetryManager;
144//# sourceMappingURL=TelemetryManager.js.map
\No newline at end of file