@@ -7,7 +7,7 @@ import { inject, injectable } from 'inversify';
77import { IWorkspaceService } from '../../common/application/types' ;
88import { traceError } from '../../common/logger' ;
99
10- import { IPythonExecutionFactory } from '../../common/process/types' ;
10+ import { IPythonExecutionFactory , IPythonExecutionService } from '../../common/process/types' ;
1111import { IDisposable , Resource } from '../../common/types' ;
1212import { noop } from '../../common/utils/misc' ;
1313import { IEnvironmentVariablesProvider } from '../../common/variables/types' ;
@@ -23,7 +23,7 @@ type IKernelDaemonInfo = {
2323 workspaceResource : Resource ;
2424 workspaceFolderIdentifier : string ;
2525 interpreterPath : string ;
26- daemon : Promise < IPythonKernelDaemon > ;
26+ daemon : Promise < IPythonKernelDaemon | IPythonExecutionService > ;
2727} ;
2828
2929@injectable ( )
@@ -68,7 +68,7 @@ export class KernelDaemonPool implements IDisposable {
6868 resource : Resource ,
6969 kernelSpec : IJupyterKernelSpec ,
7070 interpreter ?: PythonInterpreter
71- ) : Promise < IPythonKernelDaemon > {
71+ ) : Promise < IPythonKernelDaemon | IPythonExecutionService > {
7272 const pythonPath = interpreter ?. path || kernelSpec . argv [ 0 ] ;
7373 // If we have environment variables in the kernel.json, then its not we support.
7474 // Cuz there's no way to know before hand what kernelspec can be used, hence no way to know what envs are required.
@@ -104,14 +104,26 @@ export class KernelDaemonPool implements IDisposable {
104104 dedicated : true ,
105105 resource
106106 } ) ;
107- daemon . then ( ( d ) => this . disposables . push ( d ) ) . catch ( noop ) ;
107+ daemon
108+ . then ( ( d ) => {
109+ if ( 'dispose' in d ) {
110+ this . disposables . push ( d ) ;
111+ }
112+ } )
113+ . catch ( noop ) ;
108114 return daemon ;
109115 }
110116 private async onDidEnvironmentVariablesChange ( affectedResoruce : Resource ) {
111117 const workspaceFolderIdentifier = this . workspaceService . getWorkspaceFolderIdentifier ( affectedResoruce ) ;
112118 this . daemonPool = this . daemonPool . filter ( ( item ) => {
113119 if ( item . workspaceFolderIdentifier === workspaceFolderIdentifier ) {
114- item . daemon . then ( ( d ) => d . dispose ( ) ) . catch ( noop ) ;
120+ item . daemon
121+ . then ( ( d ) => {
122+ if ( 'dispose' in d ) {
123+ d . dispose ( ) ;
124+ }
125+ } )
126+ . catch ( noop ) ;
115127 return false ;
116128 }
117129 return true ;
@@ -132,7 +144,16 @@ export class KernelDaemonPool implements IDisposable {
132144 const daemon = this . createDaemon ( resource , interpreter . path ) ;
133145 // Once a daemon is created ensure we pre-warm it (will load ipykernel and start the kernker process waiting to start the actual kernel code).
134146 // I.e. we'll start python process thats the kernel, but will not start the kernel module (`python -m ipykernel`).
135- daemon . then ( ( d ) => d . preWarm ( ) ) . catch ( traceError . bind ( `Failed to prewarm kernel daemon ${ interpreter . path } ` ) ) ;
147+ daemon
148+ . then ( ( d ) => {
149+ // Prewarm if we support prewarming
150+ if ( 'preWarm' in d ) {
151+ d . preWarm ( ) . catch ( traceError . bind ( `Failed to prewarm kernel daemon ${ interpreter . path } ` ) ) ;
152+ }
153+ } )
154+ . catch ( ( e ) => {
155+ traceError ( `Failed to load deamon: ${ e } ` ) ;
156+ } ) ;
136157 this . daemonPool . push ( {
137158 daemon,
138159 interpreterPath : interpreter . path ,
@@ -172,7 +193,13 @@ export class KernelDaemonPool implements IDisposable {
172193 this . daemonPool = this . daemonPool . filter ( ( item ) => {
173194 const interpreterForWorkspace = currentInterpreterInEachWorksapce . get ( item . key ) ;
174195 if ( ! interpreterForWorkspace || ! this . fs . areLocalPathsSame ( interpreterForWorkspace , item . interpreterPath ) ) {
175- item . daemon . then ( ( d ) => d . dispose ( ) ) . catch ( noop ) ;
196+ item . daemon
197+ . then ( ( d ) => {
198+ if ( 'dispose' in d ) {
199+ d . dispose ( ) ;
200+ }
201+ } )
202+ . catch ( noop ) ;
176203 return false ;
177204 }
178205
0 commit comments