Skip to content

Commit 6f8b4eb

Browse files
chagongfbricon
authored andcommitted
feat: add serverRunning() API (v0.14) for progressive loading
Add serverRunning() promise to ExtensionAPI that resolves when the server process is alive and can handle requests, even before project imports complete. This enables dependent extensions to show progressive content during long imports instead of waiting for full initialization. Bump extensionApiVersion to 0.14.
1 parent 4f862f5 commit 6f8b4eb

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

src/apiManager.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class ApiManager {
2222
private traceEventEmitter: Emitter<any> = new Emitter<any>();
2323
private sourceInvalidatedEventEmitter: Emitter<SourceInvalidatedEvent> = new Emitter<SourceInvalidatedEvent>();
2424
private serverReadyPromiseResolve: (result: boolean) => void;
25+
private serverRunningPromiseResolve: (result: boolean) => void;
2526

2627
public initialize(requirements: RequirementsData, serverMode: ServerMode): void {
2728
// if it's manual import mode, set the server mode to lightweight, so that the
@@ -57,6 +58,13 @@ class ApiManager {
5758
return serverReadyPromise;
5859
};
5960

61+
const serverRunningPromise: Promise<boolean> = new Promise<boolean>((resolve) => {
62+
this.serverRunningPromiseResolve = resolve;
63+
});
64+
const serverRunning = async () => {
65+
return serverRunningPromise;
66+
};
67+
6068
this.api = {
6169
apiVersion: extensionApiVersion,
6270
javaRequirement: requirements,
@@ -73,6 +81,7 @@ class ApiManager {
7381
onDidProjectsImport,
7482
onDidProjectsDelete,
7583
serverReady,
84+
serverRunning,
7685
onWillRequestStart,
7786
onDidRequestEnd,
7887
trackEvent: traceEvent,
@@ -123,6 +132,10 @@ class ApiManager {
123132
public resolveServerReadyPromise(): void {
124133
this.serverReadyPromiseResolve(true);
125134
}
135+
136+
public resolveServerRunningPromise(): void {
137+
this.serverRunningPromiseResolve?.(true);
138+
}
126139
}
127140

128141
export const apiManager: ApiManager = new ApiManager();

src/extension.api.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ export interface SourceInvalidatedEvent {
111111
affectedEditorDocuments?: Uri[];
112112
}
113113

114-
export const extensionApiVersion = '0.13';
114+
export const extensionApiVersion = '0.14';
115115

116116
export interface ExtensionAPI {
117117
readonly apiVersion: string;
@@ -167,6 +167,14 @@ export interface ExtensionAPI {
167167
*/
168168
readonly serverReady: () => Promise<boolean>;
169169

170+
/**
171+
* A promise that will be resolved when the language server process is running
172+
* and can accept requests, even if project imports have not yet completed.
173+
* This allows extensions to start querying for projects incrementally during import.
174+
* @since API version 0.14
175+
*/
176+
readonly serverRunning?: () => Promise<boolean>;
177+
170178
/**
171179
* An event that's fired when a request is about to send to language server.
172180
* @since API version 0.12

src/standardLanguageClient.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ export class StandardLanguageClient {
121121
public registerLanguageClientActions(context: ExtensionContext, hasImported: boolean, jdtEventEmitter: EventEmitter<Uri>) {
122122
activationProgressNotification.showProgress();
123123
this.languageClient.onNotification(StatusNotification.type, (report) => {
124+
// Resolve serverRunning on the first status notification from the server,
125+
// indicating the server process is alive and can accept requests.
126+
apiManager.resolveServerRunningPromise();
124127
switch (report.type) {
125128
case 'ServiceReady':
126129
apiManager.updateServerMode(ServerMode.standard);

0 commit comments

Comments
 (0)