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 = ( where: {
await prisma.gameVersion.findMany({ 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: { where: {
gameId: gameId, gameId: gameId,
versionName: versionName, versionIndex: i,
platform: baseVersion.platform,
}, },
orderBy: { });
versionIndex: "desc", // Get highest priority first if (!currentVersion) return undefined;
}, versions.push(currentVersion);
skip: i, if (!currentVersion.delta) break;
take: 1, }
})
)[0];
if (!currentVersion) return undefined;
versions.push(currentVersion);
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,
}; };
}); });