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.
Files changed (903) hide show
  1. package/.ai/symbols.json +36135 -0
  2. package/LICENSE +544 -0
  3. package/README.md +316 -694
  4. package/bin/nodefony +2183 -85
  5. package/dist/client/Container.js +367 -0
  6. package/dist/client/Event.js +198 -0
  7. package/dist/client/Service.js +344 -0
  8. package/dist/client/Tools.js +162 -0
  9. package/dist/client/client/ClientKernel.js +276 -0
  10. package/dist/client/client/angular/index.js +352 -0
  11. package/dist/client/client/announce.js +212 -0
  12. package/dist/client/client/debugbar/DebugBar.js +1624 -0
  13. package/dist/client/client/debugbar/format.js +103 -0
  14. package/dist/client/client/debugbar/hmr.js +37 -0
  15. package/dist/client/client/debugbar/index.js +29 -0
  16. package/dist/client/client/debugbar/model.js +133 -0
  17. package/dist/client/client/debugbar/network.js +173 -0
  18. package/dist/client/client/debugbar/profile.js +114 -0
  19. package/dist/client/client/index.js +34 -0
  20. package/dist/client/client/react/index.js +268 -0
  21. package/dist/client/client/realtime/AdaptiveRate.js +240 -0
  22. package/dist/client/client/realtime/BrowserWsTransport.js +57 -0
  23. package/dist/client/client/realtime/RealtimeClient.js +898 -0
  24. package/dist/client/client/realtime/localEvents.js +56 -0
  25. package/dist/client/client/realtime/notice.js +125 -0
  26. package/dist/client/client/realtime/observe.js +280 -0
  27. package/dist/client/client/roles/index.js +3 -0
  28. package/dist/client/client/roles/registry.js +97 -0
  29. package/dist/client/client/roles/roles.js +91 -0
  30. package/dist/client/client/shim/events.js +88 -0
  31. package/dist/client/client/shim/util.js +20 -0
  32. package/dist/client/client/svelte/index.js +319 -0
  33. package/dist/client/client/syslog/context.js +122 -0
  34. package/dist/client/client/syslog/errors.js +49 -0
  35. package/dist/client/client/syslog/uplink.js +106 -0
  36. package/dist/client/client/vue/index.js +321 -0
  37. package/dist/client/colors.js +63 -0
  38. package/dist/client/debugbar.standalone.js +4274 -0
  39. package/dist/client/realtime/IRealtimeTransport.js +32 -0
  40. package/dist/client/realtime/JsonRpcPeer.js +251 -0
  41. package/dist/client/realtime/channelRate.js +39 -0
  42. package/dist/client/realtime/platformChannels.js +155 -0
  43. package/dist/client/syslog/Pdu.js +224 -0
  44. package/dist/client/syslog/Syslog.js +1159 -0
  45. package/dist/client/syslog/drivers/pduFlow.js +106 -0
  46. package/dist/client/syslog/drivers/pduProtocol.js +28 -0
  47. package/dist/client/syslog/logColor.js +80 -0
  48. package/dist/client/types/src/Container.d.ts +221 -0
  49. package/dist/client/types/src/Event.d.ts +171 -0
  50. package/dist/client/types/src/FileClass.d.ts +184 -0
  51. package/dist/client/types/src/Service.d.ts +165 -0
  52. package/dist/client/types/src/Tools.d.ts +116 -0
  53. package/dist/client/types/src/client/ClientKernel.d.ts +90 -0
  54. package/dist/client/types/src/client/IClientKernel.d.ts +195 -0
  55. package/dist/client/types/src/client/angular/index.d.ts +273 -0
  56. package/dist/client/types/src/client/announce.d.ts +74 -0
  57. package/dist/client/types/src/client/debugbar/DebugBar.d.ts +279 -0
  58. package/dist/client/types/src/client/debugbar/format.d.ts +48 -0
  59. package/dist/client/types/src/client/debugbar/hmr.d.ts +16 -0
  60. package/dist/client/types/src/client/debugbar/index.d.ts +30 -0
  61. package/dist/client/types/src/client/debugbar/model.d.ts +158 -0
  62. package/dist/client/types/src/client/debugbar/network.d.ts +55 -0
  63. package/dist/client/types/src/client/debugbar/profile.d.ts +99 -0
  64. package/dist/client/types/src/client/index.d.ts +47 -0
  65. package/dist/client/types/src/client/react/index.d.ts +207 -0
  66. package/dist/client/types/src/client/realtime/AdaptiveRate.d.ts +138 -0
  67. package/dist/client/types/src/client/realtime/BrowserWsTransport.d.ts +27 -0
  68. package/dist/client/types/src/client/realtime/RealtimeClient.d.ts +573 -0
  69. package/dist/client/types/src/client/realtime/localEvents.d.ts +53 -0
  70. package/dist/client/types/src/client/realtime/notice.d.ts +70 -0
  71. package/dist/client/types/src/client/realtime/observe.d.ts +284 -0
  72. package/dist/client/types/src/client/roles/index.d.ts +15 -0
  73. package/dist/client/types/src/client/roles/registry.d.ts +72 -0
  74. package/dist/client/types/src/client/roles/roles.d.ts +68 -0
  75. package/dist/client/types/src/client/shim/cli-color.d.ts +2 -0
  76. package/dist/client/types/src/client/shim/events.d.ts +39 -0
  77. package/dist/client/types/src/client/shim/util.d.ts +14 -0
  78. package/dist/client/types/src/client/svelte/index.d.ts +216 -0
  79. package/dist/client/types/src/client/syslog/context.d.ts +76 -0
  80. package/dist/client/types/src/client/syslog/errors.d.ts +46 -0
  81. package/dist/client/types/src/client/syslog/uplink.d.ts +89 -0
  82. package/dist/client/types/src/client/transport/websocket.d.ts +5 -0
  83. package/dist/client/types/src/client/vue/index.d.ts +234 -0
  84. package/dist/client/types/src/colors.d.ts +32 -0
  85. package/dist/client/types/src/config/infra.d.ts +171 -0
  86. package/dist/client/types/src/kernel/bootReport.d.ts +112 -0
  87. package/dist/client/types/src/kernel/readinessRegistry.d.ts +104 -0
  88. package/dist/client/types/src/realtime/IRealtimeSocket.d.ts +142 -0
  89. package/dist/client/types/src/realtime/IRealtimeTransport.d.ts +50 -0
  90. package/dist/client/types/src/realtime/JsonRpcPeer.d.ts +251 -0
  91. package/dist/client/types/src/realtime/RealtimeEventMap.d.ts +269 -0
  92. package/dist/client/types/src/realtime/channelRate.d.ts +55 -0
  93. package/dist/client/types/src/realtime/platformChannels.d.ts +147 -0
  94. package/dist/client/types/src/syslog/Pdu.d.ts +134 -0
  95. package/dist/client/types/src/syslog/Syslog.d.ts +482 -0
  96. package/dist/client/types/src/syslog/drivers/ILogDriver.d.ts +177 -0
  97. package/dist/client/types/src/syslog/drivers/pduFlow.d.ts +53 -0
  98. package/dist/client/types/src/syslog/drivers/pduProtocol.d.ts +20 -0
  99. package/dist/client/types/src/syslog/logColor.d.ts +59 -0
  100. package/dist/client/types/src/types/ICliKernel.d.ts +28 -0
  101. package/dist/client/types/src/types/ICommand.d.ts +14 -0
  102. package/dist/client/types/src/types/IContainer.d.ts +35 -0
  103. package/dist/client/types/src/types/IKernel.d.ts +138 -0
  104. package/dist/client/types/src/types/IMcpTool.d.ts +157 -0
  105. package/dist/client/types/src/types/IModule.d.ts +73 -0
  106. package/dist/client/types/src/types/IPage.d.ts +119 -0
  107. package/dist/client/types/src/types/IService.d.ts +62 -0
  108. package/dist/client/types/src/types/ISyslog.d.ts +58 -0
  109. package/dist/client/types/src/types/ITransport.d.ts +5 -0
  110. package/dist/client/types/src/types/globals.d.ts +47 -0
  111. package/dist/node/Cli.js +750 -0
  112. package/dist/node/Container.js +367 -0
  113. package/dist/node/Error.js +309 -0
  114. package/dist/node/Event.js +198 -0
  115. package/dist/node/FileClass.js +308 -0
  116. package/dist/node/Nodefony.js +78 -0
  117. package/dist/node/Service.js +344 -0
  118. package/dist/node/Tools.js +205 -0
  119. package/dist/node/bin/resolveLocalCli.js +10 -0
  120. package/dist/node/bundler/index.js +103 -0
  121. package/dist/node/cli/agentTargets.js +461 -0
  122. package/dist/node/cli/aiMcp.js +553 -0
  123. package/dist/node/cli/aiMcpReport.js +129 -0
  124. package/dist/node/cli/aiSync.js +323 -0
  125. package/dist/node/cli/aiSyncReport.js +142 -0
  126. package/dist/node/cli/card.js +186 -0
  127. package/dist/node/cli/cardReport.js +110 -0
  128. package/dist/node/cli/completion.js +415 -0
  129. package/dist/node/cli/create.js +805 -0
  130. package/dist/node/cli/env.js +332 -0
  131. package/dist/node/cli/envReport.js +159 -0
  132. package/dist/node/cli/execPortable.js +60 -0
  133. package/dist/node/cli/gitHooks.js +191 -0
  134. package/dist/node/cli/gitHooksReport.js +119 -0
  135. package/dist/node/cli/globalFlags.js +67 -0
  136. package/dist/node/cli/helpReport.js +288 -0
  137. package/dist/node/cli/manPage.js +165 -0
  138. package/dist/node/cli/nodefonyBin.js +61 -0
  139. package/dist/node/cli/outdated.js +144 -0
  140. package/dist/node/cli/progress.js +555 -0
  141. package/dist/node/cli/projectRoot.js +32 -0
  142. package/dist/node/cli/promptPassword.js +44 -0
  143. package/dist/node/cli/prompts.js +86 -0
  144. package/dist/node/cli/scaffold/destination.js +92 -0
  145. package/dist/node/cli/scaffold/engine.js +2156 -0
  146. package/dist/node/cli/scaffold/entityFields.js +589 -0
  147. package/dist/node/cli/scaffold/format.js +243 -0
  148. package/dist/node/cli/scaffold/interactive.js +124 -0
  149. package/dist/node/cli/scaffold/moduleLayout.js +38 -0
  150. package/dist/node/cli/scaffold/reservedEntities.js +74 -0
  151. package/dist/node/cli/scaffold/spec.js +704 -0
  152. package/dist/node/cli/scaffold/steps.js +40 -0
  153. package/dist/node/cli/scaffold/userContractSource.js +133 -0
  154. package/dist/node/cli/scaffold/versions.js +57 -0
  155. package/dist/node/cli/scaffold/writer.js +172 -0
  156. package/dist/node/cli/startMenu.js +496 -0
  157. package/dist/node/cli/symbols.js +205 -0
  158. package/dist/node/cli/sysexits.js +34 -0
  159. package/dist/node/cli/tableReport.js +184 -0
  160. package/dist/node/cli/usageReport.js +144 -0
  161. package/dist/node/colors.js +63 -0
  162. package/dist/node/command/Builder.js +153 -0
  163. package/dist/node/command/Command.js +348 -0
  164. package/dist/node/config/configProvenance.js +101 -0
  165. package/dist/node/config/defaults.js +39 -0
  166. package/dist/node/config/defineConfig.js +129 -0
  167. package/dist/node/config/defineEnv.js +264 -0
  168. package/dist/node/config/envExample.js +41 -0
  169. package/dist/node/config/envOverride.js +423 -0
  170. package/dist/node/config/infra.js +163 -0
  171. package/dist/node/config/reactivity.js +23 -0
  172. package/dist/node/config/reservedEnv.js +118 -0
  173. package/dist/node/config/schema.js +134 -0
  174. package/dist/node/config/use.js +24 -0
  175. package/dist/node/finder/File.js +49 -0
  176. package/dist/node/finder/FileResult.js +86 -0
  177. package/dist/node/finder/Finder.js +201 -0
  178. package/dist/node/finder/Result.js +45 -0
  179. package/dist/node/index.js +121 -0
  180. package/dist/node/kernel/BootConfigurationError.js +54 -0
  181. package/dist/node/kernel/CliKernel.js +630 -0
  182. package/dist/node/kernel/Kernel.js +2198 -0
  183. package/dist/node/kernel/Module.js +453 -0
  184. package/dist/node/kernel/adminPlane/adminCaller.js +98 -0
  185. package/dist/node/kernel/adminPlane/adminRbac.js +51 -0
  186. package/dist/node/kernel/adminPlane/catalog.js +158 -0
  187. package/dist/node/kernel/adminPlane/executeAdmin.js +78 -0
  188. package/dist/node/kernel/checks/deep.js +335 -0
  189. package/dist/node/kernel/checks/freshness.js +139 -0
  190. package/dist/node/kernel/checks/gating.js +231 -0
  191. package/dist/node/kernel/checks/guards.js +232 -0
  192. package/dist/node/kernel/checks/lastBoot.js +136 -0
  193. package/dist/node/kernel/checks/live.js +330 -0
  194. package/dist/node/kernel/checks/packageDeps.js +292 -0
  195. package/dist/node/kernel/checks/readiness.js +153 -0
  196. package/dist/node/kernel/checks/renderReport.js +780 -0
  197. package/dist/node/kernel/checks/report.js +421 -0
  198. package/dist/node/kernel/checks/runDoctor.js +731 -0
  199. package/dist/node/kernel/checks/surface.js +364 -0
  200. package/dist/node/kernel/checks/walk.js +100 -0
  201. package/dist/node/kernel/checks/wiring.js +450 -0
  202. package/dist/node/kernel/commands/AiMcpCommand.js +65 -0
  203. package/dist/node/kernel/commands/AiSyncCommand.js +48 -0
  204. package/dist/node/kernel/commands/BuildCommand.js +49 -0
  205. package/dist/node/kernel/commands/CardCommand.js +50 -0
  206. package/dist/node/kernel/commands/ClusterCommand.js +58 -0
  207. package/dist/node/kernel/commands/CompletionCommand.js +31 -0
  208. package/dist/node/kernel/commands/CreateCommand.js +45 -0
  209. package/dist/node/kernel/commands/DevCommand.js +99 -0
  210. package/dist/node/kernel/commands/DoctorCommand.js +115 -0
  211. package/dist/node/kernel/commands/EnvCommand.js +52 -0
  212. package/dist/node/kernel/commands/GitHooksCommand.js +47 -0
  213. package/dist/node/kernel/commands/InspectCommand.js +153 -0
  214. package/dist/node/kernel/commands/InstallCommand.js +20 -0
  215. package/dist/node/kernel/commands/MenuCommand.js +261 -0
  216. package/dist/node/kernel/commands/OutdatedCommand.js +164 -0
  217. package/dist/node/kernel/commands/ProdCommand.js +60 -0
  218. package/dist/node/kernel/commands/StatusCommand.js +30 -0
  219. package/dist/node/kernel/commands/StopCommand.js +35 -0
  220. package/dist/node/kernel/commands/SymbolsCommand.js +45 -0
  221. package/dist/node/kernel/commands/runtimeLauncher.js +95 -0
  222. package/dist/node/kernel/decorators/kernelDecorator.js +110 -0
  223. package/dist/node/kernel/injector/injector.js +137 -0
  224. package/dist/node/kernel/injector/serviceOrder.js +106 -0
  225. package/dist/node/kernel/inspect/adminSubjects.js +194 -0
  226. package/dist/node/kernel/inspect/docOutline.js +86 -0
  227. package/dist/node/kernel/lifecycleTags.js +76 -0
  228. package/dist/node/kernel/moduleConfig.js +75 -0
  229. package/dist/node/kernel/moduleGating.js +68 -0
  230. package/dist/node/kernel/readinessRegistry.js +98 -0
  231. package/dist/node/kernel/resolveModuleEntry.js +61 -0
  232. package/dist/node/mcp/caller.js +40 -0
  233. package/dist/node/mcp/guard.js +51 -0
  234. package/dist/node/mcp/protocol.js +157 -0
  235. package/dist/node/mcp/server.js +216 -0
  236. package/dist/node/mcp/tools.js +861 -0
  237. package/dist/node/oauth/authorizationServer.js +221 -0
  238. package/dist/node/oauth/protectedResource.js +293 -0
  239. package/dist/node/package.js +4 -0
  240. package/dist/node/realtime/IRealtimeTransport.js +32 -0
  241. package/dist/node/realtime/JsonRpcPeer.js +251 -0
  242. package/dist/node/realtime/RealtimeEventMap.js +15 -0
  243. package/dist/node/realtime/channelRate.js +39 -0
  244. package/dist/node/realtime/platformChannels.js +155 -0
  245. package/dist/node/runtime/GcScheduler.js +92 -0
  246. package/dist/node/runtime/RequestContext.js +76 -0
  247. package/dist/node/runtime/bearer.js +84 -0
  248. package/dist/node/runtime/engineEnvironment.js +79 -0
  249. package/dist/node/runtime/loadEnv.js +105 -0
  250. package/dist/node/runtime/pageFacets.js +85 -0
  251. package/dist/node/runtime/pageFilters.js +103 -0
  252. package/dist/node/runtime/pageGuard.js +84 -0
  253. package/dist/node/runtime/pageQuery.js +160 -0
  254. package/dist/node/runtime/pageSort.js +114 -0
  255. package/dist/node/runtime/redact.js +43 -0
  256. package/dist/node/runtime/withTimeout.js +71 -0
  257. package/dist/node/service/cluster/ClusterManager.js +202 -0
  258. package/dist/node/service/cluster/ClusterProbeAggregator.js +120 -0
  259. package/dist/node/service/cluster/ClusterRelay.js +74 -0
  260. package/dist/node/service/cluster/clusterMaster.js +65 -0
  261. package/dist/node/service/cluster/clusterMessage.js +70 -0
  262. package/dist/node/service/cluster/cpuQuota.js +59 -0
  263. package/dist/node/service/cluster/instanceProbe.js +52 -0
  264. package/dist/node/service/cluster/podEnvironment.js +48 -0
  265. package/dist/node/service/cluster/processProbe.js +70 -0
  266. package/dist/node/service/cluster/richProcessProbe.js +115 -0
  267. package/dist/node/service/cluster/topology.js +71 -0
  268. package/dist/node/service/dev/BootReporter.js +490 -0
  269. package/dist/node/service/dev/DevSupervisor.js +1004 -0
  270. package/dist/node/service/dev/bootVerdict.js +158 -0
  271. package/dist/node/service/dev/detachedStart.js +372 -0
  272. package/dist/node/service/dev/devProcess.js +1137 -0
  273. package/dist/node/service/dev/devProjects.js +138 -0
  274. package/dist/node/service/dev/devStatusReport.js +395 -0
  275. package/dist/node/service/dev/devStop.js +263 -0
  276. package/dist/node/service/fetchService.js +35 -0
  277. package/dist/node/service/gitService.js +62 -0
  278. package/dist/node/syslog/Pdu.js +224 -0
  279. package/dist/node/syslog/Syslog.js +1159 -0
  280. package/dist/node/syslog/drivers/ClusterFileLogDriver.js +114 -0
  281. package/dist/node/syslog/drivers/FileLogDriver.js +127 -0
  282. package/dist/node/syslog/drivers/ILogDriver.js +26 -0
  283. package/dist/node/syslog/drivers/LokiLogDriver.js +144 -0
  284. package/dist/node/syslog/drivers/MemoryLogDriver.js +33 -0
  285. package/dist/node/syslog/drivers/OpenSearchLogDriver.js +159 -0
  286. package/dist/node/syslog/drivers/builtinLogDrivers.js +114 -0
  287. package/dist/node/syslog/drivers/filterPdus.js +71 -0
  288. package/dist/node/syslog/drivers/logDriverRegistry.js +83 -0
  289. package/dist/node/syslog/drivers/opensearchShared.js +17 -0
  290. package/dist/node/syslog/drivers/pduFlow.js +106 -0
  291. package/dist/node/syslog/drivers/pduProtocol.js +28 -0
  292. package/dist/node/syslog/httpFetch.js +43 -0
  293. package/dist/node/syslog/logColor.js +80 -0
  294. package/dist/node/syslog/sinks/FileSink.js +142 -0
  295. package/dist/node/syslog/transports/BatchingHttpTransport.js +98 -0
  296. package/dist/node/syslog/transports/ConsoleTransport.js +14 -0
  297. package/dist/node/syslog/transports/FileTransport.js +17 -0
  298. package/dist/node/syslog/transports/HttpTransport.js +44 -0
  299. package/dist/node/syslog/transports/LokiTransport.js +80 -0
  300. package/dist/node/syslog/transports/OpenSearchTransport.js +53 -0
  301. package/dist/node/syslog/transports/SyslogTransport.js +13 -0
  302. package/dist/node/syslog/transports/index.js +8 -0
  303. package/dist/node/testing/index.js +190 -0
  304. package/dist/types/Cli.d.ts +177 -0
  305. package/dist/types/Container.d.ts +221 -0
  306. package/dist/types/Error.d.ts +162 -0
  307. package/dist/types/Event.d.ts +171 -0
  308. package/dist/types/FileClass.d.ts +184 -0
  309. package/dist/types/Nodefony.d.ts +66 -0
  310. package/dist/types/Service.d.ts +165 -0
  311. package/dist/types/Tools.d.ts +116 -0
  312. package/dist/types/bin/resolveLocalCli.d.ts +49 -0
  313. package/dist/types/bundler/index.d.ts +66 -0
  314. package/dist/types/cli/agentTargets.d.ts +378 -0
  315. package/dist/types/cli/aiMcp.d.ts +239 -0
  316. package/dist/types/cli/aiMcpReport.d.ts +113 -0
  317. package/dist/types/cli/aiSync.d.ts +68 -0
  318. package/dist/types/cli/aiSyncReport.d.ts +149 -0
  319. package/dist/types/cli/card.d.ts +49 -0
  320. package/dist/types/cli/cardReport.d.ts +127 -0
  321. package/dist/types/cli/completion.d.ts +154 -0
  322. package/dist/types/cli/create.d.ts +177 -0
  323. package/dist/types/cli/env.d.ts +103 -0
  324. package/dist/types/cli/envReport.d.ts +153 -0
  325. package/dist/types/cli/execPortable.d.ts +54 -0
  326. package/dist/types/cli/gitHooks.d.ts +48 -0
  327. package/dist/types/cli/gitHooksReport.d.ts +101 -0
  328. package/dist/types/cli/globalFlags.d.ts +48 -0
  329. package/dist/types/cli/helpReport.d.ts +110 -0
  330. package/dist/types/cli/manPage.d.ts +21 -0
  331. package/dist/types/cli/nodefonyBin.d.ts +45 -0
  332. package/dist/types/cli/outdated.d.ts +119 -0
  333. package/dist/types/cli/progress.d.ts +349 -0
  334. package/dist/types/cli/projectRoot.d.ts +19 -0
  335. package/dist/types/cli/promptPassword.d.ts +22 -0
  336. package/dist/types/cli/prompts.d.ts +102 -0
  337. package/dist/types/cli/scaffold/destination.d.ts +70 -0
  338. package/dist/types/cli/scaffold/engine.d.ts +545 -0
  339. package/dist/types/cli/scaffold/entityFields.d.ts +238 -0
  340. package/dist/types/cli/scaffold/format.d.ts +78 -0
  341. package/dist/types/cli/scaffold/interactive.d.ts +11 -0
  342. package/dist/types/cli/scaffold/moduleLayout.d.ts +69 -0
  343. package/dist/types/cli/scaffold/reservedEntities.d.ts +49 -0
  344. package/dist/types/cli/scaffold/spec.d.ts +159 -0
  345. package/dist/types/cli/scaffold/steps.d.ts +24 -0
  346. package/dist/types/cli/scaffold/userContractSource.d.ts +86 -0
  347. package/dist/types/cli/scaffold/versions.d.ts +14 -0
  348. package/dist/types/cli/scaffold/writer.d.ts +100 -0
  349. package/dist/types/cli/startMenu.d.ts +195 -0
  350. package/dist/types/cli/symbols.d.ts +84 -0
  351. package/dist/types/cli/sysexits.d.ts +31 -0
  352. package/dist/types/cli/tableReport.d.ts +44 -0
  353. package/dist/types/cli/usageReport.d.ts +108 -0
  354. package/dist/types/client/ClientKernel.d.ts +90 -0
  355. package/dist/types/client/IClientKernel.d.ts +195 -0
  356. package/dist/types/client/angular/index.d.ts +273 -0
  357. package/dist/types/client/announce.d.ts +74 -0
  358. package/dist/types/client/debugbar/DebugBar.d.ts +279 -0
  359. package/dist/types/client/debugbar/format.d.ts +48 -0
  360. package/dist/types/client/debugbar/hmr.d.ts +16 -0
  361. package/dist/types/client/debugbar/index.d.ts +30 -0
  362. package/dist/types/client/debugbar/model.d.ts +158 -0
  363. package/dist/types/client/debugbar/network.d.ts +55 -0
  364. package/dist/types/client/debugbar/profile.d.ts +99 -0
  365. package/dist/types/client/index.d.ts +47 -0
  366. package/dist/types/client/react/index.d.ts +207 -0
  367. package/dist/types/client/realtime/AdaptiveRate.d.ts +138 -0
  368. package/dist/types/client/realtime/BrowserWsTransport.d.ts +27 -0
  369. package/dist/types/client/realtime/RealtimeClient.d.ts +573 -0
  370. package/dist/types/client/realtime/localEvents.d.ts +53 -0
  371. package/dist/types/client/realtime/notice.d.ts +70 -0
  372. package/dist/types/client/realtime/observe.d.ts +284 -0
  373. package/dist/types/client/roles/index.d.ts +15 -0
  374. package/dist/types/client/roles/registry.d.ts +72 -0
  375. package/dist/types/client/roles/roles.d.ts +68 -0
  376. package/dist/types/client/shim/cli-color.d.ts +2 -0
  377. package/dist/types/client/shim/events.d.ts +39 -0
  378. package/dist/types/client/shim/util.d.ts +14 -0
  379. package/dist/types/client/svelte/index.d.ts +216 -0
  380. package/dist/types/client/syslog/context.d.ts +76 -0
  381. package/dist/types/client/syslog/errors.d.ts +46 -0
  382. package/dist/types/client/syslog/uplink.d.ts +89 -0
  383. package/dist/types/client/transport/websocket.d.ts +5 -0
  384. package/dist/types/client/vue/index.d.ts +234 -0
  385. package/dist/types/colors.d.ts +32 -0
  386. package/dist/types/command/Builder.d.ts +47 -0
  387. package/dist/types/command/Command.d.ts +268 -0
  388. package/dist/types/config/configMeta.d.ts +53 -0
  389. package/dist/types/config/configProvenance.d.ts +58 -0
  390. package/dist/types/config/defaults.d.ts +33 -0
  391. package/dist/types/config/defineConfig.d.ts +70 -0
  392. package/dist/types/config/defineEnv.d.ts +170 -0
  393. package/dist/types/config/envExample.d.ts +23 -0
  394. package/dist/types/config/envOverride.d.ts +236 -0
  395. package/dist/types/config/index.d.ts +23 -0
  396. package/dist/types/config/infra.d.ts +171 -0
  397. package/dist/types/config/reactivity.d.ts +36 -0
  398. package/dist/types/config/reservedEnv.d.ts +145 -0
  399. package/dist/types/config/schema.d.ts +113 -0
  400. package/dist/types/config/types.d.ts +374 -0
  401. package/dist/types/config/use.d.ts +80 -0
  402. package/dist/types/finder/File.d.ts +26 -0
  403. package/dist/types/finder/FileResult.d.ts +14 -0
  404. package/dist/types/finder/Finder.d.ts +51 -0
  405. package/dist/types/finder/Result.d.ts +10 -0
  406. package/dist/types/index.d.ts +205 -0
  407. package/dist/types/kernel/BootConfigurationError.d.ts +50 -0
  408. package/dist/types/kernel/CliKernel.d.ts +289 -0
  409. package/dist/types/kernel/Kernel.d.ts +1255 -0
  410. package/dist/types/kernel/Module.d.ts +326 -0
  411. package/dist/types/kernel/adminPlane/adminCaller.d.ts +105 -0
  412. package/dist/types/kernel/adminPlane/adminRbac.d.ts +44 -0
  413. package/dist/types/kernel/adminPlane/catalog.d.ts +122 -0
  414. package/dist/types/kernel/adminPlane/executeAdmin.d.ts +99 -0
  415. package/dist/types/kernel/bootReport.d.ts +112 -0
  416. package/dist/types/kernel/checks/deep.d.ts +122 -0
  417. package/dist/types/kernel/checks/freshness.d.ts +49 -0
  418. package/dist/types/kernel/checks/gating.d.ts +134 -0
  419. package/dist/types/kernel/checks/guards.d.ts +57 -0
  420. package/dist/types/kernel/checks/lastBoot.d.ts +189 -0
  421. package/dist/types/kernel/checks/live.d.ts +110 -0
  422. package/dist/types/kernel/checks/packageDeps.d.ts +44 -0
  423. package/dist/types/kernel/checks/readiness.d.ts +97 -0
  424. package/dist/types/kernel/checks/renderReport.d.ts +107 -0
  425. package/dist/types/kernel/checks/report.d.ts +414 -0
  426. package/dist/types/kernel/checks/runDoctor.d.ts +361 -0
  427. package/dist/types/kernel/checks/surface.d.ts +148 -0
  428. package/dist/types/kernel/checks/walk.d.ts +45 -0
  429. package/dist/types/kernel/checks/wiring.d.ts +54 -0
  430. package/dist/types/kernel/commands/AiMcpCommand.d.ts +39 -0
  431. package/dist/types/kernel/commands/AiSyncCommand.d.ts +28 -0
  432. package/dist/types/kernel/commands/BuildCommand.d.ts +13 -0
  433. package/dist/types/kernel/commands/CardCommand.d.ts +34 -0
  434. package/dist/types/kernel/commands/ClusterCommand.d.ts +29 -0
  435. package/dist/types/kernel/commands/CompletionCommand.d.ts +17 -0
  436. package/dist/types/kernel/commands/CreateCommand.d.ts +16 -0
  437. package/dist/types/kernel/commands/DevCommand.d.ts +40 -0
  438. package/dist/types/kernel/commands/DoctorCommand.d.ts +55 -0
  439. package/dist/types/kernel/commands/EnvCommand.d.ts +35 -0
  440. package/dist/types/kernel/commands/GitHooksCommand.d.ts +27 -0
  441. package/dist/types/kernel/commands/InspectCommand.d.ts +59 -0
  442. package/dist/types/kernel/commands/InstallCommand.d.ts +7 -0
  443. package/dist/types/kernel/commands/MenuCommand.d.ts +58 -0
  444. package/dist/types/kernel/commands/OutdatedCommand.d.ts +47 -0
  445. package/dist/types/kernel/commands/ProdCommand.d.ts +29 -0
  446. package/dist/types/kernel/commands/StatusCommand.d.ts +17 -0
  447. package/dist/types/kernel/commands/StopCommand.d.ts +17 -0
  448. package/dist/types/kernel/commands/SymbolsCommand.d.ts +29 -0
  449. package/dist/types/kernel/commands/runtimeLauncher.d.ts +76 -0
  450. package/dist/types/kernel/decorators/kernelDecorator.d.ts +76 -0
  451. package/dist/types/kernel/injector/injector.d.ts +47 -0
  452. package/dist/types/kernel/injector/serviceOrder.d.ts +29 -0
  453. package/dist/types/kernel/inspect/adminSubjects.d.ts +169 -0
  454. package/dist/types/kernel/inspect/docOutline.d.ts +53 -0
  455. package/dist/types/kernel/lifecycleTags.d.ts +79 -0
  456. package/dist/types/kernel/moduleConfig.d.ts +35 -0
  457. package/dist/types/kernel/moduleGating.d.ts +78 -0
  458. package/dist/types/kernel/readinessRegistry.d.ts +104 -0
  459. package/dist/types/kernel/resolveModuleEntry.d.ts +46 -0
  460. package/dist/types/mcp/caller.d.ts +55 -0
  461. package/dist/types/mcp/guard.d.ts +66 -0
  462. package/dist/types/mcp/protocol.d.ts +163 -0
  463. package/dist/types/mcp/server.d.ts +70 -0
  464. package/dist/types/mcp/tools.d.ts +209 -0
  465. package/dist/types/oauth/authorizationServer.d.ts +204 -0
  466. package/dist/types/oauth/protectedResource.d.ts +339 -0
  467. package/dist/types/realtime/IRealtimeSocket.d.ts +142 -0
  468. package/dist/types/realtime/IRealtimeTransport.d.ts +50 -0
  469. package/dist/types/realtime/JsonRpcPeer.d.ts +251 -0
  470. package/dist/types/realtime/RealtimeEventMap.d.ts +269 -0
  471. package/dist/types/realtime/channelRate.d.ts +55 -0
  472. package/dist/types/realtime/platformChannels.d.ts +147 -0
  473. package/dist/types/runtime/GcScheduler.d.ts +96 -0
  474. package/dist/types/runtime/RequestContext.d.ts +152 -0
  475. package/dist/types/runtime/bearer.d.ts +88 -0
  476. package/dist/types/runtime/engineEnvironment.d.ts +115 -0
  477. package/dist/types/runtime/loadEnv.d.ts +86 -0
  478. package/dist/types/runtime/pageFacets.d.ts +104 -0
  479. package/dist/types/runtime/pageFilters.d.ts +139 -0
  480. package/dist/types/runtime/pageGuard.d.ts +78 -0
  481. package/dist/types/runtime/pageQuery.d.ts +138 -0
  482. package/dist/types/runtime/pageSort.d.ts +86 -0
  483. package/dist/types/runtime/redact.d.ts +27 -0
  484. package/dist/types/runtime/withTimeout.d.ts +51 -0
  485. package/dist/types/service/cluster/ClusterManager.d.ts +112 -0
  486. package/dist/types/service/cluster/ClusterProbeAggregator.d.ts +68 -0
  487. package/dist/types/service/cluster/ClusterRelay.d.ts +57 -0
  488. package/dist/types/service/cluster/clusterMaster.d.ts +40 -0
  489. package/dist/types/service/cluster/clusterMessage.d.ts +94 -0
  490. package/dist/types/service/cluster/cpuQuota.d.ts +37 -0
  491. package/dist/types/service/cluster/instanceProbe.d.ts +82 -0
  492. package/dist/types/service/cluster/podEnvironment.d.ts +35 -0
  493. package/dist/types/service/cluster/processProbe.d.ts +53 -0
  494. package/dist/types/service/cluster/richProcessProbe.d.ts +77 -0
  495. package/dist/types/service/cluster/topology.d.ts +64 -0
  496. package/dist/types/service/dev/BootReporter.d.ts +67 -0
  497. package/dist/types/service/dev/DevSupervisor.d.ts +117 -0
  498. package/dist/types/service/dev/bootVerdict.d.ts +99 -0
  499. package/dist/types/service/dev/detachedStart.d.ts +164 -0
  500. package/dist/types/service/dev/devProcess.d.ts +638 -0
  501. package/dist/types/service/dev/devProjects.d.ts +121 -0
  502. package/dist/types/service/dev/devStatusReport.d.ts +141 -0
  503. package/dist/types/service/dev/devStop.d.ts +57 -0
  504. package/dist/types/service/fetchService.d.ts +29 -0
  505. package/dist/types/service/gitService.d.ts +24 -0
  506. package/dist/types/syslog/Pdu.d.ts +134 -0
  507. package/dist/types/syslog/Syslog.d.ts +482 -0
  508. package/dist/types/syslog/drivers/ClusterFileLogDriver.d.ts +40 -0
  509. package/dist/types/syslog/drivers/FileLogDriver.d.ts +55 -0
  510. package/dist/types/syslog/drivers/ILogDriver.d.ts +177 -0
  511. package/dist/types/syslog/drivers/LokiLogDriver.d.ts +44 -0
  512. package/dist/types/syslog/drivers/MemoryLogDriver.d.ts +20 -0
  513. package/dist/types/syslog/drivers/OpenSearchLogDriver.d.ts +40 -0
  514. package/dist/types/syslog/drivers/builtinLogDrivers.d.ts +43 -0
  515. package/dist/types/syslog/drivers/filterPdus.d.ts +21 -0
  516. package/dist/types/syslog/drivers/logDriverRegistry.d.ts +100 -0
  517. package/dist/types/syslog/drivers/opensearchShared.d.ts +11 -0
  518. package/dist/types/syslog/drivers/pduFlow.d.ts +53 -0
  519. package/dist/types/syslog/drivers/pduProtocol.d.ts +20 -0
  520. package/dist/types/syslog/httpFetch.d.ts +48 -0
  521. package/dist/types/syslog/logColor.d.ts +59 -0
  522. package/dist/types/syslog/sinks/FileSink.d.ts +78 -0
  523. package/dist/types/syslog/transports/BatchingHttpTransport.d.ts +59 -0
  524. package/dist/types/syslog/transports/ConsoleTransport.d.ts +8 -0
  525. package/dist/types/syslog/transports/FileTransport.d.ts +13 -0
  526. package/dist/types/syslog/transports/HttpTransport.d.ts +15 -0
  527. package/dist/types/syslog/transports/LokiTransport.d.ts +45 -0
  528. package/dist/types/syslog/transports/OpenSearchTransport.d.ts +40 -0
  529. package/dist/types/syslog/transports/SyslogTransport.d.ts +9 -0
  530. package/dist/types/syslog/transports/index.d.ts +12 -0
  531. package/dist/types/testing/index.d.ts +197 -0
  532. package/dist/types/types/IAdminApi.d.ts +246 -0
  533. package/dist/types/types/ICliKernel.d.ts +28 -0
  534. package/dist/types/types/ICommand.d.ts +14 -0
  535. package/dist/types/types/IContainer.d.ts +35 -0
  536. package/dist/types/types/IIdempotencyStore.d.ts +159 -0
  537. package/dist/types/types/IKernel.d.ts +138 -0
  538. package/dist/types/types/IMcpTool.d.ts +157 -0
  539. package/dist/types/types/IModule.d.ts +73 -0
  540. package/dist/types/types/IModuleManifest.d.ts +49 -0
  541. package/dist/types/types/IPage.d.ts +119 -0
  542. package/dist/types/types/IService.d.ts +62 -0
  543. package/dist/types/types/ISyslog.d.ts +58 -0
  544. package/dist/types/types/ITransport.d.ts +5 -0
  545. package/dist/types/types/globals.d.ts +47 -0
  546. package/docs/angular-services.md +318 -0
  547. package/docs/catalogue.md +184 -0
  548. package/docs/cli.md +369 -0
  549. package/docs/client.md +616 -0
  550. package/docs/debugbar.md +218 -0
  551. package/docs/environnement.md +308 -0
  552. package/docs/index.md +388 -0
  553. package/docs/kernel.md +670 -0
  554. package/docs/progression.md +228 -0
  555. package/docs/react-hooks.md +686 -0
  556. package/docs/request-context.md +507 -0
  557. package/docs/service.md +590 -0
  558. package/docs/svelte-reactivite.md +293 -0
  559. package/docs/syslog.md +848 -0
  560. package/docs/testing.md +203 -0
  561. package/docs/vue-composables.md +255 -0
  562. package/man/nodefony.1 +152 -0
  563. package/package.json +163 -83
  564. package/templates/app/agents/AGENTS.md.tpl +967 -0
  565. package/templates/app/agents/POINTEUR.md.tpl +12 -0
  566. package/templates/app/base/Dockerfile.tpl +104 -0
  567. package/templates/app/base/README.md.tpl +314 -0
  568. package/templates/app/base/dockerignore.tpl +28 -0
  569. package/templates/app/base/env.ts.tpl +130 -0
  570. package/templates/app/base/gitattributes.tpl +28 -0
  571. package/templates/app/base/github/workflows/ci.yml.tpl +91 -0
  572. package/templates/app/base/gitignore.tpl +46 -0
  573. package/templates/app/base/gitlab-ci.yml.tpl +42 -0
  574. package/templates/app/base/index.ts.tpl +69 -0
  575. package/templates/app/base/nodefony.config.ts.tpl +342 -0
  576. package/templates/app/base/oxlintrc.json.tpl +127 -0
  577. package/templates/app/base/package.json.tpl +75 -0
  578. package/templates/app/base/prettierignore.tpl +24 -0
  579. package/templates/app/base/prettierrc.json.tpl +12 -0
  580. package/templates/app/base/rolldown.config.ts.tpl +8 -0
  581. package/templates/app/base/tests/config.test.ts.tpl +29 -0
  582. package/templates/app/base/tests/e2e.setup.ts.tpl +181 -0
  583. package/templates/app/base/tests/e2e.test.ts.tpl +105 -0
  584. package/templates/app/base/tests/migrations.e2e.test.ts.tpl +579 -0
  585. package/templates/app/base/tsconfig.json.tpl +47 -0
  586. package/templates/app/base/vitest.config.ts.tpl +88 -0
  587. package/templates/app/base/vitest.e2e.config.ts.tpl +39 -0
  588. package/templates/app/complete/compose.yaml.tpl +328 -0
  589. package/templates/app/complete/deploy/migrate-job.yaml.tpl +100 -0
  590. package/templates/app/complete/docker/db/init-nodefony-e2e.sql.tpl +30 -0
  591. package/templates/app/complete/docker/grafana/provisioning/datasources/loki.yaml.tpl +15 -0
  592. package/templates/app/complete/env.local.tpl +11 -0
  593. package/templates/app/complete/env.tpl +53 -0
  594. package/templates/app/complete/nodefony/entity/User.ts.tpl +69 -0
  595. package/templates/app/complete/nodefony/security/provisionUsers.ts.tpl +124 -0
  596. package/templates/app/complete/nodefony/service/AppBannerService.ts.tpl +98 -0
  597. package/templates/app/complete/nodefony/service/AppInfoService.ts.tpl +85 -0
  598. package/templates/app/frontend/angular/frontend/src/accent.css.tpl +34 -0
  599. package/templates/app/frontend/angular/frontend/src/app/app.component.ts.tpl +400 -0
  600. package/templates/app/frontend/react/frontend/src/App.tsx.tpl +421 -0
  601. package/templates/app/frontend/react/frontend/src/accent.css.tpl +30 -0
  602. package/templates/app/frontend/shared/frontend/src/brand.ts.tpl +3 -0
  603. package/templates/app/frontend/shared/frontend/src/showcase.css.tpl +224 -0
  604. package/templates/app/frontend/shared/nodefony/controllers/AppController.ts.tpl +45 -0
  605. package/templates/app/frontend/svelte/frontend/src/App.svelte.tpl +371 -0
  606. package/templates/app/frontend/svelte/frontend/src/accent.css.tpl +34 -0
  607. package/templates/app/frontend/vue/frontend/src/App.vue.tpl +367 -0
  608. package/templates/app/frontend/vue/frontend/src/accent.css.tpl +34 -0
  609. package/templates/app/home/nodefony/controllers/HomeController.ts.tpl +38 -0
  610. package/templates/command/nodefony/command/__NAME__.ts.tpl +132 -0
  611. package/templates/controller/duplex/nodefony/controllers/__NAME__.ts.tpl +188 -0
  612. package/templates/controller/example/nodefony/controllers/__NAME__.ts.tpl +348 -0
  613. package/templates/controller/hello/nodefony/controllers/__NAME__.ts.tpl +143 -0
  614. package/templates/controller/realtime/nodefony/controllers/__NAME__.ts.tpl +153 -0
  615. package/templates/controller/realtime/tests/__KEBAB__-realtime.test.ts.tpl +79 -0
  616. package/templates/controller/rest/nodefony/controllers/__NAME__.ts.tpl +159 -0
  617. package/templates/entity/base/nodefony/entity/__PASCAL__.schema.ts.tpl +31 -0
  618. package/templates/entity/base/nodefony/entity/__PASCAL__.ts.tpl +68 -0
  619. package/templates/entity/controller/nodefony/controllers/__PASCAL__Controller.ts.tpl +335 -0
  620. package/templates/entity/service/nodefony/service/__PASCAL__Service.ts.tpl +126 -0
  621. package/templates/entity/tests/tests/__KEBAB__.e2e.test.ts.tpl +358 -0
  622. package/templates/entity/tests/tests/__KEBAB__.test.ts.tpl +87 -0
  623. package/templates/front/angular/frontend/src/app/app.component.ts.tpl +30 -0
  624. package/templates/front/base/nodefony/controllers/__NAME__.ts.tpl +60 -0
  625. package/templates/front/react/frontend/src/App.tsx.tpl +26 -0
  626. package/templates/front/svelte/frontend/src/App.svelte.tpl +19 -0
  627. package/templates/front/vue/frontend/src/App.vue.tpl +23 -0
  628. package/templates/module/ai/AGENTS.md.tpl +71 -0
  629. package/templates/module/base/README.md.tpl +62 -0
  630. package/templates/module/base/docs/index.md.tpl +55 -0
  631. package/templates/module/base/index.ts.tpl +50 -0
  632. package/templates/module/base/nodefony/config/config.ts.tpl +60 -0
  633. package/templates/module/base/nodefony/config/defineModuleConfig.ts.tpl +55 -0
  634. package/templates/module/base/nodefony/src/errors/__PASCAL__Error.ts.tpl +20 -0
  635. package/templates/module/base/package.json.tpl +53 -0
  636. package/templates/module/base/rolldown.config.ts.tpl +14 -0
  637. package/templates/module/base/tests/__KEBAB__.test.ts.tpl +39 -0
  638. package/templates/module/base/tsconfig.json.tpl +42 -0
  639. package/templates/module/base/vitest.config.ts.tpl +27 -0
  640. package/templates/module/packages/CLAUDE.md.tpl +51 -0
  641. package/templates/module/packages/MEMORY.md.tpl +39 -0
  642. package/templates/module/packages/tsconfig.declarations.json.tpl +19 -0
  643. package/templates/module/packages/tsconfig.tests.json.tpl +11 -0
  644. package/templates/module/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +14 -0
  645. package/templates/module/service/nodefony/interfaces/index.ts.tpl +1 -0
  646. package/templates/module/service/nodefony/service/__PASCAL__Service.ts.tpl +116 -0
  647. package/templates/service/nodefony/interfaces/I__PASCAL__Service.ts.tpl +19 -0
  648. package/templates/service/nodefony/service/__PASCAL__Service.ts.tpl +136 -0
  649. package/templates/service/tests/__PASCAL__Service.test.ts.tpl +53 -0
  650. package/templates/shared/front-entry/angular/frontend/src/main.ts.tpl +17 -0
  651. package/templates/shared/front-entry/react/frontend/src/main.tsx.tpl +11 -0
  652. package/templates/shared/front-entry/svelte/frontend/src/main.ts.tpl +13 -0
  653. package/templates/shared/front-entry/vue/frontend/src/main.ts.tpl +12 -0
  654. package/templates/shared/front-registrar/nodefony/frontend/register__PASCAL__Entry.ts.tpl +40 -0
  655. package/templates/shared/front-shell/frontend/index.html.tpl +39 -0
  656. package/templates/shared/ng-app-tsconfig/frontend/tsconfig.app.json.tpl +18 -0
  657. package/templates/shared/svelte-shim/frontend/src/env.d.ts.tpl +12 -0
  658. package/templates/shared/vue-shim/frontend/src/env.d.ts.tpl +15 -0
  659. package/.yarnclean +0 -45
  660. package/CHANGELOG.md +0 -406
  661. package/autoloader.es6 +0 -253
  662. package/builder.es6 +0 -366
  663. package/cli/builder/bundles/bundle.js +0 -328
  664. package/cli/builder/bundles/controller.js +0 -73
  665. package/cli/builder/bundles/users-bundle/.yarnclean +0 -45
  666. package/cli/builder/bundles/users-bundle/Command/fixtureTask.js +0 -47
  667. package/cli/builder/bundles/users-bundle/Command/usersCommand.js +0 -105
  668. package/cli/builder/bundles/users-bundle/Entity/mongoose/userEntity.js +0 -168
  669. package/cli/builder/bundles/users-bundle/Entity/sequelize/userEntity.js +0 -231
  670. package/cli/builder/bundles/users-bundle/Fixtures/users.js +0 -117
  671. package/cli/builder/bundles/users-bundle/Fixtures/usersFixtures.js +0 -114
  672. package/cli/builder/bundles/users-bundle/Resources/config/config.js +0 -90
  673. package/cli/builder/bundles/users-bundle/Resources/config/routing.js +0 -17
  674. package/cli/builder/bundles/users-bundle/Resources/config/security.js +0 -96
  675. package/cli/builder/bundles/users-bundle/Resources/config/services.js +0 -7
  676. package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.dev.config.js +0 -13
  677. package/cli/builder/bundles/users-bundle/Resources/config/webpack/webpack.prod.config.js +0 -31
  678. package/cli/builder/bundles/users-bundle/Resources/config/webpack.config.js +0 -146
  679. package/cli/builder/bundles/users-bundle/Resources/js/users.js +0 -153
  680. package/cli/builder/bundles/users-bundle/Resources/public/favicon.ico +0 -0
  681. package/cli/builder/bundles/users-bundle/Resources/public/images/users-logo.png +0 -0
  682. package/cli/builder/bundles/users-bundle/Resources/scss/awesome/font-awesome.config.js +0 -11
  683. package/cli/builder/bundles/users-bundle/Resources/scss/custom.scss +0 -23
  684. package/cli/builder/bundles/users-bundle/Resources/scss/users.scss +0 -59
  685. package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/login.js +0 -235
  686. package/cli/builder/bundles/users-bundle/Resources/swagger/openapi/users.js +0 -232
  687. package/cli/builder/bundles/users-bundle/Resources/translations/login.en_en.yml +0 -14
  688. package/cli/builder/bundles/users-bundle/Resources/translations/login.fr_fr.yml +0 -14
  689. package/cli/builder/bundles/users-bundle/Resources/translations/users.en_en.yml +0 -35
  690. package/cli/builder/bundles/users-bundle/Resources/translations/users.fr_fr.yml +0 -36
  691. package/cli/builder/bundles/users-bundle/Resources/views/base.html.twig +0 -32
  692. package/cli/builder/bundles/users-bundle/Resources/views/footer.html.twig +0 -7
  693. package/cli/builder/bundles/users-bundle/Resources/views/header.html.twig +0 -90
  694. package/cli/builder/bundles/users-bundle/Resources/views/login/login.html.twig +0 -43
  695. package/cli/builder/bundles/users-bundle/Resources/views/users/createUser.html.twig +0 -296
  696. package/cli/builder/bundles/users-bundle/Resources/views/users/readUsers.html.twig +0 -94
  697. package/cli/builder/bundles/users-bundle/controller/api/graphql/graphqlController.js +0 -56
  698. package/cli/builder/bundles/users-bundle/controller/api/graphql/userResolver.js +0 -121
  699. package/cli/builder/bundles/users-bundle/controller/api/graphql/usertype.js +0 -58
  700. package/cli/builder/bundles/users-bundle/controller/api/openapi/loginApiController.js +0 -210
  701. package/cli/builder/bundles/users-bundle/controller/api/openapi/restUserController.js +0 -244
  702. package/cli/builder/bundles/users-bundle/controller/loginController.js +0 -91
  703. package/cli/builder/bundles/users-bundle/controller/usersController.js +0 -332
  704. package/cli/builder/bundles/users-bundle/package.json +0 -58
  705. package/cli/builder/bundles/users-bundle/readme.md +0 -360
  706. package/cli/builder/bundles/users-bundle/services/usersService.js +0 -411
  707. package/cli/builder/bundles/users-bundle/src/providers/mongoose/userProvider.js +0 -47
  708. package/cli/builder/bundles/users-bundle/src/providers/sequelize/userProvider.js +0 -48
  709. package/cli/builder/bundles/users-bundle/tests/loginTest.js +0 -182
  710. package/cli/builder/bundles/users-bundle/usersBundle.js +0 -26
  711. package/cli/builder/microService/microService.js +0 -261
  712. package/cli/builder/microService/skeletons/.editorconfig +0 -18
  713. package/cli/builder/microService/skeletons/.env-cmdrc.js +0 -32
  714. package/cli/builder/microService/skeletons/.jshintrc +0 -37
  715. package/cli/builder/microService/skeletons/README.md +0 -117
  716. package/cli/builder/microService/skeletons/bin/bash/hello.sh +0 -5
  717. package/cli/builder/microService/skeletons/bin/cli +0 -13
  718. package/cli/builder/microService/skeletons/bin/python/hello.py +0 -20
  719. package/cli/builder/microService/skeletons/config/config.js +0 -29
  720. package/cli/builder/microService/skeletons/config/pm2.config.js +0 -72
  721. package/cli/builder/microService/skeletons/config/webpack/webpack.config.dev.js +0 -8
  722. package/cli/builder/microService/skeletons/config/webpack/webpack.config.prod.js +0 -25
  723. package/cli/builder/microService/skeletons/config/webpack.config.js +0 -114
  724. package/cli/builder/microService/skeletons/package.json +0 -76
  725. package/cli/builder/microService/skeletons/src/browser/index.css +0 -3
  726. package/cli/builder/microService/skeletons/src/browser/index.js +0 -16
  727. package/cli/builder/microService/skeletons/src/browser/socketio.js +0 -46
  728. package/cli/builder/microService/skeletons/src/cli/cli.js +0 -224
  729. package/cli/builder/microService/skeletons/src/cli/menu.js +0 -28
  730. package/cli/builder/microService/skeletons/src/n-api/README.md +0 -1
  731. package/cli/builder/microService/skeletons/src/n-api/binding.gyp +0 -14
  732. package/cli/builder/microService/skeletons/src/n-api/hello.cc +0 -14
  733. package/cli/builder/microService/skeletons/src/n-api/hello.js +0 -23
  734. package/cli/builder/microService/skeletons/src/n-api/package.json +0 -15
  735. package/cli/builder/microService/skeletons/src/node/examples/index.js +0 -120
  736. package/cli/builder/microService/skeletons/src/node/index.js +0 -102
  737. package/cli/builder/microService/skeletons/src/node/services/markdown/markdown.js +0 -27
  738. package/cli/builder/microService/skeletons/src/node/services/servers/http.js +0 -45
  739. package/cli/builder/microService/skeletons/src/node/services/servers/https.js +0 -44
  740. package/cli/builder/microService/skeletons/src/node/services/socketio/socketio.js +0 -46
  741. package/cli/builder/microService/skeletons/src/node/services/syscall/syscall.js +0 -111
  742. package/cli/builder/microService/skeletons/src/node/services/worker/thread.js +0 -59
  743. package/cli/builder/microService/skeletons/src/node/services/worker/worker.js +0 -60
  744. package/cli/builder/microService/skeletons/src/templates/base.html +0 -12
  745. package/cli/builder/microService/skeletons/src/templates/socket.html +0 -23
  746. package/cli/builder/microService/skeletons/tests/unit/serviceTest.js +0 -30
  747. package/cli/builder/project/project.js +0 -474
  748. package/cli/builder/project/skeletons/README.md +0 -778
  749. package/cli/builder/project/skeletons/bin/dev-deploy.sh +0 -5
  750. package/cli/builder/project/skeletons/bin/generateCertificates.sh.skeleton +0 -180
  751. package/cli/builder/project/skeletons/bin/prod-deploy.sh +0 -3
  752. package/cli/builder/project/skeletons/config/config.js.skeleton +0 -178
  753. package/cli/builder/project/skeletons/config/openssl/ca/openssl.cnf.skeleton +0 -150
  754. package/cli/builder/project/skeletons/config/openssl/ca_intermediate/openssl.cnf.skeleton +0 -152
  755. package/cli/builder/project/skeletons/config/pm2.config.js.skeleton +0 -62
  756. package/cli/builder/project/skeletons/documentation.html.twig +0 -24
  757. package/cli/builder/project/skeletons/editorconfig.skeleton +0 -18
  758. package/cli/builder/project/skeletons/eslintignore.skeleton +0 -15
  759. package/cli/builder/project/skeletons/eslintrc.js.skeleton +0 -97
  760. package/cli/builder/project/skeletons/gitignore.skeleton +0 -32
  761. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.37.entity-user.js +0 -137
  762. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.38.entity-session.js +0 -97
  763. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.39.entity-requests.js +0 -115
  764. package/cli/builder/project/skeletons/migrations/2022.12.25T17.37.40.entity-jwts.js +0 -97
  765. package/cli/builder/project/skeletons/migrations/migrations.skeleton.js +0 -101
  766. package/cli/builder/project/skeletons/package.json.twig +0 -71
  767. package/cli/builder/react/reactBuilder.js +0 -224
  768. package/cli/builder/react/skeletons/app/Resources/databases/nodefony.db +0 -0
  769. package/cli/builder/react/skeletons/app/Resources/translations/messages.en_en.yml +0 -5
  770. package/cli/builder/react/skeletons/app/Resources/translations/messages.fr_fr.yml +0 -5
  771. package/cli/builder/react/skeletons/app/Resources/views/base.html.twig +0 -33
  772. package/cli/builder/react/skeletons/app/config/config.js +0 -392
  773. package/cli/builder/react/skeletons/app/config/routing.js +0 -10
  774. package/cli/builder/react/skeletons/app/config/security.js +0 -74
  775. package/cli/builder/react/skeletons/app/controller/appController.js +0 -22
  776. package/cli/builder/sandbox/sandBoxBuilder.js +0 -610
  777. package/cli/builder/sandbox/skeletons/Resources/css/entry.css +0 -48
  778. package/cli/builder/sandbox/skeletons/Resources/js/entry.js +0 -60
  779. package/cli/builder/sandbox/skeletons/Resources/public/manifest.json +0 -32
  780. package/cli/builder/sandbox/skeletons/Resources/translations/messages.en_en.yml +0 -5
  781. package/cli/builder/sandbox/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
  782. package/cli/builder/sandbox/skeletons/Resources/views/base.html.twig +0 -46
  783. package/cli/builder/sandbox/skeletons/Resources/views/index.html.twig +0 -34
  784. package/cli/builder/sandbox/skeletons/bootstrap/custom.scss +0 -27
  785. package/cli/builder/sandbox/skeletons/bootstrap/entry.scss +0 -60
  786. package/cli/builder/sandbox/skeletons/workbox/templates/index.html.twig +0 -32
  787. package/cli/builder/sandbox/skeletons/workbox/workers/service-worker.js +0 -196
  788. package/cli/builder/skeletons/Resources/public/favicon.ico +0 -0
  789. package/cli/builder/skeletons/Resources/public/images/app-logo.png +0 -0
  790. package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.html.twig +0 -1
  791. package/cli/builder/skeletons/Resources/views/framework-bundle/views/401.json.twig +0 -24
  792. package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.html.twig +0 -1
  793. package/cli/builder/skeletons/Resources/views/framework-bundle/views/403.json.twig +0 -20
  794. package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.html.twig +0 -1
  795. package/cli/builder/skeletons/Resources/views/framework-bundle/views/404.json.twig +0 -20
  796. package/cli/builder/skeletons/Resources/views/framework-bundle/views/500.html.twig +0 -1
  797. package/cli/builder/skeletons/Resources/views/framework-bundle/views/base.html.twig +0 -30
  798. package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.html.twig +0 -1
  799. package/cli/builder/skeletons/Resources/views/framework-bundle/views/exception.json.twig +0 -24
  800. package/cli/builder/skeletons/Resources/views/framework-bundle/views/footer.html.twig +0 -33
  801. package/cli/builder/skeletons/Resources/views/framework-bundle/views/header.html.twig +0 -6
  802. package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.html.twig +0 -6
  803. package/cli/builder/skeletons/Resources/views/framework-bundle/views/index.json.twig +0 -1
  804. package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.html.twig +0 -125
  805. package/cli/builder/skeletons/Resources/views/framework-bundle/views/layout.json.twig +0 -5
  806. package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.html.twig +0 -1
  807. package/cli/builder/skeletons/Resources/views/framework-bundle/views/timeout.json.twig +0 -24
  808. package/cli/builder/skeletons/app/appKernel.js +0 -133
  809. package/cli/builder/skeletons/binding/binding.cc +0 -26
  810. package/cli/builder/skeletons/binding/binding.skeleton +0 -8
  811. package/cli/builder/skeletons/bundle/bundleClass.js +0 -37
  812. package/cli/builder/skeletons/command/commandClass.js +0 -11
  813. package/cli/builder/skeletons/command/taskClass.js +0 -20
  814. package/cli/builder/skeletons/config/config.js +0 -138
  815. package/cli/builder/skeletons/config/nodefony/elastic-bundle.js +0 -37
  816. package/cli/builder/skeletons/config/nodefony/framework-bundle.js +0 -22
  817. package/cli/builder/skeletons/config/nodefony/http-bundle.js +0 -104
  818. package/cli/builder/skeletons/config/nodefony/mail-bundle.js +0 -44
  819. package/cli/builder/skeletons/config/nodefony/mongoose-bundle.js +0 -51
  820. package/cli/builder/skeletons/config/nodefony/monitoring-bundle.js +0 -34
  821. package/cli/builder/skeletons/config/nodefony/realtime-bundle.js +0 -15
  822. package/cli/builder/skeletons/config/nodefony/redis-bundle.js +0 -44
  823. package/cli/builder/skeletons/config/nodefony/security-bundle.js +0 -25
  824. package/cli/builder/skeletons/config/nodefony/sequelize-bundle.js +0 -156
  825. package/cli/builder/skeletons/config/routing.js +0 -55
  826. package/cli/builder/skeletons/config/security.js +0 -102
  827. package/cli/builder/skeletons/config/services.js +0 -1
  828. package/cli/builder/skeletons/config/webpack/webpack.dev.config.js +0 -13
  829. package/cli/builder/skeletons/config/webpack/webpack.prod.config.js +0 -20
  830. package/cli/builder/skeletons/config/webpack.config.js +0 -148
  831. package/cli/builder/skeletons/controller/controllerClass.js +0 -75
  832. package/cli/builder/skeletons/package.json.twig +0 -57
  833. package/cli/builder/skeletons/unittest/testFile.js +0 -46
  834. package/cli/builder/vue/skeletons/Resources/public/images/app-logo.png +0 -0
  835. package/cli/builder/vue/skeletons/Resources/translations/messages.en_en.yml +0 -5
  836. package/cli/builder/vue/skeletons/Resources/translations/messages.fr_fr.yml +0 -5
  837. package/cli/builder/vue/skeletons/vue.config.js +0 -129
  838. package/cli/builder/vue/vueBuilder.js +0 -410
  839. package/cli/generate/generate.es6 +0 -103
  840. package/cli/install/install.js +0 -190
  841. package/cli/sequelize/sequelize.js +0 -94
  842. package/cli/start.js +0 -702
  843. package/cli/tools/pm2.es6 +0 -112
  844. package/cli/tools/tools.es6 +0 -97
  845. package/cli.es6 +0 -925
  846. package/container.es6 +0 -272
  847. package/error.es6 +0 -293
  848. package/fileClass.es6 +0 -242
  849. package/finder/file.es6 +0 -33
  850. package/finder/fileResult.es6 +0 -138
  851. package/finder/finder2.es6 +0 -275
  852. package/finder.es6 +0 -427
  853. package/kernel/annotations/annotations.es6 +0 -286
  854. package/kernel/api/api.es6 +0 -61
  855. package/kernel/api/graphqlApi.es6 +0 -107
  856. package/kernel/api/jsonApi.es6 +0 -177
  857. package/kernel/api/openApi.es6 +0 -139
  858. package/kernel/api/schemas/openApiSchema.js +0 -394
  859. package/kernel/babylon.es6 +0 -162
  860. package/kernel/bundle.es6 +0 -1200
  861. package/kernel/cliKernel.es6 +0 -869
  862. package/kernel/command.es6 +0 -78
  863. package/kernel/commands/nodefonyCommand.es6 +0 -247
  864. package/kernel/commands/tasks/bundlesTask.es6 +0 -59
  865. package/kernel/controllers/controller.es6 +0 -791
  866. package/kernel/fixture.es6 +0 -19
  867. package/kernel/injections/injections.es6 +0 -424
  868. package/kernel/kernel.es6 +0 -1960
  869. package/kernel/kernelWatcher.es6 +0 -387
  870. package/kernel/orm/entity.es6 +0 -59
  871. package/kernel/orm/orm.es6 +0 -139
  872. package/kernel/reader.es6 +0 -290
  873. package/kernel/security/encoder.es6 +0 -17
  874. package/kernel/security/factories/factory.es6 +0 -111
  875. package/kernel/security/factories/passeportFactory.es6 +0 -61
  876. package/kernel/security/provider.es6 +0 -58
  877. package/kernel/security/providers/chainProvider.es6 +0 -99
  878. package/kernel/security/providers/memoryProvider.es6 +0 -55
  879. package/kernel/security/providers/providerManager.es6 +0 -67
  880. package/kernel/security/providers/userEntityProvider.es6 +0 -50
  881. package/kernel/security/role.es6 +0 -12
  882. package/kernel/security/secureArea.es6 +0 -431
  883. package/kernel/security/tokens/token.es6 +0 -171
  884. package/kernel/security/user.es6 +0 -106
  885. package/kernel/serviceRealTime.es6 +0 -21
  886. package/kernel/services/connectionsService.es6 +0 -93
  887. package/kernel/services/cron/cronService.es6 +0 -123
  888. package/kernel/task.es6 +0 -80
  889. package/kernel/templates.es6 +0 -22
  890. package/kernel/templating/twig.es6 +0 -218
  891. package/kernel/tests/cliTest.js +0 -59
  892. package/kernel/tests/containerTest.js +0 -232
  893. package/kernel/tests/kernelTest.js +0 -39
  894. package/nodefony.es6 +0 -1084
  895. package/notificationsCenter.es6 +0 -118
  896. package/protocol.es6 +0 -86
  897. package/protocols/bayeux.es6 +0 -174
  898. package/protocols/jsonRpc/jsonrpc.es6 +0 -56
  899. package/result.es6 +0 -99
  900. package/service.es6 +0 -288
  901. package/syslog/pdu.es6 +0 -141
  902. package/syslog/syslog.es6 +0 -754
  903. 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 };