diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveClient.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveClient.java index c0ce8a4..a30ff85 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveClient.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveClient.java @@ -24,6 +24,7 @@ package io.github.jwdeveloper.tiktok.live; import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.listener.ListenersManager; +import io.github.jwdeveloper.tiktok.websocket.LiveClientStopType; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; @@ -49,16 +50,16 @@ public interface LiveClient { /** * Disconnects the connection. - * @param type - *

0 - Normal - Initiates disconnection and returns - *

1 - Disconnects blocking and returns after closure - *

2 - Disconnects and kills connection to websocket - *

Default {@link #disconnect()} is 0 + * @param type {@code LiveClientStopType} + * @see LiveClientStopType */ - void disconnect(int type); + void disconnect(LiveClientStopType type); + /** + * Disconnects with {@link LiveClientStopType#NORMAL} + */ default void disconnect() { - disconnect(0); + disconnect(LiveClientStopType.NORMAL); } /** diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/websocket/LiveClientStopType.java b/API/src/main/java/io/github/jwdeveloper/tiktok/websocket/LiveClientStopType.java new file mode 100644 index 0000000..0cb78b9 --- /dev/null +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/websocket/LiveClientStopType.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2023-2024 jwdeveloper jacekwoln@gmail.com + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package io.github.jwdeveloper.tiktok.websocket; + +public enum LiveClientStopType +{ + /** + * Initiates the websocket close handshake. This method does not block
In oder to make sure + * the connection is closed use {@link LiveClientStopType#CLOSE_BLOCKING} + */ + NORMAL, + /** + * Same as {@link LiveClientStopType#NORMAL} but blocks until the websocket closed or failed to do so.
+ * + * @apiNote Can throw {@link InterruptedException} when/if the threads get interrupted + */ + CLOSE_BLOCKING, + /** + * This will close the connection immediately without a proper close handshake. + * The code and the message therefore won't be transferred over the wire also they will be forwarded to onClose/onWebsocketClose. */ + DISCONNECT +} \ No newline at end of file diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/websocket/LiveSocketClient.java b/API/src/main/java/io/github/jwdeveloper/tiktok/websocket/LiveSocketClient.java index f04e8b5..9f09edf 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/websocket/LiveSocketClient.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/websocket/LiveSocketClient.java @@ -27,6 +27,6 @@ import io.github.jwdeveloper.tiktok.live.LiveClient; public interface LiveSocketClient { void start(LiveConnectionData.Response webcastResponse, LiveClient tikTokLiveClient); - void stop(int type); + void stop(LiveClientStopType type); boolean isConnected(); } \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java index e06102f..01b0f09 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java @@ -35,7 +35,7 @@ import io.github.jwdeveloper.tiktok.listener.ListenersManager; import io.github.jwdeveloper.tiktok.live.*; import io.github.jwdeveloper.tiktok.messages.webcast.ProtoMessageFetchResult; import io.github.jwdeveloper.tiktok.models.ConnectionState; -import io.github.jwdeveloper.tiktok.websocket.LiveSocketClient; +import io.github.jwdeveloper.tiktok.websocket.*; import lombok.Getter; import java.util.Base64; @@ -166,7 +166,7 @@ public class TikTokLiveClient implements LiveClient tikTokEventHandler.publish(this, new TikTokRoomInfoEvent(roomInfo)); } - public void disconnect(int type) { + public void disconnect(LiveClientStopType type) { if (webSocketClient.isConnected()) webSocketClient.stop(type); if (!roomInfo.hasConnectionState(ConnectionState.DISCONNECTED)) diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java index dc1c35e..6a2fc60 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java @@ -57,7 +57,7 @@ public class TikTokWebSocketClient implements LiveSocketClient { @Override public void start(LiveConnectionData.Response connectionData, LiveClient liveClient) { if (isConnected()) - stop(0); + stop(LiveClientStopType.NORMAL); messageHandler.handle(liveClient, connectionData.getWebcastResponse()); @@ -129,17 +129,17 @@ public class TikTokWebSocketClient implements LiveSocketClient { } } - public void stop(int type) { + public void stop(LiveClientStopType type) { if (isConnected()) { switch (type) { - case 1 -> { + case CLOSE_BLOCKING -> { try { webSocketClient.closeBlocking(); } catch (InterruptedException e) { throw new TikTokLiveException("Failed to stop the websocket"); } } - case 2 -> webSocketClient.closeConnection(CloseFrame.NORMAL, ""); + case DISCONNECT -> webSocketClient.closeConnection(CloseFrame.NORMAL, ""); default -> webSocketClient.close(); } heartbeatTask.stop(webSocketClient); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java index f7cbdc8..3a73760 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java @@ -44,7 +44,7 @@ public class TikTokWebSocketOfflineClient implements LiveSocketClient { } @Override - public void stop(int type) { + public void stop(LiveClientStopType type) { if (liveClient != null) handler.publish(liveClient, new TikTokDisconnectedEvent("Stopping")); } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/euler/TikTokWebSocketEulerClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/euler/TikTokWebSocketEulerClient.java index 115e566..667dbf5 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/euler/TikTokWebSocketEulerClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/euler/TikTokWebSocketEulerClient.java @@ -23,14 +23,14 @@ package io.github.jwdeveloper.tiktok.websocket.euler; import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData; -import io.github.jwdeveloper.tiktok.data.settings.*; -import io.github.jwdeveloper.tiktok.exceptions.*; +import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings; +import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.live.*; import io.github.jwdeveloper.tiktok.websocket.*; import org.java_websocket.client.WebSocketClient; import org.java_websocket.framing.CloseFrame; -import java.net.*; +import java.net.URI; import java.util.HashMap; public class TikTokWebSocketEulerClient implements LiveSocketClient { @@ -53,7 +53,7 @@ public class TikTokWebSocketEulerClient implements LiveSocketClient { @Override public void start(LiveConnectionData.Response connectionData, LiveClient liveClient) { if (isConnected()) - stop(0); + stop(LiveClientStopType.NORMAL); webSocketClient = new TikTokWebSocketEulerListener( URI.create("wss://ws.eulerstream.com?uniqueId=%s&apiKey=%s&features.rawMessages=true".formatted(liveClient.getRoomInfo().getHostName(), clientSettings.getApiKey())), @@ -74,17 +74,17 @@ public class TikTokWebSocketEulerClient implements LiveSocketClient { } } - public void stop(int type) { + public void stop(LiveClientStopType type) { if (isConnected()) { switch (type) { - case 1 -> { + case CLOSE_BLOCKING -> { try { webSocketClient.closeBlocking(); } catch (InterruptedException e) { throw new TikTokLiveException("Failed to stop the websocket"); } } - case 2 -> webSocketClient.closeConnection(CloseFrame.NORMAL, ""); + case DISCONNECT -> webSocketClient.closeConnection(CloseFrame.NORMAL, ""); default -> webSocketClient.close(); } }