@communecter/cocolight-api-client 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,194 @@
1
+ # Cocolight API Client
2
+
3
+ Ce module fournit un client JavaScript prêt à l'emploi pour interagir avec l'API Cocolight. Il encapsule la gestion des appels HTTP, l'authentification, la validation des schémas, la gestion des erreurs, ainsi qu'un ensemble de normalisations des données pour simplifier l'intégration côté client.
4
+
5
+ ## 📦 Installation
6
+
7
+ ```bash
8
+ npm install @communecter/cocolight-api-client
9
+ ```
10
+
11
+ ## 🧭 Objectif
12
+
13
+ Ce client facilite l'intégration avec l'API Cocolight en offrant :
14
+
15
+ - Des appels simplifiés avec `axios`
16
+ - Un système de validation des entrées/sorties avec AJV
17
+ - La gestion automatique du token d'accès et du token de rafraîchissement
18
+ - Un circuit breaker configurable
19
+ - Un logger intégré avec Pino
20
+ - Des outils de transformation de données compatibles MongoDB/EJSON
21
+ - La gestion des appels API à partir de métadonnées JSON (endpoints)
22
+
23
+ ## 🧱 Architecture
24
+
25
+ Le projet est structuré autour des fichiers suivants :
26
+
27
+ ```
28
+ src/
29
+ ApiClient.js # Client principal : logique d'appel, authentification, validation, transformation
30
+ EJSONType.js # Support pour les ObjectID MongoDB avec EJSON
31
+ endpoints.module.js # Fichier généré avec les définitions d'endpoints (voir ci-dessous)
32
+ error.js # Erreurs personnalisées (ApiClientError, CircuitBreakerError)
33
+ package.json # Dépendances, scripts, métadonnées
34
+ ```
35
+
36
+ ## imports
37
+
38
+ ### ESM
39
+
40
+ ```js
41
+ import ApiClient from "@communecter/cocolight-api-client";
42
+ ```
43
+ ### CommonJS
44
+
45
+ ```js
46
+ const { default: ApiClient } = require("@communecter/cocolight-api-client");
47
+ ```
48
+
49
+
50
+ ## 🔧 Utilisation de base
51
+
52
+ ```js
53
+ import ApiClient from "@communecter/cocolight-api-client";
54
+
55
+ const client = new ApiClient({
56
+ baseURL: "https://mon-api.com",
57
+ accessToken: "token-jwt",
58
+ refreshToken: "token-refresh"
59
+ });
60
+
61
+ client.on("refreshSuccess", (tokens) => {
62
+ console.log("Token rafraîchi", tokens);
63
+ });
64
+
65
+ const res = await client.callEndpoint("GET_USER_INFO", {
66
+ pathParams: { userId: "@userId" }
67
+ });
68
+
69
+ console.log(res.data);
70
+ ```
71
+
72
+ ## 📜 API détaillée
73
+
74
+ ### `new ApiClient(options)`
75
+
76
+ | Option | Type | Description |
77
+ |---------------------------|------------|-------------|
78
+ | `baseURL` (requis) | `string` | URL de base de l'API |
79
+ | `accessToken` | `string` | Token d'accès initial |
80
+ | `refreshToken` | `string` | Token de rafraîchissement |
81
+ | `refreshUrl` | `string` | URL pour rafraîchir le token (défaut : `/api/cocolight/refreshtoken`) |
82
+ | `endpoints` | `Array` | Liste des endpoints (par défaut : `endpoints.module.js`) |
83
+ | `timeout` | `number` | Timeout en ms (défaut : `30000`) |
84
+ | `debug` | `boolean` | Active le logger debug (défaut : `false`) |
85
+ | `maxRetries` | `number` | Nombre de tentatives max (défaut : `0`) |
86
+ | `circuitBreakerThreshold` | `number` | Seuil d'erreurs avant blocage (défaut : `5`) |
87
+ | `circuitBreakerResetTime` | `number` | Délai de réactivation (en ms, défaut : `60000`) |
88
+ | `fromJSONValue` | `boolean` | Applique `EJSON.fromJSONValue` sur les réponses (défaut : `true`) |
89
+
90
+ ### Méthodes principales
91
+
92
+ #### `callEndpoint(constant, data, transform, validate)`
93
+ Effectue un appel à un endpoint défini via `endpoints.module.js`.
94
+
95
+ - `constant`: nom unique du endpoint
96
+ - `data`: objet avec `pathParams` et données du corps
97
+ - `transform`: `true` (par défaut), `false`, ou fonction de transformation
98
+ - `validate`: `true` (par défaut), permet de valider la réponse via AJV
99
+
100
+ #### `setToken(token)` / `getToken()`
101
+ Gère le token d'accès.
102
+
103
+ #### `setRefreshToken(rt)` / `getRefreshToken()`
104
+ Gère le token de rafraîchissement.
105
+
106
+ #### `resetSession()`
107
+ Réinitialise la session utilisateur.
108
+
109
+ ### Événements
110
+
111
+ - `refreshSuccess` — déclenché après un rafraîchissement réussi
112
+ - `validationError` — déclenché si AJV détecte des erreurs
113
+ - `sessionReset` — déclenché par `resetSession()`
114
+
115
+ ## 🛠️ Scripts disponibles
116
+
117
+ Depuis `package.json` :
118
+
119
+ - `npm run test` — Lance les tests via Jest
120
+ - `npm run exemple` — Lance un exemple
121
+ - `npm run lint` / `lint:fix` — Vérifie et corrige le code avec ESLint
122
+ - `npm run build` — Génère les builds navigateur + Node via Webpack
123
+ - `npm run generate:*` — Génère les modules, documentation ou données de test depuis les fichiers JSON d’API
124
+
125
+ ## 🧩 Dépendances principales
126
+
127
+ - `axios` & `axios-retry` — pour les appels HTTP robustes
128
+ - `ajv` & `ajv-formats` — pour la validation JSON Schema
129
+ - `ejson` — pour la compatibilité MongoDB (ObjectID, dates...)
130
+ - `pino` — logger performant, compatible navigateur
131
+ - `events` — pour la gestion des événements custom côté client
132
+
133
+ ## 🗃️ Format des endpoints
134
+
135
+ Chaque endpoint dans `endpoints.module.js` suit le schéma :
136
+ ```js
137
+ {
138
+ constant: "GET_USER_INFO",
139
+ method: "GET",
140
+ path: "/api/users/{userId}",
141
+ auth: "bearer",
142
+ pathParams: { type: "object", properties: { userId: { type: "string" } }, required: ["userId"] },
143
+ request: { ...schemaAjv },
144
+ responses: { "200": { ...schemaAjv } },
145
+ postActions: [
146
+ { type: "setToken", path: "accessToken" },
147
+ { type: "setUserId", path: "user._id" }
148
+ ]
149
+ }
150
+ ```
151
+
152
+ ## 🔒 Sécurité et circuit breaker
153
+
154
+ Un circuit breaker est intégré :
155
+ - Blocage temporaire après trop d’échecs (`circuitBreakerThreshold`)
156
+ - Réactivation après un délai (`circuitBreakerResetTime`)
157
+ - Journalisation complète avec `pino`
158
+
159
+ ## 🧪 Validation AJV
160
+
161
+ Chaque appel est validé avant (requête) et après (réponse) via AJV. En cas d’erreur, l’événement `validationError` est déclenché avec les détails.
162
+
163
+ ## 🔄 Rafraîchissement automatique
164
+
165
+ Si une réponse retourne 401, le client tente automatiquement un appel POST vers `refreshUrl` avec le `refreshToken`, et réessaie l’appel initial si réussi.
166
+
167
+ ## 🧼 Transformation des données
168
+
169
+ Les réponses sont normalisées :
170
+ - Champs dates, images, IDs MongoDB
171
+ - Structures communes comme `results`, `news`, `notif`, `replies`, etc.
172
+ - Conversion EJSON via `EJSON.fromJSONValue()`
173
+
174
+ ## 🧙 Valeurs dynamiques
175
+
176
+ Dans les données `pathParams`, il est possible d’utiliser des alias dynamiques :
177
+
178
+ ```js
179
+ pathParams: {
180
+ userId: "@userId",
181
+ accessToken: "@accessToken"
182
+ }
183
+ ```
184
+
185
+ Ces valeurs seront automatiquement résolues à partir du contexte du client.
186
+
187
+ ## Licence
188
+
189
+ MIT
190
+
191
+ ## 👤 Auteur
192
+
193
+ Thomas Craipeau
194
+