Skip to content

swarm-cloud/datachannel-native

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

40 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DataChannel Native

Native platform (Android/iOS/tvOS/macOS) wrapper for paullouisageneau/libdatachannel: C/C++ WebRTC network library.

Android

Add dependency

TODO

Minimum example

import com.cdnbye.libdc.DataChannel
import com.cdnbye.libdc.DcMessageCallback
import com.cdnbye.libdc.LibDC
import com.cdnbye.libdc.LogLevel.DEBUG
import com.cdnbye.libdc.PeerConnection
import com.cdnbye.libdc.createDataChannel
import com.cdnbye.libdc.rtcConfiguration

// inject custom logger
PeerConnection.initLogger(DEBUG) { level, message ->
    // log the message
}

// create config and pc
val config = rtcConfiguration()
val pc1 = PeerConnection.create(config)
val pc2 = PeerConnection.create(config)

// observe local sdp, and set as remote sdp in other pc
pc1?.onLocalDescription {
    pc2?.setRemoteDescription(it)
}
pc2?.onLocalDescription {
    pc1?.setRemoteDescription(it)
}

// observe ICE candidate, and add to other pc
pc1?.onLocalCandidate { candidate, mid ->
    pc2?.addRemoteCandidate(candidate, mid)
}
pc2?.onLocalCandidate { candidate, mid ->
    pc1?.addRemoteCandidate(candidate, mid)
}

// observe ICE connection state
pc1?.onStateChange {
    // xxx
}
pc2?.onStateChange {
    // xxx
}

// observe ICE candidate gathering state
pc1?.onGatheringStateChange {
    // xxx
}
pc2?.onGatheringStateChange {
    // xxx
}

// observe incoming dc
pc2?.onDataChannel {
    // observe dc message
    it?.onMessage(object : DcMessageCallback {
        override fun onText(msg: String) {
            // xxx
        }

        override fun onBinary(msg: ByteArray) {
            // xxx
        }
    })

    // send message
    sendMsg(it!!, "pc2", msgCount)
}

// create dc
val dc1 = pc1?.createDataChannel("test")
// observe dc open event
dc1?.onOpen {
    // send message
    sendMsg(dc1, "pc1", msgCount)
}
// observe dc message
dc1?.onMessage(object : DcMessageCallback {
    override fun onText(msg: String) {
        // xxx
    }

    override fun onBinary(msg: ByteArray) {
        // xxx
    }
})

Apple OS family

The API is almost the same as Android, the difference is just the difference between Kotlin and Swift.

Development

Install Android NDK 23.1.7779620 and export NDK env pointing to it.

Install dependencies:

curl -fLO https://releases.bazel.build/5.4.1/release/bazel-5.4.1-darwin-arm64 && chmod +x bazel-5.4.1-darwin-arm64
mv bazel-5.4.1-darwin-arm64 /usr/local/bin/bazel

Before start building, run commands below:

git submodule update --recursive --init
./run_djinni.sh

# for Android
./build_openssl_android.sh

# for Apple OS family
./build_openssl_apple.sh

For Android development, just open the root project as Android Studio project, then you can run and debug it.

For Apple OS family, run ./build_apple.sh to build the xcframework.

About

C++ WebRTC Data Channels for mobile

Resources

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •