@chaos-overlords/kernel 0.8.0 → 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.
- package/dist/domain/entities.d.ts +27 -1
- package/dist/domain/entities.d.ts.map +1 -1
- package/dist/domain/entities.js.map +1 -1
- package/dist/domain/errors.d.ts.map +1 -1
- package/dist/domain/errors.js.map +1 -1
- package/dist/logic/canonical-json.d.ts.map +1 -1
- package/dist/logic/canonical-json.js.map +1 -1
- package/dist/ports/storage.d.ts +130 -12
- package/dist/ports/storage.d.ts.map +1 -1
- package/dist/services/AuthService.d.ts.map +1 -1
- package/dist/services/AuthService.js.map +1 -1
- package/dist/services/EventPublisher.d.ts.map +1 -1
- package/dist/services/EventPublisher.js.map +1 -1
- package/dist/services/LobbyService.d.ts +32 -2
- package/dist/services/LobbyService.d.ts.map +1 -1
- package/dist/services/LobbyService.js +221 -44
- package/dist/services/LobbyService.js.map +1 -1
- package/dist/services/MatchQueryService.d.ts +8 -0
- package/dist/services/MatchQueryService.d.ts.map +1 -1
- package/dist/services/MatchQueryService.js +30 -19
- package/dist/services/MatchQueryService.js.map +1 -1
- package/dist/services/RateLimiter.d.ts +6 -0
- package/dist/services/RateLimiter.d.ts.map +1 -1
- package/dist/services/RateLimiter.js +39 -0
- package/dist/services/RateLimiter.js.map +1 -1
- package/dist/services/RetentionService.d.ts +13 -0
- package/dist/services/RetentionService.d.ts.map +1 -1
- package/dist/services/RetentionService.js +19 -2
- package/dist/services/RetentionService.js.map +1 -1
- package/dist/services/SnapshotService.d.ts +46 -9
- package/dist/services/SnapshotService.d.ts.map +1 -1
- package/dist/services/SnapshotService.js +122 -39
- package/dist/services/SnapshotService.js.map +1 -1
- package/dist/services/TurnService.d.ts +35 -3
- package/dist/services/TurnService.d.ts.map +1 -1
- package/dist/services/TurnService.js +205 -35
- package/dist/services/TurnService.js.map +1 -1
- package/dist/services/createKernel.js.map +1 -1
- package/dist/testing/CountingStorage.d.ts +25 -0
- package/dist/testing/CountingStorage.d.ts.map +1 -0
- package/dist/testing/CountingStorage.js +51 -0
- package/dist/testing/CountingStorage.js.map +1 -0
- package/dist/testing/InMemoryStorage.d.ts.map +1 -1
- package/dist/testing/InMemoryStorage.js +83 -17
- package/dist/testing/InMemoryStorage.js.map +1 -1
- package/dist/testing/fakes.d.ts.map +1 -1
- package/dist/testing/fakes.js.map +1 -1
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -0
- package/dist/testing/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MatchEvent, MatchSettings, MatchStatus, OrderDocument, PlayerStatus, TurnStatus } from '@chaos-overlords/contracts';
|
|
1
|
+
import type { LobbyListing, MatchEvent, MatchSettings, MatchStatus, OrderDocument, PlayerStatus, TurnStatus } from '@chaos-overlords/contracts';
|
|
2
2
|
export interface Match {
|
|
3
3
|
id: string;
|
|
4
4
|
/** Wire protocol spoken by the client that created this session. */
|
|
@@ -82,6 +82,15 @@ export interface Turn {
|
|
|
82
82
|
* verdict without trying to reconstruct an old vote against today's roster.
|
|
83
83
|
*/
|
|
84
84
|
stateHash: string | null;
|
|
85
|
+
/**
|
|
86
|
+
* When the verdict announced this turn's divergence, or null while it has not.
|
|
87
|
+
*
|
|
88
|
+
* It is the fact beside the status that makes `turn.desynced` publish-once, exactly as
|
|
89
|
+
* `orderSetHash` does for `turn.sealed`: the caller whose compare-and-swap stamps it is the one
|
|
90
|
+
* that announces. Without it the verdict had to page the whole event log looking for its own
|
|
91
|
+
* announcement, on every sweep, for as long as the match stayed paused.
|
|
92
|
+
*/
|
|
93
|
+
desyncedAt: Date | null;
|
|
85
94
|
}
|
|
86
95
|
/** One player's row for a turn. Rows are pre-created when the turn opens (see TurnRepository). */
|
|
87
96
|
export interface TurnOrders {
|
|
@@ -119,6 +128,23 @@ export interface Snapshot {
|
|
|
119
128
|
}
|
|
120
129
|
/** A snapshot row without its body. */
|
|
121
130
|
export type SnapshotSummary = Omit<Snapshot, 'body'>;
|
|
131
|
+
/**
|
|
132
|
+
* A public listing row as the database produces it: the contract's listing plus the two facts the
|
|
133
|
+
* lobby list used to go back per match for.
|
|
134
|
+
*
|
|
135
|
+
* `playerCount` is already the count the reader wants — seats taken for a lobby, humans still in
|
|
136
|
+
* the match for a running one — and `hasSnapshot` answers "could a late joiner bootstrap here"
|
|
137
|
+
* without a second read. The listing is unauthenticated and rate limited per address, and it used
|
|
138
|
+
* to cost up to two extra queries for every running match it returned.
|
|
139
|
+
*/
|
|
140
|
+
export interface PublicLobbyRow extends LobbyListing {
|
|
141
|
+
hasSnapshot: boolean;
|
|
142
|
+
}
|
|
143
|
+
/** One seat a listed match holds, for the reserved-slot arithmetic of the public listing. */
|
|
144
|
+
export interface MatchSeat {
|
|
145
|
+
matchId: string;
|
|
146
|
+
slot: number;
|
|
147
|
+
}
|
|
122
148
|
export type TakeoverDecision = 'computer' | 'wait';
|
|
123
149
|
export interface TakeoverVote {
|
|
124
150
|
matchId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/domain/entities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,WAAW,EACX,aAAa,EACb,YAAY,EACZ,UAAU,EACX,MAAM,4BAA4B,CAAA;AAEnC,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,oEAAoE;IACpE,eAAe,EAAE,MAAM,CAAA;IACvB;;;;;;;OAOG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,WAAW,CAAA;IACnB,QAAQ,EAAE,aAAa,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAA;IACnB,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAA;IACZ,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,EAAE,YAAY,CAAA;IACpB,QAAQ,EAAE,IAAI,CAAA;CACf;AAED,+EAA+E;AAC/E,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,IAAI;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,UAAU,CAAA;IAClB,QAAQ,EAAE,IAAI,CAAA;IACd,UAAU,EAAE,IAAI,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAA;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B;;;;OAIG;IACH,WAAW,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAAA;IACzC;;;;;;;OAOG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/domain/entities.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/domain/entities.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/domain/entities.ts"],"names":[],"mappings":"AAsLA,MAAM,CAAC,MAAM,aAAa,GAAiB,QAAQ,CAAA;AAEnD,MAAM,UAAU,aAAa,CAAC,OAA0B;IACtD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa,CAAC,CAAA;AACpE,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,iBAAiB,CAAC,OAA0B;IAC1D,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,iBAAiB,CAC9E,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/domain/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAE3D,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAExE,wFAAwF;AACxF,qBAAa,WAAY,SAAQ,KAAK;IAElC,QAAQ,CAAC,IAAI,EAAE,SAAS;IAExB,QAAQ,CAAC,OAAO,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/domain/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAE3D,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAExE,wFAAwF;AACxF,qBAAa,WAAY,SAAQ,KAAK;IAElC,QAAQ,CAAC,IAAI,EAAE,SAAS;IAExB,QAAQ,CAAC,OAAO,EAAE,YAAY;IAHhC,YACW,IAAI,EAAE,SAAS,EACxB,OAAO,EAAE,MAAM,EACN,OAAO,GAAE,YAAiB,EAIpC;CACF;AAED,qBAAa,aAAc,SAAQ,WAAW;IAC5C,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAEtD;CACF;AACD,qBAAa,iBAAkB,SAAQ,WAAW;IAChD,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAEtD;CACF;AACD,qBAAa,cAAe,SAAQ,WAAW;IAC7C,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAEtD;CACF;AACD,qBAAa,aAAc,SAAQ,WAAW;IAC5C,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAEtD;CACF;AACD,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAEtD;CACF;AACD,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAEtD;CACF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/domain/errors.ts"],"names":[],"mappings":"AAIA,wFAAwF;AACxF,MAAM,OAAO,WAAY,SAAQ,KAAK;IAEzB;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/domain/errors.ts"],"names":[],"mappings":"AAIA,wFAAwF;AACxF,MAAM,OAAO,WAAY,SAAQ,KAAK;IAEzB,IAAI;IAEJ,OAAO;IAHlB,YACW,IAAe,EACxB,OAAe,EACN,OAAO,GAAiB,EAAE;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAA;oBAJL,IAAI;uBAEJ,OAAO;QAGhB,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAA;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,WAAW;IAC5C,YAAY,OAAe,EAAE,OAAO,GAAiB,EAAE;QACrD,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACtC,CAAC;CACF;AACD,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IAChD,YAAY,OAAe,EAAE,OAAO,GAAiB,EAAE;QACrD,KAAK,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACzC,CAAC;CACF;AACD,MAAM,OAAO,cAAe,SAAQ,WAAW;IAC7C,YAAY,OAAe,EAAE,OAAO,GAAiB,EAAE;QACrD,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACtC,CAAC;CACF;AACD,MAAM,OAAO,aAAc,SAAQ,WAAW;IAC5C,YAAY,OAAe,EAAE,OAAO,GAAiB,EAAE;QACrD,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACrC,CAAC;CACF;AACD,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAC9C,YAAY,OAAe,EAAE,OAAO,GAAiB,EAAE;QACrD,KAAK,CAAC,mBAAmB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC9C,CAAC;CACF;AACD,MAAM,OAAO,gBAAiB,SAAQ,WAAW;IAC/C,YAAY,OAAe,EAAE,OAAO,GAAiB,EAAE;QACrD,KAAK,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACzC,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,KAAK,YAAY,WAAW,CAAA;AACrC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical-json.d.ts","sourceRoot":"","sources":["../../src/logic/canonical-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpD;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAE7C,QAAQ,CAAC,IAAI,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"canonical-json.d.ts","sourceRoot":"","sources":["../../src/logic/canonical-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpD;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAE7C,QAAQ,CAAC,IAAI,EAAE,MAAM;IADvB,YACW,IAAI,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EAIf;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical-json.js","sourceRoot":"","sources":["../../src/logic/canonical-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;AAC5C,CAAC;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAEpC;
|
|
1
|
+
{"version":3,"file":"canonical-json.js","sourceRoot":"","sources":["../../src/logic/canonical-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;AAC5C,CAAC;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAEpC,IAAI;IADf,YACW,IAAY,EACrB,MAAc;QAEd,KAAK,CAAC,uBAAuB,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC,CAAA;oBAHjD,IAAI;QAIb,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAA;IACtC,CAAC;CACF;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,IAAI,GAAG,EAAE;IAC7C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3F,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,sBAAsB,CAAC,IAAI,EAAE,GAAG,KAAK,0CAA0C,CAAC,CAAA;QAC5F,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACtB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAA;IAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAgC,CAAA;QAC/C,MAAM,MAAM,GAA4B,EAAE,CAAA;QAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACxE,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IACD,MAAM,IAAI,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,OAAO,KAAK,EAAE,CAAC,CAAA;AAC5E,CAAC"}
|
package/dist/ports/storage.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { Match, OrderSummary, PersistedEvent, Player, SealedSlot, Snapshot, SnapshotSummary, TakeoverDecision, TakeoverVote, Turn, TurnOrders, TurnReport } from '../domain/entities';
|
|
1
|
+
import type { MatchEventBody, MatchSettings, MatchStatus, TurnStatus } from '@chaos-overlords/contracts';
|
|
2
|
+
import type { Match, MatchSeat, OrderSummary, PersistedEvent, Player, PublicLobbyRow, SealedSlot, Snapshot, SnapshotSummary, TakeoverDecision, TakeoverVote, Turn, TurnOrders, TurnReport } from '../domain/entities';
|
|
3
3
|
/**
|
|
4
4
|
* Persistence ports. There are NO transactions: D1 has none, so every invariant that two writers
|
|
5
5
|
* could race on is a single conditional statement whose row count says who won. Each `transition`
|
|
@@ -14,7 +14,14 @@ export interface MatchRepository {
|
|
|
14
14
|
create(match: Match): Promise<boolean>;
|
|
15
15
|
get(id: string): Promise<Match | null>;
|
|
16
16
|
getByJoinCode(joinCode: string): Promise<Match | null>;
|
|
17
|
-
|
|
17
|
+
/**
|
|
18
|
+
* The public lobby list: open lobbies and running matches anyone may look at, newest first.
|
|
19
|
+
*
|
|
20
|
+
* `playerCount` and `hasSnapshot` come out of the same statement rather than from a read per
|
|
21
|
+
* listed match, and a running match with no human left in it is left out — it is unjoinable, so
|
|
22
|
+
* advertising it only costs the reader a row and the server the two queries behind it.
|
|
23
|
+
*/
|
|
24
|
+
listPublicLobbies(limit: number): Promise<PublicLobbyRow[]>;
|
|
18
25
|
/**
|
|
19
26
|
* Atomically take a seat while the match is in the lobby and below capacity. Returns the seat's
|
|
20
27
|
* position in the match's monotonic join sequence, or null when no seat was available.
|
|
@@ -32,16 +39,38 @@ export interface MatchRepository {
|
|
|
32
39
|
*/
|
|
33
40
|
deleteInactive(statuses: readonly MatchStatus[], before: Date, limit: number): Promise<number>;
|
|
34
41
|
/**
|
|
35
|
-
* Deletes running or desynced matches last touched before `before
|
|
36
|
-
*
|
|
42
|
+
* Deletes running or desynced matches last touched before `before`, with everything they own.
|
|
43
|
+
* Returns how many went.
|
|
37
44
|
*
|
|
38
45
|
* The living-dead case: everybody walked away from a running match, which is deliberately kept so
|
|
39
46
|
* anyone can rejoin, and then nobody ever did. Nothing else collects one — a desync pause is not
|
|
40
47
|
* abandonment and neither is a weekend — so on a public server this is the ordinary end of most
|
|
41
48
|
* matches and it accumulated orders, events and up to five megabytes of snapshot each. The
|
|
42
49
|
* caller's window for these is far longer than the one for a terminated match.
|
|
50
|
+
*
|
|
51
|
+
* `requireEmptyRoster` is the difference between the two windows the caller uses. A player stops
|
|
52
|
+
* being `active` only through `leave`, `kick` or a missed deadline, and the game's default is an
|
|
53
|
+
* untimed match, so two friends whose clients both died mid-match leave two `active` rows that
|
|
54
|
+
* nothing ever clears: with the roster test alone their match is immortal. The longer window drops
|
|
55
|
+
* the test, because `updated_at` is refreshed by every turn open and every status change and
|
|
56
|
+
* months of silence on both is not something a live match does.
|
|
43
57
|
*/
|
|
44
|
-
deleteAbandonedLive(before: Date, limit: number): Promise<number>;
|
|
58
|
+
deleteAbandonedLive(before: Date, limit: number, requireEmptyRoster: boolean): Promise<number>;
|
|
59
|
+
/**
|
|
60
|
+
* Ids of matches sitting in `desynced`, oldest first.
|
|
61
|
+
*
|
|
62
|
+
* The sweep re-runs the verdict for these. A `settle` interrupted after its compare-and-swap
|
|
63
|
+
* leaves the match desynced with nothing unsettled, which no request path revisits.
|
|
64
|
+
*
|
|
65
|
+
* `touchedSince` bounds that to the matches something has actually happened to. `updatedAt` moves
|
|
66
|
+
* on every report and every snapshot upload, so a match that nothing touched since the previous
|
|
67
|
+
* pass has no new evidence and its verdict cannot have changed; without the bound a public
|
|
68
|
+
* server's parked desyncs — the documented way a match ends when a host never uploads — were
|
|
69
|
+
* re-judged every fifteen seconds for the ninety days retention keeps them. It also ends the
|
|
70
|
+
* starvation of a page ordered by an `updatedAt` that never moves: pass null to sweep everything,
|
|
71
|
+
* which is what a freshly started process does once to pick up whatever it missed.
|
|
72
|
+
*/
|
|
73
|
+
listDesynced(limit: number, touchedSince: Date | null): Promise<string[]>;
|
|
45
74
|
/** Compare-and-swap on status; returns false when the match was not in one of `from`. */
|
|
46
75
|
transition(matchId: string, from: readonly MatchStatus[], patch: {
|
|
47
76
|
status?: MatchStatus;
|
|
@@ -58,13 +87,25 @@ export interface PlayerRepository {
|
|
|
58
87
|
* host pressed start from becoming an unseated player in a running match.
|
|
59
88
|
*/
|
|
60
89
|
create(player: Player): Promise<boolean>;
|
|
61
|
-
/**
|
|
90
|
+
/**
|
|
91
|
+
* Inserts a deterministic-id late member after start; false if that seat was ever human.
|
|
92
|
+
*
|
|
93
|
+
* `maxPlayers` is part of the same statement, because two late joiners taking two different free
|
|
94
|
+
* slots each passed a capacity check the other invalidated and the match ended up over capacity,
|
|
95
|
+
* with a roster the match view's seat schema then refused.
|
|
96
|
+
*/
|
|
62
97
|
createLate(player: Player): Promise<boolean>;
|
|
63
98
|
get(id: string): Promise<Player | null>;
|
|
64
99
|
/** Never matches a revoked membership, whose token hash is null. */
|
|
65
100
|
getByTokenHash(tokenHash: string): Promise<Player | null>;
|
|
66
101
|
/** Ordered by slot, then join order, then id. */
|
|
67
102
|
listByMatch(matchId: string): Promise<Player[]>;
|
|
103
|
+
/**
|
|
104
|
+
* Every seat held in any of `matchIds`, in ONE statement. The public listing needs the taken
|
|
105
|
+
* slots of each match it returns and nothing else about the players; a `listByMatch` per listing
|
|
106
|
+
* was a query per running match on an unauthenticated route.
|
|
107
|
+
*/
|
|
108
|
+
listSeats(matchIds: readonly string[]): Promise<MatchSeat[]>;
|
|
68
109
|
setStatus(playerId: string, status: Player['status']): Promise<void>;
|
|
69
110
|
/** Compare-and-swap a player status; exactly one return/takeover race may win. */
|
|
70
111
|
transitionStatus(playerId: string, from: readonly Player['status'][], status: Player['status']): Promise<boolean>;
|
|
@@ -79,7 +120,15 @@ export interface PlayerRepository {
|
|
|
79
120
|
playerId: string;
|
|
80
121
|
slot: number;
|
|
81
122
|
}>): Promise<void>;
|
|
82
|
-
|
|
123
|
+
/**
|
|
124
|
+
* Deletes a lobby member. True when a row went.
|
|
125
|
+
*
|
|
126
|
+
* The result is what the caller releases the seat on. Two requests that both authenticated before
|
|
127
|
+
* either deleted — a `leave` sent twice, or a host `kick` racing the target's own `leave` — each
|
|
128
|
+
* used to decrement the seat counter for one row, so the lobby admitted more players than
|
|
129
|
+
* `maxPlayers` and a seventh seat failed `seatSchema` in every match view.
|
|
130
|
+
*/
|
|
131
|
+
delete(playerId: string): Promise<boolean>;
|
|
83
132
|
}
|
|
84
133
|
export interface TurnRepository {
|
|
85
134
|
/**
|
|
@@ -99,6 +148,16 @@ export interface TurnRepository {
|
|
|
99
148
|
submittedAt: Date;
|
|
100
149
|
}): Promise<boolean>;
|
|
101
150
|
getOrders(matchId: string, number: number, playerId: string): Promise<TurnOrders | null>;
|
|
151
|
+
/**
|
|
152
|
+
* One player's row for a turn WITHOUT the document.
|
|
153
|
+
*
|
|
154
|
+
* `submitOrders` reads the previous row on every submission to decide whether readiness changed
|
|
155
|
+
* and whether a stale write is an identical retry, and both questions are answered by the hash
|
|
156
|
+
* and the flag. The client sends a whole-document replacement per command the player queues, so
|
|
157
|
+
* loading up to `LIMITS.ordersBytes` of JSON to compare a boolean was the hottest read the server
|
|
158
|
+
* had.
|
|
159
|
+
*/
|
|
160
|
+
getOrderSummary(matchId: string, number: number, playerId: string): Promise<OrderSummary | null>;
|
|
102
161
|
listOrders(matchId: string, number: number): Promise<TurnOrders[]>;
|
|
103
162
|
/**
|
|
104
163
|
* The readiness and digest of every row of a turn, WITHOUT the documents. The seal decision,
|
|
@@ -114,25 +173,76 @@ export interface TurnRepository {
|
|
|
114
173
|
/** Written by the verdict that confirms a turn; see `Turn.stateHash`. */
|
|
115
174
|
stateHash?: string;
|
|
116
175
|
}): Promise<boolean>;
|
|
176
|
+
/**
|
|
177
|
+
* Freeze a sealed turn's participant set and digest, in ONE statement conditional on them not
|
|
178
|
+
* being frozen already. True only for the caller that wrote them.
|
|
179
|
+
*
|
|
180
|
+
* `transition` is conditional on the STATUS, and the status is `sealed` for the whole window
|
|
181
|
+
* between the seal's compare-and-swap and the successor opening — a window the sweep deliberately
|
|
182
|
+
* runs `completeSeal` inside. Two callers could therefore both compute a set, both write it, and
|
|
183
|
+
* both announce it, and with a departure landing between their two computations the second
|
|
184
|
+
* overwrote the first with a different digest. Every client then saw two `turn.sealed` events for
|
|
185
|
+
* one turn, and the one that fetched the set afterwards failed its digest check and ended the
|
|
186
|
+
* session. Whoever wins here is the only one that announces, so the set is immutable from the
|
|
187
|
+
* compare-and-swap onwards, as the design promises.
|
|
188
|
+
*/
|
|
189
|
+
freezeSeal(matchId: string, number: number, frozen: {
|
|
190
|
+
orderSetHash: string;
|
|
191
|
+
sealedSlots: readonly SealedSlot[];
|
|
192
|
+
}): Promise<boolean>;
|
|
193
|
+
/**
|
|
194
|
+
* Claim the announcement of a turn's divergence, in ONE statement conditional on `desyncedAt`
|
|
195
|
+
* being null. True only for the caller that stamped it, which is then the one that publishes
|
|
196
|
+
* `turn.desynced`.
|
|
197
|
+
*
|
|
198
|
+
* The alternative was asking the event log whether the announcement was already there, which
|
|
199
|
+
* pages every event the match ever logged — on every sweep, for every paused match.
|
|
200
|
+
*/
|
|
201
|
+
claimDesyncAnnouncement(matchId: string, number: number, at: Date): Promise<boolean>;
|
|
117
202
|
/** Move an open turn's deadline, e.g. when a match resumes after a desync pause. */
|
|
118
203
|
rescheduleDeadline(matchId: string, number: number, deadlineAt: Date | null): Promise<boolean>;
|
|
119
|
-
|
|
204
|
+
/**
|
|
205
|
+
* Record or replace one player's report, in ONE statement conditional on the turn still awaiting
|
|
206
|
+
* a verdict (`sealed` or `desynced`). False when it has been confirmed since, which is what keeps
|
|
207
|
+
* the evidence a verdict was taken on immutable: the caller reads the status a statement earlier,
|
|
208
|
+
* so a report can otherwise land behind the `settle` that raced it.
|
|
209
|
+
*/
|
|
210
|
+
upsertReport(report: TurnReport): Promise<boolean>;
|
|
120
211
|
listReports(matchId: string, number: number): Promise<TurnReport[]>;
|
|
121
212
|
/** Turns of a match still awaiting a verdict: status `sealed` or `desynced`, ascending. */
|
|
122
213
|
listUnsettled(matchId: string): Promise<Turn[]>;
|
|
123
|
-
/**
|
|
214
|
+
/**
|
|
215
|
+
* Open turns of RUNNING matches whose deadline has passed, oldest first.
|
|
216
|
+
*
|
|
217
|
+
* The match status is part of the query on purpose. A desynced match keeps its open turn's expired
|
|
218
|
+
* deadline for as long as the pause lasts, `trySeal` refuses it on every pass, and the row stays at
|
|
219
|
+
* the head of a list ordered by deadline. A hundred of them and the page holds nothing the sweep
|
|
220
|
+
* could act on, which on Node is the only thing that seals a deadline whose timer a restart lost.
|
|
221
|
+
*/
|
|
124
222
|
listExpiredOpen(now: Date, limit: number): Promise<Array<Pick<Turn, 'matchId' | 'number'>>>;
|
|
125
223
|
/**
|
|
126
224
|
* Live matches whose current turn is not open, so there is nothing for anyone to play: a seal
|
|
127
225
|
* that died between marking the turn sealed and opening its successor, or a start that died
|
|
128
226
|
* between running the match and opening turn 1 (no row at all). The repair sweep finishes both,
|
|
129
227
|
* which is why a missing turn counts as stalled rather than being skipped.
|
|
228
|
+
*
|
|
229
|
+
* `touchedSince` bounds the join to matches something happened to recently. A seal in flight is
|
|
230
|
+
* seconds old, but abandoned matches are deliberately kept `running` for ninety days, so the
|
|
231
|
+
* unbounded join walked thousands of rows every fifteen seconds to find nothing. The caller runs
|
|
232
|
+
* the bounded scan every tick and the unbounded one (null) on a much longer period, which is what
|
|
233
|
+
* still finds a seal interrupted while the process was down.
|
|
130
234
|
*/
|
|
131
|
-
listStalledSeals(limit: number): Promise<Array<Pick<Turn, 'matchId' | 'number'>>>;
|
|
235
|
+
listStalledSeals(limit: number, touchedSince: Date | null): Promise<Array<Pick<Turn, 'matchId' | 'number'>>>;
|
|
132
236
|
}
|
|
133
237
|
export interface SnapshotRepository {
|
|
134
238
|
put(snapshot: Snapshot): Promise<void>;
|
|
135
239
|
get(matchId: string, turn: number): Promise<Snapshot | null>;
|
|
240
|
+
/**
|
|
241
|
+
* One turn's snapshot metadata without its body. The verdict needs only `stateHash`, and it is
|
|
242
|
+
* re-run for every unsettled turn of every paused match on every sweep; `get` there loaded a
|
|
243
|
+
* megabyte of base64 to read one field.
|
|
244
|
+
*/
|
|
245
|
+
getSummary(matchId: string, turn: number): Promise<SnapshotSummary | null>;
|
|
136
246
|
getLatest(matchId: string): Promise<Snapshot | null>;
|
|
137
247
|
/** The newest snapshot's metadata without its body, which is a megabyte a caller checking for existence never reads. */
|
|
138
248
|
getLatestSummary(matchId: string): Promise<SnapshotSummary | null>;
|
|
@@ -158,6 +268,14 @@ export interface EventRepository {
|
|
|
158
268
|
/** Highest sequence number persisted for the match, or 0 when the log is empty. */
|
|
159
269
|
lastSeq(matchId: string): Promise<number>;
|
|
160
270
|
}
|
|
271
|
+
/** One voter's choice on an open takeover prompt. */
|
|
272
|
+
export interface CastVoteInput {
|
|
273
|
+
matchId: string;
|
|
274
|
+
targetPlayerId: string;
|
|
275
|
+
voterPlayerId: string;
|
|
276
|
+
decision: TakeoverDecision;
|
|
277
|
+
castAt: Date;
|
|
278
|
+
}
|
|
161
279
|
/**
|
|
162
280
|
* Absence prompts and their votes, as durable state rather than a replay of the event log.
|
|
163
281
|
*
|
|
@@ -178,7 +296,7 @@ export interface TakeoverRepository {
|
|
|
178
296
|
* Records or replaces one voter's choice on an open prompt, in ONE statement conditional on the
|
|
179
297
|
* prompt being open. False when it is not, so a vote can never outlive the prompt it answers.
|
|
180
298
|
*/
|
|
181
|
-
castVote(
|
|
299
|
+
castVote(input: CastVoteInput): Promise<boolean>;
|
|
182
300
|
listVotes(matchId: string, targetPlayerId: string): Promise<TakeoverVote[]>;
|
|
183
301
|
}
|
|
184
302
|
export interface MultiplayerStorage {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/ports/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/ports/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthService.d.ts","sourceRoot":"","sources":["../../src/services/AuthService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAGvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAE1D,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,KAAK,CAAA;CACb;AAED,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"AuthService.d.ts","sourceRoot":"","sources":["../../src/services/AuthService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAGvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAE1D,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,KAAK,CAAA;CACb;AAED,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,kBAAkB,EAAI;IAE5D,wFAAwF;IAClF,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAOpD;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthService.js","sourceRoot":"","sources":["../../src/services/AuthService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAQzD,MAAM,OAAO,WAAW;IACO;
|
|
1
|
+
{"version":3,"file":"AuthService.js","sourceRoot":"","sources":["../../src/services/AuthService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAQzD,MAAM,OAAO,WAAW;IACO,OAAO;IAApC,YAA6B,OAA2B;uBAA3B,OAAO;IAAuB,CAAC;IAE5D,wFAAwF;IACxF,KAAK,CAAC,YAAY,CAAC,KAAa;QAC9B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,MAAM,OAAO,EAAE,CAAA;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QAChF,IAAI,CAAC,MAAM;YAAE,MAAM,OAAO,EAAE,CAAA;QAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC5D,IAAI,CAAC,KAAK;YAAE,MAAM,OAAO,EAAE,CAAA;QAC3B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAC1B,CAAC;CACF;AAED,SAAS,OAAO;IACd,OAAO,IAAI,iBAAiB,CAAC,iCAAiC,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAA;AAC9F,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventPublisher.d.ts","sourceRoot":"","sources":["../../src/services/EventPublisher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAExC;;;;;;;;;;;GAWG;AACH,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,IAAI;
|
|
1
|
+
{"version":3,"file":"EventPublisher.d.ts","sourceRoot":"","sources":["../../src/services/EventPublisher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAExC;;;;;;;;;;;GAWG;AACH,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IADvB,YACmB,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC,EAClF;IAEE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAiB5E;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventPublisher.js","sourceRoot":"","sources":["../../src/services/EventPublisher.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,cAAc;IAEN;
|
|
1
|
+
{"version":3,"file":"EventPublisher.js","sourceRoot":"","sources":["../../src/services/EventPublisher.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,cAAc;IAEN,IAAI;IADvB,YACmB,IAAmE;oBAAnE,IAAI;IACpB,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,IAAoB;QACjD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YAClD,GAAG,IAAI;YACP,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;SAC/C,CAAC,CAAA;QACF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,6FAA6F;YAC7F,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;gBACjD,OAAO;gBACP,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACrB,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;CACF"}
|
|
@@ -14,10 +14,29 @@ export declare class LobbyService {
|
|
|
14
14
|
private readonly turns;
|
|
15
15
|
private readonly query;
|
|
16
16
|
private readonly newId;
|
|
17
|
+
private readonly passwordAttempts;
|
|
18
|
+
private readonly passwordFailures;
|
|
17
19
|
constructor(deps: KernelDeps, publisher: EventPublisher, turns: TurnService, options?: LobbyServiceOptions);
|
|
20
|
+
/**
|
|
21
|
+
* Check a match password, charging two budgets before the hash is computed.
|
|
22
|
+
*
|
|
23
|
+
* The caller's own budget is spent on every attempt rather than only on the wrong ones, because
|
|
24
|
+
* a caller who knows the password does not need ten attempts a minute and an attacker who does
|
|
25
|
+
* not would otherwise be charged for nothing. The match's budget is spent only by a failure, and
|
|
26
|
+
* closes only the caller's SECOND and later attempts in a window, so a stranger grinding a
|
|
27
|
+
* public match's password cannot turn the protection into a way of shutting its players out.
|
|
28
|
+
* Both doors go through here; see `PASSWORD_ATTEMPTS_PER_CALLER`.
|
|
29
|
+
*
|
|
30
|
+
* `caller` is whatever the transport can attribute an attempt to — the client address, already
|
|
31
|
+
* normalised. A transport that cannot attribute one passes nothing, and every such attempt then
|
|
32
|
+
* shares a single budget, which is the safe direction: an unattributable flood is throttled
|
|
33
|
+
* together rather than not at all.
|
|
34
|
+
*/
|
|
35
|
+
private verifyMatchPassword;
|
|
36
|
+
private tooManyPasswordAttempts;
|
|
18
37
|
createMatch(request: CreateMatchRequest): Promise<MembershipView>;
|
|
19
|
-
join(request: JoinMatchRequest): Promise<MembershipView>;
|
|
20
|
-
joinRunning(request: JoinRunningMatchRequest): Promise<MembershipView>;
|
|
38
|
+
join(request: JoinMatchRequest, caller?: string): Promise<MembershipView>;
|
|
39
|
+
joinRunning(request: JoinRunningMatchRequest, caller?: string): Promise<MembershipView>;
|
|
21
40
|
leave(principal: Principal): Promise<void>;
|
|
22
41
|
rejoin(principal: Principal): Promise<void>;
|
|
23
42
|
updateSettings(principal: Principal, settings: MatchSettings): Promise<void>;
|
|
@@ -27,6 +46,17 @@ export declare class LobbyService {
|
|
|
27
46
|
* `wait` vote preserves the human seat, and there is no timeout that silently changes it.
|
|
28
47
|
*/
|
|
29
48
|
voteOnTakeover(principal: Principal, targetPlayerId: string, request: TakeoverVoteRequest): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Hand a seat to the computer once every remaining active player has voted for it.
|
|
51
|
+
*
|
|
52
|
+
* Extracted from `voteOnTakeover` because the tally can also be completed by the voter set
|
|
53
|
+
* shrinking. When the one player who had not voted (or had voted `wait`) leaves or is kicked,
|
|
54
|
+
* everyone left has already approved, and the prompt used to stay open with the clock stopped
|
|
55
|
+
* until somebody clicked the same button a second time — on a modal reading 2 of 2.
|
|
56
|
+
*/
|
|
57
|
+
private tallyTakeoverVote;
|
|
58
|
+
/** Re-tally every open prompt, for when the set of voters has just shrunk. */
|
|
59
|
+
private retallyOpenPrompts;
|
|
30
60
|
start(principal: Principal): Promise<void>;
|
|
31
61
|
private remove;
|
|
32
62
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LobbyService.d.ts","sourceRoot":"","sources":["../../src/services/LobbyService.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"LobbyService.d.ts","sourceRoot":"","sources":["../../src/services/LobbyService.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAGvB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAE5B,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAA;AAYnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAGtD,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AA0C5D,MAAM,WAAW,mBAAmB;IAClC,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,MAAM,CAAA;CACrB;AAED,0EAA0E;AAC1E,qBAAa,YAAY;IAOrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IARxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAa;IAE9C,YACmB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,WAAW,EACnC,OAAO,GAAE,mBAAwB,EAYlC;IAED;;;;;;;;;;;;;;OAcG;YACW,mBAAmB;IAsBjC,OAAO,CAAC,uBAAuB;IAOzB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CA4CtE;IAEK,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAkD9E;IAEK,WAAW,CAAC,OAAO,EAAE,uBAAuB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAuE5F;IAEK,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;IAEK,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDhD;IAEK,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBjF;IAEK,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAatE;IAED;;;OAGG;IACG,cAAc,CAClB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoDf;IAED;;;;;;;OAOG;YACW,iBAAiB;IA0C/B,8EAA8E;YAChE,kBAAkB;IAM1B,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C/C;YAEa,MAAM;IA8HpB;;;OAGG;YACW,MAAM;IAYpB;;;;;;;;;;;;OAYG;YACW,mBAAmB;IAIjC,OAAO,CAAC,gBAAgB;IASxB;;;;OAIG;YACW,YAAY;YAaZ,OAAO;IAcrB;;;;OAIG;YACW,uBAAuB;YAUvB,UAAU;CAQzB"}
|