| 1 | import { aliOssConfigSchema } from '@yikart/ali-oss' |
| 2 | import { s3ConfigSchema } from '@yikart/aws-s3' |
| 3 | import { z } from 'zod' |
| 4 | |
| 5 | export const ASSETS_CONFIG = Symbol('ASSETS_CONFIG') |
| 6 | |
| 7 | export const cloudflareQueueConfigSchema = z.object({ |
| 8 | accountId: z.string(), |
| 9 | queueId: z.string(), |
| 10 | apiToken: z.string(), |
| 11 | }) |
| 12 | |
| 13 | const s3AssetsConfigSchema = z.looseObject({ |
| 14 | ...s3ConfigSchema.shape, |
| 15 | maxSize: z.number().positive().optional(), |
| 16 | provider: z.literal('s3'), |
| 17 | cloudflare: cloudflareQueueConfigSchema.optional(), |
| 18 | }) |
| 19 | |
| 20 | const aliOssAssetsConfigSchema = z.looseObject({ |
| 21 | ...aliOssConfigSchema.shape, |
| 22 | maxSize: z.number().positive().optional(), |
| 23 | provider: z.literal('ali-oss'), |
| 24 | callbackUrl: z.string().optional().describe('OSS 上传完成回调 URL'), |
| 25 | }) |
| 26 | |
| 27 | const assetsDiscriminatedSchema = z.discriminatedUnion('provider', [ |
| 28 | s3AssetsConfigSchema, |
| 29 | aliOssAssetsConfigSchema, |
| 30 | ]) |
| 31 | |
| 32 | export const assetsConfigSchema = z.preprocess( |
| 33 | (val) => { |
| 34 | if (val && typeof val === 'object' && !('provider' in val)) { |
| 35 | return { ...val, provider: 's3' } |
| 36 | } |
| 37 | return val |
| 38 | }, |
| 39 | assetsDiscriminatedSchema, |
| 40 | ) |
| 41 | |
| 42 | export type AssetsConfig = z.infer<typeof assetsDiscriminatedSchema> |
| 43 | |
| 44 | /** |
| 45 | * 判断 Cloudflare Queue 是否已配置 |
| 46 | * cloudflare 配置存在则启用 Queue 模式,否则使用轮询模式 |
| 47 | */ |
| 48 | export function isQueueEnabled(config: AssetsConfig): boolean { |
| 49 | return config.provider === 's3' && !!config.cloudflare |
| 50 | } |
| 51 | |
| 52 | /** |
| 53 | * 判断 AliOss Callback 是否已配置 |
| 54 | * callbackUrl 配置存在则启用回调模式,上传完成后 OSS 主动推送确认 |
| 55 | */ |
| 56 | export function isCallbackEnabled(config: AssetsConfig): boolean { |
| 57 | return config.provider === 'ali-oss' && !!config.callbackUrl |
| 58 | } |
| 59 |