@oyinlola141/lattice-lifecycle 0.1.0
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/README.md +19 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycleComponent/index.d.ts +7 -0
- package/dist/lifecycleComponent/index.d.ts.map +1 -0
- package/dist/lifecycleComponent/index.js +7 -0
- package/dist/lifecycleComponent/index.js.map +1 -0
- package/dist/lifecycleComponent/lifecycleComponent.type.d.ts +68 -0
- package/dist/lifecycleComponent/lifecycleComponent.type.d.ts.map +1 -0
- package/dist/lifecycleComponent/lifecycleComponent.type.js +7 -0
- package/dist/lifecycleComponent/lifecycleComponent.type.js.map +1 -0
- package/dist/lifecycleContext/index.d.ts +8 -0
- package/dist/lifecycleContext/index.d.ts.map +1 -0
- package/dist/lifecycleContext/index.js +7 -0
- package/dist/lifecycleContext/index.js.map +1 -0
- package/dist/lifecycleContext/lifecycleContext.type.d.ts +23 -0
- package/dist/lifecycleContext/lifecycleContext.type.d.ts.map +1 -0
- package/dist/lifecycleContext/lifecycleContext.type.js +15 -0
- package/dist/lifecycleContext/lifecycleContext.type.js.map +1 -0
- package/dist/lifecycleEvents/index.d.ts +8 -0
- package/dist/lifecycleEvents/index.d.ts.map +1 -0
- package/dist/lifecycleEvents/index.js +7 -0
- package/dist/lifecycleEvents/index.js.map +1 -0
- package/dist/lifecycleEvents/lifecycleEvents.core.d.ts +52 -0
- package/dist/lifecycleEvents/lifecycleEvents.core.d.ts.map +1 -0
- package/dist/lifecycleEvents/lifecycleEvents.core.js +46 -0
- package/dist/lifecycleEvents/lifecycleEvents.core.js.map +1 -0
- package/dist/lifecycleExecutor/index.d.ts +8 -0
- package/dist/lifecycleExecutor/index.d.ts.map +1 -0
- package/dist/lifecycleExecutor/index.js +7 -0
- package/dist/lifecycleExecutor/index.js.map +1 -0
- package/dist/lifecycleExecutor/lifecycleExecutor.core.d.ts +35 -0
- package/dist/lifecycleExecutor/lifecycleExecutor.core.d.ts.map +1 -0
- package/dist/lifecycleExecutor/lifecycleExecutor.core.js +88 -0
- package/dist/lifecycleExecutor/lifecycleExecutor.core.js.map +1 -0
- package/dist/lifecycleInternal/asyncUtils.core.d.ts +19 -0
- package/dist/lifecycleInternal/asyncUtils.core.d.ts.map +1 -0
- package/dist/lifecycleInternal/asyncUtils.core.js +69 -0
- package/dist/lifecycleInternal/asyncUtils.core.js.map +1 -0
- package/dist/lifecycleInternal/dependencyGraph.core.d.ts +29 -0
- package/dist/lifecycleInternal/dependencyGraph.core.d.ts.map +1 -0
- package/dist/lifecycleInternal/dependencyGraph.core.js +74 -0
- package/dist/lifecycleInternal/dependencyGraph.core.js.map +1 -0
- package/dist/lifecycleInternal/index.d.ts +10 -0
- package/dist/lifecycleInternal/index.d.ts.map +1 -0
- package/dist/lifecycleInternal/index.js +9 -0
- package/dist/lifecycleInternal/index.js.map +1 -0
- package/dist/lifecycleInternal/topologicalSort.core.d.ts +19 -0
- package/dist/lifecycleInternal/topologicalSort.core.d.ts.map +1 -0
- package/dist/lifecycleInternal/topologicalSort.core.js +50 -0
- package/dist/lifecycleInternal/topologicalSort.core.js.map +1 -0
- package/dist/lifecycleManager/index.d.ts +8 -0
- package/dist/lifecycleManager/index.d.ts.map +1 -0
- package/dist/lifecycleManager/index.js +7 -0
- package/dist/lifecycleManager/index.js.map +1 -0
- package/dist/lifecycleManager/lifecycleManager.context.d.ts +42 -0
- package/dist/lifecycleManager/lifecycleManager.context.d.ts.map +1 -0
- package/dist/lifecycleManager/lifecycleManager.context.js +34 -0
- package/dist/lifecycleManager/lifecycleManager.context.js.map +1 -0
- package/dist/lifecycleManager/lifecycleManager.core.d.ts +70 -0
- package/dist/lifecycleManager/lifecycleManager.core.d.ts.map +1 -0
- package/dist/lifecycleManager/lifecycleManager.core.js +119 -0
- package/dist/lifecycleManager/lifecycleManager.core.js.map +1 -0
- package/dist/lifecycleManager/lifecycleManager.shutdown.d.ts +12 -0
- package/dist/lifecycleManager/lifecycleManager.shutdown.d.ts.map +1 -0
- package/dist/lifecycleManager/lifecycleManager.shutdown.js +57 -0
- package/dist/lifecycleManager/lifecycleManager.shutdown.js.map +1 -0
- package/dist/lifecycleManager/lifecycleManager.startup.d.ts +11 -0
- package/dist/lifecycleManager/lifecycleManager.startup.d.ts.map +1 -0
- package/dist/lifecycleManager/lifecycleManager.startup.js +100 -0
- package/dist/lifecycleManager/lifecycleManager.startup.js.map +1 -0
- package/dist/lifecyclePhase/index.d.ts +7 -0
- package/dist/lifecyclePhase/index.d.ts.map +1 -0
- package/dist/lifecyclePhase/index.js +7 -0
- package/dist/lifecyclePhase/index.js.map +1 -0
- package/dist/lifecyclePhase/lifecyclePhase.core.d.ts +19 -0
- package/dist/lifecyclePhase/lifecyclePhase.core.d.ts.map +1 -0
- package/dist/lifecyclePhase/lifecyclePhase.core.js +52 -0
- package/dist/lifecyclePhase/lifecyclePhase.core.js.map +1 -0
- package/dist/lifecyclePhase/lifecyclePhase.type.d.ts +16 -0
- package/dist/lifecyclePhase/lifecyclePhase.type.d.ts.map +1 -0
- package/dist/lifecyclePhase/lifecyclePhase.type.js +17 -0
- package/dist/lifecyclePhase/lifecyclePhase.type.js.map +1 -0
- package/dist/lifecyclePlan/index.d.ts +8 -0
- package/dist/lifecyclePlan/index.d.ts.map +1 -0
- package/dist/lifecyclePlan/index.js +7 -0
- package/dist/lifecyclePlan/index.js.map +1 -0
- package/dist/lifecyclePlan/lifecyclePlan.core.d.ts +26 -0
- package/dist/lifecyclePlan/lifecyclePlan.core.d.ts.map +1 -0
- package/dist/lifecyclePlan/lifecyclePlan.core.js +40 -0
- package/dist/lifecyclePlan/lifecyclePlan.core.js.map +1 -0
- package/dist/lifecycleRegistry/index.d.ts +7 -0
- package/dist/lifecycleRegistry/index.d.ts.map +1 -0
- package/dist/lifecycleRegistry/index.js +7 -0
- package/dist/lifecycleRegistry/index.js.map +1 -0
- package/dist/lifecycleRegistry/lifecycleRegistry.core.d.ts +35 -0
- package/dist/lifecycleRegistry/lifecycleRegistry.core.d.ts.map +1 -0
- package/dist/lifecycleRegistry/lifecycleRegistry.core.js +87 -0
- package/dist/lifecycleRegistry/lifecycleRegistry.core.js.map +1 -0
- package/dist/lifecycleSignal/index.d.ts +8 -0
- package/dist/lifecycleSignal/index.d.ts.map +1 -0
- package/dist/lifecycleSignal/index.js +7 -0
- package/dist/lifecycleSignal/index.js.map +1 -0
- package/dist/lifecycleSignal/lifecycleSignal.handler.d.ts +20 -0
- package/dist/lifecycleSignal/lifecycleSignal.handler.d.ts.map +1 -0
- package/dist/lifecycleSignal/lifecycleSignal.handler.js +32 -0
- package/dist/lifecycleSignal/lifecycleSignal.handler.js.map +1 -0
- package/dist/lifecycleState/index.d.ts +7 -0
- package/dist/lifecycleState/index.d.ts.map +1 -0
- package/dist/lifecycleState/index.js +7 -0
- package/dist/lifecycleState/index.js.map +1 -0
- package/dist/lifecycleState/lifecycleState.constants.d.ts +16 -0
- package/dist/lifecycleState/lifecycleState.constants.d.ts.map +1 -0
- package/dist/lifecycleState/lifecycleState.constants.js +16 -0
- package/dist/lifecycleState/lifecycleState.constants.js.map +1 -0
- package/dist/lifecycleState/lifecycleState.machine.d.ts +36 -0
- package/dist/lifecycleState/lifecycleState.machine.d.ts.map +1 -0
- package/dist/lifecycleState/lifecycleState.machine.js +57 -0
- package/dist/lifecycleState/lifecycleState.machine.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @latticejs/lifecycle/manager/shutdown
|
|
3
|
+
*
|
|
4
|
+
* Shutdown orchestration — stops and disposes components in reverse order.
|
|
5
|
+
*/
|
|
6
|
+
import { LifecyclePhase, LifecycleState } from "@latticejs/constants";
|
|
7
|
+
import { buildExecutionPlan } from "../lifecyclePlan/lifecyclePlan.core.js";
|
|
8
|
+
import { createLifecycleContext } from "../lifecycleContext/lifecycleContext.type.js";
|
|
9
|
+
import { transitionComponent } from "./lifecycleManager.context.js";
|
|
10
|
+
/** Shutdown phases in execution order. */
|
|
11
|
+
const SHUTDOWN_PHASES = ["stop", "dispose"];
|
|
12
|
+
/**
|
|
13
|
+
* Performs the full shutdown sequence: stop → dispose.
|
|
14
|
+
* Idempotent — safe to call multiple times.
|
|
15
|
+
*/
|
|
16
|
+
export async function performShutdown(ctx) {
|
|
17
|
+
if (ctx.state.state === LifecycleState.DISPOSED)
|
|
18
|
+
return;
|
|
19
|
+
if (ctx.state.state !== LifecycleState.STOPPING && ctx.state.state !== LifecycleState.FAILED) {
|
|
20
|
+
ctx.state.transition(LifecycleState.STOPPING);
|
|
21
|
+
}
|
|
22
|
+
ctx.events.emit("application:stopping", {});
|
|
23
|
+
const deadline = Date.now() + ctx.shutdownTimeout;
|
|
24
|
+
for (const phase of SHUTDOWN_PHASES) {
|
|
25
|
+
if (deadline - Date.now() <= 0)
|
|
26
|
+
break;
|
|
27
|
+
try {
|
|
28
|
+
await executeShutdownPhase(ctx, phase);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Shutdown must continue even if individual components fail.
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
ctx.state.forceState(LifecycleState.DISPOSED);
|
|
35
|
+
ctx.events.emit("application:stopped", { duration: Date.now() - ctx.startTime });
|
|
36
|
+
}
|
|
37
|
+
/** Executes a single shutdown phase across all registered components. */
|
|
38
|
+
async function executeShutdownPhase(ctx, phase) {
|
|
39
|
+
const plan = buildExecutionPlan(ctx.registry.getAll(), phase);
|
|
40
|
+
const context = createLifecycleContext(phase, ctx.startTime);
|
|
41
|
+
for (const stage of plan.stages) {
|
|
42
|
+
const stageRegs = stage.components
|
|
43
|
+
.map((id) => ctx.registry.get(id))
|
|
44
|
+
.filter((r) => r !== undefined);
|
|
45
|
+
if (stageRegs.length === 0)
|
|
46
|
+
continue;
|
|
47
|
+
for (const reg of stageRegs) {
|
|
48
|
+
transitionComponent(ctx, reg.id, LifecycleState.STOPPING);
|
|
49
|
+
}
|
|
50
|
+
await ctx.executor.executeStage(stageRegs, phase, context, ctx.concurrency);
|
|
51
|
+
const targetState = phase === "stop" ? LifecycleState.STOPPED : LifecycleState.DISPOSED;
|
|
52
|
+
for (const reg of stageRegs) {
|
|
53
|
+
transitionComponent(ctx, reg.id, targetState);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=lifecycleManager.shutdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycleManager.shutdown.js","sourceRoot":"","sources":["../../src/lifecycleManager/lifecycleManager.shutdown.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AAEtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,0CAA0C;AAC1C,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,SAAS,CAAU,CAAC;AAErD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAA4B;IAChE,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,cAAc,CAAC,QAAQ;QAAE,OAAO;IAExD,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,cAAc,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC;QAC7F,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,eAAe,CAAC;IAElD,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;YAAE,MAAM;QAEtC,IAAI,CAAC;YACH,MAAM,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;QAC/D,CAAC;IACH,CAAC;IAED,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC9C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,yEAAyE;AACzE,KAAK,UAAU,oBAAoB,CACjC,GAA4B,EAC5B,KAAyB;IAEzB,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,KAAuB,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAuB,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAE/E,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU;aAC/B,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;aACjC,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAE9D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAErC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,KAAuB,EAAE,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAE9F,MAAM,WAAW,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC;QACxF,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @oyinlola141/lattice-lifecycle/manager/startup
|
|
3
|
+
*
|
|
4
|
+
* Startup orchestration — initializes, starts, and readies components.
|
|
5
|
+
*/
|
|
6
|
+
import type { LifecycleManagerContext } from "./lifecycleManager.context.js";
|
|
7
|
+
/**
|
|
8
|
+
* Performs the full startup sequence: initialize → start → ready.
|
|
9
|
+
*/
|
|
10
|
+
export declare function performStartup(ctx: LifecycleManagerContext): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=lifecycleManager.startup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycleManager.startup.d.ts","sourceRoot":"","sources":["../../src/lifecycleManager/lifecycleManager.startup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAyB7E;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqChF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @latticejs/lifecycle/manager/startup
|
|
3
|
+
*
|
|
4
|
+
* Startup orchestration — initializes, starts, and readies components.
|
|
5
|
+
*/
|
|
6
|
+
import { LifecyclePhase, LifecycleState } from "@latticejs/constants";
|
|
7
|
+
import { buildExecutionPlan } from "../lifecyclePlan/lifecyclePlan.core.js";
|
|
8
|
+
import { createLifecycleContext } from "../lifecycleContext/lifecycleContext.type.js";
|
|
9
|
+
import { transitionComponent, transitionComponentBatch, emitComponentFailed, } from "./lifecycleManager.context.js";
|
|
10
|
+
import { performShutdown } from "./lifecycleManager.shutdown.js";
|
|
11
|
+
/** Maps startup phases to their target component state after success. */
|
|
12
|
+
const SUCCESS_STATE = {
|
|
13
|
+
initialize: LifecycleState.INITIALIZED,
|
|
14
|
+
start: LifecycleState.STARTED,
|
|
15
|
+
ready: LifecycleState.READY,
|
|
16
|
+
};
|
|
17
|
+
/** Maps startup phases to their component state during execution. */
|
|
18
|
+
const EXECUTING_STATE = {
|
|
19
|
+
initialize: LifecycleState.INITIALIZING,
|
|
20
|
+
start: LifecycleState.STARTING,
|
|
21
|
+
ready: LifecycleState.STARTED,
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Performs the full startup sequence: initialize → start → ready.
|
|
25
|
+
*/
|
|
26
|
+
export async function performStartup(ctx) {
|
|
27
|
+
ctx.startTime = Date.now();
|
|
28
|
+
ctx.state.transition(LifecycleState.INITIALIZING);
|
|
29
|
+
ctx.events.emit("application:initializing", {});
|
|
30
|
+
try {
|
|
31
|
+
ctx.registry.freeze();
|
|
32
|
+
const initOk = await executePhase(ctx, "initialize");
|
|
33
|
+
if (!initOk) {
|
|
34
|
+
await performShutdown(ctx);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
ctx.state.transition(LifecycleState.INITIALIZED);
|
|
38
|
+
ctx.state.transition(LifecycleState.STARTING);
|
|
39
|
+
const startOk = await executePhase(ctx, "start");
|
|
40
|
+
if (!startOk) {
|
|
41
|
+
await performShutdown(ctx);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
ctx.state.transition(LifecycleState.STARTED);
|
|
45
|
+
const readyOk = await executePhase(ctx, "ready");
|
|
46
|
+
if (readyOk) {
|
|
47
|
+
ctx.state.transition(LifecycleState.READY);
|
|
48
|
+
ctx.events.emit("application:ready", {
|
|
49
|
+
duration: Date.now() - ctx.startTime,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (ctx.state.state !== LifecycleState.FAILED) {
|
|
55
|
+
ctx.state.forceState(LifecycleState.FAILED);
|
|
56
|
+
}
|
|
57
|
+
await performShutdown(ctx);
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Executes a single startup phase across all registered components.
|
|
63
|
+
* Returns false if a critical component failed.
|
|
64
|
+
*/
|
|
65
|
+
async function executePhase(ctx, phase) {
|
|
66
|
+
const plan = buildExecutionPlan(ctx.registry.getAll(), phase);
|
|
67
|
+
const context = createLifecycleContext(phase, ctx.startTime);
|
|
68
|
+
for (const stage of plan.stages) {
|
|
69
|
+
const stageRegs = stage.components
|
|
70
|
+
.map((id) => ctx.registry.get(id))
|
|
71
|
+
.filter((r) => r !== undefined);
|
|
72
|
+
if (stageRegs.length === 0)
|
|
73
|
+
continue;
|
|
74
|
+
transitionComponentBatch(ctx, stageRegs.map((r) => r.id), EXECUTING_STATE[phase]);
|
|
75
|
+
ctx.events.emit("component:starting", {
|
|
76
|
+
component: { componentId: stage.components.join(",") },
|
|
77
|
+
});
|
|
78
|
+
const results = await ctx.executor.executeStage(stageRegs, phase, context, ctx.concurrency);
|
|
79
|
+
for (const result of results) {
|
|
80
|
+
const existing = ctx.results.get(result.id) ?? [];
|
|
81
|
+
ctx.results.set(result.id, [...existing, result]);
|
|
82
|
+
if (!result.success) {
|
|
83
|
+
transitionComponent(ctx, result.id, LifecycleState.FAILED);
|
|
84
|
+
emitComponentFailed(ctx, result);
|
|
85
|
+
if (ctx.registry.get(result.id)?.critical) {
|
|
86
|
+
ctx.state.forceState(LifecycleState.FAILED);
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
transitionComponent(ctx, result.id, SUCCESS_STATE[phase]);
|
|
92
|
+
ctx.events.emit("component:started", {
|
|
93
|
+
component: { componentId: result.id, duration: result.duration },
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=lifecycleManager.startup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycleManager.startup.js","sourceRoot":"","sources":["../../src/lifecycleManager/lifecycleManager.startup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecyclePhase/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lifecyclePhase/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @oyinlola141/lattice-lifecycle/phase
|
|
3
|
+
*
|
|
4
|
+
* Lifecycle phase ordering for startup and shutdown sequences.
|
|
5
|
+
*/
|
|
6
|
+
import { LifecyclePhase } from "@oyinlola141/lattice-constants";
|
|
7
|
+
/** Ordered phases for startup. */
|
|
8
|
+
export declare const STARTUP_PHASES: readonly LifecyclePhase[];
|
|
9
|
+
/** Ordered phases for shutdown (reversed). */
|
|
10
|
+
export declare const SHUTDOWN_PHASES: readonly LifecyclePhase[];
|
|
11
|
+
/**
|
|
12
|
+
* Returns the phase hook name for a given lifecycle phase.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getPhaseHookName(phase: LifecyclePhase): string;
|
|
15
|
+
/**
|
|
16
|
+
* Returns the on-prefixed hook name for a component method.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getComponentMethod(phase: LifecyclePhase): string;
|
|
19
|
+
//# sourceMappingURL=lifecyclePhase.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecyclePhase.core.d.ts","sourceRoot":"","sources":["../../src/lifecyclePhase/lifecyclePhase.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,kCAAkC;AAClC,eAAO,MAAM,cAAc,EAAE,SAAS,cAAc,EAIlD,CAAC;AAEH,8CAA8C;AAC9C,eAAO,MAAM,eAAe,EAAE,SAAS,cAAc,EAGnD,CAAC;AAEH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAa9D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAahE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @latticejs/lifecycle/phase
|
|
3
|
+
*
|
|
4
|
+
* Lifecycle phase ordering for startup and shutdown sequences.
|
|
5
|
+
*/
|
|
6
|
+
import { LifecyclePhase } from "@latticejs/constants";
|
|
7
|
+
/** Ordered phases for startup. */
|
|
8
|
+
export const STARTUP_PHASES = Object.freeze([
|
|
9
|
+
LifecyclePhase.INITIALIZE,
|
|
10
|
+
LifecyclePhase.START,
|
|
11
|
+
LifecyclePhase.READY,
|
|
12
|
+
]);
|
|
13
|
+
/** Ordered phases for shutdown (reversed). */
|
|
14
|
+
export const SHUTDOWN_PHASES = Object.freeze([
|
|
15
|
+
LifecyclePhase.STOP,
|
|
16
|
+
LifecyclePhase.DISPOSE,
|
|
17
|
+
]);
|
|
18
|
+
/**
|
|
19
|
+
* Returns the phase hook name for a given lifecycle phase.
|
|
20
|
+
*/
|
|
21
|
+
export function getPhaseHookName(phase) {
|
|
22
|
+
switch (phase) {
|
|
23
|
+
case LifecyclePhase.INITIALIZE:
|
|
24
|
+
return "initialize";
|
|
25
|
+
case LifecyclePhase.START:
|
|
26
|
+
return "start";
|
|
27
|
+
case LifecyclePhase.READY:
|
|
28
|
+
return "ready";
|
|
29
|
+
case LifecyclePhase.STOP:
|
|
30
|
+
return "stop";
|
|
31
|
+
case LifecyclePhase.DISPOSE:
|
|
32
|
+
return "dispose";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Returns the on-prefixed hook name for a component method.
|
|
37
|
+
*/
|
|
38
|
+
export function getComponentMethod(phase) {
|
|
39
|
+
switch (phase) {
|
|
40
|
+
case LifecyclePhase.INITIALIZE:
|
|
41
|
+
return "initialize";
|
|
42
|
+
case LifecyclePhase.START:
|
|
43
|
+
return "start";
|
|
44
|
+
case LifecyclePhase.READY:
|
|
45
|
+
return "ready";
|
|
46
|
+
case LifecyclePhase.STOP:
|
|
47
|
+
return "stop";
|
|
48
|
+
case LifecyclePhase.DISPOSE:
|
|
49
|
+
return "dispose";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=lifecyclePhase.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecyclePhase.core.js","sourceRoot":"","sources":["../../src/lifecyclePhase/lifecyclePhase.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,kCAAkC;AAClC,MAAM,CAAC,MAAM,cAAc,GAA8B,MAAM,CAAC,MAAM,CAAC;IACrE,cAAc,CAAC,UAAU;IACzB,cAAc,CAAC,KAAK;IACpB,cAAc,CAAC,KAAK;CACrB,CAAC,CAAC;AAEH,8CAA8C;AAC9C,MAAM,CAAC,MAAM,eAAe,GAA8B,MAAM,CAAC,MAAM,CAAC;IACtE,cAAc,CAAC,IAAI;IACnB,cAAc,CAAC,OAAO;CACvB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAqB;IACpD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,cAAc,CAAC,UAAU;YAC5B,OAAO,YAAY,CAAC;QACtB,KAAK,cAAc,CAAC,KAAK;YACvB,OAAO,OAAO,CAAC;QACjB,KAAK,cAAc,CAAC,KAAK;YACvB,OAAO,OAAO,CAAC;QACjB,KAAK,cAAc,CAAC,IAAI;YACtB,OAAO,MAAM,CAAC;QAChB,KAAK,cAAc,CAAC,OAAO;YACzB,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAqB;IACtD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,cAAc,CAAC,UAAU;YAC5B,OAAO,YAAY,CAAC;QACtB,KAAK,cAAc,CAAC,KAAK;YACvB,OAAO,OAAO,CAAC;QACjB,KAAK,cAAc,CAAC,KAAK;YACvB,OAAO,OAAO,CAAC;QACjB,KAAK,cAAc,CAAC,IAAI;YACtB,OAAO,MAAM,CAAC;QAChB,KAAK,cAAc,CAAC,OAAO;YACzB,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @oyinlola141/lattice-lifecycle/lifecyclePhase
|
|
3
|
+
*
|
|
4
|
+
* Lifecycle phase enum.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Lifecycle phases that components can participate in.
|
|
8
|
+
*/
|
|
9
|
+
export declare enum LifecyclePhase {
|
|
10
|
+
Initialize = "initialize",
|
|
11
|
+
Start = "start",
|
|
12
|
+
Ready = "ready",
|
|
13
|
+
Stop = "stop",
|
|
14
|
+
Dispose = "dispose"
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=lifecyclePhase.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecyclePhase.type.d.ts","sourceRoot":"","sources":["../../src/lifecyclePhase/lifecyclePhase.type.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,oBAAY,cAAc;IACxB,UAAU,eAAe;IACzB,KAAK,UAAU;IACf,KAAK,UAAU;IACf,IAAI,SAAS;IACb,OAAO,YAAY;CACpB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @latticejs/lifecycle/lifecyclePhase
|
|
3
|
+
*
|
|
4
|
+
* Lifecycle phase enum.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Lifecycle phases that components can participate in.
|
|
8
|
+
*/
|
|
9
|
+
export var LifecyclePhase;
|
|
10
|
+
(function (LifecyclePhase) {
|
|
11
|
+
LifecyclePhase["Initialize"] = "initialize";
|
|
12
|
+
LifecyclePhase["Start"] = "start";
|
|
13
|
+
LifecyclePhase["Ready"] = "ready";
|
|
14
|
+
LifecyclePhase["Stop"] = "stop";
|
|
15
|
+
LifecyclePhase["Dispose"] = "dispose";
|
|
16
|
+
})(LifecyclePhase || (LifecyclePhase = {}));
|
|
17
|
+
//# sourceMappingURL=lifecyclePhase.type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecyclePhase.type.js","sourceRoot":"","sources":["../../src/lifecyclePhase/lifecyclePhase.type.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,CAAN,IAAY,cAMX;AAND,WAAY,cAAc;IACxB,2CAAyB,CAAA;IACzB,iCAAe,CAAA;IACf,iCAAe,CAAA;IACf,+BAAa,CAAA;IACb,qCAAmB,CAAA;AACrB,CAAC,EANW,cAAc,KAAd,cAAc,QAMzB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @oyinlola141/lattice-lifecycle/plan
|
|
3
|
+
*
|
|
4
|
+
* Lifecycle execution planner for building startup/shutdown stages.
|
|
5
|
+
*/
|
|
6
|
+
export { buildExecutionPlan, } from "./lifecyclePlan.core.js";
|
|
7
|
+
export type { ExecutionStage, ExecutionPlan, } from "./lifecyclePlan.core.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecyclePlan/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,cAAc,EACd,aAAa,GACd,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lifecyclePlan/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,GACnB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @oyinlola141/lattice-lifecycle/plan
|
|
3
|
+
*
|
|
4
|
+
* Lifecycle execution planner — builds startup/shutdown stages from dependency graph.
|
|
5
|
+
*/
|
|
6
|
+
import type { LifecyclePhase } from "@oyinlola141/lattice-constants";
|
|
7
|
+
import type { LifecycleRegistration } from "../lifecycleComponent/lifecycleComponent.type.js";
|
|
8
|
+
/** A single execution stage — component IDs that can run in parallel. */
|
|
9
|
+
export interface ExecutionStage {
|
|
10
|
+
/** Component IDs in this stage. */
|
|
11
|
+
readonly components: readonly string[];
|
|
12
|
+
/** The lifecycle phase for this stage. */
|
|
13
|
+
readonly phase: LifecyclePhase;
|
|
14
|
+
}
|
|
15
|
+
/** A complete execution plan for a lifecycle phase. */
|
|
16
|
+
export interface ExecutionPlan {
|
|
17
|
+
/** Ordered stages to execute sequentially. */
|
|
18
|
+
readonly stages: readonly ExecutionStage[];
|
|
19
|
+
/** The lifecycle phase. */
|
|
20
|
+
readonly phase: LifecyclePhase;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Builds an execution plan for a given lifecycle phase.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildExecutionPlan(registrations: readonly LifecycleRegistration[], phase: LifecyclePhase): ExecutionPlan;
|
|
26
|
+
//# sourceMappingURL=lifecyclePlan.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecyclePlan.core.d.ts","sourceRoot":"","sources":["../../src/lifecyclePlan/lifecyclePlan.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kDAAkD,CAAC;AAQ9F,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;CAChC;AAED,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,SAAS,qBAAqB,EAAE,EAC/C,KAAK,EAAE,cAAc,GACpB,aAAa,CAmBf"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @latticejs/lifecycle/plan
|
|
3
|
+
*
|
|
4
|
+
* Lifecycle execution planner — builds startup/shutdown stages from dependency graph.
|
|
5
|
+
*/
|
|
6
|
+
import { DependencyGraph, topologicalSort, reverseTopologicalSort, } from "../lifecycleInternal/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Builds an execution plan for a given lifecycle phase.
|
|
9
|
+
*/
|
|
10
|
+
export function buildExecutionPlan(registrations, phase) {
|
|
11
|
+
const priorities = new Map();
|
|
12
|
+
for (const reg of registrations) {
|
|
13
|
+
priorities.set(reg.id, reg.priority);
|
|
14
|
+
}
|
|
15
|
+
const graph = buildGraphForPhase(registrations, phase);
|
|
16
|
+
const isShutdown = phase === "stop" || phase === "dispose";
|
|
17
|
+
const sorted = isShutdown
|
|
18
|
+
? reverseTopologicalSort(graph, priorities)
|
|
19
|
+
: topologicalSort(graph, priorities);
|
|
20
|
+
const stages = sorted.map((stage) => ({
|
|
21
|
+
components: stage,
|
|
22
|
+
phase,
|
|
23
|
+
}));
|
|
24
|
+
return { stages, phase };
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Builds a dependency graph for a specific phase.
|
|
28
|
+
*/
|
|
29
|
+
function buildGraphForPhase(registrations, phase) {
|
|
30
|
+
const graph = new DependencyGraph();
|
|
31
|
+
for (const reg of registrations) {
|
|
32
|
+
graph.addNode(reg.id);
|
|
33
|
+
for (const dep of reg.dependsOn) {
|
|
34
|
+
graph.addNode(dep);
|
|
35
|
+
graph.addEdge(reg.id, dep);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return graph;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=lifecyclePlan.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecyclePlan.core.js","sourceRoot":"","sources":["../../src/lifecyclePlan/lifecyclePlan.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,eAAe,EACf,eAAe,EACf,sBAAsB,GACvB,MAAM,+BAA+B,CAAC;AAmBvC;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,aAA+C,EAC/C,KAAqB;IAErB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,CAAC;IAE3D,MAAM,MAAM,GAAG,UAAU;QACvB,CAAC,CAAC,sBAAsB,CAAC,KAAK,EAAE,UAAU,CAAC;QAC3C,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAqB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtD,UAAU,EAAE,KAAK;QACjB,KAAK;KACN,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CACzB,aAA+C,EAC/C,KAAqB;IAErB,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IAEpC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtB,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAChC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACnB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycleRegistry/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lifecycleRegistry/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @oyinlola141/lattice-lifecycle/registry
|
|
3
|
+
*
|
|
4
|
+
* Lifecycle registry — manages component registration, validation, and lookup.
|
|
5
|
+
*/
|
|
6
|
+
import type { LifecycleComponent, LifecycleRegistration, LifecycleRegistrationOptions } from "../lifecycleComponent/lifecycleComponent.type.js";
|
|
7
|
+
import { DependencyGraph } from "../lifecycleInternal/index.js";
|
|
8
|
+
/**
|
|
9
|
+
* Registry for lifecycle components.
|
|
10
|
+
* Validates registration, builds dependency graph, and freezes on demand.
|
|
11
|
+
*/
|
|
12
|
+
export declare class LifecycleRegistry {
|
|
13
|
+
private readonly _registrations;
|
|
14
|
+
private readonly _graph;
|
|
15
|
+
private _frozen;
|
|
16
|
+
/** Registers a component with optional configuration. */
|
|
17
|
+
register(component: LifecycleComponent, options?: LifecycleRegistrationOptions): void;
|
|
18
|
+
/** Validates all registrations and dependency graph. */
|
|
19
|
+
validate(): void;
|
|
20
|
+
/** Freezes the registry — no more registrations allowed. */
|
|
21
|
+
freeze(): void;
|
|
22
|
+
/** Returns whether the registry is frozen. */
|
|
23
|
+
get isFrozen(): boolean;
|
|
24
|
+
/** Returns a registration by ID. */
|
|
25
|
+
get(id: string): LifecycleRegistration | undefined;
|
|
26
|
+
/** Returns all registrations. */
|
|
27
|
+
getAll(): readonly LifecycleRegistration[];
|
|
28
|
+
/** Returns all registration IDs. */
|
|
29
|
+
getIds(): readonly string[];
|
|
30
|
+
/** Returns the dependency graph. */
|
|
31
|
+
get graph(): DependencyGraph;
|
|
32
|
+
/** Returns the number of registered components. */
|
|
33
|
+
get size(): number;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=lifecycleRegistry.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycleRegistry.core.d.ts","sourceRoot":"","sources":["../../src/lifecycleRegistry/lifecycleRegistry.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,4BAA4B,EAC7B,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4C;IAC3E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,OAAO,CAAS;IAExB,yDAAyD;IAClD,QAAQ,CACb,SAAS,EAAE,kBAAkB,EAC7B,OAAO,GAAE,4BAAiC,GACzC,IAAI,CAiCN;IAED,wDAAwD;IACjD,QAAQ,IAAI,IAAI,CAWtB;IAED,4DAA4D;IACrD,MAAM,IAAI,IAAI,CAGpB;IAED,8CAA8C;IAC9C,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED,oCAAoC;IAC7B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAExD;IAED,iCAAiC;IAC1B,MAAM,IAAI,SAAS,qBAAqB,EAAE,CAEhD;IAED,oCAAoC;IAC7B,MAAM,IAAI,SAAS,MAAM,EAAE,CAEjC;IAED,oCAAoC;IACpC,IAAW,KAAK,IAAI,eAAe,CAElC;IAED,mDAAmD;IACnD,IAAW,IAAI,IAAI,MAAM,CAExB;CACF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @latticejs/lifecycle/registry
|
|
3
|
+
*
|
|
4
|
+
* Lifecycle registry — manages component registration, validation, and lookup.
|
|
5
|
+
*/
|
|
6
|
+
import { LIFECYCLE_DEFAULT_TIMEOUT, } from "@latticejs/constants";
|
|
7
|
+
import { DependencyGraph } from "../lifecycleInternal/index.js";
|
|
8
|
+
/**
|
|
9
|
+
* Registry for lifecycle components.
|
|
10
|
+
* Validates registration, builds dependency graph, and freezes on demand.
|
|
11
|
+
*/
|
|
12
|
+
export class LifecycleRegistry {
|
|
13
|
+
_registrations = new Map();
|
|
14
|
+
_graph = new DependencyGraph();
|
|
15
|
+
_frozen = false;
|
|
16
|
+
/** Registers a component with optional configuration. */
|
|
17
|
+
register(component, options = {}) {
|
|
18
|
+
if (this._frozen) {
|
|
19
|
+
throw new Error("Cannot register components after registry is frozen");
|
|
20
|
+
}
|
|
21
|
+
const id = options.id ?? component.name;
|
|
22
|
+
if (this._registrations.has(id)) {
|
|
23
|
+
throw new Error(`Component "${id}" is already registered`);
|
|
24
|
+
}
|
|
25
|
+
const registration = {
|
|
26
|
+
id,
|
|
27
|
+
component,
|
|
28
|
+
dependsOn: options.dependsOn ?? [],
|
|
29
|
+
priority: options.priority ?? 0,
|
|
30
|
+
critical: options.critical ?? true,
|
|
31
|
+
timeout: options.timeout ?? LIFECYCLE_DEFAULT_TIMEOUT,
|
|
32
|
+
retry: {
|
|
33
|
+
attempts: options.retry?.attempts ?? 0,
|
|
34
|
+
delay: options.retry?.delay ?? 500,
|
|
35
|
+
maxDelay: options.retry?.maxDelay ?? 10_000,
|
|
36
|
+
backoff: options.retry?.backoff ?? "exponential",
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
this._registrations.set(id, registration);
|
|
40
|
+
this._graph.addNode(id);
|
|
41
|
+
for (const dep of registration.dependsOn) {
|
|
42
|
+
this._graph.addNode(dep);
|
|
43
|
+
this._graph.addEdge(id, dep);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Validates all registrations and dependency graph. */
|
|
47
|
+
validate() {
|
|
48
|
+
for (const [id, reg] of this._registrations) {
|
|
49
|
+
for (const dep of reg.dependsOn) {
|
|
50
|
+
if (!this._registrations.has(dep)) {
|
|
51
|
+
throw new Error(`Component "${id}" depends on "${dep}" which is not registered`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
this._graph.validate();
|
|
56
|
+
}
|
|
57
|
+
/** Freezes the registry — no more registrations allowed. */
|
|
58
|
+
freeze() {
|
|
59
|
+
this.validate();
|
|
60
|
+
this._frozen = true;
|
|
61
|
+
}
|
|
62
|
+
/** Returns whether the registry is frozen. */
|
|
63
|
+
get isFrozen() {
|
|
64
|
+
return this._frozen;
|
|
65
|
+
}
|
|
66
|
+
/** Returns a registration by ID. */
|
|
67
|
+
get(id) {
|
|
68
|
+
return this._registrations.get(id);
|
|
69
|
+
}
|
|
70
|
+
/** Returns all registrations. */
|
|
71
|
+
getAll() {
|
|
72
|
+
return [...this._registrations.values()];
|
|
73
|
+
}
|
|
74
|
+
/** Returns all registration IDs. */
|
|
75
|
+
getIds() {
|
|
76
|
+
return [...this._registrations.keys()];
|
|
77
|
+
}
|
|
78
|
+
/** Returns the dependency graph. */
|
|
79
|
+
get graph() {
|
|
80
|
+
return this._graph;
|
|
81
|
+
}
|
|
82
|
+
/** Returns the number of registered components. */
|
|
83
|
+
get size() {
|
|
84
|
+
return this._registrations.size;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=lifecycleRegistry.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycleRegistry.core.js","sourceRoot":"","sources":["../../src/lifecycleRegistry/lifecycleRegistry.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @oyinlola141/lattice-lifecycle/signal
|
|
3
|
+
*
|
|
4
|
+
* Process signal handler for graceful shutdown.
|
|
5
|
+
*/
|
|
6
|
+
export { installSignalHandlers, DEFAULT_SHUTDOWN_SIGNALS, } from "./lifecycleSignal.handler.js";
|
|
7
|
+
export type { SignalHandlerOptions } from "./lifecycleSignal.handler.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycleSignal/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lifecycleSignal/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,8BAA8B,CAAC"}
|