@communecter/cocolight-api-client 1.0.200 → 1.0.201

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@communecter/cocolight-api-client",
3
- "version": "1.0.200",
3
+ "version": "1.0.201",
4
4
  "description": "Client Axios simplifié pour l'API cocolight",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,4 +1,6 @@
1
1
  import { EventEmitter } from "events";
2
+ import { type ApiClientLogger } from "./utils/logger.js";
3
+ export type { ApiClientLogger } from "./utils/logger.js";
2
4
  import { type TokenStorageStrategy } from "./utils/TokenStorage.js";
3
5
  /**
4
6
  * Résultat retourné quand une requête est **mise en file** (offline ou breaker).
@@ -19,7 +21,17 @@ export interface ApiClientOptions {
19
21
  refreshUrl?: string;
20
22
  endpoints?: any[];
21
23
  timeout?: number;
24
+ /**
25
+ * Niveau `debug` (sinon `info`) du logger de CE client, sans effet sur les autres. Avec un `logger`
26
+ * fourni : appliqué s'il sait faire des enfants (pino → enfant au niveau `debug`), ignoré sinon.
27
+ */
22
28
  debug?: boolean;
29
+ /**
30
+ * Logger à utiliser à la place de celui de la lib (pino ou tout objet à `debug/info/warn/error`) :
31
+ * un serveur peut passer le sien, ou un logger muet. Par défaut, un enfant du logger pino partagé
32
+ * du processus (un seul transport par processus, cf. utils/logger.ts).
33
+ */
34
+ logger?: ApiClientLogger | null;
23
35
  maxRetries?: number;
24
36
  circuitBreakerThreshold?: number;
25
37
  circuitBreakerResetTime?: number;
@@ -108,7 +120,7 @@ export default class ApiClient extends EventEmitter {
108
120
  private _offlineClientManager;
109
121
  private _ajv;
110
122
  private _ajvNoDefaults;
111
- _logger: any;
123
+ _logger: ApiClientLogger;
112
124
  private _client;
113
125
  private readonly _breakerThreshold;
114
126
  private readonly _breakerResetTime;
@@ -121,7 +133,7 @@ export default class ApiClient extends EventEmitter {
121
133
  private _mode;
122
134
  /** Contexte costum du SITE appelant, injecté sur les endpoints qui le déclarent (cf. setSiteCostum). */
123
135
  private _siteCostum;
124
- constructor({ baseURL, accessToken, refreshToken, refreshUrl, endpoints, timeout, debug, maxRetries, circuitBreakerThreshold, circuitBreakerResetTime, fromJSONValue, mode, tokenStorageStrategy, costumForceLive, siteCostum }: ApiClientOptions);
136
+ constructor({ baseURL, accessToken, refreshToken, refreshUrl, endpoints, timeout, debug, logger, maxRetries, circuitBreakerThreshold, circuitBreakerResetTime, fromJSONValue, mode, tokenStorageStrategy, costumForceLive, siteCostum }: ApiClientOptions);
125
137
  /**
126
138
  * Déclare l'identité costum du SITE APPELANT — l'entité au nom de laquelle ce front agit.
127
139
  *
@@ -217,6 +229,7 @@ export default class ApiClient extends EventEmitter {
217
229
  private _resetCircuitBreakerSuccess;
218
230
  static stripNullsInPlace(obj: any): any;
219
231
  private _resolveSpecialValuesInPlace;
232
+ /** Nettoyage « anonyme » d'un schéma (alias `@xxx`), mémoïsé par schéma source — cf. utils/validators.ts. */
220
233
  private _cleanSchemaLeftoverAlias;
221
234
  /**
222
235
  * Safely calls an asynchronous function and handles any errors that occur.
@@ -458,7 +471,6 @@ export default class ApiClient extends EventEmitter {
458
471
  * @returns La donnée normalisée.
459
472
  */
460
473
  private _normalizeRecursively;
461
- private _startBeforeEndValidate;
462
474
  /**
463
475
  * Récupère le schéma de requête pour un endpoint donné.
464
476
  * @param constant - Le nom de l'endpoint.
package/types/index.d.ts CHANGED
@@ -44,7 +44,7 @@ export type { default as Api } from "./Api.js";
44
44
  export type { default as ApiClient } from "./ApiClient.js";
45
45
  export type { default as EndpointApi } from "./api/EndpointApi.js";
46
46
  export type { UserApi } from "./api/UserApi.js";
47
- export type { ApiClientOptions, CallEndpointData, CallEndpointResult, CallEndpointResponse, ApiClientOfflineEnqueueResult } from "./ApiClient.js";
47
+ export type { ApiClientOptions, ApiClientLogger, CallEndpointData, CallEndpointResult, CallEndpointResponse, ApiClientOfflineEnqueueResult } from "./ApiClient.js";
48
48
  export type { TokenStorageStrategy } from "./utils/TokenStorage.js";
49
49
  export type { MultiServerTokenStorageStrategy } from "./utils/MultiServerTokenStorageStrategy.js";
50
50
  export type { default as OfflineClientManager } from "./utils/OfflineClientManager.js";
@@ -0,0 +1,29 @@
1
+ /** Ce que l'ApiClient attend d'un logger : les quatre niveaux, rien d'autre (duck-typing, pino ou non). */
2
+ export interface ApiClientLogger {
3
+ debug: (...args: unknown[]) => void;
4
+ info: (...args: unknown[]) => void;
5
+ warn: (...args: unknown[]) => void;
6
+ error: (...args: unknown[]) => void;
7
+ }
8
+ type RootLogger = ApiClientLogger & {
9
+ child: (bindings: object, options?: {
10
+ level?: string;
11
+ }) => ApiClientLogger;
12
+ };
13
+ /** Le logger racine du processus, créé au premier appel. */
14
+ export declare function getRootLogger(): RootLogger;
15
+ /**
16
+ * Le logger d'UN client. Sans `logger` fourni : un enfant du logger racine au niveau demandé (un enfant
17
+ * pino ne crée ni thread ni flux : vingt clients coûtent zéro thread). Avec un `logger` fourni : lui-même,
18
+ * sauf si `debug` est demandé ET qu'il sait faire des enfants (pino) — on lui demande alors un enfant au
19
+ * niveau `debug`, pour que l'option tienne sa promesse même avec le logger d'un serveur réglé sur `info`.
20
+ * Un logger sans `child` (console, objet maison) est rendu tel quel : `debug` est alors sans effet.
21
+ */
22
+ export declare function createClientLogger(debug: boolean, logger?: ApiClientLogger | null): ApiClientLogger;
23
+ /**
24
+ * Pour les tests : oublie la racine (la prochaine demande en recrée une), après avoir vidé et fermé son
25
+ * flux — en dev/test la racine porte un transport `pino-pretty` (worker + listener `exit`) qu'on ne
26
+ * veut pas orpheliner à chaque reset.
27
+ */
28
+ export declare function _resetRootLoggerForTests(): Promise<void>;
29
+ export {};
@@ -0,0 +1,27 @@
1
+ import type { ValidateFunction } from "ajv";
2
+ export type AjvVariant = "defaults" | "noDefaults";
3
+ /** Fonction de validation AJV. */
4
+ export type Validator = ValidateFunction;
5
+ /** L'instance AJV partagée d'une variante, construite au premier appel. */
6
+ export declare function getAjv(variant: AjvVariant): any;
7
+ /**
8
+ * Le validateur compilé d'un schéma.
9
+ * - sans `dynamic` : le schéma est un objet STABLE (contrat, ou nettoyage mémoïsé) → cache par identité,
10
+ * illimité mais faible (WeakMap).
11
+ * - `dynamic: true` : le schéma vient d'être construit (enveloppe costum) → cache borné, indexé par `key`
12
+ * (cf. `dynamicKey`) ou, à défaut, par le JSON du schéma entier.
13
+ */
14
+ export declare function getValidator(schema: object, variant?: AjvVariant, opts?: {
15
+ dynamic?: boolean;
16
+ key?: string;
17
+ }): Validator;
18
+ /**
19
+ * Clé du cache borné pour un schéma recomposé à partir d'un schéma de base STABLE (identité) et d'un
20
+ * complément VARIABLE (sérialisé) : on ne sérialise que le complément — l'enveloppe costum, quelques
21
+ * champs — jamais le schéma du contrat entier (plusieurs dizaines de Ko avec ses `$defs`).
22
+ */
23
+ export declare function dynamicKey(base: object, extra: unknown): string;
24
+ /** Version nettoyée d'un schéma du contrat, la MÊME d'un appel à l'autre pour le même schéma source. */
25
+ export declare function cleanSchemaLeftoverAlias<T>(schema: T): T;
26
+ /** Pour les tests : taille du cache borné d'une variante. */
27
+ export declare function _dynamicCacheSizeForTests(variant: AjvVariant): number;