flowfram-runtime 1.0.2
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/README.md +151 -0
- package/dist/ServerFlowRuntime.d.ts +303 -0
- package/dist/ServerFlowRuntime.d.ts.map +1 -0
- package/dist/ServerFlowRuntime.js +5269 -0
- package/dist/ServerFlowRuntime.js.map +1 -0
- package/dist/cli.d.ts +17 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +184 -0
- package/dist/cli.js.map +1 -0
- package/dist/logger.d.ts +17 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +53 -0
- package/dist/logger.js.map +1 -0
- package/dist/persistence.d.ts +39 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/persistence.js +138 -0
- package/dist/persistence.js.map +1 -0
- package/dist/server.d.ts +23 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1050 -0
- package/dist/server.js.map +1 -0
- package/package.json +73 -0
package/README.md
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# flowfram-runtime
|
|
2
|
+
|
|
3
|
+
Distributed runtime execution engine for FlowFRAM simulations.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Global installation (recommended for CLI usage)
|
|
9
|
+
npm install -g flowfram-runtime
|
|
10
|
+
|
|
11
|
+
# Or with yarn
|
|
12
|
+
yarn global add flowfram-runtime
|
|
13
|
+
|
|
14
|
+
# Or with pnpm
|
|
15
|
+
pnpm add -g flowfram-runtime
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
### CLI
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# Start with default settings (port 3001)
|
|
24
|
+
flowfram-runtime
|
|
25
|
+
|
|
26
|
+
# Start on custom port
|
|
27
|
+
flowfram-runtime --port 8080
|
|
28
|
+
|
|
29
|
+
# Show help
|
|
30
|
+
flowfram-runtime --help
|
|
31
|
+
|
|
32
|
+
# Show version
|
|
33
|
+
flowfram-runtime --version
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Environment Variables
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
PORT=3001 # Server port
|
|
40
|
+
HOST=0.0.0.0 # Server host
|
|
41
|
+
LOG_LEVEL=info # Logging level (debug, info, warn, error)
|
|
42
|
+
RUNTIME_DATA_DIR=./data # Directory for persisted flows
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Features
|
|
46
|
+
|
|
47
|
+
- REST API for flow deployment, stop, and inject operations
|
|
48
|
+
- Batch execution mode for programmatic experiment validation
|
|
49
|
+
- Server-Sent Events (SSE) for real-time event streaming
|
|
50
|
+
- 35+ node types implemented
|
|
51
|
+
- MQTT In/Out with external broker support
|
|
52
|
+
- HTTP Request node
|
|
53
|
+
- Database nodes: PostgreSQL, MySQL, MSSQL
|
|
54
|
+
- State persistence (survives restarts)
|
|
55
|
+
- Multi-tenant isolation
|
|
56
|
+
- Automatic flow restoration on startup
|
|
57
|
+
|
|
58
|
+
## Docker
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Build and run with Docker Compose
|
|
62
|
+
docker-compose up -d
|
|
63
|
+
|
|
64
|
+
# With MQTT broker (optional)
|
|
65
|
+
docker-compose --profile mqtt up -d
|
|
66
|
+
|
|
67
|
+
# View logs
|
|
68
|
+
docker-compose logs -f runtime-service
|
|
69
|
+
|
|
70
|
+
# Stop
|
|
71
|
+
docker-compose down
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Docker Build Only
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Build image
|
|
78
|
+
docker build -t flowfram-runtime .
|
|
79
|
+
|
|
80
|
+
# Run container
|
|
81
|
+
docker run -d -p 3001:3001 --name flowfram-runtime flowfram-runtime
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## API Endpoints
|
|
85
|
+
|
|
86
|
+
| Method | Endpoint | Description |
|
|
87
|
+
|--------|----------|-------------|
|
|
88
|
+
| POST | `/deploy` | Deploy a flow |
|
|
89
|
+
| POST | `/stop` | Stop a running flow |
|
|
90
|
+
| POST | `/flows/:flowId/stop` | Stop a specific flow |
|
|
91
|
+
| POST | `/inject` | Execute an inject node |
|
|
92
|
+
| POST | `/batch-run` | Execute N iterations (for experiments) |
|
|
93
|
+
| POST | `/config` | Update runtime configuration |
|
|
94
|
+
| POST | `/context/clear` | Clear runtime context |
|
|
95
|
+
| POST | `/setInstantiation` | Set instantiation mode |
|
|
96
|
+
| GET | `/status` | Get runtime status |
|
|
97
|
+
| GET | `/flows` | List deployed flows |
|
|
98
|
+
| GET | `/events?flowId=xxx` | SSE event stream |
|
|
99
|
+
| GET | `/health` | Health check |
|
|
100
|
+
|
|
101
|
+
## Configuration
|
|
102
|
+
|
|
103
|
+
Environment variables:
|
|
104
|
+
|
|
105
|
+
| Variable | Default | Description |
|
|
106
|
+
|----------|---------|-------------|
|
|
107
|
+
| `PORT` | `3001` | Server port |
|
|
108
|
+
| `RUNTIME_DATA_DIR` | `./data` | Directory for persisted flows |
|
|
109
|
+
|
|
110
|
+
## Supported Nodes
|
|
111
|
+
|
|
112
|
+
| Category | Nodes |
|
|
113
|
+
|----------|-------|
|
|
114
|
+
| **Core** | inject, debug, function, change, switch, template, delay |
|
|
115
|
+
| **Network** | http-request, mqtt-in, mqtt-out |
|
|
116
|
+
| **Database** | postgresql, mysql, mssql |
|
|
117
|
+
| **Parser** | json, csv, csv-parse, xml, html |
|
|
118
|
+
| **Sequence** | split, join, sort, batch |
|
|
119
|
+
| **Function** | range, rbe, trigger |
|
|
120
|
+
| **Control** | catch, status, complete |
|
|
121
|
+
| **FRAM** | resonance, resonance-indicator, coupling-matrix |
|
|
122
|
+
| **Output** | chart-output, table-output |
|
|
123
|
+
| **Visual** | comment |
|
|
124
|
+
|
|
125
|
+
## Architecture
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
┌─────────────────────────────────────────────────────────┐
|
|
129
|
+
│ Runtime Service (Port 3001) │
|
|
130
|
+
│ ┌───────────────────────────────────────────────────┐ │
|
|
131
|
+
│ │ Express REST API │ │
|
|
132
|
+
│ │ - POST /deploy, /stop, /inject, /batch-run │ │
|
|
133
|
+
│ │ - GET /status, /flows, /events, /health │ │
|
|
134
|
+
│ └───────────────────────────────────────────────────┘ │
|
|
135
|
+
│ ┌───────────────────────────────────────────────────┐ │
|
|
136
|
+
│ │ ServerFlowRuntime │ │
|
|
137
|
+
│ │ - Node execution engine (35+ types) │ │
|
|
138
|
+
│ │ - Message routing │ │
|
|
139
|
+
│ │ - Context management │ │
|
|
140
|
+
│ └───────────────────────────────────────────────────┘ │
|
|
141
|
+
│ ┌───────────────────────────────────────────────────┐ │
|
|
142
|
+
│ │ Persistence Layer │ │
|
|
143
|
+
│ │ - Saves deployed flows to disk │ │
|
|
144
|
+
│ │ - Restores flows on startup │ │
|
|
145
|
+
│ └───────────────────────────────────────────────────┘ │
|
|
146
|
+
└─────────────────────────────────────────────────────────┘
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## License
|
|
150
|
+
|
|
151
|
+
MIT
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ServerFlowRuntime - Simplified version for Runtime Service
|
|
3
|
+
*
|
|
4
|
+
* This is a standalone version that can run in a Docker container.
|
|
5
|
+
* It includes all node execution logic inline.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from "events";
|
|
8
|
+
interface FlowNode {
|
|
9
|
+
id: string;
|
|
10
|
+
type: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
wires?: string[][];
|
|
13
|
+
x?: number;
|
|
14
|
+
y?: number;
|
|
15
|
+
z?: string;
|
|
16
|
+
[key: string]: any;
|
|
17
|
+
}
|
|
18
|
+
interface FlowDefinition {
|
|
19
|
+
id: string;
|
|
20
|
+
name?: string;
|
|
21
|
+
nodes: FlowNode[];
|
|
22
|
+
edges?: any[];
|
|
23
|
+
}
|
|
24
|
+
interface DeployResult {
|
|
25
|
+
status: "success" | "partial" | "failed";
|
|
26
|
+
nodesDeployed: number;
|
|
27
|
+
flowsDeployed: number;
|
|
28
|
+
errors?: string[];
|
|
29
|
+
}
|
|
30
|
+
interface StopResult {
|
|
31
|
+
success: boolean;
|
|
32
|
+
error?: string;
|
|
33
|
+
timestamp?: number;
|
|
34
|
+
}
|
|
35
|
+
interface RuntimeStatus {
|
|
36
|
+
status: "idle" | "running" | "stopped" | "error";
|
|
37
|
+
flows?: {
|
|
38
|
+
total: number;
|
|
39
|
+
};
|
|
40
|
+
nodes?: {
|
|
41
|
+
total: number;
|
|
42
|
+
};
|
|
43
|
+
uptime?: number;
|
|
44
|
+
startTime?: number;
|
|
45
|
+
metrics?: {
|
|
46
|
+
mqttConnections: number;
|
|
47
|
+
activeTimers: number;
|
|
48
|
+
activeIntervals: number;
|
|
49
|
+
joinGroups: number;
|
|
50
|
+
batchGroups: number;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export declare class ServerFlowRuntime extends EventEmitter {
|
|
54
|
+
private tenantSlug;
|
|
55
|
+
private tenantId;
|
|
56
|
+
private flows;
|
|
57
|
+
private nodes;
|
|
58
|
+
private status;
|
|
59
|
+
private startTime;
|
|
60
|
+
private activeTimers;
|
|
61
|
+
private activeIntervals;
|
|
62
|
+
private flowContext;
|
|
63
|
+
private globalContext;
|
|
64
|
+
private nodeContext;
|
|
65
|
+
private mqttClients;
|
|
66
|
+
private mqttSubscriptions;
|
|
67
|
+
private joinGroups;
|
|
68
|
+
private batchGroups;
|
|
69
|
+
private rbeState;
|
|
70
|
+
private triggerState;
|
|
71
|
+
private linkNodes;
|
|
72
|
+
private edgeDataMap;
|
|
73
|
+
private framTopology;
|
|
74
|
+
private currentIteration;
|
|
75
|
+
private executionContext;
|
|
76
|
+
private pendingMessages;
|
|
77
|
+
private flowCycleId;
|
|
78
|
+
private erroredFlows;
|
|
79
|
+
private fastMode;
|
|
80
|
+
private fastModeMetadataSnapshots;
|
|
81
|
+
private fastModeMessageFlowData;
|
|
82
|
+
private fastModeOutputData;
|
|
83
|
+
private runningStats;
|
|
84
|
+
private suppressFunctionLogs;
|
|
85
|
+
private maxHops;
|
|
86
|
+
constructor(tenantSlug: string, tenantId: string);
|
|
87
|
+
/**
|
|
88
|
+
* Set the current simulation iteration for SSE message tagging
|
|
89
|
+
* Also stores in flow context so variables can access via flow.get('sim_iteration')
|
|
90
|
+
*/
|
|
91
|
+
setCurrentIteration(iteration: number): void;
|
|
92
|
+
/**
|
|
93
|
+
* Get the current simulation iteration
|
|
94
|
+
*/
|
|
95
|
+
getCurrentIteration(): number;
|
|
96
|
+
/**
|
|
97
|
+
* Set the execution context (floweditor, instantiator, scenario-compare, etc.)
|
|
98
|
+
*/
|
|
99
|
+
setExecutionContext(context: string): void;
|
|
100
|
+
/**
|
|
101
|
+
* Set maximum message hops for cycle protection
|
|
102
|
+
*/
|
|
103
|
+
setMaxHops(maxHops: number): void;
|
|
104
|
+
/**
|
|
105
|
+
* Get the current maximum hops setting
|
|
106
|
+
*/
|
|
107
|
+
getMaxHops(): number;
|
|
108
|
+
/**
|
|
109
|
+
* Enable/disable fast mode - suppresses debug SSE events for better performance
|
|
110
|
+
* Always clears accumulators and running stats for a fresh batch
|
|
111
|
+
*/
|
|
112
|
+
setFastMode(enabled: boolean): void;
|
|
113
|
+
/**
|
|
114
|
+
* Get accumulated metadata snapshots from fast mode execution
|
|
115
|
+
* Returns the array and clears it
|
|
116
|
+
*/
|
|
117
|
+
getAndClearFastModeMetadata(): any[];
|
|
118
|
+
/**
|
|
119
|
+
* Get accumulated message flow data from fast mode execution
|
|
120
|
+
* Returns the array and clears it
|
|
121
|
+
*/
|
|
122
|
+
getAndClearFastModeMessageFlow(): any[];
|
|
123
|
+
/**
|
|
124
|
+
* Get accumulated output data (chart-output/table-output) from fast mode execution
|
|
125
|
+
* Returns the array and clears it
|
|
126
|
+
*/
|
|
127
|
+
getAndClearFastModeOutputData(): any[];
|
|
128
|
+
/**
|
|
129
|
+
* Update running statistics for a single observation using Welford's online algorithm.
|
|
130
|
+
* O(1) per observation for mean/variance, O(n) memory for values (needed for percentiles).
|
|
131
|
+
*/
|
|
132
|
+
private updateRunningStats;
|
|
133
|
+
/**
|
|
134
|
+
* Get computed running statistics and clear them.
|
|
135
|
+
* Returns per-function, per-variable descriptive statistics including percentiles and histogram.
|
|
136
|
+
*/
|
|
137
|
+
getAndClearRunningStats(): Record<string, Record<string, {
|
|
138
|
+
count: number;
|
|
139
|
+
mean: number;
|
|
140
|
+
variance: number;
|
|
141
|
+
std: number;
|
|
142
|
+
min: number;
|
|
143
|
+
max: number;
|
|
144
|
+
sum: number;
|
|
145
|
+
p5: number;
|
|
146
|
+
p25: number;
|
|
147
|
+
p50: number;
|
|
148
|
+
p75: number;
|
|
149
|
+
p95: number;
|
|
150
|
+
histogram: Array<{
|
|
151
|
+
min: number;
|
|
152
|
+
max: number;
|
|
153
|
+
count: number;
|
|
154
|
+
percentage: number;
|
|
155
|
+
}>;
|
|
156
|
+
values: number[];
|
|
157
|
+
}>>;
|
|
158
|
+
/**
|
|
159
|
+
* Enable/disable function node console output on the server terminal.
|
|
160
|
+
* When suppressed, debug.log() and console.log from user function code
|
|
161
|
+
* are silenced on the server — SSE events are still emitted to the UI.
|
|
162
|
+
*/
|
|
163
|
+
setSuppressFunctionLogs(suppress: boolean): void;
|
|
164
|
+
/**
|
|
165
|
+
* Check if function logs are suppressed
|
|
166
|
+
*/
|
|
167
|
+
isFunctionLogsSuppressed(): boolean;
|
|
168
|
+
/**
|
|
169
|
+
* Get the execution context
|
|
170
|
+
*/
|
|
171
|
+
getExecutionContext(): string;
|
|
172
|
+
/**
|
|
173
|
+
* Check if any flow has encountered a critical error
|
|
174
|
+
*/
|
|
175
|
+
hasError(): boolean;
|
|
176
|
+
/**
|
|
177
|
+
* Get the error message if any flow has encountered an error
|
|
178
|
+
*/
|
|
179
|
+
getError(): string | null;
|
|
180
|
+
/**
|
|
181
|
+
* Start a new flow cycle with tracking
|
|
182
|
+
* Returns a cycle ID that can be used to wait for completion
|
|
183
|
+
*/
|
|
184
|
+
startFlowCycle(): string;
|
|
185
|
+
/**
|
|
186
|
+
* Get current pending message count
|
|
187
|
+
*/
|
|
188
|
+
getPendingMessageCount(): number;
|
|
189
|
+
/**
|
|
190
|
+
* Check if flow cycle is complete (no pending messages)
|
|
191
|
+
*/
|
|
192
|
+
isFlowCycleComplete(): boolean;
|
|
193
|
+
/**
|
|
194
|
+
* Wait for all pending messages to complete
|
|
195
|
+
* Used by batch-run to ensure async operations (HTTP, MQTT, CSV) finish before next iteration
|
|
196
|
+
* @param timeoutMs Maximum time to wait (default 30 seconds)
|
|
197
|
+
* @param pollIntervalMs How often to check (default 100ms)
|
|
198
|
+
*/
|
|
199
|
+
waitForPendingMessages(timeoutMs?: number, pollIntervalMs?: number): Promise<boolean>;
|
|
200
|
+
/**
|
|
201
|
+
* Increment pending message count
|
|
202
|
+
*/
|
|
203
|
+
private incrementPending;
|
|
204
|
+
/**
|
|
205
|
+
* Decrement pending message count and emit completion if done
|
|
206
|
+
*/
|
|
207
|
+
private decrementPending;
|
|
208
|
+
deploy(flowDefinitions: FlowDefinition[]): Promise<DeployResult>;
|
|
209
|
+
private initializeMqttNodes;
|
|
210
|
+
/**
|
|
211
|
+
* Execute an inject node by ID
|
|
212
|
+
*/
|
|
213
|
+
injectNode(nodeId: string): Promise<void>;
|
|
214
|
+
stop(flowId?: string): Promise<StopResult>;
|
|
215
|
+
start(flowId?: string): Promise<{
|
|
216
|
+
success: boolean;
|
|
217
|
+
error?: string;
|
|
218
|
+
}>;
|
|
219
|
+
getStatus(): Promise<RuntimeStatus>;
|
|
220
|
+
/**
|
|
221
|
+
* Clear all flow context variables and stateful node data
|
|
222
|
+
* Used before starting a new simulation to reset self-referential variables,
|
|
223
|
+
* join node pending messages, batch groups, etc.
|
|
224
|
+
*/
|
|
225
|
+
clearFlowContext(): string[];
|
|
226
|
+
/**
|
|
227
|
+
* Set a flow context value directly
|
|
228
|
+
* Used by multi-cycle controllers to store instantiation tracking info
|
|
229
|
+
*/
|
|
230
|
+
setFlowContextValue(key: string, value: any): void;
|
|
231
|
+
/**
|
|
232
|
+
* Get a flow context value directly
|
|
233
|
+
*/
|
|
234
|
+
getFlowContextValue(key: string): any;
|
|
235
|
+
/**
|
|
236
|
+
* Check if a node has any input connections (wires pointing TO it)
|
|
237
|
+
* Used to determine if observer nodes should be auto-triggered
|
|
238
|
+
*/
|
|
239
|
+
private nodeHasInputConnection;
|
|
240
|
+
/**
|
|
241
|
+
* Trigger observer nodes (coupling-matrix, resonance-indicator) that don't have input wires
|
|
242
|
+
* Called at the end of each iteration to auto-compute visualization data
|
|
243
|
+
* This method is safe to call - it only affects nodes without input connections
|
|
244
|
+
*/
|
|
245
|
+
triggerObserverNodes(): Promise<void>;
|
|
246
|
+
/**
|
|
247
|
+
* Emit system entropy data (always, regardless of node presence)
|
|
248
|
+
* This ensures the Entropy tab in the UI is always populated after simulation
|
|
249
|
+
*/
|
|
250
|
+
private emitSystemEntropyData;
|
|
251
|
+
executeNode(nodeId: string, inputMessage: any): Promise<void>;
|
|
252
|
+
private executeNodeByType;
|
|
253
|
+
private executeInject;
|
|
254
|
+
private executeDebug;
|
|
255
|
+
private executeFunction;
|
|
256
|
+
private executeChange;
|
|
257
|
+
private executeSwitch;
|
|
258
|
+
private executeTemplate;
|
|
259
|
+
private executeDelay;
|
|
260
|
+
private executeHttpRequest;
|
|
261
|
+
private executeDatabase;
|
|
262
|
+
private getDefaultPort;
|
|
263
|
+
private executePostgreSQL;
|
|
264
|
+
private executeMySQL;
|
|
265
|
+
private executeMSSQL;
|
|
266
|
+
private executeMqttIn;
|
|
267
|
+
private executeMqttOut;
|
|
268
|
+
private topicMatches;
|
|
269
|
+
private executeJson;
|
|
270
|
+
private executeCsv;
|
|
271
|
+
private executeXml;
|
|
272
|
+
private executeHtml;
|
|
273
|
+
private executeSplit;
|
|
274
|
+
private executeJoin;
|
|
275
|
+
private executeSort;
|
|
276
|
+
private executeBatch;
|
|
277
|
+
private executeRange;
|
|
278
|
+
private executeRbe;
|
|
279
|
+
private executeTrigger;
|
|
280
|
+
private executeLinkIn;
|
|
281
|
+
private executeLinkOut;
|
|
282
|
+
private getProperty;
|
|
283
|
+
private setProperty;
|
|
284
|
+
private deleteProperty;
|
|
285
|
+
private evaluateValue;
|
|
286
|
+
/**
|
|
287
|
+
* Execute coupling-matrix node: compute coupling strength between FRAM functions
|
|
288
|
+
* from accumulated message-flow history and emit coupling-data SSE event
|
|
289
|
+
*/
|
|
290
|
+
private executeCouplingMatrix;
|
|
291
|
+
/**
|
|
292
|
+
* Execute resonance-indicator node: compute functional resonance index
|
|
293
|
+
* from accumulated message-flow history using ENTROPY-BASED metrics
|
|
294
|
+
* Based on theoretical framework from docs/research/entropy-based-fram-analysis.md
|
|
295
|
+
*
|
|
296
|
+
* The Resonance Entropy Index (REI) formula:
|
|
297
|
+
* REI = α·Ĥ_activity + β·Ĥ_coupling + γ·Ĥ_aspect + δ·(1 - Ĥ_temporal)
|
|
298
|
+
*/
|
|
299
|
+
private executeResonanceIndicator;
|
|
300
|
+
private emitRuntimeEvent;
|
|
301
|
+
}
|
|
302
|
+
export {};
|
|
303
|
+
//# sourceMappingURL=ServerFlowRuntime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerFlowRuntime.d.ts","sourceRoot":"","sources":["../src/ServerFlowRuntime.ts"],"names":[],"mappings":"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"}
|