@theia/plugin-ext 1.76.0-next.4 → 1.76.0-next.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/common/plugin-api-rpc.d.ts +14 -0
- package/lib/common/plugin-api-rpc.d.ts.map +1 -1
- package/lib/common/plugin-api-rpc.js +1 -1
- package/lib/common/plugin-api-rpc.js.map +1 -1
- package/lib/hosted/browser/hosted-plugin.d.ts +2 -0
- package/lib/hosted/browser/hosted-plugin.d.ts.map +1 -1
- package/lib/hosted/browser/hosted-plugin.js +8 -2
- package/lib/hosted/browser/hosted-plugin.js.map +1 -1
- package/lib/hosted/browser/worker/worker-main.js +3 -1
- package/lib/hosted/browser/worker/worker-main.js.map +1 -1
- package/lib/hosted/browser/worker/worker-plugin-module.d.ts.map +1 -1
- package/lib/hosted/browser/worker/worker-plugin-module.js +2 -0
- package/lib/hosted/browser/worker/worker-plugin-module.js.map +1 -1
- package/lib/hosted/node/plugin-host-module.d.ts.map +1 -1
- package/lib/hosted/node/plugin-host-module.js +2 -0
- package/lib/hosted/node/plugin-host-module.js.map +1 -1
- package/lib/hosted/node/plugin-host-rpc.d.ts +3 -0
- package/lib/hosted/node/plugin-host-rpc.d.ts.map +1 -1
- package/lib/hosted/node/plugin-host-rpc.js +9 -3
- package/lib/hosted/node/plugin-host-rpc.js.map +1 -1
- package/lib/main/browser/editors-and-documents-main.d.ts +7 -0
- package/lib/main/browser/editors-and-documents-main.d.ts.map +1 -1
- package/lib/main/browser/editors-and-documents-main.js +19 -9
- package/lib/main/browser/editors-and-documents-main.js.map +1 -1
- package/lib/main/browser/editors-and-documents-main.spec.d.ts +2 -0
- package/lib/main/browser/editors-and-documents-main.spec.d.ts.map +1 -0
- package/lib/main/browser/editors-and-documents-main.spec.js +117 -0
- package/lib/main/browser/editors-and-documents-main.spec.js.map +1 -0
- package/lib/main/browser/languages-main.d.ts +7 -0
- package/lib/main/browser/languages-main.d.ts.map +1 -1
- package/lib/main/browser/languages-main.js +31 -9
- package/lib/main/browser/languages-main.js.map +1 -1
- package/lib/main/browser/languages-main.spec.d.ts +2 -0
- package/lib/main/browser/languages-main.spec.d.ts.map +1 -0
- package/lib/main/browser/languages-main.spec.js +82 -0
- package/lib/main/browser/languages-main.spec.js.map +1 -0
- package/lib/main/browser/main-context.d.ts.map +1 -1
- package/lib/main/browser/main-context.js +3 -0
- package/lib/main/browser/main-context.js.map +1 -1
- package/lib/main/browser/menus/vscode-theia-menu-mappings.d.ts +5 -0
- package/lib/main/browser/menus/vscode-theia-menu-mappings.d.ts.map +1 -1
- package/lib/main/browser/menus/vscode-theia-menu-mappings.js +5 -0
- package/lib/main/browser/menus/vscode-theia-menu-mappings.js.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.d.ts.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.js +1 -0
- package/lib/main/browser/plugin-ext-frontend-module.js.map +1 -1
- package/lib/main/browser/telemetry-main.d.ts +20 -0
- package/lib/main/browser/telemetry-main.d.ts.map +1 -0
- package/lib/main/browser/telemetry-main.js +43 -0
- package/lib/main/browser/telemetry-main.js.map +1 -0
- package/lib/main/browser/telemetry-main.spec.d.ts +2 -0
- package/lib/main/browser/telemetry-main.spec.d.ts.map +1 -0
- package/lib/main/browser/telemetry-main.spec.js +66 -0
- package/lib/main/browser/telemetry-main.spec.js.map +1 -0
- package/lib/main/browser/webview/webview-context-keys.d.ts +3 -2
- package/lib/main/browser/webview/webview-context-keys.d.ts.map +1 -1
- package/lib/main/browser/webview/webview-context-keys.js +16 -2
- package/lib/main/browser/webview/webview-context-keys.js.map +1 -1
- package/lib/plugin/plugin-context.d.ts +2 -1
- package/lib/plugin/plugin-context.d.ts.map +1 -1
- package/lib/plugin/plugin-context.js +2 -3
- package/lib/plugin/plugin-context.js.map +1 -1
- package/lib/plugin/plugin-manager.d.ts +2 -0
- package/lib/plugin/plugin-manager.d.ts.map +1 -1
- package/lib/plugin/plugin-manager.js +7 -0
- package/lib/plugin/plugin-manager.js.map +1 -1
- package/lib/plugin/telemetry-ext.d.ts +23 -7
- package/lib/plugin/telemetry-ext.d.ts.map +1 -1
- package/lib/plugin/telemetry-ext.js +60 -33
- package/lib/plugin/telemetry-ext.js.map +1 -1
- package/lib/plugin/telemetry-ext.spec.js +121 -16
- package/lib/plugin/telemetry-ext.spec.js.map +1 -1
- package/package.json +32 -31
- package/src/common/plugin-api-rpc.ts +15 -1
- package/src/hosted/browser/hosted-plugin.ts +7 -2
- package/src/hosted/browser/worker/worker-main.ts +4 -1
- package/src/hosted/browser/worker/worker-plugin-module.ts +2 -0
- package/src/hosted/node/plugin-host-module.ts +2 -0
- package/src/hosted/node/plugin-host-rpc.ts +10 -4
- package/src/main/browser/editors-and-documents-main.spec.ts +140 -0
- package/src/main/browser/editors-and-documents-main.ts +19 -7
- package/src/main/browser/languages-main.spec.ts +101 -0
- package/src/main/browser/languages-main.ts +31 -9
- package/src/main/browser/main-context.ts +4 -0
- package/src/main/browser/menus/vscode-theia-menu-mappings.ts +5 -0
- package/src/main/browser/plugin-ext-frontend-module.ts +2 -1
- package/src/main/browser/telemetry-main.spec.ts +77 -0
- package/src/main/browser/telemetry-main.ts +46 -0
- package/src/main/browser/webview/webview-context-keys.ts +20 -4
- package/src/plugin/plugin-context.ts +3 -2
- package/src/plugin/plugin-manager.ts +6 -0
- package/src/plugin/telemetry-ext.spec.ts +158 -17
- package/src/plugin/telemetry-ext.ts +63 -33
|
@@ -14,33 +14,54 @@
|
|
|
14
14
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
15
|
|
|
16
16
|
import { Event, Emitter } from '@theia/core/lib/common/event';
|
|
17
|
+
import { Disposable } from '@theia/core/lib/common/disposable';
|
|
17
18
|
import { cloneAndChange } from '@theia/core';
|
|
19
|
+
import { injectable } from '@theia/core/shared/inversify';
|
|
20
|
+
import { TelemetryLevel, isKindAllowedByLevel } from '@theia/telemetry/lib/common/telemetry-types';
|
|
21
|
+
import { TelemetryExt } from '../common/plugin-api-rpc';
|
|
18
22
|
import { mixin } from '../common/types';
|
|
19
23
|
import { TelemetryTrustedValue, TelemetryLoggerOptions } from './types-impl';
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Holds the telemetry level the user consented to and hands it to the loggers plugins create.
|
|
27
|
+
*
|
|
28
|
+
* @experimental
|
|
29
|
+
*/
|
|
30
|
+
@injectable()
|
|
31
|
+
export class TelemetryExtImpl implements TelemetryExt {
|
|
22
32
|
|
|
23
|
-
|
|
33
|
+
protected currentLevel: TelemetryLevel = 'off';
|
|
24
34
|
private readonly onDidChangeTelemetryEnabledEmitter = new Emitter<boolean>();
|
|
25
35
|
readonly onDidChangeTelemetryEnabled: Event<boolean> = this.onDidChangeTelemetryEnabledEmitter.event;
|
|
36
|
+
private readonly onDidChangeTelemetryLevelEmitter = new Emitter<TelemetryLevel>();
|
|
37
|
+
protected readonly onDidChangeTelemetryLevel: Event<TelemetryLevel> = this.onDidChangeTelemetryLevelEmitter.event;
|
|
26
38
|
|
|
27
|
-
get
|
|
28
|
-
return this.
|
|
39
|
+
get level(): TelemetryLevel {
|
|
40
|
+
return this.currentLevel;
|
|
29
41
|
}
|
|
30
42
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
43
|
+
$onDidChangeTelemetryLevel(level: TelemetryLevel): void {
|
|
44
|
+
this.setLevel(level);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
setLevel(level: TelemetryLevel): void {
|
|
48
|
+
if (this.currentLevel === level) {
|
|
49
|
+
return;
|
|
35
50
|
}
|
|
51
|
+
const wasTelemetryEnabled = this.isTelemetryEnabled;
|
|
52
|
+
this.currentLevel = level;
|
|
53
|
+
this.onDidChangeTelemetryLevelEmitter.fire(level);
|
|
54
|
+
if (this.isTelemetryEnabled !== wasTelemetryEnabled) {
|
|
55
|
+
this.onDidChangeTelemetryEnabledEmitter.fire(this.isTelemetryEnabled);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
get isTelemetryEnabled(): boolean {
|
|
60
|
+
return isKindAllowedByLevel(this.currentLevel, 'usage');
|
|
36
61
|
}
|
|
37
62
|
|
|
38
63
|
createTelemetryLogger(sender: TelemetrySender, options?: TelemetryLoggerOptions | undefined): TelemetryLogger {
|
|
39
|
-
|
|
40
|
-
this.onDidChangeTelemetryEnabled(isEnabled => {
|
|
41
|
-
logger.telemetryEnabled = isEnabled;
|
|
42
|
-
});
|
|
43
|
-
return logger;
|
|
64
|
+
return new TelemetryLogger(sender, this.currentLevel, this.onDidChangeTelemetryLevel, options);
|
|
44
65
|
}
|
|
45
66
|
}
|
|
46
67
|
|
|
@@ -49,30 +70,36 @@ export class TelemetryLogger {
|
|
|
49
70
|
readonly options: TelemetryLoggerOptions | undefined;
|
|
50
71
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
51
72
|
readonly commonProperties: Record<string, any>;
|
|
52
|
-
private
|
|
73
|
+
private _level: TelemetryLevel;
|
|
53
74
|
|
|
54
75
|
private readonly onDidChangeEnableStatesEmitter: Emitter<TelemetryLogger> = new Emitter();
|
|
55
76
|
readonly onDidChangeEnableStates: Event<TelemetryLogger> = this.onDidChangeEnableStatesEmitter.event;
|
|
56
77
|
private _isUsageEnabled: boolean;
|
|
57
78
|
private _isErrorsEnabled: boolean;
|
|
79
|
+
private readonly levelSubscription: Disposable;
|
|
58
80
|
|
|
59
|
-
constructor(sender: TelemetrySender,
|
|
81
|
+
constructor(sender: TelemetrySender, level: TelemetryLevel, onDidChangeTelemetryLevel: Event<TelemetryLevel>, options?: TelemetryLoggerOptions) {
|
|
60
82
|
this.sender = sender;
|
|
61
83
|
this.options = options;
|
|
62
84
|
this.commonProperties = this.getCommonProperties();
|
|
63
|
-
this.
|
|
64
|
-
this._isErrorsEnabled =
|
|
65
|
-
this._isUsageEnabled =
|
|
85
|
+
this._level = level;
|
|
86
|
+
this._isErrorsEnabled = isKindAllowedByLevel(level, 'error');
|
|
87
|
+
this._isUsageEnabled = isKindAllowedByLevel(level, 'usage');
|
|
88
|
+
this.levelSubscription = onDidChangeTelemetryLevel(next => this.applyLevel(next));
|
|
66
89
|
}
|
|
67
90
|
|
|
68
|
-
|
|
69
|
-
|
|
91
|
+
/**
|
|
92
|
+
* The telemetry level the user consented to. Must stay read-only: the object handed to a plugin is proxied with a
|
|
93
|
+
* `get` trap only, so a setter here would let the plugin raise its own gate.
|
|
94
|
+
*/
|
|
95
|
+
get level(): TelemetryLevel {
|
|
96
|
+
return this._level;
|
|
70
97
|
}
|
|
71
98
|
|
|
72
|
-
|
|
73
|
-
if (this.
|
|
74
|
-
this.
|
|
75
|
-
this.updateEnableStates(
|
|
99
|
+
private applyLevel(level: TelemetryLevel): void {
|
|
100
|
+
if (this._level !== level) {
|
|
101
|
+
this._level = level;
|
|
102
|
+
this.updateEnableStates(isKindAllowedByLevel(level, 'usage'), isKindAllowedByLevel(level, 'error'));
|
|
76
103
|
}
|
|
77
104
|
}
|
|
78
105
|
|
|
@@ -108,7 +135,7 @@ export class TelemetryLogger {
|
|
|
108
135
|
|
|
109
136
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
110
137
|
logUsage(eventName: string, data?: Record<string, any | TelemetryTrustedValue<any>>): void {
|
|
111
|
-
if (!this.
|
|
138
|
+
if (!isKindAllowedByLevel(this._level, 'usage') || !this.isUsageEnabled) {
|
|
112
139
|
return;
|
|
113
140
|
}
|
|
114
141
|
this.logEvent(eventName, data);
|
|
@@ -116,7 +143,7 @@ export class TelemetryLogger {
|
|
|
116
143
|
|
|
117
144
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
118
145
|
logError(eventNameOrException: string | Error, data?: Record<string, any | TelemetryTrustedValue<any>>): void {
|
|
119
|
-
if (!this.
|
|
146
|
+
if (!isKindAllowedByLevel(this._level, 'error') || !this.isErrorsEnabled || !this.sender) {
|
|
120
147
|
// no sender available or error shall not be sent
|
|
121
148
|
return;
|
|
122
149
|
}
|
|
@@ -128,14 +155,17 @@ export class TelemetryLogger {
|
|
|
128
155
|
}
|
|
129
156
|
|
|
130
157
|
dispose(): void {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
158
|
+
this.levelSubscription.dispose();
|
|
159
|
+
this.onDidChangeEnableStatesEmitter.dispose();
|
|
160
|
+
const sender = this.sender;
|
|
161
|
+
this.sender = undefined;
|
|
162
|
+
const reportFlushFailure = (error: unknown): void => console.error('Failed to flush the telemetry sender.', error);
|
|
163
|
+
try {
|
|
164
|
+
Promise.resolve(sender?.flush?.()).catch(reportFlushFailure);
|
|
165
|
+
} catch (error) {
|
|
166
|
+
reportFlushFailure(error);
|
|
137
167
|
}
|
|
138
|
-
}
|
|
168
|
+
}
|
|
139
169
|
|
|
140
170
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
141
171
|
private logEvent(eventName: string, data?: Record<string, any>): void {
|