@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.
Files changed (122) hide show
  1. package/README.md +19 -0
  2. package/dist/index.d.ts +42 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +34 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lifecycleComponent/index.d.ts +7 -0
  7. package/dist/lifecycleComponent/index.d.ts.map +1 -0
  8. package/dist/lifecycleComponent/index.js +7 -0
  9. package/dist/lifecycleComponent/index.js.map +1 -0
  10. package/dist/lifecycleComponent/lifecycleComponent.type.d.ts +68 -0
  11. package/dist/lifecycleComponent/lifecycleComponent.type.d.ts.map +1 -0
  12. package/dist/lifecycleComponent/lifecycleComponent.type.js +7 -0
  13. package/dist/lifecycleComponent/lifecycleComponent.type.js.map +1 -0
  14. package/dist/lifecycleContext/index.d.ts +8 -0
  15. package/dist/lifecycleContext/index.d.ts.map +1 -0
  16. package/dist/lifecycleContext/index.js +7 -0
  17. package/dist/lifecycleContext/index.js.map +1 -0
  18. package/dist/lifecycleContext/lifecycleContext.type.d.ts +23 -0
  19. package/dist/lifecycleContext/lifecycleContext.type.d.ts.map +1 -0
  20. package/dist/lifecycleContext/lifecycleContext.type.js +15 -0
  21. package/dist/lifecycleContext/lifecycleContext.type.js.map +1 -0
  22. package/dist/lifecycleEvents/index.d.ts +8 -0
  23. package/dist/lifecycleEvents/index.d.ts.map +1 -0
  24. package/dist/lifecycleEvents/index.js +7 -0
  25. package/dist/lifecycleEvents/index.js.map +1 -0
  26. package/dist/lifecycleEvents/lifecycleEvents.core.d.ts +52 -0
  27. package/dist/lifecycleEvents/lifecycleEvents.core.d.ts.map +1 -0
  28. package/dist/lifecycleEvents/lifecycleEvents.core.js +46 -0
  29. package/dist/lifecycleEvents/lifecycleEvents.core.js.map +1 -0
  30. package/dist/lifecycleExecutor/index.d.ts +8 -0
  31. package/dist/lifecycleExecutor/index.d.ts.map +1 -0
  32. package/dist/lifecycleExecutor/index.js +7 -0
  33. package/dist/lifecycleExecutor/index.js.map +1 -0
  34. package/dist/lifecycleExecutor/lifecycleExecutor.core.d.ts +35 -0
  35. package/dist/lifecycleExecutor/lifecycleExecutor.core.d.ts.map +1 -0
  36. package/dist/lifecycleExecutor/lifecycleExecutor.core.js +88 -0
  37. package/dist/lifecycleExecutor/lifecycleExecutor.core.js.map +1 -0
  38. package/dist/lifecycleInternal/asyncUtils.core.d.ts +19 -0
  39. package/dist/lifecycleInternal/asyncUtils.core.d.ts.map +1 -0
  40. package/dist/lifecycleInternal/asyncUtils.core.js +69 -0
  41. package/dist/lifecycleInternal/asyncUtils.core.js.map +1 -0
  42. package/dist/lifecycleInternal/dependencyGraph.core.d.ts +29 -0
  43. package/dist/lifecycleInternal/dependencyGraph.core.d.ts.map +1 -0
  44. package/dist/lifecycleInternal/dependencyGraph.core.js +74 -0
  45. package/dist/lifecycleInternal/dependencyGraph.core.js.map +1 -0
  46. package/dist/lifecycleInternal/index.d.ts +10 -0
  47. package/dist/lifecycleInternal/index.d.ts.map +1 -0
  48. package/dist/lifecycleInternal/index.js +9 -0
  49. package/dist/lifecycleInternal/index.js.map +1 -0
  50. package/dist/lifecycleInternal/topologicalSort.core.d.ts +19 -0
  51. package/dist/lifecycleInternal/topologicalSort.core.d.ts.map +1 -0
  52. package/dist/lifecycleInternal/topologicalSort.core.js +50 -0
  53. package/dist/lifecycleInternal/topologicalSort.core.js.map +1 -0
  54. package/dist/lifecycleManager/index.d.ts +8 -0
  55. package/dist/lifecycleManager/index.d.ts.map +1 -0
  56. package/dist/lifecycleManager/index.js +7 -0
  57. package/dist/lifecycleManager/index.js.map +1 -0
  58. package/dist/lifecycleManager/lifecycleManager.context.d.ts +42 -0
  59. package/dist/lifecycleManager/lifecycleManager.context.d.ts.map +1 -0
  60. package/dist/lifecycleManager/lifecycleManager.context.js +34 -0
  61. package/dist/lifecycleManager/lifecycleManager.context.js.map +1 -0
  62. package/dist/lifecycleManager/lifecycleManager.core.d.ts +70 -0
  63. package/dist/lifecycleManager/lifecycleManager.core.d.ts.map +1 -0
  64. package/dist/lifecycleManager/lifecycleManager.core.js +119 -0
  65. package/dist/lifecycleManager/lifecycleManager.core.js.map +1 -0
  66. package/dist/lifecycleManager/lifecycleManager.shutdown.d.ts +12 -0
  67. package/dist/lifecycleManager/lifecycleManager.shutdown.d.ts.map +1 -0
  68. package/dist/lifecycleManager/lifecycleManager.shutdown.js +57 -0
  69. package/dist/lifecycleManager/lifecycleManager.shutdown.js.map +1 -0
  70. package/dist/lifecycleManager/lifecycleManager.startup.d.ts +11 -0
  71. package/dist/lifecycleManager/lifecycleManager.startup.d.ts.map +1 -0
  72. package/dist/lifecycleManager/lifecycleManager.startup.js +100 -0
  73. package/dist/lifecycleManager/lifecycleManager.startup.js.map +1 -0
  74. package/dist/lifecyclePhase/index.d.ts +7 -0
  75. package/dist/lifecyclePhase/index.d.ts.map +1 -0
  76. package/dist/lifecyclePhase/index.js +7 -0
  77. package/dist/lifecyclePhase/index.js.map +1 -0
  78. package/dist/lifecyclePhase/lifecyclePhase.core.d.ts +19 -0
  79. package/dist/lifecyclePhase/lifecyclePhase.core.d.ts.map +1 -0
  80. package/dist/lifecyclePhase/lifecyclePhase.core.js +52 -0
  81. package/dist/lifecyclePhase/lifecyclePhase.core.js.map +1 -0
  82. package/dist/lifecyclePhase/lifecyclePhase.type.d.ts +16 -0
  83. package/dist/lifecyclePhase/lifecyclePhase.type.d.ts.map +1 -0
  84. package/dist/lifecyclePhase/lifecyclePhase.type.js +17 -0
  85. package/dist/lifecyclePhase/lifecyclePhase.type.js.map +1 -0
  86. package/dist/lifecyclePlan/index.d.ts +8 -0
  87. package/dist/lifecyclePlan/index.d.ts.map +1 -0
  88. package/dist/lifecyclePlan/index.js +7 -0
  89. package/dist/lifecyclePlan/index.js.map +1 -0
  90. package/dist/lifecyclePlan/lifecyclePlan.core.d.ts +26 -0
  91. package/dist/lifecyclePlan/lifecyclePlan.core.d.ts.map +1 -0
  92. package/dist/lifecyclePlan/lifecyclePlan.core.js +40 -0
  93. package/dist/lifecyclePlan/lifecyclePlan.core.js.map +1 -0
  94. package/dist/lifecycleRegistry/index.d.ts +7 -0
  95. package/dist/lifecycleRegistry/index.d.ts.map +1 -0
  96. package/dist/lifecycleRegistry/index.js +7 -0
  97. package/dist/lifecycleRegistry/index.js.map +1 -0
  98. package/dist/lifecycleRegistry/lifecycleRegistry.core.d.ts +35 -0
  99. package/dist/lifecycleRegistry/lifecycleRegistry.core.d.ts.map +1 -0
  100. package/dist/lifecycleRegistry/lifecycleRegistry.core.js +87 -0
  101. package/dist/lifecycleRegistry/lifecycleRegistry.core.js.map +1 -0
  102. package/dist/lifecycleSignal/index.d.ts +8 -0
  103. package/dist/lifecycleSignal/index.d.ts.map +1 -0
  104. package/dist/lifecycleSignal/index.js +7 -0
  105. package/dist/lifecycleSignal/index.js.map +1 -0
  106. package/dist/lifecycleSignal/lifecycleSignal.handler.d.ts +20 -0
  107. package/dist/lifecycleSignal/lifecycleSignal.handler.d.ts.map +1 -0
  108. package/dist/lifecycleSignal/lifecycleSignal.handler.js +32 -0
  109. package/dist/lifecycleSignal/lifecycleSignal.handler.js.map +1 -0
  110. package/dist/lifecycleState/index.d.ts +7 -0
  111. package/dist/lifecycleState/index.d.ts.map +1 -0
  112. package/dist/lifecycleState/index.js +7 -0
  113. package/dist/lifecycleState/index.js.map +1 -0
  114. package/dist/lifecycleState/lifecycleState.constants.d.ts +16 -0
  115. package/dist/lifecycleState/lifecycleState.constants.d.ts.map +1 -0
  116. package/dist/lifecycleState/lifecycleState.constants.js +16 -0
  117. package/dist/lifecycleState/lifecycleState.constants.js.map +1 -0
  118. package/dist/lifecycleState/lifecycleState.machine.d.ts +36 -0
  119. package/dist/lifecycleState/lifecycleState.machine.d.ts.map +1 -0
  120. package/dist/lifecycleState/lifecycleState.machine.js +57 -0
  121. package/dist/lifecycleState/lifecycleState.machine.js.map +1 -0
  122. package/package.json +41 -0
@@ -0,0 +1,69 @@
1
+ /**
2
+ * @latticejs/lifecycle/internal/async-utils
3
+ *
4
+ * Async utilities for timeout, abort, and concurrency control.
5
+ */
6
+ import { LifecycleTimeoutError } from "@latticejs/errors";
7
+ /**
8
+ * Executes an async operation with a timeout.
9
+ * Throws LifecycleTimeoutError if the timeout is exceeded.
10
+ */
11
+ export async function withTimeout(fn, timeoutMs, componentId, phase) {
12
+ return new Promise((resolve, reject) => {
13
+ const timer = setTimeout(() => {
14
+ reject(new LifecycleTimeoutError(componentId, phase, timeoutMs));
15
+ }, timeoutMs);
16
+ fn()
17
+ .then((result) => {
18
+ clearTimeout(timer);
19
+ resolve(result);
20
+ })
21
+ .catch((error) => {
22
+ clearTimeout(timer);
23
+ reject(error);
24
+ });
25
+ });
26
+ }
27
+ /**
28
+ * Executes an async operation with abort signal support.
29
+ */
30
+ export async function withAbort(fn, signal) {
31
+ if (signal.aborted) {
32
+ throw new Error("Operation aborted");
33
+ }
34
+ return new Promise((resolve, reject) => {
35
+ const onAbort = () => {
36
+ reject(new Error("Operation aborted"));
37
+ };
38
+ signal.addEventListener("abort", onAbort, { once: true });
39
+ fn(signal)
40
+ .then((result) => {
41
+ signal.removeEventListener("abort", onAbort);
42
+ resolve(result);
43
+ })
44
+ .catch((error) => {
45
+ signal.removeEventListener("abort", onAbort);
46
+ reject(error);
47
+ });
48
+ });
49
+ }
50
+ /**
51
+ * Executes async operations with a concurrency limit.
52
+ */
53
+ export async function withConcurrency(items, concurrency, fn) {
54
+ const executing = new Set();
55
+ const results = [];
56
+ for (let i = 0; i < items.length; i++) {
57
+ const item = items[i];
58
+ const p = fn(item, i).then(() => {
59
+ executing.delete(p);
60
+ });
61
+ executing.add(p);
62
+ results.push(p);
63
+ if (executing.size >= concurrency) {
64
+ await Promise.race(executing);
65
+ }
66
+ }
67
+ await Promise.all(results);
68
+ }
69
+ //# sourceMappingURL=asyncUtils.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asyncUtils.core.js","sourceRoot":"","sources":["../../src/lifecycleInternal/asyncUtils.core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @oyinlola141/lattice-lifecycle/internal/dependency-graph
3
+ *
4
+ * Directed acyclic graph for component dependency tracking.
5
+ */
6
+ /**
7
+ * A directed acyclic graph of component dependencies.
8
+ */
9
+ export declare class DependencyGraph {
10
+ private readonly _edges;
11
+ private readonly _reverseEdges;
12
+ /** Adds a node to the graph. */
13
+ addNode(id: string): void;
14
+ /** Adds a directed edge: from depends on to. */
15
+ addEdge(from: string, to: string): void;
16
+ /** Returns all nodes. */
17
+ getNodes(): readonly string[];
18
+ /** Returns the nodes that the given node depends on. */
19
+ getDependencies(id: string): readonly string[];
20
+ /** Returns the nodes that depend on the given node. */
21
+ getDependents(id: string): readonly string[];
22
+ /**
23
+ * Validates that the graph has no circular dependencies.
24
+ * Throws LifecycleDependencyError with the cycle path if found.
25
+ */
26
+ validate(): void;
27
+ private _detectCycle;
28
+ }
29
+ //# sourceMappingURL=dependencyGraph.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyGraph.core.d.ts","sourceRoot":"","sources":["../../src/lifecycleInternal/dependencyGraph.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAEhE,gCAAgC;IACzB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAO/B;IAED,gDAAgD;IACzC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAK7C;IAED,yBAAyB;IAClB,QAAQ,IAAI,SAAS,MAAM,EAAE,CAEnC;IAED,wDAAwD;IACjD,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAEpD;IAED,uDAAuD;IAChD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAElD;IAED;;;OAGG;IACI,QAAQ,IAAI,IAAI,CAUtB;IAED,OAAO,CAAC,YAAY;CAyBrB"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * @latticejs/lifecycle/internal/dependency-graph
3
+ *
4
+ * Directed acyclic graph for component dependency tracking.
5
+ */
6
+ import { LifecycleDependencyError, } from "@latticejs/errors";
7
+ /**
8
+ * A directed acyclic graph of component dependencies.
9
+ */
10
+ export class DependencyGraph {
11
+ _edges = new Map();
12
+ _reverseEdges = new Map();
13
+ /** Adds a node to the graph. */
14
+ addNode(id) {
15
+ if (!this._edges.has(id)) {
16
+ this._edges.set(id, new Set());
17
+ }
18
+ if (!this._reverseEdges.has(id)) {
19
+ this._reverseEdges.set(id, new Set());
20
+ }
21
+ }
22
+ /** Adds a directed edge: from depends on to. */
23
+ addEdge(from, to) {
24
+ this.addNode(from);
25
+ this.addNode(to);
26
+ this._edges.get(from).add(to);
27
+ this._reverseEdges.get(to).add(from);
28
+ }
29
+ /** Returns all nodes. */
30
+ getNodes() {
31
+ return [...this._edges.keys()];
32
+ }
33
+ /** Returns the nodes that the given node depends on. */
34
+ getDependencies(id) {
35
+ return [...(this._edges.get(id) ?? [])];
36
+ }
37
+ /** Returns the nodes that depend on the given node. */
38
+ getDependents(id) {
39
+ return [...(this._reverseEdges.get(id) ?? [])];
40
+ }
41
+ /**
42
+ * Validates that the graph has no circular dependencies.
43
+ * Throws LifecycleDependencyError with the cycle path if found.
44
+ */
45
+ validate() {
46
+ const visited = new Set();
47
+ const inStack = new Set();
48
+ const path = [];
49
+ for (const node of this._edges.keys()) {
50
+ if (!visited.has(node)) {
51
+ this._detectCycle(node, visited, inStack, path);
52
+ }
53
+ }
54
+ }
55
+ _detectCycle(node, visited, inStack, path) {
56
+ visited.add(node);
57
+ inStack.add(node);
58
+ path.push(node);
59
+ const deps = this._edges.get(node) ?? new Set();
60
+ for (const dep of deps) {
61
+ if (inStack.has(dep)) {
62
+ const cycleStart = path.indexOf(dep);
63
+ const cycle = [...path.slice(cycleStart), dep];
64
+ throw new LifecycleDependencyError(cycle);
65
+ }
66
+ if (!visited.has(dep)) {
67
+ this._detectCycle(dep, visited, inStack, path);
68
+ }
69
+ }
70
+ path.pop();
71
+ inStack.delete(node);
72
+ }
73
+ }
74
+ //# sourceMappingURL=dependencyGraph.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyGraph.core.js","sourceRoot":"","sources":["../../src/lifecycleInternal/dependencyGraph.core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @oyinlola141/lattice-lifecycle/internal
3
+ *
4
+ * Internal utilities: dependency graph, topological sort, async helpers.
5
+ */
6
+ export { DependencyGraph } from "./dependencyGraph.core.js";
7
+ export { topologicalSort, reverseTopologicalSort, } from "./topologicalSort.core.js";
8
+ export type { TopologicalStage } from "./topologicalSort.core.js";
9
+ export { withTimeout, withAbort, withConcurrency, } from "./asyncUtils.core.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycleInternal/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EACL,eAAe,EACf,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EACL,WAAW,EACX,SAAS,EACT,eAAe,GAChB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @latticejs/lifecycle/internal
3
+ *
4
+ * Internal utilities: dependency graph, topological sort, async helpers.
5
+ */
6
+ export { DependencyGraph } from "./dependencyGraph.core.js";
7
+ export { topologicalSort, reverseTopologicalSort, } from "./topologicalSort.core.js";
8
+ export { withTimeout, withAbort, withConcurrency, } from "./asyncUtils.core.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lifecycleInternal/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EACL,eAAe,EACf,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,WAAW,EACX,SAAS,EACT,eAAe,GAChB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @oyinlola141/lattice-lifecycle/internal/topological-sort
3
+ *
4
+ * Topological sort for dependency-aware ordering with priority support.
5
+ */
6
+ import type { DependencyGraph } from "./dependencyGraph.core.js";
7
+ /** A sorted stage — components that can run in parallel. */
8
+ export type TopologicalStage = readonly string[];
9
+ /**
10
+ * Performs topological sort on a dependency graph,
11
+ * grouping independent components into parallel stages.
12
+ * Components within the same stage are ordered by priority (higher first).
13
+ */
14
+ export declare function topologicalSort(graph: DependencyGraph, priorities?: ReadonlyMap<string, number>): readonly TopologicalStage[];
15
+ /**
16
+ * Performs reverse topological sort for shutdown ordering.
17
+ */
18
+ export declare function reverseTopologicalSort(graph: DependencyGraph, priorities?: ReadonlyMap<string, number>): readonly TopologicalStage[];
19
+ //# sourceMappingURL=topologicalSort.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topologicalSort.core.d.ts","sourceRoot":"","sources":["../../src/lifecycleInternal/topologicalSort.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAGjE,4DAA4D;AAC5D,MAAM,MAAM,gBAAgB,GAAG,SAAS,MAAM,EAAE,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,eAAe,EACtB,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACvC,SAAS,gBAAgB,EAAE,CAwC7B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,eAAe,EACtB,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACvC,SAAS,gBAAgB,EAAE,CAK7B"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * @latticejs/lifecycle/internal/topological-sort
3
+ *
4
+ * Topological sort for dependency-aware ordering with priority support.
5
+ */
6
+ import { LifecycleDependencyError } from "@latticejs/errors";
7
+ /**
8
+ * Performs topological sort on a dependency graph,
9
+ * grouping independent components into parallel stages.
10
+ * Components within the same stage are ordered by priority (higher first).
11
+ */
12
+ export function topologicalSort(graph, priorities) {
13
+ const nodes = graph.getNodes();
14
+ const inDegree = new Map();
15
+ for (const node of nodes) {
16
+ const deps = graph.getDependencies(node);
17
+ inDegree.set(node, deps.length);
18
+ }
19
+ const stages = [];
20
+ const remaining = new Set(nodes);
21
+ while (remaining.size > 0) {
22
+ const ready = [...remaining].filter((node) => inDegree.get(node) === 0);
23
+ if (ready.length === 0 && remaining.size > 0) {
24
+ throw new LifecycleDependencyError([...remaining]);
25
+ }
26
+ ready.sort((a, b) => {
27
+ const pa = priorities?.get(a) ?? 0;
28
+ const pb = priorities?.get(b) ?? 0;
29
+ return pb - pa;
30
+ });
31
+ stages.push(Object.freeze(ready));
32
+ for (const node of ready) {
33
+ remaining.delete(node);
34
+ const dependents = graph.getDependents(node);
35
+ for (const dep of dependents) {
36
+ const current = inDegree.get(dep) ?? 0;
37
+ inDegree.set(dep, current - 1);
38
+ }
39
+ }
40
+ }
41
+ return stages;
42
+ }
43
+ /**
44
+ * Performs reverse topological sort for shutdown ordering.
45
+ */
46
+ export function reverseTopologicalSort(graph, priorities) {
47
+ const stages = topologicalSort(graph, priorities);
48
+ return Object.freeze([...stages].reverse().map((stage) => Object.freeze([...stage])));
49
+ }
50
+ //# sourceMappingURL=topologicalSort.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topologicalSort.core.js","sourceRoot":"","sources":["../../src/lifecycleInternal/topologicalSort.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAK7D;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAsB,EACtB,UAAwC;IAExC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACzC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAEjC,OAAO,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,MAAM,CACjC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CACnC,CAAC;QAEF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,wBAAwB,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,EAAE,GAAG,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,EAAE,GAAG,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACnC,OAAO,EAAE,GAAG,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC7C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACvC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAsB,EACtB,UAAwC;IAExC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAChE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @oyinlola141/lattice-lifecycle/manager
3
+ *
4
+ * Lifecycle manager — the main orchestration entry point.
5
+ */
6
+ export { LifecycleManager, createLifecycleManager } from "./lifecycleManager.core.js";
7
+ export type { LifecycleManagerOptions } from "./lifecycleManager.core.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycleManager/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACtF,YAAY,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @latticejs/lifecycle/manager
3
+ *
4
+ * Lifecycle manager — the main orchestration entry point.
5
+ */
6
+ export { LifecycleManager, createLifecycleManager } from "./lifecycleManager.core.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lifecycleManager/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @oyinlola141/lattice-lifecycle/manager/context
3
+ *
4
+ * Internal context shared between startup and shutdown orchestration modules,
5
+ * plus helper functions for component state transitions and event emission.
6
+ */
7
+ import { LifecycleState } from "@oyinlola141/lattice-constants";
8
+ import type { LifecycleStateMachine } from "../lifecycleState/lifecycleState.machine.js";
9
+ import type { LifecycleRegistry } from "../lifecycleRegistry/lifecycleRegistry.core.js";
10
+ import type { LifecycleExecutor } from "../lifecycleExecutor/lifecycleExecutor.core.js";
11
+ import type { LifecycleEventEmitter } from "../lifecycleEvents/lifecycleEvents.core.js";
12
+ import type { ExecutionResult } from "../lifecycleExecutor/lifecycleExecutor.core.js";
13
+ /** Internal context passed to startup/shutdown orchestration functions. */
14
+ export interface LifecycleManagerContext {
15
+ readonly registry: LifecycleRegistry;
16
+ readonly state: LifecycleStateMachine;
17
+ readonly executor: LifecycleExecutor;
18
+ readonly events: LifecycleEventEmitter;
19
+ readonly concurrency: number;
20
+ readonly shutdownTimeout: number;
21
+ readonly componentStates: Map<string, LifecycleStateMachine>;
22
+ readonly results: Map<string, ExecutionResult[]>;
23
+ startTime: number;
24
+ }
25
+ /**
26
+ * Safely transitions a component state machine to the target state.
27
+ * No-op if the transition is not valid from the current state.
28
+ */
29
+ export declare function transitionComponent(ctx: LifecycleManagerContext, id: string, targetState: LifecycleState): void;
30
+ /**
31
+ * Transitions multiple component state machines to the same target state.
32
+ */
33
+ export declare function transitionComponentBatch(ctx: LifecycleManagerContext, ids: readonly string[], targetState: LifecycleState): void;
34
+ /**
35
+ * Emits a component failure event with error and duration details.
36
+ */
37
+ export declare function emitComponentFailed(ctx: LifecycleManagerContext, result: {
38
+ id: string;
39
+ error?: unknown;
40
+ duration: number;
41
+ }): void;
42
+ //# sourceMappingURL=lifecycleManager.context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleManager.context.d.ts","sourceRoot":"","sources":["../../src/lifecycleManager/lifecycleManager.context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACzF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACxF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AAEtF,2EAA2E;AAC3E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC7D,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;IACjD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,uBAAuB,EAC5B,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,cAAc,GAC1B,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,uBAAuB,EAC5B,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,WAAW,EAAE,cAAc,GAC1B,IAAI,CAIN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,uBAAuB,EAC5B,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACxD,IAAI,CAIN"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @latticejs/lifecycle/manager/context
3
+ *
4
+ * Internal context shared between startup and shutdown orchestration modules,
5
+ * plus helper functions for component state transitions and event emission.
6
+ */
7
+ import { LifecycleState } from "@latticejs/constants";
8
+ /**
9
+ * Safely transitions a component state machine to the target state.
10
+ * No-op if the transition is not valid from the current state.
11
+ */
12
+ export function transitionComponent(ctx, id, targetState) {
13
+ const sm = ctx.componentStates.get(id);
14
+ if (sm && sm.canTransition(targetState)) {
15
+ sm.transition(targetState);
16
+ }
17
+ }
18
+ /**
19
+ * Transitions multiple component state machines to the same target state.
20
+ */
21
+ export function transitionComponentBatch(ctx, ids, targetState) {
22
+ for (const id of ids) {
23
+ transitionComponent(ctx, id, targetState);
24
+ }
25
+ }
26
+ /**
27
+ * Emits a component failure event with error and duration details.
28
+ */
29
+ export function emitComponentFailed(ctx, result) {
30
+ ctx.events.emit("component:failed", {
31
+ component: { componentId: result.id, error: result.error, duration: result.duration },
32
+ });
33
+ }
34
+ //# sourceMappingURL=lifecycleManager.context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleManager.context.js","sourceRoot":"","sources":["../../src/lifecycleManager/lifecycleManager.context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAoBtD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAA4B,EAC5B,EAAU,EACV,WAA2B;IAE3B,MAAM,EAAE,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvC,IAAI,EAAE,IAAI,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QACxC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,GAA4B,EAC5B,GAAsB,EACtB,WAA2B;IAE3B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,mBAAmB,CAAC,GAAG,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAA4B,EAC5B,MAAyD;IAEzD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;QAClC,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;KACtF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @oyinlola141/lattice-lifecycle/manager
3
+ *
4
+ * Lifecycle manager — the heart of the lifecycle system.
5
+ * Orchestrates component registration, startup, shutdown, rollback, and signals.
6
+ */
7
+ import { LifecycleState } from "@oyinlola141/lattice-constants";
8
+ import type { LifecycleComponent, LifecycleRegistrationOptions } from "../lifecycleComponent/lifecycleComponent.type.js";
9
+ import { LifecycleRegistry } from "../lifecycleRegistry/lifecycleRegistry.core.js";
10
+ import type { ExecutionResult } from "../lifecycleExecutor/lifecycleExecutor.core.js";
11
+ import { LifecycleEventEmitter } from "../lifecycleEvents/lifecycleEvents.core.js";
12
+ /** Options for creating a lifecycle manager. */
13
+ export interface LifecycleManagerOptions {
14
+ /** Maximum concurrent component operations. */
15
+ readonly concurrency?: number;
16
+ /** Global shutdown timeout in ms. */
17
+ readonly shutdownTimeout?: number;
18
+ /** Whether to automatically install signal handlers. */
19
+ readonly handleSignals?: boolean;
20
+ /** Signals to listen for. */
21
+ readonly signals?: readonly NodeJS.Signals[];
22
+ }
23
+ /**
24
+ * Orchestrates application and component lifecycle.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * const lifecycle = createLifecycleManager();
29
+ * lifecycle.register(database, { id: "db" });
30
+ * lifecycle.register(queue, { id: "queue", dependsOn: ["db"] });
31
+ * await lifecycle.start();
32
+ * // ... later
33
+ * await lifecycle.shutdown();
34
+ * ```
35
+ */
36
+ export declare class LifecycleManager {
37
+ private readonly _ctx;
38
+ private _startPromise?;
39
+ private _shutdownPromise?;
40
+ private _removeSignalHandlers?;
41
+ constructor(options?: LifecycleManagerOptions);
42
+ /** Registers a component with the lifecycle manager. */
43
+ register(component: LifecycleComponent, options?: LifecycleRegistrationOptions): void;
44
+ /**
45
+ * Starts the application lifecycle.
46
+ * Idempotent — returns the same promise if called multiple times.
47
+ */
48
+ start(): Promise<void>;
49
+ /**
50
+ * Shuts down the application lifecycle.
51
+ * Idempotent — returns the same promise if called multiple times.
52
+ */
53
+ shutdown(): Promise<void>;
54
+ /** Returns the current application state. */
55
+ get state(): LifecycleState;
56
+ /** Returns the event emitter for lifecycle events. */
57
+ get events(): LifecycleEventEmitter;
58
+ /** Returns the registry. */
59
+ get registry(): LifecycleRegistry;
60
+ /** Returns component status information. */
61
+ getStatus(): ReadonlyMap<string, {
62
+ state: LifecycleState;
63
+ results: readonly ExecutionResult[];
64
+ }>;
65
+ /** Disposes the lifecycle manager and cleans up resources. */
66
+ dispose(): void;
67
+ }
68
+ /** Creates a new lifecycle manager. */
69
+ export declare function createLifecycleManager(options?: LifecycleManagerOptions): LifecycleManager;
70
+ //# sourceMappingURL=lifecycleManager.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleManager.core.d.ts","sourceRoot":"","sources":["../../src/lifecycleManager/lifecycleManager.core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAqE,MAAM,sBAAsB,CAAC;AACzH,OAAO,KAAK,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,kDAAkD,CAAC;AACzH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAGnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAMnF,gDAAgD;AAChD,MAAM,WAAW,uBAAuB;IACtC,+CAA+C;IAC/C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,wDAAwD;IACxD,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,6BAA6B;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,CAAC,OAAO,EAAE,CAAC;CAC9C;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;IAC/C,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,gBAAgB,CAAC,CAAgB;IACzC,OAAO,CAAC,qBAAqB,CAAC,CAAa;IAE3C,YAAY,OAAO,GAAE,uBAA4B,EAqBhD;IAED,wDAAwD;IACjD,QAAQ,CAAC,SAAS,EAAE,kBAAkB,EAAE,OAAO,GAAE,4BAAiC,GAAG,IAAI,CAU/F;IAED;;;OAGG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlC;IAED;;;OAGG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAMrC;IAED,6CAA6C;IAC7C,IAAW,KAAK,IAAI,cAAc,CAEjC;IAED,sDAAsD;IACtD,IAAW,MAAM,IAAI,qBAAqB,CAEzC;IAED,4BAA4B;IAC5B,IAAW,QAAQ,IAAI,iBAAiB,CAEvC;IAED,4CAA4C;IACrC,SAAS,IAAI,WAAW,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAA;KAAE,CAAC,CAWtG;IAED,8DAA8D;IACvD,OAAO,IAAI,IAAI,CAGrB;CACF;AAED,uCAAuC;AACvC,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,gBAAgB,CAE1F"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * @latticejs/lifecycle/manager
3
+ *
4
+ * Lifecycle manager — the heart of the lifecycle system.
5
+ * Orchestrates component registration, startup, shutdown, rollback, and signals.
6
+ */
7
+ import { LifecycleState, LIFECYCLE_DEFAULT_CONCURRENCY, LIFECYCLE_DEFAULT_SHUTDOWN_TIMEOUT } from "@latticejs/constants";
8
+ import { LifecycleRegistry } from "../lifecycleRegistry/lifecycleRegistry.core.js";
9
+ import { LifecycleStateMachine } from "../lifecycleState/lifecycleState.machine.js";
10
+ import { LifecycleExecutor } from "../lifecycleExecutor/lifecycleExecutor.core.js";
11
+ import { LifecycleEventEmitter } from "../lifecycleEvents/lifecycleEvents.core.js";
12
+ import { installSignalHandlers } from "../lifecycleSignal/lifecycleSignal.handler.js";
13
+ import { performStartup } from "./lifecycleManager.startup.js";
14
+ import { performShutdown } from "./lifecycleManager.shutdown.js";
15
+ /**
16
+ * Orchestrates application and component lifecycle.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * const lifecycle = createLifecycleManager();
21
+ * lifecycle.register(database, { id: "db" });
22
+ * lifecycle.register(queue, { id: "queue", dependsOn: ["db"] });
23
+ * await lifecycle.start();
24
+ * // ... later
25
+ * await lifecycle.shutdown();
26
+ * ```
27
+ */
28
+ export class LifecycleManager {
29
+ _ctx;
30
+ _startPromise;
31
+ _shutdownPromise;
32
+ _removeSignalHandlers;
33
+ constructor(options = {}) {
34
+ this._ctx = {
35
+ registry: new LifecycleRegistry(),
36
+ state: new LifecycleStateMachine("application"),
37
+ executor: new LifecycleExecutor(),
38
+ events: new LifecycleEventEmitter(),
39
+ concurrency: options.concurrency ?? LIFECYCLE_DEFAULT_CONCURRENCY,
40
+ shutdownTimeout: options.shutdownTimeout ?? LIFECYCLE_DEFAULT_SHUTDOWN_TIMEOUT,
41
+ componentStates: new Map(),
42
+ results: new Map(),
43
+ startTime: 0,
44
+ };
45
+ if (options.handleSignals !== false) {
46
+ this._removeSignalHandlers = installSignalHandlers({
47
+ signals: options.signals,
48
+ handler: () => {
49
+ void this.shutdown();
50
+ },
51
+ });
52
+ }
53
+ }
54
+ /** Registers a component with the lifecycle manager. */
55
+ register(component, options = {}) {
56
+ this._ctx.registry.register(component, options);
57
+ const id = options.id ?? component.name;
58
+ this._ctx.componentStates.set(id, new LifecycleStateMachine(id));
59
+ this._ctx.results.set(id, []);
60
+ this._ctx.events.emit("component:registered", {
61
+ component: { componentId: id },
62
+ });
63
+ }
64
+ /**
65
+ * Starts the application lifecycle.
66
+ * Idempotent — returns the same promise if called multiple times.
67
+ */
68
+ async start() {
69
+ if (this._startPromise) {
70
+ return this._startPromise;
71
+ }
72
+ this._startPromise = performStartup(this._ctx);
73
+ return this._startPromise;
74
+ }
75
+ /**
76
+ * Shuts down the application lifecycle.
77
+ * Idempotent — returns the same promise if called multiple times.
78
+ */
79
+ async shutdown() {
80
+ if (this._shutdownPromise) {
81
+ return this._shutdownPromise;
82
+ }
83
+ this._shutdownPromise = performShutdown(this._ctx);
84
+ return this._shutdownPromise;
85
+ }
86
+ /** Returns the current application state. */
87
+ get state() {
88
+ return this._ctx.state.state;
89
+ }
90
+ /** Returns the event emitter for lifecycle events. */
91
+ get events() {
92
+ return this._ctx.events;
93
+ }
94
+ /** Returns the registry. */
95
+ get registry() {
96
+ return this._ctx.registry;
97
+ }
98
+ /** Returns component status information. */
99
+ getStatus() {
100
+ const status = new Map();
101
+ for (const [id, sm] of this._ctx.componentStates) {
102
+ status.set(id, {
103
+ state: sm.state,
104
+ results: this._ctx.results.get(id) ?? [],
105
+ });
106
+ }
107
+ return status;
108
+ }
109
+ /** Disposes the lifecycle manager and cleans up resources. */
110
+ dispose() {
111
+ this._removeSignalHandlers?.();
112
+ this._ctx.events.clear();
113
+ }
114
+ }
115
+ /** Creates a new lifecycle manager. */
116
+ export function createLifecycleManager(options) {
117
+ return new LifecycleManager(options);
118
+ }
119
+ //# sourceMappingURL=lifecycleManager.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleManager.core.js","sourceRoot":"","sources":["../../src/lifecycleManager/lifecycleManager.core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @oyinlola141/lattice-lifecycle/manager/shutdown
3
+ *
4
+ * Shutdown orchestration — stops and disposes components in reverse order.
5
+ */
6
+ import type { LifecycleManagerContext } from "./lifecycleManager.context.js";
7
+ /**
8
+ * Performs the full shutdown sequence: stop → dispose.
9
+ * Idempotent — safe to call multiple times.
10
+ */
11
+ export declare function performShutdown(ctx: LifecycleManagerContext): Promise<void>;
12
+ //# sourceMappingURL=lifecycleManager.shutdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleManager.shutdown.d.ts","sourceRoot":"","sources":["../../src/lifecycleManager/lifecycleManager.shutdown.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAM7E;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBjF"}