Cas d’usage
Une drop box pour votre équipe
Une route sur votre propre domaine, un jeton par personne, et un code au lieu d’un envoi dans la messagerie.
import { createBucket, createTransferHandler } from 's3nd'
const tokens = new Set(process.env.DROP_TOKENS!.split(','))
export const { GET, POST, DELETE } = createTransferHandler({
bucket: createBucket({ bucket: 'drop' }),
expiresIn: 24 * 3600,
raw: 'redirect', // downloads go straight from the bucket, presigned
authorize: (request) => tokens.has(request.headers.get('authorization')?.replace('Bearer ', '') ?? ''),
})
// $ s3nd --remote https://drop.example.com/api/transfers --token $TOKEN put ./deck.pdfLa situation
Ce qui se passe vraiment.
Le problème
Dans une équipe, les fichiers circulent en pièces jointes et en envois dans la messagerie, chacun une copie sur les serveurs de quelqu’un d’autre. Donner les clés du bucket à tout le monde n’est pas une option, et un lecteur partagé est un autre genre de désordre.
Ce que s3nd y fait
Montez le handler de transfert sur un domaine à vous et passez une fonction authorize qui vérifie un jeton. Chaque personne a un jeton, pas une clé. La CLI le vise avec --remote, un navigateur utilise les mêmes quatre routes via les hooks React, et curl fonctionne aussi. Les fichiers atterrissent dans votre bucket sous un code et expirent tout seuls.
À surveiller
Les choses faciles à rater.
Limitez le débit de la lecture
Un code est un jeton au porteur et quarante bits sont tout le secret. Une limite de débit sur GET /:code est ce qui rend la devinette inutile.
raw: redirect pour les gros fichiers
Avec, un téléchargement répond 302 avec une URL présignée, donc les octets ne transitent jamais deux fois par votre serveur. Sans, ils y passent en streaming, ce qui va bien pour de petits fichiers et coûte cher pour de gros.
doctor --remote comme smoke test
Il fait l’aller-retour d’un vrai transfert contre le déploiement et sort avec un code non nul en cas d’échec. Mettez-le dans le pipeline de déploiement.
Voir aussi
D’autres formes de la même primitive.
Déposez un fichier. Donnez le code.
Pointez-le sur le bucket que vous payez déjà. Rien à déployer, aucune inscription, personne au milieu.