Skip to content

Commit ad3ddc8

Browse files
authored
FCE-1544/async middlewares (#361)
## Description Introduces async middlewares. ## Motivation and Context Smelter integration revealed that we are missing a case in which someone wants to create middleware with asynchronous dependencies. ## Types of changes - [ ] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [x] Breaking change (fix or feature that would cause existing functionality to not work as expected)
1 parent 547c0d1 commit ad3ddc8

6 files changed

Lines changed: 16 additions & 8 deletions

File tree

packages/react-client/src/hooks/internal/devices/useDeviceManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export type DeviceManager = {
3131
enableDevice: () => void;
3232
disableDevice: () => void;
3333
currentMiddleware: TrackMiddleware;
34-
applyMiddleware: (middleware: TrackMiddleware) => MediaStreamTrack | null;
34+
applyMiddleware: (middleware: TrackMiddleware) => Promise<MediaStreamTrack | null>;
3535
deviceError: DeviceError | null;
3636
selectedDevice: MediaDeviceInfo | null;
3737
};

packages/react-client/src/hooks/internal/useScreenshareManager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export const useScreenShareManager = ({ fishjamClient, peerStatus }: ScreenShare
8383
let [video, audio] = getTracksFromStream(displayStream);
8484

8585
if (state.tracksMiddleware) {
86-
const { videoTrack, audioTrack, onClear } = state.tracksMiddleware(video, audio);
86+
const { videoTrack, audioTrack, onClear } = await state.tracksMiddleware(video, audio);
8787
video = videoTrack;
8888
audio = audioTrack;
8989
cleanMiddlewareFnRef.current = onClear;
@@ -122,7 +122,7 @@ export const useScreenShareManager = ({ fishjamClient, peerStatus }: ScreenShare
122122

123123
cleanMiddleware();
124124

125-
const { videoTrack, audioTrack, onClear } = middleware?.(video, audio) ?? {
125+
const { videoTrack, audioTrack, onClear } = (await middleware?.(video, audio)) ?? {
126126
videoTrack: video,
127127
audioTrack: audio,
128128
onClear: null,

packages/react-client/src/hooks/internal/useTrackManager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export const useTrackManager = ({
6161

6262
const setTrackMiddleware = useCallback(
6363
async (middleware: TrackMiddleware) => {
64-
const processedTrack = applyMiddleware(middleware);
64+
const processedTrack = await applyMiddleware(middleware);
6565

6666
const currentTrackId = getCurrentTrackId();
6767
if (!currentTrackId) return;

packages/react-client/src/hooks/internal/useTrackMiddleware.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ export const useTrackMiddleware = (rawTrack: MediaStreamTrack | null) => {
1616
}, [rawTrack, processedTrack]);
1717

1818
const applyMiddleware = useCallback(
19-
(newMiddleware: TrackMiddleware) => {
19+
async (newMiddleware: TrackMiddleware) => {
2020
cleanupRef.current?.();
2121
setMiddleware(() => newMiddleware);
2222

2323
if (newMiddleware && rawTrack) {
24-
const { track, onClear } = newMiddleware(rawTrack);
24+
const { track, onClear } = await newMiddleware(rawTrack);
2525
cleanupRef.current = onClear;
2626
setProcessedTrack(track);
2727
return track;

packages/react-client/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export type {
1818
DeviceItem,
1919
InitializeDevicesResult,
2020
InitializeDevicesStatus,
21+
MiddlewareResult,
2122
PeerId,
2223
PeerStatus,
2324
PersistLastDeviceHandlers,
@@ -27,6 +28,7 @@ export type {
2728
TrackId,
2829
TrackMiddleware,
2930
TracksMiddleware,
31+
TracksMiddlewareResult,
3032
} from "./types/public";
3133
export type {
3234
AuthErrorReason,

packages/react-client/src/types/public.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,18 @@ export type Track = {
2020
track: MediaStreamTrack | null;
2121
};
2222

23-
export type TrackMiddleware = ((track: MediaStreamTrack) => { track: MediaStreamTrack; onClear?: () => void }) | null;
23+
export type MiddlewareResult = { track: MediaStreamTrack; onClear?: () => void };
24+
export type TrackMiddleware = ((track: MediaStreamTrack) => MiddlewareResult | Promise<MiddlewareResult>) | null;
2425

26+
export type TracksMiddlewareResult = {
27+
videoTrack: MediaStreamTrack;
28+
audioTrack: MediaStreamTrack | null;
29+
onClear: () => void;
30+
};
2531
export type TracksMiddleware = (
2632
videoTrack: MediaStreamTrack,
2733
audioTrack: MediaStreamTrack | null,
28-
) => { videoTrack: MediaStreamTrack; audioTrack: MediaStreamTrack | null; onClear: () => void };
34+
) => TracksMiddlewareResult | Promise<TracksMiddlewareResult>;
2935

3036
/**
3137
* Represents the possible statuses of a peer connection.

0 commit comments

Comments
 (0)