# @crvouga/mockingbird-service-daily 中文文档

规范地址：https://npmcn.com/package/%40crvouga/mockingbird-service-daily/

版本：3\.11\.0
npm 元数据更新时间：2026-11-11T02:07:36.127Z
中文译文更新时间：2026-11-11T02:30:24.628Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40crvouga/mockingbird-service-daily
原文对照：https://npmcn.com/package/%40crvouga/mockingbird-service-daily/?lang=original
项目主页：https://github.com/crvouga/mockingbird/tree/main/packages/service/daily#readme
源码仓库：https://github.com/crvouga/mockingbird

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：4.4 MB，18 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：2 个
- 首次发布：2026-09-22T23:53:19.808Z
- 最新版本发布：2026-11-11T02:07:35.763Z
- 近 30 天下载量：16199（2026-10-11 至 2026-11-09，npm 官方下载统计）
- 已发布版本数：43（近 12 个月 43 个）

## 中文简介

《Daily.co REST API的模拟者:房间、存在、弹出、会议标志(自签的HS256、可核查和可解码),以及写给S3的抄写/录制网络录音.

## 安装

```sh
npm install @crvouga/mockingbird-service-daily
```

也可以使用：`pnpm add @crvouga/mockingbird-service-daily`、`yarn add @crvouga/mockingbird-service-daily`、`bun add @crvouga/mockingbird-service-daily`

## README

# @crvouga/ mockingbird-service-daily (英语)

> 本地模拟器。 真正的API合同. 部分 [嘲笑鸟](https://github.com/crvouga/mockingbird)。 。 。 .

国家模拟器 **日报.co** 测试套房的REST API:房间(创建,获取,更新, 删除、出席、弹出、会议标志(薄荷和验证)、核查HS256会议 表示我们的后端标志本身, 和最后的网络呼号(`transcription.stopped`, (中文(简体) ), `recording.ready-to-download`)与写入堆S3的笔录. 每个EMR 订房创造了一个房间和一个标志;今天,由于订房,一个破碎的每日一体化是沉默的 吞入错误。 它对于仿效者,是可观察的,是可证实的.

-   行动范围: [支助](https://github.com/crvouga/mockingbird/blob/main/packages/service/daily/SUPPORT.md)
-   合同`openapi.yaml`从《每日日报》记录的 REST API 到我们的电话 后端和EMR制作,并带有所发送的字段.

## 安装

```bash
npm install -D @crvouga/mockingbird-service-daily
```

仅限无害环境管理。 节点 22或 Bun 1.2. 无土生属地. 给它服务 `npx mockingbird-daily serve`, (中文(简体) ), `createServer` 从 `./server` (节点),或 `createRuntime` 与 任何获取服务器.

## 使用量

将应用程序指向模拟器( G- D1 接合) :

| 应用 | 信封 | 数值 |
| --- | --- | --- |
| 后端 | `DAILY_API_BASE_URL` | `http://127.0.0.1:8800/v1` (需要 http- loopback 例外) |
| 后端 | `DAILY_API_KEY`, (中文(简体) ), `DAILY_API_DOMAIN_ID` | 任何密钥(或 `--api-key`),且数值与 `--domain-id` |
| EMR 后端 | `DailyService.baseUrl` | `http://127.0.0.1:8800/v1` (今天的硬码) |
| EMR 后端 | `DEFAULT_DAILY_BASE_URL` | 与 `--room-url-base` |
| EMR 后端 | `DAILY_WEBHOOK_SECRET` | 与 `--webhook-secret` |
| 成员应用程序 | `EXPO_PUBLIC_DAILY_BASE_URL` | 与 `--room-url-base` |

```bash
npx mockingbird-daily serve --port 8800 \
  --room-url-base https://acme-mock.daily.test/ \
  --domain-id "$DAILY_API_DOMAIN_ID" \
  --webhook-url http://127.0.0.1:4000/v1/webhooks/daily \
  --webhook-secret "$DAILY_WEBHOOK_SECRET" \
  --s3-endpoint http://127.0.0.1:4569 --s3-bucket "$S3_BUCKET_NAME"
```

```ts
import { createServer } from "@crvouga/mockingbird-service-daily/server"

// Test setup: the emulator, its webhook receiver and the S3 bucket transcripts land in.
const server = await createServer({
  settings: { roomUrlBase: "https://acme-mock.daily.test/" },
  webhooks: { url: "http://127.0.0.1:4000/v1/webhooks/daily", secret: "whsec-daily" },
  transcripts: { endpoint: "http://127.0.0.1:4569", bucket: "emr-transcripts" },
})

// Application code: DAILY_API_BASE_URL is `${server.url}/v1`. The EMR books an appointment.
const baseUrl = `${server.url}/v1`
const headers = { authorization: "Bearer daily-api-key", "content-type": "application/json" }
const created = await fetch(`${baseUrl}/rooms`, {
  method: "POST",
  headers,
  body: JSON.stringify({ privacy: "private" }),
})
const room = (await created.json()) as { name: string; url: string }
const minted = await fetch(`${baseUrl}/meeting-tokens`, {
  method: "POST",
  headers,
  body: JSON.stringify({ properties: { room_name: room.name, user_id: "prac-1", is_owner: true } }),
})
const { token } = (await minted.json()) as { token: string }

// Test control: end the call. Writes <room>/<session>.json to S3, then fires transcription.stopped.
await fetch(`${server.url}/__admin/rooms/${room.name}/session`, {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({
    participants: [{ userId: "prac-1" }, { userId: "pat-1" }],
    durationSec: 1200,
    transcript: [{ s: "prac-1", t: "How are you feeling?", ts: 0.5, te: 2.1 }],
  }),
})
await server.close()
```

### 路线

| 路线 | 行为 |
| --- | --- |
| `GET /v1/rooms` | `{total_count, data}` 以最新的创建顺序; `limit` (违约100起), `ending_before` 财务报告和审定财务报表 `starting_after` 使用房间身份证。 与房间创建,更新和删除共享状态. |
| `POST /v1/rooms` | `{name?, privacy?, properties?}`; 未知属性、坏类型和重复 `name` 是400个 `{error: "invalid-request-error", info}`。没有名称 。 。 答复 `{id, name, api_created, privacy, url: <roomUrlBase><name>, created_at, config}` 与 `config` 与属性相呼应. 接受后端的严格身体和EMR `generateRoomConfig` 躯体. |
| `GET /v1/rooms/:name` | 房间,或404 `{error: "not-found", info: "room <name> not found"}` (EMR的分支 `message.includes('404')`) (中文(简体) ). |
| `POST /v1/rooms/:name` | 合并 `properties` (和 `privacy`)入室;失踪后为404人. |
| `DELETE /v1/rooms/:name` | `{deleted: true, name}`; 缺失时为404(EMR容忍它). |
| `GET /v1/rooms/:name/presence` | `{total_count, data: [{room, id, userId, userName, joinTime, duration}]}` ——正是后端的严格用法. 与会者来自 `PUT /__admin/rooms/:name/presence`。 。 。 . |
| `POST /v1/rooms/:name/eject` | `{user_ids?, ids?}` → `{ejectedIds}` (参加会话ids),去除出场. |
| `POST /v1/meeting-tokens` | `{properties}` → `{token}`: HS256 JWT与打电话者的API密钥签了名,在"每日日报"缩写下索赔(注:`r`, (中文(简体) ), `d`, (中文(简体) ), `o`, (中文(简体) ), `u`, (中文(简体) ), `ud`, (中文(简体) ), `nbf`, (中文(简体) ), `exp`, (中文(简体) ), `ejt`, (中文(简体) ), `eje`, (中文(简体) ), `er`, (中文(简体) ), `erui`, (中文(简体) ), `sr`, (中文(简体) ), `ast`, (中文(简体) ), `p`, ) 加上: `iat`。 。 。 . |
| `GET /v1/meeting-tokens/:token` | 证实一种迹象(由仿真者记取) **或者由我们的后端自行签名**)与呼叫者的 API 密钥及其 `nbf`编号 :`exp` 在模拟器时钟上(`?ignoreNbf=true` 跳过 nbf; 以全名回答属性, 否则为 400 . |

**奥特.** `Authorization: Bearer <DAILY_API_KEY>`; 任何密钥,除非 `apiKeys` 已经设定。 失踪 —— 401 (中文(简体) ) `{error: "authentication-error"}`。 。 。 .

**毫秒时.** 我们的一些人通过 `nbf`编号 :`exp` 以毫秒计(例如,EMR) `generatePatientToken` 通过 `Date.parse(end)`) (中文(简体) ). 模拟器接受它们,解释值 1e11作为时间检查,每个记录在 `GET /__admin/warnings`,并标记日记条目 (单位:千美元)`ids.warning: "exp in milliseconds"`) (中文(简体) ).

### 网络呼号

每日会话: `{version: "1.0.0", type, event, id, event_ts, payload}` (我们的接收器读取) `event`; 每日文件 `type`;两者均送去).

-   `transcription.stopped` —— 说 `payload: {room_name, session_id, duration, s3_key, instance_id}`。 。 。 .
-   `recording.ready-to-download` —— 说 `payload: {type: "cloud", recording_id, room_name, session_id, start_ts, status: "finished", max_participants, duration, s3_key}` (我们的EMR只是敲它。).

**签字——我们的计谋,不是"日报"的.** `x-webhook-signature` =: **六进制** HMAC-SHA256 (英语:`DAILY_WEBHOOK_SECRET`,原始体),这是我们EMR验证的(只在 秘密已经设定). 日报的记录计划不同 基础64 HMAC -SHA256 `"<X-Webhook-Timestamp>.<body>"` 与基础64解码的秘密——所以真正的"每日网络"会 检查失败 ; 模拟器显示我们的密码检查方式 . `x-webhook-timestamp` 也发送. 复议:立即,5s,5分钟,30分钟,2小时; `GET /__admin/webhooks`, (中文(简体) ), `…/events`, (中文(简体) ), `…/replay`, (中文(简体) ), `…/flush` 和往常一样.

### 管理员(超过标准合同)

| 路线 | 效果 |
| --- | --- |
| `POST /__admin/rooms/:name/session` | `{participants: [{userId, userName?}], durationSec, transcript?: [{s, t, ts, te}], sessionId?, recording?}` 将笔录 JSON 写到 S3 `{roomName}/{sessionId}.json` (西格维4) `PutObject` 页:1 `--s3-endpoint` 编号 : `transcripts` 目标; 参与者之间在没有给出时交替的合成记录, 清除存在, 然后发出 `transcription.stopped` (和 `recording.ready-to-download` 除非 `recording: false`) (中文(简体) ). 答复 `{sessionId, s3Key, transcript: "s3://…" | null, events}`; 502 当S3拒绝. 抄本从不保存. |
| `PUT /__admin/rooms/:name/presence` | `{participants: [{userId, userName?, joinedAt?}]}` - 谁 `GET …/presence` 报告. |
| `POST /__admin/tokens/decode` | `{token, apiKey?}` → `{decodable, header, claims, properties, signatureValid, room, joinable, problems, warnings}`: 签名(反对 `apiKey` 或者说 `apiKeys`),后端严格的索赔设定, `ud` 36,域名id, ms timetamps, 以及信物和房间 `nbf`编号 :`exp` 模拟器时钟上的窗口(所有者可在房间之前输入) `nbf`) (中文(简体) ). |
| `GET /__admin/rooms`, (中文(简体) ), `GET /__admin/rooms/:name` | 有配置、存在和会话元数据的房间. |
| `GET /__admin/warnings` | 被容忍的怪事(毫秒的印章,不存在房间的标志). |
| `PUT /__admin/settings` | `{apiKeys?, domainId?, roomUrlBase?}` 用于调用命名空间( n)`GET` 口罩钥匙. |

时间规则运行在模拟器时钟上(`POST /__admin/clock`: 信使/房间 `nbf` 财务报告和审定财务报表 `exp`,以及 因此,后端的13h 房间的创建延迟 和30min的护栏窗口 日报看到.

错误预设( E)`POST /__admin/faults {"preset": "<name>", "count"?: n}`: `room_not_found` (404小时) `/v1/rooms/:name…`, (中文(简体) ), `unauthorized` (401个), `rate_limited` (429个), `server_error` (500个), `webhook_duplicate`, (中文(简体) ), `webhook_reorder`, (中文(简体) ), `webhook_drop`。 。 。 .

### 命名空间

`x-mockingbird-namespace`页:1 `/__admin/ns/<name>` 前缀在基址上,或用 API 键: `PUT /__admin/credentials {"credentials": {"<DAILY_API_KEY>": "<namespace>"}}`。 。 。 .

### 故意不模拟

-   媒体飞机:SFU、WebRTC、敲门/录取、录音和抄录. daily-js 加载 Daily 的 CDN 捆绑; 成员应用 UI 测试应注入假 `DailyCallLike` 结束 `useCallProviderLogic(createCallObject)`。 。 。 .
-   会议室页 `https://<domain>.daily.co/<room>?t=` (URL是制作的,没有服务).
-   日报自有"网络呼克"签名计划及"网络呼克"注册API(见上文).
-   录音/特写 REST API,拨出,流出.

## API 密码

| 导出 | 仁爱 | 说明 |
| --- | --- | --- |
| `DailyAPI` | 类 | 进程模拟器 : `fetch(request)`, (中文(简体) ), `reset()`, (中文(简体) ), `inspectToken(token, keys?)`, (中文(简体) ), `setPresence(name, participants)`, (中文(简体) ), `endSession(name, input)`, (中文(简体) ), `rooms()`选项: `sqlite`, (中文(简体) ), `now`, (中文(简体) ), `namespace`, (中文(简体) ), `settings`, (中文(简体) ), `onWebhook`, (中文(简体) ), `transcripts`。 。 。 . |
| `createRuntime` | 函数 | 服务合同的模拟者。 选项 : `webhooks: {url, secret, retryDelaysMs?, fetch?}`, (中文(简体) ), `transcripts: {endpoint, bucket, region?, accessKeyId?, secretAccessKey?, keyPattern?, fetch?}`, (中文(简体) ), `settings`, (中文(简体) ), `clock`, (中文(简体) ), `seed`, (中文(简体) ), `adminKey`, (中文(简体) ), `onLog`。 。 。 . |
| `DAILY_PRESETS` | 对象 | 每个命名的断层预设. |
| `DAILY_NAMESPACE` | 字符串 | 服务名称, `"daily"`。 。 。 . |
| `WEBHOOK_PATH` | 字符串 | `"/v1/webhooks/daily"`我们的EMR接收器路线. |
| `dailyWebhookSigner` | 函数 | 这个 `x-webhook-signature` 标志(活体HMAC-SHA256). |
| `signToken`, (中文(简体) ), `decodeToken`, (中文(简体) ), `verifySignature` | 函数 | HS256会议帮助者. |
| `claimsToProperties`, (中文(简体) ), `propertiesToClaims`, (中文(简体) ), `CLAIM_NAMES` | 数值 | 日报简称索赔名称 腾讯网. |
| `synthesizeTranscript` | 函数 | 一个没有给出的会话的默认记录. |
| `document`, (中文(简体) ), `operationIds`, (中文(简体) ), `supportedOperationIds` | 数值 | 销售商为OpenAPI合同及其业务代号. |
| `createServer`, (中文(简体) ), `serveTarget`, (中文(简体) ), `DEFAULT_PORT` (单位:千美元)`./server`(中文(简体) ) | 节点 | 服务过来 `node:http`; 数据 `serve` CLI目标;出港8800. |

部分 [嘲笑鸟](https://github.com/crvouga/mockingbird)。 。 。 .

## 常见问题

### @crvouga/mockingbird-service-daily 是什么？

《Daily\.co REST API的模拟者:房间、存在、弹出、会议标志\(自签的HS256、可核查和可解码\),以及写给S3的抄写/录制网络录音\.

### 如何安装 @crvouga/mockingbird-service-daily？

在项目目录运行 npm install @crvouga/mockingbird-service-daily，或使用 pnpm add / yarn add / bun add。它还提供命令行工具 mockingbird-daily，可以用 npx mockingbird-daily 直接运行。

### @crvouga/mockingbird-service-daily 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @crvouga/mockingbird-service-daily 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @crvouga/mockingbird-service-daily 可以商用吗？

@crvouga/mockingbird-service-daily 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @crvouga/mockingbird-service-daily 的下载量有多少？

根据 npm 官方下载统计，@crvouga/mockingbird-service-daily 在 2026/10/11 – 2026/11/09 这 30 天内被下载 16,199 次，日均约 540 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @crvouga/mockingbird-service-daily 还在维护吗？

最新版本 3\.11\.0 发布于 2026/11/11（今天）；至今共发布 43 个版本，其中过去 12 个月发布了 43 个；首次发布于 2026/09/23。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

