@zudojs/core 0.1.0 → 1.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 (485) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +141 -7
  3. package/dist/application/application.d.ts +43 -2
  4. package/dist/application/application.js +111 -13
  5. package/dist/application/applicationContext.context.d.ts +27 -1
  6. package/dist/application/applicationContext.context.js +22 -2
  7. package/dist/application/createApplication.d.ts +78 -0
  8. package/dist/application/createApplication.js +109 -0
  9. package/dist/application/index.d.ts +2 -1
  10. package/dist/application/index.js +2 -1
  11. package/dist/configuration/configurationManager.manager.d.ts +42 -0
  12. package/dist/configuration/configurationManager.manager.js +104 -7
  13. package/dist/configuration/core/configuration.d.ts +60 -15
  14. package/dist/configuration/core/configuration.js +248 -51
  15. package/dist/configuration/core/configurationKey.key.d.ts +4 -2
  16. package/dist/configuration/core/configurationKey.key.js +2 -13
  17. package/dist/configuration/core/configurationPath.path.d.ts +17 -0
  18. package/dist/configuration/core/configurationPath.path.js +33 -0
  19. package/dist/configuration/core/index.d.ts +7 -1
  20. package/dist/configuration/core/index.js +1 -0
  21. package/dist/configuration/error/configurationError.error.d.ts +11 -0
  22. package/dist/configuration/error/configurationError.error.js +29 -1
  23. package/dist/configuration/error/configurationRedactor.redactor.d.ts +16 -0
  24. package/dist/configuration/error/configurationRedactor.redactor.js +83 -5
  25. package/dist/configuration/error/index.d.ts +2 -1
  26. package/dist/configuration/error/index.js +2 -1
  27. package/dist/configuration/index.d.ts +1 -1
  28. package/dist/configuration/loader/configurationLoader.loader.d.ts +47 -9
  29. package/dist/configuration/loader/configurationLoader.loader.js +107 -26
  30. package/dist/configuration/loader/index.d.ts +1 -1
  31. package/dist/configuration/loader/index.js +1 -1
  32. package/dist/configuration/registry/configurationProvider.provider.d.ts +26 -1
  33. package/dist/configuration/registry/configurationProvider.provider.js +33 -7
  34. package/dist/configuration/registry/configurationRegistry.registry.js +2 -1
  35. package/dist/configuration/schema/configurationSchema.schema.d.ts +0 -4
  36. package/dist/configuration/schema/configurationSchema.schema.js +11 -32
  37. package/dist/configuration/schema/configurationValidation.validator.d.ts +14 -2
  38. package/dist/configuration/schema/configurationValidation.validator.js +55 -7
  39. package/dist/configuration/schema/index.d.ts +1 -1
  40. package/dist/configuration/schema/index.js +1 -1
  41. package/dist/container/container.d.ts +51 -5
  42. package/dist/container/container.js +104 -33
  43. package/dist/container/index.d.ts +1 -1
  44. package/dist/container/index.js +1 -1
  45. package/dist/container/scope.d.ts +7 -6
  46. package/dist/context/core/contextAliases.deprecated.d.ts +32 -0
  47. package/dist/context/core/contextAliases.deprecated.js +6 -0
  48. package/dist/context/core/executionContext.context.d.ts +8 -0
  49. package/dist/context/core/executionContext.context.js +38 -15
  50. package/dist/context/core/index.d.ts +2 -2
  51. package/dist/context/core/index.js +2 -2
  52. package/dist/context/index.d.ts +20 -0
  53. package/dist/context/index.js +20 -0
  54. package/dist/context/provider/contextProvider.provider.d.ts +7 -4
  55. package/dist/context/provider/contextProvider.provider.js +9 -6
  56. package/dist/context/provider/contextStorage.storage.d.ts +47 -7
  57. package/dist/context/provider/contextStorage.storage.js +54 -12
  58. package/dist/context/provider/defaultContextStorage.storage.d.ts +18 -0
  59. package/dist/context/provider/defaultContextStorage.storage.js +20 -0
  60. package/dist/context/provider/index.d.ts +2 -1
  61. package/dist/context/provider/index.js +1 -0
  62. package/dist/errors/exceptions.d.ts +22 -0
  63. package/dist/errors/exceptions.js +38 -1
  64. package/dist/errors/frameworkError.error.d.ts +6 -9
  65. package/dist/errors/index.d.ts +1 -1
  66. package/dist/errors/index.js +1 -1
  67. package/dist/index.d.ts +4 -0
  68. package/dist/index.js +14 -0
  69. package/dist/lifecycle/core/index.d.ts +1 -1
  70. package/dist/lifecycle/core/index.js +1 -1
  71. package/dist/lifecycle/core/lifecycle.d.ts +47 -2
  72. package/dist/lifecycle/core/lifecycle.js +251 -85
  73. package/dist/lifecycle/core/lifecycleRegistry.registry.d.ts +8 -0
  74. package/dist/lifecycle/core/lifecycleRegistry.registry.js +20 -1
  75. package/dist/lifecycle/manager/lifecycleManager.manager.d.ts +21 -2
  76. package/dist/lifecycle/manager/lifecycleManager.manager.js +62 -99
  77. package/dist/lifecycle/scope/lifecycleScope.scope.d.ts +22 -1
  78. package/dist/lifecycle/scope/lifecycleScope.scope.js +85 -17
  79. package/dist/logging/console/consoleLogger.logger.d.ts +20 -1
  80. package/dist/logging/console/consoleLogger.logger.js +77 -11
  81. package/dist/logging/console/loggerFactory.factory.d.ts +6 -5
  82. package/dist/logging/console/loggerFactory.factory.js +1 -7
  83. package/dist/logging/core/index.d.ts +4 -3
  84. package/dist/logging/core/index.js +4 -3
  85. package/dist/logging/core/logEntry.entry.d.ts +41 -3
  86. package/dist/logging/core/logEntry.entry.js +125 -4
  87. package/dist/logging/core/logLevel.level.d.ts +18 -0
  88. package/dist/logging/core/logLevel.level.js +25 -1
  89. package/dist/logging/core/logRedaction.redaction.d.ts +38 -0
  90. package/dist/logging/core/logRedaction.redaction.js +19 -0
  91. package/dist/logging/core/logger.d.ts +14 -11
  92. package/dist/logging/core/logger.js +31 -6
  93. package/dist/logging/core/loggerContext.context.d.ts +12 -0
  94. package/dist/logging/core/loggerContext.context.js +19 -0
  95. package/dist/logging/core/loggerOptions.options.d.ts +17 -0
  96. package/dist/modules/index.d.ts +0 -1
  97. package/dist/modules/index.js +0 -6
  98. package/dist/modules/module.d.ts +7 -1
  99. package/dist/modules/moduleContext.context.d.ts +41 -7
  100. package/dist/modules/moduleContext.context.js +31 -8
  101. package/dist/modules/moduleDefinition.definition.d.ts +11 -7
  102. package/dist/modules/moduleDefinition.definition.js +41 -8
  103. package/dist/modules/moduleDependency/index.d.ts +2 -2
  104. package/dist/modules/moduleDependency/index.js +1 -1
  105. package/dist/modules/moduleDependency/moduleDependency.graph.d.ts +19 -2
  106. package/dist/modules/moduleDependency/moduleDependency.graph.js +122 -8
  107. package/dist/modules/moduleDependency/moduleDependency.ordering.d.ts +8 -0
  108. package/dist/modules/moduleDependency/moduleDependency.ordering.js +85 -57
  109. package/dist/modules/moduleDependency/moduleDependency.type.d.ts +28 -1
  110. package/dist/modules/moduleError/index.d.ts +1 -1
  111. package/dist/modules/moduleError/index.js +1 -1
  112. package/dist/modules/moduleError/moduleError.dependency.d.ts +11 -0
  113. package/dist/modules/moduleError/moduleError.dependency.js +15 -0
  114. package/dist/modules/moduleLifecycle/index.d.ts +5 -2
  115. package/dist/modules/moduleLifecycle/index.js +4 -1
  116. package/dist/modules/moduleLifecycle/moduleLifecycle.lifecycle.d.ts +73 -10
  117. package/dist/modules/moduleLifecycle/moduleLifecycle.lifecycle.js +204 -19
  118. package/dist/modules/moduleLifecycle/moduleLifecycle.stateMachine.d.ts +30 -5
  119. package/dist/modules/moduleLifecycle/moduleLifecycle.stateMachine.js +130 -10
  120. package/dist/modules/moduleLifecycle/moduleLifecycle.type.d.ts +78 -28
  121. package/dist/modules/moduleLifecycle/moduleLifecycle.type.js +15 -4
  122. package/dist/modules/moduleLoader/moduleLoader.loader.d.ts +39 -5
  123. package/dist/modules/moduleLoader/moduleLoader.loader.js +168 -59
  124. package/dist/modules/moduleLoader/moduleLoader.type.d.ts +4 -2
  125. package/dist/modules/moduleLoader/moduleLoader.type.js +10 -3
  126. package/dist/modules/moduleMetadata.metadata.js +15 -5
  127. package/dist/modules/moduleRegistry/index.d.ts +1 -1
  128. package/dist/modules/moduleRegistry/moduleRegistry.registry.d.ts +2 -2
  129. package/dist/modules/moduleRegistry/moduleRegistry.registry.js +38 -6
  130. package/dist/modules/moduleRegistry/moduleRegistry.type.d.ts +18 -1
  131. package/dist/runtime/index.d.ts +17 -15
  132. package/dist/runtime/index.js +14 -10
  133. package/dist/runtime/runtime.d.ts +135 -33
  134. package/dist/runtime/runtime.js +344 -114
  135. package/dist/runtime/runtimeBootstrap/index.d.ts +2 -1
  136. package/dist/runtime/runtimeBootstrap/index.js +1 -1
  137. package/dist/runtime/runtimeBootstrap/pipeline/index.d.ts +2 -2
  138. package/dist/runtime/runtimeBootstrap/pipeline/index.js +1 -2
  139. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.pipeline.d.ts +41 -15
  140. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.pipeline.js +111 -76
  141. package/dist/runtime/runtimeBootstrap/runtimeBootstrap.core.d.ts +7 -4
  142. package/dist/runtime/runtimeBootstrap/runtimeBootstrap.core.js +87 -59
  143. package/dist/runtime/runtimeBootstrap/runtimeBootstrap.type.d.ts +10 -4
  144. package/dist/runtime/runtimeContext/index.d.ts +3 -5
  145. package/dist/runtime/runtimeContext/index.js +2 -4
  146. package/dist/runtime/runtimeContext/runtimeContext.factory.d.ts +10 -4
  147. package/dist/runtime/runtimeContext/runtimeContext.factory.js +30 -7
  148. package/dist/runtime/runtimeContext/runtimeContext.type.d.ts +36 -47
  149. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.env.d.ts +5 -0
  150. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.env.js +6 -4
  151. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.os.d.ts +4 -0
  152. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.os.js +7 -9
  153. package/dist/runtime/runtimeEnvironment/index.d.ts +2 -2
  154. package/dist/runtime/runtimeEnvironment/index.js +1 -1
  155. package/dist/runtime/runtimeEnvironment/runtimeEnvironment.core.d.ts +20 -17
  156. package/dist/runtime/runtimeEnvironment/runtimeEnvironment.core.js +20 -13
  157. package/dist/runtime/runtimeEnvironment/runtimeEnvironment.type.d.ts +12 -1
  158. package/dist/runtime/runtimeError/index.d.ts +3 -3
  159. package/dist/runtime/runtimeError/index.js +1 -1
  160. package/dist/runtime/runtimeError/runtimeError.base.d.ts +15 -18
  161. package/dist/runtime/runtimeError/runtimeError.base.js +38 -36
  162. package/dist/runtime/runtimeError/runtimeError.lifecycle.d.ts +23 -8
  163. package/dist/runtime/runtimeError/runtimeError.lifecycle.js +31 -7
  164. package/dist/runtime/runtimeError/runtimeError.specialized.d.ts +1 -1
  165. package/dist/runtime/runtimeError/runtimeError.specialized.js +1 -1
  166. package/dist/runtime/runtimeError/runtimeError.type.d.ts +5 -9
  167. package/dist/runtime/runtimeLogger.d.ts +2 -2
  168. package/dist/runtime/runtimeLogger.js +3 -3
  169. package/dist/runtime/runtimeOptions/index.d.ts +1 -1
  170. package/dist/runtime/runtimeOptions/runtimeOptions.defaults.d.ts +1 -1
  171. package/dist/runtime/runtimeOptions/runtimeOptions.defaults.js +2 -0
  172. package/dist/runtime/runtimeOptions/runtimeOptions.resolver.js +13 -2
  173. package/dist/runtime/runtimeOptions/runtimeOptions.type.d.ts +45 -16
  174. package/dist/runtime/runtimeOptions/runtimeOptions.validation.js +0 -1
  175. package/dist/runtime/runtimeShutdown/index.d.ts +3 -2
  176. package/dist/runtime/runtimeShutdown/index.js +2 -2
  177. package/dist/runtime/runtimeShutdown/pipeline/index.d.ts +2 -1
  178. package/dist/runtime/runtimeShutdown/pipeline/index.js +1 -1
  179. package/dist/runtime/runtimeShutdown/pipeline/runtimeShutdown.pipeline.d.ts +37 -7
  180. package/dist/runtime/runtimeShutdown/pipeline/runtimeShutdown.pipeline.js +85 -51
  181. package/dist/runtime/runtimeShutdown/runtimeShutdown.core.d.ts +8 -16
  182. package/dist/runtime/runtimeShutdown/runtimeShutdown.core.js +85 -87
  183. package/dist/runtime/runtimeShutdown/runtimeShutdown.type.d.ts +9 -5
  184. package/dist/runtime/runtimeSignals/index.d.ts +8 -0
  185. package/dist/runtime/runtimeSignals/index.js +7 -0
  186. package/dist/runtime/runtimeSignals/runtimeSignals.d.ts +93 -0
  187. package/dist/runtime/runtimeSignals/runtimeSignals.js +149 -0
  188. package/dist/runtime/runtimeState.state.d.ts +32 -14
  189. package/dist/runtime/runtimeState.state.js +34 -27
  190. package/dist/runtime/runtimeTimeout.d.ts +40 -0
  191. package/dist/runtime/runtimeTimeout.js +42 -0
  192. package/package.json +25 -15
  193. package/dist/.tsbuildinfo +0 -1
  194. package/dist/application/application.d.ts.map +0 -1
  195. package/dist/application/application.js.map +0 -1
  196. package/dist/application/applicationContext.context.d.ts.map +0 -1
  197. package/dist/application/applicationContext.context.js.map +0 -1
  198. package/dist/application/applicationState.state.d.ts.map +0 -1
  199. package/dist/application/applicationState.state.js.map +0 -1
  200. package/dist/application/index.d.ts.map +0 -1
  201. package/dist/application/index.js.map +0 -1
  202. package/dist/configuration/configurationManager.manager.d.ts.map +0 -1
  203. package/dist/configuration/configurationManager.manager.js.map +0 -1
  204. package/dist/configuration/core/configuration.d.ts.map +0 -1
  205. package/dist/configuration/core/configuration.js.map +0 -1
  206. package/dist/configuration/core/configurationKey.key.d.ts.map +0 -1
  207. package/dist/configuration/core/configurationKey.key.js.map +0 -1
  208. package/dist/configuration/core/configurationSource.source.d.ts.map +0 -1
  209. package/dist/configuration/core/configurationSource.source.js.map +0 -1
  210. package/dist/configuration/core/index.d.ts.map +0 -1
  211. package/dist/configuration/core/index.js.map +0 -1
  212. package/dist/configuration/error/configurationError.error.d.ts.map +0 -1
  213. package/dist/configuration/error/configurationError.error.js.map +0 -1
  214. package/dist/configuration/error/configurationRedactor.redactor.d.ts.map +0 -1
  215. package/dist/configuration/error/configurationRedactor.redactor.js.map +0 -1
  216. package/dist/configuration/error/index.d.ts.map +0 -1
  217. package/dist/configuration/error/index.js.map +0 -1
  218. package/dist/configuration/events/configurationEvents.events.d.ts.map +0 -1
  219. package/dist/configuration/events/configurationEvents.events.js.map +0 -1
  220. package/dist/configuration/events/index.d.ts.map +0 -1
  221. package/dist/configuration/events/index.js.map +0 -1
  222. package/dist/configuration/index.d.ts.map +0 -1
  223. package/dist/configuration/index.js.map +0 -1
  224. package/dist/configuration/loader/configurationLoader.loader.d.ts.map +0 -1
  225. package/dist/configuration/loader/configurationLoader.loader.js.map +0 -1
  226. package/dist/configuration/loader/index.d.ts.map +0 -1
  227. package/dist/configuration/loader/index.js.map +0 -1
  228. package/dist/configuration/registry/configurationProvider.provider.d.ts.map +0 -1
  229. package/dist/configuration/registry/configurationProvider.provider.js.map +0 -1
  230. package/dist/configuration/registry/configurationRegistry.registry.d.ts.map +0 -1
  231. package/dist/configuration/registry/configurationRegistry.registry.js.map +0 -1
  232. package/dist/configuration/registry/index.d.ts.map +0 -1
  233. package/dist/configuration/registry/index.js.map +0 -1
  234. package/dist/configuration/schema/configurationSchema.schema.d.ts.map +0 -1
  235. package/dist/configuration/schema/configurationSchema.schema.js.map +0 -1
  236. package/dist/configuration/schema/configurationValidation.validator.d.ts.map +0 -1
  237. package/dist/configuration/schema/configurationValidation.validator.js.map +0 -1
  238. package/dist/configuration/schema/index.d.ts.map +0 -1
  239. package/dist/configuration/schema/index.js.map +0 -1
  240. package/dist/container/container.d.ts.map +0 -1
  241. package/dist/container/container.js.map +0 -1
  242. package/dist/container/index.d.ts.map +0 -1
  243. package/dist/container/index.js.map +0 -1
  244. package/dist/container/provider.d.ts.map +0 -1
  245. package/dist/container/provider.js.map +0 -1
  246. package/dist/container/scope.d.ts.map +0 -1
  247. package/dist/container/scope.js.map +0 -1
  248. package/dist/container/token.d.ts.map +0 -1
  249. package/dist/container/token.js.map +0 -1
  250. package/dist/context/core/context.d.ts +0 -95
  251. package/dist/context/core/context.d.ts.map +0 -1
  252. package/dist/context/core/context.js +0 -103
  253. package/dist/context/core/context.js.map +0 -1
  254. package/dist/context/core/contextKey.key.d.ts.map +0 -1
  255. package/dist/context/core/contextKey.key.js.map +0 -1
  256. package/dist/context/core/executionContext.context.d.ts.map +0 -1
  257. package/dist/context/core/executionContext.context.js.map +0 -1
  258. package/dist/context/core/index.d.ts.map +0 -1
  259. package/dist/context/core/index.js.map +0 -1
  260. package/dist/context/index.d.ts.map +0 -1
  261. package/dist/context/index.js.map +0 -1
  262. package/dist/context/provider/contextProvider.provider.d.ts.map +0 -1
  263. package/dist/context/provider/contextProvider.provider.js.map +0 -1
  264. package/dist/context/provider/contextStorage.storage.d.ts.map +0 -1
  265. package/dist/context/provider/contextStorage.storage.js.map +0 -1
  266. package/dist/context/provider/index.d.ts.map +0 -1
  267. package/dist/context/provider/index.js.map +0 -1
  268. package/dist/context/snapshot/contextSnapshot.snapshot.d.ts.map +0 -1
  269. package/dist/context/snapshot/contextSnapshot.snapshot.js.map +0 -1
  270. package/dist/context/snapshot/index.d.ts.map +0 -1
  271. package/dist/context/snapshot/index.js.map +0 -1
  272. package/dist/context/values/contextValues.values.d.ts.map +0 -1
  273. package/dist/context/values/contextValues.values.js.map +0 -1
  274. package/dist/context/values/index.d.ts.map +0 -1
  275. package/dist/context/values/index.js.map +0 -1
  276. package/dist/contracts/adapter.d.ts.map +0 -1
  277. package/dist/contracts/adapter.js.map +0 -1
  278. package/dist/contracts/disposable.d.ts.map +0 -1
  279. package/dist/contracts/disposable.js.map +0 -1
  280. package/dist/contracts/handler.d.ts.map +0 -1
  281. package/dist/contracts/handler.js.map +0 -1
  282. package/dist/contracts/index.d.ts.map +0 -1
  283. package/dist/contracts/index.js.map +0 -1
  284. package/dist/errors/errorCode.code.d.ts.map +0 -1
  285. package/dist/errors/errorCode.code.js.map +0 -1
  286. package/dist/errors/exceptions.d.ts.map +0 -1
  287. package/dist/errors/exceptions.js.map +0 -1
  288. package/dist/errors/frameworkError.error.d.ts.map +0 -1
  289. package/dist/errors/frameworkError.error.js.map +0 -1
  290. package/dist/errors/index.d.ts.map +0 -1
  291. package/dist/errors/index.js.map +0 -1
  292. package/dist/index.d.ts.map +0 -1
  293. package/dist/index.js.map +0 -1
  294. package/dist/lifecycle/core/index.d.ts.map +0 -1
  295. package/dist/lifecycle/core/index.js.map +0 -1
  296. package/dist/lifecycle/core/lifecycle.d.ts.map +0 -1
  297. package/dist/lifecycle/core/lifecycle.js.map +0 -1
  298. package/dist/lifecycle/core/lifecycleHook.hook.d.ts.map +0 -1
  299. package/dist/lifecycle/core/lifecycleHook.hook.js.map +0 -1
  300. package/dist/lifecycle/core/lifecycleRegistry.registry.d.ts.map +0 -1
  301. package/dist/lifecycle/core/lifecycleRegistry.registry.js.map +0 -1
  302. package/dist/lifecycle/core/lifecycleState.state.d.ts +0 -2
  303. package/dist/lifecycle/core/lifecycleState.state.d.ts.map +0 -1
  304. package/dist/lifecycle/core/lifecycleState.state.js +0 -2
  305. package/dist/lifecycle/core/lifecycleState.state.js.map +0 -1
  306. package/dist/lifecycle/index.d.ts.map +0 -1
  307. package/dist/lifecycle/index.js.map +0 -1
  308. package/dist/lifecycle/manager/index.d.ts.map +0 -1
  309. package/dist/lifecycle/manager/index.js.map +0 -1
  310. package/dist/lifecycle/manager/lifecycleManager.manager.d.ts.map +0 -1
  311. package/dist/lifecycle/manager/lifecycleManager.manager.js.map +0 -1
  312. package/dist/lifecycle/scope/index.d.ts.map +0 -1
  313. package/dist/lifecycle/scope/index.js.map +0 -1
  314. package/dist/lifecycle/scope/lifecycleScope.scope.d.ts.map +0 -1
  315. package/dist/lifecycle/scope/lifecycleScope.scope.js.map +0 -1
  316. package/dist/logging/console/consoleLogger.logger.d.ts.map +0 -1
  317. package/dist/logging/console/consoleLogger.logger.js.map +0 -1
  318. package/dist/logging/console/index.d.ts.map +0 -1
  319. package/dist/logging/console/index.js.map +0 -1
  320. package/dist/logging/console/loggerFactory.factory.d.ts.map +0 -1
  321. package/dist/logging/console/loggerFactory.factory.js.map +0 -1
  322. package/dist/logging/core/index.d.ts.map +0 -1
  323. package/dist/logging/core/index.js.map +0 -1
  324. package/dist/logging/core/logEntry.entry.d.ts.map +0 -1
  325. package/dist/logging/core/logEntry.entry.js.map +0 -1
  326. package/dist/logging/core/logLevel.level.d.ts.map +0 -1
  327. package/dist/logging/core/logLevel.level.js.map +0 -1
  328. package/dist/logging/core/logger.d.ts.map +0 -1
  329. package/dist/logging/core/logger.js.map +0 -1
  330. package/dist/logging/core/loggerContext.context.d.ts.map +0 -1
  331. package/dist/logging/core/loggerContext.context.js.map +0 -1
  332. package/dist/logging/core/loggerOptions.options.d.ts.map +0 -1
  333. package/dist/logging/core/loggerOptions.options.js.map +0 -1
  334. package/dist/logging/index.d.ts.map +0 -1
  335. package/dist/logging/index.js.map +0 -1
  336. package/dist/modules/index.d.ts.map +0 -1
  337. package/dist/modules/index.js.map +0 -1
  338. package/dist/modules/module.d.ts.map +0 -1
  339. package/dist/modules/module.js.map +0 -1
  340. package/dist/modules/moduleContext.context.d.ts.map +0 -1
  341. package/dist/modules/moduleContext.context.js.map +0 -1
  342. package/dist/modules/moduleDefinition.definition.d.ts.map +0 -1
  343. package/dist/modules/moduleDefinition.definition.js.map +0 -1
  344. package/dist/modules/moduleDependency/index.d.ts.map +0 -1
  345. package/dist/modules/moduleDependency/index.js.map +0 -1
  346. package/dist/modules/moduleDependency/moduleDependency.graph.d.ts.map +0 -1
  347. package/dist/modules/moduleDependency/moduleDependency.graph.js.map +0 -1
  348. package/dist/modules/moduleDependency/moduleDependency.ordering.d.ts.map +0 -1
  349. package/dist/modules/moduleDependency/moduleDependency.ordering.js.map +0 -1
  350. package/dist/modules/moduleDependency/moduleDependency.type.d.ts.map +0 -1
  351. package/dist/modules/moduleDependency/moduleDependency.type.js.map +0 -1
  352. package/dist/modules/moduleError/index.d.ts.map +0 -1
  353. package/dist/modules/moduleError/index.js.map +0 -1
  354. package/dist/modules/moduleError/moduleError.base.d.ts.map +0 -1
  355. package/dist/modules/moduleError/moduleError.base.js.map +0 -1
  356. package/dist/modules/moduleError/moduleError.dependency.d.ts.map +0 -1
  357. package/dist/modules/moduleError/moduleError.dependency.js.map +0 -1
  358. package/dist/modules/moduleError/moduleError.helpers.d.ts.map +0 -1
  359. package/dist/modules/moduleError/moduleError.helpers.js.map +0 -1
  360. package/dist/modules/moduleError/moduleError.lifecycle.d.ts.map +0 -1
  361. package/dist/modules/moduleError/moduleError.lifecycle.js.map +0 -1
  362. package/dist/modules/moduleError/moduleError.registration.d.ts.map +0 -1
  363. package/dist/modules/moduleError/moduleError.registration.js.map +0 -1
  364. package/dist/modules/moduleLifecycle/index.d.ts.map +0 -1
  365. package/dist/modules/moduleLifecycle/index.js.map +0 -1
  366. package/dist/modules/moduleLifecycle/moduleLifecycle.lifecycle.d.ts.map +0 -1
  367. package/dist/modules/moduleLifecycle/moduleLifecycle.lifecycle.js.map +0 -1
  368. package/dist/modules/moduleLifecycle/moduleLifecycle.stateMachine.d.ts.map +0 -1
  369. package/dist/modules/moduleLifecycle/moduleLifecycle.stateMachine.js.map +0 -1
  370. package/dist/modules/moduleLifecycle/moduleLifecycle.type.d.ts.map +0 -1
  371. package/dist/modules/moduleLifecycle/moduleLifecycle.type.js.map +0 -1
  372. package/dist/modules/moduleLoader/index.d.ts.map +0 -1
  373. package/dist/modules/moduleLoader/index.js.map +0 -1
  374. package/dist/modules/moduleLoader/moduleLoader.loader.d.ts.map +0 -1
  375. package/dist/modules/moduleLoader/moduleLoader.loader.js.map +0 -1
  376. package/dist/modules/moduleLoader/moduleLoader.type.d.ts.map +0 -1
  377. package/dist/modules/moduleLoader/moduleLoader.type.js.map +0 -1
  378. package/dist/modules/moduleMetadata.metadata.d.ts.map +0 -1
  379. package/dist/modules/moduleMetadata.metadata.js.map +0 -1
  380. package/dist/modules/moduleRegistry/index.d.ts.map +0 -1
  381. package/dist/modules/moduleRegistry/index.js.map +0 -1
  382. package/dist/modules/moduleRegistry/moduleRegistry.registry.d.ts.map +0 -1
  383. package/dist/modules/moduleRegistry/moduleRegistry.registry.js.map +0 -1
  384. package/dist/modules/moduleRegistry/moduleRegistry.type.d.ts.map +0 -1
  385. package/dist/modules/moduleRegistry/moduleRegistry.type.js.map +0 -1
  386. package/dist/runtime/index.d.ts.map +0 -1
  387. package/dist/runtime/index.js.map +0 -1
  388. package/dist/runtime/runtime.d.ts.map +0 -1
  389. package/dist/runtime/runtime.js.map +0 -1
  390. package/dist/runtime/runtimeBootstrap/index.d.ts.map +0 -1
  391. package/dist/runtime/runtimeBootstrap/index.js.map +0 -1
  392. package/dist/runtime/runtimeBootstrap/pipeline/index.d.ts.map +0 -1
  393. package/dist/runtime/runtimeBootstrap/pipeline/index.js.map +0 -1
  394. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.invoke.d.ts +0 -6
  395. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.invoke.d.ts.map +0 -1
  396. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.invoke.js +0 -27
  397. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.invoke.js.map +0 -1
  398. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.pipeline.d.ts.map +0 -1
  399. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.pipeline.js.map +0 -1
  400. package/dist/runtime/runtimeBootstrap/runtimeBootstrap.core.d.ts.map +0 -1
  401. package/dist/runtime/runtimeBootstrap/runtimeBootstrap.core.js.map +0 -1
  402. package/dist/runtime/runtimeBootstrap/runtimeBootstrap.type.d.ts.map +0 -1
  403. package/dist/runtime/runtimeBootstrap/runtimeBootstrap.type.js.map +0 -1
  404. package/dist/runtime/runtimeContext/index.d.ts.map +0 -1
  405. package/dist/runtime/runtimeContext/index.js.map +0 -1
  406. package/dist/runtime/runtimeContext/runtimeContext.core.d.ts +0 -38
  407. package/dist/runtime/runtimeContext/runtimeContext.core.d.ts.map +0 -1
  408. package/dist/runtime/runtimeContext/runtimeContext.core.js +0 -99
  409. package/dist/runtime/runtimeContext/runtimeContext.core.js.map +0 -1
  410. package/dist/runtime/runtimeContext/runtimeContext.factory.d.ts.map +0 -1
  411. package/dist/runtime/runtimeContext/runtimeContext.factory.js.map +0 -1
  412. package/dist/runtime/runtimeContext/runtimeContext.type.d.ts.map +0 -1
  413. package/dist/runtime/runtimeContext/runtimeContext.type.js.map +0 -1
  414. package/dist/runtime/runtimeEnvironment/detection/index.d.ts.map +0 -1
  415. package/dist/runtime/runtimeEnvironment/detection/index.js.map +0 -1
  416. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.detection.d.ts.map +0 -1
  417. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.detection.js.map +0 -1
  418. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.env.d.ts.map +0 -1
  419. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.env.js.map +0 -1
  420. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.os.d.ts.map +0 -1
  421. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.os.js.map +0 -1
  422. package/dist/runtime/runtimeEnvironment/index.d.ts.map +0 -1
  423. package/dist/runtime/runtimeEnvironment/index.js.map +0 -1
  424. package/dist/runtime/runtimeEnvironment/runtimeEnvironment.core.d.ts.map +0 -1
  425. package/dist/runtime/runtimeEnvironment/runtimeEnvironment.core.js.map +0 -1
  426. package/dist/runtime/runtimeEnvironment/runtimeEnvironment.type.d.ts.map +0 -1
  427. package/dist/runtime/runtimeEnvironment/runtimeEnvironment.type.js.map +0 -1
  428. package/dist/runtime/runtimeError/index.d.ts.map +0 -1
  429. package/dist/runtime/runtimeError/index.js.map +0 -1
  430. package/dist/runtime/runtimeError/runtimeError.base.d.ts.map +0 -1
  431. package/dist/runtime/runtimeError/runtimeError.base.js.map +0 -1
  432. package/dist/runtime/runtimeError/runtimeError.lifecycle.d.ts.map +0 -1
  433. package/dist/runtime/runtimeError/runtimeError.lifecycle.js.map +0 -1
  434. package/dist/runtime/runtimeError/runtimeError.specialized.d.ts.map +0 -1
  435. package/dist/runtime/runtimeError/runtimeError.specialized.js.map +0 -1
  436. package/dist/runtime/runtimeError/runtimeError.type.d.ts.map +0 -1
  437. package/dist/runtime/runtimeError/runtimeError.type.js.map +0 -1
  438. package/dist/runtime/runtimeLogger.d.ts.map +0 -1
  439. package/dist/runtime/runtimeLogger.js.map +0 -1
  440. package/dist/runtime/runtimeManager/index.d.ts +0 -12
  441. package/dist/runtime/runtimeManager/index.d.ts.map +0 -1
  442. package/dist/runtime/runtimeManager/index.js +0 -11
  443. package/dist/runtime/runtimeManager/index.js.map +0 -1
  444. package/dist/runtime/runtimeManager/runtimeManager.core.d.ts +0 -31
  445. package/dist/runtime/runtimeManager/runtimeManager.core.d.ts.map +0 -1
  446. package/dist/runtime/runtimeManager/runtimeManager.core.js +0 -136
  447. package/dist/runtime/runtimeManager/runtimeManager.core.js.map +0 -1
  448. package/dist/runtime/runtimeManager/runtimeManager.error.d.ts +0 -14
  449. package/dist/runtime/runtimeManager/runtimeManager.error.d.ts.map +0 -1
  450. package/dist/runtime/runtimeManager/runtimeManager.error.js +0 -21
  451. package/dist/runtime/runtimeManager/runtimeManager.error.js.map +0 -1
  452. package/dist/runtime/runtimeManager/runtimeManager.factory.d.ts +0 -7
  453. package/dist/runtime/runtimeManager/runtimeManager.factory.d.ts.map +0 -1
  454. package/dist/runtime/runtimeManager/runtimeManager.factory.js +0 -8
  455. package/dist/runtime/runtimeManager/runtimeManager.factory.js.map +0 -1
  456. package/dist/runtime/runtimeManager/runtimeManager.lifecycle.d.ts +0 -16
  457. package/dist/runtime/runtimeManager/runtimeManager.lifecycle.d.ts.map +0 -1
  458. package/dist/runtime/runtimeManager/runtimeManager.lifecycle.js +0 -49
  459. package/dist/runtime/runtimeManager/runtimeManager.lifecycle.js.map +0 -1
  460. package/dist/runtime/runtimeManager/runtimeManager.type.d.ts +0 -54
  461. package/dist/runtime/runtimeManager/runtimeManager.type.d.ts.map +0 -1
  462. package/dist/runtime/runtimeManager/runtimeManager.type.js +0 -2
  463. package/dist/runtime/runtimeManager/runtimeManager.type.js.map +0 -1
  464. package/dist/runtime/runtimeOptions/index.d.ts.map +0 -1
  465. package/dist/runtime/runtimeOptions/index.js.map +0 -1
  466. package/dist/runtime/runtimeOptions/runtimeOptions.defaults.d.ts.map +0 -1
  467. package/dist/runtime/runtimeOptions/runtimeOptions.defaults.js.map +0 -1
  468. package/dist/runtime/runtimeOptions/runtimeOptions.resolver.d.ts.map +0 -1
  469. package/dist/runtime/runtimeOptions/runtimeOptions.resolver.js.map +0 -1
  470. package/dist/runtime/runtimeOptions/runtimeOptions.type.d.ts.map +0 -1
  471. package/dist/runtime/runtimeOptions/runtimeOptions.type.js.map +0 -1
  472. package/dist/runtime/runtimeOptions/runtimeOptions.validation.d.ts.map +0 -1
  473. package/dist/runtime/runtimeOptions/runtimeOptions.validation.js.map +0 -1
  474. package/dist/runtime/runtimeShutdown/index.d.ts.map +0 -1
  475. package/dist/runtime/runtimeShutdown/index.js.map +0 -1
  476. package/dist/runtime/runtimeShutdown/pipeline/index.d.ts.map +0 -1
  477. package/dist/runtime/runtimeShutdown/pipeline/index.js.map +0 -1
  478. package/dist/runtime/runtimeShutdown/pipeline/runtimeShutdown.pipeline.d.ts.map +0 -1
  479. package/dist/runtime/runtimeShutdown/pipeline/runtimeShutdown.pipeline.js.map +0 -1
  480. package/dist/runtime/runtimeShutdown/runtimeShutdown.core.d.ts.map +0 -1
  481. package/dist/runtime/runtimeShutdown/runtimeShutdown.core.js.map +0 -1
  482. package/dist/runtime/runtimeShutdown/runtimeShutdown.type.d.ts.map +0 -1
  483. package/dist/runtime/runtimeShutdown/runtimeShutdown.type.js.map +0 -1
  484. package/dist/runtime/runtimeState.state.d.ts.map +0 -1
  485. package/dist/runtime/runtimeState.state.js.map +0 -1
@@ -1,4 +1,7 @@
1
+ import { ModuleError, ModuleErrorCode, } from "../moduleError/moduleError.base.js";
1
2
  import { createModuleDependencyGraph, resolveModuleStartupOrder, resolveModuleShutdownOrder, } from "../moduleDependency/index.js";
3
+ import { ModuleLifecycleError } from "./moduleLifecycle.type.js";
4
+ import { getDefaultContextStorage } from "../../context/provider/defaultContextStorage.storage.js";
2
5
  import { ensureStateSynchronized, getLifecycleState, requireLifecycleState, getAllLifecycleStates, isModuleInitialized, isModuleStarted, isModuleDestroyed, executeLifecyclePhase, } from "./moduleLifecycle.stateMachine.js";
3
6
  /**
4
7
  * Module lifecycle manager.
@@ -8,6 +11,7 @@ export class ModuleLifecycleManager {
8
11
  registry;
9
12
  loader;
10
13
  options;
14
+ contextStorage;
11
15
  states = new Map();
12
16
  operation;
13
17
  constructor(registry, loader, options = {}) {
@@ -19,39 +23,186 @@ export class ModuleLifecycleManager {
19
23
  continueOnStopError: options.continueOnStopError ?? true,
20
24
  continueOnDestroyError: options.continueOnDestroyError ?? true,
21
25
  };
26
+ this.contextStorage = options.contextStorage ?? getDefaultContextStorage();
22
27
  }
23
- async initialize() {
28
+ async initialize(options = {}) {
24
29
  return this.runExclusive(async () => {
25
30
  ensureStateSynchronized(this.registry, this.states);
26
- return executeLifecyclePhase(this.getStartupOrder(), "initialize", "initializing", "initialized", this.options.continueOnInitializeError, this.registry, this.loader, this.states);
31
+ try {
32
+ return await executeLifecyclePhase(this.getStartupOrder(), "initialize", "initializing", "initialized", options.continueOnError ?? this.options.continueOnInitializeError, this.registry, this.loader, this.states, this.contextStorage);
33
+ }
34
+ catch (error) {
35
+ await this.rollbackAfterFailure(error, { stopFirst: false });
36
+ throw error;
37
+ }
27
38
  });
28
39
  }
29
- async start() {
40
+ async start(options = {}) {
30
41
  return this.runExclusive(async () => {
31
42
  ensureStateSynchronized(this.registry, this.states);
32
- return executeLifecyclePhase(this.getStartupOrder(), "start", "starting", "started", this.options.continueOnStartError, this.registry, this.loader, this.states);
43
+ try {
44
+ return await executeLifecyclePhase(this.getStartupOrder(), "start", "starting", "started", options.continueOnError ?? this.options.continueOnStartError, this.registry, this.loader, this.states, this.contextStorage);
45
+ }
46
+ catch (error) {
47
+ await this.rollbackAfterFailure(error, { stopFirst: true });
48
+ throw error;
49
+ }
33
50
  });
34
51
  }
35
- async stop() {
52
+ async stop(options = {}) {
36
53
  return this.runExclusive(async () => {
37
54
  ensureStateSynchronized(this.registry, this.states);
38
- return executeLifecyclePhase(this.getShutdownOrder(), "stop", "stopping", "stopped", this.options.continueOnStopError, this.registry, this.loader, this.states);
55
+ return executeLifecyclePhase(this.getShutdownOrder(), "stop", "stopping", "stopped", options.continueOnError ?? this.options.continueOnStopError, this.registry, this.loader, this.states, this.contextStorage);
39
56
  });
40
57
  }
41
- async destroy() {
58
+ async destroy(options = {}) {
42
59
  return this.runExclusive(async () => {
43
60
  ensureStateSynchronized(this.registry, this.states);
44
- return executeLifecyclePhase(this.getShutdownOrder(), "destroy", "destroying", "destroyed", this.options.continueOnDestroyError, this.registry, this.loader, this.states);
61
+ return executeLifecyclePhase(this.getShutdownOrder(), "destroy", "destroying", "destroyed", options.continueOnError ?? this.options.continueOnDestroyError, this.registry, this.loader, this.states, this.contextStorage);
45
62
  });
46
63
  }
64
+ /**
65
+ * Rolls back modules that completed earlier phases after a
66
+ * startup failure.
67
+ *
68
+ * The rollback is best-effort: the already-completed subset is
69
+ * stopped (when requested) and destroyed in reverse dependency
70
+ * order, and any rollback errors are collected onto the
71
+ * original ModuleLifecycleError instead of masking it.
72
+ */
73
+ async rollbackAfterFailure(error, options) {
74
+ const rollbackErrors = [];
75
+ try {
76
+ /*
77
+ * Only modules that actually entered the startup flow are
78
+ * rolled back; untouched modules keep their "created"
79
+ * state and never see stop/destroy hooks here.
80
+ */
81
+ const touchedPhases = new Set([
82
+ "initialized",
83
+ "starting",
84
+ "started",
85
+ "stopping",
86
+ "stopped",
87
+ "failed",
88
+ ]);
89
+ const shutdownOrder = this.getShutdownOrder().filter((moduleId) => {
90
+ const phase = getLifecycleState(moduleId, this.states)?.phase;
91
+ return phase !== undefined && touchedPhases.has(phase);
92
+ });
93
+ if (options.stopFirst) {
94
+ const stopResult = await executeLifecyclePhase(shutdownOrder, "stop", "stopping", "stopped", true, this.registry, this.loader, this.states, this.contextStorage);
95
+ for (const moduleId of stopResult.failed) {
96
+ rollbackErrors.push(getLifecycleState(moduleId, this.states)?.error ??
97
+ new Error(`Module "${moduleId}" failed to stop during rollback.`));
98
+ }
99
+ }
100
+ const destroyResult = await executeLifecyclePhase(shutdownOrder, "destroy", "destroying", "destroyed", true, this.registry, this.loader, this.states, this.contextStorage);
101
+ for (const moduleId of destroyResult.failed) {
102
+ rollbackErrors.push(getLifecycleState(moduleId, this.states)?.error ??
103
+ new Error(`Module "${moduleId}" failed to destroy during rollback.`));
104
+ }
105
+ }
106
+ catch (rollbackError) {
107
+ rollbackErrors.push(rollbackError);
108
+ }
109
+ if (error instanceof ModuleLifecycleError && rollbackErrors.length > 0) {
110
+ error.rollbackErrors = Object.freeze([...rollbackErrors]);
111
+ }
112
+ }
113
+ /**
114
+ * Shuts down and unloads a single module.
115
+ *
116
+ * The module is stopped (when started) and destroyed, its
117
+ * lifecycle state is dropped, and the loader forgets its
118
+ * instance and context. Hook failures never abort the unload;
119
+ * they are reported in the result and on the lifecycle state.
120
+ *
121
+ * A module that other loaded modules still depend on cannot be
122
+ * unloaded; ModuleError (MODULE_OPERATION_NOT_ALLOWED) is thrown.
123
+ */
124
+ async unloadModule(moduleId) {
125
+ return this.runExclusive(async () => {
126
+ ensureStateSynchronized(this.registry, this.states);
127
+ const registration = this.registry.get(moduleId);
128
+ if (!registration?.instance) {
129
+ this.loader.unload(moduleId);
130
+ this.states.delete(moduleId);
131
+ return { completed: [], failed: [], skipped: [] };
132
+ }
133
+ const dependents = this.getLoadedDependents(moduleId);
134
+ if (dependents.length > 0) {
135
+ throw new ModuleError(`Module "${moduleId}" cannot be unloaded while loaded modules depend on it: ${dependents.join(", ")}.`, {
136
+ code: ModuleErrorCode.OPERATION_NOT_ALLOWED,
137
+ moduleId,
138
+ metadata: { dependents },
139
+ });
140
+ }
141
+ const stopped = await executeLifecyclePhase([moduleId], "stop", "stopping", "stopped", true, this.registry, this.loader, this.states, this.contextStorage);
142
+ const destroyed = await executeLifecyclePhase([moduleId], "destroy", "destroying", "destroyed", true, this.registry, this.loader, this.states, this.contextStorage);
143
+ this.loader.unload(moduleId);
144
+ this.states.delete(moduleId);
145
+ return {
146
+ completed: Object.freeze([
147
+ ...new Set([...stopped.completed, ...destroyed.completed]),
148
+ ]),
149
+ failed: Object.freeze([
150
+ ...new Set([...stopped.failed, ...destroyed.failed]),
151
+ ]),
152
+ skipped: Object.freeze([...stopped.skipped, ...destroyed.skipped]),
153
+ };
154
+ });
155
+ }
156
+ /**
157
+ * Replaces a module definition, shutting down the currently
158
+ * loaded instance first.
159
+ *
160
+ * The registry must allow replacement (allowReplacement: true).
161
+ * The new definition is registered but not loaded; call the
162
+ * loader and lifecycle methods afterwards to bring it up.
163
+ */
164
+ async replaceModule(definition) {
165
+ const existing = this.registry.get(definition.id);
166
+ if (existing?.instance)
167
+ await this.unloadModule(definition.id);
168
+ return this.registry.register(definition);
169
+ }
170
+ /**
171
+ * Returns ids of loaded modules that declare a required or
172
+ * optional dependency on the given module.
173
+ */
174
+ getLoadedDependents(moduleId) {
175
+ const dependents = [];
176
+ for (const registration of this.registry.getAll()) {
177
+ if (registration.definition.id === moduleId)
178
+ continue;
179
+ if (registration.state !== "loaded")
180
+ continue;
181
+ const dependsOnModule = this.resolveDependencies(registration).some((dependency) => dependency.id === moduleId);
182
+ if (dependsOnModule)
183
+ dependents.push(registration.definition.id);
184
+ }
185
+ return dependents;
186
+ }
187
+ /**
188
+ * Dependencies of a registered module: those declared on the
189
+ * definition plus any the loaded instance declares itself
190
+ * (`Module.dependencies`, e.g. via the BaseModule constructor).
191
+ * Instance-declared dependencies are required; a definition
192
+ * entry for the same id wins so optional/version flags survive.
193
+ */
194
+ resolveDependencies(registration) {
195
+ return resolveRegistrationDependencies(this.registry, registration);
196
+ }
47
197
  async startApplication() {
198
+ /*
199
+ * When continueOn*Error is disabled, phase failures are
200
+ * reported through the thrown (and rolled-back)
201
+ * ModuleLifecycleError from initialize()/start(). That is
202
+ * the single failure path of application startup.
203
+ */
48
204
  const initialized = await this.initialize();
49
- if (initialized.failed.length > 0 &&
50
- !this.options.continueOnInitializeError)
51
- throw new Error("Application startup aborted because module initialization failed.");
52
205
  const started = await this.start();
53
- if (started.failed.length > 0 && !this.options.continueOnStartError)
54
- throw new Error("Application startup aborted because module startup failed.");
55
206
  return { initialized, started };
56
207
  }
57
208
  async stopApplication() {
@@ -77,20 +228,31 @@ export class ModuleLifecycleManager {
77
228
  isDestroyed(moduleId) {
78
229
  return isModuleDestroyed(moduleId, this.states);
79
230
  }
231
+ /**
232
+ * Builds the dependency graph over the loaded modules only.
233
+ *
234
+ * Lifecycle phases run for loaded modules, so a registered but
235
+ * unloaded definition (autoLoad: false) must not be able to
236
+ * break them with a missing or circular dependency of its own.
237
+ * Dependencies of a loaded module that are not loaded are kept
238
+ * as edges so the ordering reports them as missing.
239
+ */
80
240
  createGraph() {
81
- const nodes = this.registry.getAll().map((r) => ({
241
+ const nodes = this.registry
242
+ .getAll()
243
+ .filter((r) => r.state === "loaded")
244
+ .map((r) => ({
82
245
  id: r.definition.id,
83
- dependencies: this.registry.getDependencies(r.definition.id),
246
+ dependencies: this.resolveDependencies(r),
247
+ version: r.definition.version,
84
248
  }));
85
249
  return createModuleDependencyGraph(nodes);
86
250
  }
87
251
  getStartupOrder() {
88
- const order = resolveModuleStartupOrder(this.createGraph());
89
- return Object.freeze(order.filter((id) => this.registry.get(id)?.state === "loaded"));
252
+ return resolveModuleStartupOrder(this.createGraph());
90
253
  }
91
254
  getShutdownOrder() {
92
- const order = resolveModuleShutdownOrder(this.createGraph());
93
- return Object.freeze(order.filter((id) => this.registry.get(id)?.state === "loaded"));
255
+ return resolveModuleShutdownOrder(this.createGraph());
94
256
  }
95
257
  async runExclusive(operation) {
96
258
  while (this.operation)
@@ -109,6 +271,29 @@ export class ModuleLifecycleManager {
109
271
  }
110
272
  }
111
273
  }
274
+ /**
275
+ * Resolves the dependencies of a registration: definition-declared
276
+ * dependencies plus the ids the loaded instance declares through
277
+ * `Module.dependencies`. Shared by the lifecycle manager and the
278
+ * loader so both agree on the graph.
279
+ */
280
+ export function resolveRegistrationDependencies(registry, registration) {
281
+ const declared = registry.getDependencies(registration.definition.id);
282
+ const instanceDependencies = registration.instance?.dependencies ?? [];
283
+ if (instanceDependencies.length === 0)
284
+ return declared;
285
+ const seen = new Set(declared.map((dependency) => dependency.id));
286
+ const merged = [...declared];
287
+ for (const id of instanceDependencies) {
288
+ if (typeof id !== "string" || id.length === 0 || seen.has(id))
289
+ continue;
290
+ if (id === registration.definition.id)
291
+ continue;
292
+ seen.add(id);
293
+ merged.push(Object.freeze({ id, optional: false }));
294
+ }
295
+ return Object.freeze(merged);
296
+ }
112
297
  /** Creates a module lifecycle manager. */
113
298
  export function createModuleLifecycleManager(registry, loader, options = {}) {
114
299
  return new ModuleLifecycleManager(registry, loader, options);
@@ -1,9 +1,15 @@
1
1
  import type { Module, ModuleId } from "../module.js";
2
2
  import type { ModuleContext } from "../moduleContext.context.js";
3
- import type { ModuleLifecycleHooks, ModuleLifecyclePhase, ModuleLifecycleState, LifecycleStateMap } from "./moduleLifecycle.type.js";
3
+ import type { ModuleLifecycleStep, ModuleLifecyclePhase, ModuleLifecycleState, ModuleLifecycleSkip, LifecycleStateMap } from "./moduleLifecycle.type.js";
4
4
  import type { ModuleRegistry } from "../moduleRegistry/index.js";
5
5
  import type { ModuleLoader } from "../moduleLoader/index.js";
6
- /** Ensures lifecycle state is synchronized with the registry. */
6
+ import type { ContextStorage } from "../../context/provider/contextStorage.storage.js";
7
+ /**
8
+ * Ensures lifecycle state is synchronized with the registry.
9
+ *
10
+ * Registered modules gain a "created" state; states belonging to
11
+ * modules that are no longer registered are pruned.
12
+ */
7
13
  export declare function ensureStateSynchronized(registry: ModuleRegistry, states: LifecycleStateMap): void;
8
14
  export declare function getLifecycleState(moduleId: ModuleId, states: LifecycleStateMap): ModuleLifecycleState | undefined;
9
15
  export declare function requireLifecycleState(moduleId: ModuleId, states: LifecycleStateMap): ModuleLifecycleState;
@@ -11,11 +17,30 @@ export declare function getAllLifecycleStates(states: LifecycleStateMap): Readon
11
17
  export declare function isModuleInitialized(moduleId: ModuleId, states: LifecycleStateMap): boolean;
12
18
  export declare function isModuleStarted(moduleId: ModuleId, states: LifecycleStateMap): boolean;
13
19
  export declare function isModuleDestroyed(moduleId: ModuleId, states: LifecycleStateMap): boolean;
14
- export declare function invokeLifecycleHook(module: Module, hook: keyof ModuleLifecycleHooks, context: ModuleContext): Promise<void>;
15
- export declare function canModuleEnterPhase(moduleId: ModuleId, hook: keyof ModuleLifecycleHooks, states: LifecycleStateMap): boolean;
20
+ /**
21
+ * Invokes the lifecycle hook for a step on a module.
22
+ *
23
+ * Only the canonical Module contract hooks are invoked:
24
+ *
25
+ * initialize → onInitialize
26
+ * start → onReady
27
+ * stop → onShutdown
28
+ * destroy → onDestroy
29
+ *
30
+ * Modules that do not implement a hook are skipped for that step.
31
+ *
32
+ * When `contextStorage` holds an active execution context (the
33
+ * runtime's, during bootstrap and shutdown), the hook runs inside a
34
+ * context derived from it: `module` is the module id, `operation`
35
+ * is the hook name, and `{ moduleId, phase }` is merged into the
36
+ * metadata. Everything the hook awaits observes that context.
37
+ */
38
+ export declare function invokeLifecycleHook(module: Module, step: ModuleLifecycleStep, context: ModuleContext, contextStorage?: ContextStorage, phase?: ModuleLifecyclePhase): Promise<void>;
39
+ export declare function canModuleEnterPhase(moduleId: ModuleId, hook: ModuleLifecycleStep, states: LifecycleStateMap): boolean;
16
40
  export declare function setLifecycleState(moduleId: ModuleId, phase: ModuleLifecyclePhase, states: LifecycleStateMap, error?: unknown): void;
17
- export declare function executeLifecyclePhase(order: readonly ModuleId[], hook: keyof ModuleLifecycleHooks, activePhase: ModuleLifecyclePhase, completedPhase: ModuleLifecyclePhase, continueOnError: boolean, registry: ModuleRegistry, loader: ModuleLoader, states: LifecycleStateMap): Promise<{
41
+ export declare function executeLifecyclePhase(order: readonly ModuleId[], hook: ModuleLifecycleStep, activePhase: ModuleLifecyclePhase, completedPhase: ModuleLifecyclePhase, continueOnError: boolean, registry: ModuleRegistry, loader: ModuleLoader, states: LifecycleStateMap, contextStorage?: ContextStorage): Promise<{
18
42
  readonly completed: readonly ModuleId[];
19
43
  readonly failed: readonly ModuleId[];
44
+ readonly skipped: readonly ModuleLifecycleSkip[];
20
45
  }>;
21
46
  //# sourceMappingURL=moduleLifecycle.stateMachine.d.ts.map
@@ -1,11 +1,23 @@
1
1
  import { ModuleLifecycleError } from "./moduleLifecycle.type.js";
2
- /** Ensures lifecycle state is synchronized with the registry. */
2
+ import { ModuleNotFoundError } from "../moduleError/moduleError.registration.js";
3
+ /**
4
+ * Ensures lifecycle state is synchronized with the registry.
5
+ *
6
+ * Registered modules gain a "created" state; states belonging to
7
+ * modules that are no longer registered are pruned.
8
+ */
3
9
  export function ensureStateSynchronized(registry, states) {
10
+ const registered = new Set();
4
11
  for (const registration of registry.getAll()) {
5
12
  const moduleId = registration.definition.id;
13
+ registered.add(moduleId);
6
14
  if (!states.has(moduleId))
7
15
  states.set(moduleId, { moduleId, phase: "created" });
8
16
  }
17
+ for (const moduleId of [...states.keys()]) {
18
+ if (!registered.has(moduleId))
19
+ states.delete(moduleId);
20
+ }
9
21
  }
10
22
  export function getLifecycleState(moduleId, states) {
11
23
  return states.get(moduleId);
@@ -13,7 +25,7 @@ export function getLifecycleState(moduleId, states) {
13
25
  export function requireLifecycleState(moduleId, states) {
14
26
  const state = getLifecycleState(moduleId, states);
15
27
  if (!state)
16
- throw new Error(`No lifecycle state exists for module "${moduleId}".`);
28
+ throw new ModuleNotFoundError(moduleId);
17
29
  return state;
18
30
  }
19
31
  export function getAllLifecycleStates(states) {
@@ -29,13 +41,59 @@ export function isModuleStarted(moduleId, states) {
29
41
  export function isModuleDestroyed(moduleId, states) {
30
42
  return getLifecycleState(moduleId, states)?.phase === "destroyed";
31
43
  }
32
- export async function invokeLifecycleHook(module, hook, context) {
33
- const lifecycleModule = module;
34
- const handler = lifecycleModule[hook];
44
+ /**
45
+ * Maps each lifecycle step to the hook of the public Module
46
+ * contract (ModuleLifecycle) that the engine invokes for it.
47
+ */
48
+ const STEP_HOOKS = {
49
+ initialize: "onInitialize",
50
+ start: "onReady",
51
+ stop: "onShutdown",
52
+ destroy: "onDestroy",
53
+ };
54
+ /**
55
+ * Invokes the lifecycle hook for a step on a module.
56
+ *
57
+ * Only the canonical Module contract hooks are invoked:
58
+ *
59
+ * initialize → onInitialize
60
+ * start → onReady
61
+ * stop → onShutdown
62
+ * destroy → onDestroy
63
+ *
64
+ * Modules that do not implement a hook are skipped for that step.
65
+ *
66
+ * When `contextStorage` holds an active execution context (the
67
+ * runtime's, during bootstrap and shutdown), the hook runs inside a
68
+ * context derived from it: `module` is the module id, `operation`
69
+ * is the hook name, and `{ moduleId, phase }` is merged into the
70
+ * metadata. Everything the hook awaits observes that context.
71
+ */
72
+ export async function invokeLifecycleHook(module, step, context, contextStorage, phase = STEP_PHASES[step]) {
73
+ const hookName = STEP_HOOKS[step];
74
+ const handler = module[hookName];
35
75
  if (typeof handler !== "function")
36
76
  return;
37
- await handler.call(module, context);
77
+ const invoke = () => handler.call(module, context);
78
+ if (contextStorage?.has()) {
79
+ await contextStorage.runDerived({
80
+ module: module.id,
81
+ operation: hookName,
82
+ metadata: { moduleId: module.id, phase },
83
+ }, invoke);
84
+ return;
85
+ }
86
+ await invoke();
38
87
  }
88
+ /**
89
+ * Active phase a module is in while each step's hook runs.
90
+ */
91
+ const STEP_PHASES = {
92
+ initialize: "initializing",
93
+ start: "starting",
94
+ stop: "stopping",
95
+ destroy: "destroying",
96
+ };
39
97
  export function canModuleEnterPhase(moduleId, hook, states) {
40
98
  const state = getLifecycleState(moduleId, states);
41
99
  if (!state)
@@ -50,7 +108,9 @@ export function canModuleEnterPhase(moduleId, hook, states) {
50
108
  case "destroy":
51
109
  return (state.phase === "stopped" ||
52
110
  state.phase === "initialized" ||
53
- state.phase === "created");
111
+ state.phase === "created" ||
112
+ state.phase === "started" ||
113
+ state.phase === "failed");
54
114
  default:
55
115
  return false;
56
116
  }
@@ -68,9 +128,30 @@ export function setLifecycleState(moduleId, phase, states, error) {
68
128
  destroyedAt: phase === "destroyed" ? now : previous?.destroyedAt,
69
129
  }));
70
130
  }
71
- export async function executeLifecyclePhase(order, hook, activePhase, completedPhase, continueOnError, registry, loader, states) {
131
+ /**
132
+ * Phases that count as "already satisfied" for a hook: modules
133
+ * in these phases are silently skipped rather than reported.
134
+ */
135
+ const SATISFIED_PHASES = {
136
+ initialize: ["initialized", "starting", "started"],
137
+ start: ["started"],
138
+ stop: ["created", "initialized", "stopped", "destroying", "destroyed"],
139
+ destroy: ["destroyed"],
140
+ };
141
+ /**
142
+ * Phases a required dependency must be in before a dependent
143
+ * module may enter a forward phase.
144
+ */
145
+ const REQUIRED_DEPENDENCY_PHASES = {
146
+ initialize: ["initialized", "starting", "started"],
147
+ start: ["started"],
148
+ };
149
+ export async function executeLifecyclePhase(order, hook, activePhase, completedPhase, continueOnError, registry, loader, states, contextStorage) {
72
150
  const completed = [];
73
151
  const failed = [];
152
+ const skipped = [];
153
+ const blocked = new Set();
154
+ const requiredDependencyPhases = REQUIRED_DEPENDENCY_PHASES[hook];
74
155
  for (const moduleId of order) {
75
156
  const registration = registry.get(moduleId);
76
157
  if (!registration?.instance)
@@ -84,11 +165,49 @@ export async function executeLifecyclePhase(order, hook, activePhase, completedP
84
165
  throw new ModuleLifecycleError(moduleId, activePhase, new Error(`Module "${moduleId}" does not have a ModuleContext.`));
85
166
  continue;
86
167
  }
87
- if (!canModuleEnterPhase(moduleId, hook, states))
168
+ const currentPhase = getLifecycleState(moduleId, states)?.phase;
169
+ if (!canModuleEnterPhase(moduleId, hook, states)) {
170
+ if (currentPhase !== undefined &&
171
+ SATISFIED_PHASES[hook].includes(currentPhase)) {
172
+ continue;
173
+ }
174
+ skipped.push({
175
+ moduleId,
176
+ reason: `Module is in phase "${currentPhase ?? "unknown"}" and cannot enter ${hook}.`,
177
+ });
178
+ blocked.add(moduleId);
88
179
  continue;
180
+ }
181
+ /*
182
+ * Forward phases only run when every required dependency
183
+ * reached the requisite state. Modules whose dependencies
184
+ * failed (or were skipped) are skipped with a reason instead
185
+ * of being initialized against a broken dependency.
186
+ */
187
+ if (requiredDependencyPhases) {
188
+ const blockingDependency = registry
189
+ .getDependencies(moduleId)
190
+ .find((dependency) => {
191
+ if (dependency.optional)
192
+ return false;
193
+ if (blocked.has(dependency.id) || failed.includes(dependency.id))
194
+ return true;
195
+ const dependencyPhase = getLifecycleState(dependency.id, states)?.phase;
196
+ return (dependencyPhase === undefined ||
197
+ !requiredDependencyPhases.includes(dependencyPhase));
198
+ });
199
+ if (blockingDependency) {
200
+ skipped.push({
201
+ moduleId,
202
+ reason: `Dependency "${blockingDependency.id}" is not ready for ${hook}.`,
203
+ });
204
+ blocked.add(moduleId);
205
+ continue;
206
+ }
207
+ }
89
208
  setLifecycleState(moduleId, activePhase, states);
90
209
  try {
91
- await invokeLifecycleHook(module, hook, context);
210
+ await invokeLifecycleHook(module, hook, context, contextStorage, activePhase);
92
211
  setLifecycleState(moduleId, completedPhase, states);
93
212
  completed.push(moduleId);
94
213
  }
@@ -102,6 +221,7 @@ export async function executeLifecyclePhase(order, hook, activePhase, completedP
102
221
  return {
103
222
  completed: Object.freeze([...completed]),
104
223
  failed: Object.freeze([...failed]),
224
+ skipped: Object.freeze([...skipped]),
105
225
  };
106
226
  }
107
227
  //# sourceMappingURL=moduleLifecycle.stateMachine.js.map
@@ -1,5 +1,5 @@
1
- import type { ModuleId } from "../module.js";
2
- import type { ModuleContext } from "../moduleContext.context.js";
1
+ import type { ModuleId, ModuleLifecycle } from "../module.js";
2
+ import type { ContextStorage } from "../../context/provider/contextStorage.storage.js";
3
3
  /**
4
4
  * Lifecycle phases supported by the module system.
5
5
  */
@@ -16,34 +16,34 @@ export interface ModuleLifecycleState {
16
16
  readonly stoppedAt?: Date;
17
17
  readonly destroyedAt?: Date;
18
18
  }
19
+ /**
20
+ * Canonical lifecycle hook names of the public Module contract.
21
+ *
22
+ * The lifecycle engine invokes exactly these methods:
23
+ *
24
+ * initialize step → onInitialize
25
+ * start step → onReady
26
+ * stop step → onShutdown
27
+ * destroy step → onDestroy
28
+ */
29
+ export type ModuleLifecycleHookName = "onInitialize" | "onReady" | "onShutdown" | "onDestroy";
30
+ /**
31
+ * Lifecycle steps executed by the module lifecycle engine.
32
+ *
33
+ * Each step maps onto one ModuleLifecycleHookName; see
34
+ * ModuleLifecycleHookName for the mapping.
35
+ */
36
+ export type ModuleLifecycleStep = "initialize" | "start" | "stop" | "destroy";
19
37
  /**
20
38
  * Lifecycle hooks supported by a module.
21
39
  *
22
- * Modules can implement any subset of these hooks.
40
+ * @deprecated The module hook contract is ModuleLifecycle
41
+ * (onInitialize/onReady/onShutdown/onDestroy). This alias exists
42
+ * for source compatibility only; the legacy
43
+ * initialize/start/stop/destroy method names are never invoked
44
+ * by the lifecycle engine.
23
45
  */
24
- export interface ModuleLifecycleHooks {
25
- /**
26
- * Called before the module starts accepting work.
27
- */
28
- initialize?(context: ModuleContext): void | Promise<void>;
29
- /**
30
- * Called after all modules have initialized.
31
- *
32
- * This is useful when a module needs other modules to
33
- * already be initialized before it becomes active.
34
- */
35
- start?(context: ModuleContext): void | Promise<void>;
36
- /**
37
- * Called when the application begins shutting down.
38
- */
39
- stop?(context: ModuleContext): void | Promise<void>;
40
- /**
41
- * Called after the module has stopped.
42
- *
43
- * This is the place for final resource cleanup.
44
- */
45
- destroy?(context: ModuleContext): void | Promise<void>;
46
- }
46
+ export type ModuleLifecycleHooks = ModuleLifecycle;
47
47
  /**
48
48
  * Options controlling module lifecycle behavior.
49
49
  */
@@ -72,20 +72,70 @@ export interface ModuleLifecycleOptions {
72
72
  * Defaults to true.
73
73
  */
74
74
  readonly continueOnDestroyError?: boolean;
75
+ /**
76
+ * ContextStorage consulted before every hook invocation. When an
77
+ * execution context is active in it (the runtime establishes its
78
+ * RuntimeExecutionContext around bootstrap and shutdown), each
79
+ * hook runs in a context derived from it with
80
+ * `module`/`operation` set and `{ moduleId, phase }` merged into
81
+ * the metadata. When no context is active the hook is invoked
82
+ * directly.
83
+ *
84
+ * Defaults to getDefaultContextStorage(); pass the runtime's
85
+ * storage when injecting a custom one.
86
+ */
87
+ readonly contextStorage?: ContextStorage;
75
88
  }
76
- import { ModuleLifecycleError as BaseModuleLifecycleError } from "@zudojs/errors";
89
+ /**
90
+ * Per-call overrides accepted by the ModuleLifecycleManager phase
91
+ * methods (initialize/start/stop/destroy).
92
+ */
93
+ export interface ModuleLifecyclePhaseOptions {
94
+ /**
95
+ * Overrides the manager's continueOn*Error setting for this one
96
+ * phase run. The runtime passes its own startup/shutdown flags
97
+ * here so a hand-assembled manager cannot disagree with the
98
+ * runtime that drives it.
99
+ */
100
+ readonly continueOnError?: boolean;
101
+ }
102
+ import { ModuleOperationError } from "../moduleError/moduleError.lifecycle.js";
77
103
  /**
78
104
  * Error thrown when a module lifecycle operation fails.
105
+ *
106
+ * Part of the core module error taxonomy: it is a ModuleError
107
+ * carrying the phase-specific code (MODULE_INITIALIZATION_FAILED,
108
+ * MODULE_START_FAILED, ...), so callers can catch it by type or by
109
+ * code.
79
110
  */
80
- export declare class ModuleLifecycleError extends BaseModuleLifecycleError {
111
+ export declare class ModuleLifecycleError extends ModuleOperationError {
112
+ /**
113
+ * Errors encountered while rolling back already-completed
114
+ * modules after this failure. Best-effort: rollback itself
115
+ * never masks the original failure.
116
+ */
117
+ rollbackErrors?: readonly unknown[];
81
118
  constructor(moduleId: ModuleId, phase: ModuleLifecyclePhase, cause: unknown);
82
119
  }
120
+ /**
121
+ * Reason a module was skipped during a lifecycle phase.
122
+ */
123
+ export interface ModuleLifecycleSkip {
124
+ readonly moduleId: ModuleId;
125
+ readonly reason: string;
126
+ }
83
127
  /**
84
128
  * Result of a lifecycle operation.
85
129
  */
86
130
  export interface ModuleLifecycleResult {
87
131
  readonly completed: readonly ModuleId[];
88
132
  readonly failed: readonly ModuleId[];
133
+ /**
134
+ * Modules that could not participate in the phase, with the
135
+ * reason: their required dependencies failed or were skipped,
136
+ * or their current phase does not permit the transition.
137
+ */
138
+ readonly skipped: readonly ModuleLifecycleSkip[];
89
139
  }
90
140
  /**
91
141
  * Internal lifecycle state map.