@maxdrellin/xenocline 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/.kodrdriv/config.yaml +10 -0
  2. package/.kodrdriv/context/content.md +26 -0
  3. package/LICENSE.md +66 -0
  4. package/README.md +739 -0
  5. package/__mocks__/src/execution/event.js +8 -0
  6. package/dist/aggregator.d.ts +28 -0
  7. package/dist/aggregator.js +31 -0
  8. package/dist/aggregator.js.map +1 -0
  9. package/dist/constants.d.ts +2 -0
  10. package/dist/context.d.ts +3 -0
  11. package/dist/event/aggregator.d.ts +16 -0
  12. package/dist/event/aggregator.js +29 -0
  13. package/dist/event/aggregator.js.map +1 -0
  14. package/dist/event/event.d.ts +14 -0
  15. package/dist/event/event.js +12 -0
  16. package/dist/event/event.js.map +1 -0
  17. package/dist/event/handler.d.ts +7 -0
  18. package/dist/event/handler.js +8 -0
  19. package/dist/event/handler.js.map +1 -0
  20. package/dist/event/node.d.ts +40 -0
  21. package/dist/event/node.js +24 -0
  22. package/dist/event/node.js.map +1 -0
  23. package/dist/event/phase.d.ts +15 -0
  24. package/dist/event/phase.js +12 -0
  25. package/dist/event/phase.js.map +1 -0
  26. package/dist/event/process.d.ts +14 -0
  27. package/dist/event/process.js +15 -0
  28. package/dist/event/process.js.map +1 -0
  29. package/dist/event/transition.d.ts +45 -0
  30. package/dist/event/transition.js +35 -0
  31. package/dist/event/transition.js.map +1 -0
  32. package/dist/event.d.ts +30 -0
  33. package/dist/execution/aggregator.d.ts +23 -0
  34. package/dist/execution/aggregator.js +81 -0
  35. package/dist/execution/aggregator.js.map +1 -0
  36. package/dist/execution/event.d.ts +26 -0
  37. package/dist/execution/event.js +29 -0
  38. package/dist/execution/event.js.map +1 -0
  39. package/dist/execution/next.d.ts +7 -0
  40. package/dist/execution/next.js +116 -0
  41. package/dist/execution/next.js.map +1 -0
  42. package/dist/execution/node.d.ts +4 -0
  43. package/dist/execution/node.js +170 -0
  44. package/dist/execution/node.js.map +1 -0
  45. package/dist/execution/process.d.ts +35 -0
  46. package/dist/execution/process.js +97 -0
  47. package/dist/execution/process.js.map +1 -0
  48. package/dist/input.d.ts +6 -0
  49. package/dist/input.js +4 -0
  50. package/dist/input.js.map +1 -0
  51. package/dist/logger.d.ts +12 -0
  52. package/dist/node/aggregatornode.d.ts +40 -0
  53. package/dist/node/aggregatornode.js +41 -0
  54. package/dist/node/aggregatornode.js.map +1 -0
  55. package/dist/node/node.d.ts +18 -0
  56. package/dist/node/node.js +80 -0
  57. package/dist/node/node.js.map +1 -0
  58. package/dist/node/phasenode.d.ts +21 -0
  59. package/dist/node/phasenode.js +35 -0
  60. package/dist/node/phasenode.js.map +1 -0
  61. package/dist/output.d.ts +6 -0
  62. package/dist/phase.d.ts +16 -0
  63. package/dist/phase.js +23 -0
  64. package/dist/phase.js.map +1 -0
  65. package/dist/process.d.ts +15 -0
  66. package/dist/process.js +106 -0
  67. package/dist/process.js.map +1 -0
  68. package/dist/transition/beginning.d.ts +19 -0
  69. package/dist/transition/beginning.js +31 -0
  70. package/dist/transition/beginning.js.map +1 -0
  71. package/dist/transition/connection.d.ts +26 -0
  72. package/dist/transition/connection.js +80 -0
  73. package/dist/transition/connection.js.map +1 -0
  74. package/dist/transition/decision.d.ts +20 -0
  75. package/dist/transition/decision.js +47 -0
  76. package/dist/transition/decision.js.map +1 -0
  77. package/dist/transition/next.d.ts +13 -0
  78. package/dist/transition/next.js +81 -0
  79. package/dist/transition/next.js.map +1 -0
  80. package/dist/transition/termination.d.ts +17 -0
  81. package/dist/transition/termination.js +50 -0
  82. package/dist/transition/termination.js.map +1 -0
  83. package/dist/transition/transition.d.ts +16 -0
  84. package/dist/transition/transition.js +72 -0
  85. package/dist/transition/transition.js.map +1 -0
  86. package/dist/util/general.d.ts +4 -0
  87. package/dist/util/general.js +6 -0
  88. package/dist/util/general.js.map +1 -0
  89. package/dist/utility/event/eventfilter.d.ts +7 -0
  90. package/dist/utility/event/eventfilter.js +15 -0
  91. package/dist/utility/event/eventfilter.js.map +1 -0
  92. package/dist/utility/event/filteredhandler.d.ts +13 -0
  93. package/dist/utility/event/filteredhandler.js +18 -0
  94. package/dist/utility/event/filteredhandler.js.map +1 -0
  95. package/dist/utility/event/logginghandler.d.ts +12 -0
  96. package/dist/xenocline.d.ts +72 -0
  97. package/dist/xenocline.js +21 -0
  98. package/dist/xenocline.js.map +1 -0
  99. package/eslint.config.mjs +82 -0
  100. package/package.json +71 -0
@@ -0,0 +1,8 @@
1
+ // Manual mock for src/execution/event
2
+ import { jest } from '@jest/globals';
3
+
4
+ const dispatchEvent = jest.fn();
5
+
6
+ module.exports = {
7
+ dispatchEvent
8
+ };
@@ -0,0 +1,28 @@
1
+ import { Context } from './context';
2
+ import { Input } from './input';
3
+ import { Output } from './output';
4
+ /**
5
+ * Defines the possible outcomes of an aggregation operation.
6
+ * It can either be 'Ready' with an output, or 'NotYetReady'.
7
+ */
8
+ export type AggregationResult<U extends Output = Output> = {
9
+ status: 'Ready';
10
+ output: U;
11
+ } | {
12
+ status: 'NotYetReady';
13
+ };
14
+ export type AggregateMethod<U extends Output = Output, C extends Context = Context> = (input: Input, context: C) => Promise<Readonly<AggregationResult<U>>>;
15
+ export interface Aggregator<U extends Output = Output, C extends Context = Context> {
16
+ name: string;
17
+ aggregate: AggregateMethod<U, C>;
18
+ }
19
+ export interface AggregatorOptions<U extends Output = Output, C extends Context = Context> {
20
+ aggregate: AggregateMethod<U, C>;
21
+ }
22
+ export declare const DEFAULT_AGGREGATOR_OPTIONS: AggregatorOptions<Output, Context>;
23
+ export declare const createAggregator: <U extends Output = Output, C extends Context = Context>(name: string, options?: Partial<AggregatorOptions<U, C>>) => Readonly<Aggregator<U, C>>;
24
+ export declare const isAggregator: <U extends Output = Output>(obj: any) => obj is Aggregator<U>;
25
+ export declare const validateAggregator: (item: any, coordinates?: string[]) => Array<{
26
+ coordinates: string[];
27
+ error: string;
28
+ }>;
@@ -0,0 +1,31 @@
1
+ import { clean } from './util/general.js';
2
+
3
+ const DEFAULT_AGGREGATOR_OPTIONS = {
4
+ aggregate: async (input)=>{
5
+ return {
6
+ status: 'Ready',
7
+ output: input
8
+ };
9
+ }
10
+ };
11
+ const createAggregator = (name, options)=>{
12
+ let aggregatorOptions = {
13
+ ...DEFAULT_AGGREGATOR_OPTIONS
14
+ };
15
+ if (options) {
16
+ aggregatorOptions = {
17
+ ...aggregatorOptions,
18
+ ...clean(options)
19
+ };
20
+ }
21
+ return {
22
+ name,
23
+ aggregate: aggregatorOptions.aggregate
24
+ };
25
+ };
26
+ const isAggregator = (obj)=>{
27
+ return obj !== undefined && obj !== null && typeof obj === 'object' && typeof obj.name === 'string' && typeof obj.aggregate === 'function';
28
+ };
29
+
30
+ export { DEFAULT_AGGREGATOR_OPTIONS, createAggregator, isAggregator };
31
+ //# sourceMappingURL=aggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregator.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,2 @@
1
+ export declare const DEFAULT_CHARACTER_ENCODING = "utf8";
2
+ export declare const LIBRARY_NAME = "Xenocline";
@@ -0,0 +1,3 @@
1
+ export interface Context {
2
+ [key: string]: unknown;
3
+ }
@@ -0,0 +1,16 @@
1
+ import { Event, EventData } from './event';
2
+ import { AggregationResult, Aggregator, Input, Output } from '../xenocline';
3
+ export type AggregatorEventStage = 'start' | 'aggregate' | 'ready' | 'defer';
4
+ export interface AggregatorEvent<A extends Aggregator = Aggregator, S extends AggregatorEventStage = AggregatorEventStage, D extends AggregatorEventData = AggregatorEventData> extends Event<D> {
5
+ type: 'aggregator';
6
+ stage: S;
7
+ aggregator: A;
8
+ data?: D;
9
+ }
10
+ export interface AggregatorEventData extends EventData {
11
+ input?: Input;
12
+ output?: Output;
13
+ result?: Readonly<AggregationResult<Output>>;
14
+ }
15
+ export declare function createAggregatorEvent<A extends Aggregator = Aggregator, S extends AggregatorEventStage = AggregatorEventStage, D extends AggregatorEventData = AggregatorEventData>(sourceId: string, stage: S, aggregator: A, data?: D): AggregatorEvent<A, S, D>;
16
+ export declare function isAggregatorEvent<A extends Aggregator = Aggregator, S extends AggregatorEventStage = AggregatorEventStage, D extends AggregatorEventData = AggregatorEventData>(event: any): event is AggregatorEvent<A, S, D>;
@@ -0,0 +1,29 @@
1
+ import { createEvent } from './event.js';
2
+
3
+ function createAggregatorEvent(sourceId, stage, aggregator, data) {
4
+ const event = createEvent('aggregator', sourceId, stage, data);
5
+ return {
6
+ ...event,
7
+ aggregator
8
+ };
9
+ }
10
+ function isAggregatorEvent(event) {
11
+ if (event === null || event === undefined || typeof event !== 'object') {
12
+ return false;
13
+ }
14
+ const hasRequiredProperties = event.type === 'aggregator' && 'stage' in event && 'aggregator' in event && typeof event.aggregator === 'object' && event.aggregator !== null && 'name' in event.aggregator;
15
+ if (!hasRequiredProperties) {
16
+ return false;
17
+ }
18
+ const aggregatorEvent = event;
19
+ const isValidStage = [
20
+ 'start',
21
+ 'aggregate',
22
+ 'ready',
23
+ 'defer'
24
+ ].includes(aggregatorEvent.stage);
25
+ return isValidStage;
26
+ }
27
+
28
+ export { createAggregatorEvent, isAggregatorEvent };
29
+ //# sourceMappingURL=aggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregator.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,14 @@
1
+ export type EventType = 'process' | 'phase' | 'transition' | 'execution' | 'aggregator';
2
+ export type EventStage = string;
3
+ export interface EventData {
4
+ [key: string]: unknown;
5
+ }
6
+ export interface Event<D extends EventData = EventData> {
7
+ date: Date;
8
+ type: string;
9
+ stage: EventStage;
10
+ sourceId: string;
11
+ data?: D;
12
+ }
13
+ export declare const createEvent: <D extends EventData>(type: string, sourceId: string, stage: EventStage, data?: D) => Event<D>;
14
+ export declare const isEvent: (item: unknown) => item is Event;
@@ -0,0 +1,12 @@
1
+ const createEvent = (type, sourceId, stage, data)=>{
2
+ return {
3
+ date: new Date(),
4
+ type,
5
+ stage,
6
+ sourceId,
7
+ data
8
+ };
9
+ };
10
+
11
+ export { createEvent };
12
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
@@ -0,0 +1,7 @@
1
+ import { Context } from '../context';
2
+ import { Event } from './event';
3
+ export type HandleMethod<E extends Event = Event, C extends Context = Context> = (event: E, context: C) => Promise<void>;
4
+ export interface EventHandler<E extends Event = Event, C extends Context = Context> {
5
+ handle: HandleMethod<E, C>;
6
+ }
7
+ export declare const createEventHandler: <E extends Event = Event, C extends Context = Context>(handle: HandleMethod<E, C>) => EventHandler<E, C>;
@@ -0,0 +1,8 @@
1
+ const createEventHandler = (handle)=>{
2
+ return {
3
+ handle
4
+ };
5
+ };
6
+
7
+ export { createEventHandler };
8
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -0,0 +1,40 @@
1
+ import { EventData, Event } from '../event/event';
2
+ import { AggregatorNode, Input, Node, Output, PhaseNode } from '../xenocline';
3
+ export type NodeEventStage = AggregatorNodeEventStage | PhaseNodeEventStage;
4
+ export type NodeEventType = 'aggregator' | 'phase';
5
+ /**
6
+ * Base event emitted for any node.
7
+ */
8
+ export interface NodeEvent<T extends NodeEventType = NodeEventType, S extends NodeEventStage = NodeEventStage, N extends Node = Node, D extends EventData = EventData> extends Event<D> {
9
+ type: 'node';
10
+ nodeType: T;
11
+ node: N;
12
+ stage: S;
13
+ data?: D;
14
+ }
15
+ export declare const createNodeEvent: <T extends NodeEventType, S extends NodeEventStage, N extends Node, D extends EventData>(sourceId: string, nodeType: T, stage: S, node: N, data?: D) => Readonly<NodeEvent<T, S, N, D>>;
16
+ export declare const isNodeEvent: (item: any) => item is NodeEvent;
17
+ export type AggregatorNodeEventStage = 'start' | 'end';
18
+ export interface AggregatorEventData extends EventData {
19
+ input?: Input;
20
+ output?: Output;
21
+ }
22
+ export interface AggregatorNodeEvent<A extends AggregatorNode = AggregatorNode> extends NodeEvent<'aggregator', AggregatorNodeEventStage, A, AggregatorEventData> {
23
+ nodeType: 'aggregator';
24
+ node: A;
25
+ data?: AggregatorEventData;
26
+ }
27
+ export declare const createAggregatorNodeEvent: <A extends AggregatorNode>(sourceId: string, stage: AggregatorNodeEventStage, aggregatorNode: A, data?: AggregatorEventData) => AggregatorNodeEvent<A>;
28
+ export declare const isAggregatorNodeEvent: (item: any) => item is AggregatorNodeEvent;
29
+ export type PhaseNodeEventStage = 'start' | 'end';
30
+ export interface PhaseEventData extends EventData {
31
+ input?: Input;
32
+ output?: Output;
33
+ }
34
+ export interface PhaseNodeEvent<P extends PhaseNode = PhaseNode> extends NodeEvent<'phase', PhaseNodeEventStage, P, PhaseEventData> {
35
+ nodeType: 'phase';
36
+ node: P;
37
+ data?: PhaseEventData;
38
+ }
39
+ export declare const createPhaseNodeEvent: <P extends PhaseNode>(sourceId: string, stage: PhaseNodeEventStage, phaseNode: P, data?: PhaseEventData) => PhaseNodeEvent<P>;
40
+ export declare const isPhaseNodeEvent: (item: any) => item is PhaseNodeEvent;
@@ -0,0 +1,24 @@
1
+ import { createEvent } from './event.js';
2
+
3
+ const createNodeEvent = (sourceId, nodeType, stage, node, data)=>{
4
+ const event = createEvent('node', sourceId, stage, data);
5
+ return {
6
+ ...event,
7
+ nodeType,
8
+ node
9
+ };
10
+ };
11
+ const isNodeEvent = (item)=>{
12
+ return item !== null && item !== undefined && typeof item === 'object' && item.type === 'node' && item.node !== null && item.node !== undefined && item.stage !== null && item.stage !== undefined;
13
+ };
14
+ const createAggregatorNodeEvent = (sourceId, stage, aggregatorNode, data)=>createNodeEvent(sourceId, 'aggregator', stage, aggregatorNode, data);
15
+ const isAggregatorNodeEvent = (item)=>{
16
+ return isNodeEvent(item) && item.nodeType === 'aggregator';
17
+ };
18
+ const createPhaseNodeEvent = (sourceId, stage, phaseNode, data)=>createNodeEvent(sourceId, 'phase', stage, phaseNode, data);
19
+ const isPhaseNodeEvent = (item)=>{
20
+ return isNodeEvent(item) && item.nodeType === 'phase';
21
+ };
22
+
23
+ export { createAggregatorNodeEvent, createNodeEvent, createPhaseNodeEvent, isAggregatorNodeEvent, isNodeEvent, isPhaseNodeEvent };
24
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,15 @@
1
+ import { Input, Output, Phase } from '../xenocline';
2
+ import { Event, EventData } from './event';
3
+ export type PhaseEventStage = 'start' | 'execute';
4
+ export interface PhaseEvent<P extends Phase = Phase, S extends PhaseEventStage = PhaseEventStage, D extends EventData = EventData> extends Event<D> {
5
+ type: 'phase';
6
+ phase: P;
7
+ stage: S;
8
+ data?: D;
9
+ }
10
+ export interface PhaseEventData extends EventData {
11
+ input?: Input;
12
+ output?: Output;
13
+ }
14
+ export declare function createPhaseEvent<P extends Phase, S extends PhaseEventStage = PhaseEventStage, D extends EventData = EventData>(sourceId: string, stage: S, phase: P, data?: D): PhaseEvent<P, S, D>;
15
+ export declare function isPhaseEvent<P extends Phase>(event: any): event is PhaseEvent<P>;
@@ -0,0 +1,12 @@
1
+ import { createEvent } from './event.js';
2
+
3
+ function createPhaseEvent(sourceId, stage, phase, data) {
4
+ const event = createEvent('phase', sourceId, stage, data);
5
+ return {
6
+ ...event,
7
+ phase
8
+ };
9
+ }
10
+
11
+ export { createPhaseEvent };
12
+ //# sourceMappingURL=phase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
@@ -0,0 +1,14 @@
1
+ import { EventData, Event } from './event';
2
+ import { Process } from '../process';
3
+ import { Context } from 'vm';
4
+ export type ProcessEventStage = 'start' | 'end';
5
+ export interface ProcessEvent<Proc extends Process = Process, C extends Context = Context> extends Event<ProcessEventData<C>> {
6
+ type: 'process';
7
+ process: Proc;
8
+ stage: ProcessEventStage;
9
+ }
10
+ export interface ProcessEventData<C extends Context = Context> extends EventData {
11
+ context?: C;
12
+ }
13
+ export declare const createProcessEvent: <Proc extends Process, C extends Context = Context>(sourceId: string, stage: ProcessEventStage, process: Proc, data?: ProcessEventData<C>) => Readonly<ProcessEvent<Proc, C>>;
14
+ export declare const isProcessEvent: (item: any) => item is ProcessEvent;
@@ -0,0 +1,15 @@
1
+ import { createEvent } from './event.js';
2
+
3
+ const createProcessEvent = (sourceId, stage, process, data)=>{
4
+ const event = createEvent('process', sourceId, stage, data);
5
+ return {
6
+ ...event,
7
+ process
8
+ };
9
+ };
10
+ const isProcessEvent = (item)=>{
11
+ return item !== null && item !== undefined && typeof item === 'object' && item.type === 'process' && item.process !== null && item.process !== undefined && item.stage !== null && item.stage !== undefined;
12
+ };
13
+
14
+ export { createProcessEvent, isProcessEvent };
15
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
@@ -0,0 +1,45 @@
1
+ import { Beginning, Connection, Context, Decision, Input, Output, Termination, Transition } from '../xenocline';
2
+ import { EventData, Event } from '../event/event';
3
+ export type TransitionEventStage = DecisionEventStage | ConnectionEventStage | TerminationEventStage | BeginningEventStage;
4
+ export type TransitionEventType = 'connection' | 'decision' | 'termination' | 'beginning';
5
+ /**
6
+ * Base event emitted for any transition.
7
+ */
8
+ export interface TransitionEvent<T extends TransitionEventType, S extends TransitionEventStage, P extends Transition = Transition, D extends EventData = EventData> extends Event<D> {
9
+ type: 'transition';
10
+ transitionType: T;
11
+ transition: P;
12
+ stage: S;
13
+ }
14
+ export declare const createTransitionEvent: <T extends TransitionEventType, S extends TransitionEventStage, P extends Transition, D extends EventData>(sourceId: string, transitionType: T, stage: S, transition: P, data?: D) => Readonly<TransitionEvent<T, S, P, D>>;
15
+ export type ConnectionEventStage = 'start' | 'end' | 'transform';
16
+ export interface ConnectionEventData extends EventData {
17
+ input?: Input;
18
+ output?: Output;
19
+ context?: Context;
20
+ }
21
+ export type ConnectionEvent = TransitionEvent<'connection', ConnectionEventStage, Connection, ConnectionEventData>;
22
+ export declare const createConnectionEvent: (sourceId: string, stage: ConnectionEventStage, transition: Connection, data?: ConnectionEventData) => Readonly<ConnectionEvent>;
23
+ export declare const isConnectionEvent: (item: any) => item is ConnectionEvent;
24
+ export type DecisionEventStage = 'start' | 'end' | 'decide';
25
+ export interface DecisionEventData extends EventData {
26
+ output?: Output;
27
+ result?: any;
28
+ }
29
+ export type DecisionEvent = TransitionEvent<'decision', DecisionEventStage, Decision, DecisionEventData>;
30
+ export declare const createDecisionEvent: (sourceId: string, stage: DecisionEventStage, transition: Decision, data?: DecisionEventData) => Readonly<DecisionEvent>;
31
+ export declare const isDecisionEvent: (item: any) => item is DecisionEvent;
32
+ export type TerminationEventStage = 'start' | 'terminate';
33
+ export interface TerminationEventData extends EventData {
34
+ output?: Output;
35
+ }
36
+ export type TerminationEvent = TransitionEvent<'termination', TerminationEventStage, Termination, TerminationEventData>;
37
+ export declare const createTerminationEvent: (sourceId: string, stage: TerminationEventStage, transition: Termination, data?: TerminationEventData) => Readonly<TerminationEvent>;
38
+ export declare const isTerminationEvent: (item: any) => item is TerminationEvent;
39
+ export type BeginningEventStage = 'start' | 'begin';
40
+ export interface BeginningEventData extends EventData {
41
+ input?: Input;
42
+ }
43
+ export type BeginningEvent = TransitionEvent<'beginning', BeginningEventStage, Beginning, BeginningEventData>;
44
+ export declare const createBeginningEvent: <I extends Input, C extends Context>(sourceId: string, stage: BeginningEventStage, transition: Beginning<I, C>, data?: BeginningEventData) => Readonly<BeginningEvent>;
45
+ export declare const isBeginningEvent: (item: any) => item is BeginningEvent;
@@ -0,0 +1,35 @@
1
+ import { createEvent } from './event.js';
2
+
3
+ const createTransitionEvent = (sourceId, transitionType, stage, transition, data)=>{
4
+ const event = createEvent('transition', sourceId, stage, data);
5
+ return {
6
+ ...event,
7
+ transitionType,
8
+ transition
9
+ };
10
+ };
11
+ const createConnectionEvent = (sourceId, stage, transition, data)=>{
12
+ return createTransitionEvent(sourceId, 'connection', stage, transition, data);
13
+ };
14
+ const isConnectionEvent = (item)=>{
15
+ return typeof item === 'object' && item !== null && item.type === 'transition' && item.transitionType === 'connection' && typeof item.transitionType === 'string';
16
+ };
17
+ const createDecisionEvent = (sourceId, stage, transition, data)=>createTransitionEvent(sourceId, 'decision', stage, transition, data);
18
+ const isDecisionEvent = (item)=>{
19
+ return typeof item === 'object' && item !== null && item.type === 'transition' && item.transitionType === 'decision' && typeof item.transitionType === 'string';
20
+ };
21
+ const createTerminationEvent = (sourceId, stage, transition, data)=>{
22
+ return createTransitionEvent(sourceId, 'termination', stage, transition, data);
23
+ };
24
+ const isTerminationEvent = (item)=>{
25
+ return typeof item === 'object' && item !== null && item.type === 'transition' && item.transitionType === 'termination' && typeof item.transitionType === 'string';
26
+ };
27
+ const createBeginningEvent = (sourceId, stage, transition, data)=>{
28
+ return createTransitionEvent(sourceId, 'beginning', stage, transition, data);
29
+ };
30
+ const isBeginningEvent = (item)=>{
31
+ return typeof item === 'object' && item !== null && item.type === 'transition' && item.transitionType === 'beginning' && typeof item.transitionType === 'string';
32
+ };
33
+
34
+ export { createBeginningEvent, createConnectionEvent, createDecisionEvent, createTerminationEvent, createTransitionEvent, isBeginningEvent, isConnectionEvent, isDecisionEvent, isTerminationEvent };
35
+ //# sourceMappingURL=transition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transition.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,30 @@
1
+ export type { Event } from './event/event';
2
+ export type { ProcessEvent } from './event/process';
3
+ export type { ProcessEventStage } from './event/process';
4
+ export type { PhaseEvent } from './event/phase';
5
+ export type { PhaseEventStage } from './event/phase';
6
+ export type { AggregatorEvent } from './event/aggregator';
7
+ export type { AggregatorEventStage } from './event/aggregator';
8
+ export type { NodeEvent, NodeEventStage, AggregatorNodeEvent, PhaseNodeEvent } from './event/node';
9
+ export type { TransitionEvent, TransitionEventStage, TransitionEventType, ConnectionEvent, DecisionEvent, TerminationEvent, BeginningEvent } from './event/transition';
10
+ export { createAggregatorEvent } from './event/aggregator';
11
+ export { createProcessEvent } from './event/process';
12
+ export { createNodeEvent } from './event/node';
13
+ export { createConnectionEvent } from './event/transition';
14
+ export { createDecisionEvent } from './event/transition';
15
+ export { createTerminationEvent } from './event/transition';
16
+ export { createBeginningEvent } from './event/transition';
17
+ export { createTransitionEvent } from './event/transition';
18
+ export { isAggregatorEvent } from './event/aggregator';
19
+ export { isProcessEvent } from './event/process';
20
+ export { isNodeEvent } from './event/node';
21
+ export { isConnectionEvent } from './event/transition';
22
+ export { isDecisionEvent } from './event/transition';
23
+ export { isTerminationEvent } from './event/transition';
24
+ export { isBeginningEvent } from './event/transition';
25
+ export { isAggregatorNodeEvent } from './event/node';
26
+ export { isPhaseNodeEvent } from './event/node';
27
+ export type { EventHandler } from './event/handler';
28
+ export { createEventHandler } from './event/handler';
29
+ export type { EventState } from './execution/event';
30
+ export { createEventState, dispatchEvent } from './execution/event';
@@ -0,0 +1,23 @@
1
+ import { Context } from 'vm';
2
+ import { EventState } from '../event';
3
+ import { Input } from '../input';
4
+ import { AggregatorNode } from '../node/aggregatornode';
5
+ import { Output } from '../output';
6
+ export declare class Deferred<T> {
7
+ promise: Promise<T>;
8
+ resolve: (value: T | PromiseLike<T>) => void;
9
+ reject: (reason?: any) => void;
10
+ constructor();
11
+ }
12
+ export interface AggregatorState {
13
+ aggregatorDeferreds: Map<string, Deferred<Output>>;
14
+ registerPendingAggregator: (nodeId: string) => Deferred<Output>;
15
+ resolvePendingAggregator: (nodeId: string, output: Output) => void;
16
+ getPendingAggregator: (nodeId: string) => Deferred<Output> | undefined;
17
+ pendingAggregatorIds: () => string[];
18
+ }
19
+ export declare function createAggregatorState(): AggregatorState;
20
+ export declare function executeAggregatorNode(nodeId: string, node: AggregatorNode, input: Input, state: AggregatorState & {
21
+ context: Context;
22
+ eventState: EventState<Context>;
23
+ }): Promise<Output>;
@@ -0,0 +1,81 @@
1
+ import { createAggregatorEvent } from '../event/aggregator.js';
2
+ import { dispatchEvent } from './event.js';
3
+
4
+ function _define_property(obj, key, value) {
5
+ if (key in obj) {
6
+ Object.defineProperty(obj, key, {
7
+ value: value,
8
+ enumerable: true,
9
+ configurable: true,
10
+ writable: true
11
+ });
12
+ } else {
13
+ obj[key] = value;
14
+ }
15
+ return obj;
16
+ }
17
+ class Deferred {
18
+ constructor(){
19
+ _define_property(this, "promise", void 0);
20
+ _define_property(this, "resolve", void 0);
21
+ _define_property(this, "reject", void 0);
22
+ this.promise = new Promise((resolve, reject)=>{
23
+ this.resolve = resolve;
24
+ this.reject = reject;
25
+ });
26
+ }
27
+ }
28
+ function createAggregatorState() {
29
+ return {
30
+ aggregatorDeferreds: new Map(),
31
+ registerPendingAggregator (nodeId) {
32
+ let deferred = this.aggregatorDeferreds.get(nodeId);
33
+ if (!deferred) {
34
+ deferred = new Deferred();
35
+ this.aggregatorDeferreds.set(nodeId, deferred);
36
+ }
37
+ return deferred;
38
+ },
39
+ resolvePendingAggregator (nodeId, output) {
40
+ const deferred = this.aggregatorDeferreds.get(nodeId);
41
+ if (deferred) {
42
+ deferred.resolve(output);
43
+ this.aggregatorDeferreds.delete(nodeId);
44
+ }
45
+ },
46
+ getPendingAggregator (nodeId) {
47
+ return this.aggregatorDeferreds.get(nodeId);
48
+ },
49
+ pendingAggregatorIds () {
50
+ return Array.from(this.aggregatorDeferreds.keys());
51
+ }
52
+ };
53
+ }
54
+ async function executeAggregatorNode(nodeId, node, input, state) {
55
+ dispatchEvent(state.eventState, createAggregatorEvent(nodeId, 'start', node.aggregator, {
56
+ input
57
+ }), state.context);
58
+ let deferred = state.getPendingAggregator(nodeId);
59
+ const aggregationResult = await node.aggregator.aggregate(input, state.context);
60
+ dispatchEvent(state.eventState, createAggregatorEvent(nodeId, 'aggregate', node.aggregator, {
61
+ input,
62
+ result: aggregationResult
63
+ }), state.context);
64
+ if (aggregationResult.status === 'Ready') {
65
+ const output = aggregationResult.output;
66
+ dispatchEvent(state.eventState, createAggregatorEvent(nodeId, 'ready', node.aggregator, {
67
+ output
68
+ }), state.context);
69
+ state.resolvePendingAggregator(nodeId, output);
70
+ return output;
71
+ }
72
+ dispatchEvent(state.eventState, createAggregatorEvent(nodeId, 'defer', node.aggregator, {
73
+ input,
74
+ result: aggregationResult
75
+ }), state.context);
76
+ deferred = deferred !== null && deferred !== void 0 ? deferred : state.registerPendingAggregator(nodeId);
77
+ return deferred.promise;
78
+ }
79
+
80
+ export { Deferred, createAggregatorState, executeAggregatorNode };
81
+ //# sourceMappingURL=aggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregator.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,26 @@
1
+ import { Context } from '../context';
2
+ import { Event, EventHandler } from '../event';
3
+ /**
4
+ * Represents the state for managing event handlers.
5
+ * Event handlers are expected to handle the base `Event` type and perform
6
+ * specific event checking internally if needed (e.g., using type guards).
7
+ */
8
+ export interface EventState<C extends Context> {
9
+ /** Readonly array of registered event handlers. */
10
+ readonly handlers: ReadonlyArray<EventHandler<Event, C>>;
11
+ }
12
+ /**
13
+ * Creates an instance of EventState.
14
+ * @param handlers An optional array of event handlers to initialize the state with.
15
+ * These handlers should be of type `EventHandler<Event, C>`, meaning they
16
+ * are prepared to receive any event and filter internally if necessary.
17
+ * @returns A new, readonly EventState object.
18
+ */
19
+ export declare const createEventState: <C extends Context>(handlers?: ReadonlyArray<EventHandler<Event, C>>) => Readonly<EventState<C>>;
20
+ /**
21
+ * Dispatches an event to all registered handlers.
22
+ * @param eventState The current event state containing the handlers.
23
+ * @param event The event to dispatch. This can be any specific event type that extends `Event`.
24
+ * @param context The current context to pass to the handlers.
25
+ */
26
+ export declare const dispatchEvent: <E extends Event, C extends Context>(eventState: Readonly<EventState<C>>, event: E, context: C) => Promise<void>;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Creates an instance of EventState.
3
+ * @param handlers An optional array of event handlers to initialize the state with.
4
+ * These handlers should be of type `EventHandler<Event, C>`, meaning they
5
+ * are prepared to receive any event and filter internally if necessary.
6
+ * @returns A new, readonly EventState object.
7
+ */ const createEventState = (handlers)=>{
8
+ // Store a copy of the handlers array to ensure immutability of the provided array.
9
+ return {
10
+ handlers: handlers ? [
11
+ ...handlers
12
+ ] : []
13
+ };
14
+ };
15
+ /**
16
+ * Dispatches an event to all registered handlers.
17
+ * @param eventState The current event state containing the handlers.
18
+ * @param event The event to dispatch. This can be any specific event type that extends `Event`.
19
+ * @param context The current context to pass to the handlers.
20
+ */ const dispatchEvent = async (eventState, event, context)=>{
21
+ for (const handler of eventState.handlers){
22
+ // Each handler is EventHandler<Event, C>, so its `handle` method expects an `Event`.
23
+ // Since `E` extends `Event`, passing `event` (of type `E`) is type-safe.
24
+ await handler.handle(event, context);
25
+ }
26
+ };
27
+
28
+ export { createEventState, dispatchEvent };
29
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,7 @@
1
+ import { ExecutionState } from './process';
2
+ import { Output } from '../output';
3
+ import { Connection } from '../transition/connection';
4
+ import { Decision } from '../transition/decision';
5
+ import { Termination } from '../transition/termination';
6
+ export declare function handleNextStep(nodeOutput: Output, nodeId: string, next: Termination | Connection[] | Decision[], // Can be Termination, Connection[], or Decision[] - will be narrowed down
7
+ state: ExecutionState): Promise<void>;