UNPKG

vscode-chrome-debug-core

Version:

A library for building VS Code debug adapters for targets that support the Chrome Remote Debug Protocol

156 lines (154 loc) 6.89 kB
"use strict"; /*--------------------------------------------------------- * Copyright (C) Microsoft Corporation. All rights reserved. *--------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); const utils_1 = require("./utils"); const events_1 = require("events"); exports.stepStartedEventName = 'stepStarted'; exports.milestoneReachedEventName = 'milestoneReached'; exports.stepCompletedEventName = 'stepCompleted'; exports.requestCompletedEventName = 'requestCompleted'; class StepProgressEventsEmitter extends events_1.EventEmitter { constructor(_nestedEmitters = []) { super(); this._nestedEmitters = _nestedEmitters; } emitStepStarted(stepName) { this.emit(exports.stepStartedEventName, { stepName: stepName }); } emitMilestoneReached(milestoneName) { this.emit(exports.milestoneReachedEventName, { milestoneName: milestoneName }); } emitStepCompleted(stepName) { this.emit(exports.stepCompletedEventName, { stepName: stepName }); } emitRequestCompleted(requestName, requestStartTime, timeTakenByRequestInMilliseconds) { this.emit(exports.requestCompletedEventName, { requestName: requestName, startTime: requestStartTime, timeTakenInMilliseconds: timeTakenByRequestInMilliseconds }); } on(event, listener) { super.on(event, listener); this._nestedEmitters.forEach(nestedEmitter => nestedEmitter.on(event, listener)); return this; } removeListener(event, listener) { super.removeListener(event, listener); this._nestedEmitters.forEach(nestedEmitter => nestedEmitter.removeListener(event, listener)); return this; } } exports.StepProgressEventsEmitter = StepProgressEventsEmitter; class SubscriptionManager { constructor() { this._removeSubscriptionActions = []; } on(eventEmitter, event, listener) { eventEmitter.on(event, listener); this._removeSubscriptionActions.push(() => eventEmitter.removeListener(event, listener)); } removeAll() { for (const removeSubscriptionAction of this._removeSubscriptionActions) { removeSubscriptionAction(); } this._removeSubscriptionActions = []; } } class ExecutionTimingsReporter { constructor() { this._eventsExecutionTimesInMilliseconds = {}; this._stepsList = []; this._subscriptionManager = new SubscriptionManager(); this._requestProperties = {}; /* __GDPR__FRAGMENT__ "StepNames" : { "BeforeFirstStep" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } */ this._currentStepName = 'BeforeFirstStep'; this._currentStepStartTime = this._allStartTime = process.hrtime(); } recordPreviousStepAndConfigureNewStep(newStepName) { this.recordTimeTaken(this._currentStepName, this._currentStepStartTime); this._stepsList.push(this._currentStepName); this._currentStepStartTime = process.hrtime(); this._currentStepName = newStepName; } recordTimeTaken(eventName, sinceWhen) { const timeTakenInMilliseconds = utils_1.calculateElapsedTime(sinceWhen); this.addElementToArrayProperty(this._eventsExecutionTimesInMilliseconds, eventName, timeTakenInMilliseconds); } recordTotalTimeUntilMilestone(milestoneName) { this.recordTimeTaken(milestoneName, this._allStartTime); } generateReport() { /* __GDPR__FRAGMENT__ "StepNames" : { "AfterLastStep" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } */ this.recordPreviousStepAndConfigureNewStep('AfterLastStep'); this._subscriptionManager.removeAll(); // Remove all subscriptions so we don't get any new events /* __GDPR__FRAGMENT__ "ReportProps" : { "Steps" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, "All" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, "${wildcard}": [ { "${prefix}": "Request.", "${classification}": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } ], "${include}": [ "${RequestProperties}", "${StepNames}" ] } */ return Object.assign({}, { Steps: this._stepsList, All: utils_1.calculateElapsedTime(this._allStartTime) }, this._requestProperties, this._eventsExecutionTimesInMilliseconds); } recordRequestCompleted(requestName, startTime, timeTakenInMilliseconds) { /* __GDPR__FRAGMENT__ "RequestProperties" : { "${wildcard}": [ { "${prefix}": "Request.", "${classification}": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } ] } */ const propertyPrefix = `Request.${requestName}.`; this.addElementToArrayProperty(this._requestProperties, propertyPrefix + 'startTime', startTime); this.addElementToArrayProperty(this._requestProperties, propertyPrefix + 'timeTakenInMilliseconds', timeTakenInMilliseconds); } addElementToArrayProperty(object, propertyName, elementToAdd) { const propertiesArray = object[propertyName] = object[propertyName] || []; propertiesArray.push(elementToAdd); } subscribeTo(eventEmitter) { this._subscriptionManager.on(eventEmitter, exports.stepStartedEventName, (args) => { this.recordPreviousStepAndConfigureNewStep(args.stepName); }); this._subscriptionManager.on(eventEmitter, exports.milestoneReachedEventName, (args) => { this.recordTotalTimeUntilMilestone(args.milestoneName); }); this._subscriptionManager.on(eventEmitter, exports.stepCompletedEventName, (args) => { /* __GDPR__FRAGMENT__ "StepNames" : { "${wildcard}": [ { "${prefix}": "WaitingAfter", "${classification}": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } ] } */ this.recordTotalTimeUntilMilestone(`WaitingAfter.${args.stepName}`); }); this._subscriptionManager.on(eventEmitter, exports.requestCompletedEventName, (args) => { this.recordRequestCompleted(args.requestName, args.startTime, args.timeTakenInMilliseconds); }); } } exports.ExecutionTimingsReporter = ExecutionTimingsReporter; //# sourceMappingURL=executionTimingsReporter.js.map