@motiadev/core 0.2.2 → 0.3.0-beta.78
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 +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +6 -1
- package/dist/src/call-step-file.d.ts +9 -12
- package/dist/src/call-step-file.js +84 -28
- package/dist/src/cron-handler.d.ts +3 -4
- package/dist/src/cron-handler.js +5 -14
- package/dist/src/flows-config-endpoint.d.ts +2 -1
- package/dist/src/flows-config-endpoint.js +15 -32
- package/dist/src/flows-endpoint.d.ts +1 -41
- package/dist/src/flows-endpoint.js +13 -146
- package/dist/src/helper/flows-helper.d.ts +3 -0
- package/dist/src/helper/flows-helper.js +134 -0
- package/dist/src/locked-data.d.ts +2 -3
- package/dist/src/locked-data.js +3 -7
- package/dist/src/logger-factory.d.ts +4 -1
- package/dist/src/logger-factory.js +17 -4
- package/dist/src/logger.d.ts +17 -20
- package/dist/src/logger.js +23 -57
- package/dist/src/motia.d.ts +13 -0
- package/dist/src/motia.js +2 -0
- package/dist/src/node/node-runner.js +15 -4
- package/dist/src/observability/create-trace.d.ts +3 -0
- package/dist/src/observability/create-trace.js +21 -0
- package/dist/src/observability/index.d.ts +13 -0
- package/dist/src/observability/index.js +2 -0
- package/dist/src/observability/no-tracer.d.ts +8 -0
- package/dist/src/observability/no-tracer.js +13 -0
- package/dist/src/observability/stream-tracer.d.ts +21 -0
- package/dist/src/observability/stream-tracer.js +97 -0
- package/dist/src/observability/trace-manager.d.ts +12 -0
- package/dist/src/observability/trace-manager.js +23 -0
- package/dist/src/observability/tracer.d.ts +14 -0
- package/dist/src/observability/tracer.js +53 -0
- package/dist/src/observability/types.d.ts +74 -0
- package/dist/src/observability/types.js +2 -0
- package/dist/src/printer.d.ts +1 -1
- package/dist/src/printer.js +2 -2
- package/dist/src/process-communication/process-manager.d.ts +2 -2
- package/dist/src/python/python-runner.py +15 -6
- package/dist/src/python/type_definitions.py +0 -1
- package/dist/src/server.d.ts +5 -1
- package/dist/src/server.js +18 -22
- package/dist/src/state/adapters/default-state-adapter.js +1 -0
- package/dist/src/state/adapters/memory-state-adapter.d.ts +1 -1
- package/dist/src/state/adapters/memory-state-adapter.js +0 -2
- package/dist/src/step-handlers.d.ts +3 -3
- package/dist/src/step-handlers.js +10 -19
- package/dist/src/streams/flows-config-stream.d.ts +13 -0
- package/dist/src/streams/flows-config-stream.js +50 -0
- package/dist/src/streams/flows-stream.d.ts +6 -9
- package/dist/src/streams/flows-stream.js +11 -7
- package/dist/src/types/flows-config-types.d.ts +9 -0
- package/dist/src/types/flows-config-types.js +2 -0
- package/dist/src/types/flows-types.d.ts +37 -0
- package/dist/src/types/flows-types.js +2 -0
- package/dist/src/types.d.ts +4 -2
- package/package.json +1 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TraceManager = void 0;
|
|
4
|
+
class TraceManager {
|
|
5
|
+
constructor(traceStream, traceGroupStream, traceGroup, trace) {
|
|
6
|
+
this.traceStream = traceStream;
|
|
7
|
+
this.traceGroupStream = traceGroupStream;
|
|
8
|
+
this.traceGroup = traceGroup;
|
|
9
|
+
this.trace = trace;
|
|
10
|
+
this.updateTrace();
|
|
11
|
+
this.updateTraceGroup();
|
|
12
|
+
}
|
|
13
|
+
updateTrace() {
|
|
14
|
+
this.traceStream.set(this.traceGroup.id, this.trace.id, this.trace);
|
|
15
|
+
}
|
|
16
|
+
updateTraceGroup() {
|
|
17
|
+
this.traceGroupStream.set('default', this.traceGroup.id, this.traceGroup);
|
|
18
|
+
}
|
|
19
|
+
child(trace) {
|
|
20
|
+
return new TraceManager(this.traceStream, this.traceGroupStream, this.traceGroup, trace);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.TraceManager = TraceManager;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { TracerFactory } from '.';
|
|
2
|
+
import { LockedData } from '../locked-data';
|
|
3
|
+
import { Logger } from '../logger';
|
|
4
|
+
import { Step } from '../types';
|
|
5
|
+
import { MotiaStream } from '../types-stream';
|
|
6
|
+
import { StreamTracer } from './stream-tracer';
|
|
7
|
+
import { Trace, TraceGroup } from './types';
|
|
8
|
+
export declare class BaseTracerFactory implements TracerFactory {
|
|
9
|
+
private readonly traceStream;
|
|
10
|
+
private readonly traceGroupStream;
|
|
11
|
+
constructor(traceStream: MotiaStream<Trace>, traceGroupStream: MotiaStream<TraceGroup>);
|
|
12
|
+
createTracer(traceId: string, step: Step, logger: Logger): StreamTracer;
|
|
13
|
+
}
|
|
14
|
+
export declare const createTracerFactory: (lockedData: LockedData) => TracerFactory;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTracerFactory = exports.BaseTracerFactory = void 0;
|
|
4
|
+
const create_trace_1 = require("./create-trace");
|
|
5
|
+
const stream_tracer_1 = require("./stream-tracer");
|
|
6
|
+
const trace_manager_1 = require("./trace-manager");
|
|
7
|
+
class BaseTracerFactory {
|
|
8
|
+
constructor(traceStream, traceGroupStream) {
|
|
9
|
+
this.traceStream = traceStream;
|
|
10
|
+
this.traceGroupStream = traceGroupStream;
|
|
11
|
+
}
|
|
12
|
+
createTracer(traceId, step, logger) {
|
|
13
|
+
const traceGroup = {
|
|
14
|
+
id: traceId,
|
|
15
|
+
name: step.config.name,
|
|
16
|
+
lastActivity: Date.now(),
|
|
17
|
+
metadata: {
|
|
18
|
+
completedSteps: 0,
|
|
19
|
+
activeSteps: 0,
|
|
20
|
+
totalSteps: 0,
|
|
21
|
+
},
|
|
22
|
+
correlationId: undefined,
|
|
23
|
+
status: 'running',
|
|
24
|
+
startTime: Date.now(),
|
|
25
|
+
};
|
|
26
|
+
const trace = (0, create_trace_1.createTrace)(traceGroup, step);
|
|
27
|
+
const manager = new trace_manager_1.TraceManager(this.traceStream, this.traceGroupStream, traceGroup, trace);
|
|
28
|
+
return new stream_tracer_1.StreamTracer(manager, traceGroup, trace, logger);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.BaseTracerFactory = BaseTracerFactory;
|
|
32
|
+
const createTracerFactory = (lockedData) => {
|
|
33
|
+
const traceStream = lockedData.createStream({
|
|
34
|
+
filePath: '__motia.trace',
|
|
35
|
+
hidden: true,
|
|
36
|
+
config: {
|
|
37
|
+
name: 'motia-trace',
|
|
38
|
+
baseConfig: { storageType: 'default' },
|
|
39
|
+
schema: null,
|
|
40
|
+
},
|
|
41
|
+
})();
|
|
42
|
+
const traceGroupStream = lockedData.createStream({
|
|
43
|
+
filePath: '__motia.trace-group',
|
|
44
|
+
hidden: true,
|
|
45
|
+
config: {
|
|
46
|
+
name: 'motia-trace-group',
|
|
47
|
+
baseConfig: { storageType: 'default' },
|
|
48
|
+
schema: null,
|
|
49
|
+
},
|
|
50
|
+
})();
|
|
51
|
+
return new BaseTracerFactory(traceStream, traceGroupStream);
|
|
52
|
+
};
|
|
53
|
+
exports.createTracerFactory = createTracerFactory;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { StepConfig } from '../types';
|
|
2
|
+
export interface TraceGroup {
|
|
3
|
+
id: string;
|
|
4
|
+
correlationId: string | undefined;
|
|
5
|
+
name: string;
|
|
6
|
+
status: 'running' | 'completed' | 'failed';
|
|
7
|
+
startTime: number;
|
|
8
|
+
endTime?: number;
|
|
9
|
+
lastActivity: number;
|
|
10
|
+
metadata: {
|
|
11
|
+
completedSteps: number;
|
|
12
|
+
activeSteps: number;
|
|
13
|
+
totalSteps: number;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export type TraceError = {
|
|
17
|
+
message: string;
|
|
18
|
+
code?: string | number;
|
|
19
|
+
stack?: string;
|
|
20
|
+
};
|
|
21
|
+
export interface Trace {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
correlationId?: string;
|
|
25
|
+
parentTraceId?: string;
|
|
26
|
+
status: 'running' | 'completed' | 'failed';
|
|
27
|
+
startTime: number;
|
|
28
|
+
endTime?: number;
|
|
29
|
+
error?: TraceError;
|
|
30
|
+
entryPoint: {
|
|
31
|
+
type: StepConfig['type'];
|
|
32
|
+
stepName: string;
|
|
33
|
+
};
|
|
34
|
+
events: TraceEvent[];
|
|
35
|
+
}
|
|
36
|
+
export type TraceEvent = StateEvent | EmitEvent | StreamEvent | LogEntry;
|
|
37
|
+
export type StateOperation = 'get' | 'getGroup' | 'set' | 'delete' | 'clear';
|
|
38
|
+
export type StreamOperation = 'get' | 'getGroup' | 'set' | 'delete' | 'clear' | 'send';
|
|
39
|
+
export interface StateEvent {
|
|
40
|
+
type: 'state';
|
|
41
|
+
timestamp: number;
|
|
42
|
+
operation: 'get' | 'getGroup' | 'set' | 'delete' | 'clear';
|
|
43
|
+
key?: string;
|
|
44
|
+
duration?: number;
|
|
45
|
+
data: unknown;
|
|
46
|
+
}
|
|
47
|
+
export interface EmitEvent {
|
|
48
|
+
type: 'emit';
|
|
49
|
+
timestamp: number;
|
|
50
|
+
topic: string;
|
|
51
|
+
success: boolean;
|
|
52
|
+
data: unknown;
|
|
53
|
+
}
|
|
54
|
+
export interface StreamEvent {
|
|
55
|
+
type: 'stream';
|
|
56
|
+
timestamp: number;
|
|
57
|
+
operation: StreamOperation;
|
|
58
|
+
streamName: string;
|
|
59
|
+
duration?: number;
|
|
60
|
+
maxTimestamp?: number;
|
|
61
|
+
data: {
|
|
62
|
+
groupId: string;
|
|
63
|
+
id: string;
|
|
64
|
+
data?: unknown;
|
|
65
|
+
};
|
|
66
|
+
calls: number;
|
|
67
|
+
}
|
|
68
|
+
export interface LogEntry {
|
|
69
|
+
type: 'log';
|
|
70
|
+
timestamp: number;
|
|
71
|
+
level: string;
|
|
72
|
+
message: string;
|
|
73
|
+
metadata?: unknown;
|
|
74
|
+
}
|
package/dist/src/printer.d.ts
CHANGED
|
@@ -29,7 +29,7 @@ export declare class Printer {
|
|
|
29
29
|
getStreamPath(stream: Stream): string;
|
|
30
30
|
}
|
|
31
31
|
export declare class NoPrinter extends Printer {
|
|
32
|
-
constructor(
|
|
32
|
+
constructor();
|
|
33
33
|
printInvalidEmit(): void;
|
|
34
34
|
printStepCreated(): void;
|
|
35
35
|
printStepUpdated(): void;
|
package/dist/src/printer.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { ChildProcess } from 'child_process';
|
|
2
2
|
import { CommunicationType } from './communication-config';
|
|
3
3
|
import { RpcHandler, MessageCallback } from './rpc-processor-interface';
|
|
4
|
-
import {
|
|
4
|
+
import { Logger } from '../logger';
|
|
5
5
|
export interface ProcessManagerOptions {
|
|
6
6
|
command: string;
|
|
7
7
|
args: string[];
|
|
8
|
-
logger:
|
|
8
|
+
logger: Logger;
|
|
9
9
|
context?: string;
|
|
10
10
|
}
|
|
11
11
|
export declare class ProcessManager {
|
|
@@ -4,9 +4,8 @@ import importlib.util
|
|
|
4
4
|
import os
|
|
5
5
|
import asyncio
|
|
6
6
|
import traceback
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import Callable, List, Dict
|
|
8
8
|
from rpc import RpcSender
|
|
9
|
-
from type_definitions import FlowConfig, ApiResponse
|
|
10
9
|
from context import Context
|
|
11
10
|
from middleware import compose_middleware
|
|
12
11
|
from rpc_stream_manager import RpcStreamManager
|
|
@@ -42,7 +41,6 @@ async def run_python_module(file_path: str, rpc: RpcSender, args: Dict) -> None:
|
|
|
42
41
|
raise AttributeError(f"Function 'handler' not found in module {file_path}")
|
|
43
42
|
|
|
44
43
|
config = module.config
|
|
45
|
-
is_api_handler = (config and config.get("type") == "api")
|
|
46
44
|
|
|
47
45
|
trace_id = args.get("traceId")
|
|
48
46
|
flows = args.get("flows") or []
|
|
@@ -75,9 +73,20 @@ async def run_python_module(file_path: str, rpc: RpcSender, args: Dict) -> None:
|
|
|
75
73
|
rpc.close()
|
|
76
74
|
|
|
77
75
|
except Exception as error:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
stack_list = traceback.format_exception(type(error), error, error.__traceback__)
|
|
77
|
+
|
|
78
|
+
# We're removing the first two and last item
|
|
79
|
+
# 0: Traceback (most recent call last):
|
|
80
|
+
# 1: File "python-runner.py", line 82, in run_python_module
|
|
81
|
+
# 2: File "python-runner.py", line 69, in run_python_module
|
|
82
|
+
# -1: Exception: message
|
|
83
|
+
stack_list = stack_list[3:-1]
|
|
84
|
+
|
|
85
|
+
rpc.send_no_wait("close", {
|
|
86
|
+
"message": str(error),
|
|
87
|
+
"stack": "\n".join(stack_list)
|
|
88
|
+
})
|
|
89
|
+
rpc.close()
|
|
81
90
|
|
|
82
91
|
if __name__ == "__main__":
|
|
83
92
|
if len(sys.argv) < 2:
|
package/dist/src/server.d.ts
CHANGED
|
@@ -3,7 +3,9 @@ import http from 'http';
|
|
|
3
3
|
import { Server as WsServer } from 'ws';
|
|
4
4
|
import { CronManager } from './cron-handler';
|
|
5
5
|
import { LockedData } from './locked-data';
|
|
6
|
+
import { MotiaEventManager } from './step-handlers';
|
|
6
7
|
import { ApiRouteConfig, EventManager, InternalStateManager, Step } from './types';
|
|
8
|
+
import { Printer } from './printer';
|
|
7
9
|
export type MotiaServer = {
|
|
8
10
|
app: Express;
|
|
9
11
|
server: http.Server;
|
|
@@ -12,9 +14,11 @@ export type MotiaServer = {
|
|
|
12
14
|
removeRoute: (step: Step<ApiRouteConfig>) => void;
|
|
13
15
|
addRoute: (step: Step<ApiRouteConfig>) => void;
|
|
14
16
|
cronManager: CronManager;
|
|
17
|
+
motiaEventManager: MotiaEventManager;
|
|
15
18
|
};
|
|
16
19
|
type MotiaServerConfig = {
|
|
17
20
|
isVerbose: boolean;
|
|
21
|
+
printer?: Printer;
|
|
18
22
|
};
|
|
19
|
-
export declare const createServer: (lockedData: LockedData, eventManager: EventManager, state: InternalStateManager, config: MotiaServerConfig) =>
|
|
23
|
+
export declare const createServer: (lockedData: LockedData, eventManager: EventManager, state: InternalStateManager, config: MotiaServerConfig) => MotiaServer;
|
|
20
24
|
export {};
|
package/dist/src/server.js
CHANGED
|
@@ -16,14 +16,17 @@ const flows_config_endpoint_1 = require("./flows-config-endpoint");
|
|
|
16
16
|
const flows_endpoint_1 = require("./flows-endpoint");
|
|
17
17
|
const generate_trace_id_1 = require("./generate-trace-id");
|
|
18
18
|
const guards_1 = require("./guards");
|
|
19
|
-
const logger_1 = require("./logger");
|
|
20
19
|
const logger_factory_1 = require("./logger-factory");
|
|
20
|
+
const tracer_1 = require("./observability/tracer");
|
|
21
21
|
const socket_server_1 = require("./socket-server");
|
|
22
|
+
const step_handlers_1 = require("./step-handlers");
|
|
22
23
|
const steps_1 = require("./steps");
|
|
23
24
|
const api_endpoints_1 = require("./streams/api-endpoints");
|
|
24
25
|
const logs_stream_1 = require("./streams/logs-stream");
|
|
25
|
-
const
|
|
26
|
-
|
|
26
|
+
const logger_1 = require("./logger");
|
|
27
|
+
const printer_1 = require("./printer");
|
|
28
|
+
const createServer = (lockedData, eventManager, state, config) => {
|
|
29
|
+
const printer = config.printer ?? new printer_1.Printer(process.cwd());
|
|
27
30
|
const app = (0, express_1.default)();
|
|
28
31
|
const server = http_1.default.createServer(app);
|
|
29
32
|
const { pushEvent, socketServer } = (0, socket_server_1.createSocketServer)({
|
|
@@ -33,7 +36,7 @@ const createServer = async (lockedData, eventManager, state, config) => {
|
|
|
33
36
|
const stream = streams[streamName];
|
|
34
37
|
if (stream) {
|
|
35
38
|
const result = await stream().get(groupId, id);
|
|
36
|
-
delete result
|
|
39
|
+
delete result?.__motia; // deleting because we don't need it in the socket
|
|
37
40
|
return result;
|
|
38
41
|
}
|
|
39
42
|
},
|
|
@@ -105,33 +108,26 @@ const createServer = async (lockedData, eventManager, state, config) => {
|
|
|
105
108
|
},
|
|
106
109
|
})();
|
|
107
110
|
const allSteps = [...steps_1.systemSteps, ...lockedData.activeSteps];
|
|
108
|
-
const loggerFactory = new logger_factory_1.
|
|
109
|
-
const
|
|
111
|
+
const loggerFactory = new logger_factory_1.BaseLoggerFactory(config.isVerbose, logStream);
|
|
112
|
+
const tracerFactory = (0, tracer_1.createTracerFactory)(lockedData);
|
|
113
|
+
const motia = { loggerFactory, eventManager, state, lockedData, printer, tracerFactory };
|
|
114
|
+
const cronManager = (0, cron_handler_1.setupCronHandlers)(motia);
|
|
115
|
+
const motiaEventManager = (0, step_handlers_1.createStepHandlers)(motia);
|
|
110
116
|
const asyncHandler = (step) => {
|
|
111
117
|
return async (req, res) => {
|
|
112
118
|
const traceId = (0, generate_trace_id_1.generateTraceId)();
|
|
113
119
|
const { name: stepName, flows } = step.config;
|
|
114
120
|
const logger = loggerFactory.create({ traceId, flows, stepName });
|
|
121
|
+
const tracer = motia.tracerFactory.createTracer(traceId, step, logger);
|
|
115
122
|
logger.debug('[API] Received request, processing step', { path: req.path });
|
|
116
|
-
const
|
|
123
|
+
const data = {
|
|
117
124
|
body: req.body,
|
|
118
125
|
headers: req.headers,
|
|
119
126
|
pathParams: req.params,
|
|
120
127
|
queryParams: req.query,
|
|
121
128
|
};
|
|
122
129
|
try {
|
|
123
|
-
const
|
|
124
|
-
const result = await (0, call_step_file_1.callStepFile)({
|
|
125
|
-
contextInFirstArg: false,
|
|
126
|
-
lockedData,
|
|
127
|
-
data,
|
|
128
|
-
step,
|
|
129
|
-
printer,
|
|
130
|
-
logger,
|
|
131
|
-
eventManager,
|
|
132
|
-
state,
|
|
133
|
-
traceId,
|
|
134
|
-
});
|
|
130
|
+
const result = await (0, call_step_file_1.callStepFile)({ data, step, logger, tracer, traceId }, motia);
|
|
135
131
|
if (!result) {
|
|
136
132
|
console.log('no result');
|
|
137
133
|
res.status(500).json({ error: 'Internal server error' });
|
|
@@ -194,8 +190,8 @@ const createServer = async (lockedData, eventManager, state, config) => {
|
|
|
194
190
|
app.use((0, cors_1.default)());
|
|
195
191
|
app.use(router);
|
|
196
192
|
(0, api_endpoints_1.apiEndpoints)(lockedData);
|
|
197
|
-
(0, flows_endpoint_1.flowsEndpoint)(lockedData
|
|
198
|
-
(0, flows_config_endpoint_1.flowsConfigEndpoint)(app, process.cwd());
|
|
193
|
+
(0, flows_endpoint_1.flowsEndpoint)(lockedData);
|
|
194
|
+
(0, flows_config_endpoint_1.flowsConfigEndpoint)(app, process.cwd(), lockedData);
|
|
199
195
|
(0, analytics_endpoint_1.analyticsEndpoint)(app, process.cwd());
|
|
200
196
|
server.on('error', (error) => {
|
|
201
197
|
console.error('Server error:', error);
|
|
@@ -204,6 +200,6 @@ const createServer = async (lockedData, eventManager, state, config) => {
|
|
|
204
200
|
cronManager.close();
|
|
205
201
|
socketServer.close();
|
|
206
202
|
};
|
|
207
|
-
return { app, server, socketServer, close, removeRoute, addRoute, cronManager };
|
|
203
|
+
return { app, server, socketServer, close, removeRoute, addRoute, cronManager, motiaEventManager };
|
|
208
204
|
};
|
|
209
205
|
exports.createServer = createServer;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { StateAdapter } from '../state-adapter';
|
|
2
2
|
export declare class MemoryStateAdapter implements StateAdapter {
|
|
3
3
|
private state;
|
|
4
|
-
|
|
4
|
+
constructor();
|
|
5
5
|
getGroup<T>(groupId: string): Promise<T[]>;
|
|
6
6
|
get<T>(traceId: string, key: string): Promise<T | null>;
|
|
7
7
|
set<T>(traceId: string, key: string, value: T): Promise<T>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Motia } from './motia';
|
|
2
|
+
import { EventConfig, Step } from './types';
|
|
3
3
|
export type MotiaEventManager = {
|
|
4
4
|
createHandler: (step: Step<EventConfig>) => void;
|
|
5
5
|
removeHandler: (step: Step<EventConfig>) => void;
|
|
6
6
|
};
|
|
7
|
-
export declare const createStepHandlers: (
|
|
7
|
+
export declare const createStepHandlers: (motia: Motia) => MotiaEventManager;
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createStepHandlers = void 0;
|
|
4
|
-
const logger_1 = require("./logger");
|
|
5
4
|
const call_step_file_1 = require("./call-step-file");
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
const
|
|
5
|
+
const logger_1 = require("./logger");
|
|
6
|
+
const createStepHandlers = (motia) => {
|
|
7
|
+
const eventSteps = motia.lockedData.eventSteps();
|
|
9
8
|
logger_1.globalLogger.debug(`[step handler] creating step handlers for ${eventSteps.length} steps`);
|
|
10
9
|
const removeLogger = (event) => {
|
|
11
10
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
12
|
-
const { logger, ...rest } = event;
|
|
11
|
+
const { logger, tracer, ...rest } = event;
|
|
13
12
|
return rest;
|
|
14
13
|
};
|
|
15
14
|
const createHandler = (step) => {
|
|
@@ -17,25 +16,17 @@ const createStepHandlers = (lockedData, eventManager, state) => {
|
|
|
17
16
|
const { subscribes, name } = config;
|
|
18
17
|
logger_1.globalLogger.debug('[step handler] establishing step subscriptions', { filePath, step: step.config.name });
|
|
19
18
|
subscribes.forEach((subscribe) => {
|
|
20
|
-
eventManager.subscribe({
|
|
19
|
+
motia.eventManager.subscribe({
|
|
21
20
|
filePath,
|
|
22
21
|
event: subscribe,
|
|
23
22
|
handlerName: step.config.name,
|
|
24
23
|
handler: async (event) => {
|
|
25
|
-
const {
|
|
24
|
+
const { data, traceId } = event;
|
|
25
|
+
const logger = event.logger.child(step);
|
|
26
|
+
const tracer = event.tracer.child(step, logger);
|
|
26
27
|
logger_1.globalLogger.debug('[step handler] received event', { event: removeLogger(event), step: name });
|
|
27
28
|
try {
|
|
28
|
-
await (0, call_step_file_1.callStepFile)({
|
|
29
|
-
contextInFirstArg: false,
|
|
30
|
-
step,
|
|
31
|
-
printer,
|
|
32
|
-
eventManager,
|
|
33
|
-
state,
|
|
34
|
-
lockedData,
|
|
35
|
-
data,
|
|
36
|
-
traceId,
|
|
37
|
-
logger,
|
|
38
|
-
});
|
|
29
|
+
await (0, call_step_file_1.callStepFile)({ step, data, traceId, tracer, logger }, motia);
|
|
39
30
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
40
31
|
}
|
|
41
32
|
catch (error) {
|
|
@@ -50,7 +41,7 @@ const createStepHandlers = (lockedData, eventManager, state) => {
|
|
|
50
41
|
const { config, filePath } = step;
|
|
51
42
|
const { subscribes } = config;
|
|
52
43
|
subscribes.forEach((subscribe) => {
|
|
53
|
-
eventManager.unsubscribe({ filePath, event: subscribe });
|
|
44
|
+
motia.eventManager.unsubscribe({ filePath, event: subscribe });
|
|
54
45
|
});
|
|
55
46
|
};
|
|
56
47
|
eventSteps.forEach(createHandler);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { StreamAdapter } from './adapters/stream-adapter';
|
|
2
|
+
import { FlowConfig } from '../types/flows-config-types';
|
|
3
|
+
export declare class FlowsConfigStream extends StreamAdapter<FlowConfig> {
|
|
4
|
+
private readonly configPath;
|
|
5
|
+
private config;
|
|
6
|
+
constructor(configPath: string);
|
|
7
|
+
private getConfig;
|
|
8
|
+
private setConfig;
|
|
9
|
+
get(_: string, id: string): Promise<FlowConfig | null>;
|
|
10
|
+
delete(_: string): Promise<null>;
|
|
11
|
+
set(_: string, id: string, data: FlowConfig): Promise<FlowConfig>;
|
|
12
|
+
getGroup(): Promise<FlowConfig[]>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.FlowsConfigStream = void 0;
|
|
7
|
+
const stream_adapter_1 = require("./adapters/stream-adapter");
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
class FlowsConfigStream extends stream_adapter_1.StreamAdapter {
|
|
10
|
+
constructor(configPath) {
|
|
11
|
+
super();
|
|
12
|
+
this.configPath = configPath;
|
|
13
|
+
this.config = [];
|
|
14
|
+
}
|
|
15
|
+
getConfig() {
|
|
16
|
+
if (this.config.length === 0) {
|
|
17
|
+
if (fs_1.default.existsSync(this.configPath)) {
|
|
18
|
+
this.config = JSON.parse(fs_1.default.readFileSync(this.configPath, 'utf8') || '[]');
|
|
19
|
+
if (!Array.isArray(this.config)) {
|
|
20
|
+
this.config = [];
|
|
21
|
+
this.setConfig(this.config);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return this.config;
|
|
26
|
+
}
|
|
27
|
+
setConfig(config) {
|
|
28
|
+
this.config = config;
|
|
29
|
+
fs_1.default.writeFileSync(this.configPath, JSON.stringify(config, null, 2), 'utf8');
|
|
30
|
+
}
|
|
31
|
+
async get(_, id) {
|
|
32
|
+
const allFlowsConfig = this.getConfig();
|
|
33
|
+
return allFlowsConfig.find((flow) => flow.id === id) || null;
|
|
34
|
+
}
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
36
|
+
async delete(_) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
async set(_, id, data) {
|
|
40
|
+
const existingConfig = this.getConfig();
|
|
41
|
+
const updatedConfig = existingConfig.filter((item) => item.id !== id);
|
|
42
|
+
updatedConfig.push(data);
|
|
43
|
+
this.setConfig(updatedConfig);
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
async getGroup() {
|
|
47
|
+
return this.getConfig();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.FlowsConfigStream = FlowsConfigStream;
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import { LockedData } from '../locked-data';
|
|
2
2
|
import { StreamAdapter } from './adapters/stream-adapter';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
name: string;
|
|
6
|
-
};
|
|
7
|
-
export declare class FlowsStream extends StreamAdapter<Flow> {
|
|
3
|
+
import { FlowResponse } from '../types/flows-types';
|
|
4
|
+
export declare class FlowsStream extends StreamAdapter<FlowResponse> {
|
|
8
5
|
private readonly lockedData;
|
|
9
6
|
constructor(lockedData: LockedData);
|
|
10
|
-
get(id: string): Promise<
|
|
11
|
-
delete(
|
|
12
|
-
set(_: string, __: string, data:
|
|
13
|
-
getGroup(): Promise<
|
|
7
|
+
get(_: string, id: string): Promise<FlowResponse | null>;
|
|
8
|
+
delete(_: string): Promise<FlowResponse | null>;
|
|
9
|
+
set(_: string, __: string, data: FlowResponse): Promise<FlowResponse>;
|
|
10
|
+
getGroup(): Promise<FlowResponse[]>;
|
|
14
11
|
}
|
|
@@ -2,18 +2,22 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.FlowsStream = void 0;
|
|
4
4
|
const stream_adapter_1 = require("./adapters/stream-adapter");
|
|
5
|
+
const flows_helper_1 = require("../helper/flows-helper");
|
|
5
6
|
class FlowsStream extends stream_adapter_1.StreamAdapter {
|
|
6
7
|
constructor(lockedData) {
|
|
7
8
|
super();
|
|
8
9
|
this.lockedData = lockedData;
|
|
9
10
|
}
|
|
10
|
-
async get(id) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
async get(_, id) {
|
|
12
|
+
const flow = this.lockedData.flows[id];
|
|
13
|
+
if (!flow) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return (0, flows_helper_1.generateFlow)(id, flow.steps);
|
|
14
17
|
}
|
|
15
|
-
|
|
16
|
-
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
19
|
+
async delete(_) {
|
|
20
|
+
return null;
|
|
17
21
|
}
|
|
18
22
|
async set(_, __, data) {
|
|
19
23
|
return data;
|
|
@@ -23,7 +27,7 @@ class FlowsStream extends stream_adapter_1.StreamAdapter {
|
|
|
23
27
|
* Get list should receive a groupId argument but that's irrelevant for this stream
|
|
24
28
|
* since we only have one group of flows.
|
|
25
29
|
*/
|
|
26
|
-
return Object.entries(this.lockedData.flows).map(([id, flow]) => (
|
|
30
|
+
return Object.entries(this.lockedData.flows).map(([id, flow]) => (0, flows_helper_1.generateFlow)(id, flow.steps));
|
|
27
31
|
}
|
|
28
32
|
}
|
|
29
33
|
exports.FlowsStream = FlowsStream;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Emit } from '../types';
|
|
2
|
+
export type FlowListResponse = {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
};
|
|
6
|
+
export type EdgeData = {
|
|
7
|
+
variant: 'event' | 'virtual';
|
|
8
|
+
topic: string;
|
|
9
|
+
label?: string;
|
|
10
|
+
labelVariant?: 'default' | 'conditional';
|
|
11
|
+
};
|
|
12
|
+
export type FlowEdge = {
|
|
13
|
+
id: string;
|
|
14
|
+
source: string;
|
|
15
|
+
target: string;
|
|
16
|
+
data: EdgeData;
|
|
17
|
+
};
|
|
18
|
+
export type FlowStepResponse = {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
type: 'event' | 'api' | 'noop' | 'cron';
|
|
22
|
+
description?: string;
|
|
23
|
+
subscribes?: string[];
|
|
24
|
+
emits: Emit[];
|
|
25
|
+
virtualEmits?: Emit[];
|
|
26
|
+
action?: 'webhook';
|
|
27
|
+
webhookUrl?: string;
|
|
28
|
+
bodySchema?: unknown;
|
|
29
|
+
language?: string;
|
|
30
|
+
nodeComponentPath?: string;
|
|
31
|
+
filePath?: string;
|
|
32
|
+
cronExpression?: string;
|
|
33
|
+
};
|
|
34
|
+
export type FlowResponse = FlowListResponse & {
|
|
35
|
+
steps: FlowStepResponse[];
|
|
36
|
+
edges: FlowEdge[];
|
|
37
|
+
};
|