All Downloads are FREE. Search and download functionalities are using the official Maven repository.

es.prodevelop.pui9.websocket.PuiWebSocket Maven / Gradle / Ivy

There is a newer version: 1.18.0
Show newest version
package es.prodevelop.pui9.websocket;

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import es.prodevelop.pui9.threads.PuiBackgroundExecutors;

/**
 * This class allows to send messages over WebSockets to the clients
 * 
 * @author Marc Gil - [email protected]
 */
@Component
public class PuiWebSocket {

	@Autowired
	private SimpMessagingTemplate template;

	private List jwts;

	private PuiWebSocket() {
	}

	/**
	 * Init a timer to remove all the sessions at night
	 */
	@PostConstruct
	private void postConstruct() {
		this.jwts = new ArrayList<>();

		Duration initDelay = Duration.between(LocalDateTime.now(), LocalDate.now().plusDays(1).atStartOfDay());
		PuiBackgroundExecutors.getSingleton().registerNewExecutor("WebsocketsCleanerAtNight", true,
				initDelay.toMinutes(), TimeUnit.DAYS.toMinutes(1), TimeUnit.MINUTES, () -> jwts.clear());
	}

	/**
	 * Send a message to the user identified by the given JWT token, for the given
	 * Type and the given Object
	 * 
	 * @param jwt    The JWT session token of the user
	 * @param type   The type of the websocket (to filter the message)
	 * @param object The object to be sent
	 */
	public void sendMessage(String jwt, String type, Object object) {
		if (!StringUtils.isEmpty(jwt) && !StringUtils.isEmpty(type)) {
			template.convertAndSendToUser(jwt, "/response", object, Collections.singletonMap("type", type));
		}
	}

	/**
	 * Broadcast a message to all the available sessions
	 * 
	 * @param type   The type of the websocket (to filter the message)
	 * @param object The object to be sent
	 */
	public void broadcastMessage(String type, Object object) {
		synchronized (jwts) {
			for (String jwt : jwts) {
				sendMessage(jwt, type, object);
			}
		}
	}

	/**
	 * Register the given JWT session (when a user starts a session in the client)
	 * 
	 * @param jwt The JWT session token
	 */
	public void registerJwt(String jwt) {
		if (!jwts.contains(jwt)) {
			jwts.add(jwt);
		}
	}

	/**
	 * Unregister the given JWT session (when a user ends a session in the client)
	 * 
	 * @param jwt The JWT session token
	 */
	public void unregisterJwt(String jwt) {
		if (jwt.contains(jwt)) {
			jwts.remove(jwt);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy