Croupier JS/TS SDK 约定规范
命名约定
函数 ID 使用 [namespace.]resource.operation:
typescript
"player.get";
"player.ban";
"inventory.item.add";避免使用驼峰、下划线或连字符:
typescript
"PlayerGet";
"player_get";
"player-get";注册约定
所有函数必须在 connect() 前注册完成:
typescript
client.registerFunction(descriptor, handler);
await client.connect();同一服务实例内,函数 ID 必须唯一。
描述符建议
最小可注册字段:
idversion
建议补齐基础说明:
summarydescriptiontagsinputSchemaoutputSchema
建议补齐业务与治理信息:
resourceoperationcapabilityriskenabledpermission
语义约束:
operation是业务操作 key,例如ban、grant、send。- SDK descriptor 不提供页面 schema、组件树、页面 mapping、菜单、分类显示名、页面标题、按钮文案或页面位置。
- 动态分类、页面标题、按钮文案和页面位置只在 PageSpec / Page Studio 中确定,不写入 SDK descriptor,也不写入前端静态 locale 文件。
capability只允许受控资源语义:collection_query/item_query/create/update/delete/action/task/report;它不是页面类型或按钮位置。- 默认 PageProposal 由 Server 根据 FunctionContract、JSON Schema、CapabilitySemantics 和 diagnostics 生成;SDK 不提供列、mapping、菜单或 UI。
OpenAPI 导入(Descriptor v2)
registerFromOpenAPI 在本地解析 OpenAPI 3 JSON(不连接 server),把每个 operation 转成 Descriptor v2 的 FunctionDescriptor 并注册,handler 按派生的函数 ID 查找:
typescript
import { createClient, registerFromOpenAPI } from "@croupier/sdk";
const client = createClient({ serviceId: "my-service" });
const registered = registerFromOpenAPI(
client,
specJson, // string 或已解析的对象
{
resourcePrefix: "game",
tagPrefix: "svc-",
defaultTimeoutMs: 30000,
continueOnError: true,
},
(functionId) => handlers[functionId], // 返回 undefined 且未开 continueOnError 时报错
);转换规则:
id取operationId;缺失时由 path 生成a.b.c风格 ID。name/summary取summary;缺失时用operationId的 titleCase。inputSchema取 requestBody 的application/jsonschema;outputSchema取 200 响应 schema(简化为 JSON Schema)。- 扩展字段映射:
x-resource、x-operation、x-capability、x-execution、x-permission、x-risk。 x-approval: { required, policyKey }映射approvalRequired/approvalPolicyKey。risk词表为safe|warning|high|danger(low/medium等旧别名会被归一);capability、execution为受控枚举,非法值抛错,可用continueOnError跳过。
完整契约见 OpenAPI / SDK Descriptor v2。
