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

com.github.twitch4j.client.websocket.WebsocketConnectionConfig Maven / Gradle / Ivy

package com.github.twitch4j.client.websocket;

import com.github.twitch4j.client.websocket.domain.WebsocketConnectionState;
import com.github.twitch4j.common.config.ProxyConfig;
import com.github.twitch4j.common.util.ExponentialBackoffStrategy;
import com.github.twitch4j.util.IBackoffStrategy;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.time.Duration;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

@Accessors(chain = true, fluent = true, prefix = "")
@Setter
@Getter
public class WebsocketConnectionConfig {

    public static WebsocketConnectionConfig process(Consumer spec) {
        WebsocketConnectionConfig data = new WebsocketConnectionConfig();
        spec.accept(data);
        data.validate();
        return data;
    }

    /**
     * validate the config
     */
    public void validate() {
        Objects.requireNonNull(baseUrl, "baseUrl may not be null!");
        if (wsPingPeriod < 0) {
            throw new RuntimeException("wsPingPeriod must be 0 or greater, set to 0 to disable!");
        }
        if (connectionTimeout < 0) {
            throw new RuntimeException("connectionTimeout must be 0 or greater, set to 0 to disable!");
        }
        if (socketTimeout < 0) {
            throw new RuntimeException("socketTimeout must be 0 or greater, set to 0 to disable!");
        }
        if (closeDelay < 0) {
            throw new RuntimeException("closeDelay must be 0 or greater!");
        }
        Objects.requireNonNull(taskExecutor, "taskExecutor may not be null!");
        Objects.requireNonNull(backoffStrategy, "backoffStrategy may not be null!");
        Objects.requireNonNull(onStateChanged, "onStateChanged may not be null!");
        Objects.requireNonNull(onPreConnect, "onPreConnect may not be null!");
        Objects.requireNonNull(onPostConnect, "onPostConnect may not be null!");
        Objects.requireNonNull(onConnected, "onConnected may not be null!");
        Objects.requireNonNull(onTextMessage, "onTextMessage may not be null!");
        Objects.requireNonNull(onTextMessage, "onTextMessage may not be null!");
        Objects.requireNonNull(onDisconnecting, "onDisconnecting may not be null!");
        Objects.requireNonNull(onPreDisconnect, "onPreDisconnect may not be null!");
        Objects.requireNonNull(onPostDisconnect, "onPostDisconnect may not be null!");
        Objects.requireNonNull(onCloseFrame, "onCloseFrame may not be null!");
    }

    /**
     * The websocket url for the chat client to connect to.
     */
    private String baseUrl;

    /**
     * WebSocket RFC Ping Period in ms (0 = disabled)
     */
    private int wsPingPeriod = 0;

    /**
     * Websocket timeout milliseconds for establishing a connection (0 = disabled).
     */
    private int connectionTimeout = 60_000;

    /**
     * Websocket timeout milliseconds for read and write operations (0 = disabled).
     */
    private int socketTimeout = 30_000;

    /**
     * The maximum number of milliseconds to wait after sending a close frame
     * to receive confirmation from the server, before fully closing the socket.
     * 

* This can be set as low as 0 for applications that require prompt socket closes upon disconnect calls. */ private int closeDelay = 1_000; /** * WebSocket Headers */ private Map headers = null; /** * Task Executor */ private ScheduledExecutorService taskExecutor = new ScheduledThreadPoolExecutor(2); /** * Helper class to compute delays between connection retries */ private IBackoffStrategy backoffStrategy = ExponentialBackoffStrategy.builder() .immediateFirst(false) .baseMillis(Duration.ofSeconds(1).toMillis()) .jitter(true) .multiplier(2.0) .maximumBackoff(Duration.ofMinutes(5).toMillis()) .build(); /** * called when the websocket's state changes */ private BiConsumer onStateChanged = (oldState, newState) -> {}; /** * called before connecting */ private Runnable onPreConnect = () -> {}; /** * called after connecting */ private Runnable onPostConnect = () -> {}; /** * called after the connection to the websocket server has been established successfully */ private Runnable onConnected = () -> {}; /** * called when receiving a text message on from the websocket server */ private Consumer onTextMessage = (text) -> {}; /** * called when connection state is changing from CONNECTED to DISCONNECTING */ private Runnable onDisconnecting = () -> {}; /** * called before the disconnect *

* this occurs after onDisconnecting and before the connection is disposed */ private Runnable onPreDisconnect = () -> {}; /** * called after the disconnect */ private Runnable onPostDisconnect = () -> {}; /** * called after receiving a close frame from the server */ private BiConsumer<@NotNull Integer, @Nullable String> onCloseFrame = (code, reason) -> {}; /** * proxy config */ private ProxyConfig proxyConfig; }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy