/* Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Copyright (C) 2025 Spacebar and Spacebar Contributors This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ import { FileStorage } from "./FileStorage"; import path from "path"; import fs from "fs"; import { S3 } from "@aws-sdk/client-s3"; import { S3Storage } from "./S3Storage"; import { EnvConfig } from "@spacebar/util"; process.cwd(); export interface Storage { set(path: string, data: Buffer): Promise; clone(path: string, newPath: string): Promise; get(path: string): Promise; delete(path: string): Promise; } let storage: Storage; if (EnvConfig.get().cdn.storageProvider === "file" || !EnvConfig.get().cdn.storageProvider) { let location = EnvConfig.get().cdn.storageLocation; if (location) { location = path.resolve(location); } else { location = path.join(process.cwd(), "files"); } // TODO: move this to some start func, so it doesn't run when server is imported //console.log(`[CDN] storage location: ${bgCyan(`${black(location)}`)}`); if (!fs.existsSync(location)) fs.mkdirSync(location); process.env.STORAGE_LOCATION = location; storage = new FileStorage(); } else if (EnvConfig.get().cdn.storageProvider === "s3") { const region = EnvConfig.get().cdn.storageRegion, bucket = EnvConfig.get().cdn.storageBucket; if (!region) { console.error(`[CDN] You must provide a region when using the S3 storage provider.`); process.exit(1); } if (!bucket) { console.error(`[CDN] You must provide a bucket when using the S3 storage provider.`); process.exit(1); } // in the S3 provider, this should be the root path in the bucket let location = EnvConfig.get().cdn.storageLocation; if (!location) { console.warn(`[CDN] STORAGE_LOCATION unconfigured for S3 provider, defaulting to the bucket root...`); location = undefined; } const client = new S3({ region }); storage = new S3Storage(client, bucket, location); } export { storage };