Skip to content

Commit f3f8721

Browse files
committed
try with the default log console
1 parent 58f4b5d commit f3f8721

File tree

8 files changed

+1043
-229
lines changed

8 files changed

+1043
-229
lines changed

packages/pyodide-kernel-extension/package.json

+8-6
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,17 @@
4747
"watch:labextension": "jupyter labextension watch ."
4848
},
4949
"dependencies": {
50-
"@jupyterlab/application": "^4.4.0-beta.1",
51-
"@jupyterlab/coreutils": "^6.4.0-beta.1",
52-
"@jupyterlite/contents": "^0.6.0-alpha.4",
53-
"@jupyterlite/kernel": "^0.6.0-alpha.4",
50+
"@jupyterlab/application": "^4.4.0-beta.2",
51+
"@jupyterlab/coreutils": "^6.4.0-beta.2",
52+
"@jupyterlab/logconsole": "^4.4.0-beta.2",
53+
"@jupyterlab/notebook": "^4.4.0-beta.2",
54+
"@jupyterlite/contents": "^0.6.0-alpha.5",
55+
"@jupyterlite/kernel": "^0.6.0-alpha.5",
5456
"@jupyterlite/pyodide-kernel": "^0.6.0-alpha.4",
55-
"@jupyterlite/server": "^0.6.0-alpha.4"
57+
"@jupyterlite/server": "^0.6.0-alpha.5"
5658
},
5759
"devDependencies": {
58-
"@jupyterlab/builder": "~4.4.0-beta.1",
60+
"@jupyterlab/builder": "~4.4.0-beta.2",
5961
"rimraf": "^5.0.1",
6062
"typescript": "~5.2.2"
6163
},

packages/pyodide-kernel-extension/src/index.ts

+38-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ import { JupyterFrontEnd, JupyterFrontEndPlugin } from '@jupyterlab/application'
55

66
import { PageConfig, URLExt } from '@jupyterlab/coreutils';
77

8+
import { ILoggerRegistry, ILogPayload } from '@jupyterlab/logconsole';
9+
10+
import { INotebookTracker } from '@jupyterlab/notebook';
11+
812
import { IServiceWorkerManager } from '@jupyterlite/server';
913

1014
import { IBroadcastChannelWrapper } from '@jupyterlite/contents';
@@ -34,12 +38,19 @@ const kernel: JupyterFrontEndPlugin<void> = {
3438
id: PLUGIN_ID,
3539
autoStart: true,
3640
requires: [IKernelSpecs],
37-
optional: [IServiceWorkerManager, IBroadcastChannelWrapper],
41+
optional: [
42+
IServiceWorkerManager,
43+
IBroadcastChannelWrapper,
44+
ILoggerRegistry,
45+
INotebookTracker,
46+
],
3847
activate: (
3948
app: JupyterFrontEnd,
4049
kernelspecs: IKernelSpecs,
4150
serviceWorker?: IServiceWorkerManager,
4251
broadcastChannel?: IBroadcastChannelWrapper,
52+
loggerRegistry?: ILoggerRegistry,
53+
notebookTracker?: INotebookTracker,
4354
) => {
4455
const contentsManager = app.serviceManager.contents;
4556

@@ -65,6 +76,30 @@ const kernel: JupyterFrontEndPlugin<void> = {
6576
}
6677
}
6778

79+
const logger = (options: { payload: ILogPayload; kernelId: string }) => {
80+
if (!notebookTracker || !loggerRegistry) {
81+
// nothing to do in this case
82+
// TODO: simply log to the console?
83+
return;
84+
}
85+
86+
const { payload, kernelId } = options;
87+
88+
const notebook = notebookTracker.find(
89+
(nb) => nb.sessionContext.session?.kernel?.id === kernelId,
90+
);
91+
92+
if (!notebook) {
93+
// no notebook found
94+
return;
95+
}
96+
97+
const logger = loggerRegistry.getLogger(notebook.sessionContext.path);
98+
// TODO set the logger level to info by default?
99+
logger.level = 'info';
100+
logger.log(payload);
101+
};
102+
68103
kernelspecs.register({
69104
spec: {
70105
name: 'python',
@@ -99,9 +134,11 @@ const kernel: JupyterFrontEndPlugin<void> = {
99134
mountDrive,
100135
loadPyodideOptions,
101136
contentsManager,
137+
logger,
102138
});
103139
},
104140
});
141+
void app.serviceManager.kernelspecs.refreshSpecs();
105142
},
106143
};
107144

packages/pyodide-kernel/package.json

+4-3
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,10 @@
5050
"watch": "tsc -b --watch"
5151
},
5252
"dependencies": {
53-
"@jupyterlab/coreutils": "^6.4.0-beta.1",
54-
"@jupyterlite/contents": "^0.6.0-alpha.4",
55-
"@jupyterlite/kernel": "^0.6.0-alpha.4",
53+
"@jupyterlab/coreutils": "^6.4.0-beta.2",
54+
"@jupyterlab/logconsole": "^4.4.0-beta.2",
55+
"@jupyterlite/contents": "^0.6.0-alpha.5",
56+
"@jupyterlite/kernel": "^0.6.0-alpha.5",
5657
"coincident": "^1.2.3",
5758
"comlink": "^4.4.2"
5859
},

packages/pyodide-kernel/src/comlink.worker.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@ class PyodideDriveFS extends DriveFS {
3131
export class PyodideComlinkKernel extends PyodideRemoteKernel {
3232
constructor() {
3333
super();
34+
// use postMessage, but in a format, that comlink would not process.
3435
this._sendWorkerMessage = (msg: any) => {
35-
// use postMessage, but in a format, that comlink would not process.
3636
postMessage({ _kernelMessage: msg });
3737
};
38+
this._logMessage = (msg: any) => {
39+
postMessage({ _logMessage: msg });
40+
};
3841
}
3942

4043
/**

packages/pyodide-kernel/src/kernel.ts

+24-4
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,23 @@ import { Remote, wrap } from 'comlink';
55
import { PromiseDelegate } from '@lumino/coreutils';
66

77
import { PageConfig } from '@jupyterlab/coreutils';
8-
import { Contents, KernelMessage } from '@jupyterlab/services';
98

10-
import { BaseKernel, IKernel } from '@jupyterlite/kernel';
9+
import { ILogPayload } from '@jupyterlab/logconsole';
1110

12-
import { IPyodideWorkerKernel, IRemotePyodideWorkerKernel } from './tokens';
11+
import { Contents, KernelMessage } from '@jupyterlab/services';
1312

14-
import { allJSONUrl, pipliteWheelUrl } from './_pypi';
1513
import {
1614
DriveContentsProcessor,
1715
TDriveMethod,
1816
TDriveRequest,
1917
} from '@jupyterlite/contents';
2018

19+
import { BaseKernel, IKernel } from '@jupyterlite/kernel';
20+
21+
import { IPyodideWorkerKernel, IRemotePyodideWorkerKernel } from './tokens';
22+
23+
import { allJSONUrl, pipliteWheelUrl } from './_pypi';
24+
2125
/**
2226
* A kernel that executes Python code with Pyodide.
2327
*/
@@ -32,6 +36,7 @@ export class PyodideKernel extends BaseKernel implements IKernel {
3236
this._worker = this.initWorker(options);
3337
this._remoteKernel = this.initRemote(options);
3438
this._contentsManager = options.contentsManager;
39+
this._logger = options.logger || (() => {});
3540
}
3641

3742
/**
@@ -65,6 +70,7 @@ export class PyodideKernel extends BaseKernel implements IKernel {
6570
let remote: IPyodideWorkerKernel;
6671
if (crossOriginIsolated) {
6772
remote = coincident(this._worker) as IPyodideWorkerKernel;
73+
remote.processLogMessage = this._processLogMessage.bind(this);
6874
remote.processWorkerMessage = this._processWorkerMessage.bind(this);
6975
// The coincident worker uses its own filesystem API:
7076
(remote.processDriveRequest as any) = async <T extends TDriveMethod>(
@@ -91,6 +97,8 @@ export class PyodideKernel extends BaseKernel implements IKernel {
9197
if (typeof ev?.data?._kernelMessage !== 'undefined') {
9298
// only process non comlink messages
9399
this._processWorkerMessage(ev.data._kernelMessage);
100+
} else if (typeof ev?.data?._logMessage !== 'undefined') {
101+
this._processLogMessage(ev.data._logMessage);
94102
}
95103
});
96104
}
@@ -143,6 +151,12 @@ export class PyodideKernel extends BaseKernel implements IKernel {
143151
return this._ready.promise;
144152
}
145153

154+
private _processLogMessage(msg: any): void {
155+
const data = msg.msg as string;
156+
const payload: ILogPayload = { type: 'text', level: 'info', data };
157+
this._logger({ payload, kernelId: this.id });
158+
}
159+
146160
/**
147161
* Process a message coming from the pyodide web worker.
148162
*
@@ -341,6 +355,7 @@ export class PyodideKernel extends BaseKernel implements IKernel {
341355
}
342356

343357
private _contentsManager: Contents.IManager;
358+
private _logger: (options: { payload: ILogPayload; kernelId: string }) => void;
344359
private _contentsProcessor: DriveContentsProcessor | undefined;
345360
private _worker: Worker;
346361
private _remoteKernel:
@@ -395,5 +410,10 @@ export namespace PyodideKernel {
395410
* The Jupyterlite content manager
396411
*/
397412
contentsManager: Contents.IManager;
413+
414+
/**
415+
* The logger
416+
*/
417+
logger?: (options: { payload: ILogPayload; kernelId: string }) => void;
398418
}
399419
}

packages/pyodide-kernel/src/tokens.ts

+6
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ export interface IPyodideWorkerKernel extends IWorkerKernel {
3030
data: TDriveRequest<T>,
3131
): TDriveResponse<T>;
3232

33+
/**
34+
* Process a log message
35+
* @param msg
36+
*/
37+
processLogMessage(msg: any): void;
38+
3339
/**
3440
* Process worker message
3541
* @param msg

packages/pyodide-kernel/src/worker.ts

+3-28
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,6 @@ import { KernelMessage } from '@jupyterlab/services';
99

1010
import type { IPyodideWorkerKernel } from './tokens';
1111

12-
export class PyodideWorkerLogger {
13-
constructor(kernelId: string) {
14-
this._channel = new BroadcastChannel(`/kernel-broadcast/${kernelId}`);
15-
}
16-
17-
log(...msg: any[]): void {
18-
this._channel.postMessage({ type: 'log', msg: msg.join(' ') });
19-
}
20-
21-
warn(...msg: any[]): void {
22-
this._channel.postMessage({ type: 'warn', msg: msg.join(' ') });
23-
}
24-
25-
error(...msg: any[]): void {
26-
this._channel.postMessage({ type: 'error', msg: msg.join(' ') });
27-
}
28-
29-
private _channel: BroadcastChannel;
30-
}
31-
3212
export class PyodideRemoteKernel {
3313
constructor() {
3414
this._initialized = new Promise((resolve, reject) => {
@@ -42,11 +22,6 @@ export class PyodideRemoteKernel {
4222
async initialize(options: IPyodideWorkerKernel.IOptions): Promise<void> {
4323
this._options = options;
4424

45-
const kernelId = options.kernelId;
46-
if (kernelId) {
47-
this._logger = new PyodideWorkerLogger(kernelId);
48-
}
49-
5025
if (options.location.includes(':')) {
5126
const parts = options.location.split(':');
5227
this._driveName = parts[0];
@@ -83,11 +58,11 @@ export class PyodideRemoteKernel {
8358
});
8459

8560
const log = (msg: string) => {
86-
this._logger?.log(msg);
61+
this._logMessage({ type: 'log', msg });
8762
};
8863

8964
const err = (msg: string) => {
90-
this._logger?.error(msg);
65+
this._logMessage({ type: 'error', msg });
9166
};
9267

9368
// Workaround for being able to get information about packages being loaded by Pyodide
@@ -581,5 +556,5 @@ export class PyodideRemoteKernel {
581556
protected _resolveInputReply: any;
582557
protected _driveFS: DriveFS | null = null;
583558
protected _sendWorkerMessage: (msg: any) => void = () => {};
584-
protected _logger: PyodideWorkerLogger | null = null;
559+
protected _logMessage: (msg: any) => void = () => {};
585560
}

0 commit comments

Comments
 (0)