diff options
Diffstat (limited to 'src/cdn/util/Storage.ts')
-rw-r--r-- | src/cdn/util/Storage.ts | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/cdn/util/Storage.ts b/src/cdn/util/Storage.ts new file mode 100644 index 00000000..1ab6a1d9 --- /dev/null +++ b/src/cdn/util/Storage.ts @@ -0,0 +1,58 @@ +import path from "path"; +import { FileStorage } from "./FileStorage"; +//import fse from "fs-extra"; +import { S3 } from "@aws-sdk/client-s3"; +import fs from "fs"; +import { bgCyan, black } from "picocolors"; +import { S3Storage } from "./S3Storage"; +process.cwd(); + +export interface Storage { + set(path: string, data: Buffer): Promise<void>; + get(path: string): Promise<Buffer | null>; + delete(path: string): Promise<void>; +} + +let storage: Storage; + +if (process.env.STORAGE_PROVIDER === "file" || !process.env.STORAGE_PROVIDER) { + let location = process.env.STORAGE_LOCATION; + if (location) { + location = path.resolve(location); + } else { + location = path.join(process.cwd(), "files"); + } + console.log(`[CDN] storage location: ${bgCyan(`${black(location)}`)}`); + //fse.ensureDirSync(location); + fs.mkdirSync(location, { recursive: true }); + process.env.STORAGE_LOCATION = location; + + storage = new FileStorage(); +} else if (process.env.STORAGE_PROVIDER === "s3") { + const region = process.env.STORAGE_REGION, + bucket = process.env.STORAGE_BUCKET; + + 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 = process.env.STORAGE_LOCATION; + + 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 }; |