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,898 @@
|
|
|
1
|
+
import { closeCodeToNotice, deniedToNotice, isReconnectableCloseCode } from "./notice.js";
|
|
2
|
+
import { JsonRpcPeer } from "../../realtime/JsonRpcPeer.js";
|
|
3
|
+
import { LOCAL_EVENTS } from "./localEvents.js";
|
|
4
|
+
import { TransportState } from "../../realtime/IRealtimeTransport.js";
|
|
5
|
+
import { BrowserWsTransport } from "./BrowserWsTransport.js";
|
|
6
|
+
import { announceRealtime, consoleDetails, hasKernel, noteServerEnv } from "../announce.js";
|
|
7
|
+
import { bindAdaptiveChannel } from "./AdaptiveRate.js";
|
|
8
|
+
import { PLATFORM_METHODS } from "../../realtime/platformChannels.js";
|
|
9
|
+
//#region src/client/realtime/RealtimeClient.ts
|
|
10
|
+
/**
|
|
11
|
+
* RealtimeClient — Core isomorphe Nodefony côté navigateur (P14.11).
|
|
12
|
+
*
|
|
13
|
+
* Protocole : JSON-RPC 2.0 maison sur WebSocket (+ HTTP long-polling fallback TODO P13).
|
|
14
|
+
* State machine : disconnected → connecting → connected → reconnecting → error.
|
|
15
|
+
*
|
|
16
|
+
* Features :
|
|
17
|
+
* - reconnect exponentiel avec back-off
|
|
18
|
+
* - pub/sub (on/off/emit) — notifications JSON-RPC sans id
|
|
19
|
+
* - request/response — RPC bidirectionnel typé
|
|
20
|
+
* - streaming — chunks `{ id, stream: { chunk, done } }` pour LLM token-by-token
|
|
21
|
+
*
|
|
22
|
+
* Le backend WS de référence (RealtimeService) sera implémenté en P13.4.
|
|
23
|
+
* En attendant, ce client peut parler à n'importe quel serveur JSON-RPC 2.0.
|
|
24
|
+
*/
|
|
25
|
+
/** Taille max du ring du log protocole (inspecteur realtime). */
|
|
26
|
+
const FRAME_LOG_MAX = 300;
|
|
27
|
+
/** Clés sensibles masquées dans le log protocole (sécurité — jamais de secret en clair). */
|
|
28
|
+
const FRAME_REDACT_RE = /(token|password|secret|api[_-]?key|apikey|authorization|bearer)/i;
|
|
29
|
+
/** Copie d'un payload JSON-RPC avec masquage des champs sensibles (bornée en profondeur). */
|
|
30
|
+
function redactFrame(value, depth = 0) {
|
|
31
|
+
if (depth > 4 || value === null || typeof value !== "object") return value;
|
|
32
|
+
if (Array.isArray(value)) return value.map((v) => redactFrame(v, depth + 1));
|
|
33
|
+
const out = {};
|
|
34
|
+
for (const [k, v] of Object.entries(value)) out[k] = FRAME_REDACT_RE.test(k) ? "[redacted]" : redactFrame(v, depth + 1);
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
var RealtimeClient = class RealtimeClient {
|
|
38
|
+
opts;
|
|
39
|
+
transport = null;
|
|
40
|
+
transportFactory;
|
|
41
|
+
_state = "disconnected";
|
|
42
|
+
peer = new JsonRpcPeer({
|
|
43
|
+
send: (frame) => this.send(frame),
|
|
44
|
+
onNotification: (method, params) => this.dispatchNotification(method, params)
|
|
45
|
+
});
|
|
46
|
+
handlers = /* @__PURE__ */ new Map();
|
|
47
|
+
_subscriptions = /* @__PURE__ */ new Map();
|
|
48
|
+
_welcomed = false;
|
|
49
|
+
reconnectAttempt = 0;
|
|
50
|
+
_nextRetryAt = null;
|
|
51
|
+
reconnectTimer = null;
|
|
52
|
+
heartbeatTimer = null;
|
|
53
|
+
intentionalClose = false;
|
|
54
|
+
_stats = /* @__PURE__ */ new Map();
|
|
55
|
+
_framesReceived = 0;
|
|
56
|
+
_framesUnsent = 0;
|
|
57
|
+
_unsentNotified = true;
|
|
58
|
+
_lastFrameAt = null;
|
|
59
|
+
_lastFrameMethod = null;
|
|
60
|
+
statsTimer = null;
|
|
61
|
+
_prevSampled = /* @__PURE__ */ new Map();
|
|
62
|
+
_rawFrames = null;
|
|
63
|
+
_identity = null;
|
|
64
|
+
_serverChannels = null;
|
|
65
|
+
_serverMethods = null;
|
|
66
|
+
constructor(opts = {}, transportFactory) {
|
|
67
|
+
this.opts = opts;
|
|
68
|
+
this.transportFactory = transportFactory ?? ((url) => new BrowserWsTransport(url));
|
|
69
|
+
this.startStatsSampler();
|
|
70
|
+
announceRealtime(this.opts.banner);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Instance de connexion **partagée par URL** (résolue en absolu) sur
|
|
74
|
+
* `globalThis`. Plusieurs consommateurs d'une même page (ex. Studio + barre de
|
|
75
|
+
* debug) obtiennent la MÊME instance → **une seule socket** WebSocket. Les
|
|
76
|
+
* options ne s'appliquent qu'à la 1ʳᵉ création (les suivantes réutilisent).
|
|
77
|
+
*
|
|
78
|
+
* @param opts - options (au moins `url`), appliquées seulement à la création.
|
|
79
|
+
* @returns l'instance partagée pour cette URL.
|
|
80
|
+
*/
|
|
81
|
+
static shared(opts = {}) {
|
|
82
|
+
const key = RealtimeClient.resolveUrl(opts.url);
|
|
83
|
+
const g = globalThis;
|
|
84
|
+
const map = g.__nfRealtime__ ??= /* @__PURE__ */ new Map();
|
|
85
|
+
let client = map.get(key);
|
|
86
|
+
if (!client) {
|
|
87
|
+
client = new RealtimeClient({
|
|
88
|
+
...opts,
|
|
89
|
+
url: key
|
|
90
|
+
});
|
|
91
|
+
map.set(key, client);
|
|
92
|
+
}
|
|
93
|
+
return client;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Message d'une adresse manquante — LA seule formulation, employée par les
|
|
97
|
+
* deux chemins qui peuvent la constater.
|
|
98
|
+
*
|
|
99
|
+
* Il n'y a **pas** de valeur par défaut, et c'est délibéré : la route dépend
|
|
100
|
+
* de l'application, pas du framework. Deviner `/nodefony/api/realtime` — ce
|
|
101
|
+
* que faisait ce client — donnait une socket qui ne se connecte jamais et se
|
|
102
|
+
* contente de retenter, sans un mot. Un échec franc coûte trente secondes ;
|
|
103
|
+
* une socket silencieusement morte coûte une soirée.
|
|
104
|
+
*/
|
|
105
|
+
static missingUrl() {
|
|
106
|
+
return /* @__PURE__ */ new Error("[nodefony] adresse du serveur temps réel manquante.\n Donne-la explicitement : RealtimeClient.shared({ url: \"/api/live/realtime\" })\n ou, en React : <NodefonyProvider url=\"/api/live/realtime\">\n Il n'y a pas de valeur par défaut : la route dépend de ton application (une application générée monte /api/live/realtime, la console d'administration /nodefony/studio/api/realtime).");
|
|
107
|
+
}
|
|
108
|
+
/** Résout une URL (relative ou absolue) en chaîne absolue stable = clé du singleton. */
|
|
109
|
+
static resolveUrl(url) {
|
|
110
|
+
if (!url) throw RealtimeClient.missingUrl();
|
|
111
|
+
if (typeof window === "undefined") return url;
|
|
112
|
+
try {
|
|
113
|
+
const u = new URL(url, window.location.href);
|
|
114
|
+
if (u.protocol === "http:") u.protocol = "ws:";
|
|
115
|
+
else if (u.protocol === "https:") u.protocol = "wss:";
|
|
116
|
+
return u.toString();
|
|
117
|
+
} catch {
|
|
118
|
+
throw new Error(`[nodefony] adresse du serveur temps réel illisible : ${JSON.stringify(url)}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
get state() {
|
|
122
|
+
return this._state;
|
|
123
|
+
}
|
|
124
|
+
/** Nombre de tentatives de reconnexion depuis la dernière connexion réussie. */
|
|
125
|
+
get reconnectAttempts() {
|
|
126
|
+
return this.reconnectAttempt;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Timestamp (ms epoch) de la prochaine tentative de reconnexion planifiée,
|
|
130
|
+
* `null` hors backoff. Permet un compte à rebours UI synchronisé au vrai délai.
|
|
131
|
+
*/
|
|
132
|
+
get nextRetryAt() {
|
|
133
|
+
return this._nextRetryAt;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Force une reconnexion **immédiate** (annule le backoff en cours). No-op si
|
|
137
|
+
* déjà connecté/connexion en cours.
|
|
138
|
+
*/
|
|
139
|
+
retryNow() {
|
|
140
|
+
if (this._state === "connected" || this._state === "connecting") return;
|
|
141
|
+
if (this.reconnectTimer) {
|
|
142
|
+
clearTimeout(this.reconnectTimer);
|
|
143
|
+
this.reconnectTimer = null;
|
|
144
|
+
}
|
|
145
|
+
this._nextRetryAt = null;
|
|
146
|
+
this.intentionalClose = false;
|
|
147
|
+
this.openSocket().catch(() => {});
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Ouvre la connexion WS. Idempotent — si déjà ouverte, no-op.
|
|
151
|
+
* Resolve une fois `connected` ou reject sur erreur fatale.
|
|
152
|
+
*/
|
|
153
|
+
async connect(url) {
|
|
154
|
+
if (this._state === "connected" || this._state === "connecting") return;
|
|
155
|
+
this.intentionalClose = false;
|
|
156
|
+
this.opts.url = url ?? this.requireUrl();
|
|
157
|
+
return this.openSocket();
|
|
158
|
+
}
|
|
159
|
+
/** L'URL configurée, ou l'échec franc — jamais une valeur devinée. */
|
|
160
|
+
requireUrl() {
|
|
161
|
+
if (!this.opts.url) throw RealtimeClient.missingUrl();
|
|
162
|
+
return this.opts.url;
|
|
163
|
+
}
|
|
164
|
+
disconnect() {
|
|
165
|
+
this.intentionalClose = true;
|
|
166
|
+
this.clearTimers();
|
|
167
|
+
this.transport?.close(1e3, "client disconnect");
|
|
168
|
+
this.peer.dispose("client disconnect");
|
|
169
|
+
this._welcomed = false;
|
|
170
|
+
this._identity = null;
|
|
171
|
+
this._serverChannels = null;
|
|
172
|
+
this._serverMethods = null;
|
|
173
|
+
this.fireLocal(LOCAL_EVENTS.identity, null);
|
|
174
|
+
this.setState("disconnected");
|
|
175
|
+
}
|
|
176
|
+
/** Pub/sub local — handler sur un event server-pushed (notification JSON-RPC). */
|
|
177
|
+
on(event, handler) {
|
|
178
|
+
if (!this.handlers.has(event)) this.handlers.set(event, /* @__PURE__ */ new Set());
|
|
179
|
+
this.handlers.get(event).add(handler);
|
|
180
|
+
return () => this.off(event, handler);
|
|
181
|
+
}
|
|
182
|
+
off(event, handler) {
|
|
183
|
+
this.handlers.get(event)?.delete(handler);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* S'abonne aux **notices normalisées** émises par le client : criticités qui
|
|
187
|
+
* cassent le temps réel (close codes RFC 6455 interprétés via
|
|
188
|
+
* {@link closeCodeToNotice}), erreurs serveur poussées, rétablissement de
|
|
189
|
+
* connexion. Réutilisable par toute app — le centre de notifications (snackbar
|
|
190
|
+
* Studio) s'y branche directement.
|
|
191
|
+
*
|
|
192
|
+
* @param handler - reçoit chaque {@link NodefonyNotice}.
|
|
193
|
+
* @returns dispose (désabonnement).
|
|
194
|
+
*/
|
|
195
|
+
onNotice(handler) {
|
|
196
|
+
return this.on(LOCAL_EVENTS.notice, handler);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* S'abonne aux **refus de canal** poussés par le serveur (`realtime:denied`) :
|
|
200
|
+
* un `subscribe`/push vers un canal protégé sans droit suffisant. Permet une
|
|
201
|
+
* réaction CIBLÉE par canal (griser un contrôle, demander une élévation),
|
|
202
|
+
* complémentaire de {@link onNotice} (UX générique). Event LOCAL `__denied__`.
|
|
203
|
+
*
|
|
204
|
+
* Polymorphisme CLIENT : la réaction est pluggable ici ; l'AUTORITÉ reste
|
|
205
|
+
* serveur (le firewall a déjà décidé, le motif est générique — pas d'oracle).
|
|
206
|
+
*
|
|
207
|
+
* @param handler - reçoit `{ channel, reason }`.
|
|
208
|
+
* @returns dispose (désabonnement).
|
|
209
|
+
*/
|
|
210
|
+
onDenied(handler) {
|
|
211
|
+
return this.on(LOCAL_EVENTS.denied, handler);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Notification one-way client → server (pas de réponse attendue).
|
|
215
|
+
*
|
|
216
|
+
* C'est la SEULE émission dont personne n'apprend l'échec autrement : une
|
|
217
|
+
* requête corrélée est rejetée, un (dés)abonnement est rejoué au reconnect —
|
|
218
|
+
* une notification applicative perdue, elle, ne laisse aucune trace. Si le
|
|
219
|
+
* transport est fermé, l'utilisateur en est donc averti (une fois par épisode
|
|
220
|
+
* de coupure, cf {@link send}).
|
|
221
|
+
*/
|
|
222
|
+
emit(method, params) {
|
|
223
|
+
if (!this._emitRaw(method, params)) this.noticeUnsent();
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Émission interne sans typage strict — utilisée pour les notifications système
|
|
227
|
+
* (`subscribe`, `unsubscribe`, `ping`) qui ne figurent pas dans la map `Emit`
|
|
228
|
+
* utilisateur. Bypasse les types conditionnels de {@link emit}.
|
|
229
|
+
*
|
|
230
|
+
* Ces frames-là **ne préviennent pas** l'utilisateur quand elles se perdent :
|
|
231
|
+
* les abonnements sont rejoués à la reconnexion et le heartbeat est arrêté
|
|
232
|
+
* avec les timers. Avertir ferait paraître comme une perte ce que le client
|
|
233
|
+
* rattrape tout seul — du bruit dans le centre de notifications d'une app qui
|
|
234
|
+
* monte et démonte des vues (le cas de Studio).
|
|
235
|
+
*
|
|
236
|
+
* @returns `false` si le transport n'a pas émis la frame.
|
|
237
|
+
*/
|
|
238
|
+
_emitRaw(method, params) {
|
|
239
|
+
return this.peer.notify(method, params);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Émet sur un canal — verbe socket de {@link IRealtimeSocket.publish}. Côté client =
|
|
243
|
+
* notification au serveur (alias clair de {@link emit}).
|
|
244
|
+
*/
|
|
245
|
+
publish(channel, payload) {
|
|
246
|
+
this.emit(channel, payload);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* S'abonne à un canal pub/sub serveur (**ref-compté**). Émet la notification
|
|
250
|
+
* `subscribe` au serveur UNIQUEMENT au 1er consommateur du canal ; les suivants
|
|
251
|
+
* ne font qu'incrémenter le compteur. Ré-émis automatiquement à chaque
|
|
252
|
+
* `realtime:welcome` — jamais à la simple ouverture de la socket, où le serveur
|
|
253
|
+
* le jetterait sans un mot. NE remplace PAS {@link on} : `on(channel, h)` REÇOIT les
|
|
254
|
+
* messages, `subscribe(channel)` DEMANDE au serveur de les pousser.
|
|
255
|
+
*
|
|
256
|
+
* Autorité unique partagée par le binding `nodefony/react` ET le store Studio →
|
|
257
|
+
* deux consommateurs du même canal ne se coupent plus l'un l'autre.
|
|
258
|
+
*/
|
|
259
|
+
subscribe(channel) {
|
|
260
|
+
const c = channel;
|
|
261
|
+
const n = (this._subscriptions.get(c) ?? 0) + 1;
|
|
262
|
+
this._subscriptions.set(c, n);
|
|
263
|
+
if (n === 1 && this._welcomed) this._emitRaw("subscribe", { channel: c });
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Désabonne un consommateur d'un canal (ref-compté) : émet `unsubscribe` au
|
|
267
|
+
* serveur seulement au **dernier** consommateur. No-op si le canal n'est pas suivi.
|
|
268
|
+
*/
|
|
269
|
+
unsubscribe(channel) {
|
|
270
|
+
const c = channel;
|
|
271
|
+
const cur = this._subscriptions.get(c);
|
|
272
|
+
if (!cur) return;
|
|
273
|
+
if (cur <= 1) {
|
|
274
|
+
this._subscriptions.delete(c);
|
|
275
|
+
if (this._welcomed) this._emitRaw("unsubscribe", { channel: c });
|
|
276
|
+
} else this._subscriptions.set(c, cur - 1);
|
|
277
|
+
}
|
|
278
|
+
/** Canaux actuellement abonnés (≥ 1 consommateur). Lecture seule. */
|
|
279
|
+
get subscribedChannels() {
|
|
280
|
+
return Array.from(this._subscriptions.keys());
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* L'adresse du serveur temps réel, telle qu'elle a été donnée (ou résolue en
|
|
284
|
+
* absolu par {@link shared}). `null` tant qu'aucune n'a été fournie — le
|
|
285
|
+
* framework n'en devine aucune.
|
|
286
|
+
*
|
|
287
|
+
* Publiée pour l'auto-observation : un instantané de socket qui ne dit pas DE
|
|
288
|
+
* QUELLE socket il parle ne sert à rien dès qu'une page en tient plus d'une.
|
|
289
|
+
*/
|
|
290
|
+
get url() {
|
|
291
|
+
return this.opts.url ?? null;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Identité de la connexion, **annoncée par le serveur** au `realtime:welcome`
|
|
295
|
+
* ({@link RealtimeIdentity}). `null` tant qu'aucun welcome n'a été reçu ; une
|
|
296
|
+
* fois reçu, un visiteur anonyme a `authenticated: false` (jamais `null`). Un
|
|
297
|
+
* consommateur (Studio) sait ainsi s'il doit afficher le login **sans taper de
|
|
298
|
+
* route**. Rafraîchie à chaque (re)connexion ; remise à `null` au
|
|
299
|
+
* {@link disconnect} volontaire (logout).
|
|
300
|
+
*/
|
|
301
|
+
get identity() {
|
|
302
|
+
return this._identity;
|
|
303
|
+
}
|
|
304
|
+
/** Canaux pub/sub annoncés par le serveur au welcome (découverte). `null` si pas (encore) reçu. */
|
|
305
|
+
get serverChannels() {
|
|
306
|
+
return this._serverChannels;
|
|
307
|
+
}
|
|
308
|
+
/** Actions RPC annoncées par le serveur au welcome (découverte). `null` si pas (encore) reçu. */
|
|
309
|
+
get serverMethods() {
|
|
310
|
+
return this._serverMethods;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* S'abonne à l'identité résolue (event LOCAL `__identity__`, jamais réseau) :
|
|
314
|
+
* le handler est rappelé à chaque (re)welcome et au `disconnect()`. Permet à
|
|
315
|
+
* l'UI de basculer anonyme↔authentifié sans polling ni route `/auth/me`.
|
|
316
|
+
*
|
|
317
|
+
* @param handler - reçoit la {@link RealtimeIdentity} courante (ou `null`).
|
|
318
|
+
* @returns dispose (désabonnement).
|
|
319
|
+
*/
|
|
320
|
+
onIdentity(handler) {
|
|
321
|
+
return this.on(LOCAL_EVENTS.identity, handler);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* S'abonne à l'**état de la connexion** (event LOCAL `__state__`, jamais réseau) :
|
|
325
|
+
* le handler est rappelé à chaque transition (`connecting`, `connected`,
|
|
326
|
+
* `reconnecting`, `error`, `disconnected`), jamais pour un état inchangé.
|
|
327
|
+
*
|
|
328
|
+
* C'est la porte à employer partout — un badge de connexion, une liaison de vue,
|
|
329
|
+
* une barre de debug. Écrire `on("__state__", …)` en clair marche aussi, mais
|
|
330
|
+
* recopie un nom d'événement interne dans du code applicatif : c'est ce qui a
|
|
331
|
+
* fait diverger les trois gabarits d'application.
|
|
332
|
+
*
|
|
333
|
+
* @param handler - reçoit le nouvel {@link RealtimeState}.
|
|
334
|
+
* @returns dispose (désabonnement).
|
|
335
|
+
*/
|
|
336
|
+
onState(handler) {
|
|
337
|
+
return this.on(LOCAL_EVENTS.state, handler);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* S'abonne au **tick d'échantillonnage des statistiques** (event LOCAL
|
|
341
|
+
* `__stats__`, jamais réseau), émis une fois par seconde après recalcul des
|
|
342
|
+
* débits par canal. Sans charge utile : lire ensuite {@link getChannelStats}
|
|
343
|
+
* ou {@link getStats}, dont les valeurs viennent d'être rafraîchies.
|
|
344
|
+
*
|
|
345
|
+
* @param handler - appelé à chaque échantillon.
|
|
346
|
+
* @returns dispose (désabonnement).
|
|
347
|
+
*/
|
|
348
|
+
onStats(handler) {
|
|
349
|
+
return this.on(LOCAL_EVENTS.stats, handler);
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* S'abonne aux **tentatives de reconnexion programmées** (event LOCAL
|
|
353
|
+
* `__reconnect__`, jamais réseau) : numéro d'essai, délai retenu par le
|
|
354
|
+
* back-off, et échéance absolue. De quoi afficher un compte à rebours plutôt
|
|
355
|
+
* qu'un « déconnecté » muet.
|
|
356
|
+
*
|
|
357
|
+
* @param handler - reçoit `{ attempt, delay, nextRetryAt }`.
|
|
358
|
+
* @returns dispose (désabonnement).
|
|
359
|
+
*/
|
|
360
|
+
onReconnect(handler) {
|
|
361
|
+
return this.on(LOCAL_EVENTS.reconnect, handler);
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Handle « socket-like » d'un canal ({@link IRealtimeChannel}) — fine liaison sur
|
|
365
|
+
* les primitives (`subscribe`/`on`/`publish`/`unsubscribe`), forme naturelle des
|
|
366
|
+
* canaux à état (SIP, bridge) et point d'accroche des couches à venir (codec,
|
|
367
|
+
* cadence, politique). N'ouvre rien : appeler `.open()` pour s'abonner. `kind` reste
|
|
368
|
+
* indéfini côté client tant que le serveur ne l'annonce pas.
|
|
369
|
+
*/
|
|
370
|
+
channel(name) {
|
|
371
|
+
const hub = this;
|
|
372
|
+
const disposers = /* @__PURE__ */ new Set();
|
|
373
|
+
return {
|
|
374
|
+
name,
|
|
375
|
+
on(handler) {
|
|
376
|
+
const dispose = hub.on(name, handler);
|
|
377
|
+
disposers.add(dispose);
|
|
378
|
+
return () => {
|
|
379
|
+
dispose();
|
|
380
|
+
disposers.delete(dispose);
|
|
381
|
+
};
|
|
382
|
+
},
|
|
383
|
+
send(payload) {
|
|
384
|
+
hub.publish(name, payload);
|
|
385
|
+
},
|
|
386
|
+
open() {
|
|
387
|
+
hub.subscribe(name);
|
|
388
|
+
},
|
|
389
|
+
close() {
|
|
390
|
+
for (const d of disposers) d();
|
|
391
|
+
disposers.clear();
|
|
392
|
+
hub.unsubscribe(name);
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* S'abonne à un canal d'ÉTAT en **cadence adaptative** (AIMD client-driven) : la lib
|
|
398
|
+
* mesure la gigue d'arrivée et ré-abonne automatiquement à une cadence plus grossière en
|
|
399
|
+
* cas de famine, plus fine quand c'est sain — sans changement serveur. `handler` reçoit
|
|
400
|
+
* les frames à travers les changements de cadence. Réservé aux canaux latest-wins.
|
|
401
|
+
*
|
|
402
|
+
* @param base - canal de base (sans suffixe de cadence).
|
|
403
|
+
* @param handler - reçoit le payload de chaque frame.
|
|
404
|
+
* @param options - cadence désirée + réglages AIMD (cf {@link BindAdaptiveOptions}).
|
|
405
|
+
* @returns une poignée {@link AdaptiveChannelBinding} (cadence courante + `dispose`).
|
|
406
|
+
*/
|
|
407
|
+
adaptiveChannel(base, handler, options) {
|
|
408
|
+
return bindAdaptiveChannel(this, base, handler, options);
|
|
409
|
+
}
|
|
410
|
+
async request(method, params, timeoutMs = 3e4) {
|
|
411
|
+
if (method.charCodeAt(0) === 47) {
|
|
412
|
+
if (typeof params === "number") timeoutMs = params;
|
|
413
|
+
params = { path: method };
|
|
414
|
+
method = "api.request";
|
|
415
|
+
}
|
|
416
|
+
return this.peer.request(method, params, timeoutMs);
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* **Mutation** API par le pont `api.request` (POST/PUT/PATCH/DELETE) — pendant
|
|
420
|
+
* d'écriture de {@link request} (qui ne fait que des lectures GET). Transporte
|
|
421
|
+
* la méthode HTTP **logique**, le corps, et une **clé d'idempotence**
|
|
422
|
+
* (OBLIGATOIRE côté serveur : une socket reconnecte et peut rejouer une frame
|
|
423
|
+
* en vol → la clé dédoublonne le rejeu, anti double-effet) :
|
|
424
|
+
* ```ts
|
|
425
|
+
* await socket.mutate("/nodefony/security/api/apikeys/42/revoke", {
|
|
426
|
+
* method: "POST", idempotencyKey: crypto.randomUUID(),
|
|
427
|
+
* });
|
|
428
|
+
* ```
|
|
429
|
+
* Échec → rejet {@link RpcError} (`data.status` = statut HTTP équivalent :
|
|
430
|
+
* 400 clé absente, 409 rejeu concurrent, 403 refus, 404 path inconnu…).
|
|
431
|
+
*/
|
|
432
|
+
async mutate(path, init) {
|
|
433
|
+
return this.peer.request("api.request", {
|
|
434
|
+
path,
|
|
435
|
+
method: init.method,
|
|
436
|
+
body: init.body,
|
|
437
|
+
idempotencyKey: init.idempotencyKey
|
|
438
|
+
}, init.timeoutMs ?? 3e4);
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Appel API par la socket rendant l'**enveloppe complète** — le résultat ET
|
|
442
|
+
* la méta serveur — là où {@link request}/{@link mutate} ne rendent que la
|
|
443
|
+
* valeur (forme courante, contrat « snapshot ≡ GET REST »).
|
|
444
|
+
*
|
|
445
|
+
* Utile à l'outillage plus qu'aux applications : en développement, le serveur
|
|
446
|
+
* joint le `requestId` du profil de CETTE frame, ce qui permet d'aller lire sa
|
|
447
|
+
* radiographie (`GET /nodefony/profiler/api/{requestId}` — phases, SQL,
|
|
448
|
+
* décision du firewall). En production le serveur n'émet aucune méta :
|
|
449
|
+
* `requestId` vaut alors `null`, et l'appel coûte exactement le même trafic.
|
|
450
|
+
*
|
|
451
|
+
* ```ts
|
|
452
|
+
* const { result, requestId } = await socket.call("/nodefony/kernel/api/modules");
|
|
453
|
+
* ```
|
|
454
|
+
*
|
|
455
|
+
* Échec → rejet {@link RpcError}, comme {@link request} ; l'id du profil, lui,
|
|
456
|
+
* voyage dans `error.data.requestId` (un refus se radiographie aussi).
|
|
457
|
+
*
|
|
458
|
+
* @param path - chemin de la route (transport WEBSOCKET requis côté serveur).
|
|
459
|
+
* @param init - méthode logique (défaut `GET`), corps, clé d'idempotence.
|
|
460
|
+
*/
|
|
461
|
+
async call(path, init) {
|
|
462
|
+
const { result, meta } = await this.peer.requestTraced("api.request", {
|
|
463
|
+
path,
|
|
464
|
+
method: init?.method ?? "GET",
|
|
465
|
+
body: init?.body,
|
|
466
|
+
idempotencyKey: init?.idempotencyKey
|
|
467
|
+
}, init?.timeoutMs ?? 3e4);
|
|
468
|
+
return {
|
|
469
|
+
result,
|
|
470
|
+
requestId: typeof meta?.requestId === "string" ? meta.requestId : null
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Mesure le round-trip WS via la méthode RPC standard `nodefony:kernel:ping` — helper
|
|
475
|
+
* RÉUTILISABLE par tout consommateur (topbar Studio, debug bar, app user) :
|
|
476
|
+
* la mesure du RTT et la convention `nodefony:kernel:ping` vivent dans la lib cliente,
|
|
477
|
+
* pas dupliquées dans chaque front. Renvoie le payload serveur enrichi de `rtt`
|
|
478
|
+
* (ms, aller-retour mesuré côté client). Lève si le serveur ne répond pas
|
|
479
|
+
* (`request` timeout) ou ne connaît pas la méthode (`-32601`).
|
|
480
|
+
*/
|
|
481
|
+
async ping(timeoutMs = 5e3) {
|
|
482
|
+
const now = () => typeof performance !== "undefined" && typeof performance.now === "function" ? performance.now() : Date.now();
|
|
483
|
+
const t0 = now();
|
|
484
|
+
return {
|
|
485
|
+
...await this.request(PLATFORM_METHODS.ping, void 0, timeoutMs),
|
|
486
|
+
rtt: Math.round(now() - t0)
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
/** Notification SORTANTE typée (pas de réponse). Pendant de {@link emit}/{@link publish}. */
|
|
490
|
+
notify(method, params) {
|
|
491
|
+
this.peer.notify(method, params);
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Expose une action appelable PAR LE PAIR (requête entrante serveur→client).
|
|
495
|
+
* Cœur du duplex débloqué par L0 : sans handler, une requête entrante reçoit
|
|
496
|
+
* `-32601` ; avec, le `result` repart au serveur (confirmation d'action,
|
|
497
|
+
* invalidation de cache poussée, health applicatif serveur→client).
|
|
498
|
+
*/
|
|
499
|
+
register(method, handler) {
|
|
500
|
+
this.peer.register(method, handler);
|
|
501
|
+
}
|
|
502
|
+
/** Retire une action exposée. */
|
|
503
|
+
unregister(method) {
|
|
504
|
+
this.peer.unregister(method);
|
|
505
|
+
}
|
|
506
|
+
/** Actions exposées par CE client (découverte). ≠ {@link serverMethods} (côté serveur). */
|
|
507
|
+
get methods() {
|
|
508
|
+
return this.peer.methods;
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Ingestion d'une frame ENTRANTE déjà parsée → log + classification/route par le
|
|
512
|
+
* moteur. Renvoie sa nature. Une frame `invalid` peut porter une erreur GLOBALE
|
|
513
|
+
* serveur (`{jsonrpc, error}` hors spec JSON-RPC) → notice (cf {@link handleServerError}).
|
|
514
|
+
*/
|
|
515
|
+
receive(frame) {
|
|
516
|
+
this.recordFrame("in", frame);
|
|
517
|
+
const kind = this.peer.receive(frame);
|
|
518
|
+
if (kind === "invalid") this.handleServerError(frame);
|
|
519
|
+
return kind;
|
|
520
|
+
}
|
|
521
|
+
/** Annule les requêtes sortantes en attente (fermeture transport / logout). */
|
|
522
|
+
dispose(reason) {
|
|
523
|
+
this.peer.dispose(reason);
|
|
524
|
+
}
|
|
525
|
+
/** Total de notifications reçues, tous canaux confondus (welcome inclus). */
|
|
526
|
+
get framesReceived() {
|
|
527
|
+
return this._framesReceived;
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Total de frames qui n'ont **pas** pu partir depuis la création du client
|
|
531
|
+
* (transport fermé au moment de l'émission). Reste à `0` en fonctionnement
|
|
532
|
+
* normal ; toute valeur non nulle date d'une coupure ou d'une émission
|
|
533
|
+
* antérieure à la première connexion.
|
|
534
|
+
*/
|
|
535
|
+
get framesUnsent() {
|
|
536
|
+
return this._framesUnsent;
|
|
537
|
+
}
|
|
538
|
+
/** Timestamp (ms) de la dernière notification reçue. */
|
|
539
|
+
get lastFrameAt() {
|
|
540
|
+
return this._lastFrameAt;
|
|
541
|
+
}
|
|
542
|
+
/** `method`/canal de la dernière notification reçue. */
|
|
543
|
+
get lastFrameMethod() {
|
|
544
|
+
return this._lastFrameMethod;
|
|
545
|
+
}
|
|
546
|
+
/** Snapshot des stats par canal (msgCount/rate/series). Les objets sont les
|
|
547
|
+
* refs internes — à LIRE, pas à muter (copier les valeurs si besoin). */
|
|
548
|
+
getStats() {
|
|
549
|
+
return Array.from(this._stats.values());
|
|
550
|
+
}
|
|
551
|
+
/** Stats d'un canal précis (== method JSON-RPC) ou `undefined`. */
|
|
552
|
+
getChannelStats(method) {
|
|
553
|
+
return this._stats.get(method);
|
|
554
|
+
}
|
|
555
|
+
/** Comptabilise une notification entrante (avant dispatch aux handlers). */
|
|
556
|
+
trackFrame(method) {
|
|
557
|
+
const now = Date.now();
|
|
558
|
+
this._framesReceived++;
|
|
559
|
+
this._lastFrameAt = now;
|
|
560
|
+
this._lastFrameMethod = method;
|
|
561
|
+
let st = this._stats.get(method);
|
|
562
|
+
if (!st) {
|
|
563
|
+
st = {
|
|
564
|
+
method,
|
|
565
|
+
msgCount: 0,
|
|
566
|
+
lastMessage: null,
|
|
567
|
+
rate: 0,
|
|
568
|
+
series: []
|
|
569
|
+
};
|
|
570
|
+
this._stats.set(method, st);
|
|
571
|
+
}
|
|
572
|
+
st.msgCount++;
|
|
573
|
+
st.lastMessage = now;
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* (Ré)émet un `subscribe` pour chaque canal ref-compté, à la réception du
|
|
577
|
+
* `realtime:welcome` — le seul instant où le serveur est prêt à l'enregistrer.
|
|
578
|
+
*
|
|
579
|
+
* Ouvrir la socket ne suffit pas : pendant que le serveur authentifie, son
|
|
580
|
+
* transport JSON-RPC n'est pas encore branché et il **jette** les frames
|
|
581
|
+
* entrantes, sans pouvoir répondre — c'est le contrat écrit par
|
|
582
|
+
* `RealtimeController.handleRealtime`. Rejouer sur `onOpen` revenait à parler
|
|
583
|
+
* dans le vide, et perdait en silence deux cas entiers : un `subscribe` posé
|
|
584
|
+
* avant `start()`, et TOUS les abonnements après une reconnexion.
|
|
585
|
+
*
|
|
586
|
+
* Cold path (1×/connexion) : ne parcourt que les canaux réellement suivis, et
|
|
587
|
+
* n'alloue rien.
|
|
588
|
+
*/
|
|
589
|
+
replaySubscriptions() {
|
|
590
|
+
this._welcomed = true;
|
|
591
|
+
for (const channel of this._subscriptions.keys()) this._emitRaw("subscribe", { channel });
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* Ingère le `realtime:welcome` : mémorise l'identité résolue + les capabilities
|
|
595
|
+
* annoncées (canaux/actions découvrables) et émet `__identity__`. Tolérant à un
|
|
596
|
+
* welcome partiel/legacy (champs absents → `null`). Cold path (1×/connexion).
|
|
597
|
+
*/
|
|
598
|
+
ingestWelcome(params) {
|
|
599
|
+
const w = params;
|
|
600
|
+
if (!w || typeof w !== "object") return;
|
|
601
|
+
this._identity = w.identity ?? null;
|
|
602
|
+
this._serverChannels = Array.isArray(w.channels) ? w.channels : null;
|
|
603
|
+
this._serverMethods = Array.isArray(w.methods) ? w.methods : null;
|
|
604
|
+
noteServerEnv(w.env);
|
|
605
|
+
if (this.opts.banner !== false && !hasKernel()) this.detailsSocket();
|
|
606
|
+
this.fireLocal(LOCAL_EVENTS.identity, this._identity);
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Détail de la socket dans la console — le pendant, pour une page SANS noyau,
|
|
610
|
+
* du groupe que le noyau émet quand il y en a un (#136).
|
|
611
|
+
*
|
|
612
|
+
* Une vitrine ne compose rien : sans ceci, elle n'a aucun endroit où lire son
|
|
613
|
+
* adresse, ses canaux ou son identité, alors que c'est exactement ce qu'on
|
|
614
|
+
* cherche quand une socket ne pousse rien. Émis au premier accueil, une seule
|
|
615
|
+
* fois par page, et jamais en production.
|
|
616
|
+
*/
|
|
617
|
+
detailsSocket() {
|
|
618
|
+
consoleDetails({
|
|
619
|
+
adresse: { valeur: this.url ?? "—" },
|
|
620
|
+
état: { valeur: this.state },
|
|
621
|
+
identité: { valeur: this._identity?.authenticated ? this._identity.userIdentifier ?? "authentifié" : "anonyme" },
|
|
622
|
+
canaux: { valeur: this._serverChannels?.join(", ") || "aucun" },
|
|
623
|
+
actions: { valeur: this._serverMethods?.join(", ") || "aucune" }
|
|
624
|
+
}, this, "socket nodefony — détail et raccourcis");
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* Ingère un `realtime:denied` (refus d'abonnement/push poussé par le serveur) :
|
|
628
|
+
* émet une notice normalisée ({@link onNotice}) ET un event ciblé `__denied__`
|
|
629
|
+
* ({@link onDenied}) pour une réaction polymorphe de l'app. Tolérant à un
|
|
630
|
+
* payload partiel (motif par défaut `forbidden`). Cold path (refus rare).
|
|
631
|
+
*/
|
|
632
|
+
ingestDenied(params) {
|
|
633
|
+
const p = params;
|
|
634
|
+
const channel = typeof p?.channel === "string" ? p.channel : "";
|
|
635
|
+
const brut = p?.reason;
|
|
636
|
+
const reason = brut === "unknown" || brut === "limit" ? brut : "forbidden";
|
|
637
|
+
const detail = typeof p?.detail === "string" ? p.detail : void 0;
|
|
638
|
+
const denied = {
|
|
639
|
+
channel,
|
|
640
|
+
reason,
|
|
641
|
+
...detail === void 0 ? {} : { detail }
|
|
642
|
+
};
|
|
643
|
+
this.fireNotice(deniedToNotice(denied));
|
|
644
|
+
this.fireLocal(LOCAL_EVENTS.denied, denied);
|
|
645
|
+
}
|
|
646
|
+
/**
|
|
647
|
+
* Dispatch d'une NOTIFICATION entrante — appelé par le moteur via `onNotification`.
|
|
648
|
+
* Ordre figé : ingestion welcome (1ʳᵉ frame) → stats → handlers locaux + wildcard
|
|
649
|
+
* (un handler `on("realtime:welcome")` voit donc l'identité déjà ingérée).
|
|
650
|
+
*/
|
|
651
|
+
dispatchNotification(method, params) {
|
|
652
|
+
if (method === "realtime:welcome") {
|
|
653
|
+
this.ingestWelcome(params);
|
|
654
|
+
this.replaySubscriptions();
|
|
655
|
+
} else if (method === "realtime:denied") this.ingestDenied(params);
|
|
656
|
+
this.trackFrame(method);
|
|
657
|
+
this.handlers.get(method)?.forEach((h) => {
|
|
658
|
+
try {
|
|
659
|
+
h(params);
|
|
660
|
+
} catch {}
|
|
661
|
+
});
|
|
662
|
+
this.handlers.get("*")?.forEach((h) => {
|
|
663
|
+
try {
|
|
664
|
+
h(method, params);
|
|
665
|
+
} catch {}
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
/**
|
|
669
|
+
* Frame `invalid` (JSON-RPC strict) portant un `error` sans `id`/`method` = erreur
|
|
670
|
+
* GLOBALE serveur (extension Nodefony hors spec, ex. refus tardif) → notice pour le
|
|
671
|
+
* centre de notifications. Frame réellement malformée (sans `.error`) → no-op.
|
|
672
|
+
*/
|
|
673
|
+
handleServerError(frame) {
|
|
674
|
+
const err = frame.error;
|
|
675
|
+
if (!err || typeof err !== "object") return;
|
|
676
|
+
this.fireNotice({
|
|
677
|
+
level: "error",
|
|
678
|
+
title: "Temps réel",
|
|
679
|
+
message: err.message || "Erreur serveur temps réel",
|
|
680
|
+
source: "server",
|
|
681
|
+
code: err.code,
|
|
682
|
+
ts: Date.now()
|
|
683
|
+
});
|
|
684
|
+
}
|
|
685
|
+
/** Échantillonne le débit (msg/s) + série par canal, 1×/s, puis émet
|
|
686
|
+
* `__stats__` (event local) pour notifier les consommateurs réactifs. */
|
|
687
|
+
startStatsSampler() {
|
|
688
|
+
if (this.statsTimer) return;
|
|
689
|
+
this.statsTimer = setInterval(() => {
|
|
690
|
+
for (const st of this._stats.values()) {
|
|
691
|
+
const prev = this._prevSampled.get(st.method) ?? st.msgCount;
|
|
692
|
+
st.rate = Math.max(0, st.msgCount - prev);
|
|
693
|
+
this._prevSampled.set(st.method, st.msgCount);
|
|
694
|
+
st.series = [...st.series, st.rate].slice(-32);
|
|
695
|
+
}
|
|
696
|
+
this.fireLocal(LOCAL_EVENTS.stats);
|
|
697
|
+
}, 1e3);
|
|
698
|
+
this.statsTimer.unref?.();
|
|
699
|
+
}
|
|
700
|
+
/** Émet une notice normalisée aux abonnés `onNotice` (event local, pas réseau). */
|
|
701
|
+
fireNotice(notice) {
|
|
702
|
+
this.fireLocal(LOCAL_EVENTS.notice, notice);
|
|
703
|
+
}
|
|
704
|
+
/** Déclenche les handlers locaux d'un event interne (pas d'envoi réseau). */
|
|
705
|
+
fireLocal(event, ...args) {
|
|
706
|
+
this.handlers.get(event)?.forEach((h) => {
|
|
707
|
+
try {
|
|
708
|
+
h(...args);
|
|
709
|
+
} catch {}
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
openSocket() {
|
|
713
|
+
return new Promise((resolve, reject) => {
|
|
714
|
+
this._welcomed = false;
|
|
715
|
+
this.setState(this.reconnectAttempt > 0 ? "reconnecting" : "connecting");
|
|
716
|
+
let transport;
|
|
717
|
+
try {
|
|
718
|
+
const base = typeof window !== "undefined" ? window.location.href : "http://localhost";
|
|
719
|
+
const url = new URL(this.requireUrl(), base);
|
|
720
|
+
if (url.protocol === "http:") url.protocol = "ws:";
|
|
721
|
+
else if (url.protocol === "https:") url.protocol = "wss:";
|
|
722
|
+
if (this.opts.token) url.searchParams.set("token", this.opts.token);
|
|
723
|
+
transport = this.transportFactory(url.toString());
|
|
724
|
+
this.transport = transport;
|
|
725
|
+
} catch (e) {
|
|
726
|
+
this.setState("error");
|
|
727
|
+
reject(e);
|
|
728
|
+
return;
|
|
729
|
+
}
|
|
730
|
+
transport.onOpen(() => {
|
|
731
|
+
const wasReconnecting = this.reconnectAttempt > 0;
|
|
732
|
+
this.reconnectAttempt = 0;
|
|
733
|
+
this._nextRetryAt = null;
|
|
734
|
+
this.setState("connected");
|
|
735
|
+
this.startHeartbeat();
|
|
736
|
+
if (wasReconnecting) this.fireNotice({
|
|
737
|
+
level: "success",
|
|
738
|
+
title: "Temps réel",
|
|
739
|
+
message: "Connexion temps réel rétablie",
|
|
740
|
+
source: "realtime",
|
|
741
|
+
ts: Date.now()
|
|
742
|
+
});
|
|
743
|
+
resolve();
|
|
744
|
+
});
|
|
745
|
+
transport.onMessage((raw) => this.handleMessage(raw));
|
|
746
|
+
transport.onError(() => {});
|
|
747
|
+
transport.onClose((code, reason) => {
|
|
748
|
+
this.clearTimers();
|
|
749
|
+
this.transport = null;
|
|
750
|
+
if (this.intentionalClose) {
|
|
751
|
+
this.setState("disconnected");
|
|
752
|
+
return;
|
|
753
|
+
}
|
|
754
|
+
const notice = closeCodeToNotice(code, reason);
|
|
755
|
+
if (notice) this.fireNotice(notice);
|
|
756
|
+
const reconnectable = isReconnectableCloseCode(code);
|
|
757
|
+
if (reconnectable && this.opts.autoReconnect !== false) this.scheduleReconnect();
|
|
758
|
+
else this.setState(reconnectable ? "disconnected" : "error");
|
|
759
|
+
});
|
|
760
|
+
transport.connect();
|
|
761
|
+
});
|
|
762
|
+
}
|
|
763
|
+
scheduleReconnect() {
|
|
764
|
+
this.reconnectAttempt++;
|
|
765
|
+
const base = this.opts.reconnectDelay ?? 1e3;
|
|
766
|
+
const max = this.opts.reconnectDelayMax ?? 3e4;
|
|
767
|
+
const delay = Math.min(base * 2 ** (this.reconnectAttempt - 1), max);
|
|
768
|
+
this._nextRetryAt = Date.now() + delay;
|
|
769
|
+
this.setState("reconnecting");
|
|
770
|
+
this.fireLocal(LOCAL_EVENTS.reconnect, {
|
|
771
|
+
attempt: this.reconnectAttempt,
|
|
772
|
+
delay,
|
|
773
|
+
nextRetryAt: this._nextRetryAt
|
|
774
|
+
});
|
|
775
|
+
this.reconnectTimer = setTimeout(() => {
|
|
776
|
+
this.openSocket().catch(() => {});
|
|
777
|
+
}, delay);
|
|
778
|
+
}
|
|
779
|
+
startHeartbeat() {
|
|
780
|
+
const interval = this.opts.heartbeatInterval ?? 3e4;
|
|
781
|
+
this.heartbeatTimer = setInterval(() => {
|
|
782
|
+
if (this.transport?.readyState === TransportState.OPEN) this._emitRaw("ping", { ts: Date.now() });
|
|
783
|
+
}, interval);
|
|
784
|
+
}
|
|
785
|
+
clearTimers() {
|
|
786
|
+
if (this.reconnectTimer) clearTimeout(this.reconnectTimer);
|
|
787
|
+
if (this.heartbeatTimer) clearInterval(this.heartbeatTimer);
|
|
788
|
+
this.reconnectTimer = null;
|
|
789
|
+
this.heartbeatTimer = null;
|
|
790
|
+
}
|
|
791
|
+
/**
|
|
792
|
+
* Log protocole : les `FRAME_LOG_MAX` dernières frames JSON-RPC (redactées),
|
|
793
|
+
* enregistrées EN CONTINU → la console « retrace l'instant » dès l'ouverture
|
|
794
|
+
* (jamais de démarrage à vide). Construction + redaction faites ici, à la lecture.
|
|
795
|
+
*/
|
|
796
|
+
get frameLog() {
|
|
797
|
+
return (this._rawFrames ?? []).map((f) => RealtimeClient.buildFrame(f.dir, f.msg, f.ts));
|
|
798
|
+
}
|
|
799
|
+
/** Purge le log protocole. */
|
|
800
|
+
clearFrameLog() {
|
|
801
|
+
if (this._rawFrames) this._rawFrames.length = 0;
|
|
802
|
+
}
|
|
803
|
+
/**
|
|
804
|
+
* Enregistre une frame dans le ring — coût = 1 push de réf (construction +
|
|
805
|
+
* redaction DIFFÉRÉES). Émet `__frame__` (frame construite) seulement si la
|
|
806
|
+
* console écoute.
|
|
807
|
+
*/
|
|
808
|
+
recordFrame(dir, msg) {
|
|
809
|
+
const ts = Date.now();
|
|
810
|
+
(this._rawFrames ??= []).push({
|
|
811
|
+
ts,
|
|
812
|
+
dir,
|
|
813
|
+
msg
|
|
814
|
+
});
|
|
815
|
+
if (this._rawFrames.length > FRAME_LOG_MAX) this._rawFrames.shift();
|
|
816
|
+
const listeners = this.handlers.get("__frame__");
|
|
817
|
+
if (listeners && listeners.size > 0) this.fireLocal("__frame__", RealtimeClient.buildFrame(dir, msg, ts));
|
|
818
|
+
}
|
|
819
|
+
/** Construit une frame affichable (kind/canal/id + payload redacté). */
|
|
820
|
+
static buildFrame(dir, msg, ts) {
|
|
821
|
+
const m = msg ?? {};
|
|
822
|
+
let kind = "?";
|
|
823
|
+
let channel;
|
|
824
|
+
if (typeof m.method === "string") {
|
|
825
|
+
kind = m.method;
|
|
826
|
+
const p = m.params;
|
|
827
|
+
if (p && typeof p.channel === "string") channel = p.channel;
|
|
828
|
+
} else if ("error" in m) kind = "error";
|
|
829
|
+
else if ("result" in m) kind = "response";
|
|
830
|
+
return {
|
|
831
|
+
ts,
|
|
832
|
+
dir,
|
|
833
|
+
kind,
|
|
834
|
+
id: typeof m.id === "number" ? m.id : void 0,
|
|
835
|
+
channel,
|
|
836
|
+
payload: redactFrame(msg)
|
|
837
|
+
};
|
|
838
|
+
}
|
|
839
|
+
/**
|
|
840
|
+
* Émet une frame si — et seulement si — le transport est ouvert.
|
|
841
|
+
*
|
|
842
|
+
* La frame n'est **pas** mise en file d'attente : rejouer une intention après
|
|
843
|
+
* coup peut être pire que la perdre (une commande obsolète appliquée en
|
|
844
|
+
* retard, un abonnement rétabli sur un écran déjà quitté). Ce qui n'est plus
|
|
845
|
+
* accepté, c'est de la perdre **en silence** — l'appelant reçoit `false`, une
|
|
846
|
+
* requête corrélée est rejetée aussitôt par {@link JsonRpcPeer} plutôt qu'au
|
|
847
|
+
* bout de son timeout, et l'utilisateur est prévenu une fois par épisode.
|
|
848
|
+
*
|
|
849
|
+
* @param msg - la frame JSON-RPC à sérialiser.
|
|
850
|
+
* @returns `true` si la frame est partie, `false` si le transport était fermé.
|
|
851
|
+
*/
|
|
852
|
+
send(msg) {
|
|
853
|
+
if (this.transport?.readyState !== TransportState.OPEN) {
|
|
854
|
+
this._framesUnsent++;
|
|
855
|
+
return false;
|
|
856
|
+
}
|
|
857
|
+
this.transport.send(JSON.stringify(msg));
|
|
858
|
+
this.recordFrame("out", msg);
|
|
859
|
+
return true;
|
|
860
|
+
}
|
|
861
|
+
/**
|
|
862
|
+
* Avertit que des notifications applicatives se perdent — **une fois par
|
|
863
|
+
* épisode** de coupure, jamais par frame : une vue qui pousse en boucle
|
|
864
|
+
* remplirait sinon le centre de notifications à elle seule.
|
|
865
|
+
*
|
|
866
|
+
* Appelé depuis {@link emit} uniquement. Les requêtes corrélées et les
|
|
867
|
+
* (dés)abonnements ont déjà leur propre voie (rejet, rejeu au reconnect).
|
|
868
|
+
*/
|
|
869
|
+
noticeUnsent() {
|
|
870
|
+
if (this._unsentNotified) return;
|
|
871
|
+
this._unsentNotified = true;
|
|
872
|
+
this.fireNotice({
|
|
873
|
+
level: "warning",
|
|
874
|
+
title: "Temps réel",
|
|
875
|
+
message: "Connexion interrompue — les messages émis pendant la coupure sont perdus",
|
|
876
|
+
source: "realtime",
|
|
877
|
+
ts: Date.now()
|
|
878
|
+
});
|
|
879
|
+
}
|
|
880
|
+
handleMessage(raw) {
|
|
881
|
+
if (typeof raw !== "string") return;
|
|
882
|
+
let msg;
|
|
883
|
+
try {
|
|
884
|
+
msg = JSON.parse(raw);
|
|
885
|
+
} catch {
|
|
886
|
+
return;
|
|
887
|
+
}
|
|
888
|
+
this.receive(msg);
|
|
889
|
+
}
|
|
890
|
+
setState(s) {
|
|
891
|
+
if (this._state === s) return;
|
|
892
|
+
if (s === "connected") this._unsentNotified = false;
|
|
893
|
+
this._state = s;
|
|
894
|
+
this.fireLocal(LOCAL_EVENTS.state, s);
|
|
895
|
+
}
|
|
896
|
+
};
|
|
897
|
+
//#endregion
|
|
898
|
+
export { RealtimeClient, RealtimeClient as default };
|