Skip to content

Commit aae4655

Browse files
davidbrochartkrassowski
authored andcommitted
Support server-side execution (jupyterlab#279)
* Support server-side execution * lint * again * Fix jest * Mention this feature in documentation * Update UI test snapshots * Use "dependency_type: minimum" for Minimum Versions check * Add 'serverSideExecution' to page config * Replace "fully recovered" with "recovered" * Add link to jupyter-server issue Co-authored-by: Michał Krassowski <[email protected]> --------- Co-authored-by: Michał Krassowski <[email protected]>
1 parent fe2d797 commit aae4655

File tree

3 files changed

+110
-3
lines changed

3 files changed

+110
-3
lines changed

packages/collaboration-extension/src/collaboration.ts

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
import { IGlobalAwareness } from '@jupyter/collaborative-drive';
1818
import { WebSocketAwarenessProvider } from '@jupyter/docprovider';
1919
import { SidePanel, usersIcon } from '@jupyterlab/ui-components';
20-
import { URLExt } from '@jupyterlab/coreutils';
20+
import { PageConfig, URLExt } from '@jupyterlab/coreutils';
2121
import { ServerConnection } from '@jupyterlab/services';
2222
import { IStateDB, StateDB } from '@jupyterlab/statedb';
2323
import { ITranslator, nullTranslator } from '@jupyterlab/translation';
@@ -190,3 +190,63 @@ export const userEditorCursors: JupyterFrontEndPlugin<void> = {
190190
});
191191
}
192192
};
193+
194+
export const notebookCellExecutor: JupyterFrontEndPlugin<INotebookCellExecutor> =
195+
{
196+
id: '@jupyter/collaboration-extension:notebook-cell-executor',
197+
description:
198+
'Add notebook cell executor that uses REST API instead of kernel protocol over WebSocket.',
199+
autoStart: true,
200+
provides: INotebookCellExecutor,
201+
activate: (app: JupyterFrontEnd): INotebookCellExecutor => {
202+
if (PageConfig.getOption('serverSideExecution') === 'true') {
203+
return Object.freeze({ runCell: runCellServerSide });
204+
}
205+
return Object.freeze({ runCell });
206+
}
207+
};
208+
209+
async function runCellServerSide({
210+
cell,
211+
notebook,
212+
notebookConfig,
213+
onCellExecuted,
214+
onCellExecutionScheduled,
215+
sessionContext,
216+
sessionDialogs,
217+
translator
218+
}: INotebookCellExecutor.IRunCellOptions): Promise<boolean> {
219+
switch (cell.model.type) {
220+
case 'markdown':
221+
(cell as MarkdownCell).rendered = true;
222+
cell.inputHidden = false;
223+
onCellExecuted({ cell, success: true });
224+
break;
225+
case 'code': {
226+
const kernelId = sessionContext?.session?.kernel?.id;
227+
const settings = ServerConnection.makeSettings();
228+
const apiURL = URLExt.join(
229+
settings.baseUrl,
230+
`api/kernels/${kernelId}/execute`
231+
);
232+
const cellId = cell.model.sharedModel.getId();
233+
const documentId = `json:notebook:${notebook.sharedModel.getState(
234+
'file_id'
235+
)}`;
236+
const body = `{"cell_id":"${cellId}","document_id":"${documentId}"}`;
237+
const init = {
238+
method: 'POST',
239+
body
240+
};
241+
try {
242+
await ServerConnection.makeRequest(apiURL, init, settings);
243+
} catch (error: any) {
244+
throw new ServerConnection.NetworkError(error);
245+
}
246+
break;
247+
}
248+
default:
249+
break;
250+
}
251+
return Promise.resolve(true);
252+
}

packages/collaboration-extension/src/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import {
1212
menuBarPlugin,
1313
rtcGlobalAwarenessPlugin,
1414
rtcPanelPlugin,
15-
userEditorCursors
15+
userEditorCursors,
16+
notebookCellExecutor
1617
} from './collaboration';
1718
import { sharedLink } from './sharedlink';
1819

@@ -25,7 +26,8 @@ const plugins: JupyterFrontEndPlugin<any>[] = [
2526
rtcGlobalAwarenessPlugin,
2627
rtcPanelPlugin,
2728
sharedLink,
28-
userEditorCursors
29+
userEditorCursors,
30+
notebookCellExecutor
2931
];
3032

3133
export default plugins;

yarn.lock

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@ __metadata:
55
version: 6
66
cacheKey: 8
77

8+
"@aashutoshrathi/word-wrap@npm:^1.2.3":
9+
version: 1.2.6
10+
resolution: "@aashutoshrathi/word-wrap@npm:1.2.6"
11+
checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd
12+
languageName: node
13+
linkType: hard
14+
815
"@ampproject/remapping@npm:^2.2.0":
916
version: 2.3.0
1017
resolution: "@ampproject/remapping@npm:2.3.0"
@@ -6471,6 +6478,17 @@ __metadata:
64716478
languageName: node
64726479
linkType: hard
64736480

6481+
"domutils@npm:^3.0.1":
6482+
version: 3.1.0
6483+
resolution: "domutils@npm:3.1.0"
6484+
dependencies:
6485+
dom-serializer: ^2.0.0
6486+
domelementtype: ^2.3.0
6487+
domhandler: ^5.0.3
6488+
checksum: e5757456ddd173caa411cfc02c2bb64133c65546d2c4081381a3bafc8a57411a41eed70494551aa58030be9e58574fcc489828bebd673863d39924fb4878f416
6489+
languageName: node
6490+
linkType: hard
6491+
64746492
"dot-prop@npm:6.0.1":
64756493
version: 6.0.1
64766494
resolution: "dot-prop@npm:6.0.1"
@@ -8049,6 +8067,18 @@ __metadata:
80498067
languageName: node
80508068
linkType: hard
80518069

8070+
"htmlparser2@npm:^8.0.0":
8071+
version: 8.0.2
8072+
resolution: "htmlparser2@npm:8.0.2"
8073+
dependencies:
8074+
domelementtype: ^2.3.0
8075+
domhandler: ^5.0.3
8076+
domutils: ^3.0.1
8077+
entities: ^4.4.0
8078+
checksum: 29167a0f9282f181da8a6d0311b76820c8a59bc9e3c87009e21968264c2987d2723d6fde5a964d4b7b6cba663fca96ffb373c06d8223a85f52a6089ced942700
8079+
languageName: node
8080+
linkType: hard
8081+
80528082
"http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1":
80538083
version: 4.1.1
80548084
resolution: "http-cache-semantics@npm:4.1.1"
@@ -9385,6 +9415,13 @@ __metadata:
93859415
languageName: node
93869416
linkType: hard
93879417

9418+
"json-buffer@npm:3.0.1":
9419+
version: 3.0.1
9420+
resolution: "json-buffer@npm:3.0.1"
9421+
checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581
9422+
languageName: node
9423+
linkType: hard
9424+
93889425
"json-parse-better-errors@npm:^1.0.1":
93899426
version: 1.0.2
93909427
resolution: "json-parse-better-errors@npm:1.0.2"
@@ -10559,6 +10596,13 @@ __metadata:
1055910596
languageName: node
1056010597
linkType: hard
1056110598

10599+
"ms@npm:^2.0.0":
10600+
version: 2.1.3
10601+
resolution: "ms@npm:2.1.3"
10602+
checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d
10603+
languageName: node
10604+
linkType: hard
10605+
1056210606
"multimatch@npm:5.0.0":
1056310607
version: 5.0.0
1056410608
resolution: "multimatch@npm:5.0.0"
@@ -11237,6 +11281,7 @@ __metadata:
1123711281
version: 0.9.4
1123811282
resolution: "optionator@npm:0.9.4"
1123911283
dependencies:
11284+
"@aashutoshrathi/word-wrap": ^1.2.3
1124011285
deep-is: ^0.1.3
1124111286
fast-levenshtein: ^2.0.6
1124211287
levn: ^0.4.1

0 commit comments

Comments
 (0)