@crvouga/ mockingbird-service-whoop (英语)
本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .
WIP WHOOP v2模拟器,用于合成健身,睡眠,恢复和循环同步.
安装
bun add @crvouga/mockingbird-service-whoop
使用量
import { createServer } from "@crvouga/mockingbird-service-whoop/server"
// Test setup: a local WHOOP. The application's API base is its URL plus /developer.
const server = await createServer()
const baseUrl = `${server.url}/developer`
// Application code: the request it sends to WHOOP.
const response = await fetch(`${baseUrl}/v2/activity/workout`, {
headers: { authorization: "Bearer mock_whoop_token" },
})
const { records } = await response.json()
await server.close()
运行 mockingbird-whoop serve --port 12129输入本地来源加 /developer 作为消费者API基础,而仅来源于OAuth基础. 消费者端点接线与这个模拟器是分开的.
路线和状态
邮政 /oauth/oauth2/token 接受有客户资格的窗体编码授权码或刷新式赠款。 种子 clients, (中文(简体) ), codes,以及 grants 通过选项或管理状态。 默认仿真客户端 : mock_client 编号 : mock_client_secret; 默认持单人 mock_whoop_token 刷新时 mock_whoop_refresh。默认补助金有全部四个读取范围以及 offline. 代码约束客户端,可选重定向和可选 S256 PKCE 挑战. 代码是单用,包括同时交换. 3600秒后,新令牌过期(tokenTtlSeconds 是可配置的。 刷新旧访问和刷新信使无效,保持同样的用户/范围,并且只为离线赠款发放刷新信使.
获取 /oauth/oauth2/auth 是浏览器访问的授权端点,以连接一个成员。 没有同意页:请求被验证,然后 consents 用户的收藏答案和浏览器重定向(302)到 redirect_uri 与 code 财务报告和审定财务报表 state,或 error, (中文(简体) ), error_description 财务报告和审定财务报表 state中存储该代码 codes 绑定客户,准确的 redirect_uri,授予的范围(所以表示 scope 是所请求的,以及 refresh_token 仅以 offline)和可选S256 code_challenge· ; POST /oauth/oauth2/token 赎一回. 不明客户(401) invalid_client),一个缺失 client_id 或者说 redirect_uri,或一个 redirect_uri 客户没有注册 (400) invalid_request,杰森(英语: {error,error_description})在原地回答,而从未重定向。 客户端选择 redirectUris (精确匹配; 省略接受任意绝对 http(s) URI , 所以默认 mock_client 工作性质)和 scopes (允许记录的WHOOP范围)。 重定向错误 : invalid_request (无) response_type,或一个 code_challenge_method 其他 S256, (中文(简体) ), unsupported_response_type, (中文(简体) ), invalid_scope, (中文(简体) ), invalid_state (缺少或低于8个字符). 更长的时间 state 呼应不变.
同意控制:行 {id, decision: "approve"|"deny"|"error", userId?, codeTtlSeconds?, error?, errorDescription?} 地点 id 是客户端 id 或 * (每个客户都没有自己的行). 种子与 consents 选项或 POST /__admin/state/consents {"id":"*","value":{"id":"*","decision":"deny"}}无行表示批准 synthetic-user 600秒代码. deny 重定向 access_denied 财务报告和审定财务报表 error 重定向 server_error (与 error编号 :errorDescription),两者均保持不变 state 没有密码 发布代码列于 GET /__admin/state/codes。 。 。 .
获取 /developer/v2/user/profile/basic 返回符号用户的 {user_id,email,first_name,last_name}:种子a records 与 collection: "profile", (中文(简体) ), userId 符号的用户和 data 配置文件(只有假值)。 范围 read:profile 所需经费(403美元) {detail:"Access forbidden."} 就像收藏品一样,401对未知或过期的代号,404 {detail:"Not Found"} 当用户没有配置文件行时。 默认赠款不携带 read:profile。 。 。 .
获取 /developer/v2/activity/workout, (中文(简体) ), /developer/v2/activity/sleep, (中文(简体) ), /developer/v2/recovery, (中文(简体) ), /developer/v2/cycle 返回时 {records,next_token}。 。 。 . limit 默认为10, 最多为25; nextToken 继续页。 成果排序最新开始; start 包括同等时间戳, end 排除现在要模拟的相等开始和默认。 收集时间窗口的实施采用起始时间戳,包括跨越末端瞬间的活动。 范围名称为 read:workout, (中文(简体) ), read:sleep, (中文(简体) ), read:recovery, (中文(简体) ), read:cycles。 。 。 .
种子 records: [{key,userId,collection,data}]· ; data 是一个合成的提供者形记录. 恢复已经 cycle_id 财务报告和审定财务报表 sleep_id没有 id, (中文(简体) ), start,或 end:种子一个匹配的睡眠记录来提供其时间窗口. 这用"官方计划"来校正本题的通用回收字段列表. 缺失的相关睡眠固定装置不包括在内。 循环代号仍为数字;运动/睡眠代号仍为UUID. 度量衡和分数状态通过,保留无效或缺席的度量衡. 不同的存储密钥可以模拟重复的供应商记录. 光标内部是本地的对接;消费者在接时必须保留相同的查询.
测试控制
标准可移动 /__admin 健康/状态/重置/小时/日报/时线/故障路线。 国家收藏只包含合成装置。 标题命名空间, /__admin/ns/<name> 路径和无记名绘图将状态隔离。 期刊记录元数据,而不是OAuth或保健机构. 预设 unauthorized, (中文(简体) ), rate_limited, (中文(简体) ), server_error, (中文(简体) ), connection_drop 支持决定性的失败; 通用断层会增加耐久性。 预设出错机构是被脚本化的本地定着物,而不是声称精确的配额/错误措辞. 不需要网点 .
甲骨文和测试
从官员那里得到的 打开API, (中文(简体) ), OA 参考,以及 刷新示例合同保留了正式的收集响应计划。 未对授权的现场数据和OAuth的成功进行探测;未使用现场证书.
最好的猜测,不是甲骨文验证: 授权端点和配置路径没有被观察到. /oauth/oauth2/auth 财务报告和审定财务报表 /oauth/oauth2/token ory Hydra路径,所以重定向状态(302) error编号 :error_description编号 :state 定向形状, 8 字符 state 最小值,且错误代码遵循了Hydra及其fosite库外加WHOOP OAuth页面. 身份不明或未登记的客户的身份和JSON尸体 redirect_uri (Hydra在直播服务上使错误页) invalid_scope 允许列表, 处理缺失 scope 作为空赠款,S256 - 唯一的PKCE, access_denied编号 :server_error 以及失踪的403人 read:profile 范围是模拟者的选择,而不是被观察到的供应商反应。 轮廓形状是官方的 UserBasicProfile 计划.
bun test 运行接受、全操作自平和分辨检测. bun scripts/python-smoke.ts 用途 uv 对本地HTTP进行实际请求2.32.5和httpx 0.28.1。 这不是私人消费者本身. bun run parity 需求 WHOOP_ACCESS_TOKEN 在不打印健康数据的情况下进行安全收集封装探测.
故意不模拟
没有真正的用户、设备配对、传感器、同意页( consents 行代表用户的回答),硬件SDK,webhook送出,身体测量,伙伴API或分数计算. 没有光标格式对等、实际配额执行、同时刷新宽限期或私人客户合并索赔。 部分合成记录可被故意播种;对照所提供的官方计划验证生产装置。 恢复依赖于匹配的合成睡眠固定.
API 密码
根运行时间导出 : WhoopAPI, (中文(简体) ), WHOOP_NAMESPACE, (中文(简体) ), COLLECTION_SCOPES, (中文(简体) ), KNOWN_SCOPES, (中文(简体) ), MIN_STATE_LENGTH, (中文(简体) ), createRuntime, (中文(简体) ), WHOOP_PRESETS, (中文(简体) ), document, (中文(简体) ), operationIds, (中文(简体) ), supportedOperationIds。类型 : WhoopAPIOptions, (中文(简体) ), Grant, (中文(简体) ), OAuthCode, (中文(简体) ), Client, (中文(简体) ), Consent, (中文(简体) ), DataRecord, (中文(简体) ), CollectionName, (中文(简体) ), WhoopRuntimeOptions, (中文(简体) ), WhoopRuntime, (中文(简体) ), OperationId, (中文(简体) ), SupportedOperationId。 。 。 .
/server数字 : createServer, (中文(简体) ), serveTarget, (中文(简体) ), DEFAULT_PORT; 类型 WhoopServerOptions, (中文(简体) ), WhoopServer。 。 。 .