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 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); return sendStream(h3, gameReadStream);
}); });

View File

@ -1,5 +1,6 @@
import { defineClientEventHandler } from "~/server/internal/clients/event-handler"; import { defineClientEventHandler } from "~/server/internal/clients/event-handler";
import prisma from "~/server/internal/db/database"; import prisma from "~/server/internal/db/database";
import { DropManifest } from "~/server/internal/downloads/manifest";
export default defineClientEventHandler(async (h3, {}) => { export default defineClientEventHandler(async (h3, {}) => {
const query = getQuery(h3); const query = getQuery(h3);
@ -21,11 +22,34 @@ export default defineClientEventHandler(async (h3, {}) => {
setupCommand: true, setupCommand: true,
launchCommand: true, launchCommand: true,
delta: true, delta: true,
dropletManifest: true,
}, },
orderBy: { orderBy: {
versionIndex: "desc", // Latest one first 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) { async generateManifest(gameId: string, versionName: string) {
const versions: GameVersion[] = []; const versions: GameVersion[] = [];
for (let i = 0; true; i++) { const baseVersion = await prisma.gameVersion.findUnique({
const currentVersion = (
await prisma.gameVersion.findMany({
where: { where: {
gameId_versionName: {
gameId: gameId, gameId: gameId,
versionName: versionName, versionName: versionName,
}, },
orderBy: {
versionIndex: "desc", // Get highest priority first
}, },
skip: i, });
take: 1, if (!baseVersion) return undefined;
}) versions.push(baseVersion);
)[0];
// 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,
versionIndex: i,
platform: baseVersion.platform,
},
});
if (!currentVersion) return undefined; if (!currentVersion) return undefined;
versions.push(currentVersion); versions.push(currentVersion);
if (!currentVersion.delta) break; if (!currentVersion.delta) break;
} }
}
const leastToMost = versions.reverse(); const leastToMost = versions.reverse();
const metadata: DropManifestMetadata[] = leastToMost.map((e) => { const metadata: DropManifestMetadata[] = leastToMost.map((e) => {
return { return {
manifest: JSON.parse(e.dropletManifest?.toString() ?? "{}") as DropManifest, manifest: JSON.parse(
e.dropletManifest?.toString() ?? "{}"
) as DropManifest,
versionName: e.versionName, versionName: e.versionName,
}; };
}); });