@fishjam-cloud/react-client 0.5.1 → 0.5.2

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.
@@ -1,99 +1,99 @@
1
- export class TrackManager {
2
- mediaManager;
3
- tsClient;
4
- currentTrackId = null;
5
- constructor(tsClient, deviceManager) {
6
- this.mediaManager = deviceManager;
7
- this.tsClient = tsClient;
8
- }
9
- getPreviousTrack = () => {
10
- if (!this.currentTrackId)
1
+ import { getRemoteOrLocalTrack } from "./utils/track";
2
+ import { useEffect, useState } from "react";
3
+ export const useTrackManager = ({ mediaManager, tsClient, }) => {
4
+ const [currentTrackId, setCurrentTrackId] = useState(null);
5
+ const [currentTrackMiddleware, setCurrentTrackMiddleware] = useState(null);
6
+ useEffect(() => {
7
+ const disconnectedHandler = () => {
8
+ setCurrentTrackId(null);
9
+ };
10
+ tsClient.on("disconnected", disconnectedHandler);
11
+ return () => {
12
+ tsClient.off("disconnected", disconnectedHandler);
13
+ };
14
+ }, [tsClient]);
15
+ function getPreviousTrack() {
16
+ if (!currentTrackId)
11
17
  throw Error("There is no current track id");
12
- const prevTrack = this.getRemoteTrack(this.currentTrackId);
18
+ const prevTrack = getRemoteOrLocalTrack(tsClient, currentTrackId);
13
19
  if (!prevTrack)
14
20
  throw Error("There is no previous track");
15
21
  return prevTrack;
16
- };
17
- getCurrentTrack = () => {
18
- if (!this.currentTrackId)
19
- return null;
20
- return this.getRemoteTrack(this.currentTrackId);
21
- };
22
- trackContextToTrack = (track) => ({
23
- rawMetadata: track.rawMetadata,
24
- metadata: track.metadata,
25
- trackId: track.trackId,
26
- stream: track.stream,
27
- simulcastConfig: track.simulcastConfig || null,
28
- encoding: track.encoding || null,
29
- vadStatus: track.vadStatus,
30
- track: track.track,
31
- metadataParsingError: track.metadataParsingError,
32
- });
33
- getRemoteTrack = (remoteOrLocalTrackId) => {
34
- const tracks = this.tsClient?.getLocalPeer()?.tracks;
35
- if (!tracks)
36
- return null;
37
- const trackByRemoteId = tracks?.get(remoteOrLocalTrackId);
38
- if (trackByRemoteId)
39
- return this.trackContextToTrack(trackByRemoteId);
40
- const trackByLocalId = [...tracks.values()].find((track) => track.track?.id === remoteOrLocalTrackId);
41
- return trackByLocalId ? this.trackContextToTrack(trackByLocalId) : null;
42
- };
43
- initialize = async (deviceId) => {
44
- this.mediaManager?.start(deviceId ?? true);
45
- };
46
- cleanup = async () => {
47
- this?.mediaManager?.stop();
48
- };
49
- startStreaming = async (trackMetadata, simulcastConfig, maxBandwidth) => {
50
- if (this.currentTrackId)
22
+ }
23
+ async function setTrackMiddleware(middleware) {
24
+ const currentTrack = getCurrentTrack();
25
+ const mediaTrack = mediaManager.getTracks()[0];
26
+ if (!currentTrack || !mediaTrack)
27
+ return;
28
+ const trackToSet = middleware ? middleware(mediaTrack) : mediaTrack;
29
+ await tsClient.replaceTrack(currentTrack.trackId, trackToSet);
30
+ setCurrentTrackMiddleware(() => middleware);
31
+ }
32
+ function getCurrentTrack() {
33
+ return getRemoteOrLocalTrack(tsClient, currentTrackId);
34
+ }
35
+ async function initialize(deviceId) {
36
+ mediaManager?.start(deviceId ?? true);
37
+ }
38
+ async function stop() {
39
+ mediaManager?.stop();
40
+ }
41
+ async function startStreaming(trackMetadata, simulcastConfig, maxBandwidth) {
42
+ if (currentTrackId)
51
43
  throw Error("Track already added");
52
- const media = this.mediaManager.getMedia();
44
+ const media = mediaManager.getMedia();
53
45
  if (!media || !media.stream || !media.track)
54
46
  throw Error("Device is unavailable");
55
- const track = this.getRemoteTrack(media.track.id);
47
+ const track = getRemoteOrLocalTrack(tsClient, currentTrackId);
56
48
  if (track)
57
49
  return track.trackId;
58
- // see `getRemoteTrack()` explanation
59
- this.currentTrackId = media.track.id;
60
- const remoteTrackId = await this.tsClient.addTrack(media.track, trackMetadata, simulcastConfig, maxBandwidth);
61
- this.currentTrackId = remoteTrackId;
50
+ // see `getRemoteOrLocalTrackContext()` explanation
51
+ setCurrentTrackId(media.track.id);
52
+ const remoteTrackId = await tsClient.addTrack(media.track, trackMetadata, simulcastConfig, maxBandwidth);
53
+ setCurrentTrackId(remoteTrackId);
62
54
  return remoteTrackId;
63
- };
64
- refreshStreamedTrack = async () => {
65
- const prevTrack = this.getPreviousTrack();
66
- const newTrack = this.mediaManager.getTracks()[0];
55
+ }
56
+ async function refreshStreamedTrack() {
57
+ const prevTrack = getPreviousTrack();
58
+ const newTrack = mediaManager.getTracks()[0];
67
59
  if (!newTrack)
68
60
  throw Error("New track is empty");
69
- return this.tsClient.replaceTrack(prevTrack.trackId, newTrack);
70
- };
71
- stopStreaming = async () => {
72
- const prevTrack = this.getPreviousTrack();
73
- this.currentTrackId = null;
74
- return this.tsClient.removeTrack(prevTrack.trackId);
75
- };
76
- pauseStreaming = async () => {
77
- const prevTrack = this.getPreviousTrack();
78
- await this.tsClient.replaceTrack(prevTrack.trackId, null);
79
- };
80
- isMuted = () => {
81
- const media = this.mediaManager.getMedia();
82
- const isTrackDisabled = !media?.track?.enabled;
83
- const areMediaDisabled = !media?.enabled;
84
- return isTrackDisabled && areMediaDisabled;
85
- };
86
- resumeStreaming = async () => {
87
- const prevTrack = this.getPreviousTrack();
88
- const media = this.mediaManager.getMedia();
61
+ return tsClient.replaceTrack(prevTrack.trackId, newTrack);
62
+ }
63
+ function stopStreaming() {
64
+ const prevTrack = getPreviousTrack();
65
+ setCurrentTrackId(null);
66
+ return tsClient.removeTrack(prevTrack.trackId);
67
+ }
68
+ function pauseStreaming() {
69
+ const prevTrack = getPreviousTrack();
70
+ return tsClient.replaceTrack(prevTrack.trackId, null);
71
+ }
72
+ function resumeStreaming() {
73
+ const prevTrack = getPreviousTrack();
74
+ const media = mediaManager.getMedia();
89
75
  if (!media)
90
76
  throw Error("Device is unavailable");
91
- await this.tsClient.replaceTrack(prevTrack.trackId, media.track);
92
- };
93
- disableTrack = async () => {
94
- this.mediaManager.disable();
95
- };
96
- enableTrack = async () => {
97
- this.mediaManager.enable();
77
+ return tsClient.replaceTrack(prevTrack.trackId, media.track);
78
+ }
79
+ function disableTrack() {
80
+ return mediaManager.disable();
81
+ }
82
+ function enableTrack() {
83
+ return mediaManager.enable();
84
+ }
85
+ return {
86
+ getCurrentTrack,
87
+ setTrackMiddleware,
88
+ initialize,
89
+ stop,
90
+ startStreaming,
91
+ stopStreaming,
92
+ pauseStreaming,
93
+ resumeStreaming,
94
+ disableTrack,
95
+ enableTrack,
96
+ currentTrackMiddleware,
97
+ refreshStreamedTrack,
98
98
  };
99
- }
99
+ };
package/dist/types.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- import type { ConnectConfig, SimulcastConfig, TrackBandwidthLimit } from "@fishjam-cloud/ts-client";
2
- import type { ScreenShareManagerConfig } from "./ScreenShareManager";
1
+ import type { ConnectConfig, SimulcastConfig, TrackBandwidthLimit, TrackKind } from "@fishjam-cloud/ts-client";
3
2
  import type { PeerState, PeerStatus, Selector, State, Track, TrackId, TrackWithOrigin, UseReconnection } from "./state.types";
4
3
  import type { JSX, ReactNode } from "react";
5
4
  import type { Client } from "./Client";
@@ -116,7 +115,6 @@ export type UseSetupMediaConfig<TrackMetadata> = {
116
115
  * Determines whether broadcasting should start when the user initiates the camera and is connected to the server.
117
116
  */
118
117
  broadcastOnDeviceStart?: boolean;
119
- streamConfig?: ScreenShareManagerConfig;
120
118
  defaultTrackMetadata?: TrackMetadata;
121
119
  defaultMaxBandwidth?: TrackBandwidthLimit;
122
120
  };
@@ -126,7 +124,7 @@ export type UseSetupMediaConfig<TrackMetadata> = {
126
124
  export type UseSetupMediaResult = {
127
125
  init: () => void;
128
126
  };
129
- export interface GenericMediaManager {
127
+ export interface MediaManager {
130
128
  start: (deviceId?: string | boolean) => Promise<void>;
131
129
  stop: () => Promise<void>;
132
130
  disable: () => void;
@@ -138,18 +136,30 @@ export interface GenericMediaManager {
138
136
  enabled: boolean;
139
137
  } | null;
140
138
  }
141
- export interface GenericTrackManager<TrackMetadata> {
139
+ export type TrackMiddleware = ((track: MediaStreamTrack | null) => MediaStreamTrack | null) | null;
140
+ export type ScreenshareState = {
141
+ stream: MediaStream;
142
+ trackIds: {
143
+ videoId: string;
144
+ audioId?: string;
145
+ };
146
+ tracksMiddleware?: TracksMiddleware | null;
147
+ } | null;
148
+ export interface TrackManager<TrackMetadata> {
142
149
  initialize: (deviceId?: string) => Promise<void>;
143
- cleanup: () => Promise<void>;
150
+ stop: () => Promise<void>;
144
151
  startStreaming: (trackMetadata?: TrackMetadata, simulcastConfig?: SimulcastConfig, maxBandwidth?: TrackBandwidthLimit) => Promise<string>;
145
152
  stopStreaming: () => Promise<void>;
146
153
  pauseStreaming: () => Promise<void>;
147
154
  resumeStreaming: () => Promise<void>;
148
155
  disableTrack: () => void;
149
156
  enableTrack: () => void;
157
+ setTrackMiddleware: (middleware: TrackMiddleware) => Promise<void>;
158
+ currentTrackMiddleware: TrackMiddleware;
159
+ refreshStreamedTrack: () => Promise<void>;
160
+ getCurrentTrack: () => Track<TrackMetadata> | null;
150
161
  }
151
- export type UserMediaAPI<TrackMetadata> = {
152
- broadcast: Track<TrackMetadata> | null;
162
+ export type UserMediaAPI = {
153
163
  status: DevicesStatus | null;
154
164
  stream: MediaStream | null;
155
165
  track: MediaStreamTrack | null;
@@ -159,36 +169,43 @@ export type UserMediaAPI<TrackMetadata> = {
159
169
  error: DeviceError | null;
160
170
  devices: MediaDeviceInfo[] | null;
161
171
  };
162
- export type ScreenShareAPI<TrackMetadata> = {
163
- initialize: (config?: ScreenShareManagerConfig) => Promise<void>;
164
- cleanup: () => Promise<void>;
165
- startStreaming: (trackMetadata?: TrackMetadata, maxBandwidth?: TrackBandwidthLimit) => Promise<string>;
172
+ export type TrackManagerState = {
173
+ currentTrackId: TrackId | null;
174
+ currentTrackMiddleware: TrackMiddleware;
175
+ };
176
+ export type ScreenshareApi<TrackMetadata> = {
177
+ startStreaming: (props?: {
178
+ metadata?: TrackMetadata;
179
+ audioConstraints?: boolean | MediaTrackConstraints;
180
+ videoConstraints?: boolean | MediaTrackConstraints;
181
+ }) => Promise<void>;
166
182
  stopStreaming: () => Promise<void>;
167
- disableTrack: () => void;
168
- enableTrack: () => void;
169
- broadcast: Track<TrackMetadata> | null;
170
- status: DevicesStatus | null;
171
183
  stream: MediaStream | null;
172
- track: MediaStreamTrack | null;
173
- enabled: boolean;
174
- mediaStatus: MediaStatus | null;
175
- error: DeviceError | null;
184
+ videoTrack: MediaStreamTrack | null;
185
+ audioTrack: MediaStreamTrack | null;
186
+ videoBroadcast: Track<TrackMetadata> | null;
187
+ audioBroadcast: Track<TrackMetadata> | null;
188
+ setTracksMiddleware: (middleware: TracksMiddleware | null) => Promise<void>;
189
+ currentTracksMiddleware: TracksMiddleware | null;
176
190
  };
177
- export type Devices<TrackMetadata> = {
178
- camera: UserMediaAPI<TrackMetadata>;
179
- microphone: UserMediaAPI<TrackMetadata>;
180
- screenShare: ScreenShareAPI<TrackMetadata>;
191
+ export type Devices = {
192
+ camera: UserMediaAPI;
193
+ microphone: UserMediaAPI;
181
194
  };
182
195
  export type FishjamContextProviderProps = {
183
196
  children: ReactNode;
184
197
  };
198
+ export type TracksMiddleware = (videoTrack: MediaStreamTrack, audioTrack: MediaStreamTrack | null) => [MediaStreamTrack, MediaStreamTrack | null];
185
199
  export type FishjamContextType<PeerMetadata, TrackMetadata> = {
186
200
  state: State<PeerMetadata, TrackMetadata>;
201
+ screenshareState: [ScreenshareState, React.Dispatch<React.SetStateAction<ScreenshareState>>];
202
+ videoTrackManager: TrackManager<TrackMetadata>;
203
+ audioTrackManager: TrackManager<TrackMetadata>;
187
204
  };
188
205
  export type UseConnect<PeerMetadata> = (config: ConnectConfig<PeerMetadata>) => () => void;
189
206
  type DistinguishedTracks<TrackMetadata> = {
190
- videoTrack?: Track<TrackMetadata>;
191
- audioTrack?: Track<TrackMetadata>;
207
+ videoTracks: Track<TrackMetadata>[];
208
+ audioTracks: Track<TrackMetadata>[];
192
209
  };
193
210
  export type PeerStateWithTracks<PeerMetadata, TrackMetadata> = PeerState<PeerMetadata, TrackMetadata> & DistinguishedTracks<TrackMetadata>;
194
211
  export type CreateFishjamClient<PeerMetadata, TrackMetadata> = {
@@ -199,15 +216,17 @@ export type CreateFishjamClient<PeerMetadata, TrackMetadata> = {
199
216
  useSelector: <Result>(selector: Selector<PeerMetadata, TrackMetadata, Result>) => Result;
200
217
  useTracks: () => Record<TrackId, TrackWithOrigin<PeerMetadata, TrackMetadata>>;
201
218
  useSetupMedia: (config: UseSetupMediaConfig<TrackMetadata>) => UseSetupMediaResult;
202
- useCamera: () => Devices<TrackMetadata>["camera"] & GenericTrackManager<TrackMetadata>;
203
- useMicrophone: () => Devices<TrackMetadata>["microphone"] & GenericTrackManager<TrackMetadata>;
204
- useScreenShare: () => ScreenShareAPI<TrackMetadata>;
219
+ useCamera: () => Devices["camera"] & TrackManager<TrackMetadata>;
220
+ useMicrophone: () => Devices["microphone"] & TrackManager<TrackMetadata>;
205
221
  useClient: () => Client<PeerMetadata, TrackMetadata>;
206
222
  useReconnection: () => UseReconnection;
207
223
  useParticipants: () => {
208
224
  localParticipant: PeerStateWithTracks<PeerMetadata, TrackMetadata> | null;
209
225
  participants: PeerStateWithTracks<PeerMetadata, TrackMetadata>[];
210
226
  };
227
+ useScreenShare: () => ScreenshareApi<TrackMetadata>;
211
228
  };
229
+ export type TrackType = TrackKind | "audiovideo";
230
+ export type MediaDeviceType = "displayMedia" | "userMedia";
212
231
  export {};
213
232
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,QAAQ,EACR,KAAK,EACL,KAAK,EACL,OAAO,EACP,eAAe,EACf,eAAe,EAChB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,OAAO,GAAG,eAAe,GAAG,YAAY,CAAC;AAC5E,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,OAAO,GAAG,eAAe,GAAG,YAAY,CAAC;AAE1E,MAAM,MAAM,KAAK,GAAG;IAClB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,qBAAqB,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;IACxD,qBAAqB,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,gBAAgB,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;IACnD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACrD,cAAc,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,sBAAsB,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAC3B;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAEhC,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAAE,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;CAAE,CAAC;AAExG,MAAM,MAAM,mBAAmB,CAAC,aAAa,IAAI;IAC/C,MAAM,EAAE;QACN;;WAEG;QACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B;;WAEG;QACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;QACjC;;;WAGG;QACH,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;QACtC;;;;WAIG;QACH,YAAY,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;QAEjC,gBAAgB,EAAE,OAAO,GAAG,qBAAqB,CAAC;QAClD,oBAAoB,CAAC,EAAE,aAAa,CAAC;QACrC,sBAAsB,CAAC,EAAE,eAAe,CAAC;QACzC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;KAC3C,CAAC;IACF,UAAU,EAAE;QACV;;WAEG;QACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B;;WAEG;QACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;QACjC;;;;WAIG;QACH,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;QAEtC;;;;WAIG;QACH,YAAY,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;QAEjC,gBAAgB,EAAE,OAAO,GAAG,qBAAqB,CAAC;QAClD,oBAAoB,CAAC,EAAE,aAAa,CAAC;QACrC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;KAC3C,CAAC;IACF,WAAW,EAAE;QACX;;WAEG;QACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B;;WAEG;QACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;QAEjC,YAAY,CAAC,EAAE,wBAAwB,CAAC;QAExC,oBAAoB,CAAC,EAAE,aAAa,CAAC;QACrC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;KAC3C,CAAC;IACF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,gBAAgB,EAAE,CAAC;IACpC,QAAQ,EAAE,MAAM;QAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CACzG;AAED,MAAM,WAAW,mBAAmB,CAAC,aAAa;IAChD,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,cAAc,EAAE,CACd,aAAa,CAAC,EAAE,aAAa,EAC7B,eAAe,CAAC,EAAE,eAAe,EACjC,YAAY,CAAC,EAAE,mBAAmB,KAC/B,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,CAAC,aAAa,IAAI;IACxC,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IACvC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,aAAa,IAAI;IAC1C,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,cAAc,EAAE,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvG,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IACvC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;IAEjB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,OAAO,CAAC,aAAa,IAAI;IACnC,MAAM,EAAE,YAAY,CAAC,aAAa,CAAC,CAAC;IACpC,UAAU,EAAE,YAAY,CAAC,aAAa,CAAC,CAAC;IACxC,WAAW,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,YAAY,EAAE,aAAa,IAAI;IAC5D,KAAK,EAAE,KAAK,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,KAAK,MAAM,IAAI,CAAC;AAE3F,KAAK,mBAAmB,CAAC,aAAa,IAAI;IACxC,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,YAAY,EAAE,aAAa,IAAI,SAAS,CAAC,YAAY,EAAE,aAAa,CAAC,GACnG,mBAAmB,CAAC,aAAa,CAAC,CAAC;AAErC,MAAM,MAAM,mBAAmB,CAAC,YAAY,EAAE,aAAa,IAAI;IAC7D,sBAAsB,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,2BAA2B,KAAK,GAAG,CAAC,OAAO,CAAC;IACnF,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,KAAK,MAAM,IAAI,CAAC;IACtE,aAAa,EAAE,MAAM,MAAM,IAAI,CAAC;IAChC,SAAS,EAAE,MAAM,UAAU,CAAC;IAC5B,WAAW,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC;IACzF,SAAS,EAAE,MAAM,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;IAC/E,aAAa,EAAE,CAAC,MAAM,EAAE,mBAAmB,CAAC,aAAa,CAAC,KAAK,mBAAmB,CAAC;IACnF,SAAS,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACvF,aAAa,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC/F,cAAc,EAAE,MAAM,cAAc,CAAC,aAAa,CAAC,CAAC;IACpD,SAAS,EAAE,MAAM,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IACrD,eAAe,EAAE,MAAM,eAAe,CAAC;IACvC,eAAe,EAAE,MAAM;QACrB,gBAAgB,EAAE,mBAAmB,CAAC,YAAY,EAAE,aAAa,CAAC,GAAG,IAAI,CAAC;QAC1E,YAAY,EAAE,mBAAmB,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,CAAC;KAClE,CAAC;CACH,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useSetupMedia.d.ts","sourceRoot":"","sources":["../src/useSetupMedia.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAM5F,eAAO,MAAM,uBAAuB,GAAI,YAAY,EAAE,aAAa,qBAC9C,MAAM,kBAAkB,CAAC,YAAY,EAAE,aAAa,CAAC,cAQxD,mBAAmB,CAAC,aAAa,CAAC,KAAG,mBAmVtD,CAAC"}
1
+ {"version":3,"file":"useSetupMedia.d.ts","sourceRoot":"","sources":["../src/useSetupMedia.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAK5F,eAAO,MAAM,uBAAuB,GAAI,YAAY,EAAE,aAAa,qBAC9C,MAAM,kBAAkB,CAAC,YAAY,EAAE,aAAa,CAAC,cAQxD,mBAAmB,CAAC,aAAa,CAAC,KAAG,mBAiQtD,CAAC"}
@@ -3,13 +3,10 @@ export const createUseSetupMediaHook = (useFishjamContext) => {
3
3
  const isBroadcastedTrackChanged = (client, pending) => client.status === "joined" && !pending && !client.isReconnecting();
4
4
  const isBroadcastedTrackStopped = (status, stream) => status === "joined" && stream;
5
5
  return (config) => {
6
- const { state } = useFishjamContext();
6
+ const { state, videoTrackManager, audioTrackManager } = useFishjamContext();
7
7
  const configRef = useRef(config);
8
8
  useEffect(() => {
9
9
  configRef.current = config;
10
- if (config.screenShare.streamConfig) {
11
- state.client.setScreenManagerConfig(config.screenShare.streamConfig);
12
- }
13
10
  state.client.setDeviceManagerConfig({
14
11
  storage: config.storage,
15
12
  });
@@ -30,10 +27,8 @@ export const createUseSetupMediaHook = (useFishjamContext) => {
30
27
  let pending = false;
31
28
  const broadcastOnCameraStart = async (client) => {
32
29
  const config = configRef.current.camera;
33
- const videoTrackManager = client.videoTrackManager;
34
30
  const onDeviceChange = config.onDeviceChange ?? "replace";
35
- const camera = client.devices.camera;
36
- const stream = camera.broadcast?.stream;
31
+ const stream = videoTrackManager.getCurrentTrack()?.stream;
37
32
  if (isBroadcastedTrackChanged(client, pending)) {
38
33
  if (!stream && config.broadcastOnDeviceStart) {
39
34
  pending = true;
@@ -80,12 +75,10 @@ export const createUseSetupMediaHook = (useFishjamContext) => {
80
75
  state.client.removeListener("devicesReady", devicesReady);
81
76
  state.client.removeListener("deviceReady", deviceReady);
82
77
  };
83
- }, [state.client]);
78
+ }, [state.client, videoTrackManager]);
84
79
  useEffect(() => {
85
80
  const removeOnCameraStopped = async (event, client) => {
86
- const camera = client.devices.camera;
87
- const videoTrackManager = client.videoTrackManager;
88
- const stream = camera.broadcast?.stream;
81
+ const stream = videoTrackManager.getCurrentTrack()?.stream;
89
82
  const onDeviceStop = configRef.current.camera.onDeviceStop ?? "mute";
90
83
  if (event.mediaDeviceType === "userMedia" &&
91
84
  event.trackType === "video" &&
@@ -102,27 +95,25 @@ export const createUseSetupMediaHook = (useFishjamContext) => {
102
95
  return () => {
103
96
  state.client.removeListener("deviceStopped", removeOnCameraStopped);
104
97
  };
105
- }, [state.client]);
98
+ }, [state.client, videoTrackManager]);
106
99
  useEffect(() => {
107
100
  const broadcastCameraOnConnect = async (_, client) => {
108
101
  const camera = client.devices.camera;
109
102
  const stream = camera.stream;
110
103
  const config = configRef.current.camera;
111
104
  if (stream && config.broadcastOnConnect) {
112
- await client.videoTrackManager.startStreaming(config.defaultTrackMetadata, config.defaultSimulcastConfig, config.defaultMaxBandwidth);
105
+ await videoTrackManager.startStreaming(config.defaultTrackMetadata, config.defaultSimulcastConfig, config.defaultMaxBandwidth);
113
106
  }
114
107
  };
115
108
  state.client.on("joined", broadcastCameraOnConnect);
116
109
  return () => {
117
110
  state.client.removeListener("joined", broadcastCameraOnConnect);
118
111
  };
119
- }, [state.client]);
112
+ }, [state.client, videoTrackManager]);
120
113
  useEffect(() => {
121
114
  let pending = false;
122
115
  const broadcastOnMicrophoneStart = async (client) => {
123
- const microphone = client.devices.microphone;
124
- const audioTrackManager = client.audioTrackManager;
125
- const stream = microphone.broadcast?.stream;
116
+ const stream = audioTrackManager.getCurrentTrack()?.stream;
126
117
  const config = configRef.current.microphone;
127
118
  const onDeviceChange = config.onDeviceChange ?? "replace";
128
119
  if (isBroadcastedTrackChanged(client, pending)) {
@@ -171,11 +162,10 @@ export const createUseSetupMediaHook = (useFishjamContext) => {
171
162
  state.client.removeListener("deviceReady", deviceReady);
172
163
  state.client.removeListener("devicesReady", devicesReady);
173
164
  };
174
- }, [state.client]);
165
+ }, [state.client, audioTrackManager]);
175
166
  useEffect(() => {
176
167
  const onMicrophoneStopped = async (event, client) => {
177
- const audioTrackManager = client.audioTrackManager;
178
- const stream = client.devices.microphone.broadcast?.stream;
168
+ const stream = audioTrackManager.getCurrentTrack()?.stream;
179
169
  const onDeviceStop = configRef.current.microphone.onDeviceStop ?? "mute";
180
170
  const isRightDeviceType = event.mediaDeviceType === "userMedia";
181
171
  const isRightTrackType = event.trackType === "audio";
@@ -192,66 +182,20 @@ export const createUseSetupMediaHook = (useFishjamContext) => {
192
182
  return () => {
193
183
  state.client.removeListener("deviceStopped", onMicrophoneStopped);
194
184
  };
195
- }, [state.client]);
185
+ }, [state.client, audioTrackManager]);
196
186
  useEffect(() => {
197
187
  const broadcastMicrophoneOnConnect = async (_, client) => {
198
188
  const config = configRef.current.microphone;
199
189
  const microphone = client.devices.microphone;
200
190
  if (microphone.stream && config.broadcastOnConnect) {
201
- await client.audioTrackManager.startStreaming(config.defaultTrackMetadata, undefined, config.defaultMaxBandwidth);
191
+ await audioTrackManager.startStreaming(config.defaultTrackMetadata, undefined, config.defaultMaxBandwidth);
202
192
  }
203
193
  };
204
194
  state.client.on("joined", broadcastMicrophoneOnConnect);
205
195
  return () => {
206
196
  state.client.removeListener("joined", broadcastMicrophoneOnConnect);
207
197
  };
208
- }, [state.client]);
209
- useEffect(() => {
210
- let pending = false;
211
- const broadcastOnScreenShareStart = async (event, client) => {
212
- const screenShare = client.devices.screenShare;
213
- const stream = screenShare.broadcast?.stream;
214
- const { broadcastOnDeviceStart, defaultTrackMetadata, defaultMaxBandwidth } = configRef.current.screenShare;
215
- if (event.mediaDeviceType === "displayMedia" &&
216
- isBroadcastedTrackChanged(client, pending) &&
217
- !stream &&
218
- broadcastOnDeviceStart) {
219
- pending = true;
220
- await screenShare.startStreaming(defaultTrackMetadata, defaultMaxBandwidth).finally(() => {
221
- pending = false;
222
- });
223
- }
224
- };
225
- state.client.on("deviceReady", broadcastOnScreenShareStart);
226
- return () => {
227
- state.client.removeListener("deviceReady", broadcastOnScreenShareStart);
228
- };
229
- }, [state.client]);
230
- useEffect(() => {
231
- const onScreenShareStop = async (event, client) => {
232
- const stream = client.devices.screenShare.broadcast?.stream;
233
- const isRightDeviceType = event.mediaDeviceType === "displayMedia";
234
- const isRightTrackType = event.trackType === "video";
235
- if (isRightDeviceType && isRightTrackType && isBroadcastedTrackStopped(client.status, stream)) {
236
- await client.devices.screenShare.stopStreaming();
237
- }
238
- };
239
- state.client.on("deviceStopped", onScreenShareStop);
240
- return () => {
241
- state.client.removeListener("deviceStopped", onScreenShareStop);
242
- };
243
- }, [state.client]);
244
- useEffect(() => {
245
- const broadcastScreenShareOnConnect = async (_, client) => {
246
- if (client.devices.screenShare.stream && configRef.current.screenShare.broadcastOnConnect) {
247
- await client.devices.screenShare.startStreaming(configRef.current.screenShare.defaultTrackMetadata, configRef.current.screenShare.defaultMaxBandwidth);
248
- }
249
- };
250
- state.client.on("joined", broadcastScreenShareOnConnect);
251
- return () => {
252
- state.client.removeListener("joined", broadcastScreenShareOnConnect);
253
- };
254
- }, [state.client]);
198
+ }, [state.client, audioTrackManager]);
255
199
  return useMemo(() => ({
256
200
  init: () => state.client.initializeDevices({
257
201
  audioTrackConstraints: configRef.current?.microphone?.trackConstraints,
@@ -0,0 +1,4 @@
1
+ import type { FishjamClient } from "@fishjam-cloud/ts-client";
2
+ import type { Track } from "../state.types";
3
+ export declare const getRemoteOrLocalTrack: <PeerMetadata, TrackMetadata>(tsClient: FishjamClient<PeerMetadata, TrackMetadata>, remoteOrLocalTrackId: string | null) => Track<TrackMetadata> | null;
4
+ //# sourceMappingURL=track.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/utils/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,0BAA0B,CAAC;AAC5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAsC5C,eAAO,MAAM,qBAAqB,GAAI,YAAY,EAAE,aAAa,YACrD,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,wBAC9B,MAAM,GAAG,IAAI,gCAKpC,CAAC"}
@@ -0,0 +1,37 @@
1
+ // In most cases, the track is identified by its remote track ID.
2
+ // This ID comes from the ts-client `addTrack` method.
3
+ // However, we don't have that ID before the `addTrack` method returns it.
4
+ //
5
+ // The `addTrack` method emits the `localTrackAdded` event.
6
+ // This event will refresh the internal state of this object.
7
+ // However, in that event handler, we don't yet have the remote track ID.
8
+ // Therefore, for that brief moment, we will use the local track ID from the MediaStreamTrack object to identify the track.
9
+ const getRemoteOrLocalTrackContext = (tsClient, remoteOrLocalTrackId) => {
10
+ if (!remoteOrLocalTrackId)
11
+ return null;
12
+ const tracks = tsClient?.getLocalPeer()?.tracks;
13
+ if (!tracks)
14
+ return null;
15
+ const trackByRemoteId = tracks?.get(remoteOrLocalTrackId);
16
+ if (trackByRemoteId)
17
+ return trackByRemoteId;
18
+ const trackByLocalId = [...tracks.values()].find((track) => track.track?.id === remoteOrLocalTrackId);
19
+ return trackByLocalId ? trackByLocalId : null;
20
+ };
21
+ const getTrackFromContext = (context) => ({
22
+ rawMetadata: context.rawMetadata,
23
+ metadata: context.metadata,
24
+ trackId: context.trackId,
25
+ stream: context.stream,
26
+ simulcastConfig: context.simulcastConfig || null,
27
+ encoding: context.encoding || null,
28
+ vadStatus: context.vadStatus,
29
+ track: context.track,
30
+ metadataParsingError: context.metadataParsingError,
31
+ });
32
+ export const getRemoteOrLocalTrack = (tsClient, remoteOrLocalTrackId) => {
33
+ const context = getRemoteOrLocalTrackContext(tsClient, remoteOrLocalTrackId);
34
+ if (!context)
35
+ return null;
36
+ return getTrackFromContext(context);
37
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fishjam-cloud/react-client",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "React client library for Fishjam Cloud",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Fishjam Cloud Team",
@@ -42,19 +42,19 @@
42
42
  "typecheck": "tsc"
43
43
  },
44
44
  "devDependencies": {
45
- "@playwright/test": "^1.45.3",
45
+ "@playwright/test": "^1.46.1",
46
46
  "@types/events": "^3.0.3",
47
47
  "@types/lodash.isequal": "^4.5.8",
48
- "@types/node": "^22.0.0",
48
+ "@types/node": "^22.4.1",
49
49
  "@types/react": "^18.2.55",
50
50
  "react": "^18.2.0",
51
51
  "typed-emitter": "^2.1.0",
52
- "typedoc": "^0.26.5",
53
- "typedoc-plugin-mdn-links": "^3.2.6",
52
+ "typedoc": "^0.26.6",
53
+ "typedoc-plugin-mdn-links": "^3.2.9",
54
54
  "typescript": "^5.5.4"
55
55
  },
56
56
  "dependencies": {
57
- "@fishjam-cloud/ts-client": "0.5.1",
57
+ "@fishjam-cloud/ts-client": "0.5.2",
58
58
  "events": "3.3.0",
59
59
  "lodash.isequal": "4.5.0"
60
60
  },