@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.
- package/dist/src/get-step-config.js +1 -1
- package/dist/src/node/get-config.js +1 -2
- package/dist/src/node/middleware-compose.d.ts +1 -0
- package/dist/src/{middleware-composer.js → node/middleware-compose.js} +5 -1
- package/dist/src/node/node-runner.js +7 -2
- package/dist/src/server.js +28 -48
- package/dist/src/types.d.ts +3 -0
- package/package.json +4 -3
- package/dist/src/middleware-composer.d.ts +0 -3
|
@@ -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 =
|
|
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?.(
|
|
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.
|
|
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
|
-
|
|
42
|
-
const
|
|
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);
|
package/dist/src/server.js
CHANGED
|
@@ -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
|
|
79
|
-
const result = await (0,
|
|
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]
|
|
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
|
|
78
|
+
const handler = asyncHandler(step);
|
|
99
79
|
const methods = {
|
|
100
|
-
GET: () => router.get(path,
|
|
101
|
-
POST: () => router.post(path,
|
|
102
|
-
PUT: () => router.put(path,
|
|
103
|
-
DELETE: () => router.delete(path,
|
|
104
|
-
PATCH: () => router.patch(path,
|
|
105
|
-
OPTIONS: () => router.options(path,
|
|
106
|
-
HEAD: () => router.head(path,
|
|
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) {
|
package/dist/src/types.d.ts
CHANGED
|
@@ -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.
|
|
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",
|