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

discord4j.connect.rabbitmq.gateway.RabbitMQBinarySourceMapper Maven / Gradle / Ivy

package discord4j.connect.rabbitmq.gateway;

import discord4j.connect.common.ConnectPayload;
import discord4j.connect.common.SourceMapper;
import discord4j.gateway.SessionInfo;
import discord4j.gateway.ShardInfo;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Mono;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.nio.charset.StandardCharsets;


/**
 * A mapper that can read a binary source and extract a {@link ConnectPayload} from it. Emits an error if the
 * deserialization fails.
 */
public class RabbitMQBinarySourceMapper implements SourceMapper {

    /*
    Defined order:
    - Shard Count
    - Shard Index
    - Session Sequence
    - Session Id
    - Payload Count
    - Payload(s)
     */
    @Override
    public Publisher apply(byte[] source) {
        return Mono.fromCallable(() -> {
            try (final DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(source))) {
                final int shardCount = dataInputStream.readInt();
                final int shardIndex = dataInputStream.readInt();
                final int sessionSeq = dataInputStream.readInt();
                final String sessionId = dataInputStream.readUTF();
                final int payloadLength = dataInputStream.readInt();
                final byte[] payloadData = new byte[payloadLength];
                dataInputStream.read(payloadData, 0, payloadLength);
                final String payload = new String(payloadData, StandardCharsets.UTF_8);
                return new ConnectPayload(
                        ShardInfo.create(shardIndex, shardCount),
                        SessionInfo.create(sessionId, sessionSeq),
                        payload
                );
            }
        });
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy