@logixjs/core 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/dist/{Bound-BN1DQ_lM.d.ts → Bound-CEa1ihvH.d.ts} +2 -2
- package/dist/{Bound-BPIfH9SS.d.cts → Bound-CNLNkC7c.d.cts} +2 -2
- package/dist/Bound.cjs +620 -163
- package/dist/Bound.cjs.map +1 -1
- package/dist/Bound.d.cts +3 -3
- package/dist/Bound.d.ts +3 -3
- package/dist/Bound.js +14 -14
- package/dist/{Debug-Bq8Sqjcr.d.cts → Debug-BhMYr-1i.d.cts} +3 -3
- package/dist/{Debug-B5q5Bkzx.d.ts → Debug-ByM7m4Ft.d.ts} +3 -3
- package/dist/Debug.cjs +553 -32
- package/dist/Debug.cjs.map +1 -1
- package/dist/Debug.d.cts +10 -8
- package/dist/Debug.d.ts +10 -8
- package/dist/Debug.js +12 -10
- package/dist/EffectOp.cjs.map +1 -1
- package/dist/EffectOp.js +2 -3
- package/dist/EffectOp.js.map +1 -1
- package/dist/Env.cjs +664 -6
- package/dist/Env.cjs.map +1 -1
- package/dist/Env.js +5 -2
- package/dist/ExternalStore-BAz83PVq.d.cts +60 -0
- package/dist/ExternalStore-BYWPbYs8.d.ts +60 -0
- package/dist/ExternalStore.cjs +746 -0
- package/dist/ExternalStore.cjs.map +1 -0
- package/dist/ExternalStore.d.cts +4 -0
- package/dist/ExternalStore.d.ts +4 -0
- package/dist/ExternalStore.js +19 -0
- package/dist/ExternalStore.js.map +1 -0
- package/dist/{Flow-1fZT8MpX.d.cts → Flow-BlSoMmhV.d.cts} +2 -2
- package/dist/{Flow-BhpjE22E.d.ts → Flow-CQSGve5c.d.ts} +2 -2
- package/dist/Flow.cjs +2 -2
- package/dist/Flow.cjs.map +1 -1
- package/dist/Flow.d.cts +4 -4
- package/dist/Flow.d.ts +4 -4
- package/dist/Flow.js +7 -8
- package/dist/{Handle-D_cLW1Z3.d.ts → Handle-B7PSmsrY.d.ts} +1 -1
- package/dist/{Handle-D8D1zPb_.d.cts → Handle-ByovhL-c.d.cts} +1 -1
- package/dist/Handle.d.cts +3 -3
- package/dist/Handle.d.ts +3 -3
- package/dist/{Kernel-CnGE1Fyk.d.ts → Kernel-DGSpS4GM.d.ts} +2 -2
- package/dist/{Kernel-8kC-jOda.d.cts → Kernel-DZAk-Mrn.d.cts} +2 -2
- package/dist/Kernel.cjs +680 -22
- package/dist/Kernel.cjs.map +1 -1
- package/dist/Kernel.d.cts +10 -8
- package/dist/Kernel.d.ts +10 -8
- package/dist/Kernel.js +7 -4
- package/dist/{Link-Db7975nU.d.ts → Link-Cm4eR9n0.d.ts} +10 -3
- package/dist/{Link-fX8x1eCK.d.cts → Link-DF8i8iWR.d.cts} +10 -3
- package/dist/Link.cjs +1128 -86
- package/dist/Link.cjs.map +1 -1
- package/dist/Link.d.cts +3 -3
- package/dist/Link.d.ts +3 -3
- package/dist/Link.js +30 -25
- package/dist/{Logic-DRh4sDZj.d.cts → Logic-BcQA0AvE.d.cts} +1 -1
- package/dist/{Logic-BRjEMr-W.d.ts → Logic-OotSE1xw.d.ts} +1 -1
- package/dist/Logic.d.cts +3 -3
- package/dist/Logic.d.ts +3 -3
- package/dist/{MatchBuilder-CJk5oCkR.d.cts → MatchBuilder-BNDJ8waF.d.ts} +1 -1
- package/dist/{MatchBuilder-0QOc-nlU.d.ts → MatchBuilder-CvZ5WY1B.d.cts} +1 -1
- package/dist/MatchBuilder.d.cts +4 -4
- package/dist/MatchBuilder.d.ts +4 -4
- package/dist/Middleware-D8tUDLv_.d.cts +100 -0
- package/dist/Middleware-DS7CbTTN.d.ts +100 -0
- package/dist/Middleware.cjs +461 -13
- package/dist/Middleware.cjs.map +1 -1
- package/dist/Middleware.d.cts +2 -86
- package/dist/Middleware.d.ts +2 -86
- package/dist/Middleware.js +13 -11
- package/dist/{Module-DnzluX2J.d.ts → Module-CFj0I2yE.d.ts} +45 -18
- package/dist/{Module-B_0xRDMR.d.cts → Module-DpXPW9EQ.d.cts} +45 -18
- package/dist/Module.cjs +8583 -5741
- package/dist/Module.cjs.map +1 -1
- package/dist/Module.d.cts +5 -4
- package/dist/Module.d.ts +5 -4
- package/dist/Module.js +32 -27
- package/dist/ModuleTag-BcVF6z7B.d.ts +113 -0
- package/dist/ModuleTag-DuZXo_NS.d.cts +113 -0
- package/dist/ModuleTag.cjs +2609 -1232
- package/dist/ModuleTag.cjs.map +1 -1
- package/dist/ModuleTag.d.cts +4 -4
- package/dist/ModuleTag.d.ts +4 -4
- package/dist/ModuleTag.js +28 -25
- package/dist/{Observability-cY4kLn0S.d.ts → Observability-D-ZWeEVb.d.ts} +22 -15
- package/dist/{Observability-COqEvp2C.d.cts → Observability-V7sRMYTh.d.cts} +22 -15
- package/dist/Observability.cjs +1938 -640
- package/dist/Observability.cjs.map +1 -1
- package/dist/Observability.d.cts +4 -4
- package/dist/Observability.d.ts +4 -4
- package/dist/Observability.js +21 -19
- package/dist/{Process-mL8fHDSB.d.cts → Process-B55aJMFk.d.cts} +29 -4
- package/dist/{Process-CM9xbMdP.d.ts → Process-DvhFEwUS.d.ts} +29 -4
- package/dist/Process.cjs +1122 -85
- package/dist/Process.cjs.map +1 -1
- package/dist/Process.d.cts +4 -3
- package/dist/Process.d.ts +4 -3
- package/dist/Process.js +27 -22
- package/dist/{ReadQuery-BlMwhe-F.d.ts → ReadQuery-C4vZ8Prc.d.ts} +2 -2
- package/dist/{ReadQuery-SinbStGF.d.ts → ReadQuery-CafjlJQo.d.cts} +1 -1
- package/dist/{ReadQuery-SinbStGF.d.cts → ReadQuery-CafjlJQo.d.ts} +1 -1
- package/dist/{ReadQuery-CL5XlXts.d.cts → ReadQuery-mc0NgrFV.d.cts} +2 -2
- package/dist/ReadQuery.cjs +3 -3
- package/dist/ReadQuery.cjs.map +1 -1
- package/dist/ReadQuery.d.cts +2 -2
- package/dist/ReadQuery.d.ts +2 -2
- package/dist/ReadQuery.js +3 -3
- package/dist/{Reflection-CQnKwPXj.d.ts → Reflection-C8xZ267q.d.ts} +88 -7
- package/dist/{Reflection-Kabo1mlU.d.cts → Reflection-DP7Vsv3f.d.cts} +88 -7
- package/dist/Reflection.cjs +2934 -1553
- package/dist/Reflection.cjs.map +1 -1
- package/dist/Reflection.d.cts +14 -11
- package/dist/Reflection.d.ts +14 -11
- package/dist/Reflection.js +26 -21
- package/dist/Resource.cjs +670 -12
- package/dist/Resource.cjs.map +1 -1
- package/dist/Resource.js +6 -3
- package/dist/Root.cjs +675 -17
- package/dist/Root.cjs.map +1 -1
- package/dist/Root.js +7 -3
- package/dist/{Runtime-CtyzZG4i.d.ts → Runtime-BWc9YfUB.d.ts} +37 -7
- package/dist/{Runtime-B-aL-f29.d.cts → Runtime-PShIC4DW.d.cts} +37 -7
- package/dist/Runtime.cjs +1899 -809
- package/dist/Runtime.cjs.map +1 -1
- package/dist/Runtime.d.cts +14 -11
- package/dist/Runtime.d.ts +14 -11
- package/dist/Runtime.js +33 -28
- package/dist/ScopeRegistry.cjs +668 -10
- package/dist/ScopeRegistry.cjs.map +1 -1
- package/dist/ScopeRegistry.js +6 -3
- package/dist/{StateTrait-OWhbj12c.d.cts → StateTrait-CQsDlXJm.d.cts} +23 -6
- package/dist/{StateTrait-BGsZghTz.d.ts → StateTrait-YvJzVDKl.d.ts} +23 -6
- package/dist/StateTrait.cjs +1475 -370
- package/dist/StateTrait.cjs.map +1 -1
- package/dist/StateTrait.d.cts +7 -5
- package/dist/StateTrait.d.ts +7 -5
- package/dist/StateTrait.js +17 -14
- package/dist/{TraitLifecycle-LdIWmKlg.d.ts → TraitLifecycle-CjIBICAA.d.ts} +2 -2
- package/dist/{TraitLifecycle-CwV5WPFX.d.cts → TraitLifecycle-NmqGiXPC.d.cts} +2 -2
- package/dist/TraitLifecycle.cjs +489 -32
- package/dist/TraitLifecycle.cjs.map +1 -1
- package/dist/TraitLifecycle.d.cts +4 -4
- package/dist/TraitLifecycle.d.ts +4 -4
- package/dist/TraitLifecycle.js +7 -7
- package/dist/Workflow-BlFG_20_.d.cts +414 -0
- package/dist/Workflow-CW9S_aAP.d.ts +414 -0
- package/dist/Workflow.cjs +2977 -0
- package/dist/Workflow.cjs.map +1 -0
- package/dist/Workflow.d.cts +7 -0
- package/dist/Workflow.d.ts +7 -0
- package/dist/Workflow.js +55 -0
- package/dist/Workflow.js.map +1 -0
- package/dist/{chunk-G5ZBFPNU.js → chunk-2A4UKO2D.js} +2 -2
- package/dist/chunk-2DE6D42I.js +248 -0
- package/dist/chunk-2DE6D42I.js.map +1 -0
- package/dist/{chunk-ANLBCBDC.js → chunk-2DVLMSOE.js} +6 -6
- package/dist/{chunk-BE3HW4FY.js → chunk-34CF6OGE.js} +14 -16
- package/dist/chunk-34CF6OGE.js.map +1 -0
- package/dist/{chunk-ZFY7U2FR.js → chunk-3LPIXG56.js} +43 -3
- package/dist/chunk-3LPIXG56.js.map +1 -0
- package/dist/chunk-3VZYDNXZ.js +10 -0
- package/dist/chunk-3VZYDNXZ.js.map +1 -0
- package/dist/{chunk-3TMODYZV.js → chunk-3XO4HR6V.js} +2 -2
- package/dist/chunk-46FGVWRF.js +817 -0
- package/dist/chunk-46FGVWRF.js.map +1 -0
- package/dist/chunk-4LODUXFI.js +288 -0
- package/dist/chunk-4LODUXFI.js.map +1 -0
- package/dist/{chunk-GMPEOUP2.js → chunk-4MZ7BT3R.js} +2 -2
- package/dist/chunk-4MZ7BT3R.js.map +1 -0
- package/dist/{chunk-TKZ7MEIA.js → chunk-53GVPGSM.js} +2 -2
- package/dist/{chunk-KP7MUZNX.js → chunk-5W2V2NVJ.js} +2 -2
- package/dist/chunk-5W2V2NVJ.js.map +1 -0
- package/dist/chunk-6DACKW3D.js +613 -0
- package/dist/chunk-6DACKW3D.js.map +1 -0
- package/dist/chunk-AQ7L2QZ5.js +1395 -0
- package/dist/chunk-AQ7L2QZ5.js.map +1 -0
- package/dist/{chunk-NZJKFF45.js → chunk-C2UZZQ76.js} +2 -2
- package/dist/chunk-CCKP5Z6F.js +701 -0
- package/dist/chunk-CCKP5Z6F.js.map +1 -0
- package/dist/chunk-CUKM2XUW.js +27 -0
- package/dist/{chunk-QCHIQWAJ.js.map → chunk-CUKM2XUW.js.map} +1 -1
- package/dist/{chunk-M2RGJPXX.js → chunk-DBD6Q6JH.js} +3 -3
- package/dist/{chunk-ZGDVUPTM.js → chunk-EB4RGQO3.js} +2 -2
- package/dist/{chunk-PAYXCY6A.js → chunk-G7ESIQTI.js} +12 -14
- package/dist/chunk-G7ESIQTI.js.map +1 -0
- package/dist/chunk-GPBAZQ23.js +348 -0
- package/dist/chunk-GPBAZQ23.js.map +1 -0
- package/dist/{chunk-OFADUJWJ.js → chunk-I4LCE5OY.js} +3 -5
- package/dist/{chunk-OFADUJWJ.js.map → chunk-I4LCE5OY.js.map} +1 -1
- package/dist/{chunk-DFNM3WX2.js → chunk-IMCC6TBN.js} +158 -39
- package/dist/chunk-IMCC6TBN.js.map +1 -0
- package/dist/{chunk-76WT3HOR.js → chunk-IROZNQAF.js} +22 -21
- package/dist/chunk-IROZNQAF.js.map +1 -0
- package/dist/{chunk-TAAPQVZN.js → chunk-ISKNULNH.js} +2 -2
- package/dist/chunk-J3CWXIPV.js +242 -0
- package/dist/chunk-J3CWXIPV.js.map +1 -0
- package/dist/{chunk-PYOE4VSI.js → chunk-JBKYRTCS.js} +224 -161
- package/dist/chunk-JBKYRTCS.js.map +1 -0
- package/dist/{chunk-66ALHVEX.js → chunk-KKIAYH4X.js} +3 -3
- package/dist/{chunk-3RMKLXHX.js → chunk-KLDVG3SY.js} +2 -2
- package/dist/{chunk-BABLDP24.js → chunk-KSZQYSEH.js} +3 -3
- package/dist/chunk-KSZQYSEH.js.map +1 -0
- package/dist/{chunk-CW6T36TN.js → chunk-M3M7JFAH.js} +4 -4
- package/dist/chunk-M3M7JFAH.js.map +1 -0
- package/dist/{chunk-THATMZXD.js → chunk-MLB253V2.js} +2 -2
- package/dist/{chunk-THATMZXD.js.map → chunk-MLB253V2.js.map} +1 -1
- package/dist/{chunk-JGIWG6SR.js → chunk-MS77U77X.js} +664 -550
- package/dist/chunk-MS77U77X.js.map +1 -0
- package/dist/chunk-MW4FA3MW.js +23 -0
- package/dist/chunk-MW4FA3MW.js.map +1 -0
- package/dist/chunk-MYKNINNN.js +228 -0
- package/dist/chunk-MYKNINNN.js.map +1 -0
- package/dist/{chunk-4CQAV7YB.js → chunk-O6TTQXTY.js} +2 -2
- package/dist/{chunk-NBD3KUOZ.js → chunk-OJDJ4VDQ.js} +35 -24
- package/dist/chunk-OJDJ4VDQ.js.map +1 -0
- package/dist/{chunk-NQZ2OSGR.js → chunk-PVZEMNJY.js} +9 -9
- package/dist/chunk-PVZEMNJY.js.map +1 -0
- package/dist/chunk-RN26DV2M.js +271 -0
- package/dist/chunk-RN26DV2M.js.map +1 -0
- package/dist/{chunk-JCXGZRMU.js → chunk-RQQW3IQC.js} +3 -3
- package/dist/chunk-RQQW3IQC.js.map +1 -0
- package/dist/{chunk-24VULZ7A.js → chunk-TKOGZDD6.js} +3 -3
- package/dist/{chunk-EGK3KN7B.js → chunk-TQYLVXGY.js} +70 -39
- package/dist/chunk-TQYLVXGY.js.map +1 -0
- package/dist/{chunk-QMM6O4CD.js → chunk-UACD2CL2.js} +15 -3
- package/dist/{chunk-QMM6O4CD.js.map → chunk-UACD2CL2.js.map} +1 -1
- package/dist/{chunk-M3WTHJHJ.js → chunk-VH575UTV.js} +30 -34
- package/dist/chunk-VH575UTV.js.map +1 -0
- package/dist/{chunk-AUIR5O6W.js → chunk-WWBMC24F.js} +9 -15
- package/dist/chunk-WWBMC24F.js.map +1 -0
- package/dist/{chunk-JWOYLO27.js → chunk-WYJUJV4L.js} +80 -7
- package/dist/chunk-WYJUJV4L.js.map +1 -0
- package/dist/{chunk-EY4NZKDR.js → chunk-XFMMPYNU.js} +2 -2
- package/dist/chunk-Y4VRBIS6.js +35 -0
- package/dist/chunk-Y4VRBIS6.js.map +1 -0
- package/dist/{chunk-DMBALCE2.js → chunk-ZC7MSQ5U.js} +77 -4
- package/dist/chunk-ZC7MSQ5U.js.map +1 -0
- package/dist/{chunk-OGWBVHB3.js → chunk-ZCK6SCOE.js} +67 -8
- package/dist/chunk-ZCK6SCOE.js.map +1 -0
- package/dist/{chunk-IHVBV5C2.js → chunk-ZTFTABXV.js} +2 -1
- package/dist/chunk-ZTFTABXV.js.map +1 -0
- package/dist/index.cjs +9532 -5017
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +163 -27
- package/dist/index.d.ts +163 -27
- package/dist/index.js +119 -56
- package/dist/index.js.map +1 -1
- package/dist/{ir-BMP7yxJJ.d.cts → ir-C-Zm_GlZ.d.cts} +1 -1
- package/dist/{ir-DUOz6H-5.d.ts → ir-DGyGiwVe.d.ts} +1 -1
- package/dist/{module-k7m3txak.d.ts → module-DqQ1U-Me.d.ts} +129 -100
- package/dist/{module-B8CBqIZ_.d.cts → module-doenaCsZ.d.cts} +129 -100
- package/package.json +12 -1
- package/dist/ModuleTag-C8FHY_sY.d.ts +0 -93
- package/dist/ModuleTag-EGbgBMpZ.d.cts +0 -93
- package/dist/chunk-3QMIVH35.js +0 -43
- package/dist/chunk-3QMIVH35.js.map +0 -1
- package/dist/chunk-76WT3HOR.js.map +0 -1
- package/dist/chunk-AUIR5O6W.js.map +0 -1
- package/dist/chunk-BABLDP24.js.map +0 -1
- package/dist/chunk-BE3HW4FY.js.map +0 -1
- package/dist/chunk-CW6T36TN.js.map +0 -1
- package/dist/chunk-DFNM3WX2.js.map +0 -1
- package/dist/chunk-DMBALCE2.js.map +0 -1
- package/dist/chunk-EGK3KN7B.js.map +0 -1
- package/dist/chunk-GMPEOUP2.js.map +0 -1
- package/dist/chunk-IHVBV5C2.js.map +0 -1
- package/dist/chunk-JCXGZRMU.js.map +0 -1
- package/dist/chunk-JGIWG6SR.js.map +0 -1
- package/dist/chunk-JWOYLO27.js.map +0 -1
- package/dist/chunk-KIXAU3GM.js +0 -137
- package/dist/chunk-KIXAU3GM.js.map +0 -1
- package/dist/chunk-KP7MUZNX.js.map +0 -1
- package/dist/chunk-M3WTHJHJ.js.map +0 -1
- package/dist/chunk-M7IYCTJV.js +0 -79
- package/dist/chunk-M7IYCTJV.js.map +0 -1
- package/dist/chunk-NBD3KUOZ.js.map +0 -1
- package/dist/chunk-NQZ2OSGR.js.map +0 -1
- package/dist/chunk-OGWBVHB3.js.map +0 -1
- package/dist/chunk-PAYXCY6A.js.map +0 -1
- package/dist/chunk-PYOE4VSI.js.map +0 -1
- package/dist/chunk-QCHIQWAJ.js +0 -21
- package/dist/chunk-VZB726PE.js +0 -93
- package/dist/chunk-VZB726PE.js.map +0 -1
- package/dist/chunk-W3TEWHLO.js +0 -568
- package/dist/chunk-W3TEWHLO.js.map +0 -1
- package/dist/chunk-ZFLHVFUC.js +0 -192
- package/dist/chunk-ZFLHVFUC.js.map +0 -1
- package/dist/chunk-ZFY7U2FR.js.map +0 -1
- /package/dist/{chunk-G5ZBFPNU.js.map → chunk-2A4UKO2D.js.map} +0 -0
- /package/dist/{chunk-ANLBCBDC.js.map → chunk-2DVLMSOE.js.map} +0 -0
- /package/dist/{chunk-3TMODYZV.js.map → chunk-3XO4HR6V.js.map} +0 -0
- /package/dist/{chunk-TKZ7MEIA.js.map → chunk-53GVPGSM.js.map} +0 -0
- /package/dist/{chunk-NZJKFF45.js.map → chunk-C2UZZQ76.js.map} +0 -0
- /package/dist/{chunk-M2RGJPXX.js.map → chunk-DBD6Q6JH.js.map} +0 -0
- /package/dist/{chunk-ZGDVUPTM.js.map → chunk-EB4RGQO3.js.map} +0 -0
- /package/dist/{chunk-TAAPQVZN.js.map → chunk-ISKNULNH.js.map} +0 -0
- /package/dist/{chunk-66ALHVEX.js.map → chunk-KKIAYH4X.js.map} +0 -0
- /package/dist/{chunk-3RMKLXHX.js.map → chunk-KLDVG3SY.js.map} +0 -0
- /package/dist/{chunk-4CQAV7YB.js.map → chunk-O6TTQXTY.js.map} +0 -0
- /package/dist/{chunk-24VULZ7A.js.map → chunk-TKOGZDD6.js.map} +0 -0
- /package/dist/{chunk-EY4NZKDR.js.map → chunk-XFMMPYNU.js.map} +0 -0
|
@@ -0,0 +1,1395 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getGlobalHostScheduler
|
|
3
|
+
} from "./chunk-MYKNINNN.js";
|
|
4
|
+
import {
|
|
5
|
+
clearRuntimeDebugEventSeq,
|
|
6
|
+
currentDiagnosticsLevel,
|
|
7
|
+
record,
|
|
8
|
+
toRuntimeDebugEventRef
|
|
9
|
+
} from "./chunk-ZC7MSQ5U.js";
|
|
10
|
+
import {
|
|
11
|
+
OBSERVABILITY_PROTOCOL_VERSION,
|
|
12
|
+
exportEvidencePackage
|
|
13
|
+
} from "./chunk-WYJUJV4L.js";
|
|
14
|
+
|
|
15
|
+
// src/internal/runtime/core/DevtoolsHub.ts
|
|
16
|
+
import { Effect, FiberRef } from "effect";
|
|
17
|
+
var instances = /* @__PURE__ */ new Map();
|
|
18
|
+
var latestStates = /* @__PURE__ */ new Map();
|
|
19
|
+
var latestTraitSummaries = /* @__PURE__ */ new Map();
|
|
20
|
+
var instanceLabels = /* @__PURE__ */ new Map();
|
|
21
|
+
var convergeStaticIrByDigest = /* @__PURE__ */ new Map();
|
|
22
|
+
var liveInstanceKeys = /* @__PURE__ */ new Set();
|
|
23
|
+
var exportBudget = {
|
|
24
|
+
dropped: 0,
|
|
25
|
+
oversized: 0
|
|
26
|
+
};
|
|
27
|
+
var lastRunTs = 0;
|
|
28
|
+
var lastRunTsSeq = 0;
|
|
29
|
+
var nextRunId = () => {
|
|
30
|
+
const ts = Date.now();
|
|
31
|
+
if (ts === lastRunTs) {
|
|
32
|
+
lastRunTsSeq += 1;
|
|
33
|
+
} else {
|
|
34
|
+
lastRunTs = ts;
|
|
35
|
+
lastRunTsSeq = 0;
|
|
36
|
+
}
|
|
37
|
+
return lastRunTsSeq === 0 ? `run-${ts}` : `run-${ts}.${lastRunTsSeq}`;
|
|
38
|
+
};
|
|
39
|
+
var currentRunId = nextRunId();
|
|
40
|
+
var nextSeq = 1;
|
|
41
|
+
var bufferSize = 500;
|
|
42
|
+
var ringBuffer = [];
|
|
43
|
+
var ringBufferSeq = [];
|
|
44
|
+
var snapshotToken = 0;
|
|
45
|
+
var ensureRingBufferSize = () => {
|
|
46
|
+
if (bufferSize <= 0) {
|
|
47
|
+
ringBuffer.length = 0;
|
|
48
|
+
ringBufferSeq.length = 0;
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (ringBuffer.length <= bufferSize) return;
|
|
52
|
+
const excess = ringBuffer.length - bufferSize;
|
|
53
|
+
ringBuffer.splice(0, excess);
|
|
54
|
+
ringBufferSeq.splice(0, excess);
|
|
55
|
+
};
|
|
56
|
+
var trimRingBufferIfNeeded = () => {
|
|
57
|
+
if (bufferSize <= 0) {
|
|
58
|
+
ringBuffer.length = 0;
|
|
59
|
+
ringBufferSeq.length = 0;
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (bufferSize <= 64) {
|
|
63
|
+
ensureRingBufferSize();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const slack = Math.min(1024, Math.floor(bufferSize / 2));
|
|
67
|
+
const threshold = bufferSize + Math.max(1, slack);
|
|
68
|
+
if (ringBuffer.length <= threshold) return;
|
|
69
|
+
const excess = ringBuffer.length - bufferSize;
|
|
70
|
+
ringBuffer.splice(0, excess);
|
|
71
|
+
ringBufferSeq.splice(0, excess);
|
|
72
|
+
};
|
|
73
|
+
var currentSnapshot = {
|
|
74
|
+
snapshotToken,
|
|
75
|
+
instances,
|
|
76
|
+
events: ringBuffer,
|
|
77
|
+
latestStates,
|
|
78
|
+
latestTraitSummaries,
|
|
79
|
+
exportBudget
|
|
80
|
+
};
|
|
81
|
+
var listeners = /* @__PURE__ */ new Set();
|
|
82
|
+
var notifyScheduled = false;
|
|
83
|
+
var scheduleNotify = () => {
|
|
84
|
+
if (listeners.size === 0) return;
|
|
85
|
+
if (notifyScheduled) return;
|
|
86
|
+
notifyScheduled = true;
|
|
87
|
+
getGlobalHostScheduler().scheduleMicrotask(() => {
|
|
88
|
+
notifyScheduled = false;
|
|
89
|
+
for (const listener of listeners) {
|
|
90
|
+
listener();
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
var devtoolsEnabled = false;
|
|
95
|
+
var bumpSnapshotToken = () => {
|
|
96
|
+
snapshotToken += 1;
|
|
97
|
+
currentSnapshot.snapshotToken = snapshotToken;
|
|
98
|
+
};
|
|
99
|
+
var markSnapshotChanged = () => {
|
|
100
|
+
bumpSnapshotToken();
|
|
101
|
+
scheduleNotify();
|
|
102
|
+
};
|
|
103
|
+
var configureDevtoolsHub = (options) => {
|
|
104
|
+
devtoolsEnabled = true;
|
|
105
|
+
if (typeof options?.bufferSize === "number" && Number.isFinite(options.bufferSize)) {
|
|
106
|
+
const next = Math.floor(options.bufferSize);
|
|
107
|
+
const nextBufferSize = next >= 0 ? next : 0;
|
|
108
|
+
if (nextBufferSize !== bufferSize) {
|
|
109
|
+
bufferSize = nextBufferSize;
|
|
110
|
+
ensureRingBufferSize();
|
|
111
|
+
markSnapshotChanged();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
var isDevtoolsEnabled = () => devtoolsEnabled;
|
|
116
|
+
var getDevtoolsSnapshot = () => currentSnapshot;
|
|
117
|
+
var getDevtoolsSnapshotToken = () => snapshotToken;
|
|
118
|
+
var subscribeDevtoolsSnapshot = (listener) => {
|
|
119
|
+
listeners.add(listener);
|
|
120
|
+
return () => {
|
|
121
|
+
listeners.delete(listener);
|
|
122
|
+
};
|
|
123
|
+
};
|
|
124
|
+
var getDevtoolsRunId = () => currentRunId;
|
|
125
|
+
var setDevtoolsRunId = (runId) => {
|
|
126
|
+
if (typeof runId !== "string" || runId.length === 0) return;
|
|
127
|
+
if (runId !== currentRunId) {
|
|
128
|
+
currentRunId = runId;
|
|
129
|
+
markSnapshotChanged();
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
var startDevtoolsRun = (runId) => {
|
|
133
|
+
currentRunId = typeof runId === "string" && runId.length > 0 ? runId : nextRunId();
|
|
134
|
+
nextSeq = 1;
|
|
135
|
+
clearRuntimeDebugEventSeq();
|
|
136
|
+
clearDevtoolsEvents();
|
|
137
|
+
return currentRunId;
|
|
138
|
+
};
|
|
139
|
+
var clearDevtoolsEvents = () => {
|
|
140
|
+
ringBuffer.length = 0;
|
|
141
|
+
ringBufferSeq.length = 0;
|
|
142
|
+
exportBudget.dropped = 0;
|
|
143
|
+
exportBudget.oversized = 0;
|
|
144
|
+
markSnapshotChanged();
|
|
145
|
+
};
|
|
146
|
+
var setInstanceLabel = (instanceId, label) => {
|
|
147
|
+
instanceLabels.set(instanceId, label);
|
|
148
|
+
markSnapshotChanged();
|
|
149
|
+
};
|
|
150
|
+
var getInstanceLabel = (instanceId) => instanceLabels.get(instanceId);
|
|
151
|
+
var registerConvergeStaticIr = (ir) => {
|
|
152
|
+
convergeStaticIrByDigest.set(ir.staticIrDigest, ir);
|
|
153
|
+
};
|
|
154
|
+
var devtoolsHubConvergeStaticIrCollector = {
|
|
155
|
+
register: registerConvergeStaticIr
|
|
156
|
+
};
|
|
157
|
+
var exportDevtoolsEvidencePackage = (options) => {
|
|
158
|
+
const protocolVersion = options?.protocolVersion ?? OBSERVABILITY_PROTOCOL_VERSION;
|
|
159
|
+
const runId = options?.runId ?? currentRunId;
|
|
160
|
+
const source = options?.source ?? { host: "unknown" };
|
|
161
|
+
const events = ringBuffer.map((payload, i) => ({
|
|
162
|
+
protocolVersion,
|
|
163
|
+
runId,
|
|
164
|
+
seq: ringBufferSeq[i] ?? i + 1,
|
|
165
|
+
timestamp: payload.timestamp,
|
|
166
|
+
type: "debug:event",
|
|
167
|
+
payload
|
|
168
|
+
}));
|
|
169
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
170
|
+
const convergeDigests = /* @__PURE__ */ new Set();
|
|
171
|
+
let sawFullConverge = false;
|
|
172
|
+
for (const ref of ringBuffer) {
|
|
173
|
+
if (ref.kind !== "trait:converge") continue;
|
|
174
|
+
const meta = ref.meta;
|
|
175
|
+
if (!isRecord(meta)) continue;
|
|
176
|
+
const digest = meta.staticIrDigest;
|
|
177
|
+
if (typeof digest === "string" && digest.length > 0) {
|
|
178
|
+
convergeDigests.add(digest);
|
|
179
|
+
}
|
|
180
|
+
const dirty = meta.dirty;
|
|
181
|
+
if (isRecord(dirty) && typeof dirty.rootCount === "number") {
|
|
182
|
+
sawFullConverge = true;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
let summary;
|
|
186
|
+
if (sawFullConverge && convergeDigests.size > 0) {
|
|
187
|
+
const staticIrByDigest = {};
|
|
188
|
+
for (const digest of convergeDigests) {
|
|
189
|
+
const ir = convergeStaticIrByDigest.get(digest);
|
|
190
|
+
if (ir) {
|
|
191
|
+
staticIrByDigest[digest] = ir;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (Object.keys(staticIrByDigest).length > 0) {
|
|
195
|
+
summary = { converge: { staticIrByDigest } };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return exportEvidencePackage({
|
|
199
|
+
protocolVersion,
|
|
200
|
+
runId,
|
|
201
|
+
source,
|
|
202
|
+
events,
|
|
203
|
+
summary
|
|
204
|
+
});
|
|
205
|
+
};
|
|
206
|
+
var devtoolsHubSink = {
|
|
207
|
+
record: (event) => Effect.gen(function* () {
|
|
208
|
+
const level = yield* FiberRef.get(currentDiagnosticsLevel);
|
|
209
|
+
let changed = false;
|
|
210
|
+
if (event.type === "trace:instanceLabel") {
|
|
211
|
+
const instanceId = event.instanceId;
|
|
212
|
+
const data = event.data;
|
|
213
|
+
const label = data && typeof data === "object" && "label" in data ? String(data.label) : void 0;
|
|
214
|
+
if (instanceId && label) {
|
|
215
|
+
instanceLabels.set(instanceId, label);
|
|
216
|
+
changed = true;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (event.type === "module:init" || event.type === "module:destroy") {
|
|
220
|
+
const moduleId = event.moduleId ?? "unknown";
|
|
221
|
+
const runtimeLabel = event.runtimeLabel ?? "unknown";
|
|
222
|
+
const instanceId = event.instanceId;
|
|
223
|
+
const key = `${runtimeLabel}::${moduleId}`;
|
|
224
|
+
const prev = instances.get(key) ?? 0;
|
|
225
|
+
if (event.type === "module:init") {
|
|
226
|
+
instances.set(key, prev + 1);
|
|
227
|
+
changed = true;
|
|
228
|
+
if (instanceId) {
|
|
229
|
+
const instanceKey = `${runtimeLabel}::${moduleId}::${instanceId}`;
|
|
230
|
+
liveInstanceKeys.add(instanceKey);
|
|
231
|
+
if (latestStates.delete(instanceKey)) changed = true;
|
|
232
|
+
if (latestTraitSummaries.delete(instanceKey)) changed = true;
|
|
233
|
+
}
|
|
234
|
+
} else {
|
|
235
|
+
const next = prev - 1;
|
|
236
|
+
if (next <= 0) {
|
|
237
|
+
if (instances.delete(key)) changed = true;
|
|
238
|
+
} else {
|
|
239
|
+
instances.set(key, next);
|
|
240
|
+
changed = true;
|
|
241
|
+
}
|
|
242
|
+
if (instanceId) {
|
|
243
|
+
const instanceKey = `${runtimeLabel}::${moduleId}::${instanceId}`;
|
|
244
|
+
liveInstanceKeys.delete(instanceKey);
|
|
245
|
+
if (latestStates.delete(instanceKey)) changed = true;
|
|
246
|
+
if (latestTraitSummaries.delete(instanceKey)) changed = true;
|
|
247
|
+
if (instanceLabels.delete(instanceId)) changed = true;
|
|
248
|
+
changed = true;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
let exportBudgetChanged = false;
|
|
253
|
+
const ref = toRuntimeDebugEventRef(event, {
|
|
254
|
+
diagnosticsLevel: level,
|
|
255
|
+
resolveConvergeStaticIr: (staticIrDigest) => convergeStaticIrByDigest.get(staticIrDigest),
|
|
256
|
+
onMetaProjection: ({ stats }) => {
|
|
257
|
+
if (stats.dropped !== 0 || stats.oversized !== 0) {
|
|
258
|
+
exportBudgetChanged = true;
|
|
259
|
+
}
|
|
260
|
+
exportBudget.dropped += stats.dropped;
|
|
261
|
+
exportBudget.oversized += stats.oversized;
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
if (exportBudgetChanged) {
|
|
265
|
+
changed = true;
|
|
266
|
+
}
|
|
267
|
+
if (!ref) {
|
|
268
|
+
if (changed) {
|
|
269
|
+
markSnapshotChanged();
|
|
270
|
+
}
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
if (ref.kind === "state" && ref.label === "state:update") {
|
|
274
|
+
const runtimeLabel = ref.runtimeLabel ?? "unknown";
|
|
275
|
+
const key = `${runtimeLabel}::${ref.moduleId}::${ref.instanceId}`;
|
|
276
|
+
if (liveInstanceKeys.has(key)) {
|
|
277
|
+
if (ref.meta && typeof ref.meta === "object" && !Array.isArray(ref.meta)) {
|
|
278
|
+
const anyMeta = ref.meta;
|
|
279
|
+
if ("state" in anyMeta) {
|
|
280
|
+
latestStates.set(key, anyMeta.state);
|
|
281
|
+
changed = true;
|
|
282
|
+
}
|
|
283
|
+
if ("traitSummary" in anyMeta && anyMeta.traitSummary !== void 0) {
|
|
284
|
+
latestTraitSummaries.set(key, anyMeta.traitSummary);
|
|
285
|
+
changed = true;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (bufferSize > 0) {
|
|
291
|
+
const seq = nextSeq++;
|
|
292
|
+
ringBuffer.push(ref);
|
|
293
|
+
ringBufferSeq.push(seq);
|
|
294
|
+
trimRingBufferIfNeeded();
|
|
295
|
+
changed = true;
|
|
296
|
+
}
|
|
297
|
+
if (changed) {
|
|
298
|
+
markSnapshotChanged();
|
|
299
|
+
}
|
|
300
|
+
})
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
// src/internal/runtime/core/TickScheduler.ts
|
|
304
|
+
import { Effect as Effect5, FiberRef as FiberRef3 } from "effect";
|
|
305
|
+
|
|
306
|
+
// src/internal/runtime/core/JobQueue.ts
|
|
307
|
+
var maxPriority = (a, b) => a === "normal" || b === "normal" ? "normal" : "low";
|
|
308
|
+
var makeJobQueue = () => {
|
|
309
|
+
let pendingModules = /* @__PURE__ */ new Map();
|
|
310
|
+
let pendingDirtyTopics = /* @__PURE__ */ new Map();
|
|
311
|
+
const hasPending = () => pendingModules.size > 0 || pendingDirtyTopics.size > 0;
|
|
312
|
+
const enqueueModuleCommit = (commit) => {
|
|
313
|
+
const prev = pendingModules.get(commit.moduleInstanceKey);
|
|
314
|
+
if (!prev) {
|
|
315
|
+
pendingModules.set(commit.moduleInstanceKey, commit);
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
pendingModules.set(commit.moduleInstanceKey, {
|
|
319
|
+
...commit,
|
|
320
|
+
meta: {
|
|
321
|
+
...commit.meta,
|
|
322
|
+
priority: maxPriority(prev.meta.priority, commit.meta.priority)
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
return true;
|
|
326
|
+
};
|
|
327
|
+
const markTopicDirty = (topicKey, priority) => {
|
|
328
|
+
const prev = pendingDirtyTopics.get(topicKey);
|
|
329
|
+
pendingDirtyTopics.set(topicKey, prev ? maxPriority(prev, priority) : priority);
|
|
330
|
+
return prev != null;
|
|
331
|
+
};
|
|
332
|
+
const drain = () => {
|
|
333
|
+
if (!hasPending()) return void 0;
|
|
334
|
+
const drained = {
|
|
335
|
+
modules: pendingModules,
|
|
336
|
+
dirtyTopics: pendingDirtyTopics
|
|
337
|
+
};
|
|
338
|
+
pendingModules = /* @__PURE__ */ new Map();
|
|
339
|
+
pendingDirtyTopics = /* @__PURE__ */ new Map();
|
|
340
|
+
return drained;
|
|
341
|
+
};
|
|
342
|
+
const requeue = (drain2) => {
|
|
343
|
+
for (const [, commit] of drain2.modules) {
|
|
344
|
+
enqueueModuleCommit(commit);
|
|
345
|
+
}
|
|
346
|
+
for (const [k, p] of drain2.dirtyTopics) {
|
|
347
|
+
markTopicDirty(k, p);
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
return {
|
|
351
|
+
hasPending,
|
|
352
|
+
enqueueModuleCommit,
|
|
353
|
+
markTopicDirty,
|
|
354
|
+
drain,
|
|
355
|
+
requeue
|
|
356
|
+
};
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
// src/internal/runtime/core/TaskRunner.ts
|
|
360
|
+
import { Cause, Effect as Effect4, Fiber, FiberRef as FiberRef2, Ref, Stream } from "effect";
|
|
361
|
+
|
|
362
|
+
// src/internal/runtime/core/env.ts
|
|
363
|
+
import { Context, Effect as Effect3, Layer } from "effect";
|
|
364
|
+
|
|
365
|
+
// src/internal/runtime/core/RuntimeStore.ts
|
|
366
|
+
var makeModuleInstanceKey = (moduleId, instanceId) => `${moduleId}::${instanceId}`;
|
|
367
|
+
var makeReadQueryTopicKey = (moduleInstanceKey, selectorId) => `${moduleInstanceKey}::rq:${selectorId}`;
|
|
368
|
+
var parseTopicKey = (topicKey) => {
|
|
369
|
+
const idx = topicKey.indexOf("::");
|
|
370
|
+
if (idx <= 0) return void 0;
|
|
371
|
+
const moduleId = topicKey.slice(0, idx);
|
|
372
|
+
const rest = topicKey.slice(idx + 2);
|
|
373
|
+
if (rest.length === 0) return void 0;
|
|
374
|
+
const idx2 = rest.indexOf("::");
|
|
375
|
+
if (idx2 < 0) {
|
|
376
|
+
return { kind: "module", moduleInstanceKey: `${moduleId}::${rest}` };
|
|
377
|
+
}
|
|
378
|
+
const instanceId = rest.slice(0, idx2);
|
|
379
|
+
const suffix = rest.slice(idx2 + 2);
|
|
380
|
+
if (suffix.startsWith("rq:")) {
|
|
381
|
+
const selectorId = suffix.slice("rq:".length);
|
|
382
|
+
if (selectorId.length === 0) return void 0;
|
|
383
|
+
return {
|
|
384
|
+
kind: "readQuery",
|
|
385
|
+
moduleInstanceKey: `${moduleId}::${instanceId}`,
|
|
386
|
+
selectorId
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
return { kind: "module", moduleInstanceKey: `${moduleId}::${instanceId}` };
|
|
390
|
+
};
|
|
391
|
+
var makeRuntimeStore = () => {
|
|
392
|
+
let tickSeq = 0;
|
|
393
|
+
const moduleStates = /* @__PURE__ */ new Map();
|
|
394
|
+
const topicVersions = /* @__PURE__ */ new Map();
|
|
395
|
+
const topicPriorities = /* @__PURE__ */ new Map();
|
|
396
|
+
const listenersByTopic = /* @__PURE__ */ new Map();
|
|
397
|
+
const subscriberCountByModule = /* @__PURE__ */ new Map();
|
|
398
|
+
const getTopicVersion = (topicKey) => topicVersions.get(topicKey) ?? 0;
|
|
399
|
+
const getTopicPriority = (topicKey) => topicPriorities.get(topicKey) ?? "normal";
|
|
400
|
+
const commitTopicBump = (topicKey, priority) => {
|
|
401
|
+
const prev = topicVersions.get(topicKey) ?? 0;
|
|
402
|
+
topicVersions.set(topicKey, prev + 1);
|
|
403
|
+
topicPriorities.set(topicKey, priority);
|
|
404
|
+
};
|
|
405
|
+
const subscribeTopic = (topicKey, listener) => {
|
|
406
|
+
const info = parseTopicKey(topicKey);
|
|
407
|
+
const existing = listenersByTopic.get(topicKey);
|
|
408
|
+
const set = existing ?? /* @__PURE__ */ new Set();
|
|
409
|
+
const alreadyHas = set.has(listener);
|
|
410
|
+
if (!alreadyHas) {
|
|
411
|
+
set.add(listener);
|
|
412
|
+
}
|
|
413
|
+
if (!existing) {
|
|
414
|
+
listenersByTopic.set(topicKey, set);
|
|
415
|
+
}
|
|
416
|
+
if (!alreadyHas && info) {
|
|
417
|
+
const prev = subscriberCountByModule.get(info.moduleInstanceKey) ?? 0;
|
|
418
|
+
subscriberCountByModule.set(info.moduleInstanceKey, prev + 1);
|
|
419
|
+
}
|
|
420
|
+
return () => {
|
|
421
|
+
const current = listenersByTopic.get(topicKey);
|
|
422
|
+
if (!current) return;
|
|
423
|
+
const deleted = current.delete(listener);
|
|
424
|
+
if (deleted && info) {
|
|
425
|
+
const prev = subscriberCountByModule.get(info.moduleInstanceKey) ?? 0;
|
|
426
|
+
const next = prev - 1;
|
|
427
|
+
if (next <= 0) {
|
|
428
|
+
subscriberCountByModule.delete(info.moduleInstanceKey);
|
|
429
|
+
} else {
|
|
430
|
+
subscriberCountByModule.set(info.moduleInstanceKey, next);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
if (current.size === 0) {
|
|
434
|
+
listenersByTopic.delete(topicKey);
|
|
435
|
+
}
|
|
436
|
+
};
|
|
437
|
+
};
|
|
438
|
+
const getTopicSubscriberCount = (topicKey) => listenersByTopic.get(topicKey)?.size ?? 0;
|
|
439
|
+
const getModuleSubscriberCount = (moduleInstanceKey) => subscriberCountByModule.get(moduleInstanceKey) ?? 0;
|
|
440
|
+
const registerModuleInstance = (args) => {
|
|
441
|
+
moduleStates.set(args.moduleInstanceKey, args.initialState);
|
|
442
|
+
if (!topicVersions.has(args.moduleInstanceKey)) {
|
|
443
|
+
topicVersions.set(args.moduleInstanceKey, 0);
|
|
444
|
+
topicPriorities.set(args.moduleInstanceKey, "normal");
|
|
445
|
+
}
|
|
446
|
+
};
|
|
447
|
+
const unregisterModuleInstance = (moduleInstanceKey) => {
|
|
448
|
+
moduleStates.delete(moduleInstanceKey);
|
|
449
|
+
};
|
|
450
|
+
const commitTick = (args) => {
|
|
451
|
+
tickSeq = args.tickSeq;
|
|
452
|
+
for (const [key, commit] of args.accepted.modules) {
|
|
453
|
+
moduleStates.set(key, commit.state);
|
|
454
|
+
}
|
|
455
|
+
const changedTopics = /* @__PURE__ */ new Map();
|
|
456
|
+
for (const [topicKey, priority] of args.accepted.dirtyTopics) {
|
|
457
|
+
commitTopicBump(topicKey, priority);
|
|
458
|
+
const listeners2 = Array.from(listenersByTopic.get(topicKey) ?? []);
|
|
459
|
+
if (listeners2.length > 0) {
|
|
460
|
+
changedTopics.set(topicKey, { priority, listeners: listeners2 });
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
return { changedTopics };
|
|
464
|
+
};
|
|
465
|
+
const getModuleState = (moduleInstanceKey) => moduleStates.get(moduleInstanceKey);
|
|
466
|
+
const dispose = () => {
|
|
467
|
+
moduleStates.clear();
|
|
468
|
+
topicVersions.clear();
|
|
469
|
+
topicPriorities.clear();
|
|
470
|
+
listenersByTopic.clear();
|
|
471
|
+
subscriberCountByModule.clear();
|
|
472
|
+
};
|
|
473
|
+
return {
|
|
474
|
+
getTickSeq: () => tickSeq,
|
|
475
|
+
getModuleState,
|
|
476
|
+
getTopicVersion,
|
|
477
|
+
getTopicPriority,
|
|
478
|
+
subscribeTopic,
|
|
479
|
+
getTopicSubscriberCount,
|
|
480
|
+
getModuleSubscriberCount,
|
|
481
|
+
registerModuleInstance,
|
|
482
|
+
unregisterModuleInstance,
|
|
483
|
+
commitTick,
|
|
484
|
+
dispose
|
|
485
|
+
};
|
|
486
|
+
};
|
|
487
|
+
|
|
488
|
+
// src/internal/runtime/core/DeclarativeLinkRuntime.ts
|
|
489
|
+
import { Effect as Effect2 } from "effect";
|
|
490
|
+
var makeDeclarativeLinkRuntime = () => {
|
|
491
|
+
const moduleAsSourceById = /* @__PURE__ */ new Map();
|
|
492
|
+
const moduleAsSourceIdsBySource = /* @__PURE__ */ new Map();
|
|
493
|
+
const declarativeById = /* @__PURE__ */ new Map();
|
|
494
|
+
const declarativeReadNodesBySource = /* @__PURE__ */ new Map();
|
|
495
|
+
const registerModuleAsSourceLink = (link) => {
|
|
496
|
+
const stored = {
|
|
497
|
+
...link,
|
|
498
|
+
hasValue: false,
|
|
499
|
+
lastValue: void 0
|
|
500
|
+
};
|
|
501
|
+
moduleAsSourceById.set(link.id, stored);
|
|
502
|
+
const set = moduleAsSourceIdsBySource.get(link.sourceModuleInstanceKey) ?? /* @__PURE__ */ new Set();
|
|
503
|
+
set.add(link.id);
|
|
504
|
+
moduleAsSourceIdsBySource.set(link.sourceModuleInstanceKey, set);
|
|
505
|
+
return () => {
|
|
506
|
+
moduleAsSourceById.delete(link.id);
|
|
507
|
+
const current = moduleAsSourceIdsBySource.get(link.sourceModuleInstanceKey);
|
|
508
|
+
if (!current) return;
|
|
509
|
+
current.delete(link.id);
|
|
510
|
+
if (current.size === 0) {
|
|
511
|
+
moduleAsSourceIdsBySource.delete(link.sourceModuleInstanceKey);
|
|
512
|
+
}
|
|
513
|
+
};
|
|
514
|
+
};
|
|
515
|
+
const registerDeclarativeLink = (link) => {
|
|
516
|
+
const readNodeById = /* @__PURE__ */ new Map();
|
|
517
|
+
for (const n of link.readNodes) {
|
|
518
|
+
readNodeById.set(n.nodeId, n);
|
|
519
|
+
}
|
|
520
|
+
const dispatchNodeById = /* @__PURE__ */ new Map();
|
|
521
|
+
for (const n of link.dispatchNodes) {
|
|
522
|
+
dispatchNodeById.set(n.nodeId, n);
|
|
523
|
+
}
|
|
524
|
+
const incomingByDispatch = /* @__PURE__ */ new Map();
|
|
525
|
+
for (const e of link.ir.edges) {
|
|
526
|
+
const to = e.to;
|
|
527
|
+
const isDispatch = dispatchNodeById.has(to);
|
|
528
|
+
if (!isDispatch) continue;
|
|
529
|
+
incomingByDispatch.set(to, (incomingByDispatch.get(to) ?? 0) + 1);
|
|
530
|
+
const count = incomingByDispatch.get(to) ?? 0;
|
|
531
|
+
if (count > 1) {
|
|
532
|
+
throw new Error(
|
|
533
|
+
`[DeclarativeLinkRuntime] Invalid DeclarativeLinkIR: dispatch node has multiple incoming edges (linkId=${link.linkId}, nodeId=${to}).`
|
|
534
|
+
);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
const dispatchTargetsByReadNode = /* @__PURE__ */ new Map();
|
|
538
|
+
for (const e of link.ir.edges) {
|
|
539
|
+
const from = e.from;
|
|
540
|
+
const to = e.to;
|
|
541
|
+
if (!readNodeById.has(from)) continue;
|
|
542
|
+
if (!dispatchNodeById.has(to)) continue;
|
|
543
|
+
const list = dispatchTargetsByReadNode.get(from) ?? [];
|
|
544
|
+
list.push(to);
|
|
545
|
+
dispatchTargetsByReadNode.set(from, list);
|
|
546
|
+
}
|
|
547
|
+
const stored = {
|
|
548
|
+
...link,
|
|
549
|
+
readNodeById,
|
|
550
|
+
dispatchNodeById,
|
|
551
|
+
dispatchTargetsByReadNode,
|
|
552
|
+
readNodeState: /* @__PURE__ */ new Map()
|
|
553
|
+
};
|
|
554
|
+
declarativeById.set(link.linkId, stored);
|
|
555
|
+
for (const n of link.readNodes) {
|
|
556
|
+
const list = declarativeReadNodesBySource.get(n.moduleInstanceKey) ?? [];
|
|
557
|
+
list.push({ linkId: link.linkId, nodeId: n.nodeId });
|
|
558
|
+
declarativeReadNodesBySource.set(n.moduleInstanceKey, list);
|
|
559
|
+
}
|
|
560
|
+
return () => {
|
|
561
|
+
declarativeById.delete(link.linkId);
|
|
562
|
+
for (const n of link.readNodes) {
|
|
563
|
+
const list = declarativeReadNodesBySource.get(n.moduleInstanceKey);
|
|
564
|
+
if (!list) continue;
|
|
565
|
+
const next = list.filter((x) => !(x.linkId === link.linkId && x.nodeId === n.nodeId));
|
|
566
|
+
if (next.length === 0) {
|
|
567
|
+
declarativeReadNodesBySource.delete(n.moduleInstanceKey);
|
|
568
|
+
} else {
|
|
569
|
+
declarativeReadNodesBySource.set(n.moduleInstanceKey, next);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
};
|
|
573
|
+
};
|
|
574
|
+
const applyForSources = (args) => Effect2.gen(function* () {
|
|
575
|
+
let scheduled = false;
|
|
576
|
+
for (const sourceKey of args.changedModuleInstanceKeys) {
|
|
577
|
+
const ids = moduleAsSourceIdsBySource.get(sourceKey);
|
|
578
|
+
if (!ids || ids.size === 0) continue;
|
|
579
|
+
const commit = args.acceptedModules.get(sourceKey);
|
|
580
|
+
if (!commit) continue;
|
|
581
|
+
for (const id of ids) {
|
|
582
|
+
const link = moduleAsSourceById.get(id);
|
|
583
|
+
if (!link) continue;
|
|
584
|
+
let selected;
|
|
585
|
+
try {
|
|
586
|
+
selected = link.readQuery.select(commit.state);
|
|
587
|
+
} catch {
|
|
588
|
+
continue;
|
|
589
|
+
}
|
|
590
|
+
const nextValue = link.computeValue(selected);
|
|
591
|
+
if (link.hasValue && link.equalsValue(link.lastValue, nextValue)) {
|
|
592
|
+
continue;
|
|
593
|
+
}
|
|
594
|
+
link.hasValue = true;
|
|
595
|
+
link.lastValue = nextValue;
|
|
596
|
+
scheduled = true;
|
|
597
|
+
yield* link.applyValue(nextValue);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
for (const sourceKey of args.changedModuleInstanceKeys) {
|
|
601
|
+
const refs = declarativeReadNodesBySource.get(sourceKey);
|
|
602
|
+
if (!refs || refs.length === 0) continue;
|
|
603
|
+
const commit = args.acceptedModules.get(sourceKey);
|
|
604
|
+
if (!commit) continue;
|
|
605
|
+
for (const ref of refs) {
|
|
606
|
+
const link = declarativeById.get(ref.linkId);
|
|
607
|
+
if (!link) continue;
|
|
608
|
+
const readNode = link.readNodeById.get(ref.nodeId);
|
|
609
|
+
if (!readNode) continue;
|
|
610
|
+
let value;
|
|
611
|
+
try {
|
|
612
|
+
value = readNode.readQuery.select(commit.state);
|
|
613
|
+
} catch {
|
|
614
|
+
continue;
|
|
615
|
+
}
|
|
616
|
+
const state = link.readNodeState.get(ref.nodeId) ?? { hasValue: false, lastValue: void 0 };
|
|
617
|
+
const changed = !state.hasValue || !Object.is(state.lastValue, value);
|
|
618
|
+
if (!changed) continue;
|
|
619
|
+
state.hasValue = true;
|
|
620
|
+
state.lastValue = value;
|
|
621
|
+
link.readNodeState.set(ref.nodeId, state);
|
|
622
|
+
const targets = link.dispatchTargetsByReadNode.get(ref.nodeId) ?? [];
|
|
623
|
+
for (const dispatchNodeId of targets) {
|
|
624
|
+
const node = link.dispatchNodeById.get(dispatchNodeId);
|
|
625
|
+
if (!node) continue;
|
|
626
|
+
scheduled = true;
|
|
627
|
+
yield* node.dispatch(value);
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
return { scheduled };
|
|
632
|
+
});
|
|
633
|
+
return {
|
|
634
|
+
registerModuleAsSourceLink,
|
|
635
|
+
registerDeclarativeLink,
|
|
636
|
+
applyForSources
|
|
637
|
+
};
|
|
638
|
+
};
|
|
639
|
+
|
|
640
|
+
// src/internal/runtime/core/env.ts
|
|
641
|
+
var getNodeEnv = () => {
|
|
642
|
+
try {
|
|
643
|
+
const env = globalThis?.process?.env;
|
|
644
|
+
return typeof env?.NODE_ENV === "string" ? env.NODE_ENV : void 0;
|
|
645
|
+
} catch {
|
|
646
|
+
return void 0;
|
|
647
|
+
}
|
|
648
|
+
};
|
|
649
|
+
var isDevEnv = () => getNodeEnv() !== "production";
|
|
650
|
+
var getDefaultStateTxnInstrumentation = () => isDevEnv() ? "full" : "light";
|
|
651
|
+
var StateTransactionConfigTagImpl = class extends Context.Tag("@logixjs/core/StateTransactionRuntimeConfig")() {
|
|
652
|
+
};
|
|
653
|
+
var StateTransactionConfigTag = StateTransactionConfigTagImpl;
|
|
654
|
+
var ReadQueryStrictGateConfigTagImpl = class extends Context.Tag("@logixjs/core/ReadQueryStrictGateRuntimeConfig")() {
|
|
655
|
+
};
|
|
656
|
+
var ReadQueryStrictGateConfigTag = ReadQueryStrictGateConfigTagImpl;
|
|
657
|
+
var ReplayModeConfigTagImpl = class extends Context.Tag("@logixjs/core/ReplayModeConfig")() {
|
|
658
|
+
};
|
|
659
|
+
var ReplayModeConfigTag = ReplayModeConfigTagImpl;
|
|
660
|
+
var StateTransactionOverridesTagImpl = class extends Context.Tag("@logixjs/core/StateTransactionOverrides")() {
|
|
661
|
+
};
|
|
662
|
+
var StateTransactionOverridesTag = StateTransactionOverridesTagImpl;
|
|
663
|
+
var ConcurrencyPolicyTagImpl = class extends Context.Tag("@logixjs/core/ConcurrencyPolicy")() {
|
|
664
|
+
};
|
|
665
|
+
var ConcurrencyPolicyTag = ConcurrencyPolicyTagImpl;
|
|
666
|
+
var ConcurrencyPolicyOverridesTagImpl = class extends Context.Tag("@logixjs/core/ConcurrencyPolicyOverrides")() {
|
|
667
|
+
};
|
|
668
|
+
var ConcurrencyPolicyOverridesTag = ConcurrencyPolicyOverridesTagImpl;
|
|
669
|
+
var RuntimeStoreTag = class extends Context.Tag("@logixjs/core/RuntimeStore")() {
|
|
670
|
+
};
|
|
671
|
+
var runtimeStoreLayer = Layer.scoped(
|
|
672
|
+
RuntimeStoreTag,
|
|
673
|
+
Effect3.acquireRelease(
|
|
674
|
+
Effect3.sync(() => makeRuntimeStore()),
|
|
675
|
+
(store) => Effect3.sync(() => store.dispose())
|
|
676
|
+
)
|
|
677
|
+
);
|
|
678
|
+
var HostSchedulerTag = class extends Context.Tag("@logixjs/core/HostScheduler")() {
|
|
679
|
+
};
|
|
680
|
+
var hostSchedulerLayer = Layer.succeed(
|
|
681
|
+
HostSchedulerTag,
|
|
682
|
+
getGlobalHostScheduler()
|
|
683
|
+
);
|
|
684
|
+
var hostSchedulerTestStubLayer = (scheduler) => Layer.succeed(HostSchedulerTag, scheduler);
|
|
685
|
+
var DeclarativeLinkRuntimeTag = class extends Context.Tag("@logixjs/core/DeclarativeLinkRuntime")() {
|
|
686
|
+
};
|
|
687
|
+
var declarativeLinkRuntimeLayer = Layer.succeed(
|
|
688
|
+
DeclarativeLinkRuntimeTag,
|
|
689
|
+
makeDeclarativeLinkRuntime()
|
|
690
|
+
);
|
|
691
|
+
var TickSchedulerTag = class extends Context.Tag("@logixjs/core/TickScheduler")() {
|
|
692
|
+
};
|
|
693
|
+
var tickSchedulerLayer = (config) => Layer.effect(
|
|
694
|
+
TickSchedulerTag,
|
|
695
|
+
Effect3.gen(function* () {
|
|
696
|
+
const store = yield* RuntimeStoreTag;
|
|
697
|
+
const declarativeLinkRuntime = yield* DeclarativeLinkRuntimeTag;
|
|
698
|
+
const hostScheduler = yield* HostSchedulerTag;
|
|
699
|
+
return makeTickScheduler({ runtimeStore: store, declarativeLinkRuntime, hostScheduler, config });
|
|
700
|
+
})
|
|
701
|
+
);
|
|
702
|
+
|
|
703
|
+
// src/internal/runtime/core/TaskRunner.ts
|
|
704
|
+
var inSyncTransactionFiber = FiberRef2.unsafeMake(false);
|
|
705
|
+
var forceSourceRefresh = FiberRef2.unsafeMake(false);
|
|
706
|
+
var inSyncTransactionGlobalDepth = 0;
|
|
707
|
+
var enterSyncTransaction = () => {
|
|
708
|
+
inSyncTransactionGlobalDepth += 1;
|
|
709
|
+
};
|
|
710
|
+
var exitSyncTransaction = () => {
|
|
711
|
+
inSyncTransactionGlobalDepth = Math.max(0, inSyncTransactionGlobalDepth - 1);
|
|
712
|
+
};
|
|
713
|
+
var isInSyncTransaction = () => inSyncTransactionGlobalDepth > 0;
|
|
714
|
+
var resolve = (eff, payload) => typeof eff === "function" ? eff(payload) : eff;
|
|
715
|
+
var defaultOrigins = (triggerName) => ({
|
|
716
|
+
pending: {
|
|
717
|
+
kind: "task:pending",
|
|
718
|
+
name: triggerName
|
|
719
|
+
},
|
|
720
|
+
success: {
|
|
721
|
+
kind: "service-callback",
|
|
722
|
+
name: "task:success"
|
|
723
|
+
},
|
|
724
|
+
failure: {
|
|
725
|
+
kind: "service-callback",
|
|
726
|
+
name: "task:failure"
|
|
727
|
+
}
|
|
728
|
+
});
|
|
729
|
+
var shouldNoopInSyncTransactionFiber = (options) => Effect4.gen(function* () {
|
|
730
|
+
const inTxn = yield* FiberRef2.get(inSyncTransactionFiber);
|
|
731
|
+
if (!inTxn) {
|
|
732
|
+
return false;
|
|
733
|
+
}
|
|
734
|
+
if (isDevEnv()) {
|
|
735
|
+
yield* record({
|
|
736
|
+
type: "diagnostic",
|
|
737
|
+
moduleId: options.moduleId,
|
|
738
|
+
instanceId: options.instanceId,
|
|
739
|
+
code: options.code,
|
|
740
|
+
severity: options.severity,
|
|
741
|
+
message: options.message,
|
|
742
|
+
hint: options.hint,
|
|
743
|
+
actionTag: options.actionTag,
|
|
744
|
+
kind: options.kind
|
|
745
|
+
});
|
|
746
|
+
}
|
|
747
|
+
return true;
|
|
748
|
+
});
|
|
749
|
+
var resolveConcurrencyLimit = (runtime) => runtime.resolveConcurrencyPolicy ? runtime.resolveConcurrencyPolicy().pipe(Effect4.map((p) => p.concurrencyLimit)) : Effect4.succeed(16);
|
|
750
|
+
var runTaskLifecycle = (payload, runtime, config, getCanWriteBack) => Effect4.gen(function* () {
|
|
751
|
+
const noop = yield* shouldNoopInSyncTransactionFiber({
|
|
752
|
+
moduleId: runtime.moduleId,
|
|
753
|
+
instanceId: runtime.instanceId,
|
|
754
|
+
code: "logic::invalid_usage",
|
|
755
|
+
severity: "error",
|
|
756
|
+
message: "run*Task is not allowed inside a synchronous StateTransaction body (it may deadlock the txnQueue).",
|
|
757
|
+
hint: "Call run*Task from the run section of a watcher (e.g. $.onAction/$.onState/$.on); do not call it directly inside a reducer / trait.run / synchronous transaction body. For long-lived flows, use a multi-entry pattern (pending \u2192 IO \u2192 writeback).",
|
|
758
|
+
kind: "run_task_in_transaction"
|
|
759
|
+
});
|
|
760
|
+
if (noop) {
|
|
761
|
+
return;
|
|
762
|
+
}
|
|
763
|
+
const defaults = defaultOrigins(config.triggerName);
|
|
764
|
+
const origins = {
|
|
765
|
+
pending: config.origin?.pending ?? defaults.pending,
|
|
766
|
+
success: config.origin?.success ?? defaults.success,
|
|
767
|
+
failure: config.origin?.failure ?? defaults.failure
|
|
768
|
+
};
|
|
769
|
+
const pending = config.pending;
|
|
770
|
+
if (pending) {
|
|
771
|
+
yield* Effect4.uninterruptible(
|
|
772
|
+
runtime.runWithStateTransaction(origins.pending, () => Effect4.asVoid(resolve(pending, payload)))
|
|
773
|
+
);
|
|
774
|
+
}
|
|
775
|
+
const io = resolve(config.effect, payload);
|
|
776
|
+
const exit = yield* Effect4.exit(io);
|
|
777
|
+
if (getCanWriteBack) {
|
|
778
|
+
const ok = yield* getCanWriteBack;
|
|
779
|
+
if (!ok) {
|
|
780
|
+
return;
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
if (exit._tag === "Success") {
|
|
784
|
+
const success = config.success;
|
|
785
|
+
if (success) {
|
|
786
|
+
yield* runtime.runWithStateTransaction(origins.success, () => Effect4.asVoid(success(exit.value, payload)));
|
|
787
|
+
}
|
|
788
|
+
return;
|
|
789
|
+
}
|
|
790
|
+
const cause = exit.cause;
|
|
791
|
+
if (Cause.isInterrupted(cause)) {
|
|
792
|
+
return;
|
|
793
|
+
}
|
|
794
|
+
const failure = config.failure;
|
|
795
|
+
if (failure) {
|
|
796
|
+
yield* runtime.runWithStateTransaction(origins.failure, () => Effect4.asVoid(failure(cause, payload)));
|
|
797
|
+
}
|
|
798
|
+
}).pipe(
|
|
799
|
+
// Watchers must not crash as a whole due to a single task failure: swallow errors, but keep them diagnosable.
|
|
800
|
+
Effect4.catchAllCause(
|
|
801
|
+
(cause) => record({
|
|
802
|
+
type: "diagnostic",
|
|
803
|
+
moduleId: runtime.moduleId,
|
|
804
|
+
instanceId: runtime.instanceId,
|
|
805
|
+
code: "task_runner::unhandled_failure",
|
|
806
|
+
severity: "error",
|
|
807
|
+
message: "TaskRunner encountered an unhandled failure (pending/IO/writeback).",
|
|
808
|
+
hint: "Add a failure writeback for this task or handle errors explicitly upstream; avoid fire-and-forget swallowing errors.",
|
|
809
|
+
actionTag: config.triggerName,
|
|
810
|
+
kind: "task_runner_unhandled_failure",
|
|
811
|
+
trigger: {
|
|
812
|
+
kind: "task",
|
|
813
|
+
name: config.triggerName
|
|
814
|
+
}
|
|
815
|
+
}).pipe(Effect4.zipRight(Effect4.logError("TaskRunner error", cause)))
|
|
816
|
+
)
|
|
817
|
+
);
|
|
818
|
+
var makeTaskRunner = (stream, mode, runtime, config) => {
|
|
819
|
+
if (mode === "latest") {
|
|
820
|
+
return Effect4.gen(function* () {
|
|
821
|
+
const taskIdRef = yield* Ref.make(0);
|
|
822
|
+
const currentFiberRef = yield* Ref.make(void 0);
|
|
823
|
+
const start = (payload) => Effect4.gen(function* () {
|
|
824
|
+
const taskId = yield* Ref.updateAndGet(taskIdRef, (n) => n + 1);
|
|
825
|
+
const prev = yield* Ref.get(currentFiberRef);
|
|
826
|
+
if (prev) {
|
|
827
|
+
yield* Fiber.interruptFork(prev);
|
|
828
|
+
}
|
|
829
|
+
const canWriteBack = Ref.get(taskIdRef).pipe(Effect4.map((current) => current === taskId));
|
|
830
|
+
const fiber = yield* Effect4.fork(
|
|
831
|
+
runTaskLifecycle(payload, runtime, config, canWriteBack)
|
|
832
|
+
);
|
|
833
|
+
yield* Ref.set(currentFiberRef, fiber);
|
|
834
|
+
});
|
|
835
|
+
return yield* Stream.runForEach(stream, start);
|
|
836
|
+
});
|
|
837
|
+
}
|
|
838
|
+
if (mode === "exhaust") {
|
|
839
|
+
return Effect4.gen(function* () {
|
|
840
|
+
const concurrency = yield* resolveConcurrencyLimit(runtime);
|
|
841
|
+
const busyRef = yield* Ref.make(false);
|
|
842
|
+
const mapper = (payload) => Effect4.gen(function* () {
|
|
843
|
+
const acquired = yield* Ref.modify(
|
|
844
|
+
busyRef,
|
|
845
|
+
(busy) => busy ? [false, busy] : [true, true]
|
|
846
|
+
);
|
|
847
|
+
if (!acquired) {
|
|
848
|
+
return;
|
|
849
|
+
}
|
|
850
|
+
try {
|
|
851
|
+
yield* runTaskLifecycle(payload, runtime, config);
|
|
852
|
+
} finally {
|
|
853
|
+
yield* Ref.set(busyRef, false);
|
|
854
|
+
}
|
|
855
|
+
});
|
|
856
|
+
return yield* Stream.runDrain(stream.pipe(Stream.mapEffect(mapper, { concurrency })));
|
|
857
|
+
});
|
|
858
|
+
}
|
|
859
|
+
if (mode === "parallel") {
|
|
860
|
+
return Effect4.gen(function* () {
|
|
861
|
+
const concurrency = yield* resolveConcurrencyLimit(runtime);
|
|
862
|
+
return yield* Stream.runDrain(
|
|
863
|
+
stream.pipe(
|
|
864
|
+
Stream.mapEffect((payload) => runTaskLifecycle(payload, runtime, config), {
|
|
865
|
+
concurrency
|
|
866
|
+
})
|
|
867
|
+
)
|
|
868
|
+
);
|
|
869
|
+
});
|
|
870
|
+
}
|
|
871
|
+
return Stream.runForEach(
|
|
872
|
+
stream,
|
|
873
|
+
(payload) => runTaskLifecycle(payload, runtime, config)
|
|
874
|
+
);
|
|
875
|
+
};
|
|
876
|
+
|
|
877
|
+
// src/internal/runtime/core/TickScheduler.ts
|
|
878
|
+
var batchDepth = 0;
|
|
879
|
+
var batchWaiters = /* @__PURE__ */ new Set();
|
|
880
|
+
var enterRuntimeBatch = () => {
|
|
881
|
+
batchDepth += 1;
|
|
882
|
+
};
|
|
883
|
+
var exitRuntimeBatch = () => {
|
|
884
|
+
batchDepth = Math.max(0, batchDepth - 1);
|
|
885
|
+
if (batchDepth !== 0) return;
|
|
886
|
+
const waiters = Array.from(batchWaiters);
|
|
887
|
+
batchWaiters.clear();
|
|
888
|
+
for (const w of waiters) {
|
|
889
|
+
try {
|
|
890
|
+
w.resolve();
|
|
891
|
+
} catch {
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
};
|
|
895
|
+
var waitForBatchEndIfNeeded = () => batchDepth === 0 ? Effect5.void : Effect5.async((resume, signal) => {
|
|
896
|
+
let done = false;
|
|
897
|
+
const cleanup = () => {
|
|
898
|
+
if (done) return;
|
|
899
|
+
done = true;
|
|
900
|
+
batchWaiters.delete(waiter);
|
|
901
|
+
try {
|
|
902
|
+
signal.removeEventListener("abort", onAbort);
|
|
903
|
+
} catch {
|
|
904
|
+
}
|
|
905
|
+
};
|
|
906
|
+
const onAbort = () => {
|
|
907
|
+
cleanup();
|
|
908
|
+
};
|
|
909
|
+
const waiter = {
|
|
910
|
+
resolve: () => {
|
|
911
|
+
cleanup();
|
|
912
|
+
resume(Effect5.void);
|
|
913
|
+
}
|
|
914
|
+
};
|
|
915
|
+
batchWaiters.add(waiter);
|
|
916
|
+
try {
|
|
917
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
918
|
+
} catch {
|
|
919
|
+
}
|
|
920
|
+
});
|
|
921
|
+
var clampSampleRate = (sampleRate) => {
|
|
922
|
+
if (typeof sampleRate !== "number" || !Number.isFinite(sampleRate)) return 0;
|
|
923
|
+
if (sampleRate <= 0) return 0;
|
|
924
|
+
if (sampleRate >= 1) return 1;
|
|
925
|
+
return sampleRate;
|
|
926
|
+
};
|
|
927
|
+
var shouldSampleTick = (tickSeq, sampleRate) => {
|
|
928
|
+
if (sampleRate <= 0) return false;
|
|
929
|
+
if (sampleRate >= 1) return true;
|
|
930
|
+
const x = tickSeq >>> 0;
|
|
931
|
+
const h = Math.imul(x ^ 2654435769, 2246822507) >>> 0;
|
|
932
|
+
return h / 4294967295 < sampleRate;
|
|
933
|
+
};
|
|
934
|
+
var toTriggerKind = (originKind) => {
|
|
935
|
+
if (originKind === "action") return "dispatch";
|
|
936
|
+
if (originKind === "trait-external-store") return "externalStore";
|
|
937
|
+
if (originKind?.includes("timer")) return "timer";
|
|
938
|
+
return "unknown";
|
|
939
|
+
};
|
|
940
|
+
var toLane = (priority) => priority === "low" ? "nonUrgent" : "urgent";
|
|
941
|
+
var maxPriority2 = (a, b) => a === "normal" || b === "normal" ? "normal" : "low";
|
|
942
|
+
var mergeDrain = (base, next) => {
|
|
943
|
+
const modules = new Map(base.modules);
|
|
944
|
+
for (const [k, commit] of next.modules) {
|
|
945
|
+
const prev = modules.get(k);
|
|
946
|
+
if (!prev) {
|
|
947
|
+
modules.set(k, commit);
|
|
948
|
+
} else {
|
|
949
|
+
modules.set(k, {
|
|
950
|
+
...commit,
|
|
951
|
+
meta: {
|
|
952
|
+
...commit.meta,
|
|
953
|
+
priority: maxPriority2(prev.meta.priority, commit.meta.priority)
|
|
954
|
+
}
|
|
955
|
+
});
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
const dirtyTopics = new Map(base.dirtyTopics);
|
|
959
|
+
for (const [k, p] of next.dirtyTopics) {
|
|
960
|
+
const prev = dirtyTopics.get(k);
|
|
961
|
+
dirtyTopics.set(k, prev ? maxPriority2(prev, p) : p);
|
|
962
|
+
}
|
|
963
|
+
return { modules, dirtyTopics };
|
|
964
|
+
};
|
|
965
|
+
var emptyDrain = () => ({ modules: /* @__PURE__ */ new Map(), dirtyTopics: /* @__PURE__ */ new Map() });
|
|
966
|
+
var makeTickScheduler = (args) => {
|
|
967
|
+
const store = args.runtimeStore;
|
|
968
|
+
const hostScheduler = args.hostScheduler;
|
|
969
|
+
const declarativeLinks = args.declarativeLinkRuntime;
|
|
970
|
+
const queue = args.queue ?? makeJobQueue();
|
|
971
|
+
const config = {
|
|
972
|
+
maxSteps: args.config?.maxSteps ?? 64,
|
|
973
|
+
urgentStepCap: args.config?.urgentStepCap ?? 512,
|
|
974
|
+
maxDrainRounds: args.config?.maxDrainRounds ?? 8,
|
|
975
|
+
microtaskChainDepthLimit: args.config?.microtaskChainDepthLimit ?? 32
|
|
976
|
+
};
|
|
977
|
+
const telemetry = args.config?.telemetry;
|
|
978
|
+
const telemetrySampleRate = clampSampleRate(telemetry?.sampleRate);
|
|
979
|
+
let tickSeq = 0;
|
|
980
|
+
let scheduled = false;
|
|
981
|
+
let microtaskChainDepth = 0;
|
|
982
|
+
let nextForcedReason;
|
|
983
|
+
let coalescedModules = 0;
|
|
984
|
+
let coalescedTopics = 0;
|
|
985
|
+
const yieldMicrotask = Effect5.async((resume) => {
|
|
986
|
+
hostScheduler.scheduleMicrotask(() => resume(Effect5.void));
|
|
987
|
+
});
|
|
988
|
+
const yieldMacrotask = Effect5.async((resume, signal) => {
|
|
989
|
+
const cancel = hostScheduler.scheduleMacrotask(() => resume(Effect5.void));
|
|
990
|
+
try {
|
|
991
|
+
signal.addEventListener(
|
|
992
|
+
"abort",
|
|
993
|
+
() => {
|
|
994
|
+
cancel();
|
|
995
|
+
},
|
|
996
|
+
{ once: true }
|
|
997
|
+
);
|
|
998
|
+
} catch {
|
|
999
|
+
}
|
|
1000
|
+
});
|
|
1001
|
+
const scheduleTick = () => Effect5.gen(function* () {
|
|
1002
|
+
if (scheduled) return;
|
|
1003
|
+
scheduled = true;
|
|
1004
|
+
const waitedForBatch = batchDepth > 0;
|
|
1005
|
+
const forcedReason = nextForcedReason;
|
|
1006
|
+
nextForcedReason = void 0;
|
|
1007
|
+
const shouldYieldForStarvation = forcedReason == null && microtaskChainDepth >= Math.max(1, config.microtaskChainDepthLimit);
|
|
1008
|
+
const reason = forcedReason ?? (shouldYieldForStarvation ? "microtask_starvation" : void 0);
|
|
1009
|
+
const boundary = reason ? "macrotask" : "microtask";
|
|
1010
|
+
const startedAs = waitedForBatch ? "batch" : boundary;
|
|
1011
|
+
const depthAtSchedule = microtaskChainDepth;
|
|
1012
|
+
yield* Effect5.forkDaemon(
|
|
1013
|
+
Effect5.locally(inSyncTransactionFiber, false)(
|
|
1014
|
+
Effect5.gen(function* () {
|
|
1015
|
+
try {
|
|
1016
|
+
yield* waitForBatchEndIfNeeded();
|
|
1017
|
+
if (boundary === "microtask") {
|
|
1018
|
+
yield* yieldMicrotask;
|
|
1019
|
+
microtaskChainDepth += 1;
|
|
1020
|
+
} else {
|
|
1021
|
+
yield* yieldMacrotask;
|
|
1022
|
+
microtaskChainDepth = 0;
|
|
1023
|
+
}
|
|
1024
|
+
const schedule = {
|
|
1025
|
+
startedAs,
|
|
1026
|
+
microtaskChainDepth: boundary === "macrotask" ? depthAtSchedule : microtaskChainDepth,
|
|
1027
|
+
...boundary === "macrotask" ? { forcedMacrotask: true, reason: reason ?? "unknown" } : {}
|
|
1028
|
+
};
|
|
1029
|
+
const outcome = yield* flushTick(schedule);
|
|
1030
|
+
if (!outcome.stable) {
|
|
1031
|
+
nextForcedReason = outcome.degradeReason === "budget_steps" ? "budget" : outcome.degradeReason === "cycle_detected" ? "cycle_detected" : "unknown";
|
|
1032
|
+
}
|
|
1033
|
+
} finally {
|
|
1034
|
+
scheduled = false;
|
|
1035
|
+
if (queue.hasPending()) {
|
|
1036
|
+
yield* scheduleTick();
|
|
1037
|
+
} else {
|
|
1038
|
+
microtaskChainDepth = 0;
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
})
|
|
1042
|
+
)
|
|
1043
|
+
);
|
|
1044
|
+
});
|
|
1045
|
+
const flushTick = (schedule) => Effect5.gen(function* () {
|
|
1046
|
+
if (!queue.hasPending()) {
|
|
1047
|
+
return { stable: true };
|
|
1048
|
+
}
|
|
1049
|
+
tickSeq += 1;
|
|
1050
|
+
const currentTickSeq = tickSeq;
|
|
1051
|
+
const diagnosticsLevel = yield* FiberRef3.get(currentDiagnosticsLevel);
|
|
1052
|
+
const shouldEmitTrace = isDevtoolsEnabled() && diagnosticsLevel !== "off";
|
|
1053
|
+
const captured = {
|
|
1054
|
+
drainRounds: 0,
|
|
1055
|
+
stable: true,
|
|
1056
|
+
accepted: emptyDrain()
|
|
1057
|
+
};
|
|
1058
|
+
while (captured.drainRounds < config.maxDrainRounds) {
|
|
1059
|
+
const drained = queue.drain();
|
|
1060
|
+
if (!drained) break;
|
|
1061
|
+
captured.drainRounds += 1;
|
|
1062
|
+
captured.accepted = mergeDrain(captured.accepted, drained);
|
|
1063
|
+
if (declarativeLinks && drained.modules.size > 0) {
|
|
1064
|
+
const changedModuleInstanceKeys = Array.from(drained.modules.keys());
|
|
1065
|
+
yield* declarativeLinks.applyForSources({
|
|
1066
|
+
tickSeq: currentTickSeq,
|
|
1067
|
+
acceptedModules: captured.accepted.modules,
|
|
1068
|
+
changedModuleInstanceKeys
|
|
1069
|
+
});
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
if (queue.hasPending()) {
|
|
1073
|
+
captured.stable = false;
|
|
1074
|
+
captured.degradeReason = "cycle_detected";
|
|
1075
|
+
}
|
|
1076
|
+
const urgentModules = [];
|
|
1077
|
+
const nonUrgentModules = [];
|
|
1078
|
+
for (const commit of captured.accepted.modules.values()) {
|
|
1079
|
+
if (toLane(commit.meta.priority) === "urgent") {
|
|
1080
|
+
urgentModules.push(commit);
|
|
1081
|
+
} else {
|
|
1082
|
+
nonUrgentModules.push(commit);
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
const urgentCapExceeded = urgentModules.length > config.urgentStepCap;
|
|
1086
|
+
const urgentAccepted = urgentCapExceeded ? urgentModules.slice(0, config.urgentStepCap) : urgentModules;
|
|
1087
|
+
const urgentDeferred = urgentCapExceeded ? urgentModules.slice(config.urgentStepCap) : [];
|
|
1088
|
+
const nonUrgentBudget = Math.max(0, config.maxSteps);
|
|
1089
|
+
const nonUrgentAccepted = urgentCapExceeded ? [] : nonUrgentModules.slice(0, nonUrgentBudget);
|
|
1090
|
+
const nonUrgentDeferred = urgentCapExceeded ? nonUrgentModules : nonUrgentModules.slice(nonUrgentBudget);
|
|
1091
|
+
if (urgentCapExceeded) {
|
|
1092
|
+
captured.stable = false;
|
|
1093
|
+
captured.degradeReason = "cycle_detected";
|
|
1094
|
+
} else if (nonUrgentDeferred.length > 0) {
|
|
1095
|
+
captured.stable = false;
|
|
1096
|
+
captured.degradeReason = captured.degradeReason ?? "budget_steps";
|
|
1097
|
+
}
|
|
1098
|
+
const acceptedModules = /* @__PURE__ */ new Map();
|
|
1099
|
+
const deferredModules = /* @__PURE__ */ new Map();
|
|
1100
|
+
for (const c of urgentAccepted) acceptedModules.set(c.moduleInstanceKey, c);
|
|
1101
|
+
for (const c of nonUrgentAccepted) acceptedModules.set(c.moduleInstanceKey, c);
|
|
1102
|
+
for (const c of urgentDeferred) deferredModules.set(c.moduleInstanceKey, c);
|
|
1103
|
+
for (const c of nonUrgentDeferred) deferredModules.set(c.moduleInstanceKey, c);
|
|
1104
|
+
const acceptedTopics = /* @__PURE__ */ new Map();
|
|
1105
|
+
const deferredTopics = /* @__PURE__ */ new Map();
|
|
1106
|
+
for (const [topicKey, priority] of captured.accepted.dirtyTopics) {
|
|
1107
|
+
const info = storeTopicToModuleInstanceKey(topicKey);
|
|
1108
|
+
if (!info) continue;
|
|
1109
|
+
if (acceptedModules.has(info)) {
|
|
1110
|
+
acceptedTopics.set(topicKey, priority);
|
|
1111
|
+
} else if (deferredModules.has(info)) {
|
|
1112
|
+
deferredTopics.set(topicKey, priority);
|
|
1113
|
+
} else {
|
|
1114
|
+
acceptedTopics.set(topicKey, priority);
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
const acceptedDrain = {
|
|
1118
|
+
modules: acceptedModules,
|
|
1119
|
+
dirtyTopics: acceptedTopics
|
|
1120
|
+
};
|
|
1121
|
+
const deferredDrain = deferredModules.size > 0 || deferredTopics.size > 0 ? {
|
|
1122
|
+
modules: deferredModules,
|
|
1123
|
+
dirtyTopics: deferredTopics
|
|
1124
|
+
} : void 0;
|
|
1125
|
+
captured.deferred = deferredDrain;
|
|
1126
|
+
let startedAtMs;
|
|
1127
|
+
let triggerSummary;
|
|
1128
|
+
let anchor;
|
|
1129
|
+
let backlog;
|
|
1130
|
+
let result;
|
|
1131
|
+
if (shouldEmitTrace) {
|
|
1132
|
+
startedAtMs = Date.now();
|
|
1133
|
+
triggerSummary = (() => {
|
|
1134
|
+
const triggers = Array.from(captured.accepted.modules.values());
|
|
1135
|
+
const counts = /* @__PURE__ */ new Map();
|
|
1136
|
+
let primary = void 0;
|
|
1137
|
+
for (const t of triggers) {
|
|
1138
|
+
const kind = toTriggerKind(t.meta.originKind);
|
|
1139
|
+
counts.set(kind, (counts.get(kind) ?? 0) + 1);
|
|
1140
|
+
if (!primary) {
|
|
1141
|
+
primary = {
|
|
1142
|
+
kind,
|
|
1143
|
+
moduleId: t.moduleId,
|
|
1144
|
+
instanceId: t.instanceId,
|
|
1145
|
+
fieldPath: kind === "externalStore" ? t.meta.originName : void 0,
|
|
1146
|
+
actionTag: kind === "dispatch" ? t.meta.originName : void 0
|
|
1147
|
+
};
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
return {
|
|
1151
|
+
total: triggers.length,
|
|
1152
|
+
kinds: Array.from(counts.entries()).map(([kind, count]) => ({ kind, count })),
|
|
1153
|
+
primary,
|
|
1154
|
+
coalescedCount: {
|
|
1155
|
+
modules: coalescedModules,
|
|
1156
|
+
topics: coalescedTopics
|
|
1157
|
+
}
|
|
1158
|
+
};
|
|
1159
|
+
})();
|
|
1160
|
+
anchor = (() => {
|
|
1161
|
+
const first = captured.accepted.modules.values().next().value;
|
|
1162
|
+
if (!first) return void 0;
|
|
1163
|
+
return {
|
|
1164
|
+
moduleId: first.moduleId,
|
|
1165
|
+
instanceId: first.instanceId,
|
|
1166
|
+
txnSeq: first.meta.txnSeq,
|
|
1167
|
+
txnId: first.meta.txnId,
|
|
1168
|
+
...typeof first.opSeq === "number" ? { opSeq: first.opSeq } : null
|
|
1169
|
+
};
|
|
1170
|
+
})();
|
|
1171
|
+
backlog = (() => {
|
|
1172
|
+
const deferredWork = captured.deferred;
|
|
1173
|
+
if (!deferredWork) return void 0;
|
|
1174
|
+
const pendingDeferredWork = deferredWork.modules.size + deferredWork.dirtyTopics.size;
|
|
1175
|
+
const deferredModulesList = Array.from(deferredWork.modules.values());
|
|
1176
|
+
const pendingExternalInputs = deferredModulesList.filter((m) => toTriggerKind(m.meta.originKind) === "externalStore").length;
|
|
1177
|
+
const primaryDeferred = deferredModulesList.find((m) => toTriggerKind(m.meta.originKind) === "externalStore") ?? deferredModulesList[0];
|
|
1178
|
+
const kind = primaryDeferred ? toTriggerKind(primaryDeferred.meta.originKind) : "unknown";
|
|
1179
|
+
const deferredPrimary = primaryDeferred != null ? {
|
|
1180
|
+
kind: kind === "externalStore" ? "externalStore" : "unknown",
|
|
1181
|
+
moduleId: primaryDeferred.moduleId,
|
|
1182
|
+
instanceId: primaryDeferred.instanceId,
|
|
1183
|
+
fieldPath: kind === "externalStore" ? primaryDeferred.meta.originName : void 0,
|
|
1184
|
+
storeId: void 0
|
|
1185
|
+
} : void 0;
|
|
1186
|
+
return {
|
|
1187
|
+
pendingExternalInputs,
|
|
1188
|
+
pendingDeferredWork,
|
|
1189
|
+
deferredPrimary
|
|
1190
|
+
};
|
|
1191
|
+
})();
|
|
1192
|
+
result = {
|
|
1193
|
+
stable: captured.stable,
|
|
1194
|
+
...captured.stable ? null : { degradeReason: captured.degradeReason ?? "unknown" }
|
|
1195
|
+
};
|
|
1196
|
+
}
|
|
1197
|
+
if (shouldEmitTrace && schedule.forcedMacrotask && schedule.reason === "microtask_starvation") {
|
|
1198
|
+
yield* record({
|
|
1199
|
+
type: "warn:microtask-starvation",
|
|
1200
|
+
moduleId: anchor?.moduleId,
|
|
1201
|
+
instanceId: anchor?.instanceId,
|
|
1202
|
+
tickSeq: currentTickSeq,
|
|
1203
|
+
microtaskChainDepth: schedule.microtaskChainDepth
|
|
1204
|
+
});
|
|
1205
|
+
}
|
|
1206
|
+
if (shouldEmitTrace) {
|
|
1207
|
+
yield* record({
|
|
1208
|
+
type: "trace:tick",
|
|
1209
|
+
moduleId: anchor?.moduleId,
|
|
1210
|
+
instanceId: anchor?.instanceId,
|
|
1211
|
+
data: {
|
|
1212
|
+
tickSeq: currentTickSeq,
|
|
1213
|
+
phase: "start",
|
|
1214
|
+
timestampMs: startedAtMs,
|
|
1215
|
+
schedule,
|
|
1216
|
+
triggerSummary,
|
|
1217
|
+
anchors: anchor,
|
|
1218
|
+
budget: {
|
|
1219
|
+
maxSteps: config.maxSteps,
|
|
1220
|
+
elapsedMs: 0,
|
|
1221
|
+
steps: 0,
|
|
1222
|
+
txnCount: acceptedModules.size
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1225
|
+
});
|
|
1226
|
+
}
|
|
1227
|
+
if (!captured.stable && shouldEmitTrace) {
|
|
1228
|
+
yield* record({
|
|
1229
|
+
type: "trace:tick",
|
|
1230
|
+
moduleId: anchor?.moduleId,
|
|
1231
|
+
instanceId: anchor?.instanceId,
|
|
1232
|
+
data: {
|
|
1233
|
+
tickSeq: currentTickSeq,
|
|
1234
|
+
phase: "budgetExceeded",
|
|
1235
|
+
timestampMs: Date.now(),
|
|
1236
|
+
schedule,
|
|
1237
|
+
triggerSummary,
|
|
1238
|
+
anchors: anchor,
|
|
1239
|
+
budget: {
|
|
1240
|
+
maxSteps: config.maxSteps,
|
|
1241
|
+
elapsedMs: Math.max(0, Date.now() - startedAtMs),
|
|
1242
|
+
steps: config.maxSteps,
|
|
1243
|
+
txnCount: acceptedModules.size
|
|
1244
|
+
},
|
|
1245
|
+
backlog,
|
|
1246
|
+
result
|
|
1247
|
+
}
|
|
1248
|
+
});
|
|
1249
|
+
}
|
|
1250
|
+
if (deferredDrain) {
|
|
1251
|
+
queue.requeue(deferredDrain);
|
|
1252
|
+
}
|
|
1253
|
+
const committed = store.commitTick({
|
|
1254
|
+
tickSeq: currentTickSeq,
|
|
1255
|
+
accepted: acceptedDrain
|
|
1256
|
+
});
|
|
1257
|
+
for (const { listeners: listeners2 } of committed.changedTopics.values()) {
|
|
1258
|
+
for (const listener of listeners2) {
|
|
1259
|
+
try {
|
|
1260
|
+
listener();
|
|
1261
|
+
} catch {
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
if (!captured.stable && shouldEmitTrace && backlog?.deferredPrimary) {
|
|
1266
|
+
const primary = backlog.deferredPrimary;
|
|
1267
|
+
if (primary.kind === "externalStore") {
|
|
1268
|
+
const moduleInstanceKey = primary.moduleId && primary.instanceId ? `${primary.moduleId}::${primary.instanceId}` : void 0;
|
|
1269
|
+
if (moduleInstanceKey && store.getModuleSubscriberCount(moduleInstanceKey) > 0) {
|
|
1270
|
+
yield* record({
|
|
1271
|
+
type: "warn:priority-inversion",
|
|
1272
|
+
moduleId: primary.moduleId,
|
|
1273
|
+
instanceId: primary.instanceId,
|
|
1274
|
+
tickSeq: currentTickSeq,
|
|
1275
|
+
reason: "deferredBacklog"
|
|
1276
|
+
});
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1279
|
+
}
|
|
1280
|
+
if (shouldEmitTrace) {
|
|
1281
|
+
yield* record({
|
|
1282
|
+
type: "trace:tick",
|
|
1283
|
+
moduleId: anchor?.moduleId,
|
|
1284
|
+
instanceId: anchor?.instanceId,
|
|
1285
|
+
data: {
|
|
1286
|
+
tickSeq: currentTickSeq,
|
|
1287
|
+
phase: "settled",
|
|
1288
|
+
timestampMs: Date.now(),
|
|
1289
|
+
schedule,
|
|
1290
|
+
triggerSummary,
|
|
1291
|
+
anchors: anchor,
|
|
1292
|
+
budget: {
|
|
1293
|
+
maxSteps: config.maxSteps,
|
|
1294
|
+
elapsedMs: Math.max(0, Date.now() - startedAtMs),
|
|
1295
|
+
steps: acceptedModules.size,
|
|
1296
|
+
txnCount: acceptedModules.size
|
|
1297
|
+
},
|
|
1298
|
+
backlog,
|
|
1299
|
+
result
|
|
1300
|
+
}
|
|
1301
|
+
});
|
|
1302
|
+
}
|
|
1303
|
+
if (telemetry?.onTickDegraded && (schedule.forcedMacrotask || !captured.stable) && shouldSampleTick(currentTickSeq, telemetrySampleRate)) {
|
|
1304
|
+
try {
|
|
1305
|
+
telemetry.onTickDegraded({
|
|
1306
|
+
tickSeq: currentTickSeq,
|
|
1307
|
+
stable: captured.stable,
|
|
1308
|
+
degradeReason: captured.stable ? void 0 : captured.degradeReason ?? "unknown",
|
|
1309
|
+
forcedMacrotask: schedule.forcedMacrotask,
|
|
1310
|
+
scheduleReason: schedule.reason,
|
|
1311
|
+
microtaskChainDepth: schedule.microtaskChainDepth,
|
|
1312
|
+
deferredWorkCount: deferredDrain ? deferredDrain.modules.size + deferredDrain.dirtyTopics.size : 0
|
|
1313
|
+
});
|
|
1314
|
+
} catch {
|
|
1315
|
+
}
|
|
1316
|
+
}
|
|
1317
|
+
coalescedModules = 0;
|
|
1318
|
+
coalescedTopics = 0;
|
|
1319
|
+
return { stable: captured.stable, degradeReason: captured.degradeReason };
|
|
1320
|
+
});
|
|
1321
|
+
const flushNow = flushTick({ startedAs: "unknown" }).pipe(Effect5.asVoid);
|
|
1322
|
+
const storeTopicToModuleInstanceKey = (topicKey) => {
|
|
1323
|
+
const idx = topicKey.indexOf("::rq:");
|
|
1324
|
+
if (idx > 0) {
|
|
1325
|
+
return topicKey.slice(0, idx);
|
|
1326
|
+
}
|
|
1327
|
+
if (topicKey.includes("::")) {
|
|
1328
|
+
return topicKey;
|
|
1329
|
+
}
|
|
1330
|
+
return void 0;
|
|
1331
|
+
};
|
|
1332
|
+
const onSelectorChanged = ({ moduleInstanceKey, selectorId, priority }) => {
|
|
1333
|
+
const coalesced = queue.markTopicDirty(makeReadQueryTopicKey(moduleInstanceKey, selectorId), priority);
|
|
1334
|
+
if (coalesced) coalescedTopics += 1;
|
|
1335
|
+
};
|
|
1336
|
+
const onModuleCommit = (commit) => Effect5.gen(function* () {
|
|
1337
|
+
const coalescedCommit = queue.enqueueModuleCommit(commit);
|
|
1338
|
+
if (coalescedCommit) coalescedModules += 1;
|
|
1339
|
+
const coalescedTopic = queue.markTopicDirty(commit.moduleInstanceKey, commit.meta.priority);
|
|
1340
|
+
if (coalescedTopic) coalescedTopics += 1;
|
|
1341
|
+
yield* scheduleTick();
|
|
1342
|
+
});
|
|
1343
|
+
return {
|
|
1344
|
+
getTickSeq: () => tickSeq,
|
|
1345
|
+
onModuleCommit,
|
|
1346
|
+
onSelectorChanged,
|
|
1347
|
+
flushNow
|
|
1348
|
+
};
|
|
1349
|
+
};
|
|
1350
|
+
|
|
1351
|
+
export {
|
|
1352
|
+
makeModuleInstanceKey,
|
|
1353
|
+
configureDevtoolsHub,
|
|
1354
|
+
isDevtoolsEnabled,
|
|
1355
|
+
getDevtoolsSnapshot,
|
|
1356
|
+
getDevtoolsSnapshotToken,
|
|
1357
|
+
subscribeDevtoolsSnapshot,
|
|
1358
|
+
getDevtoolsRunId,
|
|
1359
|
+
setDevtoolsRunId,
|
|
1360
|
+
startDevtoolsRun,
|
|
1361
|
+
clearDevtoolsEvents,
|
|
1362
|
+
setInstanceLabel,
|
|
1363
|
+
getInstanceLabel,
|
|
1364
|
+
devtoolsHubConvergeStaticIrCollector,
|
|
1365
|
+
exportDevtoolsEvidencePackage,
|
|
1366
|
+
devtoolsHubSink,
|
|
1367
|
+
enterRuntimeBatch,
|
|
1368
|
+
exitRuntimeBatch,
|
|
1369
|
+
getNodeEnv,
|
|
1370
|
+
isDevEnv,
|
|
1371
|
+
getDefaultStateTxnInstrumentation,
|
|
1372
|
+
StateTransactionConfigTag,
|
|
1373
|
+
ReadQueryStrictGateConfigTag,
|
|
1374
|
+
ReplayModeConfigTag,
|
|
1375
|
+
StateTransactionOverridesTag,
|
|
1376
|
+
ConcurrencyPolicyTag,
|
|
1377
|
+
ConcurrencyPolicyOverridesTag,
|
|
1378
|
+
RuntimeStoreTag,
|
|
1379
|
+
runtimeStoreLayer,
|
|
1380
|
+
HostSchedulerTag,
|
|
1381
|
+
hostSchedulerLayer,
|
|
1382
|
+
hostSchedulerTestStubLayer,
|
|
1383
|
+
DeclarativeLinkRuntimeTag,
|
|
1384
|
+
declarativeLinkRuntimeLayer,
|
|
1385
|
+
TickSchedulerTag,
|
|
1386
|
+
tickSchedulerLayer,
|
|
1387
|
+
inSyncTransactionFiber,
|
|
1388
|
+
forceSourceRefresh,
|
|
1389
|
+
enterSyncTransaction,
|
|
1390
|
+
exitSyncTransaction,
|
|
1391
|
+
isInSyncTransaction,
|
|
1392
|
+
shouldNoopInSyncTransactionFiber,
|
|
1393
|
+
makeTaskRunner
|
|
1394
|
+
};
|
|
1395
|
+
//# sourceMappingURL=chunk-AQ7L2QZ5.js.map
|