@motiadev/core 0.13.2-beta.164-562802 → 0.13.2-beta.164-110989
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/server.mjs
CHANGED
|
@@ -196,11 +196,13 @@ const createServer = (lockedData, state, config, adapters, configureApp) => {
|
|
|
196
196
|
stepName
|
|
197
197
|
});
|
|
198
198
|
logger.debug("[API] Received request, processing step", { path: req.path });
|
|
199
|
+
const rawBody = req.rawBody || "";
|
|
199
200
|
const data = {
|
|
200
201
|
body: req.body,
|
|
201
202
|
headers: req.headers,
|
|
202
203
|
pathParams: req.params,
|
|
203
|
-
queryParams: req.query
|
|
204
|
+
queryParams: req.query,
|
|
205
|
+
rawBody
|
|
204
206
|
};
|
|
205
207
|
try {
|
|
206
208
|
let result;
|
|
@@ -252,10 +254,28 @@ const createServer = (lockedData, state, config, adapters, configureApp) => {
|
|
|
252
254
|
}
|
|
253
255
|
};
|
|
254
256
|
};
|
|
255
|
-
app.use(
|
|
257
|
+
app.use((req, _, next) => {
|
|
258
|
+
req.rawBody = "";
|
|
259
|
+
next();
|
|
260
|
+
});
|
|
261
|
+
app.use(bodyParser.json({
|
|
262
|
+
limit: "1gb",
|
|
263
|
+
verify: (req, _, buf, encoding) => {
|
|
264
|
+
req.rawBody = buf.toString(encoding || "utf8");
|
|
265
|
+
}
|
|
266
|
+
}));
|
|
256
267
|
app.use(bodyParser.urlencoded({
|
|
257
268
|
extended: true,
|
|
258
|
-
limit: "1gb"
|
|
269
|
+
limit: "1gb",
|
|
270
|
+
verify: (req, _, buf, encoding) => {
|
|
271
|
+
req.rawBody = buf.toString(encoding || "utf8");
|
|
272
|
+
}
|
|
273
|
+
}));
|
|
274
|
+
app.use(bodyParser.text({
|
|
275
|
+
limit: "1gb",
|
|
276
|
+
verify: (req, _, buf, encoding) => {
|
|
277
|
+
req.rawBody = buf.toString(encoding || "utf8");
|
|
278
|
+
}
|
|
259
279
|
}));
|
|
260
280
|
const router = express.Router();
|
|
261
281
|
const addRoute = (step) => {
|
package/dist/src/server.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","names":["accessContext: StreamSubscription","motia: Motia","data: ApiRequest","result: ApiResponse | undefined"],"sources":["../../src/server.ts"],"sourcesContent":["import bodyParser from 'body-parser'\nimport express, { type Express, type Request, type Response } from 'express'\nimport http from 'http'\nimport type { Server as WsServer } from 'ws'\nimport type { CronAdapter } from './adapters/interfaces/cron-adapter.interface'\nimport type { EventAdapter } from './adapters/interfaces/event-adapter.interface'\nimport type { StateAdapter } from './adapters/interfaces/state-adapter.interface'\nimport type { StreamAdapterManager } from './adapters/interfaces/stream-adapter-manager.interface'\nimport { trackEvent } from './analytics/utils'\nimport { callStepFile } from './call-step-file'\nimport { type CronManager, setupCronHandlers } from './cron-handler'\nimport { analyticsEndpoint } from './endpoints/analytics-endpoint'\nimport { flowsConfigEndpoint } from './endpoints/flows-config-endpoint'\nimport { flowsEndpoint } from './endpoints/flows-endpoint'\nimport { stepEndpoint } from './endpoints/step-endpoint'\nimport { generateTraceId } from './generate-trace-id'\nimport { isApiStep } from './guards'\nimport type { LockedData } from './locked-data'\nimport { globalLogger } from './logger'\nimport { BaseLoggerFactory } from './logger-factory'\nimport type { Motia } from './motia'\nimport type { Tracer } from './observability'\nimport { createTracerFactory } from './observability/tracer'\nimport { Printer } from './printer'\nimport { runStreamCanAccess } from './run-stream-can-access'\nimport { createSocketServer } from './socket-server'\nimport { createStepHandlers, type MotiaEventManager } from './step-handlers'\nimport { systemSteps } from './steps'\nimport { type Log, RedisLogsStream } from './streams/redis-logs-stream'\nimport type { ApiRequest, ApiResponse, ApiRouteConfig, ApiRouteMethod, EmitData, Step } from './types'\nimport type {\n BaseStreamItem,\n MotiaStream,\n StateStreamEvent,\n StateStreamEventChannel,\n StreamSubscription,\n} from './types-stream'\n\nexport type MotiaServer = {\n printer: Printer\n app: Express\n server: http.Server\n socketServer: WsServer\n close: () => Promise<void>\n removeRoute: (step: Step<ApiRouteConfig>) => void\n addRoute: (step: Step<ApiRouteConfig>) => void\n cronManager: CronManager\n motiaEventManager: MotiaEventManager\n motia: Motia\n}\n\ntype MotiaServerConfig = {\n isVerbose: boolean\n printer?: Printer\n}\n\ntype AdapterOptions = {\n eventAdapter: EventAdapter\n cronAdapter: CronAdapter\n streamAdapter?: StreamAdapterManager\n}\n\nexport const createServer = (\n lockedData: LockedData,\n state: StateAdapter,\n config: MotiaServerConfig,\n adapters: AdapterOptions,\n configureApp?: (app: Express) => void,\n): MotiaServer => {\n const printer = config.printer ?? new Printer(process.cwd())\n const app = express()\n if (configureApp) {\n configureApp(app)\n }\n const server = http.createServer(app)\n\n const streamAuth = lockedData.getStreamAuthConfig()\n\n const authorizeSubscription = async (\n subscription: { streamName: string; groupId: string; id?: string },\n authContext?: unknown,\n ): Promise<boolean> => {\n const stream = lockedData.getStreamByName(subscription.streamName)\n\n if (!stream) {\n throw new Error(`Stream ${subscription.streamName} not found`)\n }\n\n const accessContext: StreamSubscription = { groupId: subscription.groupId, id: subscription.id }\n\n if (typeof stream.config.canAccess === 'function') {\n try {\n const allowed = await stream.config.canAccess(accessContext, authContext)\n return Boolean(allowed)\n } catch (error) {\n globalLogger.error('[Streams] Inline canAccess evaluation failed', {\n streamName: subscription.streamName,\n groupId: subscription.groupId,\n error,\n })\n return false\n }\n }\n\n // @ts-expect-error - internal property, not part of the public API\n if (!stream.config.__motia_hasCanAccess) {\n globalLogger.debug('[Streams] No canAccess function found, allowing access', {\n streamName: subscription.streamName,\n groupId: subscription.groupId,\n })\n return true\n }\n\n try {\n const allowed = await runStreamCanAccess({\n file: stream.filePath,\n subscription: accessContext,\n authContext,\n projectRoot: lockedData.baseDir,\n })\n return Boolean(allowed)\n } catch (error) {\n globalLogger.error('[Streams] canAccess evaluation failed', {\n streamName: subscription.streamName,\n groupId: subscription.groupId,\n error,\n })\n return false\n }\n }\n\n const { pushEvent, socketServer } = createSocketServer({\n server,\n authenticate: streamAuth?.authenticate,\n authorize: authorizeSubscription,\n onJoin: async (streamName: string, groupId: string, id: string) => {\n const streams = lockedData.getStreams()\n const stream = streams[streamName]\n\n if (stream) {\n const result = await stream().get(groupId, id)\n delete result?.__motia // deleting because we don't need it in the socket\n return result\n }\n },\n onJoinGroup: async (streamName: string, groupId: string) => {\n const streams = lockedData.getStreams()\n const stream = streams[streamName]\n\n if (stream) {\n const result = stream ? await stream().getGroup(groupId) : []\n\n return result.map(({ __motia, ...rest }) => rest)\n }\n },\n })\n\n lockedData.applyStreamWrapper((streamName, stream) => {\n return (): MotiaStream<BaseStreamItem> => {\n const main = stream() as MotiaStream<BaseStreamItem>\n\n const wrapObject = (groupId: string, id: string, object: any) => {\n if (!object) {\n return null\n }\n\n return {\n ...object,\n __motia: { type: 'state-stream', streamName, groupId, id },\n }\n }\n\n const mainGetGroup = main.getGroup\n const mainGet = main.get\n const mainSet = main.set\n const mainDelete = main.delete\n\n main.send = async <T>(channel: StateStreamEventChannel, event: StateStreamEvent<T>) => {\n pushEvent({ streamName, ...channel, event: { type: 'event', event } })\n }\n\n main.getGroup = async (groupId: string) => {\n const result = await mainGetGroup.apply(main, [groupId])\n return result.map((object: BaseStreamItem) => wrapObject(groupId, object.id, object))\n }\n\n main.get = async (groupId: string, id: string) => {\n const result = await mainGet.apply(main, [groupId, id])\n return wrapObject(groupId, id, result)\n }\n\n main.set = async (groupId: string, id: string, data: BaseStreamItem) => {\n if (!data) {\n return null\n }\n\n const exists = await main.get(groupId, id)\n const updated = await mainSet.apply(main, [groupId, id, data])\n const result = updated ?? data\n const wrappedResult = wrapObject(groupId, id, result)\n\n const type = exists ? 'update' : 'create'\n pushEvent({ streamName, groupId, id, event: { type, data: result } })\n\n return wrappedResult\n }\n\n main.delete = async (groupId: string, id: string) => {\n const result = await mainDelete.apply(main, [groupId, id])\n\n pushEvent({ streamName, groupId, id, event: { type: 'delete', data: result } })\n\n return wrapObject(groupId, id, result)\n }\n\n return main\n }\n })\n\n const logStream = lockedData.createStream<Log>({\n filePath: '__motia.logs',\n hidden: true,\n config: {\n name: '__motia.logs',\n baseConfig: {\n storageType: 'custom',\n factory: () => {\n return new RedisLogsStream(lockedData.redisClient)\n },\n },\n schema: null as never,\n },\n })()\n\n const allSteps = [...systemSteps, ...lockedData.activeSteps]\n const loggerFactory = new BaseLoggerFactory(config.isVerbose, logStream)\n const tracerFactory = createTracerFactory(lockedData)\n const motia: Motia = {\n loggerFactory,\n eventAdapter: adapters.eventAdapter,\n state,\n lockedData,\n printer,\n tracerFactory,\n app,\n stateAdapter: state,\n }\n\n const cronManager = setupCronHandlers(motia, adapters?.cronAdapter)\n const motiaEventManager = createStepHandlers(motia, adapters.eventAdapter)\n\n const asyncHandler = (step: Step<ApiRouteConfig>) => {\n return async (req: Request, res: Response) => {\n const traceId = generateTraceId()\n const { name: stepName, flows } = step.config\n const logger = loggerFactory.create({ traceId, flows, stepName })\n\n logger.debug('[API] Received request, processing step', { path: req.path })\n\n const data: ApiRequest = {\n body: req.body,\n headers: req.headers as Record<string, string | string[]>,\n pathParams: req.params,\n queryParams: req.query as Record<string, string | string[]>,\n }\n\n try {\n let result: ApiResponse | undefined\n\n if ('handler' in step && typeof step.handler === 'function') {\n const context = {\n traceId,\n flows,\n state: state,\n emit: async (event: EmitData) => {\n const eventObj = {\n ...event,\n traceId,\n flows,\n logger,\n tracer: null as unknown as Tracer,\n }\n await adapters.eventAdapter.emit(eventObj)\n },\n logger,\n streams: lockedData.getStreams(),\n }\n result = await step.handler(data, context)\n } else {\n const tracer = await motia.tracerFactory.createTracer(traceId, step, logger)\n result = await callStepFile<ApiResponse>({ data, step, logger, tracer, traceId }, motia)\n }\n\n trackEvent('api_call_success', { stepName })\n\n if (!result) {\n console.log('no result')\n res.status(500).json({ error: 'Internal server error' })\n return\n }\n\n if (result.headers) {\n Object.entries(result.headers).forEach(([key, value]) => res.setHeader(key, value))\n }\n\n res.status(result.status)\n\n // Handle different body types\n if (Buffer.isBuffer(result.body) || typeof result.body === 'string') {\n res.send(result.body)\n } else {\n res.json(result.body)\n }\n } catch (error) {\n trackEvent('api_call_error', {\n stepName,\n traceId,\n error: error instanceof Error ? error.message : 'Unknown error',\n })\n logger.error('[API] Internal server error', { error })\n console.log(error)\n res.status(500).json({ error: 'Internal server error' })\n }\n }\n }\n\n app.use(bodyParser.json({ limit: '1gb' }))\n app.use(bodyParser.urlencoded({ extended: true, limit: '1gb' }))\n\n const router = express.Router()\n\n const addRoute = (step: Step<ApiRouteConfig>) => {\n const { method, path } = step.config\n globalLogger.debug('[API] Registering route', step.config)\n\n const handler = asyncHandler(step)\n const methods: Record<ApiRouteMethod, () => void> = {\n GET: () => router.get(path, handler),\n POST: () => router.post(path, handler),\n PUT: () => router.put(path, handler),\n DELETE: () => router.delete(path, handler),\n PATCH: () => router.patch(path, handler),\n OPTIONS: () => router.options(path, handler),\n HEAD: () => router.head(path, handler),\n }\n\n const methodHandler = methods[method]\n if (!methodHandler) {\n throw new Error(`Unsupported method: ${method}`)\n }\n\n methodHandler()\n }\n\n const removeRoute = (step: Step<ApiRouteConfig>) => {\n const { path, method } = step.config\n const routerStack = router.stack\n\n const filteredStack = routerStack.filter((layer: any) => {\n if (layer.route) {\n const match = layer.route.path === path && layer.route.methods[method.toLowerCase()]\n return !match\n }\n return true\n })\n router.stack = filteredStack\n }\n\n allSteps.filter(isApiStep).forEach(addRoute)\n\n app.options('*', (_req, res) => {\n res.header('Access-Control-Allow-Origin', '*')\n res.header('Access-Control-Allow-Methods', '*')\n res.header('Access-Control-Allow-Headers', '*')\n res.header('Access-Control-Max-Age', '600')\n res.header('Access-Control-Allow-Credentials', 'true')\n res.header('Access-Control-Allow-Private-Network', 'true')\n res.status(204).end()\n })\n app.use((_req, res, next) => {\n res.header('Access-Control-Allow-Origin', '*')\n res.header('Access-Control-Allow-Methods', '*')\n res.header('Access-Control-Allow-Headers', '*')\n res.header('Access-Control-Max-Age', '600')\n res.header('Access-Control-Allow-Credentials', 'true')\n res.header('Access-Control-Allow-Private-Network', 'true')\n next()\n })\n\n app.use(router)\n\n flowsEndpoint(lockedData)\n flowsConfigEndpoint(app, process.cwd(), lockedData)\n analyticsEndpoint(app, process.cwd())\n stepEndpoint(app, lockedData)\n\n server.on('error', (error) => {\n console.error('Server error:', error)\n })\n\n const close = async (): Promise<void> => {\n await cronManager.close()\n socketServer.close()\n if (adapters?.eventAdapter) {\n await adapters.eventAdapter.shutdown()\n }\n }\n\n return { app, server, socketServer, close, removeRoute, addRoute, cronManager, motiaEventManager, motia, printer }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.mjs","names":["accessContext: StreamSubscription","motia: Motia","data: ApiRequest","result: ApiResponse | undefined"],"sources":["../../src/server.ts"],"sourcesContent":["import bodyParser from 'body-parser'\nimport express, { type Express, type Request, type Response } from 'express'\nimport http from 'http'\nimport type { Server as WsServer } from 'ws'\nimport type { CronAdapter } from './adapters/interfaces/cron-adapter.interface'\nimport type { EventAdapter } from './adapters/interfaces/event-adapter.interface'\nimport type { StateAdapter } from './adapters/interfaces/state-adapter.interface'\nimport type { StreamAdapterManager } from './adapters/interfaces/stream-adapter-manager.interface'\nimport { trackEvent } from './analytics/utils'\nimport { callStepFile } from './call-step-file'\nimport { type CronManager, setupCronHandlers } from './cron-handler'\nimport { analyticsEndpoint } from './endpoints/analytics-endpoint'\nimport { flowsConfigEndpoint } from './endpoints/flows-config-endpoint'\nimport { flowsEndpoint } from './endpoints/flows-endpoint'\nimport { stepEndpoint } from './endpoints/step-endpoint'\nimport { generateTraceId } from './generate-trace-id'\nimport { isApiStep } from './guards'\nimport type { LockedData } from './locked-data'\nimport { globalLogger } from './logger'\nimport { BaseLoggerFactory } from './logger-factory'\nimport type { Motia } from './motia'\nimport type { Tracer } from './observability'\nimport { createTracerFactory } from './observability/tracer'\nimport { Printer } from './printer'\nimport { runStreamCanAccess } from './run-stream-can-access'\nimport { createSocketServer } from './socket-server'\nimport { createStepHandlers, type MotiaEventManager } from './step-handlers'\nimport { systemSteps } from './steps'\nimport { type Log, RedisLogsStream } from './streams/redis-logs-stream'\nimport type { ApiRequest, ApiResponse, ApiRouteConfig, ApiRouteMethod, EmitData, Step } from './types'\nimport type {\n BaseStreamItem,\n MotiaStream,\n StateStreamEvent,\n StateStreamEventChannel,\n StreamSubscription,\n} from './types-stream'\n\nexport type MotiaServer = {\n printer: Printer\n app: Express\n server: http.Server\n socketServer: WsServer\n close: () => Promise<void>\n removeRoute: (step: Step<ApiRouteConfig>) => void\n addRoute: (step: Step<ApiRouteConfig>) => void\n cronManager: CronManager\n motiaEventManager: MotiaEventManager\n motia: Motia\n}\n\ntype MotiaServerConfig = {\n isVerbose: boolean\n printer?: Printer\n}\n\ntype AdapterOptions = {\n eventAdapter: EventAdapter\n cronAdapter: CronAdapter\n streamAdapter?: StreamAdapterManager\n}\n\nexport const createServer = (\n lockedData: LockedData,\n state: StateAdapter,\n config: MotiaServerConfig,\n adapters: AdapterOptions,\n configureApp?: (app: Express) => void,\n): MotiaServer => {\n const printer = config.printer ?? new Printer(process.cwd())\n const app = express()\n if (configureApp) {\n configureApp(app)\n }\n const server = http.createServer(app)\n\n const streamAuth = lockedData.getStreamAuthConfig()\n\n const authorizeSubscription = async (\n subscription: { streamName: string; groupId: string; id?: string },\n authContext?: unknown,\n ): Promise<boolean> => {\n const stream = lockedData.getStreamByName(subscription.streamName)\n\n if (!stream) {\n throw new Error(`Stream ${subscription.streamName} not found`)\n }\n\n const accessContext: StreamSubscription = { groupId: subscription.groupId, id: subscription.id }\n\n if (typeof stream.config.canAccess === 'function') {\n try {\n const allowed = await stream.config.canAccess(accessContext, authContext)\n return Boolean(allowed)\n } catch (error) {\n globalLogger.error('[Streams] Inline canAccess evaluation failed', {\n streamName: subscription.streamName,\n groupId: subscription.groupId,\n error,\n })\n return false\n }\n }\n\n // @ts-expect-error - internal property, not part of the public API\n if (!stream.config.__motia_hasCanAccess) {\n globalLogger.debug('[Streams] No canAccess function found, allowing access', {\n streamName: subscription.streamName,\n groupId: subscription.groupId,\n })\n return true\n }\n\n try {\n const allowed = await runStreamCanAccess({\n file: stream.filePath,\n subscription: accessContext,\n authContext,\n projectRoot: lockedData.baseDir,\n })\n return Boolean(allowed)\n } catch (error) {\n globalLogger.error('[Streams] canAccess evaluation failed', {\n streamName: subscription.streamName,\n groupId: subscription.groupId,\n error,\n })\n return false\n }\n }\n\n const { pushEvent, socketServer } = createSocketServer({\n server,\n authenticate: streamAuth?.authenticate,\n authorize: authorizeSubscription,\n onJoin: async (streamName: string, groupId: string, id: string) => {\n const streams = lockedData.getStreams()\n const stream = streams[streamName]\n\n if (stream) {\n const result = await stream().get(groupId, id)\n delete result?.__motia // deleting because we don't need it in the socket\n return result\n }\n },\n onJoinGroup: async (streamName: string, groupId: string) => {\n const streams = lockedData.getStreams()\n const stream = streams[streamName]\n\n if (stream) {\n const result = stream ? await stream().getGroup(groupId) : []\n\n return result.map(({ __motia, ...rest }) => rest)\n }\n },\n })\n\n lockedData.applyStreamWrapper((streamName, stream) => {\n return (): MotiaStream<BaseStreamItem> => {\n const main = stream() as MotiaStream<BaseStreamItem>\n\n const wrapObject = (groupId: string, id: string, object: any) => {\n if (!object) {\n return null\n }\n\n return {\n ...object,\n __motia: { type: 'state-stream', streamName, groupId, id },\n }\n }\n\n const mainGetGroup = main.getGroup\n const mainGet = main.get\n const mainSet = main.set\n const mainDelete = main.delete\n\n main.send = async <T>(channel: StateStreamEventChannel, event: StateStreamEvent<T>) => {\n pushEvent({ streamName, ...channel, event: { type: 'event', event } })\n }\n\n main.getGroup = async (groupId: string) => {\n const result = await mainGetGroup.apply(main, [groupId])\n return result.map((object: BaseStreamItem) => wrapObject(groupId, object.id, object))\n }\n\n main.get = async (groupId: string, id: string) => {\n const result = await mainGet.apply(main, [groupId, id])\n return wrapObject(groupId, id, result)\n }\n\n main.set = async (groupId: string, id: string, data: BaseStreamItem) => {\n if (!data) {\n return null\n }\n\n const exists = await main.get(groupId, id)\n const updated = await mainSet.apply(main, [groupId, id, data])\n const result = updated ?? data\n const wrappedResult = wrapObject(groupId, id, result)\n\n const type = exists ? 'update' : 'create'\n pushEvent({ streamName, groupId, id, event: { type, data: result } })\n\n return wrappedResult\n }\n\n main.delete = async (groupId: string, id: string) => {\n const result = await mainDelete.apply(main, [groupId, id])\n\n pushEvent({ streamName, groupId, id, event: { type: 'delete', data: result } })\n\n return wrapObject(groupId, id, result)\n }\n\n return main\n }\n })\n\n const logStream = lockedData.createStream<Log>({\n filePath: '__motia.logs',\n hidden: true,\n config: {\n name: '__motia.logs',\n baseConfig: {\n storageType: 'custom',\n factory: () => {\n return new RedisLogsStream(lockedData.redisClient)\n },\n },\n schema: null as never,\n },\n })()\n\n const allSteps = [...systemSteps, ...lockedData.activeSteps]\n const loggerFactory = new BaseLoggerFactory(config.isVerbose, logStream)\n const tracerFactory = createTracerFactory(lockedData)\n const motia: Motia = {\n loggerFactory,\n eventAdapter: adapters.eventAdapter,\n state,\n lockedData,\n printer,\n tracerFactory,\n app,\n stateAdapter: state,\n }\n\n const cronManager = setupCronHandlers(motia, adapters?.cronAdapter)\n const motiaEventManager = createStepHandlers(motia, adapters.eventAdapter)\n\n const asyncHandler = (step: Step<ApiRouteConfig>) => {\n return async (req: Request, res: Response) => {\n const traceId = generateTraceId()\n const { name: stepName, flows } = step.config\n const logger = loggerFactory.create({ traceId, flows, stepName })\n\n logger.debug('[API] Received request, processing step', { path: req.path })\n\n const rawBody = req.rawBody || ''\n\n const data: ApiRequest = {\n body: req.body,\n headers: req.headers as Record<string, string | string[]>,\n pathParams: req.params,\n queryParams: req.query as Record<string, string | string[]>,\n rawBody,\n }\n\n try {\n let result: ApiResponse | undefined\n\n if ('handler' in step && typeof step.handler === 'function') {\n const context = {\n traceId,\n flows,\n state: state,\n emit: async (event: EmitData) => {\n const eventObj = {\n ...event,\n traceId,\n flows,\n logger,\n tracer: null as unknown as Tracer,\n }\n await adapters.eventAdapter.emit(eventObj)\n },\n logger,\n streams: lockedData.getStreams(),\n }\n result = await step.handler(data, context)\n } else {\n const tracer = await motia.tracerFactory.createTracer(traceId, step, logger)\n result = await callStepFile<ApiResponse>({ data, step, logger, tracer, traceId }, motia)\n }\n\n trackEvent('api_call_success', { stepName })\n\n if (!result) {\n console.log('no result')\n res.status(500).json({ error: 'Internal server error' })\n return\n }\n\n if (result.headers) {\n Object.entries(result.headers).forEach(([key, value]) => res.setHeader(key, value))\n }\n\n res.status(result.status)\n\n // Handle different body types\n if (Buffer.isBuffer(result.body) || typeof result.body === 'string') {\n res.send(result.body)\n } else {\n res.json(result.body)\n }\n } catch (error) {\n trackEvent('api_call_error', {\n stepName,\n traceId,\n error: error instanceof Error ? error.message : 'Unknown error',\n })\n logger.error('[API] Internal server error', { error })\n console.log(error)\n res.status(500).json({ error: 'Internal server error' })\n }\n }\n }\n\n app.use((req, _, next) => {\n req.rawBody = ''\n next()\n })\n\n app.use(\n bodyParser.json({\n limit: '1gb',\n verify: (req, _, buf, encoding) => {\n req.rawBody = buf.toString((encoding as BufferEncoding) || 'utf8')\n },\n }),\n )\n\n app.use(\n bodyParser.urlencoded({\n extended: true,\n limit: '1gb',\n verify: (req, _, buf, encoding) => {\n req.rawBody = buf.toString((encoding as BufferEncoding) || 'utf8')\n },\n }),\n )\n\n app.use(\n bodyParser.text({\n limit: '1gb',\n verify: (req, _, buf, encoding) => {\n req.rawBody = buf.toString((encoding as BufferEncoding) || 'utf8')\n },\n }),\n )\n\n const router = express.Router()\n\n const addRoute = (step: Step<ApiRouteConfig>) => {\n const { method, path } = step.config\n globalLogger.debug('[API] Registering route', step.config)\n\n const handler = asyncHandler(step)\n const methods: Record<ApiRouteMethod, () => void> = {\n GET: () => router.get(path, handler),\n POST: () => router.post(path, handler),\n PUT: () => router.put(path, handler),\n DELETE: () => router.delete(path, handler),\n PATCH: () => router.patch(path, handler),\n OPTIONS: () => router.options(path, handler),\n HEAD: () => router.head(path, handler),\n }\n\n const methodHandler = methods[method]\n if (!methodHandler) {\n throw new Error(`Unsupported method: ${method}`)\n }\n\n methodHandler()\n }\n\n const removeRoute = (step: Step<ApiRouteConfig>) => {\n const { path, method } = step.config\n const routerStack = router.stack\n\n const filteredStack = routerStack.filter((layer: any) => {\n if (layer.route) {\n const match = layer.route.path === path && layer.route.methods[method.toLowerCase()]\n return !match\n }\n return true\n })\n router.stack = filteredStack\n }\n\n allSteps.filter(isApiStep).forEach(addRoute)\n\n app.options('*', (_req, res) => {\n res.header('Access-Control-Allow-Origin', '*')\n res.header('Access-Control-Allow-Methods', '*')\n res.header('Access-Control-Allow-Headers', '*')\n res.header('Access-Control-Max-Age', '600')\n res.header('Access-Control-Allow-Credentials', 'true')\n res.header('Access-Control-Allow-Private-Network', 'true')\n res.status(204).end()\n })\n app.use((_req, res, next) => {\n res.header('Access-Control-Allow-Origin', '*')\n res.header('Access-Control-Allow-Methods', '*')\n res.header('Access-Control-Allow-Headers', '*')\n res.header('Access-Control-Max-Age', '600')\n res.header('Access-Control-Allow-Credentials', 'true')\n res.header('Access-Control-Allow-Private-Network', 'true')\n next()\n })\n\n app.use(router)\n\n flowsEndpoint(lockedData)\n flowsConfigEndpoint(app, process.cwd(), lockedData)\n analyticsEndpoint(app, process.cwd())\n stepEndpoint(app, lockedData)\n\n server.on('error', (error) => {\n console.error('Server error:', error)\n })\n\n const close = async (): Promise<void> => {\n await cronManager.close()\n socketServer.close()\n if (adapters?.eventAdapter) {\n await adapters.eventAdapter.shutdown()\n }\n }\n\n return { app, server, socketServer, close, removeRoute, addRoute, cronManager, motiaEventManager, motia, printer }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-stream.d.mts","names":[],"sources":["../../src/types-stream.ts"],"sourcesContent":[],"mappings":";;;;KAGY,kBAAA;;EAAA,EAAA,CAAA,EAAA,MAAA;AAEZ,CAAA;AAEU,UAFO,YAAA,CAEP;EACyE,IAAA,EAAA,MAAA;EACtD,MAAA,EAFnB,eAEmB;EAAmD,UAAA,EAAA;IAAO,WAAA,EAAA,SAAA;EAG3E,CAAA,GAAA;IACA,WAAA,EAAA,QAAgB;IAEhB,OAAA,EAAA,GAAA,GAPuE,WAOzD,CAAA,
|
|
1
|
+
{"version":3,"file":"types-stream.d.mts","names":[],"sources":["../../src/types-stream.ts"],"sourcesContent":[],"mappings":";;;;KAGY,kBAAA;;EAAA,EAAA,CAAA,EAAA,MAAA;AAEZ,CAAA;AAEU,UAFO,YAAA,CAEP;EACyE,IAAA,EAAA,MAAA;EACtD,MAAA,EAFnB,eAEmB;EAAmD,UAAA,EAAA;IAAO,WAAA,EAAA,SAAA;EAG3E,CAAA,GAAA;IACA,WAAA,EAAA,QAAgB;IAEhB,OAAA,EAAA,GAAA,GAPuE,WAOzD,CAAA,GAAoB,CAAA;EAElC,CAAA;EAAuB,SAAA,CAAA,EAAA,CAAA,YAAA,EARN,kBAQM,EAAA,WAAA,EAAA,GAAA,EAAA,GAAA,OAAA,GAR6C,OAQ7C,CAAA,OAAA,CAAA;;AAEzB,KAPE,uBAAA,GAOF;EAEC,OAAA,EAAA,MAAA;EAAa,EAAA,CAAA,EAAA,MAAA;AAGxB,CAAA;AAC2D,KAZ/C,gBAY+C,CAAA,KAAA,CAAA,GAAA;EAAf,IAAA,EAAA,MAAA;EAAR,IAAA,EAZwB,KAYxB;CACK;AAA+B,KAX5D,cAW4D,CAAA,QAAA,OAAA,CAAA,GAX1B,KAW0B,GAAA;EAAf,EAAA,EAAA,MAAA;CAAR;AACa,KAVlD,MAUkD,CAAA,gBAV3B,YAU2B,GAVZ,YAUY,CAAA,GAAA;EAAf,QAAA,EAAA,MAAA;EAAR,MAAA,EAR7B,OAQ6B;EACa,MAAA,CAAA,EAAA,OAAA;EAAf,OAAA,EAP1B,aAO0B,CAAA,OAAA,CAAA;CAAR;AAEV,UANF,WAME,CAAA,KAAA,CAAA,CAAA;EAAiD,GAAA,CAAA,OAAA,EAAA,MAAA,EAAA,EAAA,EAAA,MAAA,CAAA,EALhC,OAKgC,CALxB,cAKwB,CALT,KAKS,CAAA,GAAA,IAAA,CAAA;EAAjB,GAAA,CAAA,OAAA,EAAA,MAAA,EAAA,EAAA,EAAA,MAAA,EAAA,IAAA,EAJV,KAIU,CAAA,EAJF,OAIE,CAJM,cAIN,CAJqB,KAIrB,CAAA,CAAA;EAAsB,MAAA,CAAA,OAAA,EAAA,MAAA,EAAA,EAAA,EAAA,MAAA,CAAA,EAHlC,OAGkC,CAH1B,cAG0B,CAHX,KAGW,CAAA,GAAA,IAAA,CAAA;EAAO,QAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAFnD,OAEmD,CAF3C,cAE2C,CAF5B,KAE4B,CAAA,EAAA,CAAA;mBAA7D,gCAAgC,iBAAiB,KAAK"}
|
package/dist/src/types.d.mts
CHANGED
|
@@ -106,6 +106,11 @@ interface ApiRequest<TBody = unknown> {
|
|
|
106
106
|
queryParams: Record<string, string | string[]>;
|
|
107
107
|
body: TBody;
|
|
108
108
|
headers: Record<string, string | string[]>;
|
|
109
|
+
/**
|
|
110
|
+
* The raw unparsed request body as a string.
|
|
111
|
+
* This is the same body that was sent but without type enforcement/parsing.
|
|
112
|
+
*/
|
|
113
|
+
rawBody: string;
|
|
109
114
|
}
|
|
110
115
|
type ApiResponse<TStatus extends number = number, TBody = string | Buffer | Record<string, unknown>> = {
|
|
111
116
|
status: TStatus;
|
|
@@ -180,6 +185,7 @@ interface Handlers {}
|
|
|
180
185
|
declare module 'http' {
|
|
181
186
|
interface IncomingMessage {
|
|
182
187
|
authContext?: unknown | null;
|
|
188
|
+
rawBody?: string;
|
|
183
189
|
}
|
|
184
190
|
}
|
|
185
191
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/src/types.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/types.ts"],"sourcesContent":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/types.ts"],"sourcesContent":[],"mappings":"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"}
|