@fishjam-cloud/react-client 0.16.1 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/FishjamProvider.d.ts.map +1 -1
  2. package/dist/FishjamProvider.js +7 -1
  3. package/dist/contexts/customSource.d.ts +3 -0
  4. package/dist/contexts/customSource.d.ts.map +1 -0
  5. package/dist/contexts/customSource.js +2 -0
  6. package/dist/hooks/internal/devices/useDeviceManager.d.ts +1 -1
  7. package/dist/hooks/internal/devices/useDeviceManager.d.ts.map +1 -1
  8. package/dist/hooks/internal/useCustomSourceManager.d.ts +14 -0
  9. package/dist/hooks/internal/useCustomSourceManager.d.ts.map +1 -0
  10. package/dist/hooks/internal/useCustomSourceManager.js +85 -0
  11. package/dist/hooks/internal/useScreenshareManager.js +2 -2
  12. package/dist/hooks/internal/useTrackManager.js +1 -1
  13. package/dist/hooks/internal/useTrackMiddleware.d.ts +1 -1
  14. package/dist/hooks/internal/useTrackMiddleware.d.ts.map +1 -1
  15. package/dist/hooks/internal/useTrackMiddleware.js +2 -2
  16. package/dist/hooks/useCustomSource.d.ts +16 -0
  17. package/dist/hooks/useCustomSource.d.ts.map +1 -0
  18. package/dist/hooks/useCustomSource.js +25 -0
  19. package/dist/hooks/useLivestream.d.ts +7 -0
  20. package/dist/hooks/useLivestream.d.ts.map +1 -0
  21. package/dist/hooks/useLivestream.js +17 -0
  22. package/dist/hooks/usePeers.d.ts +2 -0
  23. package/dist/hooks/usePeers.d.ts.map +1 -1
  24. package/dist/hooks/usePeers.js +4 -0
  25. package/dist/index.d.ts +3 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2 -0
  28. package/dist/types/internal.d.ts +8 -0
  29. package/dist/types/internal.d.ts.map +1 -1
  30. package/dist/types/public.d.ts +13 -3
  31. package/dist/types/public.d.ts.map +1 -1
  32. package/package.json +3 -3
  33. package/readme.md +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"FishjamProvider.d.ts","sourceRoot":"","sources":["../src/FishjamProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,KAAK,iBAAiB,EAAmB,MAAM,OAAO,CAAC;AAehE,OAAO,KAAK,EAAE,eAAe,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI/F;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D;;;OAGG;IACH,SAAS,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC;IACtC;;;;OAIG;IACH,WAAW,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;IAC9D;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,GAAG,yBAAyB,CAAC;IACxD;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C;;OAEG;IACH,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B;;OAEG;IACH,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,2CAsE1D"}
1
+ {"version":3,"file":"FishjamProvider.d.ts","sourceRoot":"","sources":["../src/FishjamProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,KAAK,iBAAiB,EAAmB,MAAM,OAAO,CAAC;AAiBhE,OAAO,KAAK,EAAE,eAAe,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI/F;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D;;;OAGG;IACH,SAAS,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC;IACtC;;;;OAIG;IACH,WAAW,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;IAC9D;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,GAAG,yBAAyB,CAAC;IACxD;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C;;OAEG;IACH,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B;;OAEG;IACH,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,2CA+E1D"}
@@ -2,6 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { FishjamClient } from "@fishjam-cloud/ts-client";
3
3
  import { useMemo, useRef } from "react";
4
4
  import { CameraContext } from "./contexts/camera";
5
+ import { CustomSourceContext } from "./contexts/customSource";
5
6
  import { FishjamClientContext } from "./contexts/fishjamClient";
6
7
  import { FishjamClientStateContext } from "./contexts/fishjamState";
7
8
  import { InitDevicesContext } from "./contexts/initDevices";
@@ -10,6 +11,7 @@ import { PeerStatusContext } from "./contexts/peerStatus";
10
11
  import { ScreenshareContext } from "./contexts/screenshare";
11
12
  import { AUDIO_TRACK_CONSTRAINTS, VIDEO_TRACK_CONSTRAINTS } from "./devices/constraints";
12
13
  import { useMediaDevices } from "./hooks/internal/devices/useMediaDevices";
14
+ import { useCustomSourceManager } from "./hooks/internal/useCustomSourceManager";
13
15
  import { useFishjamClientState } from "./hooks/internal/useFishjamClientState";
14
16
  import { usePeerStatus } from "./hooks/internal/usePeerStatus";
15
17
  import { useScreenShareManager } from "./hooks/internal/useScreenshareManager";
@@ -58,6 +60,10 @@ export function FishjamProvider(props) {
58
60
  });
59
61
  const cameraContext = useMemo(() => ({ videoTrackManager, cameraManager }), [videoTrackManager, cameraManager]);
60
62
  const microphoneContext = useMemo(() => ({ audioTrackManager, microphoneManager }), [audioTrackManager, microphoneManager]);
63
+ const customSourceManager = useCustomSourceManager({
64
+ fishjamClient: fishjamClientRef.current,
65
+ peerStatus,
66
+ });
61
67
  const fishjamClientState = useFishjamClientState(fishjamClientRef.current);
62
- return (_jsx(FishjamClientContext.Provider, { value: fishjamClientRef, children: _jsx(FishjamClientStateContext.Provider, { value: fishjamClientState, children: _jsx(InitDevicesContext.Provider, { value: initializeDevices, children: _jsx(PeerStatusContext.Provider, { value: peerStatus, children: _jsx(CameraContext.Provider, { value: cameraContext, children: _jsx(MicrophoneContext.Provider, { value: microphoneContext, children: _jsx(ScreenshareContext.Provider, { value: screenShareManager, children: props.children }) }) }) }) }) }) }));
68
+ return (_jsx(FishjamClientContext.Provider, { value: fishjamClientRef, children: _jsx(FishjamClientStateContext.Provider, { value: fishjamClientState, children: _jsx(InitDevicesContext.Provider, { value: initializeDevices, children: _jsx(PeerStatusContext.Provider, { value: peerStatus, children: _jsx(CameraContext.Provider, { value: cameraContext, children: _jsx(MicrophoneContext.Provider, { value: microphoneContext, children: _jsx(ScreenshareContext.Provider, { value: screenShareManager, children: _jsx(CustomSourceContext.Provider, { value: customSourceManager, children: props.children }) }) }) }) }) }) }) }));
63
69
  }
@@ -0,0 +1,3 @@
1
+ import type { CustomSourceManager } from "../hooks/internal/useCustomSourceManager";
2
+ export declare const CustomSourceContext: import("react").Context<CustomSourceManager | null>;
3
+ //# sourceMappingURL=customSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customSource.d.ts","sourceRoot":"","sources":["../../src/contexts/customSource.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAEpF,eAAO,MAAM,mBAAmB,qDAAkD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { createContext } from "react";
2
+ export const CustomSourceContext = createContext(null);
@@ -23,7 +23,7 @@ export type DeviceManager = {
23
23
  enableDevice: () => void;
24
24
  disableDevice: () => void;
25
25
  currentMiddleware: TrackMiddleware;
26
- applyMiddleware: (middleware: TrackMiddleware) => MediaStreamTrack | null;
26
+ applyMiddleware: (middleware: TrackMiddleware) => Promise<MediaStreamTrack | null>;
27
27
  deviceError: DeviceError | null;
28
28
  selectedDevice: MediaDeviceInfo | null;
29
29
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useDeviceManager.d.ts","sourceRoot":"","sources":["../../../../src/hooks/internal/devices/useDeviceManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAMtF,KAAK,kBAAkB,GAAG;IACxB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;IACrE,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;IACrE,gBAAgB,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACpD,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC;IAC9B,cAAc,EAAE,eAAe,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC;IAC9C,iBAAiB,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACrD,cAAc,EAAE,eAAe,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACnG,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC;IACxG,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,iBAAiB,EAAE,eAAe,CAAC;IACnC,eAAe,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,gBAAgB,GAAG,IAAI,CAAC;IAC1E,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,eAAe,GAAG,IAAI,CAAC;CACxC,CAAC;AAsCF,eAAO,MAAM,gBAAgB,GAAI,6JAW9B,kBAAkB,KAAG,aAgIvB,CAAC"}
1
+ {"version":3,"file":"useDeviceManager.d.ts","sourceRoot":"","sources":["../../../../src/hooks/internal/devices/useDeviceManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAMtF,KAAK,kBAAkB,GAAG;IACxB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;IACrE,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;IACrE,gBAAgB,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACpD,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC;IAC9B,cAAc,EAAE,eAAe,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC;IAC9C,iBAAiB,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACrD,cAAc,EAAE,eAAe,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACnG,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC;IACxG,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,iBAAiB,EAAE,eAAe,CAAC;IACnC,eAAe,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACnF,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,eAAe,GAAG,IAAI,CAAC;CACxC,CAAC;AAsCF,eAAO,MAAM,gBAAgB,GAAI,6JAW9B,kBAAkB,KAAG,aAgIvB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type FishjamClient } from "@fishjam-cloud/ts-client";
2
+ import type { CustomSourceState } from "../../types/internal";
3
+ import type { PeerStatus } from "../../types/public";
4
+ type CustomSourceManagerProps = {
5
+ fishjamClient: FishjamClient;
6
+ peerStatus: PeerStatus;
7
+ };
8
+ export type CustomSourceManager = {
9
+ setStream: (sourceId: string, stream: MediaStream | null) => Promise<void>;
10
+ getSource: (sourceId: string) => CustomSourceState | undefined;
11
+ };
12
+ export declare function useCustomSourceManager({ fishjamClient, peerStatus }: CustomSourceManagerProps): CustomSourceManager;
13
+ export {};
14
+ //# sourceMappingURL=useCustomSourceManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCustomSourceManager.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useCustomSourceManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAsC,MAAM,0BAA0B,CAAC;AAGlG,OAAO,KAAK,EAAE,iBAAiB,EAAsB,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,KAAK,wBAAwB,GAAG;IAC9B,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,iBAAiB,GAAG,SAAS,CAAC;CAChE,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,wBAAwB,GAAG,mBAAmB,CA8GnH"}
@@ -0,0 +1,85 @@
1
+ import { TrackTypeError } from "@fishjam-cloud/ts-client";
2
+ import { useCallback, useEffect, useMemo, useState } from "react";
3
+ export function useCustomSourceManager({ fishjamClient, peerStatus }) {
4
+ const [sources, setSources] = useState({});
5
+ const pendingSources = useMemo(() => Object.entries(sources).filter(([_, source]) => source.trackIds === undefined), [sources]);
6
+ const getDisplayName = useCallback(() => {
7
+ const name = fishjamClient.getLocalPeer()?.metadata?.peer?.displayName;
8
+ if (typeof name == "string")
9
+ return name;
10
+ }, [fishjamClient]);
11
+ const addTrackToFishjamClient = useCallback(async (track, trackMetadata) => {
12
+ try {
13
+ return fishjamClient.addTrack(track, trackMetadata);
14
+ }
15
+ catch (err) {
16
+ if (err instanceof TrackTypeError) {
17
+ console.warn(err.message);
18
+ return undefined;
19
+ }
20
+ throw err;
21
+ }
22
+ }, [fishjamClient]);
23
+ const startStreaming = useCallback(async (source) => {
24
+ const stream = source?.stream;
25
+ const video = stream.getVideoTracks().at(0);
26
+ const audio = stream.getAudioTracks().at(0);
27
+ const promises = [];
28
+ const displayName = getDisplayName();
29
+ if (video) {
30
+ const videoMetadata = { type: "customVideo", displayName, paused: false };
31
+ promises.push(addTrackToFishjamClient(video, videoMetadata));
32
+ }
33
+ if (audio) {
34
+ const audioMetadata = { type: "customAudio", displayName, paused: false };
35
+ promises.push(addTrackToFishjamClient(audio, audioMetadata));
36
+ }
37
+ if (promises.length === 0) {
38
+ console.warn("Attempted to add empty MediaStream as custom source.");
39
+ return source;
40
+ }
41
+ const [videoId, audioId] = await Promise.all(promises);
42
+ return { ...source, trackIds: { videoId, audioId } };
43
+ }, [addTrackToFishjamClient, getDisplayName]);
44
+ const removeTracks = useCallback(async ({ videoId, audioId }) => {
45
+ const promises = [];
46
+ if (videoId)
47
+ promises.push(fishjamClient.removeTrack(videoId));
48
+ if (audioId)
49
+ promises.push(fishjamClient.removeTrack(audioId));
50
+ await Promise.all(promises);
51
+ }, [fishjamClient]);
52
+ const getSource = useCallback((sourceId) => sources[sourceId], [sources]);
53
+ const setStream = useCallback(async (sourceId, stream) => {
54
+ const oldSource = sources[sourceId];
55
+ if (stream === oldSource?.stream)
56
+ return;
57
+ if (oldSource?.trackIds)
58
+ await removeTracks(oldSource.trackIds);
59
+ if (stream !== null) {
60
+ setSources((old) => ({ ...old, [sourceId]: { stream } }));
61
+ return;
62
+ }
63
+ if (!oldSource)
64
+ return;
65
+ setSources((old) => Object.fromEntries(Object.entries(old).filter(([id, _]) => id !== sourceId)));
66
+ }, [sources, removeTracks]);
67
+ useEffect(() => {
68
+ const onConnected = async () => {
69
+ if (pendingSources.length === 0)
70
+ return;
71
+ const patch = Object.fromEntries(await Promise.all(pendingSources.map(async ([id, source]) => [id, await startStreaming(source)])));
72
+ setSources((old) => ({ ...old, ...patch }));
73
+ };
74
+ const onDisconnected = () => {
75
+ setSources((old) => Object.fromEntries(Object.entries(old).map(([id, source]) => [id, { ...source, trackIds: undefined }])));
76
+ };
77
+ if (peerStatus === "connected")
78
+ onConnected();
79
+ fishjamClient.on("disconnected", onDisconnected);
80
+ return () => {
81
+ fishjamClient.off("disconnected", onDisconnected);
82
+ };
83
+ }, [pendingSources, fishjamClient, peerStatus, startStreaming]);
84
+ return { setStream, getSource };
85
+ }
@@ -30,7 +30,7 @@ export const useScreenShareManager = ({ fishjamClient, peerStatus }) => {
30
30
  const displayName = getDisplayName();
31
31
  let [video, audio] = getTracksFromStream(displayStream);
32
32
  if (state.tracksMiddleware) {
33
- const { videoTrack, audioTrack, onClear } = state.tracksMiddleware(video, audio);
33
+ const { videoTrack, audioTrack, onClear } = await state.tracksMiddleware(video, audio);
34
34
  video = videoTrack;
35
35
  audio = audioTrack;
36
36
  cleanMiddlewareFnRef.current = onClear;
@@ -60,7 +60,7 @@ export const useScreenShareManager = ({ fishjamClient, peerStatus }) => {
60
60
  return;
61
61
  const [video, audio] = getTracksFromStream(state.stream);
62
62
  cleanMiddleware();
63
- const { videoTrack, audioTrack, onClear } = middleware?.(video, audio) ?? {
63
+ const { videoTrack, audioTrack, onClear } = (await middleware?.(video, audio)) ?? {
64
64
  videoTrack: video,
65
65
  audioTrack: audio,
66
66
  onClear: null,
@@ -24,7 +24,7 @@ export const useTrackManager = ({ deviceManager, tsClient, peerStatus, bandwidth
24
24
  await tsClient.replaceTrack(currentTrackId, newTrack);
25
25
  }, [getCurrentTrackId, _selectDevice, tsClient]);
26
26
  const setTrackMiddleware = useCallback(async (middleware) => {
27
- const processedTrack = applyMiddleware(middleware);
27
+ const processedTrack = await applyMiddleware(middleware);
28
28
  const currentTrackId = getCurrentTrackId();
29
29
  if (!currentTrackId)
30
30
  return;
@@ -1,7 +1,7 @@
1
1
  import type { TrackMiddleware } from "../../types/public";
2
2
  export declare const useTrackMiddleware: (rawTrack: MediaStreamTrack | null) => {
3
3
  processedTrack: MediaStreamTrack | null;
4
- applyMiddleware: (newMiddleware: TrackMiddleware) => MediaStreamTrack | null;
4
+ applyMiddleware: (newMiddleware: TrackMiddleware) => Promise<MediaStreamTrack | null>;
5
5
  currentMiddleware: TrackMiddleware;
6
6
  };
7
7
  //# sourceMappingURL=useTrackMiddleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTrackMiddleware.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useTrackMiddleware.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,eAAO,MAAM,kBAAkB,GAAI,UAAU,gBAAgB,GAAG,IAAI;;qCAchD,eAAe;;CAkBlC,CAAC"}
1
+ {"version":3,"file":"useTrackMiddleware.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useTrackMiddleware.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,eAAO,MAAM,kBAAkB,GAAI,UAAU,gBAAgB,GAAG,IAAI;;qCAc1C,eAAe;;CAkBxC,CAAC"}
@@ -10,11 +10,11 @@ export const useTrackMiddleware = (rawTrack) => {
10
10
  setProcessedTrack(null);
11
11
  }
12
12
  }, [rawTrack, processedTrack]);
13
- const applyMiddleware = useCallback((newMiddleware) => {
13
+ const applyMiddleware = useCallback(async (newMiddleware) => {
14
14
  cleanupRef.current?.();
15
15
  setMiddleware(() => newMiddleware);
16
16
  if (newMiddleware && rawTrack) {
17
- const { track, onClear } = newMiddleware(rawTrack);
17
+ const { track, onClear } = await newMiddleware(rawTrack);
18
18
  cleanupRef.current = onClear;
19
19
  setProcessedTrack(track);
20
20
  return track;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * This hook can register/deregister a custom MediaStream with Fishjam.
3
+ * @group Hooks
4
+ */
5
+ export declare function useCustomSource<T extends string>(sourceId: T): {
6
+ /**
7
+ * Associates the given stream with the custom source.
8
+ * This stream will be sent to Fishjam after startStreaming has been called.
9
+ */
10
+ setStream: (newStream: MediaStream | null) => Promise<void>;
11
+ /**
12
+ * The MediaStream currently associated with the custom source
13
+ */
14
+ stream: MediaStream | undefined;
15
+ };
16
+ //# sourceMappingURL=useCustomSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCustomSource.d.ts","sourceRoot":"","sources":["../../src/hooks/useCustomSource.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,CAAC;IAczD;;;OAGG;2BARS,WAAW,GAAG,IAAI;IAU9B;;OAEG;;EAGN"}
@@ -0,0 +1,25 @@
1
+ import { useCallback, useContext, useMemo } from "react";
2
+ import { CustomSourceContext } from "../contexts/customSource";
3
+ /**
4
+ * This hook can register/deregister a custom MediaStream with Fishjam.
5
+ * @group Hooks
6
+ */
7
+ export function useCustomSource(sourceId) {
8
+ const customSourceManager = useContext(CustomSourceContext);
9
+ if (!customSourceManager)
10
+ throw Error("useCustomSource must be used within FishjamProvider");
11
+ const { setStream: managerSetStream, getSource } = customSourceManager;
12
+ const stream = useMemo(() => getSource(sourceId)?.stream, [getSource, sourceId]);
13
+ const setStream = useCallback((newStream) => managerSetStream(sourceId, newStream), [managerSetStream, sourceId]);
14
+ return {
15
+ /**
16
+ * Associates the given stream with the custom source.
17
+ * This stream will be sent to Fishjam after startStreaming has been called.
18
+ */
19
+ setStream,
20
+ /**
21
+ * The MediaStream currently associated with the custom source
22
+ */
23
+ stream,
24
+ };
25
+ }
@@ -0,0 +1,7 @@
1
+ export interface UseLivestreamResult {
2
+ stream: MediaStream | null;
3
+ connect: (url: string, token: string) => Promise<void>;
4
+ disconnect: () => void;
5
+ }
6
+ export declare const useLivestream: () => UseLivestreamResult;
7
+ //# sourceMappingURL=useLivestream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLivestream.d.ts","sourceRoot":"","sources":["../../src/hooks/useLivestream.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,aAAa,QAAO,mBAiBhC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { receiveLivestream } from "@fishjam-cloud/ts-client";
2
+ import { useCallback, useRef, useState } from "react";
3
+ export const useLivestream = () => {
4
+ const [stream, setStream] = useState(null);
5
+ const resultRef = useRef(null);
6
+ const connect = useCallback(async (url, token) => {
7
+ const result = await receiveLivestream(url, token);
8
+ resultRef.current = result;
9
+ setStream(result.stream);
10
+ }, []);
11
+ const disconnect = useCallback(() => {
12
+ setStream(null);
13
+ resultRef.current?.stop();
14
+ resultRef.current = null;
15
+ }, []);
16
+ return { stream, connect, disconnect };
17
+ };
@@ -13,6 +13,8 @@ export type PeerWithTracks<PeerMetadata, ServerMetadata> = {
13
13
  microphoneTrack?: Track;
14
14
  screenShareVideoTrack?: Track;
15
15
  screenShareAudioTrack?: Track;
16
+ customVideoTracks: Track[];
17
+ customAudioTracks: Track[];
16
18
  };
17
19
  /**
18
20
  * Hook allows to access id, tracks and metadata of the local and remote peers.
@@ -1 +1 @@
1
- {"version":3,"file":"usePeers.d.ts","sourceRoot":"","sources":["../../src/hooks/usePeers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,QAAQ,EAAqC,MAAM,0BAA0B,CAAC;AAKjH,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAW,MAAM,iBAAiB,CAAC;AAE9D;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,YAAY,EAAE,cAAc,IAAI;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAClD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,qBAAqB,CAAC,EAAE,KAAK,CAAC;IAC9B,qBAAqB,CAAC,EAAE,KAAK,CAAC;CAC/B,CAAC;AAgCF;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAerG;;;OAGG;IACH;;OAEG;IACH;;;;OAIG;;EAGN"}
1
+ {"version":3,"file":"usePeers.d.ts","sourceRoot":"","sources":["../../src/hooks/usePeers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,QAAQ,EAAqC,MAAM,0BAA0B,CAAC;AAKjH,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAW,MAAM,iBAAiB,CAAC;AAE9D;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,YAAY,EAAE,cAAc,IAAI;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAClD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,qBAAqB,CAAC,EAAE,KAAK,CAAC;IAC9B,qBAAqB,CAAC,EAAE,KAAK,CAAC;IAC9B,iBAAiB,EAAE,KAAK,EAAE,CAAC;IAC3B,iBAAiB,EAAE,KAAK,EAAE,CAAC;CAC5B,CAAC;AAoCF;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAerG;;;OAGG;IACH;;OAEG;IACH;;;;OAIG;;EAGN"}
@@ -16,6 +16,8 @@ function getPeerWithDistinguishedTracks(peer) {
16
16
  const microphoneTrack = tracks.find(({ metadata }) => metadata?.type === "microphone");
17
17
  const screenShareVideoTrack = tracks.find(({ metadata }) => metadata?.type === "screenShareVideo");
18
18
  const screenShareAudioTrack = tracks.find(({ metadata }) => metadata?.type === "screenShareAudio");
19
+ const customVideoTracks = tracks.filter(({ metadata }) => metadata?.type === "customVideo");
20
+ const customAudioTracks = tracks.filter(({ metadata }) => metadata?.type === "customAudio");
19
21
  return {
20
22
  id: peer.id,
21
23
  metadata: peer.metadata,
@@ -24,6 +26,8 @@ function getPeerWithDistinguishedTracks(peer) {
24
26
  microphoneTrack,
25
27
  screenShareVideoTrack,
26
28
  screenShareAudioTrack,
29
+ customVideoTracks,
30
+ customAudioTracks,
27
31
  };
28
32
  }
29
33
  /**
package/dist/index.d.ts CHANGED
@@ -4,11 +4,13 @@ export { useInitializeDevices, UseInitializeDevicesParams } from "./hooks/device
4
4
  export { useMicrophone } from "./hooks/devices/useMicrophone";
5
5
  export { InitializeDevicesSettings } from "./hooks/internal/devices/useMediaDevices";
6
6
  export { type JoinRoomConfig, useConnection } from "./hooks/useConnection";
7
+ export { useCustomSource } from "./hooks/useCustomSource";
8
+ export { useLivestream, type UseLivestreamResult } from "./hooks/useLivestream";
7
9
  export { type PeerWithTracks, usePeers } from "./hooks/usePeers";
8
10
  export { useScreenShare } from "./hooks/useScreenShare";
9
11
  export { useUpdatePeerMetadata } from "./hooks/useUpdatePeerMetadata";
10
12
  export { useVAD } from "./hooks/useVAD";
11
- export type { BandwidthLimits, Brand, DeviceError, DeviceItem, InitializeDevicesResult, InitializeDevicesStatus, PeerId, PeerStatus, PersistLastDeviceHandlers, SimulcastBandwidthLimits, StreamConfig, Track, TrackId, TrackMiddleware, TracksMiddleware, } from "./types/public";
13
+ export type { BandwidthLimits, Brand, CustomSource, DeviceError, DeviceItem, InitializeDevicesResult, InitializeDevicesStatus, MiddlewareResult, PeerId, PeerStatus, PersistLastDeviceHandlers, SimulcastBandwidthLimits, StreamConfig, Track, TrackId, TrackMiddleware, TracksMiddleware, TracksMiddlewareResult, } from "./types/public";
12
14
  export type { AuthErrorReason, JoinErrorReason, Metadata, ReconnectConfig, ReconnectionStatus, SimulcastBandwidthLimit, SimulcastConfig, TrackBandwidthLimit, } from "@fishjam-cloud/ts-client";
13
15
  export { Variant } from "@fishjam-cloud/ts-client";
14
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,KAAK,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,KAAK,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,YAAY,EACV,eAAe,EACf,KAAK,EACL,WAAW,EACX,UAAU,EACV,uBAAuB,EACvB,uBAAuB,EACvB,MAAM,EACN,UAAU,EACV,yBAAyB,EACzB,wBAAwB,EACxB,YAAY,EACZ,KAAK,EACL,OAAO,EACP,eAAe,EACf,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,eAAe,EACf,eAAe,EACf,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,KAAK,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,KAAK,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,YAAY,EACV,eAAe,EACf,KAAK,EACL,YAAY,EACZ,WAAW,EACX,UAAU,EACV,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,MAAM,EACN,UAAU,EACV,yBAAyB,EACzB,wBAAwB,EACxB,YAAY,EACZ,KAAK,EACL,OAAO,EACP,eAAe,EACf,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,eAAe,EACf,eAAe,EACf,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -3,6 +3,8 @@ export { useCamera } from "./hooks/devices/useCamera";
3
3
  export { useInitializeDevices } from "./hooks/devices/useInitializeDevices";
4
4
  export { useMicrophone } from "./hooks/devices/useMicrophone";
5
5
  export { useConnection } from "./hooks/useConnection";
6
+ export { useCustomSource } from "./hooks/useCustomSource";
7
+ export { useLivestream } from "./hooks/useLivestream";
6
8
  export { usePeers } from "./hooks/usePeers";
7
9
  export { useScreenShare } from "./hooks/useScreenShare";
8
10
  export { useUpdatePeerMetadata } from "./hooks/useUpdatePeerMetadata";
@@ -46,4 +46,12 @@ export interface TrackManager {
46
46
  export type BrandedPeer<P, S> = Omit<Peer<P, S>, "id"> & {
47
47
  id: PeerId;
48
48
  };
49
+ export type CustomSourceTracks = {
50
+ videoId?: string;
51
+ audioId?: string;
52
+ };
53
+ export type CustomSourceState = {
54
+ stream: MediaStream;
55
+ trackIds?: CustomSourceTracks;
56
+ };
49
57
  //# sourceMappingURL=internal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/types/internal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEvF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG;IAAE,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;CAAE,CAAC;AAExG,MAAM,MAAM,gBAAgB,GAAG,CAC3B;IACE,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD,GACD;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAA;CAAE,CACnC,GAAG;IAAE,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;CAAE,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC;IACrE,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,iBAAiB,EAAE,eAAe,CAAC;IACnC,kBAAkB,EAAE,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E;;;;;;;OAOG;IACH,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC;;;;;;OAMG;IACH,YAAY,EAAE,MAAM,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC;CACtD;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/types/internal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEvF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG;IAAE,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;CAAE,CAAC;AAExG,MAAM,MAAM,gBAAgB,GAAG,CAC3B;IACE,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD,GACD;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAA;CAAE,CACnC,GAAG;IAAE,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;CAAE,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC;IACrE,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,iBAAiB,EAAE,eAAe,CAAC;IACnC,kBAAkB,EAAE,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E;;;;;;;OAOG;IACH,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC;;;;;;OAMG;IACH,YAAY,EAAE,MAAM,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC;CACtD;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B,CAAC"}
@@ -18,15 +18,17 @@ export type Track = {
18
18
  simulcastConfig: SimulcastConfig | null;
19
19
  track: MediaStreamTrack | null;
20
20
  };
21
- export type TrackMiddleware = ((track: MediaStreamTrack) => {
21
+ export type MiddlewareResult = {
22
22
  track: MediaStreamTrack;
23
23
  onClear?: () => void;
24
- }) | null;
25
- export type TracksMiddleware = (videoTrack: MediaStreamTrack, audioTrack: MediaStreamTrack | null) => {
24
+ };
25
+ export type TrackMiddleware = ((track: MediaStreamTrack) => MiddlewareResult | Promise<MiddlewareResult>) | null;
26
+ export type TracksMiddlewareResult = {
26
27
  videoTrack: MediaStreamTrack;
27
28
  audioTrack: MediaStreamTrack | null;
28
29
  onClear: () => void;
29
30
  };
31
+ export type TracksMiddleware = (videoTrack: MediaStreamTrack, audioTrack: MediaStreamTrack | null) => TracksMiddlewareResult | Promise<TracksMiddlewareResult>;
30
32
  /**
31
33
  * Represents the possible statuses of a peer connection.
32
34
  *
@@ -70,5 +72,13 @@ declare const brand: unique symbol;
70
72
  export type Brand<T, TBrand extends string> = T & {
71
73
  [brand]: TBrand;
72
74
  };
75
+ export type CustomSource<T extends string> = {
76
+ id: T;
77
+ trackIds?: {
78
+ videoId?: string;
79
+ audioId?: string;
80
+ };
81
+ stream?: MediaStream;
82
+ };
73
83
  export {};
74
84
  //# sourceMappingURL=public.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/types/public.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/types/public.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fishjam-cloud/react-client",
3
- "version": "0.16.1",
3
+ "version": "0.18.0",
4
4
  "description": "React client library for Fishjam",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Fishjam Team",
@@ -34,7 +34,7 @@
34
34
  "scripts": {
35
35
  "build": "tsc",
36
36
  "e2e": "NODE_OPTIONS=--dns-result-order=ipv4first playwright test",
37
- "test": "vitest",
37
+ "test": "vitest run",
38
38
  "docs": "typedoc src src/experimental",
39
39
  "format": "prettier --write . --ignore-path ./.eslintignore",
40
40
  "format:check": "prettier --check . --ignore-path ./.eslintignore",
@@ -60,7 +60,7 @@
60
60
  "vitest": "^3.1.1"
61
61
  },
62
62
  "dependencies": {
63
- "@fishjam-cloud/ts-client": "0.16.1",
63
+ "@fishjam-cloud/ts-client": "0.18.0",
64
64
  "events": "3.3.0",
65
65
  "lodash.isequal": "4.5.0"
66
66
  },
package/readme.md CHANGED
@@ -19,11 +19,12 @@ There is also [API documentation](https://docs.fishjam.io/api/web/) available.
19
19
  There are [few example apps](https://github.com/fishjam-cloud/web-client-sdk/tree/main/examples/react-client#examples-for-fishjam-client) that shows how to use Fishjam SDKs and service.
20
20
 
21
21
  - [Fishjam Chat](https://github.com/fishjam-cloud/web-client-sdk/tree/main/examples/react-client/fishjam-chat) - example video chat app
22
- - [minimal-react](https://github.com/fishjam-cloud/web-client-sdk/tree/main/examples/react-client/minimal-react) - minimal example that shows how to connect and broadcast screen
22
+ - [minimal-react](https://github.com/fishjam-cloud/web-client-sdk/tree/main/examples/react-client/minimal-react) - minimal example that shows how to connect and share your screen
23
+ - [broadcast](https://github.com/fishjam-cloud/web-client-sdk/tree/main/examples/react-client/broadcast) - minimal example showing how to consume a broadcast stream
23
24
 
24
25
  ## License
25
26
 
26
- Licensed under the [Apache xdLicense, Version 2.0](./LICENSE.txt)
27
+ Licensed under the [Apache License, Version 2.0](./LICENSE.txt)
27
28
 
28
29
  ## Fishjam is created by Software Mansion
29
30