PeerDart provides a complete, configurable, and easy-to-use peer-to-peer API built on top of WebRTC, supporting both data channels and media streams.
PeerDart mirrors the design of peerjs. Find the documentation here..
Here's an example application that uses both media and data connections: Example
Create a Peer
final Peer peer = Peer("pick-an-id");
// You can pick your own id or omit the id if you want to get a random one from the server.
Connect
const conn = peer.connect("another-peers-id");
conn.on("open").listen((name) {
conn.send("hi!");
})
Receive
peer.on<DataConnection>("connection").listen((connection) {
// On peer closed.
conn.on("close").listen((event) {
setState(() {
connected = false;
});
});
// ....
})
Call
final mediaStream = await navigator.mediaDevices
.getUserMedia({"video": true, "audio": false});
final conn = peer.call("peerId", mediaStream);
// Do some stuff with stream
conn.on<MediaStream>("stream").listen((event) {
_remoteRenderer.srcObject = event;
_localRenderer.srcObject = mediaStream;
setState(() {
inCall = true;
});
});
});
Answer
peer.on<MediaConnection>("call").listen((call) async {
final mediaStream = await navigator.mediaDevices
.getUserMedia({"video": true, "audio": false});
call.answer(mediaStream);
// on peer closed
call.on("close").listen((event) {
setState(() {
inCall = false;
});
});
// Get peer stream
call.on<MediaStream>("stream").listen((event) {
_localRenderer.srcObject = mediaStream;
_remoteRenderer.srcObject = event;
setState(() {
inCall = true;
});
});
});
See more at example.
Works both on mobile and web browsers (Chrome tested.).
PeerDart is licensed under the MIT License.