anchor.diff:  
     WebSocketRails(this.url);
   
  -  Stream<WsEvent> get onOpen => onOpenController.stream;
  +  //TODO: implement own streams
  +  Stream get onOpen => connection.onOpen.stream;
  +  Stream get onClose => connection.onClose.stream;
   
     connect() {
       if(connection == null) {
  
positive.code: 
    reconnect() {
      if(connection != null) {
        String ocid = connection.connectionId;
        disconnect();
        connect();
        eventQueue.forEach((int i, WsEvent e) {
          if(e != null && e.connectionId == ocid && e is ! WsResult) triggerEvent(e);
        });
      }
    }
  
negative.code:     if(eventControllers[e.name] != null) eventControllers[e.name].add(e.data);
    }
  
    //Channel related
    Channel subscribe(String name) => _subscribe(name, false);
    Channel subscribePrivate(String name) => _subscribe(name, true);
    Channel _subscribe(String name, bool private) {
      if(_channels[name] == null) {
        Channel c = _channels[name] = new Channel(name, private);
        connection.trigger(c.getSubscriptionEvent());
        return c;
      }
      return _channels[name];
    }
  
    _unsubscribe(String name) {
      if(_channels[name] != null) {
        _channels[name].destroy();
        _channels.remove(name);
      }
    }
  
    _dispatchChannel(WsChannel e) {
      if(_channels[e.channel] != null)
        _channels[e.channel].dispatch(e);
    }
    //End Channel related
  
    get connectionStale => state != STATE_CONNECTED;
  
    reconnectChannels() {
      _channels.forEach((String name, Channel c) {
        connection.trigger(c.getSubscriptionEvent());
      });
    }
  }
  