UNPKG

@appsemble/node-utils

Version:

NodeJS utilities used by Appsemble internally.

65 lines 2.38 kB
import { createReadStream } from 'node:fs'; import { stat } from 'node:fs/promises'; import sharp from 'sharp'; import { logger } from './logger.js'; import { uploadS3File } from './s3.js'; import { removeUploads } from './uploads.js'; export function setAssetHeaders(ctx, mime, filename, stats) { ctx.set('content-type', mime || 'application/octet-stream'); if (filename) { ctx.set('content-disposition', `${mime?.startsWith('image') ? 'inline' : 'attachment'}; filename=${JSON.stringify(filename)}`); } if (stats) { ctx.set('Content-Length', String(stats.size)); ctx.set('ETag', stats.etag); ctx.set('Last-Modified', stats.lastModified.toUTCString()); } ctx.set('Access-Control-Expose-Headers', 'Content-Disposition'); ctx.set('Cache-Control', 'max-age=31536000,immutable'); } const ignoredMimes = new Set(['image/avif']); export function getCompressedFileMeta({ filename, mime }) { if (mime?.startsWith('image') && !ignoredMimes.has(mime)) { return { filename: filename ? filename.includes('.') ? `${filename.slice(0, filename.lastIndexOf('.'))}.avif` : `${filename}.avif` : undefined, mime: 'image/avif', }; } return { filename, mime }; } export async function uploadAsset(appId, asset) { const { id, mime, path } = asset; const filesToUnlink = [path]; let uploadFrom = path; if (mime?.startsWith('image') && !ignoredMimes.has(mime)) { uploadFrom = `${path}_compressed`; await sharp(path).rotate().toFormat('avif').toFile(uploadFrom); filesToUnlink.push(uploadFrom); } try { const stats = await stat(uploadFrom); const stream = createReadStream(uploadFrom); await uploadS3File(`app-${appId}`, id, stream, stats.size); } catch (error) { logger.error(error); } return filesToUnlink; } export async function uploadAssets(appId, assets) { const filesToUnlink = []; for (const asset of assets) { const toUnlink = await uploadAsset(appId, asset); for (const path of toUnlink) { if (!filesToUnlink.includes(path)) { filesToUnlink.push(path); } } } await removeUploads(filesToUnlink); } //# sourceMappingURL=assets.js.map