IKHSAN
EN Read in EnglishID

snapme

Publik
Branch
master
Commit terakhir
130fdb828 Oktober 2026

schemas.ts

Buka raw
import { z } from "zod"

import { LAYOUTS, type LayoutId } from "@/lib/layouts"

/* PRD §8: bentuk permintaan dan batas berkas. Klien memakai batas-batas ini
   untuk memvalidasi hasilnya sendiri sebelum menawarkan unggahan; rute server
   yang dulu menegakkan ulang batasnya sudah dibongkar bersama backendnya. */

/** M7: klip Strip Hidup, di bawah 5 MB (PRD §8, SH-03). Jenisnya mengikuti
 *  kemampuan perekam browser, jadi hanya dua ini yang diizinkan. */
export const LIVE_MIME_TYPES = {
  webm: "video/webm",
  mp4: "video/mp4",
} as const

export type LiveKind = keyof typeof LIVE_MIME_TYPES

export const CREATE_STRIP_SCHEMA = z.object({
  layout: z.enum(Object.keys(LAYOUTS) as [LayoutId, ...LayoutId[]]),
  /** M7 (SH-03): kehadirannya berarti klien juga menyiapkan klip. */
  live: z
    .enum(Object.keys(LIVE_MIME_TYPES) as [LiveKind, ...LiveKind[]])
    .optional(),
})

/** PRD §8: diam 2 MB. Jenisnya PNG karena ekspor strip selalu PNG. */
export const STILL_MIME = "image/png"

/** M8: satu bucket pribadi untuk semua berkas (ARCHITECTURE §7). */
export const CREATE_RELAY_SCHEMA = z.object({
  layout: CREATE_STRIP_SCHEMA.shape.layout,
})

/** PRD §8: slot estafet 1 MB, dan selalu JPEG karena klien mengekspor bingkai
 *  kamera lewat kanvas. */
export const RELAY_SLOT_MIME = "image/jpeg"
export const RELAY_SLOT_BYTE_LIMIT = 1_048_576
byte
1.362
baris
38
Jenis
ts
Commit terakhir
28 Oktober 2026