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

Référence d'API — nodefony/client — realtime

stable

Documentation › Référence d’API › nodefony › sous-chemin-client-realtime

Générée depuis les déclarations de types publiées de nodefony 10.0.0-beta.6 : 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/client#

import { … } from "nodefony/client" — 86 symboles.

Classes (2)#

JsonRpcPeer#

class JsonRpcPeer<Emit extends EventsMap = DefaultEventsMap, Listen extends EventsMap = DefaultEventsMap, Actions extends ActionsMap = DefaultActionsMap> implements IRealtimePeer<Emit, Actions>

RpcError#

class RpcError extends Error

Erreur RPC applicative — l’exception VOLONTAIRE au principe « throw → -32603 générique » : un handler qui rejette avec une RpcError choisit explicitement d’exposer code/message/data au pair (404 d’un path invoqué, 403 d’un voter…). Tout autre throw reste opaque (Zero Trust).

Fonctions (11)#

createIdempotencyKey#

function createIdempotencyKey(): string

Une clé d’idempotence neuve : UUID v4 quand l’environnement l’offre, sinon une chaîne horodatée et aléatoire (page servie hors contexte sécurisé, où crypto.randomUUID n’existe pas).

createThroughputPayload#

function createThroughputPayload(size: number, seed?: number): Uint8Array<ArrayBuffer>

Fabrique la charge de la sonde : size octets pseudo-aléatoires, toujours les mêmes pour une même graine.

fromLittleEndianBytes#

function fromLittleEndianBytes<T extends NumericArray>(bytes: Uint8Array<ArrayBuffer>, ctor: INumericArrayConstructor<T>, littleEndian?: boolean): T

Relit une série émise par toLittleEndianBytes.

isPlatformChannel#

function isPlatformChannel(name: string): boolean

Le nom désigne-t-il une surface de la plateforme (canal OU méthode) ?

isRateChannel#

function isRateChannel(channel: string, base: string): boolean

Vrai si channel est le canal de base nu OU une de ses variantes cadencées base:<ms>.

isRealtimePayload#

function isRealtimePayload(value: unknown): value is object

Dit si une valeur est une charge realtime admise : absente, un objet, un tableau ou des octets — jamais un nombre, une chaîne, un booléen ni null.

isThroughputPayloadSize#

function isThroughputPayloadSize(value: unknown): value is ThroughputPayloadSize

true si value est une taille admise par la sonde de débit.

parseRate#

function parseRate(channel: string, base: string, bounds: RateBounds): number

Résout la cadence (ms) d’un canal cadencé connu, côté serveur. Le serveur connaît la base qu’il vient de matcher ; ce helper en extrait le suffixe :<ms>, borne dans bounds et retombe sur bounds.default pour le canal de base nu ou un suffixe invalide.

rateChannel#

function rateChannel(base: string, intervalMs?: number, defaultMs?: number): string

Construit le nom d’un canal cadencé à partir de sa base et de la cadence demandée.

textCodecForMarker#

function textCodecForMarker(marker: unknown): IFrameCodec

Le codec JSON qui relit un texte selon le marqueur que son émetteur a annoncé — champ bytes de l’accueil sur la socket, en-tête BYTES_MARKER_HEADER sur le REST. Une seule règle pour les deux transports : la convention n’est relue que si elle est annoncée, sinon un objet applicatif {"$bytes": …} changerait de nature.

toLittleEndianBytes#

function toLittleEndianBytes(view: NumericArray, littleEndian?: boolean): Uint8Array<ArrayBuffer>

Rend les octets petit-boutistes d’un tableau typé, prêts à voyager.

Constantes (12)#

BYTES_MARKER_HEADER#

const BYTES_MARKER_HEADER = "x-nodefony-bytes"

En-tête HTTP par lequel une réponse REST annonce la convention d’octets — le pendant du champ bytes de realtime:welcome sur la socket. Absent, le corps est du JSON natif : un objet {"$bytes": …} y reste un objet (ADR-0022 §2).

JSON_PROTOCOL#

const JSON_PROTOCOL = "nodefony.jsonrpc.v1"

Sous-protocole WebSocket (RFC 6455 §1.9) du codec texte — le format d’une connexion qui n’en a négocié aucun (décision 1 de #630). Nom versionné : une enveloppe qui change ajoute v2, jamais ne renomme v1.

NODEFONY_CHANNEL_NAMESPACE#

const NODEFONY_CHANNEL_NAMESPACE = "nodefony:"

Marque des surfaces de plateforme sur la socket. Un canal qui commence par ce préfixe décrit le serveur, jamais le métier de l’application.

PLATFORM_CHANNELS#

const PLATFORM_CHANNELS: { readonly syslog: "nodefony:syslog"; readonly audit: "nodefony:audit"; readonly dashboard: "nodefony:dashboard"; readonly supervision: "nodefony:supervision"; readonly debugbar: "nodefony:debugbar"; readonly socket: "nodefony:socket"; readonly ormHealth: "nodefony:orm:health"; readonly ormFlow: "nodefony:orm:flow"; readonly ormRich: "nodefony:orm:rich"; readonly scaffoldJ …

Canaux de diffusion de la plateforme (le serveur pousse, les écrans regardent).

PLATFORM_EVENTS#

const PLATFORM_EVENTS: { readonly hmr: "nodefony:hmr"; readonly debugbarSelect: "nodefony:debugbar:select"; }

Événements DOM de la plateforme (window), dans le même espace de nommage.

PLATFORM_INBOUND#

const PLATFORM_INBOUND: { readonly syslogUplink: "nodefony:syslog:uplink"; }

Canaux MONTANTS de la plateforme (le navigateur pousse, le pod reçoit).

PLATFORM_LITTLE_ENDIAN#

const PLATFORM_LITTLE_ENDIAN: boolean

true si la machine range ses nombres en petit-boutiste (constaté, pas déduit).

PLATFORM_METHODS#

const PLATFORM_METHODS: { readonly ping: "nodefony:kernel:ping"; readonly gc: "nodefony:kernel:gc"; readonly scaffoldPreview: "nodefony:scaffold:preview"; readonly scaffoldRun: "nodefony:scaffold:run"; readonly scaffoldCancel: "nodefony:scaffold:cancel"; readonly throughput: "nodefony:realtime:throughput"; }

Méthodes RPC de la plateforme (le client demande, le serveur répond).

SUPERVISION_HISTORY_COLUMNS#

const SUPERVISION_HISTORY_COLUMNS: readonly [ "ts", "cpuPercent", "eventLoopMeanMs", "eluUtilization", "heapUsed", "rss" ]

Séries de l’historique, dans l’ordre des colonnes de values (Float64).

SUPERVISION_LOOP_BANDS#

const SUPERVISION_LOOP_BANDS: readonly [ "p50", "p90", "p99", "max" ]

Bandes du retard de la boucle, dans l’ordre des colonnes de loop (Float32, ms). Des percentiles et non les cases de l’histogramme : monitorEventLoopDelay n’expose pas ses cases (#618 D5).

THROUGHPUT_PAYLOAD_SIZES#

const THROUGHPUT_PAYLOAD_SIZES: readonly [ 1024, 65536, 1048576 ]

Tailles admises, en octets : 1 Ko, 64 Ko, 1 Mo. Fermées : une taille libre ferait de l’action un amplificateur que le client dimensionne. 1 Mo reste sous maxPayload (1 MiB) une fois l’enveloppe ajoutée côté CBOR, et le sens est serveur → client seulement.

TransportState#

const TransportState: { readonly CONNECTING: 0; readonly OPEN: 1; readonly CLOSING: 2; readonly CLOSED: 3; }

États d’un transport — alignés sur les constantes WebSocket.

Interfaces (30)#

IBackplaneInfo#

interface IBackplaneInfo

Carte d’identité d’un backplane — descripteur de DONNÉE (pas un log) décrivant l’état du fond de panier. Source unique alimentant trois sorties cohérentes : la ligne stdout au boot, le champ backplane de la sonde (/api/health) et la vue Studio. Réutilisable par les tests / un agent IA sans dupliquer la connaissance « c’est quoi ce backplane ».

IBackplaneQueueInfo#

interface IBackplaneQueueInfo

Compteurs de la file d’envoi d’un backplane à transport réseau : ce qui est publié mais pas encore acquitté par le bus. Sans borne, cette file (interne au client réseau) grossit sans limite sous rafale — d’où le seuil et ses compteurs, exposés jusqu’à la sonde et Studio. Cf BackplanePublishQueue.

IChannelStats#

interface IChannelStats

Compteurs d’un canal — génériques, calculés au point d’arrivée des frames donc fiables et réutilisables par toute app. (NodefonySocket.MessageStats en est l’alias.)

IContractRoute#

interface IContractRoute

Une route servie par le pont, vue par le contrat : le schéma de son corps et de sa query — la VALEUR que la route valide, référencée par typeof, jamais recopiée —, et ce qu’elle rend.

IFrameCodec#

interface IFrameCodec

Codec de frame de la socket temps réel : remplace, par frame, le JSON.stringify à l’envoi et le JSON.parse à la réception — aucun appel de plus.

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.

IJsonRpcFrameSink#

interface IJsonRpcFrameSink

Sortie d’un pair qui laisse la SÉRIALISATION à son transport : il reçoit la frame en objet. Forme historique, conservée pour les transports qui ne parlent pas de codec (relais en mémoire, tests).

IJsonRpcPeerHooks#

interface IJsonRpcPeerHooks<Emit extends EventsMap = DefaultEventsMap, Listen extends EventsMap = DefaultEventsMap, Actions extends ActionsMap = DefaultActionsMap>

Crochets d’un pair JSON-RPC, communs aux deux formes de sortie.

IJsonRpcWireSink#

interface IJsonRpcWireSink

Sortie d’un pair qui SÉRIALISE lui-même, avec son codec courant (ADR-0022 §4, ligne (i) : les codecs vivent dans le pair partagé, jamais dans le client ni dans le contrôleur). Le transport ne reçoit que des données prêtes pour le fil.

INumericArrayConstructor#

interface INumericArrayConstructor<T extends NumericArray>

Constructeur d’un NumericArray — Float64Array, Uint32Array…

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%).

IPlatformRealtimeContract#

interface IPlatformRealtimeContract extends IRealtimeContract

Contrat des canaux nodefony:*. Une application l’ÉTEND pour ajouter les siens ; c’est la seule façon de typer, sur une même socket, les canaux de la plateforme et ceux de son métier.

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.

IRealtimeChannel#

interface IRealtimeChannel

Handle d’UN canal — vue par-canal d’un sous-flux duplex multiplexé sur la IRealtimeSocket. Forme naturelle des canaux à état (un appel SIP, une connexion bridgée) : il porte son nom, sa nature et son cycle de vie. C’est le point d’accroche des couches à venir (codec de protocole, cadence AIMD, politique drop|coalesce|batch) — elles enrichiront ce handle SANS retoucher la socket.

IRealtimeChannelStat#

interface IRealtimeChannelStat

Stat per-canal du hub (fan-out).

IRealtimeClosed#

interface IRealtimeClosed

Payload de la notification système realtime:closed — poussée par le serveur quand il met fin, de lui-même, à un abonnement en cours (ADR-0021 S4, ADR-0022 §6 décision 3).

IRealtimeClusterHealth#

interface IRealtimeClusterHealth

Vue POD agrégée de la socket (mode cluster) — la santé de TOUS les workers du pod consolidée. Servie par n’importe quel worker via l’endpoint santé quand le master pousse le snapshot agrégé (sinon on retombe sur IRealtimeHealth per-instance).

IRealtimeContract#

interface IRealtimeContract

Le moule du contrat temps réel d’une application — déclaré UNE fois, dans un fichier partagé par ses deux côtés, et lu par chacun dans SA direction.

IRealtimeDenied#

interface IRealtimeDenied

Payload de la notification système realtime:denied — poussée par le serveur quand une frame subscribe/inbound est REFUSÉE par le verrou d’autorisation (P6). Rend le refus OBSERVABLE côté client (une notification, contrairement à une requête, serait sinon droppée en silence → le client resterait aveugle).

IRealtimeHealth#

interface IRealtimeHealth extends IRealtimeProbe

Snapshot enrichi de l’identité d’instance — santé per-instance d’un worker/pod.

IRealtimePeer#

interface IRealtimePeer<Emit extends EventsMap = DefaultEventsMap, Actions extends ActionsMap = DefaultActionsMap>

IRealtimeProbe#

interface IRealtimeProbe

Snapshot PUR du hub (sans identité process) — ce que renvoie RealtimeHub.probe(). Per-instance/pod (cloud-native) ; l’agrégat multi-pod = backplane Redis / Prometheus.

IRealtimeSocket#

interface IRealtimeSocket<Emit extends EventsMap = DefaultEventsMap, Listen extends EventsMap = DefaultEventsMap>

Contrat de « la socket Nodefony » — voir le bloc de tête du fichier. Implémenté par NodefonySocket (front) et, à terme, par une façade serveur au-dessus du hub.

IRealtimeSubscribed#

interface IRealtimeSubscribed

Payload de la notification système realtime:subscribed — poussée par le serveur quand un subscribe est ACCEPTÉ, y compris pour un canal que la connexion suivait déjà (sans quoi un subscribe réémis attendrait un acquittement qui ne vient jamais).

IRealtimeTransport#

interface IRealtimeTransport

IRealtimeWelcome#

interface IRealtimeWelcome

Payload de la notification système realtime:welcome — 1ʳᵉ frame poussée par le serveur juste après le handshake. Annonce le protocole, les canaux/actions découvrables de l’endpoint et l’RealtimeIdentity résolue de la connexion. Cold path (1×/connexion).

ISupervisionHistory#

interface ISupervisionHistory

Historique tel qu’il voyage : séries linéarisées du plus ancien au plus récent, colonne après colonne, en octets petit-boutistes (relire par fromLittleEndianBytes). La colonne c occupe les éléments [c × length, (c + 1) × length) de la série relue.

RateBounds#

interface RateBounds

Bornes de cadence d’un canal cadencé (toutes en millisecondes).

RealtimeIdentity#

interface RealtimeIdentity

Identité d’une connexion temps réel, telle que résolue par le serveur au handshake (token neutre IRealtimeToken côté back) et annoncée au client dans la notification système realtime:welcome.

Types (31)#

BridgeVerb#

type BridgeVerb = "GET" | "POST" | "PUT" | "PATCH" | "DELETE"

Verbe HTTP d’une action servie par le pont api.request — le pont n’en sert pas d’autre.

ContractClientActions#

type ContractClientActions<C extends IRealtimeContract> = MethodsSeenBy<ContractSide<C, "serverMethods", ActionsMap>, "out"> & MethodsSeenBy<ContractSide<C, "clientMethods", ActionsMap>, "in">

Les méthodes du client vues par NodefonySocket : serverMethods qu’il appelle (request, résultat lu par Jsonify) et clientMethods qu’il implémente (register, paramètres lus par Jsonify). La socket range les deux sous un seul générique Actions : une méthode déclarée des deux côtés sous le même nom n’a pas de sens, le contrat ne la sépare pas.

ContractClientEmit#

type ContractClientEmit<C extends IRealtimeContract> = ContractSide<C, "clientToServer", EventsMap>

Ce que le client ÉMET : clientToServer, tel que déclaré.

ContractClientListen#

type ContractClientListen<C extends IRealtimeContract> = ReceivedEvents<ContractSide<C, "serverToClient", EventsMap>>

Ce que le client REÇOIT : serverToClient, lu par Jsonify.

ContractClientRoutes#

type ContractClientRoutes<C extends IRealtimeContract> = ContractSide<C, "serverRoutes", RoutesMap>

Les routes du pont qu’un client appelle — serverRoutes du contrat, ou la carte permissive si le contrat n’en déclare pas.

ContractRouteBody#

type ContractRouteBody<R extends RoutesMap, K extends string> = K extends DeclaredRouteKeys<R> ? RoutePart<R, K, "body"> : unknown

Le corps qu’accepte une route du pont : l’entrée de son schéma quand la clé K ("<VERBE> <chemin>") appartient au contrat, undefined si la route déclarée n’a pas de corps, libre (unknown) hors contrat.

ContractRouteParams#

type ContractRouteParams<R extends RoutesMap, K extends string, P extends string> = K extends DeclaredRouteKeys<R> ? "params" extends keyof R[K & keyof R] ? RoutePart<R, K & keyof R, "params"> : TemplateParams<P> : TemplateParams<P>

Les paramètres de chemin qu’accepte une route du pont : l’entrée de son schéma params quand la route déclarée en a un, sinon une valeur par {nom} du gabarit P — sous contrat comme hors contrat.

ContractRouteQuery#

type ContractRouteQuery<R extends RoutesMap, K extends string> = K extends DeclaredRouteKeys<R> ? RoutePart<R, K, "query"> : unknown

La query qu’accepte une route du pont — pendant de ContractRouteBody.

ContractRouteResult#

type ContractRouteResult<R extends RoutesMap, K extends string, T> = K extends DeclaredRouteKeys<R> ? R[K & keyof R] extends { result: infer X; } ? Jsonify<X> : unknown : T

Ce que rend une route du pont, lu par Jsonify (il a traversé le fil) quand K appartient au contrat ; sinon le T que l’appelant demande.

JsonRpcErrorObject#

type JsonRpcErrorObject = IJsonRpcErrorObject

Erreur JSON-RPC 2.0 (objet error d’une réponse).

JsonRpcPeerOptions#

type JsonRpcPeerOptions<Emit extends EventsMap = DefaultEventsMap, Listen extends EventsMap = DefaultEventsMap, Actions extends ActionsMap = DefaultActionsMap> = IJsonRpcPeerHooks<Emit, Listen, Actions> & (IJsonRpcFrameSink | IJsonRpcWireSink)

Options d’un JsonRpcPeer : ses crochets, et UNE sortie — send (le transport sérialise) ou write (le pair encode avec son codec).

Jsonify#

type Jsonify<T, D extends number = 10> = unknown extends T ? T : [ D ] extends [ never ] ? unknown : T extends Uint8Array ? T : T extends { toJSON(...args: never[]): infer R; } ? Jsonify<R, JsonifyDepth[D]> : T extends JsonPrimitive | void ? T : T extends bigint | symbol | (...args: never[]) => unknown ? never : T extends readonly unknown[] ? { [I in keyof T]: JsonifyItem<T[I], JsonifyDepth[D]>; } …

Le type qu’un pair REÇOIT quand l’autre a envoyé un T : ce que JSON en fait.

NumericArray#

type NumericArray = Float64Array<ArrayBuffer> | Float32Array<ArrayBuffer> | Uint32Array<ArrayBuffer> | Int32Array<ArrayBuffer> | Uint16Array<ArrayBuffer> | Int16Array<ArrayBuffer>

Tableaux typés numériques transportables (un élément = taille fixe).

PlatformChannel#

type PlatformChannel = (typeof PLATFORM_CHANNELS)[keyof typeof PLATFORM_CHANNELS]

Nom d’un canal de plateforme (valeur de PLATFORM_CHANNELS).

PlatformInboundChannel#

type PlatformInboundChannel = (typeof PLATFORM_INBOUND)[keyof typeof PLATFORM_INBOUND]

Nom d’un canal montant de plateforme (valeur de PLATFORM_INBOUND).

PlatformMethod#

type PlatformMethod = (typeof PLATFORM_METHODS)[keyof typeof PLATFORM_METHODS]

Nom d’une méthode RPC de plateforme (valeur de PLATFORM_METHODS).

PlatformServerToClient#

type PlatformServerToClient = { [K in (typeof PLATFORM_CHANNELS)["socket"]]: RealtimeHealthReport; }

Canaux de plateforme : nom → charge poussée par le serveur.

RealtimeClosedReason#

type RealtimeClosedReason = "ended" | "evicted"

Motif d’un realtime:closed. Fermé exprès, comme RealtimeDeniedReason : le client doit pouvoir traiter tous les cas.

RealtimeDeniedReason#

type RealtimeDeniedReason = "forbidden" | "limit" | "unknown" | "unavailable"

Motif d’un realtime:denied. Fermé exprès : le client doit pouvoir traiter TOUS les cas (le compilateur le lui rappelle), et un motif inventé côté serveur ne doit pas atteindre un écran qui ne sait pas le dire.

RealtimeFrameData#

type RealtimeFrameData = string | Uint8Array<ArrayBuffer>

Une frame brute telle que le transport la reçoit : du texte, ou des octets.

RealtimeHandler#

type RealtimeHandler = { handle(...args: unknown[]): void; }["handle"]

Handler d’un canal pub/sub — reçoit le params de la notification (ou (method, params) sur "*").

RealtimeHealthReport#

type RealtimeHealthReport = IRealtimeClusterHealth | IRealtimeHealth

Ce que publie nodefony:socket et ce que rend /nodefony/realtime/api/health : la vue POD agrégée en mode cluster, sinon la santé du seul worker qui répond. Le discriminant est cluster: true.

RealtimeOutboundData#

type RealtimeOutboundData = RealtimeFrameData

Ce qu’un transport accepte d’émettre : une frame texte déjà sérialisée, ou des octets tels quels — le même type qu’en réception (cf RealtimeFrameData).

RealtimeTransportFactory#

type RealtimeTransportFactory = (url: string, protocols?: readonly string[]) => IRealtimeTransport

Fabrique d’un transport pour une URL — injectable (tests, transports alternatifs).

RoutePathParamNames#

type RoutePathParamNames<P extends string> = P extends `${string}{${infer Name}}${infer Rest}` ? Name | RoutePathParamNames<Rest> : never

Noms des variables d’un gabarit de chemin — "/a/{id}/b/{slug}" → "id" | "slug" ; never sans variable. Même lecture que routePathParams (runtime/routePath.ts).

RoutesMap#

type RoutesMap = Record<`${BridgeVerb} /${string}`, IContractRoute>

Carte des routes du pont : "<VERBE> <chemin>" → IContractRoute. Le chemin est celui de la route montée, préfixe du contrôleur compris.

RpcActionHandler#

type RpcActionHandler = { handle(params: unknown): unknown; }["handle"]

Handler d’une action (requête→réponse). Sync ou async ; throw → -32603.

RpcNotificationHandler#

type RpcNotificationHandler<Listen extends EventsMap = DefaultEventsMap> = <K extends EventNames<Listen>>(method: K, params: EventPayload<Listen, K>) => void

Handler des notifications entrantes (pas de réponse). Paramétrable par Listen (map des notifications REÇUES par ce peer). Défaut permissif → comportement pré-types-partagés inchangé.

SupervisionHistoryPoint#

type SupervisionHistoryPoint = Record<(typeof SUPERVISION_HISTORY_COLUMNS)[number] | (typeof SUPERVISION_LOOP_BANDS)[number], number>

Un point de l’historique — une valeur par colonne et par bande.

ThroughputPayloadSize#

type ThroughputPayloadSize = (typeof THROUGHPUT_PAYLOAD_SIZES)[number]

Une des tailles de THROUGHPUT_PAYLOAD_SIZES.

TransportStateValue#

type TransportStateValue = (typeof TransportState)[keyof typeof TransportState]

← Toutes les références d’API