// Path: src/main/java/org/nextrtc/signalingserver/api/NextRTCEventBus.java
// @Slf4j
// @Service(Names.EVENT_BUS)
// @Scope("singleton")
// public class NextRTCEventBus {
//     private EventBus eventBus;
// 
//     public NextRTCEventBus() {
//         this.eventBus = new EventBus();
//     }
// 
//     public void post(NextRTCEvent event) {
//         if (event.type() != NextRTCEvents.MESSAGE) {
//             log.info("POSTED EVENT: " + event);
//         }
//         eventBus.post(event);
//     }
// 
//     @Deprecated
//     public void post(Object o) {
//         eventBus.post(o);
//     }
// 
//     public void register(Object listeners) {
//         log.info("REGISTERED LISTENER: " + listeners);
//         eventBus.register(listeners);
//     }
// 
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/domain/Connection.java
// public interface Connection {
//     String getId();
// 
//     boolean isOpen();
// 
//     void sendObject(Object object);
// 
//     void close() throws IOException;
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/domain/Member.java
// @Getter
// @Component
// @Scope("prototype")
// public class Member implements NextRTCMember {
// 
//     private String id;
//     private Connection connection;
//     private Conversation conversation;
// 
//     private NextRTCEventBus eventBus;
// 
//     private ScheduledFuture<?> ping;
// 
//     public Member(Connection connection, ScheduledFuture<?> ping) {
//         this.id = connection.getId();
//         this.connection = connection;
//         this.ping = ping;
//     }
// 
//     public Optional<Conversation> getConversation() {
//         return Optional.ofNullable(conversation);
//     }
// 
//     public void markLeft() {
//         ping.cancel(true);
//     }
// 
//     void assign(Conversation conversation) {
//         this.conversation = conversation;
//         eventBus.post(MEMBER_JOINED.basedOn(
//                 builder()
//                         .conversation(conversation)
//                         .from(this)));
//     }
// 
//     public void unassignConversation(Conversation conversation) {
//         eventBus.post(MEMBER_LEFT.basedOn(
//                 builder()
//                         .conversation(conversation)
//                         .from(this)));
//         this.conversation = null;
//     }
// 
//     public boolean hasSameConversation(Member to) {
//         return to != null && conversation.equals(to.conversation);
//     }
// 
//     @Inject
//     public void setEventBus(NextRTCEventBus eventBus) {
//         this.eventBus = eventBus;
//     }
// 
//     @Override
//     public String toString() {
//         return String.format("%s", id);
//     }
// 
//     public synchronized Connection getConnection() {
//         return connection;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (!(o instanceof Member)) {
//             return false;
//         }
//         Member m = (Member) o;
//         return new EqualsBuilder()//
//                 .append(m.id, id)//
//                 .isEquals();
//     }
// 
//     @Override
//     public int hashCode() {
//         return new HashCodeBuilder()//
//                 .append(id)//
//                 .build();
//     }
// }


import org.nextrtc.signalingserver.api.NextRTCEventBus;
import org.nextrtc.signalingserver.domain.Connection;
import org.nextrtc.signalingserver.domain.Member;
import javax.inject.Inject;
import java.util.concurrent.ScheduledFuture;
package org.nextrtc.signalingserver.factory;



public class ManualMemberFactory implements MemberFactory {

    private NextRTCEventBus eventBus;

    @Inject
    public ManualMemberFactory(NextRTCEventBus eventBus) {
        this.eventBus = eventBus;
    }

    @Override
    public Member create(Connection connection, ScheduledFuture<?> ping) {
// Path: src/main/java/org/nextrtc/signalingserver/api/NextRTCEventBus.java
// @Slf4j
// @Service(Names.EVENT_BUS)
// @Scope("singleton")
// public class NextRTCEventBus {
//     private EventBus eventBus;
// 
//     public NextRTCEventBus() {
//         this.eventBus = new EventBus();
//     }
// 
//     public void post(NextRTCEvent event) {
//         if (event.type() != NextRTCEvents.MESSAGE) {
//             log.info("POSTED EVENT: " + event);
//         }
//         eventBus.post(event);
//     }
// 
//     @Deprecated
//     public void post(Object o) {
//         eventBus.post(o);
//     }
// 
//     public void register(Object listeners) {
//         log.info("REGISTERED LISTENER: " + listeners);
//         eventBus.register(listeners);
//     }
// 
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/domain/Connection.java
// public interface Connection {
//     String getId();
// 
//     boolean isOpen();
// 
//     void sendObject(Object object);
// 
//     void close() throws IOException;
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/domain/Member.java
// @Getter
// @Component
// @Scope("prototype")
// public class Member implements NextRTCMember {
// 
//     private String id;
//     private Connection connection;
//     private Conversation conversation;
// 
//     private NextRTCEventBus eventBus;
// 
//     private ScheduledFuture<?> ping;
// 
//     public Member(Connection connection, ScheduledFuture<?> ping) {
//         this.id = connection.getId();
//         this.connection = connection;
//         this.ping = ping;
//     }
// 
//     public Optional<Conversation> getConversation() {
//         return Optional.ofNullable(conversation);
//     }
// 
//     public void markLeft() {
//         ping.cancel(true);
//     }
// 
//     void assign(Conversation conversation) {
//         this.conversation = conversation;
//         eventBus.post(MEMBER_JOINED.basedOn(
//                 builder()
//                         .conversation(conversation)
//                         .from(this)));
//     }
// 
//     public void unassignConversation(Conversation conversation) {
//         eventBus.post(MEMBER_LEFT.basedOn(
//                 builder()
//                         .conversation(conversation)
//                         .from(this)));
//         this.conversation = null;
//     }
// 
//     public boolean hasSameConversation(Member to) {
//         return to != null && conversation.equals(to.conversation);
//     }
// 
//     @Inject
//     public void setEventBus(NextRTCEventBus eventBus) {
//         this.eventBus = eventBus;
//     }
// 
//     @Override
//     public String toString() {
//         return String.format("%s", id);
//     }
// 
//     public synchronized Connection getConnection() {
//         return connection;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (!(o instanceof Member)) {
//             return false;
//         }
//         Member m = (Member) o;
//         return new EqualsBuilder()//
//                 .append(m.id, id)//
//                 .isEquals();
//     }
// 
//     @Override
//     public int hashCode() {
//         return new HashCodeBuilder()//
//                 .append(id)//
//                 .build();
//     }
// }


// Path: src/main/java/org/nextrtc/signalingserver/factory/ManualMemberFactory.java
import org.nextrtc.signalingserver.api.NextRTCEventBus;
import org.nextrtc.signalingserver.domain.Connection;
import org.nextrtc.signalingserver.domain.Member;
import javax.inject.Inject;
import java.util.concurrent.ScheduledFuture;

package org.nextrtc.signalingserver.factory;



public class ManualMemberFactory implements MemberFactory {

    private NextRTCEventBus eventBus;

    @Inject
    public ManualMemberFactory(NextRTCEventBus eventBus) {
        this.eventBus = eventBus;
    }

    @Override
    public Member create(Connection connection, ScheduledFuture<?> ping) {
        Member member = new Member(connection, ping);