GitHub 如何编码他们的 graphQL 游标?

How does GitHub encode their graphQL cursors?

GitHub 的 graphql 游标是有意不透明的,因此它们不应该被客户端解码。但是我想知道他们的分页方法,尤其是与排序结合使用时。

GitHub使用的分页游标的编码有多层编码。我从一个解码器的角度来依次列出:

  1. 光标字符串使用 URL safe base64 编码,这意味着它使用 -_ 而不是 +/。这可能是为了与他们基于 REST 的 API.
  2. 保持一致
  3. 解码 base64 字符串给我们另一个格式为 cursor:v2:[something] 的字符串,所以下一步是解码一些东西。
  4. 'something' 是包含实际游标属性的二进制编码数据。第一个字节定义游标类型:
    • 0x91 => 我们不使用任何排序,游标包含 id 字段的长度和 id 本身。 0xcd 似乎表示一个 two-byte id,0xce 一个 four-byte id。接下来是 id 本身,可以通过解码 base64 id graphql 字段来验证。
    • 0x92 => 包含排序后的 属性 和 id 的复合游标。这是一个 length-prefixed 序数或两个字节加上一个字符串或 ISO 日期字符串,后跟 length-prefixed id。