@bluelibs/runner 4.6.1 → 4.7.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AI.md +319 -579
- package/README.md +886 -731
- package/dist/browser/index.cjs +1438 -251
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.mjs +1433 -252
- package/dist/browser/index.mjs.map +1 -1
- package/dist/context.d.ts +31 -0
- package/dist/define.d.ts +9 -0
- package/dist/definers/builders/core.d.ts +30 -0
- package/dist/definers/builders/event.d.ts +12 -0
- package/dist/definers/builders/hook.d.ts +20 -0
- package/dist/definers/builders/middleware.d.ts +39 -0
- package/dist/definers/builders/resource.d.ts +40 -0
- package/dist/definers/builders/tag.d.ts +10 -0
- package/dist/definers/builders/task.d.ts +37 -0
- package/dist/definers/builders/task.phantom.d.ts +27 -0
- package/dist/definers/builders/utils.d.ts +4 -0
- package/dist/definers/defineEvent.d.ts +2 -0
- package/dist/definers/defineHook.d.ts +6 -0
- package/dist/definers/defineOverride.d.ts +17 -0
- package/dist/definers/defineResource.d.ts +2 -0
- package/dist/definers/defineResourceMiddleware.d.ts +2 -0
- package/dist/definers/defineTag.d.ts +12 -0
- package/dist/definers/defineTask.d.ts +18 -0
- package/dist/definers/defineTaskMiddleware.d.ts +2 -0
- package/dist/definers/tools.d.ts +47 -0
- package/dist/defs.d.ts +29 -0
- package/dist/edge/index.cjs +1438 -251
- package/dist/edge/index.cjs.map +1 -1
- package/dist/edge/index.mjs +1433 -252
- package/dist/edge/index.mjs.map +1 -1
- package/dist/errors.d.ts +104 -0
- package/dist/globals/globalEvents.d.ts +8 -0
- package/dist/globals/globalMiddleware.d.ts +31 -0
- package/dist/globals/globalResources.d.ts +32 -0
- package/dist/globals/globalTags.d.ts +11 -0
- package/dist/globals/middleware/cache.middleware.d.ts +27 -0
- package/dist/globals/middleware/requireContext.middleware.d.ts +6 -0
- package/dist/globals/middleware/retry.middleware.d.ts +21 -0
- package/dist/globals/middleware/timeout.middleware.d.ts +9 -0
- package/dist/globals/middleware/tunnel.middleware.d.ts +2 -0
- package/dist/globals/resources/debug/debug.resource.d.ts +7 -0
- package/dist/globals/resources/debug/debug.tag.d.ts +2 -0
- package/dist/globals/resources/debug/debugConfig.resource.d.ts +22 -0
- package/dist/globals/resources/debug/executionTracker.middleware.d.ts +50 -0
- package/dist/globals/resources/debug/globalEvent.hook.d.ts +27 -0
- package/dist/globals/resources/debug/hook.hook.d.ts +30 -0
- package/dist/globals/resources/debug/index.d.ts +6 -0
- package/dist/globals/resources/debug/middleware.hook.d.ts +30 -0
- package/dist/globals/resources/debug/types.d.ts +25 -0
- package/dist/globals/resources/debug/utils.d.ts +2 -0
- package/dist/globals/resources/queue.resource.d.ts +10 -0
- package/dist/globals/resources/tunnel/ejson-extensions.d.ts +1 -0
- package/dist/globals/resources/tunnel/error-utils.d.ts +1 -0
- package/dist/globals/resources/tunnel/plan.d.ts +19 -0
- package/dist/globals/resources/tunnel/protocol.d.ts +40 -0
- package/dist/globals/resources/tunnel/serializer.d.ts +9 -0
- package/dist/globals/resources/tunnel/tunnel.policy.tag.d.ts +18 -0
- package/dist/globals/resources/tunnel/tunnel.tag.d.ts +2 -0
- package/dist/globals/resources/tunnel/types.d.ts +17 -0
- package/dist/globals/tunnels/index.d.ts +23 -0
- package/dist/globals/types.d.ts +1 -0
- package/dist/http-client.d.ts +23 -0
- package/dist/http-fetch-tunnel.resource.d.ts +22 -0
- package/dist/index.d.ts +99 -0
- package/dist/models/DependencyProcessor.d.ts +48 -0
- package/dist/models/EventManager.d.ts +153 -0
- package/dist/models/LogPrinter.d.ts +55 -0
- package/dist/models/Logger.d.ts +85 -0
- package/dist/models/MiddlewareManager.d.ts +86 -0
- package/dist/models/OverrideManager.d.ts +13 -0
- package/dist/models/Queue.d.ts +26 -0
- package/dist/models/ResourceInitializer.d.ts +20 -0
- package/dist/models/RunResult.d.ts +35 -0
- package/dist/models/Semaphore.d.ts +61 -0
- package/dist/models/Store.d.ts +69 -0
- package/dist/models/StoreRegistry.d.ts +43 -0
- package/dist/models/StoreValidator.d.ts +8 -0
- package/dist/models/TaskRunner.d.ts +27 -0
- package/dist/models/UnhandledError.d.ts +11 -0
- package/dist/models/index.d.ts +11 -0
- package/dist/models/utils/findCircularDependencies.d.ts +16 -0
- package/dist/models/utils/safeStringify.d.ts +3 -0
- package/dist/node/exposure/allowList.d.ts +3 -0
- package/dist/node/exposure/authenticator.d.ts +6 -0
- package/dist/node/exposure/cors.d.ts +4 -0
- package/dist/node/exposure/createNodeExposure.d.ts +2 -0
- package/dist/node/exposure/exposureServer.d.ts +18 -0
- package/dist/node/exposure/httpResponse.d.ts +10 -0
- package/dist/node/exposure/logging.d.ts +4 -0
- package/dist/node/exposure/multipart.d.ts +27 -0
- package/dist/node/exposure/requestBody.d.ts +11 -0
- package/dist/node/exposure/requestContext.d.ts +17 -0
- package/dist/node/exposure/requestHandlers.d.ts +24 -0
- package/dist/node/exposure/resourceTypes.d.ts +60 -0
- package/dist/node/exposure/router.d.ts +17 -0
- package/dist/node/exposure/serverLifecycle.d.ts +13 -0
- package/dist/node/exposure/types.d.ts +31 -0
- package/dist/node/exposure/utils.d.ts +17 -0
- package/dist/node/exposure.resource.d.ts +12 -0
- package/dist/node/files.d.ts +9 -0
- package/dist/node/http-smart-client.model.d.ts +22 -0
- package/dist/node/index.d.ts +1 -0
- package/dist/node/inputFile.model.d.ts +22 -0
- package/dist/node/inputFile.utils.d.ts +14 -0
- package/dist/node/mixed-http-client.node.d.ts +27 -0
- package/dist/node/node.cjs +11168 -0
- package/dist/node/node.cjs.map +1 -0
- package/dist/node/node.d.ts +6 -0
- package/dist/node/node.mjs +11099 -0
- package/dist/node/node.mjs.map +1 -0
- package/dist/node/platform/createFile.d.ts +9 -0
- package/dist/node/tunnel.allowlist.d.ts +7 -0
- package/dist/node/upload/manifest.d.ts +22 -0
- package/dist/platform/adapters/browser.d.ts +14 -0
- package/dist/platform/adapters/edge.d.ts +5 -0
- package/dist/platform/adapters/node-als.d.ts +1 -0
- package/dist/platform/adapters/node.d.ts +15 -0
- package/dist/platform/adapters/universal-generic.d.ts +14 -0
- package/dist/platform/adapters/universal.d.ts +17 -0
- package/dist/platform/createFile.d.ts +10 -0
- package/dist/platform/createWebFile.d.ts +11 -0
- package/dist/platform/factory.d.ts +2 -0
- package/dist/platform/index.d.ts +27 -0
- package/dist/platform/types.d.ts +29 -0
- package/dist/processHooks.d.ts +2 -0
- package/dist/run.d.ts +14 -0
- package/dist/testing.d.ts +25 -0
- package/dist/tools/getCallerFile.d.ts +1 -0
- package/dist/tunnels/buildUniversalManifest.d.ts +24 -0
- package/dist/types/contracts.d.ts +63 -0
- package/dist/types/event.d.ts +74 -0
- package/dist/types/hook.d.ts +23 -0
- package/dist/types/inputFile.d.ts +34 -0
- package/dist/types/meta.d.ts +18 -0
- package/dist/types/resource.d.ts +87 -0
- package/dist/types/resourceMiddleware.d.ts +47 -0
- package/dist/types/runner.d.ts +55 -0
- package/dist/types/storeTypes.d.ts +40 -0
- package/dist/types/symbols.d.ts +28 -0
- package/dist/types/tag.d.ts +46 -0
- package/dist/types/task.d.ts +50 -0
- package/dist/types/taskMiddleware.d.ts +48 -0
- package/dist/types/utilities.d.ts +111 -0
- package/dist/universal/index.cjs +1438 -251
- package/dist/universal/index.cjs.map +1 -1
- package/dist/universal/index.mjs +1433 -252
- package/dist/universal/index.mjs.map +1 -1
- package/package.json +32 -4
- package/dist/index.d.mts +0 -1747
- package/dist/index.unused.js +0 -4466
- package/dist/index.unused.js.map +0 -1
- package/dist/node/index.cjs +0 -4498
- package/dist/node/index.cjs.map +0 -1
- package/dist/node/index.mjs +0 -4466
- package/dist/node/index.mjs.map +0 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Readable } from "stream";
|
|
2
|
+
import type { Serializer } from "./globals/resources/tunnel/serializer";
|
|
3
|
+
export interface HttpClientAuth {
|
|
4
|
+
header?: string;
|
|
5
|
+
token: string;
|
|
6
|
+
}
|
|
7
|
+
export interface HttpClientConfig {
|
|
8
|
+
baseUrl: string;
|
|
9
|
+
auth?: HttpClientAuth;
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
fetchImpl?: typeof fetch;
|
|
12
|
+
serializer: Serializer;
|
|
13
|
+
onRequest?: (ctx: {
|
|
14
|
+
url: string;
|
|
15
|
+
headers: Record<string, string>;
|
|
16
|
+
}) => void | Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export interface HttpClient {
|
|
19
|
+
task<I = unknown, O = unknown>(id: string, input?: I): Promise<O | Readable | ReadableStream<Uint8Array>>;
|
|
20
|
+
event<P = unknown>(id: string, payload?: P): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
export declare function createHttpClient(cfg: HttpClientConfig): HttpClient;
|
|
23
|
+
export type { Readable };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Serializer } from "./globals/resources/tunnel/serializer";
|
|
2
|
+
export { normalizeError } from "./globals/resources/tunnel/error-utils";
|
|
3
|
+
export interface ExposureFetchAuthConfig {
|
|
4
|
+
header?: string;
|
|
5
|
+
token: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ExposureFetchConfig {
|
|
8
|
+
baseUrl: string;
|
|
9
|
+
auth?: ExposureFetchAuthConfig;
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
fetchImpl?: typeof fetch;
|
|
12
|
+
serializer: Serializer;
|
|
13
|
+
onRequest?: (ctx: {
|
|
14
|
+
url: string;
|
|
15
|
+
headers: Record<string, string>;
|
|
16
|
+
}) => void | Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export interface ExposureFetchClient {
|
|
19
|
+
task<I = unknown, O = unknown>(id: string, input?: I): Promise<O>;
|
|
20
|
+
event<P = unknown>(id: string, payload?: P): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
export declare function createExposureFetch(cfg: ExposureFetchConfig): ExposureFetchClient;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { defineTask, defineResource, defineEvent, defineTaskMiddleware, defineResourceMiddleware, defineTag, defineOverride, defineHook } from "./define";
|
|
2
|
+
import { createContext } from "./context";
|
|
3
|
+
import { run } from "./run";
|
|
4
|
+
import { createTestResource } from "./testing";
|
|
5
|
+
declare const globals: {
|
|
6
|
+
events: {
|
|
7
|
+
readonly ready: import(".").IEvent<void>;
|
|
8
|
+
};
|
|
9
|
+
resources: {
|
|
10
|
+
store: import(".").IResource<void, Promise<import("./models").Store>, {}, any, any, import(".").TagType[], import(".").ResourceMiddlewareAttachmentType[]>;
|
|
11
|
+
middlewareManager: import(".").IResource<void, Promise<import("./models").MiddlewareManager>, {}, any, any, import(".").TagType[], import(".").ResourceMiddlewareAttachmentType[]>;
|
|
12
|
+
eventManager: import(".").IResource<void, Promise<import("./models").EventManager>, {}, any, any, import(".").TagType[], import(".").ResourceMiddlewareAttachmentType[]>;
|
|
13
|
+
taskRunner: import(".").IResource<void, Promise<import("./models").TaskRunner>, {}, any, any, import(".").TagType[], import(".").ResourceMiddlewareAttachmentType[]>;
|
|
14
|
+
logger: import(".").IResource<void, Promise<import("./models").Logger>, {}, any, any, import(".").TagType[], import(".").ResourceMiddlewareAttachmentType[]>;
|
|
15
|
+
serializer: import(".").IResource<void, Promise<import("./globals/resources/tunnel/serializer").Serializer>, {}, any, any, import(".").TagType[], import(".").ResourceMiddlewareAttachmentType[]>;
|
|
16
|
+
cache: import(".").IResource<{
|
|
17
|
+
defaultOptions?: any;
|
|
18
|
+
}, Promise<{
|
|
19
|
+
map: Map<string, import(".").ICacheInstance>;
|
|
20
|
+
cacheFactoryTask: import(".").TaskDependencyWithIntercept<any, Promise<import(".").ICacheInstance>>;
|
|
21
|
+
defaultOptions: any;
|
|
22
|
+
}>, {
|
|
23
|
+
cacheFactoryTask: import(".").ITask<any, Promise<import(".").ICacheInstance>, any, any, import(".").TagType[], import(".").TaskMiddlewareAttachmentType[]>;
|
|
24
|
+
}, any, any, import(".").TagType[], import(".").ResourceMiddlewareAttachmentType[]>;
|
|
25
|
+
queue: import(".").IResource<void, Promise<{
|
|
26
|
+
map: Map<string, import("./models").Queue>;
|
|
27
|
+
run: <T>(id: string, task: (signal: AbortSignal) => Promise<T>) => Promise<T>;
|
|
28
|
+
}>, {}, {
|
|
29
|
+
map: Map<string, import("./models").Queue>;
|
|
30
|
+
}, {
|
|
31
|
+
title: string;
|
|
32
|
+
description: string;
|
|
33
|
+
}, import(".").TagType[], import(".").ResourceMiddlewareAttachmentType[]>;
|
|
34
|
+
};
|
|
35
|
+
middleware: {
|
|
36
|
+
requireContext: import(".").ITaskMiddleware<{
|
|
37
|
+
context: import("./context").Context<any>;
|
|
38
|
+
}, void, void, any>;
|
|
39
|
+
task: {
|
|
40
|
+
requireContext: import(".").ITaskMiddleware<{
|
|
41
|
+
context: import("./context").Context<any>;
|
|
42
|
+
}, void, void, any>;
|
|
43
|
+
cache: import(".").ITaskMiddleware<any, void, void, {
|
|
44
|
+
cache: import(".").IResource<{
|
|
45
|
+
defaultOptions?: any;
|
|
46
|
+
}, Promise<{
|
|
47
|
+
map: Map<string, import(".").ICacheInstance>;
|
|
48
|
+
cacheFactoryTask: import(".").TaskDependencyWithIntercept<any, Promise<import(".").ICacheInstance>>;
|
|
49
|
+
defaultOptions: any;
|
|
50
|
+
}>, {
|
|
51
|
+
cacheFactoryTask: import(".").ITask<any, Promise<import(".").ICacheInstance>, any, any, import(".").TagType[], import(".").TaskMiddlewareAttachmentType[]>;
|
|
52
|
+
}, any, any, import(".").TagType[], import(".").ResourceMiddlewareAttachmentType[]>;
|
|
53
|
+
}>;
|
|
54
|
+
retry: import(".").ITaskMiddleware<import("./globals/middleware/retry.middleware").RetryMiddlewareConfig, void, void, any>;
|
|
55
|
+
timeout: import(".").ITaskMiddleware<import("./globals/middleware/timeout.middleware").TimeoutMiddlewareConfig, void, void, any>;
|
|
56
|
+
};
|
|
57
|
+
resource: {
|
|
58
|
+
retry: import(".").IResourceMiddleware<import("./globals/middleware/retry.middleware").RetryMiddlewareConfig, void, void, any>;
|
|
59
|
+
timeout: import(".").IResourceMiddleware<import("./globals/middleware/timeout.middleware").TimeoutMiddlewareConfig, void, void, any>;
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
tags: {
|
|
63
|
+
system: import(".").ITag<{
|
|
64
|
+
metadata?: Record<string, any>;
|
|
65
|
+
}, void, void>;
|
|
66
|
+
excludeFromGlobalHooks: import(".").ITag<{
|
|
67
|
+
metadata?: Record<string, any>;
|
|
68
|
+
}, void, void>;
|
|
69
|
+
debug: import(".").ITag<import(".").DebugFriendlyConfig, void, void>;
|
|
70
|
+
tunnel: import(".").ITag<void, void, import("./globals/resources/tunnel/types").TunnelRunner>;
|
|
71
|
+
tunnelPolicy: import(".").ITag<import("./globals/resources/tunnel/tunnel.policy.tag").TunnelTaskMiddlewarePolicyConfig, void, void>;
|
|
72
|
+
};
|
|
73
|
+
tunnels: Readonly<{
|
|
74
|
+
http: Readonly<{
|
|
75
|
+
createClient(cfg: import("./globals/tunnels").HttpCreateClientConfig): import("./http-fetch-tunnel.resource").ExposureFetchClient;
|
|
76
|
+
}>;
|
|
77
|
+
}>;
|
|
78
|
+
};
|
|
79
|
+
export { globals };
|
|
80
|
+
export { defineTask as task, defineResource as resource, defineEvent as event, defineTaskMiddleware as taskMiddleware, defineResourceMiddleware as resourceMiddleware, defineTag as tag, defineOverride as override, defineHook as hook, run, createContext, createTestResource, };
|
|
81
|
+
export declare const r: Readonly<{
|
|
82
|
+
resource: typeof import("./definers/builders/resource").resourceBuilder;
|
|
83
|
+
task: import("./definers/builders/task").TaskBuilderWithPhantom;
|
|
84
|
+
event: typeof import("./definers/builders/event").eventBuilder;
|
|
85
|
+
hook: typeof import("./definers/builders/hook").hookBuilder;
|
|
86
|
+
tag: typeof import("./definers/builders/tag").tagBuilder;
|
|
87
|
+
middleware: Readonly<{
|
|
88
|
+
task: typeof import("./definers/builders/middleware").taskMiddlewareBuilder;
|
|
89
|
+
resource: typeof import("./definers/builders/middleware").resourceMiddlewareBuilder;
|
|
90
|
+
}>;
|
|
91
|
+
}>;
|
|
92
|
+
export * as definitions from "./defs";
|
|
93
|
+
export * from "./models";
|
|
94
|
+
export * from "./globals/types";
|
|
95
|
+
export * as Errors from "./errors";
|
|
96
|
+
export { Context } from "./context";
|
|
97
|
+
export { PlatformAdapter, setPlatform } from "./platform";
|
|
98
|
+
export { EJSON } from "@bluelibs/ejson";
|
|
99
|
+
export type * from "./defs";
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { DependencyMapType, DependencyValuesType, ITask, IResource, IEvent } from "../defs";
|
|
2
|
+
import { Store } from "./Store";
|
|
3
|
+
import { ResourceStoreElementType } from "../types/storeTypes";
|
|
4
|
+
import { EventManager } from "./EventManager";
|
|
5
|
+
import { ResourceInitializer } from "./ResourceInitializer";
|
|
6
|
+
import { TaskRunner } from "./TaskRunner";
|
|
7
|
+
import { Logger } from "./Logger";
|
|
8
|
+
/**
|
|
9
|
+
* This class is responsible of setting up dependencies with their respective computedValues.
|
|
10
|
+
* Note that all elements must have been previously registered otherwise errors will be thrown
|
|
11
|
+
* when trying to depend on something not in the store.
|
|
12
|
+
*/
|
|
13
|
+
export declare class DependencyProcessor {
|
|
14
|
+
protected readonly store: Store;
|
|
15
|
+
protected readonly eventManager: EventManager;
|
|
16
|
+
protected readonly taskRunner: TaskRunner;
|
|
17
|
+
protected readonly resourceInitializer: ResourceInitializer;
|
|
18
|
+
protected readonly logger: Logger;
|
|
19
|
+
constructor(store: Store, eventManager: EventManager, taskRunner: TaskRunner, logger: Logger);
|
|
20
|
+
/**
|
|
21
|
+
* This function is going to go through all the resources, tasks and middleware to compute their required dependencies.
|
|
22
|
+
*/
|
|
23
|
+
computeAllDependencies(): Promise<void>;
|
|
24
|
+
private computeTaskDependencies;
|
|
25
|
+
initializeUninitializedResources(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Processes dependencies and hooks
|
|
28
|
+
* @param resource
|
|
29
|
+
*/
|
|
30
|
+
protected processResourceDependencies<TD extends DependencyMapType>(resource: ResourceStoreElementType<any, any, TD>): Promise<void>;
|
|
31
|
+
private wrapResourceDependencies;
|
|
32
|
+
private makeTaskWithIntercept;
|
|
33
|
+
initializeRoot(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Processes all hooks, should run before emission of any event.
|
|
36
|
+
*/
|
|
37
|
+
attachListeners(): void;
|
|
38
|
+
extractDependencies<T extends DependencyMapType>(map: T, source: string): Promise<DependencyValuesType<T>>;
|
|
39
|
+
extractDependency(object: any, source: string): Promise<any>;
|
|
40
|
+
/**
|
|
41
|
+
* Converts the event into a running functions with real inputs
|
|
42
|
+
* @param object
|
|
43
|
+
* @returns
|
|
44
|
+
*/
|
|
45
|
+
extractEventDependency(object: IEvent<any>, source: string): (input: any) => Promise<void>;
|
|
46
|
+
extractTaskDependency(object: ITask<any, any, {}>): Promise<(input: unknown) => Promise<any>>;
|
|
47
|
+
extractResourceDependency(object: IResource<any, any, any>): Promise<any>;
|
|
48
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { DependencyValuesType, EventHandlerType, IEvent, IEventEmission } from "../defs";
|
|
2
|
+
import { IHook } from "../types/hook";
|
|
3
|
+
/**
|
|
4
|
+
* Options for configuring event listeners
|
|
5
|
+
*/
|
|
6
|
+
export interface IEventHandlerOptions<T = any> {
|
|
7
|
+
order?: number;
|
|
8
|
+
filter?: (event: IEventEmission<T>) => boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Represents the listener ID. Use this to avoid a listener calling himself.
|
|
11
|
+
*/
|
|
12
|
+
id?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Interceptor for event emissions
|
|
16
|
+
*/
|
|
17
|
+
export type EventEmissionInterceptor = (next: (event: IEventEmission<any>) => Promise<void>, event: IEventEmission<any>) => Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Interceptor for hook execution
|
|
20
|
+
*/
|
|
21
|
+
export type HookExecutionInterceptor = (next: (hook: IHook<any, any>, event: IEventEmission<any>) => Promise<any>, hook: IHook<any, any>, event: IEventEmission<any>) => Promise<any>;
|
|
22
|
+
/**
|
|
23
|
+
* EventManager handles event emission, listener registration, and event processing.
|
|
24
|
+
* It supports both specific event listeners and global listeners that handle all events.
|
|
25
|
+
* Listeners are processed in order based on their priority.
|
|
26
|
+
*/
|
|
27
|
+
export declare class EventManager {
|
|
28
|
+
#private;
|
|
29
|
+
private listeners;
|
|
30
|
+
private globalListeners;
|
|
31
|
+
private cachedMergedListeners;
|
|
32
|
+
private globalListenersCacheValid;
|
|
33
|
+
private emissionInterceptors;
|
|
34
|
+
private hookInterceptors;
|
|
35
|
+
private readonly emissionStack;
|
|
36
|
+
private readonly currentHookIdContext;
|
|
37
|
+
private readonly runtimeCycleDetection;
|
|
38
|
+
constructor(options?: {
|
|
39
|
+
runtimeCycleDetection?: boolean;
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* Gets the current lock status of the EventManager
|
|
43
|
+
*/
|
|
44
|
+
get isLocked(): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Locks the EventManager, preventing any further modifications to listeners
|
|
47
|
+
*/
|
|
48
|
+
lock(): void;
|
|
49
|
+
/**
|
|
50
|
+
* Emits an event to all registered listeners for that event type.
|
|
51
|
+
* Listeners are processed in order of priority and can stop event propagation.
|
|
52
|
+
*
|
|
53
|
+
* @param eventDefinition - The event definition to emit
|
|
54
|
+
* @param data - The event payload data
|
|
55
|
+
* @param source - The source identifier of the event emitter
|
|
56
|
+
*/
|
|
57
|
+
emit<TInput>(eventDefinition: IEvent<TInput>, data: TInput, source: string): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Registers an event listener for specific event(s).
|
|
60
|
+
* Listeners are ordered by priority and executed in ascending order.
|
|
61
|
+
*
|
|
62
|
+
* @param event - The event definition(s) to listen for
|
|
63
|
+
* @param handler - The callback function to handle the event
|
|
64
|
+
* @param options - Configuration options for the listener
|
|
65
|
+
*/
|
|
66
|
+
addListener<T>(event: IEvent<T> | Array<IEvent<T>>, handler: EventHandlerType<T>, options?: IEventHandlerOptions<T>): void;
|
|
67
|
+
/**
|
|
68
|
+
* Registers a global event listener that handles all events.
|
|
69
|
+
* Global listeners are mixed with specific listeners and ordered by priority.
|
|
70
|
+
*
|
|
71
|
+
* @param handler - The callback function to handle events
|
|
72
|
+
* @param options - Configuration options for the listener
|
|
73
|
+
*/
|
|
74
|
+
addGlobalListener(handler: EventHandlerType, options?: IEventHandlerOptions): void;
|
|
75
|
+
/**
|
|
76
|
+
* Checks if there are any listeners registered for the given event
|
|
77
|
+
*
|
|
78
|
+
* @param eventDefinition - The event definition to check
|
|
79
|
+
* @returns true if listeners exist, false otherwise
|
|
80
|
+
*/
|
|
81
|
+
hasListeners<T>(eventDefinition: IEvent<T>): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Adds an interceptor for all event emissions
|
|
84
|
+
* Interceptors are executed in the order they are added, with the ability to
|
|
85
|
+
* modify, log, or prevent event emissions
|
|
86
|
+
*
|
|
87
|
+
* @param interceptor - The interceptor function to add
|
|
88
|
+
*/
|
|
89
|
+
intercept(interceptor: EventEmissionInterceptor): void;
|
|
90
|
+
/**
|
|
91
|
+
* Adds an interceptor for hook execution
|
|
92
|
+
* Interceptors are executed in the order they are added, with the ability to
|
|
93
|
+
* modify, log, or prevent hook execution
|
|
94
|
+
*
|
|
95
|
+
* @param interceptor - The interceptor function to add
|
|
96
|
+
*/
|
|
97
|
+
interceptHook(interceptor: HookExecutionInterceptor): void;
|
|
98
|
+
/**
|
|
99
|
+
* Executes a hook with all registered hook interceptors applied
|
|
100
|
+
* This method should be used by TaskRunner when executing hooks
|
|
101
|
+
*
|
|
102
|
+
* @param hook - The hook to execute
|
|
103
|
+
* @param event - The event that triggered the hook
|
|
104
|
+
* @param computedDependencies - The computed dependencies for the hook
|
|
105
|
+
* @returns Promise resolving to the hook execution result
|
|
106
|
+
*/
|
|
107
|
+
executeHookWithInterceptors(hook: IHook<any, any>, event: IEventEmission<any>, computedDependencies: DependencyValuesType<any>): Promise<any>;
|
|
108
|
+
/**
|
|
109
|
+
* Throws an error if the EventManager is locked
|
|
110
|
+
*/
|
|
111
|
+
private checkLock;
|
|
112
|
+
/**
|
|
113
|
+
* Merges two sorted arrays of listeners while maintaining order.
|
|
114
|
+
* Used to combine event-specific listeners with global listeners.
|
|
115
|
+
*
|
|
116
|
+
* @param a - First array of listeners
|
|
117
|
+
* @param b - Second array of listeners
|
|
118
|
+
* @returns Merged and sorted array of listeners
|
|
119
|
+
*/
|
|
120
|
+
private mergeSortedListeners;
|
|
121
|
+
/**
|
|
122
|
+
* Inserts a new listener into a sorted array using binary search.
|
|
123
|
+
* Maintains order based on listener priority.
|
|
124
|
+
*
|
|
125
|
+
* @param listeners - Array to insert into
|
|
126
|
+
* @param newListener - Listener to insert
|
|
127
|
+
*/
|
|
128
|
+
private insertListener;
|
|
129
|
+
/**
|
|
130
|
+
* Returns true if the given emission carries the tag that marks
|
|
131
|
+
* it as excluded from global ("*") listeners.
|
|
132
|
+
*
|
|
133
|
+
* @param event - The event emission to check
|
|
134
|
+
* @returns true if event should exclude global listeners
|
|
135
|
+
*/
|
|
136
|
+
private isExcludedFromGlobal;
|
|
137
|
+
/**
|
|
138
|
+
* Retrieves cached merged listeners for an event, or creates them if not cached.
|
|
139
|
+
* Combines event-specific listeners with global listeners and sorts them by priority.
|
|
140
|
+
*
|
|
141
|
+
* @param eventId - The event ID to get listeners for
|
|
142
|
+
* @returns Array of merged listeners sorted by priority
|
|
143
|
+
*/
|
|
144
|
+
private getCachedMergedListeners;
|
|
145
|
+
/**
|
|
146
|
+
* Invalidates the cached merged listeners.
|
|
147
|
+
* If eventId is provided, only invalidates cache for that specific event.
|
|
148
|
+
* Otherwise, invalidates the global cache.
|
|
149
|
+
*
|
|
150
|
+
* @param eventId - Optional specific event ID to invalidate
|
|
151
|
+
*/
|
|
152
|
+
private invalidateCache;
|
|
153
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export type PrintStrategy = "pretty" | "plain" | "json" | "json_pretty";
|
|
2
|
+
export type LogLevels = "trace" | "debug" | "info" | "warn" | "error" | "critical";
|
|
3
|
+
export interface PrintableLog {
|
|
4
|
+
level: LogLevels;
|
|
5
|
+
source?: string;
|
|
6
|
+
message: any;
|
|
7
|
+
timestamp: Date;
|
|
8
|
+
error?: {
|
|
9
|
+
name: string;
|
|
10
|
+
message: string;
|
|
11
|
+
stack?: string;
|
|
12
|
+
};
|
|
13
|
+
data?: Record<string, any>;
|
|
14
|
+
context?: Record<string, any>;
|
|
15
|
+
}
|
|
16
|
+
export type ColorTheme = {
|
|
17
|
+
trace: string;
|
|
18
|
+
debug: string;
|
|
19
|
+
info: string;
|
|
20
|
+
warn: string;
|
|
21
|
+
error: string;
|
|
22
|
+
critical: string;
|
|
23
|
+
reset: string;
|
|
24
|
+
bold: string;
|
|
25
|
+
dim: string;
|
|
26
|
+
blue: string;
|
|
27
|
+
cyan: string;
|
|
28
|
+
gray: string;
|
|
29
|
+
};
|
|
30
|
+
export declare class LogPrinter {
|
|
31
|
+
private strategy;
|
|
32
|
+
private colors;
|
|
33
|
+
constructor(options: {
|
|
34
|
+
strategy: PrintStrategy;
|
|
35
|
+
useColors: boolean;
|
|
36
|
+
colorTheme?: Partial<ColorTheme>;
|
|
37
|
+
});
|
|
38
|
+
print(log: PrintableLog): void;
|
|
39
|
+
private pickWriter;
|
|
40
|
+
private formatTime;
|
|
41
|
+
private formatLevel;
|
|
42
|
+
private formatSource;
|
|
43
|
+
private formatMessage;
|
|
44
|
+
private formatError;
|
|
45
|
+
private formatData;
|
|
46
|
+
private formatContext;
|
|
47
|
+
private normalizeForJson;
|
|
48
|
+
private static NO_COLORS;
|
|
49
|
+
private static writers;
|
|
50
|
+
static setWriters(writers: Partial<{
|
|
51
|
+
log: (msg: any) => void;
|
|
52
|
+
error?: (msg: any) => void;
|
|
53
|
+
}>): void;
|
|
54
|
+
static resetWriters(): void;
|
|
55
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { LogPrinter, PrintStrategy as PrinterStrategy } from "./LogPrinter";
|
|
2
|
+
export type LogLevels = "trace" | "debug" | "info" | "warn" | "error" | "critical";
|
|
3
|
+
export interface ILogInfo {
|
|
4
|
+
source?: string;
|
|
5
|
+
error?: unknown | Error;
|
|
6
|
+
data?: Record<string, any>;
|
|
7
|
+
context?: Record<string, any>;
|
|
8
|
+
[key: string]: any;
|
|
9
|
+
}
|
|
10
|
+
export interface ILog {
|
|
11
|
+
level: LogLevels;
|
|
12
|
+
source?: string;
|
|
13
|
+
message: any;
|
|
14
|
+
timestamp: Date;
|
|
15
|
+
error?: {
|
|
16
|
+
name: string;
|
|
17
|
+
message: string;
|
|
18
|
+
stack?: string;
|
|
19
|
+
};
|
|
20
|
+
data?: Record<string, any>;
|
|
21
|
+
context?: Record<string, any>;
|
|
22
|
+
}
|
|
23
|
+
export type PrintStrategy = PrinterStrategy;
|
|
24
|
+
export declare class Logger {
|
|
25
|
+
private printThreshold;
|
|
26
|
+
private printStrategy;
|
|
27
|
+
private bufferLogs;
|
|
28
|
+
private buffer;
|
|
29
|
+
private boundContext;
|
|
30
|
+
private isLocked;
|
|
31
|
+
private useColors;
|
|
32
|
+
private printer;
|
|
33
|
+
private source?;
|
|
34
|
+
private rootLogger?;
|
|
35
|
+
localListeners: Array<(log: ILog) => void | Promise<void>>;
|
|
36
|
+
static Severity: {
|
|
37
|
+
trace: number;
|
|
38
|
+
debug: number;
|
|
39
|
+
info: number;
|
|
40
|
+
warn: number;
|
|
41
|
+
error: number;
|
|
42
|
+
critical: number;
|
|
43
|
+
};
|
|
44
|
+
constructor(options: {
|
|
45
|
+
printThreshold: null | LogLevels;
|
|
46
|
+
printStrategy: PrintStrategy;
|
|
47
|
+
bufferLogs: boolean;
|
|
48
|
+
useColors?: boolean;
|
|
49
|
+
}, boundContext?: Record<string, any>, source?: string, printer?: LogPrinter);
|
|
50
|
+
private detectColorSupport;
|
|
51
|
+
/**
|
|
52
|
+
* Creates a new logger instance with additional bound context
|
|
53
|
+
*/
|
|
54
|
+
with({ source, additionalContext: context, }: {
|
|
55
|
+
source?: string;
|
|
56
|
+
additionalContext?: Record<string, any>;
|
|
57
|
+
}): Logger;
|
|
58
|
+
/**
|
|
59
|
+
* Core logging method with structured LogInfo
|
|
60
|
+
*/
|
|
61
|
+
log(level: LogLevels, message: any, logInfo?: ILogInfo): Promise<void>;
|
|
62
|
+
private extractErrorInfo;
|
|
63
|
+
info(message: any, logInfo?: ILogInfo): Promise<void>;
|
|
64
|
+
error(message: any, logInfo?: ILogInfo): Promise<void>;
|
|
65
|
+
warn(message: any, logInfo?: ILogInfo): Promise<void>;
|
|
66
|
+
debug(message: any, logInfo?: ILogInfo): Promise<void>;
|
|
67
|
+
trace(message: any, logInfo?: ILogInfo): Promise<void>;
|
|
68
|
+
critical(message: any, logInfo?: ILogInfo): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Direct print for tests and advanced scenarios. Delegates to LogPrinter.
|
|
71
|
+
*/
|
|
72
|
+
print(log: ILog): void;
|
|
73
|
+
/**
|
|
74
|
+
* @param listener - A listener that will be triggered for every log.
|
|
75
|
+
*/
|
|
76
|
+
onLog(listener: (log: ILog) => any): void;
|
|
77
|
+
/**
|
|
78
|
+
* Marks the logger as ready.
|
|
79
|
+
* This is used to trigger the local listeners and print the buffered logs (if they exists)
|
|
80
|
+
* @returns A promise that resolves when the logger is ready.
|
|
81
|
+
*/
|
|
82
|
+
lock(): Promise<void>;
|
|
83
|
+
private canPrint;
|
|
84
|
+
private triggerLogListeners;
|
|
85
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { DependencyMapType, ITask, IResource, ITaskMiddleware } from "../defs";
|
|
2
|
+
import { EventManager } from "./EventManager";
|
|
3
|
+
import { Store } from "./Store";
|
|
4
|
+
import { Logger } from "./Logger";
|
|
5
|
+
import { ITaskMiddlewareExecutionInput } from "../types/taskMiddleware";
|
|
6
|
+
import { IResourceMiddlewareExecutionInput, IResourceMiddleware } from "../types/resourceMiddleware";
|
|
7
|
+
/**
|
|
8
|
+
* Interceptor for task middleware execution
|
|
9
|
+
*/
|
|
10
|
+
export type TaskMiddlewareInterceptor = (next: (input: ITaskMiddlewareExecutionInput<any>) => Promise<any>, input: ITaskMiddlewareExecutionInput<any>) => Promise<any>;
|
|
11
|
+
/**
|
|
12
|
+
* Interceptor for resource middleware execution
|
|
13
|
+
*/
|
|
14
|
+
export type ResourceMiddlewareInterceptor = (next: (input: IResourceMiddlewareExecutionInput<any>) => Promise<any>, input: IResourceMiddlewareExecutionInput<any>) => Promise<any>;
|
|
15
|
+
/**
|
|
16
|
+
* Centralizes middleware composition and execution for both tasks and resources.
|
|
17
|
+
* Keeps observability emissions and unhandled error routing consistent.
|
|
18
|
+
*/
|
|
19
|
+
export declare class MiddlewareManager {
|
|
20
|
+
#private;
|
|
21
|
+
protected readonly store: Store;
|
|
22
|
+
protected readonly eventManager: EventManager;
|
|
23
|
+
protected readonly logger: Logger;
|
|
24
|
+
private taskMiddlewareInterceptors;
|
|
25
|
+
private resourceMiddlewareInterceptors;
|
|
26
|
+
private perMiddlewareInterceptors;
|
|
27
|
+
private perResourceMiddlewareInterceptors;
|
|
28
|
+
constructor(store: Store, eventManager: EventManager, logger: Logger);
|
|
29
|
+
/**
|
|
30
|
+
* Gets the current lock status of the MiddlewareManager
|
|
31
|
+
*/
|
|
32
|
+
get isLocked(): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Locks the MiddlewareManager, preventing any further modifications to interceptors
|
|
35
|
+
*/
|
|
36
|
+
lock(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Throws an error if the MiddlewareManager is locked
|
|
39
|
+
*/
|
|
40
|
+
private checkLock;
|
|
41
|
+
/**
|
|
42
|
+
* Adds an interceptor for task or resource middleware execution
|
|
43
|
+
* Interceptors are executed in the order they are added, with the ability to
|
|
44
|
+
* modify, log, or prevent middleware execution
|
|
45
|
+
*
|
|
46
|
+
* @param kind - The type of middleware to intercept ("task" or "resource")
|
|
47
|
+
* @param interceptor - The interceptor function to add
|
|
48
|
+
*/
|
|
49
|
+
intercept(kind: "task" | "resource", interceptor: TaskMiddlewareInterceptor | ResourceMiddlewareInterceptor): void;
|
|
50
|
+
/**
|
|
51
|
+
* Adds an interceptor for a specific middleware instance with better type safety
|
|
52
|
+
* This method automatically determines the type and provides type-safe access
|
|
53
|
+
*
|
|
54
|
+
* @param middleware - The middleware instance to intercept
|
|
55
|
+
* @param interceptor - The interceptor function with proper typing
|
|
56
|
+
*/
|
|
57
|
+
interceptMiddleware(middleware: ITaskMiddleware<any, any, any, any> | IResourceMiddleware<any, any, any, any>, interceptor: TaskMiddlewareInterceptor | ResourceMiddlewareInterceptor): void;
|
|
58
|
+
/**
|
|
59
|
+
* Wrap a middleware with its specific interceptors in onion style
|
|
60
|
+
*/
|
|
61
|
+
private wrapMiddlewareWithInterceptors;
|
|
62
|
+
/**
|
|
63
|
+
* Wrap a resource middleware with its specific interceptors in onion style
|
|
64
|
+
*/
|
|
65
|
+
private wrapResourceMiddlewareWithInterceptors;
|
|
66
|
+
/**
|
|
67
|
+
* Compose a runner for a task with its local interceptors and applicable middlewares.
|
|
68
|
+
* Returns a function that accepts the task input and resolves to the task output.
|
|
69
|
+
*/
|
|
70
|
+
composeTaskRunner<TInput, TOutput extends Promise<any>, TDeps extends DependencyMapType>(task: ITask<TInput, TOutput, TDeps>): (input: any) => Promise<TOutput | (TOutput extends Promise<infer U> ? U : never)>;
|
|
71
|
+
/**
|
|
72
|
+
* Run a resource init wrapped with its applicable middlewares.
|
|
73
|
+
*/
|
|
74
|
+
runResourceInit<C, V extends Promise<any>, D extends DependencyMapType, TContext>(resource: IResource<C, V, D, TContext>, config: C, dependencies: any, context: TContext): Promise<V | undefined>;
|
|
75
|
+
private getApplicableTaskMiddlewares;
|
|
76
|
+
private getApplicableResourceMiddlewares;
|
|
77
|
+
/**
|
|
78
|
+
* @param task
|
|
79
|
+
* @returns
|
|
80
|
+
*/
|
|
81
|
+
getEverywhereMiddlewareForTasks(task: ITask<any, any, any, any>): ITaskMiddleware[];
|
|
82
|
+
/**
|
|
83
|
+
* Returns all global middleware for resource, which do not depend on the target resource.
|
|
84
|
+
*/
|
|
85
|
+
getEverywhereMiddlewareForResources(target: IResource<any, any, any, any>): IResourceMiddleware[];
|
|
86
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IResource, ITaskMiddleware, IResourceMiddleware, ITask, IResourceWithConfig, RegisterableItems, IHook } from "../defs";
|
|
2
|
+
import { StoreRegistry } from "./StoreRegistry";
|
|
3
|
+
export declare class OverrideManager {
|
|
4
|
+
private readonly registry;
|
|
5
|
+
overrides: Map<string, IResource | ITaskMiddleware | IResourceMiddleware | ITask | IResourceWithConfig | IHook>;
|
|
6
|
+
overrideRequests: Set<{
|
|
7
|
+
source: string;
|
|
8
|
+
override: RegisterableItems;
|
|
9
|
+
}>;
|
|
10
|
+
constructor(registry: StoreRegistry);
|
|
11
|
+
storeOverridesDeeply<C>(element: IResource<C, any, any>): void;
|
|
12
|
+
processOverrides(): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cooperative task queue.
|
|
3
|
+
* • Tasks run one‑after‑another (FIFO ordering).
|
|
4
|
+
* • Dead‑lock detection prevents nesting.
|
|
5
|
+
* • dispose() drains or cancels outstanding tasks, then rejects new ones.
|
|
6
|
+
*/
|
|
7
|
+
export declare class Queue {
|
|
8
|
+
private tail;
|
|
9
|
+
private disposed;
|
|
10
|
+
private abortController;
|
|
11
|
+
private readonly executionContext;
|
|
12
|
+
private readonly hasAsyncLocalStorage;
|
|
13
|
+
/**
|
|
14
|
+
* Schedule an asynchronous task.
|
|
15
|
+
* @param task – receives an AbortSignal so it can cancel early if desired.
|
|
16
|
+
*/
|
|
17
|
+
run<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T>;
|
|
18
|
+
/**
|
|
19
|
+
* Disposes the queue.
|
|
20
|
+
* @param options.cancel – if true, broadcasts AbortSignal to running task.
|
|
21
|
+
* default: false (waits for tasks to finish).
|
|
22
|
+
*/
|
|
23
|
+
dispose(options?: {
|
|
24
|
+
cancel?: boolean;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DependencyMapType, IResource, ResourceDependencyValuesType } from "../defs";
|
|
2
|
+
import { EventManager } from "./EventManager";
|
|
3
|
+
import { Store } from "./Store";
|
|
4
|
+
import { Logger } from "./Logger";
|
|
5
|
+
export declare class ResourceInitializer {
|
|
6
|
+
protected readonly store: Store;
|
|
7
|
+
protected readonly eventManager: EventManager;
|
|
8
|
+
protected readonly logger: Logger;
|
|
9
|
+
constructor(store: Store, eventManager: EventManager, logger: Logger);
|
|
10
|
+
private readonly middlewareManager;
|
|
11
|
+
/**
|
|
12
|
+
* Begins the execution of an task. These are registered tasks and all sanity checks have been performed at this stage to ensure consistency of the object.
|
|
13
|
+
* This function can throw only if any of the event listeners or run function throws
|
|
14
|
+
*/
|
|
15
|
+
initializeResource<TConfig = null, TValue extends Promise<any> = Promise<any>, TDeps extends DependencyMapType = {}, TContext = any>(resource: IResource<TConfig, TValue, TDeps>, config: TConfig, dependencies: ResourceDependencyValuesType<TDeps>): Promise<{
|
|
16
|
+
value: TValue;
|
|
17
|
+
context: TContext;
|
|
18
|
+
}>;
|
|
19
|
+
initWithMiddleware<C, V extends Promise<any>, D extends DependencyMapType, TContext>(resource: IResource<C, V, D, TContext>, config: C, dependencies: ResourceDependencyValuesType<D>, context: TContext): Promise<V | undefined>;
|
|
20
|
+
}
|