@motiadev/core 0.1.0-beta.11 → 0.1.0-beta.13

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.
@@ -38,7 +38,7 @@ const getStepConfig = (file) => {
38
38
  });
39
39
  child.on('message', (message) => {
40
40
  logger_1.globalLogger.debug('[Config] Read config', { config: message });
41
- config = command === 'node' ? eval('(' + message + ')') : message;
41
+ config = message;
42
42
  resolve(config);
43
43
  child.kill(); // we can kill the child process since we already received the message
44
44
  });
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const path_1 = __importDefault(require("path"));
7
7
  const zod_1 = require("zod");
8
8
  const zod_to_json_schema_1 = __importDefault(require("zod-to-json-schema"));
9
- const serialize_javascript_1 = __importDefault(require("serialize-javascript"));
10
9
  // Add ts-node registration before dynamic imports
11
10
  // eslint-disable-next-line @typescript-eslint/no-require-imports
12
11
  require('ts-node').register({
@@ -27,7 +26,7 @@ async function getConfig(filePath) {
27
26
  else if (module.config.bodySchema instanceof zod_1.ZodObject) {
28
27
  module.config.bodySchema = (0, zod_to_json_schema_1.default)(module.config.bodySchema);
29
28
  }
30
- process.send?.((0, serialize_javascript_1.default)(module.config));
29
+ process.send?.(module.config);
31
30
  process.exit(0);
32
31
  }
33
32
  catch (error) {
@@ -0,0 +1 @@
1
+ export declare const composeMiddleware: (...middlewares: any[]) => (req: any, ctx: any, handler: () => Promise<any>) => Promise<any>;
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = (...middlewares) => {
3
+ exports.composeMiddleware = void 0;
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ const composeMiddleware = (...middlewares) => {
4
6
  return async (req, ctx, handler) => {
5
7
  const composedHandler = middlewares.reduceRight((nextHandler, middleware) => () => middleware(req, ctx, nextHandler), handler);
6
8
  return composedHandler();
7
9
  };
8
10
  };
11
+ exports.composeMiddleware = composeMiddleware;
12
+ /* eslint-enable @typescript-eslint/no-explicit-any */
@@ -7,6 +7,7 @@ const path_1 = __importDefault(require("path"));
7
7
  const logger_1 = require("./logger");
8
8
  const rpc_state_manager_1 = require("./rpc-state-manager");
9
9
  const rpc_1 = require("./rpc");
10
+ const middleware_compose_1 = require("./middleware-compose");
10
11
  // eslint-disable-next-line @typescript-eslint/no-require-imports
11
12
  require('dotenv').config();
12
13
  // Add ts-node registration before dynamic imports
@@ -38,8 +39,12 @@ async function runTypescriptModule(filePath, event) {
38
39
  const emit = async (data) => sender.send('emit', data);
39
40
  const context = { traceId, flows, logger, state, emit };
40
41
  sender.init();
41
- // Call the function with provided arguments
42
- const result = contextInFirstArg ? await module.handler(context) : await module.handler(event.data, context);
42
+ const middlewares = Array.isArray(module.config.middleware) ? module.config.middleware : [];
43
+ const composedMiddleware = (0, middleware_compose_1.composeMiddleware)(...middlewares);
44
+ const handlerFn = () => {
45
+ return contextInFirstArg ? module.handler(context) : module.handler(event.data, context);
46
+ };
47
+ const result = await composedMiddleware(event.data, context, handlerFn);
43
48
  await sender.send('result', result);
44
49
  await sender.close();
45
50
  process.exit(0);
@@ -8,6 +8,7 @@ const cron_handler_1 = require("./cron-handler");
8
8
  const body_parser_1 = __importDefault(require("body-parser"));
9
9
  const express_1 = __importDefault(require("express"));
10
10
  const http_1 = __importDefault(require("http"));
11
+ const multer_1 = __importDefault(require("multer"));
11
12
  const socket_io_1 = require("socket.io");
12
13
  const flows_endpoint_1 = require("./flows-endpoint");
13
14
  const guards_1 = require("./guards");
@@ -17,13 +18,13 @@ const call_step_file_1 = require("./call-step-file");
17
18
  const LoggerFactory_1 = require("./LoggerFactory");
18
19
  const generate_trace_id_1 = require("./generate-trace-id");
19
20
  const flows_config_endpoint_1 = require("./flows-config-endpoint");
20
- const middleware_composer_1 = __importDefault(require("./middleware-composer"));
21
21
  const createServer = async (lockedData, eventManager, state, config) => {
22
22
  const printer = lockedData.printer;
23
23
  const app = (0, express_1.default)();
24
24
  const server = http_1.default.createServer(app);
25
25
  const io = new socket_io_1.Server(server);
26
26
  const loggerFactory = new LoggerFactory_1.LoggerFactory(config.isVerbose, io);
27
+ const upload = (0, multer_1.default)();
27
28
  const allSteps = [...steps_1.systemSteps, ...lockedData.activeSteps];
28
29
  const cronManager = (0, cron_handler_1.setupCronHandlers)(lockedData, eventManager, state, loggerFactory);
29
30
  const asyncHandler = (step) => {
@@ -37,46 +38,24 @@ const createServer = async (lockedData, eventManager, state, config) => {
37
38
  headers: req.headers,
38
39
  pathParams: req.params,
39
40
  queryParams: req.query,
40
- };
41
- const ctx = {
42
- emit: async (event) => {
43
- await eventManager.emit({
44
- topic: event.topic,
45
- data: event.data,
46
- traceId,
47
- logger,
48
- });
49
- },
50
- traceId,
51
- state,
52
- logger,
53
- };
54
- const finalHandler = async () => {
55
- try {
56
- const result = await (0, call_step_file_1.callStepFile)({
57
- contextInFirstArg: false,
58
- data: request,
59
- step,
60
- printer,
61
- logger,
62
- eventManager,
63
- state,
64
- traceId,
65
- });
66
- if (!result) {
67
- return { status: 500, body: { error: 'Internal server error' } };
68
- }
69
- return result;
70
- }
71
- catch (error) {
72
- logger.error('[API] Internal server error', { error });
73
- console.log(error);
74
- return { status: 500, body: { error: 'Internal server error' } };
75
- }
41
+ files: req.files,
76
42
  };
77
43
  try {
78
- const middleware = step.config.middleware || [];
79
- const result = await (0, middleware_composer_1.default)(...middleware)(request, ctx, finalHandler);
44
+ const data = request;
45
+ const result = await (0, call_step_file_1.callStepFile)({
46
+ contextInFirstArg: false,
47
+ data,
48
+ step,
49
+ printer,
50
+ logger,
51
+ eventManager,
52
+ state,
53
+ traceId,
54
+ });
55
+ if (!result) {
56
+ res.status(500).json({ error: 'Internal server error' });
57
+ return;
58
+ }
80
59
  if (result.headers) {
81
60
  Object.entries(result.headers).forEach(([key, value]) => res.setHeader(key, value));
82
61
  }
@@ -84,7 +63,8 @@ const createServer = async (lockedData, eventManager, state, config) => {
84
63
  res.json(result.body);
85
64
  }
86
65
  catch (error) {
87
- logger.error('[API] Error in middleware chain', { error });
66
+ logger.error('[API] Internal server error', { error });
67
+ console.log(error);
88
68
  res.status(500).json({ error: 'Internal server error' });
89
69
  }
90
70
  };
@@ -95,15 +75,15 @@ const createServer = async (lockedData, eventManager, state, config) => {
95
75
  const addRoute = (step) => {
96
76
  const { method, path } = step.config;
97
77
  logger_1.globalLogger.debug('[API] Registering route', step.config);
98
- const expressHandler = asyncHandler(step);
78
+ const handler = asyncHandler(step);
99
79
  const methods = {
100
- GET: () => router.get(path, expressHandler),
101
- POST: () => router.post(path, expressHandler),
102
- PUT: () => router.put(path, expressHandler),
103
- DELETE: () => router.delete(path, expressHandler),
104
- PATCH: () => router.patch(path, expressHandler),
105
- OPTIONS: () => router.options(path, expressHandler),
106
- HEAD: () => router.head(path, expressHandler),
80
+ GET: () => router.get(path, handler),
81
+ POST: () => router.post(path, upload.any(), handler),
82
+ PUT: () => router.put(path, upload.any(), handler),
83
+ DELETE: () => router.delete(path, handler),
84
+ PATCH: () => router.patch(path, upload.any(), handler),
85
+ OPTIONS: () => router.options(path, handler),
86
+ HEAD: () => router.head(path, handler),
107
87
  };
108
88
  const methodHandler = methods[method];
109
89
  if (!methodHandler) {
@@ -71,6 +71,9 @@ export type ApiRequest = {
71
71
  queryParams: Record<string, string | string[]>;
72
72
  body: Record<string, any>;
73
73
  headers: Record<string, string | string[]>;
74
+ files?: Express.Multer.File[] | {
75
+ [fieldname: string]: Express.Multer.File[];
76
+ };
74
77
  };
75
78
  export type ApiResponse = {
76
79
  status: number;
package/package.json CHANGED
@@ -2,14 +2,15 @@
2
2
  "name": "@motiadev/core",
3
3
  "description": "Core functionality for the Motia framework, providing the foundation for building event-driven workflows.",
4
4
  "main": "dist/index.js",
5
- "version": "0.1.0-beta.11",
5
+ "version": "0.1.0-beta.13",
6
6
  "dependencies": {
7
7
  "body-parser": "^1.20.3",
8
8
  "colors": "^1.4.0",
9
+ "dotenv": "^16.4.7",
9
10
  "express": "^4.21.2",
10
11
  "ioredis": "^5.4.2",
12
+ "multer": "1.4.5-lts.1",
11
13
  "node-cron": "^3.0.3",
12
- "serialize-javascript": "^6.0.2",
13
14
  "socket.io": "^4.8.1",
14
15
  "ts-node": "^10.9.2",
15
16
  "tsconfig-paths": "^4.2.0",
@@ -20,8 +21,8 @@
20
21
  "@types/body-parser": "^1.19.5",
21
22
  "@types/express": "^5.0.0",
22
23
  "@types/jest": "^29.5.14",
24
+ "@types/multer": "^1.4.12",
23
25
  "@types/node-cron": "^3.0.11",
24
- "@types/serialize-javascript": "^5.0.4",
25
26
  "@types/supertest": "^6.0.2",
26
27
  "jest": "^29.7.0",
27
28
  "supertest": "^7.0.0",
@@ -1,3 +0,0 @@
1
- import { ApiMiddleware, ApiRequest, ApiResponse, FlowContext } from './types';
2
- declare const _default: (...middlewares: ApiMiddleware[]) => (req: ApiRequest, ctx: FlowContext, handler: () => Promise<ApiResponse>) => Promise<ApiResponse>;
3
- export default _default;