@bluelibs/runner 5.4.0 → 5.5.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 (170) hide show
  1. package/README.md +23 -22
  2. package/dist/browser/index.cjs +5426 -2403
  3. package/dist/browser/index.cjs.map +1 -1
  4. package/dist/browser/index.mjs +5426 -2400
  5. package/dist/browser/index.mjs.map +1 -1
  6. package/dist/edge/index.cjs +5426 -2403
  7. package/dist/edge/index.cjs.map +1 -1
  8. package/dist/edge/index.mjs +5426 -2400
  9. package/dist/edge/index.mjs.map +1 -1
  10. package/dist/node/node.cjs +7208 -6935
  11. package/dist/node/node.cjs.map +1 -1
  12. package/dist/node/node.mjs +7167 -6936
  13. package/dist/node/node.mjs.map +1 -1
  14. package/dist/types/definers/builders/asyncContext/fluent-builder.interface.d.ts +4 -0
  15. package/dist/types/definers/builders/error/fluent-builder.interface.d.ts +8 -1
  16. package/dist/types/definers/builders/error/index.d.ts +1 -0
  17. package/dist/types/definers/builders/error/types.d.ts +2 -1
  18. package/dist/types/definers/builders/error/utils.d.ts +1 -0
  19. package/dist/types/definers/builders/event/fluent-builder.interface.d.ts +10 -0
  20. package/dist/types/definers/builders/hook/fluent-builder.interface.d.ts +3 -0
  21. package/dist/types/definers/builders/hook/types.d.ts +3 -0
  22. package/dist/types/definers/builders/middleware/index.d.ts +4 -2
  23. package/dist/types/definers/builders/middleware/resource.interface.d.ts +7 -0
  24. package/dist/types/definers/builders/middleware/task.interface.d.ts +7 -0
  25. package/dist/types/definers/builders/middleware/types.d.ts +22 -3
  26. package/dist/types/definers/builders/middleware/utils.d.ts +2 -0
  27. package/dist/types/definers/builders/override/hook.d.ts +3 -0
  28. package/dist/types/definers/builders/override/index.d.ts +5 -0
  29. package/dist/types/definers/builders/resource/fluent-builder.interface.d.ts +15 -0
  30. package/dist/types/definers/builders/resource/index.d.ts +0 -1
  31. package/dist/types/definers/builders/resource/types.d.ts +1 -0
  32. package/dist/types/definers/builders/tag/fluent-builder.interface.d.ts +4 -0
  33. package/dist/types/definers/builders/tag/utils.d.ts +1 -0
  34. package/dist/types/definers/builders/task/fluent-builder.interface.d.ts +4 -0
  35. package/dist/types/definers/builders/task/index.d.ts +2 -2
  36. package/dist/types/definers/builders/utils.d.ts +6 -1
  37. package/dist/types/definers/defineError.d.ts +12 -2
  38. package/dist/types/definers/resourceFork.d.ts +3 -1
  39. package/dist/types/definers/tools.d.ts +12 -12
  40. package/dist/types/errors/domain-error-ids.d.ts +44 -0
  41. package/dist/types/errors/domain-runtime.errors.d.ts +136 -0
  42. package/dist/types/errors/foundation.errors.d.ts +125 -0
  43. package/dist/types/errors/generic.errors.d.ts +1 -0
  44. package/dist/types/errors/model-runtime.errors.d.ts +20 -0
  45. package/dist/types/errors.d.ts +5 -73
  46. package/dist/types/globals/cron/cron-parser.d.ts +4 -0
  47. package/dist/types/globals/cron/cron.errors.d.ts +8 -0
  48. package/dist/types/globals/cron/cron.resource.d.ts +12 -0
  49. package/dist/types/globals/cron/cron.tag.d.ts +2 -0
  50. package/dist/types/globals/cron/types.d.ts +25 -0
  51. package/dist/types/globals/globalMiddleware.d.ts +87 -13
  52. package/dist/types/globals/globalResources.d.ts +110 -24
  53. package/dist/types/globals/globalTags.d.ts +10 -2
  54. package/dist/types/globals/middleware/cache.middleware.d.ts +173 -13
  55. package/dist/types/globals/middleware/circuitBreaker.middleware.d.ts +5 -1
  56. package/dist/types/globals/middleware/concurrency.middleware.d.ts +3 -0
  57. package/dist/types/globals/middleware/fallback.middleware.d.ts +8 -1
  58. package/dist/types/globals/middleware/rateLimit.middleware.d.ts +4 -1
  59. package/dist/types/globals/middleware/retry.middleware.d.ts +5 -0
  60. package/dist/types/globals/middleware/temporal.middleware.d.ts +19 -19
  61. package/dist/types/globals/middleware/timeout.middleware.d.ts +4 -1
  62. package/dist/types/globals/resources/eventManager.resource.d.ts +2 -0
  63. package/dist/types/globals/resources/logger.resource.d.ts +2 -0
  64. package/dist/types/globals/resources/middlewareManager.resource.d.ts +2 -0
  65. package/dist/types/globals/resources/queue.resource.d.ts +2 -0
  66. package/dist/types/globals/resources/runtime.resource.d.ts +2 -0
  67. package/dist/types/globals/resources/serializer.resource.d.ts +2 -0
  68. package/dist/types/globals/resources/store.resource.d.ts +2 -0
  69. package/dist/types/globals/resources/taskRunner.resource.d.ts +2 -0
  70. package/dist/types/globals/resources/tunnel/plan.d.ts +6 -3
  71. package/dist/types/globals/resources/tunnel/tunnel.policy.tag.d.ts +2 -0
  72. package/dist/types/globals/resources/tunnel/types.d.ts +7 -2
  73. package/dist/types/globals/types.d.ts +6 -1
  74. package/dist/types/models/BuiltinsRegistry.d.ts +2 -0
  75. package/dist/types/models/DependencyProcessor.d.ts +26 -5
  76. package/dist/types/models/EventManager.d.ts +9 -9
  77. package/dist/types/models/LogPrinter.d.ts +5 -5
  78. package/dist/types/models/Logger.d.ts +16 -16
  79. package/dist/types/models/MiddlewareManager.d.ts +18 -0
  80. package/dist/types/models/OverrideManager.d.ts +4 -1
  81. package/dist/types/models/Queue.d.ts +2 -0
  82. package/dist/types/models/RunResult.d.ts +290 -26
  83. package/dist/types/models/Store.d.ts +20 -3
  84. package/dist/types/models/StoreRegistry.d.ts +2 -0
  85. package/dist/types/models/StoreValidator.d.ts +2 -0
  86. package/dist/types/models/TaskRunner.d.ts +3 -1
  87. package/dist/types/models/VisibilityTracker.d.ts +75 -0
  88. package/dist/types/models/dependency-processor/DependencyExtractor.d.ts +23 -0
  89. package/dist/types/models/dependency-processor/HookEventBuffer.d.ts +15 -0
  90. package/dist/types/models/dependency-processor/ResourceScheduler.d.ts +10 -0
  91. package/dist/types/models/event/EmissionExecutor.d.ts +5 -4
  92. package/dist/types/models/event/ListenerRegistry.d.ts +2 -0
  93. package/dist/types/models/index.d.ts +1 -3
  94. package/dist/types/models/middleware/InterceptorRegistry.d.ts +13 -4
  95. package/dist/types/models/middleware/ResourceMiddlewareComposer.d.ts +1 -0
  96. package/dist/types/models/middleware/ValidationHelper.d.ts +3 -6
  97. package/dist/types/models/utils/disposeOrder.d.ts +5 -1
  98. package/dist/types/models/utils/resourceDependencyIds.d.ts +1 -0
  99. package/dist/types/node/durable/bus/MemoryEventBus.d.ts +10 -1
  100. package/dist/types/node/durable/bus/NoopEventBus.d.ts +1 -1
  101. package/dist/types/node/durable/bus/RedisEventBus.d.ts +8 -2
  102. package/dist/types/node/durable/core/CronParser.d.ts +2 -13
  103. package/dist/types/node/durable/core/DurableResource.d.ts +14 -32
  104. package/dist/types/node/durable/core/DurableService.d.ts +1 -0
  105. package/dist/types/node/durable/core/DurableWorker.d.ts +4 -2
  106. package/dist/types/node/durable/core/createRunnerDurableRuntime.d.ts +2 -0
  107. package/dist/types/node/durable/core/interfaces/bus.d.ts +1 -1
  108. package/dist/types/node/durable/core/interfaces/resource.d.ts +61 -0
  109. package/dist/types/node/durable/core/interfaces/service.d.ts +2 -0
  110. package/dist/types/node/durable/core/interfaces/store.d.ts +5 -0
  111. package/dist/types/node/durable/core/managers/ExecutionManager.d.ts +1 -0
  112. package/dist/types/node/durable/core/managers/PollingManager.d.ts +3 -1
  113. package/dist/types/node/durable/core/resource.d.ts +4 -3
  114. package/dist/types/node/durable/core/utils.d.ts +11 -1
  115. package/dist/types/node/durable/queue/RabbitMQQueue.d.ts +4 -0
  116. package/dist/types/node/durable/resources/memoryDurableResource.d.ts +5 -3
  117. package/dist/types/node/durable/resources/redisDurableResource.d.ts +5 -3
  118. package/dist/types/node/durable/store/MemoryStore.d.ts +2 -0
  119. package/dist/types/node/durable/store/RedisStore.d.ts +1 -0
  120. package/dist/types/node/exposure/allowList.d.ts +2 -1
  121. package/dist/types/node/exposure/handlers/contextWrapper.d.ts +6 -2
  122. package/dist/types/node/exposure/handlers/errorHandlers.d.ts +1 -0
  123. package/dist/types/node/exposure/handlers/eventHandler.d.ts +1 -0
  124. package/dist/types/node/exposure/handlers/taskHandler.d.ts +3 -1
  125. package/dist/types/node/exposure/logging.d.ts +1 -0
  126. package/dist/types/node/exposure/requestHandlers.d.ts +3 -1
  127. package/dist/types/node/exposure/requestIdentity.d.ts +3 -0
  128. package/dist/types/node/exposure/resource.d.ts +4 -4
  129. package/dist/types/node/exposure/resourceTypes.d.ts +6 -0
  130. package/dist/types/node/exposure/serverLifecycle.d.ts +2 -0
  131. package/dist/types/node/node.d.ts +1 -1
  132. package/dist/types/node/tunnel/allowlist.d.ts +10 -1
  133. package/dist/types/platform/adapters/browser.d.ts +1 -1
  134. package/dist/types/platform/adapters/node-als.d.ts +1 -1
  135. package/dist/types/platform/adapters/node.d.ts +1 -1
  136. package/dist/types/platform/adapters/universal-generic.d.ts +2 -2
  137. package/dist/types/platform/adapters/universal.d.ts +1 -1
  138. package/dist/types/platform/index.d.ts +2 -2
  139. package/dist/types/platform/types.d.ts +1 -1
  140. package/dist/types/public.d.ts +374 -20
  141. package/dist/types/run.d.ts +17 -1
  142. package/dist/types/serializer/Serializer.d.ts +1 -41
  143. package/dist/types/serializer/errors.d.ts +8 -0
  144. package/dist/types/serializer/marker-key-escapes.d.ts +2 -0
  145. package/dist/types/serializer/serialize-utils.d.ts +1 -1
  146. package/dist/types/serializer/type-registry.d.ts +0 -1
  147. package/dist/types/serializer/types.d.ts +7 -6
  148. package/dist/types/testing.d.ts +1 -0
  149. package/dist/types/tools/getAllThrows.d.ts +13 -0
  150. package/dist/types/tools/throws.d.ts +1 -1
  151. package/dist/types/types/error.d.ts +25 -2
  152. package/dist/types/types/event.d.ts +35 -0
  153. package/dist/types/types/hook.d.ts +8 -0
  154. package/dist/types/types/resource.d.ts +13 -1
  155. package/dist/types/types/resourceMiddleware.d.ts +8 -0
  156. package/dist/types/types/runner.d.ts +56 -0
  157. package/dist/types/types/storeTypes.d.ts +5 -1
  158. package/dist/types/types/tag.d.ts +1 -0
  159. package/dist/types/types/tagged.d.ts +2 -2
  160. package/dist/types/types/task.d.ts +2 -2
  161. package/dist/types/types/taskMiddleware.d.ts +8 -0
  162. package/dist/types/types/utilities.d.ts +25 -3
  163. package/dist/ui/assets/{index-Bo7Gi6Vq.js → index-B4lZaXFJ.js} +48 -48
  164. package/dist/ui/index.html +1 -1
  165. package/dist/universal/index.cjs +5426 -2403
  166. package/dist/universal/index.cjs.map +1 -1
  167. package/dist/universal/index.mjs +5426 -2400
  168. package/dist/universal/index.mjs.map +1 -1
  169. package/package.json +18 -14
  170. package/readmes/AI.md +147 -42
@@ -1,41 +1,305 @@
1
- import { DependencyMapType, IEvent, ITask } from "../defs";
2
- import { IResource } from "../defs";
3
- import { EventManager } from "./EventManager";
4
- import { Logger } from "./Logger";
5
- import { Store } from "./Store";
6
- import { TaskRunner } from "./TaskRunner";
7
- export declare class RunResult<V> {
8
- readonly value: V;
1
+ import { IEvent, IEventEmitOptions, IEventEmitReport, IResource, ITask } from "../defs";
2
+ import { IRuntime } from "../types/runner";
3
+ import type { TaskCallOptions } from "../types/utilities";
4
+ import type { EventManager } from "./EventManager";
5
+ import type { Logger } from "./Logger";
6
+ import type { Store } from "./Store";
7
+ import type { TaskRunner } from "./TaskRunner";
8
+ /**
9
+ * Options for configuring lazy resource loading behavior.
10
+ * Used to enable on-demand resource initialization to improve startup time.
11
+ */
12
+ type RunResultLazyOptions = {
13
+ /**
14
+ * Whether lazy loading mode is enabled.
15
+ * When true, resources not used at startup are not initialized until accessed.
16
+ */
17
+ lazyMode?: boolean;
18
+ /**
19
+ * Set of resource IDs that were not initialized at startup.
20
+ * These resources require lazy loading to be accessed.
21
+ */
22
+ startupUnusedResourceIds?: ReadonlySet<string>;
23
+ /**
24
+ * Custom loader function for lazy resource initialization.
25
+ * Called when accessing a resource that hasn't been initialized yet.
26
+ */
27
+ lazyResourceLoader?: <T>(resourceId: string) => Promise<T>;
28
+ };
29
+ /**
30
+ * RunResult represents the runtime instance after executing `run(root)`.
31
+ * It provides access to tasks, events, resources, and lifecycle management.
32
+ *
33
+ * Key features:
34
+ * - Task execution via `runTask()`
35
+ * - Event emission via `emitEvent()`
36
+ * - Resource access via `getResourceValue()` / `getLazyResourceValue()`
37
+ * - Root access via `getRootValue()`, `getRootConfig()`, `getRootId()`
38
+ * - Disposal via `dispose()`
39
+ *
40
+ * @example
41
+ * const runtime = await run(app);
42
+ * const result = await runtime.runTask(myTask, { input: "data" });
43
+ * await runtime.dispose();
44
+ */
45
+ export declare class RunResult<V> implements IRuntime<V> {
46
+ #private;
47
+ /**
48
+ * Framework logger for diagnostics and debugging.
49
+ * Use this for logging within tasks or hooks.
50
+ */
9
51
  readonly logger: Logger;
52
+ /**
53
+ * Central store containing all registered definitions.
54
+ * Provides access to tasks, events, resources, and their metadata.
55
+ */
10
56
  readonly store: Store;
57
+ /**
58
+ * Event manager for emitting events and triggering hooks.
59
+ * Handles both sync and async event propagation.
60
+ */
11
61
  private readonly eventManager;
62
+ /**
63
+ * Task runner that executes tasks with middleware pipeline.
64
+ * Handles dependency injection, validation, and error handling.
65
+ */
12
66
  private readonly taskRunner;
67
+ /**
68
+ * Function to call during disposal.
69
+ * Disposes all resources in reverse initialization order.
70
+ */
13
71
  private readonly disposeFn;
14
- constructor(value: V, logger: Logger, store: Store, eventManager: EventManager, taskRunner: TaskRunner, disposeFn: () => Promise<void>);
15
72
  /**
16
- * Run a task within the context of the run result.
17
- * @param task - The task to run.
18
- * @param args - The arguments to pass to the task.
19
- * @returns The result of the task.
73
+ * Options for lazy resource loading mode.
74
+ * When enabled, unused resources are not initialized until accessed.
75
+ */
76
+ private lazyOptions;
77
+ /**
78
+ * Creates a new RunResult instance.
79
+ *
80
+ * @param logger - The framework logger for runtime diagnostics
81
+ * @param store - The central store containing all registered tasks, events, resources
82
+ * @param eventManager - Handles event emission and hook execution
83
+ * @param taskRunner - Executes tasks with middleware and validation
84
+ * @param disposeFn - Callback to clean up all resources during disposal
85
+ */
86
+ constructor(
87
+ /**
88
+ * Framework logger for diagnostics and debugging.
89
+ * Use this for logging within tasks or hooks.
90
+ */
91
+ logger: Logger,
92
+ /**
93
+ * Central store containing all registered definitions.
94
+ * Provides access to tasks, events, resources, and their metadata.
95
+ */
96
+ store: Store,
97
+ /**
98
+ * Event manager for emitting events and triggering hooks.
99
+ * Handles both sync and async event propagation.
100
+ */
101
+ eventManager: EventManager,
102
+ /**
103
+ * Task runner that executes tasks with middleware pipeline.
104
+ * Handles dependency injection, validation, and error handling.
105
+ */
106
+ taskRunner: TaskRunner,
107
+ /**
108
+ * Function to call during disposal.
109
+ * Disposes all resources in reverse initialization order.
110
+ */
111
+ disposeFn: () => Promise<void>);
112
+ /**
113
+ * Returns the root value initialized by the root resource.
114
+ * Only available after the root resource has been initialized.
115
+ */
116
+ get value(): V;
117
+ /**
118
+ * Ensures the runtime is active and can accept operations.
119
+ * Throws if the runtime has been disposed or is currently disposing.
120
+ * @internal
121
+ */
122
+ private ensureRuntimeIsActive;
123
+ /**
124
+ * Retrieves the root resource from the store.
125
+ * Throws if the root hasn't been set (e.g., during early access).
126
+ * @internal
127
+ */
128
+ private getRootOrThrow;
129
+ /**
130
+ * Configures lazy loading options for resources.
131
+ * Used to enable on-demand resource initialization.
132
+ * @param options - Lazy mode configuration
133
+ */
134
+ setLazyOptions(options: RunResultLazyOptions): void;
135
+ /**
136
+ * Sets the root value after the root resource initializes.
137
+ * @param value - The initialized root value
138
+ */
139
+ setValue(value: V | undefined): void;
140
+ /**
141
+ * Executes a registered task within the runtime context.
142
+ *
143
+ * The task runs through its full middleware pipeline including:
144
+ * - Input validation (via inputSchema)
145
+ - Middleware (retry, cache, timeout, etc.)
146
+ - The task's core logic
147
+ - Result validation (via resultSchema)
148
+ *
149
+ * @example
150
+ * // Run with task definition
151
+ * const result = await runtime.runTask(createUser, { name: "Alice" });
152
+ *
153
+ * // Run with options for journal forwarding
154
+ * const result = await runtime.runTask(greet, undefined, { journal });
155
+ */
156
+ runTask: <TTask extends ITask<any, Promise<any>, any> | string>(task: TTask, ...args: TTask extends ITask<infer I, any, any> ? I extends undefined | void ? [input?: I, options?: TaskCallOptions] : [input: I, options?: TaskCallOptions] : [input?: unknown, options?: TaskCallOptions]) => TTask extends ITask<any, infer O, any> ? O : Promise<any>;
157
+ /**
158
+ * Emits an event to trigger all registered hooks listening for it.
159
+ *
160
+ * Events are emitted synchronously or asynchronously depending on hook configuration.
161
+ * Hooks execute in order based on their `order()` value (lower runs first).
162
+ *
163
+ * @param event - The event definition or event ID string to emit
164
+ * @param payload - The event payload data
165
+ * @param options - Emission options (failureMode, throwOnError, report)
166
+ * @returns Promise<void> by default, or IEventEmitReport if report: true
167
+ *
168
+ * @example
169
+ * // Basic emission
170
+ * await runtime.emitEvent(userRegistered, { userId: "123", email: "a@b.com" });
171
+ *
172
+ * // With report for hook failure tracking
173
+ * const report = await runtime.emitEvent(notify, undefined, { report: true });
174
+ * if (report.failedListeners.length > 0) {
175
+ * console.error("Failed hooks:", report.failedListeners);
176
+ * }
177
+ */
178
+ emitEvent: {
179
+ <P>(event: IEvent<P> | string, payload?: P extends undefined | void ? undefined : P): Promise<void>;
180
+ <P>(event: IEvent<P> | string, payload: P extends undefined | void ? undefined : P, options: IEventEmitOptions & {
181
+ report: true;
182
+ }): Promise<IEventEmitReport>;
183
+ <P>(event: IEvent<P> | string, payload?: P extends undefined | void ? undefined : P, options?: IEventEmitOptions): Promise<void | IEventEmitReport>;
184
+ };
185
+ /**
186
+ * Synchronously retrieves the initialized value of a resource.
187
+ *
188
+ * The resource must have been initialized (either at startup or via lazy loading).
189
+ * For resources not initialized at startup, use `getLazyResourceValue()` instead.
190
+ *
191
+ * @param resource - The resource definition or resource ID string
192
+ * @returns The initialized value of the resource (unwrapped if Promise-based)
193
+ * @throws RuntimeError if resource not found, not initialized, or runtime disposed
194
+ *
195
+ * @example
196
+ * // Get initialized resource
197
+ * const db = runtime.getResourceValue(database);
198
+ * const config = runtime.getResourceValue("app.config");
199
+ */
200
+ getResourceValue: <Output extends Promise<any>>(
201
+ /**
202
+ * The resource to retrieve. Can be:
203
+ * - A resource definition object (IResource)
204
+ * - A resource ID string (for dynamic lookup)
205
+ */
206
+ resource: string | IResource<any, Output, any, any, any>) => Output extends Promise<infer U> ? U : Output;
207
+ /**
208
+ * Initializes (if not already) and returns the value of a resource on-demand.
209
+ *
210
+ * This method is useful when:
211
+ * - Lazy loading is enabled and the resource wasn't initialized at startup
212
+ * - You need to access a resource that may not have been loaded yet
213
+ * - You want to ensure initialization happens before access
214
+ *
215
+ * @param resource - The resource definition or resource ID string
216
+ * @returns The initialized value of the resource (unwrapped if Promise-based)
217
+ * @throws RuntimeError if resource not found or runtime disposed
218
+ *
219
+ * @example
220
+ * // Lazy-load a resource on demand
221
+ * const heavyService = await runtime.getLazyResourceValue(heavyService);
222
+ */
223
+ getLazyResourceValue: <Output extends Promise<any>>(
224
+ /**
225
+ * The resource to retrieve. Can be:
226
+ * - A resource definition object (IResource)
227
+ * - A resource ID string (for dynamic lookup)
228
+ */
229
+ resource: string | IResource<any, Output, any, any, any>) => Promise<Output extends Promise<infer U> ? U : Output>;
230
+ /**
231
+ * Retrieves the configuration that was passed to a resource.
232
+ *
233
+ * This returns the config object (the input), not the initialized value.
234
+ * Use `getResourceValue()` to get the initialized value.
235
+ *
236
+ * @param resource - The resource definition or resource ID string
237
+ * @returns The config object passed when registering the resource
238
+ * @throws RuntimeError if resource not found or runtime disposed
239
+ *
240
+ * @example
241
+ * const config = runtime.getResourceConfig(server);
242
+ * // config = { port: 3000 }
243
+ */
244
+ getResourceConfig: <Config>(
245
+ /**
246
+ * The resource to retrieve config from. Can be:
247
+ * - A resource definition object (IResource)
248
+ * - A resource ID string (for dynamic lookup)
249
+ */
250
+ resource: string | IResource<Config, any, any, any, any>) => Config;
251
+ /**
252
+ * Returns the ID of the root resource.
253
+ * @returns The root resource identifier
254
+ *
255
+ * @example
256
+ * const rootId = runtime.getRootId(); // "app"
257
+ */
258
+ getRootId: () => string;
259
+ /**
260
+ * Returns the configuration passed to the root resource.
261
+ * @returns The root resource configuration
262
+ *
263
+ * @example
264
+ * const config = runtime.getRootConfig<AppConfig>();
20
265
  */
21
- runTask: <I = undefined, O extends Promise<any> = any, D extends DependencyMapType = DependencyMapType>(task: ITask<I, O, D> | string, ...args: I extends undefined | void ? [] : [I]) => Promise<O | undefined>;
266
+ getRootConfig: <Config = unknown>() => Config;
22
267
  /**
23
- * Emit an event within the context of the run result.
24
- * @param event - The event to emit.
25
- * @param payload - The payload to emit.
268
+ * Returns the initialized value of the root resource.
269
+ *
270
+ * This is the value returned by the root resource's `init` function.
271
+ * The root must have been fully initialized before calling this.
272
+ *
273
+ * @returns The root resource's initialized value
274
+ * @throws RuntimeError if root hasn't been initialized yet
275
+ *
276
+ * @example
277
+ * const app = runtime.getRootValue<App>();
26
278
  */
27
- emitEvent: <P>(event: IEvent<P> | string, payload?: P extends undefined | void ? undefined : P) => Promise<void>;
279
+ getRootValue: <Value = unknown>() => Value;
28
280
  /**
29
- * Get the value of a resource from the run result.
30
- * @param resource - The resource to get the value of.
31
- * @returns The value of the resource.
281
+ * Extracts the resource ID from a resource definition or string.
282
+ * @internal
32
283
  */
33
- getResourceValue: <Output extends Promise<any>>(resource: string | IResource<any, Output, any, any, any>) => Output extends Promise<infer U> ? U : Output;
284
+ private getResourceId;
34
285
  /**
35
- * Get the config of a resource from the run result.
36
- * @param resource - The resource to get the config of.
37
- * @returns The config passed for the resource.
286
+ * Disposes the runtime and all registered resources.
287
+ *
288
+ * Disposal executes in reverse initialization order:
289
+ * 1. All resource `dispose` methods are called
290
+ * 2. Event listeners are cleared
291
+ * 3. Async contexts are reset
292
+ *
293
+ * After disposal, any further operations will throw.
294
+ * Safe to call multiple times (subsequent calls return immediately).
295
+ *
296
+ * @returns Promise that resolves when disposal is complete
297
+ * @throws RuntimeError if called during bootstrap phase
298
+ *
299
+ * @example
300
+ * await runtime.dispose();
301
+ * // All resources cleaned up, runtime is now inactive
38
302
  */
39
- getResourceConfig: <Config>(resource: string | IResource<Config, any, any, any, any>) => Config;
40
303
  dispose: () => Promise<void>;
41
304
  }
305
+ export {};
@@ -1,4 +1,4 @@
1
- import { IResource, RegisterableItems, ITag, AnyTask, ITaskMiddleware, IResourceMiddleware, TaggedTask, TaggedResource, AnyResource } from "../defs";
1
+ import { IResource, RegisterableItems, ITag, AnyTask, TaggedTask, TaggedResource, AnyResource } from "../defs";
2
2
  import { EventManager } from "./EventManager";
3
3
  import { Logger } from "./Logger";
4
4
  import { ResourceStoreElementType, TaskStoreElementType, EventStoreElementType } from "../types/storeTypes";
@@ -6,6 +6,8 @@ import { TaskRunner } from "./TaskRunner";
6
6
  import { OnUnhandledError } from "./UnhandledError";
7
7
  import { MiddlewareManager } from "./MiddlewareManager";
8
8
  import { RunnerMode } from "../types/runner";
9
+ import { RunResult } from "./RunResult";
10
+ import type { ITask } from "../types/task";
9
11
  export type { ResourceStoreElementType, TaskStoreElementType, EventStoreElementType, };
10
12
  /**
11
13
  * Store class which is used to store all the resources, tasks, middleware and events.
@@ -22,6 +24,7 @@ export declare class Store {
22
24
  private taskRunner?;
23
25
  private middlewareManager;
24
26
  private readonly initializedResourceIds;
27
+ private preferInitOrderDisposal;
25
28
  mode: RunnerMode;
26
29
  constructor(eventManager: EventManager, logger: Logger, onUnhandledError: OnUnhandledError, mode?: RunnerMode);
27
30
  get tasks(): import("..").LockableMap<string, TaskStoreElementType>;
@@ -33,24 +36,31 @@ export declare class Store {
33
36
  get taskMiddlewares(): import("..").LockableMap<string, import("..").TaskMiddlewareStoreElementType>;
34
37
  get resourceMiddlewares(): import("..").LockableMap<string, import("..").ResourceMiddlewareStoreElementType>;
35
38
  get tags(): import("..").LockableMap<string, ITag<void, void, void>>;
36
- get overrides(): Map<string, IResourceMiddleware<any, void, void, any> | import("..").ITask<any, any, {}, any, import("..").TagType[], import("..").TaskMiddlewareAttachmentType[]> | import("..").IHook<{}, any, any> | IResource<void, Promise<any>, any, any, any, import("..").TagType[], import("..").ResourceMiddlewareAttachmentType[]> | ITaskMiddleware<any, void, void, any> | import("..").IResourceWithConfig<any, Promise<any>, any, any, any, import("..").TagType[], IResourceMiddleware<any, void, void, any>[]>>;
39
+ get overrides(): Map<string, import("..").IResourceMiddleware<any, void, void, any> | import("..").IResourceWithConfig<any, Promise<any>, any, any, any, import("..").TagType[], import("..").IResourceMiddleware<any, void, void, any>[]> | ITask<any, Promise<unknown>, {}, any, import("..").TagType[], import("..").TaskMiddlewareAttachmentType[]> | import("..").IHook<{}, any, any> | IResource<void, Promise<any>, any, any, any, import("..").TagType[], import("..").ResourceMiddlewareAttachmentType[]> | import("..").ITaskMiddleware<any, void, void, any>>;
37
40
  get overrideRequests(): Set<{
38
41
  source: string;
39
42
  override: RegisterableItems;
40
43
  }>;
41
44
  getMiddlewareManager(): MiddlewareManager;
45
+ /**
46
+ * Checks whether a registered item is visible to a consumer id under the
47
+ * current exports visibility model.
48
+ */
49
+ isItemVisibleToConsumer(targetId: string, consumerId: string): boolean;
42
50
  get isLocked(): boolean;
43
51
  lock(): void;
44
52
  checkLock(): void;
45
53
  private registerGlobalComponents;
46
54
  setTaskRunner(taskRunner: TaskRunner): void;
55
+ setPreferInitOrderDisposal(prefer: boolean): void;
47
56
  private setupRootResource;
48
57
  validateDependencyGraph(): void;
49
58
  validateEventEmissionGraph(): void;
50
- initializeStore(root: IResource<any, any, any, any, any>, config: unknown): void;
59
+ initializeStore(root: IResource<any, any, any, any, any>, config: unknown, runtimeResult: RunResult<unknown>): void;
51
60
  dispose(): Promise<void>;
52
61
  recordResourceInitialized(resourceId: string): void;
53
62
  private getResourcesInDisposeOrder;
63
+ private clearRuntimeStateAfterDispose;
54
64
  /**
55
65
  * Internal, avoid using this method directly.
56
66
  */
@@ -75,4 +85,11 @@ export declare class Store {
75
85
  */
76
86
  getResourcesWithTag<TTag extends ITag<any, any, any>>(tag: TTag): TaggedResource<TTag>[];
77
87
  getResourcesWithTag(tag: string): AnyResource[];
88
+ /**
89
+ * Returns all error ids declared across a task or resource and its full
90
+ * dependency chain: own throws, middleware throws (local + everywhere),
91
+ * resource dependency throws, and — for tasks — hook throws on events
92
+ * the task can emit. Deduplicated.
93
+ */
94
+ getAllThrows(target: ITask<any, any, any, any, any, any> | IResource<any, any, any, any>): readonly string[];
78
95
  }
@@ -5,6 +5,7 @@ import { Store } from "./Store";
5
5
  import { IErrorHelper } from "../types/error";
6
6
  import type { IAsyncContext } from "../types/asyncContext";
7
7
  import { LockableMap } from "../tools/LockableMap";
8
+ import { VisibilityTracker } from "./VisibilityTracker";
8
9
  type StoringMode = "normal" | "override";
9
10
  export declare class StoreRegistry {
10
11
  protected readonly store: Store;
@@ -17,6 +18,7 @@ export declare class StoreRegistry {
17
18
  tags: LockableMap<string, ITag<void, void, void>>;
18
19
  asyncContexts: LockableMap<string, IAsyncContext<any>>;
19
20
  errors: LockableMap<string, IErrorHelper<any>>;
21
+ readonly visibilityTracker: VisibilityTracker;
20
22
  private validator;
21
23
  constructor(store: Store);
22
24
  getValidator(): StoreValidator;
@@ -4,5 +4,7 @@ export declare class StoreValidator {
4
4
  constructor(registry: StoreRegistry);
5
5
  checkIfIDExists(id: string): void | never;
6
6
  runSanityChecks(): void;
7
+ private getTaggableEntries;
8
+ private ensureTagIdsAreUniquePerDefinition;
7
9
  ensureAllTagsUsedAreRegistered(): void;
8
10
  }
@@ -4,11 +4,12 @@ import { Store } from "./Store";
4
4
  import { Logger } from "./Logger";
5
5
  import type { ExecutionJournal } from "../types/executionJournal";
6
6
  import type { TaskCallOptions } from "../types/utilities";
7
+ type CachedTaskRunner = (input: unknown, journal?: ExecutionJournal) => Promise<unknown>;
7
8
  export declare class TaskRunner {
8
9
  protected readonly store: Store;
9
10
  protected readonly eventManager: EventManager;
10
11
  protected readonly logger: Logger;
11
- protected readonly runnerStore: Map<string | symbol, (input: any, journal?: ExecutionJournal) => Promise<any>>;
12
+ protected readonly runnerStore: Map<string | symbol, CachedTaskRunner>;
12
13
  constructor(store: Store, eventManager: EventManager, logger: Logger);
13
14
  private readonly middlewareManager;
14
15
  /**
@@ -26,3 +27,4 @@ export declare class TaskRunner {
26
27
  */
27
28
  protected createRunnerWithMiddleware<TInput, TOutput extends Promise<any>, TDeps extends DependencyMapType>(task: ITask<TInput, TOutput, TDeps>): (input: TInput, parentJournal?: ExecutionJournal) => Promise<Awaited<TOutput>>;
28
29
  }
30
+ export {};
@@ -0,0 +1,75 @@
1
+ import { RegisterableItems } from "../defs";
2
+ import { StoreRegistry } from "./StoreRegistry";
3
+ /**
4
+ * Tracks which resource owns (registered) each item and which items
5
+ * are exported by resources that declare an exports list.
6
+ *
7
+ * Ownership is established during registration: when resource R calls
8
+ * `.register([item])`, item is "owned" by R.
9
+ *
10
+ * When R declares `.exports([subset])`, only those items are visible
11
+ * to items outside R's registration subtree.
12
+ */
13
+ export declare class VisibilityTracker {
14
+ /**
15
+ * Maps item id → id of the resource that directly registered it.
16
+ * Items registered by the root resource have the root's id as owner.
17
+ */
18
+ private readonly ownership;
19
+ /**
20
+ * For each resource that declares exports: resource id → Set of
21
+ * exported item ids. Resources without `.exports()` are absent
22
+ * from this map (meaning "everything is public").
23
+ */
24
+ private readonly exportSets;
25
+ /**
26
+ * Maps resource id → set of all item ids in its registration subtree
27
+ * (including items registered by nested child resources).
28
+ */
29
+ private readonly subtrees;
30
+ /**
31
+ * Records ownership when a resource registers an item.
32
+ */
33
+ recordOwnership(ownerResourceId: string, item: RegisterableItems): void;
34
+ /**
35
+ * Records the export set for a resource that declares `.exports()`.
36
+ */
37
+ recordExports(resourceId: string, exports: Array<RegisterableItems>): void;
38
+ /**
39
+ * Checks whether `consumerId` can access `targetId`.
40
+ *
41
+ * An item is accessible if:
42
+ * 1. The target's owner has no exports list (everything is public), OR
43
+ * 2. The consumer is inside the same registration subtree as the target, OR
44
+ * 3. The target is in the owner resource's export set (transitively up).
45
+ */
46
+ isAccessible(targetId: string, consumerId: string): boolean;
47
+ private isAccessibleFromOwnerChain;
48
+ private isTargetAllowedByExports;
49
+ private isVisibleOutsideExportedResource;
50
+ /**
51
+ * Validates that all dependency references respect visibility boundaries.
52
+ * Called after registration is complete, before dependency computation.
53
+ */
54
+ validateVisibility(registry: StoreRegistry): void;
55
+ /**
56
+ * Checks dependencies declared by all dependency-bearing definitions.
57
+ */
58
+ private validateItemDependencies;
59
+ /**
60
+ * Validates that hook listeners only subscribe to visible events.
61
+ */
62
+ private validateHookEventVisibility;
63
+ /**
64
+ * Validates that middleware attachments are visible.
65
+ */
66
+ private validateMiddlewareVisibility;
67
+ /**
68
+ * Finds the first export set in the ownership chain that gates `targetId`.
69
+ */
70
+ private findGatingExportSet;
71
+ /** Exposes the ownership map for testing. */
72
+ getOwnership(): ReadonlyMap<string, string>;
73
+ /** Exposes the export sets for testing. */
74
+ getExportSets(): ReadonlyMap<string, ReadonlySet<string>>;
75
+ }
@@ -0,0 +1,23 @@
1
+ import { DependencyMapType, DependencyValuesType, IEvent, IEventEmitOptions, IResource, ITask, ResourceDependencyValuesType, TaskCallOptions } from "../../defs";
2
+ import { EventManager } from "../EventManager";
3
+ import { Logger } from "../Logger";
4
+ import { Store } from "../Store";
5
+ import { TaskRunner } from "../TaskRunner";
6
+ import { ResourceStoreElementType } from "../../types/storeTypes";
7
+ export declare class DependencyExtractor {
8
+ private readonly store;
9
+ private readonly eventManager;
10
+ private readonly taskRunner;
11
+ private readonly logger;
12
+ private readonly ensureResourceInitialized;
13
+ constructor(store: Store, eventManager: EventManager, taskRunner: TaskRunner, logger: Logger, ensureResourceInitialized: (resource: ResourceStoreElementType<any, any, any>) => Promise<void>);
14
+ wrapResourceDependencies<TD extends DependencyMapType>(deps: TD, extracted: DependencyValuesType<TD>, ownerResourceId: string): ResourceDependencyValuesType<TD>;
15
+ extractDependencies<T extends DependencyMapType>(map: T, source: string): Promise<DependencyValuesType<T>>;
16
+ extractDependency(object: unknown, source: string): Promise<any>;
17
+ extractEventDependency(object: IEvent<any>, source: string): (input: unknown, options?: IEventEmitOptions) => Promise<void | import("../..").IEventEmitReport>;
18
+ extractTaskDependency(object: ITask<any, any, {}>): Promise<(input: unknown, options?: TaskCallOptions) => Promise<any>>;
19
+ extractResourceDependency(object: IResource<any, any, any>): Promise<any>;
20
+ private makeTaskWithIntercept;
21
+ private makeOwnerAwareMiddlewareManager;
22
+ private getStoreTaskOrThrow;
23
+ }
@@ -0,0 +1,15 @@
1
+ import type { IEventEmission } from "../../defs";
2
+ import { EventManager } from "../EventManager";
3
+ import { Logger } from "../Logger";
4
+ import { HookStoreElementType } from "../../types/storeTypes";
5
+ export declare class HookEventBuffer {
6
+ private readonly eventManager;
7
+ private readonly logger;
8
+ private readonly runtimeEventCycleDetection;
9
+ private static readonly MAX_FLUSH_PASSES_WITHOUT_CYCLE_DETECTION;
10
+ readonly pendingHookEvents: Map<string, IEventEmission<any>[]>;
11
+ readonly drainingHookIds: Set<string>;
12
+ constructor(eventManager: EventManager, logger: Logger, runtimeEventCycleDetection: boolean);
13
+ enqueue(hookId: string, event: IEventEmission<any>): void;
14
+ flush(hookStoreElement: HookStoreElementType): Promise<void>;
15
+ }
@@ -0,0 +1,10 @@
1
+ import { ResourceStoreElementType } from "../../types/storeTypes";
2
+ import { Store } from "../Store";
3
+ export declare class ResourceScheduler {
4
+ private readonly store;
5
+ private readonly ensureResourceInitialized;
6
+ constructor(store: Store, ensureResourceInitialized: (resource: ResourceStoreElementType<any, any, any>) => Promise<void>);
7
+ collectStartupRequiredResourceIds(): Set<string>;
8
+ initializeUninitializedResourcesParallel(targetResourceIds?: ReadonlySet<string>): Promise<void>;
9
+ isResourceReadyForParallelInit(resource: ResourceStoreElementType<any, any, any>): boolean;
10
+ }
@@ -1,11 +1,12 @@
1
- import { IEventEmission } from "../../defs";
1
+ import { EventEmissionFailureMode, IEventEmission, IEventEmitReport } from "../../defs";
2
2
  import { IListenerStorage } from "./types";
3
3
  interface ExecuteOptions {
4
4
  listeners: IListenerStorage[];
5
5
  event: IEventEmission<any>;
6
- isPropagationStopped: () => boolean;
6
+ isPropagationStopped?: () => boolean;
7
+ failureMode: EventEmissionFailureMode;
7
8
  }
8
- export declare function executeSequentially({ listeners, event, isPropagationStopped, }: ExecuteOptions): Promise<void>;
9
- export declare function executeInParallel({ listeners, event, }: Omit<ExecuteOptions, "isPropagationStopped">): Promise<void>;
9
+ export declare function executeSequentially({ listeners, event, isPropagationStopped, failureMode, }: ExecuteOptions): Promise<IEventEmitReport>;
10
+ export declare function executeInParallel({ listeners, event, failureMode, }: Omit<ExecuteOptions, "isPropagationStopped">): Promise<IEventEmitReport>;
10
11
  export declare function shouldExecuteListener(listener: IListenerStorage, event: IEventEmission<any>): boolean;
11
12
  export {};
@@ -15,6 +15,7 @@ export declare class ListenerRegistry {
15
15
  get globalListenersCacheValid(): boolean;
16
16
  addListener(eventId: string, newListener: IListenerStorage): void;
17
17
  addGlobalListener(newListener: IListenerStorage): void;
18
+ removeListenerById(id: string): void;
18
19
  getListenersForEmit(eventDefinition: IEvent<any>): IListenerStorage[];
19
20
  hasListeners(eventDefinition: IEvent<any>): boolean;
20
21
  /**
@@ -26,6 +27,7 @@ export declare class ListenerRegistry {
26
27
  private invalidateCache;
27
28
  private mergeSortedListeners;
28
29
  private insertListener;
30
+ private removeFromListeners;
29
31
  }
30
32
  export declare function createListener(newListener: Partial<IListenerStorage>): IListenerStorage;
31
33
  export {};
@@ -1,12 +1,10 @@
1
- export * from "./DependencyProcessor";
2
1
  export * from "./EventManager";
3
2
  export * from "./Logger";
4
3
  export * from "./Store";
5
4
  export * from "./TaskRunner";
6
- export * from "./ResourceInitializer";
7
5
  export * from "./MiddlewareManager";
8
6
  export { LogPrinter } from "./LogPrinter";
9
- export type { PrintableLog, ColorTheme, LogLevels as LogPrinterLevels, PrintStrategy as LogPrinterPrintStrategy, } from "./LogPrinter";
7
+ export type { PrintableLog, PrintStrategy as LogPrinterPrintStrategy, } from "./LogPrinter";
10
8
  export * from "./Semaphore";
11
9
  export * from "./Queue";
12
10
  export * from "./UnhandledError";