@volorio/games-tictactoe 0.2.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 ADDED
@@ -0,0 +1,22 @@
1
+ # @volorio/games-tictactoe
2
+
3
+ Typed browser client for the Volorio Tic Tac Toe game.
4
+
5
+ Install only the Tic Tac Toe package in the browser app. It depends on `@volorio/games-web` and `@volorio/games-core`; it does not accept a Volorio server API key.
6
+
7
+ ```ts
8
+ import { VolorioTicTacToeClient } from "@volorio/games-tictactoe";
9
+
10
+ const game = new VolorioTicTacToeClient({
11
+ gatewayUrl: "wss://games.volor.io/v1/games/gateway",
12
+ token: shortLivedGameTokenFromYourBackend,
13
+ gameInstanceId: "ginst_123",
14
+ playerId: "user_123",
15
+ });
16
+
17
+ await game.connect();
18
+ game.onMove((move) => console.log(move.playerId, move.cell));
19
+ game.move(4);
20
+ ```
21
+
22
+ Your backend creates the game session and game token through `@volorio/games-node` using the server API key.
@@ -0,0 +1,71 @@
1
+ import type { VolorioGameProtocolError, VolorioGameSnapshot } from "@volorio/games-core";
2
+ import { type VolorioGameWebSocketLike } from "@volorio/games-web";
3
+ export type VolorioTicTacToeMark = "X" | "O";
4
+ export type VolorioTicTacToeCell = VolorioTicTacToeMark | null;
5
+ export type VolorioTicTacToeStatus = "RUNNING" | "FINISHED";
6
+ export interface VolorioTicTacToeClientOptions {
7
+ gatewayUrl: string;
8
+ token: string;
9
+ gameInstanceId: string;
10
+ playerId: string;
11
+ websocketFactory?: (url: string) => VolorioGameWebSocketLike;
12
+ now?: () => number;
13
+ }
14
+ export interface VolorioTicTacToeState {
15
+ board: VolorioTicTacToeCell[];
16
+ currentTurnPlayerId: string;
17
+ status: VolorioTicTacToeStatus;
18
+ winnerPlayerId?: string;
19
+ winningLine?: number[];
20
+ moves: Array<{
21
+ actionId: string;
22
+ playerId: string;
23
+ mark: VolorioTicTacToeMark;
24
+ cell: number;
25
+ }>;
26
+ }
27
+ export interface VolorioTicTacToeMove {
28
+ playerId: string;
29
+ mark: VolorioTicTacToeMark;
30
+ cell: number;
31
+ stateVersion: number;
32
+ status: VolorioTicTacToeStatus;
33
+ eventId: string;
34
+ }
35
+ export interface VolorioTicTacToeFinish {
36
+ winnerPlayerId?: string;
37
+ winningLine?: number[];
38
+ stateVersion: number;
39
+ }
40
+ export type VolorioTicTacToeMoveHandler = (move: VolorioTicTacToeMove) => void;
41
+ export type VolorioTicTacToeFinishHandler = (finish: VolorioTicTacToeFinish) => void;
42
+ export type VolorioTicTacToeSnapshotHandler = (snapshot: VolorioGameSnapshot<VolorioTicTacToeState>) => void;
43
+ export type VolorioTicTacToeErrorHandler = (error: VolorioGameProtocolError | unknown) => void;
44
+ export declare class VolorioTicTacToeClient {
45
+ private readonly client;
46
+ private state;
47
+ private readonly moveHandlers;
48
+ private readonly finishHandlers;
49
+ private readonly snapshotHandlers;
50
+ private readonly errorHandlers;
51
+ constructor(options: VolorioTicTacToeClientOptions);
52
+ connect(lastKnownStateVersion?: number): Promise<void>;
53
+ reconnect(): Promise<void>;
54
+ disconnect(reason?: string): void;
55
+ move(cell: number, options?: {
56
+ actionId?: string;
57
+ expectedVersion?: number;
58
+ }): void;
59
+ onMove(handler: VolorioTicTacToeMoveHandler): () => void;
60
+ onFinish(handler: VolorioTicTacToeFinishHandler): () => void;
61
+ onSnapshot(handler: VolorioTicTacToeSnapshotHandler): () => void;
62
+ onError(handler: VolorioTicTacToeErrorHandler): () => void;
63
+ getBoard(): VolorioTicTacToeCell[];
64
+ getState(): VolorioTicTacToeState;
65
+ getLatestStateVersion(): number;
66
+ private handleEvent;
67
+ private handleSnapshot;
68
+ private emitFinish;
69
+ private emitError;
70
+ }
71
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VolorioTicTacToeClient = void 0;
4
+ const games_web_1 = require("@volorio/games-web");
5
+ class VolorioTicTacToeClient {
6
+ client;
7
+ state = emptyState();
8
+ moveHandlers = [];
9
+ finishHandlers = [];
10
+ snapshotHandlers = [];
11
+ errorHandlers = [];
12
+ constructor(options) {
13
+ this.client = new games_web_1.VolorioGamesWebClient(options);
14
+ this.client.on("event", (event) => this.handleEvent(event));
15
+ this.client.on("snapshot", (snapshot) => this.handleSnapshot(snapshot));
16
+ this.client.on("error", (error) => this.emitError(error));
17
+ }
18
+ connect(lastKnownStateVersion) {
19
+ return this.client.connect(lastKnownStateVersion);
20
+ }
21
+ reconnect() {
22
+ return this.client.reconnect();
23
+ }
24
+ disconnect(reason) {
25
+ this.client.disconnect(reason);
26
+ }
27
+ move(cell, options = {}) {
28
+ if (!Number.isInteger(cell) || cell < 0 || cell > 8) {
29
+ throw new Error("tictactoe_cell_invalid");
30
+ }
31
+ this.client.sendAction("tictactoe.move", { cell }, options);
32
+ }
33
+ onMove(handler) {
34
+ this.moveHandlers.push(handler);
35
+ return () => removeHandler(this.moveHandlers, handler);
36
+ }
37
+ onFinish(handler) {
38
+ this.finishHandlers.push(handler);
39
+ return () => removeHandler(this.finishHandlers, handler);
40
+ }
41
+ onSnapshot(handler) {
42
+ this.snapshotHandlers.push(handler);
43
+ return () => removeHandler(this.snapshotHandlers, handler);
44
+ }
45
+ onError(handler) {
46
+ this.errorHandlers.push(handler);
47
+ return () => removeHandler(this.errorHandlers, handler);
48
+ }
49
+ getBoard() {
50
+ return [...this.state.board];
51
+ }
52
+ getState() {
53
+ return cloneState(this.state);
54
+ }
55
+ getLatestStateVersion() {
56
+ return this.client.getLatestStateVersion();
57
+ }
58
+ handleEvent(event) {
59
+ if (event.type !== "tictactoe.moved" && event.type !== "tictactoe.finished") {
60
+ return;
61
+ }
62
+ const move = readMove(event);
63
+ this.state = {
64
+ ...this.state,
65
+ board: readBoard(event.payload),
66
+ status: move.status,
67
+ winnerPlayerId: readOptionalString(event.payload, "winnerPlayerId"),
68
+ winningLine: readOptionalNumberArray(event.payload, "winningLine"),
69
+ moves: [...this.state.moves, {
70
+ actionId: event.eventId.replace(/^gevt_/, ""),
71
+ playerId: move.playerId,
72
+ mark: move.mark,
73
+ cell: move.cell,
74
+ }],
75
+ };
76
+ for (const handler of this.moveHandlers) {
77
+ handler({ ...move });
78
+ }
79
+ if (event.type === "tictactoe.finished") {
80
+ this.emitFinish({ winnerPlayerId: this.state.winnerPlayerId, winningLine: this.state.winningLine, stateVersion: event.stateVersion });
81
+ }
82
+ }
83
+ handleSnapshot(snapshot) {
84
+ this.state = cloneState(snapshot.state);
85
+ for (const handler of this.snapshotHandlers) {
86
+ handler({ ...snapshot, state: cloneState(snapshot.state) });
87
+ }
88
+ if (snapshot.state.status === "FINISHED") {
89
+ this.emitFinish({
90
+ winnerPlayerId: snapshot.state.winnerPlayerId,
91
+ winningLine: snapshot.state.winningLine === undefined ? undefined : [...snapshot.state.winningLine],
92
+ stateVersion: snapshot.stateVersion,
93
+ });
94
+ }
95
+ }
96
+ emitFinish(finish) {
97
+ for (const handler of this.finishHandlers) {
98
+ handler({
99
+ winnerPlayerId: finish.winnerPlayerId,
100
+ winningLine: finish.winningLine === undefined ? undefined : [...finish.winningLine],
101
+ stateVersion: finish.stateVersion,
102
+ });
103
+ }
104
+ }
105
+ emitError(error) {
106
+ for (const handler of this.errorHandlers) {
107
+ handler(error);
108
+ }
109
+ }
110
+ }
111
+ exports.VolorioTicTacToeClient = VolorioTicTacToeClient;
112
+ function readMove(event) {
113
+ const payload = event.payload;
114
+ if (typeof payload.playerId !== "string" || !isMark(payload.mark) || !Number.isInteger(payload.cell)) {
115
+ throw new Error("invalid_tictactoe_move_event");
116
+ }
117
+ const status = payload.status === "FINISHED" ? "FINISHED" : "RUNNING";
118
+ return {
119
+ playerId: payload.playerId,
120
+ mark: payload.mark,
121
+ cell: payload.cell,
122
+ stateVersion: event.stateVersion,
123
+ status,
124
+ eventId: event.eventId,
125
+ };
126
+ }
127
+ function readBoard(payload) {
128
+ if (typeof payload !== "object" || payload === null || !("board" in payload) || !Array.isArray(payload.board) || payload.board.length !== 9) {
129
+ throw new Error("invalid_tictactoe_board");
130
+ }
131
+ return payload.board.map((cell) => cell === null || isMark(cell) ? cell : null);
132
+ }
133
+ function readOptionalString(payload, key) {
134
+ const record = asRecord(payload);
135
+ return record !== null && typeof record[key] === "string"
136
+ ? record[key]
137
+ : undefined;
138
+ }
139
+ function readOptionalNumberArray(payload, key) {
140
+ const record = asRecord(payload);
141
+ if (record === null) {
142
+ return undefined;
143
+ }
144
+ const value = record[key];
145
+ return Array.isArray(value) && value.every((item) => Number.isInteger(item)) ? [...value] : undefined;
146
+ }
147
+ function asRecord(value) {
148
+ return typeof value === "object" && value !== null ? value : null;
149
+ }
150
+ function isMark(value) {
151
+ return value === "X" || value === "O";
152
+ }
153
+ function emptyState() {
154
+ return {
155
+ board: [null, null, null, null, null, null, null, null, null],
156
+ currentTurnPlayerId: "player_1",
157
+ status: "RUNNING",
158
+ moves: [],
159
+ };
160
+ }
161
+ function cloneState(state) {
162
+ return {
163
+ board: [...state.board],
164
+ currentTurnPlayerId: state.currentTurnPlayerId,
165
+ status: state.status,
166
+ winnerPlayerId: state.winnerPlayerId,
167
+ winningLine: state.winningLine === undefined ? undefined : [...state.winningLine],
168
+ moves: state.moves.map((move) => ({ ...move })),
169
+ };
170
+ }
171
+ function removeHandler(handlers, handler) {
172
+ const index = handlers.indexOf(handler);
173
+ if (index >= 0) {
174
+ handlers.splice(index, 1);
175
+ }
176
+ }
177
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@volorio/games-tictactoe",
3
+ "version": "0.2.0",
4
+ "private": false,
5
+ "description": "Volorio Tic Tac Toe game client built on the Volorio Games Web runtime.",
6
+ "main": "dist/src/index.js",
7
+ "types": "dist/src/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/src/index.d.ts",
11
+ "default": "./dist/src/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist/src",
16
+ "README.md"
17
+ ],
18
+ "publishConfig": {
19
+ "access": "public",
20
+ "registry": "https://registry.npmjs.org/"
21
+ },
22
+ "scripts": {
23
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
24
+ "test": "pnpm build && rm -rf dist-test && tsc -p tsconfig.json --outDir dist-test && node --test dist-test/test/*.js",
25
+ "pack:local": "pnpm build && npm pack --pack-destination dist"
26
+ },
27
+ "dependencies": {
28
+ "@volorio/games-core": "^0.2.0",
29
+ "@volorio/games-web": "^0.2.0"
30
+ }
31
+ }