ncantu 37446c8483 Fix: Increase anchor API timeout and improve error handling
**Motivations:**
- Anchor API requests were timing out with "This operation was aborted" errors
- Multiple simultaneous anchor requests can wait for mutex, causing delays
- Slow Bitcoin RPC calls can exceed the 120s timeout

**Root causes:**
- Timeout of 120s was too short when multiple anchors are in progress (mutex wait)
- Slow Bitcoin RPC operations (listunspent, createrawtransaction, sign, send) can take longer than 120s
- Insufficient logging made it difficult to diagnose timeout vs connection closure

**Correctifs:**
- Increased ANCHOR_API_TIMEOUT_MS from 120000 (120s) to 180000 (180s) to handle mutex waits and slow RPC calls
- Added start time tracking to measure elapsed time for all operations
- Enhanced logging with:
  - Log at request start with url, documentUid, hash (truncated), timeoutMs
  - Log on success with txid and elapsedMs
  - Log on abort with elapsedMs, timeoutMs, errorName, errorCode
  - Log on failure with elapsedMs, errorName, errorCode
- Improved error message to include elapsed time: "timeout or connection closed after Xs"
- Added timeout-specific log when timeout is reached (before abort)

**Evolutions:**
- Better observability with elapsed time in all logs
- More detailed error information (errorName, errorCode) for diagnosis
- Timeout log helps distinguish timeout from early connection closure

**Pages affectées:**
- api-filigrane/src/routes/watermark.js: Increased timeout, added timing and enhanced logging
- fixKnowledge/api-filigrane-anchor-request-aborted.md: Updated documentation with new timeout (180s), improved logging details, and mutex wait explanation
2026-01-28 11:29:58 +01:00
..

API Filigrane Bitcoin Signet

Auteur : Équipe 4NK Date : 2026-01-25 Version : 1.0.0

Description

API REST pour ajouter un filigrane à des documents, les convertir en PDF, et les ancrer sur la blockchain Bitcoin Signet. Cette API permet d'ancrer à la fois le document original et le document filigrané.

Caractéristiques

  • Port : 3022
  • Format : JSON REST API
  • Conversion : Tous types de documents → PDF
  • Filigrane : Ajout de texte, dates, signatures, informations blockchain
  • Ancrage : Appel automatique à l'API d'ancrage pour les deux documents

Installation

Prérequis

  • Node.js >= 18.0.0
  • Accès à l'API d'ancrage (port 3010)
  • Accès au dashboard blockchain (port 3020) pour les infos de bloc

Installation des Dépendances

cd api-filigrane
npm install

Configuration

  1. Créer le fichier .env :
# API Configuration
WATERMARK_API_PORT=3022
WATERMARK_API_HOST=0.0.0.0

# API Keys (séparées par des virgules)
API_KEYS=your-api-key-here,another-api-key

# Anchor API Configuration
ANCHOR_API_URL=http://localhost:3010

# Blockchain API Configuration (pour récupérer les infos de bloc)
BLOCKCHAIN_API_URL=http://localhost:3020

# Logging
LOG_LEVEL=info
NODE_ENV=production

Important :

  • API_KEYS : Définir au moins une clé API valide (séparées par des virgules)
  • ANCHOR_API_URL : URL de l'API d'ancrage
  • BLOCKCHAIN_API_URL : URL du dashboard blockchain pour récupérer les infos de bloc

Démarrage

Mode Développement

npm run dev

Mode Production

npm start

Avec PM2 (recommandé pour production)

# Installer PM2 globalement
sudo npm install -g pm2

# Démarrer l'API avec PM2
pm2 start src/server.js --name watermark-api

# Sauvegarder la configuration PM2
pm2 save

# Configurer PM2 pour démarrer au boot
pm2 startup
# Suivre les instructions affichées

Endpoints

GET /health

Vérifie l'état de santé de l'API.

Authentification : Non requise

Réponse :

{
  "ok": true,
  "service": "watermark-api",
  "version": "1.0.0",
  "timestamp": "2026-01-25T12:00:00.000Z"
}

POST /api/watermark/document

Ajoute un filigrane à un document, le convertit en PDF, et ancre les deux versions (originale et filigranée).

Authentification : Requise (clé API dans le header x-api-key)

Headers :

x-api-key: your-api-key-here
Content-Type: application/json

Body :

{
  "apiKey": "your-api-key-here",
  "textContent": "Texte à convertir en PDF",
  "fileData": "base64-encoded-file-data",
  "fileName": "document.pdf",
  "mimeType": "application/pdf",
  "watermarkOptions": {
    "enabled": true,
    "text": "Texte libre du filigrane",
    "signature": "Signature cryptographique",
    "watermarkedFileName": "document-watermarked.pdf",
    "originalFileName": "document-original.pdf",
    "dateUTC": true,
    "dateLocal": true,
    "blockNumber": true,
    "blockHash": true,
    "documentHash": true
  }
}

Réponse (succès) :

{
  "success": true,
  "options": { ... },
  "original": {
    "txid": "...",
    "status": "pending",
    "confirmations": 0,
    "file": {
      "name": "document-original.pdf",
      "extension": "pdf",
      "data": "base64-encoded-pdf-data"
    }
  },
  "watermarked": {
    "txid": "...",
    "status": "pending",
    "confirmations": 0,
    "file": {
      "name": "document-watermarked.pdf",
      "extension": "pdf",
      "data": "base64-encoded-pdf-data"
    }
  }
}

Options de Filigrane

  • text : Texte libre à afficher dans le filigrane (optionnel)
  • signature : Signature cryptographique à afficher (optionnel)
  • watermarkedFileName : Nom du fichier PDF filigrané (optionnel, utilise le nom d'origine avec extension .pdf si non fourni)
  • originalFileName : Nom du fichier original (optionnel, utilise "origin.md" si texte saisi et non fourni)
  • dateUTC : Ajouter la date UTC dans le filigrane (case à cocher)
  • dateLocal : Ajouter la date locale dans le filigrane (case à cocher)
  • blockNumber : Ajouter le numéro de bloc actuel (case à cocher)
  • blockHash : Ajouter le hash du bloc actuel (case à cocher)
  • documentHash : Ajouter le hash du document d'origine (case à cocher)

Le filigrane est ajouté en bas à gauche de chaque page du PDF.

Conversion de Documents

L'API convertit automatiquement :

  • Images : PNG, JPG, etc. → PDF (PNG converti en JPG puis en PDF)
  • Texte : Tous types de texte → PDF
  • PDF : Conservé tel quel

Architecture

Client (Dashboard)
  ↓ HTTPS
API Filigrane (port 3022)
  ↓ HTTP
API Ancrage (port 3010)
  ↓ RPC
Bitcoin Signet Node (port 38332)

Sécurité

  • Authentification : Clé API requise pour tous les endpoints sauf /health
  • Validation : Validation stricte des entrées
  • Limite de taille : 50MB par défaut pour les requêtes

Dépannage

L'API ne démarre pas

  • Vérifier que le port 3022 n'est pas utilisé : netstat -tlnp | grep 3022
  • Vérifier les logs : pm2 logs watermark-api
  • Vérifier la configuration dans .env

Erreur "Failed to anchor document"

  • Vérifier que l'API d'ancrage est accessible : curl http://localhost:3010/health
  • Vérifier que la clé API est valide
  • Vérifier les logs de l'API d'ancrage

Erreur de conversion PDF

  • Vérifier que les dépendances sont installées : npm install
  • Vérifier les logs pour les erreurs spécifiques

Structure des Fichiers

api-filigrane/
├── package.json
├── README.md
├── start.sh
├── .env.example
└── src/
    ├── server.js          # Serveur Express
    ├── logger.js          # Logger
    └── routes/
        ├── watermark.js   # Routes de filigrane
        └── health.js       # Routes de santé

Licence

MIT