From 8ac1833e0c55217e8c51fac13d9163bbaa7a7d95 Mon Sep 17 00:00:00 2001 From: Rob Kopel Date: Sat, 13 May 2023 14:30:50 +1000 Subject: [PATCH] Added selectRunningKernel prop --- packages/react/src/jupyter/Jupyter.tsx | 3 ++ packages/react/src/jupyter/JupyterContext.tsx | 9 ++++-- .../src/jupyter/services/kernel/Kernel.ts | 28 ++++++++++++------- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/packages/react/src/jupyter/Jupyter.tsx b/packages/react/src/jupyter/Jupyter.tsx index 2bedeb7f..196276a0 100644 --- a/packages/react/src/jupyter/Jupyter.tsx +++ b/packages/react/src/jupyter/Jupyter.tsx @@ -37,6 +37,7 @@ export type JupyterProps = { lite: boolean; startDefaultKernel: boolean; defaultKernelName: string; + selectRunningKernel?: boolean; injectableStore?: Store | any; collaborative?: boolean; jupyterServerHttpUrl?: string; @@ -80,6 +81,7 @@ export const Jupyter = (props: JupyterProps) => { lite={lite} startDefaultKernel={startDefaultKernel} defaultKernelName={defaultKernelName} + selectRunningKernel={props?.selectRunningKernel ?? false} baseUrl={getJupyterServerHttpUrl()} wsUrl={getJupyterServerWsUrl()} injectableStore={props.injectableStore || injectableStore} @@ -97,6 +99,7 @@ Jupyter.defaultProps = { lite: false, defaultKernelName: 'python', startDefaultKernel: true, + selectRunningKernel: false, collaborative: false, terminals: false, } diff --git a/packages/react/src/jupyter/JupyterContext.tsx b/packages/react/src/jupyter/JupyterContext.tsx index a26526f4..3b0a1a3a 100644 --- a/packages/react/src/jupyter/JupyterContext.tsx +++ b/packages/react/src/jupyter/JupyterContext.tsx @@ -16,6 +16,7 @@ export type JupyterContextType = { kernelManager?: KernelManager, defaultKernel?: Kernel, startDefaultKernel: boolean, + selectRunningKernel?: boolean, variant: string; setVariant: (value: string) => void; baseUrl: string; @@ -68,6 +69,7 @@ type JupyterContextProps = { wsUrl: string; lite: boolean; startDefaultKernel: boolean, + selectRunningKernel: boolean, defaultKernelName: string, injectableStore: any; }; @@ -101,11 +103,12 @@ export const JupyterContextProvider: React.FC<{ lite: boolean, startDefaultKernel: boolean, defaultKernelName: string, + selectRunningKernel: boolean, variant: string, baseUrl: string, wsUrl: string, injectableStore: any -}> = ({children, lite, startDefaultKernel, defaultKernelName, variant, baseUrl, wsUrl, injectableStore }: JupyterContextProps) => { +}> = ({children, lite, startDefaultKernel, defaultKernelName, selectRunningKernel, variant, baseUrl, wsUrl, injectableStore }: JupyterContextProps) => { const [_, setVariant] = useState('default'); const [serverSettings] = useState(createServerSettings(baseUrl, wsUrl)); const [serviceManager, setServiceManager] = useState(); @@ -120,7 +123,7 @@ export const JupyterContextProvider: React.FC<{ kernelManager.ready.then(() => { console.log('Kernel Manager is ready', kernelManager); if (startDefaultKernel) { - const kernel = new Kernel({ kernelManager, kernelName: defaultKernelName }); + const kernel = new Kernel({ kernelManager, kernelName: defaultKernelName, selectRunningKernel: selectRunningKernel }); kernel.getJupyterKernel().then(k => { console.log(`Kernel started with session client_id:id ${k.clientId}:${k.id}`); k.info.then(info => { @@ -145,7 +148,7 @@ export const JupyterContextProvider: React.FC<{ kernelManager.ready.then(() => { console.log('Kernel Manager is ready', kernelManager); if (startDefaultKernel) { - const kernel = new Kernel({ kernelManager, kernelName: defaultKernelName }); + const kernel = new Kernel({ kernelManager, kernelName: defaultKernelName, selectRunningKernel: selectRunningKernel }); kernel.getJupyterKernel().then(k => { console.log(`Kernel started with session client_id:id ${k.clientId}:${k.id}`); k.info.then(info => { diff --git a/packages/react/src/jupyter/services/kernel/Kernel.ts b/packages/react/src/jupyter/services/kernel/Kernel.ts index 988e8159..67d2f0dc 100755 --- a/packages/react/src/jupyter/services/kernel/Kernel.ts +++ b/packages/react/src/jupyter/services/kernel/Kernel.ts @@ -5,6 +5,7 @@ import { UUID } from '@lumino/coreutils'; export type IKernelProps = { kernelManager: KernelManager; kernelName: string; + selectRunningKernel?: boolean; } export class Kernel { @@ -18,10 +19,10 @@ export class Kernel { public constructor(props: IKernelProps) { this._kernelManager = props.kernelManager; this._kernelName = props.kernelName; - this._jupyterKernel = this.requestJupyterKernel(); // Request the effective Jupyter Kernel. + this._jupyterKernel = this.requestJupyterKernel(props?.selectRunningKernel); // Request the effective Jupyter Kernel. } - private async requestJupyterKernel(): Promise { + private async requestJupyterKernel(selectRunningKernel?: boolean): Promise { await this._kernelManager.ready; const sessionManager = new SessionManager({ kernelManager: this._kernelManager, @@ -30,14 +31,21 @@ export class Kernel { }); await sessionManager.ready; const randomName = UUID.uuid4(); - this._session = await sessionManager.startNew({ - path: randomName, - name: randomName, - type: this._kernelName, - kernel: { - name: this._kernelName, - }, - }); + + if (selectRunningKernel) { + console.log('Attempting to use pre-exisitng kernel') + const runningModel = sessionManager.running().next().value; + this._session = sessionManager.connectTo({model: runningModel}); + } else { + this._session = await sessionManager.startNew({ + path: randomName, + name: randomName, + type: this._kernelName, + kernel: { + name: this._kernelName, + }, + }); + } this._info = await this._session.kernel!.info; this._id = this._session.kernel!.id; return this._session.kernel!;