-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
000eee1
commit 88a3529
Showing
10 changed files
with
206 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
88 changes: 88 additions & 0 deletions
88
...c/main/java/cryptomessenger/desktop/infrastructure/client/websocket/WebSocketManager.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
package cryptomessenger.desktop.infrastructure.client.websocket; | ||
|
||
import cryptomessenger.desktop.infrastructure.client.websocket.handler.MessageHandler; | ||
import lombok.RequiredArgsConstructor; | ||
import lombok.extern.slf4j.Slf4j; | ||
import org.springframework.beans.factory.annotation.Value; | ||
import org.springframework.boot.context.event.ApplicationReadyEvent; | ||
import org.springframework.context.event.EventListener; | ||
import org.springframework.messaging.converter.StringMessageConverter; | ||
import org.springframework.messaging.simp.stomp.StompFrameHandler; | ||
import org.springframework.messaging.simp.stomp.StompHeaders; | ||
import org.springframework.messaging.simp.stomp.StompSession; | ||
import org.springframework.messaging.simp.stomp.StompSession.Subscription; | ||
import org.springframework.messaging.simp.stomp.StompSessionHandlerAdapter; | ||
import org.springframework.stereotype.Component; | ||
import org.springframework.web.socket.client.standard.StandardWebSocketClient; | ||
import org.springframework.web.socket.messaging.WebSocketStompClient; | ||
|
||
import java.lang.reflect.Type; | ||
import java.nio.charset.StandardCharsets; | ||
import java.util.Set; | ||
import java.util.function.Consumer; | ||
|
||
import static java.util.Collections.emptySet; | ||
import static java.util.stream.Collectors.toSet; | ||
|
||
@Slf4j | ||
@Component | ||
@RequiredArgsConstructor | ||
public class WebSocketManager { | ||
|
||
private final Set<MessageHandler> messageHandlers; | ||
|
||
@Value("${app.server-base-url}") | ||
private String serverBaseUrl; | ||
|
||
private StompSession session; | ||
private Set<Subscription> subscriptions = emptySet(); | ||
|
||
@EventListener(ApplicationReadyEvent.class) | ||
private void connect() { | ||
var client = new WebSocketStompClient(new StandardWebSocketClient()); | ||
client.setMessageConverter(new StringMessageConverter(StandardCharsets.UTF_8)); | ||
client.connectAsync(getConnectionUrl(), new SessionHandler()) | ||
.thenAccept(establishedSession -> { | ||
log.info("Connection established"); | ||
session = establishedSession; | ||
refreshSubscriptions(); | ||
}); | ||
} | ||
|
||
private String getConnectionUrl() { | ||
return serverBaseUrl.replaceFirst("http", "ws") + "/ws"; | ||
} | ||
|
||
public void refreshSubscriptions() { | ||
subscriptions.forEach(Subscription::unsubscribe); | ||
subscriptions = messageHandlers.stream().map(handler -> { | ||
var destination = handler.getDestination(); | ||
var subscription = session.subscribe(destination, new FrameHandler(handler.getHandler())); | ||
log.info("Subscribed to {}", destination); | ||
return subscription; | ||
}).collect(toSet()); | ||
} | ||
|
||
private static class SessionHandler extends StompSessionHandlerAdapter { | ||
@Override | ||
public void handleTransportError(StompSession session, Throwable exception) { | ||
log.warn("Transport error: {}", exception.getMessage()); | ||
} | ||
} | ||
|
||
@RequiredArgsConstructor | ||
private static class FrameHandler implements StompFrameHandler { | ||
|
||
private final Consumer<String> consumer; | ||
|
||
@Override | ||
public Type getPayloadType(StompHeaders headers) { | ||
return String.class; | ||
} | ||
|
||
@Override | ||
public void handleFrame(StompHeaders headers, Object payload) { | ||
consumer.accept((String) payload); | ||
} | ||
} | ||
} |
10 changes: 10 additions & 0 deletions
10
.../java/cryptomessenger/desktop/infrastructure/client/websocket/handler/MessageHandler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package cryptomessenger.desktop.infrastructure.client.websocket.handler; | ||
|
||
import java.util.function.Consumer; | ||
|
||
public interface MessageHandler { | ||
|
||
String getDestination(); | ||
|
||
Consumer<String> getHandler(); | ||
} |
37 changes: 37 additions & 0 deletions
37
...va/cryptomessenger/desktop/infrastructure/client/websocket/handler/NewMessageHandler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
package cryptomessenger.desktop.infrastructure.client.websocket.handler; | ||
|
||
import cryptomessenger.desktop.infrastructure.client.user.UserClient; | ||
import cryptomessenger.desktop.infrastructure.localstorage.LocalStorage; | ||
import cryptomessenger.desktop.service.LocalStorageKeys; | ||
import lombok.RequiredArgsConstructor; | ||
import lombok.Setter; | ||
import org.springframework.stereotype.Component; | ||
|
||
import java.util.function.Consumer; | ||
|
||
@Component | ||
@RequiredArgsConstructor | ||
public class NewMessageHandler implements MessageHandler { | ||
|
||
private final LocalStorage localStorage; | ||
private final UserClient userClient; | ||
|
||
@Setter | ||
private Runnable onNewMessage; | ||
|
||
@Override | ||
public String getDestination() { | ||
var username = localStorage.getString(LocalStorageKeys.CURRENT_USERNAME); | ||
var user = userClient.getByUsername(username); | ||
return "/user/%s/messages/new".formatted(user.getId()); | ||
} | ||
|
||
@Override | ||
public Consumer<String> getHandler() { | ||
return message -> { | ||
if (onNewMessage != null) { | ||
onNewMessage.run(); | ||
} | ||
}; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
20 changes: 20 additions & 0 deletions
20
...ver/src/main/java/cryptomessenger/server/infrastructure/websocket/NewMessageNotifier.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package cryptomessenger.server.infrastructure.websocket; | ||
|
||
import cryptomessenger.server.service.message.Message; | ||
import cryptomessenger.server.service.message.NewMessageListener; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.messaging.simp.SimpMessagingTemplate; | ||
import org.springframework.stereotype.Component; | ||
|
||
@Component | ||
@RequiredArgsConstructor | ||
public class NewMessageNotifier implements NewMessageListener { | ||
|
||
private final SimpMessagingTemplate simpMessagingTemplate; | ||
|
||
@Override | ||
public void onNewMessage(Message message) { | ||
var receiver = message.getReceiverId().toString(); | ||
simpMessagingTemplate.convertAndSendToUser(receiver, "/messages/new", "New message"); | ||
} | ||
} |
16 changes: 16 additions & 0 deletions
16
...src/main/java/cryptomessenger/server/infrastructure/websocket/WebSocketConfiguration.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package cryptomessenger.server.infrastructure.websocket; | ||
|
||
import org.springframework.context.annotation.Configuration; | ||
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; | ||
import org.springframework.web.socket.config.annotation.StompEndpointRegistry; | ||
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; | ||
|
||
@Configuration | ||
@EnableWebSocketMessageBroker | ||
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer { | ||
|
||
@Override | ||
public void registerStompEndpoints(StompEndpointRegistry registry) { | ||
registry.addEndpoint("/ws"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6 changes: 6 additions & 0 deletions
6
...enger-server/src/main/java/cryptomessenger/server/service/message/NewMessageListener.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
package cryptomessenger.server.service.message; | ||
|
||
public interface NewMessageListener { | ||
|
||
void onNewMessage(Message message); | ||
} |