
Research
Supply Chain Attack on Axios Pulls Malicious Dependency from npm
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.
react-native-meet-up
Advanced tools
React native wrapper for Jitsi Meet SDK
npm install react-native-meet-up --save
If you are using React-Native < 0.60, you should use a version < 2.0.0.
For versions higher than 2.0.0, you need to add the following piece of code in your metro.config.js file to avoid conflicts between react-native-meet-up and react-native in metro bundler.
const blacklist = require('metro-config/src/defaults/blacklist');
module.exports = {
resolver: {
blacklistRE: blacklist([
/ios\/Pods\/JitsiMeetSDK\/Frameworks\/JitsiMeet.framework\/assets\/node_modules\/react-native\/.*/,
]),
},
};
Although most of the process is automated, you still have to follow the platform install guide below (iOS and Android) to get this library to work.
The following component is an example of use:
import React, { useEffect } from 'react';
import { View } from 'react-native';
import JitsiMeet, { JitsiMeetView } from 'react-native-meet-up';
const VideoCall = () => {
const onConferenceTerminated = (nativeEvent) => {
/* Conference terminated event */
}
const onConferenceJoined = (nativeEvent) => {
/* Conference joined event */
}
const onConferenceWillJoin= (nativeEvent) => {
/* Conference will join event */
}
useEffect(() => {
setTimeout(() => {
const url = 'https://meet.jit.si/deneme'; // can also be only room name and will connect to jitsi meet servers
const userInfo = { displayName: 'User', email: 'user@example.com', avatar: 'https:/gravatar.com/avatar/abc123' };
JitsiMeet.call(url, userInfo);
/* You can also use JitsiMeet.audioCall(url) for audio only call */
/* You can programmatically end the call with JitsiMeet.endCall() */
}, 1000);
}, [])
return (
<View style={{ backgroundColor: 'black', flex: 1 }}>
<JitsiMeetView onConferenceTerminated={onConferenceTerminated} onConferenceJoined={onConferenceJoined} onConferenceWillJoin={onConferenceWillJoin} style={{ flex: 1, height: '100%', width: '100%' }} />
</View>
)
}
export default VideoCall;
You can also check the ExampleApp
You can add listeners for the following events:
In your component,
1.) import JitsiMeet and JitsiMeetEvents: import JitsiMeet, { JitsiMeetEvents } from 'react-native-meet-up';
2.) add the following code:
const initiateVideoCall = () => {
JitsiMeet.initialize();
JitsiMeetEvents.addListener('CONFERENCE_LEFT', (data) => {
console.log('CONFERENCE_LEFT');
});
setTimeout(() => {
JitsiMeet.call(`<your url>`);
}, 1000);
};
You can add listeners for the following events:
1.) navigate to <ProjectFolder>/ios/<ProjectName>/
2.) edit Info.plist and add the following lines
<key>NSCameraUsageDescription</key>
<string>Camera Permission</string>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone Permission</string>
3.) in Info.plist, make sure that
<key>UIBackgroundModes</key>
<array>
</array>
contains <string>voip</string>
1.) Modify your Podfile to have platform :ios, '10.0' and execute pod install
2.) In Xcode, under Build setting set Enable Bitcode to No
Libraries ➜ Add Files to [project]node_modules/react-native-meet-up/ios/RNJitsiMeet.xcodeproj then Addnode_modules/react-native-meet-up/ios/WebRTC.framework and node_modules/react-native-meet-up/ios/JitsiMeet.framework to the Frameworks foldernode_modules/react-native-meet-up/ios/JitsiMeet.storyboard in the same folder as AppDelegate.m UIViewController *rootViewController = [UIViewController new];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
with this one
UIViewController *rootViewController = [UIViewController new];
UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:rootViewController];
navigationController.navigationBarHidden = YES;
rootViewController.view = rootView;
self.window.rootViewController = navigationController;
This will create a navigation controller to be able to navigate between the Jitsi component and your react native screens.
2-1.) select Build Settings, find Search Paths
2-2.) edit BOTH Framework Search Paths and Library Search Paths
2-3.) add path on BOTH sections with: $(SRCROOT)/../node_modules/react-native-meet-up/ios with recursive
3-1.) go to General tab
3-2.) change Deployment Target to 8.0
3-3.) add WebRTC.framework and JitsiMeet.framework in Embedded Binaries
Build Phases tab, open Link Binary With LibrarieslibRNJitsiMeet.aWebRTC.framework and JitsiMeet.framework linkedAVFoundation.framework
AudioToolbox.framework
CoreGraphics.framework
GLKit.framework
CoreAudio.framework
CoreVideo.framework
VideoToolbox.framework
libc.tbd
libsqlite3.tbd
libstdc++.tbd
libc++.tbd
Build setting set Dead Code Stripping to No, set Enable Bitcode to No and Always Embed Swift Standard Libraries to Yesecho "Target architectures: $ARCHS"
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")
FRAMEWORK_TMP_PATH="$FRAMEWORK_EXECUTABLE_PATH-tmp"
# remove simulator's archs if location is not simulator's directory
case "${TARGET_BUILD_DIR}" in
*"iphonesimulator")
echo "No need to remove archs"
;;
*)
if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "i386") ; then
lipo -output "$FRAMEWORK_TMP_PATH" -remove "i386" "$FRAMEWORK_EXECUTABLE_PATH"
echo "i386 architecture removed"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
fi
if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "x86_64") ; then
lipo -output "$FRAMEWORK_TMP_PATH" -remove "x86_64" "$FRAMEWORK_EXECUTABLE_PATH"
echo "x86_64 architecture removed"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
fi
;;
esac
echo "Completed for executable $FRAMEWORK_EXECUTABLE_PATH"
echo $
done
This will run a script everytime you build to clean the unwanted architecture
1.) In android/app/build.gradle, add/replace the following lines:
project.ext.react = [
entryFile: "index.js",
bundleAssetName: "app.bundle",
]
2.) In android/app/src/main/java/com/xxx/MainApplication.java add/replace the following methods:
import androidx.annotation.Nullable; // <--- Add this line if not already existing
...
@Override
protected String getJSMainModuleName() {
return "index";
}
@Override
protected @Nullable String getBundleAssetName() {
return "app.bundle";
}
3.) In android/build.gradle, add the following code
allprojects {
repositories {
mavenLocal()
jcenter()
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url "$rootDir/../node_modules/react-native/android"
}
maven {
url "https://maven.google.com"
}
maven { // <---- Add this block
url "https://github.com/jitsi/jitsi-maven-repository/raw/master/releases"
}
maven { url "https://jitpack.io" }
}
}
1.) In android/app/src/main/AndroidManifest.xml add these permissions
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" // <--- Add this line if not already existing
...
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<permission android:name="${applicationId}.permission.JITSI_BROADCAST"
android:label="Jitsi Meet Event Broadcast"
android:protectionLevel="normal"></permission>
<uses-permission android:name="${applicationId}.permission.JITSI_BROADCAST"/>
2.) In the <application> section of android/app/src/main/AndroidManifest.xml, add
<activity android:name="com.reactnativejitsimeet.JitsiMeetNavigatorActivity" />
3.) In android/settings.gradle, include react-native-meet-up module
include ':react-native-meet-up'
project(':react-native-meet-up').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-meet-up/android')
4.) In android/app/build.gradle, add react-native-meet-up to dependencies
android {
...
packagingOptions {
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86/libjsc.so'
pickFirst 'lib/x86_64/libjsc.so'
pickFirst 'lib/arm64-v8a/libjsc.so'
pickFirst 'lib/arm64-v8a/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libjsc.so'
}
}
dependencies {
...
implementation(project(':react-native-meet-up'))
}
and set your minSdkVersion to be at least 24.
5.) In android/app/src/main/java/com/xxx/MainApplication.java
import com.reactnativejitsimeet.RNJitsiMeetPackage; // <--- Add this line
import android.support.annotation.Nullable; // <--- Add this line if not already existing
...
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new RNJitsiMeetPackage() // <--- Add this line
);
}
If your app already includes react-native-locale-detector or react-native-vector-icons, you must exclude them from the react-native-meet-up project implementation with the following code (even if you're app uses autolinking with RN > 0.60):
implementation(project(':react-native-meet-up')) {
exclude group: 'com.facebook.react',module:'react-native-locale-detector'
exclude group: 'com.facebook.react',module:'react-native-vector-icons'
// Un-comment below if using hermes
//exclude group: 'com.facebook',module:'hermes'
// Un-comment any packages below that you have added to your project to prevent `duplicate_classes` errors
//exclude group: 'com.facebook.react',module:'react-native-community-async-storage'
//exclude group: 'com.facebook.react',module:'react-native-community_netinfo'
//exclude group: 'com.facebook.react',module:'react-native-svg'
//exclude group: 'com.facebook.react',module:'react-native-fetch-blob'
//exclude group: 'com.facebook.react',module:'react-native-webview'
//exclude group: 'com.facebook.react',module:'react-native-linear-gradient'
//exclude group: 'com.facebook.react',module:'react-native-sound'
}
FAQs
Jitsi Meet SDK wrapper for React Native.
We found that react-native-meet-up demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.

Security News
TeamPCP is partnering with ransomware group Vect to turn open source supply chain attacks on tools like Trivy and LiteLLM into large-scale ransomware operations.