Skip to content

Commit 8f41444

Browse files
authored
send error if obtaining of types-registry package failed (#14573) (#14585)
1 parent 6e8c44f commit 8f41444

File tree

5 files changed

+45
-3
lines changed

5 files changed

+45
-3
lines changed

src/server/protocol.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2127,6 +2127,17 @@ namespace ts.server.protocol {
21272127
payload: any;
21282128
}
21292129

2130+
export type TypesInstallerInitializationFailedEventName = "typesInstallerInitializationFailed";
2131+
2132+
export interface TypesInstallerInitializationFailedEvent extends Event {
2133+
event: TypesInstallerInitializationFailedEventName;
2134+
body: TypesInstallerInitializationFailedEventBody;
2135+
}
2136+
2137+
export interface TypesInstallerInitializationFailedEventBody {
2138+
message: string;
2139+
}
2140+
21302141
export type TypingsInstalledTelemetryEventName = "typingsInstalled";
21312142

21322143
export interface TypingsInstalledTelemetryEventBody extends TelemetryEventBody {

src/server/server.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,11 +304,23 @@ namespace ts.server {
304304
});
305305
}
306306

307-
private handleMessage(response: SetTypings | InvalidateCachedTypings | BeginInstallTypes | EndInstallTypes) {
307+
private handleMessage(response: SetTypings | InvalidateCachedTypings | BeginInstallTypes | EndInstallTypes | InitializationFailedResponse) {
308308
if (this.logger.hasLevel(LogLevel.verbose)) {
309309
this.logger.info(`Received response: ${JSON.stringify(response)}`);
310310
}
311311

312+
if (response.kind === EventInitializationFailed) {
313+
if (!this.eventSender) {
314+
return;
315+
}
316+
const body: protocol.TypesInstallerInitializationFailedEventBody = {
317+
message: response.message
318+
}
319+
const eventName: protocol.TypesInstallerInitializationFailedEventName = "typesInstallerInitializationFailed";
320+
this.eventSender.event(body, eventName);
321+
return;
322+
}
323+
312324
if (response.kind === EventBeginInstallTypes) {
313325
if (!this.eventSender) {
314326
return;

src/server/shared.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace ts.server {
55
export const ActionInvalidate: ActionInvalidate = "action::invalidate";
66
export const EventBeginInstallTypes: EventBeginInstallTypes = "event::beginInstallTypes";
77
export const EventEndInstallTypes: EventEndInstallTypes = "event::endInstallTypes";
8+
export const EventInitializationFailed: EventInitializationFailed = "event::initializationFailed";
89

910
export namespace Arguments {
1011
export const GlobalCacheLocation = "--globalTypingsCacheLocation";

src/server/types.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,15 @@ declare namespace ts.server {
4747
export type ActionInvalidate = "action::invalidate";
4848
export type EventBeginInstallTypes = "event::beginInstallTypes";
4949
export type EventEndInstallTypes = "event::endInstallTypes";
50+
export type EventInitializationFailed = "event::initializationFailed";
5051

5152
export interface TypingInstallerResponse {
52-
readonly kind: ActionSet | ActionInvalidate | EventBeginInstallTypes | EventEndInstallTypes;
53+
readonly kind: ActionSet | ActionInvalidate | EventBeginInstallTypes | EventEndInstallTypes | EventInitializationFailed;
54+
}
55+
56+
export interface InitializationFailedResponse extends TypingInstallerResponse {
57+
readonly kind: EventInitializationFailed;
58+
readonly message: string;
5359
}
5460

5561
export interface ProjectResponse extends TypingInstallerResponse {

src/server/typingsInstaller/nodeTypingsInstaller.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ namespace ts.server.typingsInstaller {
7676
private readonly npmPath: string;
7777
readonly typesRegistry: Map<void>;
7878

79+
private delayedInitializationError: InitializationFailedResponse;
80+
7981
constructor(globalTypingsCacheLocation: string, throttleLimit: number, log: Log) {
8082
super(
8183
sys,
@@ -101,13 +103,23 @@ namespace ts.server.typingsInstaller {
101103
if (this.log.isEnabled()) {
102104
this.log.writeLine(`Error updating ${TypesRegistryPackageName} package: ${(<Error>e).message}`);
103105
}
106+
// store error info to report it later when it is known that server is already listening to events from typings installer
107+
this.delayedInitializationError = {
108+
kind: "event::initializationFailed",
109+
message: (<Error>e).message
110+
};
104111
}
105112

106113
this.typesRegistry = loadTypesRegistryFile(getTypesRegistryFileLocation(globalTypingsCacheLocation), this.installTypingHost, this.log);
107114
}
108115

109116
listen() {
110117
process.on("message", (req: DiscoverTypings | CloseProject) => {
118+
if (this.delayedInitializationError) {
119+
// report initializationFailed error
120+
this.sendResponse(this.delayedInitializationError);
121+
this.delayedInitializationError = undefined;
122+
}
111123
switch (req.kind) {
112124
case "discover":
113125
this.install(req);
@@ -118,7 +130,7 @@ namespace ts.server.typingsInstaller {
118130
});
119131
}
120132

121-
protected sendResponse(response: SetTypings | InvalidateCachedTypings | BeginInstallTypes | EndInstallTypes) {
133+
protected sendResponse(response: SetTypings | InvalidateCachedTypings | BeginInstallTypes | EndInstallTypes | InitializationFailedResponse) {
122134
if (this.log.isEnabled()) {
123135
this.log.writeLine(`Sending response: ${JSON.stringify(response)}`);
124136
}

0 commit comments

Comments
 (0)