import { env } from "indite-js/env"; import { Client, PostPolicyResult } from "minio"; type Props = { filePath: string; fileType?: string; maxFileSize?: number; }; const tenMinutes = 10 * 60; export const generatePresignedPostPolicy = async ({ filePath, fileType, maxFileSize, }: Props): Promise => { if (!env.S3_ENDPOINT || !env.S3_ACCESS_KEY || !env.S3_SECRET_KEY) throw new Error( "S3 not properly configured. Missing one of those variables: S3_ENDPOINT, S3_ACCESS_KEY, S3_SECRET_KEY" ); const minioClient = new Client({ endPoint: env.S3_ENDPOINT, port: env.S3_PORT, useSSL: env.S3_SSL, accessKey: env.S3_ACCESS_KEY, secretKey: env.S3_SECRET_KEY, region: env.S3_REGION, }); const postPolicy = minioClient.newPostPolicy(); if (maxFileSize) postPolicy.setContentLengthRange(0, maxFileSize * 1024 * 1024); postPolicy.setKey(filePath); postPolicy.setBucket(env.S3_BUCKET); postPolicy.setExpires(new Date(Date.now() + tenMinutes * 1000)); postPolicy.formData["Cache-Control"] = "public, max-age=86400"; postPolicy.policy.conditions.push([ "eq", "$Cache-Control", "public, max-age=86400", ]); if (fileType) postPolicy.setContentType(fileType); return minioClient.presignedPostPolicy(postPolicy); };