From a297f6d7f694e46433c1d1f71190355ac0ccd645 Mon Sep 17 00:00:00 2001 From: Changyong Gong Date: Fri, 27 Mar 2026 14:36:27 +0800 Subject: [PATCH] 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. --- src/apiManager.ts | 13 +++++++++++++ src/extension.api.ts | 10 +++++++++- src/standardLanguageClient.ts | 3 +++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/apiManager.ts b/src/apiManager.ts index 6cdbf8e623..7f38791882 100644 --- a/src/apiManager.ts +++ b/src/apiManager.ts @@ -22,6 +22,7 @@ class ApiManager { private traceEventEmitter: Emitter = new Emitter(); private sourceInvalidatedEventEmitter: Emitter = new Emitter(); private serverReadyPromiseResolve: (result: boolean) => void; + private serverRunningPromiseResolve: (result: boolean) => void; public initialize(requirements: RequirementsData, serverMode: ServerMode): void { // if it's manual import mode, set the server mode to lightweight, so that the @@ -57,6 +58,13 @@ class ApiManager { return serverReadyPromise; }; + const serverRunningPromise: Promise = new Promise((resolve) => { + this.serverRunningPromiseResolve = resolve; + }); + const serverRunning = async () => { + return serverRunningPromise; + }; + this.api = { apiVersion: extensionApiVersion, javaRequirement: requirements, @@ -73,6 +81,7 @@ class ApiManager { onDidProjectsImport, onDidProjectsDelete, serverReady, + serverRunning, onWillRequestStart, onDidRequestEnd, trackEvent: traceEvent, @@ -123,6 +132,10 @@ class ApiManager { public resolveServerReadyPromise(): void { this.serverReadyPromiseResolve(true); } + + public resolveServerRunningPromise(): void { + this.serverRunningPromiseResolve?.(true); + } } export const apiManager: ApiManager = new ApiManager(); diff --git a/src/extension.api.ts b/src/extension.api.ts index 4c86610626..7e44da530b 100644 --- a/src/extension.api.ts +++ b/src/extension.api.ts @@ -111,7 +111,7 @@ export interface SourceInvalidatedEvent { affectedEditorDocuments?: Uri[]; } -export const extensionApiVersion = '0.13'; +export const extensionApiVersion = '0.14'; export interface ExtensionAPI { readonly apiVersion: string; @@ -167,6 +167,14 @@ export interface ExtensionAPI { */ readonly serverReady: () => Promise; + /** + * A promise that will be resolved when the language server process is running + * and can accept requests, even if project imports have not yet completed. + * This allows extensions to start querying for projects incrementally during import. + * @since API version 0.14 + */ + readonly serverRunning?: () => Promise; + /** * An event that's fired when a request is about to send to language server. * @since API version 0.12 diff --git a/src/standardLanguageClient.ts b/src/standardLanguageClient.ts index 11eac27db1..7a0aae0eb3 100644 --- a/src/standardLanguageClient.ts +++ b/src/standardLanguageClient.ts @@ -121,6 +121,9 @@ export class StandardLanguageClient { public registerLanguageClientActions(context: ExtensionContext, hasImported: boolean, jdtEventEmitter: EventEmitter) { activationProgressNotification.showProgress(); this.languageClient.onNotification(StatusNotification.type, (report) => { + // Resolve serverRunning on the first status notification from the server, + // indicating the server process is alive and can accept requests. + apiManager.resolveServerRunningPromise(); switch (report.type) { case 'ServiceReady': apiManager.updateServerMode(ServerMode.standard);