// 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/api/NextRTCEvents.java
// public enum NextRTCEvents {
//     SESSION_OPENED,
//     SESSION_CLOSED,
//     CONVERSATION_CREATED,
//     CONVERSATION_DESTROYED,
//     UNEXPECTED_SITUATION,
//     MEMBER_JOINED,
//     MEMBER_LEFT,
//     MEDIA_LOCAL_STREAM_REQUESTED,
//     MEDIA_LOCAL_STREAM_CREATED,
//     MEDIA_STREAMING,
//     TEXT,
//     MESSAGE;
// 
//     public NextRTCEvent basedOn(InternalMessage message, Conversation conversation) {
//         return EventContext.builder()
//                 .from(message.getFrom())
//                 .to(message.getTo())
//                 .custom(message.getCustom())
//                 .conversation(conversation)
//                 .type(this)
//                 .build();
//     }
// 
//     public NextRTCEvent basedOn(EventContext.EventContextBuilder builder) {
//         return builder
//                 .type(this)
//                 .build();
//     }
// 
//     public NextRTCEvent occurFor(Connection connection, String reason) {
//         return EventContext.builder()
//                 .from(new InternalMember(connection))
//                 .type(this)
//                 .exception(Exceptions.UNKNOWN_ERROR.exception())
//                 .content(reason)
//                 .build();
//     }
// 
//     public NextRTCEvent occurFor(Connection connection) {
//         return EventContext.builder()
//                 .type(this)
//                 .from(new InternalMember(connection))
//                 .exception(Exceptions.UNKNOWN_ERROR.exception())
//                 .build();
//     }
// 
//     public NextRTCEvent basedOn(InternalMessage message) {
//         return EventContext.builder()
//                 .from(message.getFrom())
//                 .to(message.getTo())
//                 .custom(message.getCustom())
//                 .content(message.getContent())
//                 .conversation(message.getFrom().getConversation().orElse(null))
//                 .type(this)
//                 .build();
//     }
// 
//     private static class InternalMember implements NextRTCMember {
// 
//         private final Connection connection;
// 
//         InternalMember(Connection connection) {
//             this.connection = connection;
//         }
// 
//         @Override
//         public Connection getConnection() {
//             return connection;
//         }
// 
//         @Override
//         public String getId() {
//             if (connection == null) {
//                 return null;
//             }
//             return connection.getId();
//         }
// 
//         @Override
//         public String toString() {
//             return getId();
//         }
//     }
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/api/NextRTCHandler.java
// public interface NextRTCHandler {
// 
//     void handleEvent(NextRTCEvent event);
// 
// }


import org.nextrtc.signalingserver.api.NextRTCEventBus;
import org.nextrtc.signalingserver.api.NextRTCEvents;
import org.nextrtc.signalingserver.api.NextRTCHandler;
import org.nextrtc.signalingserver.api.annotation.NextRTCEventListener;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
package org.nextrtc.signalingserver.eventbus;



@NextRTCEventListener
public class ManualEventDispatcher extends AbstractEventDispatcher {

    private final List<Object> events = new ArrayList<>();

    private final NextRTCEventBus eventBus;

    public ManualEventDispatcher(NextRTCEventBus eventBus) {
        this.eventBus = eventBus;
    }

    protected Collection<Object> getNextRTCEventListeners() {
        return events;
    }

    @Override
// 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/api/NextRTCEvents.java
// public enum NextRTCEvents {
//     SESSION_OPENED,
//     SESSION_CLOSED,
//     CONVERSATION_CREATED,
//     CONVERSATION_DESTROYED,
//     UNEXPECTED_SITUATION,
//     MEMBER_JOINED,
//     MEMBER_LEFT,
//     MEDIA_LOCAL_STREAM_REQUESTED,
//     MEDIA_LOCAL_STREAM_CREATED,
//     MEDIA_STREAMING,
//     TEXT,
//     MESSAGE;
// 
//     public NextRTCEvent basedOn(InternalMessage message, Conversation conversation) {
//         return EventContext.builder()
//                 .from(message.getFrom())
//                 .to(message.getTo())
//                 .custom(message.getCustom())
//                 .conversation(conversation)
//                 .type(this)
//                 .build();
//     }
// 
//     public NextRTCEvent basedOn(EventContext.EventContextBuilder builder) {
//         return builder
//                 .type(this)
//                 .build();
//     }
// 
//     public NextRTCEvent occurFor(Connection connection, String reason) {
//         return EventContext.builder()
//                 .from(new InternalMember(connection))
//                 .type(this)
//                 .exception(Exceptions.UNKNOWN_ERROR.exception())
//                 .content(reason)
//                 .build();
//     }
// 
//     public NextRTCEvent occurFor(Connection connection) {
//         return EventContext.builder()
//                 .type(this)
//                 .from(new InternalMember(connection))
//                 .exception(Exceptions.UNKNOWN_ERROR.exception())
//                 .build();
//     }
// 
//     public NextRTCEvent basedOn(InternalMessage message) {
//         return EventContext.builder()
//                 .from(message.getFrom())
//                 .to(message.getTo())
//                 .custom(message.getCustom())
//                 .content(message.getContent())
//                 .conversation(message.getFrom().getConversation().orElse(null))
//                 .type(this)
//                 .build();
//     }
// 
//     private static class InternalMember implements NextRTCMember {
// 
//         private final Connection connection;
// 
//         InternalMember(Connection connection) {
//             this.connection = connection;
//         }
// 
//         @Override
//         public Connection getConnection() {
//             return connection;
//         }
// 
//         @Override
//         public String getId() {
//             if (connection == null) {
//                 return null;
//             }
//             return connection.getId();
//         }
// 
//         @Override
//         public String toString() {
//             return getId();
//         }
//     }
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/api/NextRTCHandler.java
// public interface NextRTCHandler {
// 
//     void handleEvent(NextRTCEvent event);
// 
// }


// Path: src/main/java/org/nextrtc/signalingserver/eventbus/ManualEventDispatcher.java
import org.nextrtc.signalingserver.api.NextRTCEventBus;
import org.nextrtc.signalingserver.api.NextRTCEvents;
import org.nextrtc.signalingserver.api.NextRTCHandler;
import org.nextrtc.signalingserver.api.annotation.NextRTCEventListener;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

package org.nextrtc.signalingserver.eventbus;



@NextRTCEventListener
public class ManualEventDispatcher extends AbstractEventDispatcher {

    private final List<Object> events = new ArrayList<>();

    private final NextRTCEventBus eventBus;

    public ManualEventDispatcher(NextRTCEventBus eventBus) {
        this.eventBus = eventBus;
    }

    protected Collection<Object> getNextRTCEventListeners() {
        return events;
    }

    @Override
    protected NextRTCEvents[] getSupportedEvents(Object listener) {