@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 6.5 kB
Source Map (JSON)
{"version":3,"file":"stream-media.mjs","names":["mediaServices.checks.checkHasMediaStrategy","processedImageServices.processImage"],"sources":["../../../src/services/cdn/stream-media.ts"],"sourcesContent":["import mime from \"mime-types\";\nimport { copy } from \"../../libs/i18n/index.js\";\nimport type { MediaAdapterStreamBody } from \"../../libs/media/types.js\";\nimport type { StreamSingleQueryParams } from \"../../schemas/cdn.js\";\nimport {\n\tgenerateProcessKey,\n\tisProcessedImageKey,\n\tnormalizeMediaKey,\n\tresolveMediaKeyTenant,\n\tresolveProcessingRequest,\n} from \"../../utils/media/index.js\";\nimport type { ServiceFn } from \"../../utils/services/types.js\";\nimport { mediaServices, processedImageServices } from \"../index.js\";\n\n/**\n * Streams the canonical media key and applies presets or formats on demand.\n */\nconst streamMedia: ServiceFn<\n\t[\n\t\t{\n\t\t\tkey: string;\n\t\t\tquery: StreamSingleQueryParams;\n\t\t\taccept: string | undefined;\n\t\t\tifNoneMatch?: string;\n\t\t\trange?: {\n\t\t\t\tstart: number;\n\t\t\t\tend?: number;\n\t\t\t};\n\t\t},\n\t],\n\t{\n\t\tkey: string;\n\t\tcontentLength: number | undefined;\n\t\tcontentType: string | undefined;\n\t\tbody: MediaAdapterStreamBody;\n\t\tetag?: string | null;\n\t\tnotModified?: boolean;\n\t\tisPartialContent?: boolean;\n\t\ttotalSize?: number;\n\t\trange?: {\n\t\t\tstart: number;\n\t\t\tend: number;\n\t\t};\n\t}\n> = async (context, data) => {\n\tconst mediaStrategyRes =\n\t\tawait mediaServices.checks.checkHasMediaStrategy(context);\n\tif (mediaStrategyRes.error) return mediaStrategyRes;\n\n\tconst normalizedKey = normalizeMediaKey(data.key);\n\tconst isProcessedKey = isProcessedImageKey(normalizedKey);\n\tconst tenant = resolveMediaKeyTenant(context.config, normalizedKey);\n\n\tif (isProcessedKey) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tstatus: 404,\n\t\t\t\tname: copy(\"server:core.media.not.found.name\"),\n\t\t\t\tmessage: copy(\"server:core.media.not.found.message\"),\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst processingRequest = resolveProcessingRequest({\n\t\tpresets: context.config.media.images.presets,\n\t\tallowFormatQuery: context.config.media.images.allowFormatQuery,\n\t\tquery: data.query,\n\t\taccept: data.accept,\n\t});\n\n\tif (!processingRequest.hasProcessing) {\n\t\tconst res = await mediaStrategyRes.data.stream(context, {\n\t\t\tkey: normalizedKey,\n\t\t\tifNoneMatch: data.ifNoneMatch,\n\t\t\trange: data.range,\n\t\t\ttenant,\n\t\t});\n\t\tif (res.error) return res;\n\t\treturn {\n\t\t\terror: undefined,\n\t\t\tdata: {\n\t\t\t\tkey: normalizedKey,\n\t\t\t\tcontentLength: res.data.contentLength,\n\t\t\t\tcontentType: res.data.contentType,\n\t\t\t\tbody: res.data.body,\n\t\t\t\tetag: res.data.etag,\n\t\t\t\tnotModified: res.data.notModified,\n\t\t\t\tisPartialContent: res.data.isPartialContent,\n\t\t\t\ttotalSize: res.data.totalSize,\n\t\t\t\trange: res.data.range,\n\t\t\t},\n\t\t};\n\t}\n\n\t// ------------------------------\n\t// Processed Image\n\tlet sourceExtension: string | null = processingRequest.format ?? null;\n\tif (!sourceExtension) {\n\t\tconst metaRes = await mediaStrategyRes.data.getMeta(context, {\n\t\t\tkey: normalizedKey,\n\t\t\ttenant,\n\t\t});\n\t\tif (metaRes.error) return metaRes;\n\t\tsourceExtension = mime.extension(metaRes.data.mimeType || \"\") || null;\n\t}\n\n\tconst processKey = generateProcessKey({\n\t\tkey: normalizedKey,\n\t\textension: sourceExtension,\n\t\toptions: {\n\t\t\tformat: processingRequest.format,\n\t\t\tquality: processingRequest.quality,\n\t\t\twidth: processingRequest.width,\n\t\t\theight: processingRequest.height,\n\t\t\tfit: processingRequest.fit,\n\t\t},\n\t});\n\n\tconst res = await mediaStrategyRes.data.stream(context, {\n\t\tkey: processKey,\n\t\tifNoneMatch: data.ifNoneMatch,\n\t\trange: data.range,\n\t\ttenant: resolveMediaKeyTenant(context.config, processKey),\n\t});\n\tif (res.data) {\n\t\treturn {\n\t\t\terror: undefined,\n\t\t\tdata: {\n\t\t\t\tkey: processKey,\n\t\t\t\tcontentLength: res.data.contentLength,\n\t\t\t\tcontentType: res.data.contentType,\n\t\t\t\tbody: res.data.body,\n\t\t\t\tetag: res.data.etag,\n\t\t\t\tnotModified: res.data.notModified,\n\t\t\t\tisPartialContent: res.data.isPartialContent,\n\t\t\t\ttotalSize: res.data.totalSize,\n\t\t\t\trange: res.data.range,\n\t\t\t},\n\t\t};\n\t}\n\n\t// Process\n\treturn await processedImageServices.processImage(context, {\n\t\tkey: normalizedKey,\n\t\tprocessKey: processKey,\n\t\tifNoneMatch: data.ifNoneMatch,\n\t\toptions: {\n\t\t\tformat: processingRequest.format,\n\t\t\tquality: processingRequest.quality,\n\t\t\twidth: processingRequest.width,\n\t\t\theight: processingRequest.height,\n\t\t\tfit: processingRequest.fit,\n\t\t},\n\t});\n};\n\nexport default streamMedia;\n"],"mappings":"yfAiBA,MAAM,EA2BF,MAAO,EAAS,IAAS,CAC5B,IAAM,EACL,MAAMA,EAA2C,CAAO,EACzD,GAAI,EAAiB,MAAO,OAAO,EAEnC,IAAM,EAAgB,EAAkB,EAAK,GAAG,EAC1C,EAAiB,EAAoB,CAAa,EAClD,EAAS,EAAsB,EAAQ,OAAQ,CAAa,EAElE,GAAI,EACH,MAAO,CACN,MAAO,CACN,KAAM,QACN,OAAQ,IACR,KAAM,EAAK,kCAAkC,EAC7C,QAAS,EAAK,qCAAqC,CACpD,EACA,KAAM,IAAA,EACP,EAGD,IAAM,EAAoB,EAAyB,CAClD,QAAS,EAAQ,OAAO,MAAM,OAAO,QACrC,iBAAkB,EAAQ,OAAO,MAAM,OAAO,iBAC9C,MAAO,EAAK,MACZ,OAAQ,EAAK,MACd,CAAC,EAED,GAAI,CAAC,EAAkB,cAAe,CACrC,IAAM,EAAM,MAAM,EAAiB,KAAK,OAAO,EAAS,CACvD,IAAK,EACL,YAAa,EAAK,YAClB,MAAO,EAAK,MACZ,QACD,CAAC,EAED,OADI,EAAI,MAAc,EACf,CACN,MAAO,IAAA,GACP,KAAM,CACL,IAAK,EACL,cAAe,EAAI,KAAK,cACxB,YAAa,EAAI,KAAK,YACtB,KAAM,EAAI,KAAK,KACf,KAAM,EAAI,KAAK,KACf,YAAa,EAAI,KAAK,YACtB,iBAAkB,EAAI,KAAK,iBAC3B,UAAW,EAAI,KAAK,UACpB,MAAO,EAAI,KAAK,KACjB,CACD,CACD,CAIA,IAAI,EAAiC,EAAkB,QAAU,KACjE,GAAI,CAAC,EAAiB,CACrB,IAAM,EAAU,MAAM,EAAiB,KAAK,QAAQ,EAAS,CAC5D,IAAK,EACL,QACD,CAAC,EACD,GAAI,EAAQ,MAAO,OAAO,EAC1B,EAAkB,EAAK,UAAU,EAAQ,KAAK,UAAY,EAAE,GAAK,IAClE,CAEA,IAAM,EAAa,EAAmB,CACrC,IAAK,EACL,UAAW,EACX,QAAS,CACR,OAAQ,EAAkB,OAC1B,QAAS,EAAkB,QAC3B,MAAO,EAAkB,MACzB,OAAQ,EAAkB,OAC1B,IAAK,EAAkB,GACxB,CACD,CAAC,EAEK,EAAM,MAAM,EAAiB,KAAK,OAAO,EAAS,CACvD,IAAK,EACL,YAAa,EAAK,YAClB,MAAO,EAAK,MACZ,OAAQ,EAAsB,EAAQ,OAAQ,CAAU,CACzD,CAAC,EAmBD,OAlBI,EAAI,KACA,CACN,MAAO,IAAA,GACP,KAAM,CACL,IAAK,EACL,cAAe,EAAI,KAAK,cACxB,YAAa,EAAI,KAAK,YACtB,KAAM,EAAI,KAAK,KACf,KAAM,EAAI,KAAK,KACf,YAAa,EAAI,KAAK,YACtB,iBAAkB,EAAI,KAAK,iBAC3B,UAAW,EAAI,KAAK,UACpB,MAAO,EAAI,KAAK,KACjB,CACD,EAIM,MAAMC,EAAoC,EAAS,CACzD,IAAK,EACO,aACZ,YAAa,EAAK,YAClB,QAAS,CACR,OAAQ,EAAkB,OAC1B,QAAS,EAAkB,QAC3B,MAAO,EAAkB,MACzB,OAAQ,EAAkB,OAC1B,IAAK,EAAkB,GACxB,CACD,CAAC,CACF"}