Les Hooks

Dans cette section, nou allons découvrir les hooks de Duplo, leur utilité et comment les utiliser pour étendre les fonctionnalités de votre application. Tous les exemples présentés dans cette section sont disponibles en entier ici.

  1. Exemple minimal
  2. Qu’est-ce qu’un hook ?
  3. Comment utiliser les hooks
  4. Cas d’utilisation des hooks
    1. Exemple d’utilisation dans la réalisation d’un plugin CORS
  5. Types de hooks
    1. Hooks de route
    2. Hooks de serveur

Exemple minimal

import { Duplo } from "@duplojs/core";

const duplo = new Duplo({
    environment: "DEV",
});

duplo.hook(
    "onError", 
    (request, error) => {
        console.error(`${request.method} ${request.path} - Error:`, error);
    }
);

Dans cet exemple :

  • Ă€ travers l’instance Duplo, nous avons enregistrĂ© un hook onError.
  • Ce hook est dĂ©clenchĂ© Ă  chaque fois qu’une erreur se produit dans une route.
  • Il affiche dans la console le message d’erreur associĂ© Ă  la requĂŞte.

Qu’est-ce qu’un hook ?

Un hook est un mécanisme qui permet d’intercepter et de réagir à des événements spécifiques dans l’application. Il s’agit d’une fonction qui est appelée automatiquement par Duplo lorsqu’un événement particulier se produit, comme une requête HTTP, une erreur ou la fin du traitement d’une requête. Dans Duplo, on distingue deux catégories de hooks :

  • Hooks de route : Ils sont liĂ©s aux requĂŞtes HTTP et permettent d’effectuer des actions avant ou après le traitement d’une requĂŞte.
  • Hooks de serveur : Ils sont liĂ©s au cycle de vie du serveur et permettent d’effectuer des actions lors de son initialisation.

Comment utiliser les hooks

Pour utiliser les hooks dans Duplo, vous devez d’abord créer une instance Duplo. Ensuite, vous pouvez enregistrer des hooks en utilisant la méthode hook de l’instance. Cette méthode prend deux arguments :

  1. Le nom du hook (par exemple, onRequest, onError, etc.)
  2. La fonction de rappel (callback) qui sera exécutée lorsque le hook est déclenché.

Cas d’utilisation des hooks

Les hooks sont particulièrement utiles pour étendre les fonctionnalités de votre application, par exemple :

  • Gestion des erreurs : Vous pouvez enregistrer un hook pour capturer les erreurs et les enregistrer dans un fichier de log ou les afficher dans la console.
  • Modification des requĂŞtes : Vous pouvez utiliser un hook pour modifier les en-tĂŞtes de la requĂŞte ou le corps de la requĂŞte avant qu’elle ne soit traitĂ©e par une route.
  • Modification des rĂ©ponses : Vous pouvez utiliser un hook pour modifier les en-tĂŞtes de rĂ©ponse ou le corps de la rĂ©ponse avant qu’elle ne soit envoyĂ©e au client.

Les hooks permettent également de créer des plugins réutilisables qui peuvent être partagés entre différentes applications Duplo. Par exemple, vous pouvez créer un plugin pour gérer les en-têtes CORS.

Exemple d’utilisation dans la réalisation d’un plugin CORS

import { type Duplo, OkHttpResponse } from "@duplojs/core";

export function cors(allowOrigin: string) {
	return function(instance: Duplo) {
		instance.hook(
			"beforeSend",
			(_request, response) => {
				response.setHeader(
					"Access-Control-Allow-Origin",
					allowOrigin,
				);
				response.setHeader(
					"Access-Control-Expose-Headers",
					instance.config.keyToInformationInHeaders,
				);
			},
		);
		instance.hook(
			"beforeRouteExecution",
			(request) => {
				if (request.method === "OPTIONS" && request.matchedPath === null) {
					return new OkHttpResponse("cors").setHeader("Access-Control-Allow-Headers", "*");
				}
			},
		);
	};
}

Dans cet exemple :

  • Un plugin CORS est créé en utilisant un hook beforeSend pour ajouter les en-tĂŞtes CORS Ă  la rĂ©ponse.
  • Un hook beforeRouteExecution est utilisĂ© pour gĂ©rer les requĂŞtes OPTIONS et renvoyer une rĂ©ponse appropriĂ©e si la route n’est pas trouvĂ©e.

Types de hooks

Hooks de route

Nom du hook Description
beforeRouteExecution Appelé avant l’exécution d’une route.
parsingBody Appelé avant l’analyse du corps de la requête.
onError Appelé lorsqu’une erreur se produit lors du traitement d’une requête.
beforeSend Appelé avant l’envoi de la réponse.
serializeBody Appelé avant la sérialisation du corps de la réponse.
afterSend Appelé après l’envoi de la réponse.

Hooks de serveur

Nom du hook Description
onStart Appelé lorsque le serveur démarre.
 onHttpServerError Appelé lorsqu’une erreur se produit au niveau du serveur HTTP.
onRegistered Appelé lorsqu’une route est enregistrée.
beforeBuildRouter Appelé avant la construction du routeur.