@appsemble/node-utils
Version:
NodeJS utilities used by Appsemble internally.
65 lines • 2.38 kB
JavaScript
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