Aller au contenu principal

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épond 404 ;
  • maxBodySize : taille maximale du corps en octets, 5 Mio par défaut. Au-delà, le serveur répond 413 ;
  • 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)
})