{"version":3,"file":"staticHandler.mjs","names":["stream: Readable | undefined","stream"],"sources":["../../src/adapter/staticHandler.ts"],"sourcesContent":["import { Readable } from 'node:stream'\nimport type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types'\nimport type { Document } from 'payload'\nimport type { S3Store } from '../tus/stores/s3/s3Store'\n\ninterface StaticHandlerArgs {\n  getS3Store: () => S3Store\n  collection: string\n}\n\ninterface ServeS3FileArgs {\n  getS3Store: () => S3Store\n  doc: Document\n}\n\ninterface CreateEmptyResponseArgs {\n  mimeType?: string\n}\n\n/**\n * Creates a static handler that serves files from S3 or returns empty responses for Mux assets\n * @param args - The arguments for creating the static handler\n * @param args.getS3Store -  Function that returns an S3 client instance\n * @param args.collection - The name of the media collection in Payload\n * @returns A StaticHandler function that serves files or empty responses based on storage type\n */\nexport function getStaticHandler(args: StaticHandlerArgs): StaticHandler {\n  const { getS3Store, collection } = args\n  return async (req, { params }) => {\n    const { payload } = req\n    const filename = params.filename\n\n    const { docs } = await payload.find({\n      collection,\n      where: { filename: { equals: filename } },\n    })\n\n    const doc = docs[0] as Document\n\n    if (!doc) {\n      return createEmptyResponse()\n    }\n\n    if (doc.storage === 'mux') {\n      return createEmptyResponse({ mimeType: doc.mimeType })\n    }\n\n    return await serveS3File({ getS3Store, doc })\n  }\n}\n\n/**\n * Creates an empty response with appropriate headers\n * @param args - Optional arguments for the empty response\n * @param args.mimeType - The MIME type to set in the Content-Type header\n * @returns A Response object with empty content and appropriate headers\n */\nfunction createEmptyResponse(args?: CreateEmptyResponseArgs): Response {\n  const { mimeType = 'application/octet-stream' } = args ?? {}\n  return new Response(new Uint8Array(0), {\n    status: 200,\n    headers: {\n      'Content-Type': mimeType,\n      'Content-Length': '0',\n    },\n  })\n}\n\n/**\n * Serves a file from S3 storage\n * @param args - The arguments for serving the S3 file\n * @param args.getS3Store - Function that returns an S3 client instance\n * @param args.doc - The document containing file metadata\n * @returns A Promise that resolves to a Response object containing the file stream or empty response on error\n */\nasync function serveS3File({\n  getS3Store,\n  doc,\n}: ServeS3FileArgs): Promise<Response> {\n  let stream: Readable | undefined = undefined\n\n  try {\n    const s3Store = getS3Store()\n    stream = await s3Store.read(doc.path ?? doc.filename)\n\n    if (stream) {\n      const webStream = Readable.toWeb(stream) as ReadableStream<Uint8Array>\n      return new Response(webStream)\n    }\n  } catch (_error) {\n    stream?.destroy()\n    // File not found or other error, fall back to empty response\n  }\n\n  return createEmptyResponse({})\n}\n"],"mappings":";;;;;;;;;;AA0BA,SAAgB,iBAAiB,MAAwC;CACvE,MAAM,EAAE,YAAY,eAAe;AACnC,QAAO,OAAO,KAAK,EAAE,aAAa;EAChC,MAAM,EAAE,YAAY;EACpB,MAAM,WAAW,OAAO;EAExB,MAAM,EAAE,SAAS,MAAM,QAAQ,KAAK;GAClC;GACA,OAAO,EAAE,UAAU,EAAE,QAAQ,UAAU,EAAE;GAC1C,CAAC;EAEF,MAAM,MAAM,KAAK;AAEjB,MAAI,CAAC,IACH,QAAO,qBAAqB;AAG9B,MAAI,IAAI,YAAY,MAClB,QAAO,oBAAoB,EAAE,UAAU,IAAI,UAAU,CAAC;AAGxD,SAAO,MAAM,YAAY;GAAE;GAAY;GAAK,CAAC;;;;;;;;;AAUjD,SAAS,oBAAoB,MAA0C;CACrE,MAAM,EAAE,WAAW,+BAA+B,QAAQ,EAAE;AAC5D,QAAO,IAAI,SAAS,IAAI,WAAW,EAAE,EAAE;EACrC,QAAQ;EACR,SAAS;GACP,gBAAgB;GAChB,kBAAkB;GACnB;EACF,CAAC;;;;;;;;;AAUJ,eAAe,YAAY,EACzB,YACA,OACqC;CACrC,IAAIA,WAA+B;AAEnC,KAAI;AAEF,aAAS,MADO,YAAY,CACL,KAAK,IAAI,QAAQ,IAAI,SAAS;AAErD,MAAIC,UAAQ;GACV,MAAM,YAAY,SAAS,MAAMA,SAAO;AACxC,UAAO,IAAI,SAAS,UAAU;;UAEzB,QAAQ;AACf,YAAQ,SAAS;;AAInB,QAAO,oBAAoB,EAAE,CAAC"}