gameon-sdk 1.0.0 → 1.0.2
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/LICENSE +21 -0
- package/README.md +94 -0
- package/dist/client.d.ts +116 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +251 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -5
- package/dist/index.js.map +1 -1
- package/dist/server.cjs +193 -0
- package/dist/server.d.ts +101 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +169 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/package.json +37 -10
- package/dist/apis/DefaultApi.d.ts +0 -308
- package/dist/apis/DefaultApi.d.ts.map +0 -1
- package/dist/apis/DefaultApi.js +0 -569
- package/dist/apis/DefaultApi.js.map +0 -1
- package/dist/apis/index.d.ts +0 -2
- package/dist/apis/index.d.ts.map +0 -1
- package/dist/apis/index.js +0 -4
- package/dist/apis/index.js.map +0 -1
- package/dist/models/BetCurrency.d.ts +0 -27
- package/dist/models/BetCurrency.d.ts.map +0 -1
- package/dist/models/BetCurrency.js +0 -45
- package/dist/models/BetCurrency.js.map +0 -1
- package/dist/models/BetInput.d.ts +0 -35
- package/dist/models/BetInput.d.ts.map +0 -1
- package/dist/models/BetInput.js +0 -48
- package/dist/models/BetInput.js.map +0 -1
- package/dist/models/BetRecord.d.ts +0 -86
- package/dist/models/BetRecord.d.ts.map +0 -1
- package/dist/models/BetRecord.js +0 -81
- package/dist/models/BetRecord.js.map +0 -1
- package/dist/models/BiggestWin.d.ts +0 -60
- package/dist/models/BiggestWin.d.ts.map +0 -1
- package/dist/models/BiggestWin.js +0 -58
- package/dist/models/BiggestWin.js.map +0 -1
- package/dist/models/Colour.d.ts +0 -27
- package/dist/models/Colour.d.ts.map +0 -1
- package/dist/models/Colour.js +0 -45
- package/dist/models/Colour.js.map +0 -1
- package/dist/models/CreateRoomV2Request.d.ts +0 -37
- package/dist/models/CreateRoomV2Request.d.ts.map +0 -1
- package/dist/models/CreateRoomV2Request.js +0 -48
- package/dist/models/CreateRoomV2Request.js.map +0 -1
- package/dist/models/CreateRoomV2RequestPlayersInner.d.ts +0 -43
- package/dist/models/CreateRoomV2RequestPlayersInner.d.ts.map +0 -1
- package/dist/models/CreateRoomV2RequestPlayersInner.js +0 -50
- package/dist/models/CreateRoomV2RequestPlayersInner.js.map +0 -1
- package/dist/models/CreateRoomV2RequestRoom.d.ts +0 -39
- package/dist/models/CreateRoomV2RequestRoom.d.ts.map +0 -1
- package/dist/models/CreateRoomV2RequestRoom.js +0 -46
- package/dist/models/CreateRoomV2RequestRoom.js.map +0 -1
- package/dist/models/CreateRoomV2Response.d.ts +0 -45
- package/dist/models/CreateRoomV2Response.d.ts.map +0 -1
- package/dist/models/CreateRoomV2Response.js +0 -56
- package/dist/models/CreateRoomV2Response.js.map +0 -1
- package/dist/models/CreateRoomV2ResponsePayload.d.ts +0 -63
- package/dist/models/CreateRoomV2ResponsePayload.d.ts.map +0 -1
- package/dist/models/CreateRoomV2ResponsePayload.js +0 -67
- package/dist/models/CreateRoomV2ResponsePayload.js.map +0 -1
- package/dist/models/CreateRoomV2ResponseUserInfo.d.ts +0 -39
- package/dist/models/CreateRoomV2ResponseUserInfo.d.ts.map +0 -1
- package/dist/models/CreateRoomV2ResponseUserInfo.js +0 -46
- package/dist/models/CreateRoomV2ResponseUserInfo.js.map +0 -1
- package/dist/models/CurrencyTier.d.ts +0 -43
- package/dist/models/CurrencyTier.d.ts.map +0 -1
- package/dist/models/CurrencyTier.js +0 -56
- package/dist/models/CurrencyTier.js.map +0 -1
- package/dist/models/ErrorResponse.d.ts +0 -35
- package/dist/models/ErrorResponse.d.ts.map +0 -1
- package/dist/models/ErrorResponse.js +0 -46
- package/dist/models/ErrorResponse.js.map +0 -1
- package/dist/models/ExchangeLaunchTicketRequest.d.ts +0 -31
- package/dist/models/ExchangeLaunchTicketRequest.d.ts.map +0 -1
- package/dist/models/ExchangeLaunchTicketRequest.js +0 -44
- package/dist/models/ExchangeLaunchTicketRequest.js.map +0 -1
- package/dist/models/ExchangeLaunchTicketResponse.d.ts +0 -31
- package/dist/models/ExchangeLaunchTicketResponse.d.ts.map +0 -1
- package/dist/models/ExchangeLaunchTicketResponse.js +0 -44
- package/dist/models/ExchangeLaunchTicketResponse.js.map +0 -1
- package/dist/models/FxRate.d.ts +0 -39
- package/dist/models/FxRate.d.ts.map +0 -1
- package/dist/models/FxRate.js +0 -52
- package/dist/models/FxRate.js.map +0 -1
- package/dist/models/GameConfig.d.ts +0 -69
- package/dist/models/GameConfig.d.ts.map +0 -1
- package/dist/models/GameConfig.js +0 -76
- package/dist/models/GameConfig.js.map +0 -1
- package/dist/models/GameConfigCurrencies.d.ts +0 -36
- package/dist/models/GameConfigCurrencies.d.ts.map +0 -1
- package/dist/models/GameConfigCurrencies.js +0 -49
- package/dist/models/GameConfigCurrencies.js.map +0 -1
- package/dist/models/GameConfigFx.d.ts +0 -31
- package/dist/models/GameConfigFx.d.ts.map +0 -1
- package/dist/models/GameConfigFx.js +0 -44
- package/dist/models/GameConfigFx.js.map +0 -1
- package/dist/models/HealthResponse.d.ts +0 -39
- package/dist/models/HealthResponse.d.ts.map +0 -1
- package/dist/models/HealthResponse.js +0 -52
- package/dist/models/HealthResponse.js.map +0 -1
- package/dist/models/HousePoolResponse.d.ts +0 -45
- package/dist/models/HousePoolResponse.d.ts.map +0 -1
- package/dist/models/HousePoolResponse.js +0 -58
- package/dist/models/HousePoolResponse.js.map +0 -1
- package/dist/models/HousePoolStats.d.ts +0 -59
- package/dist/models/HousePoolStats.d.ts.map +0 -1
- package/dist/models/HousePoolStats.js +0 -56
- package/dist/models/HousePoolStats.js.map +0 -1
- package/dist/models/LeaderboardEntry.d.ts +0 -59
- package/dist/models/LeaderboardEntry.d.ts.map +0 -1
- package/dist/models/LeaderboardEntry.js +0 -56
- package/dist/models/LeaderboardEntry.js.map +0 -1
- package/dist/models/MyBetsResponse.d.ts +0 -49
- package/dist/models/MyBetsResponse.d.ts.map +0 -1
- package/dist/models/MyBetsResponse.js +0 -54
- package/dist/models/MyBetsResponse.js.map +0 -1
- package/dist/models/MyHistoryResponse.d.ts +0 -36
- package/dist/models/MyHistoryResponse.d.ts.map +0 -1
- package/dist/models/MyHistoryResponse.js +0 -49
- package/dist/models/MyHistoryResponse.js.map +0 -1
- package/dist/models/Phase.d.ts +0 -27
- package/dist/models/Phase.d.ts.map +0 -1
- package/dist/models/Phase.js +0 -45
- package/dist/models/Phase.js.map +0 -1
- package/dist/models/PlaceBetRequest.d.ts +0 -45
- package/dist/models/PlaceBetRequest.d.ts.map +0 -1
- package/dist/models/PlaceBetRequest.js +0 -54
- package/dist/models/PlaceBetRequest.js.map +0 -1
- package/dist/models/PlaceBetResponse.d.ts +0 -52
- package/dist/models/PlaceBetResponse.d.ts.map +0 -1
- package/dist/models/PlaceBetResponse.js +0 -65
- package/dist/models/PlaceBetResponse.js.map +0 -1
- package/dist/models/PlacedBet.d.ts +0 -59
- package/dist/models/PlacedBet.d.ts.map +0 -1
- package/dist/models/PlacedBet.js +0 -66
- package/dist/models/PlacedBet.js.map +0 -1
- package/dist/models/Round.d.ts +0 -89
- package/dist/models/Round.d.ts.map +0 -1
- package/dist/models/Round.js +0 -77
- package/dist/models/Round.js.map +0 -1
- package/dist/models/RoundHistoryEntry.d.ts +0 -65
- package/dist/models/RoundHistoryEntry.d.ts.map +0 -1
- package/dist/models/RoundHistoryEntry.js +0 -76
- package/dist/models/RoundHistoryEntry.js.map +0 -1
- package/dist/models/RoundPlayer.d.ts +0 -59
- package/dist/models/RoundPlayer.d.ts.map +0 -1
- package/dist/models/RoundPlayer.js +0 -59
- package/dist/models/RoundPlayer.js.map +0 -1
- package/dist/models/RoundState.d.ts +0 -65
- package/dist/models/RoundState.d.ts.map +0 -1
- package/dist/models/RoundState.js +0 -62
- package/dist/models/RoundState.js.map +0 -1
- package/dist/models/RoundsResponse.d.ts +0 -36
- package/dist/models/RoundsResponse.d.ts.map +0 -1
- package/dist/models/RoundsResponse.js +0 -49
- package/dist/models/RoundsResponse.js.map +0 -1
- package/dist/models/SettledBet.d.ts +0 -71
- package/dist/models/SettledBet.d.ts.map +0 -1
- package/dist/models/SettledBet.js +0 -72
- package/dist/models/SettledBet.js.map +0 -1
- package/dist/models/StatusMessageResponse.d.ts +0 -39
- package/dist/models/StatusMessageResponse.d.ts.map +0 -1
- package/dist/models/StatusMessageResponse.js +0 -48
- package/dist/models/StatusMessageResponse.js.map +0 -1
- package/dist/models/TopWinnersResponse.d.ts +0 -45
- package/dist/models/TopWinnersResponse.d.ts.map +0 -1
- package/dist/models/TopWinnersResponse.js +0 -54
- package/dist/models/TopWinnersResponse.js.map +0 -1
- package/dist/models/User.d.ts +0 -55
- package/dist/models/User.d.ts.map +0 -1
- package/dist/models/User.js +0 -61
- package/dist/models/User.js.map +0 -1
- package/dist/models/UserHistoryResponse.d.ts +0 -48
- package/dist/models/UserHistoryResponse.d.ts.map +0 -1
- package/dist/models/UserHistoryResponse.js +0 -61
- package/dist/models/UserHistoryResponse.js.map +0 -1
- package/dist/models/UserRecordResponse.d.ts +0 -36
- package/dist/models/UserRecordResponse.d.ts.map +0 -1
- package/dist/models/UserRecordResponse.js +0 -49
- package/dist/models/UserRecordResponse.js.map +0 -1
- package/dist/models/WalletBalanceResponse.d.ts +0 -43
- package/dist/models/WalletBalanceResponse.d.ts.map +0 -1
- package/dist/models/WalletBalanceResponse.js +0 -50
- package/dist/models/WalletBalanceResponse.js.map +0 -1
- package/dist/models/index.d.ts +0 -42
- package/dist/models/index.d.ts.map +0 -1
- package/dist/models/index.js +0 -44
- package/dist/models/index.js.map +0 -1
- package/dist/runtime.d.ts +0 -218
- package/dist/runtime.d.ts.map +0 -1
- package/dist/runtime.js +0 -446
- package/dist/runtime.js.map +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Gameonworld.ai
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# gameon-sdk
|
|
2
|
+
|
|
3
|
+
TypeScript client for the GameOn roulette backend REST API. Fully typed, ESM, uses the built-in `fetch` (Node 18+ and browsers).
|
|
4
|
+
|
|
5
|
+
The client is generated from [`specs/openapi.yaml`](specs/openapi.yaml). Live round updates (`roundState`, `livePlayer`, `settle`) are sent over socket.io and are not part of this SDK.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install gameon-sdk
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Quick start
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { Configuration, DefaultApi, ResponseError } from "gameon-sdk";
|
|
17
|
+
|
|
18
|
+
const api = new DefaultApi(
|
|
19
|
+
new Configuration({ basePath: "https://your-backend.example.com" })
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
const health = await api.getHealth();
|
|
24
|
+
const config = await api.getGameConfig();
|
|
25
|
+
const state = await api.getGameState();
|
|
26
|
+
const balance = await api.getUserWalletBalance({ userUuid: "USER_UUID" });
|
|
27
|
+
} catch (err) {
|
|
28
|
+
if (err instanceof ResponseError) {
|
|
29
|
+
console.error(err.response.status, await err.response.text());
|
|
30
|
+
} else {
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Admin endpoints
|
|
37
|
+
|
|
38
|
+
Admin endpoints use the `x-admin-key` header:
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
const admin = new DefaultApi(
|
|
42
|
+
new Configuration({
|
|
43
|
+
basePath: "https://your-backend.example.com",
|
|
44
|
+
apiKey: (name) => (name === "x-admin-key" ? process.env.ADMIN_KEY! : ""),
|
|
45
|
+
})
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const pool = await admin.getAdminHousePool();
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## API
|
|
52
|
+
|
|
53
|
+
All methods are on `DefaultApi`. Each one also has a `...Raw()` variant that returns the full HTTP response.
|
|
54
|
+
|
|
55
|
+
| Method | Description |
|
|
56
|
+
| --- | --- |
|
|
57
|
+
| `getHealth()` | Health check |
|
|
58
|
+
| `getGameConfig()` | Game configuration (currencies, limits) |
|
|
59
|
+
| `getFxRate()` | Current FX rate |
|
|
60
|
+
| `getGameState()` | Current round state |
|
|
61
|
+
| `getGameRounds({ ... })` | Recent rounds |
|
|
62
|
+
| `getGameHistory({ ... })` | Recent winning numbers |
|
|
63
|
+
| `getGameMyBets({ ... })` | A player's bets |
|
|
64
|
+
| `getGameMyHistory({ ... })` | A player's game history |
|
|
65
|
+
| `placeGameBet({ placeBetRequest })` | Place a bet |
|
|
66
|
+
| `getUserRecord({ uuid })` | User record (cached balance, profile) |
|
|
67
|
+
| `getUserWalletBalance({ userUuid })` | Wallet balance |
|
|
68
|
+
| `getUserHistory({ ... })` | User history |
|
|
69
|
+
| `createRoomV2({ ... })` | Join the game, sync balance, return a play link |
|
|
70
|
+
| `exchangeLaunchTicket({ ... })` | Exchange a launch ticket |
|
|
71
|
+
| `getAdminHousePool()` | House pool stats (admin) |
|
|
72
|
+
| `getAdminTopWinners({ ... })` | Top winners (admin) |
|
|
73
|
+
|
|
74
|
+
All request and response types (for example `PlaceBetRequest`, `RoundState` and `WalletBalanceResponse`) are exported from the package root.
|
|
75
|
+
|
|
76
|
+
## Development
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
npm install
|
|
80
|
+
npm run generate # regenerate src/ from specs/openapi.yaml
|
|
81
|
+
npm run build # compile to dist/
|
|
82
|
+
npm test
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Release:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
npm version patch # or minor / major
|
|
89
|
+
npm publish
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## License
|
|
93
|
+
|
|
94
|
+
[MIT](LICENSE)
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { type ManagerOptions, type SocketOptions } from 'socket.io-client';
|
|
2
|
+
import type { AutoMove, BalanceResponse, CreatedRoom, CreateRoomInput, GameDetailsResponse, GameOver, GameType, HealthResponse, Joined, ReconnectionTimer, SpectatorJoined, StatusResponse } from './types.js';
|
|
3
|
+
export declare const DEFAULT_PATHS: {
|
|
4
|
+
health: string;
|
|
5
|
+
createRoom: string;
|
|
6
|
+
getGameDetails: string;
|
|
7
|
+
updateGameType: string;
|
|
8
|
+
userBack: string;
|
|
9
|
+
balance: string;
|
|
10
|
+
exchangeLaunchTicket: string;
|
|
11
|
+
};
|
|
12
|
+
export type EndpointName = keyof typeof DEFAULT_PATHS;
|
|
13
|
+
export interface GameClientOptions {
|
|
14
|
+
/** The game's backend (REST + Socket.IO). */
|
|
15
|
+
backendUrl: string;
|
|
16
|
+
/** GameOn platform backend, needed for isBot(). */
|
|
17
|
+
gameonBackendUrl?: string;
|
|
18
|
+
/** Only for a backend that hasn't moved to the standard paths yet. */
|
|
19
|
+
paths?: Partial<Record<EndpointName, string>>;
|
|
20
|
+
fetchApi?: typeof fetch;
|
|
21
|
+
}
|
|
22
|
+
export declare class GameOnError extends Error {
|
|
23
|
+
readonly status: number;
|
|
24
|
+
readonly body: any;
|
|
25
|
+
constructor(status: number, body: any, url: string);
|
|
26
|
+
/** The backend's error code (e.g. E1008), if it sent one. */
|
|
27
|
+
get code(): string | undefined;
|
|
28
|
+
}
|
|
29
|
+
export declare class GameClient {
|
|
30
|
+
private readonly options;
|
|
31
|
+
private readonly paths;
|
|
32
|
+
constructor(options: GameClientOptions);
|
|
33
|
+
health(): Promise<HealthResponse>;
|
|
34
|
+
createRoom(input: CreateRoomInput): Promise<CreatedRoom>;
|
|
35
|
+
getGameDetails(gameSessionUuid: string): Promise<GameDetailsResponse>;
|
|
36
|
+
updateGameType(gameSessionUuid: string, gameType: GameType): Promise<StatusResponse>;
|
|
37
|
+
/** The player deliberately leaves; the backend resolves the game. */
|
|
38
|
+
userBack(gameSessionUuid: string, uuid: string): Promise<StatusResponse>;
|
|
39
|
+
getBalance(userUuid: string): Promise<BalanceResponse>;
|
|
40
|
+
exchangeLaunchTicket(launchTicket: string): Promise<{
|
|
41
|
+
sessionToken: string;
|
|
42
|
+
}>;
|
|
43
|
+
/** Asks the GameOn platform whether a player uuid belongs to a bot. */
|
|
44
|
+
isBot(uuid: string): Promise<boolean>;
|
|
45
|
+
/** Any endpoint of this game's backend, for game-only features. Throws GameOnError on non-2xx. */
|
|
46
|
+
request<T = any>(method: string, path: string, body?: unknown, query?: Record<string, string | number | boolean | undefined>, baseUrl?: string): Promise<T>;
|
|
47
|
+
/**
|
|
48
|
+
* Opens the realtime connection. joinGame is sent on every (re)connect, so
|
|
49
|
+
* register listeners right after calling this.
|
|
50
|
+
*/
|
|
51
|
+
join<State = any>(options: JoinOptions): GameConnection<State>;
|
|
52
|
+
}
|
|
53
|
+
export interface GameEntry {
|
|
54
|
+
backendUrl: string;
|
|
55
|
+
paths?: GameClientOptions['paths'];
|
|
56
|
+
}
|
|
57
|
+
/** For servers that work with many games: one config, one client per game. */
|
|
58
|
+
export declare class GameOnClient {
|
|
59
|
+
private readonly options;
|
|
60
|
+
private readonly clients;
|
|
61
|
+
constructor(options: {
|
|
62
|
+
games: Record<string, GameEntry>;
|
|
63
|
+
gameonBackendUrl?: string;
|
|
64
|
+
fetchApi?: typeof fetch;
|
|
65
|
+
});
|
|
66
|
+
game(name: string): GameClient;
|
|
67
|
+
createRoom(game: string, input: CreateRoomInput): Promise<CreatedRoom>;
|
|
68
|
+
}
|
|
69
|
+
export interface JoinOptions {
|
|
70
|
+
gameSessionUuid: string;
|
|
71
|
+
playerUuid: string;
|
|
72
|
+
playerName?: string;
|
|
73
|
+
socketOptions?: Partial<ManagerOptions & SocketOptions>;
|
|
74
|
+
}
|
|
75
|
+
type Unsubscribe = () => void;
|
|
76
|
+
export declare class GameConnection<State = any> {
|
|
77
|
+
private readonly socket;
|
|
78
|
+
private readonly gameSessionUuid;
|
|
79
|
+
private readonly playerUuid;
|
|
80
|
+
constructor(backendUrl: string, { gameSessionUuid, playerUuid, playerName, socketOptions }: JoinOptions);
|
|
81
|
+
get connected(): boolean;
|
|
82
|
+
disconnect(): void;
|
|
83
|
+
/** The move's shape is the game's own, e.g. { col } for connect4. */
|
|
84
|
+
makeMove(move: Record<string, unknown>): void;
|
|
85
|
+
resetGame(): void;
|
|
86
|
+
startGame(): void;
|
|
87
|
+
startTimerAfterPopup(): void;
|
|
88
|
+
reportTimeout(timeoutPlayer: number): void;
|
|
89
|
+
/** Any client-to-server event, for game-only actions. */
|
|
90
|
+
send(event: string, data?: Record<string, unknown>): void;
|
|
91
|
+
onConnect(handler: () => void): Unsubscribe;
|
|
92
|
+
onDisconnect(handler: (reason: string) => void): Unsubscribe;
|
|
93
|
+
onConnectError(handler: (error: Error) => void): Unsubscribe;
|
|
94
|
+
/** All reconnection attempts used up (a Manager event, not a socket one). */
|
|
95
|
+
onReconnectFailed(handler: () => void): Unsubscribe;
|
|
96
|
+
onGameUpdate(handler: (state: State) => void): Unsubscribe;
|
|
97
|
+
onJoined(handler: (data: Joined) => void): Unsubscribe;
|
|
98
|
+
onSpectatorJoined(handler: (data: SpectatorJoined) => void): Unsubscribe;
|
|
99
|
+
onGameOver(handler: (data: GameOver) => void): Unsubscribe;
|
|
100
|
+
/** Server errors, normalized to an error code such as E1001 (E0000 if unknown). */
|
|
101
|
+
onError(handler: (code: string, raw: unknown) => void): Unsubscribe;
|
|
102
|
+
onReset(handler: () => void): Unsubscribe;
|
|
103
|
+
onTimeoutNotification(handler: (data: {
|
|
104
|
+
timeoutPlayer: number;
|
|
105
|
+
}) => void): Unsubscribe;
|
|
106
|
+
onAutoMove(handler: (data: AutoMove) => void): Unsubscribe;
|
|
107
|
+
onReconnectionTimer(handler: (data: ReconnectionTimer) => void): Unsubscribe;
|
|
108
|
+
onWaitingUpdate(handler: (data: {
|
|
109
|
+
waitingTime: number;
|
|
110
|
+
}) => void): Unsubscribe;
|
|
111
|
+
/** Any server-to-client event, for game-only events. */
|
|
112
|
+
on(event: string, handler: (...args: any[]) => void): Unsubscribe;
|
|
113
|
+
}
|
|
114
|
+
export declare function socketErrorCode(error: unknown): string;
|
|
115
|
+
export {};
|
|
116
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
// One client for every game. Every game backend implements the same endpoints
|
|
2
|
+
// and socket events (specs/gameon.yaml); a game is only a backend URL.
|
|
3
|
+
// Game-only endpoints and events go through request(), send() and on().
|
|
4
|
+
import { io } from 'socket.io-client';
|
|
5
|
+
export const DEFAULT_PATHS = {
|
|
6
|
+
health: '/api/health',
|
|
7
|
+
createRoom: '/api/createRoom',
|
|
8
|
+
getGameDetails: '/api/getGameDetails',
|
|
9
|
+
updateGameType: '/api/updateGameType',
|
|
10
|
+
userBack: '/api/userBack',
|
|
11
|
+
balance: '/api/getUserWalletBalance',
|
|
12
|
+
exchangeLaunchTicket: '/api/exchange-launch-ticket',
|
|
13
|
+
};
|
|
14
|
+
export class GameOnError extends Error {
|
|
15
|
+
constructor(status, body, url) {
|
|
16
|
+
super(`${url} failed (HTTP ${status})${body?.errorCode ? ` ${body.errorCode}` : ''}`);
|
|
17
|
+
this.status = status;
|
|
18
|
+
this.body = body;
|
|
19
|
+
this.name = 'GameOnError';
|
|
20
|
+
}
|
|
21
|
+
/** The backend's error code (e.g. E1008), if it sent one. */
|
|
22
|
+
get code() {
|
|
23
|
+
return this.body?.errorCode;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class GameClient {
|
|
27
|
+
constructor(options) {
|
|
28
|
+
this.options = options;
|
|
29
|
+
this.paths = { ...DEFAULT_PATHS, ...options.paths };
|
|
30
|
+
}
|
|
31
|
+
health() {
|
|
32
|
+
return this.request('GET', this.paths.health);
|
|
33
|
+
}
|
|
34
|
+
async createRoom(input) {
|
|
35
|
+
const body = await this.request('POST', this.paths.createRoom, input);
|
|
36
|
+
if (body?.status === false) {
|
|
37
|
+
throw new GameOnError(200, body, this.paths.createRoom);
|
|
38
|
+
}
|
|
39
|
+
const payload = body?.payload ?? {};
|
|
40
|
+
return {
|
|
41
|
+
gameSessionUuid: payload.gameSessionUuid ?? input.room.gameSessionUuid,
|
|
42
|
+
gameStateId: payload.gameStateId,
|
|
43
|
+
links: collectLinks(payload),
|
|
44
|
+
raw: body,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
getGameDetails(gameSessionUuid) {
|
|
48
|
+
return this.request('GET', this.paths.getGameDetails, undefined, { gameSessionUuid });
|
|
49
|
+
}
|
|
50
|
+
updateGameType(gameSessionUuid, gameType) {
|
|
51
|
+
return this.request('POST', this.paths.updateGameType, { gameSessionUuid, gameType });
|
|
52
|
+
}
|
|
53
|
+
/** The player deliberately leaves; the backend resolves the game. */
|
|
54
|
+
userBack(gameSessionUuid, uuid) {
|
|
55
|
+
return this.request('POST', this.paths.userBack, { gameSessionUuid, uuid });
|
|
56
|
+
}
|
|
57
|
+
getBalance(userUuid) {
|
|
58
|
+
return this.request('GET', this.paths.balance, undefined, { userUuid });
|
|
59
|
+
}
|
|
60
|
+
exchangeLaunchTicket(launchTicket) {
|
|
61
|
+
return this.request('POST', this.paths.exchangeLaunchTicket, { launchTicket });
|
|
62
|
+
}
|
|
63
|
+
/** Asks the GameOn platform whether a player uuid belongs to a bot. */
|
|
64
|
+
async isBot(uuid) {
|
|
65
|
+
if (!this.options.gameonBackendUrl) {
|
|
66
|
+
throw new Error('isBot needs gameonBackendUrl in the client options');
|
|
67
|
+
}
|
|
68
|
+
const body = await this.request('GET', '/api/sdk/v1/game-session/is-bot', undefined, { uuid }, this.options.gameonBackendUrl);
|
|
69
|
+
return body?.content === true;
|
|
70
|
+
}
|
|
71
|
+
/** Any endpoint of this game's backend, for game-only features. Throws GameOnError on non-2xx. */
|
|
72
|
+
async request(method, path, body, query, baseUrl = this.options.backendUrl) {
|
|
73
|
+
const url = new URL(baseUrl.replace(/\/+$/, '') + path);
|
|
74
|
+
for (const [key, value] of Object.entries(query ?? {})) {
|
|
75
|
+
if (value !== undefined)
|
|
76
|
+
url.searchParams.set(key, String(value));
|
|
77
|
+
}
|
|
78
|
+
const response = await (this.options.fetchApi ?? fetch)(url.toString(), {
|
|
79
|
+
method,
|
|
80
|
+
headers: body === undefined ? undefined : { 'Content-Type': 'application/json' },
|
|
81
|
+
body: body === undefined ? undefined : JSON.stringify(body),
|
|
82
|
+
});
|
|
83
|
+
const text = await response.text();
|
|
84
|
+
let parsed;
|
|
85
|
+
try {
|
|
86
|
+
parsed = text ? JSON.parse(text) : undefined;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
parsed = text;
|
|
90
|
+
}
|
|
91
|
+
if (!response.ok) {
|
|
92
|
+
throw new GameOnError(response.status, parsed, path);
|
|
93
|
+
}
|
|
94
|
+
return parsed;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Opens the realtime connection. joinGame is sent on every (re)connect, so
|
|
98
|
+
* register listeners right after calling this.
|
|
99
|
+
*/
|
|
100
|
+
join(options) {
|
|
101
|
+
return new GameConnection(this.options.backendUrl, options);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** For servers that work with many games: one config, one client per game. */
|
|
105
|
+
export class GameOnClient {
|
|
106
|
+
constructor(options) {
|
|
107
|
+
this.options = options;
|
|
108
|
+
this.clients = new Map();
|
|
109
|
+
}
|
|
110
|
+
game(name) {
|
|
111
|
+
let client = this.clients.get(name);
|
|
112
|
+
if (!client) {
|
|
113
|
+
const entry = this.options.games[name];
|
|
114
|
+
if (!entry) {
|
|
115
|
+
throw new Error(`Unknown game "${name}". Configured games: ${Object.keys(this.options.games).join(', ')}`);
|
|
116
|
+
}
|
|
117
|
+
client = new GameClient({
|
|
118
|
+
...entry,
|
|
119
|
+
gameonBackendUrl: this.options.gameonBackendUrl,
|
|
120
|
+
fetchApi: this.options.fetchApi,
|
|
121
|
+
});
|
|
122
|
+
this.clients.set(name, client);
|
|
123
|
+
}
|
|
124
|
+
return client;
|
|
125
|
+
}
|
|
126
|
+
createRoom(game, input) {
|
|
127
|
+
return this.game(game).createRoom(input);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
export class GameConnection {
|
|
131
|
+
constructor(backendUrl, { gameSessionUuid, playerUuid, playerName, socketOptions }) {
|
|
132
|
+
this.gameSessionUuid = gameSessionUuid;
|
|
133
|
+
this.playerUuid = playerUuid;
|
|
134
|
+
this.socket = io(backendUrl, {
|
|
135
|
+
reconnection: true,
|
|
136
|
+
reconnectionAttempts: 10,
|
|
137
|
+
reconnectionDelay: 1000,
|
|
138
|
+
...socketOptions,
|
|
139
|
+
});
|
|
140
|
+
this.socket.on('connect', () => {
|
|
141
|
+
this.socket.emit('joinGame', { gameSessionUuid, playerUuid, playerName });
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
get connected() {
|
|
145
|
+
return this.socket.connected;
|
|
146
|
+
}
|
|
147
|
+
disconnect() {
|
|
148
|
+
this.socket.disconnect();
|
|
149
|
+
}
|
|
150
|
+
// --- actions (gameSessionUuid is added for you) ---
|
|
151
|
+
/** The move's shape is the game's own, e.g. { col } for connect4. */
|
|
152
|
+
makeMove(move) {
|
|
153
|
+
this.send('makeMove', move);
|
|
154
|
+
}
|
|
155
|
+
resetGame() {
|
|
156
|
+
this.send('resetGame');
|
|
157
|
+
}
|
|
158
|
+
startGame() {
|
|
159
|
+
this.send('startGame');
|
|
160
|
+
}
|
|
161
|
+
startTimerAfterPopup() {
|
|
162
|
+
this.send('startTimerAfterPopup');
|
|
163
|
+
}
|
|
164
|
+
reportTimeout(timeoutPlayer) {
|
|
165
|
+
this.send('mainTimerTimeout', { playerUuid: this.playerUuid, timeoutPlayer });
|
|
166
|
+
}
|
|
167
|
+
/** Any client-to-server event, for game-only actions. */
|
|
168
|
+
send(event, data = {}) {
|
|
169
|
+
this.socket.emit(event, { gameSessionUuid: this.gameSessionUuid, ...data });
|
|
170
|
+
}
|
|
171
|
+
// --- connection lifecycle ---
|
|
172
|
+
onConnect(handler) {
|
|
173
|
+
return this.on('connect', handler);
|
|
174
|
+
}
|
|
175
|
+
onDisconnect(handler) {
|
|
176
|
+
return this.on('disconnect', handler);
|
|
177
|
+
}
|
|
178
|
+
onConnectError(handler) {
|
|
179
|
+
return this.on('connect_error', handler);
|
|
180
|
+
}
|
|
181
|
+
/** All reconnection attempts used up (a Manager event, not a socket one). */
|
|
182
|
+
onReconnectFailed(handler) {
|
|
183
|
+
this.socket.io.on('reconnect_failed', handler);
|
|
184
|
+
return () => this.socket.io.off('reconnect_failed', handler);
|
|
185
|
+
}
|
|
186
|
+
// --- common game events ---
|
|
187
|
+
onGameUpdate(handler) {
|
|
188
|
+
return this.on('gameUpdate', handler);
|
|
189
|
+
}
|
|
190
|
+
onJoined(handler) {
|
|
191
|
+
return this.on('joined', handler);
|
|
192
|
+
}
|
|
193
|
+
onSpectatorJoined(handler) {
|
|
194
|
+
return this.on('spectatorJoined', handler);
|
|
195
|
+
}
|
|
196
|
+
onGameOver(handler) {
|
|
197
|
+
return this.on('gameOver', handler);
|
|
198
|
+
}
|
|
199
|
+
/** Server errors, normalized to an error code such as E1001 (E0000 if unknown). */
|
|
200
|
+
onError(handler) {
|
|
201
|
+
return this.on('error', (raw) => handler(socketErrorCode(raw), raw));
|
|
202
|
+
}
|
|
203
|
+
onReset(handler) {
|
|
204
|
+
return this.on('resetGame', handler);
|
|
205
|
+
}
|
|
206
|
+
onTimeoutNotification(handler) {
|
|
207
|
+
return this.on('mainTimerTimeoutNotification', handler);
|
|
208
|
+
}
|
|
209
|
+
onAutoMove(handler) {
|
|
210
|
+
return this.on('autoMove', handler);
|
|
211
|
+
}
|
|
212
|
+
onReconnectionTimer(handler) {
|
|
213
|
+
return this.on('reconnectionTimer', handler);
|
|
214
|
+
}
|
|
215
|
+
onWaitingUpdate(handler) {
|
|
216
|
+
return this.on('waitingUpdate', handler);
|
|
217
|
+
}
|
|
218
|
+
/** Any server-to-client event, for game-only events. */
|
|
219
|
+
on(event, handler) {
|
|
220
|
+
this.socket.on(event, handler);
|
|
221
|
+
return () => this.socket.off(event, handler);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/** Picks up `link`, `link1`, `link2`, ... in numeric order, skipping empty ones. */
|
|
225
|
+
function collectLinks(payload) {
|
|
226
|
+
if (Array.isArray(payload.links))
|
|
227
|
+
return payload.links.filter((link) => typeof link === 'string' && link);
|
|
228
|
+
return Object.keys(payload)
|
|
229
|
+
.filter((key) => /^link\d*$/.test(key) && typeof payload[key] === 'string' && payload[key])
|
|
230
|
+
.sort((a, b) => Number(a.slice(4) || 0) - Number(b.slice(4) || 0))
|
|
231
|
+
.map((key) => payload[key]);
|
|
232
|
+
}
|
|
233
|
+
/** Older servers send error strings instead of { code }. */
|
|
234
|
+
const ERROR_MESSAGE_CODES = [
|
|
235
|
+
['Invalid game session', 'E1001'],
|
|
236
|
+
['You are not authorized', 'E1002'],
|
|
237
|
+
['Bot players cannot make manual moves', 'E1003'],
|
|
238
|
+
['already ended', 'E1004'],
|
|
239
|
+
['Cannot join finished game', 'E1004'],
|
|
240
|
+
['Game room is full', 'E1005'],
|
|
241
|
+
];
|
|
242
|
+
export function socketErrorCode(error) {
|
|
243
|
+
if (error && typeof error === 'object' && typeof error.code === 'string') {
|
|
244
|
+
return error.code;
|
|
245
|
+
}
|
|
246
|
+
if (typeof error === 'string') {
|
|
247
|
+
return ERROR_MESSAGE_CODES.find(([text]) => error.includes(text))?.[1] ?? 'E0000';
|
|
248
|
+
}
|
|
249
|
+
return 'E0000';
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|