@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';
@@ -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,GACf,MAAM,oCAAoC,CAAC;AAE5C,YAAY,EACV,aAAa,EACb,aAAa,EACb,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;AAE/G,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"}
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.28.3",
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.28.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.28.3",
53
- "@fishjam-cloud/react-native-webrtc": "0.28.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"