@@ -36,7 +36,9 @@ import {
3636import { JupyterSelfCertsError } from './jupyterSelfCertsError' ;
3737import { createRemoteConnectionInfo , expandWorkingDir } from './jupyterUtils' ;
3838import { JupyterWaitForIdleError } from './jupyterWaitForIdleError' ;
39- import { KernelSelector , KernelSpecInterpreter } from './kernels/kernelSelector' ;
39+ import { kernelConnectionMetadataHasKernelSpec } from './kernels/helpers' ;
40+ import { KernelSelector } from './kernels/kernelSelector' ;
41+ import { KernelConnectionMetadata } from './kernels/types' ;
4042import { NotebookStarter } from './notebookStarter' ;
4143
4244const LocalHosts = [ 'localhost' , '127.0.0.1' , '::1' ] ;
@@ -141,8 +143,10 @@ export class JupyterExecutionBase implements IJupyterExecution {
141143 return Cancellation . race ( async ( ) => {
142144 let result : INotebookServer | undefined ;
143145 let connection : IJupyterConnection | undefined ;
144- let kernelSpecInterpreter : KernelSpecInterpreter | undefined ;
145- let kernelSpecInterpreterPromise : Promise < KernelSpecInterpreter > = Promise . resolve ( { } ) ;
146+ let kernelConnectionMetadata : KernelConnectionMetadata | undefined ;
147+ let kernelConnectionMetadataPromise : Promise < KernelConnectionMetadata | undefined > = Promise . resolve <
148+ KernelConnectionMetadata | undefined
149+ > ( undefined ) ;
146150 traceInfo ( `Connecting to ${ options ? options . purpose : 'unknown type of' } server` ) ;
147151 const allowUI = ! options || options . allowUI ( ) ;
148152 const kernelSpecCancelSource = new CancellationTokenSource ( ) ;
@@ -157,7 +161,7 @@ export class JupyterExecutionBase implements IJupyterExecution {
157161 // Get hold of the kernelspec and corresponding (matching) interpreter that'll be used as the spec.
158162 // We can do this in parallel, while starting the server (faster).
159163 traceInfo ( `Getting kernel specs for ${ options ? options . purpose : 'unknown type of' } server` ) ;
160- kernelSpecInterpreterPromise = this . kernelSelector . getKernelForLocalConnection (
164+ kernelConnectionMetadataPromise = this . kernelSelector . getKernelForLocalConnection (
161165 undefined ,
162166 'jupyter' ,
163167 undefined ,
@@ -174,9 +178,9 @@ export class JupyterExecutionBase implements IJupyterExecution {
174178 while ( tryCount <= maxTries && ! this . disposed ) {
175179 try {
176180 // Start or connect to the process
177- [ connection , kernelSpecInterpreter ] = await Promise . all ( [
181+ [ connection , kernelConnectionMetadata ] = await Promise . all ( [
178182 this . startOrConnect ( options , cancelToken ) ,
179- kernelSpecInterpreterPromise
183+ kernelConnectionMetadataPromise
180184 ] ) ;
181185
182186 if ( ! connection . localLaunch && LocalHosts . includes ( connection . hostName . toLowerCase ( ) ) ) {
@@ -186,12 +190,17 @@ export class JupyterExecutionBase implements IJupyterExecution {
186190 result = this . serviceContainer . get < INotebookServer > ( INotebookServer ) ;
187191
188192 // In a remote non quest situation, figure out a kernel spec too.
189- if ( ! kernelSpecInterpreter . kernelSpec && connection && ! options ?. skipSearchingForKernel ) {
193+ if (
194+ ( ! kernelConnectionMetadata ||
195+ ! kernelConnectionMetadataHasKernelSpec ( kernelConnectionMetadata ) ) &&
196+ connection &&
197+ ! options ?. skipSearchingForKernel
198+ ) {
190199 const sessionManagerFactory = this . serviceContainer . get < IJupyterSessionManagerFactory > (
191200 IJupyterSessionManagerFactory
192201 ) ;
193202 const sessionManager = await sessionManagerFactory . create ( connection ) ;
194- kernelSpecInterpreter = await this . kernelSelector . getKernelForRemoteConnection (
203+ kernelConnectionMetadata = await this . kernelSelector . getKernelForRemoteConnection (
195204 undefined ,
196205 sessionManager ,
197206 options ?. metadata ,
@@ -200,16 +209,14 @@ export class JupyterExecutionBase implements IJupyterExecution {
200209 await sessionManager . dispose ( ) ;
201210 }
202211
203- // If no kernel and not going to pick one, exit early
204- if ( ! Object . keys ( kernelSpecInterpreter ) && ! allowUI ) {
205- return undefined ;
206- }
207-
208212 // Populate the launch info that we are starting our server with
209213 const launchInfo : INotebookServerLaunchInfo = {
210214 connectionInfo : connection ! ,
211- interpreter : kernelSpecInterpreter . interpreter ,
212- kernelSpec : kernelSpecInterpreter . kernelSpec ,
215+ interpreter : kernelConnectionMetadata ?. interpreter ,
216+ kernelSpec :
217+ kernelConnectionMetadata && kernelConnectionMetadataHasKernelSpec ( kernelConnectionMetadata )
218+ ? kernelConnectionMetadata ?. kernelSpec
219+ : kernelConnectionMetadata ?. kernelModel ,
213220 workingDir : options ? options . workingDir : undefined ,
214221 uri : options ? options . uri : undefined ,
215222 purpose : options ? options . purpose : uuid ( )
@@ -252,10 +259,9 @@ export class JupyterExecutionBase implements IJupyterExecution {
252259 cancelToken ,
253260 launchInfo . kernelSpec ?. display_name || launchInfo . kernelSpec ?. name
254261 ) ;
255- if ( Object . keys ( kernelInterpreter ) . length > 0 ) {
262+ if ( kernelInterpreter ) {
256263 launchInfo . interpreter = kernelInterpreter . interpreter ;
257- launchInfo . kernelSpec =
258- kernelInterpreter . kernelSpec || kernelInterpreter . kernelModel ;
264+ launchInfo . kernelSpec = kernelInterpreter ?. kernelSpec ;
259265 continue ;
260266 }
261267 }
0 commit comments