Skip to content

Commit dfa14de

Browse files
authored
Initial kernel client on Notebook (and favor onsession) to support pygwalker (#326)
* chore: kernel indicators * chore: ipywidgets * fix: kernel clients
1 parent e163d96 commit dfa14de

22 files changed

+467
-244
lines changed

packages/react/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@
216216
"prettier": "^3.0.0",
217217
"process": "^0.11.10",
218218
"rimraf": "^3.0.2",
219+
"source-map-loader": "^5.0.0",
219220
"storybook": "^8.0.10",
220221
"stream": "^0.0.2",
221222
"stream-browserify": "^2.0.2",

packages/react/public/index-local.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@
3434
"mathjaxConfig": "TeX-AMS_CHTML-full,Safe"
3535
}
3636
</script>
37+
<script
38+
data-jupyter-widgets-cdn="https://cdn.jsdelivr.net/npm/"
39+
data-jupyter-widgets-cdn-only="true"
40+
>
41+
</script>
3742
<link rel="shortcut icon"
3843
href="data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAC7SURBVFiF7ZU9CgIxEIXfTHbPopfYc+pJ9AALtmJnZSOIoJWFoCTzLHazxh/Ebpt5EPIxM8XXTCKTxYyMCYwJFhOYCo4JFiMuu317PZwaqEBUIar4YMmskL73DytGjgu4gAt4PDJdzkkzMBloBhqBgcu69XW+1I+rNSQESNDuaMEhdP/Fj/7oW+ACLuACHk/3F5BAfuMLBjm8/ZnxNvNtHmY4b7Ztut0bqStoVSHfWj9Z6mr8LXABF3CBB3nvkDfEVN6PAAAAAElFTkSuQmCC"
3944
type="image/x-icon" />
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/*
2+
* Copyright (c) 2021-2023 Datalayer, Inc.
3+
*
4+
* MIT License
5+
*/
6+
7+
import { useState, useEffect } from 'react';
8+
import { ServerConnection, ServiceManager, Session, Kernel } from "@jupyterlab/services";
9+
import { Box, Text, Label, Button } from '@primer/react';
10+
11+
type IKernelDetectiveProps = {
12+
serviceManager?: ServiceManager.IManager;
13+
}
14+
15+
export const KernelDetective = (props: IKernelDetectiveProps) => {
16+
const { serviceManager } = props;
17+
const [ serverSettings, setServerSettings ] = useState<ServerConnection.ISettings>();
18+
const [ sessions, setSessions ] = useState<Session.IModel[]>([]);
19+
const [ kernels, setKernels ] = useState<Kernel.IModel[]>([]);
20+
const refresh = () => {
21+
if (serviceManager) {
22+
setServerSettings(serviceManager.serverSettings);
23+
serviceManager.sessions.refreshRunning().then(() => {
24+
setSessions(Array.from(serviceManager.sessions.running()));
25+
serviceManager.sessions.runningChanged.connect(() => {
26+
//
27+
});
28+
});
29+
serviceManager.kernels.refreshRunning().then(() => {
30+
setKernels(Array.from(serviceManager.kernels.running()));
31+
serviceManager.kernels.runningChanged.connect(() => {
32+
//
33+
});
34+
});
35+
}
36+
}
37+
useEffect(() => {
38+
refresh();
39+
}, [serviceManager]);
40+
return (
41+
<>
42+
{ serviceManager &&
43+
<>
44+
<Box mb={3}>
45+
<Button onClick={refresh}>Refresh</Button>
46+
</Box>
47+
<Box>
48+
<Text as="h3">Server Settings</Text>
49+
<Label>Base URL</Label>
50+
<Text> {serverSettings?.baseUrl}</Text>
51+
</Box>
52+
<Box>
53+
<Text as="h3">Kernels</Text>
54+
{ kernels.map(kernel => {
55+
return (
56+
<Box key={kernel.id}>
57+
<Label>Kernel</Label>
58+
<Text> {kernel.name} - {kernel.id} - {kernel.connections} connections</Text>
59+
</Box>
60+
)}
61+
)}
62+
</Box>
63+
<Box>
64+
<Text as="h3">Sessions</Text>
65+
{ sessions.map(session => {
66+
return (
67+
<Box key={session.id}>
68+
<Label>Kernel</Label>
69+
<Text> {session.kernel?.name} - {session.kernel?.id}</Text>
70+
<Label style={{ marginLeft: 10 }}>Session</Label>
71+
<Text> {session.name} - {session.path} - {session.type}</Text>
72+
</Box>
73+
)}
74+
)}
75+
</Box>
76+
</>
77+
}
78+
</>
79+
);
80+
}
81+
82+
export default KernelDetective;

packages/react/src/components/kernel/Kernelndicator.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
CircleWhiteIcon,
1818
CircleYellowIcon,
1919
CircledMIcon,
20-
SquareWhiteLargeIcon
20+
PlusCircleIcon
2121
} from '@datalayer/icons-react';
2222
import { KernelMessage } from '@jupyterlab/services';
2323
import { ConnectionStatus, IKernelConnection } from '@jupyterlab/services/lib/kernel/kernel';
@@ -56,7 +56,7 @@ export type ExecutionState =
5656
* Status = 'unknown' | 'starting' | 'idle' | 'busy' | 'terminating' | 'restarting' | 'autorestarting' | 'dead';
5757
*/
5858
export const KERNEL_STATES: Map<ExecutionState, ReactElement> = new Map([
59-
['connecting', <CircleBlackIcon />],
59+
['connecting', <PlusCircleIcon />],
6060
['connected-unknown', <CircledMIcon />],
6161
['connected-starting', <CircleYellowIcon />],
6262
['connected-idle', <CircleGreenIcon />],
@@ -66,7 +66,7 @@ export const KERNEL_STATES: Map<ExecutionState, ReactElement> = new Map([
6666
['connected-autorestarting', <CircleHollowRedIcon />],
6767
['connected-dead', <CircleRedIcon />],
6868
['disconnecting', <CircleBrownIcon />],
69-
['undefined', <SquareWhiteLargeIcon />],
69+
['undefined', <CircleBlackIcon />],
7070
]);
7171

7272
export const toKernelState = (

packages/react/src/components/kernel/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66

77
export * from './KernelActionMenu';
8+
export * from './KernelDetective';
89
export * from './KernelInspector';
910
export * from './KernelLogs';
1011
export * from './KernelLauncher';

packages/react/src/components/notebook/Notebook.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,20 @@
77
import { useState, useEffect } from 'react';
88
import { createPortal } from 'react-dom';
99
import { Box } from '@primer/react';
10-
import { NotebookPanel, INotebookModel } from '@jupyterlab/notebook';
1110
import { Cell, ICellModel } from '@jupyterlab/cells';
11+
import { NotebookPanel, INotebookModel } from '@jupyterlab/notebook';
1212
import { CommandRegistry } from '@lumino/commands';
1313
import { DocumentRegistry } from '@jupyterlab/docregistry';
1414
import { IRenderMime } from '@jupyterlab/rendermime-interfaces';
1515
import { INotebookContent } from '@jupyterlab/nbformat';
16-
import { ServiceManager } from '@jupyterlab/services';
16+
import { ServiceManager, Kernel as JupyterKernel } from '@jupyterlab/services';
1717
import { useJupyter, Lite, Kernel } from './../../jupyter';
1818
import { asObservable, Lumino } from '../lumino';
1919
import { CellMetadataEditor } from './cell/metadata';
2020
import { ICellSidebarProps } from './cell/sidebar';
2121
import { INotebookToolbarProps } from './toolbar/NotebookToolbar';
2222
import { newUuid } from '../../utils';
23-
import { OnKernelConnection } from '../../state';
23+
import { OnSessionConnection } from '../../state';
2424
import { useNotebookStore } from './NotebookState';
2525
import { NotebookAdapter } from './NotebookAdapter';
2626

@@ -53,18 +53,20 @@ export type INotebookProps = {
5353
extensions: DatalayerNotebookExtension[]
5454
height?: string;
5555
id: string;
56-
lite?: Lite;
5756
kernel?: Kernel;
57+
kernelClients?: JupyterKernel.IKernelConnection[];
58+
lite?: Lite;
5859
maxHeight?: string;
5960
nbformat?: INotebookContent;
6061
nbgrader: boolean;
61-
onKernelConnection?: OnKernelConnection;
62+
onSessionConnection?: OnSessionConnection;
6263
path?: string;
6364
readonly: boolean;
6465
renderId: number;
6566
renderers: IRenderMime.IRendererFactory[];
6667
serverless: boolean,
6768
serviceManager?: ServiceManager.IManager,
69+
startDefaultKernel?: boolean;
6870
url?: string;
6971
/**
7072
* The Kernel Id to use, as defined in the Kernel API.
@@ -88,6 +90,7 @@ export const Notebook = (props: INotebookProps) => {
8890
lite: props.lite,
8991
serverless: props.serverless,
9092
serviceManager: props.serviceManager,
93+
startDefaultKernel: props.startDefaultKernel,
9194
useRunningKernelId: props.useRunningKernelId,
9295
useRunningKernelIndex: props.useRunningKernelIndex,
9396
});
@@ -152,7 +155,7 @@ export const Notebook = (props: INotebookProps) => {
152155
adapter.notebookPanel?.sessionContext.statusChanged.connect((_, kernelStatus) => {
153156
notebookStore.changeKernelStatus({ id, kernelStatus });
154157
});
155-
// Add more UI behavior when the Service Manager is ready...
158+
// Add more UI behavior when the Service Manager is ready.
156159
adapter.serviceManager.ready.then(() => {
157160
if (!readonly) {
158161
const cellModel = adapter.notebookPanel!.content.activeCell;
@@ -337,12 +340,14 @@ Notebook.defaultProps = {
337340
cellSidebarMargin: 120,
338341
extensions: [],
339342
height: '100vh',
343+
kernelClients: [],
340344
maxHeight: '100vh',
341345
nbgrader: false,
342346
readonly: false,
343347
renderId: 0,
344348
renderers: [],
345349
serverless: false,
350+
startDefaultKernel: false,
346351
} as Partial<INotebookProps>;
347352

348353
export default Notebook;

0 commit comments

Comments
 (0)