@flayerlabs/gamemode-gate 0.2.0 → 0.3.1

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 (55) hide show
  1. package/README.md +37 -4
  2. package/dist/demo.d.ts.map +1 -1
  3. package/dist/demo.js +2 -0
  4. package/dist/demo.js.map +1 -1
  5. package/dist/economy.d.ts +9 -0
  6. package/dist/economy.d.ts.map +1 -1
  7. package/dist/economy.js +1 -1
  8. package/dist/economy.js.map +1 -1
  9. package/dist/game-registry.d.ts.map +1 -1
  10. package/dist/game-registry.js +4 -1
  11. package/dist/game-registry.js.map +1 -1
  12. package/dist/game-server-awards.d.ts +37 -0
  13. package/dist/game-server-awards.d.ts.map +1 -1
  14. package/dist/game-server-awards.js +49 -0
  15. package/dist/game-server-awards.js.map +1 -1
  16. package/dist/index.d.ts +3 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +1 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/player-join-tickets.d.ts +29 -0
  21. package/dist/player-join-tickets.d.ts.map +1 -0
  22. package/dist/player-join-tickets.js +112 -0
  23. package/dist/player-join-tickets.js.map +1 -0
  24. package/dist/registry.d.ts +5 -9
  25. package/dist/registry.d.ts.map +1 -1
  26. package/dist/registry.js +24 -4
  27. package/dist/registry.js.map +1 -1
  28. package/dist/room.d.ts +4 -3
  29. package/dist/room.d.ts.map +1 -1
  30. package/dist/room.js +27 -11
  31. package/dist/room.js.map +1 -1
  32. package/dist/server.d.ts +2 -0
  33. package/dist/server.d.ts.map +1 -1
  34. package/dist/server.js +91 -13
  35. package/dist/server.js.map +1 -1
  36. package/dist/sessions.d.ts +2 -0
  37. package/dist/sessions.d.ts.map +1 -1
  38. package/dist/sessions.js +4 -0
  39. package/dist/sessions.js.map +1 -1
  40. package/dist/store.d.ts +1 -1
  41. package/dist/store.d.ts.map +1 -1
  42. package/dist/store.js +14 -0
  43. package/dist/store.js.map +1 -1
  44. package/package.json +2 -2
  45. package/src/demo.ts +2 -0
  46. package/src/economy.ts +10 -1
  47. package/src/game-registry.ts +10 -2
  48. package/src/game-server-awards.ts +86 -0
  49. package/src/index.ts +5 -0
  50. package/src/player-join-tickets.ts +151 -0
  51. package/src/registry.ts +34 -10
  52. package/src/room.ts +31 -11
  53. package/src/server.ts +105 -14
  54. package/src/sessions.ts +5 -0
  55. package/src/store.ts +14 -0
package/README.md CHANGED
@@ -76,7 +76,10 @@ before deploying a gate.
76
76
  Use `createGameServerGate()` when your server already owns gameplay and scoring:
77
77
 
78
78
  ```ts
79
- import { createGameServerGate } from '@flayerlabs/gamemode-gate'
79
+ import {
80
+ createGameServerGate,
81
+ verifyPlayerJoinTicket,
82
+ } from '@flayerlabs/gamemode-gate'
80
83
 
81
84
  const awardToken = process.env.AWARD_TOKEN
82
85
  if (!awardToken || awardToken.length < 32) {
@@ -98,18 +101,48 @@ const app = createGameServerGate({
98
101
  })
99
102
  ```
100
103
 
101
- The award token must contain at least 32 characters. Keep it on your game server. Never send it to
102
- the browser.
104
+ Generate a random 256-bit award token, for example with `openssl rand -hex 32`. Keep it on the gate
105
+ and authoritative game server. Never send it to the browser or use a memorable value.
103
106
 
104
107
  Use a stable, distinct `gameId` for each game. It scopes durable rounds and awards when games share
105
108
  a PostgreSQL database.
106
109
 
110
+ The browser calls `joinTicket()` after it joins the economy and sends the opaque result as its first
111
+ game-server socket message. Verify it before accepting gameplay:
112
+
113
+ ```ts
114
+ const playerJoin = verifyPlayerJoinTicket(message.ticket, {
115
+ awardToken,
116
+ gameId: 'my-game',
117
+ roundId,
118
+ audience: 'https://gate.example',
119
+ })
120
+
121
+ if (!playerJoin || usedTicketIds.has(playerJoin.jti)) {
122
+ socket.close(4401, 'invalid join ticket')
123
+ return
124
+ }
125
+ usedTicketIds.add(playerJoin.jti)
126
+ ```
127
+
128
+ The default audience is the gate origin. This works when a reverse proxy serves the game WebSocket
129
+ from a path on that origin. For a separate origin, pass the same reviewed `gameServerOrigins` list
130
+ to `createGameServerGate()` and the platform registration, then use that exact origin as the ticket
131
+ audience. A ticket is short lived; also reject replays and supersede an earlier connection for the
132
+ same `playerJoin.player`.
133
+
107
134
  Your server adds points with `POST /internal/rounds/:id/awards`. The gate checks the token, event
108
135
  ID, wallet, round window and per-player limit before it changes the ledger. It also makes identical
109
136
  retries safe.
110
137
 
138
+ `GET /internal/rounds/:id/players/:player` reports what one wallet has earned and how much more it
139
+ may earn, so your server can refuse a seat before the player takes one. That read is advisory; the
140
+ award route still enforces the ceiling.
141
+
111
142
  Use the [external game-server steps](https://github.com/flayerlabs/gamemode-sdk/blob/main/docs/guides/run-a-gate.md#connect-an-existing-game-server)
112
- for the request format, responses and deployment checks. Do not call the ledger or signer directly.
143
+ for the request format, responses and deployment checks. The
144
+ [runnable external-server example](https://github.com/flayerlabs/gamemode-sdk/tree/main/examples/external-server)
145
+ shows the complete browser, WebSocket and award flow. Do not call the ledger or signer directly.
113
146
 
114
147
  ## Run the central game registry
115
148
 
@@ -1 +1 @@
1
- {"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AA+B5D,MAAM,WAAW,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;IAC/E,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0FAA0F;IAC1F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,eAAe,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,aAAa,EAAE,KAAK,MAAM,EAAE,CAAC;IAC7B,wFAAwF;IACxF,SAAS,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;CACf;AAID;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EACvF,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,GACzE,OAAO,CAAC,IAAI,CAAC,CA+Ef"}
1
+ {"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AA+B5D,MAAM,WAAW,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;IAC/E,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0FAA0F;IAC1F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,eAAe,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,aAAa,EAAE,KAAK,MAAM,EAAE,CAAC;IAC7B,wFAAwF;IACxF,SAAS,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;CACf;AAID;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EACvF,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,GACzE,OAAO,CAAC,IAAI,CAAC,CAiFf"}
package/dist/demo.js CHANGED
@@ -59,6 +59,8 @@ export async function createDemoGate(options) {
59
59
  seed: Math.floor(Math.random() * 1_000_000),
60
60
  window: { opensAt, closesAt: opensAt + roundMs },
61
61
  weiPerPoint: economy.economy.weiPerPoint,
62
+ pointsPerDollar: economy.economy.pointsPerDollar,
63
+ usdPerEth: economy.economy.usdPerEth,
62
64
  walletCapWei,
63
65
  maxPointsPerPlayer,
64
66
  scoreAuthority: 'rules',
package/dist/demo.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"demo.js","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C;;;;;;;;;;;;;GAaG;AAEH,wFAAwF;AACxF,MAAM,gBAAgB,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAW,CAAC;AACzD,MAAM,eAAe,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAW,CAAC;AACxD,MAAM,YAAY,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAW,CAAC;AACrD,MAAM,eAAe,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAW,CAAC;AA8BxD,MAAM,GAAG,GAAG,oBAA0B,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA0E;IAE1E,MAAM,EACJ,IAAI,EACJ,MAAM,EACN,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,uDAAuD,EACjG,OAAO,GAAG,KAAK,EACf,OAAO,GAAG,EAAE,GAAG,MAAM,EACrB,YAAY,GAAG,GAAG,GAAG,GAAG,EACxB,eAAe,GAAG,GAAG,EACrB,SAAS,GAAG,KAAK,EACjB,OAAO,GAAG,KAAK,EACf,UAAU,GAAG,uBAAuB,GACrC,GAAG,OAAO,CAAC;IAEZ,6FAA6F;IAC7F,kEAAkE;IAClE,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC;IACxE,MAAM,OAAO,GAAG,cAAc,CAAC;QAC7B,kBAAkB;QAClB,YAAY;QACZ,eAAe;QACf,SAAS;KACV,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,+BAA+B,OAAO,CAAC,OAAO,SAAS,OAAO,CAAC,wBAAwB,qBAAqB,CAC7G,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5D,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,0FAA0F;IAC1F,MAAM,IAAI,CAAC,KAAK,CAAC,kCAAkC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEhE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IACrC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE;QAC5B,EAAE,EAAE,OAAO;QACX,MAAM;QACN,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3C,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,EAAE;QAChD,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW;QACxC,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,eAAe;QAChD,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS;QACpC,YAAY;QACZ,kBAAkB;QAClB,cAAc,EAAE,OAAO;QACvB,MAAM,EAAE,YAAY;KACrB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,UAAU,CAAC;QACrB,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,eAAe;QACf,SAAS;QACT,QAAQ,EAAE,IAAI,QAAQ,CACpB,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,wCAAwC,EACtE,WAAW,EACX,UAAU,CACX;QACD,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,aAAa,CAAC,gBAAgB,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;QACtG,yFAAyF;QACzF,cAAc,EAAE,IAA2B;KAC5C,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACpD,MAAM,SAAS,GAA0C,EAAE,CAAC;IAE5D,+FAA+F;IAC/F,0FAA0F;IAC1F,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC5D,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/C,SAAS,EAAE,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,OAAO,EAAG,OAAO,CAAC,IAA4B,CAAC,OAAO,EAAE,CAAC;KAChG,CAAC,CAAC,CAAC;IACJ,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,EAAE;QACtC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAA+B,CAAC;QAChE,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACnF,CAAC"}
package/dist/economy.d.ts CHANGED
@@ -22,6 +22,15 @@ export interface Economy {
22
22
  weiPerPoint: bigint;
23
23
  /** What a flawless round pays. Always at or under `walletCapWei`, or this would not exist. */
24
24
  maxPayoutWei: bigint;
25
+ /**
26
+ * The two inputs, returned beside the rate they produced.
27
+ *
28
+ * They travel together so a caller cannot persist a rate from one calculation and a dollar
29
+ * figure from another. Both are process-wide settings, so the only place they are true of a
30
+ * particular round is the moment that round's rate was fixed.
31
+ */
32
+ pointsPerDollar: number;
33
+ usdPerEth: number;
25
34
  }
26
35
  export type EconomyResult = {
27
36
  ok: true;
@@ -1 +1 @@
1
- {"version":3,"file":"economy.d.ts","sourceRoot":"","sources":["../src/economy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,MAAM,WAAW,YAAY;IAC3B,oFAAoF;IACpF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sFAAsF;IACtF,YAAY,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,8FAA8F;IAC9F,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,wBAAwB,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAwDjE"}
1
+ {"version":3,"file":"economy.d.ts","sourceRoot":"","sources":["../src/economy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,MAAM,WAAW,YAAY;IAC3B,oFAAoF;IACpF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sFAAsF;IACtF,YAAY,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,8FAA8F;IAC9F,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,wBAAwB,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAwDjE"}
package/dist/economy.js CHANGED
@@ -72,7 +72,7 @@ export function resolveEconomy(input) {
72
72
  suggestedPointsPerDollar: minimumPointsPerDollar(input),
73
73
  };
74
74
  }
75
- return { ok: true, economy: { weiPerPoint, maxPayoutWei } };
75
+ return { ok: true, economy: { weiPerPoint, maxPayoutWei, pointsPerDollar, usdPerEth } };
76
76
  }
77
77
  /**
78
78
  * The smallest `pointsPerDollar` that keeps a flawless round inside the cap.
@@ -1 +1 @@
1
- {"version":3,"file":"economy.js","sourceRoot":"","sources":["../src/economy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"economy.js","sourceRoot":"","sources":["../src/economy.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"game-registry.d.ts","sourceRoot":"","sources":["../src/game-registry.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAExD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAW/B,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,IAAI,CAAC;IACX,4EAA4E;IAC5E,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;CACrB;AAsBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,eAAe,CAqDhF"}
1
+ {"version":3,"file":"game-registry.d.ts","sourceRoot":"","sources":["../src/game-registry.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAExD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAW/B,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,IAAI,CAAC;IACX,4EAA4E;IAC5E,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;CACrB;AAsBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,eAAe,CA6DhF"}
@@ -28,7 +28,7 @@ const internalRoute = (request, token) => {
28
28
  export function createGameRegistry(options) {
29
29
  if (options.writerToken.length < 32)
30
30
  throw new RangeError('registry writer token must be at least 32 characters');
31
- const app = Fastify({ bodyLimit: 1_024 });
31
+ const app = Fastify({ bodyLimit: 2_048 });
32
32
  void app.register(cors, { origin: [...options.allowedOrigins], methods: ['GET'] });
33
33
  app.get('/games/:chainId/:coin', async (request, reply) => {
34
34
  const { chainId: rawChainId, coin } = request.params;
@@ -54,6 +54,9 @@ export function createGameRegistry(options) {
54
54
  gameId: body.gameId,
55
55
  gateOrigin: body.gateOrigin,
56
56
  deployId: body.deployId,
57
+ ...(body.gameServerOrigins === undefined
58
+ ? {}
59
+ : { gameServerOrigins: body.gameServerOrigins }),
57
60
  });
58
61
  return reply.send(registration);
59
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"game-registry.js","sourceRoot":"","sources":["../src/game-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"game-registry.js","sourceRoot":"","sources":["../src/game-registry.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,30 @@ export type GameServerAwardResult = {
20
20
  ok: false;
21
21
  refuse: GameServerAwardRefusal;
22
22
  };
23
+ /** What one wallet has earned in a round, and how much more it is allowed to earn. */
24
+ export interface GameServerPlayerStanding {
25
+ roundId: string;
26
+ player: PlayerId;
27
+ /** This wallet's current round total, the same number an award receipt reports. */
28
+ totalPoints: number;
29
+ maxPointsPerPlayer: number;
30
+ /** `maxPointsPerPlayer` minus `totalPoints`, never below zero. */
31
+ remainingPoints: number;
32
+ }
33
+ /**
34
+ * A read cannot fail for a reason that only applies to a write, so it cannot return one.
35
+ *
36
+ * Extracted from the award vocabulary rather than restated beside it: the codes a game server
37
+ * switches on stay one list, and this read can only ever narrow that list, never extend it.
38
+ */
39
+ export type GameServerPlayerRefusal = Extract<GameServerAwardRefusal, 'award.invalid' | 'award.no_such_round' | 'award.wrong_authority'>;
40
+ export type GameServerPlayerResult = {
41
+ ok: true;
42
+ standing: GameServerPlayerStanding;
43
+ } | {
44
+ ok: false;
45
+ refuse: GameServerPlayerRefusal;
46
+ };
23
47
  interface GameServerAwardInput extends GameServerAwardRequest {
24
48
  roundId: string;
25
49
  }
@@ -34,6 +58,19 @@ export declare class GameServerAwards {
34
58
  private readonly gameId;
35
59
  constructor(pool: Pool, gameId: string);
36
60
  record(candidate: GameServerAwardInput): Promise<GameServerAwardResult>;
61
+ /**
62
+ * What this wallet has earned so far, and how much more it may earn.
63
+ *
64
+ * Advisory. It takes no lock, so a concurrent award can move it between this answer and the next
65
+ * request; {@link record} remains the only arbiter of the ceiling, and a caller must still handle
66
+ * `award.limit_exceeded`. It lives here rather than in the route because it reads the same two
67
+ * tables under the same game scope as `record`, and a second copy of that scoping in the
68
+ * transport layer is how one of them ends up missing.
69
+ */
70
+ pointsFor(query: {
71
+ roundId: string;
72
+ player: PlayerId;
73
+ }): Promise<GameServerPlayerResult>;
37
74
  }
38
75
  export {};
39
76
  //# sourceMappingURL=game-server-awards.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"game-server-awards.d.ts","sourceRoot":"","sources":["../src/game-server-awards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAK1D,gEAAgE;AAChE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,0EAA0E;AAC1E,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,sBAAsB,GAC9B,eAAe,GACf,qBAAqB,GACrB,uBAAuB,GACvB,oBAAoB,GACpB,qBAAqB,GACrB,sBAAsB,GACtB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,qBAAqB,GAC7B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,sBAAsB,CAAA;CAAE,GAC7D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAElD,UAAU,oBAAqB,SAAQ,sBAAsB;IAC3D,OAAO,EAAE,MAAM,CAAC;CACjB;AAoCD;;;;;GAKG;AACH,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM;IAG3B,MAAM,CAAC,SAAS,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAmH9E"}
1
+ {"version":3,"file":"game-server-awards.d.ts","sourceRoot":"","sources":["../src/game-server-awards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAK1D,gEAAgE;AAChE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,0EAA0E;AAC1E,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,sBAAsB,GAC9B,eAAe,GACf,qBAAqB,GACrB,uBAAuB,GACvB,oBAAoB,GACpB,qBAAqB,GACrB,sBAAsB,GACtB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,qBAAqB,GAC7B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,sBAAsB,CAAA;CAAE,GAC7D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAElD,sFAAsF;AACtF,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,CAAC;IACjB,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG,OAAO,CAC3C,sBAAsB,EACtB,eAAe,GAAG,qBAAqB,GAAG,uBAAuB,CAClE,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,wBAAwB,CAAA;CAAE,GAChD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,uBAAuB,CAAA;CAAE,CAAC;AAEnD,UAAU,oBAAqB,SAAQ,sBAAsB;IAC3D,OAAO,EAAE,MAAM,CAAC;CACjB;AAoCD;;;;;GAKG;AACH,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM;IAG3B,MAAM,CAAC,SAAS,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAoH7E;;;;;;;;OAQG;IACG,SAAS,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAkD/F"}
@@ -119,5 +119,54 @@ export class GameServerAwards {
119
119
  throw error;
120
120
  }
121
121
  }
122
+ /**
123
+ * What this wallet has earned so far, and how much more it may earn.
124
+ *
125
+ * Advisory. It takes no lock, so a concurrent award can move it between this answer and the next
126
+ * request; {@link record} remains the only arbiter of the ceiling, and a caller must still handle
127
+ * `award.limit_exceeded`. It lives here rather than in the route because it reads the same two
128
+ * tables under the same game scope as `record`, and a second copy of that scoping in the
129
+ * transport layer is how one of them ends up missing.
130
+ */
131
+ async pointsFor(query) {
132
+ if (!query ||
133
+ typeof query.roundId !== 'string' ||
134
+ !IDENTIFIER.test(query.roundId) ||
135
+ typeof query.player !== 'string' ||
136
+ !isAddress(query.player, { strict: false })) {
137
+ return { ok: false, refuse: 'award.invalid' };
138
+ }
139
+ // Balances are keyed by the lower-cased wallet, exactly as `record` writes them. Reading with a
140
+ // checksummed address instead would quietly answer zero for a player who has already scored.
141
+ const player = query.player.toLowerCase();
142
+ // Scoped by game in the `where`, so another game's round reads as no such round rather than as
143
+ // an empty standing — the same answer `record` gives, in one round trip instead of two.
144
+ const result = await this.pool.query(`select rounds.max_points_per_player::text,
145
+ rounds.score_authority,
146
+ coalesce(balances.points, 0)::text as points
147
+ from rounds
148
+ left join balances on balances.round_id = rounds.id and balances.player = $2
149
+ where rounds.id = $1 and rounds.game_id = $3`, [query.roundId, player, this.gameId]);
150
+ const round = result.rows[0];
151
+ if (!round)
152
+ return { ok: false, refuse: 'award.no_such_round' };
153
+ if (round.score_authority !== 'external-server') {
154
+ return { ok: false, refuse: 'award.wrong_authority' };
155
+ }
156
+ // Safe as numbers because the ceiling is a safe integer at round creation and the award path
157
+ // never lets a balance pass it.
158
+ const maxPointsPerPlayer = Number(round.max_points_per_player);
159
+ const totalPoints = Number(round.points);
160
+ return {
161
+ ok: true,
162
+ standing: {
163
+ roundId: query.roundId,
164
+ player,
165
+ totalPoints,
166
+ maxPointsPerPlayer,
167
+ remainingPoints: Math.max(0, maxPointsPerPlayer - totalPoints),
168
+ },
169
+ };
170
+ }
122
171
  }
123
172
  //# sourceMappingURL=game-server-awards.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"game-server-awards.js","sourceRoot":"","sources":["../src/game-server-awards.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"game-server-awards.js","sourceRoot":"","sources":["../src/game-server-awards.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -20,5 +20,7 @@ export { InvalidRegistration, RegistrationConflict, checkRegistration, disableGa
20
20
  export type { Registration, SecurityProfile } from './registry.js';
21
21
  export { createGameRegistry } from './game-registry.js';
22
22
  export type { GameRegistryOptions } from './game-registry.js';
23
- export type { GameServerAwardReceipt, GameServerAwardRefusal, GameServerAwardRequest, } from './game-server-awards.js';
23
+ export type { GameServerAwardReceipt, GameServerAwardRefusal, GameServerAwardRequest, GameServerPlayerRefusal, GameServerPlayerResult, GameServerPlayerStanding, } from './game-server-awards.js';
24
+ export { PLAYER_JOIN_TICKET_TTL_MS, verifyPlayerJoinTicket } from './player-join-tickets.js';
25
+ export type { VerifiedPlayerJoin, VerifyPlayerJoinTicketOptions } from './player-join-tickets.js';
24
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,EACL,MAAM,EACN,0BAA0B,EAC1B,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,eAAe,EACf,qBAAqB,EACrB,WAAW,EACX,kBAAkB,EAClB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,YAAY,EACV,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,EACL,MAAM,EACN,0BAA0B,EAC1B,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,eAAe,EACf,qBAAqB,EACrB,WAAW,EACX,kBAAkB,EAClB,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,YAAY,EACV,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7F,YAAY,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -11,4 +11,5 @@ export { migrate } from './store.js';
11
11
  export { createDemoGate } from './demo.js';
12
12
  export { InvalidRegistration, RegistrationConflict, checkRegistration, disableGameRegistration, gateOrigin, pinGameRegistration, resolveGameRegistration, securityProfile, } from './registry.js';
13
13
  export { createGameRegistry } from './game-registry.js';
14
+ export { PLAYER_JOIN_TICKET_TTL_MS, verifyPlayerJoinTicket } from './player-join-tickets.js';
14
15
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,EACL,MAAM,EACN,0BAA0B,EAC1B,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAWrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,EACL,MAAM,EACN,0BAA0B,EAC1B,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAWrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,UAAU,EACV,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAUxD,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { PlayerId } from '@flayerlabs/gamemode-spec';
2
+ import type { PlayerJoinTicket } from '@flayerlabs/gamemode-spec/live';
3
+ export declare const PLAYER_JOIN_TICKET_TTL_MS = 30000;
4
+ export interface VerifiedPlayerJoin {
5
+ player: PlayerId;
6
+ gameId: string;
7
+ roundId: string;
8
+ audience: string;
9
+ issuedAt: number;
10
+ expiresAt: number;
11
+ jti: string;
12
+ }
13
+ export interface VerifyPlayerJoinTicketOptions {
14
+ awardToken: string;
15
+ gameId: string;
16
+ roundId: string;
17
+ audience: string;
18
+ }
19
+ interface IssuePlayerJoinTicketOptions extends VerifyPlayerJoinTicketOptions {
20
+ player: PlayerId;
21
+ closesAt: number;
22
+ now: number;
23
+ }
24
+ /** Internal issuer used by an authenticated external-server gate route. */
25
+ export declare function issuePlayerJoinTicket(options: IssuePlayerJoinTicketOptions): PlayerJoinTicket;
26
+ /** Verify an opaque browser join ticket before binding a socket to its wallet. */
27
+ export declare function verifyPlayerJoinTicket(ticket: unknown, options: VerifyPlayerJoinTicketOptions): VerifiedPlayerJoin | null;
28
+ export {};
29
+ //# sourceMappingURL=player-join-tickets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-join-tickets.d.ts","sourceRoot":"","sources":["../src/player-join-tickets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAOhD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,4BAA6B,SAAQ,6BAA6B;IAC1E,MAAM,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AA2BD,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,gBAAgB,CAqB7F;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,6BAA6B,GACrC,kBAAkB,GAAG,IAAI,CA8D3B"}
@@ -0,0 +1,112 @@
1
+ import { createHmac, randomUUID, timingSafeEqual } from 'node:crypto';
2
+ import { isAddress } from 'viem';
3
+ export const PLAYER_JOIN_TICKET_TTL_MS = 30_000;
4
+ const DOMAIN = 'flaunch.game-mode/player-join/v1';
5
+ const CLOCK_SKEW_MS = 5_000;
6
+ const MAX_TICKET_LENGTH = 2_048;
7
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
8
+ // The authoritative game server already holds award authority. Domain separation stops a ticket
9
+ // MAC from being usable as an award bearer token while keeping deployment to one server secret.
10
+ const key = (awardToken) => createHmac('sha256', awardToken).update(DOMAIN).digest();
11
+ const mac = (body, awardToken) => createHmac('sha256', key(awardToken)).update(body).digest('base64url');
12
+ function exactOrigin(value) {
13
+ try {
14
+ const parsed = new URL(value);
15
+ return (parsed.protocol === 'https:' || parsed.protocol === 'http:') && parsed.origin === value;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ function matches(body, signature, awardToken) {
22
+ const expected = Buffer.from(mac(body, awardToken));
23
+ const received = Buffer.from(signature);
24
+ return expected.length === received.length && timingSafeEqual(expected, received);
25
+ }
26
+ /** Internal issuer used by an authenticated external-server gate route. */
27
+ export function issuePlayerJoinTicket(options) {
28
+ if (options.awardToken.length < 32)
29
+ throw new RangeError('awardToken must be at least 32 characters');
30
+ const { now } = options;
31
+ if (!Number.isSafeInteger(now))
32
+ throw new RangeError('now must be a safe integer');
33
+ if (!Number.isSafeInteger(options.closesAt) || options.closesAt <= now) {
34
+ throw new RangeError('the round must still be open');
35
+ }
36
+ const expiresAt = Math.min(now + PLAYER_JOIN_TICKET_TTL_MS, options.closesAt);
37
+ const claims = {
38
+ v: 1,
39
+ kind: 'player-join',
40
+ player: options.player.toLowerCase(),
41
+ gameId: options.gameId,
42
+ roundId: options.roundId,
43
+ audience: options.audience,
44
+ issuedAt: now,
45
+ expiresAt,
46
+ jti: randomUUID(),
47
+ };
48
+ const body = Buffer.from(JSON.stringify(claims)).toString('base64url');
49
+ return { ticket: `gmj1.${body}.${mac(body, options.awardToken)}`, expiresAt };
50
+ }
51
+ /** Verify an opaque browser join ticket before binding a socket to its wallet. */
52
+ export function verifyPlayerJoinTicket(ticket, options) {
53
+ if (options.awardToken.length < 32 ||
54
+ typeof ticket !== 'string' ||
55
+ ticket.length === 0 ||
56
+ ticket.length > MAX_TICKET_LENGTH) {
57
+ return null;
58
+ }
59
+ const parts = ticket.split('.');
60
+ if (parts.length !== 3 || parts[0] !== 'gmj1')
61
+ return null;
62
+ const [, body, signature] = parts;
63
+ if (!body || !signature || !matches(body, signature, options.awardToken))
64
+ return null;
65
+ let value;
66
+ try {
67
+ const parsed = JSON.parse(Buffer.from(body, 'base64url').toString());
68
+ if (typeof parsed !== 'object' || parsed === null)
69
+ return null;
70
+ value = parsed;
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ const now = Date.now();
76
+ if (value.v !== 1 ||
77
+ value.kind !== 'player-join' ||
78
+ typeof value.player !== 'string' ||
79
+ !isAddress(value.player, { strict: false }) ||
80
+ value.player !== value.player.toLowerCase() ||
81
+ typeof value.gameId !== 'string' ||
82
+ !ID.test(value.gameId) ||
83
+ typeof value.roundId !== 'string' ||
84
+ !ID.test(value.roundId) ||
85
+ typeof value.audience !== 'string' ||
86
+ !exactOrigin(value.audience) ||
87
+ typeof value.issuedAt !== 'number' ||
88
+ !Number.isSafeInteger(value.issuedAt) ||
89
+ typeof value.expiresAt !== 'number' ||
90
+ !Number.isSafeInteger(value.expiresAt) ||
91
+ typeof value.jti !== 'string' ||
92
+ !ID.test(value.jti) ||
93
+ value.gameId !== options.gameId ||
94
+ value.roundId !== options.roundId ||
95
+ value.audience !== options.audience ||
96
+ value.issuedAt > now + CLOCK_SKEW_MS ||
97
+ value.expiresAt <= now ||
98
+ value.expiresAt <= value.issuedAt ||
99
+ value.expiresAt - value.issuedAt > PLAYER_JOIN_TICKET_TTL_MS) {
100
+ return null;
101
+ }
102
+ return {
103
+ player: value.player,
104
+ gameId: value.gameId,
105
+ roundId: value.roundId,
106
+ audience: value.audience,
107
+ issuedAt: value.issuedAt,
108
+ expiresAt: value.expiresAt,
109
+ jti: value.jti,
110
+ };
111
+ }
112
+ //# sourceMappingURL=player-join-tickets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-join-tickets.js","sourceRoot":"","sources":["../src/player-join-tickets.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { Pool } from 'pg';
2
- import type { GameRegistration } from '@flayerlabs/gamemode-spec/embed';
2
+ import { type GameRegistration, type GameSecurityProfile } from '@flayerlabs/gamemode-spec/embed';
3
3
  /**
4
4
  * Which game a coin plays, and everything the page embedding it needs to know.
5
5
  *
@@ -13,13 +13,7 @@ export type Registration = GameRegistration;
13
13
  * Semantic fields, never CSP text: a policy assembled by string concatenation somewhere else is a
14
14
  * policy someone can inject into.
15
15
  */
16
- export interface SecurityProfile {
17
- kind: 'game';
18
- connect: {
19
- https: string;
20
- wss: string;
21
- };
22
- }
16
+ export type SecurityProfile = GameSecurityProfile;
23
17
  export declare class InvalidRegistration extends Error {
24
18
  constructor(message: string);
25
19
  }
@@ -42,8 +36,10 @@ export declare class RegistrationConflict extends Error {
42
36
  * the hosting service.
43
37
  */
44
38
  export declare function gateOrigin(value: unknown): string;
39
+ /** Validate the reviewed origins a creator-owned authoritative game server may use. */
40
+ export declare function gameServerOrigins(value: unknown): readonly string[];
45
41
  /** The profile for a registration. The websocket address is derived, never supplied separately. */
46
- export declare function securityProfile(registration: Pick<Registration, 'gateOrigin'>): SecurityProfile;
42
+ export declare function securityProfile(registration: Pick<Registration, 'gateOrigin' | 'gameServerOrigins'>): SecurityProfile;
47
43
  export declare function checkRegistration(entry: Registration): Registration;
48
44
  /**
49
45
  * Pin a coin to a game. Repeating the same registration is safe; changing it is not.
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAExE;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC;AAED,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,8EAA8E;AAC9E,qBAAa,oBAAqB,SAAQ,KAAK;;CAK9C;AAmBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CA4BjD;AAED,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,eAAe,CAU/F;AAyBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAWnE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAehG;AAED,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,IAAI,EACV,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA0B9B;AAED,wEAAwE;AACxE,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW/G"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACzB,MAAM,iCAAiC,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAElD,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,8EAA8E;AAC9E,qBAAa,oBAAqB,SAAQ,KAAK;;CAK9C;AAmBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CA4BjD;AAED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAMnE;AAED,mGAAmG;AACnG,wBAAgB,eAAe,CAC7B,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,mBAAmB,CAAC,GACnE,eAAe,CAejB;AAyBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAanE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAkBhG;AAED,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,IAAI,EACV,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA4B9B;AAED,wEAAwE;AACxE,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW/G"}