@@ -16,7 +16,7 @@ export interface Container {
16
16
run ( script : string ) : Promise < string > ;
17
17
}
18
18
19
- const ContainerContext = createContext < Container | null > ( null ) ;
19
+ const ContainerContext = createContext < WebContainer | null > ( null ) ;
20
20
21
21
const SCRIPT = `
22
22
const { Script, createContext } = require('node:vm');
@@ -61,13 +61,11 @@ type Status = 'booted' | 'installing' | 'ready' | 'processing';
61
61
export const ContainerProvider : FC < { children : ReactNode } > = memo (
62
62
( { children } ) => {
63
63
const [ instance , setInstance ] = useState < WebContainer > ( ) ;
64
- const [ status , setStatus ] = useState < Status > ( ) ;
65
64
useEffect ( ( ) => {
66
65
( async ( ) => {
67
66
const instance = await WebContainer . boot ( {
68
67
coep : 'none' ,
69
68
} ) ;
70
- setStatus ( 'booted' ) ;
71
69
await instance . mount ( {
72
70
'package.json' : {
73
71
file : {
@@ -98,50 +96,51 @@ export const ContainerProvider: FC<{ children: ReactNode }> = memo(
98
96
} ) ;
99
97
setInstance ( instance ) ;
100
98
} ) ( ) ;
101
- } , [ setStatus , setInstance ] ) ;
102
-
103
- const init = useCallback ( async ( ) => {
104
- if ( ! instance || status !== 'booted' ) {
105
- return ;
106
- }
107
- setStatus ( 'installing' ) ;
108
- const install = await instance . spawn ( 'npm' , [ 'install' ] ) ;
109
- if ( ( await install . exit ) === 0 ) {
110
- setStatus ( 'ready' ) ;
111
- }
112
- } , [ instance , status , setStatus ] ) ;
113
-
114
- const run = useCallback (
115
- async ( script : string ) => {
116
- console . log ( 'run' , script , instance , status ) ;
117
- if ( ! instance || status !== 'ready' ) {
118
- return ;
119
- }
120
- setStatus ( 'processing' ) ;
121
- try {
122
- await instance . fs . writeFile ( './diagram.ts' , script ) ;
123
- const exec = await instance . spawn ( 'node' , [ './main.js' ] ) ;
124
- console . log ( 'exit' , await exec . exit ) ;
125
- return await instance . fs . readFile ( './diagram.dot' , 'utf8' ) ;
126
- } finally {
127
- await instance . fs . rm ( './diagram.ts' , { force : true } ) ;
128
- await instance . fs . rm ( './diagram.dot' , { force : true } ) ;
129
- setStatus ( 'ready' ) ;
130
- }
131
- } ,
132
- [ instance , status , setStatus ] ,
133
- ) ;
99
+ } , [ setInstance ] ) ;
134
100
135
101
return (
136
- < ContainerContext . Provider value = { { status , init , run } } >
102
+ < ContainerContext . Provider value = { instance } >
137
103
{ children }
138
104
</ ContainerContext . Provider >
139
105
) ;
140
106
} ,
141
107
) ;
142
108
143
109
export const useContainer = ( ) : Container => {
144
- const { status, init, run } = useContext ( ContainerContext ) ;
110
+ const instance = useContext ( ContainerContext ) ;
111
+ const [ status , setStatus ] = useState < Status > ( 'booted' ) ;
112
+ const init = useCallback ( async ( ) => {
113
+ if ( ! instance || status !== 'booted' ) {
114
+ return ;
115
+ }
116
+ setStatus ( 'installing' ) ;
117
+ const install = await instance . spawn ( 'npm' , [ 'install' ] ) ;
118
+ if ( ( await install . exit ) === 0 ) {
119
+ setStatus ( 'ready' ) ;
120
+ }
121
+ } , [ instance , status , setStatus ] ) ;
122
+
123
+ const run = useCallback (
124
+ async ( script : string ) => {
125
+ console . log ( 'run' , script , instance , status ) ;
126
+ if ( ! instance || status !== 'ready' ) {
127
+ return ;
128
+ }
129
+ setStatus ( 'processing' ) ;
130
+ try {
131
+ await instance . fs . writeFile ( './diagram.ts' , script ) ;
132
+ const exec = await instance . spawn ( 'node' , [ './main.js' ] ) ;
133
+ console . log ( 'exit' , await exec . exit ) ;
134
+ return await instance . fs . readFile ( './diagram.dot' , 'utf8' ) ;
135
+ } finally {
136
+ await instance . fs . rm ( './diagram.ts' , { force : true } ) ;
137
+ await instance . fs . rm ( './diagram.dot' , { force : true } ) ;
138
+ setStatus ( 'ready' ) ;
139
+ }
140
+ } ,
141
+ [ instance , status , setStatus ] ,
142
+ ) ;
143
+
145
144
useEffect ( ( ) => {
146
145
if ( status === 'booted' ) {
147
146
init ( ) ;
0 commit comments