From 8872d127a9e706ac359ea824f17dc47614284b36 Mon Sep 17 00:00:00 2001 From: reidlab Date: Mon, 13 Oct 2025 00:46:46 -0700 Subject: [PATCH 1/2] make the cache act right --- src/cache.ts | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/cache.ts b/src/cache.ts index 2a370d3..587285e 100644 --- a/src/cache.ts +++ b/src/cache.ts @@ -26,16 +26,21 @@ try { let entriesClearedBytes = 0; log.debug("cache cleanup and expiry timers starting"); - await Promise.all((await db.select().from(fileCacheTable)).map(async ({ name, expiry }) => { + const results = await Promise.all((await db.select().from(fileCacheTable)).map(async ({ name, expiry }) => { if (expiry < Date.now()) { - entriesCleared++; - entriesClearedBytes += (await fsPromises.stat(path.join(config.downloader.cache.directory, name))).size; - await dropFile(name); + return await dropFile(name); } else { await scheduleDeletion(name, expiry); } })); + for (const result of results) { + if (result !== undefined) { + entriesCleared += 1; + entriesClearedBytes += result; + } + } + log.debug("cache cleanup complete!"); log.debug(`cleared ${entriesCleared} entr${entriesCleared === 1 ? "y" : "ies"}, freeing up ${prettyBytes(entriesClearedBytes)}!`); } catch (err) { @@ -56,19 +61,26 @@ async function scheduleDeletion(name: string, expiry: number): Promise { timers.set(name, timeout); } -async function dropFile(name: string): Promise { - const size = (await fsPromises.stat(path.join(config.downloader.cache.directory, name))).size; - await fsPromises.unlink(path.join(config.downloader.cache.directory, name)).catch((err) => { - if (err.code !== "ENOENT") { - log.error(`failed to delete cached file ${name} for whatever reason!`); - log.error("manual removal may be necessary!"); - log.error(err); - } - }); +// TODO: add behavior toggle: should we keep it in the database on failure or not ?? +// current behavior: delete from db first, then try deleting files +// this is good if manual cleanup was already done (we can then ignore ENOENT) +// bad if they change the permissions instead of manual removal +async function dropFile(name: string): Promise { + try { + await db.delete(fileCacheTable).where(eq(fileCacheTable.name, name)); + const size = (await fsPromises.stat(path.join(config.downloader.cache.directory, name))).size; + await fsPromises.unlink(path.join(config.downloader.cache.directory, name)); - log.debug(`deleted file ${name} from cache, freeing up ${prettyBytes(size)}`); + log.debug(`deleted file ${name} from cache, freeing up ${prettyBytes(size)}`); - await db.delete(fileCacheTable).where(eq(fileCacheTable.name, name)); + return size; + } catch (err) { + if (err instanceof Error && err.message.includes("ENOENT")) { return; } + + log.error(`failed to delete cached file ${name} for whatever reason!`); + log.error("manual removal may be necessary!"); + log.error(err); + } } export async function addFileToCache(fileName: string): Promise { From 6670b57674be140b77e6101a954101cab726aa4f Mon Sep 17 00:00:00 2001 From: reidlab Date: Sun, 19 Oct 2025 01:40:15 -0700 Subject: [PATCH 2/2] drop dotenv, upd pkg hash :earnest: --- flake.nix | 2 +- package-lock.json | 13 ------------- package.json | 1 - src/cache.ts | 1 + src/config.ts | 11 +++++++++-- src/database/index.ts | 1 + 6 files changed, 12 insertions(+), 17 deletions(-) diff --git a/flake.nix b/flake.nix index 68d430e..9b63883 100644 --- a/flake.nix +++ b/flake.nix @@ -25,7 +25,7 @@ # uncomment this and let the build fail, then get the current hash # very scuffed but endorsed! # npmDepsHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; - npmDepsHash = "sha256-11AayHpPu7ocBPRB5k4SU7b99Aqc/dufAy2Yg5oPvGE="; + npmDepsHash = "sha256-7DsCZ+wDLvpqBch2rVbXiSxIaYdITX3RCHfjNx0wUKs="; nativeBuildInputs = with pkgs; [ makeWrapper ]; diff --git a/package-lock.json b/package-lock.json index 1a43d01..059c73c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,6 @@ "callsites": "^4.2.0", "chalk": "^5.4.1", "data-uri-to-buffer": "^6.0.2", - "dotenv": "^17.2.1", "drizzle-orm": "^0.44.4", "express": "^5.1.0", "express-handlebars": "^8.0.3", @@ -2797,18 +2796,6 @@ "node": ">=6.0.0" } }, - "node_modules/dotenv": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.1.tgz", - "integrity": "sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, "node_modules/drizzle-kit": { "version": "0.31.4", "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.4.tgz", diff --git a/package.json b/package.json index 996108e..45c3ad6 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "callsites": "^4.2.0", "chalk": "^5.4.1", "data-uri-to-buffer": "^6.0.2", - "dotenv": "^17.2.1", "drizzle-orm": "^0.44.4", "express": "^5.1.0", "express-handlebars": "^8.0.3", diff --git a/src/cache.ts b/src/cache.ts index 587285e..12671a0 100644 --- a/src/cache.ts +++ b/src/cache.ts @@ -6,6 +6,7 @@ import fsPromises from "fs/promises"; import { and, eq } from "drizzle-orm"; import * as log from "./log.js"; import prettyBytes from "pretty-bytes"; +import process from "node:process"; // try creating cache if it doesn't exist // a bit scuffed but that ok diff --git a/src/config.ts b/src/config.ts index 8fc5655..a03bd57 100644 --- a/src/config.ts +++ b/src/config.ts @@ -2,10 +2,17 @@ import fs from "node:fs"; import * as log from "./log.js"; import toml from "toml"; import { z, ZodError, ZodObject } from "zod"; -import * as dotenv from "dotenv"; import { fromZodError } from "zod-validation-error"; +import process from "node:process"; -dotenv.config({ quiet: true }); +try { + process.loadEnvFile("./.env"); +} catch (err) { + if (err instanceof Error && !err.message.includes("ENOENT")) { + log.error("error reading or parsing evv file!"); + log.error(err); + } +} const configSchema = z.object({ server: z.object({ diff --git a/src/database/index.ts b/src/database/index.ts index b33804d..b41c7a2 100644 --- a/src/database/index.ts +++ b/src/database/index.ts @@ -2,6 +2,7 @@ import { createClient } from "@libsql/client"; import { config, env } from "../config.js"; import { drizzle } from "drizzle-orm/libsql"; import { migrate } from "drizzle-orm/libsql/migrator"; +import process from "node:process"; import fsPromises from "fs/promises"; import * as log from "../log.js";