@babylonjs-toolkit/server 0.0.0-stage → 9.35.0

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.
Files changed (236) hide show
  1. package/CUSTOM.md +1690 -0
  2. package/DEPLOY.md +2012 -0
  3. package/README.md +1081 -2
  4. package/lib/AbuseLimits.d.ts +64 -0
  5. package/lib/AbuseLimits.js +121 -0
  6. package/lib/Authentication.d.ts +86 -0
  7. package/lib/Authentication.js +272 -0
  8. package/lib/BootSessionOwner.d.ts +86 -0
  9. package/lib/BootSessionOwner.js +116 -0
  10. package/lib/ColyseusLoggerAdapter.d.ts +32 -0
  11. package/lib/ColyseusLoggerAdapter.js +73 -0
  12. package/lib/DedicatedSceneRegistry.d.ts +52 -0
  13. package/lib/DedicatedSceneRegistry.js +74 -0
  14. package/lib/DedicatedSession.d.ts +152 -0
  15. package/lib/DedicatedSession.js +173 -0
  16. package/lib/DualTransport.d.ts +112 -0
  17. package/lib/DualTransport.js +197 -0
  18. package/lib/GameServer.d.ts +64 -0
  19. package/lib/GameServer.js +647 -0
  20. package/lib/GameServerConfig.d.ts +387 -0
  21. package/lib/GameServerConfig.js +1059 -0
  22. package/lib/GameServerLobbyRoom.d.ts +33 -0
  23. package/lib/GameServerLobbyRoom.js +56 -0
  24. package/lib/GameServerLogger.d.ts +111 -0
  25. package/lib/GameServerLogger.js +190 -0
  26. package/lib/GameServerMetrics.d.ts +158 -0
  27. package/lib/GameServerMetrics.js +276 -0
  28. package/lib/GameServerState.d.ts +164 -0
  29. package/lib/GameServerState.js +26 -0
  30. package/lib/HeadlessRuntime.d.ts +316 -0
  31. package/lib/HeadlessRuntime.js +380 -0
  32. package/lib/JoinGate.d.ts +34 -0
  33. package/lib/JoinGate.js +221 -0
  34. package/lib/NetworkAddresses.d.ts +33 -0
  35. package/lib/NetworkAddresses.js +90 -0
  36. package/lib/PlayerTokens.d.ts +17 -0
  37. package/lib/PlayerTokens.js +24 -0
  38. package/lib/RoomServerTransport.d.ts +73 -0
  39. package/lib/RoomServerTransport.js +90 -0
  40. package/lib/ServerEndpoints.d.ts +133 -0
  41. package/lib/ServerEndpoints.js +247 -0
  42. package/lib/ServerInit.d.ts +28 -0
  43. package/lib/ServerInit.js +113 -0
  44. package/lib/SessionRoom.d.ts +391 -0
  45. package/lib/SessionRoom.js +930 -0
  46. package/lib/TlsCertificates.d.ts +35 -0
  47. package/lib/TlsCertificates.js +130 -0
  48. package/lib/admin/AccountRoutes.d.ts +8 -0
  49. package/lib/admin/AccountRoutes.js +502 -0
  50. package/lib/admin/AdminAccounts.d.ts +329 -0
  51. package/lib/admin/AdminAccounts.js +607 -0
  52. package/lib/admin/AdminApiRouter.d.ts +202 -0
  53. package/lib/admin/AdminApiRouter.js +465 -0
  54. package/lib/admin/AdminApiTypes.d.ts +1782 -0
  55. package/lib/admin/AdminApiTypes.js +4 -0
  56. package/lib/admin/AdminAudit.d.ts +113 -0
  57. package/lib/admin/AdminAudit.js +266 -0
  58. package/lib/admin/AdminCli.d.ts +7 -0
  59. package/lib/admin/AdminCli.js +351 -0
  60. package/lib/admin/AdminClock.d.ts +51 -0
  61. package/lib/admin/AdminClock.js +10 -0
  62. package/lib/admin/AdminConsole.d.ts +39 -0
  63. package/lib/admin/AdminConsole.js +325 -0
  64. package/lib/admin/AdminConstants.d.ts +147 -0
  65. package/lib/admin/AdminConstants.js +167 -0
  66. package/lib/admin/AdminCrypto.d.ts +19 -0
  67. package/lib/admin/AdminCrypto.js +29 -0
  68. package/lib/admin/AdminExtensionsHost.d.ts +176 -0
  69. package/lib/admin/AdminExtensionsHost.js +307 -0
  70. package/lib/admin/AdminPasswords.d.ts +33 -0
  71. package/lib/admin/AdminPasswords.js +92 -0
  72. package/lib/admin/AdminPermissions.d.ts +28 -0
  73. package/lib/admin/AdminPermissions.js +74 -0
  74. package/lib/admin/AdminRecords.d.ts +196 -0
  75. package/lib/admin/AdminRecords.js +3 -0
  76. package/lib/admin/AdminRequestBodies.d.ts +47 -0
  77. package/lib/admin/AdminRequestBodies.js +84 -0
  78. package/lib/admin/AdminRequestGate.d.ts +38 -0
  79. package/lib/admin/AdminRequestGate.js +59 -0
  80. package/lib/admin/AdminResponses.d.ts +103 -0
  81. package/lib/admin/AdminResponses.js +164 -0
  82. package/lib/admin/AdminServices.d.ts +99 -0
  83. package/lib/admin/AdminServices.js +4 -0
  84. package/lib/admin/AdminStaticFiles.d.ts +29 -0
  85. package/lib/admin/AdminStaticFiles.js +97 -0
  86. package/lib/admin/AdminStore.d.ts +152 -0
  87. package/lib/admin/AdminStore.js +46 -0
  88. package/lib/admin/AlertChannels.d.ts +43 -0
  89. package/lib/admin/AlertChannels.js +120 -0
  90. package/lib/admin/AlertEngine.d.ts +231 -0
  91. package/lib/admin/AlertEngine.js +681 -0
  92. package/lib/admin/AlertRoutes.d.ts +8 -0
  93. package/lib/admin/AlertRoutes.js +180 -0
  94. package/lib/admin/ApiKeyRoutes.d.ts +8 -0
  95. package/lib/admin/ApiKeyRoutes.js +53 -0
  96. package/lib/admin/ApiKeys.d.ts +63 -0
  97. package/lib/admin/ApiKeys.js +167 -0
  98. package/lib/admin/AuditRoutes.d.ts +8 -0
  99. package/lib/admin/AuditRoutes.js +106 -0
  100. package/lib/admin/AuthToolRoutes.d.ts +13 -0
  101. package/lib/admin/AuthToolRoutes.js +164 -0
  102. package/lib/admin/BanList.d.ts +87 -0
  103. package/lib/admin/BanList.js +152 -0
  104. package/lib/admin/CborDecoder.d.ts +18 -0
  105. package/lib/admin/CborDecoder.js +201 -0
  106. package/lib/admin/ColyseusCloudClient.d.ts +313 -0
  107. package/lib/admin/ColyseusCloudClient.js +272 -0
  108. package/lib/admin/ColyseusCloudRoutes.d.ts +8 -0
  109. package/lib/admin/ColyseusCloudRoutes.js +91 -0
  110. package/lib/admin/ColyseusCloudService.d.ts +180 -0
  111. package/lib/admin/ColyseusCloudService.js +476 -0
  112. package/lib/admin/ColyseusCloudSettings.d.ts +16 -0
  113. package/lib/admin/ColyseusCloudSettings.js +29 -0
  114. package/lib/admin/ColyseusCloudViews.d.ts +105 -0
  115. package/lib/admin/ColyseusCloudViews.js +371 -0
  116. package/lib/admin/CommonPasswords.d.ts +6 -0
  117. package/lib/admin/CommonPasswords.js +19 -0
  118. package/lib/admin/ConfigOverrides.d.ts +174 -0
  119. package/lib/admin/ConfigOverrides.js +406 -0
  120. package/lib/admin/ConfigRoutes.d.ts +8 -0
  121. package/lib/admin/ConfigRoutes.js +91 -0
  122. package/lib/admin/ConsoleSessions.d.ts +112 -0
  123. package/lib/admin/ConsoleSessions.js +201 -0
  124. package/lib/admin/DedicatedRoutes.d.ts +21 -0
  125. package/lib/admin/DedicatedRoutes.js +254 -0
  126. package/lib/admin/ExtensionRoutes.d.ts +8 -0
  127. package/lib/admin/ExtensionRoutes.js +145 -0
  128. package/lib/admin/FileAdminStore.d.ts +157 -0
  129. package/lib/admin/FileAdminStore.js +349 -0
  130. package/lib/admin/FleetDirectory.d.ts +323 -0
  131. package/lib/admin/FleetDirectory.js +489 -0
  132. package/lib/admin/FleetLeader.d.ts +43 -0
  133. package/lib/admin/FleetLeader.js +89 -0
  134. package/lib/admin/FleetRoutes.d.ts +55 -0
  135. package/lib/admin/FleetRoutes.js +465 -0
  136. package/lib/admin/HealthWarnings.d.ts +10 -0
  137. package/lib/admin/HealthWarnings.js +95 -0
  138. package/lib/admin/LeaderboardRoutes.d.ts +8 -0
  139. package/lib/admin/LeaderboardRoutes.js +569 -0
  140. package/lib/admin/LogBuffer.d.ts +60 -0
  141. package/lib/admin/LogBuffer.js +92 -0
  142. package/lib/admin/LogRedaction.d.ts +15 -0
  143. package/lib/admin/LogRedaction.js +72 -0
  144. package/lib/admin/LogRoutes.d.ts +45 -0
  145. package/lib/admin/LogRoutes.js +307 -0
  146. package/lib/admin/MaintenanceMode.d.ts +41 -0
  147. package/lib/admin/MaintenanceMode.js +74 -0
  148. package/lib/admin/MaintenanceWindows.d.ts +91 -0
  149. package/lib/admin/MaintenanceWindows.js +207 -0
  150. package/lib/admin/MetricsRoutes.d.ts +8 -0
  151. package/lib/admin/MetricsRoutes.js +209 -0
  152. package/lib/admin/MetricsSampler.d.ts +124 -0
  153. package/lib/admin/MetricsSampler.js +211 -0
  154. package/lib/admin/OneTimeCodes.d.ts +60 -0
  155. package/lib/admin/OneTimeCodes.js +162 -0
  156. package/lib/admin/OpenIdConnect.d.ts +146 -0
  157. package/lib/admin/OpenIdConnect.js +335 -0
  158. package/lib/admin/Passkeys.d.ts +130 -0
  159. package/lib/admin/Passkeys.js +432 -0
  160. package/lib/admin/PlayerRoutes.d.ts +20 -0
  161. package/lib/admin/PlayerRoutes.js +676 -0
  162. package/lib/admin/RedisAdminStore.d.ts +114 -0
  163. package/lib/admin/RedisAdminStore.js +258 -0
  164. package/lib/admin/RolloutCoordinator.d.ts +99 -0
  165. package/lib/admin/RolloutCoordinator.js +321 -0
  166. package/lib/admin/ServerEvents.d.ts +57 -0
  167. package/lib/admin/ServerEvents.js +89 -0
  168. package/lib/admin/SessionRoutes.d.ts +113 -0
  169. package/lib/admin/SessionRoutes.js +386 -0
  170. package/lib/admin/UserRoutes.d.ts +8 -0
  171. package/lib/admin/UserRoutes.js +214 -0
  172. package/lib/cli.d.ts +2 -0
  173. package/lib/cli.js +221 -0
  174. package/lib/console/assets/index-CI5N7c-T.js +21 -0
  175. package/lib/console/assets/index-DPitvzLp.css +1 -0
  176. package/lib/console/favicon.svg +1 -0
  177. package/lib/console/index.html +16 -0
  178. package/lib/discord/DiscordOAuth.d.ts +57 -0
  179. package/lib/discord/DiscordOAuth.js +127 -0
  180. package/lib/discord/DiscordSessions.d.ts +79 -0
  181. package/lib/discord/DiscordSessions.js +135 -0
  182. package/lib/discord/DiscordSignInConstants.d.ts +54 -0
  183. package/lib/discord/DiscordSignInConstants.js +55 -0
  184. package/lib/discord/DiscordSignInRoutes.d.ts +51 -0
  185. package/lib/discord/DiscordSignInRoutes.js +359 -0
  186. package/lib/index.d.ts +24 -0
  187. package/lib/index.js +18 -0
  188. package/lib/leaderboards/FileLeaderboardRankStore.d.ts +293 -0
  189. package/lib/leaderboards/FileLeaderboardRankStore.js +808 -0
  190. package/lib/leaderboards/LeaderboardConstants.d.ts +63 -0
  191. package/lib/leaderboards/LeaderboardConstants.js +70 -0
  192. package/lib/leaderboards/LeaderboardError.d.ts +15 -0
  193. package/lib/leaderboards/LeaderboardError.js +20 -0
  194. package/lib/leaderboards/LeaderboardIdentity.d.ts +44 -0
  195. package/lib/leaderboards/LeaderboardIdentity.js +72 -0
  196. package/lib/leaderboards/LeaderboardPublicApi.d.ts +17 -0
  197. package/lib/leaderboards/LeaderboardPublicApi.js +389 -0
  198. package/lib/leaderboards/LeaderboardRankStore.d.ts +296 -0
  199. package/lib/leaderboards/LeaderboardRankStore.js +18 -0
  200. package/lib/leaderboards/LeaderboardRules.d.ts +122 -0
  201. package/lib/leaderboards/LeaderboardRules.js +472 -0
  202. package/lib/leaderboards/LeaderboardScheduler.d.ts +43 -0
  203. package/lib/leaderboards/LeaderboardScheduler.js +103 -0
  204. package/lib/leaderboards/LeaderboardService.d.ts +669 -0
  205. package/lib/leaderboards/LeaderboardService.js +1667 -0
  206. package/lib/leaderboards/LeaderboardTransfer.d.ts +35 -0
  207. package/lib/leaderboards/LeaderboardTransfer.js +580 -0
  208. package/lib/leaderboards/RedisLeaderboardRankStore.d.ts +282 -0
  209. package/lib/leaderboards/RedisLeaderboardRankStore.js +691 -0
  210. package/package.json +64 -4
  211. package/templates/init/Caddyfile +6 -0
  212. package/templates/init/DEPLOY.md +233 -0
  213. package/templates/init/Dockerfile +12 -0
  214. package/templates/init/app.json +21 -0
  215. package/templates/init/aws/README.md +118 -0
  216. package/templates/init/aws/ecs-fargate-alb.yml +207 -0
  217. package/templates/init/aws/ecs-fargate-nlb-quic.yml +210 -0
  218. package/templates/init/babylon-game-server.config.mjs +158 -0
  219. package/templates/init/colyseus-cloud/README.md +133 -0
  220. package/templates/init/colyseus-cloud/babylon-game-server.config.mjs +36 -0
  221. package/templates/init/colyseus-cloud/ecosystem.config.cjs +35 -0
  222. package/templates/init/colyseus-cloud/gitignore +6 -0
  223. package/templates/init/colyseus-cloud/package.json +15 -0
  224. package/templates/init/digitalocean-app.yaml +30 -0
  225. package/templates/init/docker-compose.full.yml +45 -0
  226. package/templates/init/docker-compose.websocket.yml +41 -0
  227. package/templates/init/fly.toml +56 -0
  228. package/templates/init/heroku.yml +11 -0
  229. package/templates/init/kubernetes/deployment.yaml +71 -0
  230. package/templates/init/kubernetes/redis.yaml +73 -0
  231. package/templates/init/kubernetes/service.yaml +24 -0
  232. package/templates/init/monitoring/grafana-dashboard.json +539 -0
  233. package/templates/init/monitoring/prometheus-alerts.yml +51 -0
  234. package/templates/init/monitoring/prometheus-scrape.yml +17 -0
  235. package/templates/init/railway.json +13 -0
  236. package/templates/init/render.yaml +19 -0
@@ -0,0 +1,63 @@
1
+ import type { LeaderboardRules } from "../admin/AdminApiTypes.js";
2
+ /** Path prefix of the public leaderboard API (D5). */
3
+ export declare const LEADERBOARD_API_PREFIX: string;
4
+ /** Largest public request body, in bytes. */
5
+ export declare const LEADERBOARD_MAX_BODY_BYTES: number;
6
+ /** Largest absolute score: 13 digits stay exact through Redis's Lua cjson (D12). */
7
+ export declare const LEADERBOARD_MAXIMUM_ABSOLUTE_SCORE: number;
8
+ /** Slack a time score may exceed the run's duration by, and session presence's slack, in milliseconds (D10, D12). */
9
+ export declare const LEADERBOARD_DURATION_TOLERANCE_MS: number;
10
+ /** How long a session join counts for session-level trust, in milliseconds (6 h, D10). */
11
+ export declare const LEADERBOARD_SESSION_WINDOW_MS: number;
12
+ /** How long a submission id is remembered for exactly-once delivery, in milliseconds (7 days, D15). */
13
+ export declare const LEADERBOARD_DEDUPE_TTL_MS: number;
14
+ /** Variant key of a board without dimensions (D16). */
15
+ export declare const LEADERBOARD_ALL_VARIANT_KEY: string;
16
+ /** Most dimensions one board may declare. */
17
+ export declare const LEADERBOARD_MAXIMUM_DIMENSIONS: number;
18
+ /** Most values one dimension may allow. */
19
+ export declare const LEADERBOARD_MAXIMUM_DIMENSION_VALUES: number;
20
+ /** Longest dimension value. */
21
+ export declare const LEADERBOARD_MAXIMUM_VALUE_LENGTH: number;
22
+ /** Longest display name. */
23
+ export declare const LEADERBOARD_MAXIMUM_NAME_LENGTH: number;
24
+ /** Most entries one public read returns. */
25
+ export declare const LEADERBOARD_MAXIMUM_PAGE_SIZE: number;
26
+ /** Default entries of a public read. */
27
+ export declare const LEADERBOARD_DEFAULT_PAGE_SIZE: number;
28
+ /** Most entries above and below a player in an around-me read. */
29
+ export declare const LEADERBOARD_MAXIMUM_AROUND_WINDOW: number;
30
+ /** Most targets in one my-entries read. */
31
+ export declare const LEADERBOARD_MAXIMUM_TARGETS: number;
32
+ /** Per-process cache life of top-N reads, in milliseconds (D19). */
33
+ export declare const LEADERBOARD_READ_CACHE_MS: number;
34
+ /** Per-process cache life of board definitions and rules, in milliseconds (D19). */
35
+ export declare const LEADERBOARD_DEFINITION_CACHE_MS: number;
36
+ /** Lease name of the scheduler (D17). */
37
+ export declare const LEADERBOARD_SCHEDULER_LEASE: string;
38
+ /** Lease life of the scheduler, in milliseconds. */
39
+ export declare const LEADERBOARD_SCHEDULER_LEASE_TTL_MS: number;
40
+ /** Milliseconds between scheduler ticks. */
41
+ export declare const LEADERBOARD_SCHEDULER_TICK_MS: number;
42
+ /** Activity records kept (D21). */
43
+ export declare const LEADERBOARD_ACTIVITY_KEEP: number;
44
+ /** Redis key prefix of the rank store. */
45
+ export declare const LEADERBOARD_REDIS_PREFIX: string;
46
+ /** Folder of the file rank store below admin.dataDir. */
47
+ export declare const LEADERBOARD_DATA_FOLDER: string;
48
+ /** Milliseconds the file rank store waits before writing a changed file. */
49
+ export declare const LEADERBOARD_FILE_FLUSH_DELAY_MS: number;
50
+ /** Admin store document id of the rules (collection "leaderboardSettings"). */
51
+ export declare const LEADERBOARD_RULES_DOCUMENT_ID: string;
52
+ /** Rules used until an admin saves others (D19). */
53
+ export declare const DEFAULT_LEADERBOARD_RULES: LeaderboardRules;
54
+ /** Milliseconds in one minute. */
55
+ export declare const MILLISECONDS_PER_MINUTE: number;
56
+ /** Milliseconds in one hour. */
57
+ export declare const MILLISECONDS_PER_HOUR: number;
58
+ /** Board id pattern. */
59
+ export declare const BOARD_ID_PATTERN: RegExp;
60
+ /** Dimension name pattern. */
61
+ export declare const DIMENSION_NAME_PATTERN: RegExp;
62
+ /** Submission id pattern. */
63
+ export declare const SUBMISSION_ID_PATTERN: RegExp;
@@ -0,0 +1,70 @@
1
+ /** Path prefix of the public leaderboard API (D5). */
2
+ export const LEADERBOARD_API_PREFIX = "/game-server/leaderboards/";
3
+ /** Largest public request body, in bytes. */
4
+ export const LEADERBOARD_MAX_BODY_BYTES = 65536;
5
+ /** Largest absolute score: 13 digits stay exact through Redis's Lua cjson (D12). */
6
+ export const LEADERBOARD_MAXIMUM_ABSOLUTE_SCORE = 9999999999999;
7
+ /** Slack a time score may exceed the run's duration by, and session presence's slack, in milliseconds (D10, D12). */
8
+ export const LEADERBOARD_DURATION_TOLERANCE_MS = 5000;
9
+ /** How long a session join counts for session-level trust, in milliseconds (6 h, D10). */
10
+ export const LEADERBOARD_SESSION_WINDOW_MS = 21600000;
11
+ /** How long a submission id is remembered for exactly-once delivery, in milliseconds (7 days, D15). */
12
+ export const LEADERBOARD_DEDUPE_TTL_MS = 604800000;
13
+ /** Variant key of a board without dimensions (D16). */
14
+ export const LEADERBOARD_ALL_VARIANT_KEY = "all";
15
+ /** Most dimensions one board may declare. */
16
+ export const LEADERBOARD_MAXIMUM_DIMENSIONS = 4;
17
+ /** Most values one dimension may allow. */
18
+ export const LEADERBOARD_MAXIMUM_DIMENSION_VALUES = 100;
19
+ /** Longest dimension value. */
20
+ export const LEADERBOARD_MAXIMUM_VALUE_LENGTH = 64;
21
+ /** Longest display name. */
22
+ export const LEADERBOARD_MAXIMUM_NAME_LENGTH = 24;
23
+ /** Most entries one public read returns. */
24
+ export const LEADERBOARD_MAXIMUM_PAGE_SIZE = 100;
25
+ /** Default entries of a public read. */
26
+ export const LEADERBOARD_DEFAULT_PAGE_SIZE = 10;
27
+ /** Most entries above and below a player in an around-me read. */
28
+ export const LEADERBOARD_MAXIMUM_AROUND_WINDOW = 10;
29
+ /** Most targets in one my-entries read. */
30
+ export const LEADERBOARD_MAXIMUM_TARGETS = 20;
31
+ /** Per-process cache life of top-N reads, in milliseconds (D19). */
32
+ export const LEADERBOARD_READ_CACHE_MS = 2000;
33
+ /** Per-process cache life of board definitions and rules, in milliseconds (D19). */
34
+ export const LEADERBOARD_DEFINITION_CACHE_MS = 2000;
35
+ /** Lease name of the scheduler (D17). */
36
+ export const LEADERBOARD_SCHEDULER_LEASE = "leaderboard-scheduler";
37
+ /** Lease life of the scheduler, in milliseconds. */
38
+ export const LEADERBOARD_SCHEDULER_LEASE_TTL_MS = 90000;
39
+ /** Milliseconds between scheduler ticks. */
40
+ export const LEADERBOARD_SCHEDULER_TICK_MS = 60000;
41
+ /** Activity records kept (D21). */
42
+ export const LEADERBOARD_ACTIVITY_KEEP = 5000;
43
+ /** Redis key prefix of the rank store. */
44
+ export const LEADERBOARD_REDIS_PREFIX = "bgs:lb:";
45
+ /** Folder of the file rank store below admin.dataDir. */
46
+ export const LEADERBOARD_DATA_FOLDER = "leaderboards";
47
+ /** Milliseconds the file rank store waits before writing a changed file. */
48
+ export const LEADERBOARD_FILE_FLUSH_DELAY_MS = 500;
49
+ /** Admin store document id of the rules (collection "leaderboardSettings"). */
50
+ export const LEADERBOARD_RULES_DOCUMENT_ID = "rules";
51
+ /** Rules used until an admin saves others (D19). */
52
+ export const DEFAULT_LEADERBOARD_RULES = {
53
+ submissionsPerMinutePerPlayer: 30,
54
+ submissionsPerMinutePerAddress: 60,
55
+ readsPerMinutePerAddress: 240,
56
+ identitiesPerHourPerAddress: 20,
57
+ maximumScoresPerSubmission: 10,
58
+ metadataMaximumBytes: 1024,
59
+ blockedWords: []
60
+ };
61
+ /** Milliseconds in one minute. */
62
+ export const MILLISECONDS_PER_MINUTE = 60000;
63
+ /** Milliseconds in one hour. */
64
+ export const MILLISECONDS_PER_HOUR = 3600000;
65
+ /** Board id pattern. */
66
+ export const BOARD_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/;
67
+ /** Dimension name pattern. */
68
+ export const DIMENSION_NAME_PATTERN = /^[a-zA-Z][a-zA-Z0-9_-]{0,31}$/;
69
+ /** Submission id pattern. */
70
+ export const SUBMISSION_ID_PATTERN = /^[A-Za-z0-9-]{8,64}$/;
@@ -0,0 +1,15 @@
1
+ import type { LeaderboardRefusalReason } from "../admin/AdminApiTypes.js";
2
+ /** A refused leaderboard request: the HTTP status, the machine reason and a sentence for people. */
3
+ export declare class LeaderboardError extends Error {
4
+ /** HTTP status to answer with. */
5
+ readonly status: number;
6
+ /** The machine-readable reason. */
7
+ readonly reason: LeaderboardRefusalReason;
8
+ /**
9
+ * Creates the error.
10
+ * @param status HTTP status (400, 401, 403, 404, 409 or 429).
11
+ * @param reason The machine-readable reason.
12
+ * @param message A sentence for people.
13
+ */
14
+ constructor(status: number, reason: LeaderboardRefusalReason, message: string);
15
+ }
@@ -0,0 +1,20 @@
1
+ // A refused leaderboard request (game-server-leaderboards DR §5): the HTTP status, the machine reason and a sentence.
2
+ /** A refused leaderboard request: the HTTP status, the machine reason and a sentence for people. */
3
+ export class LeaderboardError extends Error {
4
+ /** HTTP status to answer with. */
5
+ status;
6
+ /** The machine-readable reason. */
7
+ reason;
8
+ /**
9
+ * Creates the error.
10
+ * @param status HTTP status (400, 401, 403, 404, 409 or 429).
11
+ * @param reason The machine-readable reason.
12
+ * @param message A sentence for people.
13
+ */
14
+ constructor(status, reason, message) {
15
+ super(message);
16
+ this.name = "LeaderboardError";
17
+ this.status = status;
18
+ this.reason = reason;
19
+ }
20
+ }
@@ -0,0 +1,44 @@
1
+ import type { LeaderboardPlayerRecord } from "./LeaderboardRankStore.js";
2
+ /** Prefix of an anonymous player id. */
3
+ export declare const ANONYMOUS_PLAYER_PREFIX: string;
4
+ /** The prefix of an auth user's player id (D8). */
5
+ export declare const USER_PLAYER_PREFIX: string;
6
+ /** Prefix of a console-added player id (D8). */
7
+ export declare const MANUAL_PLAYER_PREFIX: string;
8
+ /**
9
+ * Creates an anonymous identity: a new player id, its one-time key and the hash the server keeps.
10
+ * @returns The player id, the key to hand out once, and the sha256 hex of its secret.
11
+ */
12
+ export declare function createAnonymousKey(): {
13
+ playerId: string;
14
+ playerKey: string;
15
+ keyHash: string;
16
+ };
17
+ /**
18
+ * Splits a player key on its last ".".
19
+ * @param playerKey The key a client sent.
20
+ * @returns The player id and secret, or null when the key has no "." or an empty part.
21
+ */
22
+ export declare function parsePlayerKey(playerKey: string): {
23
+ playerId: string;
24
+ secret: string;
25
+ } | null;
26
+ /**
27
+ * Whether a secret matches a player's stored hash (constant-time comparison).
28
+ * @param record The player.
29
+ * @param secret The secret from the key.
30
+ * @returns True when the player has a key hash and the secret hashes to it.
31
+ */
32
+ export declare function isPlayerKeyValid(record: LeaderboardPlayerRecord, secret: string): boolean;
33
+ /**
34
+ * The player id of an auth user.
35
+ * @param userId The auth user id.
36
+ * @returns `user:<userId>`.
37
+ */
38
+ export declare function userPlayerId(userId: string): string;
39
+ /**
40
+ * The name a player gets until they choose one.
41
+ * @param playerId The player id.
42
+ * @returns "Player " and the id's last four characters in upper case.
43
+ */
44
+ export declare function defaultDisplayName(playerId: string): string;
@@ -0,0 +1,72 @@
1
+ // Leaderboard player identity (game-server-leaderboards D8): anonymous keys `<playerId>.<secret>` whose secret is kept
2
+ // only as a sha256 hash, auth-user ids, manual ids and default names. General purpose (D2).
3
+ import { createHash, randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
4
+ /** Prefix of an anonymous player id. */
5
+ export const ANONYMOUS_PLAYER_PREFIX = "anon-";
6
+ /** The prefix of an auth user's player id (D8). */
7
+ export const USER_PLAYER_PREFIX = "user:";
8
+ /** Random bytes in an anonymous key's secret. */
9
+ const SECRET_BYTE_LENGTH = 32;
10
+ /** Separator between the player id and the secret in a key. */
11
+ const KEY_SEPARATOR = ".";
12
+ /** Characters of the player id shown in a default name. */
13
+ const DEFAULT_NAME_SUFFIX_LENGTH = 4;
14
+ /** Prefix of a console-added player id (D8). */
15
+ export const MANUAL_PLAYER_PREFIX = "manual-";
16
+ /**
17
+ * Creates an anonymous identity: a new player id, its one-time key and the hash the server keeps.
18
+ * @returns The player id, the key to hand out once, and the sha256 hex of its secret.
19
+ */
20
+ export function createAnonymousKey() {
21
+ const playerId = ANONYMOUS_PLAYER_PREFIX + randomUUID();
22
+ const secret = randomBytes(SECRET_BYTE_LENGTH).toString("base64url");
23
+ return { playerId: playerId, playerKey: playerId + KEY_SEPARATOR + secret, keyHash: hashSecret(secret) };
24
+ }
25
+ /**
26
+ * Splits a player key on its last ".".
27
+ * @param playerKey The key a client sent.
28
+ * @returns The player id and secret, or null when the key has no "." or an empty part.
29
+ */
30
+ export function parsePlayerKey(playerKey) {
31
+ const separatorIndex = playerKey.lastIndexOf(KEY_SEPARATOR);
32
+ if (separatorIndex <= 0 || separatorIndex === playerKey.length - 1)
33
+ return null;
34
+ return { playerId: playerKey.slice(0, separatorIndex), secret: playerKey.slice(separatorIndex + 1) };
35
+ }
36
+ /**
37
+ * Whether a secret matches a player's stored hash (constant-time comparison).
38
+ * @param record The player.
39
+ * @param secret The secret from the key.
40
+ * @returns True when the player has a key hash and the secret hashes to it.
41
+ */
42
+ export function isPlayerKeyValid(record, secret) {
43
+ if (record.keyHash == null)
44
+ return false;
45
+ const expected = Buffer.from(record.keyHash, "hex");
46
+ const actual = Buffer.from(hashSecret(secret), "hex");
47
+ return expected.length === actual.length && timingSafeEqual(expected, actual);
48
+ }
49
+ /**
50
+ * The player id of an auth user.
51
+ * @param userId The auth user id.
52
+ * @returns `user:<userId>`.
53
+ */
54
+ export function userPlayerId(userId) {
55
+ return USER_PLAYER_PREFIX + userId;
56
+ }
57
+ /**
58
+ * The name a player gets until they choose one.
59
+ * @param playerId The player id.
60
+ * @returns "Player " and the id's last four characters in upper case.
61
+ */
62
+ export function defaultDisplayName(playerId) {
63
+ return "Player " + playerId.slice(-DEFAULT_NAME_SUFFIX_LENGTH).toUpperCase();
64
+ }
65
+ /**
66
+ * The sha256 hex of a key secret.
67
+ * @param secret The secret.
68
+ * @returns The hash.
69
+ */
70
+ function hashSecret(secret) {
71
+ return createHash("sha256").update(secret).digest("hex");
72
+ }
@@ -0,0 +1,17 @@
1
+ import { type Endpoint } from "colyseus";
2
+ import type { GameServerStateValues } from "../GameServerState.js";
3
+ import type { LeaderboardService } from "./LeaderboardService.js";
4
+ /**
5
+ * The public leaderboard endpoint for createRouter.
6
+ * @param service The leaderboard service.
7
+ * @param state The server state (config, verifier, bans, metrics).
8
+ * @returns The endpoint, keyed by name.
9
+ */
10
+ export declare function createLeaderboardRoutes(service: LeaderboardService, state: GameServerStateValues): Record<string, Endpoint>;
11
+ /**
12
+ * Reads a POST body as a JSON object, at most LEADERBOARD_MAX_BODY_BYTES.
13
+ * @param request The Fetch request.
14
+ * @returns The object ({} for an empty body).
15
+ * @throws LeaderboardError 400 invalidRequest when too large, not JSON or not an object.
16
+ */
17
+ export declare function readJsonBody(request: Request): Promise<Record<string, unknown>>;