@chaos-overlords/kernel 0.8.1 → 0.8.2

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 (52) hide show
  1. package/dist/domain/entities.d.ts +27 -1
  2. package/dist/domain/entities.d.ts.map +1 -1
  3. package/dist/domain/entities.js.map +1 -1
  4. package/dist/domain/errors.d.ts.map +1 -1
  5. package/dist/domain/errors.js.map +1 -1
  6. package/dist/logic/canonical-json.d.ts.map +1 -1
  7. package/dist/logic/canonical-json.js.map +1 -1
  8. package/dist/ports/storage.d.ts +130 -12
  9. package/dist/ports/storage.d.ts.map +1 -1
  10. package/dist/services/AuthService.d.ts.map +1 -1
  11. package/dist/services/AuthService.js.map +1 -1
  12. package/dist/services/EventPublisher.d.ts.map +1 -1
  13. package/dist/services/EventPublisher.js.map +1 -1
  14. package/dist/services/LobbyService.d.ts +32 -2
  15. package/dist/services/LobbyService.d.ts.map +1 -1
  16. package/dist/services/LobbyService.js +221 -43
  17. package/dist/services/LobbyService.js.map +1 -1
  18. package/dist/services/MatchQueryService.d.ts +8 -0
  19. package/dist/services/MatchQueryService.d.ts.map +1 -1
  20. package/dist/services/MatchQueryService.js +30 -19
  21. package/dist/services/MatchQueryService.js.map +1 -1
  22. package/dist/services/RateLimiter.d.ts +6 -0
  23. package/dist/services/RateLimiter.d.ts.map +1 -1
  24. package/dist/services/RateLimiter.js +39 -0
  25. package/dist/services/RateLimiter.js.map +1 -1
  26. package/dist/services/RetentionService.d.ts +13 -0
  27. package/dist/services/RetentionService.d.ts.map +1 -1
  28. package/dist/services/RetentionService.js +19 -2
  29. package/dist/services/RetentionService.js.map +1 -1
  30. package/dist/services/SnapshotService.d.ts +46 -9
  31. package/dist/services/SnapshotService.d.ts.map +1 -1
  32. package/dist/services/SnapshotService.js +122 -39
  33. package/dist/services/SnapshotService.js.map +1 -1
  34. package/dist/services/TurnService.d.ts +19 -1
  35. package/dist/services/TurnService.d.ts.map +1 -1
  36. package/dist/services/TurnService.js +189 -34
  37. package/dist/services/TurnService.js.map +1 -1
  38. package/dist/services/createKernel.js.map +1 -1
  39. package/dist/testing/CountingStorage.d.ts +25 -0
  40. package/dist/testing/CountingStorage.d.ts.map +1 -0
  41. package/dist/testing/CountingStorage.js +51 -0
  42. package/dist/testing/CountingStorage.js.map +1 -0
  43. package/dist/testing/InMemoryStorage.d.ts.map +1 -1
  44. package/dist/testing/InMemoryStorage.js +83 -17
  45. package/dist/testing/InMemoryStorage.js.map +1 -1
  46. package/dist/testing/fakes.d.ts.map +1 -1
  47. package/dist/testing/fakes.js.map +1 -1
  48. package/dist/testing/index.d.ts +1 -0
  49. package/dist/testing/index.d.ts.map +1 -1
  50. package/dist/testing/index.js +1 -0
  51. package/dist/testing/index.js.map +1 -1
  52. package/package.json +4 -4
@@ -1,10 +1,11 @@
1
- import { foldName, LIMITS, } from '@chaos-overlords/contracts';
2
- import { activePlayers } from '../domain/entities';
3
- import { ConflictError, ForbiddenError, NotFoundError, UnauthorizedError } from '../domain/errors';
1
+ import { foldName, GAME_BOUNDS, LIMITS, } from '@chaos-overlords/contracts';
2
+ import { activePlayers, humanParticipants } from '../domain/entities';
3
+ import { ConflictError, ForbiddenError, NotFoundError, RateLimitedError, UnauthorizedError, } from '../domain/errors';
4
4
  import { generateJoinCode, generateSeed, generateToken, hashToken } from '../logic/crypto';
5
5
  import { hashPassword, verifyPassword } from '../logic/password';
6
6
  import { assignSlots } from '../logic/turn-logic';
7
7
  import { MatchQueryService, toPlayerView } from './MatchQueryService';
8
+ import { RateLimiter } from './RateLimiter';
8
9
  import { FIRST_TURN } from './TurnService';
9
10
  const JOIN_CODE_LENGTH = LIMITS.joinCodeLength;
10
11
  const MIN_PLAYERS_TO_START = LIMITS.minPlayers;
@@ -18,6 +19,31 @@ const DEFAULT_PORTRAIT_ID = 0;
18
19
  const VACANT_HOST_STATUSES = ['left', 'kicked', 'computer'];
19
20
  /** A human seat nobody is playing: the ones an absence vote can hand to the computer. */
20
21
  const ABSENT_HUMAN_STATUSES = ['takeoverPending', 'left', 'kicked'];
22
+ /**
23
+ * Passwords one caller will have verified against one match in a window.
24
+ *
25
+ * `verifyPassword` is PBKDF2 at 120,000 iterations, on a door no token guards, so tens of
26
+ * milliseconds of CPU per attempt is the libuv thread pool on Node and billed CPU on Workers. The
27
+ * budget is per caller AND per match rather than per match alone: a public listing carries the
28
+ * join code and the `passwordProtected` flag, so one match's budget is something any stranger can
29
+ * reach, and one that could be spent by a stranger would lock every legitimate player out of a
30
+ * match for as long as the stranger cared to keep spending it. Someone mistyping their own
31
+ * password is nowhere near ten tries a minute.
32
+ */
33
+ const PASSWORD_ATTEMPTS_PER_CALLER = 10;
34
+ /**
35
+ * Wrong passwords one match will verify in a window before it stops taking a caller's word twice.
36
+ *
37
+ * The per-caller budget bounds one address; this bounds the match against an attacker who has
38
+ * many. It is charged only by a verification that FAILED, so the traffic of a match whose players
39
+ * know their password never approaches it. While it is spent, a caller still gets their first
40
+ * attempt of the window — which is what keeps this a brake on a distributed attack rather than a
41
+ * lever for closing someone else's match: an attacker under it costs the match one hash per
42
+ * address per minute, and a player who knows the password is only ever refused a RETRY, never
43
+ * their first try.
44
+ */
45
+ const PASSWORD_FAILURES_PER_MATCH = 30;
46
+ const PASSWORD_ATTEMPT_WINDOW_MS = 60_000;
21
47
  /** Match creation, joining, leaving, kicking and the start transition. */
22
48
  export class LobbyService {
23
49
  deps;
@@ -25,12 +51,63 @@ export class LobbyService {
25
51
  turns;
26
52
  query;
27
53
  newId;
54
+ passwordAttempts;
55
+ passwordFailures;
28
56
  constructor(deps, publisher, turns, options = {}) {
29
57
  this.deps = deps;
30
58
  this.publisher = publisher;
31
59
  this.turns = turns;
32
60
  this.query = new MatchQueryService(deps.storage);
33
61
  this.newId = options.newId ?? (() => crypto.randomUUID());
62
+ this.passwordAttempts = new RateLimiter(deps.clock, {
63
+ limit: PASSWORD_ATTEMPTS_PER_CALLER,
64
+ windowMs: PASSWORD_ATTEMPT_WINDOW_MS,
65
+ });
66
+ this.passwordFailures = new RateLimiter(deps.clock, {
67
+ limit: PASSWORD_FAILURES_PER_MATCH,
68
+ windowMs: PASSWORD_ATTEMPT_WINDOW_MS,
69
+ });
70
+ }
71
+ /**
72
+ * Check a match password, charging two budgets before the hash is computed.
73
+ *
74
+ * The caller's own budget is spent on every attempt rather than only on the wrong ones, because
75
+ * a caller who knows the password does not need ten attempts a minute and an attacker who does
76
+ * not would otherwise be charged for nothing. The match's budget is spent only by a failure, and
77
+ * closes only the caller's SECOND and later attempts in a window, so a stranger grinding a
78
+ * public match's password cannot turn the protection into a way of shutting its players out.
79
+ * Both doors go through here; see `PASSWORD_ATTEMPTS_PER_CALLER`.
80
+ *
81
+ * `caller` is whatever the transport can attribute an attempt to — the client address, already
82
+ * normalised. A transport that cannot attribute one passes nothing, and every such attempt then
83
+ * shares a single budget, which is the safe direction: an unattributable flood is throttled
84
+ * together rather than not at all.
85
+ */
86
+ async verifyMatchPassword(match, password, caller) {
87
+ if (match.passwordHash === null)
88
+ return;
89
+ if (!password) {
90
+ throw new UnauthorizedError('This match needs a password', { reason: 'password_required' });
91
+ }
92
+ const callerKey = `${match.id}:${caller ?? 'unattributed'}`;
93
+ const retry = this.passwordAttempts.take(callerKey);
94
+ if (retry !== null)
95
+ throw this.tooManyPasswordAttempts(retry);
96
+ if (this.passwordAttempts.spent(callerKey) > 1) {
97
+ const underAttack = this.passwordFailures.peek(match.id);
98
+ if (underAttack !== null)
99
+ throw this.tooManyPasswordAttempts(underAttack);
100
+ }
101
+ if (!(await verifyPassword(password, match.passwordHash))) {
102
+ this.passwordFailures.take(match.id);
103
+ throw new UnauthorizedError('Wrong password', { reason: 'wrong_password' });
104
+ }
105
+ }
106
+ tooManyPasswordAttempts(retryAfterSeconds) {
107
+ return new RateLimitedError('Too many password attempts for this match', {
108
+ reason: 'rate_limited',
109
+ retryAfterSeconds,
110
+ });
34
111
  }
35
112
  async createMatch(request) {
36
113
  const now = this.deps.clock.now();
@@ -77,7 +154,7 @@ export class LobbyService {
77
154
  });
78
155
  return this.membership(match, host, token);
79
156
  }
80
- async join(request) {
157
+ async join(request, caller) {
81
158
  const match = await this.deps.storage.matches.getByJoinCode(request.joinCode);
82
159
  // A code that names no match and a code that names a match which has already started answer the
83
160
  // same 404, so a scan of the code space learns nothing from the difference. The wording covers
@@ -88,14 +165,7 @@ export class LobbyService {
88
165
  reason: 'unknown_join_code',
89
166
  });
90
167
  }
91
- if (match.passwordHash !== null) {
92
- if (!request.password) {
93
- throw new UnauthorizedError('This match needs a password', { reason: 'password_required' });
94
- }
95
- if (!(await verifyPassword(request.password, match.passwordHash))) {
96
- throw new UnauthorizedError('Wrong password', { reason: 'wrong_password' });
97
- }
98
- }
168
+ await this.verifyMatchPassword(match, request.password, caller);
99
169
  await this.refuseDuplicateName(match.id, request.displayName);
100
170
  const joinOrder = await this.deps.storage.matches.claimSeat(match.id);
101
171
  if (joinOrder === null) {
@@ -136,7 +206,7 @@ export class LobbyService {
136
206
  throw error;
137
207
  }
138
208
  }
139
- async joinRunning(request) {
209
+ async joinRunning(request, caller) {
140
210
  const byId = await this.deps.storage.matches.get(request.match);
141
211
  // A private match is reachable by its join code only. Its id is not a secret — it rides every
142
212
  // event, the client's recovery file and any log line — so looking one up by id would make a
@@ -160,19 +230,23 @@ export class LobbyService {
160
230
  reason: 'late_join_not_ready',
161
231
  });
162
232
  }
163
- if (match.passwordHash !== null) {
164
- if (!request.password || !(await verifyPassword(request.password, match.passwordHash))) {
165
- throw new UnauthorizedError('Wrong password', { reason: 'wrong_password' });
166
- }
167
- }
233
+ await this.verifyMatchPassword(match, request.password, caller);
168
234
  const existing = await this.deps.storage.players.listByMatch(match.id);
235
+ // A match every human has left is paused by `remove`, with no clock and nobody to restart it:
236
+ // `rejoin` is the door back into one, and it needs a token this caller does not have. Seating
237
+ // a stranger at a stopped table would strand them there, so the late-join door refuses it —
238
+ // which is also exactly the test the public listing leaves such a match out on.
239
+ if (humanParticipants(existing).length === 0) {
240
+ throw new ConflictError('Every player has left this match', { reason: 'match_abandoned' });
241
+ }
169
242
  if (existing.some((player) => player.slot === request.slot)) {
170
243
  throw new ConflictError('That seat has already belonged to a human', {
171
244
  reason: 'seat_reserved',
172
245
  });
173
246
  }
174
- // The lobby door counts seats through `claimSeat`; this one has no counter behind it, so the
175
- // host's own limit has to be read here or a two-seat match could gather humans up to six.
247
+ // A courtesy refusal with the right reason before any work is done; `createLate` tests
248
+ // capacity again inside its own insert, which is what actually decides the race between two
249
+ // late joiners taking two different free seats.
176
250
  if (existing.length >= match.settings.maxPlayers) {
177
251
  throw new ConflictError('The match is full', { reason: 'match_full' });
178
252
  }
@@ -191,7 +265,7 @@ export class LobbyService {
191
265
  joinedAt: this.deps.clock.now(),
192
266
  };
193
267
  if (!(await this.deps.storage.players.createLate(player))) {
194
- throw new ConflictError('That seat was claimed by another player', {
268
+ throw new ConflictError('That seat was claimed by another player, or the match filled up', {
195
269
  reason: 'seat_reserved',
196
270
  });
197
271
  }
@@ -308,12 +382,24 @@ export class LobbyService {
308
382
  });
309
383
  }
310
384
  const now = this.deps.clock.now();
311
- if (!(await this.deps.storage.takeovers.castVote(match.id, target.id, player.id, request.decision, now))) {
385
+ if (!(await this.deps.storage.takeovers.castVote({
386
+ matchId: match.id,
387
+ targetPlayerId: target.id,
388
+ voterPlayerId: player.id,
389
+ decision: request.decision,
390
+ castAt: now,
391
+ }))) {
312
392
  // The seat is absent but nobody asked about it yet: it went quiet before this table existed,
313
393
  // or while nobody was present to ask. The vote itself opens the question, so the seat can
314
394
  // still be decided rather than left idle for the rest of the match.
315
395
  await this.turns.openTakeoverPrompt(match.id, target.id, match.currentTurn);
316
- if (!(await this.deps.storage.takeovers.castVote(match.id, target.id, player.id, request.decision, now))) {
396
+ if (!(await this.deps.storage.takeovers.castVote({
397
+ matchId: match.id,
398
+ targetPlayerId: target.id,
399
+ voterPlayerId: player.id,
400
+ decision: request.decision,
401
+ castAt: now,
402
+ }))) {
317
403
  throw new ConflictError('That player is not awaiting a takeover vote', {
318
404
  reason: 'takeover_not_pending',
319
405
  });
@@ -325,22 +411,36 @@ export class LobbyService {
325
411
  });
326
412
  if (request.decision === 'wait')
327
413
  return;
328
- const votes = new Map((await this.deps.storage.takeovers.listVotes(match.id, target.id)).map((vote) => [
414
+ await this.tallyTakeoverVote(match, target.id);
415
+ }
416
+ /**
417
+ * Hand a seat to the computer once every remaining active player has voted for it.
418
+ *
419
+ * Extracted from `voteOnTakeover` because the tally can also be completed by the voter set
420
+ * shrinking. When the one player who had not voted (or had voted `wait`) leaves or is kicked,
421
+ * everyone left has already approved, and the prompt used to stay open with the clock stopped
422
+ * until somebody clicked the same button a second time — on a modal reading 2 of 2.
423
+ */
424
+ async tallyTakeoverVote(match, targetPlayerId) {
425
+ const target = await this.deps.storage.players.get(targetPlayerId);
426
+ if (!target || target.status === 'computer')
427
+ return;
428
+ const votes = new Map((await this.deps.storage.takeovers.listVotes(match.id, targetPlayerId)).map((vote) => [
329
429
  vote.voterPlayerId,
330
430
  vote.decision,
331
431
  ]));
332
432
  const voters = activePlayers(await this.deps.storage.players.listByMatch(match.id));
333
433
  if (voters.length === 0 || voters.some((voter) => votes.get(voter.id) !== 'computer'))
334
434
  return;
335
- if (!(await this.deps.storage.players.transitionStatus(target.id, [target.status], 'computer'))) {
435
+ if (!(await this.deps.storage.players.transitionStatus(targetPlayerId, [target.status], 'computer'))) {
336
436
  return;
337
437
  }
338
- await this.deps.storage.takeovers.closePrompt(match.id, target.id);
438
+ await this.deps.storage.takeovers.closePrompt(match.id, targetPlayerId);
339
439
  await this.publisher.publish(match.id, {
340
440
  type: 'match.playerTakenOver',
341
- payload: { playerId: target.id },
441
+ payload: { playerId: targetPlayerId },
342
442
  });
343
- if (target.id === match.hostPlayerId) {
443
+ if (targetPlayerId === match.hostPlayerId) {
344
444
  const successor = activePlayers(await this.deps.storage.players.listByMatch(match.id))[0];
345
445
  if (successor) {
346
446
  await this.deps.storage.matches.transition(match.id, ['running', 'desynced'], {
@@ -356,6 +456,12 @@ export class LobbyService {
356
456
  await this.turns.reevaluate(match.id);
357
457
  await this.turns.resumeAfterTakeoverVotes(match.id);
358
458
  }
459
+ /** Re-tally every open prompt, for when the set of voters has just shrunk. */
460
+ async retallyOpenPrompts(match) {
461
+ for (const playerId of await this.deps.storage.takeovers.listOpenPrompts(match.id)) {
462
+ await this.tallyTakeoverVote(match, playerId);
463
+ }
464
+ }
359
465
  async start(principal) {
360
466
  const { match } = principal;
361
467
  requireHost(principal);
@@ -368,6 +474,14 @@ export class LobbyService {
368
474
  reason: 'not_enough_players',
369
475
  });
370
476
  }
477
+ // The seat counter is what admits a join, so a roster larger than the match allows means the
478
+ // counter has been undercounted. Refuse rather than seat a seventh player, whose slot fails
479
+ // `seatSchema` in every player view and makes the match a 500 for the whole roster.
480
+ if (roster.length > Math.min(match.settings.maxPlayers, GAME_BOUNDS.playerCount)) {
481
+ throw new ConflictError('The lobby holds more players than the match allows', {
482
+ reason: 'match_full',
483
+ });
484
+ }
371
485
  const seed = generateSeed();
372
486
  const started = await this.deps.storage.matches.transition(match.id, ['lobby'], {
373
487
  status: 'running',
@@ -394,12 +508,24 @@ export class LobbyService {
394
508
  async remove(match, target, reason) {
395
509
  if (target.status === 'kicked')
396
510
  return;
397
- // Leaving is something only a seated, active player does. A kick has to reach the seat whatever
398
- // state it is in: a player who left or went quiet keeps a working token until it is revoked
399
- // here, and `rejoin` turns away nobody but the kicked, so answering 204 and doing nothing let a
400
- // kicked player walk straight back in.
511
+ // A seat already handed to the computer is not a human to remove. Marking it `kicked` put it
512
+ // back in ABSENT_HUMAN_STATUSES, so the next rejoin or vote opened a fresh prompt for a seat
513
+ // every client is already playing as AI, stopped the clock, and a unanimous vote published a
514
+ // second `match.playerTakenOver` for it. Revoke the owner's token, leave the seat alone.
515
+ if (target.status === 'computer') {
516
+ if (reason === 'kicked') {
517
+ await this.deps.storage.players.revokeToken(target.id);
518
+ await this.hangUp(match.id, target.id);
519
+ }
520
+ return;
521
+ }
522
+ // Leaving is something only a seated, active player does — or one whose seat is waiting on an
523
+ // absence vote, who would otherwise be waited on for the rest of the match after answering 204.
524
+ // A kick has to reach the seat whatever state it is in: a player who left or went quiet keeps a
525
+ // working token until it is revoked here, and `rejoin` turns away nobody but the kicked, so
526
+ // answering 204 and doing nothing let a kicked player walk straight back in.
401
527
  const wasActive = target.status === 'active';
402
- if (!wasActive && reason !== 'kicked')
528
+ if (!wasActive && reason !== 'kicked' && target.status !== 'takeoverPending')
403
529
  return;
404
530
  const now = this.deps.clock.now();
405
531
  if (match.status === 'lobby') {
@@ -407,15 +533,42 @@ export class LobbyService {
407
533
  await this.abandon(match, now);
408
534
  return;
409
535
  }
410
- await this.deps.storage.players.delete(target.id);
536
+ // `match.status` was read at authentication, so the host's `start` may have landed since. A
537
+ // re-read here is not a transaction, but it turns the window from "the whole request" into
538
+ // "two statements", and the running path below is the correct one for a seated player.
539
+ const current = await this.deps.storage.matches.get(match.id);
540
+ if (current && current.status !== 'lobby') {
541
+ await this.remove(current, target, reason);
542
+ return;
543
+ }
544
+ // The seat is released only when a row actually went. Two requests that both authenticated
545
+ // before either deleted — a `leave` sent twice, or this kick racing the target's own `leave` —
546
+ // each decremented the counter for the one row that went, so the lobby admitted more than
547
+ // `maxPlayers` and a seventh player got slot 6, which fails `seatSchema` in every player view
548
+ // and turns the match into a 500 for everybody.
549
+ if (!(await this.deps.storage.players.delete(target.id)))
550
+ return;
411
551
  await this.deps.storage.matches.releaseSeat(match.id);
552
+ // A kicked member's token is dead with the row, but a stream they already hold is never
553
+ // re-authenticated: without this it goes on delivering `match.started` with the seed and
554
+ // every seal, desync and roster change for the rest of the match.
555
+ if (reason === 'kicked')
556
+ await this.hangUp(match.id, target.id);
412
557
  await this.publisher.publish(match.id, {
413
558
  type: 'lobby.playerLeft',
414
559
  payload: { playerId: target.id, reason },
415
560
  });
416
561
  return;
417
562
  }
418
- await this.deps.storage.players.setStatus(target.id, reason);
563
+ // A compare-and-swap, not a write. `target.status` was read at authentication, and
564
+ // `tallyTakeoverVote` concurrently swaps `takeoverPending` to `computer` and announces the
565
+ // takeover. Writing `left` or `kicked` over that put a seat every client already plays as AI
566
+ // back among the absent human statuses, so the next rejoin or vote opened a fresh prompt for
567
+ // it, paused the clock, and published a second `match.playerTakenOver` — the regression the
568
+ // note at the top of this method says was fixed.
569
+ const claimed = await this.deps.storage.players.transitionStatus(target.id, ['active', 'takeoverPending', 'left'], reason);
570
+ // Revoking and hanging up stay unconditional for a kick: the seat may now be computer
571
+ // controlled, but the person behind it must still lose the token and the streams either way.
419
572
  // Membership is the only thing the token ever proved, so it stops working here: a kicked player
420
573
  // keeps neither the event stream nor the sealed order sets of the turns that follow. The revoke
421
574
  // closes the next request and the hang-up closes the streams already open, which are never
@@ -424,18 +577,42 @@ export class LobbyService {
424
577
  await this.deps.storage.players.revokeToken(target.id);
425
578
  await this.hangUp(match.id, target.id);
426
579
  }
427
- await this.publisher.publish(match.id, {
428
- type: 'lobby.playerLeft',
429
- payload: { playerId: target.id, reason },
430
- });
431
- // A seat that was already absent changes no tally and holds no host role: whatever vote or
432
- // succession its absence called for ran when it went quiet, and it is not a seat any turn is
433
- // waiting on now. Nor does a match that is over have anything left to vote on.
434
- if (!wasActive || (match.status !== 'running' && match.status !== 'desynced'))
580
+ if (claimed) {
581
+ await this.publisher.publish(match.id, {
582
+ type: 'lobby.playerLeft',
583
+ payload: { playerId: target.id, reason },
584
+ });
585
+ }
586
+ if (match.status !== 'running' && match.status !== 'desynced')
587
+ return;
588
+ // The takeover won the seat, so it is no longer a human absence anyone has to decide on. The
589
+ // verdict is still re-run below, because the seat leaving `humanParticipants` can complete a
590
+ // readiness or a consensus that was waiting on it.
591
+ if (!claimed) {
592
+ await this.turns.reevaluate(match.id);
593
+ await this.retallyOpenPrompts(match);
435
594
  return;
595
+ }
596
+ if (!wasActive) {
597
+ // A `takeoverPending` seat is not idle: `humanParticipants` counts it, so both readiness and
598
+ // consensus wait on it. Kicking one and returning here left the turn waiting on a seat that
599
+ // could never answer, with the clock paused by its own prompt and everyone present already
600
+ // ready. A `left` seat really is idle, and re-running the verdict for it costs one query.
601
+ await this.turns.reevaluate(match.id);
602
+ await this.retallyOpenPrompts(match);
603
+ return;
604
+ }
436
605
  const remaining = activePlayers(await this.deps.storage.players.listByMatch(match.id));
437
606
  if (remaining.length === 0) {
438
607
  // Keep the durable match available. The first former member to rejoin becomes host.
608
+ //
609
+ // Stop the clock on the way out. Nobody opens a takeover prompt on the last seat — there is
610
+ // nobody left to ask — so nothing else would pause it, and a timed match went on sealing an
611
+ // empty turn every `turnTimerSeconds` for as long as the server ran: one turn row and two
612
+ // events a cycle, about 2,900 turns a day, with every cycle refreshing `updatedAt` so the
613
+ // 90-day abandoned-live sweep never reached it. `rejoin` restarts the clock through
614
+ // `resumeAfterTakeoverVotes`.
615
+ await this.turns.pauseAbandonedMatch(match.id);
439
616
  return;
440
617
  }
441
618
  await this.turns.openTakeoverPrompt(match.id, target.id, match.currentTurn);
@@ -452,6 +629,7 @@ export class LobbyService {
452
629
  }
453
630
  // A departure can complete readiness or a consensus that was waiting on the leaver.
454
631
  await this.turns.reevaluate(match.id);
632
+ await this.retallyOpenPrompts(match);
455
633
  }
456
634
  /**
457
635
  * Hang up a revoked membership's streams. Best effort by design: the token is already gone, so a
@@ -1 +1 @@
1
- {"version":3,"file":"LobbyService.js","sourceRoot":"","sources":["../../src/services/LobbyService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LobbyService.js","sourceRoot":"","sources":["../../src/services/LobbyService.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,14 @@ export declare class MatchQueryService {
8
8
  constructor(storage: MultiplayerStorage);
9
9
  view(match: Match): Promise<MatchView>;
10
10
  private turnView;
11
+ /**
12
+ * The public lobby list.
13
+ *
14
+ * Two queries in total, whatever the page holds: the listing itself carries the seat count and
15
+ * whether a snapshot exists, and the seats of every match that could still advertise one are read
16
+ * together. It used to be two more queries for each running match on the page, on a route no
17
+ * token guards.
18
+ */
11
19
  listPublicLobbies(limit: number): Promise<LobbyListing[]>;
12
20
  ownSubmission(match: Match, playerId: string, number: number): Promise<OwnSubmissionView>;
13
21
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"MatchQueryService.d.ts","sourceRoot":"","sources":["../../src/services/MatchQueryService.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,gBAAgB,EAGtB,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAQ,MAAM,oBAAoB,CAAA;AAE7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAE1D,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,UAAU,CAS7E;AAED,wFAAwF;AACxF,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,kBAAkB;IAElD,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC;YAwB9B,QAAQ;IAoBhB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA2CzD,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAM/F;;;;;;;OAOG;IACG,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAmB7D,WAAW;CAK1B"}
1
+ {"version":3,"file":"MatchQueryService.d.ts","sourceRoot":"","sources":["../../src/services/MatchQueryService.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,gBAAgB,EAGtB,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAQ,MAAM,oBAAoB,CAAA;AAE7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAE1D,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,UAAU,CAS7E;AAED,wFAAwF;AACxF,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,kBAAkB,EAAI;IAEtD,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAsB3C;YAEa,QAAQ;IAoBtB;;;;;;;OAOG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA0C9D;IAEK,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAI9F;IAED;;;;;;;OAOG;IACG,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiB1E;YAEa,WAAW;CAK1B"}
@@ -60,40 +60,51 @@ export class MatchQueryService {
60
60
  reportedPlayerIds: reports.map((report) => report.playerId),
61
61
  };
62
62
  }
63
+ /**
64
+ * The public lobby list.
65
+ *
66
+ * Two queries in total, whatever the page holds: the listing itself carries the seat count and
67
+ * whether a snapshot exists, and the seats of every match that could still advertise one are read
68
+ * together. It used to be two more queries for each running match on the page, on a route no
69
+ * token guards.
70
+ */
63
71
  async listPublicLobbies(limit) {
64
- const listings = await this.storage.matches.listPublicLobbies(limit);
65
- return Promise.all(listings.map(async (listing) => {
66
- if (listing.status !== 'running')
72
+ const rows = await this.storage.matches.listPublicLobbies(limit);
73
+ const lateJoinable = rows.filter((row) => row.status === 'running' &&
74
+ row.settings.gameSettings.allowLateJoin === true &&
75
+ row.hasSnapshot);
76
+ const seatsByMatch = new Map();
77
+ for (const seat of await this.storage.players.listSeats(lateJoinable.map((row) => row.id))) {
78
+ const seats = seatsByMatch.get(seat.matchId);
79
+ if (seats)
80
+ seats.push(seat.slot);
81
+ else
82
+ seatsByMatch.set(seat.matchId, [seat.slot]);
83
+ }
84
+ return rows.map(({ hasSnapshot: _hasSnapshot, ...listing }) => {
85
+ const seats = seatsByMatch.get(listing.id);
86
+ if (seats === undefined)
67
87
  return listing;
68
- const players = await this.storage.players.listByMatch(listing.id);
69
- const current = {
70
- ...listing,
71
- playerCount: players.filter((player) => player.status === 'active').length,
72
- };
73
- if (listing.settings.gameSettings.allowLateJoin !== true)
74
- return { ...current, availableSlots: [], availableSeatSummaries: [] };
75
- if (!(await this.storage.snapshots.getLatestSummary(listing.id)))
76
- return { ...current, availableSlots: [], availableSeatSummaries: [] };
77
88
  // `joinRunning` counts every seat a human has ever held against the host's own limit, so a
78
89
  // listing that ignored it advertised seats that every join answers `match_full` for.
79
- if (players.length >= listing.settings.maxPlayers)
80
- return { ...current, availableSlots: [], availableSeatSummaries: [] };
81
- const reserved = new Set(players.map((player) => player.slot));
90
+ if (seats.length >= listing.settings.maxPlayers)
91
+ return listing;
92
+ const reserved = new Set(seats);
82
93
  const availableSlots = Array.from({ length: GAME_BOUNDS.playerCount }, (_, slot) => slot).filter((slot) => !reserved.has(slot));
83
94
  const summaries = Array.isArray(listing.settings.gameSettings.seatSummaries)
84
- ? listing.settings.gameSettings.seatSummaries
95
+ ? listing.settings.gameSettings.seatSummaries.filter(isSeatSummary)
85
96
  : [];
86
97
  return {
87
- ...current,
98
+ ...listing,
88
99
  availableSlots,
89
- availableSeatSummaries: availableSlots.map((slot) => summaries.filter(isSeatSummary).find((summary) => summary.slot === slot) ?? {
100
+ availableSeatSummaries: availableSlots.map((slot) => summaries.find((summary) => summary.slot === slot) ?? {
90
101
  slot,
91
102
  gangs: 0,
92
103
  sites: 0,
93
104
  sectors: 0,
94
105
  }),
95
106
  };
96
- }));
107
+ });
97
108
  }
98
109
  async ownSubmission(match, playerId, number) {
99
110
  const row = await this.storage.turns.getOrders(match.id, number, playerId);