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/service.md
ADDED
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Service — la brique de base de tout composant"
|
|
3
|
+
navTitle: Service
|
|
4
|
+
lang: fr
|
|
5
|
+
module: "@nodefony/core"
|
|
6
|
+
topic: service
|
|
7
|
+
coverageModule: nodefony-core
|
|
8
|
+
coveragePackage: "nodefony (cœur)"
|
|
9
|
+
coverageFiles: "Service.ts,Event.ts,Container.ts"
|
|
10
|
+
section: "Cœur runtime"
|
|
11
|
+
audience: [developer]
|
|
12
|
+
tags:
|
|
13
|
+
[service, event, di, container, cycle-de-vie, notifications, injectable, boot]
|
|
14
|
+
version: "doc"
|
|
15
|
+
status: stable
|
|
16
|
+
updated: 2026-07-19
|
|
17
|
+
source: "src/nodefony/docs/service.md"
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Service — la brique de base de tout composant
|
|
21
|
+
|
|
22
|
+
> `Service` est la classe dont **presque tout** hérite dans Nodefony : le `Kernel`, chaque `Module`,
|
|
23
|
+
> chaque controller, chaque adapter ORM. Elle branche trois câbles d'un coup — les **dépendances**
|
|
24
|
+
> (container DI), le **journal** (`log`) et le **bus d'événements** (`notificationsCenter`) — puis
|
|
25
|
+
> garantit qu'ils se débranchent proprement (`clean()`). Ancré sur `src/nodefony/src/Service.ts`,
|
|
26
|
+
> `Event.ts` et `Container.ts`.
|
|
27
|
+
|
|
28
|
+
📍 [Documentation](../../../docs/index.md) › [Cœur — @nodefony/core](index.md) › **Service**
|
|
29
|
+
|
|
30
|
+
## 🧠 Le modèle mental — une prise à trois broches
|
|
31
|
+
|
|
32
|
+
Un composant serveur a toujours besoin des trois mêmes choses : trouver ses voisins, dire ce qu'il
|
|
33
|
+
fait, réagir à ce qui arrive. `Service` est la **prise murale** qui apporte les trois d'un seul
|
|
34
|
+
geste — au lieu que chaque brique se recâble à la main.
|
|
35
|
+
|
|
36
|
+
```mermaid
|
|
37
|
+
flowchart LR
|
|
38
|
+
subgraph S["Service (name)"]
|
|
39
|
+
direction TB
|
|
40
|
+
C["container<br/>DI — get / set / has"]
|
|
41
|
+
L["syslog<br/>log / logger"]
|
|
42
|
+
N["notificationsCenter<br/>on / fire / fireAsync"]
|
|
43
|
+
end
|
|
44
|
+
K["Kernel"] -->|"fournit container + bus"| S
|
|
45
|
+
M["Module"] -->|"fournit container + bus"| S
|
|
46
|
+
S -->|"clean()"| X["débranché<br/>listeners retirés · refs nulles"]
|
|
47
|
+
N -->|"emitAsyncGuarded"| B["cycle de boot<br/>isolé par listener"]
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Trois idées portent toute la page :
|
|
51
|
+
|
|
52
|
+
1. **On hérite, on ne recâble pas.** `class MonService extends Service` et les trois broches sont là.
|
|
53
|
+
2. **Le bus peut être partagé.** Deux services du même module parlent sur le **même** `Event` — c'est
|
|
54
|
+
ce qui les découple sans les faire se connaître.
|
|
55
|
+
3. **Ce qui se branche doit se débrancher.** `Service` **trace** les écouteurs qu'il pose pour que
|
|
56
|
+
`clean()` les retire du bus partagé : sans ça, chaque instance fuirait.
|
|
57
|
+
|
|
58
|
+
## 📖 Lexique
|
|
59
|
+
|
|
60
|
+
<!-- prettier-ignore -->
|
|
61
|
+
| Terme | Sens |
|
|
62
|
+
| --- | --- |
|
|
63
|
+
| Service | La classe de base : identité (`name`) + DI + journal + événements. |
|
|
64
|
+
| Container | Annuaire d'injection de dépendances (DI) : un nom → une instance. Voir [injection-portees](../../../docs/architecture/injection-portees.md). |
|
|
65
|
+
| DI | _Dependency Injection_ — on **reçoit** ses dépendances au lieu de les construire soi-même. |
|
|
66
|
+
| `notificationsCenter` | Le bus d'événements d'un service (une instance d'`Event`). |
|
|
67
|
+
| Event | Bus maison qui étend l'`EventEmitter` de Node avec `emitAsync` et `emitAsyncGuarded`. |
|
|
68
|
+
| Bus partagé | Un même `Event` passé à plusieurs services (typiquement celui du module ou du kernel). |
|
|
69
|
+
| Bus dédié | Un `Event` créé pour un seul service — personne d'autre ne l'écoute. |
|
|
70
|
+
| Écouteur tracké | Écouteur posé via l'API du service, donc retiré automatiquement par `clean()`. |
|
|
71
|
+
| PDU | _Process Data Unit_ — une entrée de journal structurée (RFC 5424). Voir [syslog](syslog.md). |
|
|
72
|
+
| Hot path | Le chemin parcouru à **chaque** requête HTTP/WS — la moindre allocation y coûte cher. |
|
|
73
|
+
| Microtask | Unité d'ordonnancement d'une `Promise` : un `await` inutile en alloue une pour rien. |
|
|
74
|
+
| Émission gardée | `emitAsyncGuarded` — chaque écouteur est isolé (try/catch + délai maximal), les échecs sont collectés. |
|
|
75
|
+
| Scope DI | `singleton` (une instance mémoïsée) ou `transient` (une neuve à chaque résolution). |
|
|
76
|
+
| Tri topologique | Calcul de l'ordre d'instanciation depuis les dépendances déclarées, au lieu de le lire dans une liste. |
|
|
77
|
+
| BootReport | Bilan de démarrage : ce qui a été chargé, ce qui a été ignoré, pourquoi. Fait dire « boot DÉGRADÉ ». |
|
|
78
|
+
| Fail-soft / fail-loud | Continuer malgré la panne / refuser de continuer en silence. Nodefony fait les deux, jamais en cachette. |
|
|
79
|
+
|
|
80
|
+
## Qu'est-ce qu'un Service — et pourquoi un bus d'événements
|
|
81
|
+
|
|
82
|
+
Un serveur est un assemblage de composants qui doivent **se parler sans se connaître**. Le kernel
|
|
83
|
+
signale « je démarre », un module réagit. Une requête signale « terminée », le profileur collecte.
|
|
84
|
+
Un service métier signale « catalogue modifié », un cache s'invalide.
|
|
85
|
+
|
|
86
|
+
Câbler ces composants en dur (A appelle B qui appelle C) donne une pelote : ajouter un consommateur
|
|
87
|
+
oblige à modifier le producteur. Le **bus d'événements** inverse la charge — on émet un signal, et
|
|
88
|
+
**qui veut réagir s'abonne**. Le producteur ne connaît plus ses consommateurs.
|
|
89
|
+
|
|
90
|
+
Nodefony ne se contente pas de fournir un bus quelque part : il le met **dans la classe de base**,
|
|
91
|
+
avec l'accès aux dépendances et le journal. Résultat : n'importe quelle brique du framework part avec
|
|
92
|
+
le même socle, et tout le monde parle la même langue.
|
|
93
|
+
|
|
94
|
+
> [!TIP]
|
|
95
|
+
> Si tu viens de Symfony : `Service` n'est **pas** l'équivalent d'un service `services.yaml`. C'est
|
|
96
|
+
> plutôt « la classe de base que Symfony n'a pas » — un composant y est un POPO, ici il hérite d'un
|
|
97
|
+
> socle qui lui donne DI + log + events. Le rapprochement s'arrête là.
|
|
98
|
+
|
|
99
|
+
## La vision Nodefony
|
|
100
|
+
|
|
101
|
+
`Service` (`Service.ts:43`) porte cinq membres publics — `name`, `container`, `kernel`, `syslog`,
|
|
102
|
+
`options` — et un bus **privé** `#nc` exposé en lecture seule par le getter
|
|
103
|
+
`Service.notificationsCenter` (`Service.ts:57`). Toutes les méthodes d'événements passent par un
|
|
104
|
+
getter privé gardé `Service.nc` (`Service.ts:62`) : c'est lui, et lui seul, qui lève
|
|
105
|
+
`notificationsCenter not initialized` — le test est écrit **une fois** au lieu d'être dupliqué sur
|
|
106
|
+
les 18 méthodes déléguées.
|
|
107
|
+
|
|
108
|
+
Le constructeur (`Service.ts:79`) est volontairement **opportuniste** : il réutilise ce que le
|
|
109
|
+
container lui offre (`kernel`, `syslog`) et ne fabrique que ce qui manque. Le bus suit la même
|
|
110
|
+
logique — partagé si on lui en passe un, dédié sinon, absent si on passe `false`.
|
|
111
|
+
|
|
112
|
+
Le bus lui-même, `Event` (`Event.ts:117`), étend l'`EventEmitter` de Node avec exactement deux idées
|
|
113
|
+
maison :
|
|
114
|
+
|
|
115
|
+
- `Event.emitAsync()` (`Event.ts:200`) attend les écouteurs **en séquence**, jamais en `Promise.all` —
|
|
116
|
+
l'ordre des effets de bord est prévisible par construction ;
|
|
117
|
+
- `Event.emitAsyncGuarded()` (`Event.ts:257`) isole **chaque** écouteur (try/catch + délai maximal)
|
|
118
|
+
et renvoie `{ results, errors, stopped }` au lieu de laisser le premier rejet faire sauter la suite.
|
|
119
|
+
|
|
120
|
+
Ce dernier porte tout le cycle de vie du kernel via `Kernel.fireLifecycle()` (`Kernel.ts:3254`) : un
|
|
121
|
+
hook de module qui pend ou qui jette ne gèle plus le démarrage du serveur.
|
|
122
|
+
|
|
123
|
+
Le compromis assumé : `Service` **délègue** massivement (18 méthodes d'événements + 6 méthodes de
|
|
124
|
+
container) plutôt que d'exposer ses collaborateurs bruts. C'est un peu de code répétitif dans la
|
|
125
|
+
classe de base, contre deux garanties — le suivi des écouteurs pour `clean()`, et une façade DI
|
|
126
|
+
tolérante qui rend `null` au lieu d'exploser après destruction.
|
|
127
|
+
|
|
128
|
+
## 🚀 Démarrage rapide
|
|
129
|
+
|
|
130
|
+
### Un service d'application, de bout en bout
|
|
131
|
+
|
|
132
|
+
Dans une app générée par `nodefony create app`, un service se déclare sur le **module** qui le
|
|
133
|
+
porte. Voici l'ensemble minimal qui tourne — décoration, construction, journal, événement, wiring :
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
// index.ts — point d'entrée de l'app (`nodefony create app` génère le squelette).
|
|
137
|
+
// En vrai, `CatalogService` vivrait dans `nodefony/services/CatalogService.ts` et
|
|
138
|
+
// serait importé ici ; les deux sont réunis pour que le bloc soit copiable tel quel.
|
|
139
|
+
import { Module, Service, injectable, services } from "nodefony";
|
|
140
|
+
import type { Container, Event, Kernel } from "nodefony";
|
|
141
|
+
|
|
142
|
+
// `@injectable("catalog")` inscrit la CLASSE au registre DI sous le nom "catalog".
|
|
143
|
+
@injectable("catalog")
|
|
144
|
+
class CatalogService extends Service {
|
|
145
|
+
private items = new Map<string, number>();
|
|
146
|
+
|
|
147
|
+
// Le module porteur transmet SES ressources : même container, MÊME bus.
|
|
148
|
+
// C'est ce partage qui permet aux services du module de se parler.
|
|
149
|
+
constructor(module: Module) {
|
|
150
|
+
super(
|
|
151
|
+
"catalog", // clé dans le container — c'est elle qu'on interroge
|
|
152
|
+
module.container as Container,
|
|
153
|
+
module.notificationsCenter as Event,
|
|
154
|
+
module.options.catalog, // sous-section de config du module
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
add(ref: string, qty: number): void {
|
|
159
|
+
this.items.set(ref, qty);
|
|
160
|
+
this.log(`ajout ${ref} ×${qty}`, "INFO"); // msgid = "catalog" par défaut
|
|
161
|
+
this.fire("onCatalogChanged", ref, qty); // synchrone, 0 microtask
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// `@services([...])` déclare les services du module : ils sont instanciés à
|
|
166
|
+
// `onPreBoot`, dans l'ordre CALCULÉ depuis leurs dépendances.
|
|
167
|
+
@services([CatalogService])
|
|
168
|
+
class App extends Module {
|
|
169
|
+
constructor(kernel: Kernel) {
|
|
170
|
+
super("app", kernel, import.meta.url, {});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
override async onKernelReady(): Promise<this> {
|
|
174
|
+
// `this.on(...)` est TRACKÉ → retiré du bus partagé par `clean()`.
|
|
175
|
+
this.on("onCatalogChanged", (ref: string, qty: number) => {
|
|
176
|
+
this.log(`catalogue modifié : ${ref} ×${qty}`, "NOTICE");
|
|
177
|
+
});
|
|
178
|
+
// Le service est au container sous sa clé — jamais un `new` à la main.
|
|
179
|
+
this.get<CatalogService>("catalog")?.add("NF-001", 3);
|
|
180
|
+
return this;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export default App;
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Ce qu'on observe
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
npx nodefony development
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
```text
|
|
194
|
+
DEBUG app SERVICE ADD : catalog # Module.addService a posé l'instance
|
|
195
|
+
INFO catalog ajout NF-001 ×3 # msgid = le nom du service
|
|
196
|
+
NOTICE app catalogue modifié : NF-001 ×3 # l'écouteur du module a reçu l'événement
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Le `msgid` de la deuxième ligne est `catalog` sans qu'on l'ait écrit : `Service.log()`
|
|
200
|
+
(`Service.ts:209`) prend `this.name` par défaut. La trace `SERVICE ADD` vient de
|
|
201
|
+
`Module.addService()` (`Module.ts:313`), qui instancie via l'injecteur puis range l'instance au
|
|
202
|
+
container sous `instance.name`.
|
|
203
|
+
|
|
204
|
+
### Sans kernel ni module — un Service tout seul
|
|
205
|
+
|
|
206
|
+
Un `Service` n'exige **aucune** infrastructure : il se construit dans un test ou un script. C'est ce
|
|
207
|
+
qui rend la classe testable en isolation.
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
import { Service, Container, Event } from "nodefony";
|
|
211
|
+
|
|
212
|
+
const bus = new Event(); // bus PARTAGÉ, fourni par l'appelant
|
|
213
|
+
const container = new Container(); // annuaire DI racine
|
|
214
|
+
|
|
215
|
+
const producer = new Service("worker-a", container, bus);
|
|
216
|
+
const consumer = new Service("worker-b", container, bus);
|
|
217
|
+
|
|
218
|
+
// Tracké : `clean()` saura le retirer du bus partagé.
|
|
219
|
+
consumer.on("onTick", (n: number) => {
|
|
220
|
+
consumer.log(`tick ${n}`, "DEBUG");
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
producer.fire("onTick", 1); // worker-b reçoit — même bus
|
|
224
|
+
|
|
225
|
+
consumer.clean(); // retire SES écouteurs, détache container/syslog/nc
|
|
226
|
+
producer.fire("onTick", 2); // plus personne n'écoute : aucune fuite
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
> [!IMPORTANT]
|
|
230
|
+
> Après `clean()`, toute méthode d'événement du service **lève** (`notificationsCenter not
|
|
231
|
+
initialized`) et `set()` lève aussi (`container not initialized`) — mais `get()` rend `null` en
|
|
232
|
+
> silence. Cette asymétrie est délibérée : lire après destruction est un cas de sortie de route
|
|
233
|
+
> tolérable, **écrire** ne l'est pas.
|
|
234
|
+
|
|
235
|
+
## 🏗️ Architecture interne
|
|
236
|
+
|
|
237
|
+
### Ce que fait le constructeur, dans l'ordre
|
|
238
|
+
|
|
239
|
+
`Service.ts:79` exécute cinq étapes, toutes lisibles en 50 lignes :
|
|
240
|
+
|
|
241
|
+
1. **Identité** — `name` est posé tel quel ; il servira de clé container et de `msgid` syslog.
|
|
242
|
+
2. **Container** — celui qu'on fournit, sinon un `new Container()` frais (`Service.ts:86`).
|
|
243
|
+
3. **Kernel + syslog** — récupérés depuis le container ; si le syslog manque, un `Syslog` est créé
|
|
244
|
+
avec `moduleName = this.name` puis **posé au container** pour les suivants (`Service.ts:95`).
|
|
245
|
+
4. **Bus** — les trois formes ci-dessous (`Service.ts:106`).
|
|
246
|
+
5. **Nettoyage des options** — la clé `events` est **supprimée** de `options` après usage
|
|
247
|
+
(`Service.ts:131`).
|
|
248
|
+
|
|
249
|
+
> [!WARNING]
|
|
250
|
+
> L'étape 5 utilise `delete` et **pas** `= undefined`, volontairement : des consommateurs parcourent
|
|
251
|
+
> `for (… in this.options)` et appellent `.path` sur chaque valeur — ils supposent la clé **absente**.
|
|
252
|
+
> Le gain de _hidden class_ V8 d'un `= undefined` serait annulé par les gardes `if (!v) continue` à
|
|
253
|
+
> ajouter partout.
|
|
254
|
+
|
|
255
|
+
### Les trois formes de bus — trois situations réelles
|
|
256
|
+
|
|
257
|
+
Le troisième argument du constructeur décide de tout. Choisis-le en fonction de **qui doit entendre**.
|
|
258
|
+
|
|
259
|
+
| Tu passes… | Le service obtient… | Quand c'est le bon choix |
|
|
260
|
+
| --------------------- | ------------------------------------------------ | -------------------------------------------------------------- |
|
|
261
|
+
| un `Event` existant | ce **bus partagé** (`#sharedNc = true`) | service d'un module / du kernel : il doit parler aux voisins |
|
|
262
|
+
| `undefined` ou `null` | un **bus dédié**, créé pour lui | brique autonome, aucun voisin à prévenir |
|
|
263
|
+
| `false` | **aucun bus** — les méthodes d'événements lèvent | pur utilitaire, sans signal à émettre : 0 allocation d'`Event` |
|
|
264
|
+
|
|
265
|
+
**Situation 1 — un service de module.** Le module te tend son bus, tu le transmets : ton service et
|
|
266
|
+
tous ceux du module s'entendent, sans se connaître.
|
|
267
|
+
|
|
268
|
+
```typescript ignore
|
|
269
|
+
super(
|
|
270
|
+
"catalog",
|
|
271
|
+
module.container as Container,
|
|
272
|
+
module.notificationsCenter as Event,
|
|
273
|
+
);
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
**Situation 2 — une brique isolée.** Rien à prévenir, personne à écouter : laisse le troisième
|
|
277
|
+
argument vide. Le bus est créé (`Service.ts:117`) et, s'il n'y a pas de kernel partageant le même
|
|
278
|
+
container, il est publié sous la clé `notificationsCenter` pour que d'autres puissent le retrouver
|
|
279
|
+
(`Service.ts:121`).
|
|
280
|
+
|
|
281
|
+
**Situation 3 — un pur utilitaire.** Un helper qui ne signale rien : `false`. Aucun `Event` n'est
|
|
282
|
+
alloué, et `options` n'est **pas** fusionné avec les défauts (`Service.ts:88`) — ce que le contre-cas
|
|
283
|
+
suivant illustre :
|
|
284
|
+
|
|
285
|
+
```typescript ignore
|
|
286
|
+
new Service("calc", container, false, { foo: "bar" }); // ✅ options.foo conservé, 0 bus
|
|
287
|
+
new Service("calc", container, false).fire("x"); // ❌ lève : notificationsCenter not initialized
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Écouteurs trackés — la mécanique anti-fuite
|
|
291
|
+
|
|
292
|
+
C'est **la** raison d'être de la délégation. Chaque écouteur posé par l'API du service
|
|
293
|
+
(`Service.on()` (`Service.ts:373`), `once`, `addListener`, `prependListener`…) est enregistré dans la
|
|
294
|
+
carte privée `#trackedListeners` (`Service.ts:74`) via `Service.trackListener()` (`Service.ts:282`).
|
|
295
|
+
|
|
296
|
+
```mermaid
|
|
297
|
+
sequenceDiagram
|
|
298
|
+
participant S as Service
|
|
299
|
+
participant T as "carte des écouteurs trackés"
|
|
300
|
+
participant B as Event (bus partagé)
|
|
301
|
+
S->>B: on("onTick", fn)
|
|
302
|
+
S->>T: trackListener("onTick", fn)
|
|
303
|
+
Note over S,B: le service vit, émet, écoute
|
|
304
|
+
S->>T: clean() lit la carte
|
|
305
|
+
S->>B: removeListener("onTick", fn)
|
|
306
|
+
S->>T: clear()
|
|
307
|
+
Note over S: syslog / nc / container / kernel = null
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
`Service.clean()` (`Service.ts:179`) ne retire les écouteurs que si le bus est **partagé** : sur un
|
|
311
|
+
bus dédié, l'objet entier part au ramasse-miettes avec le service, il n'y a rien à décrocher.
|
|
312
|
+
|
|
313
|
+
### Cycle de vie
|
|
314
|
+
|
|
315
|
+
<!-- prettier-ignore -->
|
|
316
|
+
| Étape | Appel | Ce qui se passe |
|
|
317
|
+
| --- | --- | --- |
|
|
318
|
+
| Naissance | `new Service(name, container, nc, options)` | câblage des trois broches, écouteurs de config attachés |
|
|
319
|
+
| Démarrage | `init(owner)` — **optionnel, à toi de l'écrire** | appelé UNE fois au boot par le module qui porte le service (`Module.ts:377`), sous garde (délai maximal + criticité du module). Reçoit son propriétaire, donc sa configuration résolue. C'est ici que se fait tout ce qui demande un `await` : connexion, chargement, préchauffage. ⚠️ `init`, pas `initialize` — `initialize()` est le hook du **Controller**, appelé à chaque requête |
|
|
320
|
+
| Journal | `Service.initSyslog()` (`Service.ts:199`) | démarre la sortie console (environnement + verbosité + filtres) |
|
|
321
|
+
| Vie | `log` / `fire` / `on` / `get` | délégation vers syslog, bus et container |
|
|
322
|
+
| Destruction | `Service.clean()` (`Service.ts:179`) | retire les écouteurs trackés, remet syslog/nc/container/kernel à vide |
|
|
323
|
+
| Destruction+ | `clean(true)` | appelle en plus `Syslog.reset()` — les transports sont fermés |
|
|
324
|
+
|
|
325
|
+
`clean()` est **idempotent** : le rappeler ne lève pas.
|
|
326
|
+
|
|
327
|
+
## 🧰 API publique
|
|
328
|
+
|
|
329
|
+
Les signatures exactes vivent dans le graphe TSDoc (`.ai/symbols.json`) ; ce qui suit est l'usage.
|
|
330
|
+
|
|
331
|
+
### Dépendances — la façade container
|
|
332
|
+
|
|
333
|
+
| Appel | Ancre | Comportement |
|
|
334
|
+
| ------------------------ | ---------------- | --------------------------------------------------------------- |
|
|
335
|
+
| `get<T>(name)` | `Service.ts:427` | l'instance typée, ou **`null`** si absente ou après `clean()` |
|
|
336
|
+
| `set(name, obj)` | `Service.ts:435` | enregistre — **lève** si le container est détaché |
|
|
337
|
+
| `remove(name)` | `Service.ts:447` | si la cible est un `Service`, appelle son `clean()` **d'abord** |
|
|
338
|
+
| `has(name)` | `Service.ts:477` | `false` plutôt qu'une erreur quand le container est détaché |
|
|
339
|
+
| `getParameters(path)` | `Service.ts:506` | lecture par chemin pointé (`"kernel.environment"`) |
|
|
340
|
+
| `setParameters(path, v)` | `Service.ts:514` | écriture par chemin pointé — **lève** si détaché |
|
|
341
|
+
|
|
342
|
+
Cette façade est **tolérante en lecture, stricte en écriture**. Le détail du container lui-même
|
|
343
|
+
(scopes par requête, arbre de paramètres, héritage prototypal) est traité dans
|
|
344
|
+
[injection-portees](../../../docs/architecture/injection-portees.md) — `Container.enterScope()` (`Container.ts:293`),
|
|
345
|
+
`Container.leaveScope()` (`Container.ts:312`) et `Container.scopeCount()` (`Container.ts:330`) pour
|
|
346
|
+
les sondes de fuite.
|
|
347
|
+
|
|
348
|
+
### Journal
|
|
349
|
+
|
|
350
|
+
| Appel | Ancre | Usage |
|
|
351
|
+
| ----------------------------------- | ---------------- | ------------------------------------------- |
|
|
352
|
+
| `log(pci, severity?, msgid?, msg?)` | `Service.ts:209` | le point d'entrée de **tout** log Nodefony |
|
|
353
|
+
| `logger(pci, …)` | `Service.ts:266` | raccourci `DEBUG` + `console.debug` formaté |
|
|
354
|
+
| `trace(pci, …)` | `Service.ts:231` | idem avec `console.trace` (pile d'appels) |
|
|
355
|
+
|
|
356
|
+
`log()` est **increvable** : sans syslog il fabrique un `Pdu` directement, et toute exception y est
|
|
357
|
+
attrapée pour retomber sur `console` (`Service.ts:218`). Un service qui journalise ne peut pas faire
|
|
358
|
+
tomber le process à cause du journal. Sévérités et transports : [syslog](syslog.md).
|
|
359
|
+
|
|
360
|
+
### Événements
|
|
361
|
+
|
|
362
|
+
| Appel | Ancre | Note |
|
|
363
|
+
| ------------------------------------- | ---------------- | --------------------------------------------------------------- |
|
|
364
|
+
| `fire(name, …)` / `emit(name, …)` | `Service.ts:272` | synchrone, **0 microtask** — le défaut sur le hot path |
|
|
365
|
+
| `fireAsync(name, …)` / `emitAsync(…)` | `Service.ts:277` | attend les écouteurs asynchrones, **en séquence** |
|
|
366
|
+
| `emitAsyncGuarded(name, options?, …)` | `Service.ts:296` | isole chaque écouteur — **boot / jobs uniquement** |
|
|
367
|
+
| `on` / `once` / `addListener` | `Service.ts:350` | **trackés** → retirés par `clean()` |
|
|
368
|
+
| `off` / `removeListener` | `Service.ts:412` | retirent aussi l'entrée de suivi |
|
|
369
|
+
| `listen(name, listener)` | `Service.ts:317` | bind sur `this`, **non tracké** — renvoie un déclencheur |
|
|
370
|
+
| `settingsToListen(settings, ctx)` | `Service.ts:398` | câble les clés `onXxx` d'un objet de config |
|
|
371
|
+
| `removeAllListeners(name?)` | `Service.ts:374` | ⚠️ sur un bus partagé, vide **aussi** les écouteurs des voisins |
|
|
372
|
+
|
|
373
|
+
Le contrat `EventEmitter` complet (`listenerCount`, `eventNames`, `rawListeners`, `prependListener`,
|
|
374
|
+
`setMaxListeners`…) est délégué à l'identique.
|
|
375
|
+
|
|
376
|
+
### `emitAsyncGuarded` — la garde du cycle de vie
|
|
377
|
+
|
|
378
|
+
Options purement **mécaniques** (`IGuardedEmitOptions`, `Event.ts:66`) : la **politique** reste à
|
|
379
|
+
l'appelant.
|
|
380
|
+
|
|
381
|
+
| Option | Effet |
|
|
382
|
+
| ----------------- | ------------------------------------------------------------------------------------------- |
|
|
383
|
+
| `timeoutMs` | délai maximal par écouteur. `0`/absent = **aucun timer alloué** |
|
|
384
|
+
| `warnMs` | seuil de lenteur. `0`/absent = **aucune mesure** (pas un seul `Date.now`) |
|
|
385
|
+
| `onListenerError` | appelé sur rejet **ou** dépassement ; renvoyer `true` **arrête** la chaîne (`Event.ts:320`) |
|
|
386
|
+
| `onListenerSlow` | appelé quand un écouteur réussit mais dépasse `warnMs` (`Event.ts:305`) |
|
|
387
|
+
|
|
388
|
+
Le résultat (`IGuardedEmitResult`, `Event.ts:86`) porte `results`, `errors` et `stopped`. En cas de
|
|
389
|
+
dépassement, l'erreur remontée est une `Error` explicite (`Event.ts:317`) — jamais la sentinelle
|
|
390
|
+
interne `timeoutSentinel` (`Event.ts:33`).
|
|
391
|
+
|
|
392
|
+
Côté kernel, `Kernel.fireLifecycle()` (`Kernel.ts:3254`) branche la politique : délai issu de
|
|
393
|
+
`Kernel.bootTimeoutMs()` (`Kernel.ts:2625`) — 20 s en développement, 60 s en production, surchargeable
|
|
394
|
+
par `NF_BOOT_TIMEOUT_MS` — et seuil de lenteur `Kernel.bootWarnMs()` (`Kernel.ts:2637`), 5 s par
|
|
395
|
+
défaut. Un hook lent est **signalé** (NOTICE), un hook qui pend est **coupé**.
|
|
396
|
+
|
|
397
|
+
## ⚙️ Options du service
|
|
398
|
+
|
|
399
|
+
Le quatrième argument du constructeur. Toutes les clés non listées sont conservées telles quelles et
|
|
400
|
+
restent lisibles via `this.options` — c'est le canal de configuration d'un service.
|
|
401
|
+
|
|
402
|
+
| Option | Type | Défaut effectif | Effet |
|
|
403
|
+
| -------------------- | ----------------------- | ------------------ | ----------------------------------------------------------------------- |
|
|
404
|
+
| `events.nbListeners` | `number` | **10** (Node) | limite d'écouteurs avant l'avertissement `MaxListeners` |
|
|
405
|
+
| `syslog` | `SyslogDefaultSettings` | `moduleName: name` | réglages du `Syslog` **créé** par ce service (ignoré s'il en hérite un) |
|
|
406
|
+
| `onXxx` | `function` | — | écouteur auto-attaché à l'événement `Xxx` (convention `/^on(.+)$/`) |
|
|
407
|
+
| _(toute autre clé)_ | libre | — | config propre au service, lisible dans `this.options` |
|
|
408
|
+
|
|
409
|
+
> [!WARNING]
|
|
410
|
+
> **`events.nbListeners` n'a pas de défaut effectif à 20.** La constante `defaultOptions`
|
|
411
|
+
> (`Service.ts:17`) annonce `20`, mais elle n'est jamais appliquée : la propagation lit le paramètre
|
|
412
|
+
> **brut** du constructeur (`Service.ts:114` et `Service.ts:119`), pas `this.options` fusionné. Sans
|
|
413
|
+
> valeur explicite, la limite reste celle de Node — **10**. Passe-la si un bus partagé dépasse la
|
|
414
|
+
> dizaine d'abonnés.
|
|
415
|
+
|
|
416
|
+
### La convention `onXxx` — et son piège
|
|
417
|
+
|
|
418
|
+
Une clé d'options qui commence par `on` suivi d'au moins un caractère est câblée comme écouteur. Mais
|
|
419
|
+
**pas par le même chemin** selon la forme du bus :
|
|
420
|
+
|
|
421
|
+
- **bus partagé** → `Service.attachConfiguredListeners()` (`Service.ts:140`) passe par `this.on`,
|
|
422
|
+
donc l'écouteur est **tracké** et `clean()` le retirera ;
|
|
423
|
+
- **bus dédié** → c'est le constructeur d'`Event` qui appelle `Event.settingsToListen()`
|
|
424
|
+
(`Event.ts:147`), lequel utilise `Event.listen()` (`Event.ts:171`) : l'écouteur est **bindé, non
|
|
425
|
+
tracké**. Sans conséquence, puisque le bus meurt avec le service.
|
|
426
|
+
|
|
427
|
+
C'est exactement le correctif qui empêche une fuite d'écouteurs par instance sur un bus partagé.
|
|
428
|
+
|
|
429
|
+
## 🧩 Extension — déclarer ses services
|
|
430
|
+
|
|
431
|
+
### Les trois décorateurs
|
|
432
|
+
|
|
433
|
+
| Décorateur | Ancre | Rôle |
|
|
434
|
+
| ------------------- | ------------------------ | ------------------------------------------------------------------ |
|
|
435
|
+
| `@injectable(nom?)` | `kernelDecorator.ts:82` | inscrit la **classe** au registre DI (défaut : `constructor.name`) |
|
|
436
|
+
| `@inject("nom")` | `kernelDecorator.ts:114` | injecte un service par nom sur un **paramètre** de constructeur |
|
|
437
|
+
| `@services([…])` | `kernelDecorator.ts:24` | déclare les services d'un module — instanciés à `onPreBoot` |
|
|
438
|
+
|
|
439
|
+
`@injectable` accepte aussi un objet `{ name?, scope? }` où `scope` vaut `singleton` (défaut) ou
|
|
440
|
+
`transient` — une instance neuve à chaque résolution (`injector.ts:160`). Il n'existe **ni**
|
|
441
|
+
`singleton: true`, **ni** `factory`, **ni** scope `request` : le scope par requête est une notion du
|
|
442
|
+
container hiérarchique, pas du DI (voir [injection-portees](../../../docs/architecture/injection-portees.md)).
|
|
443
|
+
|
|
444
|
+
> [!CAUTION]
|
|
445
|
+
> Le décorateur de **propriété** `@Inject` existe dans le code (`kernelDecorator.ts:143`) mais n'est
|
|
446
|
+
> **pas ré-exporté** par le paquet `nodefony` : une app ne peut pas l'importer. Injecte par
|
|
447
|
+
> **constructeur** (`@inject`), qui est le chemin supporté.
|
|
448
|
+
|
|
449
|
+
### L'ordre d'écriture ne décide plus du boot
|
|
450
|
+
|
|
451
|
+
Historiquement, un service devait être listé **avant** ses consommateurs dans `@services([…])` :
|
|
452
|
+
déplacer une classe de trois lignes suffisait à casser le serveur au runtime. Aujourd'hui, l'ordre se
|
|
453
|
+
**calcule** — `orderServicesByDependencies()` (`serviceOrder.ts:71`), appelé par le décorateur
|
|
454
|
+
(`kernelDecorator.ts:80`), fait un tri topologique **stable** depuis les dépendances déclarées
|
|
455
|
+
(`@inject` puis `design:paramtypes`). Une liste déjà correcte ressort inchangée.
|
|
456
|
+
|
|
457
|
+
```typescript ignore
|
|
458
|
+
@services([Consumer, Dependency]) // ✅ l'ordre écrit n'a plus d'importance
|
|
459
|
+
class MyModule extends Module {}
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
### Deux annuaires, et le pont entre eux
|
|
463
|
+
|
|
464
|
+
C'est le point qui surprend le plus. `@injectable("Router")` indexe une **classe** ; `super("router", …)`
|
|
465
|
+
indexe une **instance** au container. Les deux chaînes n'ont aucune raison d'être égales, et le
|
|
466
|
+
décorateur ne peut pas connaître la seconde : il s'exécute au **chargement** de la classe, `super()`
|
|
467
|
+
seulement à la **construction**.
|
|
468
|
+
|
|
469
|
+
Le pont est appris au seul instant où le couple est connu — quand l'instance est posée au container :
|
|
470
|
+
`Injector.rememberContainerKey()` (`injector.ts:88`), appelé depuis `Module.addService()`
|
|
471
|
+
(`Module.ts:365`). Toute résolution ultérieure passe alors par la classe et retrouve **cette**
|
|
472
|
+
instance, au lieu d'en fabriquer une seconde au cache vide.
|
|
473
|
+
|
|
474
|
+
Les cycles sont détectés à l'instanciation, avec le chemin complet dans le message
|
|
475
|
+
(`injector.ts:262`).
|
|
476
|
+
|
|
477
|
+
### Charger un service depuis un chemin
|
|
478
|
+
|
|
479
|
+
`Module.loadService()` (`Module.ts:405`) accepte un spécificateur de module (`import()` dynamique) et
|
|
480
|
+
délègue à `addService`. Utile pour un service optionnel dont la présence dépend de la configuration.
|
|
481
|
+
|
|
482
|
+
## 🔐 Intégrité du boot — jamais de dégradation silencieuse
|
|
483
|
+
|
|
484
|
+
Un service qu'on ne peut pas **construire** suit exactement la même politique qu'un service qu'on ne
|
|
485
|
+
peut pas **initialiser** : `Module.handleServiceBootError()` (`Module.ts:417`) délègue au verdict du
|
|
486
|
+
kernel, qui tranche selon deux axes.
|
|
487
|
+
|
|
488
|
+
| Contexte | Verdict |
|
|
489
|
+
| --------------------------------------------------- | --------------------------------------------------------------- |
|
|
490
|
+
| Production **+** module critique | **fatal** — l'erreur remonte, le boot s'interrompt |
|
|
491
|
+
| Développement **+** module critique | fail-soft **ANNONCÉ** : agrégé au BootReport → « boot DÉGRADÉ » |
|
|
492
|
+
| `static override critical = false` (`Module.ts:79`) | fail-soft annoncé **même en production** |
|
|
493
|
+
| Erreur de configuration | fatal quel que soit l'environnement |
|
|
494
|
+
|
|
495
|
+
Deux garanties complémentaires, vérifiées par les tests d'attaque : un service dont la construction
|
|
496
|
+
échoue **n'est pas** au container (pas de demi-instance), et le message d'erreur est **actionnable** —
|
|
497
|
+
il nomme le service manquant, celui qui le réclame, et ce qu'il faut faire (`injector.ts:188`).
|
|
498
|
+
|
|
499
|
+
> [!IMPORTANT]
|
|
500
|
+
> Le scénario que cette politique interdit est vécu : un serveur démarrant « UP », ports à l'écoute,
|
|
501
|
+
> et répondant en erreur sur **chaque** requête parce qu'un service manquait. Un boot amputé doit se
|
|
502
|
+
> **déclarer** amputé.
|
|
503
|
+
|
|
504
|
+
## ⚡ Performance & mémoire
|
|
505
|
+
|
|
506
|
+
`Service` est dans le chemin de **chaque** requête (le contexte HTTP/WS en hérite). Les choix
|
|
507
|
+
mesurables :
|
|
508
|
+
|
|
509
|
+
- **Court-circuit sans abonné** — `emitAsync` (`Event.ts:208`) et `emitAsyncGuarded` (`Event.ts:264`)
|
|
510
|
+
sortent sur `listenerCount() === 0` : **0 allocation, 0 microtask**. Un hook optionnel que personne
|
|
511
|
+
n'écoute ne coûte rien. Le test compte les allocations, pas les intentions : `listenerCount` n'alloue
|
|
512
|
+
pas, là où `rawListeners` **copie** le tableau interne à chaque appel.
|
|
513
|
+
- **Pas d'`await` gratuit** — `emitAsync` n'attend que si l'écouteur renvoie réellement un thenable
|
|
514
|
+
(`Event.ts:209`) : un hook synchrone ne paie aucune microtask, et l'ordre séquentiel reste garanti.
|
|
515
|
+
- **Timers seulement si demandés** — `emitAsyncGuarded` n'alloue 1 timer + 1 promesse de course par
|
|
516
|
+
écouteur que si `timeoutMs > 0` ; le timer est `unref()` (`Event.ts:291`) et un rejet arrivant après
|
|
517
|
+
la course perdue est neutralisé (`Event.ts:280`) pour ne pas devenir un rejet non géré.
|
|
518
|
+
- **Aucune fuite d'écouteurs** — le suivi `#trackedListeners` (`Service.ts:53`) rend `clean()` exact
|
|
519
|
+
sur un bus partagé.
|
|
520
|
+
- **Bus optionnel** — `notificationsCenter: false` n'alloue **aucun** `Event`.
|
|
521
|
+
|
|
522
|
+
> [!WARNING]
|
|
523
|
+
> `emitAsyncGuarded` n'a **rien à faire dans le hot path**. Il est dimensionné pour le boot, le cycle
|
|
524
|
+
> de vie et les jobs — appelés une poignée de fois par process. Le pipeline HTTP/WS garde `emitAsync`
|
|
525
|
+
> nu. Toute modification de `Service.ts` / `Event.ts` passe par le gate mémoire
|
|
526
|
+
> (skill `nodefony-check-memory-health`) avant commit.
|
|
527
|
+
|
|
528
|
+
## 📡 Observabilité — Studio
|
|
529
|
+
|
|
530
|
+
Les services d'un module sont introspectables sans lire le code :
|
|
531
|
+
|
|
532
|
+
- **API** — `GET /nodefony/kernel/api/module/{name}` (`KernelAdminApi.ts:1109`) renvoie un tableau
|
|
533
|
+
`services: [{ name, class }]`, construit depuis `Module.getServiceNames()` (`Module.ts:393`) croisé
|
|
534
|
+
avec le container (`KernelAdminApi.ts:1139`).
|
|
535
|
+
- **Écran** — la page de détail d'un module (`studio/frontend/src/routes/ModuleDetail.tsx`) affiche
|
|
536
|
+
cette liste à côté de la config, des docs et des symboles du module.
|
|
537
|
+
- **Sonde de fuite** — `Container.scopeCount(name)` (`Container.ts:330`) donne le nombre de scopes
|
|
538
|
+
**vivants** : un compteur qui monte sans jamais redescendre signale un `leaveScope` manquant.
|
|
539
|
+
|
|
540
|
+
## ⚠️ Pièges (symptôme → cause → correction)
|
|
541
|
+
|
|
542
|
+
| Symptôme | Cause (dans le code) | Correction |
|
|
543
|
+
| ------------------------------------------------------- | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
|
|
544
|
+
| Fuite d'écouteurs, une de plus par instance | écouteur posé **directement** sur le bus partagé, hors de l'API du service | passer par `Service.on()`, qui appelle `trackListener` (`Service.ts:282`) |
|
|
545
|
+
| `off()` ne retire rien | `Service.listen()` (`Service.ts:317`) **bind** — la référence posée diffère | retirer via le déclencheur renvoyé, jamais l'original |
|
|
546
|
+
| Les écouteurs des voisins disparaissent | `removeAllListeners()` (`Service.ts:419`) agit sur le bus **partagé** en entier | cibler l'événement, ou retirer écouteur par écouteur |
|
|
547
|
+
| `notificationsCenter not initialized` | bus à `false`, ou appel après `clean()` (`Service.ts:62`) | ne pas émettre après destruction ; vérifier le 3ᵉ argument du constructeur |
|
|
548
|
+
| `container not initialized` sur un `set()` | écriture après `clean()` (`Service.ts:435`) | revoir l'ordre du cycle de vie ; `get()`, lui, rend `null` |
|
|
549
|
+
| Avertissement `MaxListeners` à 11 abonnés | le défaut annoncé (20) n'est pas appliqué (`Service.ts:17`) | passer `{ events: { nbListeners: N } }` explicitement |
|
|
550
|
+
| Le déclencheur de `listen()` passe un argument en trop | `Event.listen()` (`Event.ts:171`) préfixe les arguments par le nom de l'événement | lire le 1ᵉʳ argument comme le nom, ou émettre via `fire()` |
|
|
551
|
+
| Écouteurs asynchrones exécutés l'un après l'autre | `emitAsync` est **séquentiel par design** (`Event.ts:200`) | comportement attendu ; paralléliser **dans** l'écouteur si besoin |
|
|
552
|
+
| Le service est reconstruit, son cache vide | clé container ≠ nom `@injectable`, pont non appris (`injector.ts:88`) | passer par `Module.addService()` — jamais un `new` manuel |
|
|
553
|
+
| Un service déclaré n'est pas au container après le boot | sa construction a échoué, fail-soft **annoncé** (`Module.ts:365`) | lire le BootReport / les ERROR de démarrage ; en prod le boot aurait échoué |
|
|
554
|
+
| `options.events` introuvable après construction | la clé est **supprimée** volontairement (`Service.ts:131`) | lire la valeur avant, ou la conserver sous une autre clé |
|
|
555
|
+
|
|
556
|
+
## 🧪 Tests & couverture
|
|
557
|
+
|
|
558
|
+
Quatre angles couvrent la brique — les chiffres exacts vivent dans la carte de l'aperçu, régénérée
|
|
559
|
+
depuis vitest, jamais figés ici :
|
|
560
|
+
|
|
561
|
+
- **Unitaires — le socle** : `Service.test.ts` couvre construction (les trois formes de bus,
|
|
562
|
+
réutilisation du syslog, suppression de `options.events`), délégation container, les 18 méthodes
|
|
563
|
+
d'événements, le journal sévérité par sévérité, `initSyslog`, l'héritage et le partage de container
|
|
564
|
+
entre deux services.
|
|
565
|
+
- **Unitaires — l'anti-fuite** : le cœur de `clean()` est prouvé point par point — retrait sur bus
|
|
566
|
+
partagé, **non**-retrait des écouteurs des autres services, retrait des écouteurs injectés par
|
|
567
|
+
config (`Service.test.ts:731`).
|
|
568
|
+
- **Unitaires — le bus** : `Event.test.ts` (construction par settings, `listen`, `fire`, `emitAsync`,
|
|
569
|
+
cas limites, charge) et `EventGuarded.test.ts` (isolation, délai maximal, `stopped`, et la
|
|
570
|
+
non-régression du court-circuit `emitAsync`).
|
|
571
|
+
- **Unitaires — l'ordre** : `serviceOrder.test.ts` verrouille le tri topologique stable.
|
|
572
|
+
- **Tests d'attaque** : `services.attack.test.ts` attaque l'**intégrité du boot** — construction qui
|
|
573
|
+
échoue en production sur module critique (fatal attendu), fail-soft **annoncé** au BootReport,
|
|
574
|
+
absence du service au container, message d'erreur actionnable, ordre d'écriture inversé, et
|
|
575
|
+
divergence entre nom de classe et clé container.
|
|
576
|
+
|
|
577
|
+
Ce qui **manque** : aucun banc de charge dédié à `Service`/`Event`. La pression réelle est mesurée en
|
|
578
|
+
bout de chaîne, par le gate mémoire du pipeline HTTP/WS (`memory.test.ts`, skill
|
|
579
|
+
`nodefony-check-memory-health`) — c'est là qu'une fuite d'écouteurs se voit.
|
|
580
|
+
|
|
581
|
+
Couverture : `npm run coverage` dans `src/nodefony`.
|
|
582
|
+
|
|
583
|
+
## 🔗 Pour aller plus loin
|
|
584
|
+
|
|
585
|
+
- ⬆️ **Retour au hub** : [@nodefony/core — vue d'ensemble](index.md) · [Toute la documentation](../../../docs/index.md)
|
|
586
|
+
- 🧭 **Pages sœurs** : [Syslog (PDU, sévérités, transports)](syslog.md) · [Kernel & modules](kernel.md) · [RequestContext (ALS)](request-context.md) · [Client isomorphe](client.md)
|
|
587
|
+
|
|
588
|
+
- Portées d'injection et cycle des scopes → [injection-portees](../../../docs/architecture/injection-portees.md)
|
|
589
|
+
- Qui émet quelle phase, et dans quel ordre → [cycle-boot-kernel](../../../docs/architecture/cycle-boot-kernel.md)
|
|
590
|
+
- Où le `Service` se retrouve sur une requête → [pipeline-requete](../../../docs/architecture/pipeline-requete.md)
|