@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 +194 -0
- package/dist/cocolight-api-client.browser.js +7 -0
- package/dist/cocolight-api-client.cjs +1 -0
- package/dist/cocolight-api-client.cjs.js +1 -0
- package/dist/cocolight-api-client.mjs.js +1 -0
- package/package.json +79 -0
- package/src/ApiClient.js +1083 -0
- package/src/EJSONType.js +53 -0
- package/src/endpoints.module.js +4026 -0
- package/src/error.js +20 -0
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
|
+
|