turborepo-remote-cache
Version:
Turborepo remote cache server
78 lines • 6.48 kB
JavaScript
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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