@@ -24,6 +24,13 @@ export interface StatusChangeEvent {
2424
2525const RETRY_CONNECTION_DELAY = 3000
2626
27+ export interface LanguageClientManagerOptions {
28+ /**
29+ * The language client will stop trying to start after `maxStartAttemptCount` failed attempts
30+ */
31+ maxStartAttemptCount ?: number
32+ }
33+
2734export class LanguageClientManager implements LanguageClient {
2835 languageClient ?: MonacoLanguageClient
2936 private disposed : boolean = false
@@ -37,7 +44,8 @@ export class LanguageClientManager implements LanguageClient {
3744 constructor (
3845 private id : LanguageClientId ,
3946 private clientOptions : LanguageClientOptions ,
40- private infrastructure : Infrastructure
47+ private infrastructure : Infrastructure ,
48+ private managerOptions : LanguageClientManagerOptions
4149 ) {
4250 this . useMutualizedProxy = this . infrastructure . useMutualizedProxy ( this . id , this . clientOptions )
4351 }
@@ -124,7 +132,14 @@ export class LanguageClientManager implements LanguageClient {
124132 } ) )
125133 }
126134 let started = false
127- while ( ! this . isDisposed ( ) && ! started ) {
135+ let attempt = 0
136+ while (
137+ ! this . isDisposed ( ) &&
138+ ! started && (
139+ this . managerOptions . maxStartAttemptCount == null ||
140+ attempt < this . managerOptions . maxStartAttemptCount
141+ )
142+ ) {
128143 try {
129144 await this . _start ( )
130145 started = true
@@ -134,6 +149,7 @@ export class LanguageClientManager implements LanguageClient {
134149 } ) )
135150 await delay ( RETRY_CONNECTION_DELAY )
136151 }
152+ ++ attempt
137153 }
138154 }
139155
@@ -302,7 +318,8 @@ export class LanguageClientManager implements LanguageClient {
302318function createLanguageClientManager (
303319 id : LanguageClientId ,
304320 infrastructure : Infrastructure ,
305- clientOptions : LanguageClientOptions = getLanguageClientOptions ( id )
321+ clientOptions : LanguageClientOptions = getLanguageClientOptions ( id ) ,
322+ managerOptions : LanguageClientManagerOptions = { }
306323) : LanguageClientManager {
307324 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
308325 if ( clientOptions == null ) {
@@ -320,7 +337,7 @@ function createLanguageClientManager (
320337
321338 updateServices ( infrastructure )
322339
323- return new LanguageClientManager ( id , clientOptions , infrastructure )
340+ return new LanguageClientManager ( id , clientOptions , infrastructure , managerOptions )
324341}
325342
326343export {
0 commit comments