@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_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 |
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. |
部分 嘲笑鸟。 。 。 .