mirror of
https://github.com/Drop-OSS/drop.git
synced 2025-11-15 09:11:21 +10:00
feat: partial user platform support + statusMessage -> message
This commit is contained in:
@ -31,7 +31,7 @@ export function defineClientEventHandler<T>(handler: EventHandlerFunction<T>) {
|
||||
if (!client)
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: "No clients created.",
|
||||
message: "No clients created.",
|
||||
});
|
||||
clientId = client.id;
|
||||
break;
|
||||
@ -55,7 +55,7 @@ export function defineClientEventHandler<T>(handler: EventHandlerFunction<T>) {
|
||||
// We reject the request
|
||||
throw createError({
|
||||
statusCode: 403,
|
||||
statusMessage: "Nonce expired",
|
||||
message: "Nonce expired",
|
||||
});
|
||||
}
|
||||
|
||||
@ -66,21 +66,21 @@ export function defineClientEventHandler<T>(handler: EventHandlerFunction<T>) {
|
||||
if (!certBundle)
|
||||
throw createError({
|
||||
statusCode: 403,
|
||||
statusMessage: "Invalid client ID",
|
||||
message: "Invalid client ID",
|
||||
});
|
||||
|
||||
const valid = droplet.verifyNonce(certBundle.cert, nonce, signature);
|
||||
if (!valid)
|
||||
throw createError({
|
||||
statusCode: 403,
|
||||
statusMessage: "Invalid nonce signature.",
|
||||
message: "Invalid nonce signature.",
|
||||
});
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
throw createError({
|
||||
statusCode: 403,
|
||||
statusMessage: "No authentication",
|
||||
message: "No authentication",
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -88,7 +88,7 @@ export function defineClientEventHandler<T>(handler: EventHandlerFunction<T>) {
|
||||
if (clientId === undefined)
|
||||
throw createError({
|
||||
statusCode: 500,
|
||||
statusMessage: "Failed to execute authentication pipeline.",
|
||||
message: "Failed to execute authentication pipeline.",
|
||||
});
|
||||
|
||||
async function fetchClient() {
|
||||
|
||||
@ -80,15 +80,15 @@ export class ClientHandler {
|
||||
if (!clientId)
|
||||
throw createError({
|
||||
statusCode: 403,
|
||||
statusMessage: "Invalid or unknown code.",
|
||||
message: "Invalid or unknown code.",
|
||||
});
|
||||
const metadata = this.temporaryClientTable.get(clientId);
|
||||
if (!metadata)
|
||||
throw createError({ statusCode: 500, statusMessage: "Broken code." });
|
||||
throw createError({ statusCode: 500, message: "Broken code." });
|
||||
if (metadata.peer)
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: "Pre-existing listener for this code.",
|
||||
message: "Pre-existing listener for this code.",
|
||||
});
|
||||
metadata.peer = peer;
|
||||
this.temporaryClientTable.set(clientId, metadata);
|
||||
@ -129,12 +129,12 @@ export class ClientHandler {
|
||||
if (!client)
|
||||
throw createError({
|
||||
statusCode: 500,
|
||||
statusMessage: "Corrupted code, please restart the process.",
|
||||
message: "Corrupted code, please restart the process.",
|
||||
});
|
||||
if (!client.peer)
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: "Client has not connected yet. Please try again later.",
|
||||
message: "Client has not connected yet. Please try again later.",
|
||||
});
|
||||
await client.peer.send(
|
||||
JSON.stringify({ type: "token", value: `${clientId}/${token}` }),
|
||||
|
||||
@ -15,7 +15,7 @@ import { GameNotFoundError, type LibraryProvider } from "./provider";
|
||||
import { logger } from "../logging";
|
||||
import { createHash } from "node:crypto";
|
||||
import type { ImportVersion } from "~/server/api/v1/admin/import/version/index.post";
|
||||
import type { GameVersionLaunchCreateManyGameVersionInputEnvelope } from "~/prisma/client/models";
|
||||
import type { LaunchOptionCreateManyGameVersionInput } from "~/prisma/client/models";
|
||||
|
||||
export function createGameImportTaskId(libraryId: string, libraryPath: string) {
|
||||
return createHash("md5")
|
||||
@ -311,7 +311,7 @@ class LibraryManager {
|
||||
umuIdOverride: metadata.umuId,
|
||||
|
||||
onlySetup: metadata.onlySetup,
|
||||
setup: metadata.setup,
|
||||
setupCommand: metadata.setup,
|
||||
setupArgs: metadata.setupArgs,
|
||||
|
||||
launches: {
|
||||
@ -323,7 +323,7 @@ class LibraryManager {
|
||||
description: v.description,
|
||||
launchCommand: v.launchCommand,
|
||||
launchArgs: v.launchArgs,
|
||||
}) satisfies GameVersionLaunchCreateManyGameVersionInputEnvelope["data"],
|
||||
}) satisfies LaunchOptionCreateManyGameVersionInput,
|
||||
),
|
||||
},
|
||||
},
|
||||
|
||||
@ -32,7 +32,7 @@ class SaveManager {
|
||||
},
|
||||
});
|
||||
if (!save)
|
||||
throw createError({ statusCode: 404, statusMessage: "Save not found" });
|
||||
throw createError({ statusCode: 404, message: "Save not found" });
|
||||
|
||||
const newSaveObjectId = randomUUID();
|
||||
const newSaveStream = await objectHandler.createWithStream(
|
||||
@ -43,7 +43,7 @@ class SaveManager {
|
||||
if (!newSaveStream)
|
||||
throw createError({
|
||||
statusCode: 500,
|
||||
statusMessage: "Failed to create writing stream to storage backend.",
|
||||
message: "Failed to create writing stream to storage backend.",
|
||||
});
|
||||
|
||||
let hash: string | undefined;
|
||||
@ -64,7 +64,7 @@ class SaveManager {
|
||||
await objectHandler.deleteAsSystem(newSaveObjectId);
|
||||
throw createError({
|
||||
statusCode: 500,
|
||||
statusMessage: "Hash failed to generate",
|
||||
message: "Hash failed to generate",
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -80,7 +80,7 @@ class ScreenshotManager {
|
||||
if (!saveStream)
|
||||
throw createError({
|
||||
statusCode: 500,
|
||||
statusMessage: "Failed to create writing stream to storage backend.",
|
||||
message: "Failed to create writing stream to storage backend.",
|
||||
});
|
||||
|
||||
// pipe into object store
|
||||
|
||||
@ -1,18 +1,27 @@
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
import type { EventHandlerRequest, H3Event } from "h3";
|
||||
import type { Dump, Pull, Register } from "../objects/transactional";
|
||||
import { ObjectTransactionalHandler } from "../objects/transactional";
|
||||
|
||||
type RecursiveType =
|
||||
| { [key: string]: RecursiveType }
|
||||
| string
|
||||
| number
|
||||
| Array<RecursiveType>;
|
||||
|
||||
export async function handleFileUpload(
|
||||
h3: H3Event<EventHandlerRequest>,
|
||||
metadata: { [key: string]: string },
|
||||
permissions: Array<string>,
|
||||
max = -1,
|
||||
): Promise<[string[], { [key: string]: string }, Pull, Dump, Register] | undefined> {
|
||||
): Promise<
|
||||
[string[], { [key: string]: RecursiveType }, Pull, Dump, Register] | undefined
|
||||
> {
|
||||
const formData = await readMultipartFormData(h3);
|
||||
if (!formData) return undefined;
|
||||
const transactionalHandler = new ObjectTransactionalHandler();
|
||||
const [add, pull, dump] = transactionalHandler.new(metadata, permissions);
|
||||
const options: { [key: string]: string } = {};
|
||||
const options: any = {};
|
||||
const ids = [];
|
||||
|
||||
for (const entry of formData) {
|
||||
@ -25,7 +34,14 @@ export async function handleFileUpload(
|
||||
}
|
||||
if (!entry.name) continue;
|
||||
|
||||
options[entry.name] = entry.data.toString("utf-8");
|
||||
const path = entry.name.split(".");
|
||||
let v = options;
|
||||
for (const pathPart of path.slice(0, -1)) {
|
||||
(v as any)[pathPart] ??= {};
|
||||
v = (v as any)[pathPart];
|
||||
}
|
||||
|
||||
(v as any)[path.at(-1)!] = entry.data.toString("utf-8");
|
||||
}
|
||||
|
||||
return [ids, options, pull, dump, add];
|
||||
|
||||
Reference in New Issue
Block a user