@@ -37,35 +37,39 @@ export function consolePrinter(
37
37
} ,
38
38
) {
39
39
let memory : WebAssembly . Memory | undefined = undefined ;
40
- let view : DataView | undefined = undefined ;
40
+ let _view : DataView | undefined = undefined ;
41
+
42
+ function getMemoryView ( ) : DataView {
43
+ if ( typeof memory === "undefined" ) {
44
+ throw new Error ( "Memory is not set" ) ;
45
+ }
46
+ if ( _view === undefined || _view . buffer . byteLength === 0 ) {
47
+ _view = new DataView ( memory . buffer ) ;
48
+ }
49
+ return _view ;
50
+ }
41
51
42
52
const decoder = new TextDecoder ( ) ;
43
53
44
54
return {
45
55
addToImports ( imports : WebAssembly . Imports ) : void {
46
- const original = imports . wasi_snapshot_preview1 . fd_write as (
47
- fd : number ,
48
- iovs : number ,
49
- iovsLen : number ,
50
- nwritten : number ,
51
- ) => number ;
52
- imports . wasi_snapshot_preview1 . fd_write = (
53
- fd : number ,
54
- iovs : number ,
55
- iovsLen : number ,
56
- nwritten : number ,
57
- ) : number => {
56
+ const wasiImport = imports . wasi_snapshot_preview1 as {
57
+ fd_write : (
58
+ fd : number ,
59
+ iovs : number ,
60
+ iovsLen : number ,
61
+ nwritten : number ,
62
+ ) => number ;
63
+ fd_filestat_get : ( fd : number , filestat : number ) => number ;
64
+ fd_fdstat_get : ( fd : number , fdstat : number ) => number ;
65
+ } ;
66
+ const original_fd_write = wasiImport . fd_write ;
67
+ wasiImport . fd_write = ( fd , iovs , iovsLen , nwritten ) : number => {
58
68
if ( fd !== 1 && fd !== 2 ) {
59
- return original ( fd , iovs , iovsLen , nwritten ) ;
60
- }
61
-
62
- if ( typeof memory === "undefined" || typeof view === "undefined" ) {
63
- throw new Error ( "Memory is not set" ) ;
64
- }
65
- if ( view . buffer . byteLength === 0 ) {
66
- view = new DataView ( memory . buffer ) ;
69
+ return original_fd_write ( fd , iovs , iovsLen , nwritten ) ;
67
70
}
68
71
72
+ const view = getMemoryView ( ) ;
69
73
const buffers = Array . from ( { length : iovsLen } , ( _ , i ) => {
70
74
const ptr = iovs + i * 8 ;
71
75
const buf = view . getUint32 ( ptr , true ) ;
@@ -86,10 +90,44 @@ export function consolePrinter(
86
90
87
91
return 0 ;
88
92
} ;
93
+
94
+ const original_fd_filestat_get = wasiImport . fd_filestat_get ;
95
+ wasiImport . fd_filestat_get = ( fd , filestat ) : number => {
96
+ if ( fd !== 1 && fd !== 2 ) {
97
+ return original_fd_filestat_get ( fd , filestat ) ;
98
+ }
99
+
100
+ const view = getMemoryView ( ) ;
101
+ const result = original_fd_filestat_get ( fd , filestat ) ;
102
+ if ( result !== 0 ) {
103
+ return result ;
104
+ }
105
+
106
+ const filetypePtr = filestat + 0 ;
107
+ view . setUint8 ( filetypePtr , 2 ) ; // FILETYPE_CHARACTER_DEVICE
108
+
109
+ return 0 ;
110
+ } ;
111
+
112
+ const original_fd_fdstat_get = wasiImport . fd_fdstat_get ;
113
+ wasiImport . fd_fdstat_get = ( fd , fdstat ) : number => {
114
+ if ( fd !== 1 && fd !== 2 ) {
115
+ return original_fd_fdstat_get ( fd , fdstat ) ;
116
+ }
117
+
118
+ const view = getMemoryView ( ) ;
119
+
120
+ const fs_filetypePtr = fdstat + 0 ;
121
+ view . setUint8 ( fs_filetypePtr , 2 ) ; // FILETYPE_CHARACTER_DEVICE
122
+
123
+ const fs_rights_basePtr = fdstat + 8 ;
124
+ view . setBigUint64 ( fs_rights_basePtr , BigInt ( 1 ) ) ; // RIGHTS_FD_WRITE
125
+
126
+ return 0 ;
127
+ } ;
89
128
} ,
90
129
setMemory ( m : WebAssembly . Memory ) {
91
130
memory = m ;
92
- view = new DataView ( m . buffer ) ;
93
131
} ,
94
132
} ;
95
133
}
0 commit comments