anchor.diff:        });
       });
   
  +    pc.onDataChannel.listen((e) {
  +      _addDataChannel(id, e.channel);
  +    });
  +
       return pc;
  +  }
  +
  +  _addDataChannel(id, RtcDataChannel channel) {
  +    channel.onOpen.listen((e){});
  +
  +    channel.onMessage.listen((e){
  +      _messageController.add({
  +        'type': 'data',
  +        'id': id,
  +        'data': e.data
  +      });
  +    });
  +
  +    channel.onClose.listen((e){});
  +
  +    _data[id] = channel;
  +  }
  +
  +  _createDataChannel(id, RtcPeerConnection pc, { label: 'fileTransfer' }) {
  +    var channel = pc.createDataChannel(label, { 'reliable': false });
  +    _addDataChannel(id, channel);
     }
   
     _createOffer(int socket, RtcPeerConnection pc) {
  
positive.code:         _connections.forEach((k, c) => c.addStream(s));
        });
  
        _connections.forEach((s, c) => _createOffer(s, c));
  
        completer.complete(stream);
  
negative.code: 
    get onRemove => _messageStream.where((m) => m['type'] == 'remove');
  
    get onData => _messageStream.where((m) => m['type'] == 'data');
  
    createStream({ audio: false, video: false }) {
      var completer = new Completer<MediaStream>();
  
  