1import { z } from "zod"
2
3import { LAYOUTS, type LayoutId } from "@/lib/layouts"
4
5/* PRD §8: bentuk permintaan dan batas berkas. Klien memakai batas-batas ini
6 untuk memvalidasi hasilnya sendiri sebelum menawarkan unggahan; rute server
7 yang dulu menegakkan ulang batasnya sudah dibongkar bersama backendnya. */
8
9/** M7: klip Strip Hidup, di bawah 5 MB (PRD §8, SH-03). Jenisnya mengikuti
10 * kemampuan perekam browser, jadi hanya dua ini yang diizinkan. */
11export const LIVE_MIME_TYPES = {
12 webm: "video/webm",
13 mp4: "video/mp4",
14} as const
15
16export type LiveKind = keyof typeof LIVE_MIME_TYPES
17
18export const CREATE_STRIP_SCHEMA = z.object({
19 layout: z.enum(Object.keys(LAYOUTS) as [LayoutId, ...LayoutId[]]),
20 /** M7 (SH-03): kehadirannya berarti klien juga menyiapkan klip. */
21 live: z
22 .enum(Object.keys(LIVE_MIME_TYPES) as [LiveKind, ...LiveKind[]])
23 .optional(),
24})
25
26/** PRD §8: diam 2 MB. Jenisnya PNG karena ekspor strip selalu PNG. */
27export const STILL_MIME = "image/png"
28
29/** M8: satu bucket pribadi untuk semua berkas (ARCHITECTURE §7). */
30export const CREATE_RELAY_SCHEMA = z.object({
31 layout: CREATE_STRIP_SCHEMA.shape.layout,
32})
33
34/** PRD §8: slot estafet 1 MB, dan selalu JPEG karena klien mengekspor bingkai
35 * kamera lewat kanvas. */
36export const RELAY_SLOT_MIME = "image/jpeg"
37export const RELAY_SLOT_BYTE_LIMIT = 1_048_576
38