Nodefony 10.0.0-beta.5
Framework Node.js fullstack — HTTP & WebSocket, même contexte

Référence d'API — nodefony — service

stable

Documentation › Référence d’API › nodefony › service

Générée depuis les déclarations de types publiées de nodefony 10.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#

import { … } from "nodefony" — 83 symboles.

Classes (7)#

ClusterManager#

class ClusterManager

Superviseur cluster du process MASTER (Phase 2 du mode cluster sans PM2).

ClusterProbeAggregator#

class ClusterProbeAggregator

Agrégateur de sondes master-side du mode cluster (Phase 4c) — le « gardien » qui collecte la santé de chaque worker et rediffuse la vue d’ensemble à tous.

ClusterRelay#

class ClusterRelay

Master-gateway du backplane realtime cluster (Phase 3) — routeur IPC qui vit dans le process MASTER (lequel ne sert AUCUN HTTP, cf ClusterManager).

Fetch#

class Fetch extends Service

Service Fetch — façade DI au-dessus de l’API fetch native de Node.js.

GitService#

class GitService

Introspection git du dépôt — sans spawn git ni dépendance (lecture directe de .git/). Résultat caché pour la vie du process. Best-effort : champs "" hors d’un dépôt (ex. container sans .git). Consommé par le data plane kernel (/nodefony/kernel/api/info → git) et la barre de debug (bloc app).

ProcessProbe#

class ProcessProbe

Sonde PROCESS stateful d’un worker — calcule les métriques par INTERVALLE (CPU, event-loop lag, ELU sont des deltas entre 2 read()). Une instance par process worker.

RichProcessProbe#

class RichProcessProbe

Sonde process riche stateful d’un worker — calcule les métriques par INTERVALLE (GC, ELU active/idle, changements de contexte sont des deltas entre deux read()). Une instance par process worker, lazy & opt-in : créée seulement quand un drill est actif sur ce worker (« on paie ce qu’on regarde »).

Fonctions (33)#

buildDevStatus#

function buildDevStatus(cwd: string, pid: number | null, pidAlive: boolean, procs: readonly DevProcessInfo[], ports: readonly PortState[], inProject?: boolean, discoverySupported?: boolean, foreign?: readonly DevProcessWithCwd[], projectScopeBlind?: boolean, readiness?: IReadinessProbe | null, portShift?: PortShift | null): DevStatusReport

Compose le DevStatusReport (décompte + incohérences) — fonction PURE : pidAlive est fourni par l’appelant (aucun syscall ici → testable sans ps/process). Centralise la synthèse + les warnings consommés AUSSI BIEN par le rendu ANSI CLI (renderStatus) que par le data plane Studio (collectDevStatus).

cleanZonePattern#

function cleanZonePattern(pattern: string): string

Pattern de zone LISIBLE : describe() remonte RegExp.source, où V8 échappe les slashes (^\/nodefony\/…) — on dé-échappe pour l’affichage ET pour le classement par namespace (un startsWith("^/nodefony") sur la source brute ne matcherait jamais — bug vécu au premier boot réel).

clearRuntimeState#

function clearRuntimeState(cwd: string): void

collectDevStatus#

function collectDevStatus(cwd: string, opts?: DiscoverOptions & DevObservationDeps): Promise<DevStatusReport>

Collecte l’état dev (ps + sonde ports + pidfile) → DevStatusReport JSON. Best-effort : Windows (pas de ps POSIX) → supported:false. opts.includeSelf (data plane = le serveur DOIT se compter). AUCUN boot kernel requis (observation externe pure) → utilisable depuis le fast-path standalone ET depuis le data plane.

computeBackoff#

function computeBackoff(crashes: number, baseMs: number, maxMs: number): number

Calcule le délai de respawn d’un worker mort selon un backoff exponentiel.

defaultDevPorts#

function defaultDevPorts(cwd?: string, env?: Record<string, string>): number[]

Ports serveur à SONDER (status, stop, readiness, attente de libération).

detectPortShift#

function detectPortShift(state: RuntimeState | null): PortShift | null

Le décalage de ports d’un runtime, ou null s’il sert bien ce qu’on lui a demandé.

detectRuntimeMode#

function detectRuntimeMode(procs: readonly DevProcessInfo[]): RuntimeMode | null

Mode runtime dominant observé, ou null si aucun process principal. Priorité dev > cluster > prod en cas de cohabitation anormale (le conflit est signalé par ailleurs en warning / refus). Fonction PURE.

findRuntimeConflict#

function findRuntimeConflict(procs: readonly DevProcessInfo[], intended: RuntimeMode): DevProcessInfo[]

Process PRINCIPAUX appartenant à un runtime d’un mode DIFFÉRENT de intended — un conflit de cohabitation (ex. un prod/cluster occupe les ports quand on veut démarrer en dev, ou l’inverse). Vite exclu (enfant). Sert aux gardes anti-collision : fail-loud (refus + message), JAMAIS de kill cross-mode automatique (un prod est intentionnel). Fonction PURE.

isClusterMessage#

function isClusterMessage(m: unknown): m is IClusterMessage

Type-guard d’un message IPC cluster — narrowing sûr d’un message unknown du canal partagé.

isClusterProbeCtl#

function isClusterProbeCtl(m: unknown): m is IClusterProbeCtl

Type-guard d’un IClusterProbeCtl — narrowing sûr du canal IPC partagé.

isClusterProbeEnrich#

function isClusterProbeEnrich(m: unknown): m is IClusterProbeEnrich

Type-guard d’un IClusterProbeEnrich — narrowing sûr du canal IPC partagé.

isFrameworkZone#

function isFrameworkZone(z: IFirewallZoneView): boolean

true si la zone vit dans le namespace réservé /nodefony → déclarée par @nodefony/framework (les aires data plane admin). L’inférence par pattern est fiable PAR CONVENTION : le routage /nodefony est réservé au framework (règle figée), aucune app/module tiers n’y monte d’aire.

isPortListening#

function isPortListening(port: number, host?: string, timeoutMs?: number): Promise<boolean>

true si un service écoute sur port en loopback (connexion acceptée). Inverse de la sonde « port libre » du superviseur : ici on confirme qu’un serveur RÉPOND. Le verdict de probePort, sans sa cause.

loadClusterConfig#

function loadClusterConfig(appPath?: string): Promise<WorkersSetting | null>

Lit le bloc cluster de la config app de façon standalone (best-effort), sans booter de Kernel — c’est tout ce dont le master a besoin pour décider du fork.

readCgroupCpuQuota#

function readCgroupCpuQuota(read?: FileReader): number | null

Lit le quota CPU effectif depuis les cgroups Linux — cgroup v2 (cpu.max) puis v1 (cpu.cfs_quota_us / cpu.cfs_period_us).

readEventLoopDelay#

function readEventLoopDelay(histogram: Pick<ELDHistogram, "mean" | "max" | "count">, resolutionMs?: number): IEventLoopDelay

Lit le retard RÉEL de la boucle sur un histogramme monitorEventLoopDelay.

readOrmHealth#

function readOrmHealth(): IOrmLeanHealth | null

Lit la santé ORM lean du process via le fournisseur branché, ou null si aucun ORM n’est branché (le champ orm du report est alors omis). Lecture pure, jamais throw.

readOrmRich#

function readOrmRich(): Promise<unknown> | null

Appelle le fournisseur ORM riche branché (async), ou null si aucun driver ne l’a posé. Le résultat est un blob OPAQUE (forme connue de Studio seul). Ne throw pas pour son propre compte : la propagation d’un rejet du provider reste à l’appelant (qui catch dans son tick).

readRuntimeState#

function readRuntimeState(cwd: string, opts?: { purgeStale?: boolean; }): RuntimeState | null

readSupervisorSuspension#

function readSupervisorSuspension(cwd: string): SupervisorLock | null

Le rechargement est-il suspendu, et pourquoi ?

readyAnnouncement#

function readyAnnouncement(state: RuntimeState | null, probedPorts?: readonly number[]): ReadyAnnouncement

Ce qu’un démarrage doit DIRE de l’endroit où il sert.

resolvePortPolicy#

function resolvePortPolicy(environment: string, explicit?: PortPolicy): PortPolicy

Politique de port effective.

resolveTopology#

function resolveTopology(opts?: ResolveTopologyOptions): Topology

Résout LA topologie de lancement — source unique de vérité pour « combien de workers ». Ordre de priorité (premier défini gagne) :

resolveWorkerCount#

function resolveWorkerCount(opts?: ResolveWorkerOptions): number

Résout le nombre de workers à forker, dans l’ordre de priorité :

resumeSupervisor#

function resumeSupervisor(cwd: string): void

Rend la main au superviseur (fin de l’opération, quelle qu’en soit l’issue).

runtimeModes#

function runtimeModes(procs: readonly DevProcessInfo[]): Set<RuntimeMode>

Modes runtime présents parmi les process PRINCIPAUX (Vite exclu — un Vite ne « tient » pas les ports serveur). Set vide = aucun runtime principal vivant. Fonction PURE.

servedUrl#

function servedUrl(scheme: "http" | "https", host: string, port: number): string

L’adresse où TAPER pour atteindre un serveur qui écoute sur host:port.

setOrmHealthProvider#

function setOrmHealthProvider(fn: () => IOrmLeanHealth | null): void

Branche (ou débranche avec null) le fournisseur de santé ORM lean. Idempotent (dernier gagne) — plusieurs drivers branchant la même fonction globale est sûr.

setOrmRichProvider#

function setOrmRichProvider(fn: () => Promise<unknown> | null): void

Branche (ou débranche avec null) le fournisseur de diagnostic ORM riche. Idempotent (dernier gagne). Coût NUL hors drill : ce fournisseur n’est appelé que quand le master a demandé l’enrichissement ORM de CE worker.

signalProcessGroup#

function signalProcessGroup(pid: number, signal: NodeJS.Signals, deps?: SignalTreeDeps): TreeSignalOutcome

Envoie signal à l’ARBRE de pid — enfant serveur ET ses Vite — et dit ce qu’il a pu atteindre. No-op silencieux si le process n’existe plus.

suspendSupervisor#

function suspendSupervisor(cwd: string, reason: string, detail?: string): void

Suspend le rechargement automatique le temps d’une opération qui écrit dans les sources.

writeRuntimeState#

function writeRuntimeState(cwd: string, state: Omit<RuntimeState, "ts">): void

Publie les ports EFFECTIFS du runtime. Best-effort : un échec d’écriture ne doit jamais faire tomber un serveur qui, lui, écoute très bien (les lecteurs retomberont sur les ports par défaut).

Constantes (6)#

CLUSTER_PROBE_CTL_KIND#

const CLUSTER_PROBE_CTL_KIND: "nf:probe:ctl"

kind d’un ordre d’enrichissement worker → master (Phase 2 drill-down). Un worker (celui qui tient la connexion navigateur) demande au master d’activer/couper la sonde riche (GC/heap-spaces/handles/ELU/ctx — cf RichProcessProbe) sur le worker pid ciblé. Routé par le "./ClusterProbeAggregator" vers ce worker via CLUSTER_PROBE_ENRICH_KIND. « On paie ce qu’on regarde » : aucun rich produit hors drill.

CLUSTER_PROBE_ENRICH_KIND#

const CLUSTER_PROBE_ENRICH_KIND: "nf:probe:enrich"

kind de l’ordre ciblé master → worker (Phase 2 drill-down). Dit au worker d’inclure (ou non) son blob de sonde riche dans son report périodique (CLUSTER_PROBE_KIND). Le rich voyage ensuite dans le snapshot agrégé EXISTANT (aucun nouveau flux de données — juste un champ rich de plus pour ce worker).

CLUSTER_PROBE_KIND#

const CLUSTER_PROBE_KIND: "nf:probe"

kind d’une remontée de sonde worker → master (Phase 4c). Chaque worker envoie périodiquement sa santé per-instance (opaque pour le master) ; le "./ClusterProbeAggregator" les collecte. Le "./ClusterRelay" IGNORE ce kind (ce n’est pas une publication realtime à rebroadcaster).

CLUSTER_PROBE_SNAPSHOT_KIND#

const CLUSTER_PROBE_SNAPSHOT_KIND: "nf:probe:snap"

kind du snapshot agrégé master → workers (Phase 4c). Le master diffuse périodiquement la liste des sondes de TOUS les workers ({ ts, instances }) ; chaque worker la met en cache pour servir la vue POD sur son endpoint santé (push, pas pull).

CLUSTER_RT_KIND#

const CLUSTER_RT_KIND: "nf:rt"

kind d’une publication realtime (port IBackplane). Le "./ClusterRelay" rebroadcast ces messages aux autres workers ; le ClusterBackplane (framework) les produit/consomme.

EVENT_LOOP_RESOLUTION_MS#

const EVENT_LOOP_RESOLUTION_MS = 20

Période d’échantillonnage des histogrammes de retard de la boucle (ms).

Interfaces (29)#

ClusterManagerOptions#

interface ClusterManagerOptions

Options du ClusterManager. Tous les effets de bord (runtime, timers, exit, log) sont injectables.

ClusterProbeAggregatorOptions#

interface ClusterProbeAggregatorOptions

Options du ClusterProbeAggregator.

ClusterRelayOptions#

interface ClusterRelayOptions

Options du ClusterRelay. Effets de bord (log) injectables.

ClusterScheduler#

interface ClusterScheduler

Planificateur (setTimeout/clearTimeout) — injectable pour tester backoff + timeout sans horloge réelle.

DevProcessInfo#

interface DevProcessInfo

Process runtime Nodefony vivant observé via ps (sans IPC) — dev, prod ou cluster.

DevStatusReport#

interface DevStatusReport

Rapport d’introspection des process dev — forme JSON, SOURCE DE VÉRITÉ unique partagée par le rendu ANSI CLI (nodefony status) et le data plane Studio (GET /nodefony/kernel/api/processes). CLI et Web affichent EXACTEMENT le même état.

GitInfo#

interface GitInfo

Identité git du dépôt courant. Champs "" si indéterminés (hors dépôt).

IClusterConfig#

interface IClusterConfig

Bloc cluster de la config app — lisible sans kernel (le master fork les workers AVANT de booter le moindre Kernel : il doit donc lire ce réglage seul). Doit rester kernel-free pour pouvoir être importé directement par le master.

IClusterMessage#

interface IClusterMessage

Base de tout message du protocole IPC cluster — seul le kind est imposé. Les autres champs sont opaques pour le master (il route/agrège sans les inspecter).

IClusterProbeCtl#

interface IClusterProbeCtl extends IClusterMessage

Ordre d’enrichissement (worker → master, CLUSTER_PROBE_CTL_KIND). op = "enrich" (activer) | "stop" (couper) ; pid = worker à (dés)enrichir ; facet = quelle sonde riche cibler (défaut "process" si absent → rétro-compat supervision).

IClusterProbeEnrich#

interface IClusterProbeEnrich extends IClusterMessage

Ordre ciblé (master → worker, CLUSTER_PROBE_ENRICH_KIND). enabled = le worker doit-il joindre sa sonde riche à ses prochains reports ; facet = laquelle (défaut "process").

IClusterRuntime#

interface IClusterRuntime

Runtime cluster — abstrait node:cluster pour piloter fork/exit dans les tests sans forker de process.

IClusterWorker#

interface IClusterWorker

Handle minimal d’un worker — sous-ensemble de cluster.Worker réellement utilisé (testable).

IEventLoopDelay#

interface IEventLoopDelay

Retard de la boucle d’événements sur un intervalle, en ms.

IFirewallZoneView#

interface IFirewallZoneView

Vue minimale d’une zone du firewall (firewall.describe().zones), résolue par duck-typing — le core n’importe jamais

IInstanceErrorHealth#

interface IInstanceErrorHealth

Santé erreurs per-instance — compteurs Syslog monotones (cf Syslog.errorTotal / Syslog.criticTotal). Permet une carte « erreurs par worker » + un taux d’erreur pod (delta côté lecteur). Lecture pure d’entiers, 0 scan du ring buffer.

IOrmLeanHealth#

interface IOrmLeanHealth

Santé ORM agrégée per-instance (lean) — somme process-wide de tous les connecteurs enregistrés, dérivée des singletons queryFlowMonitor + connectionMonitor (0 ping, 0 toSQL, O(N connecteurs)). Rejoint le report de sonde du worker à chaque tick (≥ 1 s). Tous les cumuls sont monotones → débit/s dérivé côté lecteur (delta/ts, comme le CPU%).

IProbeWorker#

interface IProbeWorker

Handle master-side d’un worker, vu par l’agrégateur — sous-ensemble testable de cluster.Worker (même seam que IRelayWorker). Prouve la collecte + la diffusion sans forker de process réel.

IProcessHealth#

interface IProcessHealth

Santé PROCESS d’un worker — lue par ProcessProbe, agrégée par worker dans le snapshot pod (cf ClusterProbeAggregator). Volontairement lean (sérialisée par worker à chaque tick de report ≥ 1 s) : juste de quoi peupler une grille « salle des machines » (1 carte/worker). Les sondes lourdes (GC, heap-spaces, ctx-switches) restent au canal nodefony:supervision per-process pour le drill-down.

IProcessRich#

interface IProcessRich

Sonde process riche d’un worker — le complément du lean IProcessHealth pour le drill-down (Phase 2). Ne contient QUE ce qui manque au lean : pression GC, répartition du heap V8, ressources actives, ELU active/idle (ms) et changements de contexte OS. Fusionné côté front avec le lean déjà présent dans le snapshot pod.

IRelayWorker#

interface IRelayWorker

Handle master-side d’un worker, vu par le relay — sous-ensemble testable de cluster.Worker réellement utilisé (même approche que IClusterWorker du ClusterManager). Permet de prouver le routage sans forker de process réel.

PortShift#

interface PortShift

Un décalage de ports CONSTATÉ : ce que la config demandait, ce qui sert.

PortState#

interface PortState

État de sonde d’un port serveur.

ReadyAnnouncement#

interface ReadyAnnouncement

Ce qu’un démarrage annonce de l’endroit où il sert.

ResolveTopologyOptions#

interface ResolveTopologyOptions

Seams de resolveTopology — tous injectables (résolution pure, testable sans FS).

ResolveWorkerOptions#

interface ResolveWorkerOptions

Options de resolveWorkerCount — tous les seams sont injectables pour les tests.

RuntimeState#

interface RuntimeState

Ce que le serveur publie sur lui-même une fois ses serveurs en écoute.

SupervisorLock#

interface SupervisorLock

Ce que le serveur publie quand il demande au superviseur de patienter.

Topology#

interface Topology

Résultat résolu de la topologie : nombre de workers + provenance.

Types (8)#

ClusterProbeFacet#

type ClusterProbeFacet = "process" | "orm"

Facette de sonde riche ciblée par un ordre d’enrichissement (drill-down) : - "process" : sonde process riche (GC/heap-spaces/handles/ELU/ctx — RichProcessProbe) ; - "orm" : sonde ORM riche (diagnostic connexions + flux — connection/health + flow).

DevProcessRole#

type DevProcessRole = "supervisor" | "server" | "vite" | "master" | "worker"

Rôle d’un process dans la topologie runtime Nodefony (dev OU prod OU cluster). supervisor/master = superviseurs (0 HTTP) ; server/worker = servent le HTTP ; vite = enfant dev (bundler).

FileReader#

type FileReader = (path: string) => string | null

Lecteur de fichier système — abstrait pour rendre la résolution cgroup testable sans conteneur. Retourne le contenu du fichier, ou null si absent / illisible.

PortPolicy#

type PortPolicy = "auto" | "strict"

Que faire si le port désiré est occupé — servers.portPolicy.

RuntimeMode#

type RuntimeMode = "dev" | "prod" | "cluster"

Mode de runtime d’un process Nodefony — la « molette front » (cf modèle 2 molettes). dev = superviseur + serveur + Vite (HMR) ; prod = serveur mono-process foreground (1 pod) ; cluster = master superviseur + N workers. Distingue un nodefony server (prod) d’un nodefony-dev-server (dev) là où le seul role ne suffit pas.

TopologySource#

type TopologySource = "flag" | "env" | "config" | "default"

D’où vient la valeur workers retenue — pour le log de diagnostic au boot.

TreeSignalOutcome#

type TreeSignalOutcome = "group" | "forced-tree" | "single" | "gone"

Ce qu’un envoi de signal a RÉELLEMENT pu atteindre — le verdict, pas l’intention.

WorkersSetting#

type WorkersSetting = number | "auto"

Réglage de topologie de l’application — la « molette » côté DevOps (remplace le rôle de instances dans l’ancien pm2.config.ts, retiré en cloud-native).


← Toutes les références d’API