跳到主要内容
SDK 如何工作

本页尚未翻译,当前显示英文版本。

由谁决策

权威是一层抽象,而不是 SDK 的两个 build。 没有客户端 SDK,也没有服务器 SDK。SDK 只有一个,一次调用能做什么,由发起调用的主体决定。

主客户端既不是客户端,也不是服务器

玩家的机器创建房间(room)后接着运行它,这台机器就是主客户端(master-client)。它持有 room-owner 接口,仅此而已。它不是服务器:服务器能做的事,它并不都能做。它也不是普通客户端。

专用服务器是从另一侧看到的同一种形态:同一个客户端,只是去掉了渲染,不需要单独的 SDK。两者的区别在于信任,而不在于构造,而信任由授权(grant)承载。

接口跟随主体,而不是跟随哪一端

模块不会提供“客户端 API”和“服务器 API”。它提供的是 room-owner 能做什么、entry-validator 能做什么、seller 能做什么。模块页面也按同样的方式——按主体(actor)——组织各自的接口。

角色既是权利,也是分类

角色(role)承载主体可以做的事,同时也用来表明某样东西是发给谁的。除此之外,没有第二套标签或标记体系。

代码通过 whoami 询问。它报告当前主体,以及这个主体此刻解锁的接口——而不是构建时写死在二进制里的静态列表。

代码在哪里运行、持有哪个主体,是两个独立的问题

问题答案
这段代码在哪里执行?云函数 · 游戏客户端 · 主客户端或专用服务器主机
它持有哪个主体接口?player · room-owner · entry-validator · seller · moderator · backend-service · …

把两条轴排成网格,就能看出它们相互独立,每个格子都可以取到:

云函数游戏客户端房间主机管理端
player✓✓✓—
room-owner✓✓——玩家自己的机器,负责托管✓—
backend-service✓—✓✓

加粗的格子表示代码运行在客户端上,却在做服务器的工作。它有名字——room-owner——而且和其他授权一样,也只是一项授权。

任何组合都合法。云函数并不自动拥有特权,客户端也不自动受限:权利来自授权,而授权是声明出来的。

撤销无需重新签发凭据即可生效

凭据标明的是身份,不携带角色列表。角色在服务器端按每次请求解析,因此客户端从不持有自身权限的证明,撤销之后也没有过期的东西可以继续出示。

所以撤销角色无需重新签发凭据就会生效;参见 授予角色意味着什么。

撤销不是即时的

角色撤销后,最迟在权限缓存声明的过期上限内就能观察到效果。平台不承诺即时生效。

权威在哪里声明,而不是推断

  • 房间类型声明自己的权威模式(authority mode),而且没有默认值:要么由平台模拟运行 tick,要么由外部权威运行——工作室的游戏服务器,或者作为主客户端的玩家客户端。详见 由谁运行 tick。
  • 外部权威报告的结果可信到什么程度,是房间类型上的另一项声明——接受、用 hook 检查,或者不接受。同样没有默认值。
  • 哪种凭据解析为哪个角色,以及主机密钥是什么,见 Access & Roles。