@motiadev/core 0.17.0-beta.181 → 0.17.0-beta.182-601862

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.
@@ -24,9 +24,9 @@ def get_can_access(config):
24
24
  async def run_python_module(file_path: str, payload: dict) -> None:
25
25
  try:
26
26
  path = Path(file_path).resolve()
27
- steps_dir = next((p for p in path.parents if p.name == "steps"), None)
27
+ steps_dir = next((p for p in path.parents if p.name in ("src", "steps")), None)
28
28
  if steps_dir is None:
29
- raise RuntimeError("Could not find 'steps' directory in path")
29
+ raise RuntimeError("Could not find 'src' or 'steps' directory in path")
30
30
 
31
31
  project_root = steps_dir.parent
32
32
  project_parent = project_root.parent
@@ -23,9 +23,9 @@ def sendMessage(text):
23
23
  async def run_python_module(file_path: str) -> None:
24
24
  try:
25
25
  path = Path(file_path).resolve()
26
- steps_dir = next((p for p in path.parents if p.name == "steps"), None)
26
+ steps_dir = next((p for p in path.parents if p.name in ("src", "steps")), None)
27
27
  if steps_dir is None:
28
- raise RuntimeError("Could not find 'steps' directory in path")
28
+ raise RuntimeError("Could not find 'src' or 'steps' directory in path")
29
29
 
30
30
  project_root = steps_dir.parent
31
31
  project_parent = project_root.parent
@@ -24,9 +24,9 @@ async def run_python_module(file_path: str, rpc: RpcSender, args: Dict) -> None:
24
24
  """Execute a Python module with the given arguments"""
25
25
  try:
26
26
  path = Path(file_path).resolve()
27
- steps_dir = next((p for p in path.parents if p.name == "steps"), None)
27
+ steps_dir = next((p for p in path.parents if p.name in ("src", "steps")), None)
28
28
  if steps_dir is None:
29
- raise RuntimeError("Could not find 'steps' directory in path")
29
+ raise RuntimeError("Could not find 'src' or 'steps' directory in path")
30
30
 
31
31
  project_root = steps_dir.parent
32
32
  project_parent = project_root.parent
@@ -327,7 +327,10 @@ const createServer = (lockedData, state, config, adapters, configureApp) => {
327
327
  analyticsEndpoint(app, process.cwd());
328
328
  stepEndpoint(app, lockedData);
329
329
  server.on("error", (error) => {
330
- console.error("Server error:", error);
330
+ if (error.code !== "EADDRINUSE") console.error("Server error:", error);
331
+ });
332
+ socketServer.on("error", (error) => {
333
+ if (error.code !== "EADDRINUSE") console.error("WebSocket server error:", error);
331
334
  });
332
335
  const close = async () => {
333
336
  await cronManager.close();
@@ -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 if (!lockedData.redisClient) {\n throw new Error(\n 'Redis client is required for server operation. Please provide a redisClient when creating LockedData.',\n )\n }\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
+ {"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 if (!lockedData.redisClient) {\n throw new Error(\n 'Redis client is required for server operation. Please provide a redisClient when creating LockedData.',\n )\n }\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: NodeJS.ErrnoException) => {\n if (error.code !== 'EADDRINUSE') {\n console.error('Server error:', error)\n }\n })\n\n socketServer.on('error', (error: NodeJS.ErrnoException) => {\n if (error.code !== 'EADDRINUSE') {\n console.error('WebSocket server error:', error)\n }\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":";;;;;;;;;;;;;;;;;;;;;;;AA8DA,MAAa,gBACX,YACA,OACA,QACA,UACA,iBACgB;CAChB,MAAM,UAAU,OAAO,WAAW,IAAI,QAAQ,QAAQ,KAAK,CAAC;CAC5D,MAAM,MAAM,SAAS;AACrB,KAAI,aACF,cAAa,IAAI;CAEnB,MAAM,SAAS,KAAK,aAAa,IAAI;CAErC,MAAM,aAAa,WAAW,qBAAqB;CAEnD,MAAM,wBAAwB,OAC5B,cACA,gBACqB;EACrB,MAAM,SAAS,WAAW,gBAAgB,aAAa,WAAW;AAElE,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,UAAU,aAAa,WAAW,YAAY;EAGhE,MAAMA,gBAAoC;GAAE,SAAS,aAAa;GAAS,IAAI,aAAa;GAAI;AAEhG,MAAI,OAAO,OAAO,OAAO,cAAc,WACrC,KAAI;GACF,MAAM,UAAU,MAAM,OAAO,OAAO,UAAU,eAAe,YAAY;AACzE,UAAO,QAAQ,QAAQ;WAChB,OAAO;AACd,gBAAa,MAAM,gDAAgD;IACjE,YAAY,aAAa;IACzB,SAAS,aAAa;IACtB;IACD,CAAC;AACF,UAAO;;AAKX,MAAI,CAAC,OAAO,OAAO,sBAAsB;AACvC,gBAAa,MAAM,0DAA0D;IAC3E,YAAY,aAAa;IACzB,SAAS,aAAa;IACvB,CAAC;AACF,UAAO;;AAGT,MAAI;GACF,MAAM,UAAU,MAAM,mBAAmB;IACvC,MAAM,OAAO;IACb,cAAc;IACd;IACA,aAAa,WAAW;IACzB,CAAC;AACF,UAAO,QAAQ,QAAQ;WAChB,OAAO;AACd,gBAAa,MAAM,yCAAyC;IAC1D,YAAY,aAAa;IACzB,SAAS,aAAa;IACtB;IACD,CAAC;AACF,UAAO;;;CAIX,MAAM,EAAE,WAAW,iBAAiB,mBAAmB;EACrD;EACA,cAAc,YAAY;EAC1B,WAAW;EACX,QAAQ,OAAO,YAAoB,SAAiB,OAAe;GAEjE,MAAM,SADU,WAAW,YAAY,CAChB;AAEvB,OAAI,QAAQ;IACV,MAAM,SAAS,MAAM,QAAQ,CAAC,IAAI,SAAS,GAAG;AAC9C,WAAO,QAAQ;AACf,WAAO;;;EAGX,aAAa,OAAO,YAAoB,YAAoB;GAE1D,MAAM,SADU,WAAW,YAAY,CAChB;AAEvB,OAAI,OAGF,SAFe,SAAS,MAAM,QAAQ,CAAC,SAAS,QAAQ,GAAG,EAAE,EAE/C,KAAK,EAAE,SAAS,GAAG,WAAW,KAAK;;EAGtD,CAAC;AAEF,YAAW,oBAAoB,YAAY,WAAW;AACpD,eAA0C;GACxC,MAAM,OAAO,QAAQ;GAErB,MAAM,cAAc,SAAiB,IAAY,WAAgB;AAC/D,QAAI,CAAC,OACH,QAAO;AAGT,WAAO;KACL,GAAG;KACH,SAAS;MAAE,MAAM;MAAgB;MAAY;MAAS;MAAI;KAC3D;;GAGH,MAAM,eAAe,KAAK;GAC1B,MAAM,UAAU,KAAK;GACrB,MAAM,UAAU,KAAK;GACrB,MAAM,aAAa,KAAK;AAExB,QAAK,OAAO,OAAU,SAAkC,UAA+B;AACrF,cAAU;KAAE;KAAY,GAAG;KAAS,OAAO;MAAE,MAAM;MAAS;MAAO;KAAE,CAAC;;AAGxE,QAAK,WAAW,OAAO,YAAoB;AAEzC,YADe,MAAM,aAAa,MAAM,MAAM,CAAC,QAAQ,CAAC,EAC1C,KAAK,WAA2B,WAAW,SAAS,OAAO,IAAI,OAAO,CAAC;;AAGvF,QAAK,MAAM,OAAO,SAAiB,OAAe;AAEhD,WAAO,WAAW,SAAS,IADZ,MAAM,QAAQ,MAAM,MAAM,CAAC,SAAS,GAAG,CAAC,CACjB;;AAGxC,QAAK,MAAM,OAAO,SAAiB,IAAY,SAAyB;AACtE,QAAI,CAAC,KACH,QAAO;IAGT,MAAM,SAAS,MAAM,KAAK,IAAI,SAAS,GAAG;IAE1C,MAAM,SADU,MAAM,QAAQ,MAAM,MAAM;KAAC;KAAS;KAAI;KAAK,CAAC,IACpC;IAC1B,MAAM,gBAAgB,WAAW,SAAS,IAAI,OAAO;AAGrD,cAAU;KAAE;KAAY;KAAS;KAAI,OAAO;MAAE,MADjC,SAAS,WAAW;MACmB,MAAM;MAAQ;KAAE,CAAC;AAErE,WAAO;;AAGT,QAAK,SAAS,OAAO,SAAiB,OAAe;IACnD,MAAM,SAAS,MAAM,WAAW,MAAM,MAAM,CAAC,SAAS,GAAG,CAAC;AAE1D,cAAU;KAAE;KAAY;KAAS;KAAI,OAAO;MAAE,MAAM;MAAU,MAAM;MAAQ;KAAE,CAAC;AAE/E,WAAO,WAAW,SAAS,IAAI,OAAO;;AAGxC,UAAO;;GAET;CAEF,MAAM,YAAY,WAAW,aAAkB;EAC7C,UAAU;EACV,QAAQ;EACR,QAAQ;GACN,MAAM;GACN,YAAY;IACV,aAAa;IACb,eAAe;AACb,SAAI,CAAC,WAAW,YACd,OAAM,IAAI,MACR,wGACD;AAEH,YAAO,IAAI,gBAAgB,WAAW,YAAY;;IAErD;GACD,QAAQ;GACT;EACF,CAAC,EAAE;CAEJ,MAAM,WAAW,CAAC,GAAG,aAAa,GAAG,WAAW,YAAY;CAC5D,MAAM,gBAAgB,IAAI,kBAAkB,OAAO,WAAW,UAAU;CACxE,MAAM,gBAAgB,oBAAoB,WAAW;CACrD,MAAMC,QAAe;EACnB;EACA,cAAc,SAAS;EACvB;EACA;EACA;EACA;EACA;EACA,cAAc;EACf;CAED,MAAM,cAAc,kBAAkB,OAAO,UAAU,YAAY;CACnE,MAAM,oBAAoB,mBAAmB,OAAO,SAAS,aAAa;CAE1E,MAAM,gBAAgB,SAA+B;AACnD,SAAO,OAAO,KAAc,QAAkB;GAC5C,MAAM,UAAU,iBAAiB;GACjC,MAAM,EAAE,MAAM,UAAU,UAAU,KAAK;GACvC,MAAM,SAAS,cAAc,OAAO;IAAE;IAAS;IAAO;IAAU,CAAC;AAEjE,UAAO,MAAM,2CAA2C,EAAE,MAAM,IAAI,MAAM,CAAC;GAE3E,MAAM,UAAU,IAAI,WAAW;GAE/B,MAAMC,OAAmB;IACvB,MAAM,IAAI;IACV,SAAS,IAAI;IACb,YAAY,IAAI;IAChB,aAAa,IAAI;IACjB;IACD;AAED,OAAI;IACF,IAAIC;AAEJ,QAAI,aAAa,QAAQ,OAAO,KAAK,YAAY,YAAY;KAC3D,MAAM,UAAU;MACd;MACA;MACO;MACP,MAAM,OAAO,UAAoB;OAC/B,MAAM,WAAW;QACf,GAAG;QACH;QACA;QACA;QACA,QAAQ;QACT;AACD,aAAM,SAAS,aAAa,KAAK,SAAS;;MAE5C;MACA,SAAS,WAAW,YAAY;MACjC;AACD,cAAS,MAAM,KAAK,QAAQ,MAAM,QAAQ;UAG1C,UAAS,MAAM,aAA0B;KAAE;KAAM;KAAM;KAAQ,QADhD,MAAM,MAAM,cAAc,aAAa,SAAS,MAAM,OAAO;KACL;KAAS,EAAE,MAAM;AAG1F,eAAW,oBAAoB,EAAE,UAAU,CAAC;AAE5C,QAAI,CAAC,QAAQ;AACX,aAAQ,IAAI,YAAY;AACxB,SAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,yBAAyB,CAAC;AACxD;;AAGF,QAAI,OAAO,QACT,QAAO,QAAQ,OAAO,QAAQ,CAAC,SAAS,CAAC,KAAK,WAAW,IAAI,UAAU,KAAK,MAAM,CAAC;AAGrF,QAAI,OAAO,OAAO,OAAO;AAGzB,QAAI,OAAO,SAAS,OAAO,KAAK,IAAI,OAAO,OAAO,SAAS,SACzD,KAAI,KAAK,OAAO,KAAK;QAErB,KAAI,KAAK,OAAO,KAAK;YAEhB,OAAO;AACd,eAAW,kBAAkB;KAC3B;KACA;KACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU;KACjD,CAAC;AACF,WAAO,MAAM,+BAA+B,EAAE,OAAO,CAAC;AACtD,YAAQ,IAAI,MAAM;AAClB,QAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,yBAAyB,CAAC;;;;AAK9D,KAAI,KAAK,KAAK,GAAG,SAAS;AACxB,MAAI,UAAU;AACd,QAAM;GACN;AAEF,KAAI,IACF,WAAW,KAAK;EACd,OAAO;EACP,SAAS,KAAK,GAAG,KAAK,aAAa;AACjC,OAAI,UAAU,IAAI,SAAU,YAA+B,OAAO;;EAErE,CAAC,CACH;AAED,KAAI,IACF,WAAW,WAAW;EACpB,UAAU;EACV,OAAO;EACP,SAAS,KAAK,GAAG,KAAK,aAAa;AACjC,OAAI,UAAU,IAAI,SAAU,YAA+B,OAAO;;EAErE,CAAC,CACH;AAED,KAAI,IACF,WAAW,KAAK;EACd,OAAO;EACP,SAAS,KAAK,GAAG,KAAK,aAAa;AACjC,OAAI,UAAU,IAAI,SAAU,YAA+B,OAAO;;EAErE,CAAC,CACH;CAED,MAAM,SAAS,QAAQ,QAAQ;CAE/B,MAAM,YAAY,SAA+B;EAC/C,MAAM,EAAE,QAAQ,SAAS,KAAK;AAC9B,eAAa,MAAM,2BAA2B,KAAK,OAAO;EAE1D,MAAM,UAAU,aAAa,KAAK;EAWlC,MAAM,gBAV8C;GAClD,WAAW,OAAO,IAAI,MAAM,QAAQ;GACpC,YAAY,OAAO,KAAK,MAAM,QAAQ;GACtC,WAAW,OAAO,IAAI,MAAM,QAAQ;GACpC,cAAc,OAAO,OAAO,MAAM,QAAQ;GAC1C,aAAa,OAAO,MAAM,MAAM,QAAQ;GACxC,eAAe,OAAO,QAAQ,MAAM,QAAQ;GAC5C,YAAY,OAAO,KAAK,MAAM,QAAQ;GACvC,CAE6B;AAC9B,MAAI,CAAC,cACH,OAAM,IAAI,MAAM,uBAAuB,SAAS;AAGlD,iBAAe;;CAGjB,MAAM,eAAe,SAA+B;EAClD,MAAM,EAAE,MAAM,WAAW,KAAK;AAU9B,SAAO,QATa,OAAO,MAEO,QAAQ,UAAe;AACvD,OAAI,MAAM,MAER,QAAO,EADO,MAAM,MAAM,SAAS,QAAQ,MAAM,MAAM,QAAQ,OAAO,aAAa;AAGrF,UAAO;IACP;;AAIJ,UAAS,OAAO,UAAU,CAAC,QAAQ,SAAS;AAE5C,KAAI,QAAQ,MAAM,MAAM,QAAQ;AAC9B,MAAI,OAAO,+BAA+B,IAAI;AAC9C,MAAI,OAAO,gCAAgC,IAAI;AAC/C,MAAI,OAAO,gCAAgC,IAAI;AAC/C,MAAI,OAAO,0BAA0B,MAAM;AAC3C,MAAI,OAAO,oCAAoC,OAAO;AACtD,MAAI,OAAO,wCAAwC,OAAO;AAC1D,MAAI,OAAO,IAAI,CAAC,KAAK;GACrB;AACF,KAAI,KAAK,MAAM,KAAK,SAAS;AAC3B,MAAI,OAAO,+BAA+B,IAAI;AAC9C,MAAI,OAAO,gCAAgC,IAAI;AAC/C,MAAI,OAAO,gCAAgC,IAAI;AAC/C,MAAI,OAAO,0BAA0B,MAAM;AAC3C,MAAI,OAAO,oCAAoC,OAAO;AACtD,MAAI,OAAO,wCAAwC,OAAO;AAC1D,QAAM;GACN;AAEF,KAAI,IAAI,OAAO;AAEf,eAAc,WAAW;AACzB,qBAAoB,KAAK,QAAQ,KAAK,EAAE,WAAW;AACnD,mBAAkB,KAAK,QAAQ,KAAK,CAAC;AACrC,cAAa,KAAK,WAAW;AAE7B,QAAO,GAAG,UAAU,UAAiC;AACnD,MAAI,MAAM,SAAS,aACjB,SAAQ,MAAM,iBAAiB,MAAM;GAEvC;AAEF,cAAa,GAAG,UAAU,UAAiC;AACzD,MAAI,MAAM,SAAS,aACjB,SAAQ,MAAM,2BAA2B,MAAM;GAEjD;CAEF,MAAM,QAAQ,YAA2B;AACvC,QAAM,YAAY,OAAO;AACzB,eAAa,OAAO;AACpB,MAAI,UAAU,aACZ,OAAM,SAAS,aAAa,UAAU;;AAI1C,QAAO;EAAE;EAAK;EAAQ;EAAc;EAAO;EAAa;EAAU;EAAa;EAAmB;EAAO;EAAS"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-state-adapter.d.mts","names":[],"sources":["../../../src/state/create-state-adapter.ts"],"sourcesContent":[],"mappings":";;;;KAOK,aAAA,GAAgB;;AAF6D,CAAA;AAIlE,iBAAA,kBAAA,CAA2B,MAAA,EAAA,aAAgB,CAAY,EAAZ,YAAY"}
1
+ {"version":3,"file":"create-state-adapter.d.mts","names":[],"sources":["../../../src/state/create-state-adapter.ts"],"sourcesContent":[],"mappings":";;;;KAOK,aAAA,GAAgB;;AAF6D,CAAA;AAIlE,iBAAA,kBAAA,CAA2B,MAAA,EAAA,aAAgB,CAAA,EAAA,YAAY"}
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "import": "./dist/index.mjs"
12
12
  }
13
13
  },
14
- "version": "0.17.0-beta.181",
14
+ "version": "0.17.0-beta.182-601862",
15
15
  "dependencies": {
16
16
  "@amplitude/analytics-node": "^1.5.26",
17
17
  "@standard-schema/spec": "^1.0.0",