cdead49838
Task 10 viewer 互动化: - 点赞:useLikes 批次状态机(500ms 防抖 / 5 次满额即冲 / 失败同 batchId 退避重试 3 次后回滚丢弃),乐观计数 + 服务端 total 权威校准 (countVersion 单调),大图与格子双入口; - WS 实时:RealtimeClient 纯状态机(半频心跳、指数退避重连、三败降级、 重连成功 resync 第 1 页重取),消息路由器做 likes.burst 自身过滤 (originBatchIds 求交)、隐藏页暂停与减少动画下仅校准不出气泡; photo.hidden/deleted 即时移出序列并回退邻居大图;降级后 8s 轮询接管; - 浏览上报:visitorId 跨标签 BroadcastChannel first-writer-wins 协调, 可见时上报、requestId 持久幂等、网络失败指数重试; - 排序:最新/热门 chips(热门走 ov 冷快照),大图打开期间禁用切换; 顶栏「减少动画」偏好开关; - 契约包新增 ./realtime 子路径出口(浏览器面不可引桶出口——其连带 internal-sync 的 node:crypto 会被 Vite 外置化致整页崩溃); - e2e 注入钩子 __viewerWsUrl/__viewerWsRetryBaseMs/__viewerRealtimePollMs/ __viewerBubbleMs 与 .activity[data-connection] 连接态锚。 vitest:viewer 105(新增 36:likes 批次 8、visitor 协调 5、上报门控 4、 路由 8、WS 状态机 7、排序 4);Playwright:viewer 21(新增 likes.spec 7、 journey 补互动腿断言)。 Co-Authored-By: Claude Code <noreply@anthropic.com>
40 lines
1.3 KiB
JSON
40 lines
1.3 KiB
JSON
{
|
|
"name": "@photo/contracts",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"description": "API contract single source of truth (OpenAPI 3.1 + error codes); types generated via openapi-typescript and committed under src/generated/",
|
|
"//": "lint runs `eslint .` against the root flat config (Task 7). test is ts-jest with full type-checking (Task 6 type tests).",
|
|
"main": "./dist/index.js",
|
|
"types": "./dist/index.d.ts",
|
|
"exports": {
|
|
".": {
|
|
"types": "./dist/index.d.ts",
|
|
"default": "./dist/index.js"
|
|
},
|
|
"./realtime": {
|
|
"types": "./dist/realtime.d.ts",
|
|
"default": "./dist/realtime.js"
|
|
},
|
|
"./openapi.yaml": "./openapi.yaml",
|
|
"./package.json": "./package.json"
|
|
},
|
|
"scripts": {
|
|
"gen": "openapi-typescript openapi.yaml -o src/generated/openapi.d.ts",
|
|
"lint:api": "redocly lint openapi.yaml",
|
|
"build": "tsc -p tsconfig.json && node -e \"require('fs').cpSync('src/generated', 'dist/generated', { recursive: true })\"",
|
|
"typecheck": "tsc --noEmit",
|
|
"test": "jest",
|
|
"lint": "eslint ."
|
|
},
|
|
"devDependencies": {
|
|
"@redocly/cli": "^1.0.0",
|
|
"@types/jest": "^29.5.0",
|
|
"@types/node": "^22.10.0",
|
|
"jest": "^29.7.0",
|
|
"openapi-typescript": "^7.0.0",
|
|
"ts-jest": "^29.2.0",
|
|
"typescript": "^5.6.0"
|
|
}
|
|
}
|