Game specialisation & delta versions (#323)

* feat: game specialisation, auto-guess extensions

* fix: enforce specialisation specific schema at API level

* fix: lint

* feat: partial work on depot endpoints

* feat: bump torrential

* feat: dummy version creation for depot uploads

* fix: lint

* fix: types

* fix: lint

* feat: depot version import

* fix: lint

* fix: remove any type

* fix: lint

* fix: push update interval

* fix: cpu usage calculation

* feat: delta version support

* feat: style tweaks for selectlaunch.vue

* fix: lint
This commit is contained in:
DecDuck
2026-01-23 05:04:38 +00:00
committed by GitHub
parent d8db5b5b85
commit 00adab21c2
46 changed files with 1164 additions and 347 deletions
+51
View File
@@ -0,0 +1,51 @@
import { type } from "arktype";
import { readDropValidatedBody, throwingArktype } from "~/server/arktype";
import aclManager from "~/server/internal/acls";
import prisma from "~/server/internal/db/database";
const UploadManifest = type({
gameId: "string",
versionName: "string",
manifest: type({
version: "'2'",
size: "number",
key: "16 <= number[] <= 16",
chunks: type({
["string"]: {
checksum: "string",
iv: "16 <= number[] <= 16",
files: type({
filename: "string",
start: "number",
length: "number",
permissions: "number",
}).array(),
},
}),
}),
fileList: "string[]",
}).configure(throwingArktype);
export default defineEventHandler(async (h3) => {
const allowed = await aclManager.allowSystemACL(h3, ["depot:upload:new"]);
if (!allowed) throw createError({ statusCode: 403 });
const { gameId, versionName, manifest, fileList } =
await readDropValidatedBody(h3, UploadManifest);
const version = await prisma.unimportedGameVersion.create({
data: {
game: {
connect: {
id: gameId,
},
},
versionName,
manifest,
fileList,
},
});
return { id: version.id };
});