mirror of
https://github.com/Drop-OSS/drop.git
synced 2025-11-18 10:41:11 +10:00
* feat: database redist support * feat: rearchitecture of database schemas, migration reset, and #180 * feat: import redists * fix: giantbomb logging bug * feat: partial user platform support + statusMessage -> message * feat: add user platform filters to store view * fix: sanitize svg uploads ... copilot suggested this I feel dirty. * feat: beginnings of platform & redist management * feat: add server side redist patching * fix: update drop-base commit * feat: import of custom platforms & file extensions * fix: redelete platform * fix: remove platform * feat: uninstall commands, new R UI * checkpoint: before migrating to nuxt v4 * update to nuxt 4 * fix: fixes for Nuxt v4 update * fix: remaining type issues * feat: initial feedback to import other kinds of versions * working commit * fix: lint * feat: redist import
70 lines
1.6 KiB
TypeScript
70 lines
1.6 KiB
TypeScript
import prisma from "../db/database";
|
|
import type { DropManifest } from "./manifest";
|
|
|
|
const TIMEOUT = 1000 * 60 * 60 * 1; // 1 hour
|
|
|
|
class DownloadContextManager {
|
|
private contexts: Map<
|
|
string,
|
|
{
|
|
timeout: Date;
|
|
manifest: DropManifest;
|
|
versionName: string;
|
|
libraryId: string;
|
|
libraryPath: string;
|
|
}
|
|
> = new Map();
|
|
|
|
async createContext(game: string, versionPath: string) {
|
|
const version = await prisma.version.findFirst({
|
|
where: {
|
|
gameId: game,
|
|
versionPath,
|
|
game: {
|
|
isNot: null,
|
|
},
|
|
},
|
|
include: {
|
|
game: {
|
|
select: {
|
|
libraryId: true,
|
|
libraryPath: true,
|
|
},
|
|
},
|
|
},
|
|
});
|
|
if (!version) return undefined;
|
|
|
|
const contextId = crypto.randomUUID();
|
|
this.contexts.set(contextId, {
|
|
timeout: new Date(),
|
|
manifest: JSON.parse(version.dropletManifest as string) as DropManifest,
|
|
versionName: versionPath,
|
|
libraryId: version.game!.libraryId!,
|
|
libraryPath: version.game!.libraryPath,
|
|
});
|
|
|
|
return contextId;
|
|
}
|
|
|
|
async fetchContext(contextId: string) {
|
|
const context = this.contexts.get(contextId);
|
|
if (!context) return undefined;
|
|
context.timeout = new Date();
|
|
this.contexts.set(contextId, context);
|
|
return context;
|
|
}
|
|
|
|
async cleanup() {
|
|
for (const key of this.contexts.keys()) {
|
|
const context = this.contexts.get(key)!;
|
|
if (context.timeout.getTime() < Date.now() - TIMEOUT) {
|
|
this.contexts.delete(key);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export const contextManager = new DownloadContextManager();
|
|
export default contextManager;
|