feat: store .jsdos bundle inside game directory instead of as flat file
Build & Deploy / build-and-deploy (push) Successful in 52s

Before: data/games/{id}.jsdos (flat, alongside the game dir)
After:  data/games/{id}/{id}.jsdos (inside the game directory)

Benefits:
- Delete is atomic — removing the game dir removes everything
- Cleaner data directory structure
- No orphan .jsdos files on delete

Also updated frontend bundleUrl() to use game.bundle_file from
the backend, making it path-agnostic. Old flat layout is still
served via StaticResource for backward compat.
This commit is contained in:
Hermes Agent
2026-05-29 23:07:07 +02:00
parent 4c3ded802b
commit ab1ba503ff
3 changed files with 7 additions and 6 deletions
+3 -1
View File
@@ -106,7 +106,9 @@ export function artworkUrl(path) {
/** Get game bundle URL for normal play */
export function bundleUrl(game) {
if (!game) return null;
return `/games/${game.id}.jsdos`;
// Use the bundle_file path from the backend (handles both old flat layout
// and new in-directory layout transparently)
return `/games/${game.bundle_file}`;
}
/** Get game bundle URL for setup mode (runs SETUP.EXE instead) */
+1 -2
View File
@@ -127,9 +127,8 @@ public class GameService {
}
});
}
// Remove flat .jsdos bundle
// Clean up old flat .jsdos locations (pre-game-dir layout — backward compat)
Files.deleteIfExists(gamesDir.resolve(id + ".jsdos"));
// Remove flat setup .jsdos bundle (if any)
Files.deleteIfExists(gamesDir.resolve(id + ".setup.jsdos"));
return true;
}
@@ -95,9 +95,9 @@ public class UploadResource {
Path gameDir = svc.gameDir(gameId);
Files.createDirectories(gameDir);
// Create .jsdos bundle (ZIP with game files + .jsdos/ config)
String bundleFile = gameId + ".jsdos";
Path bundlePath = svc.getGamesDir().resolve(bundleFile);
// Create .jsdos bundle inside the game directory
String bundleFile = gameId + "/" + gameId + ".jsdos";
Path bundlePath = gameDir.resolve(gameId + ".jsdos");
createBundle(extractDir, mainExe, bundlePath);
// Detect platform (DOS vs Windows) by reading the main EXE header