@chaos-overlords/kernel 0.8.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/domain/entities.d.ts +31 -1
  2. package/dist/domain/entities.d.ts.map +1 -1
  3. package/dist/domain/entities.js +9 -1
  4. package/dist/domain/entities.js.map +1 -1
  5. package/dist/domain/errors.d.ts.map +1 -1
  6. package/dist/domain/errors.js.map +1 -1
  7. package/dist/logic/canonical-json.d.ts.map +1 -1
  8. package/dist/logic/canonical-json.js.map +1 -1
  9. package/dist/logic/turn-logic.d.ts.map +1 -1
  10. package/dist/logic/turn-logic.js +2 -4
  11. package/dist/logic/turn-logic.js.map +1 -1
  12. package/dist/ports/storage.d.ts +130 -12
  13. package/dist/ports/storage.d.ts.map +1 -1
  14. package/dist/services/AuthService.d.ts.map +1 -1
  15. package/dist/services/AuthService.js.map +1 -1
  16. package/dist/services/EventPublisher.d.ts.map +1 -1
  17. package/dist/services/EventPublisher.js.map +1 -1
  18. package/dist/services/LobbyService.d.ts +40 -2
  19. package/dist/services/LobbyService.d.ts.map +1 -1
  20. package/dist/services/LobbyService.js +245 -91
  21. package/dist/services/LobbyService.js.map +1 -1
  22. package/dist/services/MatchQueryService.d.ts +12 -2
  23. package/dist/services/MatchQueryService.d.ts.map +1 -1
  24. package/dist/services/MatchQueryService.js +44 -24
  25. package/dist/services/MatchQueryService.js.map +1 -1
  26. package/dist/services/RateLimiter.d.ts +10 -0
  27. package/dist/services/RateLimiter.d.ts.map +1 -1
  28. package/dist/services/RateLimiter.js +48 -5
  29. package/dist/services/RateLimiter.js.map +1 -1
  30. package/dist/services/RetentionService.d.ts +15 -0
  31. package/dist/services/RetentionService.d.ts.map +1 -1
  32. package/dist/services/RetentionService.js +20 -23
  33. package/dist/services/RetentionService.js.map +1 -1
  34. package/dist/services/SnapshotService.d.ts +55 -9
  35. package/dist/services/SnapshotService.d.ts.map +1 -1
  36. package/dist/services/SnapshotService.js +120 -41
  37. package/dist/services/SnapshotService.js.map +1 -1
  38. package/dist/services/TurnService.d.ts +23 -7
  39. package/dist/services/TurnService.d.ts.map +1 -1
  40. package/dist/services/TurnService.js +217 -76
  41. package/dist/services/TurnService.js.map +1 -1
  42. package/dist/services/createKernel.js.map +1 -1
  43. package/dist/services/guards.d.ts +9 -0
  44. package/dist/services/guards.d.ts.map +1 -0
  45. package/dist/services/guards.js +22 -0
  46. package/dist/services/guards.js.map +1 -0
  47. package/dist/testing/CountingStorage.d.ts +25 -0
  48. package/dist/testing/CountingStorage.d.ts.map +1 -0
  49. package/dist/testing/CountingStorage.js +51 -0
  50. package/dist/testing/CountingStorage.js.map +1 -0
  51. package/dist/testing/InMemoryStorage.d.ts.map +1 -1
  52. package/dist/testing/InMemoryStorage.js +83 -17
  53. package/dist/testing/InMemoryStorage.js.map +1 -1
  54. package/dist/testing/fakes.d.ts.map +1 -1
  55. package/dist/testing/fakes.js.map +1 -1
  56. package/dist/testing/index.d.ts +1 -0
  57. package/dist/testing/index.d.ts.map +1 -1
  58. package/dist/testing/index.js +1 -0
  59. package/dist/testing/index.js.map +1 -1
  60. package/package.json +4 -4
@@ -1,12 +1,28 @@
1
1
  import { foreignOps, } from '@chaos-overlords/contracts';
2
- import { activePlayers, humanParticipants } from '../domain/entities';
3
- import { ConflictError, ForbiddenError, NotFoundError, ValidationError } from '../domain/errors';
2
+ import { activePlayers, humanParticipants, isInProgress, } from '../domain/entities';
3
+ import { ConflictError, ValidationError } from '../domain/errors';
4
4
  import { hashOrderDocument, hashOrderSet } from '../logic/crypto';
5
5
  import { allActiveReady, assignSlots, evaluateConsensus, turnDeadline } from '../logic/turn-logic';
6
- import { toPlayerView } from './MatchQueryService';
6
+ import { requireInProgress, requireParticipant, requireTurn } from './guards';
7
+ import { matchStartedEvent } from './MatchQueryService';
7
8
  import { mergeSeatSummaries } from './SnapshotService';
8
9
  /** Turns are numbered from 1; 0 is the lobby's `currentTurn`, before any turn exists. */
9
10
  export const FIRST_TURN = 1;
11
+ /**
12
+ * How recently a match must have been touched for the ordinary sweep pass to visit it.
13
+ *
14
+ * A seal in flight is seconds old and a verdict interrupted after its compare-and-swap is too, so
15
+ * this window is generous by orders of magnitude for both. What it excludes is the standing
16
+ * population of a public server: matches deliberately kept `running` for ninety days after everyone
17
+ * walked away, and matches parked in `desynced` because the host never uploaded a repair. Those
18
+ * used to be re-judged, and joined against, on every single tick forever.
19
+ */
20
+ const SWEEP_WINDOW_MS = 5 * 60_000;
21
+ /**
22
+ * Passes between two unbounded scans, which is what still finds work left behind while the process
23
+ * was down. A fresh service does one immediately, so a restart never has to wait for it.
24
+ */
25
+ const FULL_SCAN_EVERY = 20;
10
26
  /**
11
27
  * The simultaneous-turn barrier. Players submit orders privately; the turn seals when every
12
28
  * active player is ready or the deadline passes; the sealed set becomes readable and the next
@@ -21,6 +37,8 @@ export const FIRST_TURN = 1;
21
37
  export class TurnService {
22
38
  deps;
23
39
  publisher;
40
+ /** Passes since the last unbounded scan; see `sweep`. Starts due so the first pass is a full one. */
41
+ passesSinceFullScan = FULL_SCAN_EVERY;
24
42
  constructor(deps, publisher) {
25
43
  this.deps = deps;
26
44
  this.publisher = publisher;
@@ -28,27 +46,30 @@ export class TurnService {
28
46
  async submitOrders(principal, number, request) {
29
47
  const { match, player } = principal;
30
48
  requireRunning(match);
31
- if (player.status !== 'active' && player.status !== 'takeoverPending') {
32
- throw new ForbiddenError('You are no longer part of this match', { reason: 'not_active' });
33
- }
49
+ requireParticipant(player);
34
50
  assertOwnOps(request, player.slot);
35
51
  const ordersHash = await hashOrderDocument(request.orders);
52
+ const own = {
53
+ turn: number,
54
+ orders: request.orders,
55
+ ready: request.ready,
56
+ ordersHash,
57
+ };
36
58
  if (number !== match.currentTurn) {
37
59
  // The document may have been committed and sealed while its success response was lost. The
38
60
  // endpoint is a replacement, not an append, so an identical retry is an acknowledgement of
39
61
  // that durable row even after currentTurn advances. A different document remains a stale
40
62
  // write and is refused.
41
- const persisted = await this.deps.storage.turns.getOrders(match.id, number, player.id);
42
- if (persisted?.ordersHash === ordersHash && persisted.ready === request.ready) {
43
- return { turn: number, orders: request.orders, ready: request.ready, ordersHash };
44
- }
63
+ const persisted = await this.deps.storage.turns.getOrderSummary(match.id, number, player.id);
64
+ if (persisted?.ordersHash === ordersHash && persisted.ready === request.ready)
65
+ return own;
45
66
  throw new ConflictError(`Turn ${match.currentTurn} is the open turn`, {
46
67
  reason: 'not_current_turn',
47
68
  currentTurn: match.currentTurn,
48
69
  });
49
70
  }
50
71
  await this.restorePendingPlayer(player.id, match.id);
51
- const previous = await this.deps.storage.turns.getOrders(match.id, number, player.id);
72
+ const previous = await this.deps.storage.turns.getOrderSummary(match.id, number, player.id);
52
73
  const accepted = await this.deps.storage.turns.submitOrders(match.id, number, player.id, {
53
74
  orders: request.orders,
54
75
  ordersHash,
@@ -58,10 +79,14 @@ export class TurnService {
58
79
  if (!accepted) {
59
80
  throw new ConflictError('The turn is no longer accepting orders', { reason: 'turn_not_open' });
60
81
  }
61
- if (previous?.ready !== request.ready || (request.ready && previous?.ready === true)) {
62
- // Re-publishing the same ready value is deliberate. If a process stopped after storing the
63
- // row but before publishing its first event, the idempotent HTTP retry repairs the event too.
64
- // Consumers treat readiness as a set, so the duplicate is harmless when the first did land.
82
+ if (previous?.ready !== request.ready) {
83
+ // Only on a CHANGE of readiness. Re-publishing the same value used to be deliberate, to
84
+ // repair an event lost between the row write and its publish, but a member may submit at the
85
+ // member rate limit and the client sends a whole-document replacement per queued command: one
86
+ // misbehaving client could grow a match's durable log by hundreds of thousands of rows a day
87
+ // and wake every subscriber of the match for each. The window it covered is closed from the
88
+ // other end instead — the match view carries `readyPlayerIds`, and every client reconciles
89
+ // its readiness from the view when it reconnects.
65
90
  await this.publisher.publish(match.id, {
66
91
  type: 'turn.readiness',
67
92
  payload: { turn: number, playerId: player.id, ready: request.ready },
@@ -69,7 +94,7 @@ export class TurnService {
69
94
  }
70
95
  if (request.ready)
71
96
  await this.trySeal(match.id, number, 'ready');
72
- return { turn: number, orders: request.orders, ready: request.ready, ordersHash };
97
+ return own;
73
98
  }
74
99
  /** Seal `number` if its trigger condition holds. Returns whether THIS call sealed it. */
75
100
  async trySeal(matchId, number, trigger) {
@@ -83,6 +108,13 @@ export class TurnService {
83
108
  if (turn.deadlineAt === null || turn.deadlineAt.getTime() > this.deps.clock.now().getTime()) {
84
109
  return false;
85
110
  }
111
+ // A second guard behind `pauseAbandonedMatch`: a deadline that survived it, or one armed
112
+ // before this rule existed, must not go on sealing empty turns in a match nobody is in.
113
+ const roster = await this.deps.storage.players.listByMatch(matchId);
114
+ if (activePlayers(roster).length === 0) {
115
+ await this.clearOpenDeadline(matchId);
116
+ return false;
117
+ }
86
118
  }
87
119
  else {
88
120
  const [players, orders] = await Promise.all([
@@ -149,8 +181,12 @@ export class TurnService {
149
181
  entries.push({ slot, ordersHash: row.ordersHash });
150
182
  }
151
183
  const orderSetHash = await hashOrderSet(entries);
152
- const frozen = await this.deps.storage.turns.transition(match.id, number, [turn.status], {
153
- status: turn.status,
184
+ // Conditional on the set not being frozen already, NOT on the status: the status stays
185
+ // `sealed` for the whole window this branch runs in, and the sweep deliberately runs
186
+ // `completeSeal` against a seal in flight. Two callers with a departure between their two
187
+ // computations would otherwise each write a different digest and each announce it, and the
188
+ // client that fetched the set after the overwrite failed its digest check.
189
+ const frozen = await this.deps.storage.turns.freezeSeal(match.id, number, {
154
190
  orderSetHash,
155
191
  sealedSlots,
156
192
  });
@@ -182,20 +218,22 @@ export class TurnService {
182
218
  return;
183
219
  const seated = await this.deps.storage.players.listByMatch(match.id);
184
220
  this.deps.logger.warn('finished an interrupted start', { matchId: match.id });
185
- await this.publisher.publish(match.id, {
186
- type: 'match.started',
187
- payload: {
188
- seed: match.seed,
189
- players: activePlayers(seated).map((player) => toPlayerView(player, match.hostPlayerId)),
190
- },
191
- });
221
+ await this.publisher.publish(match.id, matchStartedEvent(match.seed, seated, match.hostPlayerId));
192
222
  }
193
- /** Whether the log carries an event of `type`. Only read on repair paths, where the log is short. */
223
+ /**
224
+ * Whether the log carries an event of `type`.
225
+ *
226
+ * Only the interrupted-start repair asks this, and only about turn 1, so the log it pages is a
227
+ * handful of rows. The verdict used to ask it about `turn.desynced` on every sweep of a paused
228
+ * match, where the log is the whole match; that answer lives on the turn row now
229
+ * (`claimDesyncAnnouncement`), and this must not grow another steady-state caller.
230
+ */
194
231
  async hasEvent(matchId, type) {
232
+ const matches = (event) => event.type === type;
195
233
  let after = 0;
196
234
  for (;;) {
197
235
  const page = await this.deps.storage.events.listAfter(matchId, after, 200);
198
- if (page.some((event) => event.type === type))
236
+ if (page.some(matches))
199
237
  return true;
200
238
  if (page.length < 200)
201
239
  return false;
@@ -229,6 +267,7 @@ export class TurnService {
229
267
  orderSetHash: null,
230
268
  sealedSlots: null,
231
269
  stateHash: null,
270
+ desyncedAt: null,
232
271
  }, players.map((player) => player.id));
233
272
  // A desynced match counts: a repaired seal must still point `currentTurn` at the turn that is
234
273
  // actually open, even though nobody may submit to it until the pause lifts.
@@ -243,7 +282,20 @@ export class TurnService {
243
282
  });
244
283
  }
245
284
  if (deadlineAt) {
246
- await this.deps.scheduler.schedule({ matchId: match.id, turn: number, dueAt: deadlineAt });
285
+ try {
286
+ await this.deps.scheduler.schedule({ matchId: match.id, turn: number, dueAt: deadlineAt });
287
+ }
288
+ catch (error) {
289
+ // The deadline is durable on the turn row and `listExpiredOpen` is the safety net behind
290
+ // every timer, so a scheduler that cannot be reached costs at most one sweep interval of
291
+ // lateness. It used to cost the submitter a 500 on a seal that had already completed,
292
+ // which left them retrying a request the server had in fact finished.
293
+ this.deps.logger.warn('could not arm a turn deadline; the sweep will seal it', {
294
+ matchId: match.id,
295
+ turn: number,
296
+ error: String(error),
297
+ });
298
+ }
247
299
  }
248
300
  return created;
249
301
  }
@@ -253,38 +305,69 @@ export class TurnService {
253
305
  * call this on an interval (Node) or a cron (Cloudflare).
254
306
  */
255
307
  async sweep(limit = 100) {
256
- const expired = await this.deps.storage.turns.listExpiredOpen(this.deps.clock.now(), limit);
308
+ const now = this.deps.clock.now();
309
+ // Every pass but one in `FULL_SCAN_EVERY` looks only at matches something happened to
310
+ // recently; see `SWEEP_WINDOW_MS`. The counter starts at the period, so a process that has
311
+ // just started scans everything once before settling into the cheap cadence.
312
+ this.passesSinceFullScan += 1;
313
+ const full = this.passesSinceFullScan >= FULL_SCAN_EVERY;
314
+ if (full)
315
+ this.passesSinceFullScan = 0;
316
+ const touchedSince = full ? null : new Date(now.getTime() - SWEEP_WINDOW_MS);
317
+ const expired = await this.deps.storage.turns.listExpiredOpen(now, limit);
257
318
  let sealed = 0;
258
319
  for (const { matchId, number } of expired) {
259
- if (await this.trySeal(matchId, number, 'deadline'))
320
+ // One match that throws must not abort the pass. `listExpiredOpen` is ordered oldest first,
321
+ // so the same match would be at the head of the next pass too and no later expired turn or
322
+ // stalled seal would ever be reached — and this is the safety net behind a lost timer.
323
+ if (await this.guard(matchId, number, () => this.trySeal(matchId, number, 'deadline'))) {
260
324
  sealed += 1;
325
+ }
261
326
  }
262
327
  // A seal in flight looks stalled for the moment between its compare-and-swap and the next turn
263
328
  // opening, so this also runs against healthy matches. `completeSeal` changes nothing there, and
264
329
  // only a call that actually had work left to do is reported.
265
330
  let repaired = 0;
266
- for (const { matchId, number } of await this.deps.storage.turns.listStalledSeals(limit)) {
267
- const match = await this.deps.storage.matches.get(matchId);
268
- if (!match)
269
- continue;
270
- if (await this.completeSeal(match, number)) {
331
+ for (const { matchId, number } of await this.deps.storage.turns.listStalledSeals(limit, touchedSince)) {
332
+ const finished = await this.guard(matchId, number, async () => {
333
+ const match = await this.deps.storage.matches.get(matchId);
334
+ if (!match)
335
+ return false;
336
+ return this.completeSeal(match, number);
337
+ });
338
+ if (finished) {
271
339
  this.deps.logger.warn('finished an interrupted seal', { matchId, turn: number });
272
340
  repaired += 1;
273
341
  }
274
342
  }
343
+ // A verdict cut short after its compare-and-swap leaves the match `desynced` with nothing
344
+ // unsettled, which no other path revisits.
345
+ for (const matchId of await this.deps.storage.matches.listDesynced(limit, touchedSince)) {
346
+ await this.guard(matchId, 0, async () => {
347
+ await this.reevaluate(matchId);
348
+ return false;
349
+ });
350
+ }
275
351
  return { sealed, repaired };
276
352
  }
277
- async report(principal, number, request) {
278
- const { match, player } = principal;
279
- if (match.status !== 'running' && match.status !== 'desynced') {
280
- throw new ConflictError('The match is not in progress', { reason: 'match_not_running' });
353
+ async guard(matchId, turn, step) {
354
+ try {
355
+ return await step();
281
356
  }
282
- if (player.status !== 'active' && player.status !== 'takeoverPending') {
283
- throw new ForbiddenError('You are no longer part of this match', { reason: 'not_active' });
357
+ catch (error) {
358
+ this.deps.logger.warn('a match was skipped by the sweep', {
359
+ matchId,
360
+ turn,
361
+ error: String(error),
362
+ });
363
+ return false;
284
364
  }
285
- const turn = await this.deps.storage.turns.get(match.id, number);
286
- if (!turn)
287
- throw new NotFoundError('No such turn', { reason: 'unknown_turn' });
365
+ }
366
+ async report(principal, number, request) {
367
+ const { match, player } = principal;
368
+ requireInProgress(match);
369
+ requireParticipant(player);
370
+ const turn = await requireTurn(this.deps.storage.turns, match.id, number);
288
371
  if (turn.status === 'open') {
289
372
  throw new ConflictError('The turn has not been sealed yet', { reason: 'turn_open' });
290
373
  }
@@ -295,14 +378,21 @@ export class TurnService {
295
378
  throw new ConflictError('That turn is already confirmed', { reason: 'turn_confirmed' });
296
379
  }
297
380
  await this.restorePendingPlayer(player.id, match.id);
298
- await this.deps.storage.turns.upsertReport({
381
+ // Conditional on the turn still awaiting a verdict, because its status was read a statement
382
+ // ago: a report that lost the race with a `settle` confirming the turn would otherwise land
383
+ // behind the verdict it could not have changed, against the rule that the evidence a verdict
384
+ // was taken on is immutable. The client treats the refusal as success, as it already does for
385
+ // the check above.
386
+ if (!(await this.deps.storage.turns.upsertReport({
299
387
  matchId: match.id,
300
388
  turn: number,
301
389
  playerId: player.id,
302
390
  stateHash: request.stateHash,
303
391
  finished: request.finished,
304
392
  reportedAt: this.deps.clock.now(),
305
- });
393
+ }))) {
394
+ throw new ConflictError('That turn is already confirmed', { reason: 'turn_confirmed' });
395
+ }
306
396
  // The order set is the turn increment the server retains. Publishing these few derived counters
307
397
  // with the host's report keeps late-join selection current without uploading another full save.
308
398
  if (player.id === match.hostPlayerId && request.seatSummaries !== undefined) {
@@ -344,6 +434,11 @@ export class TurnService {
344
434
  * seats it finds absent, or by a vote on a seat that went quiet before anyone was present to ask,
345
435
  * is exactly as blocking as one raised by a kick, and each of those used to leave the countdown
346
436
  * running. `openTurn` applies the same rule to a turn opening while a prompt is already up.
437
+ *
438
+ * The pause is a no-op when there is no open turn to stop (during a seal, where the turn the
439
+ * absence was noticed on is already sealed and its successor opens paused instead) and when the
440
+ * clock is stopped already, so a second absent seat neither double-publishes nor disturbs the
441
+ * first pause.
347
442
  */
348
443
  async openTakeoverPrompt(matchId, playerId, turn) {
349
444
  const opened = await this.deps.storage.takeovers.openPrompt(matchId, playerId, turn, this.deps.clock.now());
@@ -353,20 +448,21 @@ export class TurnService {
353
448
  type: 'match.takeoverVoteRequested',
354
449
  payload: { playerId, turn },
355
450
  });
356
- await this.pauseForTakeoverVote(matchId);
451
+ await this.clearOpenDeadline(matchId);
357
452
  return true;
358
453
  }
359
454
  /**
360
- * Pause the open turn while players decide what to do with an absent human seat.
455
+ * Stop the clock of a match whose last active player has just left.
361
456
  *
362
- * Only `openTakeoverPrompt` calls this, so every prompt pauses and none has to remember to. It is
363
- * a no-op when there is no open turn to stop — during a seal, where the turn the absence was
364
- * noticed on is already sealed and its successor opens paused instead — and when the clock is
365
- * stopped already, so a second absent seat neither double-publishes nor disturbs the first pause.
457
+ * There is nobody left to ask about the empty seat, so no prompt is opened and nothing else would
458
+ * pause the turn. `resumeAfterTakeoverVotes`, which `rejoin` calls, restarts it.
366
459
  */
367
- async pauseForTakeoverVote(matchId) {
460
+ async pauseAbandonedMatch(matchId) {
461
+ await this.clearOpenDeadline(matchId);
462
+ }
463
+ async clearOpenDeadline(matchId) {
368
464
  const match = await this.deps.storage.matches.get(matchId);
369
- if (!match || (match.status !== 'running' && match.status !== 'desynced'))
465
+ if (!match || !isInProgress(match))
370
466
  return;
371
467
  const turn = await this.deps.storage.turns.get(matchId, match.currentTurn);
372
468
  if (turn?.status !== 'open' || turn.deadlineAt === null)
@@ -393,20 +489,39 @@ export class TurnService {
393
489
  !(await this.deps.storage.turns.rescheduleDeadline(matchId, match.currentTurn, deadlineAt))) {
394
490
  return;
395
491
  }
492
+ // A prompt that opened between the check above and this write would have cleared a deadline
493
+ // that did not exist yet, so the clock would be left running behind a modal nobody can dismiss.
494
+ // Asking again after the write closes that interleaving: whichever of the two ran last, the
495
+ // deadline ends up cleared.
496
+ if (await this.deps.storage.takeovers.hasOpenPrompts(matchId)) {
497
+ await this.clearOpenDeadline(matchId);
498
+ return;
499
+ }
500
+ await this.announceDeadline(matchId, match.currentTurn, deadlineAt);
501
+ }
502
+ /** Tell clients the open turn's restarted clock, then arm the timer that seals it. */
503
+ async announceDeadline(matchId, turn, deadlineAt) {
396
504
  await this.publisher.publish(matchId, {
397
505
  type: 'turn.deadlineExtended',
398
- payload: { turn: match.currentTurn, deadlineAt: deadlineAt.toISOString() },
506
+ payload: { turn, deadlineAt: deadlineAt.toISOString() },
399
507
  });
400
- await this.deps.scheduler.schedule({ matchId, turn: match.currentTurn, dueAt: deadlineAt });
508
+ await this.deps.scheduler.schedule({ matchId, turn, dueAt: deadlineAt });
401
509
  }
402
510
  /** Re-run the verdict of every unconfirmed turn and the auto-seal of the open one. */
403
511
  async reevaluate(matchId) {
404
512
  const match = await this.deps.storage.matches.get(matchId);
405
- if (!match || (match.status !== 'running' && match.status !== 'desynced'))
513
+ if (!match || !isInProgress(match))
406
514
  return;
407
- for (const turn of await this.deps.storage.turns.listUnsettled(matchId)) {
515
+ const unsettled = await this.deps.storage.turns.listUnsettled(matchId);
516
+ for (const turn of unsettled) {
408
517
  await this.settle(matchId, turn.number);
409
518
  }
519
+ // A match left `desynced` with nothing unsettled is a verdict whose consequences were cut short
520
+ // after its compare-and-swap. Nothing else reaches `resumeAfterDesync`, so without this the
521
+ // match answers `match_desynced` to every submission for the rest of its life.
522
+ if (match.status === 'desynced' && unsettled.length === 0) {
523
+ await this.resumeAfterDesync(matchId, this.deps.clock.now());
524
+ }
410
525
  await this.trySeal(matchId, match.currentTurn, 'ready');
411
526
  }
412
527
  /** Decide turn `number` from the reports on file. Idempotent and race-safe through CAS. */
@@ -415,12 +530,24 @@ export class TurnService {
415
530
  this.deps.storage.matches.get(matchId),
416
531
  this.deps.storage.turns.get(matchId, number),
417
532
  ]);
418
- if (!match || !turn || turn.status === 'open' || turn.status === 'confirmed')
533
+ if (!match || !turn || turn.status === 'open')
419
534
  return;
535
+ if (turn.status === 'confirmed') {
536
+ // The compare-and-swap already happened; what may not have is what follows it. A process that
537
+ // died between the two left the match `desynced` for good with nothing unsettled, so
538
+ // `submitOrders` answered `match_desynced` forever and nothing could reach `resumeAfterDesync`
539
+ // again — it is private and `reevaluate` only visits sealed and desynced turns. The seal path
540
+ // was built to survive exactly this; the verdict path was not.
541
+ if (match.status === 'desynced')
542
+ await this.resumeAfterDesync(matchId, this.deps.clock.now());
543
+ return;
544
+ }
420
545
  const [players, reports, snapshot] = await Promise.all([
421
546
  this.deps.storage.players.listByMatch(matchId),
422
547
  this.deps.storage.turns.listReports(matchId, number),
423
- this.deps.storage.snapshots.get(matchId, number),
548
+ // The summary, not the row: the verdict reads one hash, and `get` carries up to a megabyte
549
+ // of base64 with it, on every unsettled turn of every paused match on every sweep.
550
+ this.deps.storage.snapshots.getSummary(matchId, number),
424
551
  ]);
425
552
  const verdict = evaluateConsensus(players, reports, snapshot?.stateHash ?? null);
426
553
  const now = this.deps.clock.now();
@@ -455,20 +582,31 @@ export class TurnService {
455
582
  return;
456
583
  }
457
584
  if (verdict.kind === 'desynced') {
458
- const won = await this.deps.storage.turns.transition(matchId, number, ['sealed'], {
459
- status: 'desynced',
460
- });
585
+ // Each consequence is conditional on its own state rather than on winning the transition, so
586
+ // a retry after an interrupted verdict finishes the job. Losing the CAS and returning here
587
+ // left the match `running` with the turn already `desynced`: `turn.desynced` was never
588
+ // announced, `SnapshotService.upload` refused the repair with `snapshot_not_required` because
589
+ // the match was not desynced, and the turn stayed unsettled for good.
590
+ const won = turn.status === 'desynced' ||
591
+ (await this.deps.storage.turns.transition(matchId, number, ['sealed'], {
592
+ status: 'desynced',
593
+ }));
461
594
  if (!won)
462
595
  return;
463
596
  this.deps.logger.warn('turn desynced', { matchId, turn: number });
464
- await this.publisher.publish(matchId, {
465
- type: 'turn.desynced',
466
- payload: {
467
- turn: number,
468
- reports: verdict.reports,
469
- candidateStateHashes: verdict.candidateStateHashes,
470
- },
471
- });
597
+ // The announcement is claimed on the turn row, the way the seal's digest is, so exactly one
598
+ // caller publishes it. Asking the event log instead paged every event the match had ever
599
+ // logged, on every sweep, for the whole of a pause that can last the retention window.
600
+ if (await this.deps.storage.turns.claimDesyncAnnouncement(matchId, number, now)) {
601
+ await this.publisher.publish(matchId, {
602
+ type: 'turn.desynced',
603
+ payload: {
604
+ turn: number,
605
+ reports: verdict.reports,
606
+ candidateStateHashes: verdict.candidateStateHashes,
607
+ },
608
+ });
609
+ }
472
610
  if (await this.deps.storage.matches.transition(matchId, ['running'], {
473
611
  status: 'desynced',
474
612
  updatedAt: now,
@@ -501,17 +639,20 @@ export class TurnService {
501
639
  type: 'match.statusChanged',
502
640
  payload: { status: 'running' },
503
641
  });
642
+ // Not behind a modal. Kicking the odd one out is the documented remedy for a desync, and the
643
+ // kick opens an absence prompt for the kicked seat, so this path reached a paused turn every
644
+ // time in a timed match and put a full deadline back on it while the vote nobody could dismiss
645
+ // was still up. `resumeAfterTakeoverVotes` restarts the clock when the last prompt closes, the
646
+ // same way `openTurn` leaves a turn paused when it opens behind one.
647
+ if (await this.deps.storage.takeovers.hasOpenPrompts(matchId))
648
+ return;
504
649
  const deadlineAt = turnDeadline(now, match.settings.turnTimerSeconds);
505
650
  if (deadlineAt === null)
506
651
  return; // A match without a turn timer has no clock to restart.
507
652
  if (!(await this.deps.storage.turns.rescheduleDeadline(matchId, match.currentTurn, deadlineAt))) {
508
653
  return;
509
654
  }
510
- await this.publisher.publish(matchId, {
511
- type: 'turn.deadlineExtended',
512
- payload: { turn: match.currentTurn, deadlineAt: deadlineAt.toISOString() },
513
- });
514
- await this.deps.scheduler.schedule({ matchId, turn: match.currentTurn, dueAt: deadlineAt });
655
+ await this.announceDeadline(matchId, match.currentTurn, deadlineAt);
515
656
  }
516
657
  }
517
658
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"TurnService.js","sourceRoot":"","sources":["../../src/services/TurnService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TurnService.js","sourceRoot":"","sources":["../../src/services/TurnService.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,GAIX,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,YAAY,GAGb,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAIlG,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAItD,yFAAyF;AACzF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAA;AAE3B;;;;;;;;GAQG;AACH,MAAM,eAAe,GAAG,CAAC,GAAG,MAAM,CAAA;AAElC;;;GAGG;AACH,MAAM,eAAe,GAAG,EAAE,CAAA;AAE1B;;;;;;;;;;GAUG;AACH,MAAM,OAAO,WAAW;IAKH,IAAI;IACJ,SAAS;IAL5B,qGAAqG;IAC7F,mBAAmB,GAAG,eAAe,CAAA;IAE7C,YACmB,IAAgB,EAChB,SAAyB;oBADzB,IAAI;yBACJ,SAAS;IACzB,CAAC;IAEJ,KAAK,CAAC,YAAY,CAChB,SAAoB,EACpB,MAAc,EACd,OAA4B;QAE5B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;QACnC,cAAc,CAAC,KAAK,CAAC,CAAA;QACrB,kBAAkB,CAAC,MAAM,CAAC,CAAA;QAC1B,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QAClC,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAC1D,MAAM,GAAG,GAAsB;YAC7B,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,UAAU;SACX,CAAA;QACD,IAAI,MAAM,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;YACjC,2FAA2F;YAC3F,2FAA2F;YAC3F,yFAAyF;YACzF,wBAAwB;YACxB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;YAC5F,IAAI,SAAS,EAAE,UAAU,KAAK,UAAU,IAAI,SAAS,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;gBAAE,OAAO,GAAG,CAAA;YACzF,MAAM,IAAI,aAAa,CAAC,QAAQ,KAAK,CAAC,WAAW,mBAAmB,EAAE;gBACpE,MAAM,EAAE,kBAAkB;gBAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;aAC/B,CAAC,CAAA;QACJ,CAAC;QACD,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;QACpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;QAC3F,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE;YACvF,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,UAAU;YACV,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;SACnC,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,aAAa,CAAC,wCAAwC,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAA;QAChG,CAAC;QACD,IAAI,QAAQ,EAAE,KAAK,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;YACtC,wFAAwF;YACxF,6FAA6F;YAC7F,8FAA8F;YAC9F,6FAA6F;YAC7F,4FAA4F;YAC5F,2FAA2F;YAC3F,kDAAkD;YAClD,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE;gBACrC,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;aACrE,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,KAAK;YAAE,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAChE,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,yFAAyF;IACzF,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,MAAc,EAAE,OAAoB;QACjE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC1D,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS;YAAE,OAAO,KAAK,CAAA;QAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC/D,IAAI,IAAI,EAAE,MAAM,KAAK,MAAM;YAAE,OAAO,KAAK,CAAA;QACzC,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC5F,OAAO,KAAK,CAAA;YACd,CAAC;YACD,yFAAyF;YACzF,wFAAwF;YACxF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;YACnE,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;gBACrC,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;gBAC9C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC;aAC5D,CAAC,CAAA;YACF,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC;gBAAE,OAAO,KAAK,CAAA;QACpD,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE;YAC9E,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;SAChC,CAAC,CAAA;QACF,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAA;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;QACxE,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACtC,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,YAAY,CAAC,KAAY,EAAE,MAAc;QACrD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAChE,IAAI,IAAI,EAAE,MAAM,KAAK,MAAM;YAAE,OAAO,KAAK,CAAA;QACzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,0FAA0F;YAC1F,wFAAwF;YACxF,6FAA6F;YAC7F,uEAAuE;YACvE,IAAI,MAAM,IAAI,UAAU;gBAAE,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAA;YAClE,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;QAC3D,CAAC;QACD,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAC5D,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC;gBAC5D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;aAChD,CAAC,CAAA;YACF,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAC3E,CAAA;YACD,KAAK,MAAM,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5C,oFAAoF;gBACpF,0EAA0E;gBAC1E,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC;oBAAE,SAAQ;gBAC3F,IACE,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,EAC1F,CAAC;oBACD,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;gBAC5D,CAAC;YACH,CAAC;YACD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAC5E,MAAM,MAAM,GAAG,IAAI,GAAG,CACpB,iBAAiB,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAC5E,CAAA;YACD,MAAM,WAAW,GAAiB,EAAE,CAAA;YACpC,MAAM,OAAO,GAAgD,EAAE,CAAA;YAC/D,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBACrC,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI;oBAAE,SAAQ;gBAC3D,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;gBAClD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;YACpD,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAA;YAChD,uFAAuF;YACvF,qFAAqF;YACrF,0FAA0F;YAC1F,2FAA2F;YAC3F,2EAA2E;YAC3E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE;gBACxE,YAAY;gBACZ,WAAW;aACZ,CAAC,CAAA;YACF,IAAI,MAAM,EAAE,CAAC;gBACX,QAAQ,GAAG,IAAI,CAAA;gBACf,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE;oBACrC,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE;iBACxC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAA;IAC7D,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,sBAAsB,CAAC,KAAY;QAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;YAAE,OAAM;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACpE,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAA;QACtF,CAAC;QACD,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,eAAe,CAAC;YAAE,OAAM;QAC1D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACpE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7E,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAC1B,KAAK,CAAC,EAAE,EACR,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAC1D,CAAA;IACH,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,QAAQ,CAAC,OAAe,EAAE,IAAY;QAClD,MAAM,OAAO,GAAG,CAAC,KAAuB,EAAW,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAA;QACzE,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,SAAS,CAAC;YACR,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;YAC1E,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAA;YACnC,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG;gBAAE,OAAO,KAAK,CAAA;YACnC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,KAAK,CAAA;QAC7C,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,KAAY,EAAE,MAAc;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACpE,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;QACzC,0FAA0F;QAC1F,8FAA8F;QAC9F,4FAA4F;QAC5F,cAAc;QACd,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACjF,MAAM,UAAU,GAAG,cAAc;YAC/B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QAC3D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAChD;YACE,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,MAAM;YACN,MAAM,EAAE,MAAM;YACd,QAAQ;YACR,UAAU;YACV,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,IAAI;SACjB,EACD,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CACnC,CAAA;QACD,8FAA8F;QAC9F,4EAA4E;QAC5E,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE;YAC5E,WAAW,EAAE,MAAM;YACnB,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAA;QACF,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE;gBACrC,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE;aACzE,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;YAC5F,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,yFAAyF;gBACzF,yFAAyF;gBACzF,sFAAsF;gBACtF,sEAAsE;gBACtE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uDAAuD,EAAE;oBAC7E,OAAO,EAAE,KAAK,CAAC,EAAE;oBACjB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;iBACrB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;QACjC,sFAAsF;QACtF,2FAA2F;QAC3F,6EAA6E;QAC7E,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAA;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,IAAI,eAAe,CAAA;QACxD,IAAI,IAAI;YAAE,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAA;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,eAAe,CAAC,CAAA;QAC5E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACzE,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,KAAK,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YAC1C,4FAA4F;YAC5F,2FAA2F;YAC3F,uFAAuF;YACvF,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;gBACvF,MAAM,IAAI,CAAC,CAAA;YACb,CAAC;QACH,CAAC;QACD,+FAA+F;QAC/F,gGAAgG;QAChG,6DAA6D;QAC7D,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,KAAK,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAC9E,KAAK,EACL,YAAY,CACb,EAAE,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;gBAC5D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBAC1D,IAAI,CAAC,KAAK;oBAAE,OAAO,KAAK,CAAA;gBACxB,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YACzC,CAAC,CAAC,CAAA;YACF,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;gBAChF,QAAQ,IAAI,CAAC,CAAA;YACf,CAAC;QACH,CAAC;QACD,0FAA0F;QAC1F,2CAA2C;QAC3C,KAAK,MAAM,OAAO,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,CAAC;YACxF,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE;gBACtC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;gBAC9B,OAAO,KAAK,CAAA;YACd,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;IAC7B,CAAC;IAEO,KAAK,CAAC,KAAK,CACjB,OAAe,EACf,IAAY,EACZ,IAA4B;QAE5B,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,EAAE,CAAA;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE;gBACxD,OAAO;gBACP,IAAI;gBACJ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACrB,CAAC,CAAA;YACF,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAoB,EAAE,MAAc,EAAE,OAA0B;QAC3E,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;QACnC,iBAAiB,CAAC,KAAK,CAAC,CAAA;QACxB,kBAAkB,CAAC,MAAM,CAAC,CAAA;QAC1B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QACzE,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,aAAa,CAAC,kCAAkC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;QACtF,CAAC;QACD,0FAA0F;QAC1F,8FAA8F;QAC9F,uEAAuE;QACvE,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,MAAM,IAAI,aAAa,CAAC,gCAAgC,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAA;QACzF,CAAC;QACD,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;QACpD,4FAA4F;QAC5F,4FAA4F;QAC5F,6FAA6F;QAC7F,8FAA8F;QAC9F,mBAAmB;QACnB,IACE,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;YAC3C,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;SAClC,CAAC,CAAC,EACH,CAAC;YACD,MAAM,IAAI,aAAa,CAAC,gCAAgC,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAA;QACzF,CAAC;QACD,gGAAgG;QAChG,gGAAgG;QAChG,IAAI,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,YAAY,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YAC5E,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,yBAAyB,CACvD,KAAK,CAAC,EAAE,EACR,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,EACtE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CACtB,CAAA;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,4FAA4F;gBAC5F,yFAAyF;gBACzF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE;oBACxD,OAAO,EAAE,KAAK,CAAC,EAAE;oBACjB,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;iBACrB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACrC,CAAC;IAED,6FAA6F;IACrF,KAAK,CAAC,oBAAoB,CAAC,QAAgB,EAAE,OAAe;QAClE,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,iBAAiB,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC9F,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;YAChE,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;gBACpC,IAAI,EAAE,6BAA6B;gBACnC,OAAO,EAAE,EAAE,QAAQ,EAAE;aACtB,CAAC,CAAA;YACF,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,QAAgB,EAAE,IAAY;QACtE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CACzD,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CACtB,CAAA;QACD,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAA;QACzB,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;YACpC,IAAI,EAAE,6BAA6B;YACnC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC5B,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;QACrC,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,mBAAmB,CAAC,OAAe;QACvC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,OAAe;QAC7C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC1D,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;YAAE,OAAM;QAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;QAC1E,IAAI,IAAI,EAAE,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE,OAAM;QAC/D,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACvF,OAAM;QACR,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;YACpC,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE;SACvD,CAAC,CAAA;IACJ,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,wBAAwB,CAAC,OAAe;QAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC1D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,KAAK,CAAC;YAAE,OAAM;QACzF,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC;YAAE,OAAM;QACrE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;QAC1E,IAAI,IAAI,EAAE,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE,OAAM;QAC/D,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QACvF,IACE,UAAU,KAAK,IAAI;YACnB,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,EAC3F,CAAC;YACD,OAAM;QACR,CAAC;QACD,4FAA4F;QAC5F,gGAAgG;QAChG,4FAA4F;QAC5F,4BAA4B;QAC5B,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;YACrC,OAAM;QACR,CAAC;QACD,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;IACrE,CAAC;IAED,sFAAsF;IAC9E,KAAK,CAAC,gBAAgB,CAAC,OAAe,EAAE,IAAY,EAAE,UAAgB;QAC5E,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;YACpC,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE,EAAE;SACxD,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;IAC1E,CAAC;IAED,sFAAsF;IACtF,KAAK,CAAC,UAAU,CAAC,OAAe;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC1D,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;YAAE,OAAM;QAC1C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QACtE,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACzC,CAAC;QACD,gGAAgG;QAChG,4FAA4F;QAC5F,+EAA+E;QAC/E,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAA;QAC9D,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IACzD,CAAC;IAED,2FAA2F;IAC3F,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,MAAc;QAC1C,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC;SAC7C,CAAC,CAAA;QACF,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;YAAE,OAAM;QACrD,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,8FAA8F;YAC9F,qFAAqF;YACrF,+FAA+F;YAC/F,8FAA8F;YAC9F,+DAA+D;YAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU;gBAAE,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAA;YAC7F,OAAM;QACR,CAAC;QACD,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACrD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;YACpD,2FAA2F;YAC3F,mFAAmF;YACnF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;SACxD,CAAC,CAAA;QACF,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,IAAI,IAAI,CAAC,CAAA;QAChF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;QACjC,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAClD,OAAO,EACP,MAAM,EACN,CAAC,QAAQ,EAAE,UAAU,CAAC,EACtB;gBACE,MAAM,EAAE,WAAW;gBACnB,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CACF,CAAA;YACD,IAAI,CAAC,GAAG;gBAAE,OAAM;YAChB,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;gBACpC,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE;aACxD,CAAC,CAAA;YACF,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU;gBAAE,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;YAC3E,IACE,OAAO,CAAC,QAAQ;gBAChB,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE;oBAC5E,MAAM,EAAE,UAAU;oBAClB,SAAS,EAAE,GAAG;iBACf,CAAC,CAAC,EACH,CAAC;gBACD,wFAAwF;gBACxF,yFAAyF;gBACzF,wFAAwF;gBACxF,oFAAoF;gBACpF,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;gBAChF,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;oBACpC,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;iBAChC,CAAC,CAAA;YACJ,CAAC;YACD,OAAM;QACR,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAChC,6FAA6F;YAC7F,2FAA2F;YAC3F,uFAAuF;YACvF,8FAA8F;YAC9F,sEAAsE;YACtE,MAAM,GAAG,GACP,IAAI,CAAC,MAAM,KAAK,UAAU;gBAC1B,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE;oBACrE,MAAM,EAAE,UAAU;iBACnB,CAAC,CAAC,CAAA;YACL,IAAI,CAAC,GAAG;gBAAE,OAAM;YAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;YACjE,4FAA4F;YAC5F,yFAAyF;YACzF,uFAAuF;YACvF,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;gBAChF,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;oBACpC,IAAI,EAAE,eAAe;oBACrB,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;qBACnD;iBACF,CAAC,CAAA;YACJ,CAAC;YACD,IACE,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE;gBAC/D,MAAM,EAAE,UAAU;gBAClB,SAAS,EAAE,GAAG;aACf,CAAC,EACF,CAAC;gBACD,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;oBACpC,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;iBAChC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,iBAAiB,CAAC,OAAe,EAAE,GAAS;QACxD,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAM;QAC7E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC1D,IAAI,CAAC,KAAK;YAAE,OAAM;QAClB,IACE,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE;YAClE,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,GAAG;SACf,CAAC,CAAC,EACH,CAAC;YACD,OAAM;QACR,CAAC;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;YACpC,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;SAC/B,CAAC,CAAA;QACF,6FAA6F;QAC7F,6FAA6F;QAC7F,+FAA+F;QAC/F,+FAA+F;QAC/F,qEAAqE;QACrE,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC;YAAE,OAAM;QACrE,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;QACrE,IAAI,UAAU,KAAK,IAAI;YAAE,OAAM,CAAC,wDAAwD;QACxF,IACE,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,EAC3F,CAAC;YACD,OAAM;QACR,CAAC;QACD,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;IACrE,CAAC;CACF;AAED;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,OAA4B,EAAE,IAAY;IAC9D,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAChD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAChC,MAAM,IAAI,eAAe,CAAC,uCAAuC,EAAE;QACjE,MAAM,EAAE,kBAAkB;QAC1B,IAAI;QACJ,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;KACzE,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAY;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,IAAI,aAAa,CAAC,uDAAuD,EAAE;YAC/E,MAAM,EAAE,gBAAgB;SACzB,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,aAAa,CAAC,8BAA8B,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAA;IAC1F,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"createKernel.js","sourceRoot":"","sources":["../../src/services/createKernel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,YAAY,EAA4B,MAAM,gBAAgB,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAwB,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAiB3C,oFAAoF;AACpF,MAAM,UAAU,YAAY,CAAC,IAAgB,EAAE,UAAyB,EAAE;IACxE,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAC9C,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;QACnC,KAAK,EAAE,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;QAC1C,KAAK,EAAE,IAAI,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC;QACxD,KAAK;QACL,SAAS,EAAE,IAAI,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC;QACtD,SAAS,EAAE,IAAI,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC;KACzD,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"createKernel.js","sourceRoot":"","sources":["../../src/services/createKernel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,YAAY,EAA4B,MAAM,gBAAgB,CAAA;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAwB,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAiB3C,oFAAoF;AACpF,MAAM,UAAU,YAAY,CAAC,IAAgB,EAAE,OAAO,GAAkB,EAAE;IACxE,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAC9C,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;QACnC,KAAK,EAAE,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;QAC1C,KAAK,EAAE,IAAI,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC;QACxD,KAAK;QACL,SAAS,EAAE,IAAI,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC;QACtD,SAAS,EAAE,IAAI,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC;KACzD,CAAA;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type Match, type Player, type Turn } from '../domain/entities';
2
+ import type { TurnRepository } from '../ports/storage';
3
+ /** Refuse a match that has not started or has ended. A desync pause passes. */
4
+ export declare function requireInProgress(match: Match): void;
5
+ /** Refuse a caller whose seat was left, kicked or handed to the computer. */
6
+ export declare function requireParticipant(player: Player): void;
7
+ /** One read of the turn row, refused as `unknown_turn` when the match has no such turn. */
8
+ export declare function requireTurn(turns: Pick<TurnRepository, 'get'>, matchId: string, number: number): Promise<Turn>;
9
+ //# sourceMappingURL=guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../src/services/guards.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,MAAM,EACX,KAAK,IAAI,EACV,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEtD,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAGpD;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAGvD;AAED,2FAA2F;AAC3F,wBAAsB,WAAW,CAC/B,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,EAClC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAIf"}