diff --git a/server/api/v1/client/chunk.get.ts b/server/api/v1/client/chunk.get.ts index af193a9..eefdc12 100644 --- a/server/api/v1/client/chunk.get.ts +++ b/server/api/v1/client/chunk.get.ts @@ -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); }); diff --git a/server/api/v1/client/metadata/versions.get.ts b/server/api/v1/client/metadata/versions.get.ts index b79dabf..92c9094 100644 --- a/server/api/v1/client/metadata/versions.get.ts +++ b/server/api/v1/client/metadata/versions.get.ts @@ -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; }); diff --git a/server/internal/downloads/manifest.ts b/server/internal/downloads/manifest.ts index f29fecc..598f51c 100644 --- a/server/internal/downloads/manifest.ts +++ b/server/internal/downloads/manifest.ts @@ -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, }; });