@nodefony/http 10.0.0-alpha.1
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/LICENSE +544 -0
- package/README.md +77 -0
- package/dist/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/decorate.js +9 -0
- package/dist/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/decorateMetadata.js +6 -0
- package/dist/_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/decorateParam.js +8 -0
- package/dist/index.js +108 -0
- package/dist/nodefony/command/assetsPublishCommand.js +102 -0
- package/dist/nodefony/command/certificatesCommand.js +47 -0
- package/dist/nodefony/command/networkCommand.js +27 -0
- package/dist/nodefony/command/proxyGenerateCommand.js +66 -0
- package/dist/nodefony/config/config.js +335 -0
- package/dist/nodefony/config/defineModuleConfig.js +93 -0
- package/dist/nodefony/interfaces/IContext.js +1 -0
- package/dist/nodefony/interfaces/ICookie.js +1 -0
- package/dist/nodefony/interfaces/IErrorRenderer.js +1 -0
- package/dist/nodefony/interfaces/IHttpConfig.js +1 -0
- package/dist/nodefony/interfaces/IHttpKernel.js +1 -0
- package/dist/nodefony/interfaces/IRequest.js +1 -0
- package/dist/nodefony/interfaces/IRequestLogger.js +1 -0
- package/dist/nodefony/interfaces/IResponse.js +1 -0
- package/dist/nodefony/interfaces/ISession.js +1 -0
- package/dist/nodefony/interfaces/IUpload.js +1 -0
- package/dist/nodefony/interfaces/index.js +1 -0
- package/dist/nodefony/service/HttpAdminApi.js +376 -0
- package/dist/nodefony/service/ProfilerAdminApi.js +73 -0
- package/dist/nodefony/service/audit-logger.js +159 -0
- package/dist/nodefony/service/certificates.js +545 -0
- package/dist/nodefony/service/error-renderer.js +320 -0
- package/dist/nodefony/service/http-kernel.js +948 -0
- package/dist/nodefony/service/pretty-request-logger.js +72 -0
- package/dist/nodefony/service/request-logger.js +54 -0
- package/dist/nodefony/service/servers/clientError.js +20 -0
- package/dist/nodefony/service/servers/server-http.js +135 -0
- package/dist/nodefony/service/servers/server-https.js +204 -0
- package/dist/nodefony/service/servers/server-static.js +192 -0
- package/dist/nodefony/service/servers/server-websocket-secure.js +104 -0
- package/dist/nodefony/service/servers/server-websocket.js +104 -0
- package/dist/nodefony/service/servers/serverShutdown.js +31 -0
- package/dist/nodefony/service/servers/wsHeartbeat.js +64 -0
- package/dist/nodefony/service/sessions/sessions-service.js +580 -0
- package/dist/nodefony/service/trace.js +72 -0
- package/dist/nodefony/service/upload/upload-service.js +171 -0
- package/dist/nodefony/src/assets/collectAssets.js +34 -0
- package/dist/nodefony/src/assets/prebuiltUi.js +125 -0
- package/dist/nodefony/src/context/Context.js +415 -0
- package/dist/nodefony/src/context/domainMatcher.js +88 -0
- package/dist/nodefony/src/context/forwarded.js +185 -0
- package/dist/nodefony/src/context/http/HttpContext.js +309 -0
- package/dist/nodefony/src/context/http/Request.js +543 -0
- package/dist/nodefony/src/context/http/Response.js +368 -0
- package/dist/nodefony/src/context/http/parser.js +188 -0
- package/dist/nodefony/src/context/http/urlFastPath.js +103 -0
- package/dist/nodefony/src/context/http2/Request.js +29 -0
- package/dist/nodefony/src/context/http2/Response.js +97 -0
- package/dist/nodefony/src/context/metaData.js +47 -0
- package/dist/nodefony/src/context/requestId.js +41 -0
- package/dist/nodefony/src/context/trustProxy.js +167 -0
- package/dist/nodefony/src/context/websocket/Response.js +181 -0
- package/dist/nodefony/src/context/websocket/WebsocketContext.js +389 -0
- package/dist/nodefony/src/context/websocket/wsBackpressure.js +56 -0
- package/dist/nodefony/src/context/websocket/wsLogContent.js +68 -0
- package/dist/nodefony/src/cookies/cookie.js +258 -0
- package/dist/nodefony/src/errors/httpError.js +69 -0
- package/dist/nodefony/src/profiler/FrameProfile.js +95 -0
- package/dist/nodefony/src/profiler/Profiler.js +139 -0
- package/dist/nodefony/src/proxy/generateProxyConfig.js +157 -0
- package/dist/nodefony/src/rateLimit/IRateLimitStore.js +1 -0
- package/dist/nodefony/src/rateLimit/MemoryRateLimitStore.js +146 -0
- package/dist/nodefony/src/rateLimit/WsConnectionCounter.js +64 -0
- package/dist/nodefony/src/rateLimit/rateLimitFilters.js +20 -0
- package/dist/nodefony/src/servers/portBinder.js +114 -0
- package/dist/nodefony/src/session/session.js +390 -0
- package/dist/nodefony/src/session/storage/MemorySessionStorage.js +185 -0
- package/dist/nodefony/src/session/storage/RevocationGuardStorage.js +137 -0
- package/dist/nodefony/src/session/storage/sessionFilters.js +83 -0
- package/dist/nodefony/src/session/storage/sessionSort.js +53 -0
- package/dist/types/index.d.ts +83 -0
- package/dist/types/nodefony/command/assetsPublishCommand.d.ts +23 -0
- package/dist/types/nodefony/command/certificatesCommand.d.ts +17 -0
- package/dist/types/nodefony/command/networkCommand.d.ts +8 -0
- package/dist/types/nodefony/command/proxyGenerateCommand.d.ts +19 -0
- package/dist/types/nodefony/config/config.d.ts +197 -0
- package/dist/types/nodefony/config/defineModuleConfig.d.ts +39 -0
- package/dist/types/nodefony/interfaces/IContext.d.ts +138 -0
- package/dist/types/nodefony/interfaces/ICookie.d.ts +47 -0
- package/dist/types/nodefony/interfaces/IErrorRenderer.d.ts +55 -0
- package/dist/types/nodefony/interfaces/IHttpConfig.d.ts +12 -0
- package/dist/types/nodefony/interfaces/IHttpKernel.d.ts +10 -0
- package/dist/types/nodefony/interfaces/IRequest.d.ts +35 -0
- package/dist/types/nodefony/interfaces/IRequestLogger.d.ts +31 -0
- package/dist/types/nodefony/interfaces/IResponse.d.ts +39 -0
- package/dist/types/nodefony/interfaces/ISession.d.ts +283 -0
- package/dist/types/nodefony/interfaces/IUpload.d.ts +66 -0
- package/dist/types/nodefony/interfaces/index.d.ts +7 -0
- package/dist/types/nodefony/service/HttpAdminApi.d.ts +18 -0
- package/dist/types/nodefony/service/ProfilerAdminApi.d.ts +23 -0
- package/dist/types/nodefony/service/audit-logger.d.ts +143 -0
- package/dist/types/nodefony/service/certificates.d.ts +246 -0
- package/dist/types/nodefony/service/error-renderer.d.ts +74 -0
- package/dist/types/nodefony/service/http-kernel.d.ts +377 -0
- package/dist/types/nodefony/service/pretty-request-logger.d.ts +25 -0
- package/dist/types/nodefony/service/request-logger.d.ts +18 -0
- package/dist/types/nodefony/service/servers/clientError.d.ts +14 -0
- package/dist/types/nodefony/service/servers/server-http.d.ts +42 -0
- package/dist/types/nodefony/service/servers/server-https.d.ts +41 -0
- package/dist/types/nodefony/service/servers/server-static.d.ts +62 -0
- package/dist/types/nodefony/service/servers/server-websocket-secure.d.ts +29 -0
- package/dist/types/nodefony/service/servers/server-websocket.d.ts +29 -0
- package/dist/types/nodefony/service/servers/serverShutdown.d.ts +27 -0
- package/dist/types/nodefony/service/servers/wsHeartbeat.d.ts +46 -0
- package/dist/types/nodefony/service/sessions/sessions-service.d.ts +218 -0
- package/dist/types/nodefony/service/trace.d.ts +39 -0
- package/dist/types/nodefony/service/upload/upload-service.d.ts +61 -0
- package/dist/types/nodefony/src/assets/collectAssets.d.ts +35 -0
- package/dist/types/nodefony/src/assets/prebuiltUi.d.ts +99 -0
- package/dist/types/nodefony/src/context/Context.d.ts +195 -0
- package/dist/types/nodefony/src/context/domainMatcher.d.ts +67 -0
- package/dist/types/nodefony/src/context/forwarded.d.ts +95 -0
- package/dist/types/nodefony/src/context/http/HttpContext.d.ts +85 -0
- package/dist/types/nodefony/src/context/http/Request.d.ts +203 -0
- package/dist/types/nodefony/src/context/http/Response.d.ts +68 -0
- package/dist/types/nodefony/src/context/http/parser.d.ts +65 -0
- package/dist/types/nodefony/src/context/http/urlFastPath.d.ts +52 -0
- package/dist/types/nodefony/src/context/http2/Request.d.ts +14 -0
- package/dist/types/nodefony/src/context/http2/Response.d.ts +20 -0
- package/dist/types/nodefony/src/context/metaData.d.ts +58 -0
- package/dist/types/nodefony/src/context/requestId.d.ts +28 -0
- package/dist/types/nodefony/src/context/trustProxy.d.ts +77 -0
- package/dist/types/nodefony/src/context/websocket/Response.d.ts +53 -0
- package/dist/types/nodefony/src/context/websocket/WebsocketContext.d.ts +125 -0
- package/dist/types/nodefony/src/context/websocket/wsBackpressure.d.ts +73 -0
- package/dist/types/nodefony/src/context/websocket/wsLogContent.d.ts +37 -0
- package/dist/types/nodefony/src/cookies/cookie.d.ts +88 -0
- package/dist/types/nodefony/src/errors/httpError.d.ts +15 -0
- package/dist/types/nodefony/src/profiler/FrameProfile.d.ts +110 -0
- package/dist/types/nodefony/src/profiler/Profiler.d.ts +192 -0
- package/dist/types/nodefony/src/proxy/generateProxyConfig.d.ts +76 -0
- package/dist/types/nodefony/src/rateLimit/IRateLimitStore.d.ts +98 -0
- package/dist/types/nodefony/src/rateLimit/MemoryRateLimitStore.d.ts +40 -0
- package/dist/types/nodefony/src/rateLimit/WsConnectionCounter.d.ts +37 -0
- package/dist/types/nodefony/src/rateLimit/rateLimitFilters.d.ts +18 -0
- package/dist/types/nodefony/src/servers/portBinder.d.ts +102 -0
- package/dist/types/nodefony/src/session/session.d.ts +171 -0
- package/dist/types/nodefony/src/session/storage/MemorySessionStorage.d.ts +77 -0
- package/dist/types/nodefony/src/session/storage/RevocationGuardStorage.d.ts +81 -0
- package/dist/types/nodefony/src/session/storage/sessionFilters.d.ts +102 -0
- package/dist/types/nodefony/src/session/storage/sessionSort.d.ts +45 -0
- package/docs/cookies.md +365 -0
- package/docs/index.md +163 -0
- package/docs/observabilite.md +460 -0
- package/docs/rate-limit.md +372 -0
- package/docs/servers.md +935 -0
- package/docs/session.md +768 -0
- package/docs/upload.md +460 -0
- package/package.json +101 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import type pkg from "node-forge";
|
|
2
|
+
import { Service, Module } from "nodefony";
|
|
3
|
+
/**
|
|
4
|
+
* Type-valeur du backend node-forge runtime (objet `.pki`/`.md`). L'import type
|
|
5
|
+
* `pkg` sert pour les namespaces de types (`pkg.pki.Certificate`) ; `ForgeModule`
|
|
6
|
+
* pour la valeur chargée dynamiquement (node-forge est un module `export =`).
|
|
7
|
+
*/
|
|
8
|
+
type ForgeModule = typeof import("node-forge");
|
|
9
|
+
/** Algorithmes de hachage de signature autorisés (SHA-1 banni). */
|
|
10
|
+
export type CertHash = "sha256" | "sha384" | "sha512";
|
|
11
|
+
/** Stratégie de fourniture du certificat exposée en configuration. */
|
|
12
|
+
export type CertStrategyConfig = "auto" | "mkcert" | "selfsigned" | "explicit";
|
|
13
|
+
export interface OpensslOptions {
|
|
14
|
+
/** Taille de la clé RSA (bits). */
|
|
15
|
+
size: number;
|
|
16
|
+
/** Algorithme de hachage de la signature (jamais SHA-1). */
|
|
17
|
+
hash: CertHash;
|
|
18
|
+
/** Durée de validité du certificat (jours). */
|
|
19
|
+
validityDays: number;
|
|
20
|
+
/** Recul de `notBefore` (minutes) — tolérance au décalage d'horloge client. */
|
|
21
|
+
backdateMinutes: number;
|
|
22
|
+
/** Attributs du sujet/issuer (commonName, organizationName…). */
|
|
23
|
+
attrs: pkg.pki.CertificateField[];
|
|
24
|
+
}
|
|
25
|
+
/** Options de génération du certificat TLS en mode développement. */
|
|
26
|
+
export interface CertificateDevOptions {
|
|
27
|
+
/**
|
|
28
|
+
* Préférer `mkcert` (CA locale ajoutée au trust store système) pour générer
|
|
29
|
+
* le certificat de dev. Donne un HTTPS sans erreur navigateur — indispensable
|
|
30
|
+
* pour les sous-ressources cross-origin (Vite) et le WSS du HMR.
|
|
31
|
+
* Si `mkcert` est absent, on retombe sur un auto-signé node-forge (non trusté).
|
|
32
|
+
* Ignoré hors `development`.
|
|
33
|
+
*/
|
|
34
|
+
useMkcert: boolean;
|
|
35
|
+
}
|
|
36
|
+
/** Subject Alternative Name explicite (sinon dérivé du kernel). */
|
|
37
|
+
export interface CertificateSanOptions {
|
|
38
|
+
/** Noms DNS (RFC 5280 §4.2.1.6) — font foi pour la vérification d'hôte. */
|
|
39
|
+
dns: string[];
|
|
40
|
+
/** Adresses IP. */
|
|
41
|
+
ip: string[];
|
|
42
|
+
}
|
|
43
|
+
export interface CertificateOptions {
|
|
44
|
+
/**
|
|
45
|
+
* Comment fournir le certificat. `auto` (défaut) résout mkcert (dev) →
|
|
46
|
+
* auto-signé ; `explicit` charge `key`/`cert` fournis (prod). La génération
|
|
47
|
+
* est un confort de DÉVELOPPEMENT — en production, fournir un vrai certificat
|
|
48
|
+
* (Let's Encrypt, ingress, reverse-proxy) : Nodefony n'est pas une CA.
|
|
49
|
+
*/
|
|
50
|
+
strategy?: CertStrategyConfig;
|
|
51
|
+
openssl: OpensslOptions;
|
|
52
|
+
dev: CertificateDevOptions;
|
|
53
|
+
san?: CertificateSanOptions;
|
|
54
|
+
/** Permissions POSIX de la clé privée écrite (0600 = owner-only). */
|
|
55
|
+
privateKeyMode?: number;
|
|
56
|
+
path?: string;
|
|
57
|
+
keyPath?: string;
|
|
58
|
+
certPath?: string;
|
|
59
|
+
caPath?: string;
|
|
60
|
+
key?: string | Buffer;
|
|
61
|
+
cert?: string | Buffer;
|
|
62
|
+
ca?: string | Buffer;
|
|
63
|
+
}
|
|
64
|
+
interface filesCertType {
|
|
65
|
+
path: string;
|
|
66
|
+
variable: string | Buffer | null;
|
|
67
|
+
}
|
|
68
|
+
/** Résumé introspectable du certificat serveur (CLI + futur endpoint Studio). */
|
|
69
|
+
export interface CertificateInfo {
|
|
70
|
+
/** Stratégie effective ayant fourni le certificat. */
|
|
71
|
+
strategy: CertStrategyConfig;
|
|
72
|
+
certPath: string;
|
|
73
|
+
keyPath: string;
|
|
74
|
+
fullchainPath: string;
|
|
75
|
+
/** Ancre de confiance à passer au client (`--cacert`/`ca`) — si présente. */
|
|
76
|
+
caPath?: string;
|
|
77
|
+
/** Renseignés si un certificat est présent (parsé). */
|
|
78
|
+
commonName?: string;
|
|
79
|
+
san?: string[];
|
|
80
|
+
validFrom?: string;
|
|
81
|
+
validTo?: string;
|
|
82
|
+
signatureAlgorithm?: string;
|
|
83
|
+
serial?: string;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Service de fourniture du certificat TLS du serveur HTTPS/WSS.
|
|
87
|
+
*
|
|
88
|
+
* Trois stratégies : `explicit` (certificat fourni en config — le cas de
|
|
89
|
+
* PRODUCTION), `mkcert` (CA locale trustée, confort de dev) et `selfsigned`
|
|
90
|
+
* (auto-signé node-forge, secours). La génération est réservée au
|
|
91
|
+
* DÉVELOPPEMENT : en production sans certificat fourni, le service crie un
|
|
92
|
+
* avertissement (Nodefony n'est pas une autorité de certification).
|
|
93
|
+
*
|
|
94
|
+
* Conformité (génération auto-signée) : signature SHA-256 (jamais SHA-1,
|
|
95
|
+
* RFC 5280 / CA-B Forum), numéro de série aléatoire 128 bits unique
|
|
96
|
+
* (RFC 5280 §4.1.2.2), SAN qui fait foi (RFC 6125), `notBefore` reculé,
|
|
97
|
+
* clé privée écrite en `0600`.
|
|
98
|
+
*/
|
|
99
|
+
declare class Certificate extends Service {
|
|
100
|
+
module: Module;
|
|
101
|
+
files: filesCertType[];
|
|
102
|
+
keysPair: pkg.pki.rsa.KeyPair | null;
|
|
103
|
+
certForge: pkg.pki.Certificate | null;
|
|
104
|
+
ca: Buffer | string | null;
|
|
105
|
+
key: Buffer | string | null;
|
|
106
|
+
cert: Buffer | string | null;
|
|
107
|
+
fullchainPem: Buffer | string | null;
|
|
108
|
+
publicKeyPem: Buffer | string | null;
|
|
109
|
+
rootCertPem: Buffer | string | null;
|
|
110
|
+
intermediateCertPem: Buffer | string | null;
|
|
111
|
+
/** CAROOT résolu de mkcert (null tant que non détecté / indisponible). */
|
|
112
|
+
private mkcertCaRoot;
|
|
113
|
+
/**
|
|
114
|
+
* Backend crypto node-forge, chargé PARESSEUSEMENT. La génération de
|
|
115
|
+
* certificat est un confort de DÉVELOPPEMENT : en production avec un
|
|
116
|
+
* certificat fourni (`strategy: "explicit"`), cette grosse dépendance n'est
|
|
117
|
+
* jamais importée (règle perf-mémoire — pas de dep chargée « au cas où »).
|
|
118
|
+
*/
|
|
119
|
+
private forge;
|
|
120
|
+
path: string;
|
|
121
|
+
serverPath: string;
|
|
122
|
+
caPath: string;
|
|
123
|
+
publicKeyPath: string;
|
|
124
|
+
privateKeyPath: string;
|
|
125
|
+
certPath: string;
|
|
126
|
+
fullchainPath: string;
|
|
127
|
+
constructor(module: Module);
|
|
128
|
+
/** Accès typé aux options du service (Service.options est volontairement lâche). */
|
|
129
|
+
private get certOptions();
|
|
130
|
+
/** Vrai en environnement de développement (mkcert réservé à ce mode). */
|
|
131
|
+
private isDev;
|
|
132
|
+
/**
|
|
133
|
+
* Charge node-forge à la demande (idempotent) — uniquement sur le chemin de
|
|
134
|
+
* GÉNÉRATION (selfsigned / mkcert / inspection). Le chemin `explicit` (prod)
|
|
135
|
+
* ne l'appelle jamais.
|
|
136
|
+
*/
|
|
137
|
+
loadForge(): Promise<ForgeModule>;
|
|
138
|
+
/** Accès au backend forge déjà chargé (lève si `loadForge` n'a pas été appelé). */
|
|
139
|
+
private get forgeLib();
|
|
140
|
+
init(): Promise<this>;
|
|
141
|
+
/**
|
|
142
|
+
* Numéro de série X.509 — RFC 5280 §4.1.2.2 : entier positif unique par CA.
|
|
143
|
+
* 128 bits aléatoires (≥ 64 bits d'entropie exigés par le CA/Browser Forum
|
|
144
|
+
* contre les attaques par collision) ; bit de poids fort à 0 pour garantir un
|
|
145
|
+
* entier positif en encodage DER ; ≤ 20 octets.
|
|
146
|
+
*/
|
|
147
|
+
private static generateSerialHex;
|
|
148
|
+
setFiles(): void;
|
|
149
|
+
private checkCertificates;
|
|
150
|
+
private ensureDirectoriesExist;
|
|
151
|
+
/**
|
|
152
|
+
* Génère (ou recharge) le certificat serveur selon la stratégie résolue :
|
|
153
|
+
* `explicit` (fourni en config / prod), `mkcert` (dev, CA trustée) ou
|
|
154
|
+
* `selfsigned` (auto-signé node-forge, secours). Régénère automatiquement si
|
|
155
|
+
* le certificat présent sur disque n'est pas adéquat pour la stratégie active
|
|
156
|
+
* (expiré, SHA-1, SAN incomplet).
|
|
157
|
+
*
|
|
158
|
+
* @param force - forcer la régénération même si un certificat valide existe
|
|
159
|
+
*/
|
|
160
|
+
generateServerCertificates(force?: boolean): Promise<this>;
|
|
161
|
+
/**
|
|
162
|
+
* Résout la stratégie effective à partir de `certificates.strategy` :
|
|
163
|
+
* - `explicit` : `key` + `cert` fournis (prod, Let's Encrypt…). Forcé →
|
|
164
|
+
* erreur si absents.
|
|
165
|
+
* - `mkcert` : dev + binaire mkcert + CA locale présents. Forcé hors dev →
|
|
166
|
+
* retombe sur `selfsigned` avec avertissement.
|
|
167
|
+
* - `selfsigned` : auto-signé node-forge (fallback). En PRODUCTION, crie un
|
|
168
|
+
* avertissement : la génération n'est pas le rôle d'un serveur de prod.
|
|
169
|
+
*/
|
|
170
|
+
private resolveStrategy;
|
|
171
|
+
/** `key` + `cert` présents en config (chemin fichier ou Buffer) → cert fourni. */
|
|
172
|
+
private hasExplicitCert;
|
|
173
|
+
/**
|
|
174
|
+
* Détecte mkcert : binaire dans le PATH + CA racine générée (rootCA.pem).
|
|
175
|
+
* @returns le chemin CAROOT, ou null si indisponible.
|
|
176
|
+
*/
|
|
177
|
+
private detectMkcert;
|
|
178
|
+
/**
|
|
179
|
+
* SAN effectif : config explicite si fournie, sinon dérivé du kernel
|
|
180
|
+
* (localhost + domain en DNS ; loopback en IP). Une IP littérale (ex. domain
|
|
181
|
+
* `127.0.0.1` en dev) est classée en `ip`, pas en `dns` (RFC 6125).
|
|
182
|
+
*/
|
|
183
|
+
private derivedSan;
|
|
184
|
+
/** Hostnames DNS couverts par le SAN. */
|
|
185
|
+
private sanDnsNames;
|
|
186
|
+
/** Adresses IP couvertes par le SAN. */
|
|
187
|
+
private sanIps;
|
|
188
|
+
/** Hostnames passés à mkcert (DNS + IP du SAN). */
|
|
189
|
+
private certHostnames;
|
|
190
|
+
/**
|
|
191
|
+
* Génère le certificat de dev via mkcert (signé par la CA locale trustée).
|
|
192
|
+
* Écrit cert + clé privée (mkcert), puis dérive clé publique, fullchain et CA.
|
|
193
|
+
*/
|
|
194
|
+
private generateWithMkcert;
|
|
195
|
+
/**
|
|
196
|
+
* Vérifie que le certificat présent sur disque convient à la stratégie :
|
|
197
|
+
* - expiration (RFC 5280 §4.1.2.5) : un cert expiré est inadéquat.
|
|
198
|
+
* - **SAN** couvrant les hostnames requis (les DEUX stratégies) : si le SAN
|
|
199
|
+
* demandé change (ex. `nodefony.com` ajouté via NF_BIND_ALL), on régénère.
|
|
200
|
+
* - `mkcert` : émis par la CA mkcert (issuer organisation contient "mkcert").
|
|
201
|
+
* - `selfsigned` : signature non SHA-1.
|
|
202
|
+
* @returns false si absent, illisible ou inadéquat → déclenche la régénération.
|
|
203
|
+
*/
|
|
204
|
+
private isCertAdequate;
|
|
205
|
+
/** Le SAN présent couvre-t-il tous les noms DNS requis (RFC 6125) ? */
|
|
206
|
+
private sanCovers;
|
|
207
|
+
/** Charge un certificat fourni en config (chemin fichier ou Buffer). */
|
|
208
|
+
private loadExplicitCert;
|
|
209
|
+
/** Résout un matériel TLS : Buffer renvoyé tel quel, string lue comme chemin. */
|
|
210
|
+
private resolveMaterial;
|
|
211
|
+
createFullChain(): string;
|
|
212
|
+
readCerticates(): Promise<this>;
|
|
213
|
+
writeCertificates(force?: boolean): Promise<this>;
|
|
214
|
+
/**
|
|
215
|
+
* Durcit les permissions de la clé privée (et de son dossier) après écriture
|
|
216
|
+
* — garantit `0600` même si l'umask du process était permissif (la clé écrite
|
|
217
|
+
* par mkcert passe aussi par ici). Échec silencieux hors POSIX.
|
|
218
|
+
*/
|
|
219
|
+
private restrictPrivateKey;
|
|
220
|
+
generateKeys(): pkg.pki.rsa.KeyPair;
|
|
221
|
+
generatePrivateKeyPem(): Buffer;
|
|
222
|
+
generatePublickeyPem(): Buffer;
|
|
223
|
+
generateCertPem(): Buffer;
|
|
224
|
+
createCertificate(): pkg.pki.Certificate;
|
|
225
|
+
/** subjectAltName de l'auto-signé : DNS + IP (config explicite sinon dérivé). */
|
|
226
|
+
private altNames;
|
|
227
|
+
setExtension(): void;
|
|
228
|
+
/**
|
|
229
|
+
* Signe le certificat avec le hachage configuré (SHA-256 par défaut).
|
|
230
|
+
* SHA-1 est INTERDIT (collision SHAttered 2017, CA/Browser Forum depuis 2016) :
|
|
231
|
+
* `node-forge` signe en SHA-1 par défaut si on ne passe pas de digest → on en
|
|
232
|
+
* passe toujours un.
|
|
233
|
+
*/
|
|
234
|
+
sign(): void;
|
|
235
|
+
/**
|
|
236
|
+
* Résumé introspectable du certificat serveur courant — réutilisé par la
|
|
237
|
+
* commande CLI `certificates` et un futur endpoint d'admin Studio (parité
|
|
238
|
+
* CLI ↔ Web). Parse le certificat chargé (charge node-forge à la demande).
|
|
239
|
+
*/
|
|
240
|
+
describe(): Promise<CertificateInfo>;
|
|
241
|
+
/** Nom lisible de l'OID d'algorithme de signature. */
|
|
242
|
+
private oidName;
|
|
243
|
+
/** Digest node-forge correspondant au hachage configuré (jamais SHA-1). */
|
|
244
|
+
private digestFor;
|
|
245
|
+
}
|
|
246
|
+
export default Certificate;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { IErrorRenderer, IErrorHttpResult, IErrorWebsocketResult } from "../interfaces/IErrorRenderer.js";
|
|
2
|
+
import type { IHttpContext, IWebsocketContext } from "../interfaces/IContext.js";
|
|
3
|
+
/**
|
|
4
|
+
* Force du signal « la base ne porte pas ce que le code demande ».
|
|
5
|
+
*
|
|
6
|
+
* Deux niveaux, parce que les pilotes ne disent pas la chose avec la même
|
|
7
|
+
* autorité — et parce que leurs lecteurs n'ont pas le même coût d'erreur.
|
|
8
|
+
*
|
|
9
|
+
* - `certain` : un code dédié le dit (PostgreSQL, MySQL). Rien d'autre ne
|
|
10
|
+
* produit ce code.
|
|
11
|
+
* - `probable` : SQLite, dont le code est générique, mais dont le message
|
|
12
|
+
* porte une signature figée (cf {@link SQLITE_SCHEMA_PREFIXES}).
|
|
13
|
+
*/
|
|
14
|
+
export type SchemaMismatchConfidence = "certain" | "probable";
|
|
15
|
+
/**
|
|
16
|
+
* Reconnaît, dans une erreur ou l'une de ses causes, un schéma en retard sur
|
|
17
|
+
* le code — et dit avec quelle FORCE.
|
|
18
|
+
*
|
|
19
|
+
* Détecteur UNIQUE de ce fait dans tout le framework : le corps d'erreur rendu
|
|
20
|
+
* au développeur le lit, et le rechargement d'un instantané au démarrage
|
|
21
|
+
* aussi. Deux reconnaissances de la même chose divergeraient en silence, et
|
|
22
|
+
* chacune passerait ses propres tests.
|
|
23
|
+
*
|
|
24
|
+
* Chaque lecteur choisit son SEUIL, et c'est là que la graduation sert. Le
|
|
25
|
+
* corps d'erreur n'accepte que `certain` : il nomme des tables à un client, et
|
|
26
|
+
* une aide qui se trompe de cause coûte plus cher que pas d'aide du tout. Un
|
|
27
|
+
* appelant qui sait déjà ce qu'il a demandé — une table précise, au démarrage —
|
|
28
|
+
* peut accepter `probable` : il ne publie rien, il décide seulement de ne pas
|
|
29
|
+
* hurler.
|
|
30
|
+
*
|
|
31
|
+
* Même descente dans `cause` que {@link isUniqueViolation}, et pour la même
|
|
32
|
+
* raison : Drizzle enveloppe toute erreur de pilote dans un `DrizzleQueryError`
|
|
33
|
+
* dont le `code` vaut `undefined`. Sans elle, la reconnaissance ne mord jamais.
|
|
34
|
+
*
|
|
35
|
+
* Ne coûte rien au chemin nominal : ne tourne que sur une erreur déjà levée.
|
|
36
|
+
*
|
|
37
|
+
* @param error - erreur remontée par un pilote, éventuellement enveloppée.
|
|
38
|
+
* @returns la force du signal, ou `null` si rien ne dit ça.
|
|
39
|
+
*/
|
|
40
|
+
export declare function schemaMismatchOf(error: unknown): SchemaMismatchConfidence | null;
|
|
41
|
+
/**
|
|
42
|
+
* Default Nodefony error renderer — preserves the legacy JSON error shape.
|
|
43
|
+
*
|
|
44
|
+
* HTTP body (unchanged across the migration):
|
|
45
|
+
* {
|
|
46
|
+
* code: <http status>,
|
|
47
|
+
* message: <error message>,
|
|
48
|
+
* error: <HttpError.toJSON() — stack, controller, action, jsonResponse...>,
|
|
49
|
+
* nodefony: { requestId, scheme, name, version, environment, debug, ... },
|
|
50
|
+
* result: null,
|
|
51
|
+
* }
|
|
52
|
+
*
|
|
53
|
+
* WS close frame:
|
|
54
|
+
* code: clamped to WS range (1000-4999), 1011 if HTTP-style code, 500→1011
|
|
55
|
+
* reason: error.message
|
|
56
|
+
*
|
|
57
|
+
* Stateless singleton — zero per-request allocation. Override via
|
|
58
|
+
* `httpKernel.setErrorRenderer(custom)` for prod hardening or RFC 7807.
|
|
59
|
+
*/
|
|
60
|
+
declare class DefaultErrorRenderer implements IErrorRenderer {
|
|
61
|
+
renderHttp(error: Error, context: IHttpContext): IErrorHttpResult;
|
|
62
|
+
renderWebsocket(error: Error, context: IWebsocketContext): IErrorWebsocketResult;
|
|
63
|
+
private toHttpError;
|
|
64
|
+
/**
|
|
65
|
+
* Ramène un `code` d'erreur à un statut HTTP réellement émettable.
|
|
66
|
+
*
|
|
67
|
+
* Le filtre de type n'est pas défensif « au cas où » : `nodefonyError.parseMessage`
|
|
68
|
+
* RECOPIE le code de l'erreur source, et pilotes comme Node en produisent des
|
|
69
|
+
* textuels (`"ENOENT"`, `"ECONNRESET"`, `"23505"`). Sans lui, la chaîne partait
|
|
70
|
+
* telle quelle en statut de réponse et le serveur répondait hors RFC 9110 §15.
|
|
71
|
+
*/
|
|
72
|
+
private normalizeHttpStatus;
|
|
73
|
+
}
|
|
74
|
+
export default DefaultErrorRenderer;
|