5
5
6
6
import * as vscode from "vscode" ;
7
7
import { getNonce } from "../utils/utils" ;
8
+ import { sendActionEvent , sendErrorEvent } from "../telemetry/telemetry" ;
9
+ import {
10
+ TelemetryActions ,
11
+ TelemetryViews ,
12
+ WebviewTelemetryActionEvent ,
13
+ WebviewTelemetryErrorEvent ,
14
+ } from "../sharedInterfaces/telemetry" ;
8
15
9
16
/**
10
17
* ReactWebviewBaseController is a class that manages a vscode.Webview and provides
@@ -43,8 +50,25 @@ export abstract class ReactWebviewBaseController<State, Reducers>
43
50
if ( message . type === "request" ) {
44
51
const handler = this . _webviewRequestHandlers [ message . method ] ;
45
52
if ( handler ) {
53
+ const startTime = Date . now ( ) ;
46
54
const result = await handler ( message . params ) ;
47
55
this . postMessage ( { type : "response" , id : message . id , result } ) ;
56
+ const endTime = Date . now ( ) ;
57
+ sendActionEvent (
58
+ TelemetryViews . WebviewController ,
59
+ TelemetryActions . WebviewRequest ,
60
+ {
61
+ type : this . _sourceFile ,
62
+ method : message . method ,
63
+ reducer :
64
+ message . method === "action"
65
+ ? message . params . type
66
+ : undefined ,
67
+ } ,
68
+ {
69
+ durationMs : endTime - startTime ,
70
+ } ,
71
+ ) ;
48
72
} else {
49
73
throw new Error (
50
74
`No handler registered for method ${ message . method } ` ,
@@ -137,6 +161,7 @@ export abstract class ReactWebviewBaseController<State, Reducers>
137
161
this . _webviewRequestHandlers [ "getState" ] = ( ) => {
138
162
return this . state ;
139
163
} ;
164
+
140
165
this . _webviewRequestHandlers [ "action" ] = async ( action ) => {
141
166
const reducer = this . _reducers [ action . type ] ;
142
167
if ( reducer ) {
@@ -147,20 +172,60 @@ export abstract class ReactWebviewBaseController<State, Reducers>
147
172
) ;
148
173
}
149
174
} ;
175
+
150
176
this . _webviewRequestHandlers [ "getTheme" ] = ( ) => {
151
177
return vscode . window . activeColorTheme . kind ;
152
178
} ;
179
+
153
180
this . _webviewRequestHandlers [ "loadStats" ] = ( message ) => {
154
181
const timeStamp = message . loadCompleteTimeStamp ;
155
182
const timeToLoad = timeStamp - this . _loadStartTime ;
156
183
if ( this . _isFirstLoad ) {
157
- console . log ( `
158
- Load stats for ${ this . _sourceFile }
159
- Total time: ${ timeToLoad } ms
160
- ` ) ;
184
+ console . log (
185
+ `Load stats for ${ this . _sourceFile } ` +
186
+ "\n" +
187
+ `Total time: ${ timeToLoad } ms` ,
188
+ ) ;
189
+ sendActionEvent (
190
+ TelemetryViews . WebviewController ,
191
+ TelemetryActions . Load ,
192
+ {
193
+ type : this . _sourceFile ,
194
+ } ,
195
+ {
196
+ durationMs : timeToLoad ,
197
+ } ,
198
+ ) ;
161
199
this . _isFirstLoad = false ;
162
200
}
163
201
} ;
202
+
203
+ this . _webviewRequestHandlers [ "sendActionEvent" ] = (
204
+ message : WebviewTelemetryActionEvent ,
205
+ ) => {
206
+ sendActionEvent (
207
+ message . telemetryView ,
208
+ message . telemetryAction ,
209
+ message . additionalProps ,
210
+ message . additionalMeasurements ,
211
+ ) ;
212
+ } ;
213
+
214
+ this . _webviewRequestHandlers [ "sendErrorEvent" ] = (
215
+ message : WebviewTelemetryErrorEvent ,
216
+ ) => {
217
+ sendErrorEvent (
218
+ message . telemetryView ,
219
+ message . telemetryAction ,
220
+ message . error ,
221
+ message . includeErrorMessage ,
222
+ message . errorCode ,
223
+ message . errorType ,
224
+ message . additionalProps ,
225
+ message . additionalMeasurements ,
226
+ ) ;
227
+ } ;
228
+
164
229
this . _webviewRequestHandlers [ "getLocalization" ] = async ( ) => {
165
230
if ( vscode . l10n . uri ?. fsPath ) {
166
231
const file = await vscode . workspace . fs . readFile (
0 commit comments