Instances are thread safe and can be obtained using {@link ServiceLoader}.
- */
-@NullMarked
-public interface ZstdDecompressorFactoryProvider {
- /**
- * Creates a new {@link ZstdDecompressorFactory} with the provided decompression buffer size.
- *
- * @param bufferSizeHint
- * A hint for the size of the buffer used for decompression,
- * must be larger than {@value ZstdDecompressor#MIN_BUFFER_SIZE} or be equal to {@value ZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE}.
- * Typically, bigger buffers mean less decompression loops, it does not change inputs or outputs
- *
- * @throws IllegalArgumentException
- * If {@code bufferSize} is less than {@value ZstdDecompressor#MIN_BUFFER_SIZE} and not {@value ZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE}
- *
- * @return A new {@link ZstdDecompressorFactory} instance
- */
- ZstdDecompressorFactory get(int bufferSizeHint);
-}
diff --git a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java
index 129c9d5..9098993 100644
--- a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java
+++ b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java
@@ -3,7 +3,7 @@
import dev.freya02.discord.zstd.api.ZstdDecompressor;
import dev.freya02.discord.zstd.api.ZstdDecompressorFactory;
import dev.freya02.discord.zstd.api.ZstdNativesLoader;
-import dev.freya02.discord.zstd.jni.ZstdJNIDecompressorFactoryProvider;
+import dev.freya02.discord.zstd.jni.DiscordZstdJNI;
import net.dv8tion.jda.api.utils.data.DataObject;
import net.dv8tion.jda.internal.utils.IOUtil;
import org.openjdk.jmh.annotations.*;
@@ -40,7 +40,7 @@ public static class ZstdDecompressorState {
public void setup() throws IOException {
ZstdNativesLoader.loadFromJar();
ZstdDecompressorFactory factory = switch (impl) {
- case "jni" -> new ZstdJNIDecompressorFactoryProvider().get(ZSTD_BUFFER_SIZE);
+ case "jni" -> new DiscordZstdJNI().createDecompressorFactory(ZSTD_BUFFER_SIZE);
default -> throw new AssertionError("Unknown implementation: " + impl);
};
decompressor = factory.create();
diff --git a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java
index 0b5be79..8b85b2b 100644
--- a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java
+++ b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java
@@ -2,7 +2,7 @@
import dev.freya02.discord.zstd.api.ZstdContext;
import dev.freya02.discord.zstd.api.ZstdNativesLoader;
-import dev.freya02.discord.zstd.jni.ZstdJNIContextFactoryProvider;
+import dev.freya02.discord.zstd.jni.DiscordZstdJNI;
import net.dv8tion.jda.api.utils.data.DataObject;
import net.dv8tion.jda.internal.utils.IOUtil;
import org.jetbrains.annotations.Nullable;
@@ -35,11 +35,10 @@ public static class ZstdDecompressorState {
@Setup
public void setup() throws IOException {
ZstdNativesLoader.loadFromJar();
- var factory = switch (impl) {
- case "jni" -> new ZstdJNIContextFactoryProvider().get();
+ context = switch (impl) {
+ case "jni" -> new DiscordZstdJNI().createContext();
default -> throw new AssertionError("Unknown implementation: " + impl);
};
- context = factory.create();
}
@TearDown
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContextFactory.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContextFactory.java
deleted file mode 100644
index 776f423..0000000
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContextFactory.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package dev.freya02.discord.zstd.ffm;
-
-import dev.freya02.discord.zstd.api.ZstdContext;
-import dev.freya02.discord.zstd.api.ZstdContextFactory;
-import org.jspecify.annotations.NullMarked;
-
-@NullMarked
-public class ZstdFFMContextFactory implements ZstdContextFactory {
- @Override
- public ZstdContext create() {
- return new ZstdFFMContext();
- }
-}
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContextFactoryProvider.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContextFactoryProvider.java
deleted file mode 100644
index 6e491cd..0000000
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContextFactoryProvider.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package dev.freya02.discord.zstd.ffm;
-
-import dev.freya02.discord.zstd.api.ZstdContextFactory;
-import dev.freya02.discord.zstd.api.ZstdContextFactoryProvider;
-import org.jspecify.annotations.NullMarked;
-
-@NullMarked
-public class ZstdFFMContextFactoryProvider implements ZstdContextFactoryProvider {
- @Override
- public ZstdContextFactory get() {
- return new ZstdFFMContextFactory();
- }
-}
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactoryProvider.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactoryProvider.java
deleted file mode 100644
index f9beb9e..0000000
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactoryProvider.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package dev.freya02.discord.zstd.ffm;
-
-import dev.freya02.discord.zstd.api.ZstdDecompressorFactory;
-import dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider;
-import org.jspecify.annotations.NullMarked;
-
-@NullMarked
-public class ZstdFFMDecompressorFactoryProvider implements ZstdDecompressorFactoryProvider {
-
- @Override
- public ZstdDecompressorFactory get(int bufferSizeHint) {
- return new ZstdFFMDecompressorFactory(bufferSizeHint);
- }
-}
diff --git a/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdContextFactoryProvider b/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdContextFactoryProvider
deleted file mode 100644
index 53b3ead..0000000
--- a/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdContextFactoryProvider
+++ /dev/null
@@ -1 +0,0 @@
-dev.freya02.discord.zstd.ffm.ZstdFFMContextFactoryProvider
diff --git a/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider b/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider
deleted file mode 100644
index 294ac6d..0000000
--- a/ffm-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider
+++ /dev/null
@@ -1 +0,0 @@
-dev.freya02.discord.zstd.ffm.ZstdFFMDecompressorFactoryProvider
diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContextFactory.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContextFactory.java
deleted file mode 100644
index 3b023b0..0000000
--- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContextFactory.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package dev.freya02.discord.zstd.jni;
-
-import dev.freya02.discord.zstd.api.ZstdContext;
-import dev.freya02.discord.zstd.api.ZstdContextFactory;
-import org.jspecify.annotations.NullMarked;
-
-@NullMarked
-public class ZstdJNIContextFactory implements ZstdContextFactory {
- @Override
- public ZstdContext create() {
- return new ZstdJNIContext();
- }
-}
diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContextFactoryProvider.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContextFactoryProvider.java
deleted file mode 100644
index 1167f2b..0000000
--- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContextFactoryProvider.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package dev.freya02.discord.zstd.jni;
-
-import dev.freya02.discord.zstd.api.ZstdContextFactory;
-import dev.freya02.discord.zstd.api.ZstdContextFactoryProvider;
-import org.jspecify.annotations.NullMarked;
-
-@NullMarked
-public class ZstdJNIContextFactoryProvider implements ZstdContextFactoryProvider {
- @Override
- public ZstdContextFactory get() {
- return new ZstdJNIContextFactory();
- }
-}
diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactoryProvider.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactoryProvider.java
deleted file mode 100644
index df83c6d..0000000
--- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactoryProvider.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package dev.freya02.discord.zstd.jni;
-
-import dev.freya02.discord.zstd.api.ZstdDecompressorFactory;
-import dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider;
-import org.jspecify.annotations.NullMarked;
-
-@NullMarked
-public class ZstdJNIDecompressorFactoryProvider implements ZstdDecompressorFactoryProvider {
-
- @Override
- public ZstdDecompressorFactory get(int bufferSizeHint) {
- return new ZstdJNIDecompressorFactory(bufferSizeHint);
- }
-}
diff --git a/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdContextFactoryProvider b/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdContextFactoryProvider
deleted file mode 100644
index 1ff1322..0000000
--- a/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdContextFactoryProvider
+++ /dev/null
@@ -1 +0,0 @@
-dev.freya02.discord.zstd.jni.ZstdJNIContextFactoryProvider
diff --git a/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider b/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider
deleted file mode 100644
index e29ca8a..0000000
--- a/jni-impl/src/main/resources/META-INF/services/dev.freya02.discord.zstd.api.ZstdDecompressorFactoryProvider
+++ /dev/null
@@ -1 +0,0 @@
-dev.freya02.discord.zstd.jni.ZstdJNIDecompressorFactoryProvider
From c99394374dd3dae5882f1a42c485a651b6f82d96 Mon Sep 17 00:00:00 2001
From: freya02 <41875020+freya022@users.noreply.github.com>
Date: Fri, 5 Dec 2025 16:22:14 +0100
Subject: [PATCH 4/8] Set internal visibilities
---
ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/Zstd.java | 2 +-
.../main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java | 2 +-
.../java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java | 2 +-
.../freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java | 2 +-
.../java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java | 2 +-
.../main/java/dev/freya02/discord/zstd/jni/ZstdJNIContext.java | 2 +-
.../java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressor.java | 2 +-
.../freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java | 2 +-
.../java/dev/freya02/discord/zstd/jni/ZstdJNIInputStream.java | 2 +-
9 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/Zstd.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/Zstd.java
index 5580fdc..fbfd0b4 100644
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/Zstd.java
+++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/Zstd.java
@@ -39,7 +39,7 @@
* the return value is a suggested next input size (just a hint for better latency)
* that will never request more than the remaining content of the compressed frame.
*/
-public final class Zstd {
+final class Zstd {
private Zstd() {
// Should not be called directly
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java
index 9803c12..26307c1 100644
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java
+++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java
@@ -8,7 +8,7 @@
import java.lang.foreign.MemorySegment;
@NullMarked
-public class ZstdFFMContext implements ZstdContext {
+class ZstdFFMContext implements ZstdContext {
private final MemorySegment stream;
private boolean invalidated = false;
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java
index 82bfb1a..c54d607 100644
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java
+++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java
@@ -14,7 +14,7 @@
import java.util.List;
@NullMarked
-public class ZstdFFMDecompressor extends AbstractZstdDecompressor {
+class ZstdFFMDecompressor extends AbstractZstdDecompressor {
private static final Logger LOG = LoggerFactory.getLogger(ZstdFFMDecompressor.class);
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java
index b693c91..b2b5a97 100644
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java
+++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java
@@ -6,7 +6,7 @@
import org.jspecify.annotations.NullMarked;
@NullMarked
-public class ZstdFFMDecompressorFactory implements ZstdDecompressorFactory {
+class ZstdFFMDecompressorFactory implements ZstdDecompressorFactory {
private final int bufferSize;
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java
index be9e59e..bb8810b 100644
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java
+++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java
@@ -10,7 +10,7 @@
import java.util.Objects;
@NullMarked
-public class ZstdFFMInputStream extends InputStream {
+class ZstdFFMInputStream extends InputStream {
private final ZstdFFMContext context;
diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContext.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContext.java
index 38f66b5..577dac3 100644
--- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContext.java
+++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIContext.java
@@ -6,7 +6,7 @@
import java.io.InputStream;
@NullMarked
-public class ZstdJNIContext implements ZstdContext {
+class ZstdJNIContext implements ZstdContext {
private final long zds;
private boolean invalidated = false;
diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressor.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressor.java
index d410072..a9b11c4 100644
--- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressor.java
+++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressor.java
@@ -9,7 +9,7 @@
import java.util.Arrays;
@NullMarked
-public class ZstdJNIDecompressor extends AbstractZstdDecompressor {
+class ZstdJNIDecompressor extends AbstractZstdDecompressor {
private static final Logger LOG = LoggerFactory.getLogger(ZstdJNIDecompressor.class);
diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java
index 4e8e676..af7a863 100644
--- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java
+++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java
@@ -6,7 +6,7 @@
import org.jspecify.annotations.NullMarked;
@NullMarked
-public class ZstdJNIDecompressorFactory implements ZstdDecompressorFactory {
+class ZstdJNIDecompressorFactory implements ZstdDecompressorFactory {
private final int bufferSize;
diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIInputStream.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIInputStream.java
index 5305365..0dd5ec5 100644
--- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIInputStream.java
+++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIInputStream.java
@@ -7,7 +7,7 @@
import java.io.InputStream;
@NullMarked
-public class ZstdJNIInputStream extends InputStream {
+class ZstdJNIInputStream extends InputStream {
private final ZstdJNIContext context;
private final long nativeContextPtr;
From 03448dbc5fb0e3ed2cab2eed725a5c17fbf084ea Mon Sep 17 00:00:00 2001
From: freya02 <41875020+freya022@users.noreply.github.com>
Date: Fri, 5 Dec 2025 16:23:48 +0100
Subject: [PATCH 5/8] Remove redundant `ZstdNativesLoader.isLoaded()` check
---
.../freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java | 4 ----
.../freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java | 4 ----
2 files changed, 8 deletions(-)
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java
index b2b5a97..cefb0fc 100644
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java
+++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java
@@ -2,7 +2,6 @@
import dev.freya02.discord.zstd.api.ZstdDecompressor;
import dev.freya02.discord.zstd.api.ZstdDecompressorFactory;
-import dev.freya02.discord.zstd.api.ZstdNativesLoader;
import org.jspecify.annotations.NullMarked;
@NullMarked
@@ -18,9 +17,6 @@ protected ZstdFFMDecompressorFactory(int bufferSize) {
@Override
public ZstdDecompressor create() {
- if (!ZstdNativesLoader.isLoaded()) {
- throw new IllegalStateException("Natives are not loaded yet, see ZstdNativesLoader");
- }
return new ZstdFFMDecompressor(bufferSize);
}
}
diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java
index af7a863..babe1e0 100644
--- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java
+++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java
@@ -2,7 +2,6 @@
import dev.freya02.discord.zstd.api.ZstdDecompressor;
import dev.freya02.discord.zstd.api.ZstdDecompressorFactory;
-import dev.freya02.discord.zstd.api.ZstdNativesLoader;
import org.jspecify.annotations.NullMarked;
@NullMarked
@@ -18,9 +17,6 @@ protected ZstdJNIDecompressorFactory(int bufferSize) {
@Override
public ZstdDecompressor create() {
- if (!ZstdNativesLoader.isLoaded()) {
- throw new IllegalStateException("Natives are not loaded yet, see ZstdNativesLoader");
- }
return new ZstdJNIDecompressor(bufferSize);
}
}
From 637eaf1fc971f029a6b82eac56fb092da39a7127 Mon Sep 17 00:00:00 2001
From: freya02 <41875020+freya022@users.noreply.github.com>
Date: Fri, 5 Dec 2025 16:26:30 +0100
Subject: [PATCH 6/8] Move decompressor buffer size hint checks to factory
method
---
.../dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java | 7 +++----
.../discord/zstd/ffm/ZstdFFMDecompressorFactory.java | 10 ++++------
.../dev/freya02/discord/zstd/jni/DiscordZstdJNI.java | 7 +++----
.../discord/zstd/jni/ZstdJNIDecompressorFactory.java | 10 ++++------
4 files changed, 14 insertions(+), 20 deletions(-)
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java
index 6762ca9..a7768e0 100644
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java
+++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java
@@ -1,9 +1,6 @@
package dev.freya02.discord.zstd.ffm;
-import dev.freya02.discord.zstd.api.DiscordZstd;
-import dev.freya02.discord.zstd.api.ZstdContext;
-import dev.freya02.discord.zstd.api.ZstdDecompressorFactory;
-import dev.freya02.discord.zstd.api.ZstdNativesLoader;
+import dev.freya02.discord.zstd.api.*;
import org.jspecify.annotations.NullMarked;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -28,6 +25,8 @@ public ZstdContext createContext() {
@Override
public ZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint) {
+ if (bufferSizeHint < ZstdDecompressor.MIN_BUFFER_SIZE && bufferSizeHint != ZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE)
+ throw new IllegalArgumentException("Buffer must be larger than or equal to " + ZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSizeHint);
return new ZstdFFMDecompressorFactory(bufferSizeHint);
}
}
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java
index cefb0fc..b4b517e 100644
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java
+++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java
@@ -7,16 +7,14 @@
@NullMarked
class ZstdFFMDecompressorFactory implements ZstdDecompressorFactory {
- private final int bufferSize;
+ private final int bufferSizeHint;
- protected ZstdFFMDecompressorFactory(int bufferSize) {
- if (bufferSize < ZstdDecompressor.MIN_BUFFER_SIZE && bufferSize != ZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE)
- throw new IllegalArgumentException("Buffer must be larger than or equal to " + ZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSize);
- this.bufferSize = bufferSize;
+ protected ZstdFFMDecompressorFactory(int bufferSizeHint) {
+ this.bufferSizeHint = bufferSizeHint;
}
@Override
public ZstdDecompressor create() {
- return new ZstdFFMDecompressor(bufferSize);
+ return new ZstdFFMDecompressor(bufferSizeHint);
}
}
diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java
index 05cb365..3e6e8f1 100644
--- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java
+++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNI.java
@@ -1,9 +1,6 @@
package dev.freya02.discord.zstd.jni;
-import dev.freya02.discord.zstd.api.DiscordZstd;
-import dev.freya02.discord.zstd.api.ZstdContext;
-import dev.freya02.discord.zstd.api.ZstdDecompressorFactory;
-import dev.freya02.discord.zstd.api.ZstdNativesLoader;
+import dev.freya02.discord.zstd.api.*;
import org.jspecify.annotations.NullMarked;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -28,6 +25,8 @@ public ZstdContext createContext() {
@Override
public ZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint) {
+ if (bufferSizeHint < ZstdDecompressor.MIN_BUFFER_SIZE && bufferSizeHint != ZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE)
+ throw new IllegalArgumentException("Buffer must be larger than or equal to " + ZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSizeHint);
return new ZstdJNIDecompressorFactory(bufferSizeHint);
}
}
diff --git a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java
index babe1e0..f8235e7 100644
--- a/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java
+++ b/jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java
@@ -7,16 +7,14 @@
@NullMarked
class ZstdJNIDecompressorFactory implements ZstdDecompressorFactory {
- private final int bufferSize;
+ private final int bufferSizeHint;
- protected ZstdJNIDecompressorFactory(int bufferSize) {
- if (bufferSize < ZstdDecompressor.MIN_BUFFER_SIZE && bufferSize != ZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE)
- throw new IllegalArgumentException("Buffer must be larger than or equal to " + ZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSize);
- this.bufferSize = bufferSize;
+ protected ZstdJNIDecompressorFactory(int bufferSizeHint) {
+ this.bufferSizeHint = bufferSizeHint;
}
@Override
public ZstdDecompressor create() {
- return new ZstdJNIDecompressor(bufferSize);
+ return new ZstdJNIDecompressor(bufferSizeHint);
}
}
From c0b9a0a7a058e82770c19cb04a04de76e1e7c7ea Mon Sep 17 00:00:00 2001
From: freya02 <41875020+freya022@users.noreply.github.com>
Date: Fri, 5 Dec 2025 16:48:06 +0100
Subject: [PATCH 7/8] Update README.md
---
README.md | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index 04f0da0..a7233f0 100644
--- a/README.md
+++ b/README.md
@@ -54,10 +54,9 @@ You will only need the `dev.freya02:discord-zstd-java-api:VERSION` dependency, i
### Usage
-First, get a `ZstdDecompressorFactoryProvider` by loading one using a `ServiceLoader`,
-doing this first ensures you can throw an error when missing an implementation before it can throw one because of missing natives, as they are brought by the implementation.
-
-Then, you can check if the natives are loaded by checking `ZstdNativesLoader.isLoaded()`,
-but usually you'll want to call `loadFromJar()`, you should do it late enough so the bot developer has a chance to load different natives.
-
-Finally, get a factory from the provider, it will be configured with the values you pass.
+The main interface is `DiscordZstd`, you can get an instance with `DiscordZstdProvider.get()`.
+Then, you can either:
+1. Do bulk processing with a decompressor obtained with `DiscordZstd#createDecompressor` and kept per gateway connection,
+ calling `ZstdDecompressor#decompress` on each gateway message
+2. Process gradually with a context obtained from `DiscordZstd#createContext` and kept per gateway connection,
+ then making input streams with `ZstdContext#createInputStream` from each gateway message
From 675628f5ff1667a8219898eae1c8a7ed1975c8e5 Mon Sep 17 00:00:00 2001
From: freya02 <41875020+freya022@users.noreply.github.com>
Date: Fri, 5 Dec 2025 17:15:07 +0100
Subject: [PATCH 8/8] Prefix classes with `Discord`
To avoid conflicts with classes of users
---
.../freya02/discord/zstd/api/DiscordZstd.java | 16 ++++++-------
...tdContext.java => DiscordZstdContext.java} | 2 +-
...ssor.java => DiscordZstdDecompressor.java} | 4 ++--
.../api/DiscordZstdDecompressorFactory.java | 18 ++++++++++++++
...ception.java => DiscordZstdException.java} | 4 ++--
...der.java => DiscordZstdNativesLoader.java} | 6 +++--
.../zstd/api/ZstdDecompressorFactory.java | 18 --------------
.../internal/AbstractZstdDecompressor.java | 4 ++--
.../zstd/ZstdDecompressorBenchmark.java | 14 +++++------
.../discord/zstd/ZstdStreamingBenchmark.java | 8 +++----
.../discord/zstd/ffm/DiscordZstdFFM.java | 14 +++++------
...ontext.java => DiscordZstdFFMContext.java} | 14 +++++------
...r.java => DiscordZstdFFMDecompressor.java} | 12 +++++-----
.../DiscordZstdFFMDecompressorFactory.java | 20 ++++++++++++++++
...am.java => DiscordZstdFFMInputStream.java} | 6 ++---
.../zstd/ffm/ZstdFFMDecompressorFactory.java | 20 ----------------
.../freya02/discord/zstd/ffm/ZstdFFMTest.java | 12 +++++-----
.../discord/zstd/jna/ZstdJNADecompressor.java | 6 ++---
.../zstd/jna/ZstdJNADecompressorFactory.java | 16 ++++++-------
.../ZstdJNADecompressorFactoryProvider.java | 4 ++--
.../freya02/discord/zstd/jna/ZstdJNATest.java | 12 +++++-----
jni-impl/natives/include/context.hpp | 14 +++++------
jni-impl/natives/include/decompressor.hpp | 24 +++++++++++--------
jni-impl/natives/include/streaming.hpp | 18 +++++++-------
jni-impl/natives/src/context.cpp | 6 ++---
jni-impl/natives/src/decompressor.cpp | 20 +++++++---------
jni-impl/natives/src/streaming.cpp | 8 +++----
.../discord/zstd/jni/DiscordZstdJNI.java | 14 +++++------
...ontext.java => DiscordZstdJNIContext.java} | 8 +++----
...r.java => DiscordZstdJNIDecompressor.java} | 10 ++++----
.../DiscordZstdJNIDecompressorFactory.java | 20 ++++++++++++++++
...am.java => DiscordZstdJNIInputStream.java} | 10 ++++----
.../zstd/jni/ZstdJNIDecompressorFactory.java | 20 ----------------
.../freya02/discord/zstd/jni/ZstdJNITest.java | 12 +++++-----
34 files changed, 209 insertions(+), 205 deletions(-)
rename api/src/main/java/dev/freya02/discord/zstd/api/{ZstdContext.java => DiscordZstdContext.java} (84%)
rename api/src/main/java/dev/freya02/discord/zstd/api/{ZstdDecompressor.java => DiscordZstdDecompressor.java} (97%)
create mode 100644 api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdDecompressorFactory.java
rename api/src/main/java/dev/freya02/discord/zstd/api/{ZstdException.java => DiscordZstdException.java} (54%)
rename api/src/main/java/dev/freya02/discord/zstd/api/{ZstdNativesLoader.java => DiscordZstdNativesLoader.java} (95%)
delete mode 100644 api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressorFactory.java
rename ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/{ZstdFFMContext.java => DiscordZstdFFMContext.java} (78%)
rename ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/{ZstdFFMDecompressor.java => DiscordZstdFFMDecompressor.java} (92%)
create mode 100644 ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMDecompressorFactory.java
rename ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/{ZstdFFMInputStream.java => DiscordZstdFFMInputStream.java} (92%)
delete mode 100644 ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java
rename jni-impl/src/main/java/dev/freya02/discord/zstd/jni/{ZstdJNIContext.java => DiscordZstdJNIContext.java} (84%)
rename jni-impl/src/main/java/dev/freya02/discord/zstd/jni/{ZstdJNIDecompressor.java => DiscordZstdJNIDecompressor.java} (85%)
create mode 100644 jni-impl/src/main/java/dev/freya02/discord/zstd/jni/DiscordZstdJNIDecompressorFactory.java
rename jni-impl/src/main/java/dev/freya02/discord/zstd/jni/{ZstdJNIInputStream.java => DiscordZstdJNIInputStream.java} (84%)
delete mode 100644 jni-impl/src/main/java/dev/freya02/discord/zstd/jni/ZstdJNIDecompressorFactory.java
diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstd.java b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstd.java
index 696b6f6..8690a30 100644
--- a/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstd.java
+++ b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstd.java
@@ -8,26 +8,26 @@
public interface DiscordZstd {
// TODO rename type
/**
- * Creates a new {@link ZstdContext}.
+ * Creates a new {@link DiscordZstdContext}.
*
This is used to keep track of streaming decompression after each input is consumed via an {@link InputStream}.
*
- * @return A new {@link ZstdContext} instance
+ * @return A new {@link DiscordZstdContext} instance
*/
- ZstdContext createContext();
+ DiscordZstdContext createContext();
// TODO rename type
/**
- * Creates a new {@link ZstdDecompressorFactory} with the provided decompression buffer size.
+ * Creates a new {@link DiscordZstdDecompressorFactory} with the provided decompression buffer size.
*
* @param bufferSizeHint
* A hint for the size of the buffer used for decompression,
- * must be larger than {@value ZstdDecompressor#MIN_BUFFER_SIZE} or be equal to {@value ZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE}.
+ * must be larger than {@value DiscordZstdDecompressor#MIN_BUFFER_SIZE} or be equal to {@value DiscordZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE}.
* Typically, bigger buffers mean less decompression loops, it does not change inputs or outputs
*
* @throws IllegalArgumentException
- * If {@code bufferSize} is less than {@value ZstdDecompressor#MIN_BUFFER_SIZE} and not {@value ZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE}
+ * If {@code bufferSize} is less than {@value DiscordZstdDecompressor#MIN_BUFFER_SIZE} and not {@value DiscordZstdDecompressor#ZSTD_RECOMMENDED_BUFFER_SIZE}
*
- * @return A new {@link ZstdDecompressorFactory} instance
+ * @return A new {@link DiscordZstdDecompressorFactory} instance
*/
- ZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint);
+ DiscordZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint);
}
diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdContext.java b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdContext.java
similarity index 84%
rename from api/src/main/java/dev/freya02/discord/zstd/api/ZstdContext.java
rename to api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdContext.java
index 340bca4..58446a7 100644
--- a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdContext.java
+++ b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdContext.java
@@ -5,7 +5,7 @@
import java.io.InputStream;
@NullMarked
-public interface ZstdContext {
+public interface DiscordZstdContext {
void close();
void reset();
diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressor.java b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdDecompressor.java
similarity index 97%
rename from api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressor.java
rename to api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdDecompressor.java
index ef5d125..1512b35 100644
--- a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressor.java
+++ b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdDecompressor.java
@@ -9,7 +9,7 @@
*
Note: Instances are not thread safe, as there should be an instance per gateway connection, which uses 1 read thread. */ @NullMarked -public interface ZstdDecompressor { +public interface DiscordZstdDecompressor { /** * The "recommended" buffer size as defined by {@code ZSTD_DStreamOutSize()} (128 KB as of v1.5.7). This isn't a default. * @@ -57,7 +57,7 @@ public interface ZstdDecompressor { * @throws IllegalStateException * If this decompressor is closed, * or if the decompressor is an errored state and needs to be {@linkplain #reset() reset} - * @throws ZstdException + * @throws DiscordZstdException * If Zstd was unable to decompress the data for any reason, if this exception occurs, * the decompressor will be in an errored state and will need to be {@linkplain #reset() reset} */ diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdDecompressorFactory.java b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdDecompressorFactory.java new file mode 100644 index 0000000..184b6a7 --- /dev/null +++ b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdDecompressorFactory.java @@ -0,0 +1,18 @@ +package dev.freya02.discord.zstd.api; + +import org.jspecify.annotations.NullMarked; + +/** + * Factory of {@link DiscordZstdDecompressor}. + * + *
Instances are thread safe. + */ +@NullMarked +public interface DiscordZstdDecompressorFactory { + /** + * Creates a new {@link DiscordZstdDecompressor} configured with the parameters passed to this factory. + * + * @return A new {@link DiscordZstdDecompressor} instance + */ + DiscordZstdDecompressor create(); +} diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdException.java b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdException.java similarity index 54% rename from api/src/main/java/dev/freya02/discord/zstd/api/ZstdException.java rename to api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdException.java index 1991f8e..f5db88c 100644 --- a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdException.java +++ b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdException.java @@ -3,8 +3,8 @@ /** * An exception thrown when Zstd returns an error code. */ -public class ZstdException extends RuntimeException { - public ZstdException(String message) { +public class DiscordZstdException extends RuntimeException { + public DiscordZstdException(String message) { super(message); } } diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdNativesLoader.java b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdNativesLoader.java similarity index 95% rename from api/src/main/java/dev/freya02/discord/zstd/api/ZstdNativesLoader.java rename to api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdNativesLoader.java index 6825b78..a19511b 100644 --- a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdNativesLoader.java +++ b/api/src/main/java/dev/freya02/discord/zstd/api/DiscordZstdNativesLoader.java @@ -12,7 +12,7 @@ * to the absolute path of the native library. */ @NullMarked -public class ZstdNativesLoader { +public class DiscordZstdNativesLoader { private static boolean init = false; /** @@ -41,6 +41,8 @@ public static synchronized boolean load(Path path) { //noinspection ConstantValue if (path == null) throw new IllegalArgumentException("path is null"); + if (!path.isAbsolute()) + throw new IllegalArgumentException("path is not absolute: " + path); final String pathStr = path.toAbsolutePath().toString(); System.setProperty("zstd.lib", pathStr); @@ -86,7 +88,7 @@ public static synchronized boolean loadFromJar() throws IOException { } String resourcePath = String.format("/natives/%s/libzstd.%s", platform, extension); - Path nativePath = NativeUtil.copyNativeFromJar(resourcePath, ZstdNativesLoader.class); + Path nativePath = NativeUtil.copyNativeFromJar(resourcePath, DiscordZstdNativesLoader.class); load(nativePath); return true; } diff --git a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressorFactory.java b/api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressorFactory.java deleted file mode 100644 index 58ddf33..0000000 --- a/api/src/main/java/dev/freya02/discord/zstd/api/ZstdDecompressorFactory.java +++ /dev/null @@ -1,18 +0,0 @@ -package dev.freya02.discord.zstd.api; - -import org.jspecify.annotations.NullMarked; - -/** - * Factory of {@link ZstdDecompressor}. - * - *
Instances are thread safe.
- */
-@NullMarked
-public interface ZstdDecompressorFactory {
- /**
- * Creates a new {@link ZstdDecompressor} configured with the parameters passed to this factory.
- *
- * @return A new {@link ZstdDecompressor} instance
- */
- ZstdDecompressor create();
-}
diff --git a/api/src/main/java/dev/freya02/discord/zstd/internal/AbstractZstdDecompressor.java b/api/src/main/java/dev/freya02/discord/zstd/internal/AbstractZstdDecompressor.java
index 2ddeb6f..bab1cb4 100644
--- a/api/src/main/java/dev/freya02/discord/zstd/internal/AbstractZstdDecompressor.java
+++ b/api/src/main/java/dev/freya02/discord/zstd/internal/AbstractZstdDecompressor.java
@@ -1,10 +1,10 @@
package dev.freya02.discord.zstd.internal;
-import dev.freya02.discord.zstd.api.ZstdDecompressor;
+import dev.freya02.discord.zstd.api.DiscordZstdDecompressor;
import java.util.List;
-public abstract class AbstractZstdDecompressor implements ZstdDecompressor {
+public abstract class AbstractZstdDecompressor implements DiscordZstdDecompressor {
protected AbstractZstdDecompressor() {
}
diff --git a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java
index 9098993..54bd3d0 100644
--- a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java
+++ b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdDecompressorBenchmark.java
@@ -1,8 +1,8 @@
package dev.freya02.discord.zstd;
-import dev.freya02.discord.zstd.api.ZstdDecompressor;
-import dev.freya02.discord.zstd.api.ZstdDecompressorFactory;
-import dev.freya02.discord.zstd.api.ZstdNativesLoader;
+import dev.freya02.discord.zstd.api.DiscordZstdDecompressor;
+import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory;
+import dev.freya02.discord.zstd.api.DiscordZstdNativesLoader;
import dev.freya02.discord.zstd.jni.DiscordZstdJNI;
import net.dv8tion.jda.api.utils.data.DataObject;
import net.dv8tion.jda.internal.utils.IOUtil;
@@ -26,7 +26,7 @@
@Fork(1)
public class ZstdDecompressorBenchmark {
- private static final int ZSTD_BUFFER_SIZE = ZstdDecompressor.DEFAULT_BUFFER_SIZE;
+ private static final int ZSTD_BUFFER_SIZE = DiscordZstdDecompressor.DEFAULT_BUFFER_SIZE;
private static final int ZLIB_BUFFER_SIZE = 2048; // JDA default
@State(Scope.Benchmark)
@@ -34,12 +34,12 @@ public static class ZstdDecompressorState {
@Param({"jni"})
private String impl;
- public ZstdDecompressor decompressor;
+ public DiscordZstdDecompressor decompressor;
@Setup
public void setup() throws IOException {
- ZstdNativesLoader.loadFromJar();
- ZstdDecompressorFactory factory = switch (impl) {
+ DiscordZstdNativesLoader.loadFromJar();
+ DiscordZstdDecompressorFactory factory = switch (impl) {
case "jni" -> new DiscordZstdJNI().createDecompressorFactory(ZSTD_BUFFER_SIZE);
default -> throw new AssertionError("Unknown implementation: " + impl);
};
diff --git a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java
index 8b85b2b..4abecc9 100644
--- a/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java
+++ b/benchmarks/src/jmh/java/dev/freya02/discord/zstd/ZstdStreamingBenchmark.java
@@ -1,7 +1,7 @@
package dev.freya02.discord.zstd;
-import dev.freya02.discord.zstd.api.ZstdContext;
-import dev.freya02.discord.zstd.api.ZstdNativesLoader;
+import dev.freya02.discord.zstd.api.DiscordZstdContext;
+import dev.freya02.discord.zstd.api.DiscordZstdNativesLoader;
import dev.freya02.discord.zstd.jni.DiscordZstdJNI;
import net.dv8tion.jda.api.utils.data.DataObject;
import net.dv8tion.jda.internal.utils.IOUtil;
@@ -30,11 +30,11 @@ public static class ZstdDecompressorState {
@Param({"jni"})
private String impl;
- public ZstdContext context;
+ public DiscordZstdContext context;
@Setup
public void setup() throws IOException {
- ZstdNativesLoader.loadFromJar();
+ DiscordZstdNativesLoader.loadFromJar();
context = switch (impl) {
case "jni" -> new DiscordZstdJNI().createContext();
default -> throw new AssertionError("Unknown implementation: " + impl);
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java
index a7768e0..79a05cf 100644
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java
+++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFM.java
@@ -15,18 +15,18 @@ public DiscordZstdFFM() throws IOException {
LOGGER.debug("Using FFM implementation of discord-zstd-java");
// Load natives if they weren't already
- ZstdNativesLoader.loadFromJar();
+ DiscordZstdNativesLoader.loadFromJar();
}
@Override
- public ZstdContext createContext() {
- return new ZstdFFMContext();
+ public DiscordZstdContext createContext() {
+ return new DiscordZstdFFMContext();
}
@Override
- public ZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint) {
- if (bufferSizeHint < ZstdDecompressor.MIN_BUFFER_SIZE && bufferSizeHint != ZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE)
- throw new IllegalArgumentException("Buffer must be larger than or equal to " + ZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSizeHint);
- return new ZstdFFMDecompressorFactory(bufferSizeHint);
+ public DiscordZstdDecompressorFactory createDecompressorFactory(int bufferSizeHint) {
+ if (bufferSizeHint < DiscordZstdDecompressor.MIN_BUFFER_SIZE && bufferSizeHint != DiscordZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE)
+ throw new IllegalArgumentException("Buffer must be larger than or equal to " + DiscordZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSizeHint);
+ return new DiscordZstdFFMDecompressorFactory(bufferSizeHint);
}
}
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMContext.java
similarity index 78%
rename from ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java
rename to ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMContext.java
index 26307c1..0511270 100644
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMContext.java
+++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMContext.java
@@ -1,20 +1,20 @@
package dev.freya02.discord.zstd.ffm;
-import dev.freya02.discord.zstd.api.ZstdContext;
-import dev.freya02.discord.zstd.api.ZstdException;
+import dev.freya02.discord.zstd.api.DiscordZstdContext;
+import dev.freya02.discord.zstd.api.DiscordZstdException;
import org.jspecify.annotations.NullMarked;
import java.io.InputStream;
import java.lang.foreign.MemorySegment;
@NullMarked
-class ZstdFFMContext implements ZstdContext {
+class DiscordZstdFFMContext implements DiscordZstdContext {
private final MemorySegment stream;
private boolean invalidated = false;
private boolean closed = false;
- public ZstdFFMContext() {
+ public DiscordZstdFFMContext() {
this.stream = Zstd.ZSTD_createDStream();
}
@@ -38,7 +38,7 @@ public void reset() {
@Override
public InputStream createInputStream(byte[] input) {
- return new ZstdFFMInputStream(this, input);
+ return new DiscordZstdFFMInputStream(this, input);
}
public void decompress(MemorySegment dst, long dstCapacity, MemorySegment dstPos, MemorySegment src, long srcSize, MemorySegment srcPos) {
@@ -54,8 +54,8 @@ public void decompress(MemorySegment dst, long dstCapacity, MemorySegment dstPos
}
}
- public ZstdException createException(String message) {
+ public DiscordZstdException createException(String message) {
invalidated = true;
- return new ZstdException(message);
+ return new DiscordZstdException(message);
}
}
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMDecompressor.java
similarity index 92%
rename from ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java
rename to ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMDecompressor.java
index c54d607..ee4865a 100644
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressor.java
+++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMDecompressor.java
@@ -1,6 +1,6 @@
package dev.freya02.discord.zstd.ffm;
-import dev.freya02.discord.zstd.api.ZstdException;
+import dev.freya02.discord.zstd.api.DiscordZstdException;
import dev.freya02.discord.zstd.internal.AbstractZstdDecompressor;
import org.jspecify.annotations.NullMarked;
import org.slf4j.Logger;
@@ -14,9 +14,9 @@
import java.util.List;
@NullMarked
-class ZstdFFMDecompressor extends AbstractZstdDecompressor {
+class DiscordZstdFFMDecompressor extends AbstractZstdDecompressor {
- private static final Logger LOG = LoggerFactory.getLogger(ZstdFFMDecompressor.class);
+ private static final Logger LOG = LoggerFactory.getLogger(DiscordZstdFFMDecompressor.class);
private final MemorySegment stream;
private final MemorySegment dstSegment;
@@ -26,7 +26,7 @@ class ZstdFFMDecompressor extends AbstractZstdDecompressor {
private boolean invalidated = false;
private boolean closed = false;
- protected ZstdFFMDecompressor(int bufferSizeHint)
+ protected DiscordZstdFFMDecompressor(int bufferSizeHint)
{
this.stream = Zstd.ZSTD_createDStream();
@@ -138,8 +138,8 @@ private static long getLong(MemorySegment segment) {
return segment.get(ValueLayout.JAVA_LONG, 0);
}
- private ZstdException createException(String message) {
+ private DiscordZstdException createException(String message) {
invalidated = true;
- return new ZstdException(message);
+ return new DiscordZstdException(message);
}
}
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMDecompressorFactory.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMDecompressorFactory.java
new file mode 100644
index 0000000..1f076d6
--- /dev/null
+++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMDecompressorFactory.java
@@ -0,0 +1,20 @@
+package dev.freya02.discord.zstd.ffm;
+
+import dev.freya02.discord.zstd.api.DiscordZstdDecompressor;
+import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory;
+import org.jspecify.annotations.NullMarked;
+
+@NullMarked
+class DiscordZstdFFMDecompressorFactory implements DiscordZstdDecompressorFactory {
+
+ private final int bufferSizeHint;
+
+ protected DiscordZstdFFMDecompressorFactory(int bufferSizeHint) {
+ this.bufferSizeHint = bufferSizeHint;
+ }
+
+ @Override
+ public DiscordZstdDecompressor create() {
+ return new DiscordZstdFFMDecompressor(bufferSizeHint);
+ }
+}
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMInputStream.java
similarity index 92%
rename from ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java
rename to ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMInputStream.java
index bb8810b..950f4cb 100644
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMInputStream.java
+++ b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/DiscordZstdFFMInputStream.java
@@ -10,9 +10,9 @@
import java.util.Objects;
@NullMarked
-class ZstdFFMInputStream extends InputStream {
+class DiscordZstdFFMInputStream extends InputStream {
- private final ZstdFFMContext context;
+ private final DiscordZstdFFMContext context;
private final MemorySegment input;
private final long inputSize;
@@ -22,7 +22,7 @@ class ZstdFFMInputStream extends InputStream {
private boolean closed = false;
- protected ZstdFFMInputStream(ZstdFFMContext context, byte[] input) {
+ protected DiscordZstdFFMInputStream(DiscordZstdFFMContext context, byte[] input) {
this.context = context;
final Arena arena = Arena.ofAuto();
diff --git a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java b/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java
deleted file mode 100644
index b4b517e..0000000
--- a/ffm-impl/src/main/java/dev/freya02/discord/zstd/ffm/ZstdFFMDecompressorFactory.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package dev.freya02.discord.zstd.ffm;
-
-import dev.freya02.discord.zstd.api.ZstdDecompressor;
-import dev.freya02.discord.zstd.api.ZstdDecompressorFactory;
-import org.jspecify.annotations.NullMarked;
-
-@NullMarked
-class ZstdFFMDecompressorFactory implements ZstdDecompressorFactory {
-
- private final int bufferSizeHint;
-
- protected ZstdFFMDecompressorFactory(int bufferSizeHint) {
- this.bufferSizeHint = bufferSizeHint;
- }
-
- @Override
- public ZstdDecompressor create() {
- return new ZstdFFMDecompressor(bufferSizeHint);
- }
-}
diff --git a/ffm-impl/src/test/java/dev/freya02/discord/zstd/ffm/ZstdFFMTest.java b/ffm-impl/src/test/java/dev/freya02/discord/zstd/ffm/ZstdFFMTest.java
index b8196c0..263ed13 100644
--- a/ffm-impl/src/test/java/dev/freya02/discord/zstd/ffm/ZstdFFMTest.java
+++ b/ffm-impl/src/test/java/dev/freya02/discord/zstd/ffm/ZstdFFMTest.java
@@ -1,10 +1,10 @@
package dev.freya02.discord.zstd.ffm;
import dev.freya02.discord.zstd.TestChunks;
+import dev.freya02.discord.zstd.api.DiscordZstdContext;
+import dev.freya02.discord.zstd.api.DiscordZstdDecompressor;
+import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory;
import dev.freya02.discord.zstd.api.DiscordZstdProvider;
-import dev.freya02.discord.zstd.api.ZstdContext;
-import dev.freya02.discord.zstd.api.ZstdDecompressor;
-import dev.freya02.discord.zstd.api.ZstdDecompressorFactory;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -25,8 +25,8 @@ public static void setup() {
@Test
public void test_decompression() {
- ZstdDecompressorFactory factory = DiscordZstdProvider.get().createDecompressorFactory(ZstdDecompressor.DEFAULT_BUFFER_SIZE);
- ZstdDecompressor decompressor = factory.create();
+ DiscordZstdDecompressorFactory factory = DiscordZstdProvider.get().createDecompressorFactory(DiscordZstdDecompressor.DEFAULT_BUFFER_SIZE);
+ DiscordZstdDecompressor decompressor = factory.create();
for (TestChunks.Chunk chunk : chunks) {
final byte[] actual = decompressor.decompress(chunk.getCompressed());
final byte[] expected = chunk.getDecompressed();
@@ -36,7 +36,7 @@ public void test_decompression() {
@Test
public void test_input_stream() throws IOException {
- ZstdContext context = DiscordZstdProvider.get().createContext();
+ DiscordZstdContext context = DiscordZstdProvider.get().createContext();
for (TestChunks.Chunk chunk : chunks) {
try (InputStream stream = context.createInputStream(chunk.getCompressed())) {
final byte[] actual = stream.readAllBytes();
diff --git a/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressor.java b/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressor.java
index 6f8fb7e..0d1d480 100644
--- a/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressor.java
+++ b/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressor.java
@@ -1,7 +1,7 @@
package dev.freya02.discord.zstd.jna;
import com.sun.jna.Pointer;
-import dev.freya02.discord.zstd.api.ZstdException;
+import dev.freya02.discord.zstd.api.DiscordZstdException;
import dev.freya02.discord.zstd.internal.AbstractZstdDecompressor;
import org.jspecify.annotations.NullMarked;
import org.slf4j.Logger;
@@ -122,8 +122,8 @@ public byte[] decompress(byte[] data)
}
}
- private ZstdException createException(String message) {
+ private DiscordZstdException createException(String message) {
invalidated = true;
- return new ZstdException(message);
+ return new DiscordZstdException(message);
}
}
diff --git a/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactory.java b/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactory.java
index c14dcef..726ea13 100644
--- a/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactory.java
+++ b/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactory.java
@@ -1,24 +1,24 @@
package dev.freya02.discord.zstd.jna;
-import dev.freya02.discord.zstd.api.ZstdDecompressor;
-import dev.freya02.discord.zstd.api.ZstdDecompressorFactory;
-import dev.freya02.discord.zstd.api.ZstdNativesLoader;
+import dev.freya02.discord.zstd.api.DiscordZstdDecompressor;
+import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory;
+import dev.freya02.discord.zstd.api.DiscordZstdNativesLoader;
import org.jspecify.annotations.NullMarked;
@NullMarked
-public class ZstdJNADecompressorFactory implements ZstdDecompressorFactory {
+public class ZstdJNADecompressorFactory implements DiscordZstdDecompressorFactory {
private final int bufferSize;
protected ZstdJNADecompressorFactory(int bufferSize) {
- if (bufferSize < ZstdDecompressor.MIN_BUFFER_SIZE && bufferSize != ZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE)
- throw new IllegalArgumentException("Buffer must be larger than or equal to " + ZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSize);
+ if (bufferSize < DiscordZstdDecompressor.MIN_BUFFER_SIZE && bufferSize != DiscordZstdDecompressor.ZSTD_RECOMMENDED_BUFFER_SIZE)
+ throw new IllegalArgumentException("Buffer must be larger than or equal to " + DiscordZstdDecompressor.MIN_BUFFER_SIZE + ", provided " + bufferSize);
this.bufferSize = bufferSize;
}
@Override
- public ZstdDecompressor create() {
- if (!ZstdNativesLoader.isLoaded()) {
+ public DiscordZstdDecompressor create() {
+ if (!DiscordZstdNativesLoader.isLoaded()) {
throw new IllegalStateException("Natives are not loaded yet, see ZstdNativesLoader");
}
return new ZstdJNADecompressor(bufferSize);
diff --git a/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactoryProvider.java b/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactoryProvider.java
index c9eeecc..7ecf0ff 100644
--- a/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactoryProvider.java
+++ b/jna-impl/src/main/java/dev/freya02/discord/zstd/jna/ZstdJNADecompressorFactoryProvider.java
@@ -1,12 +1,12 @@
package dev.freya02.discord.zstd.jna;
-import dev.freya02.discord.zstd.api.ZstdDecompressorFactory;
+import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory;
import org.jspecify.annotations.NullMarked;
@NullMarked
public class ZstdJNADecompressorFactoryProvider {
- public ZstdDecompressorFactory get(int bufferSizeHint) {
+ public DiscordZstdDecompressorFactory get(int bufferSizeHint) {
return new ZstdJNADecompressorFactory(bufferSizeHint);
}
}
diff --git a/jna-impl/src/test/java/dev/freya02/discord/zstd/jna/ZstdJNATest.java b/jna-impl/src/test/java/dev/freya02/discord/zstd/jna/ZstdJNATest.java
index 5ed3928..500fb0a 100644
--- a/jna-impl/src/test/java/dev/freya02/discord/zstd/jna/ZstdJNATest.java
+++ b/jna-impl/src/test/java/dev/freya02/discord/zstd/jna/ZstdJNATest.java
@@ -1,9 +1,9 @@
package dev.freya02.discord.zstd.jna;
import dev.freya02.discord.zstd.TestChunks;
-import dev.freya02.discord.zstd.api.ZstdDecompressor;
-import dev.freya02.discord.zstd.api.ZstdDecompressorFactory;
-import dev.freya02.discord.zstd.api.ZstdNativesLoader;
+import dev.freya02.discord.zstd.api.DiscordZstdDecompressor;
+import dev.freya02.discord.zstd.api.DiscordZstdDecompressorFactory;
+import dev.freya02.discord.zstd.api.DiscordZstdNativesLoader;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -24,10 +24,10 @@ public static void setup() {
@Test
public void test_decompression() throws IOException {
- assertTrue(ZstdNativesLoader.loadFromJar());
+ assertTrue(DiscordZstdNativesLoader.loadFromJar());
- ZstdDecompressorFactory factory = new ZstdJNADecompressorFactoryProvider().get(ZstdDecompressor.DEFAULT_BUFFER_SIZE);
- ZstdDecompressor decompressor = factory.create();
+ DiscordZstdDecompressorFactory factory = new ZstdJNADecompressorFactoryProvider().get(DiscordZstdDecompressor.DEFAULT_BUFFER_SIZE);
+ DiscordZstdDecompressor decompressor = factory.create();
for (TestChunks.Chunk chunk : chunks) {
final byte[] actual = decompressor.decompress(chunk.getCompressed());
final byte[] expected = chunk.getDecompressed();
diff --git a/jni-impl/natives/include/context.hpp b/jni-impl/natives/include/context.hpp
index 54cfe14..daa52df 100644
--- a/jni-impl/natives/include/context.hpp
+++ b/jni-impl/natives/include/context.hpp
@@ -3,17 +3,17 @@
#include