@phalanx-engine/client 0.1.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 +1037 -0
- package/dist/DesyncDetector.d.ts +80 -0
- package/dist/DesyncDetector.d.ts.map +1 -0
- package/dist/DesyncDetector.js +93 -0
- package/dist/DesyncDetector.js.map +1 -0
- package/dist/DeterministicRandom.d.ts +78 -0
- package/dist/DeterministicRandom.d.ts.map +1 -0
- package/dist/DeterministicRandom.js +122 -0
- package/dist/DeterministicRandom.js.map +1 -0
- package/dist/EventEmitter.d.ts +65 -0
- package/dist/EventEmitter.d.ts.map +1 -0
- package/dist/EventEmitter.js +102 -0
- package/dist/EventEmitter.js.map +1 -0
- package/dist/FixedMath.d.ts +22 -0
- package/dist/FixedMath.d.ts.map +1 -0
- package/dist/FixedMath.js +26 -0
- package/dist/FixedMath.js.map +1 -0
- package/dist/PhalanxClient.d.ts +335 -0
- package/dist/PhalanxClient.d.ts.map +1 -0
- package/dist/PhalanxClient.js +844 -0
- package/dist/PhalanxClient.js.map +1 -0
- package/dist/RenderLoop.d.ts +95 -0
- package/dist/RenderLoop.d.ts.map +1 -0
- package/dist/RenderLoop.js +192 -0
- package/dist/RenderLoop.js.map +1 -0
- package/dist/SocketManager.d.ts +228 -0
- package/dist/SocketManager.d.ts.map +1 -0
- package/dist/SocketManager.js +584 -0
- package/dist/SocketManager.js.map +1 -0
- package/dist/StateHasher.d.ts +76 -0
- package/dist/StateHasher.d.ts.map +1 -0
- package/dist/StateHasher.js +129 -0
- package/dist/StateHasher.js.map +1 -0
- package/dist/auth/AuthManager.d.ts +188 -0
- package/dist/auth/AuthManager.d.ts.map +1 -0
- package/dist/auth/AuthManager.js +462 -0
- package/dist/auth/AuthManager.js.map +1 -0
- package/dist/auth/adapters/GoogleOAuthAdapter.d.ts +164 -0
- package/dist/auth/adapters/GoogleOAuthAdapter.d.ts.map +1 -0
- package/dist/auth/adapters/GoogleOAuthAdapter.js +521 -0
- package/dist/auth/adapters/GoogleOAuthAdapter.js.map +1 -0
- package/dist/auth/index.d.ts +45 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +54 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/storage.d.ts +56 -0
- package/dist/auth/storage.d.ts.map +1 -0
- package/dist/auth/storage.js +78 -0
- package/dist/auth/storage.js.map +1 -0
- package/dist/auth/types.d.ts +212 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +7 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +83 -0
- package/dist/index.js.map +1 -0
- package/dist/recovery/BrowserLifecycle.d.ts +33 -0
- package/dist/recovery/BrowserLifecycle.d.ts.map +1 -0
- package/dist/recovery/BrowserLifecycle.js +62 -0
- package/dist/recovery/BrowserLifecycle.js.map +1 -0
- package/dist/recovery/GuestPlayerIdStore.d.ts +17 -0
- package/dist/recovery/GuestPlayerIdStore.d.ts.map +1 -0
- package/dist/recovery/GuestPlayerIdStore.js +31 -0
- package/dist/recovery/GuestPlayerIdStore.js.map +1 -0
- package/dist/recovery/KeyValueStorage.d.ts +32 -0
- package/dist/recovery/KeyValueStorage.d.ts.map +1 -0
- package/dist/recovery/KeyValueStorage.js +58 -0
- package/dist/recovery/KeyValueStorage.js.map +1 -0
- package/dist/recovery/MobileTransport.d.ts +12 -0
- package/dist/recovery/MobileTransport.d.ts.map +1 -0
- package/dist/recovery/MobileTransport.js +24 -0
- package/dist/recovery/MobileTransport.js.map +1 -0
- package/dist/recovery/NetworkQuality.d.ts +22 -0
- package/dist/recovery/NetworkQuality.d.ts.map +1 -0
- package/dist/recovery/NetworkQuality.js +35 -0
- package/dist/recovery/NetworkQuality.js.map +1 -0
- package/dist/recovery/RoomPersistence.d.ts +55 -0
- package/dist/recovery/RoomPersistence.d.ts.map +1 -0
- package/dist/recovery/RoomPersistence.js +68 -0
- package/dist/recovery/RoomPersistence.js.map +1 -0
- package/dist/recovery/RoomRecoveryController.d.ts +146 -0
- package/dist/recovery/RoomRecoveryController.d.ts.map +1 -0
- package/dist/recovery/RoomRecoveryController.js +348 -0
- package/dist/recovery/RoomRecoveryController.js.map +1 -0
- package/dist/recovery/index.d.ts +13 -0
- package/dist/recovery/index.d.ts.map +1 -0
- package/dist/recovery/index.js +8 -0
- package/dist/recovery/index.js.map +1 -0
- package/dist/types.d.ts +501 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phalanx Client
|
|
3
|
+
* Client library for connecting to Phalanx Engine servers
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from './EventEmitter.js';
|
|
6
|
+
import { type DesyncConfig } from './DesyncDetector.js';
|
|
7
|
+
import { RoomRecoveryController } from './recovery/index.js';
|
|
8
|
+
import type { PhalanxClientConfig, PhalanxClientEvents, PhalanxAuthState, PhalanxAuthUser, PlayerCommand, MatchFoundEvent, CountdownEvent, GameStartEvent, QueueStatusEvent, ReconnectStateEvent, SubmitCommandsAck, ConnectionState, ClientState, TickHandler, FrameHandler, Unsubscribe, PauseHandler, RoomCreatedEvent, RoomRecoveredEvent } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* PhalanxClient - Main client class for connecting to Phalanx Engine servers
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const client = await PhalanxClient.create({
|
|
15
|
+
* serverUrl: 'http://localhost:3000',
|
|
16
|
+
* playerId: 'player-123',
|
|
17
|
+
* username: 'MyPlayer',
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* client.on('matchFound', (data) => console.log('Match found!'));
|
|
21
|
+
* client.on('gameStart', () => console.log('Game started!'));
|
|
22
|
+
*
|
|
23
|
+
* await client.joinQueue();
|
|
24
|
+
*
|
|
25
|
+
* client.onTick((tick, commands) => {
|
|
26
|
+
* // Process commands and run simulation
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* client.onFrame((alpha, dt) => {
|
|
30
|
+
* // Interpolate and render
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare class PhalanxClient extends EventEmitter<PhalanxClientEvents> {
|
|
35
|
+
private config;
|
|
36
|
+
private socketManager;
|
|
37
|
+
private renderLoop;
|
|
38
|
+
private desyncDetector;
|
|
39
|
+
private authManager;
|
|
40
|
+
private _roomRecovery;
|
|
41
|
+
private clientState;
|
|
42
|
+
private currentMatchId;
|
|
43
|
+
private currentTick;
|
|
44
|
+
private authState;
|
|
45
|
+
private pendingCommands;
|
|
46
|
+
private pauseHandlers;
|
|
47
|
+
private resumeHandlers;
|
|
48
|
+
constructor(config: PhalanxClientConfig);
|
|
49
|
+
private createRoomRecoveryController;
|
|
50
|
+
/**
|
|
51
|
+
* Mobile-friendly room recovery controller. `null` unless
|
|
52
|
+
* `roomRecovery.enabled` was set in the config. See
|
|
53
|
+
* `RoomRecoveryController` for the surface — typically you only
|
|
54
|
+
* need `startTrackingHost(code)` after creating a private room and
|
|
55
|
+
* `loadColdStartCode()` on app startup.
|
|
56
|
+
*/
|
|
57
|
+
get roomRecovery(): RoomRecoveryController | null;
|
|
58
|
+
/**
|
|
59
|
+
* Initialize authentication manager
|
|
60
|
+
*/
|
|
61
|
+
private initializeAuth;
|
|
62
|
+
/**
|
|
63
|
+
* Handle auth state changes from AuthManager
|
|
64
|
+
*/
|
|
65
|
+
private handleAuthStateChange;
|
|
66
|
+
/**
|
|
67
|
+
* Handle OAuth callback from redirect
|
|
68
|
+
*/
|
|
69
|
+
private handleAuthCallback;
|
|
70
|
+
/**
|
|
71
|
+
* Start login flow (redirects to OAuth provider)
|
|
72
|
+
*/
|
|
73
|
+
login(): void;
|
|
74
|
+
/**
|
|
75
|
+
* Log out the current user
|
|
76
|
+
*/
|
|
77
|
+
logout(): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Get current authentication state
|
|
80
|
+
*/
|
|
81
|
+
getAuthState(): PhalanxAuthState;
|
|
82
|
+
/**
|
|
83
|
+
* Check if user is authenticated
|
|
84
|
+
*/
|
|
85
|
+
isAuthenticated(): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Get current user info
|
|
88
|
+
*/
|
|
89
|
+
getUser(): PhalanxAuthUser | null;
|
|
90
|
+
/**
|
|
91
|
+
* Create and connect a new PhalanxClient
|
|
92
|
+
* @param config Client configuration
|
|
93
|
+
* @returns Connected PhalanxClient instance
|
|
94
|
+
*/
|
|
95
|
+
static create(config: PhalanxClientConfig): Promise<PhalanxClient>;
|
|
96
|
+
/**
|
|
97
|
+
* Connect to the Phalanx server
|
|
98
|
+
* @returns Promise that resolves when connected
|
|
99
|
+
* @throws Error if connection fails or times out
|
|
100
|
+
*/
|
|
101
|
+
connect(): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Disconnect from the server
|
|
104
|
+
*/
|
|
105
|
+
disconnect(): void;
|
|
106
|
+
/**
|
|
107
|
+
* Destroy the client and clean up all resources
|
|
108
|
+
*/
|
|
109
|
+
destroy(): void;
|
|
110
|
+
/**
|
|
111
|
+
* Check if client is connected to the server
|
|
112
|
+
*/
|
|
113
|
+
isConnected(): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Get current connection state
|
|
116
|
+
*/
|
|
117
|
+
getConnectionState(): ConnectionState;
|
|
118
|
+
/**
|
|
119
|
+
* Get current client state
|
|
120
|
+
*/
|
|
121
|
+
getClientState(): ClientState;
|
|
122
|
+
/**
|
|
123
|
+
* Join the matchmaking queue
|
|
124
|
+
* @returns Promise that resolves with queue status
|
|
125
|
+
*/
|
|
126
|
+
joinQueue(): Promise<QueueStatusEvent>;
|
|
127
|
+
/**
|
|
128
|
+
* Leave the matchmaking queue
|
|
129
|
+
*/
|
|
130
|
+
leaveQueue(): void;
|
|
131
|
+
/**
|
|
132
|
+
* Create a private room and wait for the room code.
|
|
133
|
+
* After creation, the host should wait for match-found (when another player joins).
|
|
134
|
+
*/
|
|
135
|
+
createRoom(gameType?: string): Promise<RoomCreatedEvent>;
|
|
136
|
+
/**
|
|
137
|
+
* Join a private room by code.
|
|
138
|
+
* The server will create a match and emit match-found to both players.
|
|
139
|
+
*/
|
|
140
|
+
joinRoom(code: string): void;
|
|
141
|
+
/**
|
|
142
|
+
* Cancel a previously created private room.
|
|
143
|
+
*/
|
|
144
|
+
cancelRoom(): void;
|
|
145
|
+
/**
|
|
146
|
+
* Reclaim a private room after a transient socket disconnect.
|
|
147
|
+
*
|
|
148
|
+
* Call this after `connect()` has re-established the underlying socket
|
|
149
|
+
* (typically inside a `visibilitychange` listener, or the first thing
|
|
150
|
+
* on `pageshow` from bfcache) to tell the server to re-bind the still-
|
|
151
|
+
* living room / in-flight match to this new socket.
|
|
152
|
+
*
|
|
153
|
+
* On success the server emits `match-found` (if a guest had already
|
|
154
|
+
* joined) followed by `reconnect-state` carrying a countdown snapshot,
|
|
155
|
+
* which `SocketManager`'s global `reconnect-state` handler fans out
|
|
156
|
+
* through the local `countdown` and `game-start` listeners so any
|
|
157
|
+
* `waitForCountdown` / `waitForGameStart` promises pending since the
|
|
158
|
+
* original flow resume naturally.
|
|
159
|
+
*
|
|
160
|
+
* Rejects with the server's `room-error` message (e.g. `'Room expired'`)
|
|
161
|
+
* or `'Recover timeout'` if the server doesn't answer before the configured
|
|
162
|
+
* recovery timeout.
|
|
163
|
+
*/
|
|
164
|
+
recoverRoom(code: string, timeoutMs?: number): Promise<RoomRecoveredEvent>;
|
|
165
|
+
/**
|
|
166
|
+
* Request the server to pause the game.
|
|
167
|
+
* The game will not freeze immediately — it freezes only when the server
|
|
168
|
+
* broadcasts the 'game-paused' event back to all clients, ensuring
|
|
169
|
+
* every client pauses at the same deterministic point.
|
|
170
|
+
*/
|
|
171
|
+
pauseGame(): void;
|
|
172
|
+
/**
|
|
173
|
+
* Request the server to resume the game.
|
|
174
|
+
* Same as pause — the actual resume occurs when the server broadcasts
|
|
175
|
+
* 'game-resumed' to all clients.
|
|
176
|
+
*/
|
|
177
|
+
resumeGame(): void;
|
|
178
|
+
/**
|
|
179
|
+
* Notify the server that this client has finished loading and is ready to receive ticks.
|
|
180
|
+
* Must be called after assets are loaded and game systems are initialized.
|
|
181
|
+
* The server will not start the tick loop until all clients report ready.
|
|
182
|
+
*/
|
|
183
|
+
sendReady(): void;
|
|
184
|
+
/**
|
|
185
|
+
* Wait for a match to be found
|
|
186
|
+
* @returns Promise that resolves with match found event
|
|
187
|
+
*/
|
|
188
|
+
waitForMatch(): Promise<MatchFoundEvent>;
|
|
189
|
+
/**
|
|
190
|
+
* Join queue and wait for match in one call
|
|
191
|
+
* @returns Promise that resolves with match found event
|
|
192
|
+
*/
|
|
193
|
+
joinQueueAndWaitForMatch(): Promise<MatchFoundEvent>;
|
|
194
|
+
/**
|
|
195
|
+
* Wait for countdown to complete (listening to countdown events)
|
|
196
|
+
* @param onCountdown Optional callback for each countdown tick
|
|
197
|
+
* @returns Promise that resolves when countdown reaches 0
|
|
198
|
+
*/
|
|
199
|
+
waitForCountdown(onCountdown?: (event: CountdownEvent) => void): Promise<void>;
|
|
200
|
+
/**
|
|
201
|
+
* Wait for the game to start
|
|
202
|
+
* @returns Promise that resolves with game start event
|
|
203
|
+
*/
|
|
204
|
+
waitForGameStart(): Promise<GameStartEvent>;
|
|
205
|
+
/**
|
|
206
|
+
* Submit commands for a specific tick
|
|
207
|
+
* @param tick The tick number these commands are for
|
|
208
|
+
* @param commands Array of commands to submit
|
|
209
|
+
* @returns Promise that resolves with acknowledgment
|
|
210
|
+
*/
|
|
211
|
+
submitCommands(tick: number, commands: PlayerCommand[]): Promise<SubmitCommandsAck>;
|
|
212
|
+
/**
|
|
213
|
+
* Submit commands without waiting for acknowledgment (fire and forget)
|
|
214
|
+
* @param tick The tick number these commands are for
|
|
215
|
+
* @param commands Array of commands to submit
|
|
216
|
+
*/
|
|
217
|
+
submitCommandsAsync(tick: number, commands: PlayerCommand[]): void;
|
|
218
|
+
/**
|
|
219
|
+
* Send a command to the server
|
|
220
|
+
* Commands are buffered and sent automatically each frame
|
|
221
|
+
*
|
|
222
|
+
* @param type Command type (e.g., 'move', 'attack')
|
|
223
|
+
* @param data Command payload
|
|
224
|
+
*/
|
|
225
|
+
sendCommand(type: string, data: unknown): void;
|
|
226
|
+
/**
|
|
227
|
+
* Register a callback for simulation ticks
|
|
228
|
+
* Called when the server sends a tick with commands from all players
|
|
229
|
+
*
|
|
230
|
+
* @param handler Callback receiving tick number and commands grouped by player
|
|
231
|
+
* @returns Unsubscribe function
|
|
232
|
+
*/
|
|
233
|
+
onTick(handler: TickHandler): Unsubscribe;
|
|
234
|
+
/**
|
|
235
|
+
* Register a callback for render frames
|
|
236
|
+
* Called every animation frame (~60fps) with interpolation alpha
|
|
237
|
+
* Automatically starts the render loop when first handler is added
|
|
238
|
+
*
|
|
239
|
+
* @param handler Callback receiving alpha (0-1) and delta time in seconds
|
|
240
|
+
* @returns Unsubscribe function
|
|
241
|
+
*/
|
|
242
|
+
onFrame(handler: FrameHandler): Unsubscribe;
|
|
243
|
+
/**
|
|
244
|
+
* Request the server to pause the game (ITickFrameProvider contract).
|
|
245
|
+
* The actual pause is signalled asynchronously via onPause when the
|
|
246
|
+
* server broadcasts 'game-paused' to all clients.
|
|
247
|
+
*/
|
|
248
|
+
requestPause(): void;
|
|
249
|
+
/**
|
|
250
|
+
* Request the server to resume the game (ITickFrameProvider contract).
|
|
251
|
+
* The actual resume is signalled asynchronously via onResume when the
|
|
252
|
+
* server broadcasts 'game-resumed' to all clients.
|
|
253
|
+
*/
|
|
254
|
+
requestResume(): void;
|
|
255
|
+
/**
|
|
256
|
+
* Subscribe to the "paused" signal (ITickFrameProvider contract).
|
|
257
|
+
* Fired when the server confirms the pause and broadcasts it.
|
|
258
|
+
*/
|
|
259
|
+
onPause(handler: PauseHandler): Unsubscribe;
|
|
260
|
+
/**
|
|
261
|
+
* Subscribe to the "resumed" signal (ITickFrameProvider contract).
|
|
262
|
+
* Fired when the server confirms the resume and broadcasts it.
|
|
263
|
+
*/
|
|
264
|
+
onResume(handler: PauseHandler): Unsubscribe;
|
|
265
|
+
/**
|
|
266
|
+
* Attempt to reconnect to a match after disconnection
|
|
267
|
+
* @param matchId The match ID to reconnect to
|
|
268
|
+
* @returns Promise that resolves with reconnection state
|
|
269
|
+
*/
|
|
270
|
+
reconnectToMatch(matchId: string): Promise<ReconnectStateEvent>;
|
|
271
|
+
/**
|
|
272
|
+
* Attempt automatic reconnection with retries
|
|
273
|
+
* @returns Promise that resolves when reconnected, rejects if all attempts fail
|
|
274
|
+
*/
|
|
275
|
+
attemptReconnection(): Promise<void>;
|
|
276
|
+
/**
|
|
277
|
+
* Submit state hash for desync detection
|
|
278
|
+
* Call this after each simulation tick (or every N ticks based on your preference)
|
|
279
|
+
*
|
|
280
|
+
* The game is responsible for computing the hash using StateHasher or
|
|
281
|
+
* a custom implementation. The SDK just handles transport and comparison.
|
|
282
|
+
*
|
|
283
|
+
* @param tick - The tick this hash is for
|
|
284
|
+
* @param hash - Hash computed by game (any string)
|
|
285
|
+
*
|
|
286
|
+
* @example
|
|
287
|
+
* ```typescript
|
|
288
|
+
* client.onTick((tick, commands) => {
|
|
289
|
+
* simulation.processTick(tick, commands);
|
|
290
|
+
*
|
|
291
|
+
* // Submit hash every 20 ticks (once per second at 20 TPS)
|
|
292
|
+
* if (tick % 20 === 0) {
|
|
293
|
+
* const hash = computeGameStateHash(tick);
|
|
294
|
+
* client.submitStateHash(tick, hash);
|
|
295
|
+
* }
|
|
296
|
+
* });
|
|
297
|
+
* ```
|
|
298
|
+
*/
|
|
299
|
+
submitStateHash(tick: number, hash: string): void;
|
|
300
|
+
/**
|
|
301
|
+
* Configure desync detection
|
|
302
|
+
* @param config - Configuration options for desync detection
|
|
303
|
+
*
|
|
304
|
+
* @example
|
|
305
|
+
* ```typescript
|
|
306
|
+
* // Disable desync detection
|
|
307
|
+
* client.configureDesyncDetection({ enabled: false });
|
|
308
|
+
*
|
|
309
|
+
* // Limit stored hashes
|
|
310
|
+
* client.configureDesyncDetection({ maxStoredHashes: 50 });
|
|
311
|
+
* ```
|
|
312
|
+
*/
|
|
313
|
+
configureDesyncDetection(config: Partial<DesyncConfig>): void;
|
|
314
|
+
/**
|
|
315
|
+
* Get current tick number
|
|
316
|
+
*/
|
|
317
|
+
getCurrentTick(): number;
|
|
318
|
+
/**
|
|
319
|
+
* Get current match ID
|
|
320
|
+
*/
|
|
321
|
+
getMatchId(): string | null;
|
|
322
|
+
/**
|
|
323
|
+
* Get player ID configured for this client
|
|
324
|
+
*/
|
|
325
|
+
getPlayerId(): string;
|
|
326
|
+
/**
|
|
327
|
+
* Get username configured for this client
|
|
328
|
+
*/
|
|
329
|
+
getUsername(): string;
|
|
330
|
+
private flushPendingCommands;
|
|
331
|
+
private ensureConnected;
|
|
332
|
+
private ensurePlaying;
|
|
333
|
+
private log;
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=PhalanxClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhalanxClient.d.ts","sourceRoot":"","sources":["../src/PhalanxClient.ts"],"names":[],"mappings":"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"}
|