{"version":3,"sources":["../../src/server/fastify/index.ts","../../src/server/fastify/DefaultFlow.ts","../../src/server/fastify/FileSystemAssetStorage.ts","../../src/server/fastify/FileSystemLogger.ts","../../src/server/fastify/FlowRun.ts","../../src/server/fastify/PathProvider.ts","../../src/server/fastify/modelFusionFlowPlugin.ts"],"sourcesContent":["export * from \"./AssetStorage.js\";\nexport * from \"./DefaultFlow.js\";\nexport * from \"./FileSystemAssetStorage.js\";\nexport * from \"./FileSystemLogger.js\";\nexport * from \"./Flow.js\";\nexport * from \"./FlowRun.js\";\nexport * from \"./Logger.js\";\nexport * from \"./modelFusionFlowPlugin.js\";\n","import { FlowRun } from \"./FlowRun.js\";\nimport { FlowSchema } from \"./FlowSchema.js\";\n\nexport class DefaultFlow<INPUT, EVENT> {\n  readonly schema: FlowSchema<INPUT, EVENT>;\n\n  constructor({\n    schema,\n    process,\n  }: {\n    schema: FlowSchema<INPUT, EVENT>;\n    process: (options: { input: INPUT; run: FlowRun<EVENT> }) => Promise<void>;\n  }) {\n    this.schema = schema;\n    this.process = process;\n  }\n\n  process: (options: { input: INPUT; run: FlowRun<EVENT> }) => Promise<void>;\n}\n","import { promises as fs } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Asset, AssetStorage } from \"./AssetStorage.js\";\nimport { FlowRun } from \"./FlowRun.js\";\nimport { Logger } from \"./Logger.js\";\n\nexport class FileSystemAssetStorage implements AssetStorage {\n  private readonly path: (run: FlowRun<unknown>) => string;\n  private readonly logger: Logger;\n\n  constructor({\n    path,\n    logger,\n  }: {\n    path: (run: FlowRun<unknown>) => string;\n    logger: Logger;\n  }) {\n    this.path = path;\n    this.logger = logger;\n  }\n\n  async storeAsset({\n    run,\n    asset,\n  }: {\n    run: FlowRun<unknown>;\n    asset: Asset;\n  }): Promise<void> {\n    try {\n      const assetPath = this.path(run);\n      await fs.mkdir(assetPath, { recursive: true });\n      await fs.writeFile(join(assetPath, asset.name), asset.data);\n      await fs.writeFile(\n        join(assetPath, `${asset.name}.meta.json`),\n        JSON.stringify({\n          name: asset.name,\n          contentType: asset.contentType,\n        })\n      );\n    } catch (error) {\n      this.logger.logError({\n        run,\n        message: `Failed to store asset ${asset.name}`,\n        error,\n      });\n      throw error;\n    }\n  }\n\n  async readAsset(options: {\n    run: FlowRun<unknown>;\n    assetName: string;\n  }): Promise<Asset | null> {\n    try {\n      const assetPath = this.path(options.run);\n      const data = await fs.readFile(join(assetPath, options.assetName));\n      const meta = await fs.readFile(\n        join(assetPath, `${options.assetName}.meta.json`)\n      );\n      const { name, contentType } = JSON.parse(meta.toString());\n      return { data, name, contentType };\n    } catch (error) {\n      this.logger.logError({\n        run: options.run,\n        message: `Failed to read asset ${options.assetName}`,\n        error,\n      });\n      throw error;\n    }\n  }\n}\n","import { FunctionEvent } from \"modelfusion\";\nimport { promises as fs } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { FlowRun } from \"./FlowRun.js\";\nimport { Logger } from \"./Logger.js\";\n\nexport class FileSystemLogger implements Logger {\n  private readonly logPath: (run: FlowRun<unknown>) => string;\n\n  constructor({ path }: { path: (run: FlowRun<unknown>) => string }) {\n    this.logPath = path;\n  }\n\n  async logFunctionEvent({\n    run,\n    event,\n  }: {\n    run: FlowRun<unknown>;\n    event: FunctionEvent;\n  }): Promise<void> {\n    const timestamp = event.startTimestamp.getTime();\n    try {\n      const logPath = this.logPath(run);\n      await fs.mkdir(logPath, { recursive: true });\n      await fs.writeFile(\n        join(\n          logPath,\n          `${timestamp}-${event.callId}-${\n            event.functionId ?? event.functionType\n          }-${event.eventType}.json`\n        ),\n        JSON.stringify(event)\n      );\n    } catch (error) {\n      this.logError({\n        run,\n        message: `Failed to write function event ${event.callId}`,\n        error,\n      });\n    }\n  }\n\n  async logError({\n    run,\n    error,\n    message,\n  }: {\n    run: FlowRun<unknown>;\n    message: string;\n    error: unknown;\n  }): Promise<void> {\n    const timestamp = Date.now();\n    try {\n      const logPath = this.logPath(run);\n      await fs.mkdir(logPath, { recursive: true });\n      await fs.writeFile(\n        join(logPath, `${timestamp}-error.json`),\n        JSON.stringify({\n          timestamp: new Date(timestamp).toISOString(),\n          runId: run.runId,\n          message,\n          error,\n        })\n      );\n    } catch (error) {\n      console.error(`Failed to write error log`);\n      console.error(error);\n    }\n  }\n}\n","import { AsyncQueue, DefaultRun, FunctionEvent } from \"modelfusion\";\nimport { Asset, AssetStorage } from \"./AssetStorage.js\";\nimport { Logger } from \"./Logger.js\";\nimport { PathProvider } from \"./PathProvider.js\";\n\nexport class FlowRun<EVENT> extends DefaultRun {\n  readonly eventQueue: AsyncQueue<EVENT> = new AsyncQueue();\n\n  private readonly assetStorage: AssetStorage;\n  private readonly logger: Logger;\n  private readonly paths: PathProvider;\n\n  constructor({\n    paths,\n    assetStorage,\n    logger,\n  }: {\n    paths: PathProvider;\n    assetStorage: AssetStorage;\n    logger: Logger;\n  }) {\n    super();\n\n    this.paths = paths;\n    this.assetStorage = assetStorage;\n    this.logger = logger;\n  }\n\n  readonly functionObserver = {\n    onFunctionEvent: async (event: FunctionEvent) => {\n      this.logger.logFunctionEvent({\n        run: this,\n        event,\n      });\n    },\n  };\n\n  publishEvent(event: EVENT) {\n    this.eventQueue.push(event);\n  }\n\n  async storeBinaryAsset(asset: Asset): Promise<string> {\n    await this.assetStorage.storeAsset({\n      run: this,\n      asset,\n    });\n\n    return this.paths.getAssetUrl(this.runId, asset.name);\n  }\n\n  async storeTextAsset(asset: {\n    text: string;\n    contentType: string;\n    name: string;\n  }) {\n    return this.storeBinaryAsset({\n      data: Buffer.from(asset.text),\n      contentType: asset.contentType,\n      name: asset.name,\n    });\n  }\n\n  finish() {\n    this.eventQueue.close();\n  }\n}\n","export class PathProvider {\n  readonly baseUrl: string;\n  readonly basePath: string;\n\n  constructor({ baseUrl, basePath }: { baseUrl: string; basePath: string }) {\n    this.baseUrl = baseUrl;\n    this.basePath = basePath;\n  }\n\n  getAssetUrl(runId: string, assetName: string) {\n    return `${this.baseUrl}${this.basePath}/${runId}/assets/${assetName}`;\n  }\n\n  getAssetPathTemplate() {\n    return `${this.basePath}/:runId/assets/:assetName`;\n  }\n\n  getEventsUrl(runId: string) {\n    return `${this.baseUrl}${this.basePath}/${runId}/events`;\n  }\n\n  getEventsPathTemplate() {\n    return `${this.basePath}/:runId/events`;\n  }\n}\n","import type { FastifyInstance, FastifyPluginAsync } from \"fastify\";\nimport { z } from \"zod\";\nimport type { AssetStorage } from \"./AssetStorage.js\";\nimport { Flow } from \"./Flow.js\";\nimport { FlowRun } from \"./FlowRun.js\";\nimport { Logger } from \"./Logger.js\";\nimport { PathProvider } from \"./PathProvider.js\";\nimport { withRun } from \"modelfusion\";\n\nexport interface ModelFusionFastifyPluginOptions {\n  flow: Flow<any, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n  baseUrl: string;\n  basePath: string;\n  assetStorage: AssetStorage;\n  logger: Logger;\n}\n\nexport const modelFusionFastifyPlugin: FastifyPluginAsync<\n  ModelFusionFastifyPluginOptions\n> = async (\n  fastify: FastifyInstance,\n  {\n    flow,\n    baseUrl,\n    basePath,\n    assetStorage,\n    logger,\n  }: ModelFusionFastifyPluginOptions\n) => {\n  type EVENT = z.infer<typeof flow.schema.events>;\n\n  const paths = new PathProvider({\n    baseUrl,\n    basePath,\n  });\n\n  const runs: Record<string, FlowRun<EVENT>> = {};\n\n  fastify.post(paths.basePath, async (request) => {\n    const run = new FlowRun<EVENT>({\n      paths,\n      assetStorage,\n      logger,\n    });\n\n    runs[run.runId] = run;\n\n    // body the request body is json, parse and validate it:\n    const input = flow.schema.input.parse(request.body);\n\n    // start longer-running process (no await):\n    withRun(run, async () => {\n      flow\n        .process({\n          input,\n          run,\n        })\n        .catch((error) => {\n          console.error(\"Failed to process flow\", error);\n          logger.logError({\n            run,\n            message: \"Failed to process flow\",\n            error,\n          });\n        })\n        .finally(async () => {\n          run.finish();\n        });\n    });\n\n    return {\n      id: run.runId,\n      url: paths.getEventsUrl(run.runId),\n    };\n  });\n\n  fastify.get(paths.getAssetPathTemplate(), async (request, reply) => {\n    const runId = (request.params as any).runId; // eslint-disable-line @typescript-eslint/no-explicit-any\n    const assetName = (request.params as any).assetName; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n    const asset = await assetStorage.readAsset({\n      run: runs[runId],\n      assetName,\n    });\n\n    if (asset == null) {\n      logger.logError({\n        run: runs[runId],\n        message: `Asset ${assetName} not found`,\n        error: new Error(`Asset ${assetName} not found`),\n      });\n      reply.status(404);\n      return { error: `Asset ${assetName} not found` };\n    }\n\n    const headers = {\n      \"Access-Control-Allow-Origin\": \"*\",\n      \"Content-Length\": asset.data.length,\n      \"Content-Type\": asset.contentType,\n      \"Cache-Control\": \"no-cache\",\n    };\n\n    reply.raw.writeHead(200, headers);\n\n    reply.raw.write(asset.data);\n    reply.raw.end();\n\n    return;\n  });\n\n  fastify.get(paths.getEventsPathTemplate(), async (request, reply) => {\n    const runId = (request.params as any).runId; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n    const eventQueue = runs[runId]?.eventQueue;\n\n    if (!eventQueue) {\n      return {\n        error: `No event queue found for run ID ${runId}`,\n      };\n    }\n\n    const headers = {\n      \"Access-Control-Allow-Origin\": \"*\",\n\n      \"Content-Type\": \"text/event-stream\",\n      Connection: \"keep-alive\",\n      \"Cache-Control\": \"no-cache\",\n      \"Content-Encoding\": \"none\",\n    };\n\n    reply.raw.writeHead(200, headers);\n\n    const textEncoder = new TextEncoder();\n    for await (const event of eventQueue) {\n      if (reply.raw.destroyed) {\n        break; // client disconnected\n      }\n\n      reply.raw.write(textEncoder.encode(`data: ${JSON.stringify(event)}\\n\\n`));\n    }\n\n    if (!reply.raw.destroyed) {\n      reply.raw.write(textEncoder.encode(`data: [DONE]\\n\\n`));\n    }\n\n    reply.raw.end();\n    return;\n  });\n};\n"],"mappings":"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","names":["fs","import_node_fs","import_node_path","fs","error","import_modelfusion"]}