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
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
//#region src/client/realtime/localEvents.ts
|
|
2
|
+
/**
|
|
3
|
+
* localEvents — **noms des événements LOCAUX du client temps réel**.
|
|
4
|
+
*
|
|
5
|
+
* Ces six noms ne voyagent jamais sur le fil : ils ne servent qu'à propager, dans
|
|
6
|
+
* la page, ce que le client vient d'apprendre (changement d'état de connexion,
|
|
7
|
+
* identité résolue au welcome, échantillon de statistiques, notice normalisée,
|
|
8
|
+
* refus de canal). Ils partagent la table de `on()`/`off()` avec les canaux
|
|
9
|
+
* réseau ; le double soulignement est ce qui les en distingue.
|
|
10
|
+
*
|
|
11
|
+
* **La table est la source unique**, exactement pour la même raison que
|
|
12
|
+
* {@link PLATFORM_CHANNELS} l'est pour les canaux réseau : une chaîne recopiée
|
|
13
|
+
* dans un écran est une chaîne qui survivra au renommage suivant. Celle-ci avait
|
|
14
|
+
* déjà divergé — `"__state__"` était écrit en clair dans les trois gabarits
|
|
15
|
+
* d'application, dans la barre de debug et dans la console d'administration,
|
|
16
|
+
* sans qu'aucune constante ne l'exporte.
|
|
17
|
+
*
|
|
18
|
+
* Un consommateur n'a d'ailleurs pas à les connaître : `onState`, `onIdentity`,
|
|
19
|
+
* `onStats`, `onNotice`, `onDenied` et `onReconnect` sont les portes publiques. La table existe
|
|
20
|
+
* pour les implémentations (le client lui-même, ses observateurs agnostiques) et
|
|
21
|
+
* pour un test qui veut se brancher au plus bas niveau.
|
|
22
|
+
*
|
|
23
|
+
* Pur et isomorphe (aucun import, aucune allocation).
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Événements locaux du {@link RealtimeClient} — jamais émis ni reçus par le réseau.
|
|
27
|
+
*
|
|
28
|
+
* @see {@link RealtimeClient.onState} · {@link RealtimeClient.onIdentity} ·
|
|
29
|
+
* {@link RealtimeClient.onStats} · {@link RealtimeClient.onNotice} ·
|
|
30
|
+
* {@link RealtimeClient.onDenied} — les portes publiques à préférer partout.
|
|
31
|
+
*/
|
|
32
|
+
const LOCAL_EVENTS = {
|
|
33
|
+
/** État de la connexion (`"connected" | "reconnecting" | …`), à chaque transition. */
|
|
34
|
+
state: "__state__",
|
|
35
|
+
/** Identité résolue par le serveur au welcome ; `null` après un `disconnect()`. */
|
|
36
|
+
identity: "__identity__",
|
|
37
|
+
/** Tick d'échantillonnage des statistiques par canal (1×/s), sans charge utile. */
|
|
38
|
+
stats: "__stats__",
|
|
39
|
+
/** Notice normalisée (criticité temps réel interprétée). */
|
|
40
|
+
notice: "__notice__",
|
|
41
|
+
/** Refus d'un canal poussé par le serveur (`realtime:denied`). */
|
|
42
|
+
denied: "__denied__",
|
|
43
|
+
/** Tentative de reconnexion programmée (numéro d'essai, délai, échéance). */
|
|
44
|
+
reconnect: "__reconnect__"
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Vrai si `event` est un événement local du client (jamais un canal réseau).
|
|
48
|
+
*
|
|
49
|
+
* Sert aux couches qui inspectent la table des abonnements — une barre de debug,
|
|
50
|
+
* un inventaire de canaux — et qui doivent écarter ce qui n'est pas du trafic.
|
|
51
|
+
*/
|
|
52
|
+
function isLocalEvent(event) {
|
|
53
|
+
return event === LOCAL_EVENTS.state || event === LOCAL_EVENTS.identity || event === LOCAL_EVENTS.stats || event === LOCAL_EVENTS.notice || event === LOCAL_EVENTS.denied || event === LOCAL_EVENTS.reconnect;
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
export { LOCAL_EVENTS, isLocalEvent };
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
//#region src/client/realtime/notice.ts
|
|
2
|
+
/**
|
|
3
|
+
* Traduit un refus de canal (`realtime:denied`, {@link IRealtimeDenied}) en
|
|
4
|
+
* {@link NodefonyNotice}. Pendant FRAME du {@link closeCodeToNotice} (qui traite
|
|
5
|
+
* la fermeture de la CONNEXION) : ici la connexion vit, seul l'abonnement à CE
|
|
6
|
+
* canal n'a pas abouti.
|
|
7
|
+
*
|
|
8
|
+
* Le message SUIT le motif, parce que les trois n'appellent pas le même geste :
|
|
9
|
+
* un accès refusé demande une élévation de droits, un plafond atteint demande de
|
|
10
|
+
* libérer un abonnement, un canal sans producteur demande de relire son nom. Un
|
|
11
|
+
* « accès refusé » affiché sur une faute de frappe envoie chercher un droit qui
|
|
12
|
+
* n'a jamais manqué. Ce qui reste générique, et le restera, c'est le DÉTAIL de la
|
|
13
|
+
* politique : le serveur ne dit jamais quel rôle ou quel scope manque.
|
|
14
|
+
*
|
|
15
|
+
* @param denied - `{ channel, reason }` reçu du serveur.
|
|
16
|
+
* @returns une notice prête à afficher (toujours, contrairement au close-code).
|
|
17
|
+
*/
|
|
18
|
+
function deniedToNotice(denied) {
|
|
19
|
+
const message = denied.reason === "unknown" ? `Canal « ${denied.channel} » inconnu du serveur : personne ne le produit (nom exact ? module chargé ?)` : denied.reason === "limit" ? `Canal « ${denied.channel} » non ouvert : trop d'abonnements sur cette connexion` : `Accès au canal « ${denied.channel} » refusé`;
|
|
20
|
+
return {
|
|
21
|
+
level: denied.reason === "unknown" ? "warning" : "error",
|
|
22
|
+
title: "Temps réel",
|
|
23
|
+
message,
|
|
24
|
+
source: "realtime",
|
|
25
|
+
ts: Date.now()
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Traduit un **code de fermeture WebSocket** (RFC 6455 §7.4) en {@link NodefonyNotice}
|
|
30
|
+
* — pendant CLIENT du `toWsCloseCode` serveur (`@nodefony/http`). Pur, sans état,
|
|
31
|
+
* donc trivialement testable et réutilisable.
|
|
32
|
+
*
|
|
33
|
+
* Retourne `null` pour une fermeture **propre** (1000) ou **attendue** (1001 going
|
|
34
|
+
* away = restart serveur, le reconnect rétablit) : pas de bruit inutile.
|
|
35
|
+
*
|
|
36
|
+
* @param code - code de fermeture reçu (`CloseEvent.code`).
|
|
37
|
+
* @param reason - description optionnelle (`CloseEvent.reason`), ajoutée au message.
|
|
38
|
+
* @returns une notice à afficher, ou `null` si la fermeture ne mérite aucune alerte.
|
|
39
|
+
*/
|
|
40
|
+
function closeCodeToNotice(code, reason) {
|
|
41
|
+
if (code === 1e3 || code === 1001) return null;
|
|
42
|
+
let level = "warning";
|
|
43
|
+
let message;
|
|
44
|
+
switch (code) {
|
|
45
|
+
case 1002:
|
|
46
|
+
level = "error";
|
|
47
|
+
message = "Erreur de protocole temps réel";
|
|
48
|
+
break;
|
|
49
|
+
case 1003:
|
|
50
|
+
level = "error";
|
|
51
|
+
message = "Données temps réel non supportées";
|
|
52
|
+
break;
|
|
53
|
+
case 1006:
|
|
54
|
+
message = "Connexion temps réel perdue";
|
|
55
|
+
break;
|
|
56
|
+
case 1007:
|
|
57
|
+
level = "error";
|
|
58
|
+
message = "Trame temps réel invalide";
|
|
59
|
+
break;
|
|
60
|
+
case 1008:
|
|
61
|
+
level = "error";
|
|
62
|
+
message = "Accès temps réel refusé";
|
|
63
|
+
break;
|
|
64
|
+
case 1009:
|
|
65
|
+
message = "Message temps réel trop volumineux";
|
|
66
|
+
break;
|
|
67
|
+
case 1010:
|
|
68
|
+
level = "error";
|
|
69
|
+
message = "Extension temps réel requise manquante";
|
|
70
|
+
break;
|
|
71
|
+
case 1011:
|
|
72
|
+
level = "error";
|
|
73
|
+
message = "Erreur serveur temps réel";
|
|
74
|
+
break;
|
|
75
|
+
case 4004:
|
|
76
|
+
level = "error";
|
|
77
|
+
message = "Ressource temps réel introuvable";
|
|
78
|
+
break;
|
|
79
|
+
default: message = typeof code === "number" ? `Connexion temps réel fermée (code ${code})` : "Connexion temps réel fermée";
|
|
80
|
+
}
|
|
81
|
+
const trimmed = reason?.trim();
|
|
82
|
+
return {
|
|
83
|
+
level,
|
|
84
|
+
title: "Temps réel",
|
|
85
|
+
message: trimmed ? `${message} : ${trimmed}` : message,
|
|
86
|
+
source: "realtime",
|
|
87
|
+
code,
|
|
88
|
+
ts: Date.now()
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Close codes (RFC 6455 §7.4 + privés Nodefony 4xxx) après lesquels une
|
|
93
|
+
* reconnexion automatique est INUTILE ou NUISIBLE — la cause ne disparaît pas en
|
|
94
|
+
* réessayant : fin propre (1000), erreurs de protocole/négociation
|
|
95
|
+
* (1002/1003/1007/1010), violation de politique = 401/403 mappés (1008), et
|
|
96
|
+
* ressource introuvable (4004, privé Nodefony). Une boucle de reco sur ces codes
|
|
97
|
+
* martèle le serveur pour rien (vécu : un anonyme sur un endpoint protégé).
|
|
98
|
+
*/
|
|
99
|
+
const FATAL_CLOSE_CODES = /* @__PURE__ */ new Set([
|
|
100
|
+
1e3,
|
|
101
|
+
1002,
|
|
102
|
+
1003,
|
|
103
|
+
1007,
|
|
104
|
+
1008,
|
|
105
|
+
1010,
|
|
106
|
+
4004
|
|
107
|
+
]);
|
|
108
|
+
/**
|
|
109
|
+
* Faut-il tenter une reconnexion après ce close code WebSocket ? Pendant CLIENT
|
|
110
|
+
* de la sémantique RFC 6455 §7.4 émise par le serveur (`toWsCloseCode`).
|
|
111
|
+
*
|
|
112
|
+
* `false` pour les fermetures DÉFINITIVES (cf {@link FATAL_CLOSE_CODES}) : l'app
|
|
113
|
+
* doit agir (ex. login après un 1008) puis rétablir explicitement (`connect()` /
|
|
114
|
+
* `retryNow()`). `true` pour les transitoires (1001 restart, 1006 perte réseau,
|
|
115
|
+
* 1011 erreur serveur, code absent/inconnu) où la reconnexion a une chance.
|
|
116
|
+
*
|
|
117
|
+
* @param code - close code reçu (`CloseEvent.code`), ou `undefined` (anormal).
|
|
118
|
+
* @returns `true` si une reconnexion auto est pertinente.
|
|
119
|
+
*/
|
|
120
|
+
function isReconnectableCloseCode(code) {
|
|
121
|
+
if (code === void 0) return true;
|
|
122
|
+
return !FATAL_CLOSE_CODES.has(code);
|
|
123
|
+
}
|
|
124
|
+
//#endregion
|
|
125
|
+
export { closeCodeToNotice, deniedToNotice, isReconnectableCloseCode };
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { PLATFORM_CHANNELS } from "../../realtime/platformChannels.js";
|
|
2
|
+
import { RealtimeClient } from "./RealtimeClient.js";
|
|
3
|
+
//#region src/client/realtime/observe.ts
|
|
4
|
+
/**
|
|
5
|
+
* observe — **socle agnostique des liaisons de vue** du client temps réel.
|
|
6
|
+
*
|
|
7
|
+
* Souscrire à un canal, tenir une dernière valeur, borner un journal, filtrer par
|
|
8
|
+
* sévérité, se désabonner proprement : rien de tout cela n'appartient à React, à
|
|
9
|
+
* Vue, à Angular ni à Svelte. Ce qui leur appartient — la SEULE chose qu'une
|
|
10
|
+
* liaison a le droit de contenir — c'est la traduction *rappel + libération →
|
|
11
|
+
* réactivité locale* : un `useState`, un `ref`, un `signal`, une rune.
|
|
12
|
+
*
|
|
13
|
+
* Chaque fonction de ce module a donc la même forme, et c'est tout le contrat :
|
|
14
|
+
*
|
|
15
|
+
* ```
|
|
16
|
+
* observeX(client, …arguments, emit) → dispose
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* `emit` est appelé avec la valeur courante ; `dispose` coupe tout. Une liaison
|
|
20
|
+
* s'écrit alors en trois lignes dans n'importe quel framework, et les onze règles
|
|
21
|
+
* qui vivaient dans les hooks React — précédence de la socket fournie, cycle de
|
|
22
|
+
* connexion, appariement `on`↔`subscribe`, format coalescé du journal, tailles
|
|
23
|
+
* d'anneau, canal par défaut — n'existent qu'ICI.
|
|
24
|
+
*
|
|
25
|
+
* Pourquoi ce module existe : sans lui, porter les douze hooks vers trois autres
|
|
26
|
+
* fronts donnait **quatre implémentations de la même règle**, qui divergent en
|
|
27
|
+
* silence. Le dépôt l'a déjà payé — `"__state__"` était recopié en dur dans les
|
|
28
|
+
* trois gabarits, et la convention de cadence avait été fabriquée à la main trois
|
|
29
|
+
* fois côté navigateur avant d'être centralisée.
|
|
30
|
+
*
|
|
31
|
+
* Zéro dépendance à un framework de vue, zéro DOM : ce fichier tourne dans un
|
|
32
|
+
* test Node comme dans un bundle navigateur.
|
|
33
|
+
*
|
|
34
|
+
* @module nodefony/client
|
|
35
|
+
*/
|
|
36
|
+
/**
|
|
37
|
+
* Résout la socket partagée d'une adresse — ou adopte celle qu'on lui donne —
|
|
38
|
+
* et rend de quoi la démarrer sans jamais la couper.
|
|
39
|
+
*
|
|
40
|
+
* Trois règles tiennent dans cette fonction, et c'est pour cela qu'elle existe :
|
|
41
|
+
*
|
|
42
|
+
* 1. **`client` l'emporte sur `url`** ; une socket fournie appartient à
|
|
43
|
+
* l'application.
|
|
44
|
+
* 2. **`connect()` est idempotent et son rejet est avalé** — le double montage
|
|
45
|
+
* du mode strict de React n'ouvre pas deux sockets, et un serveur absent au
|
|
46
|
+
* premier essai ne remonte pas une erreur non gérée.
|
|
47
|
+
* 3. **Jamais de `disconnect()` au démontage.** La connexion appartient à la
|
|
48
|
+
* PAGE, pas au composant : couper ici tranche les requêtes en vol des autres
|
|
49
|
+
* consommateurs de la même socket partagée. C'est une régression déjà vécue.
|
|
50
|
+
*
|
|
51
|
+
* Recopiée dans une quatrième liaison, la règle 3 se perd — elle est en creux
|
|
52
|
+
* (« ne pas faire »), donc invisible à la relecture.
|
|
53
|
+
*
|
|
54
|
+
* @example La voie simple, dans n'importe quel framework :
|
|
55
|
+
* ```ts
|
|
56
|
+
* const live = connectShared({ url: "/api/live/realtime" });
|
|
57
|
+
* live.start();
|
|
58
|
+
* observeChannelData(live.socket, "live:events", (e) => setDernier(e));
|
|
59
|
+
* ```
|
|
60
|
+
*
|
|
61
|
+
* @throws si ni `url` ni `client` ne sont fournis — l'adresse dépend de
|
|
62
|
+
* l'application, le framework n'en devine aucune.
|
|
63
|
+
*/
|
|
64
|
+
function connectShared(opts) {
|
|
65
|
+
const provided = opts.client;
|
|
66
|
+
const socket = provided ?? RealtimeClient.shared({ url: opts.url });
|
|
67
|
+
const owned = !provided;
|
|
68
|
+
return {
|
|
69
|
+
socket,
|
|
70
|
+
owned,
|
|
71
|
+
start() {
|
|
72
|
+
if (!owned) return;
|
|
73
|
+
socket.connect().catch(() => {});
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Observe l'état de la connexion. `emit` reçoit l'état courant **immédiatement**,
|
|
79
|
+
* puis à chaque transition — une liaison n'a donc rien à initialiser à part.
|
|
80
|
+
*/
|
|
81
|
+
function observeState(client, emit) {
|
|
82
|
+
emit(client.state);
|
|
83
|
+
return client.onState(emit);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Observe l'identité résolue par le serveur au welcome (`null` tant qu'aucun
|
|
87
|
+
* welcome n'est arrivé, et après un `disconnect()` volontaire). `emit` reçoit la
|
|
88
|
+
* valeur courante immédiatement, puis à chaque (re)welcome.
|
|
89
|
+
*
|
|
90
|
+
* Brique du gating d'écran : `authenticated: false` → écran de connexion, sans
|
|
91
|
+
* route `/auth/me`.
|
|
92
|
+
*/
|
|
93
|
+
function observeIdentity(client, emit) {
|
|
94
|
+
emit(client.identity);
|
|
95
|
+
return client.onIdentity(emit);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Observe les **tentatives de reconnexion** programmées par le back-off :
|
|
99
|
+
* numéro d'essai, délai retenu, échéance absolue. De quoi rendre un compte à
|
|
100
|
+
* rebours plutôt qu'un « déconnecté » muet.
|
|
101
|
+
*
|
|
102
|
+
* Contrairement aux autres observateurs, rien n'est émis à la souscription : une
|
|
103
|
+
* tentative est un ÉVÉNEMENT, pas un état — il n'y a pas de « valeur courante »
|
|
104
|
+
* à rejouer, et en inventer une afficherait un compte à rebours périmé.
|
|
105
|
+
*/
|
|
106
|
+
function observeReconnect(client, emit) {
|
|
107
|
+
return client.onReconnect(emit);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Observe un canal pub/sub : `emit` est appelé pour chaque message reçu.
|
|
111
|
+
*
|
|
112
|
+
* L'appariement `on`↔`subscribe` et `dispose`↔`unsubscribe` n'est pas réécrit
|
|
113
|
+
* ici : c'est {@link RealtimeClient.channel} qui l'encapsule, et le rejouer
|
|
114
|
+
* mettrait la même règle deux fois dans le cœur. L'abonnement serveur est
|
|
115
|
+
* ref-compté (N observateurs du même canal = un seul abonnement réseau) et
|
|
116
|
+
* rejoué à chaque reconnexion.
|
|
117
|
+
*/
|
|
118
|
+
function observeChannel(client, channel, emit) {
|
|
119
|
+
const handle = client.channel(channel);
|
|
120
|
+
handle.on((payload) => emit(payload));
|
|
121
|
+
handle.open();
|
|
122
|
+
return () => handle.close();
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Observe la **dernière valeur** reçue sur un canal — le cas le plus courant
|
|
126
|
+
* (dernière mesure d'un flux d'état). `emit` reçoit `initial` immédiatement,
|
|
127
|
+
* puis chaque nouvelle valeur : dernier arrivé gagne.
|
|
128
|
+
*/
|
|
129
|
+
function observeChannelData(client, channel, emit, initial = null) {
|
|
130
|
+
emit(initial);
|
|
131
|
+
return observeChannel(client, channel, (payload) => emit(payload));
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Observe les **statistiques** d'un canal (débit, série du VU-mètre, total),
|
|
135
|
+
* rafraîchies par l'échantillonneur du client une fois par seconde. `emit`
|
|
136
|
+
* reçoit l'instantané courant immédiatement, puis à chaque échantillon.
|
|
137
|
+
*
|
|
138
|
+
* L'instantané est un objet recréé à chaque lecture : une liaison qui exige une
|
|
139
|
+
* référence stable (le store externe de React) ne doit pas s'y brancher
|
|
140
|
+
* directement — c'est pourquoi le hook correspondant tient un état local.
|
|
141
|
+
*/
|
|
142
|
+
function observeChannelStats(client, channel, emit) {
|
|
143
|
+
const read = () => client.getChannelStats(channel) ?? null;
|
|
144
|
+
emit(read());
|
|
145
|
+
return client.onStats(() => emit(read()));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Clé de **re-liaison** d'un canal en cadence adaptative.
|
|
149
|
+
*
|
|
150
|
+
* Trois valeurs, et trois seulement, doivent défaire puis refaire l'abonnement :
|
|
151
|
+
* le canal de base, la cadence désirée et l'interrupteur adaptatif. Ni le
|
|
152
|
+
* gestionnaire, ni le reste des réglages — leur identité change à chaque rendu
|
|
153
|
+
* dans la plupart des frameworks, et re-lier à chaque rendu couperait le flux en
|
|
154
|
+
* boucle.
|
|
155
|
+
*
|
|
156
|
+
* Chaque liaison a besoin de cette clé sous une forme différente (liste de
|
|
157
|
+
* dépendances React, source d'un `watch` Vue, `$effect` Svelte) ; ce qui doit
|
|
158
|
+
* rester commun, c'est **ce qu'elle contient**.
|
|
159
|
+
*/
|
|
160
|
+
function adaptiveRebindKey(base, desiredMs, enabled = true) {
|
|
161
|
+
return `${base}|${desiredMs}|${enabled ? 1 : 0}`;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Observe un canal d'ÉTAT en **cadence adaptative** (AIMD piloté par le client) :
|
|
165
|
+
* la cadence recule sous famine et remonte quand c'est sain, sans changement
|
|
166
|
+
* serveur. `emit` reçoit chaque frame à travers les changements de cadence.
|
|
167
|
+
*
|
|
168
|
+
* Réservé aux canaux latest-wins : décimer un canal d'événements perd des
|
|
169
|
+
* messages.
|
|
170
|
+
*
|
|
171
|
+
* @param desiredMs - cadence souhaitée (ms).
|
|
172
|
+
* @param options - réglages AIMD ; `onRate` reste disponible pour afficher la
|
|
173
|
+
* cadence effective dans un badge.
|
|
174
|
+
* @returns la poignée du binding (cadence courante, canal effectif, `dispose`).
|
|
175
|
+
*/
|
|
176
|
+
function observeAdaptiveChannel(client, base, emit, desiredMs, options = {}) {
|
|
177
|
+
return client.adaptiveChannel(base, (...args) => emit(args[0]), {
|
|
178
|
+
...options,
|
|
179
|
+
intervalMs: desiredMs
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Lit l'instantané courant. Purement local : aucune trame n'est émise, rien
|
|
184
|
+
* n'est demandé au serveur — afficher cet état ne coûte donc rien au réseau.
|
|
185
|
+
*/
|
|
186
|
+
function socketSnapshot(client) {
|
|
187
|
+
return {
|
|
188
|
+
url: client.url,
|
|
189
|
+
state: client.state,
|
|
190
|
+
channels: client.subscribedChannels,
|
|
191
|
+
frames: client.framesReceived,
|
|
192
|
+
unsent: client.framesUnsent,
|
|
193
|
+
lastFrame: {
|
|
194
|
+
method: client.lastFrameMethod,
|
|
195
|
+
at: client.lastFrameAt
|
|
196
|
+
},
|
|
197
|
+
reconnectAttempts: client.reconnectAttempts,
|
|
198
|
+
nextRetryAt: client.nextRetryAt,
|
|
199
|
+
identity: client.identity
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Observe l'instantané : `emit` reçoit la valeur courante immédiatement, puis à
|
|
204
|
+
* chaque échantillon du client (une fois par seconde) et à chaque changement
|
|
205
|
+
* d'état — les deux seuls moments où il peut avoir bougé de façon visible.
|
|
206
|
+
*
|
|
207
|
+
* L'horloge est celle de l'échantillonneur DÉJÀ en place ; une liaison qui
|
|
208
|
+
* poserait son propre `setInterval` ajouterait un second réveil par seconde
|
|
209
|
+
* pour la même mesure.
|
|
210
|
+
*/
|
|
211
|
+
function observeSnapshot(client, emit) {
|
|
212
|
+
const pousser = () => emit(socketSnapshot(client));
|
|
213
|
+
pousser();
|
|
214
|
+
const offStats = client.onStats(pousser);
|
|
215
|
+
const offState = client.onState(pousser);
|
|
216
|
+
return () => {
|
|
217
|
+
offStats();
|
|
218
|
+
offState();
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/** Taille par défaut de l'anneau du journal. */
|
|
222
|
+
const SYSLOG_RING_DEFAULT = 500;
|
|
223
|
+
/** Taille par défaut de l'anneau des notices. */
|
|
224
|
+
const NOTICE_RING_DEFAULT = 50;
|
|
225
|
+
/**
|
|
226
|
+
* Observe le **journal du serveur** : anneau borné, filtre de sévérité, et
|
|
227
|
+
* surtout le format **coalescé** du canal (`{ logs: Pdu[], dropped }`) autant que
|
|
228
|
+
* l'entrée unique. `emit` reçoit le tableau complet à chaque changement — une
|
|
229
|
+
* nouvelle référence, directement affichable.
|
|
230
|
+
*
|
|
231
|
+
* Le format coalescé est du **protocole serveur** : le décoder dans une liaison
|
|
232
|
+
* de vue, c'est le redécoder dans les trois suivantes. C'est la pire des règles
|
|
233
|
+
* qui vivaient côté React.
|
|
234
|
+
*
|
|
235
|
+
* Le canal par défaut vient de la table des canaux de plateforme — jamais d'une
|
|
236
|
+
* chaîne écrite en clair, que le prochain renommage laisserait derrière lui.
|
|
237
|
+
*/
|
|
238
|
+
function observeSyslog(client, emit, opts = {}) {
|
|
239
|
+
const { max = SYSLOG_RING_DEFAULT, severities, channel = PLATFORM_CHANNELS.syslog } = opts;
|
|
240
|
+
let entries = [];
|
|
241
|
+
emit(entries);
|
|
242
|
+
return observeChannel(client, channel, (payload) => {
|
|
243
|
+
const record = payload;
|
|
244
|
+
const incoming = record && Array.isArray(record.logs) ? record.logs : [payload];
|
|
245
|
+
const kept = severities ? incoming.filter((entry) => severities.includes(entry.severity ?? "")) : incoming;
|
|
246
|
+
if (kept.length === 0) return;
|
|
247
|
+
const next = entries.concat(kept);
|
|
248
|
+
entries = next.length > max ? next.slice(-max) : next;
|
|
249
|
+
emit(entries);
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Observe les **notices normalisées** du client : criticités qui cassent le temps
|
|
254
|
+
* réel (codes de fermeture RFC 6455 interprétés), erreurs poussées par le
|
|
255
|
+
* serveur, rétablissement de connexion. `emit` est appelé pour CHAQUE notice —
|
|
256
|
+
* de quoi brancher un centre de notifications.
|
|
257
|
+
*
|
|
258
|
+
* À monter **une seule fois** par page, sans quoi les notifications se dupliquent.
|
|
259
|
+
*/
|
|
260
|
+
function observeNotices(client, emit) {
|
|
261
|
+
return client.onNotice(emit);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Observe un **historique borné** des dernières notices, filtrable par source :
|
|
265
|
+
* un journal léger des incidents temps réel, distinct des notifications
|
|
266
|
+
* éphémères. `emit` reçoit le tableau complet à chaque changement.
|
|
267
|
+
*/
|
|
268
|
+
function observeNoticeLog(client, emit, opts = {}) {
|
|
269
|
+
const { max = NOTICE_RING_DEFAULT, sources } = opts;
|
|
270
|
+
let notices = [];
|
|
271
|
+
emit(notices);
|
|
272
|
+
return observeNotices(client, (notice) => {
|
|
273
|
+
if (sources && !sources.includes(notice.source)) return;
|
|
274
|
+
const next = notices.concat(notice);
|
|
275
|
+
notices = next.length > max ? next.slice(-max) : next;
|
|
276
|
+
emit(notices);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
//#endregion
|
|
280
|
+
export { adaptiveRebindKey, connectShared, observeAdaptiveChannel, observeChannel, observeChannelData, observeChannelStats, observeIdentity, observeNoticeLog, observeNotices, observeReconnect, observeSnapshot, observeState, observeSyslog, socketSnapshot };
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
//#region src/client/roles/registry.ts
|
|
2
|
+
/**
|
|
3
|
+
* Nombre maximum de rôles qu'un {@link RoleRegistry} peut indexer en masque `number`.
|
|
4
|
+
*
|
|
5
|
+
* Les opérateurs bit-à-bit de JavaScript travaillent sur des entiers **32 bits signés** :
|
|
6
|
+
* `1 << 31` devient négatif et `1 << 32` repart à `1`. On réserve donc les bits 0..30
|
|
7
|
+
* (31 rôles) pour rester sur des masques positifs sûrs. Au-delà → utiliser les chaînes
|
|
8
|
+
* ({@link RoleSet}) ou un futur registre `BigInt`.
|
|
9
|
+
*/
|
|
10
|
+
const ROLE_MASK_CAPACITY = 31;
|
|
11
|
+
/**
|
|
12
|
+
* Registre OPTIONNEL qui assigne un bit à chaque rôle d'un ENSEMBLE FIXE, pour des
|
|
13
|
+
* contrôles d'autorisation en masque (`&`/`|`) — O(1), sans allocation, adapté au hot path
|
|
14
|
+
* serveur (voters, pipeline sécurité) quand les rôles sont connus à l'avance.
|
|
15
|
+
*
|
|
16
|
+
* ⚠️ Inadapté aux rôles DYNAMIQUES (créés en base à l'exécution) : ils n'ont pas de bit
|
|
17
|
+
* fixe → rester sur les chaînes ({@link hasRole}, {@link RoleSet}).
|
|
18
|
+
* ⚠️ Capacité = {@link ROLE_MASK_CAPACITY} rôles (limite 32 bits de JS).
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* const reg = new RoleRegistry().define("ROLE_DEV", "ROLE_SUPERVISOR");
|
|
22
|
+
* const userMask = reg.mask(["ROLE_DEV"]);
|
|
23
|
+
* RoleRegistry.hasAny(userMask, reg.mask(["ROLE_DEV", "ROLE_SUPERVISOR"])); // true
|
|
24
|
+
*/
|
|
25
|
+
var RoleRegistry = class {
|
|
26
|
+
#bits = /* @__PURE__ */ new Map();
|
|
27
|
+
#next = 0;
|
|
28
|
+
/**
|
|
29
|
+
* Déclare un ou plusieurs rôles et leur assigne un bit (idempotent : un rôle déjà
|
|
30
|
+
* connu conserve son bit).
|
|
31
|
+
*
|
|
32
|
+
* @param roles - rôles à enregistrer
|
|
33
|
+
* @returns le registre (chaînable)
|
|
34
|
+
* @throws {RangeError} si la capacité {@link ROLE_MASK_CAPACITY} est dépassée
|
|
35
|
+
*/
|
|
36
|
+
define(...roles) {
|
|
37
|
+
for (const role of roles) {
|
|
38
|
+
if (this.#bits.has(role)) continue;
|
|
39
|
+
if (this.#next >= 31) throw new RangeError(`RoleRegistry: capacité dépassée (31 rôles max en masque 32 bits)`);
|
|
40
|
+
this.#bits.set(role, 1 << this.#next);
|
|
41
|
+
this.#next += 1;
|
|
42
|
+
}
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @param role - rôle recherché
|
|
47
|
+
* @returns le bit du rôle (puissance de 2), ou `0` si inconnu
|
|
48
|
+
*/
|
|
49
|
+
bit(role) {
|
|
50
|
+
return this.#bits.get(role) ?? 0;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Compile une liste de rôles en masque (OR des bits). Les rôles inconnus sont ignorés
|
|
54
|
+
* (bit 0) — les déclarer d'abord via {@link RoleRegistry.define}.
|
|
55
|
+
*
|
|
56
|
+
* @param roles - rôles à encoder
|
|
57
|
+
* @returns le masque binaire
|
|
58
|
+
*/
|
|
59
|
+
mask(roles) {
|
|
60
|
+
let m = 0;
|
|
61
|
+
for (const r of roles) m |= this.#bits.get(r) ?? 0;
|
|
62
|
+
return m;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Décode un masque en liste de rôles (ordre de déclaration).
|
|
66
|
+
*
|
|
67
|
+
* @param mask - masque binaire
|
|
68
|
+
* @returns les rôles dont le bit est positionné
|
|
69
|
+
*/
|
|
70
|
+
roles(mask) {
|
|
71
|
+
const out = [];
|
|
72
|
+
for (const [role, bit] of this.#bits) if ((mask & bit) !== 0) out.push(role);
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Test OR sur masques.
|
|
77
|
+
*
|
|
78
|
+
* @param userMask - masque des rôles de l'utilisateur
|
|
79
|
+
* @param requiredMask - masque des rôles acceptés
|
|
80
|
+
* @returns `true` si l'utilisateur a au moins un des rôles requis
|
|
81
|
+
*/
|
|
82
|
+
static hasAny(userMask, requiredMask) {
|
|
83
|
+
return (userMask & requiredMask) !== 0;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Test AND sur masques.
|
|
87
|
+
*
|
|
88
|
+
* @param userMask - masque des rôles de l'utilisateur
|
|
89
|
+
* @param requiredMask - masque des rôles requis
|
|
90
|
+
* @returns `true` si l'utilisateur a tous les rôles requis
|
|
91
|
+
*/
|
|
92
|
+
static hasAll(userMask, requiredMask) {
|
|
93
|
+
return (userMask & requiredMask) === requiredMask;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
//#endregion
|
|
97
|
+
export { ROLE_MASK_CAPACITY, RoleRegistry };
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
//#region src/client/roles/roles.ts
|
|
2
|
+
/**
|
|
3
|
+
* Indique si l'utilisateur possède `role`.
|
|
4
|
+
*
|
|
5
|
+
* Implémentation sans allocation (parcours linéaire) : optimale pour un contrôle
|
|
6
|
+
* ponctuel sur un petit tableau (cas courant : 1 à 5 rôles dans un JWT). Pour des
|
|
7
|
+
* contrôles répétés contre le même utilisateur, préférer {@link RoleSet} (O(1) après
|
|
8
|
+
* une unique allocation).
|
|
9
|
+
*
|
|
10
|
+
* @param userRoles - rôles portés par l'utilisateur (ex. claim `roles` du JWT)
|
|
11
|
+
* @param role - rôle recherché
|
|
12
|
+
* @returns `true` si `userRoles` contient `role`
|
|
13
|
+
*/
|
|
14
|
+
function hasRole(userRoles, role) {
|
|
15
|
+
return userRoles != null && userRoles.includes(role);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Indique si l'utilisateur possède AU MOINS UN des `roles` (OR logique).
|
|
19
|
+
*
|
|
20
|
+
* @param userRoles - rôles de l'utilisateur
|
|
21
|
+
* @param roles - rôles acceptés (l'un suffit)
|
|
22
|
+
* @returns `true` si l'intersection est non vide ; `false` si `roles` est vide
|
|
23
|
+
* (aucune exigence ne peut être satisfaite)
|
|
24
|
+
*/
|
|
25
|
+
function hasAnyRole(userRoles, roles) {
|
|
26
|
+
if (userRoles == null || roles.length === 0) return false;
|
|
27
|
+
for (const r of roles) if (userRoles.includes(r)) return true;
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Indique si l'utilisateur possède TOUS les `roles` (AND logique).
|
|
32
|
+
*
|
|
33
|
+
* @param userRoles - rôles de l'utilisateur
|
|
34
|
+
* @param roles - rôles tous requis
|
|
35
|
+
* @returns `true` si chaque rôle requis est présent ; `true` si `roles` est vide
|
|
36
|
+
* (aucune exigence — convention de `Array.every`)
|
|
37
|
+
*/
|
|
38
|
+
function hasAllRoles(userRoles, roles) {
|
|
39
|
+
if (roles.length === 0) return true;
|
|
40
|
+
if (userRoles == null) return false;
|
|
41
|
+
for (const r of roles) if (!userRoles.includes(r)) return false;
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Ensemble de rôles indexé pour des contrôles répétés en O(1).
|
|
46
|
+
*
|
|
47
|
+
* À utiliser quand on teste plusieurs fois les rôles d'un même utilisateur (filtrage
|
|
48
|
+
* d'une navigation, rendu conditionnel de N panneaux) : une seule allocation de `Set`,
|
|
49
|
+
* puis chaque `has`/`hasAny`/`hasAll` est O(1)/O(k). Pour un contrôle unique, préférer
|
|
50
|
+
* les fonctions {@link hasRole} & co (zéro allocation).
|
|
51
|
+
*/
|
|
52
|
+
var RoleSet = class {
|
|
53
|
+
#roles;
|
|
54
|
+
/** @param roles - rôles de l'utilisateur (dédoublonnés à la construction) */
|
|
55
|
+
constructor(roles) {
|
|
56
|
+
this.#roles = new Set(roles ?? void 0);
|
|
57
|
+
}
|
|
58
|
+
/** Nombre de rôles distincts. */
|
|
59
|
+
get size() {
|
|
60
|
+
return this.#roles.size;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* @param role - rôle recherché
|
|
64
|
+
* @returns `true` si le rôle est présent (O(1))
|
|
65
|
+
*/
|
|
66
|
+
has(role) {
|
|
67
|
+
return this.#roles.has(role);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* @param roles - rôles acceptés
|
|
71
|
+
* @returns `true` si AU MOINS UN des `roles` est présent (OR)
|
|
72
|
+
*/
|
|
73
|
+
hasAny(roles) {
|
|
74
|
+
for (const r of roles) if (this.#roles.has(r)) return true;
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* @param roles - rôles requis
|
|
79
|
+
* @returns `true` si TOUS les `roles` sont présents (AND ; `true` si liste vide)
|
|
80
|
+
*/
|
|
81
|
+
hasAll(roles) {
|
|
82
|
+
for (const r of roles) if (!this.#roles.has(r)) return false;
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
/** Copie triée des rôles (affichage / sérialisation déterministe). */
|
|
86
|
+
toArray() {
|
|
87
|
+
return [...this.#roles].sort();
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
//#endregion
|
|
91
|
+
export { RoleSet, hasAllRoles, hasAnyRole, hasRole };
|