@tailuge/messaging 1.19.0 → 1.21.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/README.md +5 -2
- package/dist/nchanclient.d.ts +4 -4
- package/dist/nchanclient.js +9 -2
- package/dist/nchanclient.js.map +1 -1
- package/dist/types.d.ts +15 -1
- package/dist/types.js +15 -2
- package/dist/types.js.map +1 -1
- package/package.json +14 -8
package/README.md
CHANGED
|
@@ -21,7 +21,8 @@ npm run docker:stop
|
|
|
21
21
|
|
|
22
22
|
### 3. Run the Example
|
|
23
23
|
```bash
|
|
24
|
-
npm run
|
|
24
|
+
npm run build:all
|
|
25
|
+
|
|
25
26
|
```
|
|
26
27
|
Then open [http://localhost:3000](http://localhost:3000) in multiple tabs to test presence and challenges.
|
|
27
28
|
|
|
@@ -35,6 +36,7 @@ The project includes three levels of testing:
|
|
|
35
36
|
Comprehensive tests for `MessagingClient`, `Lobby`, and `Table` logic. These use `testcontainers` to automatically spin up an Nchan instance.
|
|
36
37
|
```bash
|
|
37
38
|
npm run test
|
|
39
|
+
npm run playwright
|
|
38
40
|
```
|
|
39
41
|
To debug leaks or hanging processes:
|
|
40
42
|
```bash
|
|
@@ -62,7 +64,7 @@ npm run docker:nchan
|
|
|
62
64
|
### Library & Example
|
|
63
65
|
The example is bundled using `esbuild`:
|
|
64
66
|
```bash
|
|
65
|
-
npm run build:
|
|
67
|
+
npm run build:all
|
|
66
68
|
```
|
|
67
69
|
|
|
68
70
|
### Lobby (Lit)
|
|
@@ -89,6 +91,7 @@ To release a new version to npm:
|
|
|
89
91
|
npm run release # Builds and bumps version
|
|
90
92
|
npm login # Login to npm (if needed)
|
|
91
93
|
npm publish # Publish to npm registry
|
|
94
|
+
npm run crossdeploy
|
|
92
95
|
```
|
|
93
96
|
|
|
94
97
|
## Additional Documentation
|
package/dist/nchanclient.d.ts
CHANGED
|
@@ -12,16 +12,16 @@ export declare class NchanClient {
|
|
|
12
12
|
private publish;
|
|
13
13
|
publishPresence(message: Omit<PresenceMessage, "messageType">, options?: {
|
|
14
14
|
keepalive?: boolean;
|
|
15
|
-
}): Promise<
|
|
15
|
+
}): Promise<void>;
|
|
16
16
|
publishChallenge(message: Omit<ChallengeMessage, "messageType">, options?: {
|
|
17
17
|
keepalive?: boolean;
|
|
18
|
-
}): Promise<
|
|
18
|
+
}): Promise<void>;
|
|
19
19
|
publishChat(message: Omit<ChatMessage, "messageType" | "meta">, options?: {
|
|
20
20
|
keepalive?: boolean;
|
|
21
|
-
}): Promise<
|
|
21
|
+
}): Promise<void>;
|
|
22
22
|
publishTable<T>(tableId: string, message: Omit<TableMessage<T>, "senderId">, senderId: string, options?: {
|
|
23
23
|
keepalive?: boolean;
|
|
24
|
-
}): Promise<
|
|
24
|
+
}): Promise<void>;
|
|
25
25
|
subscribePresence(onMessage: (data: string) => void): Subscription;
|
|
26
26
|
subscribeTable(tableId: string, onMessage: (data: string) => void): Subscription;
|
|
27
27
|
private subscribe;
|
package/dist/nchanclient.js
CHANGED
|
@@ -30,16 +30,23 @@ export class NchanClient {
|
|
|
30
30
|
}
|
|
31
31
|
async publish(path, message, options = {}) {
|
|
32
32
|
const url = this.getHttpUrl(path);
|
|
33
|
+
const body = JSON.stringify(message);
|
|
34
|
+
// Use sendBeacon in browser environments for reliability during unloads
|
|
35
|
+
if (typeof navigator !== "undefined" && navigator.sendBeacon) {
|
|
36
|
+
const blob = new Blob([body], { type: "application/json" });
|
|
37
|
+
if (navigator.sendBeacon(url, blob)) {
|
|
38
|
+
return; // Successfully queued by the browser
|
|
39
|
+
}
|
|
40
|
+
}
|
|
33
41
|
const response = await fetch(url, {
|
|
34
42
|
method: "POST",
|
|
35
43
|
headers: { "Content-Type": "application/json" },
|
|
36
|
-
body
|
|
44
|
+
body,
|
|
37
45
|
keepalive: options.keepalive,
|
|
38
46
|
});
|
|
39
47
|
if (!response.ok) {
|
|
40
48
|
throw new Error(`Publish failed: ${response.status}`);
|
|
41
49
|
}
|
|
42
|
-
return response;
|
|
43
50
|
}
|
|
44
51
|
// Publishing
|
|
45
52
|
async publishPresence(message, options) {
|
package/dist/nchanclient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nchanclient.js","sourceRoot":"","sources":["../src/nchanclient.ts"],"names":[],"mappings":"AAEA,MAAM,KAAK,GAAG;IACZ,gBAAgB,EAAE,yBAAyB;IAC3C,kBAAkB,EAAE,2BAA2B;IAC/C,aAAa,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,kBAAkB,OAAO,EAAE;IAC/D,eAAe,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,oBAAoB,OAAO,EAAE;CAC3D,CAAC;AAQX,MAAM,OAAO,WAAW;IAGtB,YAAY,MAAc;QACxB,gDAAgD;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAExC,oEAAoE;QACpE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,yCAAyC;gBACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,sBAAsB;gBACjE,IAAI,CAAC,MAAM,GAAG,GAAG,QAAQ,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,wCAAwC;gBACxC,IAAI,CAAC,MAAM,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,IAAY;QAC3B,2CAA2C;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;IACnD,CAAC;IAEO,UAAU,CAAC,IAAY;QAC7B,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,IAAY,EACZ,OAAgB,EAChB,UAAmC,EAAE;QAErC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,
|
|
1
|
+
{"version":3,"file":"nchanclient.js","sourceRoot":"","sources":["../src/nchanclient.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -31,17 +31,22 @@ export interface PresenceMessage {
|
|
|
31
31
|
seek?: Seek;
|
|
32
32
|
meta?: Meta;
|
|
33
33
|
tableId?: string;
|
|
34
|
+
isSpectator?: boolean;
|
|
34
35
|
}
|
|
35
36
|
/**
|
|
36
37
|
* Context about a previous game for rematch challenges.
|
|
37
38
|
*/
|
|
38
39
|
export interface RematchInfo {
|
|
40
|
+
readonly opponentId?: string;
|
|
41
|
+
readonly opponentName?: string;
|
|
42
|
+
readonly ruleType?: string;
|
|
39
43
|
readonly lastScores: {
|
|
40
44
|
readonly userId: string;
|
|
41
45
|
readonly score: number;
|
|
42
46
|
}[];
|
|
43
47
|
readonly isRematch: boolean;
|
|
44
48
|
readonly nextTurnId: string;
|
|
49
|
+
readonly options?: Record<string, string>;
|
|
45
50
|
}
|
|
46
51
|
/**
|
|
47
52
|
* Peer-to-peer challenge request
|
|
@@ -119,9 +124,18 @@ export declare function isChatMessage(msg: any): msg is ChatMessage;
|
|
|
119
124
|
export declare function canChallenge(target: PresenceMessage, currentUserId: string): boolean;
|
|
120
125
|
/**
|
|
121
126
|
* Predicate: can the current user spectate this target's game?
|
|
122
|
-
* Returns true if target is
|
|
127
|
+
* Returns true if target is a player (not spectator) at a different table
|
|
123
128
|
*/
|
|
124
129
|
export declare function canSpectate(target: PresenceMessage, currentTableId?: string): boolean;
|
|
130
|
+
/**
|
|
131
|
+
* Derived status of a user based on their presence state
|
|
132
|
+
*/
|
|
133
|
+
export type UserStatus = "available" | "playing" | "spectating";
|
|
134
|
+
export declare function userStatus(user: PresenceMessage): UserStatus;
|
|
135
|
+
/**
|
|
136
|
+
* Predicate: is the user in the lobby (not in a game or spectating)?
|
|
137
|
+
*/
|
|
138
|
+
export declare function isInLobby(user: PresenceMessage): boolean;
|
|
125
139
|
/**
|
|
126
140
|
* Filter: derive active games from presence list
|
|
127
141
|
* Returns unique games (one entry per tableId) with their players
|
package/dist/types.js
CHANGED
|
@@ -19,10 +19,23 @@ export function canChallenge(target, currentUserId) {
|
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
21
|
* Predicate: can the current user spectate this target's game?
|
|
22
|
-
* Returns true if target is
|
|
22
|
+
* Returns true if target is a player (not spectator) at a different table
|
|
23
23
|
*/
|
|
24
24
|
export function canSpectate(target, currentTableId) {
|
|
25
|
-
return !!target.tableId && target.tableId !== currentTableId;
|
|
25
|
+
return !!target.tableId && !target.isSpectator && target.tableId !== currentTableId;
|
|
26
|
+
}
|
|
27
|
+
export function userStatus(user) {
|
|
28
|
+
if (!user.tableId)
|
|
29
|
+
return "available";
|
|
30
|
+
if (user.isSpectator)
|
|
31
|
+
return "spectating";
|
|
32
|
+
return "playing";
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Predicate: is the user in the lobby (not in a game or spectating)?
|
|
36
|
+
*/
|
|
37
|
+
export function isInLobby(user) {
|
|
38
|
+
return !user.tableId;
|
|
26
39
|
}
|
|
27
40
|
/**
|
|
28
41
|
* Filter: derive active games from presence list
|
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":"AAmHA;;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.21.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,11 +19,14 @@
|
|
|
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",
|
|
23
|
+
"playwright:rematch": "npm run docker:build && npx playwright test playwright/lobby-rematch.spec.ts",
|
|
23
24
|
"test:debug": "npm run playwright",
|
|
24
25
|
"lint": "tsc --noEmit && npx oxlint src test",
|
|
25
26
|
"prettify": "npx oxfmt src test",
|
|
26
|
-
"build": "
|
|
27
|
+
"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",
|
|
28
|
+
"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/",
|
|
29
|
+
"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",
|
|
27
30
|
"release": "npm version minor --no-git-tag-version && npm run build",
|
|
28
31
|
"build:all": "npm run build && npm run docker:start",
|
|
29
32
|
"docker:start": "bash scripts/docker-nchan.sh",
|
|
@@ -43,20 +46,23 @@
|
|
|
43
46
|
"author": "tailuge",
|
|
44
47
|
"license": "GPL-3.0",
|
|
45
48
|
"devDependencies": {
|
|
46
|
-
"@playwright/test": "^1.
|
|
49
|
+
"@playwright/test": "^1.60.0",
|
|
47
50
|
"@types/jest": "30.0.0",
|
|
48
51
|
"@types/ws": "^8.18.1",
|
|
49
52
|
"esbuild": "^0.28.0",
|
|
50
|
-
"jest": "30.
|
|
51
|
-
"oxlint": "^1.
|
|
53
|
+
"jest": "^30.4.2",
|
|
54
|
+
"oxlint": "^1.64.0",
|
|
52
55
|
"testcontainers": "^11.14.0",
|
|
53
56
|
"ts-jest": "^29.4.9",
|
|
54
57
|
"typescript": "^6.0.3",
|
|
55
|
-
"ws": "^8.20.
|
|
58
|
+
"ws": "^8.20.1"
|
|
56
59
|
},
|
|
57
60
|
"browserslist": [
|
|
58
61
|
"defaults",
|
|
59
62
|
"ios >= 12",
|
|
60
63
|
"safari >= 12"
|
|
61
|
-
]
|
|
64
|
+
],
|
|
65
|
+
"dependencies": {
|
|
66
|
+
"lit": "^3.3.2"
|
|
67
|
+
}
|
|
62
68
|
}
|