@chaos-overlords/server 0.9.1 → 0.9.3
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/app.d.ts.map +1 -1
- package/dist/app.js +4 -1
- package/dist/app.js.map +1 -1
- package/dist/configEnv.d.ts +22 -0
- package/dist/configEnv.d.ts.map +1 -0
- package/dist/configEnv.js +46 -0
- package/dist/configEnv.js.map +1 -0
- package/dist/container.d.ts +27 -1
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +16 -1
- package/dist/container.js.map +1 -1
- package/dist/http/errorHandler.js +5 -0
- package/dist/http/errorHandler.js.map +1 -1
- package/dist/http/middleware.d.ts +11 -0
- package/dist/http/middleware.d.ts.map +1 -1
- package/dist/http/middleware.js +28 -9
- package/dist/http/middleware.js.map +1 -1
- package/dist/http/types.d.ts +9 -4
- package/dist/http/types.d.ts.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/routes/bugReports.d.ts.map +1 -1
- package/dist/routes/bugReports.js +17 -11
- package/dist/routes/bugReports.js.map +1 -1
- package/dist/routes/events.d.ts.map +1 -1
- package/dist/routes/events.js +17 -0
- package/dist/routes/events.js.map +1 -1
- package/dist/routes/lobby.d.ts.map +1 -1
- package/dist/routes/lobby.js +10 -1
- package/dist/routes/lobby.js.map +1 -1
- package/dist/sse/LocalEventHub.d.ts +23 -5
- package/dist/sse/LocalEventHub.d.ts.map +1 -1
- package/dist/sse/LocalEventHub.js +68 -15
- package/dist/sse/LocalEventHub.js.map +1 -1
- package/dist/sse/MatchLog.d.ts +6 -0
- package/dist/sse/MatchLog.d.ts.map +1 -1
- package/dist/sse/MatchLog.js +10 -0
- package/dist/sse/MatchLog.js.map +1 -1
- package/dist/sse/closeLog.d.ts +12 -0
- package/dist/sse/closeLog.d.ts.map +1 -0
- package/dist/sse/closeLog.js +21 -0
- package/dist/sse/closeLog.js.map +1 -0
- package/dist/sse/createSseResponse.d.ts +40 -1
- package/dist/sse/createSseResponse.d.ts.map +1 -1
- package/dist/sse/createSseResponse.js +79 -8
- package/dist/sse/createSseResponse.js.map +1 -1
- package/dist/sse/membership.d.ts +11 -0
- package/dist/sse/membership.d.ts.map +1 -0
- package/dist/sse/membership.js +13 -0
- package/dist/sse/membership.js.map +1 -0
- package/package.json +5 -5
package/dist/routes/lobby.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lobby.js","sourceRoot":"","sources":["../../src/routes/lobby.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lobby.js","sourceRoot":"","sources":["../../src/routes/lobby.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type EventNotifier, type EventRepository, type EventStreamOpener, type PersistedEvent, type StreamCloser } from '@chaos-overlords/kernel';
|
|
2
|
+
import { type SseCloseReason } from './createSseResponse';
|
|
2
3
|
/**
|
|
3
4
|
* How many streams may be open at once, and against what.
|
|
4
5
|
*
|
|
@@ -13,6 +14,8 @@ import { type EventNotifier, type EventRepository, type EventStreamOpener, type
|
|
|
13
14
|
* predecessor is still being torn down. Reaching it closes that player's oldest stream rather than
|
|
14
15
|
* refusing the new one, because the new one is the live client and the old one is the corpse.
|
|
15
16
|
* `perMatch` and `perProcess` are the ceilings a client cannot talk its way past, and they refuse.
|
|
17
|
+
* Lobby streams may use at most one quarter of the process ceiling, so cheaply minted host tokens
|
|
18
|
+
* cannot fill every stream slot needed by running matches.
|
|
16
19
|
*/
|
|
17
20
|
export interface EventHubLimits {
|
|
18
21
|
perPlayer: number;
|
|
@@ -20,8 +23,10 @@ export interface EventHubLimits {
|
|
|
20
23
|
perProcess: number;
|
|
21
24
|
}
|
|
22
25
|
export declare const DEFAULT_EVENT_HUB_LIMITS: EventHubLimits;
|
|
23
|
-
/**
|
|
26
|
+
/** Runtime hooks for stream diagnostics and membership checks. */
|
|
24
27
|
export interface EventHubObserver {
|
|
28
|
+
/** A false result or failed lookup ends the stream. */
|
|
29
|
+
revalidate?(matchId: string, playerId: string): Promise<boolean>;
|
|
25
30
|
/** A stored event a stream had to skip because this build cannot read it. */
|
|
26
31
|
unreadable?(matchId: string, seq: number): void;
|
|
27
32
|
/**
|
|
@@ -31,6 +36,13 @@ export interface EventHubObserver {
|
|
|
31
36
|
* that client is reconnecting in a loop.
|
|
32
37
|
*/
|
|
33
38
|
abandoned?(matchId: string, playerId: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* A stream ended, with why and how long it had been open.
|
|
41
|
+
*
|
|
42
|
+
* The client cannot tell these apart — its body just ends — so this is where "the connection was
|
|
43
|
+
* lost although the server was up" gets its explanation; see `isUnexpectedClose`.
|
|
44
|
+
*/
|
|
45
|
+
closed?(matchId: string, playerId: string, reason: SseCloseReason, openMs: number): void;
|
|
34
46
|
}
|
|
35
47
|
/**
|
|
36
48
|
* In-process fan-out: notifies every open stream of a match within this process. It is both the
|
|
@@ -51,6 +63,9 @@ export declare class LocalEventHub implements EventNotifier, EventStreamOpener,
|
|
|
51
63
|
*/
|
|
52
64
|
private readonly logs;
|
|
53
65
|
private open_;
|
|
66
|
+
private lobbyOpen_;
|
|
67
|
+
/** The share of `perProcess` lobby streams may hold; see `makeRoom`. */
|
|
68
|
+
private readonly lobbyCap;
|
|
54
69
|
constructor(events: EventRepository, heartbeatMs: number, limits?: EventHubLimits, observer?: EventHubObserver);
|
|
55
70
|
notify(event: PersistedEvent): Promise<void>;
|
|
56
71
|
/** Wake every stream of a match; used when the notification arrives without the event body. */
|
|
@@ -58,9 +73,9 @@ export declare class LocalEventHub implements EventNotifier, EventStreamOpener,
|
|
|
58
73
|
/**
|
|
59
74
|
* End every stream a membership holds.
|
|
60
75
|
*
|
|
61
|
-
* Revoking a token stops the next request
|
|
62
|
-
*
|
|
63
|
-
* (which names each player's state hash) and every host change
|
|
76
|
+
* Revoking a token stops the next request, and an open stream only re-checks its membership on
|
|
77
|
+
* the catch-up heartbeat; until then a kicked player keeps being handed every sealed set, every
|
|
78
|
+
* desync report (which names each player's state hash) and every host change.
|
|
64
79
|
*/
|
|
65
80
|
close(input: {
|
|
66
81
|
matchId: string;
|
|
@@ -83,11 +98,14 @@ export declare class LocalEventHub implements EventNotifier, EventStreamOpener,
|
|
|
83
98
|
playerId: string;
|
|
84
99
|
afterSeq: number;
|
|
85
100
|
signal: AbortSignal;
|
|
101
|
+
lobby?: boolean;
|
|
86
102
|
}): Promise<Response>;
|
|
87
103
|
private logOf;
|
|
88
104
|
private subscribe;
|
|
105
|
+
/** Stop charging a stream to the lobby share once its match is running. */
|
|
106
|
+
private releaseLobby;
|
|
89
107
|
/**
|
|
90
|
-
* Enforce the
|
|
108
|
+
* Enforce the stream caps before a stream is built.
|
|
91
109
|
*
|
|
92
110
|
* The caller's own stale streams are closed FIRST, before either ceiling is read. Closing them is
|
|
93
111
|
* not a concession to the caller, it is bookkeeping: a reconnect whose predecessor has not
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalEventHub.d.ts","sourceRoot":"","sources":["../../src/sse/LocalEventHub.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EAEnB,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"LocalEventHub.d.ts","sourceRoot":"","sources":["../../src/sse/LocalEventHub.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EAEnB,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAA;AAG5B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,wBAAwB,EAAE,cAItC,CAAA;AAED,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,UAAU,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAChE,6EAA6E;IAC7E,UAAU,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/C;;;;;OAKG;IACH,SAAS,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACnD;;;;;OAKG;IACH,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACzF;AASD;;;GAGG;AACH,qBAAa,aAAc,YAAW,aAAa,EAAE,iBAAiB,EAAE,YAAY;IAgBhF,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAlB3B,yFAAyF;IACzF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IACjE;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA8B;IACnD,OAAO,CAAC,KAAK,CAAI;IACjB,OAAO,CAAC,UAAU,CAAI;IACtB,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IAEjC,YACmB,MAAM,EAAE,eAAe,EACvB,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,cAAyC,EACjD,QAAQ,GAAE,gBAAqB,EAGjD;IAEK,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAajD;IAED,+FAA+F;IAC/F,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI1B;IAED;;;;;;OAMG;IACG,KAAK,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvE;IAED;;;;;;;OAOG;IACH,QAAQ,IAAI,IAAI,CAOf;IAED,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvC;IAED,uDAAuD;IACvD,IAAI,WAAW,IAAI,MAAM,CAExB;IAEK,IAAI,CAAC,KAAK,EAAE;QAChB,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,EAAE,WAAW,CAAA;QACnB,KAAK,CAAC,EAAE,OAAO,CAAA;KAChB,GAAG,OAAO,CAAC,QAAQ,CAAC,CA4CpB;IAED,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,SAAS;IAoBjB,2EAA2E;IAC3E,OAAO,CAAC,YAAY;IAMpB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,QAAQ;CA+BjB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { LIMITS } from '@chaos-overlords/contracts';
|
|
2
2
|
import { RateLimitedError, } from '@chaos-overlords/kernel';
|
|
3
|
-
import { abandonedSseResponse, createSseResponse } from './createSseResponse';
|
|
3
|
+
import { abandonedSseResponse, createSseResponse, } from './createSseResponse';
|
|
4
4
|
import { MatchLog } from './MatchLog';
|
|
5
5
|
export const DEFAULT_EVENT_HUB_LIMITS = {
|
|
6
6
|
perPlayer: 3,
|
|
@@ -26,13 +26,24 @@ export class LocalEventHub {
|
|
|
26
26
|
*/
|
|
27
27
|
logs = new Map();
|
|
28
28
|
open_ = 0;
|
|
29
|
+
lobbyOpen_ = 0;
|
|
30
|
+
/** The share of `perProcess` lobby streams may hold; see `makeRoom`. */
|
|
31
|
+
lobbyCap;
|
|
29
32
|
constructor(events, heartbeatMs, limits = DEFAULT_EVENT_HUB_LIMITS, observer = {}) {
|
|
30
33
|
this.events = events;
|
|
31
34
|
this.heartbeatMs = heartbeatMs;
|
|
32
35
|
this.limits = limits;
|
|
33
36
|
this.observer = observer;
|
|
37
|
+
this.lobbyCap = Math.max(1, Math.floor(limits.perProcess / 4));
|
|
34
38
|
}
|
|
35
39
|
async notify(event) {
|
|
40
|
+
// A stream opened in the lobby stays connected when play starts. Release its lobby quota now
|
|
41
|
+
// rather than waiting for a reconnect that may never happen.
|
|
42
|
+
if (event.type === 'match.started') {
|
|
43
|
+
for (const subscription of this.listeners.get(event.matchId) ?? []) {
|
|
44
|
+
this.releaseLobby(subscription);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
36
47
|
// The notification carries the durable row, so its frame is formatted once here and every
|
|
37
48
|
// stream one event behind — which is every healthy stream of the match — is served from it
|
|
38
49
|
// without reading anything. See `MatchLog`.
|
|
@@ -49,16 +60,16 @@ export class LocalEventHub {
|
|
|
49
60
|
/**
|
|
50
61
|
* End every stream a membership holds.
|
|
51
62
|
*
|
|
52
|
-
* Revoking a token stops the next request
|
|
53
|
-
*
|
|
54
|
-
* (which names each player's state hash) and every host change
|
|
63
|
+
* Revoking a token stops the next request, and an open stream only re-checks its membership on
|
|
64
|
+
* the catch-up heartbeat; until then a kicked player keeps being handed every sealed set, every
|
|
65
|
+
* desync report (which names each player's state hash) and every host change.
|
|
55
66
|
*/
|
|
56
67
|
async close(input) {
|
|
57
68
|
// Snapshot deliberately: `close()` removes the subscription from the set being walked.
|
|
58
69
|
// oxlint-disable-next-line unicorn/no-useless-spread
|
|
59
70
|
for (const subscription of [...(this.listeners.get(input.matchId) ?? [])]) {
|
|
60
71
|
if (subscription.playerId === input.playerId)
|
|
61
|
-
subscription.close();
|
|
72
|
+
subscription.close('revoked');
|
|
62
73
|
}
|
|
63
74
|
}
|
|
64
75
|
/**
|
|
@@ -75,7 +86,7 @@ export class LocalEventHub {
|
|
|
75
86
|
for (const subscriptions of [...this.listeners.values()]) {
|
|
76
87
|
// oxlint-disable-next-line unicorn/no-useless-spread
|
|
77
88
|
for (const subscription of [...subscriptions])
|
|
78
|
-
subscription.close();
|
|
89
|
+
subscription.close('shutdown');
|
|
79
90
|
}
|
|
80
91
|
}
|
|
81
92
|
connectionCount(matchId) {
|
|
@@ -93,17 +104,38 @@ export class LocalEventHub {
|
|
|
93
104
|
this.observer.abandoned?.(input.matchId, input.playerId);
|
|
94
105
|
return abandonedSseResponse();
|
|
95
106
|
}
|
|
96
|
-
|
|
107
|
+
const lobby = input.lobby === true;
|
|
108
|
+
this.makeRoom(input.matchId, input.playerId, lobby);
|
|
97
109
|
const log = this.logOf(input.matchId);
|
|
110
|
+
let subscription;
|
|
111
|
+
const { revalidate, closed } = this.observer;
|
|
112
|
+
const openedAt = Date.now();
|
|
98
113
|
return createSseResponse({
|
|
99
|
-
page: (afterSeq, force) =>
|
|
114
|
+
page: async (afterSeq, force) => {
|
|
115
|
+
const frames = await log.page(afterSeq, force);
|
|
116
|
+
// `lobby` was read when the request authenticated. A match that started in between
|
|
117
|
+
// announced it before this stream subscribed, so the release in `notify` missed it; the
|
|
118
|
+
// stream's own read of the log is where it learns the match is running.
|
|
119
|
+
if (subscription?.lobby && log.started)
|
|
120
|
+
this.releaseLobby(subscription);
|
|
121
|
+
return frames;
|
|
122
|
+
},
|
|
100
123
|
caughtUp: (lastSeq) => log.caughtUp(lastSeq),
|
|
101
|
-
subscribe: (wake, close) =>
|
|
124
|
+
subscribe: (wake, close) => {
|
|
125
|
+
subscription = { playerId: input.playerId, lobby: lobby && !log.started, wake, close };
|
|
126
|
+
return this.subscribe(input.matchId, subscription);
|
|
127
|
+
},
|
|
102
128
|
}, {
|
|
103
129
|
afterSeq: input.afterSeq,
|
|
104
130
|
heartbeatMs: this.heartbeatMs,
|
|
105
131
|
signal: input.signal,
|
|
106
132
|
onUnreadable: (seq) => this.observer.unreadable?.(input.matchId, seq),
|
|
133
|
+
...(revalidate ? { revalidate: () => revalidate(input.matchId, input.playerId) } : {}),
|
|
134
|
+
...(closed
|
|
135
|
+
? {
|
|
136
|
+
onClose: (reason) => closed(input.matchId, input.playerId, reason, Date.now() - openedAt),
|
|
137
|
+
}
|
|
138
|
+
: {}),
|
|
107
139
|
});
|
|
108
140
|
}
|
|
109
141
|
logOf(matchId) {
|
|
@@ -114,16 +146,19 @@ export class LocalEventHub {
|
|
|
114
146
|
this.logs.set(matchId, log);
|
|
115
147
|
return log;
|
|
116
148
|
}
|
|
117
|
-
subscribe(matchId,
|
|
149
|
+
subscribe(matchId, subscription) {
|
|
118
150
|
const set = this.listeners.get(matchId) ?? new Set();
|
|
119
|
-
const subscription = { playerId, wake, close };
|
|
120
151
|
set.add(subscription);
|
|
121
152
|
this.listeners.set(matchId, set);
|
|
122
153
|
this.open_ += 1;
|
|
154
|
+
if (subscription.lobby)
|
|
155
|
+
this.lobbyOpen_ += 1;
|
|
123
156
|
return () => {
|
|
124
157
|
if (!set.delete(subscription))
|
|
125
158
|
return;
|
|
126
159
|
this.open_ -= 1;
|
|
160
|
+
// Clears the flag as well, so a page still in flight at close cannot release it twice.
|
|
161
|
+
this.releaseLobby(subscription);
|
|
127
162
|
if (set.size === 0) {
|
|
128
163
|
this.listeners.delete(matchId);
|
|
129
164
|
// Nothing reads this match any more, so its frames are only memory. The next stream of it
|
|
@@ -132,8 +167,15 @@ export class LocalEventHub {
|
|
|
132
167
|
}
|
|
133
168
|
};
|
|
134
169
|
}
|
|
170
|
+
/** Stop charging a stream to the lobby share once its match is running. */
|
|
171
|
+
releaseLobby(subscription) {
|
|
172
|
+
if (!subscription.lobby)
|
|
173
|
+
return;
|
|
174
|
+
subscription.lobby = false;
|
|
175
|
+
this.lobbyOpen_ -= 1;
|
|
176
|
+
}
|
|
135
177
|
/**
|
|
136
|
-
* Enforce the
|
|
178
|
+
* Enforce the stream caps before a stream is built.
|
|
137
179
|
*
|
|
138
180
|
* The caller's own stale streams are closed FIRST, before either ceiling is read. Closing them is
|
|
139
181
|
* not a concession to the caller, it is bookkeeping: a reconnect whose predecessor has not
|
|
@@ -145,12 +187,13 @@ export class LocalEventHub {
|
|
|
145
187
|
* `perMatch` and `perProcess` then refuse whatever is still over, which is the case no client can
|
|
146
188
|
* talk its way past.
|
|
147
189
|
*/
|
|
148
|
-
makeRoom(matchId, playerId) {
|
|
190
|
+
makeRoom(matchId, playerId, lobby) {
|
|
149
191
|
const set = this.listeners.get(matchId);
|
|
150
192
|
if (set) {
|
|
151
193
|
const mine = [...set].filter((subscription) => subscription.playerId === playerId);
|
|
152
|
-
for (const stale of mine.slice(0, mine.length - this.limits.perPlayer + 1))
|
|
153
|
-
stale.close();
|
|
194
|
+
for (const stale of mine.slice(0, mine.length - this.limits.perPlayer + 1)) {
|
|
195
|
+
stale.close('replaced');
|
|
196
|
+
}
|
|
154
197
|
}
|
|
155
198
|
if (this.open_ >= this.limits.perProcess) {
|
|
156
199
|
throw new RateLimitedError('This server is holding as many event streams as it can', {
|
|
@@ -158,6 +201,16 @@ export class LocalEventHub {
|
|
|
158
201
|
scope: 'process',
|
|
159
202
|
});
|
|
160
203
|
}
|
|
204
|
+
// Creating a lobby is unauthenticated. A caller can mint hundreds of host tokens and hold
|
|
205
|
+
// three streams per token, so lobby streams cannot be allowed to occupy the whole process cap.
|
|
206
|
+
// Running matches retain the other three quarters even when a single source spreads creation
|
|
207
|
+
// across many IPv6 /64s and exhausts the lobby pool.
|
|
208
|
+
if (lobby && this.lobbyOpen_ >= this.lobbyCap) {
|
|
209
|
+
throw new RateLimitedError('This server is holding as many lobby streams as it can', {
|
|
210
|
+
reason: 'too_many_streams',
|
|
211
|
+
scope: 'lobby',
|
|
212
|
+
});
|
|
213
|
+
}
|
|
161
214
|
if ((this.listeners.get(matchId)?.size ?? 0) >= this.limits.perMatch) {
|
|
162
215
|
throw new RateLimitedError('This match is holding as many event streams as it can', {
|
|
163
216
|
reason: 'too_many_streams',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalEventHub.js","sourceRoot":"","sources":["../../src/sse/LocalEventHub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,OAAO,EAKL,gBAAgB,GAEjB,MAAM,yBAAyB,CAAA;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"LocalEventHub.js","sourceRoot":"","sources":["../../src/sse/LocalEventHub.ts"],"names":[],"mappings":"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"}
|
package/dist/sse/MatchLog.d.ts
CHANGED
|
@@ -44,6 +44,12 @@ export declare class MatchLog {
|
|
|
44
44
|
* every one of its reads goes to the log exactly as before.
|
|
45
45
|
*/
|
|
46
46
|
private notified;
|
|
47
|
+
/**
|
|
48
|
+
* Whether this process has seen the match's `match.started`, by notification or by reading it.
|
|
49
|
+
* A stream authenticated while the match was still a lobby can subscribe after that notification
|
|
50
|
+
* went out; this is how the hub learns the stream is no longer a lobby stream.
|
|
51
|
+
*/
|
|
52
|
+
started: boolean;
|
|
47
53
|
constructor(matchId: string, events: EventRepository);
|
|
48
54
|
/**
|
|
49
55
|
* Remember a published event and its frame.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MatchLog.d.ts","sourceRoot":"","sources":["../../src/sse/MatchLog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAG9E,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,+EAA+E;IAC/E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AAcD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,QAAQ;
|
|
1
|
+
{"version":3,"file":"MatchLog.d.ts","sourceRoot":"","sources":["../../src/sse/MatchLog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAG9E,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,+EAA+E;IAC/E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AAcD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,QAAQ;IAsBjB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAtBzB,mFAAmF;IACnF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,CAAI;IACpB;;;;OAIG;IACH,OAAO,UAAQ;IAEf,YACmB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,EACtC;IAEJ;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAMlC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEjC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAejE;IAED,OAAO,CAAC,cAAc;YAUR,IAAI;IAclB,OAAO,CAAC,IAAI;CAOb"}
|
package/dist/sse/MatchLog.js
CHANGED
|
@@ -48,6 +48,12 @@ export class MatchLog {
|
|
|
48
48
|
* every one of its reads goes to the log exactly as before.
|
|
49
49
|
*/
|
|
50
50
|
notified = 0;
|
|
51
|
+
/**
|
|
52
|
+
* Whether this process has seen the match's `match.started`, by notification or by reading it.
|
|
53
|
+
* A stream authenticated while the match was still a lobby can subscribe after that notification
|
|
54
|
+
* went out; this is how the hub learns the stream is no longer a lobby stream.
|
|
55
|
+
*/
|
|
56
|
+
started = false;
|
|
51
57
|
constructor(matchId, events) {
|
|
52
58
|
this.matchId = matchId;
|
|
53
59
|
this.events = events;
|
|
@@ -61,6 +67,8 @@ export class MatchLog {
|
|
|
61
67
|
record(event) {
|
|
62
68
|
if (event.seq > this.notified)
|
|
63
69
|
this.notified = event.seq;
|
|
70
|
+
if (event.type === 'match.started')
|
|
71
|
+
this.started = true;
|
|
64
72
|
if (this.frames.has(event.seq))
|
|
65
73
|
return;
|
|
66
74
|
this.frames.set(event.seq, { seq: event.seq, text: tryFormatEvent(event) });
|
|
@@ -125,6 +133,8 @@ export class MatchLog {
|
|
|
125
133
|
async read(afterSeq) {
|
|
126
134
|
const rows = await this.events.listAfter(this.matchId, afterSeq, PAGE_SIZE);
|
|
127
135
|
const page = rows.map((row) => {
|
|
136
|
+
if (row.type === 'match.started')
|
|
137
|
+
this.started = true;
|
|
128
138
|
const known = this.frames.get(row.seq);
|
|
129
139
|
if (known)
|
|
130
140
|
return known;
|
package/dist/sse/MatchLog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MatchLog.js","sourceRoot":"","sources":["../../src/sse/MatchLog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AASpD;;;;;;GAMG;AACH,MAAM,WAAW,GAAG,GAAG,CAAA;AAEvB,8BAA8B;AAC9B,MAAM,SAAS,GAAG,GAAG,CAAA;AAErB;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,QAAQ;
|
|
1
|
+
{"version":3,"file":"MatchLog.js","sourceRoot":"","sources":["../../src/sse/MatchLog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Logger } from '@chaos-overlords/kernel';
|
|
2
|
+
import type { EventHubObserver } from './LocalEventHub';
|
|
3
|
+
/**
|
|
4
|
+
* The `closed` observer every runtime wants: one line per ended stream, loud when the server
|
|
5
|
+
* dropped a stream its client was still reading.
|
|
6
|
+
*
|
|
7
|
+
* A client going away is the ordinary end of every stream, so it stays at debug; a stream the
|
|
8
|
+
* server ended for a reason of its own is the one an operator is looking for when a player
|
|
9
|
+
* reports a lost connection on a server that was up.
|
|
10
|
+
*/
|
|
11
|
+
export declare function logStreamClosed(logger: Logger): NonNullable<EventHubObserver['closed']>;
|
|
12
|
+
//# sourceMappingURL=closeLog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"closeLog.d.ts","sourceRoot":"","sources":["../../src/sse/closeLog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAErD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEvD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAOvF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { isUnexpectedClose } from './createSseResponse';
|
|
2
|
+
/**
|
|
3
|
+
* The `closed` observer every runtime wants: one line per ended stream, loud when the server
|
|
4
|
+
* dropped a stream its client was still reading.
|
|
5
|
+
*
|
|
6
|
+
* A client going away is the ordinary end of every stream, so it stays at debug; a stream the
|
|
7
|
+
* server ended for a reason of its own is the one an operator is looking for when a player
|
|
8
|
+
* reports a lost connection on a server that was up.
|
|
9
|
+
*/
|
|
10
|
+
export function logStreamClosed(logger) {
|
|
11
|
+
return (matchId, playerId, reason, openMs) => {
|
|
12
|
+
const fields = { matchId, playerId, reason, openMs };
|
|
13
|
+
if (isUnexpectedClose(reason))
|
|
14
|
+
logger.warn('event stream dropped by the server', fields);
|
|
15
|
+
else if (reason === 'client_gone')
|
|
16
|
+
logger.debug('event stream closed by the client', fields);
|
|
17
|
+
else
|
|
18
|
+
logger.info('event stream closed', fields);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=closeLog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"closeLog.js","sourceRoot":"","sources":["../../src/sse/closeLog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAGvD;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;QACpD,IAAI,iBAAiB,CAAC,MAAM,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,MAAM,CAAC,CAAA;aACnF,IAAI,MAAM,KAAK,aAAa;YAAE,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,MAAM,CAAC,CAAA;;YACvF,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;IACjD,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -22,14 +22,53 @@ export interface EventStreamSource {
|
|
|
22
22
|
* it already holds and how a player's stale stream is dropped to make room for their reconnect.
|
|
23
23
|
* It is safe to call at any time and does nothing once the stream is closed.
|
|
24
24
|
*/
|
|
25
|
-
subscribe(wake: () => void, close: () => void): () => void;
|
|
25
|
+
subscribe(wake: () => void, close: (reason: HubCloseReason) => void): () => void;
|
|
26
26
|
}
|
|
27
|
+
/** Why the hub ended a stream from its side; see `EventStreamSource.subscribe`. */
|
|
28
|
+
export type HubCloseReason =
|
|
29
|
+
/** The player's membership was revoked, so the streams it held were hung up. */
|
|
30
|
+
'revoked'
|
|
31
|
+
/** The player opened another stream and this, their oldest, made room for it. */
|
|
32
|
+
| 'replaced'
|
|
33
|
+
/** The process is shutting down, or the object holding the stream is. */
|
|
34
|
+
| 'shutdown';
|
|
35
|
+
/**
|
|
36
|
+
* Why a stream ended.
|
|
37
|
+
*
|
|
38
|
+
* The client sees every one of these the same way — the body simply ends — so this is the only
|
|
39
|
+
* record of which it was. A stream the server dropped while the player was still reading it shows
|
|
40
|
+
* up on their screen as a lost connection, and without the reason in the log a membership lookup
|
|
41
|
+
* that failed once on a database hiccup is indistinguishable from a deploy.
|
|
42
|
+
*/
|
|
43
|
+
export type SseCloseReason = HubCloseReason
|
|
44
|
+
/** The client went away: the request was aborted, or the consumer cancelled the body. */
|
|
45
|
+
| 'client_gone'
|
|
46
|
+
/** The periodic membership check answered that this player is no longer a member. */
|
|
47
|
+
| 'membership_revoked'
|
|
48
|
+
/** The periodic membership check failed or hung too many times in a row to trust the stream. */
|
|
49
|
+
| 'membership_unverified'
|
|
50
|
+
/** The consumer stopped reading for long enough that the connection is presumed dead. */
|
|
51
|
+
| 'stalled'
|
|
52
|
+
/** Reading the log failed, and the stream was errored rather than closed. */
|
|
53
|
+
| 'read_failed';
|
|
54
|
+
/**
|
|
55
|
+
* Whether a close is one a healthy client should never see: the server dropped a stream that was
|
|
56
|
+
* still being read, for a reason of its own.
|
|
57
|
+
*
|
|
58
|
+
* `client_gone`, `replaced` and `shutdown` are routine, and a revoked membership is the stream
|
|
59
|
+
* doing its job. The rest are worth an operator's attention.
|
|
60
|
+
*/
|
|
61
|
+
export declare function isUnexpectedClose(reason: SseCloseReason): boolean;
|
|
27
62
|
export interface SseOptions {
|
|
28
63
|
afterSeq: number;
|
|
29
64
|
heartbeatMs: number;
|
|
30
65
|
signal: AbortSignal;
|
|
31
66
|
/** Told the sequence of a stored event this build cannot validate, so it can be logged. */
|
|
32
67
|
onUnreadable?: (seq: number) => void;
|
|
68
|
+
/** Confirm that the subscription still belongs to an active member. */
|
|
69
|
+
revalidate?: () => Promise<boolean>;
|
|
70
|
+
/** Told once, when the stream ends, why it ended. */
|
|
71
|
+
onClose?: (reason: SseCloseReason) => void;
|
|
33
72
|
}
|
|
34
73
|
/**
|
|
35
74
|
* A server-sent event stream over a persisted, sequence-numbered log.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSseResponse.d.ts","sourceRoot":"","sources":["../../src/sse/createSseResponse.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IAC9D;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;IAClC;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"createSseResponse.d.ts","sourceRoot":"","sources":["../../src/sse/createSseResponse.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IAC9D;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;IAClC;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;CACjF;AAED,mFAAmF;AACnF,MAAM,MAAM,cAAc;AACxB,gFAAgF;AAC9E,SAAS;AACX,iFAAiF;GAC/E,UAAU;AACZ,yEAAyE;GACvE,UAAU,CAAA;AAEd;;;;;;;GAOG;AACH,MAAM,MAAM,cAAc,GACtB,cAAc;AAChB,yFAAyF;GACvF,aAAa;AACf,qFAAqF;GACnF,oBAAoB;AACtB,gGAAgG;GAC9F,uBAAuB;AACzB,yFAAyF;GACvF,SAAS;AACX,6EAA6E;GAC3E,aAAa,CAAA;AAEjB;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAEjE;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,WAAW,CAAA;IACnB,2FAA2F;IAC3F,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IACnC,qDAAqD;IACrD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAA;CAC3C;AA8CD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,GAAG,QAAQ,CAgN1F;AASD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,IAAI,QAAQ,CAE/C;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAIzD;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAMnE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAO9D"}
|