@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.
Files changed (58) hide show
  1. package/README.md +1 -1
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.js +6 -1
  4. package/dist/src/call-step-file.d.ts +9 -12
  5. package/dist/src/call-step-file.js +84 -28
  6. package/dist/src/cron-handler.d.ts +3 -4
  7. package/dist/src/cron-handler.js +5 -14
  8. package/dist/src/flows-config-endpoint.d.ts +2 -1
  9. package/dist/src/flows-config-endpoint.js +15 -32
  10. package/dist/src/flows-endpoint.d.ts +1 -41
  11. package/dist/src/flows-endpoint.js +13 -146
  12. package/dist/src/helper/flows-helper.d.ts +3 -0
  13. package/dist/src/helper/flows-helper.js +134 -0
  14. package/dist/src/locked-data.d.ts +2 -3
  15. package/dist/src/locked-data.js +3 -7
  16. package/dist/src/logger-factory.d.ts +4 -1
  17. package/dist/src/logger-factory.js +17 -4
  18. package/dist/src/logger.d.ts +17 -20
  19. package/dist/src/logger.js +23 -57
  20. package/dist/src/motia.d.ts +13 -0
  21. package/dist/src/motia.js +2 -0
  22. package/dist/src/node/node-runner.js +15 -4
  23. package/dist/src/observability/create-trace.d.ts +3 -0
  24. package/dist/src/observability/create-trace.js +21 -0
  25. package/dist/src/observability/index.d.ts +13 -0
  26. package/dist/src/observability/index.js +2 -0
  27. package/dist/src/observability/no-tracer.d.ts +8 -0
  28. package/dist/src/observability/no-tracer.js +13 -0
  29. package/dist/src/observability/stream-tracer.d.ts +21 -0
  30. package/dist/src/observability/stream-tracer.js +97 -0
  31. package/dist/src/observability/trace-manager.d.ts +12 -0
  32. package/dist/src/observability/trace-manager.js +23 -0
  33. package/dist/src/observability/tracer.d.ts +14 -0
  34. package/dist/src/observability/tracer.js +53 -0
  35. package/dist/src/observability/types.d.ts +74 -0
  36. package/dist/src/observability/types.js +2 -0
  37. package/dist/src/printer.d.ts +1 -1
  38. package/dist/src/printer.js +2 -2
  39. package/dist/src/process-communication/process-manager.d.ts +2 -2
  40. package/dist/src/python/python-runner.py +15 -6
  41. package/dist/src/python/type_definitions.py +0 -1
  42. package/dist/src/server.d.ts +5 -1
  43. package/dist/src/server.js +18 -22
  44. package/dist/src/state/adapters/default-state-adapter.js +1 -0
  45. package/dist/src/state/adapters/memory-state-adapter.d.ts +1 -1
  46. package/dist/src/state/adapters/memory-state-adapter.js +0 -2
  47. package/dist/src/step-handlers.d.ts +3 -3
  48. package/dist/src/step-handlers.js +10 -19
  49. package/dist/src/streams/flows-config-stream.d.ts +13 -0
  50. package/dist/src/streams/flows-config-stream.js +50 -0
  51. package/dist/src/streams/flows-stream.d.ts +6 -9
  52. package/dist/src/streams/flows-stream.js +11 -7
  53. package/dist/src/types/flows-config-types.d.ts +9 -0
  54. package/dist/src/types/flows-config-types.js +2 -0
  55. package/dist/src/types/flows-types.d.ts +37 -0
  56. package/dist/src/types/flows-types.js +2 -0
  57. package/dist/src/types.d.ts +4 -2
  58. 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
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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(baseDir: string);
32
+ constructor();
33
33
  printInvalidEmit(): void;
34
34
  printStepCreated(): void;
35
35
  printStepUpdated(): void;
@@ -102,8 +102,8 @@ class Printer {
102
102
  }
103
103
  exports.Printer = Printer;
104
104
  class NoPrinter extends Printer {
105
- constructor(baseDir) {
106
- super(baseDir);
105
+ constructor() {
106
+ super('');
107
107
  }
108
108
  printInvalidEmit() { }
109
109
  printStepCreated() { }
@@ -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 { BaseLogger } from '../logger';
4
+ import { Logger } from '../logger';
5
5
  export interface ProcessManagerOptions {
6
6
  command: string;
7
7
  args: string[];
8
- logger: BaseLogger;
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 Optional, Any, Callable, List, Dict
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
- print(f'Error running Python module: {error}', file=sys.stderr)
79
- traceback.print_exc(file=sys.stderr)
80
- sys.exit(1)
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:
@@ -1,6 +1,5 @@
1
1
  from typing import TypeVar, Callable, Coroutine, Union, Dict, List, Optional
2
2
  from types import SimpleNamespace
3
- from rpc import RpcSender
4
3
 
5
4
  # Generic type for JSON schema validation
6
5
  T = TypeVar('T')
@@ -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) => Promise<MotiaServer>;
23
+ export declare const createServer: (lockedData: LockedData, eventManager: EventManager, state: InternalStateManager, config: MotiaServerConfig) => MotiaServer;
20
24
  export {};
@@ -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 createServer = async (lockedData, eventManager, state, config) => {
26
- const printer = lockedData.printer;
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.__motia; // deleting because we don't need it in the socket
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.LoggerFactory(config.isVerbose, logStream);
109
- const cronManager = (0, cron_handler_1.setupCronHandlers)(lockedData, eventManager, state, loggerFactory);
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 request = {
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 data = request;
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, app);
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;
@@ -42,6 +42,7 @@ const path = __importStar(require("path"));
42
42
  class FileStateAdapter {
43
43
  constructor(config) {
44
44
  this.filePath = path.join(config.filePath, 'motia.state.json');
45
+ this.init();
45
46
  }
46
47
  init() {
47
48
  const dir = this.filePath.replace('motia.state.json', '');
@@ -1,7 +1,7 @@
1
1
  import { StateAdapter } from '../state-adapter';
2
2
  export declare class MemoryStateAdapter implements StateAdapter {
3
3
  private state;
4
- init(): Promise<void>;
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>;
@@ -4,8 +4,6 @@ exports.MemoryStateAdapter = void 0;
4
4
  class MemoryStateAdapter {
5
5
  constructor() {
6
6
  this.state = {};
7
- }
8
- async init() {
9
7
  this.state = {};
10
8
  }
11
9
  async getGroup(groupId) {
@@ -1,7 +1,7 @@
1
- import { EventConfig, EventManager, InternalStateManager, Step } from './types';
2
- import { LockedData } from './locked-data';
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: (lockedData: LockedData, eventManager: EventManager, state: InternalStateManager) => MotiaEventManager;
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 createStepHandlers = (lockedData, eventManager, state) => {
7
- const eventSteps = lockedData.eventSteps();
8
- const printer = lockedData.printer;
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 { logger, data, traceId } = event;
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
- export type Flow = {
4
- id: string;
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<Flow | null>;
11
- delete(id: string): Promise<Flow | null>;
12
- set(_: string, __: string, data: Flow): Promise<Flow>;
13
- getGroup(): Promise<Flow[]>;
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
- return (Object.entries(this.lockedData.flows)
12
- .map(([id, flow]) => ({ id, name: flow.name }))
13
- .find((flow) => flow.id === id) ?? null);
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
- async delete(id) {
16
- return { id, name: id };
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]) => ({ id, name: flow.name }));
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,9 @@
1
+ export interface FlowConfig {
2
+ id: string;
3
+ config: {
4
+ [filePath: string]: {
5
+ x: number;
6
+ y: number;
7
+ };
8
+ };
9
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });