Merge pull request #131 from jwdeveloper/develop-1.10.6

Add session id to websocket connection to get authenticated WS as well as optional customizable type for disconnecting websocket client in various ways.
This commit is contained in:
David Kohler
2025-05-21 18:45:17 -04:00
committed by GitHub
6 changed files with 34 additions and 13 deletions

View File

@@ -51,9 +51,17 @@ public interface LiveClient {
/** /**
* Disconnects the connection. * Disconnects the connection.
* @param type
* <p>0 - Normal - Initiates disconnection and returns
* <p>1 - Disconnects blocking and returns after closure
* <p>2 - Disconnects and kills connection to websocket
* <p>Default {@link #disconnect()} is 0
*/ */
void disconnect(); void disconnect(int type);
default void disconnect() {
disconnect(0);
}
/** /**
* Use to manually invoke event * Use to manually invoke event

View File

@@ -27,6 +27,6 @@ import io.github.jwdeveloper.tiktok.live.LiveClient;
public interface LiveSocketClient { public interface LiveSocketClient {
void start(LiveConnectionData.Response webcastResponse, LiveClient tikTokLiveClient); void start(LiveConnectionData.Response webcastResponse, LiveClient tikTokLiveClient);
void stop(); void stop(int type);
boolean isConnected(); boolean isConnected();
} }

View File

@@ -153,9 +153,9 @@ public class TikTokLiveClient implements LiveClient
tikTokEventHandler.publish(this, new TikTokRoomInfoEvent(roomInfo)); tikTokEventHandler.publish(this, new TikTokRoomInfoEvent(roomInfo));
} }
public void disconnect() { public void disconnect(int type) {
if (webSocketClient.isConnected()) if (webSocketClient.isConnected())
webSocketClient.stop(); webSocketClient.stop(type);
if (!roomInfo.hasConnectionState(ConnectionState.DISCONNECTED)) if (!roomInfo.hasConnectionState(ConnectionState.DISCONNECTED))
setState(ConnectionState.DISCONNECTED); setState(ConnectionState.DISCONNECTED);
} }

View File

@@ -199,6 +199,8 @@ public class TikTokLiveHttpClient implements LiveHttpClient
.withParam("client", "ttlive-java") .withParam("client", "ttlive-java")
.withParam("room_id", room_id); .withParam("room_id", room_id);
if (clientSettings.getSessionId() != null) // Allows receiving of all comments and Subscribe Events
builder.withParam("session_id", clientSettings.getSessionId());
if (clientSettings.getApiKey() != null) if (clientSettings.getApiKey() != null)
builder.withParam("apiKey", clientSettings.getApiKey()); builder.withParam("apiKey", clientSettings.getApiKey());

View File

@@ -28,6 +28,7 @@ import io.github.jwdeveloper.tiktok.data.settings.*;
import io.github.jwdeveloper.tiktok.exceptions.*; import io.github.jwdeveloper.tiktok.exceptions.*;
import io.github.jwdeveloper.tiktok.live.*; import io.github.jwdeveloper.tiktok.live.*;
import org.java_websocket.client.WebSocketClient; import org.java_websocket.client.WebSocketClient;
import org.java_websocket.framing.CloseFrame;
import javax.net.ssl.*; import javax.net.ssl.*;
import java.net.Proxy; import java.net.Proxy;
@@ -56,18 +57,18 @@ public class TikTokWebSocketClient implements LiveSocketClient {
@Override @Override
public void start(LiveConnectionData.Response connectionData, LiveClient liveClient) { public void start(LiveConnectionData.Response connectionData, LiveClient liveClient) {
if (isConnected()) if (isConnected())
stop(); stop(0);
messageHandler.handle(liveClient, connectionData.getWebcastResponse()); messageHandler.handle(liveClient, connectionData.getWebcastResponse());
var headers = new HashMap<>(clientSettings.getHttpSettings().getHeaders()); var headers = new HashMap<>(clientSettings.getHttpSettings().getHeaders());
headers.put("Cookie", connectionData.getWebsocketCookies()); headers.put("Cookie", connectionData.getWebsocketCookies());
webSocketClient = new TikTokWebSocketListener(connectionData.getWebsocketUrl(), webSocketClient = new TikTokWebSocketListener(connectionData.getWebsocketUrl(),
headers, headers,
clientSettings.getHttpSettings().getTimeout().toMillisPart(), clientSettings.getHttpSettings().getTimeout().toMillisPart(),
messageHandler, messageHandler,
tikTokEventHandler, tikTokEventHandler,
liveClient); liveClient);
ProxyClientSettings proxyClientSettings = clientSettings.getHttpSettings().getProxyClientSettings(); ProxyClientSettings proxyClientSettings = clientSettings.getHttpSettings().getProxyClientSettings();
if (proxyClientSettings.isEnabled() && proxyClientSettings.isAllowWebsocket()) if (proxyClientSettings.isEnabled() && proxyClientSettings.isAllowWebsocket())
@@ -128,9 +129,19 @@ public class TikTokWebSocketClient implements LiveSocketClient {
} }
} }
public void stop() { public void stop(int type) {
if (isConnected()) { if (isConnected()) {
webSocketClient.close(); switch (type) {
case 1 -> {
try {
webSocketClient.closeBlocking();
} catch (InterruptedException e) {
throw new TikTokLiveException("Failed to stop the websocket");
}
}
case 2 -> webSocketClient.closeConnection(CloseFrame.NORMAL, "");
default -> webSocketClient.close();
}
heartbeatTask.stop(); heartbeatTask.stop();
} }
webSocketClient = null; webSocketClient = null;

View File

@@ -44,7 +44,7 @@ public class TikTokWebSocketOfflineClient implements LiveSocketClient {
} }
@Override @Override
public void stop() { public void stop(int type) {
if (liveClient != null) if (liveClient != null)
handler.publish(liveClient, new TikTokDisconnectedEvent("Stopping")); handler.publish(liveClient, new TikTokDisconnectedEvent("Stopping"));
} }