Table of Contents

Class NetworkCompression

Namespace
Moongate.Network.Compression
Assembly
Moongate.Network.dll

Handles outgoing packet compression for the network.

public static class NetworkCompression
Inheritance
NetworkCompression
Inherited Members

Fields

BufferSize

UO packets may not exceed 64kb in length

public const int BufferSize = 65536

Field Value

int

Methods

CalculateMaxCompressedSize(int)

Calculates the maximum size needed for the compressed output buffer. This provides a conservative estimate based on the worst-case compression scenario.

public static int CalculateMaxCompressedSize(int inputLength)

Parameters

inputLength int

Length of the input data to be compressed

Returns

int

Maximum size in bytes needed for the compressed output buffer, or 0 if input is too large to compress

Compress(ReadOnlySpan<byte>, Span<byte>)

Compresses input data using Huffman compression algorithm.

public static int Compress(ReadOnlySpan<byte> input, Span<byte> output)

Parameters

input ReadOnlySpan<byte>

Input data to compress

output Span<byte>

Output buffer for compressed data

Returns

int

Number of bytes written to output buffer, or 0 if compression failed

CompressToMemory(ReadOnlyMemory<byte>)

Compresses input data and returns the result as a new Memory<T> of bytes. This method allocates a new buffer for the compressed output.

public static Memory<byte> CompressToMemory(ReadOnlyMemory<byte> input)

Parameters

input ReadOnlyMemory<byte>

Input data to compress

Returns

Memory<byte>

Compressed data as Memory<T> of bytes, or empty if compression failed.

Decompress(ReadOnlySpan<byte>, Span<byte>)

Decompresses Huffman-compressed data.

public static int Decompress(ReadOnlySpan<byte> input, Span<byte> output)

Parameters

input ReadOnlySpan<byte>

Compressed input data

output Span<byte>

Output buffer for decompressed data

Returns

int

Number of bytes written to output buffer, or 0 if decompression failed

DecompressToMemory(ReadOnlyMemory<byte>, int)

Decompresses data and returns the result as a new Memory<T> of bytes.

public static Memory<byte> DecompressToMemory(ReadOnlyMemory<byte> input, int maxOutputSize = 65536)

Parameters

input ReadOnlyMemory<byte>

Compressed input data

maxOutputSize int

Maximum expected size of decompressed data

Returns

Memory<byte>

Decompressed data as Memory<T> of bytes, or empty if decompression failed.

IsCompressed(ReadOnlySpan<byte>)

Checks if data appears to be compressed by looking for huffman patterns. This is a heuristic check and may not be 100% accurate.

public static bool IsCompressed(ReadOnlySpan<byte> data)

Parameters

data ReadOnlySpan<byte>

Data to check

Returns

bool

True if data appears to be compressed

ProcessReceive(ref ReadOnlyMemory<byte>, out ReadOnlyMemory<byte>)

Main processing method compatible with ProcessReceive interface. Attempts to decompress data, with fallback handling.

public static (bool halt, int consumedFromOrigin) ProcessReceive(ref ReadOnlyMemory<byte> input, out ReadOnlyMemory<byte> output)

Parameters

input ReadOnlyMemory<byte>

Input data to process

output ReadOnlyMemory<byte>

Processed output data

Returns

(bool halt, int consumedFromOrigin)

Tuple indicating if processing should halt and bytes consumed

ProcessReceiveWithFlag(ref ReadOnlyMemory<byte>, bool, out ReadOnlyMemory<byte>)

Advanced ProcessReceive with explicit compression flag. Use this when you have a header or flag indicating compression status.

public static (bool halt, int consumedFromOrigin) ProcessReceiveWithFlag(ref ReadOnlyMemory<byte> input, bool isCompressed, out ReadOnlyMemory<byte> output)

Parameters

input ReadOnlyMemory<byte>

Input data to process

isCompressed bool

Flag indicating if data is compressed

output ReadOnlyMemory<byte>

Processed output data

Returns

(bool halt, int consumedFromOrigin)

Tuple indicating if processing should halt and bytes consumed

ProcessSend(ref ReadOnlyMemory<byte>, out ReadOnlyMemory<byte>)

Main processing method compatible with ProcessSend interface. Compresses data if beneficial, otherwise returns original data.

public static void ProcessSend(ref ReadOnlyMemory<byte> input, out ReadOnlyMemory<byte> output)

Parameters

input ReadOnlyMemory<byte>

Input data to process

output ReadOnlyMemory<byte>

Processed output data

ShouldCompress(int)

Checks if the input data is worth compressing based on size thresholds.

public static bool ShouldCompress(int inputLength)

Parameters

inputLength int

Length of input data

Returns

bool

True if compression should be attempted, false otherwise

TryCompress(ReadOnlyMemory<byte>, Span<byte>, out Memory<byte>)

Attempts to compress input data in-place using a provided buffer. Returns true if compression was successful and beneficial.

public static bool TryCompress(ReadOnlyMemory<byte> input, Span<byte> buffer, out Memory<byte> compressed)

Parameters

input ReadOnlyMemory<byte>

Input data to compress

buffer Span<byte>

Working buffer for compression (should be at least CalculateMaxCompressedSize bytes)

compressed Memory<byte>

Output compressed data if successful

Returns

bool

True if compression was successful and beneficial, false otherwise

TryDecompress(ReadOnlyMemory<byte>, Span<byte>, out Memory<byte>)

Attempts to decompress data using a provided buffer.

public static bool TryDecompress(ReadOnlyMemory<byte> input, Span<byte> buffer, out Memory<byte> decompressed)

Parameters

input ReadOnlyMemory<byte>

Compressed input data

buffer Span<byte>

Output buffer for decompressed data

decompressed Memory<byte>

Decompressed data if successful

Returns

bool

True if decompression was successful