Skip to content

Commit 114b998

Browse files
committed
feat: Add some option to make the readiness detection more precise
1 parent 23204df commit 114b998

File tree

2 files changed

+33
-6
lines changed

2 files changed

+33
-6
lines changed

src/languageClient.ts

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as monaco from 'monaco-editor'
22
import {
3-
CloseAction, ErrorAction, MonacoLanguageClient, Emitter, Event, TextDocument, Services, State, DisposableCollection, CancellationToken, RequestType, NotificationType, Disposable
3+
CloseAction, ErrorAction, MonacoLanguageClient, Emitter, Event, TextDocument, Services, State, DisposableCollection, CancellationToken, RequestType, NotificationType, Disposable, LogMessageNotification
44
} from 'monaco-languageclient'
55
import delay from 'delay'
66
import { Uri } from 'monaco-editor'
@@ -32,12 +32,14 @@ export class LanguageClientManager implements LanguageClient {
3232
protected readonly onWillCloseEmitter = new Emitter<void>()
3333
protected readonly onWillShutdownEmitter = new Emitter<WillShutdownParams>()
3434
protected currentStatus: Status = 'connecting'
35+
private useMutualizedProxy: boolean
3536

3637
constructor (
3738
private id: LanguageClientId,
3839
private languageServerOptions: LanguageClientOptions,
3940
private infrastructure: Infrastructure
4041
) {
42+
this.useMutualizedProxy = this.infrastructure.useMutualizedProxy(this.id, this.languageServerOptions)
4143
}
4244

4345
private updateStatus (status: Status) {
@@ -109,7 +111,7 @@ export class LanguageClientManager implements LanguageClient {
109111

110112
public async start (): Promise<void> {
111113
try {
112-
await loadExtensionConfigurations([this.id], this.infrastructure.useMutualizedProxy(this.id, this.languageServerOptions))
114+
await loadExtensionConfigurations([this.id], this.useMutualizedProxy)
113115
} catch (error) {
114116
console.error('Unable to load extension configuration', error)
115117
}
@@ -201,11 +203,26 @@ export class LanguageClientManager implements LanguageClient {
201203
this.updateStatus('connecting')
202204
readyPromise = languageClient.onReady().then(async () => {
203205
const disposableCollection = new DisposableCollection()
204-
await Promise.race([
205-
new Promise<void>(resolve => {
206+
207+
let readyPromise: Promise<void>
208+
const { maxInitializeDuration, readinessMessageMatcher } = this.languageServerOptions
209+
if (readinessMessageMatcher != null && !this.useMutualizedProxy) {
210+
readyPromise = new Promise<void>(resolve => {
211+
disposableCollection.push(languageClient.onNotification(LogMessageNotification.type, logMessage => {
212+
if (readinessMessageMatcher.exec(logMessage.message) != null) {
213+
resolve()
214+
}
215+
}))
216+
})
217+
} else {
218+
readyPromise = new Promise<void>(resolve => {
206219
disposableCollection.push(onServerResponse.event(resolve))
207-
}),
208-
delay(15000)
220+
})
221+
}
222+
223+
await Promise.race([
224+
readyPromise,
225+
delay(maxInitializeDuration ?? 15_000)
209226
])
210227
disposableCollection.dispose()
211228
}, error => {

src/languageClientOptions.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@ export type LanguageClientOptions = Pick<MonacoLanguageClientOptions, 'documentS
77
* Is this language server mutualizable by the CodinGame mutualized proxy
88
*/
99
mutualizable: boolean
10+
/**
11+
* Maximum initialization duration. After this delay, the language server will be considered ready no matter what
12+
* default: 15_000
13+
*/
14+
maxInitializeDuration?: number
15+
16+
/**
17+
* The language server will only be considered ready after this log message was received
18+
*/
19+
readinessMessageMatcher?: RegExp
1020
}
1121

1222
const dynamicOptions: Partial<Record<string, LanguageClientOptions>> = {}

0 commit comments

Comments
 (0)