{"version":3,"sources":["../src/chat/chat.schemas.ts"],"names":["CHAT_MESSAGE_BODY_MIN_LENGTH","CHAT_MESSAGE_BODY_MAX_LENGTH","CHAT_MODERATION_REASON_MAX_LENGTH","CHAT_MESSAGE_VIDEO_OFFSET_MAX_SECONDS","ChatMessageUserSchema","z","ChatMessageSchema","ChatReplayMessageSchema","ChatReplayChunkSchema","ChatReplayManifestChunkSchema","ChatReplayManifestSchema","ChatHistoryResponseSchema","PaginationResponseSchema","PostChatMessageRequestSchema","ChatModerationDeleteRequestSchema","ChatModerationMuteRequestSchema","value","ChatMuteStateResponseSchema","ChatCredentialsResponseSchema","InProcessChatCredentialsSchema","IvsChatCredentialsSchema","ChatPostAckSchema"],"mappings":"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","file":"chunk-TL56DTPN.mjs","sourcesContent":["import z from 'zod';\nimport { PaginationResponseSchema } from '../common';\n\nexport const CHAT_MESSAGE_BODY_MIN_LENGTH = 1;\nexport const CHAT_MESSAGE_BODY_MAX_LENGTH = 500;\n\nexport const CHAT_MODERATION_REASON_MAX_LENGTH = 200;\n\n/**\n * Upper bound (seconds) for `videoOffsetSec` — 48 hours. Longer than\n * any realistic stream duration; anything above this is a bad-actor\n * or client-clock-skew signal and gets rejected at the wire.\n */\nexport const CHAT_MESSAGE_VIDEO_OFFSET_MAX_SECONDS = 48 * 60 * 60;\n\nexport const ChatMessageUserSchema = z.object({\n  id: z.string(),\n  displayName: z.string(),\n  colorHex: z.string().regex(/^#[0-9A-Fa-f]{6}$/),\n});\n\nexport const ChatMessageSchema = z.object({\n  id: z.string(),\n  body: z.string(),\n  createdAt: z.iso.datetime(),\n  user: ChatMessageUserSchema,\n  deletedAt: z.iso.datetime().optional(),\n  /**\n   * Seconds elapsed since the event's live stream started at the moment\n   * the client posted the message. Set by the frontend from the local\n   * player clock (`Math.floor(player.currentTime)`); omitted for\n   * pre-LIVE or catch-up posts where the player wasn't playing.\n   *\n   * Consumers render chat during replay by filtering to\n   * `videoOffsetSec <= currentPlayheadSec` and sorting by\n   * `videoOffsetSec ASC` (falling back to `createdAt` for pre-live\n   * messages).\n   */\n  videoOffsetSec: z.number().int().nonnegative().optional(),\n});\n\n/**\n * One message in a replay chat chunk. `offsetMs` is milliseconds from\n * replay frame 0 (`Event.replayTimelineStartedAt`); messages sent before\n * frame 0 are pinned at 0. `user` is a snapshot taken when the chunk was built.\n */\nexport const ChatReplayMessageSchema = z.object({\n  id: z.string(),\n  offsetMs: z.number().int().nonnegative(),\n  body: z.string(),\n  createdAt: z.iso.datetime(),\n  user: ChatMessageUserSchema,\n});\n\n/**\n * A replay chat chunk. Holds the messages with\n * `startMs <= offsetMs < startMs + chunkMs`, sorted by `offsetMs` ASC,\n * then `createdAt` ASC.\n */\nexport const ChatReplayChunkSchema = z.object({\n  eventId: z.string(),\n  index: z.number().int().nonnegative(),\n  startMs: z.number().int().nonnegative(),\n  messages: z.array(ChatReplayMessageSchema),\n});\n\nexport const ChatReplayManifestChunkSchema = z.object({\n  index: z.number().int().nonnegative(),\n  startMs: z.number().int().nonnegative(),\n  count: z.number().int().positive(),\n  /** API path to fetch this chunk, relative to the API origin. */\n  path: z.string().startsWith('/'),\n});\n\n/**\n * Replay chat manifest. Only non-empty chunks are listed; a chunk\n * index missing from `chunks` has no messages.\n */\nexport const ChatReplayManifestSchema = z.object({\n  chunkMs: z.number().int().positive(),\n  durationMs: z.number().int().nonnegative(),\n  chunks: z.array(ChatReplayManifestChunkSchema),\n});\n\nexport const ChatHistoryResponseSchema = z.object({\n  items: z.array(ChatMessageSchema),\n  ...PaginationResponseSchema.shape,\n});\n\nexport const PostChatMessageRequestSchema = z.object({\n  body: z.string().trim().min(CHAT_MESSAGE_BODY_MIN_LENGTH).max(CHAT_MESSAGE_BODY_MAX_LENGTH),\n  videoOffsetSec: z.number().int().min(0).max(CHAT_MESSAGE_VIDEO_OFFSET_MAX_SECONDS).optional(),\n});\n\nexport const ChatModerationDeleteRequestSchema = z\n  .object({\n    reason: z.string().trim().max(CHAT_MODERATION_REASON_MAX_LENGTH).optional(),\n  })\n  .strict();\n\nexport const ChatModerationMuteRequestSchema = z\n  .object({\n    /** Optional explicit future timestamp. Omit for the ~1y indefinite default. */\n    until: z.iso\n      .datetime()\n      .refine((value) => new Date(value).getTime() > Date.now(), {\n        message: 'until must be a future timestamp',\n      })\n      .optional(),\n    reason: z.string().trim().max(CHAT_MODERATION_REASON_MAX_LENGTH).optional(),\n  })\n  .strict();\n\n/**\n * Public-shape response for `POST /chat/mute`. `mutedUntil` is the source\n * of truth (`null` = not muted). `mutedBy` is intentionally omitted —\n * moderation metadata stays out of the response surface.\n */\nexport const ChatMuteStateResponseSchema = z.object({\n  eventId: z.string(),\n  mutedUntil: z.iso.datetime().nullable(),\n});\n\nexport const ChatCredentialsResponseSchema = z.discriminatedUnion('kind', [\n  z.object({\n    kind: z.literal('in-process'),\n    wsNamespace: z.string(),\n    token: z.string(),\n    eventRoomId: z.string(),\n    /** Set while the host has chat off, so late joiners see it at once. */\n    mutedUntil: z.iso.datetime().nullable().optional(),\n  }),\n  z.object({\n    kind: z.literal('ivs'),\n    roomIdentifier: z.string(),\n    endpoint: z.string(),\n    token: z.string(),\n    tokenTtlSeconds: z.number().int().positive(),\n    /** Set while the host has chat off, so late joiners see it at once. */\n    mutedUntil: z.iso.datetime().nullable().optional(),\n  }),\n]);\n\nexport const InProcessChatCredentialsSchema = z.object({\n  kind: z.literal('in-process'),\n  wsNamespace: z.string(),\n  token: z.string(),\n  eventRoomId: z.string(),\n  mutedUntil: z.iso.datetime().nullable().optional(),\n});\nexport const IvsChatCredentialsSchema = z.object({\n  kind: z.literal('ivs'),\n  roomIdentifier: z.string(),\n  endpoint: z.string(),\n  token: z.string(),\n  tokenTtlSeconds: z.number().int(),\n  mutedUntil: z.iso.datetime().nullable().optional(),\n});\n\n/**\n * ACK envelope for the `chat.post` client → server frame. Success\n * carries the persisted message so the FE can dedupe against the\n * fan-out echo; failure surfaces a stable machine-readable `code`\n * plus a human-readable `message`.\n */\nexport const ChatPostAckSchema = z.discriminatedUnion('ok', [\n  z.object({\n    ok: z.literal(true),\n    message: ChatMessageSchema,\n  }),\n  z.object({\n    ok: z.literal(false),\n    code: z.enum([\n      'unauthorized',\n      'invalid_payload',\n      'muted',\n      'not_live',\n      'forbidden',\n      'not_found',\n      'rate_limited',\n      'internal',\n    ]),\n    message: z.string(),\n    retryAfterSeconds: z.number().int().nonnegative().optional(),\n  }),\n]);\n"]}