Skip to content

Commit 97cddf6

Browse files
committed
wip
1 parent 854657d commit 97cddf6

File tree

1 file changed

+50
-10
lines changed

1 file changed

+50
-10
lines changed
Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,58 @@
1-
import { useEffect, useRef, useState } from 'react';
1+
import { useEffect, useState } from 'react';
22
import Smelter from '../smelter/live';
33
import 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+
533
export 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

Comments
 (0)