Référence d'API — @nodefony/http — context
stable
Documentation › Référence d’API › @nodefony/http › context
Générée depuis les déclarations de types publiées de
@nodefony/http10.0.0-beta.5 : exactement ce que reçoit une application qui l’installe. Cette page n’existe dans aucun dépôt — pour la corriger, on corrige le TSDoc du code.
@nodefony/http#
import { … } from "@nodefony/http" — 36 symboles.
Classes (11)#
Context#
class Context extends Service implements IContextInterface
secure: booleansecurity?: ISecurityZone | nullcleaned: booleanvalidDomain: booleanfinished: booleanpushAllowed: booleanrequestEnded: booleanrequested: booleansessionStarting: booleandomain: stringtype: ProtocolName— Famille traitée (network.protocol.named’OpenTelemetry) — union ouverte.serverType: ServerType— Serveur qui a reçu la requête — choisit la configuration par serveur.alpnProtocol: AlpnProtocol— Protocole du saut local (registre IANA ALPN) — union ouverte.server?: WebSocketServer | http.Server | https.Server | http2.Http2SecureServer | nullhttpKernel: HttpKernel | nullrequest: contextRequest | nullresponse: contextResponse | nullurl: stringmethod: HTTPMethod | nullremoteAddress: string | nullprotected _originUrl: URL | nullget originUrl(): URL | nullset originUrl(value: URL | null)cookies: Cookieserror: Error | HttpError | nodefonyError | nullsessionService?: SessionsService | nullsession: Session | nullcookieSession: Cookie | nulluser: unknownuserIdentifier: string | null— Identifiant de l’appelant AUTHENTIFIÉ, posé par le pare-feu ;nullhors zone ou pour un anonyme.waitAsync: booleanisJson: booleanprotected _isHtml: boolean | nullget isHtml(): booleanset isHtml(value: boolean)protected resolveIsHtml(): boolean— Défaut paresseux d’isHtml— overridé par HttpContext (négociationAccept).crossDomain: booleanrouter: IRequestRouter | nullresolver: IRouteResolver | nulllogModule: string | null— Module qui signe les lignes de CETTE requête : la ligne d’accès et les lignes du contrôleur.sessionIntent: SessionIntent | null— Intent de session de la route courante (posé par le Resolver depuis@UseSession/ paramètre@Session).cspDirectives: Record<string, readonly string[]> | null— Directives CSP additionnelles de la route courante (@Csp), posées par le Resolver au match.csrfProtect: boolean— CSRF per-route (@CsrfProtect/@CsrfExempt), posés par le Resolver au match, lus parFirewall.enforceCsrf(post-resolve).csrfExempt: booleancsrfToken: string | nullrequestId: stringget cspNonce(): stringtraceparent: string | nullprofilerQueries: IProfilerQuery[] | nullprofiling: booleansecurityTrace: ISecurityTrace | nullreadonly phases: PhaseTiming[]metaData: Datascheme: SchemeType— Schéma vu par le client — seul champ que lit une décision de sécurité.webSocketState: WebSocketStateconstructor(container: Container | Scope, serverType: ServerType)setMetaData(obj?: Record<string, unknown>): Data— Assemble l’enveloppemetaDatade la requête (nodefony.*+routesnapshot per-requête + overrides appelant).setScheme(): SchemeTypeget timingEnabled(): boolean— Le timing est-il actif sur CETTE requête ?phaseStart(name: PhaseName): voidphaseEnd(name: PhaseName): voidstopClock(): number | null— Arrête l’horloge de la requête et rend sa durée, en millisecondes.onAfterResponse(fn: AfterResponseHandler): void_runAfterResponse(): Promise<void>— Exécute les hooksonAfterResponse, une seule fois, dans l’ordre d’enregistrement ; un hook qui lève est journalisé sans arrêter les suivants.get signal(): AbortSignal_abortIfPending(reason?: string): voidlog(pci: Pci, severity?: Severity, msgid?: Msgid, msg?: Message, moduleName?: string): Pdu— Émet une entrée de log structurée — point d’entrée central pour TOUT log Nodefony.holdRequestStore(store: RequestContextPayload): void— Confie au contexte le magasinRequestContextde son unité de travail (requête HTTP, connexion WebSocket), pour qu’il le VIDE à son nettoyage.clean(): void— Libère les ressources — retire les listeners trackés du bus partagé pour éviter les fuites mémoire, puis détache container/kernel/syslog/nc.fire(event: KernelEventsType, ...args: unknown[]): boolean— Aliasemit— émet l’événement de manière synchrone.emit(event: KernelEventsType, ...args: unknown[]): boolean— Émet l’événement (API EventEmitter standard).emitAsync(event: KernelEventsType, ...args: unknown[]): Promise<unknown>— Émet et attend les listeners async — équivalent defireAsync.fireAsync(event: KernelEventsType, ...args: unknown[]): Promise<unknown>— Émet l’événement et attend que tous les listeners async résolvent.logRequest(httpError?: Error | HttpError | nodefonyError | null): PdulogPhasesVerbose(): void— P3.7 — Émet au teardown un log DEBUG détaillant la durée de chaque phase du pipeline (parse · action · firewall · …+ total).addRequestCookie(cookie: Cookie): CookiegetRequestCookies(name?: string): Cookies | Cookie | nullsetCookie(cookie: Cookie): void | CookiegetRequest(): contextRequestgetResponse(): contextResponseisValidDomain(): booleansaveSession(): Promise<Session | null>hasSession(): booleangetCookieSession(name: string): Cookie | nullgetSessionCookieName(): string— Nom effectif du cookie de session pour CE transport.parseCookies(): voidsetContextJson(_encoding?: BufferEncoding): voidsetContextHtml(_encoding?: BufferEncoding): void
Http2Request#
class Http2Request extends HttpRequest
request: http2.Http2ServerRequestconstructor(request: http2.Http2ServerRequest, context: HttpContext)getHost(): string—:authority, sinonHost— cfrequestAuthority(RFC 9113 §8.3.1).getUserAgent(): stringgetMethod(): HTTPMethodgetRawTarget(): string— Request-target brut (origin-form) tel que reçu du transport — SOURCE UNIQUE partagée par la concaténation degetFullUrlet la découpe fast-path du ctor.
Http2Response#
class Http2Response extends HttpResponse
statusCode: numberstream: http2.ServerHttp2Stream | nullstreamId?: numberconstructor(response: http2.Http2ServerResponse, context: HttpContext)isHeaderSent(): booleanwriteHead(statusCode?: number, headers?: http.OutgoingHttpHeaders | http.OutgoingHttpHeader[]): voidsend(chunk?: unknown, encoding?: BufferEncoding, _flush?: boolean): MaybePromise<Http2Response>— Écrit le corps sur le flux HTTP/2 et, pour une réponse unique, le termine d’un seulend(corps).end(chunk?: string | Buffer, encoding?: BufferEncoding): MaybePromise<http.ServerResponse | http2.ServerHttp2Stream>— Termine le flux HTTP/2 (ou la réponse de repli) — synchrone (#505).getStatusMessage(code?: number | string): stringgetStatus(): { code: number; message: string; }
HttpContext#
class HttpContext extends Context implements IHttpContextInterface
proxy: ProxyType | nullisRedirect: booleansended: booleanrelayAccessLog: "all" | "errors" | null— Requête relayée par le proxy inverse : la politique de ligne d’accès de son montage.request: HttpRequestTyperesponse: HttpRsponseTypeuploadService: uploadService | nullconstructor(container: Container | Scope, request: http.IncomingMessage | http2.Http2ServerRequest, response: http.ServerResponse | http2.Http2ServerResponse, serverType: ServerType)get originUrl(): URL | null— URL d’origine effective, construite À LA DEMANDE (1ʳᵉ lecture, puis mémoïsée).set originUrl(value: URL | null)— URL d’origine effective, construite À LA DEMANDE (1ʳᵉ lecture, puis mémoïsée)._onTimeout(): void— Chemin timeout direct — appelé par les handlers socket/stream desetTimeout().setScheme(): SchemeTypehandle(): MaybePromise<this>— Sert la requête : délai de réponse, hooksonRequest, puis l’action résolue et son rendu (resolver.callController()).setTimeout(): voidlogRequest(httpError?: Error | HttpError | nodefonyError | null): import("nodefony").Pdu— Ligne d’accès — pour une requête RELAYÉE, avec le statut que l’amont a réellement rendu (le relais écrit la réponse brute, pas celle du contexte) ; un montageaccessLog: "errors"ne l’écrit qu’en éc …clean(): void— Nettoie le contexte, et le DÉTACHE de sa socket h1 : la connexion persistante survit à la requête, et l’entrée desocketActiveContextretiendrait sinon tout le contexte jusqu’à sa fermeture.render(chunk: unknown, encoding?: BufferEncoding, status?: string | number, headers?: Record<string, string | number>): MaybePromise<Http2Response | HttpResponse>— Sérialise la donnée selon son type (JSON, HTML, texte), pose statut et en-têtes, puis l’envoie (send).end(): Promise<Http2Response | HttpResponse>send(chunk?: unknown, encoding?: BufferEncoding): MaybePromise<Http2Response | HttpResponse>— Envoie la réponse : session sauvée, hookonSend, en-têtes, corps, puis fin de la réponse.writeHead(statusCode?: number, headers?: http.OutgoingHttpHeaders | http.OutgoingHttpHeader[]): voidwrite(chunk: unknown, encoding?: BufferEncoding, _flush?: boolean): MaybePromise<Http2Response | HttpResponse>— Écrit le corps, puis termine la requête (close).openSse(options?: ISseStreamOptions): SseStream | Promise<SseStream>— Répond par un flux d’événements serveur (text/event-stream).flush(chunk: unknown, encoding: BufferEncoding): MaybePromise<HttpResponse>close(): MaybePromise<Http2Response | HttpResponse>— Termine la requête : hookonClose, puis fin de la réponse si l’envoi ne l’a pas déjà faite.redirect(Url: string, status?: number | string, headers?: Record<string, string | number>): HttpResponseredirectHttps(status?: number | string, headers?: Record<string, string | number>): HttpResponse— Redirige vers la même URL en HTTPS, sur le port du serveur HTTPS lié — ou le port par défaut derrière un proxy, dont le port public est inconnu.redirectHttp(status?: number | string, headers?: Record<string, string | number>): HttpResponse— Redirige vers la même URL en HTTP, sur le port du serveur HTTP lié — ou le port par défaut derrière un proxy.getHostName(): stringgetRemoteAddress(): string | nullgetHost(): stringgetUserAgent(): stringgetMethod(): HTTPMethodsetContentType(type?: string, encoding?: BufferEncoding): void | http.ServerResponse<http.IncomingMessage>protected resolveIsHtml(): boolean— Défaut paresseux d’isHtml— overridé par HttpContext (négociationAccept).setDefaultContentType(): voidsetContextJson(encoding?: BufferEncoding): voidsetContextHtml(encoding?: BufferEncoding): void
HttpRequest#
class HttpRequest
context: HttpContextrequest: http.IncomingMessage | http2.Http2ServerRequestheaders: http.IncomingHttpHeadershost: stringmethod: HTTPMethodcontentType: string | nullrawContentType: Record<string, string>domain: stringremoteAddress: string | nullhostname: stringsUrl: stringscheme: string— Scheme effectif côté client (http|https, ou le protoForwardedbrut derrière un proxy de confiance) — posé pargetFullUrl, seule source de cette décision.pathname: string— Pathname de la requête, TOUJOURS sous forme normalisée WHATWG : découpe du target quand elle est prouvablement identique au parse (fast-path),URL.pathnamesinon.search: string— Query string au formatURL.search(?…, ou"") — même provenance.get hasParsedUrl(): boolean— L’objeturla-t-il déjà été construit ?get href(): string— Sérialisation de l’URL de la requête —URL.hrefsi l’objet existe, sinonsUrl(identique par construction sur le fast-path).get url(): URL— URL WHATWG complète de la requête, construite au premier accès (fast-path) ou dès le ctor (bail-out).set url(u: URL)— URL WHATWG complète de la requête, construite au premier accès (fast-path) ou dès le ctor (bail-out).parser: ParserType | nullbody: RequestBody— Le CORPS de la requête, parsé (JSON, urlencoded, XML, champs multipart) — nom universel de l’écosystème (Express, Fastify, NestJS) et celui d’IAdminRequest.body.get files(): readonly UploadedFile[]— Les fichiers reçus dans un corps multipart, déjà écrits dans le répertoire temporaire — lus par@UploadedFile()/@UploadedFiles().query: Record<string, unknown>— Les paramètres d’URL, seuls — jamais un champ du corps (body).queryStringOptions: (QS.IParseOptions & { decoder?: undefined; })charset: BufferEncodinguploadOption: IUploadOptionsmaxBodySize: numberdata: Bufferget accept(): ReturnType<typeof acceptParser>— Media-ranges de l’en-têteAccept, parsés au premier accès (mémoïsé).get acceptHtml(): boolean—truesi le client acceptetext/html— résolu au premier accès (mémoïsé).origin: stringtrustedProxy: booleanforwarded: ResolvedProxy | nullconstructor(request: http.IncomingMessage | http2.Http2ServerRequest, context: HttpContext)initialize(): Promise<unknown>— Lit le corps de la requête, s’il y en a un, puis émetonRequestEnd.parseRequest(): Promise<ParserType | null>parseMultipart(): Promise<ParserType>— Parse un corpsmultipart/form-datavia busboy (streaming pur).accepts(Type: string): booleancreateFileUpload(name: string, file: IParsedUploadFile): Promise<UploadedFile>getMethod(): HTTPMethodgetContentType(request: http.IncomingMessage | http2.Http2ServerRequest): string | nullgetCharset(): BufferEncoding— Charset du corps déduit duContent-Type(charset=…), normalisé en unBufferEncodingNode valide.getDomain(): stringgetUserAgent(): stringgetHostName(host?: string): stringgetHost(): stringgetRemoteAddress(): string | nullgetRawTarget(): string— Request-target brut (origin-form) tel que reçu du transport — SOURCE UNIQUE partagée par la concaténation degetFullUrlet la découpe fast-path du ctor.protected resolveScheme(request: http.IncomingMessage | http2.Http2ServerRequest): string— Scheme effectif côté client :Forwarded/X-Forwarded-*résolu de façon canonique (this.forwarded, gated proxy de confiance) ; sinon le transport réel.getFullUrl(request?: http.IncomingMessage | http2.Http2ServerRequest): stringgetHeader(name: string): string | string[] | nullsetUrl(Url: string): URLgetUrl(sUrl: string, baseUrl?: string): URLlog(pci: Pci, severity?: Severity, msgid?: Msgid, msg?: Message): Pdu
HttpResponse#
class HttpResponse
context: HttpContextresponse: http.ServerResponse | http2.Http2ServerResponse | nullstatusCode: numberstatusMessage: stringflushing: booleanencoding: BufferEncodingcontentType: stringheaders: http.OutgoingHttpHeaderstimeout?: numbercookies: Record<string, Cookie>constructor(response: http.ServerResponse | http2.Http2ServerResponse, context: HttpContext)protected ensureContentTypeHeader(): void— Filet posé juste avant l’émission des en-têtes : si aucunContent-Typen’a été choisi (ni négociation, nirender, ni controller), émet le défautthis.contentType(application/octet-stream) — com …get body(): Buffer | null— Corps de la réponse en octets.set body(value: Buffer | null)— Corps de la réponse en octets.protected get payload(): string | Buffer— Corps tel qu’il part sur le fil : le texte s’il n’a jamais été encodé, sinon les octets — vide légal si rien n’a été posé (write(null)jetterait ERR_STREAM_NULL_VALUES).protected get payloadEncoding(): BufferEncoding— Encodage à passer avecpayload(ignoré par Node pour des octets).clean(): voidisHeaderSent(): booleanisHtml(): booleansetTimeout(ms: number): voidaddCookie(cookie: Cookie): CookiedeleteCookie(cookie: Cookie): booleandeleteCookieByName(name: string): booleansetCookies(): void | http.ServerResponse<http.IncomingMessage>setCookie(cookie: Cookie): void | http.ServerResponse<http.IncomingMessage>setHeader(name: string, value: number | string | readonly string[]): void | http.ServerResponse<http.IncomingMessage>setHeaders(obj: OutgoingHttpHeaders): OutgoingHttpHeaderssetContentType(type?: string, encoding?: BufferEncoding): void | http.ServerResponse<http.IncomingMessage>setFileMimeType(type: string, encoding?: BufferEncoding): void | http.ServerResponse<http.IncomingMessage>setContentTypeByExtension(extention: string): void | http.ServerResponse<http.IncomingMessage>getMimeType(filenameOrExt: string): string | falsesetEncoding(encoding: BufferEncoding): BufferEncodingsetStatusCode(status: number | string, message?: string): { code: number; message: string; }getStatus(): { code: number; message: string; }getStatusCode(): numbergetStatusMessage(code?: number | string): stringsetBody(ele: unknown, encoding?: BufferEncoding): void— Pose le corps de la réponse : texte gardé tel quel, octets copiés sur leur seule fenêtre, tout autre valeur sérialisée en JSON.setLength(body?: string | NodeJS.ArrayBufferView | ArrayBuffer | SharedArrayBuffer): numberwriteHead(statusCode?: number, headers?: http.OutgoingHttpHeaders | http.OutgoingHttpHeader[]): voidaddTrailers(headers: http.OutgoingHttpHeaders): voidflush(chunk: unknown, encoding: BufferEncoding): MaybePromise<HttpResponse>send(chunk?: unknown, encoding?: BufferEncoding, _flush?: boolean): MaybePromise<HttpResponse>— Écrit le corps sur le flux et, pour une réponse unique, la termine.write(chunk?: unknown, encoding?: BufferEncoding): MaybePromise<HttpResponse>writeContinue(): voidend(chunk?: string | Buffer, encoding?: BufferEncoding): MaybePromise<http.ServerResponse | http2.ServerHttp2Stream>— Termine la réponse Node — un appel synchrone, rien n’y est à attendre (#505).getHeader(name: string): string | number | string[]hasHeader(name: string): booleangetHeaders(): http.OutgoingHttpHeadersredirect(url: string, status?: number | string, headers?: Record<string, string | number>): thislog(pci: Pci, severity?: Severity, msgid?: Msgid, msg?: Message): Pdu
Response#
class HttpResponse
context: HttpContextresponse: http.ServerResponse | http2.Http2ServerResponse | nullstatusCode: numberstatusMessage: stringflushing: booleanencoding: BufferEncodingcontentType: stringheaders: http.OutgoingHttpHeaderstimeout?: numbercookies: Record<string, Cookie>constructor(response: http.ServerResponse | http2.Http2ServerResponse, context: HttpContext)protected ensureContentTypeHeader(): void— Filet posé juste avant l’émission des en-têtes : si aucunContent-Typen’a été choisi (ni négociation, nirender, ni controller), émet le défautthis.contentType(application/octet-stream) — com …get body(): Buffer | null— Corps de la réponse en octets.set body(value: Buffer | null)— Corps de la réponse en octets.protected get payload(): string | Buffer— Corps tel qu’il part sur le fil : le texte s’il n’a jamais été encodé, sinon les octets — vide légal si rien n’a été posé (write(null)jetterait ERR_STREAM_NULL_VALUES).protected get payloadEncoding(): BufferEncoding— Encodage à passer avecpayload(ignoré par Node pour des octets).clean(): voidisHeaderSent(): booleanisHtml(): booleansetTimeout(ms: number): voidaddCookie(cookie: Cookie): CookiedeleteCookie(cookie: Cookie): booleandeleteCookieByName(name: string): booleansetCookies(): void | http.ServerResponse<http.IncomingMessage>setCookie(cookie: Cookie): void | http.ServerResponse<http.IncomingMessage>setHeader(name: string, value: number | string | readonly string[]): void | http.ServerResponse<http.IncomingMessage>setHeaders(obj: OutgoingHttpHeaders): OutgoingHttpHeaderssetContentType(type?: string, encoding?: BufferEncoding): void | http.ServerResponse<http.IncomingMessage>setFileMimeType(type: string, encoding?: BufferEncoding): void | http.ServerResponse<http.IncomingMessage>setContentTypeByExtension(extention: string): void | http.ServerResponse<http.IncomingMessage>getMimeType(filenameOrExt: string): string | falsesetEncoding(encoding: BufferEncoding): BufferEncodingsetStatusCode(status: number | string, message?: string): { code: number; message: string; }getStatus(): { code: number; message: string; }getStatusCode(): numbergetStatusMessage(code?: number | string): stringsetBody(ele: unknown, encoding?: BufferEncoding): void— Pose le corps de la réponse : texte gardé tel quel, octets copiés sur leur seule fenêtre, tout autre valeur sérialisée en JSON.setLength(body?: string | NodeJS.ArrayBufferView | ArrayBuffer | SharedArrayBuffer): numberwriteHead(statusCode?: number, headers?: http.OutgoingHttpHeaders | http.OutgoingHttpHeader[]): voidaddTrailers(headers: http.OutgoingHttpHeaders): voidflush(chunk: unknown, encoding: BufferEncoding): MaybePromise<HttpResponse>send(chunk?: unknown, encoding?: BufferEncoding, _flush?: boolean): MaybePromise<HttpResponse>— Écrit le corps sur le flux et, pour une réponse unique, la termine.write(chunk?: unknown, encoding?: BufferEncoding): MaybePromise<HttpResponse>writeContinue(): voidend(chunk?: string | Buffer, encoding?: BufferEncoding): MaybePromise<http.ServerResponse | http2.ServerHttp2Stream>— Termine la réponse Node — un appel synchrone, rien n’y est à attendre (#505).getHeader(name: string): string | number | string[]hasHeader(name: string): booleangetHeaders(): http.OutgoingHttpHeadersredirect(url: string, status?: number | string, headers?: Record<string, string | number>): thislog(pci: Pci, severity?: Severity, msgid?: Msgid, msg?: Message): Pdu
SseStream#
class SseStream
Un flux text/event-stream ouvert sur une réponse.
get closed(): boolean— Le flux est-il fermé — par le serveur (close()) ou par le client parti ?send(data: unknown, options?: ISseSendOptions): Promise<void>— Envoie un événement.comment(text?: string): Promise<void>— Envoie un commentaire — ignoré par le client, utile pour garder une connexion vivante ou marquer le flux à la lecture.retry(ms: number): Promise<void>— Impose au client un délai de reconnexion (champretry:).onClose(listener: () => void): void— Appellelistenerà la fermeture du flux, quelle qu’en soit la cause.close(): Promise<void>— Ferme le flux et termine la requête.
WebsocketContext#
class WebsocketContext extends Context implements IWebsocketContextInterface
request: WsIncomingMessage | nullresponse: WebsocketResponse | nullacceptedProtocol?: stringport: number | stringrejected: booleanteardownWired: booleanconnection: Ws | nulladmission: IUpgradeAdmission | null— Le verdict du handshake encore à rendre : posé par le noyau tant que le pipeline décide (pare-feu, garde de l’action),nulldès que la socket est acceptée ou refusée.origin: stringproxy: ProxyType | nullforwarded: ResolvedProxy | nullwsUrl: URL | nullquery: Record<string, string>wsPath: stringconstructor(scope: Scope, req: IncomingMessage, ws: Ws | null, serverType: ServerType)log(pci: unknown, severity?: Severity, msgid?: Msgid, msg?: Message, moduleName?: string): import("nodefony").Pdu— Émet une entrée de log structurée — point d’entrée central pour TOUT log Nodefony.logRequest(httpError?: Error | HttpError | nodefonyError | null, acceptedProtocol?: string | null): import("nodefony").PduacceptConnection(ws: Ws): void— Rattache la socket que le handshake vient d’ouvrir (101envoyé) : le contexte a été construit et jugé AVANT, sans elle.refuseHandshake(status: number): boolean— Refuse le handshake par un statut HTTP, avant tout101(RFC 6455 §4.2.2) — avec les en-têtes posés pendant la décision (WWW-Authenticatedu pare-feu,Retry-After).connect(): Promise<Ws>handle(data?: unknown[]): Promise<this>render(chunk: unknown, encoding?: BufferEncoding): Promise<WebsocketResponse>send(data?: string | Buffer | null, encoding?: BufferEncoding): Promise<WebsocketResponse>broadcast(data?: string | Buffer | null, encoding?: BufferEncoding): nullbeginFrame(method: string, framePath: string): FrameProfile | null— Ouvre le profil d’une invocation du pont RPC (une frameapi.request).collectFrame(frame: FrameProfile | null): void— Enregistre le profil d’une invocation terminée dans le ring buffer du Profiler (no-op hors dev, ou si aucun profil n’a été ouvert).phaseStart(name: PhaseName): void— Les phases émises pendant une invocation du pont (initializepar le Resolver,renderpar le Controller…) vont dans le profil de la frame, pas du contexte : sans cette redirection, `Context.pha …phaseEnd(name: PhaseName): voidhandleMessage(data: Buffer | string, isBinary: boolean): Promise<unknown>onClose(code: number, reason: Buffer): voidonConnectionError(error: Error): void— Listenererrorde la socket ws (OBLIGATOIRE — sans lui, un ‘error’ émis sans listener crashe le process via EventEmitter).setScheme(): SchemeTypegetRemoteAddress(): string | nullgetHost(): stringgetHostName(): stringgetUserAgent(): stringgetMethod(): HTTPMethodsetContextJson(): voidclean(): void— Libère les ressources — retire les listeners trackés du bus partagé pour éviter les fuites mémoire, puis détache container/kernel/syslog/nc.close(reasonCode: number | null, description: string): voiddrop(reasonCode: number, description: string): voidreject(code: number | string, message?: string): void
WebsocketResponse#
class WebsocketResponse
statusCode: numberbody: Buffer | nullencoding: BufferEncodingconnection: Ws | nullstatusMessage: stringwebSocketVersion?: numbercookies: Record<string, Cookie>constructor(connection: Ws | null, context: WebsocketContext)log(pci: Pci, severity?: Severity, msgid?: Msgid, msg?: Message): import("nodefony").PdusetConnection(connection: Ws): Wssend(data?: Buffer | string | null, encoding?: BufferEncoding): Promise<WebsocketResponse>broadcast(data?: Buffer | string | null, type?: BufferEncoding): voidsetBody(ele: string | NodeJS.ArrayBufferView | ArrayBuffer | SharedArrayBuffer, encoding?: BufferEncoding): Buffer<ArrayBufferLike> | nulldrop(reasonCode?: number, description?: string): voidclose(reasonCode?: number, description?: string): voidgetStatus(): { code: number; message: string; }getStatusCode(): numbergetStatusMessage(): stringsetStatusCode(status: number | string, message?: string): { code: number; message: string; }clean(): voidsetEncoding(encoding: BufferEncoding): BufferEncodinghandshakeHeaders: Record<string, string | number> | null— En-têtes de la réponse au handshake, retenus tant que la socket n’est pas acceptée : ils ne partent que dans un REFUS (refuseHandshake) — le101dewsne les porte pas.setHeader(name: string, value: number | string | readonly string[]): boolean— Retient un en-tête du handshake (cfhandshakeHeaders) ; sans effet une fois la socket ouverte, où il n’y a plus de réponse HTTP.setHeaders(obj: OutgoingHttpHeaders): booleanaddCookie(cookie: Cookie): voidsetCookies(): voidsetCookie(_cookie: Cookie): void
wsResponse#
class WebsocketResponse
statusCode: numberbody: Buffer | nullencoding: BufferEncodingconnection: Ws | nullstatusMessage: stringwebSocketVersion?: numbercookies: Record<string, Cookie>constructor(connection: Ws | null, context: WebsocketContext)log(pci: Pci, severity?: Severity, msgid?: Msgid, msg?: Message): import("nodefony").PdusetConnection(connection: Ws): Wssend(data?: Buffer | string | null, encoding?: BufferEncoding): Promise<WebsocketResponse>broadcast(data?: Buffer | string | null, type?: BufferEncoding): voidsetBody(ele: string | NodeJS.ArrayBufferView | ArrayBuffer | SharedArrayBuffer, encoding?: BufferEncoding): Buffer<ArrayBufferLike> | nulldrop(reasonCode?: number, description?: string): voidclose(reasonCode?: number, description?: string): voidgetStatus(): { code: number; message: string; }getStatusCode(): numbergetStatusMessage(): stringsetStatusCode(status: number | string, message?: string): { code: number; message: string; }clean(): voidsetEncoding(encoding: BufferEncoding): BufferEncodinghandshakeHeaders: Record<string, string | number> | null— En-têtes de la réponse au handshake, retenus tant que la socket n’est pas acceptée : ils ne partent que dans un REFUS (refuseHandshake) — le101dewsne les porte pas.setHeader(name: string, value: number | string | readonly string[]): boolean— Retient un en-tête du handshake (cfhandshakeHeaders) ; sans effet une fois la socket ouverte, où il n’y a plus de réponse HTTP.setHeaders(obj: OutgoingHttpHeaders): booleanaddCookie(cookie: Cookie): voidsetCookies(): voidsetCookie(_cookie: Cookie): void
Fonctions (7)#
acceptsEventStream#
function acceptsEventStream(accept: string | string[]): boolean
Le client accepte-t-il un flux d’événements ? Lit l’en-tête Accept.
compileDomainPattern#
function compileDomainPattern(pattern: DomainPattern): RegExp
Compile UN pattern de domaine en RegExp selon la politique sûre.
compileDomainPatterns#
function compileDomainPatterns(patterns: DomainPattern | DomainPattern[]): RegExp[]
Compile une liste de patterns. Les string vides sont ignorées (un ^$ ne sert à rien et masque une coquille de config).
compileTrustedHosts#
function compileTrustedHosts(domain: string, trusted: ITrustedHostsConfig, isDev: boolean): RegExp[]
Construit la liste RegExp de la barrière trustedHosts (kernel, avant routing).
isDomainAllowed#
function isDomainAllowed(regAlias: RegExp[], domain: string): boolean
Teste un Host entrant contre une liste de RegExp pré-compilée.
isWebsocketContext#
function isWebsocketContext(context: ContextType): context is WebsocketContext
Dit si un contexte sert une connexion WebSocket — la garde qui rétrécit ContextType à WebsocketContext sans conversion.
openSseStream#
function openSseStream(context: HttpContext, options?: ISseStreamOptions): SseStream | Promise<SseStream>
Ouvre un flux d’événements sur la réponse d’un contexte HTTP.
Constantes (4)#
REQUEST_TRACE_CHANNEL#
const REQUEST_TRACE_CHANNEL = "nodefony.http.request"
Nom du TracingChannel qui encadre chaque requête HTTP et chaque handshake WebSocket — forme module.fonction recommandée par la documentation de node:diagnostics_channel ; les sous-canaux sont tracing:nodefony.http.request:start, :end, :asyncStart, :asyncEnd, :error.
SSE_HEARTBEAT_MS#
const SSE_HEARTBEAT_MS = 15000
Battement de cœur par défaut, en ms (§9.2.7 : « every 15 seconds or so »).
decideSend#
const decideSend: (ws: IBackpressureTarget, max: number, policy: WsBackpressurePolicy, closeAfterDrops?: number) => WsSendDecision
Décide si une frame doit partir vers ws selon la backpressure SORTANTE (serveur → client). Protège la RAM d’envoi du serveur quand le client est lent à RECEVOIR (ne lit pas assez vite → ws.bufferedAmount gonfle → OOM). broadcast() amplifie : un seul client lent peut, sans borne, faire tomber la diffusion entière.
readBackpressureOptions#
const readBackpressureOptions: (wss: WebSocketServer | null) => { max: number; policy: WsBackpressurePolicy; closeAfterDrops: number; }
Relit le seuil + la politique depuis les options du WebSocketServer.
Interfaces (5)#
IBackpressureSocket#
interface IBackpressureSocket extends Ws
Socket augmentée d’un compteur de drops (number lazy — lu par la sonde socket).
_nfDrops?: number— Nombre cumulé de frames droppées/refusées pour backpressure sur cette socket._nfDropStreak?: number— Frames refusées d’affilée, remis à zéro dès qu’une frame repart.
IBackpressureTarget#
interface IBackpressureTarget
Ce dont la règle a besoin, et rien de plus : la taille de la file d’envoi et de quoi fermer. Typé STRUCTURELLEMENT pour que @nodefony/realtime applique la même règle sans importer ws (son transport type déjà sa connexion ainsi).
readonly bufferedAmount?: numberclose(code?: number, reason?: string): void
ISseSendOptions#
interface ISseSendOptions
Ce qu’un événement porte en plus de ses données.
event?: string— Type de l’événement (champevent:) — absent :message.id?: string— Identifiant (champid:) que le client renverra enLast-Event-ID.
ISseStreamOptions#
interface ISseStreamOptions
Options d’ouverture d’un flux.
heartbeat?: number | false— Période du battement de cœur (commentaire:), en ms entre 1 et 2^31-1 —falsepour l’éteindre.retry?: number— Délai de reconnexion imposé au client (champretry:), en ms.stallTimeout?: number | false— Délai maximal pendant lequel une écriture peut rester bloquée — le client ne lit plus —, en ms entre 1 et 2^31-1 ; au-delà, la connexion est coupée.maxEventBytes?: number— Taille maximale d’un événement écrit, en octets (UTF-8).maxDuration?: number | false— Durée de vie maximale du flux, en ms entre 1 et 2^31-1 : il est fermé ensuite, et unEventSourcese reconnecte — en repassant par le pare-feu.
IWsBackpressureOptions#
interface IWsBackpressureOptions
Options de backpressure SORTANTE (serveur → client).
maxBackpressure?: number— Seuil (octets) dews.bufferedAmount;0/absent = désactivé.backpressurePolicy?: WsBackpressurePolicy— Action au dépassement du seuil.backpressureCloseAfterDrops?: number— Refus consécutifs au-delà desquels on ferme (1013) ;0/absent = jamais.
Types (9)#
Cookies#
type Cookies = Record<string, Cookie>
DomainPattern#
type DomainPattern = string | RegExp
Un pattern de domaine : string (exact ou *-wildcard) ou RegExp (libre).
HTTPMethod#
type HTTPMethod = "GET" | "HEAD" | "POST" | "PUT" | "DELETE" | "CONNECT" | "OPTIONS" | "TRACE" | "PATCH" | "WEBSOCKET"
ITrustedHostsConfig#
type ITrustedHostsConfig = boolean | DomainPattern | DomainPattern[]
Valeur de configuration http.trustedHosts (barrière sécu avant routing) : - false / absent : défaut (domaine canonique + loopback en dev). - true : bypass total — tout Host passe (déploiement où un reverse-proxy filtre déjà le Host, cf doctrine cloud-native). - string / string[] : patterns additionnels (exact ou *-wildcard).
WebSocketState#
type WebSocketState = "handshake" | "connected" | "closed" | "error" | "message" | null
WsBackpressurePolicy#
type WsBackpressurePolicy = "drop" | "close"
Politique appliquée quand le buffer d’envoi d’un client dépasse le seuil.
WsSendDecision#
type WsSendDecision = "send" | "drop" | "close"
Décision pour une frame : l’émettre, la sauter, ou (socket fermée) ne rien faire.
contextRequest#
type contextRequest = HttpRequest | Http2Request | http.IncomingMessage | null
contextResponse#
type contextResponse = HttpResponse | Http2Response | WebsocketResponse | null