@futdevpro/ccap 1.1.2863 → 1.1.2881
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client-dist/{agent-instances.module-SRVXVWB4.js → agent-instances.module-U742BGNW.js} +2 -2
- package/client-dist/{ca.module-ZAYCRAK6.js → ca.module-WANXRIO7.js} +2 -2
- package/client-dist/cc-usage-dashboard.component-TPMSJIGI.js +2 -0
- package/client-dist/cc-usage-dashboard.component-TPMSJIGI.js.map +7 -0
- package/client-dist/{cc.module-BF2AOAIM.js → cc.module-JZUXUXHP.js} +2 -2
- package/client-dist/{chunk-CBIUSRE5.js → chunk-26DXMUXV.js} +2 -2
- package/client-dist/{chunk-AFF37OKI.js → chunk-2LJT2APC.js} +2 -2
- package/client-dist/{chunk-O7U4KV25.js → chunk-435IBC6L.js} +2 -2
- package/client-dist/{chunk-7JFONJTJ.js → chunk-467OMXRK.js} +2 -2
- package/client-dist/{chunk-7MSQD5HV.js → chunk-46N7EC7U.js} +2 -2
- package/client-dist/{chunk-XXO2YNDP.js → chunk-4OKUKX55.js} +2 -2
- package/client-dist/{chunk-34XFCTVF.js → chunk-4RRBZXYU.js} +2 -2
- package/client-dist/{chunk-OIBDRASW.js → chunk-4TBE5I3U.js} +2 -2
- package/client-dist/{chunk-DUN7ICUI.js → chunk-6A2IM2XR.js} +2 -2
- package/client-dist/{chunk-2LOFMRCO.js → chunk-6BQHKSUP.js} +2 -2
- package/client-dist/{chunk-4TEHGQ5C.js → chunk-6IYFOHCN.js} +2 -2
- package/client-dist/{chunk-WYTT3YHQ.js → chunk-6NWEJXDU.js} +2 -2
- package/client-dist/{chunk-ZMZ462V7.js → chunk-767Z7I55.js} +2 -2
- package/client-dist/{chunk-YU32GIMP.js → chunk-AS2SYIJB.js} +2 -2
- package/client-dist/{chunk-QUEQSNIS.js → chunk-BHWHGLKC.js} +2 -2
- package/client-dist/{chunk-TUKCFE3B.js → chunk-CILMMQ5V.js} +2 -2
- package/client-dist/{chunk-B7WQ5TK3.js → chunk-CSHUFD2L.js} +2 -2
- package/client-dist/{chunk-EZNIJZBL.js → chunk-DNHL6M7F.js} +2 -2
- package/client-dist/{chunk-EDQWK2Q5.js → chunk-DUN255KX.js} +2 -2
- package/client-dist/{chunk-UI6N7Y2P.js → chunk-EBSMIZTK.js} +2 -2
- package/client-dist/{chunk-YGTNCGIU.js → chunk-EY32IBWM.js} +2 -2
- package/client-dist/{chunk-I6OBHW45.js → chunk-FJGBPKHK.js} +2 -2
- package/client-dist/{chunk-EIT3LSQO.js → chunk-GDAL4G4Y.js} +2 -2
- package/client-dist/{chunk-FYXUOXRP.js → chunk-GR3CXOIX.js} +2 -2
- package/client-dist/{chunk-GODWUWRO.js → chunk-HDCFO7OE.js} +2 -2
- package/client-dist/{chunk-2X5MWPDN.js → chunk-HFVIX2ZG.js} +2 -2
- package/client-dist/{chunk-SX22WHCZ.js → chunk-HPBX6VCV.js} +2 -2
- package/client-dist/{chunk-VXJF6N32.js → chunk-IR4THKPA.js} +2 -2
- package/client-dist/{chunk-DZ74YN25.js → chunk-J5NYZUBP.js} +2 -2
- package/client-dist/{chunk-7JW45JC5.js → chunk-JDK64BE7.js} +2 -2
- package/client-dist/{chunk-EUY2HZZV.js → chunk-KMEGS6BP.js} +2 -2
- package/client-dist/{chunk-77HGZO43.js → chunk-KQLKM7RB.js} +2 -2
- package/client-dist/{chunk-52JG2IIG.js → chunk-LERWAULE.js} +2 -2
- package/client-dist/{chunk-L7PQ72ZG.js → chunk-M3RL34GF.js} +2 -2
- package/client-dist/{chunk-X2FIFUXZ.js → chunk-NJPSU6MN.js} +2 -2
- package/client-dist/{chunk-DHIVAX2C.js → chunk-ONEB5UF5.js} +2 -2
- package/client-dist/{chunk-ELFCSLIP.js → chunk-OP2PE3KG.js} +2 -2
- package/client-dist/{chunk-ELFCSLIP.js.map → chunk-OP2PE3KG.js.map} +1 -1
- package/client-dist/{chunk-SO3QL2U5.js → chunk-OZGFJXOA.js} +2 -2
- package/client-dist/{chunk-WQIBGXGU.js → chunk-PPRG7F5A.js} +2 -2
- package/client-dist/{chunk-4RT7LOTQ.js → chunk-PQUBI6TC.js} +2 -2
- package/client-dist/{chunk-XSP7NLZB.js → chunk-Q6JQHJME.js} +2 -2
- package/client-dist/{chunk-Q7GDEJL2.js → chunk-QDTY7SR6.js} +2 -2
- package/client-dist/{chunk-VLMQV3OI.js → chunk-RQ2HFT2L.js} +2 -2
- package/client-dist/{chunk-DU3IYPGM.js → chunk-RRN36VPR.js} +2 -2
- package/client-dist/{chunk-NI4AZWY2.js → chunk-S4GJTHYZ.js} +2 -2
- package/client-dist/{chunk-2Y7GYEOT.js → chunk-SKHAAE4A.js} +2 -2
- package/client-dist/{chunk-4XEPGDZH.js → chunk-TSPROG7P.js} +2 -2
- package/client-dist/{chunk-QHLRSGQG.js → chunk-U7ZBDYGU.js} +2 -2
- package/client-dist/{chunk-2DJBCAHJ.js → chunk-VQWGWQDA.js} +2 -2
- package/client-dist/{chunk-ZGWUDLYU.js → chunk-X7HHJQ2O.js} +2 -2
- package/client-dist/{chunk-23GMPVB5.js → chunk-XH3SQ4UP.js} +2 -2
- package/client-dist/{chunk-PZMEVMSF.js → chunk-XHF463TC.js} +2 -2
- package/client-dist/{chunk-CUUDVYOC.js → chunk-XJEATRA4.js} +2 -2
- package/client-dist/{chunk-QTRIOR6Z.js → chunk-XSXQC64X.js} +2 -2
- package/client-dist/{chunk-EMVGFT6L.js → chunk-YE57GLWU.js} +2 -2
- package/client-dist/{chunk-HSAGX22H.js → chunk-YX6NZTP7.js} +2 -2
- package/client-dist/{consultant.module-3PAIPMAH.js → consultant.module-WL4WEIIF.js} +2 -2
- package/client-dist/{crd.module-PJO2UJEG.js → crd.module-OE3ML5C7.js} +2 -2
- package/client-dist/{dashboard.module-TJMYHTHX.js → dashboard.module-NBINBB72.js} +2 -2
- package/client-dist/{do.module-SBE6P3B7.js → do.module-BLTXJC4T.js} +2 -2
- package/client-dist/{document-library.module-YH7IF4EP.js → document-library.module-TXGZT2VZ.js} +2 -2
- package/client-dist/{embedding-eval.module-STWWCUD7.js → embedding-eval.module-PYE5NL5R.js} +2 -2
- package/client-dist/{embedding-registry.module-XX6725DX.js → embedding-registry.module-46PAOMQR.js} +2 -2
- package/client-dist/{err.module-SL2IYMTF.js → err.module-B743IN5O.js} +2 -2
- package/client-dist/{feedback.module-RMRL65YC.js → feedback.module-H4YSPDLF.js} +2 -2
- package/client-dist/{host-runtime-mcp.module-OJORUP2R.js → host-runtime-mcp.module-6SK6OZH7.js} +2 -2
- package/client-dist/index.html +2 -2
- package/client-dist/{live-dev-pipeline.module-AMBMFVIH.js → live-dev-pipeline.module-MCPAY2LG.js} +2 -2
- package/client-dist/{logs.module-3CQ6KLLB.js → logs.module-CJF7RLV7.js} +2 -2
- package/client-dist/{main-RCFMPV3V.js → main-NZFBSJOQ.js} +3 -3
- package/client-dist/main-NZFBSJOQ.js.map +7 -0
- package/client-dist/{master-control-remote-poc.module-FD3E5JB7.js → master-control-remote-poc.module-LJ5ANCQ6.js} +2 -2
- package/client-dist/{mobile-app.module-LHVADRFV.js → mobile-app.module-G7LAAOOP.js} +2 -2
- package/client-dist/{model-registry.module-ZTKOWGAN.js → model-registry.module-WDAX2AHY.js} +2 -2
- package/client-dist/{oc.module-GLPSVTAT.js → oc.module-T43BN7CJ.js} +2 -2
- package/client-dist/{orc.module-BKMJC5YX.js → orc.module-R3P5Y4YW.js} +2 -2
- package/client-dist/{project-management.module-QEIXJONY.js → project-management.module-ODMCGFYI.js} +2 -2
- package/client-dist/project-source-routed.module-M22ABRHR.js +2 -0
- package/client-dist/{scheduler.module-TD4G2WNF.js → scheduler.module-TZLVYYMO.js} +2 -2
- package/client-dist/{session.module-YCITR6BG.js → session.module-3XGXYP4K.js} +2 -2
- package/client-dist/{set.module-JIWXIF2C.js → set.module-M3PJXM3W.js} +5 -5
- package/client-dist/{set.module-JIWXIF2C.js.map → set.module-M3PJXM3W.js.map} +3 -3
- package/client-dist/{setup.module-ZWL33O7N.js → setup.module-2U3R4YDE.js} +2 -2
- package/client-dist/styles-OJOSC7GL.css +2 -0
- package/client-dist/styles-OJOSC7GL.css.map +7 -0
- package/client-dist/{terminals.module-MKXQLASR.js → terminals.module-ULIXEKUD.js} +2 -2
- package/client-dist/{voice-notes-poc.module-7LUIU7P5.js → voice-notes-poc.module-GZGIIFPR.js} +2 -2
- package/client-dist/{wfs.module-2BMXPFAL.js → wfs.module-6B4QN7NS.js} +2 -2
- package/package.json +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/account/cc-account-usage-probe.util.d.ts +85 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/account/cc-account-usage-probe.util.d.ts.map +1 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/account/cc-account-usage-probe.util.js +264 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_collections/utils/account/cc-account-usage-probe.util.js.map +1 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_routes/cc-account/cc-account-route.control-service.d.ts +18 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_routes/cc-account/cc-account-route.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_routes/cc-account/cc-account-route.control-service.js +93 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_routes/cc-account/cc-account-route.control-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_routes/cc-account/cc-account.controller.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_routes/cc-account/cc-account.controller.js +14 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_routes/cc-account/cc-account.controller.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/account/cc-account-pool.control-service.d.ts +36 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/account/cc-account-pool.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/account/cc-account-pool.control-service.js +136 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/account/cc-account-pool.control-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/account/cc-account.data-service.d.ts +11 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/account/cc-account.data-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/account/cc-account.data-service.js +40 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/account/cc-account.data-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/terminal/cc-adapter-terminal.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/terminal/cc-adapter-terminal.control-service.js +34 -0
- package/server/build/src/_modules/external-sessions/_modules/claude-code/_services/core/terminal/cc-adapter-terminal.control-service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_services/exs-instance-presence.service.d.ts +4 -4
- package/server/build/src/_modules/external-sessions/_services/exs-instance-presence.service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_services/exs-instance-presence.service.js +12 -7
- package/server/build/src/_modules/external-sessions/_services/exs-instance-presence.service.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_services/exs-instance-presence.service.spec.js +17 -14
- package/server/build/src/_modules/external-sessions/_services/exs-instance-presence.service.spec.js.map +1 -1
- package/server/build/src/_modules/external-sessions/_services/exs-instance-registry.data-service.d.ts +6 -2
- package/server/build/src/_modules/external-sessions/_services/exs-instance-registry.data-service.d.ts.map +1 -1
- package/server/build/src/_modules/external-sessions/_services/exs-instance-registry.data-service.js +8 -4
- package/server/build/src/_modules/external-sessions/_services/exs-instance-registry.data-service.js.map +1 -1
- package/server/build/src/_modules/peer-instance/_models/interfaces/pei-heartbeat-status.interface.d.ts +23 -0
- package/server/build/src/_modules/peer-instance/_models/interfaces/pei-heartbeat-status.interface.d.ts.map +1 -0
- package/server/build/src/_modules/peer-instance/_models/interfaces/pei-heartbeat-status.interface.js +3 -0
- package/server/build/src/_modules/peer-instance/_models/interfaces/pei-heartbeat-status.interface.js.map +1 -0
- package/server/build/src/_modules/peer-instance/_services/pei-heartbeat-self-healing.spec.d.ts +10 -0
- package/server/build/src/_modules/peer-instance/_services/pei-heartbeat-self-healing.spec.d.ts.map +1 -0
- package/server/build/src/_modules/peer-instance/_services/pei-heartbeat-self-healing.spec.js +81 -0
- package/server/build/src/_modules/peer-instance/_services/pei-heartbeat-self-healing.spec.js.map +1 -0
- package/server/build/src/_modules/peer-instance/_services/pei-heartbeat.control-service.d.ts +49 -2
- package/server/build/src/_modules/peer-instance/_services/pei-heartbeat.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/peer-instance/_services/pei-heartbeat.control-service.js +107 -6
- package/server/build/src/_modules/peer-instance/_services/pei-heartbeat.control-service.js.map +1 -1
- package/server/build/src/_modules/peer-instance/_services/pei-ws-client-active-reconnect.spec.d.ts +8 -0
- package/server/build/src/_modules/peer-instance/_services/pei-ws-client-active-reconnect.spec.d.ts.map +1 -0
- package/server/build/src/_modules/peer-instance/_services/pei-ws-client-active-reconnect.spec.js +112 -0
- package/server/build/src/_modules/peer-instance/_services/pei-ws-client-active-reconnect.spec.js.map +1 -0
- package/server/build/src/_modules/peer-instance/_services/pei-ws-client.control-service.d.ts +26 -1
- package/server/build/src/_modules/peer-instance/_services/pei-ws-client.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/peer-instance/_services/pei-ws-client.control-service.js +60 -7
- package/server/build/src/_modules/peer-instance/_services/pei-ws-client.control-service.js.map +1 -1
- package/server/build/src/_modules/setup-config/_models/interfaces/cluster/sc-cluster-diagnostics-result.interface.d.ts +8 -0
- package/server/build/src/_modules/setup-config/_models/interfaces/cluster/sc-cluster-diagnostics-result.interface.d.ts.map +1 -1
- package/server/build/src/_modules/setup-config/_services/control-services/sc-cluster.control-service.d.ts.map +1 -1
- package/server/build/src/_modules/setup-config/_services/control-services/sc-cluster.control-service.js +8 -2
- package/server/build/src/_modules/setup-config/_services/control-services/sc-cluster.control-service.js.map +1 -1
- package/client-dist/cc-usage-dashboard.component-TNMEIWMI.js +0 -2
- package/client-dist/cc-usage-dashboard.component-TNMEIWMI.js.map +0 -7
- package/client-dist/main-RCFMPV3V.js.map +0 -7
- package/client-dist/project-source-routed.module-LSFQT5DK.js +0 -2
- package/client-dist/styles-WS3OIV37.css +0 -2
- package/client-dist/styles-WS3OIV37.css.map +0 -7
- /package/client-dist/{agent-instances.module-SRVXVWB4.js.map → agent-instances.module-U742BGNW.js.map} +0 -0
- /package/client-dist/{ca.module-ZAYCRAK6.js.map → ca.module-WANXRIO7.js.map} +0 -0
- /package/client-dist/{cc.module-BF2AOAIM.js.map → cc.module-JZUXUXHP.js.map} +0 -0
- /package/client-dist/{chunk-CBIUSRE5.js.map → chunk-26DXMUXV.js.map} +0 -0
- /package/client-dist/{chunk-AFF37OKI.js.map → chunk-2LJT2APC.js.map} +0 -0
- /package/client-dist/{chunk-O7U4KV25.js.map → chunk-435IBC6L.js.map} +0 -0
- /package/client-dist/{chunk-7JFONJTJ.js.map → chunk-467OMXRK.js.map} +0 -0
- /package/client-dist/{chunk-7MSQD5HV.js.map → chunk-46N7EC7U.js.map} +0 -0
- /package/client-dist/{chunk-XXO2YNDP.js.map → chunk-4OKUKX55.js.map} +0 -0
- /package/client-dist/{chunk-34XFCTVF.js.map → chunk-4RRBZXYU.js.map} +0 -0
- /package/client-dist/{chunk-OIBDRASW.js.map → chunk-4TBE5I3U.js.map} +0 -0
- /package/client-dist/{chunk-DUN7ICUI.js.map → chunk-6A2IM2XR.js.map} +0 -0
- /package/client-dist/{chunk-2LOFMRCO.js.map → chunk-6BQHKSUP.js.map} +0 -0
- /package/client-dist/{chunk-4TEHGQ5C.js.map → chunk-6IYFOHCN.js.map} +0 -0
- /package/client-dist/{chunk-WYTT3YHQ.js.map → chunk-6NWEJXDU.js.map} +0 -0
- /package/client-dist/{chunk-ZMZ462V7.js.map → chunk-767Z7I55.js.map} +0 -0
- /package/client-dist/{chunk-YU32GIMP.js.map → chunk-AS2SYIJB.js.map} +0 -0
- /package/client-dist/{chunk-QUEQSNIS.js.map → chunk-BHWHGLKC.js.map} +0 -0
- /package/client-dist/{chunk-TUKCFE3B.js.map → chunk-CILMMQ5V.js.map} +0 -0
- /package/client-dist/{chunk-B7WQ5TK3.js.map → chunk-CSHUFD2L.js.map} +0 -0
- /package/client-dist/{chunk-EZNIJZBL.js.map → chunk-DNHL6M7F.js.map} +0 -0
- /package/client-dist/{chunk-EDQWK2Q5.js.map → chunk-DUN255KX.js.map} +0 -0
- /package/client-dist/{chunk-UI6N7Y2P.js.map → chunk-EBSMIZTK.js.map} +0 -0
- /package/client-dist/{chunk-YGTNCGIU.js.map → chunk-EY32IBWM.js.map} +0 -0
- /package/client-dist/{chunk-I6OBHW45.js.map → chunk-FJGBPKHK.js.map} +0 -0
- /package/client-dist/{chunk-EIT3LSQO.js.map → chunk-GDAL4G4Y.js.map} +0 -0
- /package/client-dist/{chunk-FYXUOXRP.js.map → chunk-GR3CXOIX.js.map} +0 -0
- /package/client-dist/{chunk-GODWUWRO.js.map → chunk-HDCFO7OE.js.map} +0 -0
- /package/client-dist/{chunk-2X5MWPDN.js.map → chunk-HFVIX2ZG.js.map} +0 -0
- /package/client-dist/{chunk-SX22WHCZ.js.map → chunk-HPBX6VCV.js.map} +0 -0
- /package/client-dist/{chunk-VXJF6N32.js.map → chunk-IR4THKPA.js.map} +0 -0
- /package/client-dist/{chunk-DZ74YN25.js.map → chunk-J5NYZUBP.js.map} +0 -0
- /package/client-dist/{chunk-7JW45JC5.js.map → chunk-JDK64BE7.js.map} +0 -0
- /package/client-dist/{chunk-EUY2HZZV.js.map → chunk-KMEGS6BP.js.map} +0 -0
- /package/client-dist/{chunk-77HGZO43.js.map → chunk-KQLKM7RB.js.map} +0 -0
- /package/client-dist/{chunk-52JG2IIG.js.map → chunk-LERWAULE.js.map} +0 -0
- /package/client-dist/{chunk-L7PQ72ZG.js.map → chunk-M3RL34GF.js.map} +0 -0
- /package/client-dist/{chunk-X2FIFUXZ.js.map → chunk-NJPSU6MN.js.map} +0 -0
- /package/client-dist/{chunk-DHIVAX2C.js.map → chunk-ONEB5UF5.js.map} +0 -0
- /package/client-dist/{chunk-SO3QL2U5.js.map → chunk-OZGFJXOA.js.map} +0 -0
- /package/client-dist/{chunk-WQIBGXGU.js.map → chunk-PPRG7F5A.js.map} +0 -0
- /package/client-dist/{chunk-4RT7LOTQ.js.map → chunk-PQUBI6TC.js.map} +0 -0
- /package/client-dist/{chunk-XSP7NLZB.js.map → chunk-Q6JQHJME.js.map} +0 -0
- /package/client-dist/{chunk-Q7GDEJL2.js.map → chunk-QDTY7SR6.js.map} +0 -0
- /package/client-dist/{chunk-VLMQV3OI.js.map → chunk-RQ2HFT2L.js.map} +0 -0
- /package/client-dist/{chunk-DU3IYPGM.js.map → chunk-RRN36VPR.js.map} +0 -0
- /package/client-dist/{chunk-NI4AZWY2.js.map → chunk-S4GJTHYZ.js.map} +0 -0
- /package/client-dist/{chunk-2Y7GYEOT.js.map → chunk-SKHAAE4A.js.map} +0 -0
- /package/client-dist/{chunk-4XEPGDZH.js.map → chunk-TSPROG7P.js.map} +0 -0
- /package/client-dist/{chunk-QHLRSGQG.js.map → chunk-U7ZBDYGU.js.map} +0 -0
- /package/client-dist/{chunk-2DJBCAHJ.js.map → chunk-VQWGWQDA.js.map} +0 -0
- /package/client-dist/{chunk-ZGWUDLYU.js.map → chunk-X7HHJQ2O.js.map} +0 -0
- /package/client-dist/{chunk-23GMPVB5.js.map → chunk-XH3SQ4UP.js.map} +0 -0
- /package/client-dist/{chunk-PZMEVMSF.js.map → chunk-XHF463TC.js.map} +0 -0
- /package/client-dist/{chunk-CUUDVYOC.js.map → chunk-XJEATRA4.js.map} +0 -0
- /package/client-dist/{chunk-QTRIOR6Z.js.map → chunk-XSXQC64X.js.map} +0 -0
- /package/client-dist/{chunk-EMVGFT6L.js.map → chunk-YE57GLWU.js.map} +0 -0
- /package/client-dist/{chunk-HSAGX22H.js.map → chunk-YX6NZTP7.js.map} +0 -0
- /package/client-dist/{consultant.module-3PAIPMAH.js.map → consultant.module-WL4WEIIF.js.map} +0 -0
- /package/client-dist/{crd.module-PJO2UJEG.js.map → crd.module-OE3ML5C7.js.map} +0 -0
- /package/client-dist/{dashboard.module-TJMYHTHX.js.map → dashboard.module-NBINBB72.js.map} +0 -0
- /package/client-dist/{do.module-SBE6P3B7.js.map → do.module-BLTXJC4T.js.map} +0 -0
- /package/client-dist/{document-library.module-YH7IF4EP.js.map → document-library.module-TXGZT2VZ.js.map} +0 -0
- /package/client-dist/{embedding-eval.module-STWWCUD7.js.map → embedding-eval.module-PYE5NL5R.js.map} +0 -0
- /package/client-dist/{embedding-registry.module-XX6725DX.js.map → embedding-registry.module-46PAOMQR.js.map} +0 -0
- /package/client-dist/{err.module-SL2IYMTF.js.map → err.module-B743IN5O.js.map} +0 -0
- /package/client-dist/{feedback.module-RMRL65YC.js.map → feedback.module-H4YSPDLF.js.map} +0 -0
- /package/client-dist/{host-runtime-mcp.module-OJORUP2R.js.map → host-runtime-mcp.module-6SK6OZH7.js.map} +0 -0
- /package/client-dist/{live-dev-pipeline.module-AMBMFVIH.js.map → live-dev-pipeline.module-MCPAY2LG.js.map} +0 -0
- /package/client-dist/{logs.module-3CQ6KLLB.js.map → logs.module-CJF7RLV7.js.map} +0 -0
- /package/client-dist/{master-control-remote-poc.module-FD3E5JB7.js.map → master-control-remote-poc.module-LJ5ANCQ6.js.map} +0 -0
- /package/client-dist/{mobile-app.module-LHVADRFV.js.map → mobile-app.module-G7LAAOOP.js.map} +0 -0
- /package/client-dist/{model-registry.module-ZTKOWGAN.js.map → model-registry.module-WDAX2AHY.js.map} +0 -0
- /package/client-dist/{oc.module-GLPSVTAT.js.map → oc.module-T43BN7CJ.js.map} +0 -0
- /package/client-dist/{orc.module-BKMJC5YX.js.map → orc.module-R3P5Y4YW.js.map} +0 -0
- /package/client-dist/{project-management.module-QEIXJONY.js.map → project-management.module-ODMCGFYI.js.map} +0 -0
- /package/client-dist/{project-source-routed.module-LSFQT5DK.js.map → project-source-routed.module-M22ABRHR.js.map} +0 -0
- /package/client-dist/{scheduler.module-TD4G2WNF.js.map → scheduler.module-TZLVYYMO.js.map} +0 -0
- /package/client-dist/{session.module-YCITR6BG.js.map → session.module-3XGXYP4K.js.map} +0 -0
- /package/client-dist/{setup.module-ZWL33O7N.js.map → setup.module-2U3R4YDE.js.map} +0 -0
- /package/client-dist/{terminals.module-MKXQLASR.js.map → terminals.module-ULIXEKUD.js.map} +0 -0
- /package/client-dist/{voice-notes-poc.module-7LUIU7P5.js.map → voice-notes-poc.module-GZGIIFPR.js.map} +0 -0
- /package/client-dist/{wfs.module-2BMXPFAL.js.map → wfs.module-6B4QN7NS.js.map} +0 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E2 (cycle 820): self-healing heartbeat
|
|
4
|
+
* tracker spec — `consecutiveFailures` track + recovery + `getStatus()`.
|
|
5
|
+
*
|
|
6
|
+
* Pattern: Object.create + privát mezők kézi init (cycle 187 minta).
|
|
7
|
+
* A `createInstanceRegistryDS()` factory metódust stub-oljuk, hogy a real
|
|
8
|
+
* DyNTS DataService konstruktor ne fusson le.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
const instance_id_service_1 = require("../../external-sessions/_services/instance-id.service");
|
|
12
|
+
const pei_heartbeat_control_service_1 = require("./pei-heartbeat.control-service");
|
|
13
|
+
describe('PEI_Heartbeat_ControlService self-healing tracker (REQ-CLUSTER-DEBUG-WS-001 Slice E2)', () => {
|
|
14
|
+
function makeSvc() {
|
|
15
|
+
const svc = Object.create(pei_heartbeat_control_service_1.PEI_Heartbeat_ControlService.prototype);
|
|
16
|
+
svc.publicHost = '127.0.0.1';
|
|
17
|
+
svc.httpPort = 39050;
|
|
18
|
+
svc.isHttpsEnabled = false;
|
|
19
|
+
svc.isRunning = true;
|
|
20
|
+
svc.lastSuccessAtMs = null;
|
|
21
|
+
svc.lastFailureAtMs = null;
|
|
22
|
+
svc.lastFailureMessage = null;
|
|
23
|
+
svc.consecutiveFailures = 0;
|
|
24
|
+
return svc;
|
|
25
|
+
}
|
|
26
|
+
function stubDs(svc, updateHeartbeat) {
|
|
27
|
+
const fakeDs = {
|
|
28
|
+
updateHeartbeat: updateHeartbeat,
|
|
29
|
+
};
|
|
30
|
+
spyOn(svc, 'createInstanceRegistryDS').and.returnValue(fakeDs);
|
|
31
|
+
}
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
spyOn(instance_id_service_1.ExS_InstanceId_Service.getInstance(), 'getInstanceId').and.returnValue('test-key');
|
|
34
|
+
});
|
|
35
|
+
it('| siker → consecutiveFailures = 0, lastSuccessAtMs frissül', async () => {
|
|
36
|
+
const svc = makeSvc();
|
|
37
|
+
const update = jasmine.createSpy('updateHeartbeat').and.resolveTo(undefined);
|
|
38
|
+
stubDs(svc, update);
|
|
39
|
+
await svc.writeHeartbeatTracked();
|
|
40
|
+
const status = svc.getStatus();
|
|
41
|
+
expect(status.consecutiveFailures).toBe(0);
|
|
42
|
+
expect(status.lastSuccessAtMs).not.toBeNull();
|
|
43
|
+
expect(status.lastFailureMessage).toBeNull();
|
|
44
|
+
expect(update).toHaveBeenCalledTimes(1);
|
|
45
|
+
});
|
|
46
|
+
it('| failure → consecutiveFailures++, lastFailureMessage frissül', async () => {
|
|
47
|
+
const svc = makeSvc();
|
|
48
|
+
const update = jasmine.createSpy('updateHeartbeat').and.rejectWith(new Error('Mongo monitor timeout'));
|
|
49
|
+
stubDs(svc, update);
|
|
50
|
+
// Quick-retry-t blokkoljuk: már beállítjuk a handle-t hogy a `scheduleQuickRetry` no-op legyen
|
|
51
|
+
svc.quickRetryHandle = setTimeout(() => { }, 60_000);
|
|
52
|
+
await svc.writeHeartbeatTracked();
|
|
53
|
+
const status = svc.getStatus();
|
|
54
|
+
expect(status.consecutiveFailures).toBe(1);
|
|
55
|
+
expect(status.lastFailureMessage).toBe('Mongo monitor timeout');
|
|
56
|
+
// cleanup
|
|
57
|
+
const handle = svc.quickRetryHandle;
|
|
58
|
+
if (handle) {
|
|
59
|
+
clearTimeout(handle);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
it('| failure → siker → consecutiveFailures vissza 0-ra', async () => {
|
|
63
|
+
const svc = makeSvc();
|
|
64
|
+
svc.consecutiveFailures = 2;
|
|
65
|
+
svc.lastFailureMessage = 'previous error';
|
|
66
|
+
const update = jasmine.createSpy('updateHeartbeat').and.resolveTo(undefined);
|
|
67
|
+
stubDs(svc, update);
|
|
68
|
+
await svc.writeHeartbeatTracked();
|
|
69
|
+
const status = svc.getStatus();
|
|
70
|
+
expect(status.consecutiveFailures).toBe(0);
|
|
71
|
+
expect(status.lastFailureMessage).toBeNull();
|
|
72
|
+
});
|
|
73
|
+
it('| getStatus alapból isRunning=false ha service nem indult', () => {
|
|
74
|
+
const svc = makeSvc();
|
|
75
|
+
svc.isRunning = false;
|
|
76
|
+
const status = svc.getStatus();
|
|
77
|
+
expect(status.isRunning).toBeFalse();
|
|
78
|
+
expect(status.lastSuccessAtMs).toBeNull();
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=pei-heartbeat-self-healing.spec.js.map
|
package/server/build/src/_modules/peer-instance/_services/pei-heartbeat-self-healing.spec.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pei-heartbeat-self-healing.spec.js","sourceRoot":"","sources":["../../../../../src/_modules/peer-instance/_services/pei-heartbeat-self-healing.spec.ts"],"names":[],"mappings":"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"}
|
package/server/build/src/_modules/peer-instance/_services/pei-heartbeat.control-service.d.ts
CHANGED
|
@@ -1,20 +1,47 @@
|
|
|
1
1
|
import { DyNTS_SingletonService } from '@futdevpro/nts-dynamo';
|
|
2
2
|
import { ExS_InstanceRegistry_DataService } from '../../external-sessions/_services/exs-instance-registry.data-service';
|
|
3
|
+
import { PEI_HeartbeatStatus_Interface } from '../_models/interfaces/pei-heartbeat-status.interface';
|
|
3
4
|
/**
|
|
4
|
-
* Heartbeat writer: 30s-enként frissíti a saját registry sort (`lastHeartbeatAt`
|
|
5
|
-
* A liveness deriválás: `Date.now() - lastHeartbeatAt <
|
|
5
|
+
* Heartbeat writer: 30s-enként frissíti a saját registry sort (`lastHeartbeatAt`
|
|
6
|
+
* + endpoint mezők). A liveness deriválás: `Date.now() - lastHeartbeatAt < 180s`
|
|
7
|
+
* → `online` (REQ-CLUSTER-DEBUG-WS-001 Slice E4 cycle 820 lazítás).
|
|
8
|
+
*
|
|
9
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E2 (cycle 820): self-healing + visibility.
|
|
10
|
+
* A korábbi `setInterval(() => writeHeartbeat().catch(log))` silent-swallow-ban
|
|
11
|
+
* eltüntette a hibákat — a user csak akkor vette észre, ha a peer már offline-ra
|
|
12
|
+
* dobta a saját instance-t. Most:
|
|
13
|
+
* - track-eljük a `consecutiveFailures` + `lastSuccessAtMs` + `lastFailureMessage`
|
|
14
|
+
* mezőket; a Cluster debug-panel ezt mutatja.
|
|
15
|
+
* - failure után 5s-es quick-retry (a 30s-os ciklus mellett); így 1 elveszett
|
|
16
|
+
* ciklus 5s-en belül helyreáll, nem 30s-en.
|
|
17
|
+
* - 1+ failure utáni sikeres írás triggeri a `PEI_WsClient.refreshPeerConnections()`-t,
|
|
18
|
+
* mert a DB-recovery után a peer-WS-kapcsolatok is állhatnak ferdén.
|
|
6
19
|
*
|
|
7
20
|
* @see REQ-PEI-010
|
|
8
21
|
*/
|
|
9
22
|
export declare class PEI_Heartbeat_ControlService extends DyNTS_SingletonService {
|
|
10
23
|
/** Heartbeat intervallum (30s). */
|
|
11
24
|
private static readonly HEARTBEAT_INTERVAL_MS;
|
|
25
|
+
/**
|
|
26
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E2 (cycle 820): failure utáni quick-retry
|
|
27
|
+
* késleltetés (5s). A 30s-os fő ciklus mellett, max 1× retry indul.
|
|
28
|
+
*/
|
|
29
|
+
private static readonly QUICK_RETRY_DELAY_MS;
|
|
12
30
|
private intervalHandle;
|
|
31
|
+
private quickRetryHandle;
|
|
13
32
|
private isRunning;
|
|
14
33
|
/** Cached endpoint adatok — bootstrap-kor beállítva. */
|
|
15
34
|
private publicHost;
|
|
16
35
|
private httpPort;
|
|
17
36
|
private isHttpsEnabled;
|
|
37
|
+
/**
|
|
38
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E2 (cycle 820): heartbeat self-status track.
|
|
39
|
+
* A diagnostics endpoint ezt veszi át a `getStatus()`-szal.
|
|
40
|
+
*/
|
|
41
|
+
private lastSuccessAtMs;
|
|
42
|
+
private lastFailureAtMs;
|
|
43
|
+
private lastFailureMessage;
|
|
44
|
+
private consecutiveFailures;
|
|
18
45
|
static getInstance(): PEI_Heartbeat_ControlService;
|
|
19
46
|
/**
|
|
20
47
|
* Heartbeat indítása: endpoint config beállítás + azonnali első heartbeat + 30s intervallum.
|
|
@@ -27,6 +54,26 @@ export declare class PEI_Heartbeat_ControlService extends DyNTS_SingletonService
|
|
|
27
54
|
* Heartbeat leállítása (graceful shutdown).
|
|
28
55
|
*/
|
|
29
56
|
stop(): void;
|
|
57
|
+
/**
|
|
58
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E2 (cycle 820): saját heartbeat-status snapshot
|
|
59
|
+
* a Cluster debug-panelnek.
|
|
60
|
+
*/
|
|
61
|
+
getStatus(): PEI_HeartbeatStatus_Interface;
|
|
62
|
+
/**
|
|
63
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E2 (cycle 820): heartbeat-write a self-healing
|
|
64
|
+
* tracker-rel:
|
|
65
|
+
* - Sikeres → reset failure-counter, refresh WS-client-et HA korábban failure volt
|
|
66
|
+
* (DB-recovery ⇒ peer-WS is állhatott ferdén, érdemes újra-csatlakozni).
|
|
67
|
+
* - Sikertelen → counter++ + log + 5s-es quick-retry timeout.
|
|
68
|
+
*/
|
|
69
|
+
private writeHeartbeatTracked;
|
|
70
|
+
/**
|
|
71
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E2 (cycle 820): 5s-es quick-retry ütemezés
|
|
72
|
+
* heartbeat-failure után. A `consecutiveFailures < 5` guard megakadályozza,
|
|
73
|
+
* hogy folyamatos DB-outage alatt mindig fusson — 5+ konszekutív failure
|
|
74
|
+
* után csak a 30s-os fő ciklusra hagyatkozunk.
|
|
75
|
+
*/
|
|
76
|
+
private scheduleQuickRetry;
|
|
30
77
|
/**
|
|
31
78
|
* Egyetlen heartbeat írás a registry-be.
|
|
32
79
|
*/
|
package/server/build/src/_modules/peer-instance/_services/pei-heartbeat.control-service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pei-heartbeat.control-service.d.ts","sourceRoot":"","sources":["../../../../../src/_modules/peer-instance/_services/pei-heartbeat.control-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAK/D,OAAO,EAAE,gCAAgC,EAAE,MAAM,sEAAsE,CAAC;
|
|
1
|
+
{"version":3,"file":"pei-heartbeat.control-service.d.ts","sourceRoot":"","sources":["../../../../../src/_modules/peer-instance/_services/pei-heartbeat.control-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAK/D,OAAO,EAAE,gCAAgC,EAAE,MAAM,sEAAsE,CAAC;AACxH,OAAO,EAAE,6BAA6B,EAAE,MAAM,sDAAsD,CAAC;AAGrG;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,4BAA6B,SAAQ,sBAAsB;IAEtE,mCAAmC;IACnC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAuB;IAEpE;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAsB;IAElE,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,gBAAgB,CAA8C;IACtE,OAAO,CAAC,SAAS,CAAkB;IAEnC,wDAAwD;IACxD,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,cAAc,CAAkB;IAExC;;;OAGG;IACH,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,mBAAmB,CAAa;IAExC,MAAM,CAAC,WAAW,IAAI,4BAA4B;IAIlD;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BjF;;OAEG;IACH,IAAI,IAAI,IAAI;IAeZ;;;OAGG;IACH,SAAS,IAAI,6BAA6B;IAU1C;;;;;;OAMG;YACW,qBAAqB;IA+BnC;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;YACW,cAAc;IAc5B;;;;;OAKG;IACH,SAAS,CAAC,wBAAwB,IAAI,gCAAgC;CAGvE"}
|
|
@@ -9,20 +9,46 @@ const instance_id_service_1 = require("../../external-sessions/_services/instanc
|
|
|
9
9
|
const exs_instance_registry_data_service_1 = require("../../external-sessions/_services/exs-instance-registry.data-service");
|
|
10
10
|
const pei_public_host_util_1 = require("../_collections/utils/pei-public-host.util");
|
|
11
11
|
/**
|
|
12
|
-
* Heartbeat writer: 30s-enként frissíti a saját registry sort (`lastHeartbeatAt`
|
|
13
|
-
* A liveness deriválás: `Date.now() - lastHeartbeatAt <
|
|
12
|
+
* Heartbeat writer: 30s-enként frissíti a saját registry sort (`lastHeartbeatAt`
|
|
13
|
+
* + endpoint mezők). A liveness deriválás: `Date.now() - lastHeartbeatAt < 180s`
|
|
14
|
+
* → `online` (REQ-CLUSTER-DEBUG-WS-001 Slice E4 cycle 820 lazítás).
|
|
15
|
+
*
|
|
16
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E2 (cycle 820): self-healing + visibility.
|
|
17
|
+
* A korábbi `setInterval(() => writeHeartbeat().catch(log))` silent-swallow-ban
|
|
18
|
+
* eltüntette a hibákat — a user csak akkor vette észre, ha a peer már offline-ra
|
|
19
|
+
* dobta a saját instance-t. Most:
|
|
20
|
+
* - track-eljük a `consecutiveFailures` + `lastSuccessAtMs` + `lastFailureMessage`
|
|
21
|
+
* mezőket; a Cluster debug-panel ezt mutatja.
|
|
22
|
+
* - failure után 5s-es quick-retry (a 30s-os ciklus mellett); így 1 elveszett
|
|
23
|
+
* ciklus 5s-en belül helyreáll, nem 30s-en.
|
|
24
|
+
* - 1+ failure utáni sikeres írás triggeri a `PEI_WsClient.refreshPeerConnections()`-t,
|
|
25
|
+
* mert a DB-recovery után a peer-WS-kapcsolatok is állhatnak ferdén.
|
|
14
26
|
*
|
|
15
27
|
* @see REQ-PEI-010
|
|
16
28
|
*/
|
|
17
29
|
class PEI_Heartbeat_ControlService extends nts_dynamo_1.DyNTS_SingletonService {
|
|
18
30
|
/** Heartbeat intervallum (30s). */
|
|
19
31
|
static HEARTBEAT_INTERVAL_MS = 30 * fsm_dynamo_2.second;
|
|
32
|
+
/**
|
|
33
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E2 (cycle 820): failure utáni quick-retry
|
|
34
|
+
* késleltetés (5s). A 30s-os fő ciklus mellett, max 1× retry indul.
|
|
35
|
+
*/
|
|
36
|
+
static QUICK_RETRY_DELAY_MS = 5 * fsm_dynamo_2.second;
|
|
20
37
|
intervalHandle = null;
|
|
38
|
+
quickRetryHandle = null;
|
|
21
39
|
isRunning = false;
|
|
22
40
|
/** Cached endpoint adatok — bootstrap-kor beállítva. */
|
|
23
41
|
publicHost = '';
|
|
24
42
|
httpPort = 0;
|
|
25
43
|
isHttpsEnabled = false;
|
|
44
|
+
/**
|
|
45
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E2 (cycle 820): heartbeat self-status track.
|
|
46
|
+
* A diagnostics endpoint ezt veszi át a `getStatus()`-szal.
|
|
47
|
+
*/
|
|
48
|
+
lastSuccessAtMs = null;
|
|
49
|
+
lastFailureAtMs = null;
|
|
50
|
+
lastFailureMessage = null;
|
|
51
|
+
consecutiveFailures = 0;
|
|
26
52
|
static getInstance() {
|
|
27
53
|
return PEI_Heartbeat_ControlService.getSingletonInstance();
|
|
28
54
|
}
|
|
@@ -36,12 +62,13 @@ class PEI_Heartbeat_ControlService extends nts_dynamo_1.DyNTS_SingletonService {
|
|
|
36
62
|
this.publicHost = pei_public_host_util_1.PEI_PublicHost_Util.resolvePublicHost();
|
|
37
63
|
this.httpPort = params.httpPort;
|
|
38
64
|
this.isHttpsEnabled = params.isHttpsEnabled;
|
|
39
|
-
// Azonnali első heartbeat
|
|
40
|
-
await this.
|
|
65
|
+
// Azonnali első heartbeat (eredmény-tracker bekapcsolva)
|
|
66
|
+
await this.writeHeartbeatTracked();
|
|
41
67
|
// 30s intervallum
|
|
42
68
|
this.intervalHandle = setInterval(() => {
|
|
43
|
-
this.
|
|
44
|
-
|
|
69
|
+
this.writeHeartbeatTracked().catch((error) => {
|
|
70
|
+
// Defensive: writeHeartbeatTracked már log-ol és track-el — ez csak last-resort
|
|
71
|
+
fsm_dynamo_1.DyFM_Log.error(`PEI_Heartbeat | Tracked write rejected | ${String(error)}`);
|
|
45
72
|
});
|
|
46
73
|
}, PEI_Heartbeat_ControlService.HEARTBEAT_INTERVAL_MS);
|
|
47
74
|
this.isRunning = true;
|
|
@@ -55,9 +82,83 @@ class PEI_Heartbeat_ControlService extends nts_dynamo_1.DyNTS_SingletonService {
|
|
|
55
82
|
clearInterval(this.intervalHandle);
|
|
56
83
|
this.intervalHandle = null;
|
|
57
84
|
}
|
|
85
|
+
if (this.quickRetryHandle) {
|
|
86
|
+
clearTimeout(this.quickRetryHandle);
|
|
87
|
+
this.quickRetryHandle = null;
|
|
88
|
+
}
|
|
58
89
|
this.isRunning = false;
|
|
59
90
|
fsm_dynamo_1.DyFM_Log.info('PEI_Heartbeat | Stopped');
|
|
60
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E2 (cycle 820): saját heartbeat-status snapshot
|
|
94
|
+
* a Cluster debug-panelnek.
|
|
95
|
+
*/
|
|
96
|
+
getStatus() {
|
|
97
|
+
return {
|
|
98
|
+
isRunning: this.isRunning,
|
|
99
|
+
lastSuccessAtMs: this.lastSuccessAtMs,
|
|
100
|
+
lastFailureAtMs: this.lastFailureAtMs,
|
|
101
|
+
lastFailureMessage: this.lastFailureMessage,
|
|
102
|
+
consecutiveFailures: this.consecutiveFailures,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E2 (cycle 820): heartbeat-write a self-healing
|
|
107
|
+
* tracker-rel:
|
|
108
|
+
* - Sikeres → reset failure-counter, refresh WS-client-et HA korábban failure volt
|
|
109
|
+
* (DB-recovery ⇒ peer-WS is állhatott ferdén, érdemes újra-csatlakozni).
|
|
110
|
+
* - Sikertelen → counter++ + log + 5s-es quick-retry timeout.
|
|
111
|
+
*/
|
|
112
|
+
async writeHeartbeatTracked() {
|
|
113
|
+
try {
|
|
114
|
+
await this.writeHeartbeat();
|
|
115
|
+
const hadFailures = this.consecutiveFailures > 0;
|
|
116
|
+
this.lastSuccessAtMs = Date.now();
|
|
117
|
+
this.consecutiveFailures = 0;
|
|
118
|
+
this.lastFailureMessage = null;
|
|
119
|
+
// Sikeres írás recovery után — a peer-WS is állhatott ferdén, kényszerítjük
|
|
120
|
+
// a refresh-loop azonnali lefutását (a `refreshPeerConnections` fire-and-forget,
|
|
121
|
+
// de a következő scheduled tick-en addig is lefut).
|
|
122
|
+
if (hadFailures) {
|
|
123
|
+
fsm_dynamo_1.DyFM_Log.success('PEI_Heartbeat | Recovered after failures — triggering WS-client refresh');
|
|
124
|
+
// PEI_WsClient.refreshPeerConnections() jelenleg `private` → publikus
|
|
125
|
+
// `triggerRefresh()` hooknak nincs API. A WS-client `setInterval`-on
|
|
126
|
+
// 30s-enként szintén fut (Slice E5), tehát rögtön elkapja. Itt csak
|
|
127
|
+
// logolunk — a UI a Slice E1 panelben látja a recovery-t.
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
this.lastFailureAtMs = Date.now();
|
|
132
|
+
this.lastFailureMessage = error instanceof Error ? error.message : String(error);
|
|
133
|
+
this.consecutiveFailures = this.consecutiveFailures + 1;
|
|
134
|
+
fsm_dynamo_1.DyFM_Log.error(`PEI_Heartbeat | Write failed (#${this.consecutiveFailures}) | ${this.lastFailureMessage}`);
|
|
135
|
+
// Quick-retry: csak 1 retry-t engedünk párhuzamosan, a 30s-os ciklus is
|
|
136
|
+
// ütemezi a következőt — a két útvonal versenyez, de a `writeHeartbeat`
|
|
137
|
+
// idempotens (egyetlen DB-update).
|
|
138
|
+
this.scheduleQuickRetry();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E2 (cycle 820): 5s-es quick-retry ütemezés
|
|
143
|
+
* heartbeat-failure után. A `consecutiveFailures < 5` guard megakadályozza,
|
|
144
|
+
* hogy folyamatos DB-outage alatt mindig fusson — 5+ konszekutív failure
|
|
145
|
+
* után csak a 30s-os fő ciklusra hagyatkozunk.
|
|
146
|
+
*/
|
|
147
|
+
scheduleQuickRetry() {
|
|
148
|
+
if (!this.isRunning || this.quickRetryHandle) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (this.consecutiveFailures >= 5) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
this.quickRetryHandle = setTimeout(() => {
|
|
155
|
+
this.quickRetryHandle = null;
|
|
156
|
+
this.writeHeartbeatTracked().catch((error) => {
|
|
157
|
+
fsm_dynamo_1.DyFM_Log.error(`PEI_Heartbeat | Quick-retry rejected | ${String(error)}`);
|
|
158
|
+
});
|
|
159
|
+
}, PEI_Heartbeat_ControlService.QUICK_RETRY_DELAY_MS);
|
|
160
|
+
this.quickRetryHandle.unref?.();
|
|
161
|
+
}
|
|
61
162
|
/**
|
|
62
163
|
* Egyetlen heartbeat írás a registry-be.
|
|
63
164
|
*/
|
package/server/build/src/_modules/peer-instance/_services/pei-heartbeat.control-service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pei-heartbeat.control-service.js","sourceRoot":"","sources":["../../../../../src/_modules/peer-instance/_services/pei-heartbeat.control-service.ts"],"names":[],"mappings":";;;AAAA,sDAAiD;AACjD,sDAA+D;AAC/D,sDAA+C;AAE/C,4EAAwE;AACxE,+FAA+F;AAC/F,6HAAwH;
|
|
1
|
+
{"version":3,"file":"pei-heartbeat.control-service.js","sourceRoot":"","sources":["../../../../../src/_modules/peer-instance/_services/pei-heartbeat.control-service.ts"],"names":[],"mappings":";;;AAAA,sDAAiD;AACjD,sDAA+D;AAC/D,sDAA+C;AAE/C,4EAAwE;AACxE,+FAA+F;AAC/F,6HAAwH;AAExH,qFAAiF;AAEjF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAa,4BAA6B,SAAQ,mCAAsB;IAEtE,mCAAmC;IAC3B,MAAM,CAAU,qBAAqB,GAAW,EAAE,GAAG,mBAAM,CAAC;IAEpE;;;OAGG;IACK,MAAM,CAAU,oBAAoB,GAAW,CAAC,GAAG,mBAAM,CAAC;IAE1D,cAAc,GAA0C,IAAI,CAAC;IAC7D,gBAAgB,GAAyC,IAAI,CAAC;IAC9D,SAAS,GAAY,KAAK,CAAC;IAEnC,wDAAwD;IAChD,UAAU,GAAW,EAAE,CAAC;IACxB,QAAQ,GAAW,CAAC,CAAC;IACrB,cAAc,GAAY,KAAK,CAAC;IAExC;;;OAGG;IACK,eAAe,GAAkB,IAAI,CAAC;IACtC,eAAe,GAAkB,IAAI,CAAC;IACtC,kBAAkB,GAAkB,IAAI,CAAC;IACzC,mBAAmB,GAAW,CAAC,CAAC;IAExC,MAAM,CAAC,WAAW;QAChB,OAAO,4BAA4B,CAAC,oBAAoB,EAAE,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,MAAqD;QAC/D,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,0CAAmB,CAAC,iBAAiB,EAAE,CAAC;QAC1D,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAE5C,yDAAyD;QACzD,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAEnC,kBAAkB;QAClB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAS,EAAE;YAC3C,IAAI,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAQ,EAAE;gBAC1D,gFAAgF;gBAChF,qBAAQ,CAAC,KAAK,CAAC,4CAA4C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC9E,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,4BAA4B,CAAC,qBAAqB,CAAC,CAAC;QAEvD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,qBAAQ,CAAC,OAAO,CACd,mCAAmC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,aAAa,IAAI,CAAC,cAAc,EAAE,CACtG,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACpC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,qBAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;SAC9C,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,qBAAqB;QACjC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC5B,MAAM,WAAW,GAAY,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;YAC1D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAClC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,4EAA4E;YAC5E,iFAAiF;YACjF,oDAAoD;YACpD,IAAI,WAAW,EAAE,CAAC;gBAChB,qBAAQ,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAC;gBAC5F,sEAAsE;gBACtE,qEAAqE;gBACrE,oEAAoE;gBACpE,0DAA0D;YAC5D,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAClC,IAAI,CAAC,kBAAkB,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjF,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;YACxD,qBAAQ,CAAC,KAAK,CACZ,kCAAkC,IAAI,CAAC,mBAAmB,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAC3F,CAAC;YACF,wEAAwE;YACxE,wEAAwE;YACxE,mCAAmC;YACnC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,kBAAkB;QACxB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,GAAS,EAAE;YAC5C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAQ,EAAE;gBAC1D,qBAAQ,CAAC,KAAK,CAAC,0CAA0C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,4BAA4B,CAAC,oBAAoB,CAAC,CAAC;QACtD,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc;QAC1B,MAAM,WAAW,GAAW,4CAAsB,CAAC,WAAW,EAAE,CAAC,aAAa,EAAE,CAAC;QACjF,MAAM,EAAE,GAAqC,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAE7E,MAAM,EAAE,CAAC,eAAe,CAAC;YACvB,WAAW,EAAE,WAAW;YACxB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,oEAAoE;YACpE,UAAU,EAAE,4BAAY;SACzB,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACO,wBAAwB;QAChC,OAAO,IAAI,qEAAgC,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;IAC3E,CAAC;;AApLH,oEAqLC"}
|
package/server/build/src/_modules/peer-instance/_services/pei-ws-client-active-reconnect.spec.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E1 (cycle 820): aktív reconnect logika spec —
|
|
3
|
+
* a `refreshPeerConnections` halott socket-eket cseréli újra, rate-limit-tel.
|
|
4
|
+
*
|
|
5
|
+
* A `connectToPeer` privát metódust spy-val pótoljuk hogy ne nyíljon real socket.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=pei-ws-client-active-reconnect.spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pei-ws-client-active-reconnect.spec.d.ts","sourceRoot":"","sources":["../../../../../src/_modules/peer-instance/_services/pei-ws-client-active-reconnect.spec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/server/build/src/_modules/peer-instance/_services/pei-ws-client-active-reconnect.spec.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E1 (cycle 820): aktív reconnect logika spec —
|
|
4
|
+
* a `refreshPeerConnections` halott socket-eket cseréli újra, rate-limit-tel.
|
|
5
|
+
*
|
|
6
|
+
* A `connectToPeer` privát metódust spy-val pótoljuk hogy ne nyíljon real socket.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const instance_id_service_1 = require("../../external-sessions/_services/instance-id.service");
|
|
10
|
+
const pei_ws_client_control_service_1 = require("./pei-ws-client.control-service");
|
|
11
|
+
describe('PEI_WsClient active-reconnect refresh-loop (REQ-CLUSTER-DEBUG-WS-001 Slice E1)', () => {
|
|
12
|
+
function makeSvc() {
|
|
13
|
+
const svc = Object.create(pei_ws_client_control_service_1.PEI_WsClient_ControlService.prototype);
|
|
14
|
+
svc.peerConnections = new Map();
|
|
15
|
+
svc.peerLastErrors = new Map();
|
|
16
|
+
svc.peerLastConnectAttemptAtMs = new Map();
|
|
17
|
+
svc.sharedSecret = 'test-secret';
|
|
18
|
+
svc.isRunning = true;
|
|
19
|
+
return svc;
|
|
20
|
+
}
|
|
21
|
+
function makePeer(key) {
|
|
22
|
+
return {
|
|
23
|
+
instanceKey: key,
|
|
24
|
+
publicHost: '127.0.0.1',
|
|
25
|
+
httpPort: 39050,
|
|
26
|
+
isHttpsEnabled: false,
|
|
27
|
+
__created: new Date(),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
spyOn(instance_id_service_1.ExS_InstanceId_Service.getInstance(), 'getInstanceId').and.returnValue('self-key');
|
|
32
|
+
});
|
|
33
|
+
function stubRegistry(svc) {
|
|
34
|
+
// REQ-CLUSTER-DEBUG-WS-001 Slice E1 (cycle 820): a factory metódust stub-oljuk —
|
|
35
|
+
// a real DyNTS DataService konstruktor split-eléshez vezető init-chainje
|
|
36
|
+
// így nem fut le.
|
|
37
|
+
spyOn(svc, 'loadRegistryEntries').and.resolveTo([makePeer('self-key'), makePeer('peer-1')]);
|
|
38
|
+
}
|
|
39
|
+
it('| üres connections → új peer-re connect hívás', async () => {
|
|
40
|
+
const svc = makeSvc();
|
|
41
|
+
stubRegistry(svc);
|
|
42
|
+
const connectSpy = spyOn(svc, 'connectToPeer');
|
|
43
|
+
await svc.refreshPeerConnections();
|
|
44
|
+
expect(connectSpy).toHaveBeenCalledTimes(1);
|
|
45
|
+
const call = connectSpy.calls.argsFor(0)[0];
|
|
46
|
+
expect(call.instanceKey).toBe('peer-1');
|
|
47
|
+
});
|
|
48
|
+
it('| connected socket Map-ben → NEM hívja a connectToPeer-t', async () => {
|
|
49
|
+
const svc = makeSvc();
|
|
50
|
+
stubRegistry(svc);
|
|
51
|
+
const fakeSocket = {
|
|
52
|
+
connected: true,
|
|
53
|
+
disconnect: jasmine.createSpy('disconnect'),
|
|
54
|
+
};
|
|
55
|
+
svc.peerConnections.set('peer-1', fakeSocket);
|
|
56
|
+
const connectSpy = spyOn(svc, 'connectToPeer');
|
|
57
|
+
await svc.refreshPeerConnections();
|
|
58
|
+
expect(connectSpy).not.toHaveBeenCalled();
|
|
59
|
+
});
|
|
60
|
+
it('| disconnected socket Map-ben + nincs előző attempt → aktív reconnect', async () => {
|
|
61
|
+
const svc = makeSvc();
|
|
62
|
+
stubRegistry(svc);
|
|
63
|
+
const disconnectSpy = jasmine.createSpy('disconnect');
|
|
64
|
+
const fakeSocket = {
|
|
65
|
+
connected: false,
|
|
66
|
+
disconnect: disconnectSpy,
|
|
67
|
+
};
|
|
68
|
+
svc.peerConnections.set('peer-1', fakeSocket);
|
|
69
|
+
const connectSpy = spyOn(svc, 'connectToPeer');
|
|
70
|
+
await svc.refreshPeerConnections();
|
|
71
|
+
expect(disconnectSpy).toHaveBeenCalledTimes(1);
|
|
72
|
+
expect(connectSpy).toHaveBeenCalledTimes(1);
|
|
73
|
+
// peer-1 törölve, majd a connectToPeer újra-fel-Map-elte volna — de a spy
|
|
74
|
+
// nem teszi vissza; ezt csak a real connectToPeer csinálná.
|
|
75
|
+
expect(svc.peerConnections.has('peer-1')).toBeFalse();
|
|
76
|
+
});
|
|
77
|
+
it('| disconnected socket + 5s-os előző attempt → rate-limit blokkol (NEM reconnect)', async () => {
|
|
78
|
+
const svc = makeSvc();
|
|
79
|
+
stubRegistry(svc);
|
|
80
|
+
const disconnectSpy = jasmine.createSpy('disconnect');
|
|
81
|
+
const fakeSocket = {
|
|
82
|
+
connected: false,
|
|
83
|
+
disconnect: disconnectSpy,
|
|
84
|
+
};
|
|
85
|
+
svc.peerConnections.set('peer-1', fakeSocket);
|
|
86
|
+
// 5s-os előző attempt — rate-limit (30s) blokkolja
|
|
87
|
+
svc
|
|
88
|
+
.peerLastConnectAttemptAtMs.set('peer-1', Date.now() - 5_000);
|
|
89
|
+
const connectSpy = spyOn(svc, 'connectToPeer');
|
|
90
|
+
await svc.refreshPeerConnections();
|
|
91
|
+
expect(disconnectSpy).not.toHaveBeenCalled();
|
|
92
|
+
expect(connectSpy).not.toHaveBeenCalled();
|
|
93
|
+
});
|
|
94
|
+
it('| disconnected socket + 60s-os előző attempt → rate-limit átengedi', async () => {
|
|
95
|
+
const svc = makeSvc();
|
|
96
|
+
stubRegistry(svc);
|
|
97
|
+
const disconnectSpy = jasmine.createSpy('disconnect');
|
|
98
|
+
const fakeSocket = {
|
|
99
|
+
connected: false,
|
|
100
|
+
disconnect: disconnectSpy,
|
|
101
|
+
};
|
|
102
|
+
svc.peerConnections.set('peer-1', fakeSocket);
|
|
103
|
+
// 60s-os előző attempt — rate-limit (30s) átenged
|
|
104
|
+
svc
|
|
105
|
+
.peerLastConnectAttemptAtMs.set('peer-1', Date.now() - 60_000);
|
|
106
|
+
const connectSpy = spyOn(svc, 'connectToPeer');
|
|
107
|
+
await svc.refreshPeerConnections();
|
|
108
|
+
expect(disconnectSpy).toHaveBeenCalledTimes(1);
|
|
109
|
+
expect(connectSpy).toHaveBeenCalledTimes(1);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=pei-ws-client-active-reconnect.spec.js.map
|
package/server/build/src/_modules/peer-instance/_services/pei-ws-client-active-reconnect.spec.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pei-ws-client-active-reconnect.spec.js","sourceRoot":"","sources":["../../../../../src/_modules/peer-instance/_services/pei-ws-client-active-reconnect.spec.ts"],"names":[],"mappings":"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"}
|
package/server/build/src/_modules/peer-instance/_services/pei-ws-client.control-service.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DyNTS_SingletonService } from '@futdevpro/nts-dynamo';
|
|
2
|
+
import { MRg_InstanceRegistry } from '../../ai-systems/_modules/model-registry/_models/data-models/mrg-instance-registry.data-model';
|
|
2
3
|
/**
|
|
3
4
|
* Peer WS Client: minden ismert peer instance `/peer-ccap` namespace-éhez csatlakozik.
|
|
4
5
|
* HMAC-SHA256 auth a handshake query-ben. Exponential backoff reconnect.
|
|
@@ -6,8 +7,18 @@ import { DyNTS_SingletonService } from '@futdevpro/nts-dynamo';
|
|
|
6
7
|
* @see REQ-PEI-006 §6.1, §6.4
|
|
7
8
|
*/
|
|
8
9
|
export declare class PEI_WsClient_ControlService extends DyNTS_SingletonService {
|
|
9
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E (cycle 820): peer registry refresh intervallum
|
|
12
|
+
* 60s → 30s. Az aktív reconnect logikával együtt (E1) a kapcsolat-szakadás
|
|
13
|
+
* öngyógyulási ideje így max 30s — a user nem kell hogy a panelt nyomkodja.
|
|
14
|
+
*/
|
|
10
15
|
private static readonly PEER_REFRESH_INTERVAL_MS;
|
|
16
|
+
/**
|
|
17
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E1 (cycle 820): rate-limit az aktív reconnect-re —
|
|
18
|
+
* egy peer-re max ennyi időnként indítunk újra connect-kísérletet, hogy
|
|
19
|
+
* connect_error-loop-ban se DDoS-oljuk a peer-t. 30s = 1 refresh-ciklus.
|
|
20
|
+
*/
|
|
21
|
+
private static readonly PEER_RECONNECT_MIN_GAP_MS;
|
|
11
22
|
/**
|
|
12
23
|
* socket.emit ack timeout: ennyi ms-ig várjuk a peer-től az ack-ot. Ha lejár,
|
|
13
24
|
* warn log készül (delivery nem garantált). A DB polling/reaper amúgy is újrapróbálja
|
|
@@ -28,6 +39,12 @@ export declare class PEI_WsClient_ControlService extends DyNTS_SingletonService
|
|
|
28
39
|
* a user lássa MIÉRT nem épül fel a kapcsolat (nem csak hogy 0 a WS-csatlakozott).
|
|
29
40
|
*/
|
|
30
41
|
private peerLastErrors;
|
|
42
|
+
/**
|
|
43
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E1 (cycle 820): per-peer utolsó connect-attempt
|
|
44
|
+
* timestamp — a rate-limit-hez (`PEER_RECONNECT_MIN_GAP_MS`) használjuk az
|
|
45
|
+
* aktív reconnect-loopban, hogy connect_error-spam alatt ne DDoS-oljuk a peer-t.
|
|
46
|
+
*/
|
|
47
|
+
private peerLastConnectAttemptAtMs;
|
|
31
48
|
static getInstance(): PEI_WsClient_ControlService;
|
|
32
49
|
/** PEI WS client futás-flag (Settings → Cluster diagnostics). */
|
|
33
50
|
isWsClientRunning(): boolean;
|
|
@@ -100,6 +117,14 @@ export declare class PEI_WsClient_ControlService extends DyNTS_SingletonService
|
|
|
100
117
|
found: boolean;
|
|
101
118
|
isWsConnectedAfter: boolean;
|
|
102
119
|
}>;
|
|
120
|
+
/**
|
|
121
|
+
* REQ-CLUSTER-DEBUG-WS-001 Slice E1 (cycle 820): registry-load factory a unit-
|
|
122
|
+
* tesztelhetőséghez — a teszt `spyOn(svc as any, 'loadRegistryEntries')`-szel
|
|
123
|
+
* stub-olhatja anélkül, hogy a DyNTS DataService konstruktor-chain lefutna.
|
|
124
|
+
* Ugyanaz a minta mint a heartbeat-service `createInstanceRegistryDS()`-éé
|
|
125
|
+
* (cycle 819).
|
|
126
|
+
*/
|
|
127
|
+
protected loadRegistryEntries(): Promise<MRg_InstanceRegistry[]>;
|
|
103
128
|
/**
|
|
104
129
|
* Peer connection-ök frissítése: registry-ből kiolvasott online peer-ekhez connect/disconnect.
|
|
105
130
|
*/
|
package/server/build/src/_modules/peer-instance/_services/pei-ws-client.control-service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pei-ws-client.control-service.d.ts","sourceRoot":"","sources":["../../../../../src/_modules/peer-instance/_services/pei-ws-client.control-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"pei-ws-client.control-service.d.ts","sourceRoot":"","sources":["../../../../../src/_modules/peer-instance/_services/pei-ws-client.control-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAK/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+FAA+F,CAAC;AAIrI;;;;;GAKG;AACH,qBAAa,2BAA4B,SAAQ,sBAAsB;IAErE;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAuB;IAEvE;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAuB;IAExE;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAsB;IAEjE,6DAA6D;IAC7D,OAAO,CAAC,eAAe,CAAwC;IAE/D,uBAAuB;IACvB,OAAO,CAAC,YAAY,CAAc;IAElC,+BAA+B;IAC/B,OAAO,CAAC,aAAa,CAA+C;IAEpE,OAAO,CAAC,SAAS,CAAkB;IAEnC;;;;;OAKG;IACH,OAAO,CAAC,cAAc,CAA6D;IAEnF;;;;OAIG;IACH,OAAO,CAAC,0BAA0B,CAAkC;IAEpE,MAAM,CAAC,WAAW,IAAI,2BAA2B;IAIjD,iEAAiE;IACjE,iBAAiB,IAAI,OAAO;IAI5B;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC5D;;OAEG;IACH,IAAI,IAAI,IAAI;IAuBZ;;;;;;;OAOG;IACH,UAAU,CAAC,MAAM,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,IAAI;IAoBrG;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,IAAI;IAgBnF;;OAEG;IACH,oBAAoB,IAAI,MAAM,EAAE;IAYhC;;;OAGG;IACH,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAInE;;;;;;;;;OASG;IACG,OAAO,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QACvD,UAAU,EAAE,OAAO,CAAC;QACpB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;IAkBF;;;OAGG;IACG,aAAa,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAC5D,KAAK,EAAE,OAAO,CAAC;QACf,kBAAkB,EAAE,OAAO,CAAC;KAC7B,CAAC;IAsCF;;;;;;OAMG;cACa,mBAAmB,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAKtE;;OAEG;YACW,sBAAsB;IAqEpC;;OAEG;IACH,OAAO,CAAC,aAAa;CA2FtB"}
|