@bluelibs/runner 3.4.2 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AI.md +621 -0
- package/README.md +1024 -577
- package/dist/context.d.ts +4 -8
- package/dist/context.js +5 -12
- package/dist/context.js.map +1 -1
- package/dist/define.d.ts +9 -113
- package/dist/define.js +29 -358
- package/dist/define.js.map +1 -1
- package/dist/definers/defineEvent.d.ts +2 -0
- package/dist/definers/defineEvent.js +23 -0
- package/dist/definers/defineEvent.js.map +1 -0
- package/dist/definers/defineHook.d.ts +6 -0
- package/dist/definers/defineHook.js +24 -0
- package/dist/definers/defineHook.js.map +1 -0
- package/dist/definers/defineOverride.d.ts +14 -0
- package/dist/definers/defineOverride.js +13 -0
- package/dist/definers/defineOverride.js.map +1 -0
- package/dist/definers/defineResource.d.ts +2 -0
- package/dist/definers/defineResource.js +69 -0
- package/dist/definers/defineResource.js.map +1 -0
- package/dist/definers/defineResourceMiddleware.d.ts +2 -0
- package/dist/definers/defineResourceMiddleware.js +42 -0
- package/dist/definers/defineResourceMiddleware.js.map +1 -0
- package/dist/definers/defineTag.d.ts +12 -0
- package/dist/definers/defineTag.js +106 -0
- package/dist/definers/defineTag.js.map +1 -0
- package/dist/definers/defineTask.d.ts +15 -0
- package/dist/definers/defineTask.js +42 -0
- package/dist/definers/defineTask.js.map +1 -0
- package/dist/definers/defineTaskMiddleware.d.ts +2 -0
- package/dist/definers/defineTaskMiddleware.js +42 -0
- package/dist/definers/defineTaskMiddleware.js.map +1 -0
- package/dist/definers/tools.d.ts +45 -0
- package/dist/definers/tools.js +75 -0
- package/dist/definers/tools.js.map +1 -0
- package/dist/defs.d.ts +16 -424
- package/dist/defs.js +26 -38
- package/dist/defs.js.map +1 -1
- package/dist/errors.d.ts +23 -8
- package/dist/errors.js +50 -10
- package/dist/errors.js.map +1 -1
- package/dist/globals/globalEvents.d.ts +15 -39
- package/dist/globals/globalEvents.js +20 -81
- package/dist/globals/globalEvents.js.map +1 -1
- package/dist/globals/globalMiddleware.d.ts +24 -17
- package/dist/globals/globalMiddleware.js +12 -4
- package/dist/globals/globalMiddleware.js.map +1 -1
- package/dist/globals/globalResources.d.ts +13 -28
- package/dist/globals/globalResources.js +15 -7
- package/dist/globals/globalResources.js.map +1 -1
- package/dist/globals/globalTags.d.ts +9 -0
- package/dist/globals/globalTags.js +23 -0
- package/dist/globals/globalTags.js.map +1 -0
- package/dist/globals/middleware/cache.middleware.d.ts +10 -17
- package/dist/globals/middleware/cache.middleware.js +4 -16
- package/dist/globals/middleware/cache.middleware.js.map +1 -1
- package/dist/globals/middleware/requireContext.middleware.d.ts +1 -1
- package/dist/globals/middleware/requireContext.middleware.js +5 -14
- package/dist/globals/middleware/requireContext.middleware.js.map +1 -1
- package/dist/globals/middleware/retry.middleware.d.ts +2 -1
- package/dist/globals/middleware/retry.middleware.js +32 -5
- package/dist/globals/middleware/retry.middleware.js.map +1 -1
- package/dist/globals/middleware/timeout.middleware.d.ts +2 -1
- package/dist/globals/middleware/timeout.middleware.js +31 -5
- package/dist/globals/middleware/timeout.middleware.js.map +1 -1
- package/dist/globals/resources/debug/debug.resource.d.ts +7 -0
- package/dist/globals/resources/debug/debug.resource.js +29 -0
- package/dist/globals/resources/debug/debug.resource.js.map +1 -0
- package/dist/globals/resources/debug/debug.tag.d.ts +2 -0
- package/dist/globals/resources/debug/debug.tag.js +12 -0
- package/dist/globals/resources/debug/debug.tag.js.map +1 -0
- package/dist/globals/resources/debug/debugConfig.resource.d.ts +22 -0
- package/dist/globals/resources/debug/debugConfig.resource.js +20 -0
- package/dist/globals/resources/debug/debugConfig.resource.js.map +1 -0
- package/dist/globals/resources/debug/executionTracker.middleware.d.ts +50 -0
- package/dist/globals/resources/debug/executionTracker.middleware.js +87 -0
- package/dist/globals/resources/debug/executionTracker.middleware.js.map +1 -0
- package/dist/globals/resources/debug/globalEvent.hook.d.ts +27 -0
- package/dist/globals/resources/debug/globalEvent.hook.js +38 -0
- package/dist/globals/resources/debug/globalEvent.hook.js.map +1 -0
- package/dist/globals/resources/debug/hook.hook.d.ts +25 -0
- package/dist/globals/resources/debug/hook.hook.js +42 -0
- package/dist/globals/resources/debug/hook.hook.js.map +1 -0
- package/dist/globals/resources/debug/index.d.ts +6 -0
- package/dist/{types → globals/resources/debug}/index.js +6 -11
- package/dist/globals/resources/debug/index.js.map +1 -0
- package/dist/globals/resources/debug/middleware.hook.d.ts +25 -0
- package/dist/globals/resources/debug/middleware.hook.js +71 -0
- package/dist/globals/resources/debug/middleware.hook.js.map +1 -0
- package/dist/globals/resources/debug/types.d.ts +25 -0
- package/dist/globals/resources/debug/types.js +65 -0
- package/dist/globals/resources/debug/types.js.map +1 -0
- package/dist/globals/resources/debug/utils.d.ts +2 -0
- package/dist/globals/resources/debug/utils.js +9 -0
- package/dist/globals/resources/debug/utils.js.map +1 -0
- package/dist/globals/resources/queue.resource.d.ts +3 -3
- package/dist/globals/resources/queue.resource.js.map +1 -1
- package/dist/globals/types.d.ts +1 -0
- package/dist/{task.types.js → globals/types.js} +2 -7
- package/dist/globals/types.js.map +1 -0
- package/dist/index.d.ts +58 -85
- package/dist/index.js +23 -10
- package/dist/index.js.map +1 -1
- package/dist/models/DependencyProcessor.d.ts +8 -6
- package/dist/models/DependencyProcessor.js +116 -33
- package/dist/models/DependencyProcessor.js.map +1 -1
- package/dist/models/EventManager.d.ts +127 -7
- package/dist/models/EventManager.js +251 -78
- package/dist/models/EventManager.js.map +1 -1
- package/dist/models/LogPrinter.d.ts +55 -0
- package/dist/models/LogPrinter.js +196 -0
- package/dist/models/LogPrinter.js.map +1 -0
- package/dist/models/Logger.d.ts +47 -27
- package/dist/models/Logger.js +133 -155
- package/dist/models/Logger.js.map +1 -1
- package/dist/models/MiddlewareManager.d.ts +86 -0
- package/dist/models/MiddlewareManager.js +409 -0
- package/dist/models/MiddlewareManager.js.map +1 -0
- package/dist/models/OverrideManager.d.ts +3 -3
- package/dist/models/OverrideManager.js +22 -7
- package/dist/models/OverrideManager.js.map +1 -1
- package/dist/models/ResourceInitializer.d.ts +4 -3
- package/dist/models/ResourceInitializer.js +12 -68
- package/dist/models/ResourceInitializer.js.map +1 -1
- package/dist/models/RunResult.d.ts +35 -0
- package/dist/models/RunResult.js +68 -0
- package/dist/models/RunResult.js.map +1 -0
- package/dist/models/Store.d.ts +30 -17
- package/dist/models/Store.js +87 -25
- package/dist/models/Store.js.map +1 -1
- package/dist/models/StoreRegistry.d.ts +34 -19
- package/dist/models/StoreRegistry.js +248 -100
- package/dist/models/StoreRegistry.js.map +1 -1
- package/dist/models/StoreValidator.d.ts +5 -7
- package/dist/models/StoreValidator.js +50 -17
- package/dist/models/StoreValidator.js.map +1 -1
- package/dist/models/TaskRunner.d.ts +3 -2
- package/dist/models/TaskRunner.js +6 -103
- package/dist/models/TaskRunner.js.map +1 -1
- package/dist/models/UnhandledError.d.ts +11 -0
- package/dist/models/UnhandledError.js +30 -0
- package/dist/models/UnhandledError.js.map +1 -0
- package/dist/models/index.d.ts +3 -0
- package/dist/models/index.js +3 -0
- package/dist/models/index.js.map +1 -1
- package/dist/{tools → models/utils}/findCircularDependencies.js +8 -16
- package/dist/models/utils/findCircularDependencies.js.map +1 -0
- package/dist/models/utils/safeStringify.d.ts +3 -0
- package/dist/models/utils/safeStringify.js +45 -0
- package/dist/models/utils/safeStringify.js.map +1 -0
- package/dist/processHooks.d.ts +2 -0
- package/dist/processHooks.js +70 -0
- package/dist/processHooks.js.map +1 -0
- package/dist/run.d.ts +14 -27
- package/dist/run.js +100 -36
- package/dist/run.js.map +1 -1
- package/dist/testing.d.ts +5 -4
- package/dist/testing.js +3 -2
- package/dist/testing.js.map +1 -1
- package/dist/tools/getCallerFile.d.ts +0 -8
- package/dist/tools/getCallerFile.js +0 -51
- package/dist/tools/getCallerFile.js.map +1 -1
- package/dist/types/contracts.d.ts +55 -0
- package/dist/types/contracts.js +4 -0
- package/dist/types/contracts.js.map +1 -0
- package/dist/types/event.d.ts +26 -7
- package/dist/types/event.js +1 -1
- package/dist/types/event.js.map +1 -1
- package/dist/types/hook.d.ts +21 -0
- package/dist/{models/StoreTypes.js → types/hook.js} +2 -1
- package/dist/types/hook.js.map +1 -0
- package/dist/types/meta.d.ts +6 -1
- package/dist/types/meta.js +4 -2
- package/dist/types/meta.js.map +1 -1
- package/dist/types/resource.d.ts +40 -52
- package/dist/types/resource.js +1 -0
- package/dist/types/resource.js.map +1 -1
- package/dist/types/resourceMiddleware.d.ts +47 -0
- package/dist/{middleware.types.js → types/resourceMiddleware.js} +1 -1
- package/dist/types/resourceMiddleware.js.map +1 -0
- package/dist/types/runner.d.ts +37 -0
- package/dist/types/{base.js → runner.js} +1 -1
- package/dist/types/runner.js.map +1 -0
- package/dist/types/storeTypes.d.ts +40 -0
- package/dist/types/{metadata.js → storeTypes.js} +1 -1
- package/dist/types/storeTypes.js.map +1 -0
- package/dist/types/symbols.d.ts +10 -21
- package/dist/types/symbols.js +17 -22
- package/dist/types/symbols.js.map +1 -1
- package/dist/types/tag.d.ts +46 -0
- package/dist/{resource.types.js → types/tag.js} +2 -1
- package/dist/types/tag.js.map +1 -0
- package/dist/types/task.d.ts +28 -52
- package/dist/types/task.js +1 -0
- package/dist/types/task.js.map +1 -1
- package/dist/types/taskMiddleware.d.ts +48 -0
- package/dist/{event.types.js → types/taskMiddleware.js} +1 -1
- package/dist/types/taskMiddleware.js.map +1 -0
- package/dist/types/utilities.d.ts +105 -6
- package/dist/types/utilities.js +16 -2
- package/dist/types/utilities.js.map +1 -1
- package/package.json +14 -5
- package/dist/cli/extract-docs.d.ts +0 -2
- package/dist/cli/extract-docs.js +0 -88
- package/dist/cli/extract-docs.js.map +0 -1
- package/dist/common.types.d.ts +0 -20
- package/dist/common.types.js +0 -4
- package/dist/common.types.js.map +0 -1
- package/dist/defs/core.d.ts +0 -144
- package/dist/defs/core.js +0 -6
- package/dist/defs/core.js.map +0 -1
- package/dist/defs/symbols.d.ts +0 -42
- package/dist/defs/symbols.js +0 -45
- package/dist/defs/symbols.js.map +0 -1
- package/dist/defs/tags.d.ts +0 -70
- package/dist/defs/tags.js +0 -6
- package/dist/defs/tags.js.map +0 -1
- package/dist/defs.returnTag.d.ts +0 -36
- package/dist/defs.returnTag.js +0 -4
- package/dist/defs.returnTag.js.map +0 -1
- package/dist/docs/introspect.d.ts +0 -7
- package/dist/docs/introspect.js +0 -199
- package/dist/docs/introspect.js.map +0 -1
- package/dist/docs/markdown.d.ts +0 -2
- package/dist/docs/markdown.js +0 -148
- package/dist/docs/markdown.js.map +0 -1
- package/dist/docs/model.d.ts +0 -62
- package/dist/docs/model.js +0 -33
- package/dist/docs/model.js.map +0 -1
- package/dist/event.types.d.ts +0 -18
- package/dist/event.types.js.map +0 -1
- package/dist/examples/express-mongo/index.d.ts +0 -0
- package/dist/examples/express-mongo/index.js +0 -3
- package/dist/examples/express-mongo/index.js.map +0 -1
- package/dist/examples/registrator-example.d.ts +0 -122
- package/dist/examples/registrator-example.js +0 -147
- package/dist/examples/registrator-example.js.map +0 -1
- package/dist/express/docsRouter.d.ts +0 -12
- package/dist/express/docsRouter.js +0 -54
- package/dist/express/docsRouter.js.map +0 -1
- package/dist/globalEvents.d.ts +0 -40
- package/dist/globalEvents.js +0 -94
- package/dist/globalEvents.js.map +0 -1
- package/dist/globalResources.d.ts +0 -10
- package/dist/globalResources.js +0 -43
- package/dist/globalResources.js.map +0 -1
- package/dist/middleware.types.d.ts +0 -40
- package/dist/middleware.types.js.map +0 -1
- package/dist/models/StoreConstants.d.ts +0 -14
- package/dist/models/StoreConstants.js +0 -19
- package/dist/models/StoreConstants.js.map +0 -1
- package/dist/models/StoreTypes.d.ts +0 -21
- package/dist/models/StoreTypes.js.map +0 -1
- package/dist/models/VarStore.d.ts +0 -17
- package/dist/models/VarStore.js +0 -60
- package/dist/models/VarStore.js.map +0 -1
- package/dist/resource.types.d.ts +0 -31
- package/dist/resource.types.js.map +0 -1
- package/dist/symbols.d.ts +0 -24
- package/dist/symbols.js +0 -29
- package/dist/symbols.js.map +0 -1
- package/dist/t1.d.ts +0 -1
- package/dist/t1.js +0 -13
- package/dist/t1.js.map +0 -1
- package/dist/task.types.d.ts +0 -55
- package/dist/task.types.js.map +0 -1
- package/dist/tools/findCircularDependencies.js.map +0 -1
- package/dist/tools/registratorId.d.ts +0 -4
- package/dist/tools/registratorId.js +0 -40
- package/dist/tools/registratorId.js.map +0 -1
- package/dist/tools/simpleHash.d.ts +0 -9
- package/dist/tools/simpleHash.js +0 -34
- package/dist/tools/simpleHash.js.map +0 -1
- package/dist/types/base-interfaces.d.ts +0 -18
- package/dist/types/base-interfaces.js +0 -6
- package/dist/types/base-interfaces.js.map +0 -1
- package/dist/types/base.d.ts +0 -13
- package/dist/types/base.js.map +0 -1
- package/dist/types/dependencies.d.ts +0 -51
- package/dist/types/dependencies.js +0 -3
- package/dist/types/dependencies.js.map +0 -1
- package/dist/types/dependency-core.d.ts +0 -14
- package/dist/types/dependency-core.js +0 -5
- package/dist/types/dependency-core.js.map +0 -1
- package/dist/types/events.d.ts +0 -52
- package/dist/types/events.js +0 -6
- package/dist/types/events.js.map +0 -1
- package/dist/types/hooks.d.ts +0 -16
- package/dist/types/hooks.js +0 -5
- package/dist/types/hooks.js.map +0 -1
- package/dist/types/index.d.ts +0 -8
- package/dist/types/index.js.map +0 -1
- package/dist/types/metadata.d.ts +0 -75
- package/dist/types/metadata.js.map +0 -1
- package/dist/types/middleware.d.ts +0 -63
- package/dist/types/middleware.js +0 -3
- package/dist/types/middleware.js.map +0 -1
- package/dist/types/registerable.d.ts +0 -10
- package/dist/types/registerable.js +0 -5
- package/dist/types/registerable.js.map +0 -1
- package/dist/types/resources.d.ts +0 -44
- package/dist/types/resources.js +0 -5
- package/dist/types/resources.js.map +0 -1
- package/dist/types/tasks.d.ts +0 -41
- package/dist/types/tasks.js +0 -5
- package/dist/types/tasks.js.map +0 -1
- package/src/__tests__/benchmark/benchmark.test.ts +0 -148
- package/src/__tests__/benchmark/task-benchmark.test.ts +0 -132
- package/src/__tests__/context.test.ts +0 -91
- package/src/__tests__/createTestResource.test.ts +0 -139
- package/src/__tests__/errors.test.ts +0 -341
- package/src/__tests__/globalEvents.test.ts +0 -542
- package/src/__tests__/globals/cache.middleware.test.ts +0 -772
- package/src/__tests__/globals/queue.resource.test.ts +0 -141
- package/src/__tests__/globals/requireContext.middleware.test.ts +0 -98
- package/src/__tests__/globals/retry.middleware.test.ts +0 -157
- package/src/__tests__/globals/timeout.middleware.test.ts +0 -88
- package/src/__tests__/index.helper.test.ts +0 -55
- package/src/__tests__/models/EventManager.test.ts +0 -585
- package/src/__tests__/models/Logger.test.ts +0 -519
- package/src/__tests__/models/Queue.test.ts +0 -189
- package/src/__tests__/models/ResourceInitializer.test.ts +0 -148
- package/src/__tests__/models/Semaphore.test.ts +0 -713
- package/src/__tests__/models/Store.test.ts +0 -227
- package/src/__tests__/models/TaskRunner.test.ts +0 -221
- package/src/__tests__/override.test.ts +0 -104
- package/src/__tests__/recursion/README.md +0 -3
- package/src/__tests__/recursion/a.resource.ts +0 -25
- package/src/__tests__/recursion/b.resource.ts +0 -33
- package/src/__tests__/recursion/c.resource.ts +0 -18
- package/src/__tests__/run.anonymous.test.ts +0 -706
- package/src/__tests__/run.dynamic-register-and-dependencies.test.ts +0 -1185
- package/src/__tests__/run.middleware.test.ts +0 -549
- package/src/__tests__/run.overrides.test.ts +0 -424
- package/src/__tests__/run.test.ts +0 -1040
- package/src/__tests__/setOutput.test.ts +0 -244
- package/src/__tests__/tags.test.ts +0 -396
- package/src/__tests__/tools/findCircularDependencies.test.ts +0 -217
- package/src/__tests__/tools/getCallerFile.test.ts +0 -179
- package/src/__tests__/typesafety.test.ts +0 -423
- package/src/__tests__/validation-edge-cases.test.ts +0 -111
- package/src/__tests__/validation-interface.test.ts +0 -428
- package/src/context.ts +0 -86
- package/src/define.ts +0 -480
- package/src/defs.returnTag.ts +0 -91
- package/src/defs.ts +0 -596
- package/src/errors.ts +0 -105
- package/src/globals/globalEvents.ts +0 -125
- package/src/globals/globalMiddleware.ts +0 -16
- package/src/globals/globalResources.ts +0 -53
- package/src/globals/middleware/cache.middleware.ts +0 -115
- package/src/globals/middleware/requireContext.middleware.ts +0 -36
- package/src/globals/middleware/retry.middleware.ts +0 -56
- package/src/globals/middleware/timeout.middleware.ts +0 -46
- package/src/globals/resources/queue.resource.ts +0 -34
- package/src/index.ts +0 -39
- package/src/models/DependencyProcessor.ts +0 -257
- package/src/models/EventManager.ts +0 -210
- package/src/models/Logger.ts +0 -282
- package/src/models/OverrideManager.ts +0 -79
- package/src/models/Queue.ts +0 -66
- package/src/models/ResourceInitializer.ts +0 -165
- package/src/models/Semaphore.ts +0 -208
- package/src/models/Store.ts +0 -193
- package/src/models/StoreConstants.ts +0 -18
- package/src/models/StoreRegistry.ts +0 -253
- package/src/models/StoreTypes.ts +0 -47
- package/src/models/StoreValidator.ts +0 -43
- package/src/models/TaskRunner.ts +0 -203
- package/src/models/index.ts +0 -8
- package/src/run.ts +0 -116
- package/src/testing.ts +0 -66
- package/src/tools/findCircularDependencies.ts +0 -69
- package/src/tools/getCallerFile.ts +0 -96
- /package/dist/{tools → models/utils}/findCircularDependencies.d.ts +0 -0
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DependencyMapType,
|
|
3
|
-
DependencyValuesType,
|
|
4
|
-
ITask,
|
|
5
|
-
IResource,
|
|
6
|
-
IEventDefinition,
|
|
7
|
-
IEvent,
|
|
8
|
-
IEventEmission,
|
|
9
|
-
} from "../defs";
|
|
10
|
-
import { Store } from "./Store";
|
|
11
|
-
import { ResourceStoreElementType, TaskStoreElementType } from "./StoreTypes";
|
|
12
|
-
import * as utils from "../define";
|
|
13
|
-
import { EventManager } from "./EventManager";
|
|
14
|
-
import { ResourceInitializer } from "./ResourceInitializer";
|
|
15
|
-
import { TaskRunner } from "./TaskRunner";
|
|
16
|
-
import {
|
|
17
|
-
DependencyNotFoundError,
|
|
18
|
-
EventNotFoundError,
|
|
19
|
-
UnknownItemTypeError,
|
|
20
|
-
} from "../errors";
|
|
21
|
-
import { Logger } from "./Logger";
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* This class is responsible of setting up dependencies with their respective computedValues.
|
|
25
|
-
* Note that all elements must have been previously registered otherwise errors will be thrown
|
|
26
|
-
* when trying to depend on something not in the store.
|
|
27
|
-
*/
|
|
28
|
-
export class DependencyProcessor {
|
|
29
|
-
protected readonly resourceInitializer: ResourceInitializer;
|
|
30
|
-
|
|
31
|
-
constructor(
|
|
32
|
-
protected readonly store: Store,
|
|
33
|
-
protected readonly eventManager: EventManager,
|
|
34
|
-
protected readonly taskRunner: TaskRunner,
|
|
35
|
-
protected readonly logger: Logger
|
|
36
|
-
) {
|
|
37
|
-
this.resourceInitializer = new ResourceInitializer(
|
|
38
|
-
store,
|
|
39
|
-
eventManager,
|
|
40
|
-
logger
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* This function is going to go through all the resources, tasks and middleware to compute their required dependencies.
|
|
46
|
-
*/
|
|
47
|
-
async computeAllDependencies() {
|
|
48
|
-
for (const middleware of this.store.middlewares.values()) {
|
|
49
|
-
const deps = middleware.middleware.dependencies as DependencyMapType;
|
|
50
|
-
middleware.computedDependencies = await this.extractDependencies(
|
|
51
|
-
deps,
|
|
52
|
-
middleware.middleware.id
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
for (const task of this.store.tasks.values()) {
|
|
57
|
-
await this.computeTaskDependencies(task);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
for (const resource of this.store.resources.values()) {
|
|
61
|
-
await this.processResourceDependencies(resource);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// leftovers that were registered but not depended upon, except root
|
|
65
|
-
// they should still be initialized as they might extend other
|
|
66
|
-
await this.initializeUninitializedResources();
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
private async computeTaskDependencies(
|
|
70
|
-
task: TaskStoreElementType<any, any, any>
|
|
71
|
-
) {
|
|
72
|
-
const deps = task.task.dependencies as DependencyMapType;
|
|
73
|
-
task.computedDependencies = await this.extractDependencies(
|
|
74
|
-
deps,
|
|
75
|
-
task.task.id
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// Most likely these are resources that no-one has dependencies towards
|
|
80
|
-
// We need to ensure they work too!
|
|
81
|
-
public async initializeUninitializedResources() {
|
|
82
|
-
for (const resource of this.store.resources.values()) {
|
|
83
|
-
if (
|
|
84
|
-
resource.isInitialized === false &&
|
|
85
|
-
// The root is the last one to be initialized and is done in a separate process.
|
|
86
|
-
resource.resource.id !== this.store.root.resource.id
|
|
87
|
-
) {
|
|
88
|
-
await this.processResourceDependencies(resource);
|
|
89
|
-
const { value, context } =
|
|
90
|
-
await this.resourceInitializer.initializeResource(
|
|
91
|
-
resource.resource,
|
|
92
|
-
resource.config,
|
|
93
|
-
resource.computedDependencies as DependencyValuesType<{}>
|
|
94
|
-
);
|
|
95
|
-
resource.context = context;
|
|
96
|
-
resource.value = value;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Processes dependencies and hooks
|
|
103
|
-
* @param resource
|
|
104
|
-
*/
|
|
105
|
-
protected async processResourceDependencies(
|
|
106
|
-
resource: ResourceStoreElementType<any, any, {}>
|
|
107
|
-
) {
|
|
108
|
-
const deps = resource.resource.dependencies as DependencyMapType;
|
|
109
|
-
resource.computedDependencies = await this.extractDependencies(
|
|
110
|
-
deps,
|
|
111
|
-
resource.resource.id
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
public async initializeRoot() {
|
|
116
|
-
const storeResource = this.store.root;
|
|
117
|
-
|
|
118
|
-
const { value, context } =
|
|
119
|
-
await this.resourceInitializer.initializeResource(
|
|
120
|
-
storeResource.resource,
|
|
121
|
-
storeResource.config,
|
|
122
|
-
// They are already computed
|
|
123
|
-
storeResource.computedDependencies as DependencyValuesType<{}>
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
storeResource.context = context;
|
|
127
|
-
storeResource.value = value;
|
|
128
|
-
storeResource.isInitialized = true;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Processes all hooks, should run before emission of any event.
|
|
133
|
-
*/
|
|
134
|
-
public attachListeners() {
|
|
135
|
-
for (const task of this.store.tasks.values()) {
|
|
136
|
-
if (task.task.on) {
|
|
137
|
-
let eventDefinition = task.task.on;
|
|
138
|
-
|
|
139
|
-
const handler = async (receivedEvent: IEventEmission<any>) => {
|
|
140
|
-
if (receivedEvent.source === task.task.id) {
|
|
141
|
-
// we don't want to trigger the same task that emitted the event
|
|
142
|
-
// process.exit(0);
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
return this.taskRunner.run(task.task, receivedEvent);
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
if (eventDefinition === "*") {
|
|
150
|
-
this.eventManager.addGlobalListener(handler, {
|
|
151
|
-
order: task.task.listenerOrder || 0,
|
|
152
|
-
});
|
|
153
|
-
} else {
|
|
154
|
-
if (this.store.events.get(eventDefinition.id) === undefined) {
|
|
155
|
-
throw new EventNotFoundError(eventDefinition.id);
|
|
156
|
-
}
|
|
157
|
-
this.eventManager.addListener(eventDefinition, handler, {
|
|
158
|
-
order: task.task.listenerOrder || 0,
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
async extractDependencies<T extends DependencyMapType>(
|
|
166
|
-
map: T,
|
|
167
|
-
source: string | symbol
|
|
168
|
-
): Promise<DependencyValuesType<T>> {
|
|
169
|
-
const object = {} as DependencyValuesType<T>;
|
|
170
|
-
|
|
171
|
-
for (const key in map) {
|
|
172
|
-
object[key] = await this.extractDependency(map[key], source);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
return object;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
async extractDependency(object: any, source: string | symbol) {
|
|
179
|
-
if (utils.isResource(object)) {
|
|
180
|
-
return this.extractResourceDependency(object);
|
|
181
|
-
} else if (utils.isTask(object)) {
|
|
182
|
-
return this.extractTaskDependency(object);
|
|
183
|
-
} else if (utils.isEvent(object)) {
|
|
184
|
-
return this.extractEventDependency(object, source);
|
|
185
|
-
} else {
|
|
186
|
-
throw new UnknownItemTypeError(object);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Converts the event into a running functions with real inputs
|
|
192
|
-
* @param object
|
|
193
|
-
* @returns
|
|
194
|
-
*/
|
|
195
|
-
extractEventDependency(object: IEvent<any>, source: string | symbol) {
|
|
196
|
-
return async (input: any) => {
|
|
197
|
-
return this.eventManager.emit(object, input, source);
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
async extractTaskDependency(object: ITask<any, any, {}>) {
|
|
202
|
-
const storeTask = this.store.tasks.get(object.id);
|
|
203
|
-
if (storeTask === undefined) {
|
|
204
|
-
throw new DependencyNotFoundError(`Task ${object.id.toString()}`);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
if (!storeTask.isInitialized) {
|
|
208
|
-
storeTask.isInitialized = true;
|
|
209
|
-
|
|
210
|
-
// it's sanitised
|
|
211
|
-
const dependencies = object.dependencies as DependencyMapType;
|
|
212
|
-
|
|
213
|
-
storeTask.computedDependencies = await this.extractDependencies(
|
|
214
|
-
dependencies,
|
|
215
|
-
storeTask.task.id
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
return (input: any) => {
|
|
220
|
-
return this.taskRunner.run(storeTask.task, input);
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
async extractResourceDependency(object: IResource<any, any, any>) {
|
|
225
|
-
// check if it exists in the store with the value
|
|
226
|
-
const storeResource = this.store.resources.get(object.id);
|
|
227
|
-
if (storeResource === undefined) {
|
|
228
|
-
throw new DependencyNotFoundError(`Resource ${object.id.toString()}`);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const { resource, config } = storeResource;
|
|
232
|
-
if (storeResource.isInitialized) {
|
|
233
|
-
return storeResource.value;
|
|
234
|
-
} else {
|
|
235
|
-
// we need to initialize the resource
|
|
236
|
-
storeResource.isInitialized = true;
|
|
237
|
-
|
|
238
|
-
// check if it has an initialisation function that provides the value
|
|
239
|
-
if (resource.init) {
|
|
240
|
-
const { value, context } =
|
|
241
|
-
await this.resourceInitializer.initializeResource(
|
|
242
|
-
resource,
|
|
243
|
-
config,
|
|
244
|
-
await this.extractDependencies(
|
|
245
|
-
resource.dependencies || {},
|
|
246
|
-
resource.id
|
|
247
|
-
)
|
|
248
|
-
);
|
|
249
|
-
|
|
250
|
-
storeResource.context = context;
|
|
251
|
-
storeResource.value = value;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
return storeResource.value;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
EventHandlerType,
|
|
3
|
-
IEvent,
|
|
4
|
-
IEventDefinition,
|
|
5
|
-
IEventEmission,
|
|
6
|
-
} from "../defs";
|
|
7
|
-
import { LockedError, ValidationError } from "../errors";
|
|
8
|
-
import { Logger } from "./Logger";
|
|
9
|
-
|
|
10
|
-
const HandlerOptionsDefaults = { order: 0 };
|
|
11
|
-
|
|
12
|
-
interface IListenerStorage {
|
|
13
|
-
order: number;
|
|
14
|
-
filter?: (event: IEventEmission<any>) => boolean;
|
|
15
|
-
handler: EventHandlerType;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface IEventHandlerOptions<T = any> {
|
|
19
|
-
order?: number;
|
|
20
|
-
filter?: (event: IEventEmission<T>) => boolean;
|
|
21
|
-
/**
|
|
22
|
-
* Represents the listener ID. Use this to avoid a listener calling himself.
|
|
23
|
-
*/
|
|
24
|
-
id?: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export class EventManager {
|
|
28
|
-
private listeners: Map<string | symbol, IListenerStorage[]> = new Map();
|
|
29
|
-
private globalListeners: IListenerStorage[] = [];
|
|
30
|
-
private cachedMergedListeners: Map<string | symbol, IListenerStorage[]> =
|
|
31
|
-
new Map();
|
|
32
|
-
private globalListenersCacheValid = true;
|
|
33
|
-
#isLocked = false;
|
|
34
|
-
|
|
35
|
-
get isLocked() {
|
|
36
|
-
return this.#isLocked;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
lock() {
|
|
40
|
-
this.#isLocked = true;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
checkLock() {
|
|
44
|
-
if (this.#isLocked) {
|
|
45
|
-
throw new LockedError("EventManager");
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
private mergeSortedListeners(
|
|
50
|
-
a: IListenerStorage[],
|
|
51
|
-
b: IListenerStorage[]
|
|
52
|
-
): IListenerStorage[] {
|
|
53
|
-
const result: IListenerStorage[] = [];
|
|
54
|
-
let i = 0,
|
|
55
|
-
j = 0;
|
|
56
|
-
while (i < a.length && j < b.length) {
|
|
57
|
-
if (a[i].order <= b[j].order) {
|
|
58
|
-
result.push(a[i++]);
|
|
59
|
-
} else {
|
|
60
|
-
result.push(b[j++]);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
while (i < a.length) result.push(a[i++]);
|
|
64
|
-
while (j < b.length) result.push(b[j++]);
|
|
65
|
-
return result;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
private getCachedMergedListeners(
|
|
69
|
-
eventId: string | symbol
|
|
70
|
-
): IListenerStorage[] {
|
|
71
|
-
if (!this.globalListenersCacheValid) {
|
|
72
|
-
this.cachedMergedListeners.clear();
|
|
73
|
-
this.globalListenersCacheValid = true;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
let cached = this.cachedMergedListeners.get(eventId);
|
|
77
|
-
if (!cached) {
|
|
78
|
-
const eventListeners = this.listeners.get(eventId) || [];
|
|
79
|
-
if (eventListeners.length === 0 && this.globalListeners.length === 0) {
|
|
80
|
-
cached = [];
|
|
81
|
-
} else if (eventListeners.length === 0) {
|
|
82
|
-
cached = this.globalListeners;
|
|
83
|
-
} else if (this.globalListeners.length === 0) {
|
|
84
|
-
cached = eventListeners;
|
|
85
|
-
} else {
|
|
86
|
-
cached = this.mergeSortedListeners(
|
|
87
|
-
eventListeners,
|
|
88
|
-
this.globalListeners
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
this.cachedMergedListeners.set(eventId, cached);
|
|
92
|
-
}
|
|
93
|
-
return cached;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
private invalidateCache(eventId?: string | symbol): void {
|
|
97
|
-
if (eventId) {
|
|
98
|
-
this.cachedMergedListeners.delete(eventId);
|
|
99
|
-
} else {
|
|
100
|
-
this.globalListenersCacheValid = false;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
async emit<TInput>(
|
|
105
|
-
eventDefinition: IEvent<TInput>,
|
|
106
|
-
data: TInput,
|
|
107
|
-
source: string | symbol
|
|
108
|
-
): Promise<void> {
|
|
109
|
-
// Validate payload with schema if provided
|
|
110
|
-
if (eventDefinition.payloadSchema) {
|
|
111
|
-
try {
|
|
112
|
-
data = eventDefinition.payloadSchema.parse(data);
|
|
113
|
-
} catch (error) {
|
|
114
|
-
throw new ValidationError("Event payload", eventDefinition.id, error instanceof Error ? error : new Error(String(error)));
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const allListeners = this.getCachedMergedListeners(eventDefinition.id);
|
|
119
|
-
|
|
120
|
-
if (allListeners.length === 0) {
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
let propagationStopped = false;
|
|
125
|
-
|
|
126
|
-
const event: IEventEmission = {
|
|
127
|
-
id: eventDefinition.id,
|
|
128
|
-
data,
|
|
129
|
-
timestamp: new Date(),
|
|
130
|
-
source,
|
|
131
|
-
meta: eventDefinition.meta || {},
|
|
132
|
-
stopPropagation: () => {
|
|
133
|
-
propagationStopped = true;
|
|
134
|
-
},
|
|
135
|
-
isPropagationStopped: () => propagationStopped,
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
for (const listener of allListeners) {
|
|
139
|
-
if (propagationStopped) {
|
|
140
|
-
break;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (!listener.filter || listener.filter(event)) {
|
|
144
|
-
await listener.handler(event);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
private insertListener(
|
|
150
|
-
listeners: IListenerStorage[],
|
|
151
|
-
newListener: IListenerStorage
|
|
152
|
-
): void {
|
|
153
|
-
let low = 0;
|
|
154
|
-
let high = listeners.length;
|
|
155
|
-
while (low < high) {
|
|
156
|
-
const mid = (low + high) >>> 1;
|
|
157
|
-
if (listeners[mid].order < newListener.order) {
|
|
158
|
-
low = mid + 1;
|
|
159
|
-
} else {
|
|
160
|
-
high = mid;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
listeners.splice(low, 0, newListener);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
addListener<T>(
|
|
167
|
-
event: IEvent<T> | Array<IEvent<T>>,
|
|
168
|
-
handler: EventHandlerType<T>,
|
|
169
|
-
options: IEventHandlerOptions<T> = HandlerOptionsDefaults
|
|
170
|
-
): void {
|
|
171
|
-
this.checkLock();
|
|
172
|
-
const newListener: IListenerStorage = {
|
|
173
|
-
handler,
|
|
174
|
-
order: options.order || 0,
|
|
175
|
-
filter: options.filter,
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
if (Array.isArray(event)) {
|
|
179
|
-
event.forEach((id) => this.addListener(id, handler, options));
|
|
180
|
-
} else {
|
|
181
|
-
const eventId = event.id;
|
|
182
|
-
const listeners = this.listeners.get(eventId);
|
|
183
|
-
if (listeners) {
|
|
184
|
-
this.insertListener(listeners, newListener);
|
|
185
|
-
} else {
|
|
186
|
-
this.listeners.set(eventId, [newListener]);
|
|
187
|
-
}
|
|
188
|
-
this.invalidateCache(eventId);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
addGlobalListener(
|
|
193
|
-
handler: EventHandlerType,
|
|
194
|
-
options: IEventHandlerOptions = HandlerOptionsDefaults
|
|
195
|
-
): void {
|
|
196
|
-
this.checkLock();
|
|
197
|
-
const newListener: IListenerStorage = {
|
|
198
|
-
handler,
|
|
199
|
-
order: options.order || 0,
|
|
200
|
-
filter: options.filter,
|
|
201
|
-
};
|
|
202
|
-
this.insertListener(this.globalListeners, newListener);
|
|
203
|
-
this.invalidateCache();
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
hasListeners<T>(eventDefinition: IEvent<T>): boolean {
|
|
207
|
-
const eventListeners = this.listeners.get(eventDefinition.id) || [];
|
|
208
|
-
return eventListeners.length > 0 || this.globalListeners.length > 0;
|
|
209
|
-
}
|
|
210
|
-
}
|