Skip to content

Commit e65a111

Browse files
committed
feat: add client-side security and API notations to .internal contents
1 parent ea21a3b commit e65a111

8 files changed

Lines changed: 89 additions & 8 deletions

File tree

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package es.superstrellaa.storagemanager;
22

3-
import es.superstrellaa.storagemanager.internal.SQLiteBackend;
4-
import es.superstrellaa.storagemanager.internal.cache.WriteCache;
5-
import es.superstrellaa.storagemanager.internal.lifecycle.ShutdownHook;
3+
import es.superstrellaa.storagemanager.internal.lifecycle.ServerBootstrap;
4+
import net.fabricmc.api.EnvType;
65
import net.fabricmc.api.ModInitializer;
6+
import net.fabricmc.loader.api.FabricLoader;
77
import org.slf4j.Logger;
88
import org.slf4j.LoggerFactory;
99

@@ -12,14 +12,28 @@ public class StorageManagerAPI implements ModInitializer {
1212
public static final String MOD_ID = "storagemanager-api";
1313
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
1414

15-
//TODO General: Optimizar algo más, separar clases grandes en varias pequeñas y nuevas funcionalidades(añadir sistema de usar otro tipo de Backend aparte de SQLite, como texto plano(json, xml...) o PostgreSQL/MySQL)
15+
/**
16+
* TODO:
17+
* * - Ver cómo hacerlo en mundos singleplayer
18+
*
19+
* * - Optimizar algo más el rendimiento, especialmente en la parte de escritura, para reducir la latencia y mejorar la eficiencia general.
20+
* * - Separar clases grandes en varias más pequeñas para mejorar la mantenibilidad y la claridad del código.
21+
* * - Añadir nuevas funcionalidades, como la capacidad de usar diferentes tipos de backend aparte de SQLite, como texto plano (JSON, XML...)
22+
* * o bases de datos relacionales(PostgreSQL/MySQL) para ofrecer más flexibilidad y cosas raras
23+
*
24+
* * - Hacer el readme de los huevos y la wiki (importante en el readme agregar que .internal no se toca)
25+
* * - Ah y el modrinth/curseforge
26+
* */
1627

1728
@Override
1829
public void onInitialize() {
19-
SQLiteBackend.init();
20-
WriteCache.getInstance().start();
21-
ShutdownHook.register();
30+
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER) {
31+
ServerBootstrap.register();
32+
} else {
33+
LOGGER.warn("StorageManager API is running in client-side enviroment.");
34+
LOGGER.warn("This is normal, but keep in mind that all API operations will be no-ops and won't have any effect.");
35+
}
2236

23-
LOGGER.info("StorageManager API initialized with write-behind cache");
37+
LOGGER.info("StorageManager API initialized (common)");
2438
}
2539
}

src/main/java/es/superstrellaa/storagemanager/internal/SQLiteBackend.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package es.superstrellaa.storagemanager.internal;
22

33
import es.superstrellaa.storagemanager.StorageManagerAPI;
4+
import org.jetbrains.annotations.ApiStatus;
45

56
import java.nio.file.Files;
67
import java.nio.file.Path;
78
import java.sql.Connection;
89
import java.sql.DriverManager;
910
import java.sql.Statement;
1011

12+
@ApiStatus.Internal
1113
public final class SQLiteBackend {
1214

1315
private static Connection connection;

src/main/java/es/superstrellaa/storagemanager/internal/StoragePaths.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package es.superstrellaa.storagemanager.internal;
22

33
import net.fabricmc.loader.api.FabricLoader;
4+
import org.jetbrains.annotations.ApiStatus;
45

56
import java.nio.file.Path;
67

8+
@ApiStatus.Internal
79
public final class StoragePaths {
810

911
private static final Path BASE_DIR =

src/main/java/es/superstrellaa/storagemanager/internal/TableExecutor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
import es.superstrellaa.storagemanager.api.schema.Column;
66
import es.superstrellaa.storagemanager.api.schema.TableSchema;
77
import es.superstrellaa.storagemanager.internal.cache.WriteCache;
8+
import org.jetbrains.annotations.ApiStatus;
89

910
import java.sql.*;
1011
import java.util.ArrayList;
1112
import java.util.List;
1213
import java.util.Map;
1314
import java.util.StringJoiner;
1415

16+
@ApiStatus.Internal
1517
public final class TableExecutor {
1618

1719
/**

src/main/java/es/superstrellaa/storagemanager/internal/cache/WriteCache.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import es.superstrellaa.storagemanager.StorageManagerAPI;
44
import es.superstrellaa.storagemanager.api.data.RowData;
55
import es.superstrellaa.storagemanager.internal.SQLiteBackend;
6+
import org.jetbrains.annotations.ApiStatus;
67

78
import java.sql.PreparedStatement;
89
import java.sql.SQLException;
@@ -12,6 +13,7 @@
1213
import java.util.concurrent.ScheduledExecutorService;
1314
import java.util.concurrent.TimeUnit;
1415

16+
@ApiStatus.Internal
1517
public final class WriteCache {
1618

1719
private static final long FLUSH_INTERVAL_MS = 5000;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package es.superstrellaa.storagemanager.internal.lifecycle;
2+
3+
import es.superstrellaa.storagemanager.StorageManagerAPI;
4+
import es.superstrellaa.storagemanager.internal.SQLiteBackend;
5+
import es.superstrellaa.storagemanager.internal.cache.WriteCache;
6+
import es.superstrellaa.storagemanager.internal.middleware.ServerGuard;
7+
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
8+
9+
public final class ServerBootstrap {
10+
11+
private static boolean initialized = false;
12+
13+
public static void register() {
14+
ServerLifecycleEvents.SERVER_STARTED.register(server -> {
15+
if (initialized) return;
16+
17+
SQLiteBackend.init();
18+
WriteCache.getInstance().start();
19+
ShutdownHook.register();
20+
21+
ServerGuard.markServerReady();
22+
23+
initialized = true;
24+
StorageManagerAPI.LOGGER.info("StorageManager API initialized (server-side)");
25+
});
26+
}
27+
28+
private ServerBootstrap() {}
29+
}

src/main/java/es/superstrellaa/storagemanager/internal/lifecycle/ShutdownHook.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import es.superstrellaa.storagemanager.internal.SQLiteBackend;
44
import es.superstrellaa.storagemanager.internal.cache.WriteCache;
55
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
6+
import org.jetbrains.annotations.ApiStatus;
67

8+
@ApiStatus.Internal
79
public final class ShutdownHook {
810

911
public static void register() {
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package es.superstrellaa.storagemanager.internal.middleware;
2+
3+
import es.superstrellaa.storagemanager.StorageManagerAPI;
4+
import net.fabricmc.api.EnvType;
5+
import net.fabricmc.loader.api.FabricLoader;
6+
import org.jetbrains.annotations.ApiStatus;
7+
8+
@ApiStatus.Internal
9+
public final class ServerGuard {
10+
11+
private static volatile boolean serverReady = false;
12+
13+
public static void markServerReady() {
14+
serverReady = true;
15+
}
16+
17+
public static void requireServer() {
18+
if (!serverReady) {
19+
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER) {
20+
StorageManagerAPI.LOGGER.error("StorageManager API is not ready yet! This likely means that you are trying to use it during mod initialization, which is too early. Please wait until the server has started.");
21+
} else {
22+
StorageManagerAPI.LOGGER.warn("StorageManager API isn't meant for here! This likely means that you are trying to use it on the client side, which is not supported. Please only use the API on the server side.");
23+
}
24+
}
25+
}
26+
27+
private ServerGuard() {}
28+
}

0 commit comments

Comments
 (0)