Skip to content

Commit e312098

Browse files
committed
wip
1 parent 8b6be8a commit e312098

File tree

6 files changed

+64
-11
lines changed

6 files changed

+64
-11
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { useCallback, useEffect, useState } from 'react';
2+
import Smelter from '../smelter/live';
3+
import type { SmelterInstanceOptions } from '../manager';
4+
5+
export function useSmelter(options: SmelterInstanceOptions): Smelter | undefined {
6+
const [smelter, setSmelter] = useState<Smelter>();
7+
const [promiseQueue, setPromiseQueue] = useState<(() => Promise<void>)[]>([]);
8+
const [isWaiting, setIsWaiting] = useState(false);
9+
10+
const enqueue = useCallback((fn: () => Promise<void>) => {
11+
setPromiseQueue(queue => [
12+
...queue,
13+
fn,
14+
])
15+
}, []);
16+
17+
useEffect(() => {
18+
const smelter = new Smelter(options);
19+
20+
let cancel = false;
21+
enqueue(async () => {
22+
await smelter.init();
23+
await smelter.start();
24+
if (!cancel) {
25+
setSmelter(smelter);
26+
}
27+
});
28+
29+
return () => {
30+
cancel = true;
31+
enqueue(async () => await smelter.terminate());
32+
};
33+
}, [options?.url, enqueue]);
34+
35+
useEffect(() => {
36+
if (isWaiting) {
37+
return;
38+
}
39+
setIsWaiting(true);
40+
41+
const fn = promiseQueue[0];
42+
if (fn) {
43+
void (async () => {
44+
await fn();
45+
setPromiseQueue(promiseQueue.slice(1));
46+
setIsWaiting(false);
47+
})();
48+
}
49+
}, [promiseQueue, isWaiting]);
50+
51+
return smelter;
52+
}

ts/smelter-web-client/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import Smelter from './smelter/live';
22
import OfflineSmelter from './smelter/offline';
33

4+
export { useSmelter } from './hooks/useSmelter';
5+
export { SmelterInstanceOptions } from './manager';
46
export { OfflineSmelter };
7+
58
export default Smelter;

ts/smelter-web-client/src/manager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ import { retry, sleep } from './utils';
1010
import { WebSocketConnection } from './ws';
1111
import { getSmelterStatus } from './getSmelterStatus';
1212

13-
export type InstanceOptions = {
13+
export type SmelterInstanceOptions = {
1414
url: string | URL;
1515
};
1616

1717
class RemoteInstanceManager implements SmelterManager {
1818
private url: URL;
1919
private wsConnection: WebSocketConnection;
2020

21-
constructor(opts: InstanceOptions) {
21+
constructor(opts: SmelterInstanceOptions) {
2222
let url: URL;
2323
if (opts.url instanceof URL) {
2424
url = opts.url;

ts/smelter-web-client/src/smelter/live.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import { pino } from 'pino';
33
import type { Renderers } from '@swmansion/smelter';
44
import { Smelter as CoreSmelter, StateGuard } from '@swmansion/smelter-core';
55
import type { RegisterInput, RegisterOutput } from '../api';
6-
import type { InstanceOptions } from '../manager';
6+
import type { SmelterInstanceOptions } from '../manager';
77
import RemoteInstanceManager from '../manager';
88

99
export default class Smelter {
1010
private coreSmelter: CoreSmelter;
1111
private scheduler: StateGuard;
1212

13-
public constructor(opts: InstanceOptions) {
13+
public constructor(opts: SmelterInstanceOptions) {
1414
const logger = pino({
1515
level: 'warn',
1616
browser: {

ts/smelter-web-client/src/smelter/offline.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import { OfflineSmelter as CoreSmelter, StateGuard } from '@swmansion/smelter-co
33
import type { Renderers } from '@swmansion/smelter';
44
import { pino } from 'pino';
55
import type { RegisterInput, RegisterOutput } from '../api';
6-
import type { InstanceOptions } from '../manager';
6+
import type { SmelterInstanceOptions } from '../manager';
77
import RemoteInstanceManager from '../manager';
88

99
export default class OfflineSmelter {
1010
private coreSmelter: CoreSmelter;
1111
private scheduler: StateGuard;
1212

13-
public constructor(opts: InstanceOptions) {
13+
public constructor(opts: SmelterInstanceOptions) {
1414
const logger = pino({
1515
level: 'warn',
1616
browser: {

ts/smelter-web-wasm/src/hooks/useSmelter.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import Smelter from '../compositor/compositor';
44

55
export function useSmelter(options?: SmelterOptions): Smelter | undefined {
66
const [smelter, setSmelter] = useState<Smelter>();
7+
78
useEffect(() => {
89
const smelter = new Smelter(options);
910

1011
let cancel = false;
11-
const promise = (async () => {
12+
(async () => {
1213
await smelter.init();
1314
await smelter.start();
1415
if (!cancel) {
@@ -18,10 +19,7 @@ export function useSmelter(options?: SmelterOptions): Smelter | undefined {
1819

1920
return () => {
2021
cancel = true;
21-
void (async () => {
22-
await promise.catch(() => {});
23-
await smelter.terminate();
24-
})();
22+
void smelter.terminate();
2523
};
2624
}, [options?.framerate, (options?.framerate as any)?.num, (options?.framerate as any)?.den]);
2725
return smelter;

0 commit comments

Comments
 (0)