@zudojs/lifecycle 0.0.1

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 (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -0
  3. package/dist/index.d.ts +42 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +34 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lifecycleComponent/index.d.ts +7 -0
  8. package/dist/lifecycleComponent/index.d.ts.map +1 -0
  9. package/dist/lifecycleComponent/index.js +7 -0
  10. package/dist/lifecycleComponent/index.js.map +1 -0
  11. package/dist/lifecycleComponent/lifecycleComponent.type.d.ts +68 -0
  12. package/dist/lifecycleComponent/lifecycleComponent.type.d.ts.map +1 -0
  13. package/dist/lifecycleComponent/lifecycleComponent.type.js +7 -0
  14. package/dist/lifecycleComponent/lifecycleComponent.type.js.map +1 -0
  15. package/dist/lifecycleContext/index.d.ts +8 -0
  16. package/dist/lifecycleContext/index.d.ts.map +1 -0
  17. package/dist/lifecycleContext/index.js +7 -0
  18. package/dist/lifecycleContext/index.js.map +1 -0
  19. package/dist/lifecycleContext/lifecycleContext.type.d.ts +23 -0
  20. package/dist/lifecycleContext/lifecycleContext.type.d.ts.map +1 -0
  21. package/dist/lifecycleContext/lifecycleContext.type.js +15 -0
  22. package/dist/lifecycleContext/lifecycleContext.type.js.map +1 -0
  23. package/dist/lifecycleEvents/index.d.ts +8 -0
  24. package/dist/lifecycleEvents/index.d.ts.map +1 -0
  25. package/dist/lifecycleEvents/index.js +7 -0
  26. package/dist/lifecycleEvents/index.js.map +1 -0
  27. package/dist/lifecycleEvents/lifecycleEvents.core.d.ts +52 -0
  28. package/dist/lifecycleEvents/lifecycleEvents.core.d.ts.map +1 -0
  29. package/dist/lifecycleEvents/lifecycleEvents.core.js +46 -0
  30. package/dist/lifecycleEvents/lifecycleEvents.core.js.map +1 -0
  31. package/dist/lifecycleExecutor/index.d.ts +8 -0
  32. package/dist/lifecycleExecutor/index.d.ts.map +1 -0
  33. package/dist/lifecycleExecutor/index.js +7 -0
  34. package/dist/lifecycleExecutor/index.js.map +1 -0
  35. package/dist/lifecycleExecutor/lifecycleExecutor.core.d.ts +35 -0
  36. package/dist/lifecycleExecutor/lifecycleExecutor.core.d.ts.map +1 -0
  37. package/dist/lifecycleExecutor/lifecycleExecutor.core.js +88 -0
  38. package/dist/lifecycleExecutor/lifecycleExecutor.core.js.map +1 -0
  39. package/dist/lifecycleInternal/asyncUtils.core.d.ts +19 -0
  40. package/dist/lifecycleInternal/asyncUtils.core.d.ts.map +1 -0
  41. package/dist/lifecycleInternal/asyncUtils.core.js +69 -0
  42. package/dist/lifecycleInternal/asyncUtils.core.js.map +1 -0
  43. package/dist/lifecycleInternal/dependencyGraph.core.d.ts +29 -0
  44. package/dist/lifecycleInternal/dependencyGraph.core.d.ts.map +1 -0
  45. package/dist/lifecycleInternal/dependencyGraph.core.js +74 -0
  46. package/dist/lifecycleInternal/dependencyGraph.core.js.map +1 -0
  47. package/dist/lifecycleInternal/index.d.ts +10 -0
  48. package/dist/lifecycleInternal/index.d.ts.map +1 -0
  49. package/dist/lifecycleInternal/index.js +9 -0
  50. package/dist/lifecycleInternal/index.js.map +1 -0
  51. package/dist/lifecycleInternal/topologicalSort.core.d.ts +19 -0
  52. package/dist/lifecycleInternal/topologicalSort.core.d.ts.map +1 -0
  53. package/dist/lifecycleInternal/topologicalSort.core.js +50 -0
  54. package/dist/lifecycleInternal/topologicalSort.core.js.map +1 -0
  55. package/dist/lifecycleManager/index.d.ts +8 -0
  56. package/dist/lifecycleManager/index.d.ts.map +1 -0
  57. package/dist/lifecycleManager/index.js +7 -0
  58. package/dist/lifecycleManager/index.js.map +1 -0
  59. package/dist/lifecycleManager/lifecycleManager.context.d.ts +42 -0
  60. package/dist/lifecycleManager/lifecycleManager.context.d.ts.map +1 -0
  61. package/dist/lifecycleManager/lifecycleManager.context.js +38 -0
  62. package/dist/lifecycleManager/lifecycleManager.context.js.map +1 -0
  63. package/dist/lifecycleManager/lifecycleManager.core.d.ts +70 -0
  64. package/dist/lifecycleManager/lifecycleManager.core.d.ts.map +1 -0
  65. package/dist/lifecycleManager/lifecycleManager.core.js +119 -0
  66. package/dist/lifecycleManager/lifecycleManager.core.js.map +1 -0
  67. package/dist/lifecycleManager/lifecycleManager.shutdown.d.ts +12 -0
  68. package/dist/lifecycleManager/lifecycleManager.shutdown.d.ts.map +1 -0
  69. package/dist/lifecycleManager/lifecycleManager.shutdown.js +60 -0
  70. package/dist/lifecycleManager/lifecycleManager.shutdown.js.map +1 -0
  71. package/dist/lifecycleManager/lifecycleManager.startup.d.ts +11 -0
  72. package/dist/lifecycleManager/lifecycleManager.startup.d.ts.map +1 -0
  73. package/dist/lifecycleManager/lifecycleManager.startup.js +100 -0
  74. package/dist/lifecycleManager/lifecycleManager.startup.js.map +1 -0
  75. package/dist/lifecyclePhase/index.d.ts +7 -0
  76. package/dist/lifecyclePhase/index.d.ts.map +1 -0
  77. package/dist/lifecyclePhase/index.js +7 -0
  78. package/dist/lifecyclePhase/index.js.map +1 -0
  79. package/dist/lifecyclePhase/lifecyclePhase.core.d.ts +19 -0
  80. package/dist/lifecyclePhase/lifecyclePhase.core.d.ts.map +1 -0
  81. package/dist/lifecyclePhase/lifecyclePhase.core.js +52 -0
  82. package/dist/lifecyclePhase/lifecyclePhase.core.js.map +1 -0
  83. package/dist/lifecyclePhase/lifecyclePhase.type.d.ts +16 -0
  84. package/dist/lifecyclePhase/lifecyclePhase.type.d.ts.map +1 -0
  85. package/dist/lifecyclePhase/lifecyclePhase.type.js +17 -0
  86. package/dist/lifecyclePhase/lifecyclePhase.type.js.map +1 -0
  87. package/dist/lifecyclePlan/index.d.ts +8 -0
  88. package/dist/lifecyclePlan/index.d.ts.map +1 -0
  89. package/dist/lifecyclePlan/index.js +7 -0
  90. package/dist/lifecyclePlan/index.js.map +1 -0
  91. package/dist/lifecyclePlan/lifecyclePlan.core.d.ts +26 -0
  92. package/dist/lifecyclePlan/lifecyclePlan.core.d.ts.map +1 -0
  93. package/dist/lifecyclePlan/lifecyclePlan.core.js +40 -0
  94. package/dist/lifecyclePlan/lifecyclePlan.core.js.map +1 -0
  95. package/dist/lifecycleRegistry/index.d.ts +7 -0
  96. package/dist/lifecycleRegistry/index.d.ts.map +1 -0
  97. package/dist/lifecycleRegistry/index.js +7 -0
  98. package/dist/lifecycleRegistry/index.js.map +1 -0
  99. package/dist/lifecycleRegistry/lifecycleRegistry.core.d.ts +35 -0
  100. package/dist/lifecycleRegistry/lifecycleRegistry.core.d.ts.map +1 -0
  101. package/dist/lifecycleRegistry/lifecycleRegistry.core.js +87 -0
  102. package/dist/lifecycleRegistry/lifecycleRegistry.core.js.map +1 -0
  103. package/dist/lifecycleSignal/index.d.ts +8 -0
  104. package/dist/lifecycleSignal/index.d.ts.map +1 -0
  105. package/dist/lifecycleSignal/index.js +7 -0
  106. package/dist/lifecycleSignal/index.js.map +1 -0
  107. package/dist/lifecycleSignal/lifecycleSignal.handler.d.ts +20 -0
  108. package/dist/lifecycleSignal/lifecycleSignal.handler.d.ts.map +1 -0
  109. package/dist/lifecycleSignal/lifecycleSignal.handler.js +29 -0
  110. package/dist/lifecycleSignal/lifecycleSignal.handler.js.map +1 -0
  111. package/dist/lifecycleState/index.d.ts +7 -0
  112. package/dist/lifecycleState/index.d.ts.map +1 -0
  113. package/dist/lifecycleState/index.js +7 -0
  114. package/dist/lifecycleState/index.js.map +1 -0
  115. package/dist/lifecycleState/lifecycleState.machine.d.ts +36 -0
  116. package/dist/lifecycleState/lifecycleState.machine.d.ts.map +1 -0
  117. package/dist/lifecycleState/lifecycleState.machine.js +57 -0
  118. package/dist/lifecycleState/lifecycleState.machine.js.map +1 -0
  119. package/package.json +53 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Zudojs Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # @zudojs/lifecycle
2
+
3
+ Application and component lifecycle orchestration with state machine, dependency ordering, graceful shutdown, rollback, and signals.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @zudojs/lifecycle
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```typescript
14
+ import { createLifecycleManager } from "@zudojs/lifecycle";
15
+
16
+ const manager = createLifecycleManager({
17
+ components: [database, server, worker],
18
+ });
19
+
20
+ await manager.start();
21
+ await manager.stop();
22
+ ```
23
+
24
+ ## Features
25
+
26
+ - State machine for lifecycle phases
27
+ - Dependency ordering between components
28
+ - Graceful shutdown with timeouts
29
+ - Rollback on startup failure
30
+ - Signal handling
31
+ - Lifecycle hooks and events
32
+
33
+ ## Use Cases
34
+
35
+ - Coordinating service startup and shutdown
36
+ - Managing component lifecycles
37
+ - Handling process signals
38
+ - Zero-downtime deployments
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @zudojs/lifecycle
3
+ *
4
+ * Application and component lifecycle orchestration for the Zudojs framework.
5
+ *
6
+ * Manages state machines, dependency ordering, graceful shutdown, rollback,
7
+ * timeouts, retries, and process signals.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { createLifecycleManager } from "@zudojs/lifecycle";
12
+ *
13
+ * const lifecycle = createLifecycleManager();
14
+ *
15
+ * lifecycle.register(database, { id: "database", critical: true });
16
+ * lifecycle.register(queue, { id: "queue", dependsOn: ["database"] });
17
+ * lifecycle.register(server, { id: "server", dependsOn: ["queue"] });
18
+ *
19
+ * await lifecycle.start();
20
+ * // ... application running ...
21
+ * await lifecycle.shutdown();
22
+ * ```
23
+ */
24
+ export { LifecycleStateMachine } from "./lifecycleState/index.js";
25
+ export { STARTUP_PHASES, SHUTDOWN_PHASES, getPhaseHookName, getComponentMethod, } from "./lifecyclePhase/index.js";
26
+ export type { LifecycleComponent, LifecycleRegistrationOptions, LifecycleRetryOptions, LifecycleRegistration, } from "./lifecycleComponent/index.js";
27
+ export type { LifecycleContext } from "./lifecycleContext/index.js";
28
+ export { createLifecycleContext } from "./lifecycleContext/index.js";
29
+ export { LifecycleRegistry } from "./lifecycleRegistry/index.js";
30
+ export { DependencyGraph, topologicalSort, reverseTopologicalSort, withTimeout, withAbort, withConcurrency, } from "./lifecycleInternal/index.js";
31
+ export type { TopologicalStage } from "./lifecycleInternal/index.js";
32
+ export { buildExecutionPlan } from "./lifecyclePlan/index.js";
33
+ export type { ExecutionStage, ExecutionPlan } from "./lifecyclePlan/index.js";
34
+ export { LifecycleExecutor } from "./lifecycleExecutor/index.js";
35
+ export type { ExecutionResult } from "./lifecycleExecutor/index.js";
36
+ export { LifecycleManager, createLifecycleManager, } from "./lifecycleManager/index.js";
37
+ export type { LifecycleManagerOptions } from "./lifecycleManager/index.js";
38
+ export { LifecycleEventEmitter } from "./lifecycleEvents/index.js";
39
+ export type { LifecycleEventType, LifecycleComponentEvent, LifecycleApplicationEvent, LifecycleEvent, LifecycleEventListener, } from "./lifecycleEvents/index.js";
40
+ export { installSignalHandlers, DEFAULT_SHUTDOWN_SIGNALS, } from "./lifecycleSignal/index.js";
41
+ export type { SignalHandlerOptions } from "./lifecycleSignal/index.js";
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EACL,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,kBAAkB,EAClB,4BAA4B,EAC5B,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EACL,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,SAAS,EACT,eAAe,GAChB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,YAAY,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,YAAY,EACV,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,cAAc,EACd,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @zudojs/lifecycle
3
+ *
4
+ * Application and component lifecycle orchestration for the Zudojs framework.
5
+ *
6
+ * Manages state machines, dependency ordering, graceful shutdown, rollback,
7
+ * timeouts, retries, and process signals.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { createLifecycleManager } from "@zudojs/lifecycle";
12
+ *
13
+ * const lifecycle = createLifecycleManager();
14
+ *
15
+ * lifecycle.register(database, { id: "database", critical: true });
16
+ * lifecycle.register(queue, { id: "queue", dependsOn: ["database"] });
17
+ * lifecycle.register(server, { id: "server", dependsOn: ["queue"] });
18
+ *
19
+ * await lifecycle.start();
20
+ * // ... application running ...
21
+ * await lifecycle.shutdown();
22
+ * ```
23
+ */
24
+ export { LifecycleStateMachine } from "./lifecycleState/index.js";
25
+ export { STARTUP_PHASES, SHUTDOWN_PHASES, getPhaseHookName, getComponentMethod, } from "./lifecyclePhase/index.js";
26
+ export { createLifecycleContext } from "./lifecycleContext/index.js";
27
+ export { LifecycleRegistry } from "./lifecycleRegistry/index.js";
28
+ export { DependencyGraph, topologicalSort, reverseTopologicalSort, withTimeout, withAbort, withConcurrency, } from "./lifecycleInternal/index.js";
29
+ export { buildExecutionPlan } from "./lifecyclePlan/index.js";
30
+ export { LifecycleExecutor } from "./lifecycleExecutor/index.js";
31
+ export { LifecycleManager, createLifecycleManager, } from "./lifecycleManager/index.js";
32
+ export { LifecycleEventEmitter } from "./lifecycleEvents/index.js";
33
+ export { installSignalHandlers, DEFAULT_SHUTDOWN_SIGNALS, } from "./lifecycleSignal/index.js";
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EACL,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAQnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EACL,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,SAAS,EACT,eAAe,GAChB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAQnE,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @zudojs/lifecycle/component
3
+ *
4
+ * Lifecycle component interface and registration types.
5
+ */
6
+ export type { LifecycleComponent, LifecycleRegistrationOptions, LifecycleRetryOptions, LifecycleRegistration, } from "./lifecycleComponent.type.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycleComponent/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,kBAAkB,EAClB,4BAA4B,EAC5B,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @zudojs/lifecycle/component
3
+ *
4
+ * Lifecycle component interface and registration types.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lifecycleComponent/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @zudojs/lifecycle/component
3
+ *
4
+ * Lifecycle component interface — the contract for managed resources.
5
+ */
6
+ import type { LifecycleContext } from "../lifecycleContext/lifecycleContext.type.js";
7
+ /**
8
+ * Interface for components that participate in the lifecycle.
9
+ * All hook methods are optional — components only implement what they need.
10
+ */
11
+ export interface LifecycleComponent {
12
+ /** Unique name identifying this component. */
13
+ readonly name: string;
14
+ /** Initialize the component (prepare configuration, create internal objects). */
15
+ initialize?(context: LifecycleContext): Promise<void>;
16
+ /** Start the component (connect to databases, start servers). */
17
+ start?(context: LifecycleContext): Promise<void>;
18
+ /** Confirm the component is ready to serve (health check, warm-up). */
19
+ ready?(context: LifecycleContext): Promise<void>;
20
+ /** Gracefully stop the component (stop accepting work, drain queues). */
21
+ stop?(context: LifecycleContext): Promise<void>;
22
+ /** Final resource cleanup (close connections, clear timers). */
23
+ dispose?(context: LifecycleContext): Promise<void>;
24
+ }
25
+ /** Options for registering a lifecycle component. */
26
+ export interface LifecycleRegistrationOptions {
27
+ /** Unique ID for this component. Defaults to component.name. */
28
+ readonly id?: string;
29
+ /** IDs of components that must start before this one. */
30
+ readonly dependsOn?: readonly string[];
31
+ /** Priority for ordering within the same dependency level. Higher = earlier. */
32
+ readonly priority?: number;
33
+ /** If true, application startup fails when this component fails. Defaults to true. */
34
+ readonly critical?: boolean;
35
+ /** Timeout in ms for individual component operations. */
36
+ readonly timeout?: number;
37
+ /** Retry configuration for failed operations. */
38
+ readonly retry?: LifecycleRetryOptions;
39
+ }
40
+ /** Retry options for component operations. */
41
+ export interface LifecycleRetryOptions {
42
+ /** Maximum number of retry attempts. */
43
+ readonly attempts?: number;
44
+ /** Delay between retries in ms. */
45
+ readonly delay?: number;
46
+ /** Maximum delay between retries in ms. */
47
+ readonly maxDelay?: number;
48
+ /** Backoff strategy. */
49
+ readonly backoff?: "fixed" | "exponential";
50
+ }
51
+ /** A component with its registration metadata. */
52
+ export interface LifecycleRegistration {
53
+ /** Unique ID. */
54
+ readonly id: string;
55
+ /** The component instance. */
56
+ readonly component: LifecycleComponent;
57
+ /** IDs of dependencies. */
58
+ readonly dependsOn: readonly string[];
59
+ /** Priority within same dependency level. */
60
+ readonly priority: number;
61
+ /** Whether failure should abort application startup. */
62
+ readonly critical: boolean;
63
+ /** Timeout in ms for individual operations. */
64
+ readonly timeout: number;
65
+ /** Retry configuration. */
66
+ readonly retry: LifecycleRetryOptions;
67
+ }
68
+ //# sourceMappingURL=lifecycleComponent.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleComponent.type.d.ts","sourceRoot":"","sources":["../../src/lifecycleComponent/lifecycleComponent.type.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAErF;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,iFAAiF;IACjF,UAAU,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtD,iEAAiE;IACjE,KAAK,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjD,uEAAuE;IACvE,KAAK,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjD,yEAAyE;IACzE,IAAI,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD,gEAAgE;IAChE,OAAO,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAED,qDAAqD;AACrD,MAAM,WAAW,4BAA4B;IAC3C,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAErB,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEvC,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B,sFAAsF;IACtF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAE5B,yDAAyD;IACzD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B,iDAAiD;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,qBAAqB,CAAC;CACxC;AAED,8CAA8C;AAC9C,MAAM,WAAW,qBAAqB;IACpC,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B,mCAAmC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAExB,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B,wBAAwB;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;CAC5C;AAED,kDAAkD;AAClD,MAAM,WAAW,qBAAqB;IACpC,iBAAiB;IACjB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,8BAA8B;IAC9B,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IAEvC,2BAA2B;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAEtC,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAE3B,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;CACvC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @zudojs/lifecycle/component
3
+ *
4
+ * Lifecycle component interface — the contract for managed resources.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=lifecycleComponent.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleComponent.type.js","sourceRoot":"","sources":["../../src/lifecycleComponent/lifecycleComponent.type.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @zudojs/lifecycle/context
3
+ *
4
+ * Lifecycle context type and factory.
5
+ */
6
+ export type { LifecycleContext } from "./lifecycleContext.type.js";
7
+ export { createLifecycleContext } from "./lifecycleContext.type.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycleContext/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @zudojs/lifecycle/context
3
+ *
4
+ * Lifecycle context type and factory.
5
+ */
6
+ export { createLifecycleContext } from "./lifecycleContext.type.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lifecycleContext/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @zudojs/lifecycle/context
3
+ *
4
+ * Lifecycle context — passed to component hooks during phase execution.
5
+ */
6
+ import type { LifecyclePhase } from "@zudojs/constants";
7
+ /**
8
+ * Context passed to lifecycle component hooks.
9
+ * Provides cancellation, metadata, and phase information.
10
+ */
11
+ export interface LifecycleContext {
12
+ /** AbortSignal for cancelling long-running operations. */
13
+ readonly signal: AbortSignal;
14
+ /** The current lifecycle phase. */
15
+ readonly phase: LifecyclePhase;
16
+ /** Timestamp when the lifecycle started. */
17
+ readonly startedAt: number;
18
+ /** Arbitrary metadata for the current operation. */
19
+ readonly metadata: ReadonlyMap<string, unknown>;
20
+ }
21
+ /** Creates a lifecycle context. */
22
+ export declare function createLifecycleContext(phase: LifecyclePhase, startedAt: number, signal?: AbortSignal, metadata?: Record<string, unknown>): LifecycleContext;
23
+ //# sourceMappingURL=lifecycleContext.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleContext.type.d.ts","sourceRoot":"","sources":["../../src/lifecycleContext/lifecycleContext.type.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B,mCAAmC;IACnC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAE/B,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjD;AAED,mCAAmC;AACnC,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,gBAAgB,CAOlB"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @zudojs/lifecycle/context
3
+ *
4
+ * Lifecycle context — passed to component hooks during phase execution.
5
+ */
6
+ /** Creates a lifecycle context. */
7
+ export function createLifecycleContext(phase, startedAt, signal, metadata) {
8
+ return {
9
+ signal: signal ?? new AbortController().signal,
10
+ phase,
11
+ startedAt,
12
+ metadata: new Map(Object.entries(metadata ?? {})),
13
+ };
14
+ }
15
+ //# sourceMappingURL=lifecycleContext.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleContext.type.js","sourceRoot":"","sources":["../../src/lifecycleContext/lifecycleContext.type.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsBH,mCAAmC;AACnC,MAAM,UAAU,sBAAsB,CACpC,KAAqB,EACrB,SAAiB,EACjB,MAAoB,EACpB,QAAkC;IAElC,OAAO;QACL,MAAM,EAAE,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC,MAAM;QAC9C,KAAK;QACL,SAAS;QACT,QAAQ,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;KAClD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @zudojs/lifecycle/events
3
+ *
4
+ * Lifecycle event emitter for observability integration.
5
+ */
6
+ export { LifecycleEventEmitter } from "./lifecycleEvents.core.js";
7
+ export type { LifecycleEventType, LifecycleComponentEvent, LifecycleApplicationEvent, LifecycleEvent, LifecycleEventListener, } from "./lifecycleEvents.core.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycleEvents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,YAAY,EACV,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,cAAc,EACd,sBAAsB,GACvB,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @zudojs/lifecycle/events
3
+ *
4
+ * Lifecycle event emitter for observability integration.
5
+ */
6
+ export { LifecycleEventEmitter } from "./lifecycleEvents.core.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lifecycleEvents/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @zudojs/lifecycle/events
3
+ *
4
+ * Lifecycle event emitter — emits typed events for observability integration.
5
+ */
6
+ /** Lifecycle event types. */
7
+ export type LifecycleEventType = "component:registered" | "component:initializing" | "component:initialized" | "component:starting" | "component:started" | "component:ready" | "component:stopping" | "component:stopped" | "component:failed" | "application:initializing" | "application:initialized" | "application:starting" | "application:ready" | "application:stopping" | "application:stopped" | "application:disposed";
8
+ /** Event payload for component events. */
9
+ export interface LifecycleComponentEvent {
10
+ /** Component ID. */
11
+ readonly componentId: string;
12
+ /** Duration in ms (for completion events). */
13
+ readonly duration?: number;
14
+ /** Error if the event represents a failure. */
15
+ readonly error?: unknown;
16
+ }
17
+ /** Event payload for application events. */
18
+ export interface LifecycleApplicationEvent {
19
+ /** Timestamp. */
20
+ readonly timestamp: number;
21
+ /** Duration in ms (for completion events). */
22
+ readonly duration?: number;
23
+ }
24
+ /** A lifecycle event with its type and payload. */
25
+ export interface LifecycleEvent {
26
+ /** The event type. */
27
+ readonly type: LifecycleEventType;
28
+ /** Component payload (for component events). */
29
+ readonly component?: LifecycleComponentEvent;
30
+ /** Duration in ms (for completion events). */
31
+ readonly duration?: number;
32
+ /** Error if the event represents a failure. */
33
+ readonly error?: unknown;
34
+ /** Timestamp. */
35
+ readonly timestamp: number;
36
+ }
37
+ /** Event listener function. */
38
+ export type LifecycleEventListener = (event: LifecycleEvent) => void;
39
+ /**
40
+ * Simple event emitter for lifecycle events.
41
+ * Integrates with observability without depending on the events package.
42
+ */
43
+ export declare class LifecycleEventEmitter {
44
+ private readonly _listeners;
45
+ /** Subscribes to an event type. */
46
+ on(type: LifecycleEventType, listener: LifecycleEventListener): () => void;
47
+ /** Emits an event. */
48
+ emit(type: LifecycleEventType, data: Omit<LifecycleEvent, "type" | "timestamp">): void;
49
+ /** Removes all listeners. */
50
+ clear(): void;
51
+ }
52
+ //# sourceMappingURL=lifecycleEvents.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleEvents.core.d.ts","sourceRoot":"","sources":["../../src/lifecycleEvents/lifecycleEvents.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,6BAA6B;AAC7B,MAAM,MAAM,kBAAkB,GAC1B,sBAAsB,GACtB,wBAAwB,GACxB,uBAAuB,GACvB,oBAAoB,GACpB,mBAAmB,GACnB,iBAAiB,GACjB,oBAAoB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,0BAA0B,GAC1B,yBAAyB,GACzB,sBAAsB,GACtB,mBAAmB,GACnB,sBAAsB,GACtB,qBAAqB,GACrB,sBAAsB,CAAC;AAE3B,0CAA0C;AAC1C,MAAM,WAAW,uBAAuB;IACtC,oBAAoB;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,4CAA4C;AAC5C,MAAM,WAAW,yBAAyB;IACxC,iBAAiB;IACjB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,mDAAmD;AACnD,MAAM,WAAW,cAAc;IAC7B,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,gDAAgD;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,uBAAuB,CAAC;IAC7C,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB;IACjB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,+BAA+B;AAC/B,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;AAErE;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAGvB;IAEJ,mCAAmC;IAC5B,EAAE,CACP,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,sBAAsB,GAC/B,MAAM,IAAI,CASZ;IAED,sBAAsB;IACf,IAAI,CACT,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,CAAC,GAC/C,IAAI,CAiBN;IAED,6BAA6B;IACtB,KAAK,IAAI,IAAI,CAEnB;CACF"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @zudojs/lifecycle/events
3
+ *
4
+ * Lifecycle event emitter — emits typed events for observability integration.
5
+ */
6
+ /**
7
+ * Simple event emitter for lifecycle events.
8
+ * Integrates with observability without depending on the events package.
9
+ */
10
+ export class LifecycleEventEmitter {
11
+ _listeners = new Map();
12
+ /** Subscribes to an event type. */
13
+ on(type, listener) {
14
+ if (!this._listeners.has(type)) {
15
+ this._listeners.set(type, new Set());
16
+ }
17
+ this._listeners.get(type).add(listener);
18
+ return () => {
19
+ this._listeners.get(type)?.delete(listener);
20
+ };
21
+ }
22
+ /** Emits an event. */
23
+ emit(type, data) {
24
+ const event = {
25
+ type,
26
+ timestamp: Date.now(),
27
+ ...data,
28
+ };
29
+ const listeners = this._listeners.get(type);
30
+ if (listeners) {
31
+ for (const listener of listeners) {
32
+ try {
33
+ listener(event);
34
+ }
35
+ catch {
36
+ // Intentional no-op: event listeners must not crash lifecycle operations.
37
+ }
38
+ }
39
+ }
40
+ }
41
+ /** Removes all listeners. */
42
+ clear() {
43
+ this._listeners.clear();
44
+ }
45
+ }
46
+ //# sourceMappingURL=lifecycleEvents.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleEvents.core.js","sourceRoot":"","sources":["../../src/lifecycleEvents/lifecycleEvents.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0DH;;;GAGG;AACH,MAAM,OAAO,qBAAqB;IACf,UAAU,GAAG,IAAI,GAAG,EAGlC,CAAC;IAEJ,mCAAmC;IAC5B,EAAE,CACP,IAAwB,EACxB,QAAgC;QAEhC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEzC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC,CAAC;IACJ,CAAC;IAED,sBAAsB;IACf,IAAI,CACT,IAAwB,EACxB,IAAgD;QAEhD,MAAM,KAAK,GAAmB;YAC5B,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,GAAG,IAAI;SACR,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC;gBAAC,MAAM,CAAC;oBACP,0EAA0E;gBAC5E,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,6BAA6B;IACtB,KAAK;QACV,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @zudojs/lifecycle/executor
3
+ *
4
+ * Lifecycle executor — runs component hooks with timeout, retry, and concurrency.
5
+ */
6
+ export { LifecycleExecutor } from "./lifecycleExecutor.core.js";
7
+ export type { ExecutionResult } from "./lifecycleExecutor.core.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lifecycleExecutor/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,YAAY,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @zudojs/lifecycle/executor
3
+ *
4
+ * Lifecycle executor — runs component hooks with timeout, retry, and concurrency.
5
+ */
6
+ export { LifecycleExecutor } from "./lifecycleExecutor.core.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lifecycleExecutor/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @zudojs/lifecycle/executor
3
+ *
4
+ * Lifecycle executor — runs component hooks with timeout, retry, and error handling.
5
+ */
6
+ import type { LifecyclePhase } from "@zudojs/constants";
7
+ import type { LifecycleRegistration } from "../lifecycleComponent/lifecycleComponent.type.js";
8
+ import type { LifecycleContext } from "../lifecycleContext/lifecycleContext.type.js";
9
+ /** Result of executing a component hook. */
10
+ export interface ExecutionResult {
11
+ /** Component ID. */
12
+ readonly id: string;
13
+ /** The phase that was executed. */
14
+ readonly phase: LifecyclePhase;
15
+ /** Duration in ms. */
16
+ readonly duration: number;
17
+ /** Error if the hook failed. */
18
+ readonly error?: unknown;
19
+ /** Whether the operation succeeded. */
20
+ readonly success: boolean;
21
+ }
22
+ /**
23
+ * Executes lifecycle component hooks with timeout, retry, and concurrency support.
24
+ */
25
+ export declare class LifecycleExecutor {
26
+ /**
27
+ * Executes a single component hook.
28
+ */
29
+ execute(registration: LifecycleRegistration, phase: LifecyclePhase, context: LifecycleContext): Promise<ExecutionResult>;
30
+ /**
31
+ * Executes a stage of components in parallel with concurrency limit.
32
+ */
33
+ executeStage(registrations: readonly LifecycleRegistration[], phase: LifecyclePhase, context: LifecycleContext, concurrency: number): Promise<readonly ExecutionResult[]>;
34
+ }
35
+ //# sourceMappingURL=lifecycleExecutor.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleExecutor.core.d.ts","sourceRoot":"","sources":["../../src/lifecycleExecutor/lifecycleExecutor.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EACV,qBAAqB,EAEtB,MAAM,kDAAkD,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAKrF,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,sBAAsB;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,gCAAgC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;OAEG;IACU,OAAO,CAClB,YAAY,EAAE,qBAAqB,EACnC,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CA4D1B;IAED;;OAEG;IACU,YAAY,CACvB,aAAa,EAAE,SAAS,qBAAqB,EAAE,EAC/C,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,gBAAgB,EACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CASrC;CACF"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * @zudojs/lifecycle/executor
3
+ *
4
+ * Lifecycle executor — runs component hooks with timeout, retry, and error handling.
5
+ */
6
+ import { withTimeout, withConcurrency } from "../lifecycleInternal/index.js";
7
+ import { getComponentMethod } from "../lifecyclePhase/index.js";
8
+ import { LifecycleComponentError } from "@zudojs/errors";
9
+ /**
10
+ * Executes lifecycle component hooks with timeout, retry, and concurrency support.
11
+ */
12
+ export class LifecycleExecutor {
13
+ /**
14
+ * Executes a single component hook.
15
+ */
16
+ async execute(registration, phase, context) {
17
+ const methodName = getComponentMethod(phase);
18
+ const hook = registration.component[methodName];
19
+ if (typeof hook !== "function") {
20
+ return {
21
+ id: registration.id,
22
+ phase,
23
+ duration: 0,
24
+ success: true,
25
+ };
26
+ }
27
+ const startTime = Date.now();
28
+ let lastError;
29
+ const retryConfig = registration.retry;
30
+ const maxAttempts = 1 + (retryConfig.attempts ?? 0);
31
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
32
+ try {
33
+ await withTimeout(async () => {
34
+ const result = hook.call(registration.component, context);
35
+ if (result instanceof Promise) {
36
+ await result;
37
+ }
38
+ }, registration.timeout, registration.id, phase);
39
+ return {
40
+ id: registration.id,
41
+ phase,
42
+ duration: Date.now() - startTime,
43
+ success: true,
44
+ };
45
+ }
46
+ catch (error) {
47
+ lastError = error;
48
+ if (attempt < maxAttempts - 1) {
49
+ const delay = calculateDelay(retryConfig, attempt);
50
+ await sleep(delay);
51
+ }
52
+ }
53
+ }
54
+ return {
55
+ id: registration.id,
56
+ phase,
57
+ duration: Date.now() - startTime,
58
+ error: lastError,
59
+ success: false,
60
+ };
61
+ }
62
+ /**
63
+ * Executes a stage of components in parallel with concurrency limit.
64
+ */
65
+ async executeStage(registrations, phase, context, concurrency) {
66
+ const results = [];
67
+ await withConcurrency(registrations, concurrency, async (reg) => {
68
+ const result = await this.execute(reg, phase, context);
69
+ results.push(result);
70
+ });
71
+ return results;
72
+ }
73
+ }
74
+ /** Calculates retry delay with backoff. */
75
+ function calculateDelay(config, attempt) {
76
+ const base = config.delay ?? 500;
77
+ const max = config.maxDelay ?? 10_000;
78
+ const backoff = config.backoff ?? "exponential";
79
+ if (backoff === "exponential") {
80
+ return Math.min(base * 2 ** attempt, max);
81
+ }
82
+ return base;
83
+ }
84
+ /** Sleeps for the given duration. */
85
+ function sleep(ms) {
86
+ return new Promise((resolve) => setTimeout(resolve, ms));
87
+ }
88
+ //# sourceMappingURL=lifecycleExecutor.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycleExecutor.core.js","sourceRoot":"","sources":["../../src/lifecycleExecutor/lifecycleExecutor.core.ts"],"names":[],"mappings":"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"}