1
1
/// <reference lib="webworker" />
2
- import { vmRemoteUrlSearchParameter } from '../utils/literalConstants' ;
2
+ import { Port , vmRemoteUrlSearchParameter } from '../utils/literalConstants' ;
3
3
4
4
importScripts ( './lib/libv86.js' ) ;
5
5
6
- interface MsgSendTerminal {
7
- command : 'sendTerminal ' ;
8
- data : string ;
6
+ export interface MsgSendPort {
7
+ command : 'sendPort ' ;
8
+ data : [ Port , string ] ;
9
9
}
10
- interface MsgSendScreen {
11
- command : 'sendScreen' ;
12
- data : string ;
13
- }
14
- interface MsgSendController {
15
- command : 'sendController' ;
16
- data : string ;
17
- }
18
- interface MsgStart {
10
+ export interface MsgStart {
19
11
command : 'start' ;
20
12
data ?: undefined ;
21
13
}
22
- interface MsgPause {
14
+ export interface MsgPause {
23
15
command : 'pause' ;
24
16
data ?: undefined ;
25
17
}
26
- interface MsgSendFile {
18
+ export interface MsgSendFile {
27
19
command : 'sendFile' ;
28
20
name : string ;
29
21
data : Uint8Array ;
30
22
}
31
- interface MsgResetTerminal {
32
- command : 'resetTerminal' ;
33
- data ?: undefined ;
34
- }
35
23
36
24
export type WorkerMsgWithoutCID =
37
- | MsgSendTerminal
38
- | MsgSendScreen
39
- | MsgSendController
25
+ | MsgSendPort
40
26
| MsgStart
41
27
| MsgPause
42
- | MsgSendFile
43
- | MsgResetTerminal ;
28
+ | MsgSendFile ;
44
29
45
30
export type WorkerMsg = WorkerMsgWithoutCID & {
46
31
commandID : number ;
@@ -55,16 +40,8 @@ export type WorkerResponseMsg =
55
40
56
41
export type WorkerEventResponseMsg =
57
42
| {
58
- event : 'receivedOutputConsole' ;
59
- data : [ string ] ;
60
- }
61
- | {
62
- event : 'receivedOutputScreen' ;
63
- data : [ string ] ;
64
- }
65
- | {
66
- event : 'receivedOutputController' ;
67
- data : [ string ] ;
43
+ event : 'receivedOutput' ;
44
+ data : [ Port , string ] ;
68
45
}
69
46
| {
70
47
event : 'resetOutputConsole' ;
@@ -152,41 +129,13 @@ const emulator = new V86({
152
129
virtio_console : true ,
153
130
} ) ;
154
131
155
- //@ts -ignore
156
- self . emulator = emulator ;
157
-
158
- let resetting = false ;
159
-
160
- function sendTerminal ( message : string ) {
161
- emulator . bus . send (
162
- 'virtio-console0-input-bytes' ,
163
- [ ...message ] . map ( ( x ) => x . charCodeAt ( 0 ) ) ,
164
- ) ;
165
- }
166
- function sendScreen ( message : string ) {
167
- emulator . bus . send (
168
- 'virtio-console1-input-bytes' ,
169
- [ ...message ] . map ( ( x ) => x . charCodeAt ( 0 ) ) ,
170
- ) ;
171
- }
172
- function sendController ( message : string ) {
173
- emulator . bus . send (
174
- 'virtio-console2-input-bytes' ,
175
- [ ...message ] . map ( ( x ) => x . charCodeAt ( 0 ) ) ,
176
- ) ;
177
- }
178
132
onmessage = ( { data : e } : MessageEvent < WorkerMsg > ) => {
179
133
switch ( e . command ) {
180
- case 'sendTerminal' : {
181
- sendTerminal ( e . data ) ;
182
- break ;
183
- }
184
- case 'sendScreen' : {
185
- sendScreen ( e . data ) ;
186
- break ;
187
- }
188
- case 'sendController' : {
189
- sendController ( e . data ) ;
134
+ case 'sendPort' : {
135
+ emulator . bus . send (
136
+ `virtio-console${ e . data [ 0 ] } -input-bytes` ,
137
+ [ ...e . data [ 1 ] ] . map ( ( x ) => x . charCodeAt ( 0 ) ) ,
138
+ ) ;
190
139
break ;
191
140
}
192
141
case 'start' : {
@@ -216,43 +165,17 @@ onmessage = ({ data: e }: MessageEvent<WorkerMsg>) => {
216
165
} ) ;
217
166
break ;
218
167
}
219
- case 'resetTerminal' : {
220
- if ( ! emulator . is_running ( ) ) return ;
221
- if ( resetting ) return ;
222
- resetting = true ;
223
- const uart0 : {
224
- lsr : number ;
225
- } = emulator . v86 . cpu . devices . uart0 ;
226
- uart0 . lsr |= 0b00010000 ;
227
- setTimeout ( ( ) => {
228
- sendTerminal ( ' ' ) ;
229
- setTimeout ( ( ) => {
230
- uart0 . lsr &= ~ 0b00010000 ;
231
- sendTerminal ( 'k' ) ;
232
- postMessage ( { event : 'resetOutputConsole' } ) ;
233
- sendTerminal ( '\n' ) ;
234
- resetting = false ;
235
- } , 1 ) ;
236
- } , 1 ) ;
237
- }
238
168
}
239
169
} ;
240
170
241
- emulator . add_listener ( 'virtio-console0-output-bytes' , ( bytes : Uint8Array ) => {
242
- postMessage ( {
243
- event : 'receivedOutputConsole' ,
244
- data : [ decoder . decode ( bytes ) ] ,
245
- } ) ;
246
- } ) ;
247
- emulator . add_listener ( 'virtio-console1-output-bytes' , ( bytes : Uint8Array ) => {
248
- postMessage ( {
249
- event : 'receivedOutputScreen' ,
250
- data : [ decoder . decode ( bytes ) ] ,
251
- } ) ;
252
- } ) ;
253
- emulator . add_listener ( 'virtio-console2-output-bytes' , ( bytes : Uint8Array ) => {
254
- postMessage ( {
255
- event : 'receivedOutputController' ,
256
- data : [ decoder . decode ( bytes ) ] ,
257
- } ) ;
258
- } ) ;
171
+ for ( let i = 0 ; i < 3 ; i ++ ) {
172
+ emulator . add_listener (
173
+ `virtio-console${ i } -output-bytes` ,
174
+ ( bytes : Uint8Array ) => {
175
+ postMessage ( {
176
+ event : 'receivedOutput' ,
177
+ data : [ i , decoder . decode ( bytes ) ] ,
178
+ } ) ;
179
+ } ,
180
+ ) ;
181
+ }
0 commit comments