Aller au contenu
s3nd.sh

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.

app/api/transfers/[[...route]]/route.ts
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.pdf

La 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.

Packagess3nd@s3nd/cli

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.