* Websocket implementation * Websocket implementation with Akka Streams * Websocket implementation with Akka Streams * Websocket implementation with Akka Streams * Added configuration options for play server timeout and websocket frame lengths * Cleaned up code for consuming http endpoint in Messenger actor * Cleaned up code for consuming http endpoint in Messenger actor * Cleaned up code for akka streams implementation for websocket * Renamed unit test method * Added Poison Pill for stopping the actor. Fixed indentations. * Refactored the WebSocket method for readability * Refactored the JavaScript for readability * Code refactoring and removing unwanted comments * Added the latest version of jQuery * Removed .gitignore in favor of the one at the project root
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package controllers;
 | |
| 
 | |
| import actors.Messenger;
 | |
| import akka.actor.ActorSystem;
 | |
| import akka.stream.Materializer;
 | |
| import akka.stream.javadsl.Flow;
 | |
| import akka.stream.javadsl.Sink;
 | |
| import akka.stream.javadsl.Source;
 | |
| import com.fasterxml.jackson.databind.JsonNode;
 | |
| import dto.MessageDTO;
 | |
| import lombok.extern.slf4j.Slf4j;
 | |
| import play.libs.F;
 | |
| import play.libs.streams.ActorFlow;
 | |
| import play.mvc.*;
 | |
| import utils.MessageConverter;
 | |
| 
 | |
| import javax.inject.Inject;
 | |
| 
 | |
| import java.time.Duration;
 | |
| import java.util.concurrent.CompletableFuture;
 | |
| import java.util.concurrent.CompletionStage;
 | |
| 
 | |
| @Slf4j
 | |
| public class HomeController extends Controller {
 | |
|     private ActorSystem actorSystem;
 | |
|     private Materializer materializer;
 | |
| 
 | |
|     @Inject
 | |
|     public HomeController(ActorSystem actorSystem, Materializer materializer) {
 | |
|         this.actorSystem = actorSystem;
 | |
|         this.materializer = materializer;
 | |
|     }
 | |
| 
 | |
|     public Result index(Http.Request request) {
 | |
|         String url = routes.HomeController.socket().webSocketURL(request);
 | |
|         //To test WebSockets with akka streams, uncomment the next line and comment out the previous
 | |
|         //String url = routes.HomeController.akkaStreamsSocket().webSocketURL(request);
 | |
|         return ok(views.html.index.render(url));
 | |
|     }
 | |
| 
 | |
| 
 | |
|     public WebSocket socket() {
 | |
|         return WebSocket.Json.acceptOrResult(this::createActorFlow);
 | |
|     }
 | |
| 
 | |
|     private CompletionStage<F.Either<Result, Flow<JsonNode, JsonNode, ?>>> createActorFlow(
 | |
|       Http.RequestHeader request) {
 | |
|         return CompletableFuture.completedFuture(F.Either.Right(createFlowForActor()));
 | |
|     }
 | |
| 
 | |
|     private CompletionStage<F.Either<Result, Flow<JsonNode, JsonNode, ?>>>
 | |
|       createActorFlow2(Http.RequestHeader request) {
 | |
|         return CompletableFuture.completedFuture(
 | |
|           request.session()
 | |
|           .getOptional("username")
 | |
|           .map(username ->
 | |
|             F.Either.<Result, Flow<JsonNode, JsonNode, ?>>Right(
 | |
|               createFlowForActor()))
 | |
|           .orElseGet(() -> F.Either.Left(forbidden())));
 | |
|     }
 | |
| 
 | |
|     private Flow<JsonNode, JsonNode, ?> createFlowForActor() {
 | |
|         return ActorFlow.actorRef(out -> Messenger.props(out), actorSystem, materializer);
 | |
|     }
 | |
| 
 | |
|     public WebSocket akkaStreamsSocket() {
 | |
|         return WebSocket.Json.accept(
 | |
|           request -> {
 | |
|               Sink<JsonNode, ?> in = Sink.foreach(System.out::println);
 | |
|               MessageDTO messageDTO = new MessageDTO("1", "1", "Title", "Test Body");
 | |
|               Source<JsonNode, ?> out = Source.tick(
 | |
|                 Duration.ofSeconds(2),
 | |
|                 Duration.ofSeconds(2),
 | |
|                 MessageConverter.messageToJsonNode(messageDTO)
 | |
|               );
 | |
|               return Flow.fromSinkAndSource(in, out);
 | |
|         });
 | |
|     }
 | |
| }
 |