@fishjam-cloud/react-native-client 0.28.3 → 0.29.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.
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { type CustomAudioTrack } from '@fishjam-cloud/react-native-webrtc';
|
|
2
|
+
/**
|
|
3
|
+
* Settings for {@link useCustomAudioSource}, fixed for the lifetime of a
|
|
4
|
+
* streaming session (a `startStreaming`/`stopStreaming` pair).
|
|
5
|
+
*/
|
|
6
|
+
export interface UseCustomAudioSourceOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Stable id identifying this custom source. Defaults to
|
|
9
|
+
* `"customAudioSource"`. Every hook instance that streams at the same time
|
|
10
|
+
* needs its own id — two instances sharing one silently replace each
|
|
11
|
+
* other's published track.
|
|
12
|
+
*/
|
|
13
|
+
sourceId?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Sample rate of the PCM you will push, in hertz. Must be a positive
|
|
16
|
+
* multiple of `100`. Push whatever your source produces natively — it is
|
|
17
|
+
* resampled downstream. Defaults to `48000`.
|
|
18
|
+
*/
|
|
19
|
+
sampleRateHz?: number;
|
|
20
|
+
/**
|
|
21
|
+
* `1` for mono or `2` for interleaved stereo. Defaults to `1`.
|
|
22
|
+
*/
|
|
23
|
+
channelCount?: 1 | 2;
|
|
24
|
+
/**
|
|
25
|
+
* How much pushed-but-not-yet-sent audio to hold, in milliseconds, before
|
|
26
|
+
* the oldest is dropped. The buffer drains in real time, so this is the
|
|
27
|
+
* furthest you can push ahead — for example a long text-to-speech utterance
|
|
28
|
+
* handed over in one call. Must be at least `10`. Defaults to `60000` (one
|
|
29
|
+
* minute).
|
|
30
|
+
*/
|
|
31
|
+
maxBufferedDurationMs?: number;
|
|
32
|
+
}
|
|
33
|
+
export interface UseCustomAudioSourceResult {
|
|
34
|
+
/** Whether the custom audio track is currently published. */
|
|
35
|
+
isStreaming: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Push handle for the published track; `null` until streaming starts. Hand
|
|
38
|
+
* it to `pushAudioSamples` whenever your source produces audio. The handle
|
|
39
|
+
* is plain and worklet-serializable, so it can be shared into a worklet and
|
|
40
|
+
* pushed from there directly — no thread hop.
|
|
41
|
+
*/
|
|
42
|
+
track: CustomAudioTrack | null;
|
|
43
|
+
/**
|
|
44
|
+
* Create the custom audio track and publish it. Once this resolves the
|
|
45
|
+
* track is registered — pushed samples are streamed to the room right away
|
|
46
|
+
* when the peer is connected, or automatically once it connects. No-op when
|
|
47
|
+
* already streaming.
|
|
48
|
+
*/
|
|
49
|
+
startStreaming: () => Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Unpublish and release the custom audio track. No-op when not streaming.
|
|
52
|
+
*/
|
|
53
|
+
stopStreaming: () => Promise<void>;
|
|
54
|
+
/** The error that failed the last `startStreaming` or `stopStreaming` call, if any. */
|
|
55
|
+
error: Error | null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Publish your own audio to Fishjam.
|
|
59
|
+
*
|
|
60
|
+
* Creates a custom audio track, publishes it, and cleans it up — you supply
|
|
61
|
+
* the PCM from any source (a synthesizer, a decoder, an audio pipeline) via
|
|
62
|
+
* `pushAudioSamples`. The published track behaves like a live microphone:
|
|
63
|
+
* pauses in pushing are fine and play as silence. It is independent of
|
|
64
|
+
* {@link useMicrophone} and does not involve the device microphone in any way —
|
|
65
|
+
* publishing it does not trigger the recording permission.
|
|
66
|
+
*
|
|
67
|
+
* Remote peers receive the track with metadata type `"customAudio"`
|
|
68
|
+
* (`usePeers` exposes it under `customAudioTracks`).
|
|
69
|
+
*
|
|
70
|
+
* Push PCM with `pushAudioSamples` (from `@fishjam-cloud/react-native-client`)
|
|
71
|
+
* and the returned {@link UseCustomAudioSourceResult.track | track} handle —
|
|
72
|
+
* from the JS thread or from inside a worklet, with any chunk size. The track
|
|
73
|
+
* re-paces pushes into a continuous stream, filling gaps with silence like a
|
|
74
|
+
* live microphone. `Float32Array` samples are expected in `[-1, 1]`;
|
|
75
|
+
* `Int16Array` is taken as-is.
|
|
76
|
+
*
|
|
77
|
+
* ```tsx
|
|
78
|
+
* const { startStreaming, stopStreaming, track } = useCustomAudioSource();
|
|
79
|
+
*
|
|
80
|
+
* // e.g. from react-native-audio-api's AudioRecorder:
|
|
81
|
+
* recorder.onAudioReady({ sampleRate: 48000, bufferLength: 4800, channelCount: 1 },
|
|
82
|
+
* ({ buffer }) => track && pushAudioSamples(track, buffer.getChannelData(0)));
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* Requires the New Architecture; `startStreaming` reports an error on the old
|
|
86
|
+
* architecture.
|
|
87
|
+
*
|
|
88
|
+
* @group Hooks
|
|
89
|
+
*/
|
|
90
|
+
export declare function useCustomAudioSource(options?: UseCustomAudioSourceOptions): UseCustomAudioSourceResult;
|
|
91
|
+
//# sourceMappingURL=useCustomAudioSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCustomAudioSource.d.ts","sourceRoot":"","sources":["../../src/hooks/useCustomAudioSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EAGtB,MAAM,oCAAoC,CAAC;AAU5C;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACrB;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,0BAA0B;IACzC,6DAA6D;IAC7D,WAAW,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B;;;;;OAKG;IACH,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC;;OAEG;IACH,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,uFAAuF;IACvF,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAyBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,0BAA0B,CAyGtG"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { createCustomAudioTrack, } from '@fishjam-cloud/react-native-webrtc';
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { useCustomSource } from '../overrides/hooks';
|
|
4
|
+
const DEFAULT_SOURCE_ID = 'customAudioSource';
|
|
5
|
+
const DEFAULT_SAMPLE_RATE_HZ = 48000;
|
|
6
|
+
const DEFAULT_CHANNEL_COUNT = 1;
|
|
7
|
+
const DEFAULT_MAX_BUFFERED_DURATION_MS = 60_000;
|
|
8
|
+
function stopStreamTracks(stream) {
|
|
9
|
+
try {
|
|
10
|
+
stream.getTracks().forEach((track) => track.stop());
|
|
11
|
+
}
|
|
12
|
+
catch (cause) {
|
|
13
|
+
console.warn('useCustomAudioSource: stopping tracks failed', cause);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function toError(cause) {
|
|
17
|
+
return cause instanceof Error ? cause : new Error(String(cause));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Publish your own audio to Fishjam.
|
|
21
|
+
*
|
|
22
|
+
* Creates a custom audio track, publishes it, and cleans it up — you supply
|
|
23
|
+
* the PCM from any source (a synthesizer, a decoder, an audio pipeline) via
|
|
24
|
+
* `pushAudioSamples`. The published track behaves like a live microphone:
|
|
25
|
+
* pauses in pushing are fine and play as silence. It is independent of
|
|
26
|
+
* {@link useMicrophone} and does not involve the device microphone in any way —
|
|
27
|
+
* publishing it does not trigger the recording permission.
|
|
28
|
+
*
|
|
29
|
+
* Remote peers receive the track with metadata type `"customAudio"`
|
|
30
|
+
* (`usePeers` exposes it under `customAudioTracks`).
|
|
31
|
+
*
|
|
32
|
+
* Push PCM with `pushAudioSamples` (from `@fishjam-cloud/react-native-client`)
|
|
33
|
+
* and the returned {@link UseCustomAudioSourceResult.track | track} handle —
|
|
34
|
+
* from the JS thread or from inside a worklet, with any chunk size. The track
|
|
35
|
+
* re-paces pushes into a continuous stream, filling gaps with silence like a
|
|
36
|
+
* live microphone. `Float32Array` samples are expected in `[-1, 1]`;
|
|
37
|
+
* `Int16Array` is taken as-is.
|
|
38
|
+
*
|
|
39
|
+
* ```tsx
|
|
40
|
+
* const { startStreaming, stopStreaming, track } = useCustomAudioSource();
|
|
41
|
+
*
|
|
42
|
+
* // e.g. from react-native-audio-api's AudioRecorder:
|
|
43
|
+
* recorder.onAudioReady({ sampleRate: 48000, bufferLength: 4800, channelCount: 1 },
|
|
44
|
+
* ({ buffer }) => track && pushAudioSamples(track, buffer.getChannelData(0)));
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* Requires the New Architecture; `startStreaming` reports an error on the old
|
|
48
|
+
* architecture.
|
|
49
|
+
*
|
|
50
|
+
* @group Hooks
|
|
51
|
+
*/
|
|
52
|
+
export function useCustomAudioSource(options) {
|
|
53
|
+
const sourceId = options?.sourceId ?? DEFAULT_SOURCE_ID;
|
|
54
|
+
const sampleRateHz = options?.sampleRateHz ?? DEFAULT_SAMPLE_RATE_HZ;
|
|
55
|
+
const channelCount = options?.channelCount ?? DEFAULT_CHANNEL_COUNT;
|
|
56
|
+
const maxBufferedDurationMs = options?.maxBufferedDurationMs ?? DEFAULT_MAX_BUFFERED_DURATION_MS;
|
|
57
|
+
const { setStream } = useCustomSource(sourceId);
|
|
58
|
+
// Read through a ref so startStreaming picks up the latest setStream without
|
|
59
|
+
// retriggering its memoization when the provider re-renders. Each session
|
|
60
|
+
// captures the function it started with, so stop/unmount tear down the
|
|
61
|
+
// sourceId that was actually published even if the option changed since.
|
|
62
|
+
const setStreamRef = useRef(setStream);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
setStreamRef.current = setStream;
|
|
65
|
+
});
|
|
66
|
+
const sessionRef = useRef(null);
|
|
67
|
+
const [track, setTrack] = useState(null);
|
|
68
|
+
const [error, setError] = useState(null);
|
|
69
|
+
const startStreaming = useCallback(async () => {
|
|
70
|
+
if (sessionRef.current) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const session = { created: null, cancelled: false, setStream: setStreamRef.current };
|
|
74
|
+
sessionRef.current = session;
|
|
75
|
+
setError(null);
|
|
76
|
+
try {
|
|
77
|
+
const created = await createCustomAudioTrack({
|
|
78
|
+
sampleRateHz,
|
|
79
|
+
channelCount,
|
|
80
|
+
maxBufferedDurationMs,
|
|
81
|
+
});
|
|
82
|
+
if (session.cancelled) {
|
|
83
|
+
// Stopped (or unmounted) while creating — discard the just-built track.
|
|
84
|
+
stopStreamTracks(created.stream);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
session.created = created;
|
|
88
|
+
await session.setStream(created.stream);
|
|
89
|
+
if (session.cancelled) {
|
|
90
|
+
// stopStreaming already unpublished and released the track.
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
setTrack(created.track);
|
|
94
|
+
}
|
|
95
|
+
catch (cause) {
|
|
96
|
+
if (session.created) {
|
|
97
|
+
stopStreamTracks(session.created.stream);
|
|
98
|
+
}
|
|
99
|
+
if (!session.cancelled) {
|
|
100
|
+
sessionRef.current = null;
|
|
101
|
+
setError(toError(cause));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}, [sampleRateHz, channelCount, maxBufferedDurationMs]);
|
|
105
|
+
const stopStreaming = useCallback(async () => {
|
|
106
|
+
const session = sessionRef.current;
|
|
107
|
+
if (!session) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
session.cancelled = true;
|
|
111
|
+
sessionRef.current = null;
|
|
112
|
+
setTrack(null);
|
|
113
|
+
if (session.created) {
|
|
114
|
+
try {
|
|
115
|
+
await session.setStream(null);
|
|
116
|
+
}
|
|
117
|
+
catch (cause) {
|
|
118
|
+
setError(toError(cause));
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
stopStreamTracks(session.created.stream);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}, []);
|
|
125
|
+
useEffect(() => () => {
|
|
126
|
+
const session = sessionRef.current;
|
|
127
|
+
if (!session) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
session.cancelled = true;
|
|
131
|
+
sessionRef.current = null;
|
|
132
|
+
const created = session.created;
|
|
133
|
+
if (created) {
|
|
134
|
+
// Unpublish before stopping the tracks, so a publish call still queued
|
|
135
|
+
// behind other custom sources never runs on an already-stopped track.
|
|
136
|
+
// Failures are ignored — the provider may be unmounting too and there
|
|
137
|
+
// is no surface left to report to.
|
|
138
|
+
session
|
|
139
|
+
.setStream(null)
|
|
140
|
+
.catch(() => { })
|
|
141
|
+
.finally(() => stopStreamTracks(created.stream));
|
|
142
|
+
}
|
|
143
|
+
}, []);
|
|
144
|
+
return {
|
|
145
|
+
isStreaming: track !== null,
|
|
146
|
+
track,
|
|
147
|
+
startStreaming,
|
|
148
|
+
stopStreaming,
|
|
149
|
+
error,
|
|
150
|
+
};
|
|
151
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,10 +7,11 @@ import './webrtc-polyfill';
|
|
|
7
7
|
import React from 'react';
|
|
8
8
|
import { type FishjamProviderProps as ReactClientFishjamProviderProps } from '@fishjam-cloud/react-client';
|
|
9
9
|
export { RTCView, RTCPIPView, type RTCVideoViewProps, type RTCPIPViewProps } from './overrides/RTCView';
|
|
10
|
-
export { ScreenCapturePickerView, startPIP, stopPIP, AudioDeviceType, useAudioOutput, } from '@fishjam-cloud/react-native-webrtc';
|
|
11
|
-
export type { CallKitAction, CallKitConfig, MediaStream, MediaStreamTrack, AudioDevice, AudioOutputChangedInfo, UseAudioOutputResult, } from '@fishjam-cloud/react-native-webrtc';
|
|
10
|
+
export { ScreenCapturePickerView, startPIP, stopPIP, AudioDeviceType, useAudioOutput, pushAudioSamples, } from '@fishjam-cloud/react-native-webrtc';
|
|
11
|
+
export type { CallKitAction, CallKitConfig, CustomAudioSink, CustomAudioTrack, MediaStream, MediaStreamTrack, AudioDevice, AudioOutputChangedInfo, UseAudioOutputResult, } from '@fishjam-cloud/react-native-webrtc';
|
|
12
12
|
export { useForegroundService, type ForegroundServiceConfig } from './useForegroundService';
|
|
13
13
|
export { useCameraPermissions, useMicrophonePermissions, type PermissionStatus } from './hooks/usePermissions';
|
|
14
|
+
export { useCustomAudioSource, type UseCustomAudioSourceOptions, type UseCustomAudioSourceResult, } from './hooks/useCustomAudioSource';
|
|
14
15
|
export { InitializeDevicesSettings, useConnection, useDataChannel, useSandbox, useUpdatePeerMetadata, useVAD, Variant, } from '@fishjam-cloud/react-client';
|
|
15
16
|
export { useCamera, useInitializeDevices, useMicrophone, useScreenShare, useCustomSource, useLivestreamStreamer, useLivestreamViewer, usePeers, useCallKit, useCallKitEvent, useCallKitService, } from './overrides/hooks';
|
|
16
17
|
export type { StreamerInputs, ConnectStreamerConfig, UseLivestreamStreamerResult, UseLivestreamViewerResult, UseCameraResult, UseMicrophoneResult, UseScreenShareResult, UseCustomSourceResult, UseInitializeDevicesReturn, Track, RemoteTrack, CustomSource, InitializeDevicesResult, PeerWithTracks, TrackFields, MiddlewareResult, TrackMiddleware, TracksMiddleware, TracksMiddlewareResult, } from './overrides/types';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,mBAAmB,CAAC;AAC3B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,KAAK,oBAAoB,IAAI,+BAA+B,EAC7D,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACxG,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,OAAO,EACP,eAAe,EACf,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,mBAAmB,CAAC;AAC3B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,KAAK,oBAAoB,IAAI,+BAA+B,EAC7D,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACxG,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,OAAO,EACP,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,oCAAoC,CAAC;AAE5C,YAAY,EACV,aAAa,EACb,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,oBAAoB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC5F,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/G,OAAO,EACL,oBAAoB,EACpB,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,GAChC,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,yBAAyB,EACzB,aAAa,EACb,cAAc,EACd,UAAU,EACV,qBAAqB,EACrB,MAAM,EACN,OAAO,GACR,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,QAAQ,EACR,UAAU,EACV,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,2BAA2B,EAC3B,yBAAyB,EACzB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,EAC1B,KAAK,EACL,WAAW,EACX,YAAY,EACZ,uBAAuB,EACvB,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,0BAA0B,EAC1B,cAAc,EACd,mBAAmB,EACnB,QAAQ,EACR,eAAe,EACf,eAAe,EACf,KAAK,EACL,WAAW,EACX,UAAU,EACV,uBAAuB,EACvB,MAAM,EACN,UAAU,EACV,yBAAyB,EACzB,wBAAwB,EACxB,YAAY,EACZ,OAAO,EACP,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAGrC,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,+BAA+B,EAAE,mBAAmB,GAAG,eAAe,CAAC,CAAC;AAChH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,mEAO1D"}
|
package/dist/index.js
CHANGED
|
@@ -13,9 +13,10 @@ import React from 'react';
|
|
|
13
13
|
import { FishjamProvider as ReactClientFishjamProvider, } from '@fishjam-cloud/react-client';
|
|
14
14
|
import { FishjamClient } from '@fishjam-cloud/ts-client';
|
|
15
15
|
export { RTCView, RTCPIPView } from './overrides/RTCView';
|
|
16
|
-
export { ScreenCapturePickerView, startPIP, stopPIP, AudioDeviceType, useAudioOutput, } from '@fishjam-cloud/react-native-webrtc';
|
|
16
|
+
export { ScreenCapturePickerView, startPIP, stopPIP, AudioDeviceType, useAudioOutput, pushAudioSamples, } from '@fishjam-cloud/react-native-webrtc';
|
|
17
17
|
export { useForegroundService } from './useForegroundService';
|
|
18
18
|
export { useCameraPermissions, useMicrophonePermissions } from './hooks/usePermissions';
|
|
19
|
+
export { useCustomAudioSource, } from './hooks/useCustomAudioSource';
|
|
19
20
|
export { useConnection, useDataChannel, useSandbox, useUpdatePeerMetadata, useVAD, Variant, } from '@fishjam-cloud/react-client';
|
|
20
21
|
export { useCamera, useInitializeDevices, useMicrophone, useScreenShare, useCustomSource, useLivestreamStreamer, useLivestreamViewer, usePeers, useCallKit, useCallKitEvent, useCallKitService, } from './overrides/hooks';
|
|
21
22
|
export function FishjamProvider(props) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fishjam-cloud/react-native-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.0",
|
|
4
4
|
"description": "React Native client library for Fishjam",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Fishjam Team",
|
|
@@ -42,15 +42,15 @@
|
|
|
42
42
|
]
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
|
-
"@fishjam-cloud/react-native-webrtc": "0.
|
|
45
|
+
"@fishjam-cloud/react-native-webrtc": "0.29.0",
|
|
46
46
|
"expo": "*",
|
|
47
47
|
"react": "*",
|
|
48
48
|
"react-native": "*",
|
|
49
49
|
"react-native-get-random-values": "1.11.0"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@fishjam-cloud/react-client": "0.
|
|
53
|
-
"@fishjam-cloud/react-native-webrtc": "0.
|
|
52
|
+
"@fishjam-cloud/react-client": "0.29.0",
|
|
53
|
+
"@fishjam-cloud/react-native-webrtc": "0.29.0",
|
|
54
54
|
"fast-text-encoding": "1.0.6",
|
|
55
55
|
"react-native-get-random-values": "1.11.0",
|
|
56
56
|
"react-native-url-polyfill": "3.0.0"
|