package gateway // 本文件承载**语音副本的回放端点**:`GET /api/v1/media/{name}`(design/24 §10.11; // 契约 v0.67 已登记形状,本片落地)。 // // 它与文档读侧(`GET /api/v1/documents/{name}`)刻意分道,三处不同: // // - **下发类型恒为 `audio/*`**,按**存储名的扩展名**映射(`voice.MediaMIME`), // **不查库、不重新嗅探** —— 「扩展名 ↔ 字节」在保存那一刻已经成对裁决 // (`documents.SaveAudio`:音频字节的嗅探结果恒为 `application/octet-stream`, // 嗅探对音频没有意义); // - **内联而非附件**(`inline; filename=…`):这份字节就是要被播放器消费的。 // 因下发类型恒在 `audio/*` + `nosniff`,内联不构成文档侧那类 XSS 面(文档读侧 // 之所以永不内联,是因为它可能装着 HTML/SVG 这类可渲染内容); // - **鉴权与文档同档**(Bearer `owner|admin`,门在路由表):语音是私密内容,**不** // 走图片那套「随机名即凭据」的免鉴权读法 —— 客户端因此必须带 token 取字节 // (Web:`fetch` → `blob:` → 播放),音频 URL **不能**直接贴进 `