@@ -100,6 +100,17 @@ export class WebWorkerKernel implements IKernel {
100100
101101 return await this . _contentsProcessor . processDriveRequest ( data ) ;
102102 } ;
103+
104+ // Stdin request is synchronous from the web worker's point of view, blocking
105+ // until the reply is received. From the UI thread's point of view it is async.
106+ ( remote . processStdinRequest as any ) = async (
107+ inputRequest : KernelMessage . IInputRequestMsg
108+ ) : Promise < KernelMessage . IInputReplyMsg > => {
109+ this . _processCoincidentWorkerMessage ( { data : inputRequest } ) ;
110+ this . _inputDelegate =
111+ new PromiseDelegate < KernelMessage . IInputReplyMsg > ( ) ;
112+ return await this . _inputDelegate . promise ;
113+ } ;
103114 } else {
104115 this . _worker . onmessage = e => {
105116 this . _processComlinkWorkerMessage ( e . data ) ;
@@ -128,12 +139,11 @@ export class WebWorkerKernel implements IKernel {
128139 }
129140
130141 private async _sendMessageToWorker ( msg : any ) : Promise < void > {
131- if ( msg . header . msg_type !== 'input_reply' ) {
142+ if ( msg . header . msg_type === 'input_reply' ) {
143+ this . _inputDelegate . resolve ( msg ) ;
144+ } else {
132145 this . _executeDelegate = new PromiseDelegate < void > ( ) ;
133- }
134-
135- await this . _remoteKernel . processMessage ( { msg, parent : this . parent } ) ;
136- if ( msg . header . msg_type !== 'input_reply' ) {
146+ await this . _remoteKernel . processMessage ( { msg, parent : this . parent } ) ;
137147 return await this . _executeDelegate . promise ;
138148 }
139149 }
@@ -304,6 +314,7 @@ export class WebWorkerKernel implements IKernel {
304314 private _worker : Worker ;
305315 private _sendMessage : IKernel . SendMessage ;
306316 private _executeDelegate = new PromiseDelegate < void > ( ) ;
317+ private _inputDelegate = new PromiseDelegate < KernelMessage . IInputReplyMsg > ( ) ;
307318 private _parentHeader :
308319 | KernelMessage . IHeader < KernelMessage . MessageType >
309320 | undefined = undefined ;
0 commit comments