@flayerlabs/gamemode-gate 0.7.1 → 0.8.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.
- package/DEPLOY.md +6 -1
- package/README.md +4 -2
- package/dist/admission.d.ts +107 -0
- package/dist/admission.d.ts.map +1 -0
- package/dist/admission.js +201 -0
- package/dist/admission.js.map +1 -0
- package/dist/chain/secure.d.ts +17 -0
- package/dist/chain/secure.d.ts.map +1 -1
- package/dist/chain/secure.js +40 -0
- package/dist/chain/secure.js.map +1 -1
- package/dist/index.d.ts +10 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/ip-blocks.d.ts +50 -0
- package/dist/ip-blocks.d.ts.map +1 -0
- package/dist/ip-blocks.js +125 -0
- package/dist/ip-blocks.js.map +1 -0
- package/dist/join-ticket-ledger.d.ts +135 -0
- package/dist/join-ticket-ledger.d.ts.map +1 -0
- package/dist/join-ticket-ledger.js +190 -0
- package/dist/join-ticket-ledger.js.map +1 -0
- package/dist/main.d.ts +16 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +36 -2
- package/dist/main.js.map +1 -1
- package/dist/player-join-tickets.d.ts +10 -0
- package/dist/player-join-tickets.d.ts.map +1 -1
- package/dist/player-join-tickets.js +27 -14
- package/dist/player-join-tickets.js.map +1 -1
- package/dist/server.d.ts +41 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +145 -11
- package/dist/server.js.map +1 -1
- package/dist/store.d.ts +1 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +25 -0
- package/dist/store.js.map +1 -1
- package/dist/turnstile.d.ts +37 -1
- package/dist/turnstile.d.ts.map +1 -1
- package/dist/turnstile.js +82 -2
- package/dist/turnstile.js.map +1 -1
- package/dist/version.js +2 -2
- package/package.json +3 -3
- package/src/admission.ts +273 -0
- package/src/chain/secure.ts +52 -0
- package/src/index.ts +34 -2
- package/src/ip-blocks.ts +154 -0
- package/src/join-ticket-ledger.ts +325 -0
- package/src/main.ts +56 -2
- package/src/player-join-tickets.ts +34 -19
- package/src/server.ts +186 -14
- package/src/store.ts +25 -0
- package/src/turnstile.ts +96 -2
- package/src/version.ts +2 -2
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,9 +20,19 @@ interface IssuePlayerJoinTicketOptions extends VerifyPlayerJoinTicketOptions {
|
|
|
20
20
|
player: PlayerId;
|
|
21
21
|
closesAt: number;
|
|
22
22
|
now: number;
|
|
23
|
+
/** The ticket's unique ID, when the caller has already written it down. Random when omitted. */
|
|
24
|
+
jti?: string;
|
|
23
25
|
}
|
|
24
26
|
/** Internal issuer used by an authenticated external-server gate route. */
|
|
25
27
|
export declare function issuePlayerJoinTicket(options: IssuePlayerJoinTicketOptions): PlayerJoinTicket;
|
|
28
|
+
/**
|
|
29
|
+
* Check a ticket's MAC and shape, and nothing about when or where it is being presented.
|
|
30
|
+
*
|
|
31
|
+
* For the gate's own ledger, which then decides freshness and scope from the row it wrote. A
|
|
32
|
+
* game server must use {@link verifyPlayerJoinTicket}: a ticket that only passes this is authentic,
|
|
33
|
+
* not acceptable.
|
|
34
|
+
*/
|
|
35
|
+
export declare function readPlayerJoinTicket(ticket: unknown, awardToken: string): VerifiedPlayerJoin | null;
|
|
26
36
|
/** Verify an opaque browser join ticket before binding a socket to its wallet. */
|
|
27
37
|
export declare function verifyPlayerJoinTicket(ticket: unknown, options: VerifyPlayerJoinTicketOptions): VerifiedPlayerJoin | null;
|
|
28
38
|
export {};
|
|
@@ -1 +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;
|
|
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;IACZ,gGAAgG;IAChG,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA2BD,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,gBAAgB,CAsB7F;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAmDnG;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,6BAA6B,GACrC,kBAAkB,GAAG,IAAI,CAc3B"}
|
|
@@ -33,6 +33,8 @@ export function issuePlayerJoinTicket(options) {
|
|
|
33
33
|
if (!Number.isSafeInteger(options.closesAt) || options.closesAt <= now) {
|
|
34
34
|
throw new RangeError('the round must still be open');
|
|
35
35
|
}
|
|
36
|
+
if (options.jti !== undefined && !ID.test(options.jti))
|
|
37
|
+
throw new RangeError('jti must be a valid identifier');
|
|
36
38
|
const expiresAt = Math.min(now + PLAYER_JOIN_TICKET_TTL_MS, options.closesAt);
|
|
37
39
|
const claims = {
|
|
38
40
|
v: 1,
|
|
@@ -43,24 +45,27 @@ export function issuePlayerJoinTicket(options) {
|
|
|
43
45
|
audience: options.audience,
|
|
44
46
|
issuedAt: now,
|
|
45
47
|
expiresAt,
|
|
46
|
-
jti: randomUUID(),
|
|
48
|
+
jti: options.jti ?? randomUUID(),
|
|
47
49
|
};
|
|
48
50
|
const body = Buffer.from(JSON.stringify(claims)).toString('base64url');
|
|
49
51
|
return { ticket: `gmj1.${body}.${mac(body, options.awardToken)}`, expiresAt };
|
|
50
52
|
}
|
|
51
|
-
/**
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Check a ticket's MAC and shape, and nothing about when or where it is being presented.
|
|
55
|
+
*
|
|
56
|
+
* For the gate's own ledger, which then decides freshness and scope from the row it wrote. A
|
|
57
|
+
* game server must use {@link verifyPlayerJoinTicket}: a ticket that only passes this is authentic,
|
|
58
|
+
* not acceptable.
|
|
59
|
+
*/
|
|
60
|
+
export function readPlayerJoinTicket(ticket, awardToken) {
|
|
61
|
+
if (awardToken.length < 32 || typeof ticket !== 'string' || ticket.length === 0 || ticket.length > MAX_TICKET_LENGTH) {
|
|
57
62
|
return null;
|
|
58
63
|
}
|
|
59
64
|
const parts = ticket.split('.');
|
|
60
65
|
if (parts.length !== 3 || parts[0] !== 'gmj1')
|
|
61
66
|
return null;
|
|
62
67
|
const [, body, signature] = parts;
|
|
63
|
-
if (!body || !signature || !matches(body, signature,
|
|
68
|
+
if (!body || !signature || !matches(body, signature, awardToken))
|
|
64
69
|
return null;
|
|
65
70
|
let value;
|
|
66
71
|
try {
|
|
@@ -72,7 +77,6 @@ export function verifyPlayerJoinTicket(ticket, options) {
|
|
|
72
77
|
catch {
|
|
73
78
|
return null;
|
|
74
79
|
}
|
|
75
|
-
const now = Date.now();
|
|
76
80
|
if (value.v !== 1 ||
|
|
77
81
|
value.kind !== 'player-join' ||
|
|
78
82
|
typeof value.player !== 'string' ||
|
|
@@ -90,11 +94,6 @@ export function verifyPlayerJoinTicket(ticket, options) {
|
|
|
90
94
|
!Number.isSafeInteger(value.expiresAt) ||
|
|
91
95
|
typeof value.jti !== 'string' ||
|
|
92
96
|
!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
97
|
value.expiresAt <= value.issuedAt ||
|
|
99
98
|
value.expiresAt - value.issuedAt > PLAYER_JOIN_TICKET_TTL_MS) {
|
|
100
99
|
return null;
|
|
@@ -109,4 +108,18 @@ export function verifyPlayerJoinTicket(ticket, options) {
|
|
|
109
108
|
jti: value.jti,
|
|
110
109
|
};
|
|
111
110
|
}
|
|
111
|
+
/** Verify an opaque browser join ticket before binding a socket to its wallet. */
|
|
112
|
+
export function verifyPlayerJoinTicket(ticket, options) {
|
|
113
|
+
const claims = readPlayerJoinTicket(ticket, options.awardToken);
|
|
114
|
+
const now = Date.now();
|
|
115
|
+
if (!claims ||
|
|
116
|
+
claims.gameId !== options.gameId ||
|
|
117
|
+
claims.roundId !== options.roundId ||
|
|
118
|
+
claims.audience !== options.audience ||
|
|
119
|
+
claims.issuedAt > now + CLOCK_SKEW_MS ||
|
|
120
|
+
claims.expiresAt <= now) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
return claims;
|
|
124
|
+
}
|
|
112
125
|
//# sourceMappingURL=player-join-tickets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player-join-tickets.js","sourceRoot":"","sources":["../src/player-join-tickets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAIjC,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD,MAAM,MAAM,GAAG,kCAAkC,CAAC;AAClD,MAAM,aAAa,GAAG,KAAK,CAAC;AAC5B,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAChC,MAAM,EAAE,GAAG,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"player-join-tickets.js","sourceRoot":"","sources":["../src/player-join-tickets.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { Claims } from './claims.js';
|
|
|
8
8
|
import { Sessions } from './sessions.js';
|
|
9
9
|
import type { Discovery, Launch, PoolKey } from './chain/discover.js';
|
|
10
10
|
import type { Settlement } from './settlement.js';
|
|
11
|
+
import { type JoinTicketPolicy } from './join-ticket-ledger.js';
|
|
11
12
|
/**
|
|
12
13
|
* The gate's door.
|
|
13
14
|
*
|
|
@@ -81,6 +82,17 @@ interface GateBaseOptions {
|
|
|
81
82
|
* Omitted, everything is admitted, which is what a laptop and a test want.
|
|
82
83
|
*/
|
|
83
84
|
admit?: Admit;
|
|
85
|
+
/**
|
|
86
|
+
* How many reverse proxies stand between the internet and this process.
|
|
87
|
+
*
|
|
88
|
+
* Zero, the default, reports the socket's own address, which is right only when nothing proxies
|
|
89
|
+
* the gate. Count every address between the player and the process: Railway is two (its public
|
|
90
|
+
* edge, then an internal router), and a CDN in front adds one. Set too low, players share a
|
|
91
|
+
* proxy's address and an IP policy refuses them together. Set too high, a caller chooses their
|
|
92
|
+
* own address with a header. Only safe when the process cannot be reached except through those
|
|
93
|
+
* proxies: a caller who connects directly can forge the whole chain.
|
|
94
|
+
*/
|
|
95
|
+
trustedProxyHops?: number;
|
|
84
96
|
/** The only cosmetic reaction IDs this game may broadcast. Omitted disables reactions. */
|
|
85
97
|
reactionIds?: readonly string[];
|
|
86
98
|
}
|
|
@@ -117,6 +129,8 @@ export interface GameServerGateOptions extends GateBaseOptions {
|
|
|
117
129
|
awardToken: string;
|
|
118
130
|
/** Reviewed HTTPS origins that may receive player join tickets. The gate origin is always allowed. */
|
|
119
131
|
gameServerOrigins?: readonly string[];
|
|
132
|
+
/** How freely one wallet may be issued join tickets. Omitted, only the per-minute default applies. */
|
|
133
|
+
tickets?: JoinTicketPolicy;
|
|
120
134
|
}
|
|
121
135
|
/**
|
|
122
136
|
* How a gate decides which PositionManagers it adopts coins from. One value today; the type exists
|
|
@@ -176,6 +190,22 @@ export interface GateAnnouncement {
|
|
|
176
190
|
publicLaunchesOpen: boolean;
|
|
177
191
|
/** This library has no private-lobby registrar; announced false so no page offers the toggle. */
|
|
178
192
|
privateLaunches: boolean;
|
|
193
|
+
/**
|
|
194
|
+
* What the trusted parent must send as session evidence. Absent means sign-in needs none.
|
|
195
|
+
*
|
|
196
|
+
* Announced because the parent renders the widget, not the gate: without the site key in public
|
|
197
|
+
* config, a gate that verifies Turnstile refuses every sign-in from a page that cannot know to
|
|
198
|
+
* show one.
|
|
199
|
+
*/
|
|
200
|
+
admission?: AdmissionAnnouncement;
|
|
201
|
+
}
|
|
202
|
+
/** The public half of a gate's admission policy. Never carries a secret. */
|
|
203
|
+
export interface AdmissionAnnouncement {
|
|
204
|
+
/** Render a Cloudflare Turnstile widget with this site key and action; send its token as `evidence`. */
|
|
205
|
+
turnstile?: {
|
|
206
|
+
siteKey: string;
|
|
207
|
+
action: string;
|
|
208
|
+
};
|
|
179
209
|
}
|
|
180
210
|
/**
|
|
181
211
|
* What `GET /config` actually serves: the operator's {@link GateAnnouncement} plus the version of
|
|
@@ -187,12 +217,18 @@ export interface ServedGateAnnouncement extends GateAnnouncement {
|
|
|
187
217
|
}
|
|
188
218
|
/** Where an admission check is being made. Enough to tell a sign-in from a spend. */
|
|
189
219
|
export interface AdmissionRequest {
|
|
190
|
-
/**
|
|
191
|
-
|
|
220
|
+
/**
|
|
221
|
+
* `session` on sign-in, `ticket` when a join ticket for an external game server is requested,
|
|
222
|
+
* `action` on gameplay, `claim` when allowance is about to be committed.
|
|
223
|
+
*/
|
|
224
|
+
at: 'session' | 'ticket' | 'action' | 'claim';
|
|
192
225
|
/** Null at `session`, because nobody has proved who they are yet. */
|
|
193
226
|
player: PlayerId | null;
|
|
194
227
|
roundId: string | null;
|
|
195
|
-
/**
|
|
228
|
+
/**
|
|
229
|
+
* The caller's address, so a limiter can key on it. The socket's own unless `trustedProxyHops`
|
|
230
|
+
* says how many proxies to read past; behind a proxy with that left at zero this is the proxy.
|
|
231
|
+
*/
|
|
196
232
|
ip: string | null;
|
|
197
233
|
/** Opaque and operator-defined: a captcha solution, a device token, whatever was sent. */
|
|
198
234
|
evidence: unknown;
|
|
@@ -210,6 +246,8 @@ export type Admission = {
|
|
|
210
246
|
reason: string;
|
|
211
247
|
};
|
|
212
248
|
export type Admit = (request: AdmissionRequest) => Admission | Promise<Admission>;
|
|
249
|
+
/** More hops than any real deployment has; a larger number is a typo, not a topology. */
|
|
250
|
+
export declare const MAX_TRUSTED_PROXY_HOPS = 8;
|
|
213
251
|
/**
|
|
214
252
|
* How long after `closesAt` the books stay open for chain reconciliation.
|
|
215
253
|
*
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,KAAK,eAAe,EAA0C,MAAM,SAAS,CAAC;AAIhG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG/E,OAAO,KAAK,EAKV,UAAU,EAIX,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAuB,MAAM,WAAW,CAAC;AAEtD,OAAO,EAAE,MAAM,EAAmC,MAAM,aAAa,CAAC;AACtE,OAAO,EAAe,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,KAAK,eAAe,EAA0C,MAAM,SAAS,CAAC;AAIhG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG/E,OAAO,KAAK,EAKV,UAAU,EAIX,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAuB,MAAM,WAAW,CAAC;AAEtD,OAAO,EAAE,MAAM,EAAmC,MAAM,aAAa,CAAC;AACtE,OAAO,EAAe,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKlD,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAK7E;;;;;;;;;;GAUG;AAEH,UAAU,eAAe;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,eAAe,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACrF,mEAAmE;IACnE,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,kEAAkE;IAClE,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,cAAc,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACpC;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,MAAM,gBAAgB,CAAC;IAClC,yDAAyD;IACzD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,iCAAiC,EAAE,aAAa,CAAC,CAAC;IACvG;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IACd;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0FAA0F;IAC1F,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,4FAA4F;AAC5F,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AAErF,iGAAiG;AACjG,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,6EAA6E;AAC7E,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC;AACzG,MAAM,MAAM,eAAe,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAElF,MAAM,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,IAAI,eAAe,GAAG;IAChG,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACvE,8FAA8F;IAC9F,MAAM,EAAE,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE7E,mEAAmE;AACnE,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,8FAA8F;IAC9F,MAAM,EAAE,MAAM,CAAC;IACf,kGAAkG;IAClG,kBAAkB,EAAE,MAAM,GAAG,kBAAkB,CAAC;IAChD,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB,sGAAsG;IACtG,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,sGAAsG;IACtG,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE;QACT,eAAe,EAAE,KAAK,MAAM,EAAE,CAAC;QAC/B,oBAAoB,EAAE,KAAK,MAAM,EAAE,CAAC;QACpC,2FAA2F;QAC3F,QAAQ,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,0FAA0F;IAC1F,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IACtB,iGAAiG;IACjG,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;IACvB,qHAAqH;IACrH,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,qGAAqG;IACrG,cAAc,EAAE,cAAc,CAAC;IAC/B;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C;;;;OAIG;IACH,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACpC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iGAAiG;IACjG,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,qBAAqB,CAAC;CACnC;AAED,4EAA4E;AAC5E,MAAM,WAAW,qBAAqB;IACpC,wGAAwG;IACxG,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,8EAA8E;IAC9E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qFAAqF;AACrF,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,EAAE,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC9C,qEAAqE;IACrE,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;OAGG;IACH,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,0FAA0F;IAC1F,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAIlF,yFAAyF;AACzF,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAoDxC;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,QAAa,CAAC;AAmDrD,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAC7E,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,GACzE,eAAe,CAEjB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,eAAe,CA4BpF;AA2lCD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAClC,YAAY,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -14,11 +14,14 @@ import { resolveEconomy } from './economy.js';
|
|
|
14
14
|
import { encodeHookData } from './chain/signer.js';
|
|
15
15
|
import { hasBearerToken } from './bearer.js';
|
|
16
16
|
import { GameServerAwards } from './game-server-awards.js';
|
|
17
|
-
import {
|
|
17
|
+
import { JoinTickets } from './join-ticket-ledger.js';
|
|
18
18
|
import { gameServerOrigins } from './registry.js';
|
|
19
19
|
import { GATE_VERSION } from './version.js';
|
|
20
|
+
import { IpBlocks } from './ip-blocks.js';
|
|
20
21
|
const ADMIT_ALL = () => ({ ok: true });
|
|
21
|
-
/**
|
|
22
|
+
/** More hops than any real deployment has; a larger number is a typo, not a topology. */
|
|
23
|
+
export const MAX_TRUSTED_PROXY_HOPS = 8;
|
|
24
|
+
/** Fastify resolves this through `trustProxy`, which `trustedProxyHops` sets. */
|
|
22
25
|
const ipOf = (request) => request.ip || null;
|
|
23
26
|
/** Bigint has no JSON form, so terms cross as decimal strings, exactly as the economy balance does. */
|
|
24
27
|
const wireTerms = (terms) => ({
|
|
@@ -105,12 +108,34 @@ export function createGameServerGate(options) {
|
|
|
105
108
|
? async (launch) => ({ maxPointsPerPlayer: await maximum(launch) })
|
|
106
109
|
: { maxPointsPerPlayer: maximum };
|
|
107
110
|
const ticketAudiences = new Set([options.sessions.origin, ...gameServerOrigins(options.gameServerOrigins, MAX_GAME_SERVER_ORIGINS)]);
|
|
108
|
-
const { gameId, maxPointsPerPlayer: _maximum, awardToken, gameServerOrigins: _origins, ...base } = options;
|
|
109
|
-
return createGateRuntime({ ...base, game: gameServerModule(gameId), config }, 'external-server', {
|
|
111
|
+
const { gameId, maxPointsPerPlayer: _maximum, awardToken, gameServerOrigins: _origins, tickets, ...base } = options;
|
|
112
|
+
return createGateRuntime({ ...base, game: gameServerModule(gameId), config }, 'external-server', {
|
|
113
|
+
token: awardToken,
|
|
114
|
+
awards: new GameServerAwards(options.pool, gameId),
|
|
115
|
+
tickets: new JoinTickets(options.pool, gameId, tickets),
|
|
116
|
+
ticketAudiences,
|
|
117
|
+
});
|
|
110
118
|
}
|
|
111
119
|
function createGateRuntime(options, scoreAuthority, awardEndpoint) {
|
|
112
120
|
const { pool, game, sessions, claims, discovery, settlement } = options;
|
|
113
|
-
const
|
|
121
|
+
const operatorAdmit = options.admit ?? ADMIT_ALL;
|
|
122
|
+
const ipBlocks = new IpBlocks(pool);
|
|
123
|
+
const startedAt = Date.now();
|
|
124
|
+
const refused = { session: 0, ticket: 0, action: 0, claim: 0 };
|
|
125
|
+
/**
|
|
126
|
+
* The block list first, then the operator's policy, and every refusal counted.
|
|
127
|
+
*
|
|
128
|
+
* The block list is the gate's own because its record is the gate's own table. It is consulted
|
|
129
|
+
* before the operator's policy so a blocked caller costs no Turnstile check and no rate budget.
|
|
130
|
+
*/
|
|
131
|
+
const admit = async (request) => {
|
|
132
|
+
const admission = (await ipBlocks.blocks(request.ip))
|
|
133
|
+
? { ok: false, reason: 'you cannot play from this network' }
|
|
134
|
+
: await operatorAdmit(request);
|
|
135
|
+
if (!admission.ok)
|
|
136
|
+
refused[request.at] += 1;
|
|
137
|
+
return admission;
|
|
138
|
+
};
|
|
114
139
|
// Rules config is persisted as JSON, so a function here can only be the documented factory.
|
|
115
140
|
const configIsFactory = typeof options.config === 'function';
|
|
116
141
|
const allowedReactions = new Set(options.reactionIds ?? []);
|
|
@@ -121,8 +146,20 @@ function createGateRuntime(options, scoreAuthority, awardEndpoint) {
|
|
|
121
146
|
if (!Number.isSafeInteger(settlementTailMs) || settlementTailMs <= 0) {
|
|
122
147
|
throw new RangeError('settlementTailMs must be a positive number of milliseconds');
|
|
123
148
|
}
|
|
149
|
+
const trustedProxyHops = options.trustedProxyHops ?? 0;
|
|
150
|
+
if (!Number.isSafeInteger(trustedProxyHops) || trustedProxyHops < 0 || trustedProxyHops > MAX_TRUSTED_PROXY_HOPS) {
|
|
151
|
+
throw new RangeError(`trustedProxyHops must be an integer from 0 to ${MAX_TRUSTED_PROXY_HOPS}`);
|
|
152
|
+
}
|
|
124
153
|
// A body limit costs nothing and is the cheapest protection against an endpoint that parses.
|
|
125
|
-
const app = Fastify({
|
|
154
|
+
const app = Fastify({
|
|
155
|
+
logger: process.env.GATE_LOG === '1',
|
|
156
|
+
bodyLimit: 64 * 1024,
|
|
157
|
+
// A hop count, never `true`: trusting every forwarded header lets a caller name their own address.
|
|
158
|
+
// Passed as a function because Fastify refuses a bare number (from 5.12 it trusts nothing for
|
|
159
|
+
// one), on the grounds that a hop count cannot tell a proxy from a direct caller. That holds
|
|
160
|
+
// here too, and is why the option is documented as safe only behind the proxies it counts.
|
|
161
|
+
...(trustedProxyHops > 0 ? { trustProxy: (_address, hop) => hop < trustedProxyHops } : {}),
|
|
162
|
+
});
|
|
126
163
|
const rooms = new Map();
|
|
127
164
|
const watchers = new Map();
|
|
128
165
|
const activePlayerSockets = new Map();
|
|
@@ -372,6 +409,9 @@ function createGateRuntime(options, scoreAuthority, awardEndpoint) {
|
|
|
372
409
|
total: row.total,
|
|
373
410
|
})),
|
|
374
411
|
lastRoundAt: totals.last_round_at === null ? null : Number(totals.last_round_at),
|
|
412
|
+
// Counted in memory since this process started, not lifetime: a refusal is not worth a write.
|
|
413
|
+
// Counts only, never reasons, so a caller cannot read a threshold off a public route.
|
|
414
|
+
admission: { since: startedAt, refused: { ...refused } },
|
|
375
415
|
// The same version `/config` reports, so a dashboard already reading stats needs no second call.
|
|
376
416
|
gateVersion: GATE_VERSION,
|
|
377
417
|
};
|
|
@@ -515,16 +555,107 @@ function createGateRuntime(options, scoreAuthority, awardEndpoint) {
|
|
|
515
555
|
if (typeof audience !== 'string' || !awardEndpoint.ticketAudiences.has(audience)) {
|
|
516
556
|
return reply.code(400).send({ message: 'that game server is not registered' });
|
|
517
557
|
}
|
|
518
|
-
await
|
|
519
|
-
|
|
558
|
+
const admission = await admit({ at: 'ticket', player: who, roundId: id, ip: ipOf(request), evidence: undefined });
|
|
559
|
+
if (!admission.ok)
|
|
560
|
+
return reply.code(403).send({ message: admission.reason });
|
|
561
|
+
const issued = await awardEndpoint.tickets.issue({
|
|
520
562
|
awardToken: awardEndpoint.token,
|
|
521
563
|
player: who,
|
|
522
|
-
gameId: game.id,
|
|
523
564
|
roundId: id,
|
|
524
565
|
audience,
|
|
525
566
|
closesAt: room.window.closesAt,
|
|
526
567
|
now,
|
|
527
568
|
});
|
|
569
|
+
if (!issued.ok) {
|
|
570
|
+
// Sentences a player can act on. The thresholds stay here.
|
|
571
|
+
return reply.code(429).send({
|
|
572
|
+
message: issued.refuse === 'ticket.seat_open'
|
|
573
|
+
? 'you are already connected to this game'
|
|
574
|
+
: 'too many tries, wait a minute',
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
await recordPlaySession(pool, id, who);
|
|
578
|
+
return issued.ticket;
|
|
579
|
+
});
|
|
580
|
+
/**
|
|
581
|
+
* Accept a ticket a browser presented to the game server, exactly once.
|
|
582
|
+
*
|
|
583
|
+
* The gate does the whole check, so a server needs no MAC code and no replay cache: a second
|
|
584
|
+
* presentation of the same ticket is refused here.
|
|
585
|
+
*/
|
|
586
|
+
app.post('/internal/rounds/:id/tickets/consume', async (request, reply) => {
|
|
587
|
+
if (!hasBearerToken(request.headers.authorization, awardEndpoint.token)) {
|
|
588
|
+
return reply.code(401).send({ message: 'game server authentication failed' });
|
|
589
|
+
}
|
|
590
|
+
const body = (request.body ?? {});
|
|
591
|
+
const result = await awardEndpoint.tickets.consume({
|
|
592
|
+
awardToken: awardEndpoint.token,
|
|
593
|
+
roundId: request.params.id,
|
|
594
|
+
ticket: body.ticket,
|
|
595
|
+
audience: body.audience,
|
|
596
|
+
});
|
|
597
|
+
if (!result.ok) {
|
|
598
|
+
const status = result.refuse === 'ticket.invalid' ? 400 : result.refuse === 'ticket.no_such_round' ? 404 : 409;
|
|
599
|
+
return reply.code(status).send({ refuse: result.refuse });
|
|
600
|
+
}
|
|
601
|
+
return reply.header('cache-control', 'no-store').send({ ticket: result.ticket, otherOpen: result.otherOpen });
|
|
602
|
+
});
|
|
603
|
+
/** Give seats back: one ticket, one wallet's tickets, or every ticket in the round. */
|
|
604
|
+
app.post('/internal/rounds/:id/tickets/release', async (request, reply) => {
|
|
605
|
+
if (!hasBearerToken(request.headers.authorization, awardEndpoint.token)) {
|
|
606
|
+
return reply.code(401).send({ message: 'game server authentication failed' });
|
|
607
|
+
}
|
|
608
|
+
const result = await awardEndpoint.tickets.release(request.params.id, request.body);
|
|
609
|
+
if (!result.ok) {
|
|
610
|
+
return reply.code(result.refuse === 'ticket.invalid' ? 400 : 404).send({ refuse: result.refuse });
|
|
611
|
+
}
|
|
612
|
+
return { released: result.released };
|
|
613
|
+
});
|
|
614
|
+
/** What one wallet has been issued in a round, newest first, so a server can see who minted what. */
|
|
615
|
+
app.get('/internal/rounds/:id/tickets', async (request, reply) => {
|
|
616
|
+
if (!hasBearerToken(request.headers.authorization, awardEndpoint.token)) {
|
|
617
|
+
return reply.code(401).send({ message: 'game server authentication failed' });
|
|
618
|
+
}
|
|
619
|
+
const wallet = request.query.player;
|
|
620
|
+
if (typeof wallet !== 'string' || !isAddress(wallet, { strict: false })) {
|
|
621
|
+
return reply.code(400).send({ refuse: 'ticket.invalid' });
|
|
622
|
+
}
|
|
623
|
+
const tickets = await awardEndpoint.tickets.list(request.params.id, wallet);
|
|
624
|
+
if (!tickets)
|
|
625
|
+
return reply.code(404).send({ refuse: 'ticket.no_such_round' });
|
|
626
|
+
return reply.header('cache-control', 'no-store').send({ tickets });
|
|
627
|
+
});
|
|
628
|
+
/**
|
|
629
|
+
* The gate's block list, for the game server that sees the abuse.
|
|
630
|
+
*
|
|
631
|
+
* A game server is where a cheat is noticed: it can block the address here and the gate stops
|
|
632
|
+
* issuing that address sessions and tickets, instead of the server refusing it one connection
|
|
633
|
+
* at a time.
|
|
634
|
+
*/
|
|
635
|
+
app.get('/internal/admission/ip-blocks', async (request, reply) => {
|
|
636
|
+
if (!hasBearerToken(request.headers.authorization, awardEndpoint.token)) {
|
|
637
|
+
return reply.code(401).send({ message: 'game server authentication failed' });
|
|
638
|
+
}
|
|
639
|
+
return reply.header('cache-control', 'no-store').send({ blocks: await ipBlocks.list() });
|
|
640
|
+
});
|
|
641
|
+
app.put('/internal/admission/ip-blocks', async (request, reply) => {
|
|
642
|
+
if (!hasBearerToken(request.headers.authorization, awardEndpoint.token)) {
|
|
643
|
+
return reply.code(401).send({ message: 'game server authentication failed' });
|
|
644
|
+
}
|
|
645
|
+
const result = await ipBlocks.add((request.body ?? {}));
|
|
646
|
+
if (!result.ok) {
|
|
647
|
+
return reply.code(result.refuse === 'ip_block.invalid' ? 400 : 409).send({ refuse: result.refuse });
|
|
648
|
+
}
|
|
649
|
+
return result.block;
|
|
650
|
+
});
|
|
651
|
+
app.delete('/internal/admission/ip-blocks', async (request, reply) => {
|
|
652
|
+
if (!hasBearerToken(request.headers.authorization, awardEndpoint.token)) {
|
|
653
|
+
return reply.code(401).send({ message: 'game server authentication failed' });
|
|
654
|
+
}
|
|
655
|
+
const removed = await ipBlocks.remove(request.query.cidr);
|
|
656
|
+
if (removed === null)
|
|
657
|
+
return reply.code(400).send({ refuse: 'ip_block.invalid' });
|
|
658
|
+
return { removed };
|
|
528
659
|
});
|
|
529
660
|
app.post('/internal/rounds/:id/awards', async (request, reply) => {
|
|
530
661
|
if (!hasBearerToken(request.headers.authorization, awardEndpoint.token)) {
|
|
@@ -572,10 +703,13 @@ function createGateRuntime(options, scoreAuthority, awardEndpoint) {
|
|
|
572
703
|
}
|
|
573
704
|
// `spent` rises whenever settlement sees a purchase land, so this answer is only true at the
|
|
574
705
|
// moment it is read. Points are monotone; the wei beside them are not.
|
|
575
|
-
const balance = await
|
|
706
|
+
const [balance, tickets] = await Promise.all([
|
|
707
|
+
claims.economyBalance(result.standing.roundId, result.standing.player),
|
|
708
|
+
awardEndpoint.tickets.counts(result.standing.roundId, result.standing.player),
|
|
709
|
+
]);
|
|
576
710
|
return reply
|
|
577
711
|
.header('cache-control', 'no-store')
|
|
578
|
-
.send({ ...result.standing, economy: wireEconomy(balance) });
|
|
712
|
+
.send({ ...result.standing, economy: wireEconomy(balance), tickets });
|
|
579
713
|
});
|
|
580
714
|
}
|
|
581
715
|
app.get('/rounds/:id', async (request, reply) => {
|