@tailuge/messaging 1.38.0 → 1.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MESSAGING_SPEC.md +56 -23
- package/SKILL.md +13 -6
- package/dist/lobby.d.ts +4 -3
- package/dist/lobby.js +6 -6
- package/dist/lobby.js.map +1 -1
- package/dist/messagingclient.d.ts +19 -0
- package/dist/messagingclient.js +74 -9
- package/dist/messagingclient.js.map +1 -1
- package/dist/table.d.ts +85 -4
- package/dist/table.js +274 -12
- package/dist/table.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.js.map +1 -1
- package/package.json +3 -3
package/MESSAGING_SPEC.md
CHANGED
|
@@ -43,14 +43,25 @@ interface MessagingClient {
|
|
|
43
43
|
/**
|
|
44
44
|
* Joins a specific table (game room) for 2-player communication.
|
|
45
45
|
* Updates lobby presence with tableId when a lobby session exists.
|
|
46
|
+
* Pass onMessage in options to receive table events; Table does not expose
|
|
47
|
+
* a post-join onMessage(callback) registration method.
|
|
46
48
|
*/
|
|
47
|
-
joinTable<T = any>(
|
|
49
|
+
joinTable<T = any>(
|
|
50
|
+
tableId: string,
|
|
51
|
+
userId: string,
|
|
52
|
+
options?: TableJoinOptions<T>,
|
|
53
|
+
): Promise<Table<T>>;
|
|
48
54
|
|
|
49
55
|
/**
|
|
50
56
|
* Subscribes to a table as a read-only spectator.
|
|
51
57
|
* Does not update lobby presence. Spectator departures do not trigger onOpponentLeft.
|
|
58
|
+
* Pass onMessage in options to receive table events.
|
|
52
59
|
*/
|
|
53
|
-
spectateTable<T = any>(
|
|
60
|
+
spectateTable<T = any>(
|
|
61
|
+
tableId: string,
|
|
62
|
+
userId: string,
|
|
63
|
+
options?: TableSpectatorOptions<T>,
|
|
64
|
+
): Promise<Table<T>>;
|
|
54
65
|
}
|
|
55
66
|
```
|
|
56
67
|
|
|
@@ -80,9 +91,11 @@ interface Lobby {
|
|
|
80
91
|
|
|
81
92
|
/**
|
|
82
93
|
* Accept an incoming challenge.
|
|
83
|
-
*
|
|
94
|
+
* Publishes the accept message and updates presence to show we've joined the table.
|
|
95
|
+
* The table itself is joined separately via MessagingClient.joinTable() with the
|
|
96
|
+
* same tableId (a client-generated channel id, not a server entity).
|
|
84
97
|
*/
|
|
85
|
-
acceptChallenge(userId: string, ruleType: string, tableId: string, options?: Record<string, string>, challengerName?: string): Promise<
|
|
98
|
+
acceptChallenge(userId: string, ruleType: string, tableId: string, options?: Record<string, string>, challengerName?: string): Promise<void>;
|
|
86
99
|
|
|
87
100
|
/**
|
|
88
101
|
* Decline an incoming challenge.
|
|
@@ -116,9 +129,30 @@ interface Lobby {
|
|
|
116
129
|
}
|
|
117
130
|
```
|
|
118
131
|
|
|
132
|
+
### Table join options
|
|
133
|
+
|
|
134
|
+
Register `onMessage` in the options passed to `joinTable()` or `spectateTable()` so
|
|
135
|
+
it is active as the subscription starts; messages received before the callback is
|
|
136
|
+
registered cannot be replayed later.
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
interface TableJoinOptions<T = any> {
|
|
140
|
+
isSpectator?: boolean;
|
|
141
|
+
onMessage?: (event: TableMessage<T>) => void;
|
|
142
|
+
onBothJoined?: () => void;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
interface TableSpectatorOptions<T = any> {
|
|
146
|
+
onMessage?: (event: TableMessage<T>) => void;
|
|
147
|
+
onBothJoined?: () => void;
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
119
151
|
### `Table`
|
|
120
152
|
|
|
121
153
|
Represents a specific communication channel for a 2-player/spectator scenario at a table.
|
|
154
|
+
The `Table` instance does **not** expose a post-join `onMessage(callback)` method;
|
|
155
|
+
message listeners are supplied through `joinTable()` or `spectateTable()` options.
|
|
122
156
|
|
|
123
157
|
```typescript
|
|
124
158
|
interface Table<T = any> {
|
|
@@ -127,11 +161,6 @@ interface Table<T = any> {
|
|
|
127
161
|
*/
|
|
128
162
|
publish(type: string, data: T): Promise<void>;
|
|
129
163
|
|
|
130
|
-
/**
|
|
131
|
-
* Subscribe to events published by other participants.
|
|
132
|
-
*/
|
|
133
|
-
onMessage(callback: (event: TableMessage<T>) => void): void;
|
|
134
|
-
|
|
135
164
|
/**
|
|
136
165
|
* Subscribe to changes in the spectator list.
|
|
137
166
|
*/
|
|
@@ -150,20 +179,23 @@ interface Table<T = any> {
|
|
|
150
179
|
|
|
151
180
|
### `meta` (Server-Enriched Metadata)
|
|
152
181
|
|
|
153
|
-
All messages published through the transport layer are automatically enriched by the server with metadata from HTTP headers and connection info. This `meta` object is **added by the server** and should be used by clients as the absolute source of truth for timing (`ts`).
|
|
182
|
+
All JSON messages published through the transport layer are automatically enriched by the server with metadata from HTTP headers and connection info. The server also assigns a unique `msgId` to each accepted message, including server-generated auto-leave messages. This `meta` object is **added by the server** and should be used by clients as the absolute source of truth for timing (`ts`). Clients should not generate or overwrite `msgId`.
|
|
154
183
|
|
|
155
184
|
```typescript
|
|
156
185
|
interface Meta {
|
|
157
|
-
ts:
|
|
186
|
+
ts: number; // Epoch milliseconds (Source of Truth for event time)
|
|
187
|
+
msgId?: string; // Server-generated identity used to suppress reconnect replays
|
|
158
188
|
ua: string; // User-Agent header
|
|
189
|
+
ip: string; // Obfuscated client address
|
|
159
190
|
origin: string; // Origin header value
|
|
160
191
|
method: string; // HTTP method (always POST for publish)
|
|
161
192
|
country: string; // Country code from IP (e.g., "US", "GB", "XX")
|
|
162
|
-
|
|
193
|
+
since?: number; // First-seen time for the obfuscated client address
|
|
194
|
+
version?: string; // Optional client software version
|
|
163
195
|
}
|
|
164
196
|
```
|
|
165
197
|
|
|
166
|
-
**Note**: The client should NOT include `ua` in published messages
|
|
198
|
+
**Note**: The client should NOT include `ua`, `ip`, `ts`, or `msgId` in published messages. The server adds metadata automatically. `msgId` is an identity for reconnect replay suppression; `ts` is only the event timestamp. The optional `version` field may be supplied through `MessagingClient.setVersion()`.
|
|
167
199
|
|
|
168
200
|
### `PresenceMessage`
|
|
169
201
|
|
|
@@ -454,14 +486,14 @@ lobby.onChallenge((challenge) => {
|
|
|
454
486
|
|
|
455
487
|
// Table interaction with a generic move type
|
|
456
488
|
interface Move { x: number; y: number }
|
|
457
|
-
const table = await client.joinTable<Move>("table-xyz", "user-123"
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
}
|
|
489
|
+
const table = await client.joinTable<Move>("table-xyz", "user-123", {
|
|
490
|
+
onMessage: (msg) => {
|
|
491
|
+
if (msg.type === "MOVE") {
|
|
492
|
+
// msg.data is typed as Move
|
|
493
|
+
applyMove(msg.data);
|
|
494
|
+
console.log("Move received at:", msg.meta?.ts);
|
|
495
|
+
}
|
|
496
|
+
},
|
|
465
497
|
});
|
|
466
498
|
|
|
467
499
|
table.publish("MOVE", { x: 10, y: 20 });
|
|
@@ -485,8 +517,9 @@ Trade-offs:
|
|
|
485
517
|
Use `spectateTable` for read-only table subscriptions. Spectator `table:leave` messages include `data.isSpectator: true` so player clients skip `onOpponentLeft`. The Nchan server tags auto-leaves from spectator WebSocket disconnects the same way (via `spectator=1` on the subscribe URL).
|
|
486
518
|
|
|
487
519
|
```typescript
|
|
488
|
-
const table = await client.spectateTable("table-xyz", "user-123"
|
|
489
|
-
|
|
520
|
+
const table = await client.spectateTable("table-xyz", "user-123", {
|
|
521
|
+
onMessage: (msg) => { /* handle table messages */ },
|
|
522
|
+
});
|
|
490
523
|
```
|
|
491
524
|
|
|
492
525
|
`TableLeaveData` and `isSpectatorTableLeave()` in `types.ts` identify spectator leave messages if needed in custom handlers.
|
package/SKILL.md
CHANGED
|
@@ -72,17 +72,24 @@ lobby.onChat((msg) => {
|
|
|
72
72
|
|
|
73
73
|
```typescript
|
|
74
74
|
interface Move { x: number; y: number }
|
|
75
|
-
const table = await client.joinTable<Move>("table-xyz", "user-123"
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
75
|
+
const table = await client.joinTable<Move>("table-xyz", "user-123", {
|
|
76
|
+
onMessage: (msg) => {
|
|
77
|
+
if (msg.type === "MOVE") {
|
|
78
|
+
console.log(`Move at: ${msg.meta?.ts}`);
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
81
|
});
|
|
82
82
|
|
|
83
|
+
// Safe immediately after joinTable(): the library queues until the
|
|
84
|
+
// subscription is ready, sends in order, and retries transient failures.
|
|
83
85
|
await table.publish("MOVE", { x: 10, y: 20 });
|
|
86
|
+
await table.bothJoined; // two-player readiness; may remain pending if no opponent joins
|
|
84
87
|
```
|
|
85
88
|
|
|
89
|
+
`onMessage` and `onBothJoined` must be supplied on the initial join call. The
|
|
90
|
+
library suppresses reconnect buffer replays internally using server-generated
|
|
91
|
+
`meta.msgId`; consumers should not generate message IDs or deduplicate by `meta.ts`.
|
|
92
|
+
|
|
86
93
|
## Spectators
|
|
87
94
|
|
|
88
95
|
```typescript
|
package/dist/lobby.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { NchanClient } from "./nchanclient";
|
|
2
2
|
import { PresenceMessage, ChallengeMessage, ChatMessage } from "./types";
|
|
3
|
-
import { Table } from "./table";
|
|
4
3
|
export interface LobbyOptions {
|
|
5
4
|
heartbeatInterval?: number;
|
|
6
5
|
onReconnect?: () => void;
|
|
@@ -94,9 +93,11 @@ export declare class Lobby {
|
|
|
94
93
|
challenge(userId: string, ruleType: string, options?: Record<string, string>, nextTurnId?: string): Promise<string>;
|
|
95
94
|
/**
|
|
96
95
|
* Accept an incoming challenge.
|
|
97
|
-
*
|
|
96
|
+
* Publishes the accept message and updates presence to show we've joined the table.
|
|
97
|
+
* The table itself is joined separately via MessagingClient.joinTable() with the
|
|
98
|
+
* same tableId (which is just a client-generated channel id, not a server entity).
|
|
98
99
|
*/
|
|
99
|
-
acceptChallenge(userId: string, ruleType: string, tableId: string, options?: Record<string, string>, challengerName?: string, nextTurnId?: string): Promise<
|
|
100
|
+
acceptChallenge(userId: string, ruleType: string, tableId: string, options?: Record<string, string>, challengerName?: string, nextTurnId?: string): Promise<void>;
|
|
100
101
|
/**
|
|
101
102
|
* Decline an incoming challenge.
|
|
102
103
|
*/
|
package/dist/lobby.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { parseMessage, } from "./types.js";
|
|
2
|
-
import { Table } from "./table.js";
|
|
3
2
|
import { getUID } from "./utils/uid.js";
|
|
4
3
|
import { MessageDeduplicator, AUTO_LEAVE_REJOIN_GRACE_MS } from "./MessageDeduplicator.js";
|
|
5
4
|
/**
|
|
@@ -212,7 +211,9 @@ export class Lobby {
|
|
|
212
211
|
}
|
|
213
212
|
/**
|
|
214
213
|
* Accept an incoming challenge.
|
|
215
|
-
*
|
|
214
|
+
* Publishes the accept message and updates presence to show we've joined the table.
|
|
215
|
+
* The table itself is joined separately via MessagingClient.joinTable() with the
|
|
216
|
+
* same tableId (which is just a client-generated channel id, not a server entity).
|
|
216
217
|
*/
|
|
217
218
|
async acceptChallenge(userId, ruleType, tableId, options, challengerName, nextTurnId) {
|
|
218
219
|
await this.nchan.publishChallenge({
|
|
@@ -226,9 +227,7 @@ export class Lobby {
|
|
|
226
227
|
nextTurnId,
|
|
227
228
|
});
|
|
228
229
|
// Automatically update our presence to show we've joined the table
|
|
229
|
-
await this.updatePresence({ tableId });
|
|
230
|
-
const table = new Table(this.nchan, tableId, this.currentUser.userId, this);
|
|
231
|
-
return table;
|
|
230
|
+
await this.updatePresence({ tableId, ruleType, options });
|
|
232
231
|
}
|
|
233
232
|
/**
|
|
234
233
|
* Decline an incoming challenge.
|
|
@@ -424,7 +423,8 @@ export class Lobby {
|
|
|
424
423
|
oldMsg.tableId !== nextMsg.tableId ||
|
|
425
424
|
oldMsg.ruleType !== nextMsg.ruleType ||
|
|
426
425
|
oldMsg.opponentId !== nextMsg.opponentId ||
|
|
427
|
-
JSON.stringify(oldMsg.seek) !== JSON.stringify(nextMsg.seek)
|
|
426
|
+
JSON.stringify(oldMsg.seek) !== JSON.stringify(nextMsg.seek) ||
|
|
427
|
+
JSON.stringify(oldMsg.options) !== JSON.stringify(nextMsg.options));
|
|
428
428
|
}
|
|
429
429
|
/**
|
|
430
430
|
* Fires all onSettled listeners and replays deduplicated messages.
|
package/dist/lobby.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lobby.js","sourceRoot":"","sources":["../src/lobby.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lobby.js","sourceRoot":"","sources":["../src/lobby.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { NchanClient } from "./nchanclient";
|
|
1
2
|
import { Lobby, LobbyOptions } from "./lobby";
|
|
2
3
|
import { Table } from "./table";
|
|
3
4
|
import { PresenceMessage, TableMessage } from "./types";
|
|
@@ -10,6 +11,8 @@ export declare class MessagingClient {
|
|
|
10
11
|
private activeLobbies;
|
|
11
12
|
private lobbyInstances;
|
|
12
13
|
private activeTables;
|
|
14
|
+
/** In-flight joinTable() operations keyed by session identity (tableId|userId|role). */
|
|
15
|
+
private joiningTables;
|
|
13
16
|
private lobbyConfigs;
|
|
14
17
|
private isStopping;
|
|
15
18
|
private isStarted;
|
|
@@ -19,6 +22,7 @@ export declare class MessagingClient {
|
|
|
19
22
|
private joiningLobbies;
|
|
20
23
|
constructor(options: {
|
|
21
24
|
baseUrl: string;
|
|
25
|
+
nchan?: NchanClient;
|
|
22
26
|
});
|
|
23
27
|
/**
|
|
24
28
|
* Sets a global software version string that will be attached to all outgoing messages.
|
|
@@ -51,12 +55,27 @@ export declare class MessagingClient {
|
|
|
51
55
|
leaveLobby(userId: string): Promise<void>;
|
|
52
56
|
/**
|
|
53
57
|
* Joins a specific table for communication.
|
|
58
|
+
*
|
|
59
|
+
* Resolves as soon as the session exists; the handshake (subscription ready,
|
|
60
|
+
* `joined` publish, presence update) continues in the background. Concurrent
|
|
61
|
+
* calls for the same session share one operation and one table instance.
|
|
62
|
+
* Same-tableId calls with a different user or role reject before a second
|
|
63
|
+
* session is created.
|
|
54
64
|
*/
|
|
55
65
|
joinTable<T = any>(tableId: string, userId: string, options?: {
|
|
56
66
|
isSpectator?: boolean;
|
|
57
67
|
onMessage?: (event: TableMessage<T>) => void;
|
|
58
68
|
onBothJoined?: () => void;
|
|
59
69
|
}): Promise<Table<T>>;
|
|
70
|
+
/** Logical session identity for the in-flight join map. */
|
|
71
|
+
private tableKey;
|
|
72
|
+
/**
|
|
73
|
+
* Rejects same-tableId joins with a different user or role before a second
|
|
74
|
+
* session can be created within this client instance.
|
|
75
|
+
*/
|
|
76
|
+
private assertNoTableConflict;
|
|
77
|
+
/** Lifecycle cleanup: drop a closed table so later joins create a fresh session. */
|
|
78
|
+
private removeActiveTable;
|
|
60
79
|
/**
|
|
61
80
|
* Subscribes to a table as a read-only spectator.
|
|
62
81
|
* Spectator departures do not trigger onOpponentLeft on player clients.
|
package/dist/messagingclient.js
CHANGED
|
@@ -10,6 +10,8 @@ export class MessagingClient {
|
|
|
10
10
|
this.activeLobbies = [];
|
|
11
11
|
this.lobbyInstances = new Map();
|
|
12
12
|
this.activeTables = [];
|
|
13
|
+
/** In-flight joinTable() operations keyed by session identity (tableId|userId|role). */
|
|
14
|
+
this.joiningTables = new Map();
|
|
13
15
|
this.lobbyConfigs = new Map();
|
|
14
16
|
this.isStopping = false;
|
|
15
17
|
this.isStarted = false;
|
|
@@ -36,7 +38,7 @@ export class MessagingClient {
|
|
|
36
38
|
await this.resumeSession();
|
|
37
39
|
}
|
|
38
40
|
};
|
|
39
|
-
this.nchan = new NchanClient(options.baseUrl);
|
|
41
|
+
this.nchan = options.nchan ?? new NchanClient(options.baseUrl);
|
|
40
42
|
}
|
|
41
43
|
/**
|
|
42
44
|
* Sets a global software version string that will be attached to all outgoing messages.
|
|
@@ -160,24 +162,87 @@ export class MessagingClient {
|
|
|
160
162
|
}
|
|
161
163
|
/**
|
|
162
164
|
* Joins a specific table for communication.
|
|
165
|
+
*
|
|
166
|
+
* Resolves as soon as the session exists; the handshake (subscription ready,
|
|
167
|
+
* `joined` publish, presence update) continues in the background. Concurrent
|
|
168
|
+
* calls for the same session share one operation and one table instance.
|
|
169
|
+
* Same-tableId calls with a different user or role reject before a second
|
|
170
|
+
* session is created.
|
|
163
171
|
*/
|
|
164
172
|
async joinTable(tableId, userId, options) {
|
|
165
173
|
const isSpectator = options?.isSpectator ?? false;
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
174
|
+
const key = this.tableKey(tableId, userId, isSpectator);
|
|
175
|
+
// Concurrent calls for the same session share one operation.
|
|
176
|
+
const inFlight = this.joiningTables.get(key);
|
|
177
|
+
if (inFlight)
|
|
178
|
+
return inFlight.promise;
|
|
179
|
+
// Same-tableId calls with a different user or role reject before creating a session.
|
|
180
|
+
this.assertNoTableConflict(tableId, userId, isSpectator);
|
|
181
|
+
// Reuse an already-joined session for this identity. Options supplied on
|
|
182
|
+
// this later call do not add listeners (constructor registration only).
|
|
183
|
+
const existing = this.activeTables.find((t) => t.tableId === tableId);
|
|
184
|
+
if (existing) {
|
|
185
|
+
return Promise.resolve(existing);
|
|
170
186
|
}
|
|
171
187
|
const lobby = isSpectator
|
|
172
188
|
? undefined
|
|
173
189
|
: this.activeLobbies.find((l) => l.currentUser.userId === userId);
|
|
174
|
-
const table = new Table(this.nchan, tableId, userId, lobby, isSpectator, options?.onMessage, options?.onBothJoined);
|
|
175
|
-
await table.join();
|
|
190
|
+
const table = new Table(this.nchan, tableId, userId, lobby, isSpectator, options?.onMessage, options?.onBothJoined, () => this.removeActiveTable(table));
|
|
176
191
|
this.activeTables.push(table);
|
|
192
|
+
// The session exists — resolve now. The handshake continues in the
|
|
193
|
+
// background so consumers never need a separate initial-connection
|
|
194
|
+
// publish queue.
|
|
195
|
+
const handshake = table.join().catch((e) => {
|
|
196
|
+
console.error(`Table ${tableId} join handshake failed:`, e);
|
|
197
|
+
});
|
|
177
198
|
if (lobby) {
|
|
178
|
-
|
|
199
|
+
void handshake.then(async () => {
|
|
200
|
+
if (table.closed)
|
|
201
|
+
return;
|
|
202
|
+
try {
|
|
203
|
+
await lobby.updatePresence({ tableId });
|
|
204
|
+
}
|
|
205
|
+
catch (e) {
|
|
206
|
+
console.error("Failed to update presence after table join:", e);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
179
209
|
}
|
|
180
|
-
|
|
210
|
+
// Register the in-flight entry *before* the delete (scheduled as a
|
|
211
|
+
// microtask via .finally) so the same-key entry is never stale.
|
|
212
|
+
const joinPromise = Promise.resolve(table).finally(() => {
|
|
213
|
+
this.joiningTables.delete(key);
|
|
214
|
+
});
|
|
215
|
+
this.joiningTables.set(key, { tableId, userId, isSpectator, promise: joinPromise });
|
|
216
|
+
return joinPromise;
|
|
217
|
+
}
|
|
218
|
+
/** Logical session identity for the in-flight join map. */
|
|
219
|
+
tableKey(tableId, userId, isSpectator) {
|
|
220
|
+
return `${tableId}|${userId}|${isSpectator ? "s" : "p"}`;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Rejects same-tableId joins with a different user or role before a second
|
|
224
|
+
* session can be created within this client instance.
|
|
225
|
+
*/
|
|
226
|
+
assertNoTableConflict(tableId, userId, isSpectator) {
|
|
227
|
+
for (const entry of this.joiningTables.values()) {
|
|
228
|
+
if (entry.tableId === tableId && (entry.userId !== userId || entry.isSpectator !== isSpectator)) {
|
|
229
|
+
throw new Error(`Table ${tableId} is already being joined as ` +
|
|
230
|
+
`${entry.isSpectator ? "spectator" : "player"} ${entry.userId}; ` +
|
|
231
|
+
`cannot also join as ${isSpectator ? "spectator" : "player"} ${userId}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
for (const t of this.activeTables) {
|
|
235
|
+
if (t.tableId === tableId && (t.userId !== userId || t.isSpectator !== isSpectator)) {
|
|
236
|
+
throw new Error(`Table ${tableId} is already joined as ${t.isSpectator ? "spectator" : "player"} ${t.userId}; ` +
|
|
237
|
+
`cannot also join as ${isSpectator ? "spectator" : "player"} ${userId}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/** Lifecycle cleanup: drop a closed table so later joins create a fresh session. */
|
|
242
|
+
removeActiveTable(table) {
|
|
243
|
+
const idx = this.activeTables.indexOf(table);
|
|
244
|
+
if (idx !== -1)
|
|
245
|
+
this.activeTables.splice(idx, 1);
|
|
181
246
|
}
|
|
182
247
|
/**
|
|
183
248
|
* Subscribes to a table as a read-only spectator.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messagingclient.js","sourceRoot":"","sources":["../src/messagingclient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAgB,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC;;;GAGG;AACH,MAAM,OAAO,eAAe;
|
|
1
|
+
{"version":3,"file":"messagingclient.js","sourceRoot":"","sources":["../src/messagingclient.ts"],"names":[],"mappings":"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"}
|
package/dist/table.d.ts
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import { NchanClient } from "./nchanclient";
|
|
2
2
|
import { TableMessage, PresenceMessage } from "./types";
|
|
3
3
|
import { Lobby } from "./lobby";
|
|
4
|
+
/**
|
|
5
|
+
* Configuration for the bounded application-publish outbox.
|
|
6
|
+
*/
|
|
7
|
+
export interface TableOutboxOptions {
|
|
8
|
+
/** Max queued publishes before publish() rejects. Default 1000. */
|
|
9
|
+
maxSize?: number;
|
|
10
|
+
/** Base retry delay on publish failure (doubles each attempt). Default 4000ms. */
|
|
11
|
+
initialRetryDelayMs?: number;
|
|
12
|
+
/** Maximum retry delay. Default 30000ms. */
|
|
13
|
+
maxRetryDelayMs?: number;
|
|
14
|
+
}
|
|
4
15
|
/**
|
|
5
16
|
* Represents a specific communication channel for a 2-player/spectator scenario at a table.
|
|
6
17
|
* Uses `any` as default for internal storage flexibility; consumers should use `unknown` or specific types.
|
|
@@ -8,14 +19,30 @@ import { Lobby } from "./lobby";
|
|
|
8
19
|
export declare class Table<T = any> {
|
|
9
20
|
private nchan;
|
|
10
21
|
readonly tableId: string;
|
|
11
|
-
|
|
22
|
+
readonly userId: string;
|
|
12
23
|
private lobby?;
|
|
13
|
-
|
|
24
|
+
readonly isSpectator: boolean;
|
|
25
|
+
/** Internal: invoked after teardown so the owning client can drop the closed session. */
|
|
26
|
+
private onClosed?;
|
|
14
27
|
private subscription;
|
|
15
28
|
private isJoined;
|
|
29
|
+
private isClosed;
|
|
30
|
+
/** True once the subscription socket has opened (vs. still connecting). */
|
|
31
|
+
private socketEstablished;
|
|
32
|
+
/** Bounded application-publish outbox. */
|
|
33
|
+
private readonly maxOutboxSize;
|
|
34
|
+
private readonly initialRetryDelayMs;
|
|
35
|
+
private readonly maxRetryDelayMs;
|
|
36
|
+
private publishQueue;
|
|
37
|
+
private flushing;
|
|
38
|
+
private flushPromise;
|
|
39
|
+
private retryAttempt;
|
|
40
|
+
/** In-flight join operation; concurrent join() calls share it. */
|
|
41
|
+
private joinPromise;
|
|
16
42
|
private messageListeners;
|
|
17
43
|
private spectatorListeners;
|
|
18
44
|
private opponentLeftListeners;
|
|
45
|
+
private opponentRejoinedListeners;
|
|
19
46
|
opponentLeft: boolean;
|
|
20
47
|
readonly bothJoined: Promise<void>;
|
|
21
48
|
private resolveBothJoined;
|
|
@@ -23,19 +50,72 @@ export declare class Table<T = any> {
|
|
|
23
50
|
private bothJoinedResolved;
|
|
24
51
|
private seenIds;
|
|
25
52
|
private preJoinQueue;
|
|
26
|
-
constructor(nchan: NchanClient, tableId: string, userId: string, lobby?: Lobby | undefined, isSpectator?: boolean, onMessage?: (event: TableMessage<T>) => void, onBothJoined?: () => void);
|
|
27
53
|
/**
|
|
28
|
-
*
|
|
54
|
+
* Reconnect replay dedup. Nchan replays the channel buffer from `oldest` on
|
|
55
|
+
* reconnect, so messages already processed are re-delivered. Preferred key:
|
|
56
|
+
* the server-generated per-message `msgId`, which survives the server
|
|
57
|
+
* round-trip (see nchan_meta.js mergeMeta). Server `meta.ts` has millisecond
|
|
58
|
+
* granularity, so two DISTINCT messages can share a ts — a ts-only dedup
|
|
59
|
+
* would drop the second one and, e.g., strand the bothJoined handshake.
|
|
60
|
+
* FIFO-bounded to the message buffer size (2000) with headroom.
|
|
61
|
+
*/
|
|
62
|
+
private seenMsgIds;
|
|
63
|
+
private static readonly MAX_SEEN_MSG_IDS;
|
|
64
|
+
/** True once leave() has completed; join() rejects afterwards. */
|
|
65
|
+
get closed(): boolean;
|
|
66
|
+
constructor(nchan: NchanClient, tableId: string, userId: string, lobby?: Lobby | undefined, isSpectator?: boolean, onMessage?: (event: TableMessage<T>) => void, onBothJoined?: () => void,
|
|
67
|
+
/** Internal: invoked after teardown so the owning client can drop the closed session. */
|
|
68
|
+
onClosed?: (() => void) | undefined, outbox?: TableOutboxOptions);
|
|
69
|
+
/**
|
|
70
|
+
* Joins the table: creates exactly one subscription and, for players, one
|
|
71
|
+
* initial `joined` handshake per join cycle. Idempotent: concurrent calls
|
|
72
|
+
* share one in-flight operation and calls after the table is ready are
|
|
73
|
+
* no-ops. Rejects once the table has been closed via leave().
|
|
74
|
+
*
|
|
75
|
+
* Deliberately not `async`: concurrent callers must receive the very same
|
|
76
|
+
* Promise object (an `async` wrapper would create a new one per call).
|
|
29
77
|
*/
|
|
30
78
|
join(): Promise<void>;
|
|
79
|
+
private doJoin;
|
|
31
80
|
/**
|
|
32
81
|
* Broadcast an event to all participants at the table.
|
|
82
|
+
*
|
|
83
|
+
* Publishes are enqueued to a single bounded outbox, sent serially and in
|
|
84
|
+
* order by a flusher, and retried with exponential backoff until the server
|
|
85
|
+
* accepts them. Publishes issued before the subscription is live are held
|
|
86
|
+
* until readiness. The promise resolves when the server accepted the POST;
|
|
87
|
+
* it rejects if the table is closed or the queue is full. This is not a
|
|
88
|
+
* guarantee of remote delivery — applications needing state recovery should
|
|
89
|
+
* use acks or a replayable state protocol.
|
|
33
90
|
*/
|
|
34
91
|
publish(type: string, data: T): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Reconnect handling: the transport replaced our connection, so re-announce
|
|
94
|
+
* the `joined` handshake for the new connection (control path — fixes the
|
|
95
|
+
* server-restart dead-table hang) and kick the outbox so any publishes
|
|
96
|
+
* queued during the gap are sent. Keeps the same Table object and listeners.
|
|
97
|
+
*/
|
|
98
|
+
private handleReconnect;
|
|
99
|
+
/**
|
|
100
|
+
* Direct publish with retry, used for internal control messages (e.g.
|
|
101
|
+
* `joined`). Bypasses the application outbox so a control handshake can
|
|
102
|
+
* never wait behind (or be starved by) application publishes.
|
|
103
|
+
*/
|
|
104
|
+
private publishControl;
|
|
105
|
+
/** Starts the serial flusher if it is not already running. */
|
|
106
|
+
private flush;
|
|
107
|
+
/** Sends queued publishes one at a time, in order, retrying on failure. */
|
|
108
|
+
private runFlush;
|
|
109
|
+
private nextRetryDelay;
|
|
110
|
+
private delay;
|
|
35
111
|
/**
|
|
36
112
|
* Subscribe to opponent departure (explicit leave or timeout).
|
|
37
113
|
*/
|
|
38
114
|
onOpponentLeft(callback: () => void): void;
|
|
115
|
+
/**
|
|
116
|
+
* Subscribe to opponent rejoin.
|
|
117
|
+
*/
|
|
118
|
+
onOpponentRejoined(callback: () => void): void;
|
|
39
119
|
/**
|
|
40
120
|
* Subscribe to changes in the spectator list.
|
|
41
121
|
* Note: In a real implementation, this would track presence messages on the table channel.
|
|
@@ -47,6 +127,7 @@ export declare class Table<T = any> {
|
|
|
47
127
|
leave(options?: {
|
|
48
128
|
isTeardown?: boolean;
|
|
49
129
|
}): Promise<void>;
|
|
130
|
+
private rejectQueuedPublishes;
|
|
50
131
|
private handleIncomingMessage;
|
|
51
132
|
private notifyOpponentLeft;
|
|
52
133
|
}
|
package/dist/table.js
CHANGED
|
@@ -4,22 +4,52 @@ import { isSpectatorTableLeave, parseMessage } from "./types.js";
|
|
|
4
4
|
* Uses `any` as default for internal storage flexibility; consumers should use `unknown` or specific types.
|
|
5
5
|
*/
|
|
6
6
|
export class Table {
|
|
7
|
-
|
|
7
|
+
/** True once leave() has completed; join() rejects afterwards. */
|
|
8
|
+
get closed() {
|
|
9
|
+
return this.isClosed;
|
|
10
|
+
}
|
|
11
|
+
constructor(nchan, tableId, userId, lobby, isSpectator = false, onMessage, onBothJoined,
|
|
12
|
+
/** Internal: invoked after teardown so the owning client can drop the closed session. */
|
|
13
|
+
onClosed, outbox) {
|
|
8
14
|
this.nchan = nchan;
|
|
9
15
|
this.tableId = tableId;
|
|
10
16
|
this.userId = userId;
|
|
11
17
|
this.lobby = lobby;
|
|
12
18
|
this.isSpectator = isSpectator;
|
|
19
|
+
this.onClosed = onClosed;
|
|
13
20
|
this.subscription = null;
|
|
14
21
|
this.isJoined = false;
|
|
22
|
+
this.isClosed = false;
|
|
23
|
+
/** True once the subscription socket has opened (vs. still connecting). */
|
|
24
|
+
this.socketEstablished = false;
|
|
25
|
+
this.publishQueue = [];
|
|
26
|
+
this.flushing = false;
|
|
27
|
+
this.flushPromise = null;
|
|
28
|
+
this.retryAttempt = 0;
|
|
29
|
+
/** In-flight join operation; concurrent join() calls share it. */
|
|
30
|
+
this.joinPromise = null;
|
|
15
31
|
this.messageListeners = [];
|
|
16
32
|
this.spectatorListeners = [];
|
|
17
33
|
this.opponentLeftListeners = [];
|
|
34
|
+
this.opponentRejoinedListeners = [];
|
|
18
35
|
this.opponentLeft = false;
|
|
19
36
|
this.bothJoinedListeners = [];
|
|
20
37
|
this.bothJoinedResolved = false;
|
|
21
38
|
this.seenIds = new Set();
|
|
22
39
|
this.preJoinQueue = [];
|
|
40
|
+
/**
|
|
41
|
+
* Reconnect replay dedup. Nchan replays the channel buffer from `oldest` on
|
|
42
|
+
* reconnect, so messages already processed are re-delivered. Preferred key:
|
|
43
|
+
* the server-generated per-message `msgId`, which survives the server
|
|
44
|
+
* round-trip (see nchan_meta.js mergeMeta). Server `meta.ts` has millisecond
|
|
45
|
+
* granularity, so two DISTINCT messages can share a ts — a ts-only dedup
|
|
46
|
+
* would drop the second one and, e.g., strand the bothJoined handshake.
|
|
47
|
+
* FIFO-bounded to the message buffer size (2000) with headroom.
|
|
48
|
+
*/
|
|
49
|
+
this.seenMsgIds = new Map();
|
|
50
|
+
this.maxOutboxSize = outbox?.maxSize ?? 1000;
|
|
51
|
+
this.initialRetryDelayMs = outbox?.initialRetryDelayMs ?? 4000;
|
|
52
|
+
this.maxRetryDelayMs = outbox?.maxRetryDelayMs ?? 30000;
|
|
23
53
|
this.bothJoined = new Promise((resolve) => {
|
|
24
54
|
this.resolveBothJoined = () => {
|
|
25
55
|
if (this.bothJoinedResolved)
|
|
@@ -44,23 +74,195 @@ export class Table {
|
|
|
44
74
|
}
|
|
45
75
|
}
|
|
46
76
|
/**
|
|
47
|
-
*
|
|
77
|
+
* Joins the table: creates exactly one subscription and, for players, one
|
|
78
|
+
* initial `joined` handshake per join cycle. Idempotent: concurrent calls
|
|
79
|
+
* share one in-flight operation and calls after the table is ready are
|
|
80
|
+
* no-ops. Rejects once the table has been closed via leave().
|
|
81
|
+
*
|
|
82
|
+
* Deliberately not `async`: concurrent callers must receive the very same
|
|
83
|
+
* Promise object (an `async` wrapper would create a new one per call).
|
|
48
84
|
*/
|
|
49
|
-
|
|
85
|
+
join() {
|
|
86
|
+
if (this.isClosed) {
|
|
87
|
+
return Promise.reject(new Error(`Cannot join table ${this.tableId}: table is closed`));
|
|
88
|
+
}
|
|
89
|
+
if (this.isJoined)
|
|
90
|
+
return Promise.resolve();
|
|
91
|
+
if (this.joinPromise)
|
|
92
|
+
return this.joinPromise;
|
|
93
|
+
this.joinPromise = this.doJoin().finally(() => {
|
|
94
|
+
this.joinPromise = null;
|
|
95
|
+
});
|
|
96
|
+
return this.joinPromise;
|
|
97
|
+
}
|
|
98
|
+
async doJoin() {
|
|
99
|
+
if (this.isClosed)
|
|
100
|
+
return;
|
|
50
101
|
this.subscription = this.nchan.subscribeTable(this.tableId, this.userId, (data) => {
|
|
51
102
|
this.handleIncomingMessage(data);
|
|
52
103
|
}, { isSpectator: this.isSpectator });
|
|
53
|
-
|
|
54
|
-
|
|
104
|
+
// The transport reconnects internally, keeping the same Subscription and
|
|
105
|
+
// Table object; re-announce the handshake and flush the outbox per
|
|
106
|
+
// replacement connection.
|
|
107
|
+
this.subscription.onReconnect = () => this.handleReconnect();
|
|
108
|
+
try {
|
|
109
|
+
await this.subscription.ready;
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
this.subscription.stop();
|
|
113
|
+
throw e;
|
|
114
|
+
}
|
|
115
|
+
this.socketEstablished = true;
|
|
116
|
+
// The table may have been closed while the subscription was connecting.
|
|
117
|
+
if (this.isClosed) {
|
|
118
|
+
this.subscription.stop();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
55
121
|
if (!this.isSpectator) {
|
|
56
|
-
|
|
122
|
+
try {
|
|
123
|
+
// Control path: never queued behind application publishes (handshake
|
|
124
|
+
// deadlock), retried until accepted so bothJoined cannot hang.
|
|
125
|
+
await this.publishControl("joined", { id: this.userId });
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
// The handshake could not be announced. Tear the subscription down so a
|
|
129
|
+
// retry starts clean instead of a broken half-joined state with a
|
|
130
|
+
// duplicate subscription.
|
|
131
|
+
this.subscription.stop();
|
|
132
|
+
throw e;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (this.isClosed) {
|
|
136
|
+
this.subscription?.stop();
|
|
137
|
+
return;
|
|
57
138
|
}
|
|
139
|
+
this.isJoined = true;
|
|
58
140
|
}
|
|
59
141
|
/**
|
|
60
142
|
* Broadcast an event to all participants at the table.
|
|
143
|
+
*
|
|
144
|
+
* Publishes are enqueued to a single bounded outbox, sent serially and in
|
|
145
|
+
* order by a flusher, and retried with exponential backoff until the server
|
|
146
|
+
* accepts them. Publishes issued before the subscription is live are held
|
|
147
|
+
* until readiness. The promise resolves when the server accepted the POST;
|
|
148
|
+
* it rejects if the table is closed or the queue is full. This is not a
|
|
149
|
+
* guarantee of remote delivery — applications needing state recovery should
|
|
150
|
+
* use acks or a replayable state protocol.
|
|
151
|
+
*/
|
|
152
|
+
publish(type, data) {
|
|
153
|
+
if (this.isClosed) {
|
|
154
|
+
return Promise.reject(new Error(`Cannot publish to table ${this.tableId}: table is closed`));
|
|
155
|
+
}
|
|
156
|
+
if (this.publishQueue.length >= this.maxOutboxSize) {
|
|
157
|
+
return Promise.reject(new Error(`Table ${this.tableId} publish queue is full (max ${this.maxOutboxSize})`));
|
|
158
|
+
}
|
|
159
|
+
return new Promise((resolve, reject) => {
|
|
160
|
+
this.publishQueue.push({ type, data, resolve, reject });
|
|
161
|
+
void this.flush();
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Reconnect handling: the transport replaced our connection, so re-announce
|
|
166
|
+
* the `joined` handshake for the new connection (control path — fixes the
|
|
167
|
+
* server-restart dead-table hang) and kick the outbox so any publishes
|
|
168
|
+
* queued during the gap are sent. Keeps the same Table object and listeners.
|
|
61
169
|
*/
|
|
62
|
-
|
|
63
|
-
|
|
170
|
+
handleReconnect() {
|
|
171
|
+
if (this.isClosed || !this.isJoined)
|
|
172
|
+
return;
|
|
173
|
+
if (!this.isSpectator) {
|
|
174
|
+
this.publishControl("joined", { id: this.userId }).catch((e) => {
|
|
175
|
+
console.error(`Table ${this.tableId} re-announced joined failed:`, e);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
// Kick the flusher so publishes held or queued during the gap are sent.
|
|
179
|
+
void this.flush();
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Direct publish with retry, used for internal control messages (e.g.
|
|
183
|
+
* `joined`). Bypasses the application outbox so a control handshake can
|
|
184
|
+
* never wait behind (or be starved by) application publishes.
|
|
185
|
+
*/
|
|
186
|
+
publishControl(type, data) {
|
|
187
|
+
return new Promise((resolve, reject) => {
|
|
188
|
+
const attempt = (retries) => {
|
|
189
|
+
if (this.isClosed) {
|
|
190
|
+
reject(new Error(`Cannot publish control message to closed table ${this.tableId}`));
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
this.nchan
|
|
194
|
+
.publishTable(this.tableId, { type, data }, this.userId)
|
|
195
|
+
.then(() => resolve())
|
|
196
|
+
.catch((e) => {
|
|
197
|
+
if (this.isClosed) {
|
|
198
|
+
reject(e);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
const delay = Math.min(Math.pow(2, retries + 1) * this.initialRetryDelayMs, this.maxRetryDelayMs);
|
|
202
|
+
setTimeout(() => attempt(retries + 1), delay);
|
|
203
|
+
});
|
|
204
|
+
};
|
|
205
|
+
attempt(0);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
/** Starts the serial flusher if it is not already running. */
|
|
209
|
+
flush() {
|
|
210
|
+
if (this.flushing && this.flushPromise)
|
|
211
|
+
return this.flushPromise;
|
|
212
|
+
this.flushing = true;
|
|
213
|
+
this.flushPromise = this.runFlush().finally(() => {
|
|
214
|
+
this.flushing = false;
|
|
215
|
+
this.flushPromise = null;
|
|
216
|
+
// A publish may have arrived in the window between the flusher's loop
|
|
217
|
+
// exiting (queue momentarily empty) and this finally releasing the lock;
|
|
218
|
+
// it grabbed the dead in-flight promise and would otherwise hang forever.
|
|
219
|
+
// Restart the flusher so it is processed. (Without this, sequential
|
|
220
|
+
// awaited publishes like `await publish(a); await publish(b)` deadlock.)
|
|
221
|
+
if (this.publishQueue.length > 0 && !this.isClosed) {
|
|
222
|
+
void this.flush();
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
return this.flushPromise;
|
|
226
|
+
}
|
|
227
|
+
/** Sends queued publishes one at a time, in order, retrying on failure. */
|
|
228
|
+
async runFlush() {
|
|
229
|
+
while (this.publishQueue.length > 0 && !this.isClosed) {
|
|
230
|
+
// Per design decision 1, hold application publishes until the
|
|
231
|
+
// subscription is live when a join is in flight.
|
|
232
|
+
if (!this.socketEstablished && this.joinPromise) {
|
|
233
|
+
try {
|
|
234
|
+
await this.joinPromise;
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Join failed; the retry loop owns delivery from here.
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (this.isClosed)
|
|
241
|
+
break;
|
|
242
|
+
const item = this.publishQueue.shift();
|
|
243
|
+
try {
|
|
244
|
+
await this.nchan.publishTable(this.tableId, { type: item.type, data: item.data }, this.userId);
|
|
245
|
+
this.retryAttempt = 0;
|
|
246
|
+
item.resolve();
|
|
247
|
+
}
|
|
248
|
+
catch (e) {
|
|
249
|
+
if (this.isClosed) {
|
|
250
|
+
item.reject(e);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
// Keep the failed item at the head so retries preserve order.
|
|
254
|
+
this.publishQueue.unshift(item);
|
|
255
|
+
await this.delay(this.nextRetryDelay());
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
nextRetryDelay() {
|
|
260
|
+
const delay = Math.min(Math.pow(2, this.retryAttempt + 1) * this.initialRetryDelayMs, this.maxRetryDelayMs);
|
|
261
|
+
this.retryAttempt++;
|
|
262
|
+
return delay;
|
|
263
|
+
}
|
|
264
|
+
delay(ms) {
|
|
265
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
64
266
|
}
|
|
65
267
|
/**
|
|
66
268
|
* Subscribe to opponent departure (explicit leave or timeout).
|
|
@@ -71,6 +273,12 @@ export class Table {
|
|
|
71
273
|
callback();
|
|
72
274
|
}
|
|
73
275
|
}
|
|
276
|
+
/**
|
|
277
|
+
* Subscribe to opponent rejoin.
|
|
278
|
+
*/
|
|
279
|
+
onOpponentRejoined(callback) {
|
|
280
|
+
this.opponentRejoinedListeners.push(callback);
|
|
281
|
+
}
|
|
74
282
|
/**
|
|
75
283
|
* Subscribe to changes in the spectator list.
|
|
76
284
|
* Note: In a real implementation, this would track presence messages on the table channel.
|
|
@@ -82,6 +290,11 @@ export class Table {
|
|
|
82
290
|
* Leave the table and stop all subscriptions.
|
|
83
291
|
*/
|
|
84
292
|
async leave(options = {}) {
|
|
293
|
+
if (this.isClosed)
|
|
294
|
+
return;
|
|
295
|
+
// Mark closed immediately so new publishes reject, the flusher stops, and
|
|
296
|
+
// the control path aborts its retries.
|
|
297
|
+
this.isClosed = true;
|
|
85
298
|
// Only send leave message on explicit user action, not on page hide/teardown
|
|
86
299
|
if (!options.isTeardown) {
|
|
87
300
|
try {
|
|
@@ -100,19 +313,62 @@ export class Table {
|
|
|
100
313
|
if (this.lobby) {
|
|
101
314
|
await this.lobby.updatePresence({ tableId: undefined });
|
|
102
315
|
}
|
|
103
|
-
|
|
316
|
+
// If the socket is still connecting, do NOT close it here: aborting a
|
|
317
|
+
// still-connecting socket would prevent the server from ever establishing
|
|
318
|
+
// the subscription, so its unsubscribe `table:leave` would never fire. The
|
|
319
|
+
// in-flight doJoin() closes it itself once established (it sees `closed`
|
|
320
|
+
// and tears down). Once established, close it directly.
|
|
321
|
+
if (this.socketEstablished) {
|
|
322
|
+
this.subscription?.stop();
|
|
323
|
+
}
|
|
104
324
|
this.messageListeners = [];
|
|
105
325
|
this.spectatorListeners = [];
|
|
106
326
|
this.opponentLeftListeners = [];
|
|
327
|
+
this.opponentRejoinedListeners = [];
|
|
107
328
|
this.isJoined = false;
|
|
329
|
+
this.joinPromise = null;
|
|
330
|
+
// Reject any held publishes: every held publish settles exactly once and
|
|
331
|
+
// no stale async work can send them after the table is closed.
|
|
332
|
+
this.rejectQueuedPublishes();
|
|
333
|
+
// Notify the owning client so the closed session is dropped and later
|
|
334
|
+
// joins create a fresh session.
|
|
335
|
+
this.onClosed?.();
|
|
336
|
+
}
|
|
337
|
+
rejectQueuedPublishes() {
|
|
338
|
+
while (this.publishQueue.length > 0) {
|
|
339
|
+
const item = this.publishQueue.shift();
|
|
340
|
+
item.reject(new Error(`Table ${this.tableId} publish cancelled: table closed`));
|
|
341
|
+
}
|
|
108
342
|
}
|
|
109
343
|
handleIncomingMessage(data) {
|
|
110
344
|
const msg = parseMessage(data);
|
|
111
345
|
if (!msg || !msg.type)
|
|
112
346
|
return;
|
|
113
|
-
//
|
|
114
|
-
|
|
115
|
-
|
|
347
|
+
// Internal replay dedup: on reconnect Nchan replays the channel buffer from
|
|
348
|
+
// `oldest`, so messages already processed are re-delivered. Dedup by the
|
|
349
|
+
// per-message msgId, robust against same-millisecond ts collisions. This
|
|
350
|
+
// runs before system-message handling so replayed `joined`/`table:leave`
|
|
351
|
+
// cannot re-trigger opponent-left/rejoin notifications. Messages without
|
|
352
|
+
// server metadata (e.g. unit fixtures) are always delivered.
|
|
353
|
+
const msgId = msg.meta?.msgId;
|
|
354
|
+
if (typeof msgId === "string") {
|
|
355
|
+
if (this.seenMsgIds.has(msgId))
|
|
356
|
+
return;
|
|
357
|
+
this.seenMsgIds.set(msgId, true);
|
|
358
|
+
// FIFO-bounded: the channel buffer holds 2000 messages, so only that
|
|
359
|
+
// many need remembering across a reconnect replay.
|
|
360
|
+
if (this.seenMsgIds.size > Table.MAX_SEEN_MSG_IDS) {
|
|
361
|
+
const oldest = this.seenMsgIds.keys().next().value;
|
|
362
|
+
if (oldest !== undefined)
|
|
363
|
+
this.seenMsgIds.delete(oldest);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// Handle system messages internally and filter them from generic onMessage.
|
|
367
|
+
if (msg.type === "table:leave") {
|
|
368
|
+
if (msg.senderId !== this.userId && !isSpectatorTableLeave(msg)) {
|
|
369
|
+
this.notifyOpponentLeft();
|
|
370
|
+
}
|
|
371
|
+
return; // Filter out internal "table:leave" messages from onMessage listeners
|
|
116
372
|
}
|
|
117
373
|
if (msg.type === "joined") {
|
|
118
374
|
const joinData = msg.data;
|
|
@@ -122,6 +378,11 @@ export class Table {
|
|
|
122
378
|
if (this.seenIds.size >= 2) {
|
|
123
379
|
this.resolveBothJoined();
|
|
124
380
|
}
|
|
381
|
+
// Detect rejoin if it is the opponent, bothJoined has resolved, and opponentLeft is currently true
|
|
382
|
+
if (this.bothJoinedResolved && joinedId !== this.userId && this.opponentLeft) {
|
|
383
|
+
this.opponentLeft = false;
|
|
384
|
+
this.opponentRejoinedListeners.forEach((cb) => cb());
|
|
385
|
+
}
|
|
125
386
|
}
|
|
126
387
|
return; // Filter out internal "joined" messages from generic onMessage listeners
|
|
127
388
|
}
|
|
@@ -142,4 +403,5 @@ export class Table {
|
|
|
142
403
|
this.opponentLeftListeners.forEach((cb) => cb());
|
|
143
404
|
}
|
|
144
405
|
}
|
|
406
|
+
Table.MAX_SEEN_MSG_IDS = 8192;
|
|
145
407
|
//# sourceMappingURL=table.js.map
|
package/dist/table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export interface Meta {
|
|
|
11
11
|
country: string;
|
|
12
12
|
since?: number;
|
|
13
13
|
version?: string;
|
|
14
|
+
msgId?: string;
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
17
|
* Seek object for table seeking in the lobby
|
|
@@ -35,6 +36,7 @@ export interface PresenceMessage {
|
|
|
35
36
|
isSpectator?: boolean;
|
|
36
37
|
isLeaving?: boolean;
|
|
37
38
|
clientTs?: number;
|
|
39
|
+
readonly options?: Record<string, string>;
|
|
38
40
|
}
|
|
39
41
|
/**
|
|
40
42
|
* Peer-to-peer challenge request
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAsFA,MAAM,UAAU,qBAAqB,CAAC,GAAiB;IACrD,OAAO,GAAG,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAE,GAAG,CAAC,IAAuB,EAAE,WAAW,CAAC;AACnF,CAAC;AA4BD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAQ;IACxC,OAAO,GAAG,EAAE,WAAW,KAAK,UAAU,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAQ;IACzC,OAAO,GAAG,EAAE,WAAW,KAAK,WAAW,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAQ;IACpC,OAAO,GAAG,EAAE,WAAW,KAAK,MAAM,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAuB,EAAE,aAAqB;IACzE,OAAO,MAAM,CAAC,MAAM,KAAK,aAAa,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAuB,EAAE,cAAuB;IAC1E,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,KAAK,cAAc,CAAC;AACtF,CAAC;AAOD,MAAM,UAAU,UAAU,CAAC,IAAqB;IAC9C,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO,WAAW,CAAC;IACtC,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,YAAY,CAAC;IAC1C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAqB;IAC7C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAwB;IAClD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;oBACxB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,OAAO,EAAE,EAAE;oBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAE,CAAC,OAAO,CAAC,IAAI,CAAC;gBACtC,EAAE,EAAE,IAAI,CAAC,MAAM;gBACf,IAAI,EAAE,IAAI,CAAC,QAAQ;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAI,IAAY;IAC1C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,CAAC,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tailuge/messaging",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.40.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A stateful messaging library for Nchan-powered real-time applications.",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -50,12 +50,12 @@
|
|
|
50
50
|
"author": "tailuge",
|
|
51
51
|
"license": "GPL-3.0",
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@playwright/test": "^1.62.
|
|
53
|
+
"@playwright/test": "^1.62.1",
|
|
54
54
|
"@types/jest": "^30.0.0",
|
|
55
55
|
"@types/ws": "^8.18.1",
|
|
56
56
|
"esbuild": "^0.28.1",
|
|
57
57
|
"jest": "^30.4.2",
|
|
58
|
-
"oxlint": "^1.
|
|
58
|
+
"oxlint": "^1.76.0",
|
|
59
59
|
"testcontainers": "9.12.0",
|
|
60
60
|
"ts-jest": "^29.4.12",
|
|
61
61
|
"ts-node": "^10.9.2",
|