package dev.peerat.backend.routes; import java.util.regex.Matcher; 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; public EventSSE(@Injection("groupMessages") Locker locker){ this.locker = locker; } @Route(path = "^/group/event/([a-zA-Z0-9&|!?{}\\[\\]%/*\\-+=:;,_#@ ]{3,100})$") public void connect(Matcher matcher, Context context, HttpWriter writer) throws Exception { String group = matcher.group(1); 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)){ 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; } } }