@microi.net/cli 4.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +66 -0
- package/dist/mcp-codex-stdio-adapter.js +189 -0
- package/dist/mcp-server.js +972 -0
- package/dist/mcp-trae-windows-launcher.cmd +21 -0
- package/dist/microi-cli-mcp.js +7 -0
- package/dist/microi-cli.js +1645 -0
- package/dist/microi-skills.meta.json +335 -0
- package/dist/microi.skills/.microi-skills-version.json +6 -0
- package/dist/microi.skills/README.md +276 -0
- package/dist/microi.skills/ai-engine/SKILL.md +140 -0
- package/dist/microi.skills/ai-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/app-store/SKILL.md +105 -0
- package/dist/microi.skills/app-store/agents/openai.yaml +4 -0
- package/dist/microi.skills/business-blueprint/SKILL.md +184 -0
- package/dist/microi.skills/datasource-engine/SKILL.md +89 -0
- package/dist/microi.skills/datasource-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/dos-orm/SKILL.md +76 -0
- package/dist/microi.skills/dos-orm/references/api-reference.md +229 -0
- package/dist/microi.skills/job-engine/SKILL.md +141 -0
- package/dist/microi.skills/job-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/message-notification/SKILL.md +113 -0
- package/dist/microi.skills/message-notification/agents/openai.yaml +6 -0
- package/dist/microi.skills/message-notification/references/contracts.md +99 -0
- package/dist/microi.skills/microi-ai-app-auth.js +651 -0
- package/dist/microi.skills/microi-ai-application/SKILL.md +80 -0
- package/dist/microi.skills/microi-ai-application/agents/openai.yaml +4 -0
- package/dist/microi.skills/microi-ai-application/references/frontend-baseline.md +164 -0
- package/dist/microi.skills/microi-client-frontend/SKILL.md +562 -0
- package/dist/microi.skills/microi-datasource-mapping/SKILL.md +108 -0
- package/dist/microi.skills/microi-db-schema/SKILL.md +170 -0
- package/dist/microi.skills/microi-db-schema/agents/openai.yaml +4 -0
- package/dist/microi.skills/microi-db-schema/references/core-tables.md +695 -0
- package/dist/microi.skills/microi-db-schema/references/form-component-options.md +256 -0
- package/dist/microi.skills/microi-db-schema/references/schema-overview.md +203 -0
- package/dist/microi.skills/microi-db-schema/references/schema.md +647 -0
- package/dist/microi.skills/microi-db-schema/references/table-catalog.md +1607 -0
- package/dist/microi.skills/microi-deployment/SKILL.md +117 -0
- package/dist/microi.skills/microi-deployment/references/deployment-matrix.md +94 -0
- package/dist/microi.skills/microi-docs-coverage/SKILL.md +91 -0
- package/dist/microi.skills/microi-docs-coverage/references/capability-map.md +65 -0
- package/dist/microi.skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +887 -0
- package/dist/microi.skills/microi-form-engine/SKILL.md +159 -0
- package/dist/microi.skills/microi-form-engine/references/component-catalog.md +116 -0
- package/dist/microi.skills/microi-form-engine/references/data-source-events.md +117 -0
- package/dist/microi.skills/microi-form-layout/SKILL.md +373 -0
- package/dist/microi.skills/microi-frontend-sdk/SKILL.md +304 -0
- package/dist/microi.skills/microi-left-right-layout/SKILL.md +132 -0
- package/dist/microi.skills/microi-microservice/SKILL.md +115 -0
- package/dist/microi.skills/microi-microservice/references/runtime-delivery.md +145 -0
- package/dist/microi.skills/microi-mobile-app-quality/SKILL.md +436 -0
- package/dist/microi.skills/microi-solution-quotation/SKILL.md +76 -0
- package/dist/microi.skills/microi-solution-quotation/agents/openai.yaml +4 -0
- package/dist/microi.skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -0
- package/dist/microi.skills/microi-system-delivery/SKILL.md +446 -0
- package/dist/microi.skills/microi-ui/SKILL.md +321 -0
- package/dist/microi.skills/microi-uniapp-frontend/SKILL.md +483 -0
- package/dist/microi.skills/microi.v8.js +1758 -0
- package/dist/microi.skills/module-engine/SKILL.md +131 -0
- package/dist/microi.skills/module-engine/references/module-config.md +174 -0
- package/dist/microi.skills/page-engine/SKILL.md +397 -0
- package/dist/microi.skills/performance-testing/SKILL.md +207 -0
- package/dist/microi.skills/playwright-e2e/SKILL.md +769 -0
- package/dist/microi.skills/print-engine/SKILL.md +237 -0
- package/dist/microi.skills/production-readonly-audit/SKILL.md +39 -0
- package/dist/microi.skills/report-engine/SKILL.md +69 -0
- package/dist/microi.skills/report-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/search-engine/SKILL.md +73 -0
- package/dist/microi.skills/search-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/spider-engine/SKILL.md +188 -0
- package/dist/microi.skills/translate-engine/SKILL.md +91 -0
- package/dist/microi.skills/translate-engine/agents/openai.yaml +4 -0
- package/dist/microi.skills/ui-design/SKILL.md +1575 -0
- package/dist/microi.skills/ui-design/assets/pattern-showcase/app.js +54 -0
- package/dist/microi.skills/ui-design/assets/pattern-showcase/index.html +163 -0
- package/dist/microi.skills/ui-design/assets/pattern-showcase/styles.css +311 -0
- package/dist/microi.skills/ui-design/assets/templates/MCI-DESIGN.md +98 -0
- package/dist/microi.skills/ui-design/references/design-pattern-library.md +171 -0
- package/dist/microi.skills/ui-design/references/mci-design-contract.md +84 -0
- package/dist/microi.skills/ui-design/references/motion-and-media.md +71 -0
- package/dist/microi.skills/ui-design/references/product-flow-recipes.md +94 -0
- package/dist/microi.skills/uniapp-mall-assets/SKILL.md +105 -0
- package/dist/microi.skills/v8-api-config/SKILL.md +272 -0
- package/dist/microi.skills/v8-cache-pattern/SKILL.md +286 -0
- package/dist/microi.skills/v8-crud-api/SKILL.md +398 -0
- package/dist/microi.skills/v8-debugging/SKILL.md +279 -0
- package/dist/microi.skills/v8-explorer-tree/SKILL.md +224 -0
- package/dist/microi.skills/v8-export-import/SKILL.md +590 -0
- package/dist/microi.skills/v8-file-upload/SKILL.md +497 -0
- package/dist/microi.skills/v8-formengine-http/SKILL.md +218 -0
- package/dist/microi.skills/v8-frontend-events/SKILL.md +349 -0
- package/dist/microi.skills/v8-frontend-events/references/bluetooth-print-api.md +107 -0
- package/dist/microi.skills/v8-frontend-events/references/bluetooth-print.md +185 -0
- package/dist/microi.skills/v8-http-integration/SKILL.md +379 -0
- package/dist/microi.skills/v8-image-processing/SKILL.md +187 -0
- package/dist/microi.skills/v8-image-processing/agents/openai.yaml +4 -0
- package/dist/microi.skills/v8-image-processing/references/api-reference.md +620 -0
- package/dist/microi.skills/v8-menu-buttons/SKILL.md +661 -0
- package/dist/microi.skills/v8-mongodb/SKILL.md +149 -0
- package/dist/microi.skills/v8-mq-mqtt/SKILL.md +227 -0
- package/dist/microi.skills/v8-saas-multi-tenant/SKILL.md +193 -0
- package/dist/microi.skills/v8-security/SKILL.md +417 -0
- package/dist/microi.skills/v8-sql-query/SKILL.md +290 -0
- package/dist/microi.skills/v8-table-event/SKILL.md +385 -0
- package/dist/microi.skills/v8-template-engine/SKILL.md +165 -0
- package/dist/microi.skills/v8-utilities/SKILL.md +79 -0
- package/dist/microi.skills/v8-utilities/references/client-api-index.md +136 -0
- package/dist/microi.skills/v8-utilities/references/platform-http-routes.md +80 -0
- package/dist/microi.skills/v8-utilities/references/server-api-index.md +129 -0
- package/dist/microi.skills/v8-workflow/SKILL.md +322 -0
- package/dist/microi.skills/workspace-conventions/SKILL.md +479 -0
- package/package.json +40 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: microi-ai-application
|
|
3
|
+
description: Microi 吾码 AI 应用的创建、迁移、工程化开发和交付规范。用于 Web、MicroService、UniApp、H5、响应式网站或游戏类 AI 应用,尤其是选择前端技术栈、生成 Vue 工程、维护 TypeScript 源码、接入登录与接口引擎、构建发布、二次开发和多端验收。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Microi AI 应用
|
|
7
|
+
|
|
8
|
+
## 默认技术基线
|
|
9
|
+
|
|
10
|
+
新建或整体升级的 Web、MicroService 和 H5 AI 应用默认使用:
|
|
11
|
+
|
|
12
|
+
- Vue 3 单文件组件与 Composition API,优先 `<script setup lang="ts">`。
|
|
13
|
+
- Vite 作为开发服务器和生产构建工具,`base: './'`。
|
|
14
|
+
- TypeScript 严格类型检查;业务模型、接口入参、快照、事件和状态机不得长期使用散装 `any`。
|
|
15
|
+
- 原生 ESM 继续作为模块标准。Vue 与 Vite 本身就在 ESM 之上工作,不能把“ESM”和“Vue + Vite”描述成互斥方案。
|
|
16
|
+
- 依赖使用受支持的稳定版本并提交 lockfile。先验证 Node LTS、Vue、Vite、TypeScript 和插件的兼容范围,不盲目追随预发布版。
|
|
17
|
+
|
|
18
|
+
Vue Router 只在有多个可分享路由时引入;Pinia 只在跨页面或跨组件共享复杂状态时引入。单页局部状态使用组合函数。后台数据录入可以使用 Element Plus;独立 Web、官网和游戏界面使用 Microi.UI / MCI-UI token 与项目组件。
|
|
19
|
+
|
|
20
|
+
UniApp 使用 Vue 3 + TypeScript 的官方 Vite 工具链,并同时遵守 `microi-uniapp-frontend`。Canvas/WebGL 游戏仍让渲染循环保持独立模块,Vue 负责大厅、登录、房间、设置、HUD 和结算等 DOM 界面。
|
|
21
|
+
|
|
22
|
+
仅在用户明确要求、目标运行环境不能构建,或内容确实是一次性且无状态的极小静态页时,才允许原生 HTML/JavaScript 例外;在交付说明中记录原因、升级路径和验收范围。
|
|
23
|
+
|
|
24
|
+
详细目录、类型边界和配置样例见 [references/frontend-baseline.md](references/frontend-baseline.md)。
|
|
25
|
+
|
|
26
|
+
## 开始前
|
|
27
|
+
|
|
28
|
+
1. 调用 `microi_list_applications` 盘点目标 `ApiBase + OsClient` 的全部在线应用。
|
|
29
|
+
2. 对目标应用调用 `microi_get_application_context`,核对类型、源码清单、版本和构建产物;只读清单不能代替源码完整性检查。
|
|
30
|
+
3. 确认 `ApplicationType`:独立站点和游戏用 `Web`,宿主内多页面定制用 `MicroService`,跨端应用用 `UniApp`。
|
|
31
|
+
4. 读取 `microi-frontend-sdk`、`ui-design`;MicroService 再读取 `microi-microservice`,UniApp 再读取 `microi-uniapp-frontend`,游戏或复杂媒体再读取 `ui-design/references/motion-and-media.md`。
|
|
32
|
+
5. 在项目根目录维护 `.microi-micro-app.json`;源码必须位于当前租户的 `Microi-V8-Engine/.../AI应用/{appKey}`,不得跨租户复用目录。
|
|
33
|
+
|
|
34
|
+
## 工程边界
|
|
35
|
+
|
|
36
|
+
- `src/components` 保存可复用展示组件,`src/pages` 保存页面,`src/composables` 保存 UI 用例,`src/domain` 保存纯 TypeScript 业务规则,`src/services` 保存 API/实时通信适配,`src/platform` 保存 Microi 桥接。
|
|
37
|
+
- 规则核心不得依赖 Vue、DOM、localStorage 或 SignalR,保持确定性并可单元测试。
|
|
38
|
+
- 页面不得直接拼 `/apiengine`、Token、上传或文件地址;统一使用项目级 Microi SDK 实例和薄服务层。
|
|
39
|
+
- 公有 HDFS 应用使用标准 `microi-ai-app-auth.js` 登录桥。服务端始终从 Token 恢复 `V8.CurrentUser`,覆盖客户端提交的用户标识。
|
|
40
|
+
- 写操作、发牌、出牌、结算、库存或审批等业务事实走接口引擎或可信后端事务。通用 SignalR 只广播成功结果中 `DataAppend.RealtimeEvent` 的公共投影,私有或按用户裁剪的权威 Snapshot 继续走 HTTP 接口引擎;共享数据库、Redis 或状态机才是事实源。事件携带 `EventId` 与单调 `Version`,客户端检测版本缺口后重新拉取 Snapshot,断线重连按 EventId 幂等恢复。
|
|
41
|
+
- 新业务使用平台通用 v2 `/api-engine-realtime`,以普通登录 Token 调用 `SubscribeChannel`。30 秒时隙租约必须按返回的 `RenewAfterMilliseconds` 重复订阅续租,每次续租由 `realtime_{channel_key}_authorize` 按 `V8.CurrentUser` 重新授权;现有 AccessKey 在没有 `realtime:subscribe` scope 时拒绝。不要为每个游戏或业务再新增专用 C# Hub;旧 `/game-realtime` 仅作兼容。
|
|
42
|
+
- 环境配置从 `window.__MICROI_APP_CONTEXT__`、宿主上下文和模式文件解析。生产构建拒绝 localhost;开发地址只写 `.env.development.local`。
|
|
43
|
+
|
|
44
|
+
## Vue 实现规则
|
|
45
|
+
|
|
46
|
+
- SFC 模板承担真实 DOM 结构;事件使用 Vue 绑定,状态使用 `ref/reactive/computed`,副作用在组合函数的生命周期内注册并清理。
|
|
47
|
+
- 组件以业务语义命名,如 `RoomLobby`、`GameTable`、`AudioMixer`、`SettlementDialog`,不要按颜色或位置命名。
|
|
48
|
+
- 长连接、轮询、音频上下文、动画帧、观察器和全局事件必须在卸载时释放;页面隐藏时暂停非必要工作。
|
|
49
|
+
- 响应式布局至少覆盖 1440px 桌面和 390px 移动视口;使用安全区、44px 触控目标、键盘焦点和 `prefers-reduced-motion`。
|
|
50
|
+
- 音频应用必须区分背景音乐、人声和效果音,分别调节、静音和持久化;浏览器首次用户手势前不得强制播放。
|
|
51
|
+
- 不使用原生 `alert/confirm/prompt`;使用宿主反馈或可访问的 MCI 弹层。
|
|
52
|
+
|
|
53
|
+
## 存量迁移
|
|
54
|
+
|
|
55
|
+
采用绞杀式迁移,避免一次重写破坏已经验证的规则:
|
|
56
|
+
|
|
57
|
+
1. 先把纯规则、API、音频和实时客户端固定为可测试模块。
|
|
58
|
+
2. 建立 Vue 3 + Vite + TypeScript 入口、SFC 页面壳和统一平台适配。
|
|
59
|
+
3. 按登录/大厅、房间、牌桌或舞台、设置、结算的顺序替换命令式 DOM。
|
|
60
|
+
4. 过渡代码只允许放在明确的 `legacy/` 目录,不得新增业务逻辑,并为剩余边界建立测试。
|
|
61
|
+
5. 只有命令式 DOM 查询/写入和全局事件已迁移、类型检查通过,才能声明“完整 Vue 架构迁移”;仅用 Vue 挂载旧 HTML 不算完成。
|
|
62
|
+
|
|
63
|
+
迁移期间保持接口引擎 Key、请求幂等键、版本字段、隐私投影和旧正式 URL 兼容。不要为追求框架统一重写已验证的游戏规则。
|
|
64
|
+
|
|
65
|
+
## 构建与发布
|
|
66
|
+
|
|
67
|
+
1. 先检查内存和已有 Node/Vite 进程,只运行一个高资源构建。
|
|
68
|
+
2. 依次执行类型检查、单元测试、生产构建和产物静态扫描。
|
|
69
|
+
3. 检查 `dist/build` 不含源码、Token、密钥、localhost、source map 或陈旧 chunk。
|
|
70
|
+
4. 同步私有源码,再流式发布公有构建目录;源码同步失败不得继续发布。发布前回读并冻结应用的 `CurrentVersion` 与 `AppVersion`,stage 只上传不可变版本资产,finalize 必须同时提交 `ExpectedCurrentVersion` 与 `ExpectedAppVersion` 做 compare-and-set;缺一项、状态漂移或回读不一致都停止,不能自动覆盖较新发布。
|
|
71
|
+
5. Web/UniApp 使用 `/{OsClient}/ai-app-publish/{AppKey}/index.html`;MicroService 使用 `/micro-app/{OsClient}/{AppKey}/index.html`。不要因技术栈相同而混淆运行类型。
|
|
72
|
+
6. 回读应用、版本、active 文件清单和 SHA-256;旧清单文件只能可逆归档,不能删除。再直接请求稳定入口、不可变版本入口及主要 JS/CSS。
|
|
73
|
+
|
|
74
|
+
## 完成定义
|
|
75
|
+
|
|
76
|
+
- `vue-tsc --noEmit`、单元测试和生产构建通过。
|
|
77
|
+
- 源码、lockfile、Manifest、构建版本和远端文件哈希一致。
|
|
78
|
+
- 匿名、登录、Token 失效、权限不足、弱网、重连和错误恢复有确定结果。
|
|
79
|
+
- PC 和移动真实浏览器截图通过,控制台无错误,刷新/分享 URL 可恢复状态。
|
|
80
|
+
- 多人或分布式功能必须使用不同账号和至少两个 API 节点验收;本地单进程或静态代码检查不能宣称生产多人闭环。
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Microi AI 应用前端基线
|
|
2
|
+
|
|
3
|
+
## 目录
|
|
4
|
+
|
|
5
|
+
1. 技术选择
|
|
6
|
+
2. 标准目录
|
|
7
|
+
3. 最小配置
|
|
8
|
+
4. 分层契约
|
|
9
|
+
5. 通用实时通信
|
|
10
|
+
6. 质量门
|
|
11
|
+
|
|
12
|
+
## 技术选择
|
|
13
|
+
|
|
14
|
+
“最主流”不是永远固定的单一框架。Microi 的默认标准选择 Vue 3 + Vite + TypeScript,是因为 Microi.Client、Microi.UI 和既有开发者能力均以 Vue 3 为主,同时 Vue 官方的新项目脚手架也是 Vite + TypeScript。需要 React/Next、Svelte 或其它框架时,用户必须明确选择,并仍遵守平台 SDK、租户、发布和验收契约。
|
|
15
|
+
|
|
16
|
+
版本策略:使用 Microi 当前维护的脚手架版本并提交 `package-lock.json`;升级依赖时单独提交、重新构建和截图,不让普通业务修改顺带漂移工具链。
|
|
17
|
+
|
|
18
|
+
## 标准目录
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
AI应用/{appKey}/
|
|
22
|
+
.microi-micro-app.json
|
|
23
|
+
package.json
|
|
24
|
+
package-lock.json
|
|
25
|
+
tsconfig.json
|
|
26
|
+
vite.config.ts
|
|
27
|
+
index.html
|
|
28
|
+
src/
|
|
29
|
+
main.ts
|
|
30
|
+
App.vue
|
|
31
|
+
env.d.ts
|
|
32
|
+
components/
|
|
33
|
+
pages/
|
|
34
|
+
composables/
|
|
35
|
+
domain/
|
|
36
|
+
services/
|
|
37
|
+
platform/
|
|
38
|
+
microi.ts
|
|
39
|
+
microi.v8.js
|
|
40
|
+
tests/
|
|
41
|
+
dist/ # MicroService 默认;Web 项目可按清单使用 build/
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`node_modules`、`dist/build`、覆盖率和本地环境文件不进入私有源码包。接口引擎源码按应用 Manifest 维护,但不被打进浏览器产物。
|
|
45
|
+
|
|
46
|
+
## 最小配置
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
// vite.config.ts
|
|
50
|
+
import { defineConfig } from 'vite'
|
|
51
|
+
import vue from '@vitejs/plugin-vue'
|
|
52
|
+
|
|
53
|
+
export default defineConfig({
|
|
54
|
+
base: './',
|
|
55
|
+
plugins: [vue()],
|
|
56
|
+
build: {
|
|
57
|
+
outDir: 'dist',
|
|
58
|
+
assetsDir: 'assets',
|
|
59
|
+
emptyOutDir: true,
|
|
60
|
+
target: 'es2020',
|
|
61
|
+
sourcemap: false,
|
|
62
|
+
},
|
|
63
|
+
})
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"compilerOptions": {
|
|
69
|
+
"target": "ES2022",
|
|
70
|
+
"module": "ESNext",
|
|
71
|
+
"moduleResolution": "Bundler",
|
|
72
|
+
"strict": true,
|
|
73
|
+
"noUncheckedIndexedAccess": true,
|
|
74
|
+
"useDefineForClassFields": true,
|
|
75
|
+
"isolatedModules": true,
|
|
76
|
+
"verbatimModuleSyntax": true,
|
|
77
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
78
|
+
"types": ["vite/client"],
|
|
79
|
+
"skipLibCheck": true
|
|
80
|
+
},
|
|
81
|
+
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "tests/**/*.ts"]
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
推荐脚本:
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"scripts": {
|
|
90
|
+
"dev": "vite --host 0.0.0.0",
|
|
91
|
+
"typecheck": "vue-tsc --noEmit",
|
|
92
|
+
"test": "vitest run",
|
|
93
|
+
"build": "npm run typecheck && vite build",
|
|
94
|
+
"preview": "vite preview --host 0.0.0.0",
|
|
95
|
+
"verify": "npm run test && npm run build"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
没有浏览器业务测试时可以先用 Node 原生测试,但复杂应用应使用 Vitest;关键 UI 流程使用 Playwright。不要为了“看起来主流”无条件加入 Router、Pinia、Element Plus或大型渲染库。
|
|
101
|
+
|
|
102
|
+
## 分层契约
|
|
103
|
+
|
|
104
|
+
```text
|
|
105
|
+
Vue SFC/pages
|
|
106
|
+
-> composables/use-cases
|
|
107
|
+
-> domain pure TypeScript
|
|
108
|
+
-> services (ApiEngine / Realtime / Audio)
|
|
109
|
+
-> platform Microi SDK and host context
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
- `domain` 只接收普通数据并返回普通数据。
|
|
113
|
+
- `services` 负责协议和 DTO,不把 HTTP/SignalR 对象泄漏到页面。
|
|
114
|
+
- `composables` 负责生命周期、忙碌态和错误恢复。
|
|
115
|
+
- `components/pages` 只消费可显示状态和明确动作。
|
|
116
|
+
|
|
117
|
+
## 通用实时通信
|
|
118
|
+
|
|
119
|
+
需要订单进度、协同状态或多人房间等实时刷新时,默认使用接口引擎通用 SignalR v2 契约;不要为应用新建业务专用 Hub。业务命令、订阅授权、事务和按用户裁剪的 Snapshot 均由接口引擎实现,SignalR 只发送事务提交后的公共投影。
|
|
120
|
+
|
|
121
|
+
- Hub 固定为 `/api-engine-realtime`,客户端调用 `SubscribeChannel({ ChannelKey, SubjectId })`,监听 `RealtimeEvent`。
|
|
122
|
+
- 连接必须使用普通登录 Token。现有 AccessKey 没有 `realtime:subscribe` scope,平台会拒绝其连接;在平台正式增加并校验该 scope 前,不得绕过此限制。
|
|
123
|
+
- 每次订阅或续租都会重新调用 `realtime_{channel_key}_authorize`,授权接口必须以 `V8.CurrentUser` 为准,不能信任客户端传入的用户、租户或接口 Key。
|
|
124
|
+
- 订阅按 30 秒时隙租约管理。客户端以服务端返回的 `RenewAfterMilliseconds` 安排下一次 `SubscribeChannel`,不得写死续租周期;页面隐藏后仍需订阅时继续续租,退出资源、注销或组件卸载时调用 `UnsubscribeChannel` 并清理定时器。
|
|
125
|
+
- 客户端按 `EventId` 去重、按 `Version` 忽略旧事件并检测缺口。连接失败、续租失败、重连或版本跳跃时,立即回退到业务 HTTP `Snapshot`,且始终保留有界轮询兜底。
|
|
126
|
+
- 接口引擎只能在成功结果的 `DataAppend.RealtimeEvent` 中声明 `Data` 公共投影;私有手牌、Token、密钥、用户专属字段和完整服务端状态只能由鉴权后的 Snapshot 返回。
|
|
127
|
+
|
|
128
|
+
续租应串行执行,避免一个页面产生重叠授权请求:
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
const subscription = { ChannelKey: 'room_updates', SubjectId: roomId }
|
|
132
|
+
let renewTimer: ReturnType<typeof setTimeout> | undefined
|
|
133
|
+
|
|
134
|
+
async function renewRealtimeLease() {
|
|
135
|
+
clearTimeout(renewTimer)
|
|
136
|
+
try {
|
|
137
|
+
const lease = await connection.invoke<{
|
|
138
|
+
ProtocolVersion: number
|
|
139
|
+
RenewAfterMilliseconds: number
|
|
140
|
+
LeaseExpiresAt: string
|
|
141
|
+
}>('SubscribeChannel', subscription)
|
|
142
|
+
renewTimer = setTimeout(
|
|
143
|
+
() => void renewRealtimeLease(),
|
|
144
|
+
Math.max(1_000, lease.RenewAfterMilliseconds),
|
|
145
|
+
)
|
|
146
|
+
} catch {
|
|
147
|
+
await refreshSnapshot()
|
|
148
|
+
renewTimer = setTimeout(() => void renewRealtimeLease(), 3_000)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
当前服务端还会在共享 Redis 中按租户和用户限制订阅授权频率,所有标签页和 API 节点共享计数。应用不得依赖单节点内存节流,也不得通过并发续租消耗限额。
|
|
154
|
+
|
|
155
|
+
## 质量门
|
|
156
|
+
|
|
157
|
+
- TypeScript 严格检查无错误;`any` 只能位于有说明的平台兼容边界。
|
|
158
|
+
- 每个写接口有请求 Id、重复提交保护和服务端校验。
|
|
159
|
+
- 构建资产使用相对路径,稳定入口与不可变版本入口均可打开。
|
|
160
|
+
- stage 前冻结 `CurrentVersion + AppVersion`,finalize 同时提交两项前置条件;旧请求晚到、应用身份漂移或清单收缩对账失败时不切换稳定入口。
|
|
161
|
+
- 生产 JS 不含 localhost、凭据、私有牌面、服务端源码或 source map。
|
|
162
|
+
- 首屏、登录/未登录、加载、空、错误、权限、成功状态均有响应式截图。
|
|
163
|
+
- Canvas/WebGL、音频和实时连接在隐藏/卸载时释放,并有低性能降级。
|
|
164
|
+
- 实时客户端已验证续租会重复授权、Token/资格撤销后停止收到事件,以及 SignalR/Redis 暂不可用时可通过 HTTP Snapshot 收敛。
|