1 | "use strict";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
18 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
19 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
20 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
21 | return c > 3 && r && Object.defineProperty(target, key, r), r;
|
22 | };
|
23 | var __metadata = (this && this.__metadata) || function (k, v) {
|
24 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
25 | };
|
26 | Object.defineProperty(exports, "__esModule", { value: true });
|
27 | exports.Stopwatch = void 0;
|
28 |
|
29 | const inversify_1 = require("inversify");
|
30 | const logger_1 = require("../logger");
|
31 | const event_1 = require("../event");
|
32 |
|
33 | const DEFAULT_LOG_LEVEL = logger_1.LogLevel.INFO;
|
34 |
|
35 |
|
36 |
|
37 | let Stopwatch = class Stopwatch {
|
38 | constructor(defaultLogOptions) {
|
39 | this.defaultLogOptions = defaultLogOptions;
|
40 | this._storedMeasurements = [];
|
41 | this.onDidAddMeasurementResultEmitter = new event_1.Emitter();
|
42 | if (!defaultLogOptions.defaultLogLevel) {
|
43 | defaultLogOptions.defaultLogLevel = DEFAULT_LOG_LEVEL;
|
44 | }
|
45 | if (defaultLogOptions.storeResults === undefined) {
|
46 | defaultLogOptions.storeResults = true;
|
47 | }
|
48 | }
|
49 | get onDidAddMeasurementResult() {
|
50 | return this.onDidAddMeasurementResultEmitter.event;
|
51 | }
|
52 | |
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 | async startAsync(name, description, computation, options) {
|
66 | var _a;
|
67 | const threshold = (_a = options === null || options === void 0 ? void 0 : options.thresholdMillis) !== null && _a !== void 0 ? _a : Number.POSITIVE_INFINITY;
|
68 | const measure = this.start(name, options);
|
69 | const result = await computation();
|
70 | if (measure.stop() > threshold) {
|
71 | measure.warn(`${description} took longer than the expected maximum ${threshold} milliseconds`);
|
72 | }
|
73 | else {
|
74 | measure.log(description);
|
75 | }
|
76 | return result;
|
77 | }
|
78 | createMeasurement(name, measure, options) {
|
79 | const logOptions = this.mergeLogOptions(options);
|
80 | const measurement = {
|
81 | name,
|
82 | stop: () => {
|
83 | if (measurement.elapsed === undefined) {
|
84 | const { startTime, duration } = measure();
|
85 | measurement.elapsed = duration;
|
86 | const result = {
|
87 | name,
|
88 | elapsed: duration,
|
89 | startTime,
|
90 | owner: logOptions.owner
|
91 | };
|
92 | if (logOptions.storeResults) {
|
93 | this._storedMeasurements.push(result);
|
94 | }
|
95 | this.onDidAddMeasurementResultEmitter.fire(result);
|
96 | }
|
97 | return measurement.elapsed;
|
98 | },
|
99 | log: (activity, ...optionalArgs) => this.log(measurement, activity, this.atLevel(logOptions, undefined, optionalArgs)),
|
100 | debug: (activity, ...optionalArgs) => this.log(measurement, activity, this.atLevel(logOptions, logger_1.LogLevel.DEBUG, optionalArgs)),
|
101 | info: (activity, ...optionalArgs) => this.log(measurement, activity, this.atLevel(logOptions, logger_1.LogLevel.INFO, optionalArgs)),
|
102 | warn: (activity, ...optionalArgs) => this.log(measurement, activity, this.atLevel(logOptions, logger_1.LogLevel.WARN, optionalArgs)),
|
103 | error: (activity, ...optionalArgs) => this.log(measurement, activity, this.atLevel(logOptions, logger_1.LogLevel.ERROR, optionalArgs)),
|
104 | };
|
105 | return measurement;
|
106 | }
|
107 | mergeLogOptions(logOptions) {
|
108 | const result = { ...this.defaultLogOptions };
|
109 | if (logOptions) {
|
110 | Object.assign(result, logOptions);
|
111 | }
|
112 | return result;
|
113 | }
|
114 | atLevel(logOptions, levelOverride, optionalArgs) {
|
115 | return { ...logOptions, levelOverride, arguments: optionalArgs };
|
116 | }
|
117 | logLevel(elapsed, options) {
|
118 | var _a, _b;
|
119 | if (options === null || options === void 0 ? void 0 : options.levelOverride) {
|
120 | return options.levelOverride;
|
121 | }
|
122 | return (_b = (_a = options === null || options === void 0 ? void 0 : options.defaultLogLevel) !== null && _a !== void 0 ? _a : this.defaultLogOptions.defaultLogLevel) !== null && _b !== void 0 ? _b : DEFAULT_LOG_LEVEL;
|
123 | }
|
124 | log(measurement, activity, options) {
|
125 | var _a;
|
126 | const elapsed = measurement.stop();
|
127 | const level = this.logLevel(elapsed, options);
|
128 | if (Number.isNaN(elapsed)) {
|
129 | switch (level) {
|
130 | case logger_1.LogLevel.ERROR:
|
131 | case logger_1.LogLevel.FATAL:
|
132 |
|
133 | break;
|
134 | default:
|
135 |
|
136 | return;
|
137 | }
|
138 | }
|
139 | const start = options.owner ? `${options.owner} start` : 'start';
|
140 | const timeFromStart = `Finished ${(options.now() / 1000).toFixed(3)} s after ${start}`;
|
141 | const whatWasMeasured = options.context ? `[${options.context}] ${activity}` : activity;
|
142 | this.logger.log(level, `${whatWasMeasured}: ${elapsed.toFixed(1)} ms [${timeFromStart}]`, ...((_a = options.arguments) !== null && _a !== void 0 ? _a : []));
|
143 | }
|
144 | get storedMeasurements() {
|
145 | return this._storedMeasurements;
|
146 | }
|
147 | };
|
148 | __decorate([
|
149 | (0, inversify_1.inject)(logger_1.ILogger),
|
150 | __metadata("design:type", Object)
|
151 | ], Stopwatch.prototype, "logger", void 0);
|
152 | Stopwatch = __decorate([
|
153 | (0, inversify_1.injectable)(),
|
154 | __metadata("design:paramtypes", [Object])
|
155 | ], Stopwatch);
|
156 | exports.Stopwatch = Stopwatch;
|
157 |
|
\ | No newline at end of file |