@@ -325,9 +325,11 @@ export class ConnectionManager implements IConnectionManager {
325325 var languageServerClient = new LanguageClient ( title , serverOptions , clientOptions )
326326 languageServerClient . onReady ( ) . then ( ( ) => {
327327 langClient . logger . debug ( 'Language server client started, setting puppet version' )
328- languageServerClient . sendRequest ( messages . PuppetVersionRequest . type ) . then ( ( versionDetails ) => {
329- this . setConnectionStatus ( versionDetails . puppetVersion , ConnectionStatus . Running ) ;
330- if ( reporter ) {
328+ this . setConnectionStatus ( "Loading Puppet" , ConnectionStatus . Starting ) ;
329+ this . queryLanguageServerStatus ( ) ;
330+ // Send telemetry
331+ if ( reporter ) {
332+ languageServerClient . sendRequest ( messages . PuppetVersionRequest . type ) . then ( ( versionDetails ) => {
331333 reporter . sendTelemetryEvent ( 'puppetVersion' + versionDetails . puppetVersion ) ;
332334 reporter . sendTelemetryEvent ( 'facterVersion' + versionDetails . facterVersion ) ;
333335 reporter . sendTelemetryEvent ( 'languageServerVersion' + versionDetails . languageServerVersion ) ;
@@ -336,15 +338,54 @@ export class ConnectionManager implements IConnectionManager {
336338 facterVersion : versionDetails . facterVersion ,
337339 languageServerVersion : versionDetails . languageServerVersion ,
338340 } ) ;
339- }
340- } ) ;
341+ } ) ;
342+ }
341343 } , ( reason ) => {
342344 this . setSessionFailure ( "Could not start language service: " , reason ) ;
343345 } ) ;
344346
345347 return languageServerClient ;
346348 }
347349
350+ private queryLanguageServerStatus ( ) {
351+ let connectionManager = this ;
352+
353+ return new Promise ( ( resolve , reject ) => {
354+ let count = 0 ;
355+ let lastVersionResponse = null ;
356+ let handle = setInterval ( ( ) => {
357+ count ++ ;
358+
359+ // After 30 seonds timeout the progress
360+ if ( count >= 30 || connectionManager . languageClient == undefined ) {
361+ clearInterval ( handle ) ;
362+ connectionManager . setConnectionStatus ( lastVersionResponse . puppetVersion , ConnectionStatus . Running ) ;
363+ resolve ( ) ;
364+ }
365+
366+ connectionManager . languageClient . sendRequest ( messages . PuppetVersionRequest . type ) . then ( ( versionDetails ) => {
367+ lastVersionResponse = versionDetails
368+ if ( versionDetails . factsLoaded && versionDetails . functionsLoaded && versionDetails . typesLoaded ) {
369+ clearInterval ( handle ) ;
370+ connectionManager . setConnectionStatus ( lastVersionResponse . puppetVersion , ConnectionStatus . Running ) ;
371+ resolve ( ) ;
372+ } else {
373+ let progress = 0 ;
374+
375+ if ( versionDetails . factsLoaded ) { progress ++ ; }
376+ if ( versionDetails . functionsLoaded ) { progress ++ ; }
377+ if ( versionDetails . typesLoaded ) { progress ++ ; }
378+ progress = Math . round ( progress / 3.0 * 100 ) ;
379+
380+ this . setConnectionStatus ( "Loading Puppet (" + progress . toString ( ) + "%)" , ConnectionStatus . Starting ) ;
381+ }
382+ } ) ;
383+
384+ } , 1000 ) ;
385+ } ) ;
386+ }
387+
388+
348389 private restartConnection ( connectionConfig ?: IConnectionConfiguration ) {
349390 this . stop ( ) ;
350391 this . start ( connectionConfig ) ;
0 commit comments