1- import { useEffect , useRef , useState } from 'react' ;
1+ import { useEffect , useState } from 'react' ;
22import Smelter from '../smelter/live' ;
33import type { SmelterInstanceOptions } from '../manager' ;
44
5+ export function useSmelter2 ( options : SmelterInstanceOptions ) : Smelter | undefined {
6+ const [ smelter , setSmelter ] = useState < Smelter > ( ) ;
7+ const [ _ , setPromiseQueue ] = useState < Promise < void > > ( Promise . resolve ( ) ) ;
8+
9+ useEffect ( ( ) => {
10+ const smelter = new Smelter ( options ) ;
11+
12+ // TODO(noituri): Restart smelter instance
13+ let cancel = false ;
14+ setPromiseQueue ( ( promise ) => promise . finally ( async ( ) => {
15+ await smelter . init ( ) ;
16+ await smelter . start ( ) ;
17+ if ( ! cancel ) {
18+ setSmelter ( smelter ) ;
19+ }
20+ } ) ) ;
21+
22+ return ( ) => {
23+ cancel = true ;
24+ setPromiseQueue ( ( promise ) => promise . finally ( async ( ) => {
25+ await smelter . terminate ( ) ;
26+ } ) ) ;
27+ }
28+ } , [ options ] ) ;
29+
30+ return smelter ;
31+ }
32+
533export function useSmelter ( options : SmelterInstanceOptions ) : Smelter | undefined {
634 const [ smelter , setSmelter ] = useState < Smelter > ( ) ;
7- const cleanUpPromise = useRef < Promise < void > > ( ) ;
35+ const [ cleanupPromise , setCleanupPromise ] = useState < Promise < void > > ( ) ;
36+ const [ instanceOptions , setInstanceOptions ] = useState < SmelterInstanceOptions > ( ) ;
837
938 useEffect ( ( ) => {
39+ void ( async ( ) => {
40+ await cleanupPromise ;
41+ setInstanceOptions ( options ) ;
42+ } ) ( ) ;
43+
44+ } , [ options , cleanupPromise ] ) ;
45+
46+ useEffect ( ( ) => {
47+ if ( ! instanceOptions ) {
48+ return ;
49+ }
50+
1051 const smelter = new Smelter ( options ) ;
1152
53+ // TODO(noituri): Restart smelter instance
1254 let cancel = false ;
13- // TODO(noituri): Add smelter.restart()
1455 const promise = ( async ( ) => {
15- await cleanUpPromise . current ;
16-
1756 await smelter . init ( ) ;
1857 await smelter . start ( ) ;
1958 if ( ! cancel ) {
@@ -23,12 +62,13 @@ export function useSmelter(options: SmelterInstanceOptions): Smelter | undefined
2362
2463 return ( ) => {
2564 cancel = true ;
26- cleanUpPromise . current = ( async ( ) => {
27- await promise . catch ( ( ) => { } ) ;
65+ setCleanupPromise ( ( prevCleanup ) => ( async ( ) => {
66+ await prevCleanup ;
67+ await promise . catch ( ( ) => { } ) ;
2868 await smelter . terminate ( ) ;
29- } ) ( ) ;
30- } ;
31- } , [ options ] ) ;
69+ } ) ( ) ) ;
70+ }
71+ } , [ instanceOptions ] ) ;
3272
3373 return smelter ;
3474}
0 commit comments