@@ -5,19 +5,23 @@ import { Remote, wrap } from 'comlink';
5
5
import { PromiseDelegate } from '@lumino/coreutils' ;
6
6
7
7
import { PageConfig } from '@jupyterlab/coreutils' ;
8
- import { Contents , KernelMessage } from '@jupyterlab/services' ;
9
8
10
- import { BaseKernel , IKernel } from '@jupyterlite/kernel ' ;
9
+ import { ILogPayload } from '@jupyterlab/logconsole ' ;
11
10
12
- import { IPyodideWorkerKernel , IRemotePyodideWorkerKernel } from './tokens ' ;
11
+ import { Contents , KernelMessage } from '@jupyterlab/services ' ;
13
12
14
- import { allJSONUrl , pipliteWheelUrl } from './_pypi' ;
15
13
import {
16
14
DriveContentsProcessor ,
17
15
TDriveMethod ,
18
16
TDriveRequest ,
19
17
} from '@jupyterlite/contents' ;
20
18
19
+ import { BaseKernel , IKernel } from '@jupyterlite/kernel' ;
20
+
21
+ import { IPyodideWorkerKernel , IRemotePyodideWorkerKernel } from './tokens' ;
22
+
23
+ import { allJSONUrl , pipliteWheelUrl } from './_pypi' ;
24
+
21
25
/**
22
26
* A kernel that executes Python code with Pyodide.
23
27
*/
@@ -32,6 +36,7 @@ export class PyodideKernel extends BaseKernel implements IKernel {
32
36
this . _worker = this . initWorker ( options ) ;
33
37
this . _remoteKernel = this . initRemote ( options ) ;
34
38
this . _contentsManager = options . contentsManager ;
39
+ this . _logger = options . logger || ( ( ) => { } ) ;
35
40
}
36
41
37
42
/**
@@ -65,6 +70,7 @@ export class PyodideKernel extends BaseKernel implements IKernel {
65
70
let remote : IPyodideWorkerKernel ;
66
71
if ( crossOriginIsolated ) {
67
72
remote = coincident ( this . _worker ) as IPyodideWorkerKernel ;
73
+ remote . processLogMessage = this . _processLogMessage . bind ( this ) ;
68
74
remote . processWorkerMessage = this . _processWorkerMessage . bind ( this ) ;
69
75
// The coincident worker uses its own filesystem API:
70
76
( remote . processDriveRequest as any ) = async < T extends TDriveMethod > (
@@ -91,6 +97,8 @@ export class PyodideKernel extends BaseKernel implements IKernel {
91
97
if ( typeof ev ?. data ?. _kernelMessage !== 'undefined' ) {
92
98
// only process non comlink messages
93
99
this . _processWorkerMessage ( ev . data . _kernelMessage ) ;
100
+ } else if ( typeof ev ?. data ?. _logMessage !== 'undefined' ) {
101
+ this . _processLogMessage ( ev . data . _logMessage ) ;
94
102
}
95
103
} ) ;
96
104
}
@@ -143,6 +151,12 @@ export class PyodideKernel extends BaseKernel implements IKernel {
143
151
return this . _ready . promise ;
144
152
}
145
153
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
+
146
160
/**
147
161
* Process a message coming from the pyodide web worker.
148
162
*
@@ -341,6 +355,7 @@ export class PyodideKernel extends BaseKernel implements IKernel {
341
355
}
342
356
343
357
private _contentsManager : Contents . IManager ;
358
+ private _logger : ( options : { payload : ILogPayload ; kernelId : string } ) => void ;
344
359
private _contentsProcessor : DriveContentsProcessor | undefined ;
345
360
private _worker : Worker ;
346
361
private _remoteKernel :
@@ -395,5 +410,10 @@ export namespace PyodideKernel {
395
410
* The Jupyterlite content manager
396
411
*/
397
412
contentsManager : Contents . IManager ;
413
+
414
+ /**
415
+ * The logger
416
+ */
417
+ logger ?: ( options : { payload : ILogPayload ; kernelId : string } ) => void ;
398
418
}
399
419
}
0 commit comments