@fishjam-cloud/react-client 0.25.0 → 0.25.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.
- package/dist/devices/mediaInitializer.d.ts.map +1 -1
- package/dist/devices/mediaInitializer.js +15 -16
- package/dist/hooks/internal/useScreenshareManager.d.ts.map +1 -1
- package/dist/hooks/internal/useScreenshareManager.js +15 -14
- package/dist/hooks/useLivestreamViewer.d.ts +1 -0
- package/dist/hooks/useLivestreamViewer.d.ts.map +1 -1
- package/dist/hooks/useLivestreamViewer.js +9 -4
- package/dist/hooks/useSandbox.d.ts.map +1 -1
- package/dist/hooks/useSandbox.js +7 -6
- package/dist/hooks/useStatistics.d.ts.map +1 -1
- package/dist/hooks/useStatistics.js +3 -2
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +11 -13
- package/dist/utils/fishjamUrl.d.ts.map +1 -1
- package/dist/utils/fishjamUrl.js +2 -4
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaInitializer.d.ts","sourceRoot":"","sources":["../../src/devices/mediaInitializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD,KAAK,gBAAgB,GAAG,UAAU,CAAC,qBAAqB,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC;AAChF,KAAK,eAAe,GAAG,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;AAE1D,KAAK,cAAc,GAAG;IAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"mediaInitializer.d.ts","sourceRoot":"","sources":["../../src/devices/mediaInitializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD,KAAK,gBAAgB,GAAG,UAAU,CAAC,qBAAqB,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC;AAChF,KAAK,eAAe,GAAG,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;AAE1D,KAAK,cAAc,GAAG;IAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;CAAE,CAAC;AAoC7F,eAAO,MAAM,iBAAiB,GAC5B,aAAa,sBAAsB,EACnC,SAAQ,UAAU,CAAC,WAAW,GAAG,IAAI,CAAiB,KACrD,OAAO,CAAC,cAAc,CAsBxB,CAAC;AAIF,eAAO,MAAM,sBAAsB,GACjC,QAAQ,WAAW,EACnB,QAAQ,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,EACtC,SAAS,eAAe,EAAE,EAC1B,aAAa,gBAAgB,EAC7B,iBAAiB,eAAe,KAC/B,OAAO,CAAC,cAAc,CAsBxB,CAAC"}
|
|
@@ -13,9 +13,8 @@ const getSingleMedia = async (type, constraints) => {
|
|
|
13
13
|
return [stream, null];
|
|
14
14
|
}
|
|
15
15
|
catch (err) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return [null, errorMap[err.name] ?? UNHANDLED_ERROR];
|
|
16
|
+
const name = err instanceof Error ? err.name : "";
|
|
17
|
+
return [null, errorMap[name] ?? UNHANDLED_ERROR];
|
|
19
18
|
}
|
|
20
19
|
};
|
|
21
20
|
const tryToGetAudioOnlyThenVideoOnly = async (constraints, initialError) => {
|
|
@@ -30,20 +29,20 @@ export const getAvailableMedia = async (constraints, errors = defaultErrors) =>
|
|
|
30
29
|
return { stream: await navigator.mediaDevices.getUserMedia(constraints), errors };
|
|
31
30
|
}
|
|
32
31
|
catch (err) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
32
|
+
const name = err instanceof Error ? err.name : "";
|
|
33
|
+
switch (name) {
|
|
34
|
+
case errors.audio?.name:
|
|
35
|
+
case errors.video?.name:
|
|
36
|
+
return { stream: null, errors };
|
|
37
|
+
case "NotFoundError":
|
|
38
|
+
return tryToGetAudioOnlyThenVideoOnly(constraints, PERMISSION_DENIED);
|
|
39
|
+
case "OverconstrainedError":
|
|
40
|
+
return getAvailableMedia({ audio: unspecifyDevice(constraints.audio), video: unspecifyDevice(constraints.video) }, { audio: OVERCONSTRAINED_ERROR, video: OVERCONSTRAINED_ERROR });
|
|
41
|
+
case "NotAllowedError":
|
|
42
|
+
return tryToGetAudioOnlyThenVideoOnly(constraints, PERMISSION_DENIED);
|
|
43
|
+
default:
|
|
44
|
+
return { stream: null, errors: { audio: UNHANDLED_ERROR, video: UNHANDLED_ERROR } };
|
|
45
45
|
}
|
|
46
|
-
return { stream: null, errors: { audio: UNHANDLED_ERROR, video: UNHANDLED_ERROR } };
|
|
47
46
|
}
|
|
48
47
|
};
|
|
49
48
|
// Safari changes deviceId between sessions, therefore we cannot rely on deviceId for identification purposes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useScreenshareManager.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useScreenshareManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM,EAAsC,MAAM,0BAA0B,CAAC;AAI/G,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,MAAM,oBAAoB,GAAG;IACjC;;OAEG;IACH,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE;QACvB,gBAAgB,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;QACnD,gBAAgB,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;KACpD,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB;;OAEG;IACH,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC;;OAEG;IACH,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B;;OAEG;IACH,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC;;OAEG;IACH,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC;;;;OAIG;IACH,uBAAuB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjD;;;;OAIG;IACH,mBAAmB,EAAE,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E,CAAC;AAEF,UAAU,uBAAuB;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,qBAAqB,GAAI,wCAInC,uBAAuB,KAAG,
|
|
1
|
+
{"version":3,"file":"useScreenshareManager.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useScreenshareManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM,EAAsC,MAAM,0BAA0B,CAAC;AAI/G,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,MAAM,oBAAoB,GAAG;IACjC;;OAEG;IACH,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE;QACvB,gBAAgB,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;QACnD,gBAAgB,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;KACpD,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB;;OAEG;IACH,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC;;OAEG;IACH,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B;;OAEG;IACH,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC;;OAEG;IACH,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC;;;;OAIG;IACH,uBAAuB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjD;;;;OAIG;IACH,mBAAmB,EAAE,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E,CAAC;AAEF,UAAU,uBAAuB;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,qBAAqB,GAAI,wCAInC,uBAAuB,KAAG,oBAiL5B,CAAC"}
|
|
@@ -4,13 +4,14 @@ export const useScreenShareManager = ({ fishjamClient, peerStatus, logger, }) =>
|
|
|
4
4
|
const [state, setState] = useState({ stream: null, trackIds: null });
|
|
5
5
|
const cleanMiddlewareFnRef = useRef(null);
|
|
6
6
|
const stream = state.stream ?? null;
|
|
7
|
+
const tracksMiddleware = state.tracksMiddleware ?? null;
|
|
7
8
|
const [mediaVideoTrack, mediaAudioTrack] = stream ? getTracksFromStream(stream) : [null, null];
|
|
8
|
-
const getDisplayName = () => {
|
|
9
|
+
const getDisplayName = useCallback(() => {
|
|
9
10
|
const name = fishjamClient.getLocalPeer()?.metadata?.peer?.displayName;
|
|
10
11
|
if (typeof name === "string")
|
|
11
12
|
return name;
|
|
12
|
-
};
|
|
13
|
-
const addTrackToFishjamClient = async (track, trackMetadata) => {
|
|
13
|
+
}, [fishjamClient]);
|
|
14
|
+
const addTrackToFishjamClient = useCallback(async (track, trackMetadata) => {
|
|
14
15
|
try {
|
|
15
16
|
return fishjamClient.addTrack(track, trackMetadata);
|
|
16
17
|
}
|
|
@@ -21,16 +22,16 @@ export const useScreenShareManager = ({ fishjamClient, peerStatus, logger, }) =>
|
|
|
21
22
|
}
|
|
22
23
|
throw err;
|
|
23
24
|
}
|
|
24
|
-
};
|
|
25
|
-
const startStreaming = async (props) => {
|
|
25
|
+
}, [fishjamClient, logger]);
|
|
26
|
+
const startStreaming = useCallback(async (props) => {
|
|
26
27
|
const displayStream = await navigator.mediaDevices.getDisplayMedia({
|
|
27
28
|
video: props?.videoConstraints ?? true,
|
|
28
29
|
audio: props?.audioConstraints ?? true,
|
|
29
30
|
});
|
|
30
31
|
const displayName = getDisplayName();
|
|
31
32
|
let [video, audio] = getTracksFromStream(displayStream);
|
|
32
|
-
if (
|
|
33
|
-
const { videoTrack, audioTrack, onClear } = await
|
|
33
|
+
if (tracksMiddleware) {
|
|
34
|
+
const { videoTrack, audioTrack, onClear } = await tracksMiddleware(video, audio);
|
|
34
35
|
video = videoTrack;
|
|
35
36
|
audio = audioTrack;
|
|
36
37
|
cleanMiddlewareFnRef.current = onClear;
|
|
@@ -50,8 +51,8 @@ export const useScreenShareManager = ({ fishjamClient, peerStatus, logger, }) =>
|
|
|
50
51
|
else {
|
|
51
52
|
setState({ stream: displayStream, trackIds: {} });
|
|
52
53
|
}
|
|
53
|
-
};
|
|
54
|
-
const replaceTracks = async (newVideoTrack, newAudioTrack) => {
|
|
54
|
+
}, [tracksMiddleware, getDisplayName, addTrackToFishjamClient, fishjamClient]);
|
|
55
|
+
const replaceTracks = useCallback(async (newVideoTrack, newAudioTrack) => {
|
|
55
56
|
if (!state?.stream)
|
|
56
57
|
return;
|
|
57
58
|
const addTrackPromises = [];
|
|
@@ -60,12 +61,12 @@ export const useScreenShareManager = ({ fishjamClient, peerStatus, logger, }) =>
|
|
|
60
61
|
if (newAudioTrack && state.trackIds.audioId)
|
|
61
62
|
addTrackPromises.push(fishjamClient.replaceTrack(state.trackIds.audioId, newAudioTrack));
|
|
62
63
|
await Promise.all(addTrackPromises);
|
|
63
|
-
};
|
|
64
|
+
}, [state.stream, state.trackIds?.videoId, state.trackIds?.audioId, fishjamClient]);
|
|
64
65
|
const cleanMiddleware = useCallback(() => {
|
|
65
66
|
cleanMiddlewareFnRef.current?.();
|
|
66
67
|
cleanMiddlewareFnRef.current = null;
|
|
67
68
|
}, []);
|
|
68
|
-
const setTracksMiddleware = async (middleware) => {
|
|
69
|
+
const setTracksMiddleware = useCallback(async (middleware) => {
|
|
69
70
|
if (!state?.stream)
|
|
70
71
|
return;
|
|
71
72
|
const [video, audio] = getTracksFromStream(state.stream);
|
|
@@ -77,7 +78,7 @@ export const useScreenShareManager = ({ fishjamClient, peerStatus, logger, }) =>
|
|
|
77
78
|
};
|
|
78
79
|
cleanMiddlewareFnRef.current = onClear;
|
|
79
80
|
await replaceTracks(videoTrack, audioTrack);
|
|
80
|
-
};
|
|
81
|
+
}, [state.stream, cleanMiddleware, replaceTracks]);
|
|
81
82
|
const stopStreaming = useCallback(async () => {
|
|
82
83
|
if (!state.stream) {
|
|
83
84
|
logger.warn("No stream to stop");
|
|
@@ -96,7 +97,7 @@ export const useScreenShareManager = ({ fishjamClient, peerStatus, logger, }) =>
|
|
|
96
97
|
await Promise.all(removeTrackPromises);
|
|
97
98
|
}
|
|
98
99
|
cleanMiddleware();
|
|
99
|
-
setState((
|
|
100
|
+
setState((prev) => ({ stream: null, trackIds: null, tracksMiddleware: prev.tracksMiddleware }));
|
|
100
101
|
}, [
|
|
101
102
|
state.stream,
|
|
102
103
|
state.trackIds?.videoId,
|
|
@@ -138,7 +139,7 @@ export const useScreenShareManager = ({ fishjamClient, peerStatus, logger, }) =>
|
|
|
138
139
|
videoTrack: mediaVideoTrack,
|
|
139
140
|
audioTrack: mediaAudioTrack,
|
|
140
141
|
setTracksMiddleware,
|
|
141
|
-
currentTracksMiddleware:
|
|
142
|
+
currentTracksMiddleware: tracksMiddleware,
|
|
142
143
|
};
|
|
143
144
|
};
|
|
144
145
|
const getTracksFromStream = (stream) => {
|
|
@@ -24,6 +24,7 @@ export interface UseLivestreamViewerResult {
|
|
|
24
24
|
error: LivestreamError | null;
|
|
25
25
|
/** Utility flag which indicates the current connection status */
|
|
26
26
|
isConnected: boolean;
|
|
27
|
+
getStatistics: () => Promise<RTCStatsReport | undefined>;
|
|
27
28
|
}
|
|
28
29
|
/**
|
|
29
30
|
* Hook for receiving a published livestream.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLivestreamViewer.d.ts","sourceRoot":"","sources":["../../src/hooks/useLivestreamViewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAmD,MAAM,0BAA0B,CAAC;AAM5G,MAAM,MAAM,mBAAmB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAE5G;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,oCAAoC;IACpC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B;;;;OAIG;IACH,OAAO,EAAE,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,6FAA6F;IAC7F,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,+EAA+E;IAC/E,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,iEAAiE;IACjE,WAAW,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useLivestreamViewer.d.ts","sourceRoot":"","sources":["../../src/hooks/useLivestreamViewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAmD,MAAM,0BAA0B,CAAC;AAM5G,MAAM,MAAM,mBAAmB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAE5G;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,oCAAoC;IACpC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B;;;;OAIG;IACH,OAAO,EAAE,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,6FAA6F;IAC7F,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,+EAA+E;IAC/E,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,iEAAiE;IACjE,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,MAAM,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;CAC1D;AAUD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAO,yBAgDtC,CAAC"}
|
|
@@ -18,6 +18,7 @@ export const useLivestreamViewer = () => {
|
|
|
18
18
|
const [error, setError] = useState(null);
|
|
19
19
|
const resultRef = useRef(null);
|
|
20
20
|
const [isConnected, setIsConnected] = useState(false);
|
|
21
|
+
const isConnectedRef = useRef(false);
|
|
21
22
|
const fishjamId = useFishjamId();
|
|
22
23
|
const disconnect = useCallback(() => {
|
|
23
24
|
setStream(null);
|
|
@@ -25,10 +26,13 @@ export const useLivestreamViewer = () => {
|
|
|
25
26
|
resultRef.current = null;
|
|
26
27
|
}, []);
|
|
27
28
|
const onConnectionStateChange = useCallback((pc) => {
|
|
28
|
-
if (
|
|
29
|
+
if (isConnectedRef.current && pc.connectionState !== "connected") {
|
|
29
30
|
disconnect();
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
}
|
|
32
|
+
const connected = pc.connectionState === "connected";
|
|
33
|
+
isConnectedRef.current = connected;
|
|
34
|
+
setIsConnected(connected);
|
|
35
|
+
}, [disconnect]);
|
|
32
36
|
const connect = useCallback(async (config, url) => {
|
|
33
37
|
if (resultRef.current !== null)
|
|
34
38
|
disconnect();
|
|
@@ -46,5 +50,6 @@ export const useLivestreamViewer = () => {
|
|
|
46
50
|
setError(e);
|
|
47
51
|
}
|
|
48
52
|
}, [disconnect, onConnectionStateChange, fishjamId]);
|
|
49
|
-
|
|
53
|
+
const getStatistics = useCallback(async () => resultRef.current?.getStatistics(), []);
|
|
54
|
+
return { stream, connect, disconnect, error, isConnected, getStatistics };
|
|
50
55
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSandbox.d.ts","sourceRoot":"","sources":["../../src/hooks/useSandbox.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useSandbox.d.ts","sourceRoot":"","sources":["../../src/hooks/useSandbox.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,eAAe,GAAG;IAE5B,cAAc,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;AAElE,eAAO,MAAM,UAAU,GAAI,QAAQ,eAAe;oCAQ7B,MAAM,YAAY,MAAM,aAAY,QAAQ;sCAoB5C,MAAM;qCAmBN,MAAM,aAAY,OAAO;uBAQX,MAAM;cAAQ;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE;;CAO5E,CAAC"}
|
package/dist/hooks/useSandbox.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { useCallback } from "react";
|
|
1
2
|
import { useFishjamId } from "../contexts/fishjamId";
|
|
2
3
|
import { resolveFishjamUrl } from "../utils/fishjamUrl";
|
|
3
4
|
export const useSandbox = (props) => {
|
|
4
5
|
const fishjamId = useFishjamId();
|
|
5
6
|
const fishjamUrl = resolveFishjamUrl(fishjamId);
|
|
6
7
|
const sandboxApiUrl = props?.configOverride?.sandboxApiUrl ?? `${fishjamUrl}/room-manager`;
|
|
7
|
-
const getSandboxPeerToken = async (roomName, peerName, roomType = "conference") => {
|
|
8
|
+
const getSandboxPeerToken = useCallback(async (roomName, peerName, roomType = "conference") => {
|
|
8
9
|
const url = new URL(sandboxApiUrl);
|
|
9
10
|
url.searchParams.set("roomName", roomName);
|
|
10
11
|
url.searchParams.set("peerName", peerName);
|
|
@@ -16,8 +17,8 @@ export const useSandbox = (props) => {
|
|
|
16
17
|
}
|
|
17
18
|
const data = await res.json();
|
|
18
19
|
return data.peerToken;
|
|
19
|
-
};
|
|
20
|
-
const getSandboxViewerToken = async (roomName) => {
|
|
20
|
+
}, [sandboxApiUrl]);
|
|
21
|
+
const getSandboxViewerToken = useCallback(async (roomName) => {
|
|
21
22
|
const url = new URL(`${sandboxApiUrl}/${roomName}/livestream-viewer-token`);
|
|
22
23
|
const res = await fetch(url);
|
|
23
24
|
if (!res.ok) {
|
|
@@ -29,8 +30,8 @@ export const useSandbox = (props) => {
|
|
|
29
30
|
}
|
|
30
31
|
const data = await res.json();
|
|
31
32
|
return data.token;
|
|
32
|
-
};
|
|
33
|
-
const getSandboxLivestream = async (roomName, isPublic = false) => {
|
|
33
|
+
}, [sandboxApiUrl]);
|
|
34
|
+
const getSandboxLivestream = useCallback(async (roomName, isPublic = false) => {
|
|
34
35
|
const url = new URL(`${sandboxApiUrl}/livestream`);
|
|
35
36
|
url.searchParams.set("roomName", roomName);
|
|
36
37
|
url.searchParams.set("public", isPublic.toString());
|
|
@@ -39,6 +40,6 @@ export const useSandbox = (props) => {
|
|
|
39
40
|
throw new Error(`Failed to retrieve streamer token for '${roomName}' livestream room.`);
|
|
40
41
|
const data = await res.json();
|
|
41
42
|
return data;
|
|
42
|
-
};
|
|
43
|
+
}, [sandboxApiUrl]);
|
|
43
44
|
return { getSandboxPeerToken, getSandboxViewerToken, getSandboxLivestream };
|
|
44
45
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useStatistics.d.ts","sourceRoot":"","sources":["../../src/hooks/useStatistics.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa;;
|
|
1
|
+
{"version":3,"file":"useStatistics.d.ts","sourceRoot":"","sources":["../../src/hooks/useStatistics.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa;;CAYzB,CAAC"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { useContext } from "react";
|
|
1
|
+
import { useCallback, useContext } from "react";
|
|
2
2
|
import { FishjamClientContext } from "../contexts/fishjamClient";
|
|
3
3
|
export const useStatistics = () => {
|
|
4
4
|
const client = useContext(FishjamClientContext);
|
|
5
5
|
if (!client)
|
|
6
6
|
throw new Error("useStatistics must be used within a FishjamProvider");
|
|
7
|
+
const getStatistics = useCallback(() => client.current.getStatistics(), [client]);
|
|
7
8
|
return {
|
|
8
9
|
/*
|
|
9
10
|
* Returns a low level RTCStatsReport statistics object about the connection.
|
|
10
11
|
*/
|
|
11
|
-
getStatistics
|
|
12
|
+
getStatistics,
|
|
12
13
|
};
|
|
13
14
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,eAAO,MAAM,iBAAiB,EAAE,WAAyC,CAAC;AAC1E,eAAO,MAAM,qBAAqB,EAAE,WAA8C,CAAC;AACnF,eAAO,MAAM,eAAe,EAAE,WAAuC,CAAC;AACtE,eAAO,MAAM,eAAe,EAAE,WAAyC,CAAC;AAIxE,eAAO,MAAM,mBAAmB,GAAI,OAAO,OAAO,EAAE,QAAQ,UAAU,CAAC,OAAO,SAAS,CAAC,KAAG,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,eAAO,MAAM,iBAAiB,EAAE,WAAyC,CAAC;AAC1E,eAAO,MAAM,qBAAqB,EAAE,WAA8C,CAAC;AACnF,eAAO,MAAM,eAAe,EAAE,WAAuC,CAAC;AACtE,eAAO,MAAM,eAAe,EAAE,WAAyC,CAAC;AAIxE,eAAO,MAAM,mBAAmB,GAAI,OAAO,OAAO,EAAE,QAAQ,UAAU,CAAC,OAAO,SAAS,CAAC,KAAG,WAa1F,CAAC"}
|
package/dist/utils/errors.js
CHANGED
|
@@ -5,18 +5,16 @@ export const UNHANDLED_ERROR = { name: "UNHANDLED_ERROR" };
|
|
|
5
5
|
// https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia#exceptions
|
|
6
6
|
// OverconstrainedError has higher priority than NotAllowedError
|
|
7
7
|
export const parseUserMediaError = (error, logger) => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
const name = error instanceof Error ? error.name : "";
|
|
9
|
+
switch (name) {
|
|
10
|
+
case "NotAllowedError":
|
|
11
|
+
return PERMISSION_DENIED;
|
|
12
|
+
case "OverconstrainedError":
|
|
13
|
+
return OVERCONSTRAINED_ERROR;
|
|
14
|
+
case "NotFoundError":
|
|
15
|
+
return NOT_FOUND_ERROR;
|
|
16
|
+
default:
|
|
17
|
+
logger.warn({ name: "Unhandled getUserMedia error", error });
|
|
18
|
+
return UNHANDLED_ERROR;
|
|
11
19
|
}
|
|
12
|
-
if (error.name === "NotAllowedError") {
|
|
13
|
-
return PERMISSION_DENIED;
|
|
14
|
-
}
|
|
15
|
-
else if (error.name === "OverconstrainedError") {
|
|
16
|
-
return OVERCONSTRAINED_ERROR;
|
|
17
|
-
}
|
|
18
|
-
else if (error.name === "NotFoundError") {
|
|
19
|
-
return NOT_FOUND_ERROR;
|
|
20
|
-
}
|
|
21
|
-
return UNHANDLED_ERROR;
|
|
22
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fishjamUrl.d.ts","sourceRoot":"","sources":["../../src/utils/fishjamUrl.ts"],"names":[],"mappings":"AAAA,KAAK,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtC,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"fishjamUrl.d.ts","sourceRoot":"","sources":["../../src/utils/fishjamUrl.ts"],"names":[],"mappings":"AAAA,KAAK,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtC,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAOpE;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,CAMlF;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhE"}
|
package/dist/utils/fishjamUrl.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
export function resolveFishjamUrl(fishjamId) {
|
|
2
|
-
|
|
2
|
+
if (/^https?:\/\//.test(fishjamId)) {
|
|
3
3
|
return new URL(fishjamId).href;
|
|
4
4
|
}
|
|
5
|
-
|
|
6
|
-
return `https://fishjam.io/api/v1/connect/${fishjamId}`;
|
|
7
|
-
}
|
|
5
|
+
return `https://fishjam.io/api/v1/connect/${fishjamId}`;
|
|
8
6
|
}
|
|
9
7
|
export function httpToWebsocketUrl(url) {
|
|
10
8
|
return url.replace("https://", "wss://").replace("http://", "ws://");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fishjam-cloud/react-client",
|
|
3
|
-
"version": "0.25.
|
|
3
|
+
"version": "0.25.2",
|
|
4
4
|
"description": "React client library for Fishjam",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Fishjam Team",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"vitest": "^3.1.1"
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@fishjam-cloud/ts-client": "
|
|
65
|
+
"@fishjam-cloud/ts-client": "workspace:*",
|
|
66
66
|
"events": "3.3.0",
|
|
67
67
|
"lodash.isequal": "4.5.0"
|
|
68
68
|
},
|
|
@@ -78,4 +78,4 @@
|
|
|
78
78
|
"yarn lint"
|
|
79
79
|
]
|
|
80
80
|
}
|
|
81
|
-
}
|
|
81
|
+
}
|