Changeset fa24f7b in Klonkt for src


Ignore:
Timestamp:
09/23/2026 10:56:31 AM (9 hours ago)
Author:
Bart <bart@…>
Branches:
main
Children:
8a474ab
Parents:
2165b6d
git-author:
Bart <bart@…> (09/23/2026 10:56:27 AM)
git-committer:
Bart <bart@…> (09/23/2026 10:56:31 AM)
Message:

Bijlagen: 600 MB voor video, en een grens per soort

32 MB was voor een foto royaal en voor bewegend beeld niets. Een half uur 720p
op een bitrate die op een scherm goed oogt is ruim 350 MB, dus het plafond moet
daaroverheen -- maar datzelfde getal voor een JPEG laten gelden is geen limiet
meer. Dus per soort: video 600 MB, audio 64, beeld 16.

Multer kent de soort nog niet als het zijn limiet zet, dus daar staat het
hoogste getal en de soort-controle volgt in de handler.

Te groot is nu 413 en geen 400, met limit erbij: een client die zijn eigen
grens niet kent kon aan het antwoord niet zien of het over de maat ging of over
de vorm. Daar liep de app op stuk -- die hield 50 MB aan tegen 32 hier.

Co-Authored-By: Claude Opus 5 <claude@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    r2165b6d rfa24f7b  
    973973fs.mkdirSync(AP_MEDIA_DIR, { recursive: true });
    974974const AP_MEDIA_EXT = new Set(['.jpg', '.jpeg', '.png', '.webp', '.gif', '.mp3', '.m4a', '.ogg', '.opus', '.flac', '.wav', '.mp4', '.webm', '.mov']);
     975
     976// Wat een bijlage mag wegen, PER SOORT (Barts 600 MB, 22-9).
     977//
     978// Eén plafond voor alles kan hier niet meer. 32 MB was voor een foto en een
     979// spraakmemo royaal en voor bewegend beeld niets: een half uur 720p op een
     980// bitrate die op een scherm goed oogt (~1,5 Mbit/s) is ruim 350 MB, dus het
     981// plafond moet daar overheen. Datzelfde getal voor een JPEG laten gelden zou
     982// een half-gigabyte-foto toelaten, en dat is geen limiet meer.
     983//
     984// Multer kent de soort nog NIET als het zijn limiet zet -- fileFilter draait
     985// op de naam, niet op de inhoud -- dus daar staat het hoogste getal en de
     986// soort-controle volgt in de handler, zodra req.file.mimetype er is.
     987const MAX_VIDEO_BYTES = 600 * 1024 * 1024;
     988const MAX_AUDIO_BYTES = 64 * 1024 * 1024;
     989const MAX_PICTURE_BYTES = 16 * 1024 * 1024;
     990const maxBytesFor = (mime) => (mime.startsWith('video/') ? MAX_VIDEO_BYTES
     991  : mime.startsWith('audio/') ? MAX_AUDIO_BYTES : MAX_PICTURE_BYTES);
     992
    975993const apMediaUpload = multer({
    976994  storage: multer.diskStorage({
     
    978996    filename: (req, file, cb) => cb(null, `${randomUUID()}${path.extname(file.originalname || '').toLowerCase()}`),
    979997  }),
    980   limits: { fileSize: 32 * 1024 * 1024 },
     998  limits: { fileSize: MAX_VIDEO_BYTES },
    981999  fileFilter: (req, file, cb) => {
    9821000    const ext = path.extname(file.originalname || '').toLowerCase();
     
    9891007  if (!auth || auth.site.slug !== req.params.slug) return res.status(403).end();
    9901008  apMediaUpload.single('file')(req, res, (err) => {
    991     if (err) return res.status(400).json({ error: err.message });
     1009    // Te groot is 413 en geen 400: een client die zijn eigen grens niet kent
     1010    // moet aan de STATUS kunnen zien dat dit over de maat ging en niet over de
     1011    // vorm, en `limit` geeft hem het getal in plaats van een gok.
     1012    if (err) {
     1013      if (err.code === 'LIMIT_FILE_SIZE') return res.status(413).json({ error: 'File too large', limit: MAX_VIDEO_BYTES });
     1014      return res.status(400).json({ error: err.message });
     1015    }
    9921016    if (!req.file) return res.status(400).json({ error: 'No file' });
    9931017    const mime = String(req.file.mimetype || '');
     
    9951019      try { fs.unlinkSync(req.file.path); } catch { /* best effort */ }
    9961020      return res.status(400).json({ error: 'Media must be an image, audio or video file' });
     1021    }
     1022    // De soort-grens, nu de soort bekend is. Het bestand staat al op schijf --
     1023    // multer schrijft tijdens het ontvangen -- dus opruimen hoort erbij.
     1024    const maxBytes = maxBytesFor(mime);
     1025    if (req.file.size > maxBytes) {
     1026      try { fs.unlinkSync(req.file.path); } catch { /* best effort */ }
     1027      return res.status(413).json({ error: 'File too large', limit: maxBytes });
    9971028    }
    9981029    // A video gets a poster frame next to it (shaer-zowq), best-effort and
Note: See TracChangeset for help on using the changeset viewer.