UNPKG

turborepo-remote-cache

Version:
78 lines 6.48 kB
import { PassThrough, Writable } from 'node:stream'; import { Readable } from 'node:stream'; import { GetObjectCommand, HeadObjectCommand, S3Client, } from '@aws-sdk/client-s3'; import { Upload } from '@aws-sdk/lib-storage'; export function createS3({ accessKey = process.env.S3_ACCESS_KEY, secretKey = process.env.S3_SECRET_KEY, bucket, region = process.env.S3_REGION, endpoint, maxSockets, s3OptionsPassthrough = {}, }) { if (!bucket) { throw new Error('S3 bucket is required; please set the STORAGE_PATH environment variable to the bucket name'); } const client = new S3Client({ credentials: accessKey && secretKey ? { accessKeyId: accessKey, secretAccessKey: secretKey, } : undefined, region, endpoint, ...(maxSockets ? { requestHandler: { httpsAgent: { maxSockets }, }, } : {}), ...(process.env.NODE_ENV === 'test' ? { sslEnabled: false, s3ForcePathStyle: true } : {}), ...s3OptionsPassthrough, }); return { exists: async (key, cb) => { try { await client.send(new HeadObjectCommand({ Bucket: bucket, Key: key })); return cb(null, true); } catch (error) { return cb(null, false); } }, createReadStream: (key) => { const passThrough = new PassThrough(); client .send(new GetObjectCommand({ Bucket: bucket, Key: key })) .then((data) => { if (data.Body) { if (data.Body instanceof Readable) { data.Body.pipe(passThrough); } else { const stream = Readable.from(data.Body); stream.pipe(passThrough); } } }) .catch((err) => passThrough.destroy(err)); return passThrough; }, createWriteStream: (key) => { const passThrough = new PassThrough(); const upload = new Upload({ client, params: { Bucket: bucket, Key: key, Body: passThrough }, }); const uploadPromise = upload.done(); const writeStream = new Writable({ write(chunk, encoding, callback) { passThrough.write(chunk, encoding, callback); }, final(callback) { passThrough.end(); uploadPromise.then(() => callback()).catch(callback); }, }); return writeStream; }, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGx1Z2lucy9yZW1vdGUtY2FjaGUvc3RvcmFnZS9zMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3RDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLFFBQVEsR0FFVCxNQUFNLG9CQUFvQixDQUFBO0FBQzNCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQWM3QyxNQUFNLFVBQVUsUUFBUSxDQUFDLEVBQ3ZCLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFDckMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUNyQyxNQUFNLEVBQ04sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUM5QixRQUFRLEVBQ1IsVUFBVSxFQUNWLG9CQUFvQixHQUFHLEVBQUUsR0FDZjtJQUNWLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sSUFBSSxLQUFLLENBQ2IsNEZBQTRGLENBQzdGLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQUM7UUFDMUIsV0FBVyxFQUNULFNBQVMsSUFBSSxTQUFTO1lBQ3BCLENBQUMsQ0FBQztnQkFDRSxXQUFXLEVBQUUsU0FBUztnQkFDdEIsZUFBZSxFQUFFLFNBQVM7YUFDM0I7WUFDSCxDQUFDLENBQUMsU0FBUztRQUNmLE1BQU07UUFDTixRQUFRO1FBQ1IsR0FBRyxDQUFDLFVBQVU7WUFDWixDQUFDLENBQUM7Z0JBQ0UsY0FBYyxFQUFFO29CQUNkLFVBQVUsRUFBRSxFQUFFLFVBQVUsRUFBRTtpQkFDM0I7YUFDRjtZQUNILENBQUMs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