Files
splatoon3.ink/app/sync/index.mjs
2026-09-26 09:56:44 -07:00

94 lines
2.1 KiB
JavaScript

import S3Syncer from './S3Syncer.mjs';
import R2Syncer from './R2Syncer.mjs';
import CloudflareCachePurger from './CloudflareCachePurger.mjs';
function cachePurger() {
const zoneId = process.env.CLOUDFLARE_CACHE_PURGE_ZONE_ID;
const apiToken = process.env.CLOUDFLARE_CACHE_PURGE_API_TOKEN;
if (!zoneId && !apiToken) return;
return new CloudflareCachePurger({
zoneId,
apiToken,
hosts: (process.env.CLOUDFLARE_CACHE_PURGE_HOSTS ?? '')
.split(',').map(host => host.trim()).filter(Boolean),
});
}
export function canSyncS3() {
return !!(
process.env.AWS_ACCESS_KEY_ID &&
process.env.AWS_SECRET_ACCESS_KEY &&
process.env.AWS_S3_BUCKET &&
process.env.AWS_S3_PRIVATE_BUCKET
);
}
function r2Configuration() {
return {
accessKeyId: process.env.R2_ACCESS_KEY_ID,
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,
bucket: process.env.R2_BUCKET,
endpoint: process.env.R2_ENDPOINT,
};
}
export function canUploadR2() {
return Object.values(r2Configuration()).every(Boolean);
}
export function canUpload() {
return canSyncS3() || canUploadR2();
}
export async function upload() {
// Validate purge settings before starting uploads to either destination.
const purger = canUploadR2() ? cachePurger() : undefined;
let uploads = [];
if (canSyncS3()) {
uploads.push((new S3Syncer).upload());
}
if (canUploadR2()) {
uploads.push((new R2Syncer({
config: r2Configuration(),
cachePurger: purger,
})).upload());
}
if (uploads.length === 0) {
console.warn('Missing object storage connection parameters');
}
await Promise.all(uploads);
}
async function doSync(download, shouldUpload) {
if (download) {
if (canSyncS3()) {
console.info('Downloading files...');
await (new S3Syncer).download();
} else {
console.warn('Missing S3 connection parameters for download');
}
}
if (shouldUpload) {
console.info('Uploading files...');
await upload();
}
}
export function sync() {
return doSync(true, true);
}
export function syncUpload() {
return doSync(false, true);
}
export function syncDownload() {
return doSync(true, false);
}