@crvouga/mockingbird-service-daily

中文文档
3.11.0发布于 2026/11/11MITTypeScriptES Module构建来源已验证近 30 天下载 1.6万

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

中文使用文档
文档目录8 节
  1. 安装
  2. 使用量
  3. 路线
  4. 网络呼号
  5. 管理员(超过标准合同)
  6. 命名空间
  7. 故意不模拟
  8. API 密码

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

本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .

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

  • 行动范围: 支助
  • 合同openapi.yaml从《每日日报》记录的 REST API 到我们的电话 后端和EMR制作,并带有所发送的字段.

安装

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

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

使用量

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

应用信封数值
后端DAILY_API_BASE_URLhttp://127.0.0.1:8800/v1 (需要 http- loopback 例外)
后端DAILY_API_KEY, (中文(简体) ), DAILY_API_DOMAIN_ID任何密钥(或 --api-key),且数值与 --domain-id
EMR 后端DailyService.baseUrlhttp://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
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"
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.

部分 嘲笑鸟。 。 。 .

版本与发布记录

@crvouga/mockingbird-service-daily 共发布 43 个版本,首次发布于 2026/09/23;过去 12 个月发布了 43 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
3.11.0latest2026/11/11今天
3.10.92026/11/038 天前
3.10.82026/11/038 天前
3.10.72026/11/038 天前
3.10.62026/11/038 天前
3.10.52026/11/038 天前

关于 @crvouga/mockingbird-service-daily 的常见问题

@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 和提交记录判断。