nodefony 7.0.2 → 10.0.0-alpha.2
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/.ai/symbols.json +36135 -0
- package/LICENSE +544 -0
- package/README.md +316 -694
- package/bin/nodefony +2183 -85
- package/dist/client/Container.js +367 -0
- package/dist/client/Event.js +198 -0
- package/dist/client/Service.js +344 -0
- package/dist/client/Tools.js +162 -0
- package/dist/client/client/ClientKernel.js +276 -0
- package/dist/client/client/angular/index.js +352 -0
- package/dist/client/client/announce.js +212 -0
- package/dist/client/client/debugbar/DebugBar.js +1624 -0
- package/dist/client/client/debugbar/format.js +103 -0
- package/dist/client/client/debugbar/hmr.js +37 -0
- package/dist/client/client/debugbar/index.js +29 -0
- package/dist/client/client/debugbar/model.js +133 -0
- package/dist/client/client/debugbar/network.js +173 -0
- package/dist/client/client/debugbar/profile.js +114 -0
- package/dist/client/client/index.js +34 -0
- package/dist/client/client/react/index.js +268 -0
- package/dist/client/client/realtime/AdaptiveRate.js +240 -0
- package/dist/client/client/realtime/BrowserWsTransport.js +57 -0
- package/dist/client/client/realtime/RealtimeClient.js +898 -0
- package/dist/client/client/realtime/localEvents.js +56 -0
- package/dist/client/client/realtime/notice.js +125 -0
- package/dist/client/client/realtime/observe.js +280 -0
- package/dist/client/client/roles/index.js +3 -0
- package/dist/client/client/roles/registry.js +97 -0
- package/dist/client/client/roles/roles.js +91 -0
- package/dist/client/client/shim/events.js +88 -0
- package/dist/client/client/shim/util.js +20 -0
- package/dist/client/client/svelte/index.js +319 -0
- package/dist/client/client/syslog/context.js +122 -0
- package/dist/client/client/syslog/errors.js +49 -0
- package/dist/client/client/syslog/uplink.js +106 -0
- package/dist/client/client/vue/index.js +321 -0
- package/dist/client/colors.js +63 -0
- package/dist/client/debugbar.standalone.js +4274 -0
- package/dist/client/realtime/IRealtimeTransport.js +32 -0
- package/dist/client/realtime/JsonRpcPeer.js +251 -0
- package/dist/client/realtime/channelRate.js +39 -0
- package/dist/client/realtime/platformChannels.js +155 -0
- package/dist/client/syslog/Pdu.js +224 -0
- package/dist/client/syslog/Syslog.js +1159 -0
- package/dist/client/syslog/drivers/pduFlow.js +106 -0
- package/dist/client/syslog/drivers/pduProtocol.js +28 -0
- package/dist/client/syslog/logColor.js +80 -0
- package/dist/client/types/src/Container.d.ts +221 -0
- package/dist/client/types/src/Event.d.ts +171 -0
- package/dist/client/types/src/FileClass.d.ts +184 -0
- package/dist/client/types/src/Service.d.ts +165 -0
- package/dist/client/types/src/Tools.d.ts +116 -0
- package/dist/client/types/src/client/ClientKernel.d.ts +90 -0
- package/dist/client/types/src/client/IClientKernel.d.ts +195 -0
- package/dist/client/types/src/client/angular/index.d.ts +273 -0
- package/dist/client/types/src/client/announce.d.ts +74 -0
- package/dist/client/types/src/client/debugbar/DebugBar.d.ts +279 -0
- package/dist/client/types/src/client/debugbar/format.d.ts +48 -0
- package/dist/client/types/src/client/debugbar/hmr.d.ts +16 -0
- package/dist/client/types/src/client/debugbar/index.d.ts +30 -0
- package/dist/client/types/src/client/debugbar/model.d.ts +158 -0
- package/dist/client/types/src/client/debugbar/network.d.ts +55 -0
- package/dist/client/types/src/client/debugbar/profile.d.ts +99 -0
- package/dist/client/types/src/client/index.d.ts +47 -0
- package/dist/client/types/src/client/react/index.d.ts +207 -0
- package/dist/client/types/src/client/realtime/AdaptiveRate.d.ts +138 -0
- package/dist/client/types/src/client/realtime/BrowserWsTransport.d.ts +27 -0
- package/dist/client/types/src/client/realtime/RealtimeClient.d.ts +573 -0
- package/dist/client/types/src/client/realtime/localEvents.d.ts +53 -0
- package/dist/client/types/src/client/realtime/notice.d.ts +70 -0
- package/dist/client/types/src/client/realtime/observe.d.ts +284 -0
- package/dist/client/types/src/client/roles/index.d.ts +15 -0
- package/dist/client/types/src/client/roles/registry.d.ts +72 -0
- package/dist/client/types/src/client/roles/roles.d.ts +68 -0
- package/dist/client/types/src/client/shim/cli-color.d.ts +2 -0
- package/dist/client/types/src/client/shim/events.d.ts +39 -0
- package/dist/client/types/src/client/shim/util.d.ts +14 -0
- package/dist/client/types/src/client/svelte/index.d.ts +216 -0
- package/dist/client/types/src/client/syslog/context.d.ts +76 -0
- package/dist/client/types/src/client/syslog/errors.d.ts +46 -0
- package/dist/client/types/src/client/syslog/uplink.d.ts +89 -0
- package/dist/client/types/src/client/transport/websocket.d.ts +5 -0
- package/dist/client/types/src/client/vue/index.d.ts +234 -0
- package/dist/client/types/src/colors.d.ts +32 -0
- package/dist/client/types/src/config/infra.d.ts +171 -0
- package/dist/client/types/src/kernel/bootReport.d.ts +112 -0
- package/dist/client/types/src/kernel/readinessRegistry.d.ts +104 -0
- package/dist/client/types/src/realtime/IRealtimeSocket.d.ts +142 -0
- package/dist/client/types/src/realtime/IRealtimeTransport.d.ts +50 -0
- package/dist/client/types/src/realtime/JsonRpcPeer.d.ts +251 -0
- package/dist/client/types/src/realtime/RealtimeEventMap.d.ts +269 -0
- package/dist/client/types/src/realtime/channelRate.d.ts +55 -0
- package/dist/client/types/src/realtime/platformChannels.d.ts +147 -0
- package/dist/client/types/src/syslog/Pdu.d.ts +134 -0
- package/dist/client/types/src/syslog/Syslog.d.ts +482 -0
- package/dist/client/types/src/syslog/drivers/ILogDriver.d.ts +177 -0
- package/dist/client/types/src/syslog/drivers/pduFlow.d.ts +53 -0
- package/dist/client/types/src/syslog/drivers/pduProtocol.d.ts +20 -0
- package/dist/client/types/src/syslog/logColor.d.ts +59 -0
- package/dist/client/types/src/types/ICliKernel.d.ts +28 -0
- package/dist/client/types/src/types/ICommand.d.ts +14 -0
- package/dist/client/types/src/types/IContainer.d.ts +35 -0
- package/dist/client/types/src/types/IKernel.d.ts +138 -0
- package/dist/client/types/src/types/IMcpTool.d.ts +157 -0
- package/dist/client/types/src/types/IModule.d.ts +73 -0
- package/dist/client/types/src/types/IPage.d.ts +119 -0
- package/dist/client/types/src/types/IService.d.ts +62 -0
- package/dist/client/types/src/types/ISyslog.d.ts +58 -0
- package/dist/client/types/src/types/ITransport.d.ts +5 -0
- package/dist/client/types/src/types/globals.d.ts +47 -0
- package/dist/node/Cli.js +750 -0
- package/dist/node/Container.js +367 -0
- package/dist/node/Error.js +309 -0
- package/dist/node/Event.js +198 -0
- package/dist/node/FileClass.js +308 -0
- package/dist/node/Nodefony.js +78 -0
- package/dist/node/Service.js +344 -0
- package/dist/node/Tools.js +205 -0
- package/dist/node/bin/resolveLocalCli.js +10 -0
- package/dist/node/bundler/index.js +103 -0
- package/dist/node/cli/agentTargets.js +461 -0
- package/dist/node/cli/aiMcp.js +553 -0
- package/dist/node/cli/aiMcpReport.js +129 -0
- package/dist/node/cli/aiSync.js +323 -0
- package/dist/node/cli/aiSyncReport.js +142 -0
- package/dist/node/cli/card.js +186 -0
- package/dist/node/cli/cardReport.js +110 -0
- package/dist/node/cli/completion.js +415 -0
- package/dist/node/cli/create.js +805 -0
- package/dist/node/cli/env.js +332 -0
- package/dist/node/cli/envReport.js +159 -0
- package/dist/node/cli/execPortable.js +60 -0
- package/dist/node/cli/gitHooks.js +191 -0
- package/dist/node/cli/gitHooksReport.js +119 -0
- package/dist/node/cli/globalFlags.js +67 -0
- package/dist/node/cli/helpReport.js +288 -0
- package/dist/node/cli/manPage.js +165 -0
- package/dist/node/cli/nodefonyBin.js +61 -0
- package/dist/node/cli/outdated.js +144 -0
- package/dist/node/cli/progress.js +555 -0
- package/dist/node/cli/projectRoot.js +32 -0
- package/dist/node/cli/promptPassword.js +44 -0
- package/dist/node/cli/prompts.js +86 -0
- package/dist/node/cli/scaffold/destination.js +92 -0
- package/dist/node/cli/scaffold/engine.js +2156 -0
- package/dist/node/cli/scaffold/entityFields.js +589 -0
- package/dist/node/cli/scaffold/format.js +243 -0
- package/dist/node/cli/scaffold/interactive.js +124 -0
- package/dist/node/cli/scaffold/moduleLayout.js +38 -0
- package/dist/node/cli/scaffold/reservedEntities.js +74 -0
- package/dist/node/cli/scaffold/spec.js +704 -0
- package/dist/node/cli/scaffold/steps.js +40 -0
- package/dist/node/cli/scaffold/userContractSource.js +133 -0
- package/dist/node/cli/scaffold/versions.js +57 -0
- package/dist/node/cli/scaffold/writer.js +172 -0
- package/dist/node/cli/startMenu.js +496 -0
- package/dist/node/cli/symbols.js +205 -0
- package/dist/node/cli/sysexits.js +34 -0
- package/dist/node/cli/tableReport.js +184 -0
- package/dist/node/cli/usageReport.js +144 -0
- package/dist/node/colors.js +63 -0
- package/dist/node/command/Builder.js +153 -0
- package/dist/node/command/Command.js +348 -0
- package/dist/node/config/configProvenance.js +101 -0
- package/dist/node/config/defaults.js +39 -0
- package/dist/node/config/defineConfig.js +129 -0
- package/dist/node/config/defineEnv.js +264 -0
- package/dist/node/config/envExample.js +41 -0
- package/dist/node/config/envOverride.js +423 -0
- package/dist/node/config/infra.js +163 -0
- package/dist/node/config/reactivity.js +23 -0
- package/dist/node/config/reservedEnv.js +118 -0
- package/dist/node/config/schema.js +134 -0
- package/dist/node/config/use.js +24 -0
- package/dist/node/finder/File.js +49 -0
- package/dist/node/finder/FileResult.js +86 -0
- package/dist/node/finder/Finder.js +201 -0
- package/dist/node/finder/Result.js +45 -0
- package/dist/node/index.js +121 -0
- package/dist/node/kernel/BootConfigurationError.js +54 -0
- package/dist/node/kernel/CliKernel.js +630 -0
- package/dist/node/kernel/Kernel.js +2198 -0
- package/dist/node/kernel/Module.js +453 -0
- package/dist/node/kernel/adminPlane/adminCaller.js +98 -0
- package/dist/node/kernel/adminPlane/adminRbac.js +51 -0
- package/dist/node/kernel/adminPlane/catalog.js +158 -0
- package/dist/node/kernel/adminPlane/executeAdmin.js +78 -0
- package/dist/node/kernel/checks/deep.js +335 -0
- package/dist/node/kernel/checks/freshness.js +139 -0
- package/dist/node/kernel/checks/gating.js +231 -0
- package/dist/node/kernel/checks/guards.js +232 -0
- package/dist/node/kernel/checks/lastBoot.js +136 -0
- package/dist/node/kernel/checks/live.js +330 -0
- package/dist/node/kernel/checks/packageDeps.js +292 -0
- package/dist/node/kernel/checks/readiness.js +153 -0
- package/dist/node/kernel/checks/renderReport.js +780 -0
- package/dist/node/kernel/checks/report.js +421 -0
- package/dist/node/kernel/checks/runDoctor.js +731 -0
- package/dist/node/kernel/checks/surface.js +364 -0
- package/dist/node/kernel/checks/walk.js +100 -0
- package/dist/node/kernel/checks/wiring.js +450 -0
- package/dist/node/kernel/commands/AiMcpCommand.js +65 -0
- package/dist/node/kernel/commands/AiSyncCommand.js +48 -0
- package/dist/node/kernel/commands/BuildCommand.js +49 -0
- package/dist/node/kernel/commands/CardCommand.js +50 -0
- package/dist/node/kernel/commands/ClusterCommand.js +58 -0
- package/dist/node/kernel/commands/CompletionCommand.js +31 -0
- package/dist/node/kernel/commands/CreateCommand.js +45 -0
- package/dist/node/kernel/commands/DevCommand.js +99 -0
- package/dist/node/kernel/commands/DoctorCommand.js +115 -0
- package/dist/node/kernel/commands/EnvCommand.js +52 -0
- package/dist/node/kernel/commands/GitHooksCommand.js +47 -0
- package/dist/node/kernel/commands/InspectCommand.js +153 -0
- package/dist/node/kernel/commands/InstallCommand.js +20 -0
- package/dist/node/kernel/commands/MenuCommand.js +261 -0
- package/dist/node/kernel/commands/OutdatedCommand.js +164 -0
- package/dist/node/kernel/commands/ProdCommand.js +60 -0
- package/dist/node/kernel/commands/StatusCommand.js +30 -0
- package/dist/node/kernel/commands/StopCommand.js +35 -0
- package/dist/node/kernel/commands/SymbolsCommand.js +45 -0
- package/dist/node/kernel/commands/runtimeLauncher.js +95 -0
- package/dist/node/kernel/decorators/kernelDecorator.js +110 -0
- package/dist/node/kernel/injector/injector.js +137 -0
- package/dist/node/kernel/injector/serviceOrder.js +106 -0
- package/dist/node/kernel/inspect/adminSubjects.js +194 -0
- package/dist/node/kernel/inspect/docOutline.js +86 -0
- package/dist/node/kernel/lifecycleTags.js +76 -0
- package/dist/node/kernel/moduleConfig.js +75 -0
- package/dist/node/kernel/moduleGating.js +68 -0
- package/dist/node/kernel/readinessRegistry.js +98 -0
- package/dist/node/kernel/resolveModuleEntry.js +61 -0
- package/dist/node/mcp/caller.js +40 -0
- package/dist/node/mcp/guard.js +51 -0
- package/dist/node/mcp/protocol.js +157 -0
- package/dist/node/mcp/server.js +216 -0
- package/dist/node/mcp/tools.js +861 -0
- package/dist/node/oauth/authorizationServer.js +221 -0
- package/dist/node/oauth/protectedResource.js +293 -0
- package/dist/node/package.js +4 -0
- package/dist/node/realtime/IRealtimeTransport.js +32 -0
- package/dist/node/realtime/JsonRpcPeer.js +251 -0
- package/dist/node/realtime/RealtimeEventMap.js +15 -0
- package/dist/node/realtime/channelRate.js +39 -0
- package/dist/node/realtime/platformChannels.js +155 -0
- package/dist/node/runtime/GcScheduler.js +92 -0
- package/dist/node/runtime/RequestContext.js +76 -0
- package/dist/node/runtime/bearer.js +84 -0
- package/dist/node/runtime/engineEnvironment.js +79 -0
- package/dist/node/runtime/loadEnv.js +105 -0
- package/dist/node/runtime/pageFacets.js +85 -0
- package/dist/node/runtime/pageFilters.js +103 -0
- package/dist/node/runtime/pageGuard.js +84 -0
- package/dist/node/runtime/pageQuery.js +160 -0
- package/dist/node/runtime/pageSort.js +114 -0
- package/dist/node/runtime/redact.js +43 -0
- package/dist/node/runtime/withTimeout.js +71 -0
- package/dist/node/service/cluster/ClusterManager.js +202 -0
- package/dist/node/service/cluster/ClusterProbeAggregator.js +120 -0
- package/dist/node/service/cluster/ClusterRelay.js +74 -0
- package/dist/node/service/cluster/clusterMaster.js +65 -0
- package/dist/node/service/cluster/clusterMessage.js +70 -0
- package/dist/node/service/cluster/cpuQuota.js +59 -0
- package/dist/node/service/cluster/instanceProbe.js +52 -0
- package/dist/node/service/cluster/podEnvironment.js +48 -0
- package/dist/node/service/cluster/processProbe.js +70 -0
- package/dist/node/service/cluster/richProcessProbe.js +115 -0
- package/dist/node/service/cluster/topology.js +71 -0
- package/dist/node/service/dev/BootReporter.js +490 -0
- package/dist/node/service/dev/DevSupervisor.js +1004 -0
- package/dist/node/service/dev/bootVerdict.js +158 -0
- package/dist/node/service/dev/detachedStart.js +372 -0
- package/dist/node/service/dev/devProcess.js +1137 -0
- package/dist/node/service/dev/devProjects.js +138 -0
- package/dist/node/service/dev/devStatusReport.js +395 -0
- package/dist/node/service/dev/devStop.js +263 -0
- package/dist/node/service/fetchService.js +35 -0
- package/dist/node/service/gitService.js +62 -0
- package/dist/node/syslog/Pdu.js +224 -0
- package/dist/node/syslog/Syslog.js +1159 -0
- package/dist/node/syslog/drivers/ClusterFileLogDriver.js +114 -0
- package/dist/node/syslog/drivers/FileLogDriver.js +127 -0
- package/dist/node/syslog/drivers/ILogDriver.js +26 -0
- package/dist/node/syslog/drivers/LokiLogDriver.js +144 -0
- package/dist/node/syslog/drivers/MemoryLogDriver.js +33 -0
- package/dist/node/syslog/drivers/OpenSearchLogDriver.js +159 -0
- package/dist/node/syslog/drivers/builtinLogDrivers.js +114 -0
- package/dist/node/syslog/drivers/filterPdus.js +71 -0
- package/dist/node/syslog/drivers/logDriverRegistry.js +83 -0
- package/dist/node/syslog/drivers/opensearchShared.js +17 -0
- package/dist/node/syslog/drivers/pduFlow.js +106 -0
- package/dist/node/syslog/drivers/pduProtocol.js +28 -0
- package/dist/node/syslog/httpFetch.js +43 -0
- package/dist/node/syslog/logColor.js +80 -0
- package/dist/node/syslog/sinks/FileSink.js +142 -0
- package/dist/node/syslog/transports/BatchingHttpTransport.js +98 -0
- package/dist/node/syslog/transports/ConsoleTransport.js +14 -0
- package/dist/node/syslog/transports/FileTransport.js +17 -0
- package/dist/node/syslog/transports/HttpTransport.js +44 -0
- package/dist/node/syslog/transports/LokiTransport.js +80 -0
- package/dist/node/syslog/transports/OpenSearchTransport.js +53 -0
- package/dist/node/syslog/transports/SyslogTransport.js +13 -0
- package/dist/node/syslog/transports/index.js +8 -0
- package/dist/node/testing/index.js +190 -0
- package/dist/types/Cli.d.ts +177 -0
- package/dist/types/Container.d.ts +221 -0
- package/dist/types/Error.d.ts +162 -0
- package/dist/types/Event.d.ts +171 -0
- package/dist/types/FileClass.d.ts +184 -0
- package/dist/types/Nodefony.d.ts +66 -0
- package/dist/types/Service.d.ts +165 -0
- package/dist/types/Tools.d.ts +116 -0
- package/dist/types/bin/resolveLocalCli.d.ts +49 -0
- package/dist/types/bundler/index.d.ts +66 -0
- package/dist/types/cli/agentTargets.d.ts +378 -0
- package/dist/types/cli/aiMcp.d.ts +239 -0
- package/dist/types/cli/aiMcpReport.d.ts +113 -0
- package/dist/types/cli/aiSync.d.ts +68 -0
- package/dist/types/cli/aiSyncReport.d.ts +149 -0
- package/dist/types/cli/card.d.ts +49 -0
- package/dist/types/cli/cardReport.d.ts +127 -0
- package/dist/types/cli/completion.d.ts +154 -0
- package/dist/types/cli/create.d.ts +177 -0
- package/dist/types/cli/env.d.ts +103 -0
- package/dist/types/cli/envReport.d.ts +153 -0
- package/dist/types/cli/execPortable.d.ts +54 -0
- package/dist/types/cli/gitHooks.d.ts +48 -0
- package/dist/types/cli/gitHooksReport.d.ts +101 -0
- package/dist/types/cli/globalFlags.d.ts +48 -0
- package/dist/types/cli/helpReport.d.ts +110 -0
- package/dist/types/cli/manPage.d.ts +21 -0
- package/dist/types/cli/nodefonyBin.d.ts +45 -0
- package/dist/types/cli/outdated.d.ts +119 -0
- package/dist/types/cli/progress.d.ts +349 -0
- package/dist/types/cli/projectRoot.d.ts +19 -0
- package/dist/types/cli/promptPassword.d.ts +22 -0
- package/dist/types/cli/prompts.d.ts +102 -0
- package/dist/types/cli/scaffold/destination.d.ts +70 -0
- package/dist/types/cli/scaffold/engine.d.ts +545 -0
- package/dist/types/cli/scaffold/entityFields.d.ts +238 -0
- package/dist/types/cli/scaffold/format.d.ts +78 -0
- package/dist/types/cli/scaffold/interactive.d.ts +11 -0
- package/dist/types/cli/scaffold/moduleLayout.d.ts +69 -0
- package/dist/types/cli/scaffold/reservedEntities.d.ts +49 -0
- package/dist/types/cli/scaffold/spec.d.ts +159 -0
- package/dist/types/cli/scaffold/steps.d.ts +24 -0
- package/dist/types/cli/scaffold/userContractSource.d.ts +86 -0
- package/dist/types/cli/scaffold/versions.d.ts +14 -0
- package/dist/types/cli/scaffold/writer.d.ts +100 -0
- package/dist/types/cli/startMenu.d.ts +195 -0
- package/dist/types/cli/symbols.d.ts +84 -0
- package/dist/types/cli/sysexits.d.ts +31 -0
- package/dist/types/cli/tableReport.d.ts +44 -0
- package/dist/types/cli/usageReport.d.ts +108 -0
- package/dist/types/client/ClientKernel.d.ts +90 -0
- package/dist/types/client/IClientKernel.d.ts +195 -0
- package/dist/types/client/angular/index.d.ts +273 -0
- package/dist/types/client/announce.d.ts +74 -0
- package/dist/types/client/debugbar/DebugBar.d.ts +279 -0
- package/dist/types/client/debugbar/format.d.ts +48 -0
- package/dist/types/client/debugbar/hmr.d.ts +16 -0
- package/dist/types/client/debugbar/index.d.ts +30 -0
- package/dist/types/client/debugbar/model.d.ts +158 -0
- package/dist/types/client/debugbar/network.d.ts +55 -0
- package/dist/types/client/debugbar/profile.d.ts +99 -0
- package/dist/types/client/index.d.ts +47 -0
- package/dist/types/client/react/index.d.ts +207 -0
- package/dist/types/client/realtime/AdaptiveRate.d.ts +138 -0
- package/dist/types/client/realtime/BrowserWsTransport.d.ts +27 -0
- package/dist/types/client/realtime/RealtimeClient.d.ts +573 -0
- package/dist/types/client/realtime/localEvents.d.ts +53 -0
- package/dist/types/client/realtime/notice.d.ts +70 -0
- package/dist/types/client/realtime/observe.d.ts +284 -0
- package/dist/types/client/roles/index.d.ts +15 -0
- package/dist/types/client/roles/registry.d.ts +72 -0
- package/dist/types/client/roles/roles.d.ts +68 -0
- package/dist/types/client/shim/cli-color.d.ts +2 -0
- package/dist/types/client/shim/events.d.ts +39 -0
- package/dist/types/client/shim/util.d.ts +14 -0
- package/dist/types/client/svelte/index.d.ts +216 -0
- package/dist/types/client/syslog/context.d.ts +76 -0
- package/dist/types/client/syslog/errors.d.ts +46 -0
- package/dist/types/client/syslog/uplink.d.ts +89 -0
- package/dist/types/client/transport/websocket.d.ts +5 -0
- package/dist/types/client/vue/index.d.ts +234 -0
- package/dist/types/colors.d.ts +32 -0
- package/dist/types/command/Builder.d.ts +47 -0
- package/dist/types/command/Command.d.ts +268 -0
- package/dist/types/config/configMeta.d.ts +53 -0
- package/dist/types/config/configProvenance.d.ts +58 -0
- package/dist/types/config/defaults.d.ts +33 -0
- package/dist/types/config/defineConfig.d.ts +70 -0
- package/dist/types/config/defineEnv.d.ts +170 -0
- package/dist/types/config/envExample.d.ts +23 -0
- package/dist/types/config/envOverride.d.ts +236 -0
- package/dist/types/config/index.d.ts +23 -0
- package/dist/types/config/infra.d.ts +171 -0
- package/dist/types/config/reactivity.d.ts +36 -0
- package/dist/types/config/reservedEnv.d.ts +145 -0
- package/dist/types/config/schema.d.ts +113 -0
- package/dist/types/config/types.d.ts +374 -0
- package/dist/types/config/use.d.ts +80 -0
- package/dist/types/finder/File.d.ts +26 -0
- package/dist/types/finder/FileResult.d.ts +14 -0
- package/dist/types/finder/Finder.d.ts +51 -0
- package/dist/types/finder/Result.d.ts +10 -0
- package/dist/types/index.d.ts +205 -0
- package/dist/types/kernel/BootConfigurationError.d.ts +50 -0
- package/dist/types/kernel/CliKernel.d.ts +289 -0
- package/dist/types/kernel/Kernel.d.ts +1255 -0
- package/dist/types/kernel/Module.d.ts +326 -0
- package/dist/types/kernel/adminPlane/adminCaller.d.ts +105 -0
- package/dist/types/kernel/adminPlane/adminRbac.d.ts +44 -0
- package/dist/types/kernel/adminPlane/catalog.d.ts +122 -0
- package/dist/types/kernel/adminPlane/executeAdmin.d.ts +99 -0
- package/dist/types/kernel/bootReport.d.ts +112 -0
- package/dist/types/kernel/checks/deep.d.ts +122 -0
- package/dist/types/kernel/checks/freshness.d.ts +49 -0
- package/dist/types/kernel/checks/gating.d.ts +134 -0
- package/dist/types/kernel/checks/guards.d.ts +57 -0
- package/dist/types/kernel/checks/lastBoot.d.ts +189 -0
- package/dist/types/kernel/checks/live.d.ts +110 -0
- package/dist/types/kernel/checks/packageDeps.d.ts +44 -0
- package/dist/types/kernel/checks/readiness.d.ts +97 -0
- package/dist/types/kernel/checks/renderReport.d.ts +107 -0
- package/dist/types/kernel/checks/report.d.ts +414 -0
- package/dist/types/kernel/checks/runDoctor.d.ts +361 -0
- package/dist/types/kernel/checks/surface.d.ts +148 -0
- package/dist/types/kernel/checks/walk.d.ts +45 -0
- package/dist/types/kernel/checks/wiring.d.ts +54 -0
- package/dist/types/kernel/commands/AiMcpCommand.d.ts +39 -0
- package/dist/types/kernel/commands/AiSyncCommand.d.ts +28 -0
- package/dist/types/kernel/commands/BuildCommand.d.ts +13 -0
- package/dist/types/kernel/commands/CardCommand.d.ts +34 -0
- package/dist/types/kernel/commands/ClusterCommand.d.ts +29 -0
- package/dist/types/kernel/commands/CompletionCommand.d.ts +17 -0
- package/dist/types/kernel/commands/CreateCommand.d.ts +16 -0
- package/dist/types/kernel/commands/DevCommand.d.ts +40 -0
- package/dist/types/kernel/commands/DoctorCommand.d.ts +55 -0
- package/dist/types/kernel/commands/EnvCommand.d.ts +35 -0
- package/dist/types/kernel/commands/GitHooksCommand.d.ts +27 -0
- package/dist/types/kernel/commands/InspectCommand.d.ts +59 -0
- package/dist/types/kernel/commands/InstallCommand.d.ts +7 -0
- package/dist/types/kernel/commands/MenuCommand.d.ts +58 -0
- package/dist/types/kernel/commands/OutdatedCommand.d.ts +47 -0
- package/dist/types/kernel/commands/ProdCommand.d.ts +29 -0
- package/dist/types/kernel/commands/StatusCommand.d.ts +17 -0
- package/dist/types/kernel/commands/StopCommand.d.ts +17 -0
- package/dist/types/kernel/commands/SymbolsCommand.d.ts +29 -0
- package/dist/types/kernel/commands/runtimeLauncher.d.ts +76 -0
- package/dist/types/kernel/decorators/kernelDecorator.d.ts +76 -0
- package/dist/types/kernel/injector/injector.d.ts +47 -0
- package/dist/types/kernel/injector/serviceOrder.d.ts +29 -0
- package/dist/types/kernel/inspect/adminSubjects.d.ts +169 -0
- package/dist/types/kernel/inspect/docOutline.d.ts +53 -0
- package/dist/types/kernel/lifecycleTags.d.ts +79 -0
- package/dist/types/kernel/moduleConfig.d.ts +35 -0
- package/dist/types/kernel/moduleGating.d.ts +78 -0
- package/dist/types/kernel/readinessRegistry.d.ts +104 -0
- package/dist/types/kernel/resolveModuleEntry.d.ts +46 -0
- package/dist/types/mcp/caller.d.ts +55 -0
- package/dist/types/mcp/guard.d.ts +66 -0
- package/dist/types/mcp/protocol.d.ts +163 -0
- package/dist/types/mcp/server.d.ts +70 -0
- package/dist/types/mcp/tools.d.ts +209 -0
- package/dist/types/oauth/authorizationServer.d.ts +204 -0
- package/dist/types/oauth/protectedResource.d.ts +339 -0
- package/dist/types/realtime/IRealtimeSocket.d.ts +142 -0
- package/dist/types/realtime/IRealtimeTransport.d.ts +50 -0
- package/dist/types/realtime/JsonRpcPeer.d.ts +251 -0
- package/dist/types/realtime/RealtimeEventMap.d.ts +269 -0
- package/dist/types/realtime/channelRate.d.ts +55 -0
- package/dist/types/realtime/platformChannels.d.ts +147 -0
- package/dist/types/runtime/GcScheduler.d.ts +96 -0
- package/dist/types/runtime/RequestContext.d.ts +152 -0
- package/dist/types/runtime/bearer.d.ts +88 -0
- package/dist/types/runtime/engineEnvironment.d.ts +115 -0
- package/dist/types/runtime/loadEnv.d.ts +86 -0
- package/dist/types/runtime/pageFacets.d.ts +104 -0
- package/dist/types/runtime/pageFilters.d.ts +139 -0
- package/dist/types/runtime/pageGuard.d.ts +78 -0
- package/dist/types/runtime/pageQuery.d.ts +138 -0
- package/dist/types/runtime/pageSort.d.ts +86 -0
- package/dist/types/runtime/redact.d.ts +27 -0
- package/dist/types/runtime/withTimeout.d.ts +51 -0
- package/dist/types/service/cluster/ClusterManager.d.ts +112 -0
- package/dist/types/service/cluster/ClusterProbeAggregator.d.ts +68 -0
- package/dist/types/service/cluster/ClusterRelay.d.ts +57 -0
- package/dist/types/service/cluster/clusterMaster.d.ts +40 -0
- package/dist/types/service/cluster/clusterMessage.d.ts +94 -0
- package/dist/types/service/cluster/cpuQuota.d.ts +37 -0
- package/dist/types/service/cluster/instanceProbe.d.ts +82 -0
- package/dist/types/service/cluster/podEnvironment.d.ts +35 -0
- package/dist/types/service/cluster/processProbe.d.ts +53 -0
- package/dist/types/service/cluster/richProcessProbe.d.ts +77 -0
- package/dist/types/service/cluster/topology.d.ts +64 -0
- package/dist/types/service/dev/BootReporter.d.ts +67 -0
- package/dist/types/service/dev/DevSupervisor.d.ts +117 -0
- package/dist/types/service/dev/bootVerdict.d.ts +99 -0
- package/dist/types/service/dev/detachedStart.d.ts +164 -0
- package/dist/types/service/dev/devProcess.d.ts +638 -0
- package/dist/types/service/dev/devProjects.d.ts +121 -0
- package/dist/types/service/dev/devStatusReport.d.ts +141 -0
- package/dist/types/service/dev/devStop.d.ts +57 -0
- package/dist/types/service/fetchService.d.ts +29 -0
- package/dist/types/service/gitService.d.ts +24 -0
- package/dist/types/syslog/Pdu.d.ts +134 -0
- package/dist/types/syslog/Syslog.d.ts +482 -0
- package/dist/types/syslog/drivers/ClusterFileLogDriver.d.ts +40 -0
- package/dist/types/syslog/drivers/FileLogDriver.d.ts +55 -0
- package/dist/types/syslog/drivers/ILogDriver.d.ts +177 -0
- package/dist/types/syslog/drivers/LokiLogDriver.d.ts +44 -0
- package/dist/types/syslog/drivers/MemoryLogDriver.d.ts +20 -0
- package/dist/types/syslog/drivers/OpenSearchLogDriver.d.ts +40 -0
- package/dist/types/syslog/drivers/builtinLogDrivers.d.ts +43 -0
- package/dist/types/syslog/drivers/filterPdus.d.ts +21 -0
- package/dist/types/syslog/drivers/logDriverRegistry.d.ts +100 -0
- package/dist/types/syslog/drivers/opensearchShared.d.ts +11 -0
- package/dist/types/syslog/drivers/pduFlow.d.ts +53 -0
- package/dist/types/syslog/drivers/pduProtocol.d.ts +20 -0
- package/dist/types/syslog/httpFetch.d.ts +48 -0
- package/dist/types/syslog/logColor.d.ts +59 -0
- package/dist/types/syslog/sinks/FileSink.d.ts +78 -0
- package/dist/types/syslog/transports/BatchingHttpTransport.d.ts +59 -0
- package/dist/types/syslog/transports/ConsoleTransport.d.ts +8 -0
- package/dist/types/syslog/transports/FileTransport.d.ts +13 -0
- package/dist/types/syslog/transports/HttpTransport.d.ts +15 -0
- package/dist/types/syslog/transports/LokiTransport.d.ts +45 -0
- package/dist/types/syslog/transports/OpenSearchTransport.d.ts +40 -0
- package/dist/types/syslog/transports/SyslogTransport.d.ts +9 -0
- package/dist/types/syslog/transports/index.d.ts +12 -0
- package/dist/types/testing/index.d.ts +197 -0
- package/dist/types/types/IAdminApi.d.ts +246 -0
- package/dist/types/types/ICliKernel.d.ts +28 -0
- package/dist/types/types/ICommand.d.ts +14 -0
- package/dist/types/types/IContainer.d.ts +35 -0
- package/dist/types/types/IIdempotencyStore.d.ts +159 -0
- package/dist/types/types/IKernel.d.ts +138 -0
- package/dist/types/types/IMcpTool.d.ts +157 -0
- package/dist/types/types/IModule.d.ts +73 -0
- package/dist/types/types/IModuleManifest.d.ts +49 -0
- package/dist/types/types/IPage.d.ts +119 -0
- package/dist/types/types/IService.d.ts +62 -0
- package/dist/types/types/ISyslog.d.ts +58 -0
- package/dist/types/types/ITransport.d.ts +5 -0
- package/dist/types/types/globals.d.ts +47 -0
- package/docs/angular-services.md +318 -0
- package/docs/catalogue.md +184 -0
- package/docs/cli.md +369 -0
- package/docs/client.md +616 -0
- package/docs/debugbar.md +218 -0
- package/docs/environnement.md +308 -0
- package/docs/index.md +388 -0
- package/docs/kernel.md +670 -0
- package/docs/progression.md +228 -0
- package/docs/react-hooks.md +686 -0
- package/docs/request-context.md +507 -0
- package/docs/service.md +590 -0
- package/docs/svelte-reactivite.md +293 -0
- package/docs/syslog.md +848 -0
- package/docs/testing.md +203 -0
- package/docs/vue-composables.md +255 -0
- package/man/nodefony.1 +152 -0
- package/package.json +163 -83
- package/templates/app/agents/AGENTS.md.tpl +967 -0
- package/templates/app/agents/POINTEUR.md.tpl +12 -0
- package/templates/app/base/Dockerfile.tpl +104 -0
- package/templates/app/base/README.md.tpl +314 -0
- package/templates/app/base/dockerignore.tpl +28 -0
- package/templates/app/base/env.ts.tpl +130 -0
- package/templates/app/base/gitattributes.tpl +28 -0
- package/templates/app/base/github/workflows/ci.yml.tpl +91 -0
- package/templates/app/base/gitignore.tpl +46 -0
- package/templates/app/base/gitlab-ci.yml.tpl +42 -0
- package/templates/app/base/index.ts.tpl +69 -0
- package/templates/app/base/nodefony.config.ts.tpl +342 -0
- package/templates/app/base/oxlintrc.json.tpl +127 -0
- package/templates/app/base/package.json.tpl +75 -0
- package/templates/app/base/prettierignore.tpl +24 -0
- package/templates/app/base/prettierrc.json.tpl +12 -0
- package/templates/app/base/rolldown.config.ts.tpl +8 -0
- package/templates/app/base/tests/config.test.ts.tpl +29 -0
- package/templates/app/base/tests/e2e.setup.ts.tpl +181 -0
- package/templates/app/base/tests/e2e.test.ts.tpl +105 -0
- package/templates/app/base/tests/migrations.e2e.test.ts.tpl +579 -0
- package/templates/app/base/tsconfig.json.tpl +47 -0
- package/templates/app/base/vitest.config.ts.tpl +88 -0
- package/templates/app/base/vitest.e2e.config.ts.tpl +39 -0
- package/templates/app/complete/compose.yaml.tpl +328 -0
- package/templates/app/complete/deploy/migrate-job.yaml.tpl +100 -0
- package/templates/app/complete/docker/db/init-nodefony-e2e.sql.tpl +30 -0
- package/templates/app/complete/docker/grafana/provisioning/datasources/loki.yaml.tpl +15 -0
- package/templates/app/complete/env.local.tpl +11 -0
- package/templates/app/complete/env.tpl +53 -0
- package/templates/app/complete/nodefony/entity/User.ts.tpl +69 -0
- package/templates/app/complete/nodefony/security/provisionUsers.ts.tpl +124 -0
- package/templates/app/complete/nodefony/service/AppBannerService.ts.tpl +98 -0
- package/templates/app/complete/nodefony/service/AppInfoService.ts.tpl +85 -0
- package/templates/app/frontend/angular/frontend/src/accent.css.tpl +34 -0
- package/templates/app/frontend/angular/frontend/src/app/app.component.ts.tpl +400 -0
- package/templates/app/frontend/react/frontend/src/App.tsx.tpl +421 -0
- package/templates/app/frontend/react/frontend/src/accent.css.tpl +30 -0
- package/templates/app/frontend/shared/frontend/src/brand.ts.tpl +3 -0
- package/templates/app/frontend/shared/frontend/src/showcase.css.tpl +224 -0
- package/templates/app/frontend/shared/nodefony/controllers/AppController.ts.tpl +45 -0
- package/templates/app/frontend/svelte/frontend/src/App.svelte.tpl +371 -0
- package/templates/app/frontend/svelte/frontend/src/accent.css.tpl +34 -0
- package/templates/app/frontend/vue/frontend/src/App.vue.tpl +367 -0
- package/templates/app/frontend/vue/frontend/src/accent.css.tpl +34 -0
- package/templates/app/home/nodefony/controllers/HomeController.ts.tpl +38 -0
- package/templates/command/nodefony/command/__NAME__.ts.tpl +132 -0
- package/templates/controller/duplex/nodefony/controllers/__NAME__.ts.tpl +188 -0
- package/templates/controller/example/nodefony/controllers/__NAME__.ts.tpl +348 -0
- package/templates/controller/hello/nodefony/controllers/__NAME__.ts.tpl +143 -0
- package/templates/controller/realtime/nodefony/controllers/__NAME__.ts.tpl +153 -0
- package/templates/controller/realtime/tests/__KEBAB__-realtime.test.ts.tpl +79 -0
- package/templates/controller/rest/nodefony/controllers/__NAME__.ts.tpl +159 -0
- package/templates/entity/base/nodefony/entity/__PASCAL__.schema.ts.tpl +31 -0
- package/templates/entity/base/nodefony/entity/__PASCAL__.ts.tpl +68 -0
- package/templates/entity/controller/nodefony/controllers/__PASCAL__Controller.ts.tpl +335 -0
- package/templates/entity/service/nodefony/service/__PASCAL__Service.ts.tpl +126 -0
- package/templates/entity/tests/tests/__KEBAB__.e2e.test.ts.tpl +358 -0
- package/templates/entity/tests/tests/__KEBAB__.test.ts.tpl +87 -0
- package/templates/front/angular/frontend/src/app/app.component.ts.tpl +30 -0
- package/templates/front/base/nodefony/controllers/__NAME__.ts.tpl +60 -0
- package/templates/front/react/frontend/src/App.tsx.tpl +26 -0
- package/templates/front/svelte/frontend/src/App.svelte.tpl +19 -0
- package/templates/front/vue/frontend/src/App.vue.tpl +23 -0
- package/templates/module/ai/AGENTS.md.tpl +71 -0
- package/templates/module/base/README.md.tpl +62 -0
- package/templates/module/base/docs/index.md.tpl +55 -0
- package/templates/module/base/index.ts.tpl +50 -0
- package/templates/module/base/nodefony/config/config.ts.tpl +60 -0
- package/templates/module/base/nodefony/config/defineModuleConfig.ts.tpl +55 -0
- package/templates/module/base/nodefony/src/errors/__PASCAL__Error.ts.tpl +20 -0
- package/templates/module/base/package.json.tpl +53 -0
- package/templates/module/base/rolldown.config.ts.tpl +14 -0
- package/templates/module/base/tests/__KEBAB__.test.ts.tpl +39 -0
- package/templates/module/base/tsconfig.json.tpl +42 -0
- package/templates/module/base/vitest.config.ts.tpl +27 -0
- package/templates/module/packages/CLAUDE.md.tpl +51 -0
- package/templates/module/packages/MEMORY.md.tpl +39 -0
- package/templates/module/packages/tsconfig.declarations.json.tpl +19 -0
- package/templates/module/packages/tsconfig.tests.json.tpl +11 -0
- package/templates/module/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +14 -0
- package/templates/module/service/nodefony/interfaces/index.ts.tpl +1 -0
- package/templates/module/service/nodefony/service/__PASCAL__Service.ts.tpl +116 -0
- package/templates/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +19 -0
- package/templates/service/nodefony/service/__PASCAL__Service.ts.tpl +136 -0
- package/templates/service/tests/__PASCAL__Service.test.ts.tpl +53 -0
- package/templates/shared/front-entry/angular/frontend/src/main.ts.tpl +17 -0
- package/templates/shared/front-entry/react/frontend/src/main.tsx.tpl +11 -0
- package/templates/shared/front-entry/svelte/frontend/src/main.ts.tpl +13 -0
- package/templates/shared/front-entry/vue/frontend/src/main.ts.tpl +12 -0
- package/templates/shared/front-registrar/nodefony/frontend/register__PASCAL__Entry.ts.tpl +40 -0
- package/templates/shared/front-shell/frontend/index.html.tpl +39 -0
- package/templates/shared/ng-app-tsconfig/frontend/tsconfig.app.json.tpl +18 -0
- package/templates/shared/svelte-shim/frontend/src/env.d.ts.tpl +12 -0
- package/templates/shared/vue-shim/frontend/src/env.d.ts.tpl +15 -0
- package/.yarnclean +0 -45
- package/CHANGELOG.md +0 -406
- package/autoloader.es6 +0 -253
- package/builder.es6 +0 -366
- package/cli/builder/bundles/bundle.js +0 -328
- package/cli/builder/bundles/controller.js +0 -73
- package/cli/builder/bundles/users-bundle/.yarnclean +0 -45
- package/cli/builder/bundles/users-bundle/Command/fixtureTask.js +0 -47
- package/cli/builder/bundles/users-bundle/Command/usersCommand.js +0 -105
- package/cli/builder/bundles/users-bundle/Entity/mongoose/userEntity.js +0 -168
- package/cli/builder/bundles/users-bundle/Entity/sequelize/userEntity.js +0 -231
- package/cli/builder/bundles/users-bundle/Fixtures/users.js +0 -117
- package/cli/builder/bundles/users-bundle/Fixtures/usersFixtures.js +0 -114
- package/cli/builder/bundles/users-bundle/Resources/config/config.js +0 -90
- package/cli/builder/bundles/users-bundle/Resources/config/routing.js +0 -17
- package/cli/builder/bundles/users-bundle/Resources/config/security.js +0 -96
- package/cli/builder/bundles/users-bundle/Resources/config/services.js +0 -7
- package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.dev.config.js +0 -13
- package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.prod.config.js +0 -31
- package/cli/builder/bundles/users-bundle/Resources/config/webpack.config.js +0 -146
- package/cli/builder/bundles/users-bundle/Resources/js/users.js +0 -153
- package/cli/builder/bundles/users-bundle/Resources/public/favicon.ico +0 -0
- package/cli/builder/bundles/users-bundle/Resources/public/images/users-logo.png +0 -0
- package/cli/builder/bundles/users-bundle/Resources/scss/awesome/font-awesome.config.js +0 -11
- package/cli/builder/bundles/users-bundle/Resources/scss/custom.scss +0 -23
- package/cli/builder/bundles/users-bundle/Resources/scss/users.scss +0 -59
- package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/login.js +0 -235
- package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/users.js +0 -232
- package/cli/builder/bundles/users-bundle/Resources/translations/login.en_en.yml +0 -14
- package/cli/builder/bundles/users-bundle/Resources/translations/login.fr_fr.yml +0 -14
- package/cli/builder/bundles/users-bundle/Resources/translations/users.en_en.yml +0 -35
- package/cli/builder/bundles/users-bundle/Resources/translations/users.fr_fr.yml +0 -36
- package/cli/builder/bundles/users-bundle/Resources/views/base.html.twig +0 -32
- package/cli/builder/bundles/users-bundle/Resources/views/footer.html.twig +0 -7
- package/cli/builder/bundles/users-bundle/Resources/views/header.html.twig +0 -90
- package/cli/builder/bundles/users-bundle/Resources/views/login/login.html.twig +0 -43
- package/cli/builder/bundles/users-bundle/Resources/views/users/createUser.html.twig +0 -296
- package/cli/builder/bundles/users-bundle/Resources/views/users/readUsers.html.twig +0 -94
- package/cli/builder/bundles/users-bundle/controller/api/graphql/graphqlController.js +0 -56
- package/cli/builder/bundles/users-bundle/controller/api/graphql/userResolver.js +0 -121
- package/cli/builder/bundles/users-bundle/controller/api/graphql/usertype.js +0 -58
- package/cli/builder/bundles/users-bundle/controller/api/openapi/loginApiController.js +0 -210
- package/cli/builder/bundles/users-bundle/controller/api/openapi/restUserController.js +0 -244
- package/cli/builder/bundles/users-bundle/controller/loginController.js +0 -91
- package/cli/builder/bundles/users-bundle/controller/usersController.js +0 -332
- package/cli/builder/bundles/users-bundle/package.json +0 -58
- package/cli/builder/bundles/users-bundle/readme.md +0 -360
- package/cli/builder/bundles/users-bundle/services/usersService.js +0 -411
- package/cli/builder/bundles/users-bundle/src/providers/mongoose/userProvider.js +0 -47
- package/cli/builder/bundles/users-bundle/src/providers/sequelize/userProvider.js +0 -48
- package/cli/builder/bundles/users-bundle/tests/loginTest.js +0 -182
- package/cli/builder/bundles/users-bundle/usersBundle.js +0 -26
- package/cli/builder/microService/microService.js +0 -261
- package/cli/builder/microService/skeletons/.editorconfig +0 -18
- package/cli/builder/microService/skeletons/.env-cmdrc.js +0 -32
- package/cli/builder/microService/skeletons/.jshintrc +0 -37
- package/cli/builder/microService/skeletons/README.md +0 -117
- package/cli/builder/microService/skeletons/bin/bash/hello.sh +0 -5
- package/cli/builder/microService/skeletons/bin/cli +0 -13
- package/cli/builder/microService/skeletons/bin/python/hello.py +0 -20
- package/cli/builder/microService/skeletons/config/config.js +0 -29
- package/cli/builder/microService/skeletons/config/pm2.config.js +0 -72
- package/cli/builder/microService/skeletons/config/webpack/webpack.config.dev.js +0 -8
- package/cli/builder/microService/skeletons/config/webpack/webpack.config.prod.js +0 -25
- package/cli/builder/microService/skeletons/config/webpack.config.js +0 -114
- package/cli/builder/microService/skeletons/package.json +0 -76
- package/cli/builder/microService/skeletons/src/browser/index.css +0 -3
- package/cli/builder/microService/skeletons/src/browser/index.js +0 -16
- package/cli/builder/microService/skeletons/src/browser/socketio.js +0 -46
- package/cli/builder/microService/skeletons/src/cli/cli.js +0 -224
- package/cli/builder/microService/skeletons/src/cli/menu.js +0 -28
- package/cli/builder/microService/skeletons/src/n-api/README.md +0 -1
- package/cli/builder/microService/skeletons/src/n-api/binding.gyp +0 -14
- package/cli/builder/microService/skeletons/src/n-api/hello.cc +0 -14
- package/cli/builder/microService/skeletons/src/n-api/hello.js +0 -23
- package/cli/builder/microService/skeletons/src/n-api/package.json +0 -15
- package/cli/builder/microService/skeletons/src/node/examples/index.js +0 -120
- package/cli/builder/microService/skeletons/src/node/index.js +0 -102
- package/cli/builder/microService/skeletons/src/node/services/markdown/markdown.js +0 -27
- package/cli/builder/microService/skeletons/src/node/services/servers/http.js +0 -45
- package/cli/builder/microService/skeletons/src/node/services/servers/https.js +0 -44
- package/cli/builder/microService/skeletons/src/node/services/socketio/socketio.js +0 -46
- package/cli/builder/microService/skeletons/src/node/services/syscall/syscall.js +0 -111
- package/cli/builder/microService/skeletons/src/node/services/worker/thread.js +0 -59
- package/cli/builder/microService/skeletons/src/node/services/worker/worker.js +0 -60
- package/cli/builder/microService/skeletons/src/templates/base.html +0 -12
- package/cli/builder/microService/skeletons/src/templates/socket.html +0 -23
- package/cli/builder/microService/skeletons/tests/unit/serviceTest.js +0 -30
- package/cli/builder/project/project.js +0 -474
- package/cli/builder/project/skeletons/README.md +0 -778
- package/cli/builder/project/skeletons/bin/dev-deploy.sh +0 -5
- package/cli/builder/project/skeletons/bin/generateCertificates.sh.skeleton +0 -180
- package/cli/builder/project/skeletons/bin/prod-deploy.sh +0 -3
- package/cli/builder/project/skeletons/config/config.js.skeleton +0 -178
- package/cli/builder/project/skeletons/config/openssl/ca/openssl.cnf.skeleton +0 -150
- package/cli/builder/project/skeletons/config/openssl/ca_intermediate/openssl.cnf.skeleton +0 -152
- package/cli/builder/project/skeletons/config/pm2.config.js.skeleton +0 -62
- package/cli/builder/project/skeletons/documentation.html.twig +0 -24
- package/cli/builder/project/skeletons/editorconfig.skeleton +0 -18
- package/cli/builder/project/skeletons/eslintignore.skeleton +0 -15
- package/cli/builder/project/skeletons/eslintrc.js.skeleton +0 -97
- package/cli/builder/project/skeletons/gitignore.skeleton +0 -32
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.37.entity-user.js +0 -137
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.38.entity-session.js +0 -97
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.39.entity-requests.js +0 -115
- package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.40.entity-jwts.js +0 -97
- package/cli/builder/project/skeletons/migrations/migrations.skeleton.js +0 -101
- package/cli/builder/project/skeletons/package.json.twig +0 -71
- package/cli/builder/react/reactBuilder.js +0 -224
- package/cli/builder/react/skeletons/app/Resources/databases/nodefony.db +0 -0
- package/cli/builder/react/skeletons/app/Resources/translations/messages.en_en.yml +0 -5
- package/cli/builder/react/skeletons/app/Resources/translations/messages.fr_fr.yml +0 -5
- package/cli/builder/react/skeletons/app/Resources/views/base.html.twig +0 -33
- package/cli/builder/react/skeletons/app/config/config.js +0 -392
- package/cli/builder/react/skeletons/app/config/routing.js +0 -10
- package/cli/builder/react/skeletons/app/config/security.js +0 -74
- package/cli/builder/react/skeletons/app/controller/appController.js +0 -22
- package/cli/builder/sandbox/sandBoxBuilder.js +0 -610
- package/cli/builder/sandbox/skeletons/Resources/css/entry.css +0 -48
- package/cli/builder/sandbox/skeletons/Resources/js/entry.js +0 -60
- package/cli/builder/sandbox/skeletons/Resources/public/manifest.json +0 -32
- package/cli/builder/sandbox/skeletons/Resources/translations/messages.en_en.yml +0 -5
- package/cli/builder/sandbox/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
- package/cli/builder/sandbox/skeletons/Resources/views/base.html.twig +0 -46
- package/cli/builder/sandbox/skeletons/Resources/views/index.html.twig +0 -34
- package/cli/builder/sandbox/skeletons/bootstrap/custom.scss +0 -27
- package/cli/builder/sandbox/skeletons/bootstrap/entry.scss +0 -60
- package/cli/builder/sandbox/skeletons/workbox/templates/index.html.twig +0 -32
- package/cli/builder/sandbox/skeletons/workbox/workers/service-worker.js +0 -196
- package/cli/builder/skeletons/Resources/public/favicon.ico +0 -0
- package/cli/builder/skeletons/Resources/public/images/app-logo.png +0 -0
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.json.twig +0 -24
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.json.twig +0 -20
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.json.twig +0 -20
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/500.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/base.html.twig +0 -30
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.json.twig +0 -24
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/footer.html.twig +0 -33
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/header.html.twig +0 -6
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.html.twig +0 -6
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.json.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.html.twig +0 -125
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.json.twig +0 -5
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.html.twig +0 -1
- package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.json.twig +0 -24
- package/cli/builder/skeletons/app/appKernel.js +0 -133
- package/cli/builder/skeletons/binding/binding.cc +0 -26
- package/cli/builder/skeletons/binding/binding.skeleton +0 -8
- package/cli/builder/skeletons/bundle/bundleClass.js +0 -37
- package/cli/builder/skeletons/command/commandClass.js +0 -11
- package/cli/builder/skeletons/command/taskClass.js +0 -20
- package/cli/builder/skeletons/config/config.js +0 -138
- package/cli/builder/skeletons/config/nodefony/elastic-bundle.js +0 -37
- package/cli/builder/skeletons/config/nodefony/framework-bundle.js +0 -22
- package/cli/builder/skeletons/config/nodefony/http-bundle.js +0 -104
- package/cli/builder/skeletons/config/nodefony/mail-bundle.js +0 -44
- package/cli/builder/skeletons/config/nodefony/mongoose-bundle.js +0 -51
- package/cli/builder/skeletons/config/nodefony/monitoring-bundle.js +0 -34
- package/cli/builder/skeletons/config/nodefony/realtime-bundle.js +0 -15
- package/cli/builder/skeletons/config/nodefony/redis-bundle.js +0 -44
- package/cli/builder/skeletons/config/nodefony/security-bundle.js +0 -25
- package/cli/builder/skeletons/config/nodefony/sequelize-bundle.js +0 -156
- package/cli/builder/skeletons/config/routing.js +0 -55
- package/cli/builder/skeletons/config/security.js +0 -102
- package/cli/builder/skeletons/config/services.js +0 -1
- package/cli/builder/skeletons/config/webpack/webpack.dev.config.js +0 -13
- package/cli/builder/skeletons/config/webpack/webpack.prod.config.js +0 -20
- package/cli/builder/skeletons/config/webpack.config.js +0 -148
- package/cli/builder/skeletons/controller/controllerClass.js +0 -75
- package/cli/builder/skeletons/package.json.twig +0 -57
- package/cli/builder/skeletons/unittest/testFile.js +0 -46
- package/cli/builder/vue/skeletons/Resources/public/images/app-logo.png +0 -0
- package/cli/builder/vue/skeletons/Resources/translations/messages.en_en.yml +0 -5
- package/cli/builder/vue/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
- package/cli/builder/vue/skeletons/vue.config.js +0 -129
- package/cli/builder/vue/vueBuilder.js +0 -410
- package/cli/generate/generate.es6 +0 -103
- package/cli/install/install.js +0 -190
- package/cli/sequelize/sequelize.js +0 -94
- package/cli/start.js +0 -702
- package/cli/tools/pm2.es6 +0 -112
- package/cli/tools/tools.es6 +0 -97
- package/cli.es6 +0 -925
- package/container.es6 +0 -272
- package/error.es6 +0 -293
- package/fileClass.es6 +0 -242
- package/finder/file.es6 +0 -33
- package/finder/fileResult.es6 +0 -138
- package/finder/finder2.es6 +0 -275
- package/finder.es6 +0 -427
- package/kernel/annotations/annotations.es6 +0 -286
- package/kernel/api/api.es6 +0 -61
- package/kernel/api/graphqlApi.es6 +0 -107
- package/kernel/api/jsonApi.es6 +0 -177
- package/kernel/api/openApi.es6 +0 -139
- package/kernel/api/schemas/openApiSchema.js +0 -394
- package/kernel/babylon.es6 +0 -162
- package/kernel/bundle.es6 +0 -1200
- package/kernel/cliKernel.es6 +0 -869
- package/kernel/command.es6 +0 -78
- package/kernel/commands/nodefonyCommand.es6 +0 -247
- package/kernel/commands/tasks/bundlesTask.es6 +0 -59
- package/kernel/controllers/controller.es6 +0 -791
- package/kernel/fixture.es6 +0 -19
- package/kernel/injections/injections.es6 +0 -424
- package/kernel/kernel.es6 +0 -1960
- package/kernel/kernelWatcher.es6 +0 -387
- package/kernel/orm/entity.es6 +0 -59
- package/kernel/orm/orm.es6 +0 -139
- package/kernel/reader.es6 +0 -290
- package/kernel/security/encoder.es6 +0 -17
- package/kernel/security/factories/factory.es6 +0 -111
- package/kernel/security/factories/passeportFactory.es6 +0 -61
- package/kernel/security/provider.es6 +0 -58
- package/kernel/security/providers/chainProvider.es6 +0 -99
- package/kernel/security/providers/memoryProvider.es6 +0 -55
- package/kernel/security/providers/providerManager.es6 +0 -67
- package/kernel/security/providers/userEntityProvider.es6 +0 -50
- package/kernel/security/role.es6 +0 -12
- package/kernel/security/secureArea.es6 +0 -431
- package/kernel/security/tokens/token.es6 +0 -171
- package/kernel/security/user.es6 +0 -106
- package/kernel/serviceRealTime.es6 +0 -21
- package/kernel/services/connectionsService.es6 +0 -93
- package/kernel/services/cron/cronService.es6 +0 -123
- package/kernel/task.es6 +0 -80
- package/kernel/templates.es6 +0 -22
- package/kernel/templating/twig.es6 +0 -218
- package/kernel/tests/cliTest.js +0 -59
- package/kernel/tests/containerTest.js +0 -232
- package/kernel/tests/kernelTest.js +0 -39
- package/nodefony.es6 +0 -1084
- package/notificationsCenter.es6 +0 -118
- package/protocol.es6 +0 -86
- package/protocols/bayeux.es6 +0 -174
- package/protocols/jsonRpc/jsonrpc.es6 +0 -56
- package/result.es6 +0 -99
- package/service.es6 +0 -288
- package/syslog/pdu.es6 +0 -141
- package/syslog/syslog.es6 +0 -754
- package/watcher.es6 +0 -113
package/docs/syslog.md
ADDED
|
@@ -0,0 +1,848 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Journalisation (Syslog)"
|
|
3
|
+
lang: fr
|
|
4
|
+
module: "@nodefony/core"
|
|
5
|
+
topic: syslog
|
|
6
|
+
coverageModule: nodefony-core
|
|
7
|
+
coveragePackage: "nodefony (cœur)"
|
|
8
|
+
coverageFiles: "syslog/Syslog.ts,syslog/Pdu.ts"
|
|
9
|
+
section: "Architecture"
|
|
10
|
+
audience: [developer, devops]
|
|
11
|
+
tags:
|
|
12
|
+
[
|
|
13
|
+
log,
|
|
14
|
+
syslog,
|
|
15
|
+
rfc5424,
|
|
16
|
+
pdu,
|
|
17
|
+
backplane,
|
|
18
|
+
driver,
|
|
19
|
+
transport,
|
|
20
|
+
observabilite,
|
|
21
|
+
redaction,
|
|
22
|
+
performance,
|
|
23
|
+
]
|
|
24
|
+
version: "doc"
|
|
25
|
+
status: stable
|
|
26
|
+
updated: 2026-07-19
|
|
27
|
+
source: "src/nodefony/docs/syslog.md"
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
# Journalisation (Syslog)
|
|
31
|
+
|
|
32
|
+
> Tout ce que Nodefony écrit — boot, requête, erreur, ligne de ton code — passe par **un seul hub**,
|
|
33
|
+
> `Syslog`. Il fabrique une unité structurée (`Pdu`, RFC 5424), la range dans un tampon circulaire
|
|
34
|
+
> O(1), la diffuse à N destinations d'écriture, et la rend **relisable et filtrable** par un driver
|
|
35
|
+
> de requête. Trois axes indépendants : où ça s'écrit, où ça se relit, ce qui part en direct.
|
|
36
|
+
> Ancré sur `src/nodefony/src/syslog/`.
|
|
37
|
+
|
|
38
|
+
📍 [Documentation](../../../docs/index.md) › [@nodefony/core](index.md) › **Journalisation (Syslog)**
|
|
39
|
+
|
|
40
|
+
## 🧠 Le modèle mental — un log, trois axes
|
|
41
|
+
|
|
42
|
+
Un logger naïf a une seule question : « où j'écris ? ». Un serveur en a **trois**, et les confondre
|
|
43
|
+
est la source de la moitié des malentendus sur les logs :
|
|
44
|
+
|
|
45
|
+
1. **ÉCRIRE** — la ligne de texte part quelque part (terminal, fichier, nulle part).
|
|
46
|
+
2. **RELIRE** — plus tard, un humain cherche « toutes les ERROR de la requête `abc` ».
|
|
47
|
+
3. **DIFFUSER** — un écran de supervision veut les lignes **maintenant**, en direct.
|
|
48
|
+
|
|
49
|
+
Nodefony les traite comme trois axes **orthogonaux** : on peut écrire sur `stdout`, relire depuis
|
|
50
|
+
Loki, et diffuser vers Studio — les trois réglages ne se contraignent pas.
|
|
51
|
+
|
|
52
|
+
```mermaid
|
|
53
|
+
flowchart LR
|
|
54
|
+
Src["service.log(…)"] --> G{"gate de sévérité<br/>+ debug ciblé + rateLimit"}
|
|
55
|
+
G -->|sous le seuil| DROP["rien créé<br/>0 Pdu · 0 allocation"]
|
|
56
|
+
G -->|passe| P["Pdu<br/>unité RFC 5424"]
|
|
57
|
+
P --> R["ring buffer<br/>CircularBuffer O(1)"]
|
|
58
|
+
P --> OL["fire « onLog »"]
|
|
59
|
+
P --> T["transports<br/>fan-out : console · file · loki · opensearch"]
|
|
60
|
+
OL --> W["coalescing<br/>1 write par tick, cap 64 Kio"]
|
|
61
|
+
W --> SK["sink<br/>stdout · file · null"]
|
|
62
|
+
R -.->|axe RELECTURE| Q["driver queryable<br/>memory · file · cluster-file · loki · opensearch"]
|
|
63
|
+
OL -.->|axe DIFFUSION| ST["bus « nodefony:syslog »<br/>écran Logs de Studio"]
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Trois idées à retenir avant tout le reste :
|
|
67
|
+
|
|
68
|
+
- **Rien n'est alloué sous le seuil.** La gate de sévérité coupe **avant** la création du `Pdu` : un
|
|
69
|
+
`log(…, "DEBUG")` en production ne coûte qu'un test d'entier.
|
|
70
|
+
- **Écriture = fan-out, relecture = un seul driver.** Une ligne peut partir vers 3 transports à la
|
|
71
|
+
fois ; on ne relit que dans **une** destination à la fois (celle qui est active).
|
|
72
|
+
- **Le ring buffer n'est pas un fichier.** C'est une fenêtre glissante en RAM (100 entrées par
|
|
73
|
+
défaut) — parfaite pour « qu'est-ce qui vient de se passer », inutile pour « la semaine dernière ».
|
|
74
|
+
|
|
75
|
+
## 📖 Lexique
|
|
76
|
+
|
|
77
|
+
| Terme | Sens |
|
|
78
|
+
| --------------------- | ---------------------------------------------------------------------------------------------------- |
|
|
79
|
+
| **PDU** | _Protocol Data Unit_ : une entrée de log structurée (`Pdu`) — payload + sévérité + horodatage + IDs. |
|
|
80
|
+
| **Sévérité RFC 5424** | Niveau normalisé de 0 (`EMERGENCY`) à 7 (`DEBUG`). Plus le chiffre est petit, plus c'est grave. |
|
|
81
|
+
| **msgid** | Catégorie du message (RFC 5424 `MSGID`) — vaut par défaut le **nom du service** émetteur. |
|
|
82
|
+
| **procid** | Le PID du process émetteur (champ `pid`) — sert à grouper par worker en cluster. |
|
|
83
|
+
| **requestId** | Identifiant de la requête en cours, capté depuis l'ALS — corrèle toutes les lignes d'un appel. |
|
|
84
|
+
| **Ring buffer** | Tampon circulaire de taille fixe, push et éviction en O(1) (jamais de `Array.shift()` O(n)). |
|
|
85
|
+
| **Coalescing** | Regrouper les écritures d'un même tick d'event-loop en **un seul** appel système `write()`. |
|
|
86
|
+
| **Sink** | Cible finale de la **ligne de texte**, après coalescing : `stdout`, un fichier, ou rien. |
|
|
87
|
+
| **Transport** | Destination d'un **Pdu structuré** (console, fichier JSONL, Loki, OpenSearch) — c'est un fan-out. |
|
|
88
|
+
| **Driver (query)** | Destination **relisable** : celle qu'on interroge pour filtrer l'historique. |
|
|
89
|
+
| **Backplane** | _Fond de panier_ : la couche qui rassemble les logs de plusieurs process/pods en une vue. |
|
|
90
|
+
| **JSONL** | _JSON Lines_ : un objet JSON par ligne — format ingérable tel quel par Promtail/Filebeat. |
|
|
91
|
+
| **ALS** | _AsyncLocalStorage_ : le stockage Node qui suit une requête à travers ses `await`. |
|
|
92
|
+
| **TTY** | Un vrai terminal interactif (≠ un pipe, ≠ un fichier). Décide couleur et bufférisation. |
|
|
93
|
+
|
|
94
|
+
## Qu'est-ce que journaliser dans un serveur — et pourquoi c'est un point chaud
|
|
95
|
+
|
|
96
|
+
Écrire une ligne semble trivial. Dans un serveur, c'est le code **le plus appelé de tout le
|
|
97
|
+
programme** : au moins une ligne par requête, souvent dix. Trois pièges classiques en découlent.
|
|
98
|
+
|
|
99
|
+
- **Le coût par requête.** Un `console.log` fait un appel système synchrone. À 2 000 requêtes par
|
|
100
|
+
seconde, c'est 2 000 appels système par seconde consacrés à… regarder le serveur travailler.
|
|
101
|
+
L'observabilité devient le goulet d'étranglement qu'elle est censée mesurer.
|
|
102
|
+
- **La ligne perdue.** Celle qui explique le crash est justement écrite **au moment** du crash. Un
|
|
103
|
+
buffer non vidé à la sortie du process, et c'est la seule ligne qui manque.
|
|
104
|
+
- **La vue tronquée.** En cluster ou en Kubernetes, chaque process ne connaît que ses propres
|
|
105
|
+
lignes. Relire « le » log sans agrégation, c'est relire **un pod sur dix** en croyant tout voir.
|
|
106
|
+
|
|
107
|
+
À cela s'ajoute une exigence de sécurité : un log est du texte qui **sort du process** (fichier,
|
|
108
|
+
collecteur, écran d'admin). Un mot de passe qui atterrit dans un `payload` a franchi la frontière.
|
|
109
|
+
|
|
110
|
+
## La vision Nodefony
|
|
111
|
+
|
|
112
|
+
Nodefony répond à chacun de ces points par un mécanisme précis, pas par un réglage global.
|
|
113
|
+
|
|
114
|
+
- **Le coût** : une gate de sévérité à l'ENTRÉE (`Syslog.setSeverityThreshold()`,
|
|
115
|
+
`Syslog.ts:937`) court-circuite le log **avant** toute allocation, et le coalescing regroupe les
|
|
116
|
+
écritures d'un tick en un seul `write()` (`writeOut`, `Syslog.ts:162`).
|
|
117
|
+
- **La ligne perdue** : les sévérités graves (≤ 3) contournent le buffer et partent en écriture
|
|
118
|
+
durable immédiate (`FileSink.writeErr()`, `FileSink.ts:115`) ; un filet de sortie vide ce qui reste
|
|
119
|
+
au `exit` du process (`Syslog.ts:192`).
|
|
120
|
+
- **La vue tronquée** : le driver `cluster-file` agrège les JSONL de **tous** les workers et les
|
|
121
|
+
trie chronologiquement (`createClusterFileLogDriver()`, `ClusterFileLogDriver.ts:59`).
|
|
122
|
+
- **Les secrets** : une passe de masquage défensive (`redactSecrets()`, `redact.ts:52`) s'applique
|
|
123
|
+
avant d'exposer du texte hors du process.
|
|
124
|
+
|
|
125
|
+
Le tout reste **isomorphe** : le même `Syslog` tourne dans le navigateur (debug bar) — il n'y a pas
|
|
126
|
+
de `process` ni de `setImmediate` là-bas, donc pas de bufférisation, et l'ANSI est retiré
|
|
127
|
+
(`_stdoutSink`, `Syslog.ts:98`).
|
|
128
|
+
|
|
129
|
+
Et le compromis assumé : **le ring buffer est volatile et borné**. Nodefony ne prétend pas être une
|
|
130
|
+
base de logs. Il garde une fenêtre récente en RAM pour le diagnostic immédiat, et délègue la
|
|
131
|
+
rétention longue à une vraie destination (fichier JSONL, Loki, OpenSearch).
|
|
132
|
+
|
|
133
|
+
## 🚀 Démarrage rapide
|
|
134
|
+
|
|
135
|
+
### Dans une app `nodefony create app`, le journal est DÉJÀ actif
|
|
136
|
+
|
|
137
|
+
Rien à installer ni à instancier : chaque `Service` (donc chaque module, contrôleur, kernel) porte
|
|
138
|
+
son `syslog` et expose `this.log(…)`. Le scaffold n'écrit que ses **écarts** aux défauts :
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
// nodefony.config.ts (extrait généré par `nodefony create app`)
|
|
142
|
+
export default defineConfig((ctx) => ({
|
|
143
|
+
log: {
|
|
144
|
+
// Dev : tout passe (DEBUG compris). Prod : `[]` → gate à INFO, les DEBUG
|
|
145
|
+
// ne sont même pas construits (0 allocation).
|
|
146
|
+
debug: ctx.isProd ? [] : "*",
|
|
147
|
+
// stdout = contrat cloud-native : le collecteur de l'orchestrateur lit le flux.
|
|
148
|
+
driver: "stdout",
|
|
149
|
+
// "auto" = coalesce hors TTY (pipe/fichier = débit), immédiat sur terminal.
|
|
150
|
+
buffered: "auto",
|
|
151
|
+
// "auto" = relecture adaptée au lancement : mono-process → mémoire ;
|
|
152
|
+
// worker de cluster → vue unifiée `cluster-file`.
|
|
153
|
+
queryDriver: "auto",
|
|
154
|
+
},
|
|
155
|
+
modules: [use("@nodefony/http", {}), "@nodefony/framework"],
|
|
156
|
+
}));
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Ce que TU écris : un service qui journalise
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
// nodefony/service/InvoiceService.ts — complet, compile tel quel
|
|
163
|
+
import { Service } from "nodefony";
|
|
164
|
+
|
|
165
|
+
export class InvoiceService extends Service {
|
|
166
|
+
pay(id: string, amount: number): void {
|
|
167
|
+
// `msgid` non fourni → il vaut le NOM du service (ici « invoice »).
|
|
168
|
+
this.log(`facture ${id} payée (${amount} €)`, "INFO");
|
|
169
|
+
// Un objet est accepté tel quel : il sera inspecté à l'affichage, pas
|
|
170
|
+
// sérialisé au moment du log (le hot path ne fait pas de JSON.stringify).
|
|
171
|
+
this.log({ id, amount }, "DEBUG");
|
|
172
|
+
if (amount <= 0) {
|
|
173
|
+
// Une Error est un payload de première classe (stack conservée).
|
|
174
|
+
this.log(new Error(`montant invalide: ${amount}`), "ERROR", "BILLING");
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
audit(rows: unknown[]): void {
|
|
179
|
+
// Pattern « ne jamais FORMATER au-dessus du niveau actif » : la gate coupe
|
|
180
|
+
// déjà le log, mais pas le `JSON.stringify` qui le précède. On le teste.
|
|
181
|
+
if (this.syslog?.severityEnabled("DEBUG")) {
|
|
182
|
+
this.log(JSON.stringify(rows), "DEBUG");
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Ce qu'on observe
|
|
189
|
+
|
|
190
|
+
Le format est fixe — `HH:MM:SS.mmm SÉVÉRITÉ MSGID : payload`, colonnes alignées, couleurs
|
|
191
|
+
seulement sur un vrai terminal :
|
|
192
|
+
|
|
193
|
+
```text
|
|
194
|
+
14:32:01.247 INFO invoice : facture INV-42 payée (120 €)
|
|
195
|
+
14:32:01.248 DEBUG invoice : { id: 'INV-42', amount: 120 }
|
|
196
|
+
14:32:01.310 ERROR BILLING : Error: montant invalide: -5
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Les sévérités `ERROR` et plus graves partent sur **stderr**, le reste sur **stdout** — un
|
|
200
|
+
`2>/dev/null` ne masque donc jamais tes erreurs, et l'inverse non plus.
|
|
201
|
+
|
|
202
|
+
### Passer les logs dans un fichier relisable
|
|
203
|
+
|
|
204
|
+
Deux réglages, deux axes différents : `driver` dit où part la **ligne de texte**, `queryDriver` dit
|
|
205
|
+
où l'on **relit** :
|
|
206
|
+
|
|
207
|
+
```typescript
|
|
208
|
+
// nodefony.config.ts — écrire dans un fichier ET pouvoir le rejouer
|
|
209
|
+
export default defineConfig((ctx) => ({
|
|
210
|
+
log: {
|
|
211
|
+
// Axe ÉCRITURE : un fichier `.log` avec un descripteur PAR worker.
|
|
212
|
+
driver: "file",
|
|
213
|
+
file: { sync: true }, // fichier local rapide → l'écriture directe suffit
|
|
214
|
+
// Axe RELECTURE : en prod on interroge le JSONL du worker ; en dev on
|
|
215
|
+
// laisse « auto » (mémoire en mono-process, vue cluster si worker).
|
|
216
|
+
queryDriver: ctx.isProd ? "file" : "auto",
|
|
217
|
+
// Une URL déclarée SUFFIT à basculer la relecture sur Loki (un seul bouton).
|
|
218
|
+
...(ctx.infra.logs?.lokiUrl
|
|
219
|
+
? { loki: { url: ctx.infra.logs.lokiUrl } }
|
|
220
|
+
: {}),
|
|
221
|
+
},
|
|
222
|
+
}));
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
> [!TIP]
|
|
226
|
+
> Besoin de rallumer le `DEBUG` d'**un seul module** en production, sans redéployer ? Lance avec
|
|
227
|
+
> `NF__DEBUG=FIREWALL,SESSION:NOTICE` — ou appelle `PATCH /nodefony/kernel/api/log/level` à chaud
|
|
228
|
+
> (auto-extinction imposée). Détail plus bas, section Configuration.
|
|
229
|
+
|
|
230
|
+
## Les sévérités RFC 5424
|
|
231
|
+
|
|
232
|
+
Huit niveaux normalisés, plus une extension maison pour le CLI. L'enum `SysLogSeverity`
|
|
233
|
+
(`Pdu.ts:27`) est la source unique :
|
|
234
|
+
|
|
235
|
+
| # | Nom | Quand l'employer | Sortie |
|
|
236
|
+
| --- | ----------- | ----------------------------------------------- | ------ |
|
|
237
|
+
| 0 | `EMERGENCY` | Le système est inutilisable. | stderr |
|
|
238
|
+
| 1 | `ALERT` | Action humaine immédiate requise. | stderr |
|
|
239
|
+
| 2 | `CRITIC` | Condition critique (⚠️ **pas** `CRITICAL`). | stderr |
|
|
240
|
+
| 3 | `ERROR` | Une opération a échoué. | stderr |
|
|
241
|
+
| 4 | `WARNING` | Anomalie tolérée, à surveiller. | stdout |
|
|
242
|
+
| 5 | `NOTICE` | Normal mais notable (bascule, reconfiguration). | stdout |
|
|
243
|
+
| 6 | `INFO` | Déroulé nominal — **le défaut d'un `Service`**. | stdout |
|
|
244
|
+
| 7 | `DEBUG` | Détail de mise au point. | stdout |
|
|
245
|
+
|
|
246
|
+
Points de vigilance, tous vérifiables au code :
|
|
247
|
+
|
|
248
|
+
- **Le nom canonique est `CRITIC`.** `translateSeverity()` (`Pdu.ts:51`) **lève une exception** sur
|
|
249
|
+
un nom inconnu — `"CRITICAL"` compris.
|
|
250
|
+
- **Deux champs, deux usages** : `pdu.severity` est le **nombre** (comparaisons rapides),
|
|
251
|
+
`pdu.severityName` la **chaîne** (affichage). La correspondance passe par une map inverse
|
|
252
|
+
précalculée `severityNameMap` (`Pdu.ts:79`), O(1) par Pdu.
|
|
253
|
+
- **La classe d'erreur est « ≤ 3 »** : c'est ce seuil qui décide stderr, écriture durable, et
|
|
254
|
+
incrémentation des compteurs de santé (`Syslog.pushStack()`, `Syslog.ts:1133`).
|
|
255
|
+
- **Le seuil ne se devine pas côté entrée** : `Syslog.severityFromInput()` (`Syslog.ts:864`) valide
|
|
256
|
+
**strictement** un niveau fourni par un endpoint ou une variable d'environnement et **rejette**
|
|
257
|
+
l'inconnu, là où le hot path reste tolérant.
|
|
258
|
+
|
|
259
|
+
## 🏗️ Architecture interne — le trajet d'un log
|
|
260
|
+
|
|
261
|
+
Le parcours du schéma d'ouverture, étape par étape et ancré :
|
|
262
|
+
|
|
263
|
+
1. **Point d'entrée applicatif** — `Service.log()` (`Service.ts:209`) remplit `msgid` avec le nom du
|
|
264
|
+
service si tu ne le fournis pas, et garantit qu'un log ne lève **jamais** (un logger qui casse la
|
|
265
|
+
requête serait pire que pas de log).
|
|
266
|
+
2. **Gate de sévérité** — `Syslog.log()` (`Syslog.ts:1161`) compare la sévérité au seuil effectif
|
|
267
|
+
(global, ou relevé pour ce module) **avant** de construire quoi que ce soit. Sous le seuil : un
|
|
268
|
+
`Pdu` singleton réutilisé est renvoyé pour honorer le contrat de type, rien d'autre n'existe.
|
|
269
|
+
3. **Garde de débit** — si `rateLimit` est activé, seuls les `burstLimit` premiers logs de la
|
|
270
|
+
fenêtre passent ; les autres incrémentent `missed` et repartent en `DROPPED`.
|
|
271
|
+
4. **Création du `Pdu`** (`Pdu.ts:132`) — horodatage `Date.now()` sans objet `Date`, `uid`
|
|
272
|
+
incrémental, `pid` constant capturé une seule fois au chargement (`Pdu.ts:175`), type du payload
|
|
273
|
+
déduit par un `fastTypeOf()` inline (`Pdu.ts:129`), et `requestId` lu via un fournisseur
|
|
274
|
+
injectable (`Pdu.ts:144`).
|
|
275
|
+
5. **Ring buffer** — `pushStack()` (`Syslog.ts:1133`) range le Pdu dans le `CircularBuffer`
|
|
276
|
+
(`Syslog.ts:273`) et incrémente les compteurs de santé (`valid`, `errorTotal`, `criticTotal`).
|
|
277
|
+
6. **Diffusion** — `fire("onLog")` alimente les listeners (dont l'impression console) ; le fan-out
|
|
278
|
+
transports n'est parcouru que s'il y en a au moins un (`_fireTransports`, `Syslog.ts:1503`), et
|
|
279
|
+
seulement pour les Pdu `ACCEPTED`.
|
|
280
|
+
7. **Écriture** — `Syslog.rawLog()` (`Syslog.ts:1620`) formate la ligne via `Syslog.wrapper()`
|
|
281
|
+
(`Syslog.ts:1530`) puis la remet au coalescing, qui la donne au sink actif.
|
|
282
|
+
|
|
283
|
+
### Le ring buffer — mémoire bornée, relecture O(1)
|
|
284
|
+
|
|
285
|
+
Le ring est un `CircularBuffer<Pdu>` (`Syslog.ts:273`) : `push()` écrase la plus vieille entrée et
|
|
286
|
+
avance la tête (`Syslog.ts:284`), `toArray()` restitue l'ordre FIFO du plus ancien au plus récent
|
|
287
|
+
(`Syslog.ts:311`). Un `Array.shift()` aurait été O(n) **à chaque ligne**.
|
|
288
|
+
|
|
289
|
+
- Capacité par défaut **100** (`defaultSettings`, `Syslog.ts:364`) ; le Kernel la porte à **2000 en
|
|
290
|
+
développement** pour qu'une requête complète tienne dans la fenêtre malgré le bruit
|
|
291
|
+
(`maxStack` résolu au boot, `Kernel.ts:2281`).
|
|
292
|
+
- Redimensionner = **au boot uniquement** : `setMaxStack()` (`Syslog.ts:799`) reconstruit le buffer
|
|
293
|
+
en préservant les Pdu existants.
|
|
294
|
+
- Le stockage lui-même se coupe à chaud (`setRingEnabled()`, `Syslog.ts:764`) : les compteurs de
|
|
295
|
+
santé continuent d'être tenus, mais plus rien n'est retenu en RAM.
|
|
296
|
+
- Lecture : le getter `ringStack` (`Syslog.ts:737`), et `getLogStack()` (`Syslog.ts:1286`) dont
|
|
297
|
+
l'appel **sans argument** renvoie le dernier Pdu en O(1) sans matérialiser le tableau.
|
|
298
|
+
|
|
299
|
+
### Le filtrage conditionnel des listeners
|
|
300
|
+
|
|
301
|
+
Un listener peut n'écouter qu'une partie du flux, via `listenWithConditions()` (`Syslog.ts:1378`,
|
|
302
|
+
alias de `filter()`, `Syslog.ts:1367`) : conditions sur `severity`, `msgid` ou `date`, combinées en
|
|
303
|
+
`&&` (défaut) ou `||`. C'est ce mécanisme qui branche l'impression console au boot — `init()`
|
|
304
|
+
(`Syslog.ts:821`) attache un unique listener « sévérité ≤ 6, ou ≤ 7 si debug », après avoir purgé
|
|
305
|
+
les précédents (idempotence).
|
|
306
|
+
|
|
307
|
+
> [!NOTE]
|
|
308
|
+
> Ce filtrage agit **après** la création du Pdu : il choisit qui reçoit, pas ce qui est construit.
|
|
309
|
+
> L'économie d'allocation, elle, vient de la gate d'entrée (point 2 ci-dessus). Les deux se
|
|
310
|
+
> complètent, ils ne font pas doublon.
|
|
311
|
+
|
|
312
|
+
## ⚙️ Configuration
|
|
313
|
+
|
|
314
|
+
Tout tient dans la clé `log` de `nodefony.config.ts`, typée par `LogConfig` (`types.ts:168`) et
|
|
315
|
+
validée au boot par le schéma Zod de l'application (`schema.ts:26`).
|
|
316
|
+
|
|
317
|
+
| Option | Type | Défaut | Effet | Chaud ? |
|
|
318
|
+
| ---------------- | ------------------------------------------- | ---------- | --------------------------------------------------------------------- | :-----: |
|
|
319
|
+
| `active` | `boolean` | `true` | Interrupteur général — `false` = silence total (bancs, tests). | oui |
|
|
320
|
+
| `debug` | `string \| string[]` | `[]` | `"*"` = tout ; `[]` = rien ; liste = modules ciblés. | oui |
|
|
321
|
+
| `requestFormat` | `"auto" \| "default" \| "pretty" \| "json"` | `"auto"` | Format de la ligne de fin de requête HTTP (dev lisible / prod JSON). | oui |
|
|
322
|
+
| `buffered` | `boolean \| "auto"` | `"auto"` | Coalescing par tick. `"auto"` = actif **hors** terminal. | boot |
|
|
323
|
+
| `driver` | `"stdout" \| "file" \| "null"` | `"stdout"` | Sink d'écriture de la ligne de texte. | boot |
|
|
324
|
+
| `file.sync` | `boolean` | `false` | Écriture directe au lieu du buffer asynchrone (fichier local rapide). | boot |
|
|
325
|
+
| `queryDriver` | `string` | `"auto"` | Destination **relisable**. `"auto"` s'adapte au mode de lancement. | boot |
|
|
326
|
+
| `loki.url` | `string` | — | Base Loki. Déclarée seule, elle **impose** la relecture Loki. | boot |
|
|
327
|
+
| `opensearch.url` | `string` | — | Base OpenSearch. Même logique de bouton unique. | boot |
|
|
328
|
+
|
|
329
|
+
### Comment `queryDriver: "auto"` décide
|
|
330
|
+
|
|
331
|
+
`resolveQueryDriver()` (`builtinLogDrivers.ts:54`) est une fonction pure, testée seule. Elle
|
|
332
|
+
n'intervient **que** sur le défaut — une valeur explicite est toujours respectée :
|
|
333
|
+
|
|
334
|
+
| Situation | Driver retenu | Pourquoi |
|
|
335
|
+
| -------------------------------------- | -------------- | --------------------------------------------------- |
|
|
336
|
+
| Une URL Loki déclarée | `loki` | L'URL vaut la décision : un seul bouton à tourner. |
|
|
337
|
+
| Une URL OpenSearch déclarée | `opensearch` | Idem. |
|
|
338
|
+
| **Les deux** URL, sans choix explicite | **exception** | Aucun arbitrage silencieux entre deux destinations. |
|
|
339
|
+
| Worker d'un cluster | `cluster-file` | Vue **unifiée** de tous les workers, pas d'un seul. |
|
|
340
|
+
| Mono-process | `memory` | Zéro entrée/sortie : le ring buffer suffit. |
|
|
341
|
+
|
|
342
|
+
### Le debug ciblé — relever la verbosité sans redéployer
|
|
343
|
+
|
|
344
|
+
En production, le seuil global est posé à `INFO` par le Kernel (`Kernel.ts:2368`). Trois leviers
|
|
345
|
+
permettent de rouvrir le robinet **sans redémarrer**, du plus opérationnel au plus fin :
|
|
346
|
+
|
|
347
|
+
1. **Au lancement** — `NF__DEBUG` : `*` lève la gate globale, `FIREWALL` passe ce module en `DEBUG`,
|
|
348
|
+
`SESSION:NOTICE` le passe à un niveau précis. Analysé par `Syslog.parseDebugSpec()`
|
|
349
|
+
(`Syslog.ts:893`), appliqué au boot (`Kernel.ts:2378`).
|
|
350
|
+
2. **À chaud, par module** — `setDebugOverride()` (`Syslog.ts:974`) relève le seuil **d'un seul**
|
|
351
|
+
module (clé = son `msgid`). Le joker `*` vaut « tout ». Un `ttlMs` arme une **auto-extinction**
|
|
352
|
+
(minuterie `unref`, ré-armable) : un debug oublié allumé n'existe pas.
|
|
353
|
+
3. **Depuis l'admin** — `PATCH /nodefony/kernel/api/log/level` (`KernelAdminApi.ts:1044`), réservé
|
|
354
|
+
au rôle administrateur, **par module uniquement**, niveau validé strictement, durée de vie
|
|
355
|
+
imposée (défaut 15 min, plafond 60) et **auditée**.
|
|
356
|
+
|
|
357
|
+
> [!WARNING]
|
|
358
|
+
> Un override par module n'a **aucun effet** quand il n'y a pas de gate globale (cas du
|
|
359
|
+
> développement, seuil `null`) : tout passe déjà. Ce n'est pas une panne — c'est la conséquence
|
|
360
|
+
> logique d'un seuil qui ne peut que **relever** la verbosité.
|
|
361
|
+
|
|
362
|
+
### Réglages non atteignables depuis `nodefony.config.ts`
|
|
363
|
+
|
|
364
|
+
Le Kernel lit quatre réglages supplémentaires (`log.dir`, `log.maxStack`, `log.file.path`,
|
|
365
|
+
`log.queryFile`) qui **ne figurent pas** dans le type public `LogConfig` (`types.ts:168`) : les
|
|
366
|
+
écrire dans `nodefony.config.ts` provoque une erreur TypeScript. Leurs valeurs par défaut
|
|
367
|
+
s'appliquent donc telles quelles — dossier `logs/`, fichiers `nodefony-<pid>.log` et
|
|
368
|
+
`nodefony-<pid>.jsonl`, ring de 100 (2000 en développement).
|
|
369
|
+
|
|
370
|
+
## 🔌 Axe ÉCRITURE — le sink et les transports
|
|
371
|
+
|
|
372
|
+
Deux étages, souvent confondus. Le **sink** reçoit une **chaîne de texte** déjà mise en forme et
|
|
373
|
+
coalescée ; il y en a **un seul** par process. Les **transports** reçoivent le **Pdu structuré** ;
|
|
374
|
+
il y en a autant qu'on veut.
|
|
375
|
+
|
|
376
|
+
### La coalescence — le vrai levier de débit
|
|
377
|
+
|
|
378
|
+
C'est le mécanisme qui fait la différence, bien avant le choix du sink. `writeOut()`
|
|
379
|
+
(`Syslog.ts:162`) empile les lignes d'un même tick et programme **un seul** `setImmediate` quel
|
|
380
|
+
qu'en soit le nombre ; `_flushOut()` (`Syslog.ts:137`) les concatène en **un** appel système. Un
|
|
381
|
+
plafond `FLUSH_BYTES` de 64 Kio (`Syslog.ts:55`) borne la rétention d'un tick — au-delà, on vide
|
|
382
|
+
tout de suite.
|
|
383
|
+
|
|
384
|
+
Deux garde-fous complètent le tableau :
|
|
385
|
+
|
|
386
|
+
- **stderr n'est jamais bufférisé** : `writeErr()` (`Syslog.ts:180`) vide d'abord stdout — pour que
|
|
387
|
+
l'ordre causal tienne dans une sortie fusionnée `2>&1` — puis écrit immédiatement.
|
|
388
|
+
- **Filet de sortie** : à l'`exit` et au `beforeExit`, le buffer est vidé puis le sink flushé en
|
|
389
|
+
synchrone (`Syslog.ts:192`). Aucun gestionnaire `SIGINT`/`SIGTERM` n'est posé, délibérément : cela
|
|
390
|
+
casserait le Ctrl+C et masquerait les plantages.
|
|
391
|
+
|
|
392
|
+
### Les sinks disponibles
|
|
393
|
+
|
|
394
|
+
| Sink | Écrit vers | Quand le choisir |
|
|
395
|
+
| -------- | ----------------------------- | --------------------------------------------------------- |
|
|
396
|
+
| `stdout` | `process.stdout` / `stderr` | Défaut. Contrat cloud-native : le collecteur lit le flux. |
|
|
397
|
+
| `file` | un descripteur **par worker** | Bare-metal/VPS, ou besoin d'un fichier local. |
|
|
398
|
+
| `null` | nulle part | Bancs de charge : mesurer le plafond sans I/O de log. |
|
|
399
|
+
|
|
400
|
+
#### `stdout` — le défaut isomorphe
|
|
401
|
+
|
|
402
|
+
`_stdoutSink` (`Syslog.ts:98`) écrit directement sur les flux du process, sans passer par
|
|
403
|
+
`console.*` (zéro surcoût). Côté navigateur, où `process` n'existe pas, il retombe sur `console.*`
|
|
404
|
+
en retirant les codes ANSI — c'est ce qui rend le cœur réellement isomorphe.
|
|
405
|
+
|
|
406
|
+
#### `file` — un descripteur par worker
|
|
407
|
+
|
|
408
|
+
`FileSink` (`FileSink.ts:50`) ouvre le fichier en **ajout** (`O_APPEND`) et garde le descripteur.
|
|
409
|
+
Un fichier par worker signifie **zéro verrou d'inode partagé** entre process. Deux modes :
|
|
410
|
+
|
|
411
|
+
- **asynchrone** (défaut) : buffer applicatif borné, une seule écriture en vol pour garantir
|
|
412
|
+
l'ordre, abandon borné si le buffer sature (anti-saturation mémoire), et le morceau non confirmé
|
|
413
|
+
est réécrit en synchrone si le process sort avant le retour (`#drain()`, `FileSink.ts:107`).
|
|
414
|
+
- **`sync: true`** : écriture directe (`FileSink.ts:59`). Sur un fichier local — où l'écriture se
|
|
415
|
+
compte en microsecondes et où le tick a **déjà** coalescé — c'est le bon réglage : pas de
|
|
416
|
+
threadpool, rien à perdre.
|
|
417
|
+
|
|
418
|
+
Dans les deux cas, **stderr est toujours durable** : `writeErr()` (`FileSink.ts:115`) écrit en
|
|
419
|
+
synchrone même en mode asynchrone, pour qu'une erreur fatale survive à un `SIGKILL`. Compromis
|
|
420
|
+
assumé et documenté au code : un morceau stdout encore en vol n'est pas réémis (ce serait un
|
|
421
|
+
doublon système non annulable), donc un fatal peut précéder un `INFO` plus ancien — les horodatages
|
|
422
|
+
à la milliseconde font foi.
|
|
423
|
+
|
|
424
|
+
#### `null` — le plafond sans bruit
|
|
425
|
+
|
|
426
|
+
`NULL_LOG_SINK` (`Syslog.ts:113`) ne fait rien du tout. Sa seule raison d'être : mesurer ce que
|
|
427
|
+
coûte réellement le reste du pipeline.
|
|
428
|
+
|
|
429
|
+
### Basculer et couper à chaud
|
|
430
|
+
|
|
431
|
+
- **Changer de sink** : `Syslog.setLogSink()` (`Syslog.ts:1674`). La bascule vide d'abord les
|
|
432
|
+
lignes en attente **puis** ferme l'ancien sink (`_setLogSink`, `Syslog.ts:154`) — jamais de ligne
|
|
433
|
+
perdue, jamais de descripteur fuité.
|
|
434
|
+
- **Couper sans changer de sink** : `Syslog.setSinkEnabled()` (`Syslog.ts:1697`) coupe l'écriture
|
|
435
|
+
tout en **préservant le nom** du sink (l'interface d'admin sait quoi réafficher). Coût sur le hot
|
|
436
|
+
path : un test booléen.
|
|
437
|
+
- **Forcer la bufférisation** : `Syslog.setOutputBuffering()` (`Syslog.ts:1658`) accepte `true`,
|
|
438
|
+
`false` ou `"auto"`.
|
|
439
|
+
|
|
440
|
+
### Les transports — le fan-out structuré
|
|
441
|
+
|
|
442
|
+
Un transport reçoit le `Pdu` entier et l'envoie où il veut. Contrat minimal : un `name` et un
|
|
443
|
+
`send(pdu): Promise<void>`. Ils sont ajoutés (`addTransport()`, `Syslog.ts:1415`, dédupliqué **par
|
|
444
|
+
nom**), listés (`listTransports()`, `Syslog.ts:1463`) et activés/désactivés à chaud
|
|
445
|
+
(`setTransportEnabled()`, `Syslog.ts:1487` — un transport désactivé est **retiré** de la boucle,
|
|
446
|
+
donc sans surcoût). Une erreur d'envoi déclenche `onTransportError` : elle ne fait jamais tomber la
|
|
447
|
+
requête.
|
|
448
|
+
|
|
449
|
+
| Transport | Destination | À quoi il sert |
|
|
450
|
+
| ------------ | ------------------------- | ---------------------------------------------------- |
|
|
451
|
+
| `console` | la sortie formatée | Impression lisible par un humain. |
|
|
452
|
+
| `file` | un fichier JSONL ou texte | Persistance locale, ingérable par Promtail/Filebeat. |
|
|
453
|
+
| `http` | un endpoint HTTP(S) | Webhook maison, collecteur non standard. |
|
|
454
|
+
| `syslog` | un autre `Syslog` | Agrégation parent/enfant dans le même process. |
|
|
455
|
+
| `loki` | Grafana Loki (`/push`) | Production : envoi **groupé**, une requête par lot. |
|
|
456
|
+
| `opensearch` | OpenSearch (`_bulk`) | Production : NDJSON groupé. |
|
|
457
|
+
|
|
458
|
+
Les quatre premiers sont directs : `ConsoleTransport` (`ConsoleTransport.ts:5`) délègue l'impression
|
|
459
|
+
à `Syslog.normalizeLog()` (`Syslog.ts:1596`) ; `FileTransport` (`FileTransport.ts:10`) écrit **un
|
|
460
|
+
objet JSON par ligne**, exactement ce que relit le driver `file` — écriture et relecture sont
|
|
461
|
+
branchées **ensemble** par le Kernel, sur le même chemin, ce qui évite le classique « j'écris ici,
|
|
462
|
+
je relis là » ; `HttpTransport` (`HttpTransport.ts:12`) fait un `POST` par Pdu, sans regroupement
|
|
463
|
+
(volume faible uniquement) ; `SyslogTransport` (`SyslogTransport.ts:7`) réémet le **même** objet
|
|
464
|
+
`Pdu` vers un autre `Syslog`, pour qu'un sous-système remonte au journal principal.
|
|
465
|
+
|
|
466
|
+
### `loki` / `opensearch` — les destinations de production
|
|
467
|
+
|
|
468
|
+
Les deux étendent `BatchingHttpTransport` (`BatchingHttpTransport.ts:47`), qui mutualise la file
|
|
469
|
+
bornée, l'abandon anti-saturation, le déclenchement par seuil ou par intervalle, et le vidage avant
|
|
470
|
+
sortie. **Une requête HTTP par lot, jamais par log.**
|
|
471
|
+
|
|
472
|
+
`LokiTransport` (`LokiTransport.ts:47`) groupe les Pdu par jeu d'étiquettes de **faible
|
|
473
|
+
cardinalité** (`app`, `severity`, `module`, `pid`) et convertit l'horodatage en nanosecondes.
|
|
474
|
+
Décision importante : le `requestId` **n'est pas une étiquette** — il resterait dans l'index de Loki
|
|
475
|
+
et le ferait exploser. Il voyage dans la ligne JSON et se filtre à la requête.
|
|
476
|
+
|
|
477
|
+
## Axe RELECTURE — le Log Backplane
|
|
478
|
+
|
|
479
|
+
Le fan-out d'écriture ne dit pas comment **chercher**. C'est le rôle du contrat `ILogDriver`
|
|
480
|
+
(`ILogDriver.ts:23`) : un nom, des capacités déclarées (`write` / `query` / `stream`), une méthode
|
|
481
|
+
`query()` **asynchrone et froide** — jamais dans le pipeline d'une requête — et une sonde `probe()`
|
|
482
|
+
optionnelle pour les destinations distantes.
|
|
483
|
+
|
|
484
|
+
### Une seule logique de filtrage, cinq façades
|
|
485
|
+
|
|
486
|
+
`filterPdus()` (`filterPdus.ts:45`) est un **filtre pur** : aucune I/O, aucun état, testable sans
|
|
487
|
+
serveur. Tous les drivers finissent par lui — y compris Loki et OpenSearch, qui ne sont que des
|
|
488
|
+
**adaptateurs** : le service distant borne le rapatriement (fenêtre de temps, limite, filtre
|
|
489
|
+
texte), puis `filterPdus` tranche. Résultat : la même sémantique de recherche partout.
|
|
490
|
+
|
|
491
|
+
Il travaille sur `IPduLike`, un **sous-ensemble structurel** des champs d'un Pdu — ce qui permet de
|
|
492
|
+
filtrer une ligne relue d'un fichier **sans instancier** un `Pdu` (dont le constructeur
|
|
493
|
+
incrémenterait un compteur et lirait l'ALS : des effets de bord inacceptables pour une simple
|
|
494
|
+
relecture).
|
|
495
|
+
|
|
496
|
+
Critères disponibles, combinés en ET :
|
|
497
|
+
|
|
498
|
+
| Critère | Comportement |
|
|
499
|
+
| ------------------ | ----------------------------------------------------------------------------------- |
|
|
500
|
+
| `requestId` | Égalité **exacte** — c'est la clé de la trace complète d'un appel. |
|
|
501
|
+
| `severity` | Un nom ou une liste (`["ERROR","CRITIC"]`), insensible à la casse. |
|
|
502
|
+
| `module` / `msgid` | Inclusion, insensible à la casse. |
|
|
503
|
+
| `from` / `to` | Bornes d'horodatage (epoch ms, incluses). |
|
|
504
|
+
| `text` | Recherche plein texte sur payload chaîne + `msg` + module + msgid. |
|
|
505
|
+
| `protocol` | `"ws"` ou `"http"` — classification pure (`pduProtocol()`, `pduProtocol.ts:29`). |
|
|
506
|
+
| `flow` | Étape du cycle de vie (`pduFlowStep()`, `pduFlow.ts:98`) : `ws-open`, `request-in`… |
|
|
507
|
+
| `limit` / `offset` | Pagination — défaut 200, **plafond dur 1000** (`filterPdus.ts:11`). |
|
|
508
|
+
| `order` | `"desc"` (défaut, plus récent d'abord) ou `"asc"` (lecture chronologique). |
|
|
509
|
+
|
|
510
|
+
L'ordre s'appuie sur l'`uid` du Pdu, un compteur monotone d'émission : la chronologie reste exacte
|
|
511
|
+
**même à horodatage égal** (plusieurs logs dans la même milliseconde).
|
|
512
|
+
|
|
513
|
+
### Les drivers intégrés
|
|
514
|
+
|
|
515
|
+
| Driver | Relit | Persiste | Quand il est choisi |
|
|
516
|
+
| -------------- | ----------------------------- | :------: | -------------------------------------------- |
|
|
517
|
+
| `memory` | le ring buffer du process | non | Défaut mono-process. Zéro I/O. |
|
|
518
|
+
| `file` | le JSONL **de ce worker** | oui | Un process, historique au-delà du ring. |
|
|
519
|
+
| `cluster-file` | **tous** les JSONL du dossier | oui | Défaut d'un worker de cluster — vue unifiée. |
|
|
520
|
+
| `loki` | Grafana Loki, en LogQL | oui | Production avec Loki déjà en place. |
|
|
521
|
+
| `opensearch` | OpenSearch, en `_search` | oui | Production avec la pile OpenSearch. |
|
|
522
|
+
|
|
523
|
+
### `memory` — la fenêtre récente, gratuite
|
|
524
|
+
|
|
525
|
+
`createMemoryLogDriver()` (`MemoryLogDriver.ts:22`) applique `filterPdus` sur `syslog.ringStack`,
|
|
526
|
+
lu **paresseusement** à chaque requête. Volatile par construction (`write: false`), isomorphe, et
|
|
527
|
+
sans le moindre accès disque. C'est ce qui alimente l'écran Logs en développement.
|
|
528
|
+
|
|
529
|
+
### `file` — relire un JSONL sans le charger en mémoire
|
|
530
|
+
|
|
531
|
+
`createFileLogDriver()` (`FileLogDriver.ts:39`) ne lit **jamais** tout le fichier. `scanJsonlTail()`
|
|
532
|
+
(`FileLogDriver.ts:68`) ne rapatrie que les derniers octets (8 Mio par défaut,
|
|
533
|
+
`FileLogDriver.ts:6`), jette le premier fragment tronqué, parse ligne à ligne, et ignore
|
|
534
|
+
silencieusement ce qui n'est pas un enregistrement valide (`coerceRecord()`,
|
|
535
|
+
`FileLogDriver.ts:131`). Un fichier de 2 Gio se relit donc au même coût qu'un fichier de 10 Mio.
|
|
536
|
+
|
|
537
|
+
### `cluster-file` — la vue honnête d'un cluster
|
|
538
|
+
|
|
539
|
+
`createClusterFileLogDriver()` (`ClusterFileLogDriver.ts:59`) balaie le dossier, scanne chaque
|
|
540
|
+
`nodefony-<pid>.jsonl` avec la **même** brique que le driver `file`, fusionne, **trie**, puis
|
|
541
|
+
filtre. Le tri est le point délicat : l'`uid` est un compteur **par process**, donc incomparable
|
|
542
|
+
entre workers. `byChrono()` (`ClusterFileLogDriver.ts:136`) trie donc par horodatage (partagé),
|
|
543
|
+
puis par `pid` (groupe par worker), puis par `uid` (chronologie exacte à l'intérieur d'un worker).
|
|
544
|
+
|
|
545
|
+
Double garde-fou mémoire : un plafond d'octets **par fichier**, et un plafond du **nombre de
|
|
546
|
+
fichiers** (les plus récents par date de modification, `ClusterFileLogDriver.ts:96`). Le coût d'une
|
|
547
|
+
requête est donc borné par construction.
|
|
548
|
+
|
|
549
|
+
### `loki` / `opensearch` — adaptateurs, pas moteurs
|
|
550
|
+
|
|
551
|
+
`createLokiLogDriver()` (`LokiLogDriver.ts:86`) interroge `query_range` en LogQL ;
|
|
552
|
+
`createOpenSearchLogDriver()` (`OpenSearchLogDriver.ts:90`) fait un `_search` filtré et trié. Dans
|
|
553
|
+
les deux cas le distant **borne** le rapatriement, puis `filterPdus` fait autorité. Une erreur
|
|
554
|
+
réseau ou un 5xx **remonte** (une panne d'infrastructure doit se voir) ; un index absent renvoie une
|
|
555
|
+
liste vide. Chacun expose une `probe()` : joignabilité, latence, informations de version.
|
|
556
|
+
|
|
557
|
+
### Le registre — comment un driver est monté
|
|
558
|
+
|
|
559
|
+
Aucun `if (nom === …)` dans le Kernel. `registerBuiltinLogDrivers()` (`builtinLogDrivers.ts:86`)
|
|
560
|
+
enregistre les cinq fabriques natives ; `Kernel.initializeLog()` (`Kernel.ts:2228`) résout le driver
|
|
561
|
+
demandé, monte `memory` en filet de sécurité, et — **en développement seulement** — tente de monter
|
|
562
|
+
**tous** les drivers enregistrés pour permettre la bascule à chaud depuis Studio. Chaque fabrique
|
|
563
|
+
s'auto-écarte si sa configuration manque (Loki sans URL, par exemple) : zéro I/O « au cas où ». En
|
|
564
|
+
production, c'est strictement ce qui est demandé.
|
|
565
|
+
|
|
566
|
+
Si le driver configuré n'est pas enregistré, le Kernel **ne plante pas** : il retombe sur `memory`
|
|
567
|
+
et l'annonce par un `WARNING` (`Kernel.ts:3193`) — le principe « pas de dégradation silencieuse ».
|
|
568
|
+
|
|
569
|
+
## 🧰 API publique
|
|
570
|
+
|
|
571
|
+
Les signatures complètes vivent dans le graphe TSDoc (`.ai/symbols.json`) ; voici les usages réels.
|
|
572
|
+
|
|
573
|
+
### Journaliser depuis un service
|
|
574
|
+
|
|
575
|
+
```typescript
|
|
576
|
+
this.log("message"); // INFO — msgid = nom du service
|
|
577
|
+
this.log(err, "ERROR"); // sévérité explicite
|
|
578
|
+
this.log(data, "DEBUG", "MON_MSGID"); // catégorie personnalisée
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
Toutes les variantes **renvoient le `Pdu`** — pratique pour un test ou un audit signé.
|
|
582
|
+
|
|
583
|
+
### Journaliser depuis un `Syslog` direct
|
|
584
|
+
|
|
585
|
+
```typescript
|
|
586
|
+
syslog.error(data); // = log(data, "ERROR")
|
|
587
|
+
syslog.warn(data);
|
|
588
|
+
syslog.info(data);
|
|
589
|
+
syslog.debug(data);
|
|
590
|
+
syslog.trace(data); // = NOTICE
|
|
591
|
+
syslog.print(a, b); // payload = [a, b] si plusieurs arguments
|
|
592
|
+
syslog.logMultiple("ERROR", a, b); // idem, sévérité explicite
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
### Ne pas payer un message qu'on ne verra pas
|
|
596
|
+
|
|
597
|
+
```typescript
|
|
598
|
+
// ❌ le `stringify` s'exécute même si le DEBUG est gaté
|
|
599
|
+
this.log(JSON.stringify(hugePayload), "DEBUG");
|
|
600
|
+
|
|
601
|
+
// ✅ on demande d'abord si ça passerait — `severityEnabled` (Syslog.ts:951)
|
|
602
|
+
if (this.syslog?.severityEnabled("DEBUG")) {
|
|
603
|
+
this.log(JSON.stringify(hugePayload), "DEBUG");
|
|
604
|
+
}
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
### Interroger l'historique par le code
|
|
608
|
+
|
|
609
|
+
```typescript
|
|
610
|
+
import { filterPdus, getActiveLogDriver } from "nodefony";
|
|
611
|
+
|
|
612
|
+
// A. Le filtre pur, sur n'importe quel tableau de Pdu (0 I/O, testable seul).
|
|
613
|
+
const recent = filterPdus(syslog.ringStack, {
|
|
614
|
+
severity: ["ERROR", "CRITIC"],
|
|
615
|
+
limit: 50,
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
// B. Le driver actif — quel qu'il soit (mémoire, fichier, Loki…).
|
|
619
|
+
const driver = getActiveLogDriver();
|
|
620
|
+
const trace = await driver?.query?.({ requestId, order: "asc" });
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
### Rejouer les lignes d'une requête
|
|
624
|
+
|
|
625
|
+
Chaque `Pdu` créé dans une bulle `RequestContext` porte le `requestId` courant, capté via le
|
|
626
|
+
fournisseur injectable `Pdu.requestIdProvider` (`Pdu.ts:192`), branché côté Node par le barrel du
|
|
627
|
+
cœur. Filtrer là-dessus donne la trace **complète et ordonnée** d'un appel — pipeline HTTP,
|
|
628
|
+
firewall, requêtes ORM, code applicatif — d'où l'écran de suivi de requête dans Studio.
|
|
629
|
+
|
|
630
|
+
Côté navigateur, le fournisseur reste `null` : un test de référence, aucune allocation. C'est ce qui
|
|
631
|
+
permet à `Pdu` de rester utilisable dans la debug bar.
|
|
632
|
+
|
|
633
|
+
### Détourner `console.*` vers le journal
|
|
634
|
+
|
|
635
|
+
`Syslog.overrideConsole()` (`Syslog.ts:1712`) redirige `log/info/warn/error/debug/table/dir` vers un
|
|
636
|
+
`Syslog`. Effet **global au process** : un seul appel, et `restoreConsole()` pour revenir. Les
|
|
637
|
+
méthodes natives ont été capturées au chargement du module, ce qui évite toute récursion infinie
|
|
638
|
+
lors de l'impression.
|
|
639
|
+
|
|
640
|
+
## 🔐 Sécurité — le masquage des secrets
|
|
641
|
+
|
|
642
|
+
`redactSecrets()` (`redact.ts:52`) masque par `***` trois familles de fuites fréquentes : les paires
|
|
643
|
+
JSON (`"password": "…"`), les paires texte (`token=…`, `Authorization: …`) et les schémas porteurs
|
|
644
|
+
(`Bearer …`, `Basic …`). La liste des clés sensibles couvre mots de passe, jetons, clés d'API,
|
|
645
|
+
cookies et clés privées (`redact.ts:20`).
|
|
646
|
+
|
|
647
|
+
Deux propriétés valent d'être connues :
|
|
648
|
+
|
|
649
|
+
- **L'ordre compte.** Le motif porteur s'applique **en premier** (`redact.ts:38`) : sinon
|
|
650
|
+
`authorization: Bearer <jwt>` ne verrait masquer que le mot `Bearer`, et le jeton fuirait.
|
|
651
|
+
- **La fonction est idempotente** : rejouer le masquage sur une ligne déjà masquée ne change rien.
|
|
652
|
+
|
|
653
|
+
> [!IMPORTANT]
|
|
654
|
+
> C'est une **défense en profondeur, pas un contrôle d'accès**. La règle reste « ne pas journaliser
|
|
655
|
+
> de secret ». Le masquage rattrape les fuites résiduelles au moment où le texte **sort** du
|
|
656
|
+
> process — par exemple à la lecture d'un fichier de log par l'API d'admin, où il est appliqué par
|
|
657
|
+
> défaut et ne se désactive que par un paramètre explicite (`SyslogAdminApi.ts:631`).
|
|
658
|
+
|
|
659
|
+
Deux autres points de sécurité, plus discrets :
|
|
660
|
+
|
|
661
|
+
- **Les chemins absolus ne sortent pas** : l'API d'admin expose le dossier de logs en **relatif** au
|
|
662
|
+
répertoire de travail, ou à défaut son seul nom de base — un chemin absolu révélerait
|
|
663
|
+
l'arborescence et le compte système (`SyslogAdminApi.ts:104`).
|
|
664
|
+
- **Le pilotage à chaud du niveau de log est audité** et réservé au rôle administrateur : c'est une
|
|
665
|
+
surface active en production, donc traitée comme telle (`KernelAdminApi.ts:1044`).
|
|
666
|
+
|
|
667
|
+
## ⚡ Performance & mémoire
|
|
668
|
+
|
|
669
|
+
Les mécanismes, par ordre d'impact décroissant :
|
|
670
|
+
|
|
671
|
+
1. **La coalescence** est le levier principal. Regrouper les écritures d'un tick divise le nombre
|
|
672
|
+
d'appels système par le nombre de lignes de ce tick. Ce n'est **pas** le descripteur par worker
|
|
673
|
+
qui fait le gros du travail : la contention d'inode ne se paie qu'en régime « une écriture par
|
|
674
|
+
ligne », c'est-à-dire quand la coalescence est désactivée.
|
|
675
|
+
2. **La gate d'entrée** supprime intégralement le coût d'un log gaté : ni `Pdu`, ni `push` au ring,
|
|
676
|
+
ni parcours de listeners. Seul un compteur `gated` est incrémenté.
|
|
677
|
+
3. **Les allocations paresseuses**, appliquées partout : le tampon de sortie n'existe qu'au premier
|
|
678
|
+
log bufférisé (`Syslog.ts:52`) ; la carte des overrides de debug reste `null` tant qu'aucun debug
|
|
679
|
+
ciblé n'est posé (`Syslog.ts:694`) et **redevient** `null` au dernier retrait ; la carte des
|
|
680
|
+
transports désactivés suit la même règle (`Syslog.ts:653`).
|
|
681
|
+
4. **Les constantes captées une fois** : le PID au chargement du module (`Pdu.ts:98`), la décision
|
|
682
|
+
de couleur ANSI au boot (`setLogColor()`, `logColor.ts:86`) — les fonctions de couleur sont
|
|
683
|
+
remplacées par l'identité quand la couleur est coupée, donc **zéro test par ligne**.
|
|
684
|
+
5. **Les gardes par test booléen** : mute du sink, activation du ring, activation de la diffusion —
|
|
685
|
+
chacun coûte une comparaison, jamais une allocation.
|
|
686
|
+
|
|
687
|
+
Ce qui reste **borné par construction** : le ring (capacité fixe), le tampon de tick (64 Kio), le
|
|
688
|
+
buffer du sink fichier (abandon compté au-delà), la file des transports groupés, le rapatriement
|
|
689
|
+
d'une requête de relecture (octets par fichier × nombre de fichiers), et la fenêtre renvoyée
|
|
690
|
+
(plafond dur de 1000 enregistrements).
|
|
691
|
+
|
|
692
|
+
> [!TIP]
|
|
693
|
+
> Pour mesurer le pipeline **sans** le coût du journal, bascule le sink sur `null` : c'est
|
|
694
|
+
> exactement à ça qu'il sert.
|
|
695
|
+
|
|
696
|
+
## 🧩 Extension
|
|
697
|
+
|
|
698
|
+
### Brancher son propre transport
|
|
699
|
+
|
|
700
|
+
Le contrat tient en deux membres : un nom, et un `send` asynchrone.
|
|
701
|
+
|
|
702
|
+
```typescript
|
|
703
|
+
import type { ITransport, Pdu } from "nodefony";
|
|
704
|
+
|
|
705
|
+
class SlackTransport implements ITransport {
|
|
706
|
+
readonly name = "slack";
|
|
707
|
+
async send(pdu: Pdu): Promise<void> {
|
|
708
|
+
if (pdu.severity > 2) return; // uniquement CRITIC et pire
|
|
709
|
+
await fetch(webhook, {
|
|
710
|
+
method: "POST",
|
|
711
|
+
body: JSON.stringify({ text: `${pdu.severityName} ${pdu.msgid}` }),
|
|
712
|
+
});
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
kernel.syslog?.addTransport(new SlackTransport());
|
|
717
|
+
```
|
|
718
|
+
|
|
719
|
+
Une exception levée dans `send` **ne casse rien** : elle est captée et republiée en
|
|
720
|
+
`onTransportError` (`Syslog.ts:1503`). Pour un volume réel, étends plutôt
|
|
721
|
+
`BatchingHttpTransport` (`BatchingHttpTransport.ts:47`) : la file, l'abandon et le vidage sont déjà
|
|
722
|
+
faits.
|
|
723
|
+
|
|
724
|
+
### Brancher sa propre destination relisable
|
|
725
|
+
|
|
726
|
+
Une fabrique enregistrée suffit — le Kernel la découvrira sans rien connaître d'elle :
|
|
727
|
+
|
|
728
|
+
```typescript
|
|
729
|
+
import { registerLogDriverFactory, filterPdus } from "nodefony";
|
|
730
|
+
|
|
731
|
+
registerLogDriverFactory("s3", (ctx) => {
|
|
732
|
+
if (!ctx.logCfg?.queryFile?.path) return null; // config absente → on s'écarte
|
|
733
|
+
return {
|
|
734
|
+
driver: {
|
|
735
|
+
name: "s3",
|
|
736
|
+
capabilities: { write: true, query: true, stream: false },
|
|
737
|
+
query: async (criteria) => filterPdus(await fetchFromS3(), criteria),
|
|
738
|
+
},
|
|
739
|
+
transport: new S3Transport(),
|
|
740
|
+
writeKey: "s3", // déduplique le transport si deux drivers le partagent
|
|
741
|
+
};
|
|
742
|
+
});
|
|
743
|
+
```
|
|
744
|
+
|
|
745
|
+
Réutiliser `filterPdus` n'est pas une commodité : c'est ce qui garantit que ton driver **filtre
|
|
746
|
+
comme les autres**, avec les mêmes critères et le même ordre.
|
|
747
|
+
|
|
748
|
+
## 📜 Normes appliquées
|
|
749
|
+
|
|
750
|
+
| Domaine | Norme | Où c'est dans le code |
|
|
751
|
+
| -------------------------- | ---------------- | ------------------------------------------------------ |
|
|
752
|
+
| Sévérités 0–7 | RFC 5424 §6.2.1 | `SysLogSeverity` (`Pdu.ts:27`) |
|
|
753
|
+
| Champ `PROCID` | RFC 5424 | `pid` capté une fois (`Pdu.ts:126`) |
|
|
754
|
+
| Champ `MSGID` | RFC 5424 | `msgid` = nom du service par défaut (`Service.ts:209`) |
|
|
755
|
+
| Flux stdout/stderr séparés | 12-factor (logs) | Route par sévérité ≤ 3 (`Syslog.ts:1628`) |
|
|
756
|
+
| Configuration par l'env | 12-factor | `NF__DEBUG`, URLs d'infra (`Kernel.ts:2376`) |
|
|
757
|
+
| Couleur désactivable | NO_COLOR | Résolue au boot (`setLogColor()`, `logColor.ts:86`) |
|
|
758
|
+
| JSON Lines | JSONL | `FileTransport` format `json` (`FileTransport.ts:10`) |
|
|
759
|
+
| API de requête Loki | LogQL | `createLokiLogDriver()` (`LokiLogDriver.ts:86`) |
|
|
760
|
+
|
|
761
|
+
## 📡 Observabilité — Studio
|
|
762
|
+
|
|
763
|
+
L'écran **Logs** (`/nodefony/logs`) explore l'historique via le driver actif ; **Suivi de requête**
|
|
764
|
+
(`/nodefony/logs/trace/:requestId`) rejoue toutes les lignes d'un appel dans l'ordre chronologique.
|
|
765
|
+
|
|
766
|
+
Le flux temps réel passe par le canal `nodefony:syslog`, alimenté par un pont **coalescé**
|
|
767
|
+
(`createSyslogBridge()`, `providers.ts:146`) : au lieu d'une trame par Pdu, les logs s'accumulent
|
|
768
|
+
dans un ring borné et partent en **une trame agrégée** toutes les 200 ms, avec un compteur de logs
|
|
769
|
+
omis en cas de surcharge. L'interface reste lisible au lieu de se figer. La diffusion se coupe à
|
|
770
|
+
chaud (`setStreamEnabled()`, `Syslog.ts:784`) sans toucher ni à l'écriture ni à la relecture.
|
|
771
|
+
|
|
772
|
+
Le plan de données est exposé sous `/nodefony/syslog/api/*` (`SyslogAdminApi.ts:94`) :
|
|
773
|
+
|
|
774
|
+
| Endpoint | Rôle |
|
|
775
|
+
| ---------------------------- | ----------------------------------------------------------------------- |
|
|
776
|
+
| `GET logs` | Derniers Pdu via le driver actif (tableau). |
|
|
777
|
+
| `GET logs/search` | Requête paginée `{ rows, total, truncated }`. |
|
|
778
|
+
| `GET backplane` | Méta : driver de relecture actif, drivers disponibles, sink, compteurs. |
|
|
779
|
+
| `GET backplane/ping` | Sonde de joignabilité/latence d'une destination distante. |
|
|
780
|
+
| `POST backplane/driver` | Bascule du driver de relecture (développement). |
|
|
781
|
+
| `POST backplane/transport` | Activation/désactivation d'un transport à chaud. |
|
|
782
|
+
| `POST backplane/sink` | Mute/démute le sink texte. |
|
|
783
|
+
| `POST backplane/ring` | Activation/désactivation du stockage mémoire. |
|
|
784
|
+
| `POST backplane/stream` | Activation/désactivation de la diffusion temps réel. |
|
|
785
|
+
| `GET info` | Compteurs : `valid`, `invalid`, `missed`, remplissage du ring. |
|
|
786
|
+
| `GET files` · `files/{name}` | Viewer de fichiers de log (développement), lecture par la fin, masquée. |
|
|
787
|
+
|
|
788
|
+
À quoi s'ajoute `GET`/`PATCH /nodefony/kernel/api/log/level` (`KernelAdminApi.ts:1044`) pour l'état
|
|
789
|
+
et le pilotage du debug ciblé.
|
|
790
|
+
|
|
791
|
+
## ⚠️ Pièges (symptôme → cause → correction)
|
|
792
|
+
|
|
793
|
+
| Symptôme | Cause | Correction |
|
|
794
|
+
| ------------------------------------------------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------- |
|
|
795
|
+
| `"CRITICAL"` fait lever une exception | Le nom canonique est `CRITIC` (`Pdu.ts:51`) | Utiliser `"CRITIC"`, ou le numéro `2`. |
|
|
796
|
+
| `pdu.severity === "INFO"` est faux | `severity` est un **nombre** | Comparer `pdu.severityName`, ou `pdu.severity === 6`. |
|
|
797
|
+
| Les `DEBUG` n'apparaissent plus en production | Gate d'entrée posée à `INFO` par le Kernel (`Kernel.ts:1932`) | `NF__DEBUG=MODULE`, ou `PATCH /nodefony/kernel/api/log/level`. |
|
|
798
|
+
| Un override de debug ne change rien | Pas de gate globale (développement) → tout passe déjà | Normal. L'override ne fait que **relever** un seuil existant. |
|
|
799
|
+
| `log.maxStack` refusé par TypeScript | Absent du type public `LogConfig` (`types.ts:168`) | Non réglable depuis l'app : 100 par défaut, 2000 en développement. |
|
|
800
|
+
| Codes de couleur dans un fichier de log | Sortie non-TTY mal détectée | La couleur est résolue au boot ; vérifier `NO_COLOR`/`FORCE_COLOR`. |
|
|
801
|
+
| Vue « incomplète » en cluster | Driver de relecture **local** — il ne lit que son process | `queryDriver: "cluster-file"` (défaut d'un worker), ou Loki/OpenSearch. |
|
|
802
|
+
| Deux fois la même ligne dans le JSONL | Deux transports de même nom empilés par deux boots successifs | Déjà traité : `addTransport` **remplace** par nom (`Syslog.ts:1415`). |
|
|
803
|
+
| Lignes perdues lors d'un `SIGKILL` | Le buffer de tick n'est pas vidé (non interceptable) | Perte bornée à un tick ; les sévérités ≤ 3 sont écrites en durable immédiat. |
|
|
804
|
+
| Boot en erreur : `queryDriver` ambigu | Loki **et** OpenSearch déclarés sans choix explicite | Préciser `queryDriver: "loki"` ou `"opensearch"` (`builtinLogDrivers.ts:54`). |
|
|
805
|
+
| La sortie est noyée par une boucle qui journalise | Aucune garde de débit | Activer `rateLimit` / `burstLimit` sur le `Syslog` concerné. |
|
|
806
|
+
| Une requête de relecture renvoie 1000 lignes max | Plafond dur anti-saturation (`filterPdus.ts:11`) | Paginer avec `offset`, ou resserrer `from`/`to`. |
|
|
807
|
+
| Un test « pollue » le test suivant | Le sink est **global au process** | `Syslog.setLogSink(null)` en `afterEach` (libère aussi le descripteur). |
|
|
808
|
+
|
|
809
|
+
## 🧪 Tests & couverture
|
|
810
|
+
|
|
811
|
+
Le journal est l'un des sous-systèmes les plus testés du cœur. Familles présentes :
|
|
812
|
+
|
|
813
|
+
- **Unitaires — le hub** (`src/nodefony/src/tests/Syslog.test.ts`) : ring buffer et ses limites,
|
|
814
|
+
sévérités, conditions de filtrage (`&&` / `||`), rate limiting aux bornes, `rawLog` et le cas
|
|
815
|
+
bufférisation de sortie, détournement de `console`, les quatre transports historiques,
|
|
816
|
+
les compteurs d'erreurs par worker, la corrélation `requestId` via l'ALS, la gate d'entrée et les
|
|
817
|
+
overrides de debug par module.
|
|
818
|
+
- **Unitaires — le masquage** (`src/nodefony/src/tests/redact.test.ts`) : les trois familles de
|
|
819
|
+
secrets, l'ordre porteur-avant-paire, l'idempotence.
|
|
820
|
+
- **Unitaires — le backplane** (`src/nodefony/src/tests/LogDriver.test.ts`) : `filterPdus`,
|
|
821
|
+
classification protocole et étape, `pduToRecord`, le registre, les drivers `memory`, `file`
|
|
822
|
+
(JSONL) et `cluster-file` (agrégation), et la résolution `auto`.
|
|
823
|
+
- **Unitaires — les sinks** (`src/nodefony/src/tests/LogSink.test.ts`) : `FileSink` en mode
|
|
824
|
+
asynchrone et synchrone, le sink nul, la bascule de sink.
|
|
825
|
+
- **Intégration réseau simulée** (`src/nodefony/src/tests/LogBackplaneHttp.test.ts`) : drivers et
|
|
826
|
+
transports Loki/OpenSearch, avec `fetch` injecté — donc **sans** infrastructure réelle.
|
|
827
|
+
|
|
828
|
+
Ce qui **manque** aujourd'hui, et qu'il faut savoir :
|
|
829
|
+
|
|
830
|
+
- **Pas de banc de charge dédié au journal** dans la suite versionnée — le coût du logging se mesure
|
|
831
|
+
aujourd'hui par des scripts ponctuels. Voir le skill `nodefony-load-test` pour un banc à
|
|
832
|
+
concurrence contrôlée, et `nodefony-check-memory-health` pour les seuils de mémoire.
|
|
833
|
+
- **Pas de test d'attaque** (`*.attack.test.ts`) sur la surface d'admin du journal (pilotage du
|
|
834
|
+
niveau, viewer de fichiers) : `nodefony-security-review` couvre ce type de campagne.
|
|
835
|
+
- **Pas de banc de contrat partagé** entre drivers : chaque driver est testé pour lui-même, alors
|
|
836
|
+
que la promesse « tous filtrent pareil » gagnerait à être exercée comme un invariant unique.
|
|
837
|
+
|
|
838
|
+
Couverture : `npm run coverage` dans `src/nodefony` (rapport vitest). Les chiffres exacts vivent
|
|
839
|
+
dans la carte de tests régénérée, jamais figés dans cette page.
|
|
840
|
+
|
|
841
|
+
## 🔗 Pour aller plus loin
|
|
842
|
+
|
|
843
|
+
- ⬆️ **Retour au hub** : [@nodefony/core — vue d'ensemble](index.md) · [Toute la documentation](../../../docs/index.md)
|
|
844
|
+
- 🧭 **Pages sœurs** : [Service et événements](service.md) — la classe qui expose `log()` et le bus
|
|
845
|
+
`onLog` · [Contexte de requête](request-context.md) — l'ALS d'où vient le `requestId` ·
|
|
846
|
+
[Kernel](kernel.md) — qui câble tout ça au boot (`initializeLog`)
|
|
847
|
+
- Le pipeline où sont émis les logs de requête → [Pipeline d'une requête](../../../docs/architecture/pipeline-requete.md)
|
|
848
|
+
- Le cycle de boot, dont le journal de démarrage lu depuis le ring → [Cycle de boot](../../../docs/architecture/cycle-boot-kernel.md)
|