Skip to content

Commit 15d6351

Browse files
committed
Changes:
- Fixed bug: library was not working on certain java versions due to different WebSocket implementation. Instead of using java websocket api now there is `org.java-websocket`
1 parent 44ba999 commit 15d6351

File tree

6 files changed

+71
-54
lines changed

6 files changed

+71
-54
lines changed

Client/pom.xml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,23 @@
2929
<artifactId>protobuf-java</artifactId>
3030
<version>3.24.1</version>
3131
</dependency>
32+
33+
<dependency>
34+
<groupId>org.slf4j</groupId>
35+
<artifactId>slf4j-simple</artifactId>
36+
<version>2.0.7</version>
37+
</dependency>
38+
<dependency>
39+
<groupId>org.java-websocket</groupId>
40+
<artifactId>Java-WebSocket</artifactId>
41+
<version>1.5.4</version>
42+
</dependency>
43+
<dependency>
44+
<groupId>org.slf4j</groupId>
45+
<artifactId>slf4j-simple</artifactId>
46+
<version>2.0.7</version>
47+
<scope>runtime</scope>
48+
</dependency>
3249
</dependencies>
3350

3451

Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ public LiveClient build() {
7070
var tiktokRoomInfo = new TikTokRoomInfo();
7171
tiktokRoomInfo.setUserName(clientSettings.getHostName());
7272

73-
7473
var cookieJar = new TikTokCookieJar();
7574
var requestFactory = new TikTokHttpRequestFactory(cookieJar);
7675
var apiClient = new TikTokHttpApiClient(cookieJar, requestFactory);
@@ -79,7 +78,6 @@ public LiveClient build() {
7978
var webResponseHandler = new TikTokMessageHandlerRegistration(tikTokEventHandler, clientSettings, logger, giftManager, tiktokRoomInfo);
8079
var webSocketClient = new TikTokWebSocketClient(logger,
8180
cookieJar,
82-
requestFactory,
8381
clientSettings,
8482
webResponseHandler,
8583
tikTokEventHandler);

Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
import io.github.jwdeveloper.tiktok.http.TikTokCookieJar;
1212
import io.github.jwdeveloper.tiktok.http.TikTokHttpRequestFactory;
1313
import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
14+
import org.java_websocket.client.WebSocketClient;
1415

1516
import java.net.URI;
1617
import java.net.http.WebSocket;
17-
import java.time.Duration;
1818
import java.util.HashMap;
1919
import java.util.TreeMap;
2020
import java.util.logging.Logger;
@@ -23,24 +23,21 @@ public class TikTokWebSocketClient {
2323
private final Logger logger;
2424
private final ClientSettings clientSettings;
2525
private final TikTokCookieJar tikTokCookieJar;
26-
private final TikTokHttpRequestFactory factory;
2726
private final TikTokMessageHandlerRegistration webResponseHandler;
2827
private final TikTokEventHandler tikTokEventHandler;
2928

30-
private WebSocket webSocket;
29+
private WebSocketClient webSocketClient;
3130
private boolean isConnected;
3231
private TikTokLiveClient tikTokLiveClient;
3332

3433
public TikTokWebSocketClient(Logger logger,
3534
TikTokCookieJar tikTokCookieJar,
36-
TikTokHttpRequestFactory factory,
3735
ClientSettings clientSettings,
3836
TikTokMessageHandlerRegistration webResponseHandler,
3937
TikTokEventHandler tikTokEventHandler) {
4038
this.logger = logger;
4139
this.tikTokCookieJar = tikTokCookieJar;
4240
this.clientSettings = clientSettings;
43-
this.factory = factory;
4441
this.webResponseHandler = webResponseHandler;
4542
this.tikTokEventHandler = tikTokEventHandler;
4643
isConnected = false;
@@ -56,12 +53,12 @@ public void start(WebcastResponse webcastResponse, TikTokLiveClient tikTokLiveCl
5653
}
5754
try {
5855
var url = getWebSocketUrl(webcastResponse);
59-
if (clientSettings.isHandleExistingMessagesOnConnect())
60-
{
56+
if (clientSettings.isHandleExistingMessagesOnConnect()) {
6157
logger.info("Handling existing messages");
6258
webResponseHandler.handle(tikTokLiveClient, webcastResponse);
6359
}
64-
webSocket = startWebSocket(url);
60+
webSocketClient = startWebSocket(url);
61+
webSocketClient.connect();
6562
} catch (Exception e) {
6663
throw new TikTokLiveException("Failed to connect to the websocket", e);
6764
}
@@ -82,20 +79,19 @@ private String getWebSocketUrl(WebcastResponse webcastResponse) {
8279
return HttpUtils.parseParametersEncode(url, clone);
8380
}
8481

85-
private WebSocket startWebSocket(String url) throws Exception {
82+
private WebSocketClient startWebSocket(String url) {
8683
var cookie = tikTokCookieJar.parseCookies();
8784
var map = new HashMap<String, String>();
8885
map.put("Cookie", cookie);
89-
return factory.openSocket()
90-
.subprotocols("echo-protocol")
91-
.connectTimeout(Duration.ofSeconds(15))
92-
.header("Cookie", cookie)
93-
.buildAsync(URI.create(url), new TikTokWebSocketListener(webResponseHandler, tikTokEventHandler, tikTokLiveClient)).get();
86+
87+
return new TikTokWebSocketListener(URI.create(url), map, 3000, webResponseHandler, tikTokEventHandler, tikTokLiveClient);
9488
}
9589

90+
91+
9692
public void stop() {
97-
if (isConnected && webSocket != null) {
98-
webSocket.sendClose(WebSocket.NORMAL_CLOSURE, "ok");
93+
if (isConnected && webSocketClient != null) {
94+
webSocketClient.close();
9995
}
10096
}
10197
}

Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.github.jwdeveloper.tiktok.websocket;
22

3-
43
import com.google.protobuf.ByteString;
54
import io.github.jwdeveloper.tiktok.TikTokLiveClient;
65
import io.github.jwdeveloper.tiktok.events.messages.TikTokConnectedEvent;
@@ -12,71 +11,71 @@
1211
import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
1312
import io.github.jwdeveloper.tiktok.messages.WebcastWebsocketAck;
1413
import io.github.jwdeveloper.tiktok.messages.WebcastWebsocketMessage;
14+
import org.java_websocket.client.WebSocketClient;
15+
import org.java_websocket.drafts.Draft_6455;
16+
import org.java_websocket.handshake.ServerHandshake;
1517

16-
import java.io.ByteArrayOutputStream;
18+
import java.net.URI;
1719
import java.net.http.WebSocket;
1820
import java.nio.ByteBuffer;
21+
import java.util.Map;
1922
import java.util.Optional;
20-
import java.util.concurrent.CompletionStage;
21-
2223

23-
public class TikTokWebSocketListener implements java.net.http.WebSocket.Listener {
24+
public class TikTokWebSocketListener extends WebSocketClient {
2425

25-
private final ByteArrayOutputStream accumulatedData = new ByteArrayOutputStream();
2626
private final TikTokMessageHandlerRegistration webResponseHandler;
2727
private final TikTokEventHandler tikTokEventHandler;
2828
private final TikTokLiveClient tikTokLiveClient;
2929

30-
public TikTokWebSocketListener(TikTokMessageHandlerRegistration webResponseHandler,
30+
public TikTokWebSocketListener(URI serverUri,
31+
Map<String, String> httpHeaders,
32+
int connectTimeout,
33+
TikTokMessageHandlerRegistration webResponseHandler,
3134
TikTokEventHandler tikTokEventHandler,
3235
TikTokLiveClient tikTokLiveClient) {
36+
super(serverUri, new Draft_6455(), httpHeaders,connectTimeout);
3337
this.webResponseHandler = webResponseHandler;
3438
this.tikTokEventHandler = tikTokEventHandler;
3539
this.tikTokLiveClient = tikTokLiveClient;
3640
}
3741

42+
43+
@Override
44+
public void onOpen(ServerHandshake serverHandshake) {
45+
tikTokEventHandler.publish(tikTokLiveClient,new TikTokConnectedEvent());
46+
sendPing();
47+
}
48+
49+
3850
@Override
39-
public CompletionStage<?> onBinary(WebSocket webSocket, ByteBuffer data, boolean last) {
51+
public void onMessage(ByteBuffer bytes)
52+
{
4053
try {
41-
var bytes = new byte[data.remaining()];
42-
data.get(bytes);
43-
accumulatedData.write(bytes);
44-
if (last) {
45-
handleBinary(webSocket, accumulatedData.toByteArray());
46-
accumulatedData.reset();
47-
}
54+
handleBinary(bytes.array());
4855
} catch (Exception e) {
4956
tikTokEventHandler.publish(tikTokLiveClient, new TikTokErrorEvent(e));
5057
}
51-
webSocket.request(1);
52-
return null;
58+
sendPing();
5359
}
5460

5561
@Override
56-
public void onOpen(java.net.http.WebSocket webSocket) {
57-
tikTokEventHandler.publish(tikTokLiveClient,new TikTokConnectedEvent());
58-
webSocket.request(1);
62+
public void onClose(int i, String s, boolean b) {
63+
tikTokEventHandler.publish(tikTokLiveClient,new TikTokDisconnectedEvent());
5964
}
6065

6166
@Override
62-
public void onError(java.net.http.WebSocket webSocket, Throwable error) {
67+
public void onError(Exception error) {
6368
tikTokEventHandler.publish(tikTokLiveClient,new TikTokErrorEvent(error));
64-
webSocket.request(1);
65-
}
66-
67-
@Override
68-
public CompletionStage<?> onClose(java.net.http.WebSocket webSocket, int statusCode, String reason) {
69-
tikTokEventHandler.publish(tikTokLiveClient,new TikTokDisconnectedEvent());
70-
return java.net.http.WebSocket.Listener.super.onClose(webSocket, statusCode, reason);
69+
sendPing();
7170
}
7271

73-
private void handleBinary(WebSocket webSocket, byte[] buffer) {
72+
private void handleBinary(byte[] buffer) {
7473
var websocketMessageOptional = getWebcastWebsocketMessage(buffer);
7574
if (websocketMessageOptional.isEmpty()) {
7675
return;
7776
}
7877
var websocketMessage = websocketMessageOptional.get();
79-
sendAckId(webSocket, websocketMessage.getId());
78+
sendAckId(websocketMessage.getId());
8079

8180
var webResponse = getWebResponseMessage(websocketMessage.getBinary());
8281
webResponseHandler.handle(tikTokLiveClient, webResponse);
@@ -114,13 +113,19 @@ private void pingTask(WebSocket webSocket) throws InterruptedException {
114113
}
115114
}
116115

117-
private void sendAckId(WebSocket webSocket, long id) {
116+
private void sendAckId(long id) {
118117
var serverInfo = WebcastWebsocketAck
119118
.newBuilder()
120119
.setType("ack")
121120
.setId(id)
122121
.build();
123-
webSocket.sendBinary(serverInfo.toByteString().asReadOnlyByteBuffer(), true);
122+
send(serverInfo.toByteString().asReadOnlyByteBuffer());
124123
}
125124

126-
}
125+
126+
127+
@Override
128+
public void onMessage(String s) {
129+
130+
}
131+
}

TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
public class Main {
99

10-
public static String TEST_TIKTOK_USER = "vadimpyrography";
10+
public static String TEST_TIKTOK_USER = "dmikl_";
1111

1212
public static void main(String[] args) throws IOException {
1313
var client = TikTokLive.newClient(TEST_TIKTOK_USER)

pom.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
<configuration>
5555
<shadedArtifactAttached>true</shadedArtifactAttached>
5656
<shadedClassifierName>all</shadedClassifierName>
57+
<createDependencyReducedPom>false</createDependencyReducedPom>
5758
<minimizeJar>true</minimizeJar>
5859
<artifactSet>
5960
<includes>
@@ -64,8 +65,6 @@
6465
<filter>
6566
<artifact>*:*</artifact>
6667
<excludes>
67-
<exclude>**/proto/**</exclude>
68-
<exclude>**/google/**</exclude>
6968
<exclude>**/tiktokSchema.proto/**</exclude>
7069
</excludes>
7170
</filter>
@@ -99,6 +98,8 @@
9998
<scope>test</scope>
10099
</dependency>
101100

101+
102+
102103
</dependencies>
103104

104105
</project>

0 commit comments

Comments
 (0)