diff --git a/Client/pom.xml b/Client/pom.xml index c0132a6..106631c 100644 --- a/Client/pom.xml +++ b/Client/pom.xml @@ -29,6 +29,23 @@ protobuf-java 3.24.1 + + + org.slf4j + slf4j-simple + 2.0.7 + + + org.java-websocket + Java-WebSocket + 1.5.4 + + + org.slf4j + slf4j-simple + 2.0.7 + runtime + diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java index 3ae8f37..a4bb012 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java @@ -70,7 +70,6 @@ public class TikTokLiveClientBuilder implements TikTokEventBuilder(); map.put("Cookie", cookie); - return factory.openSocket() - .subprotocols("echo-protocol") - .connectTimeout(Duration.ofSeconds(15)) - .header("Cookie", cookie) - .buildAsync(URI.create(url), new TikTokWebSocketListener(webResponseHandler, tikTokEventHandler, tikTokLiveClient)).get(); + + return new TikTokWebSocketListener(URI.create(url), map, 3000, webResponseHandler, tikTokEventHandler, tikTokLiveClient); } + + public void stop() { - if (isConnected && webSocket != null) { - webSocket.sendClose(WebSocket.NORMAL_CLOSURE, "ok"); + if (isConnected && webSocketClient != null) { + webSocketClient.close(); } } } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java index c4db861..c59d5eb 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java @@ -1,6 +1,5 @@ package io.github.jwdeveloper.tiktok.websocket; - import com.google.protobuf.ByteString; import io.github.jwdeveloper.tiktok.TikTokLiveClient; import io.github.jwdeveloper.tiktok.events.messages.TikTokConnectedEvent; @@ -12,71 +11,71 @@ import io.github.jwdeveloper.tiktok.handlers.TikTokMessageHandlerRegistration; import io.github.jwdeveloper.tiktok.messages.WebcastResponse; import io.github.jwdeveloper.tiktok.messages.WebcastWebsocketAck; import io.github.jwdeveloper.tiktok.messages.WebcastWebsocketMessage; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.drafts.Draft_6455; +import org.java_websocket.handshake.ServerHandshake; -import java.io.ByteArrayOutputStream; +import java.net.URI; import java.net.http.WebSocket; import java.nio.ByteBuffer; +import java.util.Map; import java.util.Optional; -import java.util.concurrent.CompletionStage; +public class TikTokWebSocketListener extends WebSocketClient { -public class TikTokWebSocketListener implements java.net.http.WebSocket.Listener { - - private final ByteArrayOutputStream accumulatedData = new ByteArrayOutputStream(); private final TikTokMessageHandlerRegistration webResponseHandler; private final TikTokEventHandler tikTokEventHandler; private final TikTokLiveClient tikTokLiveClient; - public TikTokWebSocketListener(TikTokMessageHandlerRegistration webResponseHandler, + public TikTokWebSocketListener(URI serverUri, + Map httpHeaders, + int connectTimeout, + TikTokMessageHandlerRegistration webResponseHandler, TikTokEventHandler tikTokEventHandler, TikTokLiveClient tikTokLiveClient) { + super(serverUri, new Draft_6455(), httpHeaders,connectTimeout); this.webResponseHandler = webResponseHandler; this.tikTokEventHandler = tikTokEventHandler; this.tikTokLiveClient = tikTokLiveClient; } + @Override - public CompletionStage onBinary(WebSocket webSocket, ByteBuffer data, boolean last) { + public void onOpen(ServerHandshake serverHandshake) { + tikTokEventHandler.publish(tikTokLiveClient,new TikTokConnectedEvent()); + sendPing(); + } + + + @Override + public void onMessage(ByteBuffer bytes) + { try { - var bytes = new byte[data.remaining()]; - data.get(bytes); - accumulatedData.write(bytes); - if (last) { - handleBinary(webSocket, accumulatedData.toByteArray()); - accumulatedData.reset(); - } + handleBinary(bytes.array()); } catch (Exception e) { tikTokEventHandler.publish(tikTokLiveClient, new TikTokErrorEvent(e)); } - webSocket.request(1); - return null; + sendPing(); } @Override - public void onOpen(java.net.http.WebSocket webSocket) { - tikTokEventHandler.publish(tikTokLiveClient,new TikTokConnectedEvent()); - webSocket.request(1); - } - - @Override - public void onError(java.net.http.WebSocket webSocket, Throwable error) { - tikTokEventHandler.publish(tikTokLiveClient,new TikTokErrorEvent(error)); - webSocket.request(1); - } - - @Override - public CompletionStage onClose(java.net.http.WebSocket webSocket, int statusCode, String reason) { + public void onClose(int i, String s, boolean b) { tikTokEventHandler.publish(tikTokLiveClient,new TikTokDisconnectedEvent()); - return java.net.http.WebSocket.Listener.super.onClose(webSocket, statusCode, reason); } - private void handleBinary(WebSocket webSocket, byte[] buffer) { + @Override + public void onError(Exception error) { + tikTokEventHandler.publish(tikTokLiveClient,new TikTokErrorEvent(error)); + sendPing(); + } + + private void handleBinary(byte[] buffer) { var websocketMessageOptional = getWebcastWebsocketMessage(buffer); if (websocketMessageOptional.isEmpty()) { return; } var websocketMessage = websocketMessageOptional.get(); - sendAckId(webSocket, websocketMessage.getId()); + sendAckId(websocketMessage.getId()); var webResponse = getWebResponseMessage(websocketMessage.getBinary()); webResponseHandler.handle(tikTokLiveClient, webResponse); @@ -114,13 +113,19 @@ public class TikTokWebSocketListener implements java.net.http.WebSocket.Listener } } - private void sendAckId(WebSocket webSocket, long id) { + private void sendAckId(long id) { var serverInfo = WebcastWebsocketAck .newBuilder() .setType("ack") .setId(id) .build(); - webSocket.sendBinary(serverInfo.toByteString().asReadOnlyByteBuffer(), true); + send(serverInfo.toByteString().asReadOnlyByteBuffer()); } -} \ No newline at end of file + + + @Override + public void onMessage(String s) { + + } +} diff --git a/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java b/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java index e552c55..a771308 100644 --- a/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java +++ b/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java @@ -7,7 +7,7 @@ import java.io.IOException; public class Main { - public static String TEST_TIKTOK_USER = "vadimpyrography"; + public static String TEST_TIKTOK_USER = "dmikl_"; public static void main(String[] args) throws IOException { var client = TikTokLive.newClient(TEST_TIKTOK_USER) diff --git a/pom.xml b/pom.xml index 22080bc..3abcc0e 100644 --- a/pom.xml +++ b/pom.xml @@ -54,6 +54,7 @@ true all + false true @@ -64,8 +65,6 @@ *:* - **/proto/** - **/google/** **/tiktokSchema.proto/** @@ -99,6 +98,8 @@ test + +