fix(manifests): fix delta manifest generation

This commit is contained in:
DecDuck
2024-12-06 22:16:42 +11:00
parent 789d3ba2f2
commit 6df560ca37
3 changed files with 54 additions and 17 deletions

View File

@ -60,5 +60,7 @@ export default defineEventHandler(async (h3) => {
const gameReadStream = fs.createReadStream(gameFile, { start, end: end - 1 }); // end needs to be offset by 1
console.log(`sending game chunk for ${gameId}`);
return sendStream(h3, gameReadStream);
});

View File

@ -1,5 +1,6 @@
import { defineClientEventHandler } from "~/server/internal/clients/event-handler";
import prisma from "~/server/internal/db/database";
import { DropManifest } from "~/server/internal/downloads/manifest";
export default defineClientEventHandler(async (h3, {}) => {
const query = getQuery(h3);
@ -21,11 +22,34 @@ export default defineClientEventHandler(async (h3, {}) => {
setupCommand: true,
launchCommand: true,
delta: true,
dropletManifest: true,
},
orderBy: {
versionIndex: "desc", // Latest one first
},
});
return versions;
const mappedVersions = versions
.map((version) => {
if (!version.dropletManifest) return undefined;
const manifest = JSON.parse(
version.dropletManifest.toString()
) as DropManifest;
/*
TODO: size estimates
They are a little complicated because of delta versions
Manifests need to be generated with the manifest generator and then
added up. I'm a little busy right now to implement this, though.
*/
const newVersion = { ...version, dropletManifest: undefined };
delete newVersion.dropletManifest;
return {
...newVersion,
};
})
.filter((e) => e);
return mappedVersions;
});

View File

@ -56,29 +56,40 @@ class ManifestGenerator {
async generateManifest(gameId: string, versionName: string) {
const versions: GameVersion[] = [];
for (let i = 0; true; i++) {
const currentVersion = (
await prisma.gameVersion.findMany({
const baseVersion = await prisma.gameVersion.findUnique({
where: {
gameId_versionName: {
gameId: gameId,
versionName: versionName,
},
},
});
if (!baseVersion) return undefined;
versions.push(baseVersion);
// Collect other versions if this is a delta
if (baseVersion.delta) {
// Start at the same index minus one, and keep grabbing them
// until we run out or we hit something that isn't a delta
for (let i = baseVersion.versionIndex - 1; true; i--) {
const currentVersion = await prisma.gameVersion.findFirst({
where: {
gameId: gameId,
versionName: versionName,
versionIndex: i,
platform: baseVersion.platform,
},
orderBy: {
versionIndex: "desc", // Get highest priority first
},
skip: i,
take: 1,
})
)[0];
if (!currentVersion) return undefined;
versions.push(currentVersion);
if (!currentVersion.delta) break;
});
if (!currentVersion) return undefined;
versions.push(currentVersion);
if (!currentVersion.delta) break;
}
}
const leastToMost = versions.reverse();
const metadata: DropManifestMetadata[] = leastToMost.map((e) => {
return {
manifest: JSON.parse(e.dropletManifest?.toString() ?? "{}") as DropManifest,
manifest: JSON.parse(
e.dropletManifest?.toString() ?? "{}"
) as DropManifest,
versionName: e.versionName,
};
});