@tailuge/messaging 1.25.0 → 1.26.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/dist/lobby.d.ts +1 -9
- package/dist/lobby.js +10 -48
- package/dist/lobby.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.js.map +1 -1
- package/package.json +8 -6
package/dist/lobby.d.ts
CHANGED
|
@@ -3,8 +3,6 @@ import { PresenceMessage, ChallengeMessage, ChatMessage } from "./types";
|
|
|
3
3
|
import { Table } from "./table";
|
|
4
4
|
export interface LobbyOptions {
|
|
5
5
|
heartbeatInterval?: number;
|
|
6
|
-
pruneInterval?: number;
|
|
7
|
-
staleTtl?: number;
|
|
8
6
|
onReconnect?: () => void;
|
|
9
7
|
onLeave?: () => void;
|
|
10
8
|
}
|
|
@@ -23,13 +21,9 @@ export declare class Lobby {
|
|
|
23
21
|
private deduplicator;
|
|
24
22
|
private subscription;
|
|
25
23
|
private isJoined;
|
|
26
|
-
private cachedUsersList;
|
|
27
24
|
private heartbeatTimer?;
|
|
28
|
-
private pruneTimer?;
|
|
29
25
|
private presenceMessageCount;
|
|
30
26
|
private readonly heartbeatInterval;
|
|
31
|
-
private readonly pruneInterval;
|
|
32
|
-
private readonly staleTtl;
|
|
33
27
|
constructor(nchan: NchanClient, currentUser: PresenceMessage, options?: LobbyOptions);
|
|
34
28
|
/**
|
|
35
29
|
* Subscribe to incoming chat messages directed at the current user.
|
|
@@ -53,8 +47,6 @@ export declare class Lobby {
|
|
|
53
47
|
resumeHeartbeat(): void;
|
|
54
48
|
private startHeartbeat;
|
|
55
49
|
private stopHeartbeat;
|
|
56
|
-
private startPruning;
|
|
57
|
-
private stopPruning;
|
|
58
50
|
/**
|
|
59
51
|
* Emits the current list of online users whenever it changes.
|
|
60
52
|
*/
|
|
@@ -81,7 +73,7 @@ export declare class Lobby {
|
|
|
81
73
|
* Accept an incoming challenge.
|
|
82
74
|
* Returns the Table instance for the accepted game.
|
|
83
75
|
*/
|
|
84
|
-
acceptChallenge(userId: string, ruleType: string, tableId: string, options?: Record<string, string>, challengerName?: string): Promise<Table>;
|
|
76
|
+
acceptChallenge(userId: string, ruleType: string, tableId: string, options?: Record<string, string>, challengerName?: string, nextTurnId?: string): Promise<Table>;
|
|
85
77
|
/**
|
|
86
78
|
* Decline an incoming challenge.
|
|
87
79
|
*/
|
package/dist/lobby.js
CHANGED
|
@@ -17,11 +17,8 @@ export class Lobby {
|
|
|
17
17
|
this.pendingChallenges = [];
|
|
18
18
|
this.subscription = null;
|
|
19
19
|
this.isJoined = false;
|
|
20
|
-
this.cachedUsersList = null;
|
|
21
20
|
this.presenceMessageCount = 0;
|
|
22
21
|
this.heartbeatInterval = options.heartbeatInterval || 60000;
|
|
23
|
-
this.pruneInterval = options.pruneInterval || 30000;
|
|
24
|
-
this.staleTtl = options.staleTtl || 90000;
|
|
25
22
|
this.deduplicator = new ChallengeDeduplicator((msg) => {
|
|
26
23
|
this.pendingChallenges.push(msg);
|
|
27
24
|
this.challengeListeners.forEach((cb) => cb(msg));
|
|
@@ -61,7 +58,7 @@ export class Lobby {
|
|
|
61
58
|
}
|
|
62
59
|
else {
|
|
63
60
|
// Fallback: Re-broadcast presence state if no external orchestrator is handling it
|
|
64
|
-
this.nchan.publishPresence(this.currentUser).catch((_e) => {
|
|
61
|
+
this.nchan.publishPresence({ ...this.currentUser, clientTs: Date.now() }).catch((_e) => {
|
|
65
62
|
console.error("Failed to re-broadcast presence on reconnect:", _e);
|
|
66
63
|
});
|
|
67
64
|
}
|
|
@@ -70,7 +67,10 @@ export class Lobby {
|
|
|
70
67
|
// Broadcast our own presence with retry on failure (e.g. slow cold start)
|
|
71
68
|
for (let attempt = 1;; attempt++) {
|
|
72
69
|
try {
|
|
73
|
-
await this.nchan.publishPresence(
|
|
70
|
+
await this.nchan.publishPresence({
|
|
71
|
+
...this.currentUser,
|
|
72
|
+
clientTs: Date.now(),
|
|
73
|
+
});
|
|
74
74
|
break;
|
|
75
75
|
}
|
|
76
76
|
catch (e) {
|
|
@@ -80,7 +80,6 @@ export class Lobby {
|
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
this.startHeartbeat();
|
|
83
|
-
this.startPruning();
|
|
84
83
|
this.isJoined = true;
|
|
85
84
|
}
|
|
86
85
|
/**
|
|
@@ -113,33 +112,6 @@ export class Lobby {
|
|
|
113
112
|
this.heartbeatTimer = undefined;
|
|
114
113
|
}
|
|
115
114
|
}
|
|
116
|
-
startPruning() {
|
|
117
|
-
this.stopPruning();
|
|
118
|
-
this.pruneTimer = setInterval(() => {
|
|
119
|
-
const now = Date.now();
|
|
120
|
-
let changed = false;
|
|
121
|
-
for (const [userId, user] of this.users.entries()) {
|
|
122
|
-
if (userId === this.currentUser.userId)
|
|
123
|
-
continue;
|
|
124
|
-
const lastSeen = user.meta?.ts || 0;
|
|
125
|
-
if (now - lastSeen > this.staleTtl) {
|
|
126
|
-
this.users.delete(userId);
|
|
127
|
-
changed = true;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
if (changed) {
|
|
131
|
-
this.cachedUsersList = null;
|
|
132
|
-
this.notifyListeners();
|
|
133
|
-
}
|
|
134
|
-
}, this.pruneInterval);
|
|
135
|
-
this.pruneTimer.unref?.();
|
|
136
|
-
}
|
|
137
|
-
stopPruning() {
|
|
138
|
-
if (this.pruneTimer) {
|
|
139
|
-
clearInterval(this.pruneTimer);
|
|
140
|
-
this.pruneTimer = undefined;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
115
|
/**
|
|
144
116
|
* Emits the current list of online users whenever it changes.
|
|
145
117
|
*/
|
|
@@ -174,6 +146,7 @@ export class Lobby {
|
|
|
174
146
|
await this.nchan.publishPresence({
|
|
175
147
|
...this.currentUser,
|
|
176
148
|
...update,
|
|
149
|
+
clientTs: Date.now(),
|
|
177
150
|
});
|
|
178
151
|
}
|
|
179
152
|
/**
|
|
@@ -197,7 +170,7 @@ export class Lobby {
|
|
|
197
170
|
* Accept an incoming challenge.
|
|
198
171
|
* Returns the Table instance for the accepted game.
|
|
199
172
|
*/
|
|
200
|
-
async acceptChallenge(userId, ruleType, tableId, options, challengerName) {
|
|
173
|
+
async acceptChallenge(userId, ruleType, tableId, options, challengerName, nextTurnId) {
|
|
201
174
|
await this.nchan.publishChallenge({
|
|
202
175
|
type: "accept",
|
|
203
176
|
challengerId: userId,
|
|
@@ -206,6 +179,7 @@ export class Lobby {
|
|
|
206
179
|
ruleType,
|
|
207
180
|
tableId,
|
|
208
181
|
options,
|
|
182
|
+
nextTurnId,
|
|
209
183
|
});
|
|
210
184
|
// Automatically update our presence to show we've joined the table
|
|
211
185
|
await this.updatePresence({ tableId });
|
|
@@ -250,19 +224,14 @@ export class Lobby {
|
|
|
250
224
|
*/
|
|
251
225
|
async leave(options = {}) {
|
|
252
226
|
this.stopHeartbeat();
|
|
253
|
-
this.stopPruning();
|
|
254
227
|
this.subscription?.stop();
|
|
255
228
|
try {
|
|
256
|
-
await this.nchan.publishPresence({
|
|
257
|
-
...this.currentUser,
|
|
258
|
-
type: "leave",
|
|
259
|
-
}, { keepalive: options.isTeardown });
|
|
229
|
+
await this.nchan.publishPresence({ ...this.currentUser, type: "leave", clientTs: Date.now() }, { keepalive: options.isTeardown });
|
|
260
230
|
}
|
|
261
231
|
catch (e) {
|
|
262
232
|
console.error("Error leaving lobby:", e);
|
|
263
233
|
}
|
|
264
234
|
this.users.clear();
|
|
265
|
-
this.cachedUsersList = null;
|
|
266
235
|
this.pendingChallenges = [];
|
|
267
236
|
this.deduplicator.clear();
|
|
268
237
|
this.presenceMessageCount = 0;
|
|
@@ -297,13 +266,11 @@ export class Lobby {
|
|
|
297
266
|
if (msg.type === "leave") {
|
|
298
267
|
if (existing) {
|
|
299
268
|
this.users.delete(msg.userId);
|
|
300
|
-
this.cachedUsersList = null;
|
|
301
269
|
this.notifyListeners();
|
|
302
270
|
}
|
|
303
271
|
}
|
|
304
272
|
else if (msg.type === "join") {
|
|
305
273
|
this.users.set(msg.userId, msg);
|
|
306
|
-
this.cachedUsersList = null;
|
|
307
274
|
this.notifyListeners();
|
|
308
275
|
}
|
|
309
276
|
else {
|
|
@@ -311,7 +278,6 @@ export class Lobby {
|
|
|
311
278
|
const changed = !existing || this.hasMeaningfulChange(existing, msg);
|
|
312
279
|
this.users.set(msg.userId, msg);
|
|
313
280
|
if (changed) {
|
|
314
|
-
this.cachedUsersList = null;
|
|
315
281
|
this.notifyListeners();
|
|
316
282
|
}
|
|
317
283
|
}
|
|
@@ -330,11 +296,7 @@ export class Lobby {
|
|
|
330
296
|
this.listeners.forEach((cb) => cb(list));
|
|
331
297
|
}
|
|
332
298
|
getUsersList() {
|
|
333
|
-
|
|
334
|
-
return this.cachedUsersList;
|
|
335
|
-
}
|
|
336
|
-
this.cachedUsersList = Array.from(this.users.values()).sort((a, b) => a.userName.localeCompare(b.userName));
|
|
337
|
-
return this.cachedUsersList;
|
|
299
|
+
return Array.from(this.users.values()).sort((a, b) => a.userName.localeCompare(b.userName));
|
|
338
300
|
}
|
|
339
301
|
hasMeaningfulChange(oldMsg, nextMsg) {
|
|
340
302
|
return (oldMsg.userName !== nextMsg.userName ||
|
package/dist/lobby.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lobby.js","sourceRoot":"","sources":["../src/lobby.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,YAAY,GAEb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"lobby.js","sourceRoot":"","sources":["../src/lobby.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -33,6 +33,8 @@ export interface PresenceMessage {
|
|
|
33
33
|
meta?: Meta;
|
|
34
34
|
tableId?: string;
|
|
35
35
|
isSpectator?: boolean;
|
|
36
|
+
isLeaving?: boolean;
|
|
37
|
+
clientTs?: number;
|
|
36
38
|
}
|
|
37
39
|
/**
|
|
38
40
|
* Peer-to-peer challenge request
|
|
@@ -46,6 +48,7 @@ export interface ChallengeMessage {
|
|
|
46
48
|
ruleType: string;
|
|
47
49
|
tableId?: string;
|
|
48
50
|
readonly options?: Record<string, string>;
|
|
51
|
+
nextTurnId?: string;
|
|
49
52
|
meta?: Meta;
|
|
50
53
|
}
|
|
51
54
|
/**
|
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":"AAyGA;;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.26.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A stateful messaging library for Nchan-powered real-time applications.",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -19,13 +19,15 @@
|
|
|
19
19
|
"scripts": {
|
|
20
20
|
"test": "jest --config test/jest.config.cjs --verbose",
|
|
21
21
|
"coverage": "jest --config test/jest.config.cjs --coverage",
|
|
22
|
-
"playwright": "npm run docker:build && npx playwright test",
|
|
22
|
+
"playwright": "npm run docker:build && npx playwright test --workers=1",
|
|
23
23
|
"playwright:rematch": "npm run docker:build && npx playwright test playwright/lobby-rematch.spec.ts",
|
|
24
|
+
"playwright:e2e": "npm run docker:build && npx playwright test playwright/e2e*.spec.ts --workers=1",
|
|
25
|
+
"playwright:new": "npm run docker:build && npx playwright test playwright/iframee2e.spec.ts --workers=1",
|
|
24
26
|
"test:debug": "npm run playwright",
|
|
25
27
|
"clientbump": "node scripts/clientbump.mjs",
|
|
26
28
|
"lint": "tsc --noEmit && npx oxlint src test",
|
|
27
29
|
"prettify": "npx oxfmt src test",
|
|
28
|
-
"build:lit": "npx esbuild src/client/lobby.js --bundle --minify --outfile=docker/html/lobby.js && cp src/client/*.html docker/html/ && cp src/client/favicon.ico src/client/robots.txt docker/html/ 2>/dev/null || true && mkdir -p docker/html/assets && cp src/client/assets/*.png docker/html/assets/ 2>/dev/null || true",
|
|
30
|
+
"build:lit": "npx esbuild src/client/lobby.js --bundle --minify --outfile=docker/html/lobby.js && cp src/client/*.html docker/html/ && cp src/client/favicon.ico src/client/robots.txt src/client/sitemap.xml docker/html/ 2>/dev/null || true && mkdir -p docker/html/assets && cp src/client/assets/*.png docker/html/assets/ 2>/dev/null || true",
|
|
29
31
|
"crossdeploy": "npx esbuild src/client/lobby.js --bundle --minify --outfile=../billiards/dist/lobby.js && cp src/client/lobby.html ../billiards/dist/ && cp src/client/assets/*.png ../billiards/dist/assets/",
|
|
30
32
|
"crossdeployv": "cp docker/html/lobby.js ../scoreboard/public/ && cp src/client/lobby.html ../scoreboard/public/ && cp src/client/assets/*.png ../scoreboard/public/assets/",
|
|
31
33
|
"build": "tsc --declaration && node scripts/add-js-extensions.js && npx esbuild src/index.ts --bundle --format=esm --outfile=docker/html/messaging.js && npm run build:lit",
|
|
@@ -48,13 +50,13 @@
|
|
|
48
50
|
"author": "tailuge",
|
|
49
51
|
"license": "GPL-3.0",
|
|
50
52
|
"devDependencies": {
|
|
51
|
-
"@playwright/test": "^1.
|
|
53
|
+
"@playwright/test": "^1.61.0",
|
|
52
54
|
"@types/jest": "30.0.0",
|
|
53
55
|
"@types/ws": "^8.18.1",
|
|
54
56
|
"esbuild": "^0.28.1",
|
|
55
57
|
"jest": "^30.4.2",
|
|
56
|
-
"oxlint": "^1.
|
|
57
|
-
"testcontainers": "
|
|
58
|
+
"oxlint": "^1.70.0",
|
|
59
|
+
"testcontainers": "9.12.0",
|
|
58
60
|
"ts-jest": "^29.4.11",
|
|
59
61
|
"typescript": "^6.0.3",
|
|
60
62
|
"ws": "^8.21.0"
|