@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.
- package/README.md +37 -4
- package/dist/demo.d.ts.map +1 -1
- package/dist/demo.js +2 -0
- package/dist/demo.js.map +1 -1
- package/dist/economy.d.ts +9 -0
- package/dist/economy.d.ts.map +1 -1
- package/dist/economy.js +1 -1
- package/dist/economy.js.map +1 -1
- package/dist/game-registry.d.ts.map +1 -1
- package/dist/game-registry.js +4 -1
- package/dist/game-registry.js.map +1 -1
- package/dist/game-server-awards.d.ts +37 -0
- package/dist/game-server-awards.d.ts.map +1 -1
- package/dist/game-server-awards.js +49 -0
- package/dist/game-server-awards.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/player-join-tickets.d.ts +29 -0
- package/dist/player-join-tickets.d.ts.map +1 -0
- package/dist/player-join-tickets.js +112 -0
- package/dist/player-join-tickets.js.map +1 -0
- package/dist/registry.d.ts +5 -9
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +24 -4
- package/dist/registry.js.map +1 -1
- package/dist/room.d.ts +4 -3
- package/dist/room.d.ts.map +1 -1
- package/dist/room.js +27 -11
- package/dist/room.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +91 -13
- package/dist/server.js.map +1 -1
- package/dist/sessions.d.ts +2 -0
- package/dist/sessions.d.ts.map +1 -1
- package/dist/sessions.js +4 -0
- package/dist/sessions.js.map +1 -1
- package/dist/store.d.ts +1 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +14 -0
- package/dist/store.js.map +1 -1
- package/package.json +2 -2
- package/src/demo.ts +2 -0
- package/src/economy.ts +10 -1
- package/src/game-registry.ts +10 -2
- package/src/game-server-awards.ts +86 -0
- package/src/index.ts +5 -0
- package/src/player-join-tickets.ts +151 -0
- package/src/registry.ts +34 -10
- package/src/room.ts +31 -11
- package/src/server.ts +105 -14
- package/src/sessions.ts +5 -0
- 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 {
|
|
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
|
-
|
|
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.
|
|
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
|
|
package/dist/demo.d.ts.map
CHANGED
|
@@ -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,
|
|
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":"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"}
|
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;
|
package/dist/economy.d.ts.map
CHANGED
|
@@ -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;
|
|
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.
|
package/dist/economy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"economy.js","sourceRoot":"","sources":["../src/economy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,oBAAoB;AACpB,MAAM,WAAW,GAAG,oBAA0B,CAAC;
|
|
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,
|
|
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"}
|
package/dist/game-registry.js
CHANGED
|
@@ -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:
|
|
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":"AAAA,OAAO,OAAO,EAAE,EAAwB,MAAM,SAAS,CAAC;AACxD,OAAO,IAAI,MAAM,eAAe,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAUvB,MAAM,YAAY,GAAG,CAAC,KAAa,EAAiB,EAAE;IACpD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CACpB,OAA6E,EAC7E,KAAa,EACb,EAAE;IACF,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,EAAE,EAAE,EAAE,KAAc,EAAE,MAAM,EAAE,GAAY,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC;IACxG,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAA2C,CAAC;IAC1F,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACzC,OAAO,OAAO,KAAK,IAAI;QACrB,CAAC,CAAC,EAAE,EAAE,EAAE,KAAc,EAAE,MAAM,EAAE,GAAY,EAAE,OAAO,EAAE,wBAAwB,EAAE;QACjF,CAAC,CAAC,EAAE,EAAE,EAAE,IAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3C,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC7D,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,UAAU,CAAC,sDAAsD,CAAC,CAAC;IAClH,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1C,KAAK,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAEnF,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACxD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAA2C,CAAC;QAC1F,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAChF,OAAO,YAAY,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,gCAAgC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACjE,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,
|
|
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;
|
|
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":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,UAAU,GAAG,qCAAqC,CAAC;
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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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"}
|
package/dist/registry.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Pool } from 'pg';
|
|
2
|
-
import type
|
|
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
|
|
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.
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|