Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions packages/mobile-client/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export type {
CallKitAction,
CallKitConfig,
MediaStream,
MediaStreamTrack,
AudioDevice,
AudioOutputChangedInfo,
UseAudioOutputResult,
Expand Down Expand Up @@ -77,6 +78,10 @@ export type {
InitializeDevicesResult,
PeerWithTracks,
TrackFields,
MiddlewareResult,
TrackMiddleware,
TracksMiddleware,
TracksMiddlewareResult,
} from './overrides/types';

export type {
Expand All @@ -90,16 +95,12 @@ export type {
DeviceError,
DeviceItem,
InitializeDevicesStatus,
MiddlewareResult,
PeerId,
PeerStatus,
PersistLastDeviceHandlers,
SimulcastBandwidthLimits,
StreamConfig,
TrackId,
TrackMiddleware,
TracksMiddleware,
TracksMiddlewareResult,
AuthErrorReason,
JoinErrorReason,
UseDataChannelResult,
Expand Down
38 changes: 35 additions & 3 deletions packages/mobile-client/src/overrides/hooks.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import {
type TrackMiddleware as ReactTrackMiddleware,
type TracksMiddleware as ReactTracksMiddleware,
useCamera as useCameraReactClient,
useCustomSource as useCustomSourceReactClient,
useInitializeDevices as useInitializeDevicesReactClient,
Expand All @@ -21,31 +23,61 @@ import type {
InitializeDevicesResult,
PeerWithTracks,
RemoteTrack,
TrackMiddleware,
TracksMiddleware,
UseCameraResult,
UseLivestreamStreamerResult,
UseLivestreamViewerResult,
UseMicrophoneResult,
UseScreenShareResult,
} from './types';

export function useCamera() {
export function useCamera(): UseCameraResult {
const result = useCameraReactClient();
const { setCameraTrackMiddleware: setCameraTrackMiddlewareReact } = result;
const setCameraTrackMiddleware = useCallback(
(middleware: TrackMiddleware) => setCameraTrackMiddlewareReact(middleware as ReactTrackMiddleware),
[setCameraTrackMiddlewareReact],
);
return {
...result,
cameraStream: result.cameraStream as RNMediaStream | null,
startCamera: result.startCamera as UseCameraResult['startCamera'],
currentCameraMiddleware: result.currentCameraMiddleware as TrackMiddleware,
setCameraTrackMiddleware,
};
}

export function useMicrophone() {
export function useMicrophone(): UseMicrophoneResult {
const { toggleMicrophoneMute: _, ...rest } = useMicrophoneReactClient();
const { setMicrophoneTrackMiddleware: setMicrophoneTrackMiddlewareReact } = rest;
const setMicrophoneTrackMiddleware = useCallback(
(middleware: TrackMiddleware) => setMicrophoneTrackMiddlewareReact(middleware as ReactTrackMiddleware),
[setMicrophoneTrackMiddlewareReact],
);
return {
...rest,
microphoneStream: rest.microphoneStream as RNMediaStream | null,
startMicrophone: rest.startMicrophone as UseMicrophoneResult['startMicrophone'],
currentMicrophoneMiddleware: rest.currentMicrophoneMiddleware as TrackMiddleware,
setMicrophoneTrackMiddleware,
};
}

export function useScreenShare() {
export function useScreenShare(): UseScreenShareResult {
const result = useScreenShareReactClient();
const { setTracksMiddleware: setTracksMiddlewareReact } = result;
const setTracksMiddleware = useCallback(
(middleware: TracksMiddleware | null) => setTracksMiddlewareReact(middleware as ReactTracksMiddleware | null),
[setTracksMiddlewareReact],
);
return {
...result,
stream: result.stream as RNMediaStream | null,
videoTrack: result.videoTrack as UseScreenShareResult['videoTrack'],
audioTrack: result.audioTrack as UseScreenShareResult['audioTrack'],
currentTracksMiddleware: result.currentTracksMiddleware as TracksMiddleware | null,
setTracksMiddleware,
};
}

Expand Down
61 changes: 55 additions & 6 deletions packages/mobile-client/src/overrides/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type {
CustomSource as ReactClientCustomSource,
DeviceError,
InitializeDevicesResult as ReactClientInitializeDevicesResult,
PeerWithTracks as ReactClientPeerWithTracks,
RemoteTrack as ReactClientRemoteTrack,
Expand All @@ -12,7 +13,10 @@ import type {
useMicrophone as useMicrophoneReactClient,
useScreenShare as useScreenShareReactClient,
} from '@fishjam-cloud/react-client';
import type { MediaStream as RNMediaStream } from '@fishjam-cloud/react-native-webrtc';
import type {
MediaStream as RNMediaStream,
MediaStreamTrack as RNMediaStreamTrack,
} from '@fishjam-cloud/react-native-webrtc';

export type StreamerInputs =
| { video: RNMediaStream; audio?: RNMediaStream | null }
Expand All @@ -31,19 +35,58 @@ export type UseLivestreamViewerResult = Omit<ReactClientUseLivestreamViewerResul
stream: RNMediaStream | null;
};

export type UseCameraResult = Omit<ReturnType<typeof useCameraReactClient>, 'cameraStream'> & {
export type MiddlewareResult = { track: RNMediaStreamTrack; onClear?: () => void };

export type TrackMiddleware = ((track: RNMediaStreamTrack) => MiddlewareResult | Promise<MiddlewareResult>) | null;

export type TracksMiddlewareResult = {
videoTrack: RNMediaStreamTrack;
audioTrack: RNMediaStreamTrack | null;
onClear: () => void;
};

export type TracksMiddleware = (
videoTrack: RNMediaStreamTrack,
audioTrack: RNMediaStreamTrack | null,
) => TracksMiddlewareResult | Promise<TracksMiddlewareResult>;

export type UseCameraResult = Omit<
ReturnType<typeof useCameraReactClient>,
'cameraStream' | 'startCamera' | 'currentCameraMiddleware' | 'setCameraTrackMiddleware'
> & {
cameraStream: RNMediaStream | null;
startCamera: (
...args: Parameters<ReturnType<typeof useCameraReactClient>['startCamera']>
) => Promise<[RNMediaStreamTrack, null] | [null, DeviceError]>;
currentCameraMiddleware: TrackMiddleware;
setCameraTrackMiddleware: (middleware: TrackMiddleware) => Promise<void>;
};

export type UseMicrophoneResult = Omit<
ReturnType<typeof useMicrophoneReactClient>,
'toggleMicrophoneMute' | 'microphoneStream'
| 'toggleMicrophoneMute'
| 'microphoneStream'
| 'startMicrophone'
| 'currentMicrophoneMiddleware'
| 'setMicrophoneTrackMiddleware'
> & {
microphoneStream: RNMediaStream | null;
startMicrophone: (
...args: Parameters<ReturnType<typeof useMicrophoneReactClient>['startMicrophone']>
) => Promise<[RNMediaStreamTrack, null] | [null, DeviceError]>;
currentMicrophoneMiddleware: TrackMiddleware;
setMicrophoneTrackMiddleware: (middleware: TrackMiddleware) => Promise<void>;
};

export type UseScreenShareResult = Omit<ReturnType<typeof useScreenShareReactClient>, 'stream'> & {
export type UseScreenShareResult = Omit<
ReturnType<typeof useScreenShareReactClient>,
'stream' | 'videoTrack' | 'audioTrack' | 'currentTracksMiddleware' | 'setTracksMiddleware'
> & {
stream: RNMediaStream | null;
videoTrack: RNMediaStreamTrack | null;
audioTrack: RNMediaStreamTrack | null;
currentTracksMiddleware: TracksMiddleware | null;
setTracksMiddleware: (middleware: TracksMiddleware | null) => Promise<void>;
};

export type UseCustomSourceResult = Omit<ReturnType<typeof useCustomSourceReactClient>, 'stream' | 'setStream'> & {
Expand All @@ -57,9 +100,15 @@ export type UseInitializeDevicesReturn = {
) => Promise<InitializeDevicesResult>;
};

export type Track = Omit<ReactClientTrack, 'stream'> & { stream: RNMediaStream | null };
export type Track = Omit<ReactClientTrack, 'stream' | 'track'> & {
stream: RNMediaStream | null;
track: RNMediaStreamTrack | null;
};

export type RemoteTrack = Omit<ReactClientRemoteTrack, 'stream'> & { stream: RNMediaStream | null };
export type RemoteTrack = Omit<ReactClientRemoteTrack, 'stream' | 'track'> & {
stream: RNMediaStream | null;
track: RNMediaStreamTrack | null;
};

export type CustomSource<T extends string> = Omit<ReactClientCustomSource<T>, 'stream'> & { stream?: RNMediaStream };

Expand Down
Loading