feat: der Dienst nennt sich selbst -- und Cloudflare bricht die WebP-Auslieferung

DER NAME KAM VIERMAL FEST AUS DEM QUELLTEXT: Kopfzeile, Anmeldeseite, Fusszeile
einer Freigabe, Tab-Titel -- und zwar als "d4rk_media", was der Name des
Repositorys ist und nicht der des Dienstes. Wer ihn aendern wollte, musste vier
Stellen finden und eine davon uebersehen.

Er kommt jetzt vom Server, aus der Einstellung marke.name -- DERSELBEN, die
schon in der Fusszeile der Discord-Meldungen steht ("D4RKST3R // MEDIA"). Ein
zweiter Name fuer die Oberflaeche waere ein zweiter, der beim naechsten Mal
anders lautet als der erste.

Ausgeliefert wird er ueber /api/dash/auth/config (oeffentlich, die
Anmeldeseite hat noch keine Sitzung) und in der Freigabe-Antwort (die Seite ist
oeffentlich und holt sonst nichts, was ihn kennen koennte). Angezeigt wird
"<marke> Media" -- die Marke allein waere falsch, sie steht ueber allem, was
hier laeuft.

EINE STELLE BLEIBT ABSICHTLICH: der Schluessel im Speicher des Browsers
(merker.ts) heisst weiter "d4rk_media.". Wer ihn umbenennt, wirft still alle
gemerkten Ansichtseinstellungen weg, und niemand versteht, warum die Galerie
ploetzlich wieder bei 60 Kacheln steht. Steht als Kommentar daneben.

---

UND DER NEUE NAME HAENGT HINTER CLOUDFLARE, was die WebP-Auslieferung bricht.

NPM ist sauber, sogar besser als vorgeschlagen: beide Namen auf DEMSELBEN Host,
die drei ^~-Bloecke gelten damit fuer beide. Der DNS-Eintrag geht aber ueber
Cloudflare (188.114.97.3, Server: cloudflare), waehrend fivemanage direkt auf
88.218.224.10 zeigt.

Gemessen, dieselbe Datei:

    fivemanage (direkt)      ohne Accept  ->  image/png   12295 B   richtig
                              mit Accept  ->  image/webp   2270 B   richtig

    media (Cloudflare)     1. mit Accept  ->  image/webp   2270 B   MISS
                           2. mit Accept  ->  image/webp   2270 B   HIT
                           3. OHNE Accept ->  image/webp   2270 B   HIT   FALSCH

Und andersherum genauso -- wer zuerst kommt, praegt den Zwischenspeicher fuer
alle. Es sind unsere eigenen Bytes (2270 = unsere WebP-Fassung), also kein
Polish, sondern ein Cache-Schluessel ohne Accept. Vary: Accept wird an den
Client durchgereicht, aber nicht zum Unterscheiden benutzt.

Fuer ein Lua-Skript heisst das: items/foo.png liefert WebP-Bytes unter einem
.png-Namen, und das faellt erst auf, wenn irgendwo ein Bild nicht laedt.

PUBLIC_URL ist deshalb NICHT umgestellt. Genau davor stand die Warnung im
letzten Commit, und sie war keine Vorsicht, sondern eine Vorhersage.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 00:43:29 +02:00
co-authored by Claude Opus 5
parent cf2e3d2387
commit 72fd330ae6
11 changed files with 131 additions and 8 deletions
+9 -1
View File
@@ -39,6 +39,7 @@ import { mkdir, readdir, readFile, rm, rmdir, stat } from 'node:fs/promises'
import { join } from 'node:path'
import {
DISCORD_KEYS,
MARKE_KEY,
SICHERUNG_KEYS,
ausDatenbank,
discordConfig,
@@ -265,7 +266,14 @@ dashRoutes.get('/auth/me', (c) => {
* Nur ein Ja/Nein: ob der Discord-Knopf ueberhaupt sinnvoll ist. Weder
* Client-ID noch Server-ID gehen hier heraus — die braucht das Formular
* nicht, und was nicht herausgeht, kann auch nicht abgeschrieben werden. */
dashRoutes.get('/auth/config', (c) => c.json({ discord: discordConfig().bereit }))
dashRoutes.get('/auth/config', (c) =>
c.json({
discord: discordConfig().bereit,
// Der Name gehoert MIT hier hinein, obwohl es eine Anmeldeauskunft ist:
// die Anmeldeseite braucht ihn, und die hat noch keine Sitzung. Ohne
// das muesste sie ihn erraten oder fest eingebaut mitbringen.
marke: getSetting(MARKE_KEY) || 'D4RKST3R',
}))
// Der Discord-Weg selbst. MUSS vor der Wache stehen: wer sich anmelden will,
// ist noch nicht angemeldet.
+4
View File
@@ -18,6 +18,7 @@ import { randomBytes } from 'node:crypto'
import { Hono } from 'hono'
import { db, now, type Freigabe, type Media } from '../db.js'
import { config } from '../config.js'
import { getSetting, MARKE_KEY } from '../settings.js'
import { publicUrlFor } from '../storage.js'
export const freigabeRoutes = new Hono()
@@ -63,6 +64,9 @@ freigabeRoutes.get('/:schluessel', (c) => {
.all(`${maskiert}/%`) as Pick<Media, 'path' | 'size' | 'mime' | 'dauer'>[]
return c.json({
// Auch hier der Name aus derselben Einstellung -- die Freigabeseite ist
// oeffentlich und holt sonst nichts, was ihn kennen koennte.
marke: getSetting(MARKE_KEY) || 'D4RKST3R',
titel: eintrag.titel || eintrag.ordner,
ordner: eintrag.ordner,
// Der Praefix, den die Oberflaeche abschneidet -- damit dort