Installation
Installer
Le paquet s'installe depuis son dépôt, avec un compte GitHub qui y a accès. Il est compilé à l'installation :
npm install github:FCAgreatgoals/lfp-webhooks
Il s'importe ensuite sous le nom @fca.gg/lfp-webhooks.
Serveur autonome
Suffisant quand le bot n'expose rien d'autre en HTTP :
import { createReceiver } from '@fca.gg/lfp-webhooks'
import { listen } from '@fca.gg/lfp-webhooks/node'
const receiver = createReceiver({ secret: process.env.LFP_WEBHOOKS_SECRET })
await listen(receiver, 8080, { path: '/hooks/lfp' })
Options de listen() et createServer() :
path: le chemin écouté,/par défaut. Toute autre route répond404;maxBodySize: taille maximale du corps en octets, 5 Mio par défaut. Au-delà, le serveur répond413;host: l'adresse d'écoute (listen()seulement).
createServer(receiver, options) rend le serveur node:http sans l'ouvrir, et listen() se résout une fois le port écouté.
Express
Le corps doit arriver brut : express.json() l'aurait consommé et re-sérialisé, ce qui invaliderait la signature.
import express from 'express'
import { createReceiver } from '@fca.gg/lfp-webhooks'
import { lfpWebhooks } from '@fca.gg/lfp-webhooks/express'
const app = express()
const receiver = createReceiver({ secret: process.env.LFP_WEBHOOKS_SECRET })
app.post('/hooks/lfp', express.raw({ type: 'application/json' }), lfpWebhooks(receiver))
Sans corps brut, le middleware répond 500 en expliquant quoi monter.
Fastify
import { createReceiver } from '@fca.gg/lfp-webhooks'
import { registerLfpWebhooks } from '@fca.gg/lfp-webhooks/fastify'
const receiver = createReceiver({ secret: process.env.LFP_WEBHOOKS_SECRET })
registerLfpWebhooks(app, receiver, { path: '/hooks/lfp' })
registerLfpWebhooks déclare l'analyseur de contenu qui conserve le corps brut. Si votre application en a déjà un pour application/json, passez contentTypeParser: false et fournissez vous-même un Buffer dans request.body.
Votre propre serveur
handle() ne suppose rien du serveur : donnez-lui le corps brut et les en-têtes, il rend le statut et le corps à renvoyer.
const { status, body } = receiver.handle(rawBody, headers)
La réponse part tout de suite, et les gestionnaires s'exécutent ensuite, en file.
Options du récepteur
createReceiver({
secret, // secret de la signature HMAC ; sans lui, elle n'est pas vérifiée
token, // jeton attendu dans `Authorization: Bearer <token>`
dedupeSize, // identifiants de livraison retenus (512 par défaut, 0 désactive)
onError, // erreurs des gestionnaires (console.error par défaut)
})
Voir Sécurité pour choisir entre signature et jeton.
Arrêter proprement
receiver.flush() se résout quand toute livraison acceptée a été traitée : attendez-la avant de quitter le processus, ou dans vos tests.
process.on('SIGTERM', async () => {
await receiver.flush()
process.exit(0)
})