package dev.peerat.backend.routes; import dev.peerat.backend.Configuration; import dev.peerat.backend.model.Group; import dev.peerat.backend.model.PeerAtUser; import dev.peerat.backend.repository.DatabaseGroupRepository; import dev.peerat.backend.repository.DatabaseRepository; import dev.peerat.framework.Context; import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Injection; import dev.peerat.framework.Locker; import dev.peerat.framework.Locker.Key; import dev.peerat.framework.Route; public class EventSSE{ private Locker locker; private DatabaseGroupRepository repo; private int eventChapter; public EventSSE(@Injection("groupMessages") Locker locker, DatabaseRepository repo, Configuration config){ this.locker = locker; this.repo = repo.getGroupRepository(); this.eventChapter = config.getEventChapter(); } @Route(path = "^/group/event/$", needLogin = true) public void connect(Context context, HttpWriter writer) throws Exception { Group group = repo.getPlayerGroup(context.getUser().getId(), this.eventChapter); if(group == null){ context.response(401); return; } context.response(200, "Content-Type: text/event-stream"); Key key = new Key(); locker.init(key); try { while(true){ GroupMessage message = locker.getValue(key); if(message.getGroup() == null || message.getGroup().equals(group.getName())){ writer.write("data: "+message.getMessage()+"\n\n"); writer.flush(); } locker.lock(key); } }catch(Exception e){ e.printStackTrace(); } locker.remove(key); } public static class GroupMessage{ private String group; private String message; public GroupMessage(String group, String message){ this.group = group; this.message = message; } public String getGroup(){ return this.group; } public String getMessage(){ return this.message; } } }